diff options
| author | Douglas Gregor <dgregor@apple.com> | 2009-12-22 00:21:20 +0000 |
|---|---|---|
| committer | Douglas Gregor <dgregor@apple.com> | 2009-12-22 00:21:20 +0000 |
| commit | 4141d5bea240f3a01a01c94a778c6b4c4e839847 (patch) | |
| tree | abb6a30880c81bbd51ff446ab8660731b47a34cf | |
| parent | ea3e73e596406386de3de20a83071a35f7b0dd5f (diff) | |
| download | bcm5719-llvm-4141d5bea240f3a01a01c94a778c6b4c4e839847.tar.gz bcm5719-llvm-4141d5bea240f3a01a01c94a778c6b4c4e839847.zip | |
When converting from a type to itself or one of its base classes via a
constructor call, the conversion is only a standard conversion
sequence if that constructor is a copy constructor. This fixes PR5834
in a semi-lame way, because the "real" fix will be to move over to
InitializationSequence. That will happen "soonish", but not now.
llvm-svn: 91861
| -rw-r--r-- | clang/lib/Sema/SemaOverload.cpp | 3 | ||||
| -rw-r--r-- | clang/test/CodeGenCXX/PR5834-constructor-conversion.cpp | 14 |
2 files changed, 16 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index fbcb8074289..66aa4845b12 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/lib/Sema/SemaOverload.cpp @@ -451,7 +451,8 @@ Sema::TryImplicitConversion(Expr* From, QualType ToType, QualType FromCanon = Context.getCanonicalType(From->getType().getUnqualifiedType()); QualType ToCanon = Context.getCanonicalType(ToType).getUnqualifiedType(); - if (FromCanon == ToCanon || IsDerivedFrom(FromCanon, ToCanon)) { + if (Constructor->isCopyConstructor(Context) && + (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; diff --git a/clang/test/CodeGenCXX/PR5834-constructor-conversion.cpp b/clang/test/CodeGenCXX/PR5834-constructor-conversion.cpp new file mode 100644 index 00000000000..044d8e555d7 --- /dev/null +++ b/clang/test/CodeGenCXX/PR5834-constructor-conversion.cpp @@ -0,0 +1,14 @@ +// RUN: %clang_cc1 -emit-llvm -o - %s + +// PR5834 +struct ASTMultiMover {}; +struct ASTMultiPtr { + ASTMultiPtr(); + ASTMultiPtr(ASTMultiPtr&); + ASTMultiPtr(ASTMultiMover mover); + operator ASTMultiMover(); +}; +void f1() { + extern void f0(ASTMultiPtr); + f0(ASTMultiPtr()); +} |

