[cfe-commits] r113725 - in /cfe/trunk: lib/Sema/SemaOverload.cpp test/SemaCXX/addr-of-overloaded-function.cpp

Douglas Gregor dgregor at apple.com
Sun Sep 12 01:16:09 PDT 2010


Author: dgregor
Date: Sun Sep 12 03:16:09 2010
New Revision: 113725

URL: http://llvm.org/viewvc/llvm-project?rev=113725&view=rev
Log:
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.

Modified:
    cfe/trunk/lib/Sema/SemaOverload.cpp
    cfe/trunk/test/SemaCXX/addr-of-overloaded-function.cpp

Modified: cfe/trunk/lib/Sema/SemaOverload.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaOverload.cpp?rev=113725&r1=113724&r2=113725&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaOverload.cpp (original)
+++ cfe/trunk/lib/Sema/SemaOverload.cpp Sun Sep 12 03:16:09 2010
@@ -6430,7 +6430,9 @@
                                << 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) {

Modified: cfe/trunk/test/SemaCXX/addr-of-overloaded-function.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/addr-of-overloaded-function.cpp?rev=113725&r1=113724&r2=113725&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/addr-of-overloaded-function.cpp (original)
+++ cfe/trunk/test/SemaCXX/addr-of-overloaded-function.cpp Sun Sep 12 03:16:09 2010
@@ -96,3 +96,11 @@
     static bool g(int, char);
   };
 }
+
+namespace PR8033 {
+  template <typename T1, typename T2> int f(T1 *, const T2 *); // expected-note{{candidate function [with T1 = const int, T2 = int]}}
+  template <typename T1, typename T2> 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}}
+
+}





More information about the cfe-commits mailing list