summaryrefslogtreecommitdiffstats
path: root/clang/test/SemaCXX/cxx1y-variable-templates_in_class.cpp
diff options
context:
space:
mode:
authorFaisal Vali <faisalv@yahoo.com>2016-02-22 02:24:29 +0000
committerFaisal Vali <faisalv@yahoo.com>2016-02-22 02:24:29 +0000
commite7f8fb98359a818eb0944461d3718898d792d5ce (patch)
tree00b7c58514a78cd9a41efeb63a319e73f2d159ff /clang/test/SemaCXX/cxx1y-variable-templates_in_class.cpp
parent47e64abe1a0c5ee4e8e16ff837e1423a102acb0b (diff)
downloadbcm5719-llvm-e7f8fb98359a818eb0944461d3718898d792d5ce.tar.gz
bcm5719-llvm-e7f8fb98359a818eb0944461d3718898d792d5ce.zip
Fix PR24473 : Teach clang to remember to substitute into member variable templates referred to within dependent qualified ids.
In passing also fix a semi-related bug that allows access to variable templates through member access notation. llvm-svn: 261506
Diffstat (limited to 'clang/test/SemaCXX/cxx1y-variable-templates_in_class.cpp')
-rw-r--r--clang/test/SemaCXX/cxx1y-variable-templates_in_class.cpp46
1 files changed, 45 insertions, 1 deletions
diff --git a/clang/test/SemaCXX/cxx1y-variable-templates_in_class.cpp b/clang/test/SemaCXX/cxx1y-variable-templates_in_class.cpp
index 65e2d6b608c..1c59585b325 100644
--- a/clang/test/SemaCXX/cxx1y-variable-templates_in_class.cpp
+++ b/clang/test/SemaCXX/cxx1y-variable-templates_in_class.cpp
@@ -1,6 +1,6 @@
// RUN: %clang_cc1 -verify -fsyntax-only %s -Wno-c++11-extensions -Wno-c++1y-extensions -DPRECXX11
// RUN: %clang_cc1 -std=c++11 -verify -fsyntax-only -Wno-c++1y-extensions %s
-// RUN: %clang_cc1 -std=c++1y -verify -fsyntax-only %s
+// RUN: %clang_cc1 -std=c++1y -verify -fsyntax-only %s -DCPP1Y
#define CONST const
@@ -338,3 +338,47 @@ namespace b20896909 {
A<int> ai; // expected-note {{in instantiation of}}
}
}
+namespace member_access_is_ok {
+#ifdef CPP1Y
+ namespace ns1 {
+ struct A {
+ template<class T, T N> constexpr static T Var = N;
+ };
+ static_assert(A{}.Var<int,5> == 5,"");
+ } // end ns1
+#endif // CPP1Y
+
+namespace ns2 {
+ template<class T> struct A {
+ template<class U, T N, U M> static T&& Var;
+ };
+ template<class T> template<class U, T N, U M> T&& A<T>::Var = T(N + M);
+ int *AV = &A<int>().Var<char, 5, 'A'>;
+
+} //end ns2
+} // end ns member_access_is_ok
+
+#ifdef CPP1Y
+namespace PR24473 {
+struct Value
+{
+ template<class T>
+ static constexpr T value = 0;
+};
+
+template<typename TValue>
+struct Something
+{
+ void foo() {
+ static_assert(TValue::template value<int> == 0, ""); // error
+ }
+};
+
+int main() {
+ Something<Value>{}.foo();
+ return 0;
+}
+
+} // end ns PR24473
+#endif // CPP1Y
+
OpenPOWER on IntegriCloud