xref: /llvm-project/clang/test/CXX/temp/temp.decls/temp.friend/p5.cpp (revision 0f1c1be1968076d6f96f8a7bcc4a15cf195ecd97)
1 // RUN: %clang_cc1 -fsyntax-only -verify %s
2 
3 namespace test0 {
4   template <class T> class A {
5     class Member {};
6   };
7 
8   class B {
9     template <class T> friend class A<T>::Member; // expected-warning {{not supported}}
10     int n;
11   };
12 
13   A<int> a;
14   B b;
15 }
16 
17 namespace test1 {
18   template <class T> struct A;
19 
20   class C {
21     static void foo();
22     template <class T> friend void A<T>::f(); // expected-warning {{not supported}}
23   };
24 
25   template <class T> struct A {
ftest1::A26     void f() { C::foo(); }
27   };
28 
29   template <class T> struct A<T*> {
ftest1::A30     void f() { C::foo(); }
31   };
32 
33   template <> struct A<char> {
ftest1::A34     void f() { C::foo(); }
35   };
36 }
37 
38 // FIXME: these should fail!
39 namespace test2 {
40   template <class T> struct A;
41 
42   class C {
43     static void foo();
44     template <class T> friend void A<T>::g(); // expected-warning {{not supported}}
45   };
46 
47   template <class T> struct A {
ftest2::A48     void f() { C::foo(); }
49   };
50 
51   template <class T> struct A<T*> {
ftest2::A52     void f() { C::foo(); }
53   };
54 
55   template <> struct A<char> {
ftest2::A56     void f() { C::foo(); }
57   };
58 }
59 
60 namespace test3 {
61   template <class T> struct A {
62     struct Inner {
63       static int foo();
64     };
65   };
66 
67   template <class U> class C {
68     int i;
69     template <class T> friend struct A<T>::Inner; // expected-warning {{not supported}}
70   };
71 
foo()72   template <class T> int A<T>::Inner::foo() {
73     C<int> c;
74     c.i = 0;
75     return 0;
76   }
77 
78   int test = A<int>::Inner::foo();
79 }
80 
81 namespace test4 {
82   template <class T> struct X {
83     template <class U> void operator+=(U);
84 
85     template <class V>
86     template <class U>
87     friend void X<V>::operator+=(U); // expected-warning {{not supported}}
88   };
89 
test()90   void test() {
91     X<int>() += 1.0;
92   }
93 }
94 
95 namespace test5 {
96   template<template <class> class T> struct A {
97     template<template <class> class U> friend void A<U>::foo(); // expected-warning {{not supported}}
98   };
99 
100   template <class> struct B {};
101   template class A<B>;
102 }
103