Place constructors and destructors into the DeclContext of the class,
just like all other members, and remove the special variables in
CXXRecordDecl to store them. This eliminates a lot of special-case
code for constructors and destructors, including
ActOnConstructor/ActOnDeclarator and special lookup rules in
LookupDecl. The result is far more uniform and manageable.

Diagnose the redeclaration of member functions.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@61048 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/SemaOverload.cpp b/lib/Sema/SemaOverload.cpp
index 4bfe0c4..5e3ec3f 100644
--- a/lib/Sema/SemaOverload.cpp
+++ b/lib/Sema/SemaOverload.cpp
@@ -953,11 +953,25 @@
     //   that class. The argument list is the expression-list within
     //   the parentheses of the initializer.
     CXXRecordDecl *ToRecordDecl = ToRecordType->getDecl();
-    const OverloadedFunctionDecl *Constructors = ToRecordDecl->getConstructors();
-    for (OverloadedFunctionDecl::function_const_iterator func 
-           = Constructors->function_begin();
-         func != Constructors->function_end(); ++func) {
-      CXXConstructorDecl *Constructor = cast<CXXConstructorDecl>(*func);
+    DeclarationName ConstructorName 
+      = Context.DeclarationNames.getCXXConstructorName(
+                                             Context.getCanonicalType(ToType));
+    DeclContext::lookup_result Lookup 
+      = ToRecordDecl->lookup(Context, ConstructorName);
+    if (Lookup.first == Lookup.second)
+      /* No constructors. FIXME: Implicit copy constructor? */;
+    else if (OverloadedFunctionDecl *Constructors 
+               = dyn_cast<OverloadedFunctionDecl>(*Lookup.first)) {
+      for (OverloadedFunctionDecl::function_const_iterator func 
+             = Constructors->function_begin();
+           func != Constructors->function_end(); ++func) {
+        CXXConstructorDecl *Constructor = cast<CXXConstructorDecl>(*func);
+        if (Constructor->isConvertingConstructor())
+          AddOverloadCandidate(Constructor, &From, 1, CandidateSet,
+                               /*SuppressUserConversions=*/true);
+      }
+    } else if (CXXConstructorDecl *Constructor 
+                 = dyn_cast<CXXConstructorDecl>(*Lookup.first)) {
       if (Constructor->isConvertingConstructor())
         AddOverloadCandidate(Constructor, &From, 1, CandidateSet,
                              /*SuppressUserConversions=*/true);