| // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s |
| |
| typedef double A; |
| template<typename T> class B { |
| typedef int A; |
| }; |
| |
| template<typename T> struct X : B<T> { |
| static A a; |
| }; |
| |
| int a0[sizeof(X<int>::a) == sizeof(double) ? 1 : -1]; |
| |
| // PR4365. |
| template<class T> class Q; |
| template<class T> class R : Q<T> {T current;}; |
| |
| |
| namespace test0 { |
| template <class T> class Base { |
| public: |
| void instance_foo(); |
| static void static_foo(); |
| class Inner { |
| public: |
| void instance_foo(); |
| static void static_foo(); |
| }; |
| }; |
| |
| template <class T> class Derived1 : Base<T> { |
| public: |
| void test0() { |
| Base<T>::static_foo(); |
| Base<T>::instance_foo(); |
| } |
| |
| void test1() { |
| Base<T>::Inner::static_foo(); |
| Base<T>::Inner::instance_foo(); // expected-error {{call to non-static member function without an object argument}} |
| } |
| |
| static void test2() { |
| Base<T>::static_foo(); |
| Base<T>::instance_foo(); // expected-error {{call to non-static member function without an object argument}} |
| } |
| |
| static void test3() { |
| Base<T>::Inner::static_foo(); |
| Base<T>::Inner::instance_foo(); // expected-error {{call to non-static member function without an object argument}} |
| } |
| }; |
| |
| template <class T> class Derived2 : Base<T>::Inner { |
| public: |
| void test0() { |
| Base<T>::static_foo(); |
| Base<T>::instance_foo(); // expected-error {{call to non-static member function without an object argument}} |
| } |
| |
| void test1() { |
| Base<T>::Inner::static_foo(); |
| Base<T>::Inner::instance_foo(); |
| } |
| |
| static void test2() { |
| Base<T>::static_foo(); |
| Base<T>::instance_foo(); // expected-error {{call to non-static member function without an object argument}} |
| } |
| |
| static void test3() { |
| Base<T>::Inner::static_foo(); |
| Base<T>::Inner::instance_foo(); // expected-error {{call to non-static member function without an object argument}} |
| } |
| }; |
| |
| void test0() { |
| Derived1<int> d1; |
| d1.test0(); |
| d1.test1(); // expected-note {{in instantiation of member function}} |
| d1.test2(); // expected-note {{in instantiation of member function}} |
| d1.test3(); // expected-note {{in instantiation of member function}} |
| |
| Derived2<int> d2; |
| d2.test0(); // expected-note {{in instantiation of member function}} |
| d2.test1(); |
| d2.test2(); // expected-note {{in instantiation of member function}} |
| d2.test3(); // expected-note {{in instantiation of member function}} |
| } |
| } |
| |
| namespace test1 { |
| template <class T> struct Base { |
| void foo(T); // expected-note {{must qualify identifier to find this declaration in dependent base class}} |
| }; |
| |
| template <class T> struct Derived : Base<T> { |
| void doFoo(T v) { |
| foo(v); // expected-error {{use of undeclared identifier}} |
| } |
| }; |
| |
| template struct Derived<int>; // expected-note {{requested here}} |
| } |
| |
| namespace PR8966 { |
| template <class T> |
| class MyClassCore |
| { |
| }; |
| |
| template <class T> |
| class MyClass : public MyClassCore<T> |
| { |
| public: |
| enum { |
| N |
| }; |
| |
| // static member declaration |
| static const char* array [N]; |
| |
| void f() { |
| MyClass<T>::InBase = 17; |
| } |
| }; |
| |
| // static member definition |
| template <class T> |
| const char* MyClass<T>::array [MyClass<T>::N] = { "A", "B", "C" }; |
| } |
| |
| namespace std { |
| inline namespace v1 { |
| template<typename T> struct basic_ostream; |
| } |
| namespace inner { |
| template<typename T> struct vector {}; |
| } |
| using inner::vector; |
| template<typename T, typename U> struct pair {}; |
| typedef basic_ostream<char> ostream; |
| extern ostream cout; |
| std::ostream &operator<<(std::ostream &out, const char *); |
| } |
| |
| namespace PR10053 { |
| template<typename T> struct A { |
| T t; |
| A() { |
| f(t); // expected-error {{call to function 'f' that is neither visible in the template definition nor found by argument-dependent lookup}} |
| } |
| }; |
| |
| void f(int&); // expected-note {{'f' should be declared prior to the call site}} |
| |
| A<int> a; // expected-note {{in instantiation of member function}} |
| |
| |
| namespace N { |
| namespace M { |
| template<typename T> int g(T t) { |
| f(t); // expected-error {{call to function 'f' that is neither visible in the template definition nor found by argument-dependent lookup}} |
| }; |
| } |
| |
| void f(char&); // expected-note {{'f' should be declared prior to the call site}} |
| } |
| |
| void f(char&); |
| |
| int k = N::M::g<char>(0);; // expected-note {{in instantiation of function}} |
| |
| |
| namespace O { |
| void f(char&); // expected-note {{candidate function not viable}} |
| |
| template<typename T> struct C { |
| static const int n = f(T()); // expected-error {{no matching function}} |
| }; |
| } |
| |
| int f(double); // no note, shadowed by O::f |
| O::C<double> c; // expected-note {{requested here}} |
| |
| |
| // Example from www/compatibility.html |
| namespace my_file { |
| template <typename T> T Squared(T x) { |
| return Multiply(x, x); // expected-error {{neither visible in the template definition nor found by argument-dependent lookup}} |
| } |
| |
| int Multiply(int x, int y) { // expected-note {{should be declared prior to the call site}} |
| return x * y; |
| } |
| |
| int main() { |
| Squared(5); // expected-note {{here}} |
| } |
| } |
| |
| // Example from www/compatibility.html |
| namespace my_file2 { |
| template<typename T> |
| void Dump(const T& value) { |
| std::cout << value << "\n"; // expected-error {{neither visible in the template definition nor found by argument-dependent lookup}} |
| } |
| |
| namespace ns { |
| struct Data {}; |
| } |
| |
| std::ostream& operator<<(std::ostream& out, ns::Data data) { // expected-note {{should be declared prior to the call site or in namespace 'PR10053::my_file2::ns'}} |
| return out << "Some data"; |
| } |
| |
| void Use() { |
| Dump(ns::Data()); // expected-note {{here}} |
| } |
| } |
| |
| namespace my_file2_a { |
| template<typename T> |
| void Dump(const T &value) { |
| print(std::cout, value); // expected-error 4{{neither visible in the template definition nor found by argument-dependent lookup}} |
| } |
| |
| namespace ns { |
| struct Data {}; |
| } |
| namespace ns2 { |
| struct Data {}; |
| } |
| |
| std::ostream &print(std::ostream &out, int); // expected-note-re {{should be declared prior to the call site{{$}}}} |
| std::ostream &print(std::ostream &out, ns::Data); // expected-note {{should be declared prior to the call site or in namespace 'PR10053::my_file2_a::ns'}} |
| std::ostream &print(std::ostream &out, std::vector<ns2::Data>); // expected-note {{should be declared prior to the call site or in namespace 'PR10053::my_file2_a::ns2'}} |
| std::ostream &print(std::ostream &out, std::pair<ns::Data, ns2::Data>); // expected-note {{should be declared prior to the call site or in an associated namespace of one of its arguments}} |
| |
| void Use() { |
| Dump(0); // expected-note {{requested here}} |
| Dump(ns::Data()); // expected-note {{requested here}} |
| Dump(std::vector<ns2::Data>()); // expected-note {{requested here}} |
| Dump(std::pair<ns::Data, ns2::Data>()); // expected-note {{requested here}} |
| } |
| } |
| |
| namespace unary { |
| template<typename T> |
| T Negate(const T& value) { |
| return !value; // expected-error {{call to function 'operator!' that is neither visible in the template definition nor found by argument-dependent lookup}} |
| } |
| |
| namespace ns { |
| struct Data {}; |
| } |
| |
| ns::Data operator!(ns::Data); // expected-note {{should be declared prior to the call site or in namespace 'PR10053::unary::ns'}} |
| |
| void Use() { |
| Negate(ns::Data()); // expected-note {{requested here}} |
| } |
| } |
| } |
| |
| namespace PR10187 { |
| namespace A1 { |
| template<typename T> |
| struct S { |
| void f() { |
| for (auto &a : e) |
| __range(a); // expected-error {{undeclared identifier '__range'}} |
| } |
| int e[10]; |
| }; |
| void g() { |
| S<int>().f(); // expected-note {{here}} |
| } |
| } |
| |
| namespace A2 { |
| template<typename T> |
| struct S { |
| void f() { |
| for (auto &a : e) |
| __range(a); // expected-error {{undeclared identifier '__range'}} |
| } |
| T e[10]; |
| }; |
| void g() { |
| S<int>().f(); // expected-note {{here}} |
| } |
| struct X {}; |
| void __range(X); |
| void h() { |
| S<X>().f(); |
| } |
| } |
| |
| namespace B { |
| template<typename T> void g(); // expected-note {{not viable}} |
| template<typename T> void f() { |
| g<int>(T()); // expected-error {{no matching function}} |
| } |
| |
| namespace { |
| struct S {}; |
| } |
| void g(S); |
| |
| template void f<S>(); // expected-note {{here}} |
| } |
| } |
| |
| namespace rdar11242625 { |
| |
| template <typename T> |
| struct Main { |
| struct default_names { |
| typedef int id; |
| }; |
| |
| template <typename T2 = typename default_names::id> |
| struct TS { |
| T2 q; |
| }; |
| }; |
| |
| struct Sub : public Main<int> { |
| TS<> ff; |
| }; |
| |
| int arr[sizeof(Sub)]; |
| |
| } |
| |
| namespace PR11421 { |
| template < unsigned > struct X { |
| static const unsigned dimension = 3; |
| template<unsigned dim=dimension> |
| struct Y: Y<dim> { }; // expected-error{{circular inheritance between 'Y<dim>' and 'Y<dim>'}} |
| }; |
| typedef X<3> X3; |
| X3::Y<>::iterator it; // expected-error {{no type named 'iterator' in 'PR11421::X<3>::Y<3>'}} |
| } |
| |
| namespace rdar12629723 { |
| template<class T> |
| struct X { |
| struct C : public C { }; // expected-error{{circular inheritance between 'rdar12629723::X::C' and 'rdar12629723::X::C'}} |
| |
| struct B; |
| |
| struct A : public B { // expected-note{{'rdar12629723::X::A' declared here}} |
| virtual void foo() { } |
| }; |
| |
| struct D : T::foo { }; |
| struct E : D { }; |
| }; |
| |
| template<class T> |
| struct X<T>::B : public A { // expected-error{{circular inheritance between 'rdar12629723::X::A' and 'rdar12629723::X::B'}} |
| virtual void foo() { } |
| }; |
| } |
| |
| namespace test_reserved_identifiers { |
| template<typename A, typename B> void tempf(A a, B b) { |
| a + b; // expected-error{{call to function 'operator+' that is neither visible in the template definition nor found by argument-dependent lookup}} |
| } |
| namespace __gnu_cxx { struct X {}; } |
| namespace ns { struct Y {}; } |
| void operator+(__gnu_cxx::X, ns::Y); // expected-note{{or in namespace 'test_reserved_identifiers::ns'}} |
| void test() { |
| __gnu_cxx::X x; |
| ns::Y y; |
| tempf(x, y); // expected-note{{in instantiation of}} |
| } |
| } |
| |
| // This test must live in the global namespace. |
| struct PR14695_X {}; |
| // FIXME: This note is bogus; it is the using directive which would need to move |
| // to prior to the call site to fix the problem. |
| namespace PR14695_A { void PR14695_f(PR14695_X); } // expected-note {{'PR14695_f' should be declared prior to the call site or in the global namespace}} |
| template<typename T> void PR14695_g(T t) { PR14695_f(t); } // expected-error {{call to function 'PR14695_f' that is neither visible in the template definition nor found by argument-dependent lookup}} |
| using namespace PR14695_A; |
| template void PR14695_g(PR14695_X); // expected-note{{requested here}} |
| |
| namespace OperatorNew { |
| template<typename T> void f(T t) { |
| operator new(100, t); // expected-error{{call to function 'operator new' that is neither visible in the template definition nor found by argument-dependent lookup}} |
| // FIXME: This should give the same error. |
| new (t) int; |
| } |
| struct X {}; |
| }; |
| using size_t = decltype(sizeof(0)); |
| void *operator new(size_t, OperatorNew::X); // expected-note-re {{should be declared prior to the call site{{$}}}} |
| template void OperatorNew::f(OperatorNew::X); // expected-note {{instantiation of}} |
| |
| namespace PR19936 { |
| template<typename T> decltype(*T()) f() {} // expected-note {{previous}} |
| template<typename T> decltype(T() * T()) g() {} // expected-note {{previous}} |
| |
| // Create some overloaded operators so we build an overload operator call |
| // instead of a builtin operator call for the dependent expression. |
| enum E {}; |
| int operator*(E); |
| int operator*(E, E); |
| |
| // Check that they still profile the same. |
| template<typename T> decltype(*T()) f() {} // expected-error {{redefinition}} |
| template<typename T> decltype(T() * T()) g() {} // expected-error {{redefinition}} |
| } |
| |
| 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>(); } |
| } |