From: Richard Trieu Date: Wed, 31 Jul 2013 00:48:10 +0000 (+0000) Subject: Fix a crasher than manifests when typo correction suggests a function template. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=89310785fe44470da0c1c1eefa54ad9c6dae8e78;p=clang Fix a crasher than manifests when typo correction suggests a function template. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@187467 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index 5b0029a91f..65654b67cf 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -3932,7 +3932,7 @@ Sema::ConvertArgumentsForCall(CallExpr *Call, Expr *Fn, << Fn->getSourceRange() << CorrectedQuotedStr << FixItHint::CreateReplacement(TC.getCorrectionRange(), CorrectedStr); - Diag(TC.getCorrectionDeclAs()->getLocStart(), + Diag(TC.getCorrectionDecl()->getLocStart(), diag::note_previous_decl) << CorrectedQuotedStr; } else if (MinArgs == 1 && FDecl && FDecl->getParamDecl(0)->getDeclName()) Diag(RParenLoc, MinArgs == NumArgsInProto && !Proto->isVariadic() @@ -3978,7 +3978,7 @@ Sema::ConvertArgumentsForCall(CallExpr *Call, Expr *Fn, << Fn->getSourceRange() << CorrectedQuotedStr << FixItHint::CreateReplacement(TC.getCorrectionRange(), CorrectedStr); - Diag(TC.getCorrectionDeclAs()->getLocStart(), + Diag(TC.getCorrectionDecl()->getLocStart(), diag::note_previous_decl) << CorrectedQuotedStr; } else if (NumArgsInProto == 1 && FDecl && FDecl->getParamDecl(0)->getDeclName()) Diag(Args[NumArgsInProto]->getLocStart(), diff --git a/test/SemaCXX/typo-correction-pt2.cpp b/test/SemaCXX/typo-correction-pt2.cpp index ee4971709f..c79a869b5a 100644 --- a/test/SemaCXX/typo-correction-pt2.cpp +++ b/test/SemaCXX/typo-correction-pt2.cpp @@ -14,3 +14,22 @@ void zif::nab(int) { nab(); // expected-error{{too few arguments to function call, expected 1, have 0; did you mean '::PR12287::nab'?}} } } + +namespace TemplateFunction { +template // expected-note {{'::TemplateFunction::A' declared here}} +void A(T) { } + +template // expected-note {{'::TemplateFunction::B' declared here}} +void B(T) { } + +class Foo { + public: + void A(int, int) {} + void B() {} +}; + +void test(Foo F, int num) { + F.A(num); // expected-error {{too few arguments to function call, expected 2, have 1; did you mean '::TemplateFunction::A'?}} + F.B(num); // expected-error {{too many arguments to function call, expected 0, have 1; did you mean '::TemplateFunction::B'?}} +} +}