1651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang_cc1 -fsyntax-only -verify -pedantic -fcxx-exceptions %s
2ab963c6221ac088fad73a47bc7a0a0b266b030daSebastian Redlclass C;
34cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidisclass C {
44cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidispublic:
54cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidisprotected:
64cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis  typedef int A,B;
74cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis  static int sf(), u;
84cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis
94cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis  struct S {};
10a131d0fc0af9f79c90e7654231041b2495d355a9Douglas Gregor  enum {}; // expected-warning{{declaration does not declare anything}}
11cb821d045f5e445384f34d05a526955036073c4aDouglas Gregor  int; // expected-warning {{declaration does not declare anything}}
123a9fdb4742b21c0a3c27f18c5e4e94bab6f9e64cArgyrios Kyrtzidis  int : 1, : 2;
134cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis
144cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidispublic:
15eab9d6f9065b042d39fbaf9842c9d8cc968dd6d0Richard Smith  void m0() {}; // ok, one extra ';' is permitted
16eab9d6f9065b042d39fbaf9842c9d8cc968dd6d0Richard Smith  void m1() {}
17eab9d6f9065b042d39fbaf9842c9d8cc968dd6d0Richard Smith  ; // ok, one extra ';' is permitted
184cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis  void m() {
194cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis    int l = 2;
20eab9d6f9065b042d39fbaf9842c9d8cc968dd6d0Richard Smith  };; // expected-warning{{extra ';' after member function definition}}
219ea416e598fa3cb09d67d514c4519c99abb81321Douglas Gregor
224b0e6f1da341510c1ad83eaf4c836f3134d0156aRichard Trieu  template<typename T> void mt(T) { }
23eab9d6f9065b042d39fbaf9842c9d8cc968dd6d0Richard Smith  ;
249ea416e598fa3cb09d67d514c4519c99abb81321Douglas Gregor  ; // expected-warning{{extra ';' inside a class}}
259ea416e598fa3cb09d67d514c4519c99abb81321Douglas Gregor
26ab963c6221ac088fad73a47bc7a0a0b266b030daSebastian Redl  virtual int vf() const volatile = 0;
274cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis
284cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidisprivate:
294cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis  int x,f(),y,g();
30ab963c6221ac088fad73a47bc7a0a0b266b030daSebastian Redl  inline int h();
31ab963c6221ac088fad73a47bc7a0a0b266b030daSebastian Redl  static const int sci = 10;
32669d5d74b880a8497b92a3ec159145713f4d6519Sebastian Redl  mutable int mi;
334cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis};
34ab963c6221ac088fad73a47bc7a0a0b266b030daSebastian Redlvoid glo()
35ab963c6221ac088fad73a47bc7a0a0b266b030daSebastian Redl{
36ab963c6221ac088fad73a47bc7a0a0b266b030daSebastian Redl  struct local {};
37ab963c6221ac088fad73a47bc7a0a0b266b030daSebastian Redl}
38bc8d56496a6ecdba14769df03d75c001184f8c54Chris Lattner
39bc8d56496a6ecdba14769df03d75c001184f8c54Chris Lattner// PR3177
40bc8d56496a6ecdba14769df03d75c001184f8c54Chris Lattnertypedef union {
41bc8d56496a6ecdba14769df03d75c001184f8c54Chris Lattner  __extension__ union {
42bc8d56496a6ecdba14769df03d75c001184f8c54Chris Lattner    int a;
43bc8d56496a6ecdba14769df03d75c001184f8c54Chris Lattner    float b;
44bc8d56496a6ecdba14769df03d75c001184f8c54Chris Lattner  } y;
45bc8d56496a6ecdba14769df03d75c001184f8c54Chris Lattner} bug3177;
46bc8d56496a6ecdba14769df03d75c001184f8c54Chris Lattner
4713f8daf70637f8f295134ac8e089dd7721e09085David Blaikie// check that we don't consume the token after the access specifier
4813f8daf70637f8f295134ac8e089dd7721e09085David Blaikie// when it's not a colon
4913f8daf70637f8f295134ac8e089dd7721e09085David Blaikieclass D {
5013f8daf70637f8f295134ac8e089dd7721e09085David Blaikiepublic // expected-error{{expected ':'}}
5113f8daf70637f8f295134ac8e089dd7721e09085David Blaikie  int i;
5213f8daf70637f8f295134ac8e089dd7721e09085David Blaikie};
5313f8daf70637f8f295134ac8e089dd7721e09085David Blaikie
5413f8daf70637f8f295134ac8e089dd7721e09085David Blaikie// consume the token after the access specifier if it's a semicolon
5513f8daf70637f8f295134ac8e089dd7721e09085David Blaikie// that was meant to be a colon
5613f8daf70637f8f295134ac8e089dd7721e09085David Blaikieclass E {
5713f8daf70637f8f295134ac8e089dd7721e09085David Blaikiepublic; // expected-error{{expected ':'}}
5813f8daf70637f8f295134ac8e089dd7721e09085David Blaikie  int i;
5913f8daf70637f8f295134ac8e089dd7721e09085David Blaikie};
6013f8daf70637f8f295134ac8e089dd7721e09085David Blaikie
6165ba94814f667e6ea1fcbf0896ad496bb7010335Richard Trieuclass F {
6265ba94814f667e6ea1fcbf0896ad496bb7010335Richard Trieu    int F1 { return 1; } // expected-error{{function definition does not declare parameters}}
6365ba94814f667e6ea1fcbf0896ad496bb7010335Richard Trieu    void F2 {} // expected-error{{function definition does not declare parameters}}
6465ba94814f667e6ea1fcbf0896ad496bb7010335Richard Trieu    typedef int F3() { return 0; } // expected-error{{function definition declared 'typedef'}}
6565ba94814f667e6ea1fcbf0896ad496bb7010335Richard Trieu    typedef void F4() {} // expected-error{{function definition declared 'typedef'}}
6665ba94814f667e6ea1fcbf0896ad496bb7010335Richard Trieu};
6765ba94814f667e6ea1fcbf0896ad496bb7010335Richard Trieu
68412e0cc52ea644d804dcfa87194800371f91a977Richard Smithnamespace ctor_error {
69412e0cc52ea644d804dcfa87194800371f91a977Richard Smith  class Foo {};
70412e0cc52ea644d804dcfa87194800371f91a977Richard Smith  // By [class.qual]p2, this is a constructor declaration.
71412e0cc52ea644d804dcfa87194800371f91a977Richard Smith  Foo::Foo (F) = F(); // expected-error{{does not match any declaration in 'ctor_error::Foo'}}
72412e0cc52ea644d804dcfa87194800371f91a977Richard Smith
73412e0cc52ea644d804dcfa87194800371f91a977Richard Smith  class Ctor { // expected-note{{not complete until the closing '}'}}
74412e0cc52ea644d804dcfa87194800371f91a977Richard Smith    Ctor(f)(int); // ok
75412e0cc52ea644d804dcfa87194800371f91a977Richard Smith    Ctor(g(int)); // ok
76412e0cc52ea644d804dcfa87194800371f91a977Richard Smith    Ctor(x[5]); // expected-error{{incomplete type}}
77412e0cc52ea644d804dcfa87194800371f91a977Richard Smith
78412e0cc52ea644d804dcfa87194800371f91a977Richard Smith    Ctor(UnknownType *); // expected-error{{unknown type name 'UnknownType'}}
7952f10d5f474741d2226630f576d44f1bf946d40aRichard Smith    void operator+(UnknownType*); // expected-error{{unknown type name 'UnknownType'}}
80412e0cc52ea644d804dcfa87194800371f91a977Richard Smith  };
81412e0cc52ea644d804dcfa87194800371f91a977Richard Smith
82412e0cc52ea644d804dcfa87194800371f91a977Richard Smith  Ctor::Ctor (x) = { 0 }; // \
83412e0cc52ea644d804dcfa87194800371f91a977Richard Smith    // expected-error{{qualified reference to 'Ctor' is a constructor name}}
84412e0cc52ea644d804dcfa87194800371f91a977Richard Smith
85412e0cc52ea644d804dcfa87194800371f91a977Richard Smith  Ctor::Ctor(UnknownType *) {} // \
8652f10d5f474741d2226630f576d44f1bf946d40aRichard Smith    // expected-error{{unknown type name 'UnknownType'}}
8752f10d5f474741d2226630f576d44f1bf946d40aRichard Smith  void Ctor::operator+(UnknownType*) {} // \
8852f10d5f474741d2226630f576d44f1bf946d40aRichard Smith    // expected-error{{unknown type name 'UnknownType'}}
89412e0cc52ea644d804dcfa87194800371f91a977Richard Smith}
90412e0cc52ea644d804dcfa87194800371f91a977Richard Smith
91c7f811638f8603fa373d2be724e8b1c8ba51ad75Richard Smithnamespace nns_decl {
92c7f811638f8603fa373d2be724e8b1c8ba51ad75Richard Smith  struct A {
93c7f811638f8603fa373d2be724e8b1c8ba51ad75Richard Smith    struct B;
94c7f811638f8603fa373d2be724e8b1c8ba51ad75Richard Smith  };
95c7f811638f8603fa373d2be724e8b1c8ba51ad75Richard Smith  namespace N {
96c7f811638f8603fa373d2be724e8b1c8ba51ad75Richard Smith    union C;
97c7f811638f8603fa373d2be724e8b1c8ba51ad75Richard Smith  }
98c7f811638f8603fa373d2be724e8b1c8ba51ad75Richard Smith  struct A::B; // expected-error {{forward declaration of struct cannot have a nested name specifier}}
99c7f811638f8603fa373d2be724e8b1c8ba51ad75Richard Smith  union N::C; // expected-error {{forward declaration of union cannot have a nested name specifier}}
100c7f811638f8603fa373d2be724e8b1c8ba51ad75Richard Smith}
101c7f811638f8603fa373d2be724e8b1c8ba51ad75Richard Smith
10269e4826edc1858d9e2cdef508b469af750ec2b09Richard Smith// PR13775: Don't assert here.
10369e4826edc1858d9e2cdef508b469af750ec2b09Richard Smithnamespace PR13775 {
10469e4826edc1858d9e2cdef508b469af750ec2b09Richard Smith  class bar
10569e4826edc1858d9e2cdef508b469af750ec2b09Richard Smith  {
10669e4826edc1858d9e2cdef508b469af750ec2b09Richard Smith   public:
10769e4826edc1858d9e2cdef508b469af750ec2b09Richard Smith    void foo ();
10869e4826edc1858d9e2cdef508b469af750ec2b09Richard Smith    void baz ();
10969e4826edc1858d9e2cdef508b469af750ec2b09Richard Smith  };
11069e4826edc1858d9e2cdef508b469af750ec2b09Richard Smith  void bar::foo ()
11169e4826edc1858d9e2cdef508b469af750ec2b09Richard Smith  {
11269e4826edc1858d9e2cdef508b469af750ec2b09Richard Smith    baz x(); // expected-error 3{{}}
11369e4826edc1858d9e2cdef508b469af750ec2b09Richard Smith  }
11469e4826edc1858d9e2cdef508b469af750ec2b09Richard Smith}
11569e4826edc1858d9e2cdef508b469af750ec2b09Richard Smith
116651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesclass pr16989 {
117651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void tpl_mem(int *) {
118651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return;
119651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    class C2 {
120651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      void f();
121651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    };
122651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void C2::f() {} // expected-error{{function definition is not allowed here}}
123651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
124651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines};
125651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
126651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace CtorErrors {
127651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct A {
128651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    A(NonExistent); // expected-error {{unknown type name 'NonExistent'}}
129651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
130651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct B {
131651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    B(NonExistent) : n(0) {} // expected-error {{unknown type name 'NonExistent'}}
132651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    int n;
133651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
134651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct C {
135651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    C(NonExistent) try {} catch (...) {} // expected-error {{unknown type name 'NonExistent'}}
136651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
137651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct D {
138651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    D(NonExistent) {} // expected-error {{unknown type name 'NonExistent'}}
139651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
140651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
141651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
14213f8daf70637f8f295134ac8e089dd7721e09085David Blaikie// PR11109 must appear at the end of the source file
14313f8daf70637f8f295134ac8e089dd7721e09085David Blaikieclass pr11109r3 { // expected-note{{to match this '{'}}
14413f8daf70637f8f295134ac8e089dd7721e09085David Blaikie  public // expected-error{{expected ':'}} expected-error{{expected '}'}} expected-error{{expected ';' after class}}
145