]> granicus.if.org Git - clang/commitdiff
Do not consider explicit constructors when performing a copy to a
authorDouglas Gregor <dgregor@apple.com>
Sun, 18 Apr 2010 02:16:12 +0000 (02:16 +0000)
committerDouglas Gregor <dgregor@apple.com>
Sun, 18 Apr 2010 02:16:12 +0000 (02:16 +0000)
temporary object. This is blindingly obvious from reading C++
[over.match.ctor]p1, but somehow I'd missed it and it took DR152 to
educate me. Adjust one test that was relying on this non-standard
behavior.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@101688 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaInit.cpp
test/SemaCXX/copy-initialization.cpp

index 4986fcbedf57f31c728820f249f892a35b3f243b..db7c1b396a21644a9a18346a193170d39be3eef9 100644 (file)
@@ -3174,7 +3174,8 @@ static Sema::OwningExprResult CopyObject(Sema &S,
     // Only consider copy constructors.
     CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(*Con);
     if (!Constructor || Constructor->isInvalidDecl() ||
-        !Constructor->isCopyConstructor())
+        !Constructor->isCopyConstructor() ||
+        !Constructor->isConvertingConstructor(/*AllowExplicit=*/false))
       continue;
 
     DeclAccessPair FoundDecl
index ea67e6ffe20fca0c1418c9181f2d39cb1b51b664..0c4aa964cb668f5db22a7c22ec69ae3a544b381d 100644 (file)
@@ -1,18 +1,21 @@
 // RUN: %clang_cc1 -fsyntax-only -verify %s 
 class X {
 public:
-  explicit X(const X&);
-  X(int*); // expected-note 2{{candidate constructor}}
-  explicit X(float*);
+  explicit X(const X&); // expected-note {{candidate constructor}}
+  X(int*); // expected-note 3{{candidate constructor}}
+  explicit X(float*); // expected-note {{candidate constructor}}
 };
 
 class Y : public X { };
 
 void f(Y y, int *ip, float *fp) {
   X x1 = y; // expected-error{{no matching constructor for initialization of 'X'}}
-  X x2 = 0;
-  X x3 = ip;
+  X x2 = 0; // expected-error{{no viable constructor copying variable}}
+  X x3 = ip; // expected-error{{no viable constructor copying variable}}
   X x4 = fp; // expected-error{{no viable conversion}}
+  X x2a(0); // expected-error{{call to constructor of 'X' is ambiguous}}
+  X x3a(ip);
+  X x4a(fp);
 }
 
 struct foo {