Fix a crasher than manifests when typo correction suggests a function template.

llvm-svn: 187467
This commit is contained in:
Richard Trieu 2013-07-31 00:48:10 +00:00
parent 7f8042c8f3
commit 2ac682a671
2 changed files with 21 additions and 2 deletions

View File

@ -3932,7 +3932,7 @@ Sema::ConvertArgumentsForCall(CallExpr *Call, Expr *Fn,
<< Fn->getSourceRange() << CorrectedQuotedStr << Fn->getSourceRange() << CorrectedQuotedStr
<< FixItHint::CreateReplacement(TC.getCorrectionRange(), << FixItHint::CreateReplacement(TC.getCorrectionRange(),
CorrectedStr); CorrectedStr);
Diag(TC.getCorrectionDeclAs<FunctionDecl>()->getLocStart(), Diag(TC.getCorrectionDecl()->getLocStart(),
diag::note_previous_decl) << CorrectedQuotedStr; diag::note_previous_decl) << CorrectedQuotedStr;
} else if (MinArgs == 1 && FDecl && FDecl->getParamDecl(0)->getDeclName()) } else if (MinArgs == 1 && FDecl && FDecl->getParamDecl(0)->getDeclName())
Diag(RParenLoc, MinArgs == NumArgsInProto && !Proto->isVariadic() Diag(RParenLoc, MinArgs == NumArgsInProto && !Proto->isVariadic()
@ -3978,7 +3978,7 @@ Sema::ConvertArgumentsForCall(CallExpr *Call, Expr *Fn,
<< Fn->getSourceRange() << CorrectedQuotedStr << Fn->getSourceRange() << CorrectedQuotedStr
<< FixItHint::CreateReplacement(TC.getCorrectionRange(), << FixItHint::CreateReplacement(TC.getCorrectionRange(),
CorrectedStr); CorrectedStr);
Diag(TC.getCorrectionDeclAs<FunctionDecl>()->getLocStart(), Diag(TC.getCorrectionDecl()->getLocStart(),
diag::note_previous_decl) << CorrectedQuotedStr; diag::note_previous_decl) << CorrectedQuotedStr;
} else if (NumArgsInProto == 1 && FDecl && FDecl->getParamDecl(0)->getDeclName()) } else if (NumArgsInProto == 1 && FDecl && FDecl->getParamDecl(0)->getDeclName())
Diag(Args[NumArgsInProto]->getLocStart(), Diag(Args[NumArgsInProto]->getLocStart(),

View File

@ -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'?}} nab(); // expected-error{{too few arguments to function call, expected 1, have 0; did you mean '::PR12287::nab'?}}
} }
} }
namespace TemplateFunction {
template <class T> // expected-note {{'::TemplateFunction::A' declared here}}
void A(T) { }
template <class T> // 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'?}}
}
}