// RUN: %clang_cc1 -verify -fsyntax-only %s // Verify the absence of assertion failures when solving calls to unresolved // template member functions. struct A { template static void bar(int) { } // expected-note {{candidate template ignored: couldn't infer template argument 'T'}} }; struct B { template static void foo() { int array[i]; A::template bar(array[0]); // expected-error {{a template argument list is expected after a name prefixed by the template keyword}} expected-error {{no matching function for call to 'bar'}} } }; int main() { B::foo<4>(); // expected-note {{in instantiation of function template specialization 'B::foo<4>'}} return 0; } namespace GH70375 { template struct S { static void bar() { Ty t; t.foo(); } static void take(Ty&) {} }; template struct Outer { template struct Inner; using U = S>; template <> struct Inner { void foo() { U::take(*this); } }; }; void instantiate() { Outer::U::bar(); } } namespace GH89374 { struct A {}; template struct MatrixBase { // #GH89374-MatrixBase template Derived &operator=(const MatrixBase &); // #GH89374-copy-assignment }; template struct solve_retval; template struct solve_retval : MatrixBase > {}; // expected-error@-1 {{partial specialization of 'solve_retval' does not use any of its template parameters}} void ApproximateChebyshev() { MatrixBase c; c = solve_retval(); // expected-error@-1 {{no viable overloaded '='}} // expected-note@#GH89374-copy-assignment {{candidate template ignored: could not match 'MatrixBase' against 'solve_retval'}} // expected-note@#GH89374-MatrixBase {{candidate function (the implicit copy assignment operator) not viable: no known conversion from 'solve_retval' to 'const MatrixBase' for 1st argument}} // expected-note@#GH89374-MatrixBase {{candidate function (the implicit move assignment operator) not viable: no known conversion from 'solve_retval' to 'MatrixBase' for 1st argument}} } } // namespace GH89374