diff options
-rw-r--r-- | clang/lib/AST/Decl.cpp | 4 | ||||
-rw-r--r-- | clang/test/CodeGen/ms-declspecs.c | 4 | ||||
-rw-r--r-- | clang/test/CodeGen/ms-declspecs.cpp | 13 |
3 files changed, 19 insertions, 2 deletions
diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp index 2ae73de5074..349b7b43d1a 100644 --- a/clang/lib/AST/Decl.cpp +++ b/clang/lib/AST/Decl.cpp @@ -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: diff --git a/clang/test/CodeGen/ms-declspecs.c b/clang/test/CodeGen/ms-declspecs.c index 328fc835d34..985c227faa3 100644 --- a/clang/test/CodeGen/ms-declspecs.c +++ b/clang/test/CodeGen/ms-declspecs.c @@ -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; }; diff --git a/clang/test/CodeGen/ms-declspecs.cpp b/clang/test/CodeGen/ms-declspecs.cpp new file mode 100644 index 00000000000..f77c7cb8916 --- /dev/null +++ b/clang/test/CodeGen/ms-declspecs.cpp @@ -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 |