diff options
-rw-r--r-- | lib/Sema/SemaOverload.cpp | 8 | ||||
-rw-r--r-- | test/SemaCXX/user-defined-conversions.cpp | 2 |
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; } |