2010-08-20 20:54:15 +00:00
|
|
|
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
2016-04-14 23:47:07 +00:00
|
|
|
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s
|
|
|
|
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
|
2010-08-20 20:54:15 +00:00
|
|
|
|
2012-06-22 16:39:39 +00:00
|
|
|
// Clang used to crash trying to recover while adding 'this->' before Work(x);
|
2010-08-20 20:54:15 +00:00
|
|
|
|
|
|
|
template <typename> struct A {
|
2020-12-03 01:46:28 +00:00
|
|
|
static void Work(int); // expected-note{{here}}
|
2010-08-20 20:54:15 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
template <typename T> struct B : public A<T> {
|
|
|
|
template <typename T2> B(T2 x) {
|
2020-12-03 01:46:28 +00:00
|
|
|
Work(x); // expected-error{{explicit qualification required}}
|
2010-08-20 20:54:15 +00:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
void Test() {
|
|
|
|
B<int> b(0); // expected-note{{in instantiation of function template}}
|
|
|
|
}
|
|
|
|
|
2013-07-22 18:09:32 +00:00
|
|
|
|
|
|
|
// Don't crash here.
|
|
|
|
namespace PR16134 {
|
|
|
|
template <class P> struct S // expected-error {{expected ';'}}
|
|
|
|
template <> static S<Q>::f() // expected-error +{{}}
|
|
|
|
}
|
2013-08-10 12:00:21 +00:00
|
|
|
|
|
|
|
namespace PR16225 {
|
|
|
|
template <typename T> void f();
|
2016-04-14 23:47:07 +00:00
|
|
|
template <typename C> void g(C*) {
|
2019-05-09 03:31:27 +00:00
|
|
|
struct LocalStruct : UnknownBase<Mumble, C> { }; // expected-error {{use of undeclared identifier 'Mumble'}}
|
2016-04-14 23:47:07 +00:00
|
|
|
f<LocalStruct>();
|
|
|
|
#if __cplusplus <= 199711L
|
|
|
|
// expected-warning@-2 {{template argument uses local type 'LocalStruct'}}
|
|
|
|
#endif
|
2019-05-09 03:31:27 +00:00
|
|
|
struct LocalStruct2 : UnknownBase<C> { }; // expected-error {{no template named 'UnknownBase'}}
|
2013-08-10 12:00:21 +00:00
|
|
|
}
|
|
|
|
struct S;
|
|
|
|
void h() {
|
2016-04-14 23:47:07 +00:00
|
|
|
g<S>(0);
|
|
|
|
#if __cplusplus <= 199711L
|
|
|
|
// expected-note@-2 {{in instantiation of function template specialization}}
|
|
|
|
#endif
|
2013-08-10 12:00:21 +00:00
|
|
|
}
|
|
|
|
}
|
2015-09-30 17:30:48 +00:00
|
|
|
|
|
|
|
namespace test1 {
|
|
|
|
template <typename> class ArraySlice {};
|
|
|
|
class Foo;
|
|
|
|
class NonTemplateClass {
|
|
|
|
void MemberFunction(ArraySlice<Foo>, int);
|
|
|
|
template <class T> void MemberFuncTemplate(ArraySlice<T>, int);
|
|
|
|
};
|
|
|
|
void NonTemplateClass::MemberFunction(ArraySlice<Foo> resource_data,
|
|
|
|
int now) {
|
|
|
|
// expected-note@+1 {{in instantiation of function template specialization 'test1::NonTemplateClass::MemberFuncTemplate<test1::Foo>'}}
|
|
|
|
MemberFuncTemplate(resource_data, now);
|
|
|
|
}
|
|
|
|
template <class T>
|
|
|
|
void NonTemplateClass::MemberFuncTemplate(ArraySlice<T> resource_data, int) {
|
2020-12-03 01:46:28 +00:00
|
|
|
// expected-error@+1 {{member 'UndeclaredMethod' used before its declaration}}
|
2015-09-30 17:30:48 +00:00
|
|
|
UndeclaredMethod(resource_data);
|
|
|
|
}
|
|
|
|
// expected-error@+2 {{out-of-line definition of 'UndeclaredMethod' does not match any declaration}}
|
2020-12-03 01:46:28 +00:00
|
|
|
// expected-note@+1 {{member is declared here}}
|
2015-09-30 17:30:48 +00:00
|
|
|
void NonTemplateClass::UndeclaredMethod() {}
|
|
|
|
}
|