// RUN: %clang_cc1 -fsyntax-only -std=c++11 -verify %s template class X0 { friend T; }; class Y1 { }; enum E1 { }; X0 x0a; X0 x0b; X0 x0c; X0 x0d; template class X1 { friend typename T::type; // expected-error{{no type named 'type' in 'Y1'}} }; struct Y2 { struct type { }; }; struct Y3 { typedef int type; }; X1 x1a; X1 x1b; X1 x1c; // expected-note{{in instantiation of template class 'X1' requested here}} template class B; template class A { T x; public: class foo {}; static int y; template friend class B::ty; // expected-warning {{dependent nested name specifier 'B::' for friend class declaration is not supported}} }; template class B { typedef int ty; }; template<> class B { class ty { static int f(A &a) { return a.y; } // ok, befriended }; }; int f(A &a) { return a.y; } // FIXME: should be an error struct { // Ill-formed int friend; // expected-error {{'friend' must appear first in a non-function declaration}} unsigned friend int; // expected-error {{'friend' must appear first in a non-function declaration}} const volatile friend int; // expected-error {{'friend' must appear first in a non-function declaration}} \ // expected-error {{'const' is invalid in friend declarations}} \ // expected-error {{'volatile' is invalid in friend declarations}} int friend; // expected-error {{'friend' must appear first in a non-function declaration}} friend const int; // expected-error {{'const' is invalid in friend declarations}} friend volatile int; // expected-error {{'volatile' is invalid in friend declarations}} template friend const class X; // expected-error {{'const' is invalid in friend declarations}} // C++ doesn't have restrict and _Atomic, but they're both the same sort // of qualifier. typedef int *PtrToInt; friend __restrict PtrToInt; // expected-error {{'restrict' is invalid in friend declarations}} \ // expected-error {{restrict requires a pointer or reference}} friend _Atomic int; // expected-error {{'_Atomic' is invalid in friend declarations}} // OK int friend foo(void); const int friend foo2(void); friend int; friend float; template friend class A::foo; // expected-warning {{not supported}} } a; void testA() { (void)sizeof(A); }