[cfe-commits] r101089 - in /cfe/trunk: lib/Sema/SemaOverload.cpp lib/Sema/SemaOverload.h test/CXX/over/over.match/over.match.best/over.best.ics/over.ics.user/p3-0x.cpp
Douglas Gregor
dgregor at apple.com
Mon Apr 12 16:42:09 PDT 2010
Author: dgregor
Date: Mon Apr 12 18:42:09 2010
New Revision: 101089
URL: http://llvm.org/viewvc/llvm-project?rev=101089&view=rev
Log:
Implement C++ [over.ics.user]p3, which restricts the final conversion
from a conversion function template specialization to one of exact
match rank. We only know how to test this in C++0x with default
function template arguments, but it's also in the C++03 spec. Fixes
PR6285.
Added:
cfe/trunk/test/CXX/over/over.match/over.match.best/over.best.ics/over.ics.user/p3-0x.cpp
Modified:
cfe/trunk/lib/Sema/SemaOverload.cpp
cfe/trunk/lib/Sema/SemaOverload.h
Modified: cfe/trunk/lib/Sema/SemaOverload.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaOverload.cpp?rev=101089&r1=101088&r2=101089&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaOverload.cpp (original)
+++ cfe/trunk/lib/Sema/SemaOverload.cpp Mon Apr 12 18:42:09 2010
@@ -2819,6 +2819,17 @@
switch (ICS.getKind()) {
case ImplicitConversionSequence::StandardConversion:
Candidate.FinalConversion = ICS.Standard;
+
+ // C++ [over.ics.user]p3:
+ // If the user-defined conversion is specified by a specialization of a
+ // conversion function template, the second standard conversion sequence
+ // shall have exact match rank.
+ if (Conversion->getPrimaryTemplate() &&
+ GetConversionRank(ICS.Standard.Second) != ICR_Exact_Match) {
+ Candidate.Viable = false;
+ Candidate.FailureKind = ovl_fail_final_conversion_not_exact;
+ }
+
break;
case ImplicitConversionSequence::BadConversion:
@@ -4628,6 +4639,7 @@
case ovl_fail_trivial_conversion:
case ovl_fail_bad_final_conversion:
+ case ovl_fail_final_conversion_not_exact:
return S.NoteOverloadCandidate(Fn);
case ovl_fail_bad_conversion: {
Modified: cfe/trunk/lib/Sema/SemaOverload.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaOverload.h?rev=101089&r1=101088&r2=101089&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaOverload.h (original)
+++ cfe/trunk/lib/Sema/SemaOverload.h Mon Apr 12 18:42:09 2010
@@ -440,7 +440,11 @@
/// This conversion candidate is not viable because its result
/// type is not implicitly convertible to the desired type.
- ovl_fail_bad_final_conversion
+ ovl_fail_bad_final_conversion,
+
+ /// This conversion function template specialization candidate is not
+ /// viable because the final conversion was not an exact match.
+ ovl_fail_final_conversion_not_exact
};
/// OverloadCandidate - A single candidate in an overload set (C++ 13.3).
Added: cfe/trunk/test/CXX/over/over.match/over.match.best/over.best.ics/over.ics.user/p3-0x.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/over/over.match/over.match.best/over.best.ics/over.ics.user/p3-0x.cpp?rev=101089&view=auto
==============================================================================
--- cfe/trunk/test/CXX/over/over.match/over.match.best/over.best.ics/over.ics.user/p3-0x.cpp (added)
+++ cfe/trunk/test/CXX/over/over.match/over.match.best/over.best.ics/over.ics.user/p3-0x.cpp Mon Apr 12 18:42:09 2010
@@ -0,0 +1,14 @@
+// RUN: %clang_cc1 -fsyntax-only -std=c++0x -verify %s
+
+namespace PR6285 {
+ template<typename T> struct identity
+ { typedef T type; };
+
+ struct D {
+ template<typename T = short>
+ operator typename identity<T>::type(); // expected-note{{candidate}}
+ };
+
+ int f() { return D(); } // expected-error{{no viable conversion}}
+}
+
More information about the cfe-commits
mailing list