to pretty-print such function types better, and to fix a case where we were not instantiating templates in lexical order. In passing, move the Variadic bit from Type's bitfields to FunctionProtoType to get the Type bitfields down to 32 bits. Also ensure that we always substitute the return type of a function when substituting explicitly-specified arguments, since that can cause us to bail out with a SFINAE error before we hit a hard error in parameter substitution. llvm-svn: 150241
16 lines
523 B
C++
16 lines
523 B
C++
// RUN: %clang_cc1 -std=c++11 -verify %s
|
|
|
|
// From core issue 1227.
|
|
|
|
template <class T> struct A { using X = typename T::X; }; // expected-error {{no members}}
|
|
template <class T> typename T::X f(typename A<T>::X);
|
|
template <class T> void f(...) {}
|
|
template <class T> auto g(typename A<T>::X) -> typename T::X; // expected-note {{here}} expected-note {{substituting}}
|
|
template <class T> void g(...) {}
|
|
|
|
void h()
|
|
{
|
|
f<int>(0); // ok, SFINAE in return type
|
|
g<int>(0); // not ok, substitution inside A<int> is a hard error
|
|
}
|