diff options
author | Bill Wendling <isanbard@gmail.com> | 2013-05-21 00:06:11 +0000 |
---|---|---|
committer | Bill Wendling <isanbard@gmail.com> | 2013-05-21 00:06:11 +0000 |
commit | 1cac0481166dd383a5d685fd53154661fbac5896 (patch) | |
tree | 053bffe7753ef4be0649a497b87ea5cb863f1371 /test | |
parent | 424aa2e72ee59d51914201ce184b585410e1a5fa (diff) |
Merging r182266:
------------------------------------------------------------------------
r182266 | rnk | 2013-05-20 07:02:37 -0700 (Mon, 20 May 2013) | 13 lines
Implement __declspec(selectany) under -fms-extensions
selectany only applies to externally visible global variables. It has
the effect of making the data weak_odr.
The MSDN docs suggest that unused definitions can only be dropped at
linktime, so Clang uses weak instead of linkonce. MSVC optimizes away
references to constant selectany data, so it must assume that there is
only one definition, hence weak_odr.
Reviewers: espindola
Differential Revision: http://llvm-reviews.chandlerc.com/D814
------------------------------------------------------------------------
git-svn-id: https://llvm.org/svn/llvm-project/cfe/branches/release_33@182337 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test')
-rw-r--r-- | test/CodeGen/ms-declspecs.c | 5 | ||||
-rw-r--r-- | test/SemaCXX/attr-selectany.cpp | 33 |
2 files changed, 38 insertions, 0 deletions
diff --git a/test/CodeGen/ms-declspecs.c b/test/CodeGen/ms-declspecs.c index 26bdc58ebb..5dc7787b8f 100644 --- a/test/CodeGen/ms-declspecs.c +++ b/test/CodeGen/ms-declspecs.c @@ -1,5 +1,10 @@ // RUN: %clang_cc1 -triple i386-pc-win32 %s -emit-llvm -fms-compatibility -o - | FileCheck %s +__declspec(selectany) int x1 = 1; +const __declspec(selectany) int x2 = 2; +// CHECK: @x1 = weak_odr global i32 1, align 4 +// CHECK: @x2 = weak_odr constant i32 2, align 4 + struct __declspec(align(16)) S { char x; }; diff --git a/test/SemaCXX/attr-selectany.cpp b/test/SemaCXX/attr-selectany.cpp new file mode 100644 index 0000000000..0f9776dbf5 --- /dev/null +++ b/test/SemaCXX/attr-selectany.cpp @@ -0,0 +1,33 @@ +// RUN: %clang_cc1 -fms-extensions -fsyntax-only -verify %s +// MSVC produces similar diagnostics. + +__declspec(selectany) void foo() { } // expected-error{{'selectany' can only be applied to data items with external linkage}} + +__declspec(selectany) int x1 = 1; + +const __declspec(selectany) int x2 = 2; // expected-error{{'selectany' can only be applied to data items with external linkage}} + +extern const __declspec(selectany) int x3 = 3; + +extern const int x4; +const __declspec(selectany) int x4 = 4; + +// MSDN says this is incorrect, but MSVC doesn't diagnose it. +extern __declspec(selectany) int x5; + +static __declspec(selectany) int x6 = 2; // expected-error{{'selectany' can only be applied to data items with external linkage}} + +// FIXME: MSVC accepts this and makes x7 externally visible and comdat, but keep +// it as internal and not weak/linkonce. +static int x7; // expected-note{{previous definition}} +extern __declspec(selectany) int x7; // expected-warning{{attribute declaration must precede definition}} + +int asdf() { return x7; } + +class X { + public: + X(int i) { i++; }; + int i; +}; + +__declspec(selectany) X x(1); |