]> granicus.if.org Git - clang/commitdiff
After reporting ill-formed copy constructor(12.8.p3)
authorFariborz Jahanian <fjahanian@apple.com>
Thu, 6 Aug 2009 17:22:51 +0000 (17:22 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Thu, 6 Aug 2009 17:22:51 +0000 (17:22 +0000)
don't recurs and crash.

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

lib/Sema/SemaOverload.cpp
test/SemaCXX/copy-constructor-error.cpp [new file with mode: 0644]

index c28e052ae64813bf4c7b88510dc677167f6fabf5..0fb515e80d3fc3defce9c4d4e714661179f5d9f9 100644 (file)
@@ -1344,7 +1344,8 @@ bool Sema::IsUserDefinedConversion(Expr *From, QualType ToType,
              = ToRecordDecl->lookup(ConstructorName);
            Con != ConEnd; ++Con) {
         CXXConstructorDecl *Constructor = cast<CXXConstructorDecl>(*Con);
-        if (Constructor->isConvertingConstructor())
+        if (!Constructor->isInvalidDecl() &&
+            Constructor->isConvertingConstructor())
           AddOverloadCandidate(Constructor, &From, 1, CandidateSet,
                                /*SuppressUserConversions=*/true, ForceRValue);
       }
diff --git a/test/SemaCXX/copy-constructor-error.cpp b/test/SemaCXX/copy-constructor-error.cpp
new file mode 100644 (file)
index 0000000..afe741f
--- /dev/null
@@ -0,0 +1,13 @@
+// RUN: clang-cc -fsyntax-only -verify %s 
+
+struct S {     // expected-note {{candidate function}} 
+   S (S);      // expected-error {{copy constructor must pass its first argument by reference}} \\
+                // expected-note {{candidate function}}
+};
+
+S f();
+
+void g() { 
+  S a( f() );  // expected-error {{call to constructor of 'a' is ambiguous}}
+}
+