forked from OSchip/llvm-project
Make __declspec(selectany) turn variable declartions into definitions.
Fixes PR23242. llvm-svn: 235046
This commit is contained in:
parent
a2ee3013e6
commit
ea7386d40c
clang
|
@ -1926,14 +1926,14 @@ VarDecl::DefinitionKind VarDecl::isThisDeclarationADefinition(
|
|||
getTemplateSpecializationKind() != TSK_ExplicitSpecialization)
|
||||
return DeclarationOnly;
|
||||
|
||||
if (hasExternalStorage())
|
||||
if (!hasAttr<SelectAnyAttr>() && hasExternalStorage())
|
||||
return DeclarationOnly;
|
||||
|
||||
// [dcl.link] p7:
|
||||
// A declaration directly contained in a linkage-specification is treated
|
||||
// as if it contains the extern specifier for the purpose of determining
|
||||
// the linkage of the declared name and whether it is a definition.
|
||||
if (isSingleLineLanguageLinkage(*this))
|
||||
if (!hasAttr<SelectAnyAttr>() && isSingleLineLanguageLinkage(*this))
|
||||
return DeclarationOnly;
|
||||
|
||||
// C99 6.9.2p2:
|
||||
|
|
|
@ -5,6 +5,10 @@ const __declspec(selectany) int x2 = 2;
|
|||
// CHECK: @x1 = weak_odr global i32 1, comdat, align 4
|
||||
// CHECK: @x2 = weak_odr constant i32 2, comdat, align 4
|
||||
|
||||
// selectany turns extern variable declarations into definitions.
|
||||
extern __declspec(selectany) int x3;
|
||||
// CHECK: @x3 = weak_odr global i32 0, comdat, align 4
|
||||
|
||||
struct __declspec(align(16)) S {
|
||||
char x;
|
||||
};
|
||||
|
|
|
@ -0,0 +1,13 @@
|
|||
// RUN: %clang_cc1 -triple i386-pc-win32 %s -emit-llvm -fms-compatibility -o - | FileCheck %s
|
||||
|
||||
// selectany turns extern "C" variable declarations into definitions.
|
||||
extern __declspec(selectany) int x1;
|
||||
extern "C" __declspec(selectany) int x2;
|
||||
extern "C++" __declspec(selectany) int x3;
|
||||
extern "C" {
|
||||
__declspec(selectany) int x4;
|
||||
}
|
||||
// CHECK: @"\01?x1@@3HA" = weak_odr global i32 0, comdat, align 4
|
||||
// CHECK: @x2 = weak_odr global i32 0, comdat, align 4
|
||||
// CHECK: @"\01?x3@@3HA" = weak_odr global i32 0, comdat, align 4
|
||||
// CHECK: @x4 = weak_odr global i32 0, comdat, align 4
|
Loading…
Reference in New Issue