summaryrefslogtreecommitdiff
path: root/test/SemaTemplate/dependent-names.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/SemaTemplate/dependent-names.cpp')
-rw-r--r--test/SemaTemplate/dependent-names.cpp40
1 files changed, 40 insertions, 0 deletions
diff --git a/test/SemaTemplate/dependent-names.cpp b/test/SemaTemplate/dependent-names.cpp
index d5c9d66c4526..67ef238083f0 100644
--- a/test/SemaTemplate/dependent-names.cpp
+++ b/test/SemaTemplate/dependent-names.cpp
@@ -419,3 +419,43 @@ template <typename> struct CT2 {
template <class U> struct X;
};
template <typename T> int CT2<int>::X<>; // expected-error {{template parameter list matching the non-templated nested type 'CT2<int>' should be empty}}
+
+namespace DependentTemplateIdWithNoArgs {
+ template<typename T> void f() { T::template f(); }
+ struct X {
+ template<int = 0> static void f();
+ };
+ void g() { f<X>(); }
+}
+
+namespace DependentUnresolvedUsingTemplate {
+ template<typename T>
+ struct X : T {
+ using T::foo;
+ void f() { this->template foo(); } // expected-error {{does not refer to a template}}
+ void g() { this->template foo<>(); } // expected-error {{does not refer to a template}}
+ void h() { this->template foo<int>(); } // expected-error {{does not refer to a template}}
+ };
+ struct A { template<typename = int> int foo(); };
+ struct B { int foo(); }; // expected-note 3{{non-template here}}
+ void test(X<A> xa, X<B> xb) {
+ xa.f();
+ xa.g();
+ xa.h();
+ xb.f(); // expected-note {{instantiation of}}
+ xb.g(); // expected-note {{instantiation of}}
+ xb.h(); // expected-note {{instantiation of}}
+ }
+}
+
+namespace PR37680 {
+ template <class a> struct b : a {
+ using a::add;
+ template<int> int add() { return this->template add(0); }
+ };
+ struct a {
+ template<typename T = void> int add(...);
+ void add(int);
+ };
+ int f(b<a> ba) { return ba.add<0>(); }
+}