1 // RUN: %clang_cc1 -fsyntax-only -std=c++11 -verify %s
16 friend typename
T::type
; // expected-error{{no type named 'type' in 'Y1'}}
29 X1
<Y1
> x1c
; // expected-note{{in instantiation of template class 'X1<Y1>' requested here}}
31 template<typename T
> class B
;
39 template <typename S
> friend class B
<S
>::ty
; // expected-warning {{dependent nested name specifier 'B<S>::' for friend class declaration is not supported}}
42 template<typename T
> class B
{ typedef int ty
; };
44 template<> class B
<int> {
46 static int f(A
<int> &a
) { return a
.y
; } // ok, befriended
49 int f(A
<char> &a
) { return a
.y
; } // FIXME: should be an error
53 int friend; // expected-error {{'friend' must appear first in a non-function declaration}}
54 unsigned friend int; // expected-error {{'friend' must appear first in a non-function declaration}}
55 const volatile friend int; // expected-error {{'friend' must appear first in a non-function declaration}} \
56 // expected-error {{'const' is invalid in friend declarations}} \
57 // expected-error {{'volatile' is invalid in friend declarations}}
59 friend; // expected-error {{'friend' must appear first in a non-function declaration}}
60 friend const int; // expected-error {{'const' is invalid in friend declarations}}
61 friend volatile int; // expected-error {{'volatile' is invalid in friend declarations}}
62 template <typename T
> friend const class X
; // expected-error {{'const' is invalid in friend declarations}}
63 // C++ doesn't have restrict and _Atomic, but they're both the same sort
65 typedef int *PtrToInt
;
66 friend __restrict PtrToInt
; // expected-error {{'restrict' is invalid in friend declarations}} \
67 // expected-error {{restrict requires a pointer or reference}}
68 friend _Atomic
int; // expected-error {{'_Atomic' is invalid in friend declarations}}
72 const int friend foo2(void);
77 template<typename T
> friend class A
<T
>::foo
; // expected-warning {{not supported}}
80 void testA() { (void)sizeof(A
<int>); }