Parsing, ASTs, and semantic analysis for the declaration of conversion
functions in C++, e.g.,

  struct X {
    operator bool() const;
  };

Note that these conversions don't actually do anything, since we don't
yet have the ability to use them for implicit or explicit conversions.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@58860 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/AST/DeclCXX.cpp b/lib/AST/DeclCXX.cpp
index b0df75b..b2878b6 100644
--- a/lib/AST/DeclCXX.cpp
+++ b/lib/AST/DeclCXX.cpp
@@ -48,6 +48,11 @@
   if (isDefinition())
     Destructor->Destroy(C);
 
+  for (OverloadedFunctionDecl::function_iterator func 
+         = Conversions.function_begin();
+       func != Conversions.function_end(); ++func)
+    (*func)->Destroy(C);
+
   RecordDecl::Destroy(C);
 }
 
@@ -101,6 +106,11 @@
   Constructors.addOverload(ConDecl);
 }
 
+void CXXRecordDecl::addConversionFunction(ASTContext &Context, 
+                                          CXXConversionDecl *ConvDecl) {
+  Conversions.addOverload(ConvDecl);
+}
+
 CXXMethodDecl *
 CXXMethodDecl::Create(ASTContext &C, CXXRecordDecl *RD,
                       SourceLocation L, IdentifierInfo *Id,
@@ -232,6 +242,14 @@
                                      isImplicitlyDeclared);
 }
 
+CXXConversionDecl *
+CXXConversionDecl::Create(ASTContext &C, CXXRecordDecl *RD,
+                          SourceLocation L, IdentifierInfo *Id,
+                          QualType T, bool isInline, bool isExplicit) {
+  void *Mem = C.getAllocator().Allocate<CXXConversionDecl>();
+  return new (Mem) CXXConversionDecl(RD, L, Id, T, isInline, isExplicit);
+}
+
 CXXClassVarDecl *CXXClassVarDecl::Create(ASTContext &C, CXXRecordDecl *RD,
                                    SourceLocation L, IdentifierInfo *Id,
                                    QualType T, ScopedDecl *PrevDecl) {