1 // RUN: %clang_cc1 -fms-compatibility -fms-extensions -fsyntax-only -verify -std=c++11 %s 2 // MSVC produces similar diagnostics. 3 4 __declspec(selectany) void foo() { } // expected-error{{'selectany' can only be applied to data items with external linkage}} 5 6 __declspec(selectany) int x1 = 1; 7 8 const __declspec(selectany) int x2 = 2; // expected-error{{'selectany' can only be applied to data items with external linkage}} 9 10 extern const __declspec(selectany) int x3 = 3; 11 12 extern const int x4; 13 const __declspec(selectany) int x4 = 4; 14 15 // MSDN says this is incorrect, but MSVC doesn't diagnose it. 16 extern __declspec(selectany) int x5; 17 18 static __declspec(selectany) int x6 = 2; // expected-error{{'selectany' can only be applied to data items with external linkage}} 19 20 // FIXME: MSVC accepts this and makes x7 externally visible and comdat, but keep 21 // it as internal and not weak/linkonce. 22 static int x7; // expected-note{{previous definition}} 23 extern __declspec(selectany) int x7; // expected-warning{{attribute declaration must precede definition}} 24 25 int asdf() { return x7; } 26 27 class X { 28 public: 29 X(int i) { i++; }; 30 int i; 31 }; 32 33 __declspec(selectany) X x(1); 34 35 namespace { class Internal {}; } 36 __declspec(selectany) auto x8 = Internal(); // expected-error {{'selectany' can only be applied to data items with external linkage}} 37 38 39 // The D3D11 headers do something like this. MSVC doesn't error on this at 40 // all, even without the __declspec(selectany), in violation of the standard. 41 // We fall back to a warning for selectany to accept headers. 42 struct SomeStruct {}; 43 extern const __declspec(selectany) SomeStruct some_struct; // expected-warning {{default initialization of an object of const type 'const SomeStruct' without a user-provided default constructor is a Microsoft extension}} 44 45 // It should be possible to redeclare variables that were defined 46 // __declspec(selectany) previously. 47 extern const SomeStruct some_struct; 48 49 // Without selectany, this should stay an error. 50 const SomeStruct some_struct2; // expected-error {{default initialization of an object of const type 'const SomeStruct' without a user-provided default constructor}} 51