summaryrefslogtreecommitdiff
path: root/clang/lib/Sema/Sema.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/Sema/Sema.cpp')
-rw-r--r--clang/lib/Sema/Sema.cpp57
1 files changed, 28 insertions, 29 deletions
diff --git a/clang/lib/Sema/Sema.cpp b/clang/lib/Sema/Sema.cpp
index 20b4a9a5d4e6..7b57c8da4e9c 100644
--- a/clang/lib/Sema/Sema.cpp
+++ b/clang/lib/Sema/Sema.cpp
@@ -2554,39 +2554,38 @@ static bool IsCPUDispatchCPUSpecificMultiVersion(const Expr *E) {
bool Sema::tryToRecoverWithCall(ExprResult &E, const PartialDiagnostic &PD,
bool ForceComplain,
bool (*IsPlausibleResult)(QualType)) {
- if (isSFINAEContext()) {
- // If this is a SFINAE context, don't try anything that might trigger ADL
- // prematurely.
- return false;
- }
SourceLocation Loc = E.get()->getExprLoc();
SourceRange Range = E.get()->getSourceRange();
-
- QualType ZeroArgCallTy;
UnresolvedSet<4> Overloads;
- if (tryExprAsCall(*E.get(), ZeroArgCallTy, Overloads) &&
- !ZeroArgCallTy.isNull() &&
- (!IsPlausibleResult || IsPlausibleResult(ZeroArgCallTy))) {
- // At this point, we know E is potentially callable with 0
- // arguments and that it returns something of a reasonable type,
- // so we can emit a fixit and carry on pretending that E was
- // actually a CallExpr.
- SourceLocation ParenInsertionLoc = getLocForEndOfToken(Range.getEnd());
- bool IsMV = IsCPUDispatchCPUSpecificMultiVersion(E.get());
- Diag(Loc, PD) << /*zero-arg*/ 1 << IsMV << Range
- << (IsCallableWithAppend(E.get())
- ? FixItHint::CreateInsertion(ParenInsertionLoc, "()")
- : FixItHint());
- if (!IsMV)
- notePlausibleOverloads(*this, Loc, Overloads, IsPlausibleResult);
-
- // FIXME: Try this before emitting the fixit, and suppress diagnostics
- // while doing so.
- E = BuildCallExpr(nullptr, E.get(), Range.getEnd(), None,
- Range.getEnd().getLocWithOffset(1));
- return true;
- }
+ // If this is a SFINAE context, don't try anything that might trigger ADL
+ // prematurely.
+ if (!isSFINAEContext()) {
+ QualType ZeroArgCallTy;
+ if (tryExprAsCall(*E.get(), ZeroArgCallTy, Overloads) &&
+ !ZeroArgCallTy.isNull() &&
+ (!IsPlausibleResult || IsPlausibleResult(ZeroArgCallTy))) {
+ // At this point, we know E is potentially callable with 0
+ // arguments and that it returns something of a reasonable type,
+ // so we can emit a fixit and carry on pretending that E was
+ // actually a CallExpr.
+ SourceLocation ParenInsertionLoc = getLocForEndOfToken(Range.getEnd());
+ bool IsMV = IsCPUDispatchCPUSpecificMultiVersion(E.get());
+ Diag(Loc, PD) << /*zero-arg*/ 1 << IsMV << Range
+ << (IsCallableWithAppend(E.get())
+ ? FixItHint::CreateInsertion(ParenInsertionLoc,
+ "()")
+ : FixItHint());
+ if (!IsMV)
+ notePlausibleOverloads(*this, Loc, Overloads, IsPlausibleResult);
+
+ // FIXME: Try this before emitting the fixit, and suppress diagnostics
+ // while doing so.
+ E = BuildCallExpr(nullptr, E.get(), Range.getEnd(), None,
+ Range.getEnd().getLocWithOffset(1));
+ return true;
+ }
+ }
if (!ForceComplain) return false;
bool IsMV = IsCPUDispatchCPUSpecificMultiVersion(E.get());