From 6bf6289a8dc78f158929466940b3dc1106d6cc11 Mon Sep 17 00:00:00 2001 From: Richard Smith Date: Wed, 23 Jul 2014 20:07:08 +0000 Subject: [PATCH] PR20228: don't retain a pointer to a vector element after the container has been resized. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@213790 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaExprCXX.cpp | 7 ++++--- test/SemaCXX/type-traits.cpp | 8 ++++++++ 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/lib/Sema/SemaExprCXX.cpp b/lib/Sema/SemaExprCXX.cpp index 7fe5e7a4bf..2745a8cbe3 100644 --- a/lib/Sema/SemaExprCXX.cpp +++ b/lib/Sema/SemaExprCXX.cpp @@ -3651,12 +3651,13 @@ static bool evaluateTypeTrait(Sema &S, TypeTrait Kind, SourceLocation KWLoc, if (T->isObjectType() || T->isFunctionType()) T = S.Context.getRValueReferenceType(T); OpaqueArgExprs.push_back( - OpaqueValueExpr(Args[I]->getTypeLoc().getLocStart(), + OpaqueValueExpr(Args[I]->getTypeLoc().getLocStart(), T.getNonLValueExprType(S.Context), Expr::getValueKindForType(T))); - ArgExprs.push_back(&OpaqueArgExprs.back()); } - + for (Expr &E : OpaqueArgExprs) + ArgExprs.push_back(&E); + // Perform the initialization in an unevaluated context within a SFINAE // trap at translation unit scope. EnterExpressionEvaluationContext Unevaluated(S, Sema::Unevaluated); diff --git a/test/SemaCXX/type-traits.cpp b/test/SemaCXX/type-traits.cpp index 3b94ef0951..4833c14b30 100644 --- a/test/SemaCXX/type-traits.cpp +++ b/test/SemaCXX/type-traits.cpp @@ -146,6 +146,10 @@ struct ThreeArgCtor { ThreeArgCtor(int*, char*, int); }; +struct VariadicCtor { + template VariadicCtor(T...); +}; + void is_pod() { { int arr[T(__is_pod(int))]; } @@ -1968,6 +1972,10 @@ void constructible_checks() { // PR19178 { int arr[F(__is_constructible(Abstract))]; } { int arr[F(__is_nothrow_constructible(Abstract))]; } + + // PR20228 + { int arr[T(__is_constructible(VariadicCtor, + int, int, int, int, int, int, int, int, int))]; } } // Instantiation of __is_trivially_constructible -- 2.40.0