From: Douglas Gregor Date: Sun, 12 Sep 2010 08:16:09 +0000 (+0000) Subject: Don't assert when attempting to take the address of an overloaded X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=78c057e5a16b3ba186cc6453ca26b15745f2b79d;p=clang Don't assert when attempting to take the address of an overloaded function fails due to ambiguities in partial ordering of function templates. Fixes PR8033. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@113725 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaOverload.cpp b/lib/Sema/SemaOverload.cpp index cf67f0bdd0..bd971b793a 100644 --- a/lib/Sema/SemaOverload.cpp +++ b/lib/Sema/SemaOverload.cpp @@ -6430,7 +6430,9 @@ Sema::ResolveAddressOfOverloadedFunction(Expr *From, QualType ToType, << Matches[0].second->getDeclName(), PDiag(diag::note_ovl_candidate) << (unsigned) oc_function_template); - assert(Result != MatchesCopy.end() && "no most-specialized template"); + if (Result == MatchesCopy.end()) + return 0; + MarkDeclarationReferenced(From->getLocStart(), *Result); FoundResult = Matches[Result - MatchesCopy.begin()].first; if (Complain) { diff --git a/test/SemaCXX/addr-of-overloaded-function.cpp b/test/SemaCXX/addr-of-overloaded-function.cpp index b581b8a3f6..46bdf8e6b6 100644 --- a/test/SemaCXX/addr-of-overloaded-function.cpp +++ b/test/SemaCXX/addr-of-overloaded-function.cpp @@ -96,3 +96,11 @@ namespace PR7971 { static bool g(int, char); }; } + +namespace PR8033 { + template int f(T1 *, const T2 *); // expected-note{{candidate function [with T1 = const int, T2 = int]}} + template int f(const T1 *, T2 *); // expected-note{{candidate function [with T1 = int, T2 = const int]}} + int (*p)(const int *, const int *) = f; // expected-error{{address of overloaded function 'f' is ambiguous}} \ + // expected-error{{cannot initialize a variable of type}} + +}