// RUN: %clang_cc1 -fsyntax-only -verify %s struct X0 { struct type { }; X0(); X0(int); (X0)(float); X0 (f0)(int); X0 (f0)(type); X0 f1(); X0 f1(double); }; X0::X0() { } (X0::X0)(int) { } X0 (X0::f0)(int) { return X0(); } template<typename T> struct X1 { struct type { }; X1<T>(); X1<T>(int); (X1<T>)(float); X1(float, float); (X1)(double); X1<T> (f0)(int); X1<T> (f0)(type); X1 (f1)(int); X1 (f1)(type); template<typename U> X1(U); X1 f2(); X1 f2(int); }; template<typename T> X1<T>::X1() { } template<typename T> (X1<T>::X1)(double) { } template<typename T> X1<T> X1<T>::f1(int) { return 0; } template<typename T> X1<T> (X1<T>::f1)(type) { return 0; } class X2 { X2::X2(); // expected-error {{extra qualification on member 'X2'}} }; // We used to parse 'X3::X3' as a member function declaration. // DR 1435 and DR 1310 made this invalid. typedef int T1; struct X3 { X3::X3(T1()); // expected-error {{extra qualification on member 'X3'}} };