1 | // RUN: %clang_cc1 -fsyntax-only -verify %s |
2 | |
3 | // This is not well-formed C++ but used to crash in sema. |
4 | |
5 | template <class T> |
6 | struct X { |
7 | template <class U> |
8 | struct A { // expected-note {{not-yet-instantiated member is declared here}} |
9 | template <class V> |
10 | struct B { |
11 | template <class W> |
12 | struct C { |
13 | template <class X> |
14 | struct D { |
15 | template <class Y> |
16 | struct E { |
17 | template <class Z> |
18 | void operator+=(Z); |
19 | }; |
20 | }; |
21 | }; |
22 | }; |
23 | }; |
24 | |
25 | template <class U> |
26 | template <class V> |
27 | template <class W> |
28 | template <class X> |
29 | template <class Y> |
30 | template <class Z> |
31 | friend void A<U>::template B<V>::template C<W>::template D<X>::template E<Y>::operator+=(Z); // expected-warning {{not supported}} expected-error {{no member 'A' in 'X<int>'; it has not yet been instantiated}} |
32 | }; |
33 | |
34 | void test() { |
35 | X<int>::A<int>::B<int>::C<int>::D<int>::E<int>() += 1.0; // expected-note {{in instantiation of template class 'X<int>' requested here}} |
36 | } |
37 | |