From: Kaelyn Uhrain Date: Fri, 5 Aug 2011 00:09:52 +0000 (+0000) Subject: Have the typo correction in DiagnoseEmptyLookup properly handle template X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ace5e76e5c707f4a8447abc01ef540fa6d57ff95;p=clang Have the typo correction in DiagnoseEmptyLookup properly handle template functions when performing function overload resolution. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@136948 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Sema/Sema.h b/include/clang/Sema/Sema.h index cccff294e5..c08df35dbb 100644 --- a/include/clang/Sema/Sema.h +++ b/include/clang/Sema/Sema.h @@ -2265,6 +2265,7 @@ public: bool DiagnoseEmptyLookup(Scope *S, CXXScopeSpec &SS, LookupResult &R, CorrectTypoContext CTC = CTC_Unknown, + TemplateArgumentListInfo *ExplicitTemplateArgs = 0, Expr **Args = 0, unsigned NumArgs = 0); ExprResult LookupInObjCMethod(LookupResult &R, Scope *S, IdentifierInfo *II, diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index ffa092aad1..bc7d0bdfe5 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -1364,8 +1364,9 @@ Sema::DecomposeUnqualifiedId(const UnqualifiedId &Id, /// /// \return false if new lookup candidates were found bool Sema::DiagnoseEmptyLookup(Scope *S, CXXScopeSpec &SS, LookupResult &R, - CorrectTypoContext CTC, Expr **Args, - unsigned NumArgs) { + CorrectTypoContext CTC, + TemplateArgumentListInfo *ExplicitTemplateArgs, + Expr **Args, unsigned NumArgs) { DeclarationName Name = R.getLookupName(); unsigned diagnostic = diag::err_undeclared_var_use; @@ -1458,10 +1459,13 @@ bool Sema::DiagnoseEmptyLookup(Scope *S, CXXScopeSpec &SS, LookupResult &R, CDEnd = Corrected.end(); CD != CDEnd; ++CD) { if (FunctionDecl *FD = dyn_cast(*CD)) - AddOverloadCandidate(FD, DeclAccessPair::make(*CD, AS_none), + AddOverloadCandidate(FD, DeclAccessPair::make(FD, AS_none), Args, NumArgs, OCS); - // TODO: Handle FunctionTemplateDecl and other Decl types that - // support overloading and could be corrected by CorrectTypo. + else if (FunctionTemplateDecl *FTD = + dyn_cast(*CD)) + AddTemplateOverloadCandidate( + FTD, DeclAccessPair::make(FTD, AS_none), ExplicitTemplateArgs, + Args, NumArgs, OCS); } switch (OCS.BestViableFunction(*this, R.getNameLoc(), Best)) { case OR_Success: diff --git a/lib/Sema/SemaOverload.cpp b/lib/Sema/SemaOverload.cpp index 712720bf9e..72a43d89e8 100644 --- a/lib/Sema/SemaOverload.cpp +++ b/lib/Sema/SemaOverload.cpp @@ -8221,7 +8221,7 @@ BuildRecoveryCallExpr(Sema &SemaRef, Scope *S, Expr *Fn, ExplicitTemplateArgs, Args, NumArgs) && (!EmptyLookup || SemaRef.DiagnoseEmptyLookup(S, SS, R, Sema::CTC_Expression, - Args, NumArgs))) + ExplicitTemplateArgs, Args, NumArgs))) return ExprError(); assert(!R.empty() && "lookup results empty despite recovery"); diff --git a/test/SemaCXX/function-overload-typo-crash.cpp b/test/SemaCXX/function-overload-typo-crash.cpp index a0f70dfbdb..8c5cec8af3 100644 --- a/test/SemaCXX/function-overload-typo-crash.cpp +++ b/test/SemaCXX/function-overload-typo-crash.cpp @@ -11,20 +11,17 @@ void f() { fax(0); //expected-error {{use of undeclared identifier 'fax'; did you mean 'max'}} } -// TODO: Add proper function overloading resolution for template functions -template void somefunc(T*, T*); -template void somefunc(const T[]); -template void somefunc(T1*, T2*); -template void somefunc(T1*, const T2[]); //expected-note 5 {{'somefunc' declared here}} \ - //expected-note {{candidate function template not viable: requires 2 arguments, but 1 was provided}} TODO this shouldn't happen +template void somefunc(T*, T*); //expected-note {{'somefunc' declared here}} +template void somefunc(const T[]); //expected-note {{'somefunc' declared here}} +template void somefunc(T1*, T2*); //expected-note {{'somefunc' declared here}} +template void somefunc(T1*, const T2[]); //expected-note 2 {{'somefunc' declared here}} void c() { int *i = 0, *j = 0; const int x[] = {1, 2, 3}; long *l = 0; somefun(i, j); //expected-error {{use of undeclared identifier 'somefun'; did you mean 'somefunc'?}} - somefun(x); //expected-error {{use of undeclared identifier 'somefun'; did you mean 'somefunc'?}} \ - //expected-error {{no matching function for call to 'somefunc'}} TODO this shouldn't happen + somefun(x); //expected-error {{use of undeclared identifier 'somefun'; did you mean 'somefunc'?}} somefun(i, l); //expected-error {{use of undeclared identifier 'somefun'; did you mean 'somefunc'?}} somefun(l, x); //expected-error {{use of undeclared identifier 'somefun'; did you mean 'somefunc'?}} somefun(i, x); //expected-error {{use of undeclared identifier 'somefun'; did you mean 'somefunc'?}}