From 6010da024cec6cf301c2b41a4bff10c70f7643bf Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Mon, 14 Sep 2009 23:02:14 +0000 Subject: [PATCH] Implement partial ordering of function templates when calling a conversion function. llvm-svn: 81807 --- clang/lib/Sema/SemaOverload.cpp | 3 ++- clang/test/SemaTemplate/temp_func_order.cpp | 11 ++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index ce004b8d05df..6c23a844bff8 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/lib/Sema/SemaOverload.cpp @@ -3711,7 +3711,8 @@ Sema::isBetterOverloadCandidate(const OverloadCandidate& Cand1, if (FunctionTemplateDecl *BetterTemplate = getMoreSpecializedTemplate(Cand1.Function->getPrimaryTemplate(), Cand2.Function->getPrimaryTemplate(), - TPOC_Call)) + isa(Cand1.Function)? TPOC_Conversion + : TPOC_Call)) return BetterTemplate == Cand1.Function->getPrimaryTemplate(); // -- the context is an initialization by user-defined conversion diff --git a/clang/test/SemaTemplate/temp_func_order.cpp b/clang/test/SemaTemplate/temp_func_order.cpp index e87038d9222d..5fd7c8d74571 100644 --- a/clang/test/SemaTemplate/temp_func_order.cpp +++ b/clang/test/SemaTemplate/temp_func_order.cpp @@ -1,5 +1,4 @@ // RUN: clang-cc -fsyntax-only -verify %s - template int &f0(T); @@ -84,3 +83,13 @@ void test_f6(int i, const int ic) { int &ir = f6(i, i); float &fr = f6(ic, ic); } + +struct CrazyFun { + template operator A(); + template operator A(); +}; + +void fun(CrazyFun cf) { + A aif = cf; + A aii = cf; +} -- GitLab