diff options
author | Alexey Bataev <a.bataev@hotmail.com> | 2014-10-16 03:04:35 +0000 |
---|---|---|
committer | Alexey Bataev <a.bataev@hotmail.com> | 2014-10-16 03:04:35 +0000 |
commit | 87f89f4b3b6cbc70f4236654fe05770f87bb6a4f (patch) | |
tree | ad151e81832c1bc6b43726b5412bf0d762499b3c /test/SemaTemplate/instantiate-non-dependent-types.cpp | |
parent | 116b574e0f3f08f29a443070342d70547d5abf6e (diff) | |
download | clang-87f89f4b3b6cbc70f4236654fe05770f87bb6a4f.tar.gz |
Bugfix in template instantiation in CXXPseudoDestructorExpr.
Fix for clang crash when instantiating a template with qualified lookup for members in non-class types.
Differential Revision: http://reviews.llvm.org/D5769
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@219897 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/SemaTemplate/instantiate-non-dependent-types.cpp')
-rw-r--r-- | test/SemaTemplate/instantiate-non-dependent-types.cpp | 40 |
1 files changed, 39 insertions, 1 deletions
diff --git a/test/SemaTemplate/instantiate-non-dependent-types.cpp b/test/SemaTemplate/instantiate-non-dependent-types.cpp index a0005c5667..432b9053bd 100644 --- a/test/SemaTemplate/instantiate-non-dependent-types.cpp +++ b/test/SemaTemplate/instantiate-non-dependent-types.cpp @@ -1,4 +1,5 @@ // RUN: %clang_cc1 -fsyntax-only -verify %s +// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s template<typename T> struct X1 { static void member() { T* x = 1; } // expected-error{{cannot initialize a variable of type 'int *' with an rvalue of type 'int'}} @@ -11,4 +12,41 @@ struct X2 { typedef instantiate<&X1<int>::member> i; // expected-note{{in instantiation of}} }; -X2<int> x; +X2<int> x; + +template <class T, class A> class C { +public: + int i; + void f(T &t) { + T *q = new T(); + t.T::~T(); + q->~T(); + // expected-error@+2 {{'int' is not a class, namespace, or scoped enumeration}} + // expected-error@+1 {{no member named '~Colors' in 'Colors'}} + q->A::~A(); + // expected-error@+2 {{no member named '~int' in 'Q'}} + // expected-error@+1 {{no member named '~Colors' in 'Q'}} + q->~A(); + + delete q; + } +}; + +class Q { +public: + Q() {} + ~Q() {} +}; + +enum Colors {red, green, blue}; + +C<Q, int> dummy; +C<Q, Colors> dummyColors; +int main() { + Q qinst; + // expected-note@+1 {{in instantiation of member function 'C<Q, int>::f' requested here}} + dummy.f(qinst); + // expected-note@+1 {{in instantiation of member function 'C<Q, Colors>::f' requested here}} + dummyColors.f(qinst); +} + |