Index: clang-tools-extra/unittests/clangd/XRefsTests.cpp =================================================================== --- clang-tools-extra/unittests/clangd/XRefsTests.cpp +++ clang-tools-extra/unittests/clangd/XRefsTests.cpp @@ -416,6 +416,13 @@ auto x = m^akeX(); } )cpp", + + R"cpp(// Broken code: one overload, but not valid. + int $decl[[foo]](int); + void bar() { + ^foo(42, 43); + } + )cpp", }; for (const char *Test : Tests) { Annotations T(Test); Index: clang/lib/Sema/SemaOverload.cpp =================================================================== --- clang/lib/Sema/SemaOverload.cpp +++ clang/lib/Sema/SemaOverload.cpp @@ -12095,9 +12095,22 @@ } } + CallExpr *FakeCE = nullptr; + if (AllowTypoCorrection && CandidateSet->size() == 1) { + auto& Candidate = *CandidateSet->begin(); + Fn = SemaRef.FixOverloadedFunctionReference(Fn, Candidate.FoundDecl, + Candidate.Function); + FakeCE = + CallExpr::Create(SemaRef.getASTContext(), Fn, Args, + Candidate.Function->getReturnType(), VK_RValue, + RParenLoc, 0, Candidate.IsADLCandidate); + } + SemaRef.Diag(Fn->getBeginLoc(), diag::err_ovl_no_viable_function_in_call) << ULE->getName() << Fn->getSourceRange(); CandidateSet->NoteCandidates(SemaRef, OCD_AllCandidates, Args); + if (FakeCE) + return FakeCE; break; }