Make sure we correctly treat __is_convertible_to as an unevaluated context. PR11833.

llvm-svn: 148893
This commit is contained in:
Eli Friedman 2012-01-25 01:05:57 +00:00
parent 9aa95b16e1
commit a59b1907cc
2 changed files with 9 additions and 2 deletions

View File

@ -3166,8 +3166,9 @@ static bool EvaluateBinaryTypeTrait(Sema &Self, BinaryTypeTrait BTT,
InitializationKind Kind(InitializationKind::CreateCopy(KeyLoc,
SourceLocation()));
// Perform the initialization within a SFINAE trap at translation unit
// scope.
// Perform the initialization in an unevaluated context within a SFINAE
// trap at translation unit scope.
EnterExpressionEvaluationContext Unevaluated(Self, Sema::Unevaluated);
Sema::SFINAETrap SFINAE(Self, /*AccessCheckingSFINAE=*/true);
Sema::ContextRAII TUContext(Self, Self.Context.getTranslationUnitDecl());
InitializationSequence Init(Self, To, Kind, &FromPtr, 1);

View File

@ -1543,6 +1543,12 @@ void is_convertible_to() {
{ int arr[T(__is_convertible_to(X0<int>, X0<float>))]; }
}
namespace is_convertible_to_instantiate {
// Make sure we don't try to instantiate the constructor.
template<int x> class A { A(int) { int a[x]; } };
int x = __is_convertible_to(int, A<-1>);
}
void is_trivial()
{
{ int arr[T(__is_trivial(int))]; }