summaryrefslogtreecommitdiff
path: root/test/SemaTemplate/instantiate-non-dependent-types.cpp
diff options
context:
space:
mode:
authorAlexey Bataev <a.bataev@hotmail.com>2014-10-16 03:04:35 +0000
committerAlexey Bataev <a.bataev@hotmail.com>2014-10-16 03:04:35 +0000
commit87f89f4b3b6cbc70f4236654fe05770f87bb6a4f (patch)
treead151e81832c1bc6b43726b5412bf0d762499b3c /test/SemaTemplate/instantiate-non-dependent-types.cpp
parent116b574e0f3f08f29a443070342d70547d5abf6e (diff)
downloadclang-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.cpp40
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);
+}
+