cxx-class.cpp revision 4b0e6f1da341510c1ad83eaf4c836f3134d0156a
19ea416e598fa3cb09d67d514c4519c99abb81321Douglas Gregor// RUN: %clang_cc1 -fsyntax-only -verify -pedantic %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:
154cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis  void m() {
164cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis    int l = 2;
174b0e6f1da341510c1ad83eaf4c836f3134d0156aRichard Trieu  }; // expected-warning{{extra ';' after function definition}}
189ea416e598fa3cb09d67d514c4519c99abb81321Douglas Gregor
194b0e6f1da341510c1ad83eaf4c836f3134d0156aRichard Trieu  template<typename T> void mt(T) { }
209ea416e598fa3cb09d67d514c4519c99abb81321Douglas Gregor  ; // expected-warning{{extra ';' inside a class}}
219ea416e598fa3cb09d67d514c4519c99abb81321Douglas Gregor
22ab963c6221ac088fad73a47bc7a0a0b266b030daSebastian Redl  virtual int vf() const volatile = 0;
234cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis
244cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidisprivate:
254cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis  int x,f(),y,g();
26ab963c6221ac088fad73a47bc7a0a0b266b030daSebastian Redl  inline int h();
27ab963c6221ac088fad73a47bc7a0a0b266b030daSebastian Redl  static const int sci = 10;
28669d5d74b880a8497b92a3ec159145713f4d6519Sebastian Redl  mutable int mi;
294cc18a4d5222e04bd568b1e3e4d86127dbbcdf3fArgyrios Kyrtzidis};
30ab963c6221ac088fad73a47bc7a0a0b266b030daSebastian Redlvoid glo()
31ab963c6221ac088fad73a47bc7a0a0b266b030daSebastian Redl{
32ab963c6221ac088fad73a47bc7a0a0b266b030daSebastian Redl  struct local {};
33ab963c6221ac088fad73a47bc7a0a0b266b030daSebastian Redl}
34bc8d56496a6ecdba14769df03d75c001184f8c54Chris Lattner
35bc8d56496a6ecdba14769df03d75c001184f8c54Chris Lattner// PR3177
36bc8d56496a6ecdba14769df03d75c001184f8c54Chris Lattnertypedef union {
37bc8d56496a6ecdba14769df03d75c001184f8c54Chris Lattner  __extension__ union {
38bc8d56496a6ecdba14769df03d75c001184f8c54Chris Lattner    int a;
39bc8d56496a6ecdba14769df03d75c001184f8c54Chris Lattner    float b;
40bc8d56496a6ecdba14769df03d75c001184f8c54Chris Lattner  } y;
41bc8d56496a6ecdba14769df03d75c001184f8c54Chris Lattner} bug3177;
42bc8d56496a6ecdba14769df03d75c001184f8c54Chris Lattner
4313f8daf70637f8f295134ac8e089dd7721e09085David Blaikie// check that we don't consume the token after the access specifier
4413f8daf70637f8f295134ac8e089dd7721e09085David Blaikie// when it's not a colon
4513f8daf70637f8f295134ac8e089dd7721e09085David Blaikieclass D {
4613f8daf70637f8f295134ac8e089dd7721e09085David Blaikiepublic // expected-error{{expected ':'}}
4713f8daf70637f8f295134ac8e089dd7721e09085David Blaikie  int i;
4813f8daf70637f8f295134ac8e089dd7721e09085David Blaikie};
4913f8daf70637f8f295134ac8e089dd7721e09085David Blaikie
5013f8daf70637f8f295134ac8e089dd7721e09085David Blaikie// consume the token after the access specifier if it's a semicolon
5113f8daf70637f8f295134ac8e089dd7721e09085David Blaikie// that was meant to be a colon
5213f8daf70637f8f295134ac8e089dd7721e09085David Blaikieclass E {
5313f8daf70637f8f295134ac8e089dd7721e09085David Blaikiepublic; // expected-error{{expected ':'}}
5413f8daf70637f8f295134ac8e089dd7721e09085David Blaikie  int i;
5513f8daf70637f8f295134ac8e089dd7721e09085David Blaikie};
5613f8daf70637f8f295134ac8e089dd7721e09085David Blaikie
5765ba94814f667e6ea1fcbf0896ad496bb7010335Richard Trieuclass F {
5865ba94814f667e6ea1fcbf0896ad496bb7010335Richard Trieu    int F1 { return 1; } // expected-error{{function definition does not declare parameters}}
5965ba94814f667e6ea1fcbf0896ad496bb7010335Richard Trieu    void F2 {} // expected-error{{function definition does not declare parameters}}
6065ba94814f667e6ea1fcbf0896ad496bb7010335Richard Trieu    typedef int F3() { return 0; } // expected-error{{function definition declared 'typedef'}}
6165ba94814f667e6ea1fcbf0896ad496bb7010335Richard Trieu    typedef void F4() {} // expected-error{{function definition declared 'typedef'}}
6265ba94814f667e6ea1fcbf0896ad496bb7010335Richard Trieu};
6365ba94814f667e6ea1fcbf0896ad496bb7010335Richard Trieu
64412e0cc52ea644d804dcfa87194800371f91a977Richard Smithnamespace ctor_error {
65412e0cc52ea644d804dcfa87194800371f91a977Richard Smith  class Foo {};
66412e0cc52ea644d804dcfa87194800371f91a977Richard Smith  // By [class.qual]p2, this is a constructor declaration.
67412e0cc52ea644d804dcfa87194800371f91a977Richard Smith  Foo::Foo (F) = F(); // expected-error{{does not match any declaration in 'ctor_error::Foo'}}
68412e0cc52ea644d804dcfa87194800371f91a977Richard Smith
69412e0cc52ea644d804dcfa87194800371f91a977Richard Smith  class Ctor { // expected-note{{not complete until the closing '}'}}
70412e0cc52ea644d804dcfa87194800371f91a977Richard Smith    Ctor(f)(int); // ok
71412e0cc52ea644d804dcfa87194800371f91a977Richard Smith    Ctor(g(int)); // ok
72412e0cc52ea644d804dcfa87194800371f91a977Richard Smith    Ctor(x[5]); // expected-error{{incomplete type}}
73412e0cc52ea644d804dcfa87194800371f91a977Richard Smith
74412e0cc52ea644d804dcfa87194800371f91a977Richard Smith    Ctor(UnknownType *); // expected-error{{unknown type name 'UnknownType'}}
7552f10d5f474741d2226630f576d44f1bf946d40aRichard Smith    void operator+(UnknownType*); // expected-error{{unknown type name 'UnknownType'}}
76412e0cc52ea644d804dcfa87194800371f91a977Richard Smith  };
77412e0cc52ea644d804dcfa87194800371f91a977Richard Smith
78412e0cc52ea644d804dcfa87194800371f91a977Richard Smith  Ctor::Ctor (x) = { 0 }; // \
79412e0cc52ea644d804dcfa87194800371f91a977Richard Smith    // expected-error{{qualified reference to 'Ctor' is a constructor name}}
80412e0cc52ea644d804dcfa87194800371f91a977Richard Smith
81412e0cc52ea644d804dcfa87194800371f91a977Richard Smith  Ctor::Ctor(UnknownType *) {} // \
8252f10d5f474741d2226630f576d44f1bf946d40aRichard Smith    // expected-error{{unknown type name 'UnknownType'}}
8352f10d5f474741d2226630f576d44f1bf946d40aRichard Smith  void Ctor::operator+(UnknownType*) {} // \
8452f10d5f474741d2226630f576d44f1bf946d40aRichard Smith    // expected-error{{unknown type name 'UnknownType'}}
85412e0cc52ea644d804dcfa87194800371f91a977Richard Smith}
86412e0cc52ea644d804dcfa87194800371f91a977Richard Smith
8713f8daf70637f8f295134ac8e089dd7721e09085David Blaikie// PR11109 must appear at the end of the source file
8813f8daf70637f8f295134ac8e089dd7721e09085David Blaikieclass pr11109r3 { // expected-note{{to match this '{'}}
8913f8daf70637f8f295134ac8e089dd7721e09085David Blaikie  public // expected-error{{expected ':'}} expected-error{{expected '}'}} expected-error{{expected ';' after class}}
90