diff options
| author | Faisal Vali <faisalv@yahoo.com> | 2016-02-22 02:24:29 +0000 |
|---|---|---|
| committer | Faisal Vali <faisalv@yahoo.com> | 2016-02-22 02:24:29 +0000 |
| commit | e7f8fb98359a818eb0944461d3718898d792d5ce (patch) | |
| tree | 00b7c58514a78cd9a41efeb63a319e73f2d159ff /clang/test/SemaCXX/cxx1y-variable-templates_in_class.cpp | |
| parent | 47e64abe1a0c5ee4e8e16ff837e1423a102acb0b (diff) | |
| download | bcm5719-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.cpp | 46 |
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 + |

