aboutsummaryrefslogtreecommitdiff
path: root/test/SemaTemplate/instantiate-scope.cpp
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2015-01-18 16:23:48 +0000
committerDimitry Andric <dim@FreeBSD.org>2015-01-18 16:23:48 +0000
commit06d4ba388873e6d1cfa9cd715a8935ecc8cd2097 (patch)
tree3eb853da77d46cc77c4b017525a422f9ddb1385b /test/SemaTemplate/instantiate-scope.cpp
parent30d791273d07fac9c0c1641a0731191bca6e8606 (diff)
Diffstat (limited to 'test/SemaTemplate/instantiate-scope.cpp')
-rw-r--r--test/SemaTemplate/instantiate-scope.cpp30
1 files changed, 30 insertions, 0 deletions
diff --git a/test/SemaTemplate/instantiate-scope.cpp b/test/SemaTemplate/instantiate-scope.cpp
new file mode 100644
index 000000000000..733105674b7a
--- /dev/null
+++ b/test/SemaTemplate/instantiate-scope.cpp
@@ -0,0 +1,30 @@
+// RUN: %clang_cc1 -std=c++11 -verify %s
+
+template<typename ...T> struct X {
+ void f(int);
+ void f(...);
+ static int n;
+};
+
+template<typename T, typename U> using A = T;
+
+// These definitions are OK, X<A<T, decltype(...)>...> is equivalent to X<T...>
+// so this defines the member of the primary template.
+template<typename ...T>
+void X<A<T, decltype(f(T()))>...>::f(int) {} // expected-error {{undeclared}}
+
+template<typename ...T>
+int X<A<T, decltype(f(T()))>...>::n = 0; // expected-error {{undeclared}}
+
+struct Y {}; void f(Y);
+
+void g() {
+ // OK, substitution succeeds.
+ X<Y>().f(0);
+ X<Y>::n = 1;
+
+ // Error, substitution fails; this should not be treated as a SFINAE-able
+ // condition, so we don't select X<void>::f(...).
+ X<void>().f(0); // expected-note {{instantiation of}}
+ X<void>::n = 1; // expected-note {{instantiation of}}
+}