Author: rikka Date: Thu Aug 4 19:09:52 2011 New Revision: 136948 URL: http://llvm.org/viewvc/llvm-project?rev=136948&view=rev Log: Have the typo correction in DiagnoseEmptyLookup properly handle template functions when performing function overload resolution.
Modified: cfe/trunk/include/clang/Sema/Sema.h cfe/trunk/lib/Sema/SemaExpr.cpp cfe/trunk/lib/Sema/SemaOverload.cpp cfe/trunk/test/SemaCXX/function-overload-typo-crash.cpp Modified: cfe/trunk/include/clang/Sema/Sema.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=136948&r1=136947&r2=136948&view=diff ============================================================================== --- cfe/trunk/include/clang/Sema/Sema.h (original) +++ cfe/trunk/include/clang/Sema/Sema.h Thu Aug 4 19:09:52 2011 @@ -2265,6 +2265,7 @@ 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, Modified: cfe/trunk/lib/Sema/SemaExpr.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=136948&r1=136947&r2=136948&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaExpr.cpp (original) +++ cfe/trunk/lib/Sema/SemaExpr.cpp Thu Aug 4 19:09:52 2011 @@ -1364,8 +1364,9 @@ /// /// \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 @@ CDEnd = Corrected.end(); CD != CDEnd; ++CD) { if (FunctionDecl *FD = dyn_cast<FunctionDecl>(*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<FunctionTemplateDecl>(*CD)) + AddTemplateOverloadCandidate( + FTD, DeclAccessPair::make(FTD, AS_none), ExplicitTemplateArgs, + Args, NumArgs, OCS); } switch (OCS.BestViableFunction(*this, R.getNameLoc(), Best)) { case OR_Success: Modified: cfe/trunk/lib/Sema/SemaOverload.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaOverload.cpp?rev=136948&r1=136947&r2=136948&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaOverload.cpp (original) +++ cfe/trunk/lib/Sema/SemaOverload.cpp Thu Aug 4 19:09:52 2011 @@ -8221,7 +8221,7 @@ 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"); Modified: cfe/trunk/test/SemaCXX/function-overload-typo-crash.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/function-overload-typo-crash.cpp?rev=136948&r1=136947&r2=136948&view=diff ============================================================================== --- cfe/trunk/test/SemaCXX/function-overload-typo-crash.cpp (original) +++ cfe/trunk/test/SemaCXX/function-overload-typo-crash.cpp Thu Aug 4 19:09:52 2011 @@ -11,20 +11,17 @@ fax(0); //expected-error {{use of undeclared identifier 'fax'; did you mean 'max'}} } -// TODO: Add proper function overloading resolution for template functions -template <typename T> void somefunc(T*, T*); -template <typename T> void somefunc(const T[]); -template <typename T1, typename T2> void somefunc(T1*, T2*); -template <typename T1, typename T2> 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 <typename T> void somefunc(T*, T*); //expected-note {{'somefunc' declared here}} +template <typename T> void somefunc(const T[]); //expected-note {{'somefunc' declared here}} +template <typename T1, typename T2> void somefunc(T1*, T2*); //expected-note {{'somefunc' declared here}} +template <typename T1, typename T2> 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'?}} _______________________________________________ cfe-commits mailing list cfe-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits