diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index d03661229346..10ed15a29037 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -3978,10 +3978,12 @@ Sema::ConvertArgumentsForCall(CallExpr *Call, Expr *Fn, // arguments for the remaining parameters), don't make the call. if (Args.size() < NumArgsInProto) { if (Args.size() < MinArgs) { + MemberExpr *ME = dyn_cast(Fn); TypoCorrection TC; if (FDecl && (TC = TryTypoCorrectionForCall( *this, DeclarationNameInfo(FDecl->getDeclName(), - Fn->getLocStart()), + (ME ? ME->getMemberLoc() + : Fn->getLocStart())), Args))) { unsigned diag_id = MinArgs == NumArgsInProto && !Proto->isVariadic() diff --git a/clang/test/FixIt/typo-location-bugs.cpp b/clang/test/FixIt/typo-location-bugs.cpp new file mode 100644 index 000000000000..9c34a91d49c7 --- /dev/null +++ b/clang/test/FixIt/typo-location-bugs.cpp @@ -0,0 +1,21 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s +// RUN: cp %s %t +// RUN: not %clang_cc1 -fsyntax-only -fixit -x c++ %t +// RUN: %clang_cc1 -fsyntax-only -pedantic -Werror -x c++ %t + +namespace dcl_fct_default_p10 { +struct A { + virtual void f(int a = 7); // expected-note{{'A::f' declared here}} +}; + +struct B : public A { + void f(int a); +}; + +void m() { + B* pb = new B; + A* pa = pb; + pa->f(); // OK, calls pa->B::f(7) + pb->f(); // expected-error{{too few arguments to function call, expected 1, have 0; did you mean 'A::f'?}} +} +}