r305233 - Revert r303316, a change to ExprConstant to evaluate function arguments.
Nick Lewycky via cfe-commits
cfe-commits at lists.llvm.org
Mon Jun 12 14:15:44 PDT 2017
Author: nicholas
Date: Mon Jun 12 16:15:44 2017
New Revision: 305233
URL: http://llvm.org/viewvc/llvm-project?rev=305233&view=rev
Log:
Revert r303316, a change to ExprConstant to evaluate function arguments.
The patch was itself correct but it uncovered other bugs which are going to be difficult to fix, per PR33140.
Modified:
cfe/trunk/lib/AST/ExprConstant.cpp
cfe/trunk/test/Sema/integer-overflow.c
Modified: cfe/trunk/lib/AST/ExprConstant.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ExprConstant.cpp?rev=305233&r1=305232&r2=305233&view=diff
==============================================================================
--- cfe/trunk/lib/AST/ExprConstant.cpp (original)
+++ cfe/trunk/lib/AST/ExprConstant.cpp Mon Jun 12 16:15:44 2017
@@ -4588,7 +4588,7 @@ public:
}
bool handleCallExpr(const CallExpr *E, APValue &Result,
- const LValue *ResultSlot) {
+ const LValue *ResultSlot) {
const Expr *Callee = E->getCallee()->IgnoreParens();
QualType CalleeType = Callee->getType();
@@ -4597,23 +4597,6 @@ public:
auto Args = llvm::makeArrayRef(E->getArgs(), E->getNumArgs());
bool HasQualifier = false;
- struct EvaluateIgnoredRAII {
- public:
- EvaluateIgnoredRAII(EvalInfo &Info, llvm::ArrayRef<const Expr*> ToEval)
- : Info(Info), ToEval(ToEval) {}
- ~EvaluateIgnoredRAII() {
- if (Info.noteFailure()) {
- for (auto E : ToEval)
- EvaluateIgnoredValue(Info, E);
- }
- }
- void cancel() { ToEval = {}; }
- void drop_front() { ToEval = ToEval.drop_front(); }
- private:
- EvalInfo &Info;
- llvm::ArrayRef<const Expr*> ToEval;
- } EvalArguments(Info, Args);
-
// Extract function decl and 'this' pointer from the callee.
if (CalleeType->isSpecificBuiltinType(BuiltinType::BoundMember)) {
const ValueDecl *Member = nullptr;
@@ -4663,12 +4646,10 @@ public:
if (Args.empty())
return Error(E);
- const Expr *FirstArg = Args[0];
- Args = Args.drop_front();
- EvalArguments.drop_front();
- if (!EvaluateObjectArgument(Info, FirstArg, ThisVal))
+ if (!EvaluateObjectArgument(Info, Args[0], ThisVal))
return false;
This = &ThisVal;
+ Args = Args.slice(1);
} else if (MD && MD->isLambdaStaticInvoker()) {
// Map the static invoker for the lambda back to the call operator.
// Conveniently, we don't have to slice out the 'this' argument (as is
@@ -4720,12 +4701,8 @@ public:
const FunctionDecl *Definition = nullptr;
Stmt *Body = FD->getBody(Definition);
- if (!CheckConstexprFunction(Info, E->getExprLoc(), FD, Definition, Body))
- return false;
-
- EvalArguments.cancel();
-
- if (!HandleFunctionCall(E->getExprLoc(), Definition, This, Args, Body, Info,
+ if (!CheckConstexprFunction(Info, E->getExprLoc(), FD, Definition, Body) ||
+ !HandleFunctionCall(E->getExprLoc(), Definition, This, Args, Body, Info,
Result, ResultSlot))
return false;
Modified: cfe/trunk/test/Sema/integer-overflow.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/integer-overflow.c?rev=305233&r1=305232&r2=305233&view=diff
==============================================================================
--- cfe/trunk/test/Sema/integer-overflow.c (original)
+++ cfe/trunk/test/Sema/integer-overflow.c Mon Jun 12 16:15:44 2017
@@ -151,14 +151,6 @@ uint64_t check_integer_overflows(int i)
uint64_t *b;
uint64_t b2 = b[4608 * 1024 * 1024] + 1;
-// expected-warning at +1 {{overflow in expression; result is 536870912 with type 'int'}}
- f0(4608 * 1024 * 1024);
- f0(4608ul * 1024 * 1024);
-// expected-warning at +1 2{{overflow in expression; result is 536870912 with type 'int'}}
- f1(4608 * 1024 * 1024, 4608 * 1024 * 1024);
-// expected-warning at +1 2{{overflow in expression; result is 536870912 with type 'int'}}
- f2(4608 * 1024 * 1024, 4608 * 1024 * 1024);
-
// expected-warning at +1 2{{overflow in expression; result is 536870912 with type 'int'}}
int j1 = i ? (4608 * 1024 * 1024) : (4608 * 1024 * 1024);
More information about the cfe-commits
mailing list