// RUN: %clang_cc1 -fsyntax-only -verify %s

// Clang used to crash trying to recover while adding 'this->' before Work(x);

template <typename> struct A {
  static void Work(int);  // expected-note{{must qualify identifier}}
};

template <typename T> struct B : public A<T> {
  template <typename T2> B(T2 x) {
    Work(x);  // expected-error{{use of undeclared identifier}}
  }
};

void Test() {
  B<int> b(0);  // expected-note{{in instantiation of function template}}
}


// Don't crash here.
namespace PR16134 {
  template <class P> struct S // expected-error {{expected ';'}}
  template <> static S<Q>::f() // expected-error +{{}}
}

namespace PR16225 {
  template <typename T> void f();
  template<typename C> void g(C*) {
    struct LocalStruct : UnknownBase<Mumble, C> { };  // expected-error {{unknown template name 'UnknownBase'}} \
                                                      // expected-error {{use of undeclared identifier 'Mumble'}}
    f<LocalStruct>();  // expected-warning {{template argument uses local type 'LocalStruct'}}
  }
  struct S;
  void h() {
    g<S>(0);  // expected-note {{in instantiation of function template specialization}}
  }
}

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) {
    // expected-error@+1 {{use of undeclared identifier 'UndeclaredMethod'}}
    UndeclaredMethod(resource_data);
  }
  // expected-error@+2 {{out-of-line definition of 'UndeclaredMethod' does not match any declaration}}
  // expected-note@+1 {{must qualify identifier to find this declaration in dependent base class}}
  void NonTemplateClass::UndeclaredMethod() {}
}
