| // RUN: %clang_cc1 -fsyntax-only -verify %s |
| |
| template<typename T> |
| struct test { |
| template<typename> using fun_diff = char; // expected-note 2{{class template declared here}} |
| }; |
| |
| template<typename T, typename V> |
| decltype(T::template fun_diff<V>) foo1() {} |
| // expected-note@-1 {{candidate template ignored: substitution failure [with T = test<int>, V = int]: 'test<int>::fun_diff' is expected to be a non-type template, but instantiated to a type alias template}} |
| |
| template<typename T> |
| void foo2() { |
| // expected-error@+1 {{test<int>::fun_diff' is expected to be a non-type template, but instantiated to a type alias template}} |
| int a = test<T>::template fun_diff<int>; |
| } |
| |
| template<typename T, typename V> |
| struct has_fun_diff { |
| using type = double; |
| }; |
| |
| template<typename T> |
| struct has_fun_diff<T, int> { |
| // expected-error@+1 {{'test<int>::fun_diff' is expected to be a non-type template, but instantiated to a type alias template}} |
| using type = decltype(T::template fun_diff<int>); |
| }; |
| |
| void bar() { |
| foo1<test<int>, int>(); // expected-error {{no matching function for call to 'foo1'}} |
| foo2<int>(); // expected-note {{in instantiation of function template specialization}} |
| has_fun_diff<test<int>, int>::type a; // expected-note {{in instantiation of template class}} |
| } |