diff options
Diffstat (limited to 'test/SemaCXX/attr-selectany.cpp')
-rw-r--r-- | test/SemaCXX/attr-selectany.cpp | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/test/SemaCXX/attr-selectany.cpp b/test/SemaCXX/attr-selectany.cpp index c27a915..058f2fc 100644 --- a/test/SemaCXX/attr-selectany.cpp +++ b/test/SemaCXX/attr-selectany.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -fms-extensions -fsyntax-only -verify -std=c++11 %s +// RUN: %clang_cc1 -fms-compatibility -fms-extensions -fsyntax-only -verify -std=c++11 %s // MSVC produces similar diagnostics. __declspec(selectany) void foo() { } // expected-error{{'selectany' can only be applied to data items with external linkage}} @@ -34,3 +34,17 @@ __declspec(selectany) X x(1); namespace { class Internal {}; } __declspec(selectany) auto x8 = Internal(); // expected-error {{'selectany' can only be applied to data items with external linkage}} + + +// The D3D11 headers do something like this. MSVC doesn't error on this at +// all, even without the __declspec(selectany), in violation of the standard. +// We fall back to a warning for selectany to accept headers. +struct SomeStruct {}; +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}} + +// It should be possible to redeclare variables that were defined +// __declspec(selectany) previously. +extern const SomeStruct some_struct; + +// Without selectany, this should stay an error. +const SomeStruct some_struct2; // expected-error {{default initialization of an object of const type 'const SomeStruct' without a user-provided default constructor}} |