summaryrefslogtreecommitdiffstats
path: root/test/SemaCXX/many-template-parameter-lists.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/SemaCXX/many-template-parameter-lists.cpp')
-rw-r--r--test/SemaCXX/many-template-parameter-lists.cpp36
1 files changed, 36 insertions, 0 deletions
diff --git a/test/SemaCXX/many-template-parameter-lists.cpp b/test/SemaCXX/many-template-parameter-lists.cpp
new file mode 100644
index 0000000..f98005c
--- /dev/null
+++ b/test/SemaCXX/many-template-parameter-lists.cpp
@@ -0,0 +1,36 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s
+
+// This is not well-formed C++ but used to crash in sema.
+
+template <class T>
+struct X {
+ template <class U>
+ struct A { // expected-note {{not-yet-instantiated member is declared here}}
+ template <class V>
+ struct B {
+ template <class W>
+ struct C {
+ template <class X>
+ struct D {
+ template <class Y>
+ struct E {
+ template <class Z>
+ void operator+=(Z);
+ };
+ };
+ };
+ };
+ };
+
+ template <class U>
+ template <class V>
+ template <class W>
+ template <class X>
+ template <class Y>
+ template <class Z>
+ 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}}
+};
+
+void test() {
+ 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}}
+}
OpenPOWER on IntegriCloud