aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/Sema/SemaOverload.cpp8
-rw-r--r--test/SemaCXX/user-defined-conversions.cpp2
2 files changed, 6 insertions, 4 deletions
diff --git a/lib/Sema/SemaOverload.cpp b/lib/Sema/SemaOverload.cpp
index 1fa703c775..7219f19a97 100644
--- a/lib/Sema/SemaOverload.cpp
+++ b/lib/Sema/SemaOverload.cpp
@@ -383,7 +383,10 @@ Sema::TryImplicitConversion(Expr* From, QualType ToType,
// called for those cases.
if (CXXConstructorDecl *Constructor
= dyn_cast<CXXConstructorDecl>(ICS.UserDefined.ConversionFunction)) {
- if (Constructor->isCopyConstructor(Context)) {
+ QualType FromCanon
+ = Context.getCanonicalType(From->getType().getUnqualifiedType());
+ QualType ToCanon = Context.getCanonicalType(ToType).getUnqualifiedType();
+ if (FromCanon == ToCanon || IsDerivedFrom(FromCanon, ToCanon)) {
// Turn this into a "standard" conversion sequence, so that it
// gets ranked with standard conversion sequences.
ICS.ConversionKind = ImplicitConversionSequence::StandardConversion;
@@ -391,8 +394,7 @@ Sema::TryImplicitConversion(Expr* From, QualType ToType,
ICS.Standard.FromTypePtr = From->getType().getAsOpaquePtr();
ICS.Standard.ToTypePtr = ToType.getAsOpaquePtr();
ICS.Standard.CopyConstructor = Constructor;
- if (IsDerivedFrom(From->getType().getUnqualifiedType(),
- ToType.getUnqualifiedType()))
+ if (ToCanon != FromCanon)
ICS.Standard.Second = ICK_Derived_To_Base;
}
}
diff --git a/test/SemaCXX/user-defined-conversions.cpp b/test/SemaCXX/user-defined-conversions.cpp
index e4b12fc3f7..c6941b947e 100644
--- a/test/SemaCXX/user-defined-conversions.cpp
+++ b/test/SemaCXX/user-defined-conversions.cpp
@@ -65,5 +65,5 @@ void test_conversion(ConvertibleToBase ctb, ConvertibleToDerived ctd,
Base b2(ctb);
Base b3 = ctd;
Base b4(ctd);
- Base b5 = ctfd; // expected-error{{cannot initialize 'b5' with an lvalue of type 'struct ConvertibleToFunkyDerived'}}
+ Base b5 = ctfd;
}