| // RUN: %clang_cc1 -fsyntax-only -verify %s  | 
 | typedef int INT; | 
 |  | 
 | class Foo { | 
 |   Foo(); | 
 |   (Foo)(float) { } | 
 |   explicit Foo(int); // expected-note {{previous declaration is here}} | 
 |   Foo(const Foo&); | 
 |  | 
 |   ((Foo))(INT); // expected-error{{cannot be redeclared}} | 
 |  | 
 |   Foo(Foo foo, int i = 17, int j = 42); // expected-error{{copy constructor must pass its first argument by reference}} | 
 |  | 
 |   static Foo(short, short); // expected-error{{constructor cannot be declared 'static'}} | 
 |   virtual Foo(double); // expected-error{{constructor cannot be declared 'virtual'}} | 
 |   Foo(long) const; // expected-error{{'const' qualifier is not allowed on a constructor}} | 
 |    | 
 |   int Foo(int, int); // expected-error{{constructor cannot have a return type}} | 
 |  | 
 |   volatile Foo(float); // expected-error{{constructor cannot have a return type}} | 
 | }; | 
 |  | 
 | Foo::Foo(const Foo&) { } | 
 |  | 
 | typedef struct { | 
 |   int version; | 
 | } Anon; | 
 | extern const Anon anon; | 
 | extern "C" const Anon anon2; | 
 |  | 
 | // PR3188: The extern declaration complained about not having an appropriate | 
 | // constructor. | 
 | struct x; | 
 | extern x a; | 
 |  | 
 | // A similar case. | 
 | struct y { | 
 |   y(int); | 
 | }; | 
 | extern y b; | 
 |  | 
 | struct Length { | 
 |   Length l() const { return *this; } | 
 | }; | 
 |  | 
 | // <rdar://problem/6815988> | 
 | struct mmst_reg{ | 
 |  char mmst_reg[10]; | 
 | }; | 
 |  | 
 | // PR3948 | 
 | namespace PR3948 { | 
 | // PR3948 | 
 | class a { | 
 |   public: | 
 |   int b(int a()); | 
 | }; | 
 | int x(); | 
 | void y() { | 
 |   a z; z.b(x); | 
 | } | 
 | } | 
 |  | 
 | namespace A { | 
 |   struct S { | 
 |     S(); | 
 |     S(int); | 
 |     void f1(); | 
 |     void f2(); | 
 |     operator int (); | 
 |     ~S(); | 
 |   }; | 
 | } | 
 |  | 
 | A::S::S() {} | 
 |  | 
 | void A::S::f1() {} | 
 |  | 
 | struct S {}; | 
 |  | 
 | A::S::S(int) {} | 
 |  | 
 | void A::S::f2() {} | 
 |  | 
 | A::S::operator int() { return 1; } | 
 |  | 
 | A::S::~S() {} | 
 |  | 
 | namespace PR38286 { | 
 |   // FIXME: It'd be nice to give more consistent diagnostics for these cases | 
 |   // (but they're all failing for somewhat different reasons...). | 
 |   template<typename> struct A; | 
 |   template<typename T> A<T>::A() {} // expected-error {{incomplete type 'A' named in nested name specifier}} | 
 |   /*FIXME: needed to recover properly from previous error*/; | 
 |   template<typename> struct B; | 
 |   template<typename T> void B<T>::f() {} // expected-error {{out-of-line definition of 'f' from class 'B<type-parameter-0-0>'}} | 
 |   template<typename> struct C; | 
 |   template<typename T> C<T>::~C() {} // expected-error {{no type named 'C' in 'C<type-parameter-0-0>'}} | 
 | } |