xref: /llvm-project/clang/test/SemaCXX/attr-declspec-ignored.cpp (revision b873847a53ae638e2146e3657fe33efe30c2afe1)
1 // RUN: %clang_cc1 %s -verify -fsyntax-only
2 // RUN: %clang_cc1 %s -std=c++03 -Wno-c++11-extensions -verify -fsyntax-only
3 
4 namespace test1 {
5   __attribute__((visibility("hidden")))  __attribute__((aligned)) class A; // expected-warning{{attribute 'visibility' is ignored, place it after "class" to apply attribute to type declaration}} \
6   // expected-warning{{attribute 'aligned' is ignored, place it after "class" to apply attribute to type declaration}}
7   __attribute__((visibility("hidden")))  __attribute__((aligned)) struct B; // expected-warning{{attribute 'visibility' is ignored, place it after "struct" to apply attribute to type declaration}} \
8   // expected-warning{{attribute 'aligned' is ignored, place it after "struct" to apply attribute to type declaration}}
9   __attribute__((visibility("hidden")))  __attribute__((aligned)) union C; // expected-warning{{attribute 'visibility' is ignored, place it after "union" to apply attribute to type declaration}} \
10   // expected-warning{{attribute 'aligned' is ignored, place it after "union" to apply attribute to type declaration}}
11   __attribute__((visibility("hidden")))  __attribute__((aligned)) enum D {D}; // expected-warning{{attribute 'visibility' is ignored, place it after "enum" to apply attribute to type declaration}} \
12   // expected-warning{{attribute 'aligned' is ignored, place it after "enum" to apply attribute to type declaration}}
13   __attribute__((visibility("hidden")))  __attribute__((aligned)) enum class EC {}; // expected-warning{{attribute 'visibility' is ignored, place it after "enum class" to apply attribute to type declaration}} \
14   // expected-warning{{attribute 'aligned' is ignored, place it after "enum class" to apply attribute to type declaration}}
15   __attribute__((visibility("hidden")))  __attribute__((aligned)) enum struct ES {}; // expected-warning{{attribute 'visibility' is ignored, place it after "enum struct" to apply attribute to type declaration}} \
16   // expected-warning{{attribute 'aligned' is ignored, place it after "enum struct" to apply attribute to type declaration}}
17 
18   // Test that we get the same warnings for type declarations nested in a record.
19   struct X {
20     __attribute__((visibility("hidden")))  __attribute__((aligned)) class A; // expected-warning{{attribute 'visibility' is ignored, place it after "class" to apply attribute to type declaration}} \
21     // expected-warning{{attribute 'aligned' is ignored, place it after "class" to apply attribute to type declaration}}
22     __attribute__((visibility("hidden")))  __attribute__((aligned)) struct B; // expected-warning{{attribute 'visibility' is ignored, place it after "struct" to apply attribute to type declaration}} \
23     // expected-warning{{attribute 'aligned' is ignored, place it after "struct" to apply attribute to type declaration}}
24     __attribute__((visibility("hidden")))  __attribute__((aligned)) union C; // expected-warning{{attribute 'visibility' is ignored, place it after "union" to apply attribute to type declaration}} \
25     // expected-warning{{attribute 'aligned' is ignored, place it after "union" to apply attribute to type declaration}}
26     __attribute__((visibility("hidden")))  __attribute__((aligned)) enum D {D}; // expected-warning{{attribute 'visibility' is ignored, place it after "enum" to apply attribute to type declaration}} \
27     // expected-warning{{attribute 'aligned' is ignored, place it after "enum" to apply attribute to type declaration}}
28     __attribute__((visibility("hidden")))  __attribute__((aligned)) enum class EC {}; // expected-warning{{attribute 'visibility' is ignored, place it after "enum class" to apply attribute to type declaration}} \
29     // expected-warning{{attribute 'aligned' is ignored, place it after "enum class" to apply attribute to type declaration}}
30     __attribute__((visibility("hidden")))  __attribute__((aligned)) enum struct ES {}; // expected-warning{{attribute 'visibility' is ignored, place it after "enum struct" to apply attribute to type declaration}} \
31     // expected-warning{{attribute 'aligned' is ignored, place it after "enum struct" to apply attribute to type declaration}}
32 
33     // Also test [[]] attribute syntax. (On a non-nested declaration, these
34     // generate a hard "misplaced attributes" error, which we test for
35     // elsewhere.)
36     [[gnu::visibility("hidden")]]  [[gnu::aligned]] class E; // expected-warning{{attribute 'visibility' is ignored, place it after "class" to apply attribute to type declaration}} \
37     // expected-warning{{attribute 'aligned' is ignored, place it after "class" to apply attribute to type declaration}}
38     [[gnu::visibility("hidden")]]  [[gnu::aligned]] struct F; // expected-warning{{attribute 'visibility' is ignored, place it after "struct" to apply attribute to type declaration}} \
39     // expected-warning{{attribute 'aligned' is ignored, place it after "struct" to apply attribute to type declaration}}
40     [[gnu::visibility("hidden")]]  [[gnu::aligned]] union G; // expected-warning{{attribute 'visibility' is ignored, place it after "union" to apply attribute to type declaration}} \
41     // expected-warning{{attribute 'aligned' is ignored, place it after "union" to apply attribute to type declaration}}
42     [[gnu::visibility("hidden")]]  [[gnu::aligned]] enum H {H}; // expected-warning{{attribute 'visibility' is ignored, place it after "enum" to apply attribute to type declaration}} \
43     // expected-warning{{attribute 'aligned' is ignored, place it after "enum" to apply attribute to type declaration}}
44     [[gnu::visibility("hidden")]]  [[gnu::aligned]] enum class I {}; // expected-warning{{attribute 'visibility' is ignored, place it after "enum class" to apply attribute to type declaration}} \
45     // expected-warning{{attribute 'aligned' is ignored, place it after "enum class" to apply attribute to type declaration}}
46     [[gnu::visibility("hidden")]]  [[gnu::aligned]] enum struct J {}; // expected-warning{{attribute 'visibility' is ignored, place it after "enum struct" to apply attribute to type declaration}} \
47     // expected-warning{{attribute 'aligned' is ignored, place it after "enum struct" to apply attribute to type declaration}}
48   };
49 }
50 
51 namespace test2 {
52   __attribute__((visibility("hidden")))  __attribute__((aligned)) class A {} a;
53   __attribute__((visibility("hidden")))  __attribute__((aligned)) struct B {} b;
54   __attribute__((visibility("hidden")))  __attribute__((aligned)) union C {} c;
55   __attribute__((visibility("hidden")))  __attribute__((aligned)) enum D {D} d;
56   __attribute__((visibility("hidden")))  __attribute__((aligned)) enum class EC {} ec;
57   __attribute__((visibility("hidden")))  __attribute__((aligned)) enum struct ES {} es;
58 
59   struct X {
60     __attribute__((visibility("hidden")))  __attribute__((aligned)) class A {} a;
61     __attribute__((visibility("hidden")))  __attribute__((aligned)) struct B {} b;
62     __attribute__((visibility("hidden")))  __attribute__((aligned)) union C {} c;
63     __attribute__((visibility("hidden")))  __attribute__((aligned)) enum D {D} d;
64     __attribute__((visibility("hidden")))  __attribute__((aligned)) enum class EC {} ec;
65     __attribute__((visibility("hidden")))  __attribute__((aligned)) enum struct ES {} es;
66 
67     [[gnu::visibility("hidden")]]  [[gnu::aligned]] class E {} e;
68     [[gnu::visibility("hidden")]]  [[gnu::aligned]] struct F {} f;
69     [[gnu::visibility("hidden")]]  [[gnu::aligned]] union G {} g;
70     [[gnu::visibility("hidden")]]  [[gnu::aligned]] enum H {H} h;
71     [[gnu::visibility("hidden")]]  [[gnu::aligned]] enum class I {} i;
72     [[gnu::visibility("hidden")]]  [[gnu::aligned]] enum struct J {} j;
73   };
74 }
75