169730c115c2d0fec2f20609d905d920a5a41b29bRichard Smith// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s -fcxx-exceptions
2ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith
3ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smithusing X = struct { // ok
4ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith};
5651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<typename T> using Y = struct { // expected-error {{cannot be defined in a type alias template}}
63e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith};
7ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith
8ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smithclass K {
9ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  virtual ~K();
10651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  operator struct S {} (); // expected-error{{'K::S' cannot be defined in a type specifier}}
11ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith};
12ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith
1369730c115c2d0fec2f20609d905d920a5a41b29bRichard Smithstruct A {};
1469730c115c2d0fec2f20609d905d920a5a41b29bRichard Smith
15ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smithvoid f() {
16ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  int arr[3] = {1,2,3};
17ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith
18ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  for (struct S { S(int) {} } s : arr) { // expected-error {{types may not be defined in a for range declaration}}
19ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  }
20ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith
214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (struct S { S(int) {} } s : Undeclared); // expected-error{{types may not be defined in a for range declaration}}
224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                               // expected-error@-1{{use of undeclared identifier 'Undeclared'}}
234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
24651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  new struct T {}; // expected-error {{'T' cannot be defined in a type specifier}}
25651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  new struct A {}; // expected-error {{'A' cannot be defined in a type specifier}}
26ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith
27651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  try {} catch (struct U {}) {} // expected-error {{'U' cannot be defined in a type specifier}}
28ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith
29651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  (void)(struct V { V(int); })0; // expected-error {{'V' cannot be defined in a type specifier}}
30ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith
31651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  (void)dynamic_cast<struct W {}*>((K*)0); // expected-error {{'W' cannot be defined in a type specifier}}
32651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  (void)static_cast<struct X {}*>(0); // expected-error {{'X' cannot be defined in a type specifier}}
33651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  (void)reinterpret_cast<struct Y {}*>(0); // expected-error {{'Y' cannot be defined in a type specifier}}
34651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  (void)const_cast<struct Z {}*>((const Z*)0); // expected-error {{'Z' cannot be defined in a type specifier}}
35ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith}
36ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith
37651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid g() throw (struct Ex {}) { // expected-error {{'Ex' cannot be defined in a type specifier}}
38ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith}
39ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith
40651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesalignas(struct Aa {}) int x; // expected-error {{'Aa' cannot be defined in a type specifier}}
41ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith
42651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesint a = sizeof(struct So {}); // expected-error {{'So' cannot be defined in a type specifier}}
43651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesint b = alignof(struct Ao {}); // expected-error {{'Ao' cannot be defined in a type specifier}}
44ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith
45ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smithnamespace std { struct type_info; }
46651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesconst std::type_info &ti = typeid(struct Ti {}); // expected-error {{'Ti' cannot be defined in a type specifier}}
47