diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2019-09-29 06:22:54 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2019-09-29 06:22:54 +0000 |
commit | 1e8c0850b1f58752c7c0174ed703e8215b2a4d31 (patch) | |
tree | 61fea645ec7785800228fb29b9732bc49440b2c6 /clang/lib/AST/ExprConstant.cpp | |
parent | 4566f87649cc12063c8234e70e34b3a2b393679e (diff) | |
download | bcm5719-llvm-1e8c0850b1f58752c7c0174ed703e8215b2a4d31.tar.gz bcm5719-llvm-1e8c0850b1f58752c7c0174ed703e8215b2a4d31.zip |
For now, disallow lifetime-extended temporaries with non-trivial (but
constexpr) destructors from being used in the values of constexpr
variables.
The standard rules here are unclear at best, so rejecting the
problematic cases seems prudent. Prior to this change, we would fail to
run the destructors for these temporaries, even if they had
side-effects, which is certainly not the right behavior.
llvm-svn: 373161
Diffstat (limited to 'clang/lib/AST/ExprConstant.cpp')
-rw-r--r-- | clang/lib/AST/ExprConstant.cpp | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index b0c0c2e8d98..f91e0782b89 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -1999,10 +1999,18 @@ static bool CheckLValueConstantExpression(EvalInfo &Info, SourceLocation Loc, } else if (const auto *MTE = dyn_cast_or_null<MaterializeTemporaryExpr>( Base.dyn_cast<const Expr *>())) { if (CheckedTemps.insert(MTE).second) { + QualType TempType = getType(Base); + if (TempType.isDestructedType()) { + Info.FFDiag(MTE->getExprLoc(), + diag::note_constexpr_unsupported_tempoarary_nontrivial_dtor) + << TempType; + return false; + } + APValue *V = Info.Ctx.getMaterializedTemporaryValue(MTE, false); assert(V && "evasluation result refers to uninitialised temporary"); if (!CheckEvaluationResult(CheckEvaluationResultKind::ConstantExpression, - Info, MTE->getExprLoc(), getType(Base), *V, + Info, MTE->getExprLoc(), TempType, *V, Usage, SourceLocation(), CheckedTemps)) return false; } |