r243989 - [Sema] Add a crazy test case for r243987
Benjamin Kramer
benny.kra at googlemail.com
Tue Aug 4 08:18:17 PDT 2015
Author: d0k
Date: Tue Aug 4 10:18:16 2015
New Revision: 243989
URL: http://llvm.org/viewvc/llvm-project?rev=243989&view=rev
Log:
[Sema] Add a crazy test case for r243987
It's not valid code (maybe it can be made valid, but I'm not sure how).
To trigger the crash fixed in r243987 requires a friend function with
more than four template parameter lists. With this test we have at least
some coverage.
Added:
cfe/trunk/test/SemaCXX/many-template-parameter-lists.cpp
Added: cfe/trunk/test/SemaCXX/many-template-parameter-lists.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/many-template-parameter-lists.cpp?rev=243989&view=auto
==============================================================================
--- cfe/trunk/test/SemaCXX/many-template-parameter-lists.cpp (added)
+++ cfe/trunk/test/SemaCXX/many-template-parameter-lists.cpp Tue Aug 4 10:18:16 2015
@@ -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}}
+}
More information about the cfe-commits
mailing list