diff options
| author | Richard Smith <richard-llvm@metafoo.co.uk> | 2014-02-18 03:51:47 +0000 |
|---|---|---|
| committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2014-02-18 03:51:47 +0000 |
| commit | 202dc131e7d418c800847198f282b0c60fc5e58f (patch) | |
| tree | c43c41bc37d5fa1507d711e805515178ac9a9540 /clang/lib/Sema/SemaExprCXX.cpp | |
| parent | 742c588edc9e82cc5e31da3faa83d931370e8a09 (diff) | |
| download | bcm5719-llvm-202dc131e7d418c800847198f282b0c60fc5e58f.tar.gz bcm5719-llvm-202dc131e7d418c800847198f282b0c60fc5e58f.zip | |
PR18876: The special-case rule that ignores the destruction of a top-level
temporary in a decltype expression only applies if that temporary was created
by a function call, not by a function-style cast or other flavour of
expression.
llvm-svn: 201542
Diffstat (limited to 'clang/lib/Sema/SemaExprCXX.cpp')
| -rw-r--r-- | clang/lib/Sema/SemaExprCXX.cpp | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index bd01cabd7e4..d364155c918 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -5082,8 +5082,11 @@ ExprResult Sema::ActOnDecltypeExpression(Expr *E) { } CXXBindTemporaryExpr *TopBind = dyn_cast<CXXBindTemporaryExpr>(E); - if (TopBind) - E = TopBind->getSubExpr(); + CallExpr *TopCall = TopBind ? dyn_cast<CallExpr>(TopBind->getSubExpr()) : 0; + if (TopCall) + E = TopCall; + else + TopBind = 0; // Disable the special decltype handling now. ExprEvalContexts.back().IsDecltype = false; @@ -5094,7 +5097,6 @@ ExprResult Sema::ActOnDecltypeExpression(Expr *E) { return Owned(E); // Perform the semantic checks we delayed until this point. - CallExpr *TopCall = dyn_cast<CallExpr>(E); for (unsigned I = 0, N = ExprEvalContexts.back().DelayedDecltypeCalls.size(); I != N; ++I) { CallExpr *Call = ExprEvalContexts.back().DelayedDecltypeCalls[I]; |

