diff options
author | dim <dim@FreeBSD.org> | 2015-01-01 22:44:02 +0000 |
---|---|---|
committer | dim <dim@FreeBSD.org> | 2015-01-01 22:44:02 +0000 |
commit | ec84358430c36286fb136925f352fbd3c16d3602 (patch) | |
tree | ef7f4d74f8c47ef7d0d5fd571153a67b1f52a373 /contrib/llvm/tools/clang/lib/Sema | |
parent | 96234b61c45d23ce5b18de83324a3e43a3ca97ff (diff) | |
download | FreeBSD-src-ec84358430c36286fb136925f352fbd3c16d3602.zip FreeBSD-src-ec84358430c36286fb136925f352fbd3c16d3602.tar.gz |
Pull in r213790 from upstream clang trunk (by Richard Smith):
PR20228: don't retain a pointer to a vector element after the
container has been resized.
This fixes a possible crash when compiling certain parts of libc++'s
type_traits header.
Diffstat (limited to 'contrib/llvm/tools/clang/lib/Sema')
-rw-r--r-- | contrib/llvm/tools/clang/lib/Sema/SemaExprCXX.cpp | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/contrib/llvm/tools/clang/lib/Sema/SemaExprCXX.cpp b/contrib/llvm/tools/clang/lib/Sema/SemaExprCXX.cpp index 0dabdca..425297c 100644 --- a/contrib/llvm/tools/clang/lib/Sema/SemaExprCXX.cpp +++ b/contrib/llvm/tools/clang/lib/Sema/SemaExprCXX.cpp @@ -3642,12 +3642,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); |