[PATCH] D23493: Fix PR28366: Teach the const-expression evaluator to be more fault tolerant with non-const enclosing local variables, or otherwise fold them if const.
Richard Smith via cfe-commits
cfe-commits at lists.llvm.org
Wed Aug 17 15:53:10 PDT 2016
rsmith added inline comments.
================
Comment at: lib/AST/ExprConstant.cpp:4795-4797
@@ +4794,5 @@
+ if (VD->hasLocalStorage() && Info.CurrentCall->Index > 1) {
+ // Only if the DeclContext of VD is the same as the called function do we
+ // set the Frame to the Current CallStackFrame, so that we can find its
+ // associated value from the variable-objects associated with that frame.
+ if (Info.CurrentCall->Callee && isa<FunctionDecl>(VD->getDeclContext()) &&
----------------
This is talking too much about the what and not enough about the why. "We expect to find a value for a local variable in the current frame, unless the variable was actually declared in a lexically-enclosing context." or something like that?
================
Comment at: lib/AST/ExprConstant.cpp:4798-4800
@@ +4797,5 @@
+ // associated value from the variable-objects associated with that frame.
+ if (Info.CurrentCall->Callee && isa<FunctionDecl>(VD->getDeclContext()) &&
+ cast<FunctionDecl>(VD->getDeclContext()->getRedeclContext())
+ ->getFirstDecl() == Info.CurrentCall->Callee->getFirstDecl()) {
+ Frame = Info.CurrentCall;
----------------
This can be specified more simply as:
if (Info.CurrentCall->Callee &&
Info.CurrentCall->Callee->Equals(VD->getDeclContext()))
================
Comment at: lib/Sema/SemaTemplateInstantiateDecl.cpp:190
@@ -189,3 +189,3 @@
if (A->getCond()->isValueDependent() && !Cond->isValueDependent() &&
- !Expr::isPotentialConstantExprUnevaluated(Cond, cast<FunctionDecl>(Tmpl),
+ !Expr::isPotentialConstantExprUnevaluated(Cond, cast<FunctionDecl>(New),
Diags)) {
----------------
Do we have existing test coverage for this (tests that fail with the ExprConstant change if we don't fix this at the same time)?
================
Comment at: test/SemaCXX/constant-expression-cxx11.cpp:2091
@@ +2090,3 @@
+ };
+ constexpr int CD = X::f();
+}
----------------
Maybe also `static_assert` that we get the correct value here?
https://reviews.llvm.org/D23493
More information about the cfe-commits
mailing list