1 // RUN: %clang_cc1 -fsyntax-only -verify %s
2 // RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s
3 // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
4 // RUN: %clang_cc1 -fsyntax-only -verify -std=c++2a %s
8 #if __cplusplus <= 199711L
9 // expected-note@-2 {{because type 'S' has a user-provided default constructor}}
13 struct { // expected-error {{anonymous structs and classes must be class members}} expected-warning {{does not declare anything}}
19 #if __cplusplus <= 199711L
20 // expected-error@-2 {{anonymous struct member 'x' has a non-trivial default constructor}}
23 static struct { // expected-warning {{does not declare anything}}
26 int anon_priv_field
; // expected-error {{anonymous struct cannot contain a private data member}}
30 template <class T
> void foo(T
);
31 typedef struct { // expected-error {{anonymous non-C-compatible type given name for linkage purposes by typedef declaration after its linkage was computed; add a tag name here to establish linkage prior to definition}}
32 #if __cplusplus <= 199711L
33 // expected-note@-2 {{declared here}}
36 void test() { // expected-note {{type is not C-compatible due to this member declaration}}
38 #if __cplusplus <= 199711L
39 // expected-warning@-2 {{template argument uses unnamed type}}
42 } A
; // expected-note {{type is given name 'A' for linkage purposes by this typedef declaration}}
44 typedef struct { // expected-warning {{anonymous non-C-compatible type given name for linkage purposes by typedef declaration; add a tag name here}}
45 int x
= 0; // expected-note {{type is not C-compatible due to this default member initializer}} expected-warning 0-1{{extension}}
46 } B
; // expected-note {{type is given name 'B' for linkage purposes by this typedef declaration}}
48 typedef struct // expected-warning {{anonymous non-C-compatible type given name for linkage purposes by typedef declaration; add a tag name here}}
49 : B
{ // expected-note {{type is not C-compatible due to this base class}}
50 } C
; // expected-note {{type is given name 'C' for linkage purposes by this typedef declaration}}
52 #if __cplusplus > 201703L && __cplusplus < 202002L
53 typedef struct { // expected-warning {{anonymous non-C-compatible type given name for linkage purposes by typedef declaration; add a tag name here}}
54 static_assert([]{ return true; }()); // expected-note {{type is not C-compatible due to this lambda expression}}
55 } Lambda1
; // expected-note {{type is given name 'Lambda1' for linkage purposes by this typedef declaration}}
57 template<int> struct X
{};
58 typedef struct { // expected-warning {{anonymous non-C-compatible type given name for linkage purposes by typedef declaration; add a tag name here}}
59 X
<[]{ return 0; }()> x
; // expected-note {{type is not C-compatible due to this lambda expression}}
60 // FIXME: expected-error@-1 {{lambda expression cannot appear}}
61 } Lambda2
; // expected-note {{type is given name 'Lambda2' for linkage purposes by this typedef declaration}}
63 typedef struct { // expected-warning {{anonymous non-C-compatible type given name for linkage purposes by typedef declaration; add a tag name here}}
65 a
= []{ return 1; }() // expected-note {{type is not C-compatible due to this lambda expression}}
67 } Lambda3
; // expected-note {{type is given name 'Lambda3' for linkage purposes by this typedef declaration}}
70 typedef struct { // expected-warning {{anonymous non-C-compatible type given name for linkage purposes by typedef declaration; add a tag name here}}
71 template<int> void f() {} // expected-note {{type is not C-compatible due to this member declaration}}
72 } Template
; // expected-note {{type is given name 'Template' for linkage purposes by this typedef declaration}}
74 typedef struct { // expected-warning {{anonymous non-C-compatible type given name for linkage purposes by typedef declaration; add a tag name here}}
76 void f(); // expected-note {{type is not C-compatible due to this member declaration}}
78 } Nested
; // expected-note {{type is given name 'Nested' for linkage purposes by this typedef declaration}}
80 typedef struct { // expected-warning {{anonymous non-C-compatible type given name for linkage purposes by typedef declaration; add a tag name here}}
81 friend void f() {} // expected-note {{type is not C-compatible due to this friend declaration}}
82 } Friend
; // expected-note {{type is given name 'Friend' for linkage purposes by this typedef declaration}}
84 typedef struct { // expected-warning {{anonymous non-C-compatible type given name for linkage purposes by typedef declaration; add a tag name here}}
85 template<typename T
> friend void f() {} // expected-note {{type is not C-compatible due to this friend declaration}}
86 } FriendTemplate
; // expected-note {{type is given name 'FriendTemplate' for linkage purposes by this typedef declaration}}
88 // Check that we don't diagnose the permitted cases:
91 _Static_assert(true, "");
93 /*empty-declaration*/;
95 // non-static data members
97 // member enumerations
106 // There are still some known permitted cases that require an early linkage
107 // computation. Ensure we diagnose those too.
108 namespace ValidButUnsupported
{
109 #if __cplusplus >= 201402L
110 template<typename T
> auto compute_linkage() {
115 typedef struct { // expected-error {{unsupported: anonymous type given name for linkage purposes by typedef declaration after its linkage was computed; add a tag name here to establish linkage}}
117 decltype(compute_linkage
<X
>()) a
;
118 } A
; // expected-note {{by this typedef declaration}}
121 // This fails in some language modes but not others.
122 template<typename T
> struct Y
{
123 static const int value
= 10;
125 typedef struct { // expected-error 0-1{{unsupported}}
127 int arr
[Y
<X
>::value
];
128 } B
; // expected-note 0-1{{by this typedef}}
130 template<typename T
> void f() {}
131 typedef struct { // expected-error {{unsupported}}
133 int arr
[&f
<X
> ? 1 : 2];
134 #if __cplusplus < 201103L
135 // expected-warning@-2 {{folded to constant}}
136 // expected-warning@-3 {{variable length arrays in C++ are a Clang extension}}
138 } C
; // expected-note {{by this typedef}}
141 namespace ImplicitDecls
{
159 } // namespace ImplicitDecls
162 static int x
; // expected-error {{static data member 'x' not allowed in anonymous struct}}
167 static int x
; // expected-error {{static data member 'x' not allowed in anonymous class}}
174 static int x
; // expected-error {{static data member 'x' not allowed in anonymous union}}
179 // Ensure we don't compute the linkage of a member function just because it
180 // happens to have the same name as a builtin.
181 namespace BuiltinName
{
182 // Note that this is not an error: we didn't trigger linkage computation in this example.
183 typedef struct { // expected-warning {{anonymous non-C-compatible type}}
184 void memcpy(); // expected-note {{due to this member}}
185 } A
; // expected-note {{given name 'A' for linkage purposes by this typedef}}
187 namespace inline_defined_static_member
{
188 typedef struct { // expected-warning {{anonymous non-C-compatible type}}
189 static void f() { // expected-note {{due to this member}}
191 } A
; // expected-note {{given name 'A' for linkage purposes by this typedef}}
194 #if __cplusplus > 201103L