summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/SemaExprCXX.cpp
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2014-02-18 03:51:47 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2014-02-18 03:51:47 +0000
commit202dc131e7d418c800847198f282b0c60fc5e58f (patch)
treec43c41bc37d5fa1507d711e805515178ac9a9540 /clang/lib/Sema/SemaExprCXX.cpp
parent742c588edc9e82cc5e31da3faa83d931370e8a09 (diff)
downloadbcm5719-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.cpp8
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];
OpenPOWER on IntegriCloud