summaryrefslogtreecommitdiffstats
path: root/clang/lib/AST/ExprConstant.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/AST/ExprConstant.cpp')
-rw-r--r--clang/lib/AST/ExprConstant.cpp33
1 files changed, 5 insertions, 28 deletions
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index 17d0ce67dcf..768947d00ac 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -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;
OpenPOWER on IntegriCloud