diff options
author | Benjamin Kramer <benny.kra@googlemail.com> | 2012-11-15 15:18:42 +0000 |
---|---|---|
committer | Benjamin Kramer <benny.kra@googlemail.com> | 2012-11-15 15:18:42 +0000 |
commit | 1b48633d308460049e1132960f3c33c850de5bd2 (patch) | |
tree | 87451b5fd991050c65ecfa70946d818f923d699a /lib/Sema/SemaExprCXX.cpp | |
parent | c4a77906c259cba58c147d8468c406a430ecdcbb (diff) |
Do not cache a pointer to ExprEvalContexts.back().
It may become a dangling pointer if the underlying SmallVector reallocates.
Sadly the testcase is really large and doesn't reduce well because of
SmallVector's reallocation patterns.
Fixes PR14336.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@168045 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaExprCXX.cpp')
-rw-r--r-- | lib/Sema/SemaExprCXX.cpp | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/lib/Sema/SemaExprCXX.cpp b/lib/Sema/SemaExprCXX.cpp index c2a5c8f52e..c9d78609b8 100644 --- a/lib/Sema/SemaExprCXX.cpp +++ b/lib/Sema/SemaExprCXX.cpp @@ -4782,8 +4782,7 @@ Stmt *Sema::MaybeCreateStmtWithCleanups(Stmt *SubStmt) { /// are omitted for the 'topmost' call in the decltype expression. If the /// topmost call bound a temporary, strip that temporary off the expression. ExprResult Sema::ActOnDecltypeExpression(Expr *E) { - ExpressionEvaluationContextRecord &Rec = ExprEvalContexts.back(); - assert(Rec.IsDecltype && "not in a decltype expression"); + assert(ExprEvalContexts.back().IsDecltype && "not in a decltype expression"); // C++11 [expr.call]p11: // If a function call is a prvalue of object type, @@ -4824,7 +4823,7 @@ ExprResult Sema::ActOnDecltypeExpression(Expr *E) { E = TopBind->getSubExpr(); // Disable the special decltype handling now. - Rec.IsDecltype = false; + ExprEvalContexts.back().IsDecltype = false; // In MS mode, don't perform any extra checking of call return types within a // decltype expression. @@ -4833,8 +4832,9 @@ ExprResult Sema::ActOnDecltypeExpression(Expr *E) { // Perform the semantic checks we delayed until this point. CallExpr *TopCall = dyn_cast<CallExpr>(E); - for (unsigned I = 0, N = Rec.DelayedDecltypeCalls.size(); I != N; ++I) { - CallExpr *Call = Rec.DelayedDecltypeCalls[I]; + for (unsigned I = 0, N = ExprEvalContexts.back().DelayedDecltypeCalls.size(); + I != N; ++I) { + CallExpr *Call = ExprEvalContexts.back().DelayedDecltypeCalls[I]; if (Call == TopCall) continue; @@ -4846,8 +4846,10 @@ ExprResult Sema::ActOnDecltypeExpression(Expr *E) { // Now all relevant types are complete, check the destructors are accessible // and non-deleted, and annotate them on the temporaries. - for (unsigned I = 0, N = Rec.DelayedDecltypeBinds.size(); I != N; ++I) { - CXXBindTemporaryExpr *Bind = Rec.DelayedDecltypeBinds[I]; + for (unsigned I = 0, N = ExprEvalContexts.back().DelayedDecltypeBinds.size(); + I != N; ++I) { + CXXBindTemporaryExpr *Bind = + ExprEvalContexts.back().DelayedDecltypeBinds[I]; if (Bind == TopBind) continue; |