diff options
| author | Reid Kleckner <rnk@google.com> | 2019-09-12 17:55:48 +0000 |
|---|---|---|
| committer | Reid Kleckner <rnk@google.com> | 2019-09-12 17:55:48 +0000 |
| commit | b00a49d1b3a146b02d2277a463ef7618a9c29806 (patch) | |
| tree | 640098decbb3d13128c83bff24f3d793fc89ed1a /clang/test/SemaCXX/declspec-selectany.cpp | |
| parent | 6943472d45aa4eda7392ee312d68d9cf2fc55f9f (diff) | |
| download | bcm5719-llvm-b00a49d1b3a146b02d2277a463ef7618a9c29806.tar.gz bcm5719-llvm-b00a49d1b3a146b02d2277a463ef7618a9c29806.zip | |
Don't warn about selectany on implicitly inline variables
Summary:
This avoids a -Wignored-attribute warning on the code pattern Microsoft
recommends for integral const static data members defined in headers
here:
https://docs.microsoft.com/en-us/cpp/build/reference/microsoft-extensions-to-c-and-cpp?view=vs-2019
The attribute is redundant, but it is necessary when compiling in C++14
modes with /Za, which disables MSVC's extension that treats such
variables as implicitly inline.
Fixes PR43270
Reviewers: epastor, thakis, hans
Subscribers: cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D67426
llvm-svn: 371749
Diffstat (limited to 'clang/test/SemaCXX/declspec-selectany.cpp')
| -rw-r--r-- | clang/test/SemaCXX/declspec-selectany.cpp | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/clang/test/SemaCXX/declspec-selectany.cpp b/clang/test/SemaCXX/declspec-selectany.cpp new file mode 100644 index 00000000000..7e64a2924c9 --- /dev/null +++ b/clang/test/SemaCXX/declspec-selectany.cpp @@ -0,0 +1,18 @@ +// RUN: %clang_cc1 -std=c++14 %s -triple x86_64-windows-msvc -fdeclspec -verify +// RUN: %clang_cc1 -std=c++17 %s -triple x86_64-windows-msvc -fdeclspec -verify +// RUN: %clang_cc1 -std=c++14 %s -triple x86_64-scei-ps4 -fdeclspec -verify + +// MSVC emits this error too. +const int __declspec(selectany) test1 = 0; // expected-error {{'selectany' can only be applied to data items with external linkage}} + +extern const int test2; +const int test2 = 42; // expected-note {{previous definition is here}} +extern __declspec(selectany) const int test2; // expected-warning {{attribute declaration must precede definition}} + +extern const int test3; +const int __declspec(selectany) test3 = 42; // Standard usage. + +struct Test4 { + static constexpr int sdm = 0; +}; +__declspec(selectany) constexpr int Test4::sdm; // no warning |

