ASTImporter.cpp revision 864c041e118155c2b1ce0ba36942a3da5a4a055e
11b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor//===--- ASTImporter.cpp - Importing ASTs from other Contexts ---*- C++ -*-===//
21b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor//
31b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor//                     The LLVM Compiler Infrastructure
41b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor//
51b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor// This file is distributed under the University of Illinois Open Source
61b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor// License. See LICENSE.TXT for details.
71b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor//
81b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor//===----------------------------------------------------------------------===//
91b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor//
101b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor//  This file defines the ASTImporter class which imports AST nodes from one
111b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor//  context into another context.
121b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor//
131b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor//===----------------------------------------------------------------------===//
141b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor#include "clang/AST/ASTImporter.h"
151b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
161b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor#include "clang/AST/ASTContext.h"
17885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor#include "clang/AST/ASTDiagnostic.h"
1896a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor#include "clang/AST/DeclCXX.h"
191b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor#include "clang/AST/DeclObjC.h"
20089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor#include "clang/AST/DeclVisitor.h"
214800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor#include "clang/AST/StmtVisitor.h"
221b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor#include "clang/AST/TypeVisitor.h"
23885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor#include "clang/Basic/FileManager.h"
24885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor#include "clang/Basic/SourceManager.h"
25885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor#include "llvm/Support/MemoryBuffer.h"
2673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor#include <deque>
271b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
281b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregorusing namespace clang;
291b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
301b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregornamespace {
31089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor  class ASTNodeImporter : public TypeVisitor<ASTNodeImporter, QualType>,
324800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor                          public DeclVisitor<ASTNodeImporter, Decl *>,
334800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor                          public StmtVisitor<ASTNodeImporter, Stmt *> {
341b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    ASTImporter &Importer;
351b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
361b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  public:
371b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    explicit ASTNodeImporter(ASTImporter &Importer) : Importer(Importer) { }
381b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
391b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    using TypeVisitor<ASTNodeImporter, QualType>::Visit;
409bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor    using DeclVisitor<ASTNodeImporter, Decl *>::Visit;
414800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor    using StmtVisitor<ASTNodeImporter, Stmt *>::Visit;
421b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
431b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    // Importing types
44f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall    QualType VisitType(const Type *T);
45f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall    QualType VisitBuiltinType(const BuiltinType *T);
46f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall    QualType VisitComplexType(const ComplexType *T);
47f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall    QualType VisitPointerType(const PointerType *T);
48f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall    QualType VisitBlockPointerType(const BlockPointerType *T);
49f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall    QualType VisitLValueReferenceType(const LValueReferenceType *T);
50f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall    QualType VisitRValueReferenceType(const RValueReferenceType *T);
51f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall    QualType VisitMemberPointerType(const MemberPointerType *T);
52f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall    QualType VisitConstantArrayType(const ConstantArrayType *T);
53f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall    QualType VisitIncompleteArrayType(const IncompleteArrayType *T);
54f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall    QualType VisitVariableArrayType(const VariableArrayType *T);
551b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    // FIXME: DependentSizedArrayType
561b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    // FIXME: DependentSizedExtVectorType
57f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall    QualType VisitVectorType(const VectorType *T);
58f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall    QualType VisitExtVectorType(const ExtVectorType *T);
59f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall    QualType VisitFunctionNoProtoType(const FunctionNoProtoType *T);
60f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall    QualType VisitFunctionProtoType(const FunctionProtoType *T);
611b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    // FIXME: UnresolvedUsingType
62f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall    QualType VisitTypedefType(const TypedefType *T);
63f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall    QualType VisitTypeOfExprType(const TypeOfExprType *T);
641b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    // FIXME: DependentTypeOfExprType
65f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall    QualType VisitTypeOfType(const TypeOfType *T);
66f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall    QualType VisitDecltypeType(const DecltypeType *T);
6734b41d939a1328f484511c6002ba2456db879a29Richard Smith    QualType VisitAutoType(const AutoType *T);
681b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    // FIXME: DependentDecltypeType
69f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall    QualType VisitRecordType(const RecordType *T);
70f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall    QualType VisitEnumType(const EnumType *T);
711b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    // FIXME: TemplateTypeParmType
721b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    // FIXME: SubstTemplateTypeParmType
73f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall    QualType VisitTemplateSpecializationType(const TemplateSpecializationType *T);
74f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall    QualType VisitElaboratedType(const ElaboratedType *T);
754714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor    // FIXME: DependentNameType
7633500955d731c73717af52088b7fc0e7a85681e7John McCall    // FIXME: DependentTemplateSpecializationType
77f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall    QualType VisitObjCInterfaceType(const ObjCInterfaceType *T);
78f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall    QualType VisitObjCObjectType(const ObjCObjectType *T);
79f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall    QualType VisitObjCObjectPointerType(const ObjCObjectPointerType *T);
80089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor
81089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor    // Importing declarations
82a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor    bool ImportDeclParts(NamedDecl *D, DeclContext *&DC,
83a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor                         DeclContext *&LexicalDC, DeclarationName &Name,
84788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor                         SourceLocation &Loc);
852577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    void ImportDeclarationNameLoc(const DeclarationNameInfo &From,
862577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                  DeclarationNameInfo& To);
87d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor    void ImportDeclContext(DeclContext *FromDC, bool ForceImport = false);
88d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    bool ImportDefinition(RecordDecl *From, RecordDecl *To);
89040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor    TemplateParameterList *ImportTemplateParameterList(
90040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor                                                 TemplateParameterList *Params);
91d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    TemplateArgument ImportTemplateArgument(const TemplateArgument &From);
92d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    bool ImportTemplateArguments(const TemplateArgument *FromArgs,
93d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor                                 unsigned NumFromArgs,
94d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor                               llvm::SmallVectorImpl<TemplateArgument> &ToArgs);
9596a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor    bool IsStructuralMatch(RecordDecl *FromRecord, RecordDecl *ToRecord);
9673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    bool IsStructuralMatch(EnumDecl *FromEnum, EnumDecl *ToRecord);
97040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor    bool IsStructuralMatch(ClassTemplateDecl *From, ClassTemplateDecl *To);
9889cc9d6e2aaf794fbd2c228a3755c19062ca0ba0Douglas Gregor    Decl *VisitDecl(Decl *D);
99788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor    Decl *VisitNamespaceDecl(NamespaceDecl *D);
100162e1c1b487352434552147967c3dd296ebee2f7Richard Smith    Decl *VisitTypedefNameDecl(TypedefNameDecl *D, bool IsAlias);
1019e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor    Decl *VisitTypedefDecl(TypedefDecl *D);
102162e1c1b487352434552147967c3dd296ebee2f7Richard Smith    Decl *VisitTypeAliasDecl(TypeAliasDecl *D);
10336ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor    Decl *VisitEnumDecl(EnumDecl *D);
10496a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor    Decl *VisitRecordDecl(RecordDecl *D);
10536ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor    Decl *VisitEnumConstantDecl(EnumConstantDecl *D);
106a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor    Decl *VisitFunctionDecl(FunctionDecl *D);
107c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor    Decl *VisitCXXMethodDecl(CXXMethodDecl *D);
108c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor    Decl *VisitCXXConstructorDecl(CXXConstructorDecl *D);
109c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor    Decl *VisitCXXDestructorDecl(CXXDestructorDecl *D);
110c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor    Decl *VisitCXXConversionDecl(CXXConversionDecl *D);
11196a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor    Decl *VisitFieldDecl(FieldDecl *D);
11287c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet    Decl *VisitIndirectFieldDecl(IndirectFieldDecl *D);
1132e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor    Decl *VisitObjCIvarDecl(ObjCIvarDecl *D);
114089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor    Decl *VisitVarDecl(VarDecl *D);
1152cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor    Decl *VisitImplicitParamDecl(ImplicitParamDecl *D);
116a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor    Decl *VisitParmVarDecl(ParmVarDecl *D);
117c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor    Decl *VisitObjCMethodDecl(ObjCMethodDecl *D);
118b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor    Decl *VisitObjCCategoryDecl(ObjCCategoryDecl *D);
1192e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor    Decl *VisitObjCProtocolDecl(ObjCProtocolDecl *D);
120a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor    Decl *VisitObjCInterfaceDecl(ObjCInterfaceDecl *D);
1213daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor    Decl *VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D);
122dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor    Decl *VisitObjCImplementationDecl(ObjCImplementationDecl *D);
123e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor    Decl *VisitObjCPropertyDecl(ObjCPropertyDecl *D);
124954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor    Decl *VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D);
1252b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor    Decl *VisitObjCForwardProtocolDecl(ObjCForwardProtocolDecl *D);
126a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor    Decl *VisitObjCClassDecl(ObjCClassDecl *D);
127040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor    Decl *VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D);
128040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor    Decl *VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D);
129040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor    Decl *VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D);
130040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor    Decl *VisitClassTemplateDecl(ClassTemplateDecl *D);
131d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    Decl *VisitClassTemplateSpecializationDecl(
132d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor                                            ClassTemplateSpecializationDecl *D);
133a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor
1344800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor    // Importing statements
1354800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor    Stmt *VisitStmt(Stmt *S);
1364800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor
1374800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor    // Importing expressions
1384800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor    Expr *VisitExpr(Expr *E);
139440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor    Expr *VisitDeclRefExpr(DeclRefExpr *E);
1404800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor    Expr *VisitIntegerLiteral(IntegerLiteral *E);
141b2e400aae8c62c4e1616016f40618baace0da065Douglas Gregor    Expr *VisitCharacterLiteral(CharacterLiteral *E);
142f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor    Expr *VisitParenExpr(ParenExpr *E);
143f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor    Expr *VisitUnaryOperator(UnaryOperator *E);
144f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne    Expr *VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E);
145f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor    Expr *VisitBinaryOperator(BinaryOperator *E);
146f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor    Expr *VisitCompoundAssignOperator(CompoundAssignOperator *E);
14736ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor    Expr *VisitImplicitCastExpr(ImplicitCastExpr *E);
148008847a70ab122a99911149199855060fb3753b4Douglas Gregor    Expr *VisitCStyleCastExpr(CStyleCastExpr *E);
1491b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  };
1501b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor}
1511b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
1521b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor//----------------------------------------------------------------------------
15373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor// Structural Equivalence
15473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor//----------------------------------------------------------------------------
15573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
15673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregornamespace {
15773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  struct StructuralEquivalenceContext {
15873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    /// \brief AST contexts for which we are checking structural equivalence.
15973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    ASTContext &C1, &C2;
16073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
16173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    /// \brief The set of "tentative" equivalences between two canonical
16273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    /// declarations, mapping from a declaration in the first context to the
16373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    /// declaration in the second context that we believe to be equivalent.
16473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    llvm::DenseMap<Decl *, Decl *> TentativeEquivalences;
16573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
16673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    /// \brief Queue of declarations in the first context whose equivalence
16773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    /// with a declaration in the second context still needs to be verified.
16873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    std::deque<Decl *> DeclsToCheck;
16973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
170ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor    /// \brief Declaration (from, to) pairs that are known not to be equivalent
171ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor    /// (which we have already complained about).
172ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor    llvm::DenseSet<std::pair<Decl *, Decl *> > &NonEquivalentDecls;
173ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor
17473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    /// \brief Whether we're being strict about the spelling of types when
17573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    /// unifying two types.
17673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    bool StrictTypeSpelling;
17773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
17873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    StructuralEquivalenceContext(ASTContext &C1, ASTContext &C2,
179ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor               llvm::DenseSet<std::pair<Decl *, Decl *> > &NonEquivalentDecls,
18073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                 bool StrictTypeSpelling = false)
18133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis      : C1(C1), C2(C2), NonEquivalentDecls(NonEquivalentDecls),
182ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor        StrictTypeSpelling(StrictTypeSpelling) { }
18373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
18473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    /// \brief Determine whether the two declarations are structurally
18573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    /// equivalent.
18673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    bool IsStructurallyEquivalent(Decl *D1, Decl *D2);
18773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
18873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    /// \brief Determine whether the two types are structurally equivalent.
18973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    bool IsStructurallyEquivalent(QualType T1, QualType T2);
19073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
19173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  private:
19273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    /// \brief Finish checking all of the structural equivalences.
19373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    ///
19473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    /// \returns true if an error occurred, false otherwise.
19573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    bool Finish();
19673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
19773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  public:
19873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    DiagnosticBuilder Diag1(SourceLocation Loc, unsigned DiagID) {
19933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis      return C1.getDiagnostics().Report(Loc, DiagID);
20073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    }
20173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
20273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    DiagnosticBuilder Diag2(SourceLocation Loc, unsigned DiagID) {
20333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis      return C2.getDiagnostics().Report(Loc, DiagID);
20473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    }
20573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  };
20673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor}
20773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
20873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
20973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                     QualType T1, QualType T2);
21073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
21173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                     Decl *D1, Decl *D2);
21273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
21373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// \brief Determine if two APInts have the same value, after zero-extending
21473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// one of them (if needed!) to ensure that the bit-widths match.
21573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsSameValue(const llvm::APInt &I1, const llvm::APInt &I2) {
21673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  if (I1.getBitWidth() == I2.getBitWidth())
21773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    return I1 == I2;
21873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
21973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  if (I1.getBitWidth() > I2.getBitWidth())
2209f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad    return I1 == I2.zext(I1.getBitWidth());
22173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
2229f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad  return I1.zext(I2.getBitWidth()) == I2;
22373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor}
22473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
22573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// \brief Determine if two APSInts have the same value, zero- or sign-extending
22673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// as needed.
22773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsSameValue(const llvm::APSInt &I1, const llvm::APSInt &I2) {
22873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  if (I1.getBitWidth() == I2.getBitWidth() && I1.isSigned() == I2.isSigned())
22973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    return I1 == I2;
23073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
23173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  // Check for a bit-width mismatch.
23273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  if (I1.getBitWidth() > I2.getBitWidth())
2339f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad    return IsSameValue(I1, I2.extend(I1.getBitWidth()));
23473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  else if (I2.getBitWidth() > I1.getBitWidth())
2359f71a8f4c7a182a5236da9e747d57cc1d1bd24c2Jay Foad    return IsSameValue(I1.extend(I2.getBitWidth()), I2);
23673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
23773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  // We have a signedness mismatch. Turn the signed value into an unsigned
23873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  // value.
23973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  if (I1.isSigned()) {
24073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (I1.isNegative())
24173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
24273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
24373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    return llvm::APSInt(I1, true) == I2;
24473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  }
24573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
24673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  if (I2.isNegative())
24773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    return false;
24873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
24973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  return I1 == llvm::APSInt(I2, true);
25073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor}
25173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
25273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// \brief Determine structural equivalence of two expressions.
25373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
25473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                     Expr *E1, Expr *E2) {
25573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  if (!E1 || !E2)
25673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    return E1 == E2;
25773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
25873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  // FIXME: Actually perform a structural comparison!
25973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  return true;
26073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor}
26173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
26273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// \brief Determine whether two identifiers are equivalent.
26373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsStructurallyEquivalent(const IdentifierInfo *Name1,
26473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                     const IdentifierInfo *Name2) {
26573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  if (!Name1 || !Name2)
26673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    return Name1 == Name2;
26773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
26873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  return Name1->getName() == Name2->getName();
26973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor}
27073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
27173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// \brief Determine whether two nested-name-specifiers are equivalent.
27273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
27373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                     NestedNameSpecifier *NNS1,
27473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                     NestedNameSpecifier *NNS2) {
27573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  // FIXME: Implement!
27673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  return true;
27773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor}
27873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
27973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// \brief Determine whether two template arguments are equivalent.
28073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
28173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                     const TemplateArgument &Arg1,
28273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                     const TemplateArgument &Arg2) {
283d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  if (Arg1.getKind() != Arg2.getKind())
284d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    return false;
285d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
286d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  switch (Arg1.getKind()) {
287d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  case TemplateArgument::Null:
288d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    return true;
289d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
290d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  case TemplateArgument::Type:
291d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    return Context.IsStructurallyEquivalent(Arg1.getAsType(), Arg2.getAsType());
292d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
293d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  case TemplateArgument::Integral:
294d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    if (!Context.IsStructurallyEquivalent(Arg1.getIntegralType(),
295d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor                                          Arg2.getIntegralType()))
296d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor      return false;
297d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
298d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    return IsSameValue(*Arg1.getAsIntegral(), *Arg2.getAsIntegral());
299d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
300d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  case TemplateArgument::Declaration:
301d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    return Context.IsStructurallyEquivalent(Arg1.getAsDecl(), Arg2.getAsDecl());
302d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
303d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  case TemplateArgument::Template:
304d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    return IsStructurallyEquivalent(Context,
305d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor                                    Arg1.getAsTemplate(),
306d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor                                    Arg2.getAsTemplate());
307a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor
308a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor  case TemplateArgument::TemplateExpansion:
309a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor    return IsStructurallyEquivalent(Context,
310a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor                                    Arg1.getAsTemplateOrTemplatePattern(),
311a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor                                    Arg2.getAsTemplateOrTemplatePattern());
312a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor
313d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  case TemplateArgument::Expression:
314d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    return IsStructurallyEquivalent(Context,
315d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor                                    Arg1.getAsExpr(), Arg2.getAsExpr());
316d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
317d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  case TemplateArgument::Pack:
318d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    if (Arg1.pack_size() != Arg2.pack_size())
319d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor      return false;
320d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
321d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    for (unsigned I = 0, N = Arg1.pack_size(); I != N; ++I)
322d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor      if (!IsStructurallyEquivalent(Context,
323d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor                                    Arg1.pack_begin()[I],
324d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor                                    Arg2.pack_begin()[I]))
325d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor        return false;
326d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
327d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    return true;
328d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  }
329d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
330d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  llvm_unreachable("Invalid template argument kind");
33173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  return true;
33273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor}
33373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
33473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// \brief Determine structural equivalence for the common part of array
33573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// types.
33673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsArrayStructurallyEquivalent(StructuralEquivalenceContext &Context,
33773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                          const ArrayType *Array1,
33873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                          const ArrayType *Array2) {
33973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  if (!IsStructurallyEquivalent(Context,
34073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                Array1->getElementType(),
34173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                Array2->getElementType()))
34273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    return false;
34373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  if (Array1->getSizeModifier() != Array2->getSizeModifier())
34473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    return false;
34573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  if (Array1->getIndexTypeQualifiers() != Array2->getIndexTypeQualifiers())
34673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    return false;
34773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
34873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  return true;
34973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor}
35073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
35173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// \brief Determine structural equivalence of two types.
35273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
35373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                     QualType T1, QualType T2) {
35473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  if (T1.isNull() || T2.isNull())
35573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    return T1.isNull() && T2.isNull();
35673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
35773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  if (!Context.StrictTypeSpelling) {
35873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    // We aren't being strict about token-to-token equivalence of types,
35973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    // so map down to the canonical type.
36073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    T1 = Context.C1.getCanonicalType(T1);
36173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    T2 = Context.C2.getCanonicalType(T2);
36273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  }
36373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
36473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  if (T1.getQualifiers() != T2.getQualifiers())
36573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    return false;
36673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
367ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  Type::TypeClass TC = T1->getTypeClass();
368ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor
369ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  if (T1->getTypeClass() != T2->getTypeClass()) {
370ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor    // Compare function types with prototypes vs. without prototypes as if
371ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor    // both did not have prototypes.
372ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor    if (T1->getTypeClass() == Type::FunctionProto &&
373ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor        T2->getTypeClass() == Type::FunctionNoProto)
374ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor      TC = Type::FunctionNoProto;
375ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor    else if (T1->getTypeClass() == Type::FunctionNoProto &&
376ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor             T2->getTypeClass() == Type::FunctionProto)
377ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor      TC = Type::FunctionNoProto;
378ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor    else
379ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor      return false;
380ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  }
38173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
382ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  switch (TC) {
383ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  case Type::Builtin:
38473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    // FIXME: Deal with Char_S/Char_U.
38573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (cast<BuiltinType>(T1)->getKind() != cast<BuiltinType>(T2)->getKind())
38673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
38773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    break;
38873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
38973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  case Type::Complex:
39073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsStructurallyEquivalent(Context,
39173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  cast<ComplexType>(T1)->getElementType(),
39273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  cast<ComplexType>(T2)->getElementType()))
39373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
39473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    break;
39573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
39673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  case Type::Pointer:
39773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsStructurallyEquivalent(Context,
39873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  cast<PointerType>(T1)->getPointeeType(),
39973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  cast<PointerType>(T2)->getPointeeType()))
40073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
40173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    break;
40273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
40373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  case Type::BlockPointer:
40473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsStructurallyEquivalent(Context,
40573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  cast<BlockPointerType>(T1)->getPointeeType(),
40673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  cast<BlockPointerType>(T2)->getPointeeType()))
40773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
40873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    break;
40973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
41073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  case Type::LValueReference:
41173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  case Type::RValueReference: {
41273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const ReferenceType *Ref1 = cast<ReferenceType>(T1);
41373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const ReferenceType *Ref2 = cast<ReferenceType>(T2);
41473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (Ref1->isSpelledAsLValue() != Ref2->isSpelledAsLValue())
41573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
41673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (Ref1->isInnerRef() != Ref2->isInnerRef())
41773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
41873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsStructurallyEquivalent(Context,
41973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  Ref1->getPointeeTypeAsWritten(),
42073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  Ref2->getPointeeTypeAsWritten()))
42173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
42273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    break;
42373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  }
42473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
42573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  case Type::MemberPointer: {
42673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const MemberPointerType *MemPtr1 = cast<MemberPointerType>(T1);
42773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const MemberPointerType *MemPtr2 = cast<MemberPointerType>(T2);
42873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsStructurallyEquivalent(Context,
42973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  MemPtr1->getPointeeType(),
43073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  MemPtr2->getPointeeType()))
43173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
43273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsStructurallyEquivalent(Context,
43373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  QualType(MemPtr1->getClass(), 0),
43473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  QualType(MemPtr2->getClass(), 0)))
43573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
43673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    break;
43773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  }
43873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
43973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  case Type::ConstantArray: {
44073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const ConstantArrayType *Array1 = cast<ConstantArrayType>(T1);
44173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const ConstantArrayType *Array2 = cast<ConstantArrayType>(T2);
44273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsSameValue(Array1->getSize(), Array2->getSize()))
44373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
44473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
44573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsArrayStructurallyEquivalent(Context, Array1, Array2))
44673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
44773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    break;
44873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  }
44973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
45073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  case Type::IncompleteArray:
45173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsArrayStructurallyEquivalent(Context,
45273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                       cast<ArrayType>(T1),
45373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                       cast<ArrayType>(T2)))
45473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
45573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    break;
45673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
45773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  case Type::VariableArray: {
45873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const VariableArrayType *Array1 = cast<VariableArrayType>(T1);
45973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const VariableArrayType *Array2 = cast<VariableArrayType>(T2);
46073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsStructurallyEquivalent(Context,
46173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  Array1->getSizeExpr(), Array2->getSizeExpr()))
46273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
46373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
46473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsArrayStructurallyEquivalent(Context, Array1, Array2))
46573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
46673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
46773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    break;
46873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  }
46973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
47073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  case Type::DependentSizedArray: {
47173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const DependentSizedArrayType *Array1 = cast<DependentSizedArrayType>(T1);
47273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const DependentSizedArrayType *Array2 = cast<DependentSizedArrayType>(T2);
47373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsStructurallyEquivalent(Context,
47473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  Array1->getSizeExpr(), Array2->getSizeExpr()))
47573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
47673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
47773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsArrayStructurallyEquivalent(Context, Array1, Array2))
47873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
47973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
48073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    break;
48173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  }
48273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
48373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  case Type::DependentSizedExtVector: {
48473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const DependentSizedExtVectorType *Vec1
48573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      = cast<DependentSizedExtVectorType>(T1);
48673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const DependentSizedExtVectorType *Vec2
48773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      = cast<DependentSizedExtVectorType>(T2);
48873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsStructurallyEquivalent(Context,
48973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  Vec1->getSizeExpr(), Vec2->getSizeExpr()))
49073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
49173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsStructurallyEquivalent(Context,
49273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  Vec1->getElementType(),
49373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  Vec2->getElementType()))
49473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
49573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    break;
49673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  }
49773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
49873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  case Type::Vector:
49973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  case Type::ExtVector: {
50073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const VectorType *Vec1 = cast<VectorType>(T1);
50173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const VectorType *Vec2 = cast<VectorType>(T2);
50273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsStructurallyEquivalent(Context,
50373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  Vec1->getElementType(),
50473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  Vec2->getElementType()))
50573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
50673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (Vec1->getNumElements() != Vec2->getNumElements())
50773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
508e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson    if (Vec1->getVectorKind() != Vec2->getVectorKind())
50973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
5100e12b44081c6395a6d60a05a85a6012f7bb23b16Douglas Gregor    break;
51173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  }
51273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
51373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  case Type::FunctionProto: {
51473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const FunctionProtoType *Proto1 = cast<FunctionProtoType>(T1);
51573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const FunctionProtoType *Proto2 = cast<FunctionProtoType>(T2);
51673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (Proto1->getNumArgs() != Proto2->getNumArgs())
51773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
51873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    for (unsigned I = 0, N = Proto1->getNumArgs(); I != N; ++I) {
51973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      if (!IsStructurallyEquivalent(Context,
52073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                    Proto1->getArgType(I),
52173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                    Proto2->getArgType(I)))
52273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        return false;
52373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    }
52473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (Proto1->isVariadic() != Proto2->isVariadic())
52573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
52660618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl    if (Proto1->getExceptionSpecType() != Proto2->getExceptionSpecType())
52773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
52860618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl    if (Proto1->getExceptionSpecType() == EST_Dynamic) {
52960618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl      if (Proto1->getNumExceptions() != Proto2->getNumExceptions())
53060618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl        return false;
53160618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl      for (unsigned I = 0, N = Proto1->getNumExceptions(); I != N; ++I) {
53260618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl        if (!IsStructurallyEquivalent(Context,
53360618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl                                      Proto1->getExceptionType(I),
53460618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl                                      Proto2->getExceptionType(I)))
53560618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl          return false;
53660618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl      }
53760618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl    } else if (Proto1->getExceptionSpecType() == EST_ComputedNoexcept) {
53873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      if (!IsStructurallyEquivalent(Context,
53960618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl                                    Proto1->getNoexceptExpr(),
54060618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl                                    Proto2->getNoexceptExpr()))
54173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        return false;
54273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    }
54373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (Proto1->getTypeQuals() != Proto2->getTypeQuals())
54473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
54573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
54673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    // Fall through to check the bits common with FunctionNoProtoType.
54773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  }
54873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
54973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  case Type::FunctionNoProto: {
55073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const FunctionType *Function1 = cast<FunctionType>(T1);
55173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const FunctionType *Function2 = cast<FunctionType>(T2);
55273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsStructurallyEquivalent(Context,
55373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  Function1->getResultType(),
55473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  Function2->getResultType()))
55573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
556264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola      if (Function1->getExtInfo() != Function2->getExtInfo())
557264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola        return false;
55873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    break;
55973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  }
56073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
56173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  case Type::UnresolvedUsing:
56273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsStructurallyEquivalent(Context,
56373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  cast<UnresolvedUsingType>(T1)->getDecl(),
56473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  cast<UnresolvedUsingType>(T2)->getDecl()))
56573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
56673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
56773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    break;
5689d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall
5699d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  case Type::Attributed:
5709d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall    if (!IsStructurallyEquivalent(Context,
5719d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall                                  cast<AttributedType>(T1)->getModifiedType(),
5729d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall                                  cast<AttributedType>(T2)->getModifiedType()))
5739d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall      return false;
5749d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall    if (!IsStructurallyEquivalent(Context,
5759d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall                                cast<AttributedType>(T1)->getEquivalentType(),
5769d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall                                cast<AttributedType>(T2)->getEquivalentType()))
5779d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall      return false;
5789d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall    break;
57973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
580075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  case Type::Paren:
581075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara    if (!IsStructurallyEquivalent(Context,
582075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara                                  cast<ParenType>(T1)->getInnerType(),
583075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara                                  cast<ParenType>(T2)->getInnerType()))
584075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara      return false;
585075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara    break;
586075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara
58773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  case Type::Typedef:
58873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsStructurallyEquivalent(Context,
58973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  cast<TypedefType>(T1)->getDecl(),
59073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  cast<TypedefType>(T2)->getDecl()))
59173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
59273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    break;
59373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
59473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  case Type::TypeOfExpr:
59573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsStructurallyEquivalent(Context,
59673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                cast<TypeOfExprType>(T1)->getUnderlyingExpr(),
59773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                cast<TypeOfExprType>(T2)->getUnderlyingExpr()))
59873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
59973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    break;
60073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
60173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  case Type::TypeOf:
60273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsStructurallyEquivalent(Context,
60373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  cast<TypeOfType>(T1)->getUnderlyingType(),
60473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  cast<TypeOfType>(T2)->getUnderlyingType()))
60573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
60673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    break;
60773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
60873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  case Type::Decltype:
60973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsStructurallyEquivalent(Context,
61073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  cast<DecltypeType>(T1)->getUnderlyingExpr(),
61173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  cast<DecltypeType>(T2)->getUnderlyingExpr()))
61273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
61373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    break;
61473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
61534b41d939a1328f484511c6002ba2456db879a29Richard Smith  case Type::Auto:
61634b41d939a1328f484511c6002ba2456db879a29Richard Smith    if (!IsStructurallyEquivalent(Context,
61734b41d939a1328f484511c6002ba2456db879a29Richard Smith                                  cast<AutoType>(T1)->getDeducedType(),
61834b41d939a1328f484511c6002ba2456db879a29Richard Smith                                  cast<AutoType>(T2)->getDeducedType()))
61934b41d939a1328f484511c6002ba2456db879a29Richard Smith      return false;
62034b41d939a1328f484511c6002ba2456db879a29Richard Smith    break;
62134b41d939a1328f484511c6002ba2456db879a29Richard Smith
62273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  case Type::Record:
62373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  case Type::Enum:
62473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsStructurallyEquivalent(Context,
62573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  cast<TagType>(T1)->getDecl(),
62673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  cast<TagType>(T2)->getDecl()))
62773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
62873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    break;
629465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara
63073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  case Type::TemplateTypeParm: {
63173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const TemplateTypeParmType *Parm1 = cast<TemplateTypeParmType>(T1);
63273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const TemplateTypeParmType *Parm2 = cast<TemplateTypeParmType>(T2);
63373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (Parm1->getDepth() != Parm2->getDepth())
63473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
63573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (Parm1->getIndex() != Parm2->getIndex())
63673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
63773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (Parm1->isParameterPack() != Parm2->isParameterPack())
63873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
63973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
64073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    // Names of template type parameters are never significant.
64173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    break;
64273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  }
64373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
64473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  case Type::SubstTemplateTypeParm: {
64573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const SubstTemplateTypeParmType *Subst1
64673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      = cast<SubstTemplateTypeParmType>(T1);
64773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const SubstTemplateTypeParmType *Subst2
64873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      = cast<SubstTemplateTypeParmType>(T2);
64973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsStructurallyEquivalent(Context,
65073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  QualType(Subst1->getReplacedParameter(), 0),
65173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  QualType(Subst2->getReplacedParameter(), 0)))
65273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
65373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsStructurallyEquivalent(Context,
65473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  Subst1->getReplacementType(),
65573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  Subst2->getReplacementType()))
65673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
65773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    break;
65873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  }
65973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
6600bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor  case Type::SubstTemplateTypeParmPack: {
6610bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor    const SubstTemplateTypeParmPackType *Subst1
6620bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor      = cast<SubstTemplateTypeParmPackType>(T1);
6630bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor    const SubstTemplateTypeParmPackType *Subst2
6640bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor      = cast<SubstTemplateTypeParmPackType>(T2);
6650bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor    if (!IsStructurallyEquivalent(Context,
6660bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor                                  QualType(Subst1->getReplacedParameter(), 0),
6670bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor                                  QualType(Subst2->getReplacedParameter(), 0)))
6680bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor      return false;
6690bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor    if (!IsStructurallyEquivalent(Context,
6700bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor                                  Subst1->getArgumentPack(),
6710bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor                                  Subst2->getArgumentPack()))
6720bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor      return false;
6730bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor    break;
6740bc15d92bf98cd01e7904d7fca9895dacc237618Douglas Gregor  }
67573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  case Type::TemplateSpecialization: {
67673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const TemplateSpecializationType *Spec1
67773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      = cast<TemplateSpecializationType>(T1);
67873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const TemplateSpecializationType *Spec2
67973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      = cast<TemplateSpecializationType>(T2);
68073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsStructurallyEquivalent(Context,
68173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  Spec1->getTemplateName(),
68273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  Spec2->getTemplateName()))
68373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
68473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (Spec1->getNumArgs() != Spec2->getNumArgs())
68573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
68673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    for (unsigned I = 0, N = Spec1->getNumArgs(); I != N; ++I) {
68773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      if (!IsStructurallyEquivalent(Context,
68873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                    Spec1->getArg(I), Spec2->getArg(I)))
68973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        return false;
69073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    }
69173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    break;
69273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  }
69373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
694465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  case Type::Elaborated: {
695465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara    const ElaboratedType *Elab1 = cast<ElaboratedType>(T1);
696465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara    const ElaboratedType *Elab2 = cast<ElaboratedType>(T2);
697465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara    // CHECKME: what if a keyword is ETK_None or ETK_typename ?
698465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara    if (Elab1->getKeyword() != Elab2->getKeyword())
699465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara      return false;
70073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsStructurallyEquivalent(Context,
701465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara                                  Elab1->getQualifier(),
702465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara                                  Elab2->getQualifier()))
70373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
70473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsStructurallyEquivalent(Context,
705465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara                                  Elab1->getNamedType(),
706465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara                                  Elab2->getNamedType()))
70773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
70873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    break;
70973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  }
71073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
7113cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  case Type::InjectedClassName: {
7123cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall    const InjectedClassNameType *Inj1 = cast<InjectedClassNameType>(T1);
7133cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall    const InjectedClassNameType *Inj2 = cast<InjectedClassNameType>(T2);
7143cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall    if (!IsStructurallyEquivalent(Context,
71531f17ecbef57b5679c017c375db330546b7b5145John McCall                                  Inj1->getInjectedSpecializationType(),
71631f17ecbef57b5679c017c375db330546b7b5145John McCall                                  Inj2->getInjectedSpecializationType()))
7173cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall      return false;
7183cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall    break;
7193cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  }
7203cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall
7214714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor  case Type::DependentName: {
7224714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor    const DependentNameType *Typename1 = cast<DependentNameType>(T1);
7234714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor    const DependentNameType *Typename2 = cast<DependentNameType>(T2);
72473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsStructurallyEquivalent(Context,
72573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  Typename1->getQualifier(),
72673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  Typename2->getQualifier()))
72773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
72873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsStructurallyEquivalent(Typename1->getIdentifier(),
72973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  Typename2->getIdentifier()))
73073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
73173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
73273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    break;
73373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  }
73473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
73533500955d731c73717af52088b7fc0e7a85681e7John McCall  case Type::DependentTemplateSpecialization: {
73633500955d731c73717af52088b7fc0e7a85681e7John McCall    const DependentTemplateSpecializationType *Spec1 =
73733500955d731c73717af52088b7fc0e7a85681e7John McCall      cast<DependentTemplateSpecializationType>(T1);
73833500955d731c73717af52088b7fc0e7a85681e7John McCall    const DependentTemplateSpecializationType *Spec2 =
73933500955d731c73717af52088b7fc0e7a85681e7John McCall      cast<DependentTemplateSpecializationType>(T2);
74033500955d731c73717af52088b7fc0e7a85681e7John McCall    if (!IsStructurallyEquivalent(Context,
74133500955d731c73717af52088b7fc0e7a85681e7John McCall                                  Spec1->getQualifier(),
74233500955d731c73717af52088b7fc0e7a85681e7John McCall                                  Spec2->getQualifier()))
74333500955d731c73717af52088b7fc0e7a85681e7John McCall      return false;
74433500955d731c73717af52088b7fc0e7a85681e7John McCall    if (!IsStructurallyEquivalent(Spec1->getIdentifier(),
74533500955d731c73717af52088b7fc0e7a85681e7John McCall                                  Spec2->getIdentifier()))
74633500955d731c73717af52088b7fc0e7a85681e7John McCall      return false;
74733500955d731c73717af52088b7fc0e7a85681e7John McCall    if (Spec1->getNumArgs() != Spec2->getNumArgs())
74833500955d731c73717af52088b7fc0e7a85681e7John McCall      return false;
74933500955d731c73717af52088b7fc0e7a85681e7John McCall    for (unsigned I = 0, N = Spec1->getNumArgs(); I != N; ++I) {
75033500955d731c73717af52088b7fc0e7a85681e7John McCall      if (!IsStructurallyEquivalent(Context,
75133500955d731c73717af52088b7fc0e7a85681e7John McCall                                    Spec1->getArg(I), Spec2->getArg(I)))
75233500955d731c73717af52088b7fc0e7a85681e7John McCall        return false;
75333500955d731c73717af52088b7fc0e7a85681e7John McCall    }
75433500955d731c73717af52088b7fc0e7a85681e7John McCall    break;
75533500955d731c73717af52088b7fc0e7a85681e7John McCall  }
7567536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor
7577536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor  case Type::PackExpansion:
7587536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor    if (!IsStructurallyEquivalent(Context,
7597536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor                                  cast<PackExpansionType>(T1)->getPattern(),
7607536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor                                  cast<PackExpansionType>(T2)->getPattern()))
7617536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor      return false;
7627536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor    break;
7637536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor
76473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  case Type::ObjCInterface: {
76573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const ObjCInterfaceType *Iface1 = cast<ObjCInterfaceType>(T1);
76673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const ObjCInterfaceType *Iface2 = cast<ObjCInterfaceType>(T2);
76773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsStructurallyEquivalent(Context,
76873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  Iface1->getDecl(), Iface2->getDecl()))
76973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
770c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    break;
771c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  }
772c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall
773c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  case Type::ObjCObject: {
774c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    const ObjCObjectType *Obj1 = cast<ObjCObjectType>(T1);
775c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    const ObjCObjectType *Obj2 = cast<ObjCObjectType>(T2);
776c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    if (!IsStructurallyEquivalent(Context,
777c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall                                  Obj1->getBaseType(),
778c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall                                  Obj2->getBaseType()))
779c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall      return false;
780c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    if (Obj1->getNumProtocols() != Obj2->getNumProtocols())
78173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
782c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    for (unsigned I = 0, N = Obj1->getNumProtocols(); I != N; ++I) {
78373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      if (!IsStructurallyEquivalent(Context,
784c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall                                    Obj1->getProtocol(I),
785c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall                                    Obj2->getProtocol(I)))
78673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        return false;
78773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    }
78873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    break;
78973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  }
79073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
79173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  case Type::ObjCObjectPointer: {
79273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const ObjCObjectPointerType *Ptr1 = cast<ObjCObjectPointerType>(T1);
79373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const ObjCObjectPointerType *Ptr2 = cast<ObjCObjectPointerType>(T2);
79473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsStructurallyEquivalent(Context,
79573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  Ptr1->getPointeeType(),
79673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  Ptr2->getPointeeType()))
79773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
79873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    break;
79973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  }
80073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
80173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  } // end switch
80273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
80373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  return true;
80473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor}
80573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
80673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// \brief Determine structural equivalence of two records.
80773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
80873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                     RecordDecl *D1, RecordDecl *D2) {
80973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  if (D1->isUnion() != D2->isUnion()) {
81073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
81173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      << Context.C2.getTypeDeclType(D2);
81273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    Context.Diag1(D1->getLocation(), diag::note_odr_tag_kind_here)
81373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      << D1->getDeclName() << (unsigned)D1->getTagKind();
81473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    return false;
81573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  }
81673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
817d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  // If both declarations are class template specializations, we know
818d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  // the ODR applies, so check the template and template arguments.
819d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  ClassTemplateSpecializationDecl *Spec1
820d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    = dyn_cast<ClassTemplateSpecializationDecl>(D1);
821d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  ClassTemplateSpecializationDecl *Spec2
822d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    = dyn_cast<ClassTemplateSpecializationDecl>(D2);
823d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  if (Spec1 && Spec2) {
824d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    // Check that the specialized templates are the same.
825d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    if (!IsStructurallyEquivalent(Context, Spec1->getSpecializedTemplate(),
826d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor                                  Spec2->getSpecializedTemplate()))
827d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor      return false;
828d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
829d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    // Check that the template arguments are the same.
830d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    if (Spec1->getTemplateArgs().size() != Spec2->getTemplateArgs().size())
831d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor      return false;
832d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
833d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    for (unsigned I = 0, N = Spec1->getTemplateArgs().size(); I != N; ++I)
834d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor      if (!IsStructurallyEquivalent(Context,
835d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor                                    Spec1->getTemplateArgs().get(I),
836d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor                                    Spec2->getTemplateArgs().get(I)))
837d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor        return false;
838d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  }
839d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  // If one is a class template specialization and the other is not, these
840fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner  // structures are different.
841d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  else if (Spec1 || Spec2)
842d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    return false;
843d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
844ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  // Compare the definitions of these two records. If either or both are
845ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  // incomplete, we assume that they are equivalent.
846ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  D1 = D1->getDefinition();
847ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  D2 = D2->getDefinition();
848ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  if (!D1 || !D2)
849ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor    return true;
850ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor
85173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  if (CXXRecordDecl *D1CXX = dyn_cast<CXXRecordDecl>(D1)) {
85273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (CXXRecordDecl *D2CXX = dyn_cast<CXXRecordDecl>(D2)) {
85373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      if (D1CXX->getNumBases() != D2CXX->getNumBases()) {
85473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
855040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor          << Context.C2.getTypeDeclType(D2);
85673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        Context.Diag2(D2->getLocation(), diag::note_odr_number_of_bases)
857040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor          << D2CXX->getNumBases();
85873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        Context.Diag1(D1->getLocation(), diag::note_odr_number_of_bases)
859040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor          << D1CXX->getNumBases();
86073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        return false;
86173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      }
86273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
86373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      // Check the base classes.
86473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      for (CXXRecordDecl::base_class_iterator Base1 = D1CXX->bases_begin(),
86573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                           BaseEnd1 = D1CXX->bases_end(),
86673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                                Base2 = D2CXX->bases_begin();
86773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor           Base1 != BaseEnd1;
86873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor           ++Base1, ++Base2) {
86973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        if (!IsStructurallyEquivalent(Context,
87073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                      Base1->getType(), Base2->getType())) {
87173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor          Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
87273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor            << Context.C2.getTypeDeclType(D2);
87373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor          Context.Diag2(Base2->getSourceRange().getBegin(), diag::note_odr_base)
87473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor            << Base2->getType()
87573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor            << Base2->getSourceRange();
87673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor          Context.Diag1(Base1->getSourceRange().getBegin(), diag::note_odr_base)
87773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor            << Base1->getType()
87873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor            << Base1->getSourceRange();
87973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor          return false;
88073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        }
88173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
88273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        // Check virtual vs. non-virtual inheritance mismatch.
88373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        if (Base1->isVirtual() != Base2->isVirtual()) {
88473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor          Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
88573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor            << Context.C2.getTypeDeclType(D2);
88673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor          Context.Diag2(Base2->getSourceRange().getBegin(),
88773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                        diag::note_odr_virtual_base)
88873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor            << Base2->isVirtual() << Base2->getSourceRange();
88973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor          Context.Diag1(Base1->getSourceRange().getBegin(), diag::note_odr_base)
89073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor            << Base1->isVirtual()
89173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor            << Base1->getSourceRange();
89273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor          return false;
89373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        }
89473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      }
89573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    } else if (D1CXX->getNumBases() > 0) {
89673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
89773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        << Context.C2.getTypeDeclType(D2);
89873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      const CXXBaseSpecifier *Base1 = D1CXX->bases_begin();
89973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      Context.Diag1(Base1->getSourceRange().getBegin(), diag::note_odr_base)
90073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        << Base1->getType()
90173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        << Base1->getSourceRange();
90273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      Context.Diag2(D2->getLocation(), diag::note_odr_missing_base);
90373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
90473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    }
90573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  }
90673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
90773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  // Check the fields for consistency.
90873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  CXXRecordDecl::field_iterator Field2 = D2->field_begin(),
90973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                             Field2End = D2->field_end();
91073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  for (CXXRecordDecl::field_iterator Field1 = D1->field_begin(),
91173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  Field1End = D1->field_end();
91273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor       Field1 != Field1End;
91373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor       ++Field1, ++Field2) {
91473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (Field2 == Field2End) {
91573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
91673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        << Context.C2.getTypeDeclType(D2);
91773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      Context.Diag1(Field1->getLocation(), diag::note_odr_field)
91873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        << Field1->getDeclName() << Field1->getType();
91973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      Context.Diag2(D2->getLocation(), diag::note_odr_missing_field);
92073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
92173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    }
92273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
92373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsStructurallyEquivalent(Context,
92473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  Field1->getType(), Field2->getType())) {
92573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
92673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        << Context.C2.getTypeDeclType(D2);
92773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      Context.Diag2(Field2->getLocation(), diag::note_odr_field)
92873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        << Field2->getDeclName() << Field2->getType();
92973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      Context.Diag1(Field1->getLocation(), diag::note_odr_field)
93073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        << Field1->getDeclName() << Field1->getType();
93173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
93273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    }
93373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
93473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (Field1->isBitField() != Field2->isBitField()) {
93573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
93673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        << Context.C2.getTypeDeclType(D2);
93773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      if (Field1->isBitField()) {
93873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        llvm::APSInt Bits;
93973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        Field1->getBitWidth()->isIntegerConstantExpr(Bits, Context.C1);
94073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        Context.Diag1(Field1->getLocation(), diag::note_odr_bit_field)
94173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor          << Field1->getDeclName() << Field1->getType()
94273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor          << Bits.toString(10, false);
94373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        Context.Diag2(Field2->getLocation(), diag::note_odr_not_bit_field)
94473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor          << Field2->getDeclName();
94573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      } else {
94673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        llvm::APSInt Bits;
94773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        Field2->getBitWidth()->isIntegerConstantExpr(Bits, Context.C2);
94873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        Context.Diag2(Field2->getLocation(), diag::note_odr_bit_field)
94973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor          << Field2->getDeclName() << Field2->getType()
95073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor          << Bits.toString(10, false);
95173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        Context.Diag1(Field1->getLocation(),
95273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                          diag::note_odr_not_bit_field)
95373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        << Field1->getDeclName();
95473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      }
95573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
95673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    }
95773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
95873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (Field1->isBitField()) {
95973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      // Make sure that the bit-fields are the same length.
96073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      llvm::APSInt Bits1, Bits2;
96173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      if (!Field1->getBitWidth()->isIntegerConstantExpr(Bits1, Context.C1))
96273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        return false;
96373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      if (!Field2->getBitWidth()->isIntegerConstantExpr(Bits2, Context.C2))
96473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        return false;
96573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
96673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      if (!IsSameValue(Bits1, Bits2)) {
96773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
96873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor          << Context.C2.getTypeDeclType(D2);
96973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        Context.Diag2(Field2->getLocation(), diag::note_odr_bit_field)
97073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor          << Field2->getDeclName() << Field2->getType()
97173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor          << Bits2.toString(10, false);
97273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        Context.Diag1(Field1->getLocation(), diag::note_odr_bit_field)
97373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor          << Field1->getDeclName() << Field1->getType()
97473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor          << Bits1.toString(10, false);
97573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        return false;
97673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      }
97773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    }
97873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  }
97973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
98073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  if (Field2 != Field2End) {
98173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
98273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      << Context.C2.getTypeDeclType(D2);
98373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    Context.Diag2(Field2->getLocation(), diag::note_odr_field)
98473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      << Field2->getDeclName() << Field2->getType();
98573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    Context.Diag1(D1->getLocation(), diag::note_odr_missing_field);
98673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    return false;
98773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  }
98873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
98973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  return true;
99073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor}
99173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
99273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// \brief Determine structural equivalence of two enums.
99373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
99473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                     EnumDecl *D1, EnumDecl *D2) {
99573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  EnumDecl::enumerator_iterator EC2 = D2->enumerator_begin(),
99673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                             EC2End = D2->enumerator_end();
99773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  for (EnumDecl::enumerator_iterator EC1 = D1->enumerator_begin(),
99873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  EC1End = D1->enumerator_end();
99973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor       EC1 != EC1End; ++EC1, ++EC2) {
100073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (EC2 == EC2End) {
100173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
100273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        << Context.C2.getTypeDeclType(D2);
100373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      Context.Diag1(EC1->getLocation(), diag::note_odr_enumerator)
100473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        << EC1->getDeclName()
100573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        << EC1->getInitVal().toString(10);
100673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      Context.Diag2(D2->getLocation(), diag::note_odr_missing_enumerator);
100773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
100873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    }
100973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
101073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    llvm::APSInt Val1 = EC1->getInitVal();
101173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    llvm::APSInt Val2 = EC2->getInitVal();
101273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsSameValue(Val1, Val2) ||
101373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        !IsStructurallyEquivalent(EC1->getIdentifier(), EC2->getIdentifier())) {
101473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
101573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        << Context.C2.getTypeDeclType(D2);
101673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      Context.Diag2(EC2->getLocation(), diag::note_odr_enumerator)
101773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        << EC2->getDeclName()
101873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        << EC2->getInitVal().toString(10);
101973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      Context.Diag1(EC1->getLocation(), diag::note_odr_enumerator)
102073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        << EC1->getDeclName()
102173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        << EC1->getInitVal().toString(10);
102273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
102373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    }
102473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  }
102573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
102673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  if (EC2 != EC2End) {
102773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
102873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      << Context.C2.getTypeDeclType(D2);
102973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    Context.Diag2(EC2->getLocation(), diag::note_odr_enumerator)
103073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      << EC2->getDeclName()
103173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      << EC2->getInitVal().toString(10);
103273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    Context.Diag1(D1->getLocation(), diag::note_odr_missing_enumerator);
103373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    return false;
103473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  }
103573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
103673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  return true;
103773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor}
1038040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor
1039040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
1040040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor                                     TemplateParameterList *Params1,
1041040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor                                     TemplateParameterList *Params2) {
1042040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  if (Params1->size() != Params2->size()) {
1043040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor    Context.Diag2(Params2->getTemplateLoc(),
1044040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor                  diag::err_odr_different_num_template_parameters)
1045040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor      << Params1->size() << Params2->size();
1046040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor    Context.Diag1(Params1->getTemplateLoc(),
1047040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor                  diag::note_odr_template_parameter_list);
1048040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor    return false;
1049040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  }
1050040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor
1051040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  for (unsigned I = 0, N = Params1->size(); I != N; ++I) {
1052040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor    if (Params1->getParam(I)->getKind() != Params2->getParam(I)->getKind()) {
1053040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor      Context.Diag2(Params2->getParam(I)->getLocation(),
1054040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor                    diag::err_odr_different_template_parameter_kind);
1055040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor      Context.Diag1(Params1->getParam(I)->getLocation(),
1056040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor                    diag::note_odr_template_parameter_here);
1057040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor      return false;
1058040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor    }
1059040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor
1060040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor    if (!Context.IsStructurallyEquivalent(Params1->getParam(I),
1061040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor                                          Params2->getParam(I))) {
1062040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor
1063040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor      return false;
1064040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor    }
1065040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  }
1066040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor
1067040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  return true;
1068040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor}
1069040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor
1070040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
1071040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor                                     TemplateTypeParmDecl *D1,
1072040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor                                     TemplateTypeParmDecl *D2) {
1073040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  if (D1->isParameterPack() != D2->isParameterPack()) {
1074040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor    Context.Diag2(D2->getLocation(), diag::err_odr_parameter_pack_non_pack)
1075040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor      << D2->isParameterPack();
1076040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor    Context.Diag1(D1->getLocation(), diag::note_odr_parameter_pack_non_pack)
1077040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor      << D1->isParameterPack();
1078040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor    return false;
1079040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  }
1080040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor
1081040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  return true;
1082040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor}
1083040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor
1084040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
1085040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor                                     NonTypeTemplateParmDecl *D1,
1086040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor                                     NonTypeTemplateParmDecl *D2) {
1087040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  // FIXME: Enable once we have variadic templates.
1088040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor#if 0
1089040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  if (D1->isParameterPack() != D2->isParameterPack()) {
1090040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor    Context.Diag2(D2->getLocation(), diag::err_odr_parameter_pack_non_pack)
1091040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor      << D2->isParameterPack();
1092040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor    Context.Diag1(D1->getLocation(), diag::note_odr_parameter_pack_non_pack)
1093040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor      << D1->isParameterPack();
1094040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor    return false;
1095040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  }
1096040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor#endif
1097040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor
1098040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  // Check types.
1099040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  if (!Context.IsStructurallyEquivalent(D1->getType(), D2->getType())) {
1100040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor    Context.Diag2(D2->getLocation(),
1101040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor                  diag::err_odr_non_type_parameter_type_inconsistent)
1102040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor      << D2->getType() << D1->getType();
1103040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor    Context.Diag1(D1->getLocation(), diag::note_odr_value_here)
1104040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor      << D1->getType();
1105040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor    return false;
1106040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  }
1107040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor
1108040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  return true;
1109040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor}
1110040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor
1111040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
1112040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor                                     TemplateTemplateParmDecl *D1,
1113040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor                                     TemplateTemplateParmDecl *D2) {
1114040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  // FIXME: Enable once we have variadic templates.
1115040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor#if 0
1116040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  if (D1->isParameterPack() != D2->isParameterPack()) {
1117040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor    Context.Diag2(D2->getLocation(), diag::err_odr_parameter_pack_non_pack)
1118040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor    << D2->isParameterPack();
1119040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor    Context.Diag1(D1->getLocation(), diag::note_odr_parameter_pack_non_pack)
1120040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor    << D1->isParameterPack();
1121040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor    return false;
1122040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  }
1123040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor#endif
1124040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor
1125040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  // Check template parameter lists.
1126040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  return IsStructurallyEquivalent(Context, D1->getTemplateParameters(),
1127040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor                                  D2->getTemplateParameters());
1128040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor}
1129040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor
1130040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
1131040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor                                     ClassTemplateDecl *D1,
1132040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor                                     ClassTemplateDecl *D2) {
1133040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  // Check template parameters.
1134040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  if (!IsStructurallyEquivalent(Context,
1135040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor                                D1->getTemplateParameters(),
1136040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor                                D2->getTemplateParameters()))
1137040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor    return false;
113873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
1139040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  // Check the templated declaration.
1140040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  return Context.IsStructurallyEquivalent(D1->getTemplatedDecl(),
1141040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor                                          D2->getTemplatedDecl());
1142040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor}
1143040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor
114473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// \brief Determine structural equivalence of two declarations.
114573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
114673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                     Decl *D1, Decl *D2) {
114773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  // FIXME: Check for known structural equivalences via a callback of some sort.
114873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
1149ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  // Check whether we already know that these two declarations are not
1150ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  // structurally equivalent.
1151ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  if (Context.NonEquivalentDecls.count(std::make_pair(D1->getCanonicalDecl(),
1152ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor                                                      D2->getCanonicalDecl())))
1153ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor    return false;
1154ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor
115573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  // Determine whether we've already produced a tentative equivalence for D1.
115673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  Decl *&EquivToD1 = Context.TentativeEquivalences[D1->getCanonicalDecl()];
115773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  if (EquivToD1)
115873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    return EquivToD1 == D2->getCanonicalDecl();
115973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
116073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  // Produce a tentative equivalence D1 <-> D2, which will be checked later.
116173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  EquivToD1 = D2->getCanonicalDecl();
116273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  Context.DeclsToCheck.push_back(D1->getCanonicalDecl());
116373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  return true;
116473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor}
116573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
116673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorbool StructuralEquivalenceContext::IsStructurallyEquivalent(Decl *D1,
116773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                                            Decl *D2) {
116873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  if (!::IsStructurallyEquivalent(*this, D1, D2))
116973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    return false;
117073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
117173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  return !Finish();
117273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor}
117373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
117473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorbool StructuralEquivalenceContext::IsStructurallyEquivalent(QualType T1,
117573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                                            QualType T2) {
117673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  if (!::IsStructurallyEquivalent(*this, T1, T2))
117773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    return false;
117873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
117973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  return !Finish();
118073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor}
118173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
118273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorbool StructuralEquivalenceContext::Finish() {
118373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  while (!DeclsToCheck.empty()) {
118473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    // Check the next declaration.
118573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    Decl *D1 = DeclsToCheck.front();
118673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    DeclsToCheck.pop_front();
118773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
118873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    Decl *D2 = TentativeEquivalences[D1];
118973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    assert(D2 && "Unrecorded tentative equivalence?");
119073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
1191ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor    bool Equivalent = true;
1192ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor
119373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    // FIXME: Switch on all declaration kinds. For now, we're just going to
119473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    // check the obvious ones.
119573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (RecordDecl *Record1 = dyn_cast<RecordDecl>(D1)) {
119673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      if (RecordDecl *Record2 = dyn_cast<RecordDecl>(D2)) {
119773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        // Check for equivalent structure names.
119873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        IdentifierInfo *Name1 = Record1->getIdentifier();
1199162e1c1b487352434552147967c3dd296ebee2f7Richard Smith        if (!Name1 && Record1->getTypedefNameForAnonDecl())
1200162e1c1b487352434552147967c3dd296ebee2f7Richard Smith          Name1 = Record1->getTypedefNameForAnonDecl()->getIdentifier();
120173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        IdentifierInfo *Name2 = Record2->getIdentifier();
1202162e1c1b487352434552147967c3dd296ebee2f7Richard Smith        if (!Name2 && Record2->getTypedefNameForAnonDecl())
1203162e1c1b487352434552147967c3dd296ebee2f7Richard Smith          Name2 = Record2->getTypedefNameForAnonDecl()->getIdentifier();
1204ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor        if (!::IsStructurallyEquivalent(Name1, Name2) ||
1205ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor            !::IsStructurallyEquivalent(*this, Record1, Record2))
1206ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor          Equivalent = false;
120773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      } else {
120873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        // Record/non-record mismatch.
1209ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor        Equivalent = false;
121073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      }
1211ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor    } else if (EnumDecl *Enum1 = dyn_cast<EnumDecl>(D1)) {
121273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      if (EnumDecl *Enum2 = dyn_cast<EnumDecl>(D2)) {
121373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        // Check for equivalent enum names.
121473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        IdentifierInfo *Name1 = Enum1->getIdentifier();
1215162e1c1b487352434552147967c3dd296ebee2f7Richard Smith        if (!Name1 && Enum1->getTypedefNameForAnonDecl())
1216162e1c1b487352434552147967c3dd296ebee2f7Richard Smith          Name1 = Enum1->getTypedefNameForAnonDecl()->getIdentifier();
121773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        IdentifierInfo *Name2 = Enum2->getIdentifier();
1218162e1c1b487352434552147967c3dd296ebee2f7Richard Smith        if (!Name2 && Enum2->getTypedefNameForAnonDecl())
1219162e1c1b487352434552147967c3dd296ebee2f7Richard Smith          Name2 = Enum2->getTypedefNameForAnonDecl()->getIdentifier();
1220ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor        if (!::IsStructurallyEquivalent(Name1, Name2) ||
1221ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor            !::IsStructurallyEquivalent(*this, Enum1, Enum2))
1222ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor          Equivalent = false;
122373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      } else {
122473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        // Enum/non-enum mismatch
1225ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor        Equivalent = false;
122673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      }
1227162e1c1b487352434552147967c3dd296ebee2f7Richard Smith    } else if (TypedefNameDecl *Typedef1 = dyn_cast<TypedefNameDecl>(D1)) {
1228162e1c1b487352434552147967c3dd296ebee2f7Richard Smith      if (TypedefNameDecl *Typedef2 = dyn_cast<TypedefNameDecl>(D2)) {
122973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        if (!::IsStructurallyEquivalent(Typedef1->getIdentifier(),
1230ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor                                        Typedef2->getIdentifier()) ||
1231ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor            !::IsStructurallyEquivalent(*this,
123273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                        Typedef1->getUnderlyingType(),
123373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                        Typedef2->getUnderlyingType()))
1234ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor          Equivalent = false;
123573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      } else {
123673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        // Typedef/non-typedef mismatch.
1237ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor        Equivalent = false;
123873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      }
1239040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor    } else if (ClassTemplateDecl *ClassTemplate1
1240040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor                                           = dyn_cast<ClassTemplateDecl>(D1)) {
1241040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor      if (ClassTemplateDecl *ClassTemplate2 = dyn_cast<ClassTemplateDecl>(D2)) {
1242040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor        if (!::IsStructurallyEquivalent(ClassTemplate1->getIdentifier(),
1243040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor                                        ClassTemplate2->getIdentifier()) ||
1244040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor            !::IsStructurallyEquivalent(*this, ClassTemplate1, ClassTemplate2))
1245040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor          Equivalent = false;
1246040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor      } else {
1247040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor        // Class template/non-class-template mismatch.
1248040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor        Equivalent = false;
1249040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor      }
1250040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor    } else if (TemplateTypeParmDecl *TTP1= dyn_cast<TemplateTypeParmDecl>(D1)) {
1251040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor      if (TemplateTypeParmDecl *TTP2 = dyn_cast<TemplateTypeParmDecl>(D2)) {
1252040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor        if (!::IsStructurallyEquivalent(*this, TTP1, TTP2))
1253040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor          Equivalent = false;
1254040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor      } else {
1255040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor        // Kind mismatch.
1256040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor        Equivalent = false;
1257040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor      }
1258040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor    } else if (NonTypeTemplateParmDecl *NTTP1
1259040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor                                     = dyn_cast<NonTypeTemplateParmDecl>(D1)) {
1260040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor      if (NonTypeTemplateParmDecl *NTTP2
1261040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor                                      = dyn_cast<NonTypeTemplateParmDecl>(D2)) {
1262040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor        if (!::IsStructurallyEquivalent(*this, NTTP1, NTTP2))
1263040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor          Equivalent = false;
1264040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor      } else {
1265040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor        // Kind mismatch.
1266040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor        Equivalent = false;
1267040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor      }
1268040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor    } else if (TemplateTemplateParmDecl *TTP1
1269040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor                                  = dyn_cast<TemplateTemplateParmDecl>(D1)) {
1270040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor      if (TemplateTemplateParmDecl *TTP2
1271040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor                                    = dyn_cast<TemplateTemplateParmDecl>(D2)) {
1272040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor        if (!::IsStructurallyEquivalent(*this, TTP1, TTP2))
1273040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor          Equivalent = false;
1274040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor      } else {
1275040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor        // Kind mismatch.
1276040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor        Equivalent = false;
1277040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor      }
1278040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor    }
1279040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor
1280ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor    if (!Equivalent) {
1281ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor      // Note that these two declarations are not equivalent (and we already
1282ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor      // know about it).
1283ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor      NonEquivalentDecls.insert(std::make_pair(D1->getCanonicalDecl(),
1284ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor                                               D2->getCanonicalDecl()));
1285ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor      return true;
1286ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor    }
128773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    // FIXME: Check other declaration kinds!
128873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  }
128973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
129073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  return false;
129173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor}
129273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
129373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor//----------------------------------------------------------------------------
12941b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor// Import Types
12951b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor//----------------------------------------------------------------------------
12961b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
1297f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitType(const Type *T) {
129889cc9d6e2aaf794fbd2c228a3755c19062ca0ba0Douglas Gregor  Importer.FromDiag(SourceLocation(), diag::err_unsupported_ast_node)
129989cc9d6e2aaf794fbd2c228a3755c19062ca0ba0Douglas Gregor    << T->getTypeClassName();
130089cc9d6e2aaf794fbd2c228a3755c19062ca0ba0Douglas Gregor  return QualType();
130189cc9d6e2aaf794fbd2c228a3755c19062ca0ba0Douglas Gregor}
130289cc9d6e2aaf794fbd2c228a3755c19062ca0ba0Douglas Gregor
1303f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitBuiltinType(const BuiltinType *T) {
13041b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  switch (T->getKind()) {
13051b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case BuiltinType::Void: return Importer.getToContext().VoidTy;
13061b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case BuiltinType::Bool: return Importer.getToContext().BoolTy;
13071b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
13081b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case BuiltinType::Char_U:
13091b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    // The context we're importing from has an unsigned 'char'. If we're
13101b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    // importing into a context with a signed 'char', translate to
13111b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    // 'unsigned char' instead.
13121b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    if (Importer.getToContext().getLangOptions().CharIsSigned)
13131b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor      return Importer.getToContext().UnsignedCharTy;
13141b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
13151b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return Importer.getToContext().CharTy;
13161b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
13171b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case BuiltinType::UChar: return Importer.getToContext().UnsignedCharTy;
13181b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
13191b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case BuiltinType::Char16:
13201b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    // FIXME: Make sure that the "to" context supports C++!
13211b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return Importer.getToContext().Char16Ty;
13221b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
13231b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case BuiltinType::Char32:
13241b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    // FIXME: Make sure that the "to" context supports C++!
13251b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return Importer.getToContext().Char32Ty;
13261b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
13271b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case BuiltinType::UShort: return Importer.getToContext().UnsignedShortTy;
13281b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case BuiltinType::UInt: return Importer.getToContext().UnsignedIntTy;
13291b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case BuiltinType::ULong: return Importer.getToContext().UnsignedLongTy;
13301b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case BuiltinType::ULongLong:
13311b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return Importer.getToContext().UnsignedLongLongTy;
13321b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case BuiltinType::UInt128: return Importer.getToContext().UnsignedInt128Ty;
13331b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
13341b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case BuiltinType::Char_S:
13351b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    // The context we're importing from has an unsigned 'char'. If we're
13361b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    // importing into a context with a signed 'char', translate to
13371b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    // 'unsigned char' instead.
13381b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    if (!Importer.getToContext().getLangOptions().CharIsSigned)
13391b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor      return Importer.getToContext().SignedCharTy;
13401b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
13411b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return Importer.getToContext().CharTy;
13421b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
13431b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case BuiltinType::SChar: return Importer.getToContext().SignedCharTy;
13443f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner  case BuiltinType::WChar_S:
13453f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattner  case BuiltinType::WChar_U:
13461b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    // FIXME: If not in C++, shall we translate to the C equivalent of
13471b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    // wchar_t?
13481b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return Importer.getToContext().WCharTy;
13491b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
13501b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case BuiltinType::Short : return Importer.getToContext().ShortTy;
13511b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case BuiltinType::Int : return Importer.getToContext().IntTy;
13521b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case BuiltinType::Long : return Importer.getToContext().LongTy;
13531b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case BuiltinType::LongLong : return Importer.getToContext().LongLongTy;
13541b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case BuiltinType::Int128 : return Importer.getToContext().Int128Ty;
13551b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case BuiltinType::Float: return Importer.getToContext().FloatTy;
13561b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case BuiltinType::Double: return Importer.getToContext().DoubleTy;
13571b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case BuiltinType::LongDouble: return Importer.getToContext().LongDoubleTy;
13581b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
13591b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case BuiltinType::NullPtr:
13601b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    // FIXME: Make sure that the "to" context supports C++0x!
13611b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return Importer.getToContext().NullPtrTy;
13621b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
13631b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case BuiltinType::Overload: return Importer.getToContext().OverloadTy;
13641b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case BuiltinType::Dependent: return Importer.getToContext().DependentTy;
13651de4d4e8cb2e9c88809fea8092bc6e835a5473d2John McCall  case BuiltinType::UnknownAny: return Importer.getToContext().UnknownAnyTy;
1366864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall  case BuiltinType::BoundMember: return Importer.getToContext().BoundMemberTy;
13671b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
13681b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case BuiltinType::ObjCId:
13691b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    // FIXME: Make sure that the "to" context supports Objective-C!
13701b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return Importer.getToContext().ObjCBuiltinIdTy;
13711b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
13721b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case BuiltinType::ObjCClass:
13731b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return Importer.getToContext().ObjCBuiltinClassTy;
13741b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
13751b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case BuiltinType::ObjCSel:
13761b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return Importer.getToContext().ObjCBuiltinSelTy;
13771b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  }
13781b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
13791b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  return QualType();
13801b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor}
13811b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
1382f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitComplexType(const ComplexType *T) {
13831b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  QualType ToElementType = Importer.Import(T->getElementType());
13841b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  if (ToElementType.isNull())
13851b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return QualType();
13861b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
13871b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  return Importer.getToContext().getComplexType(ToElementType);
13881b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor}
13891b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
1390f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitPointerType(const PointerType *T) {
13911b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  QualType ToPointeeType = Importer.Import(T->getPointeeType());
13921b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  if (ToPointeeType.isNull())
13931b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return QualType();
13941b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
13951b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  return Importer.getToContext().getPointerType(ToPointeeType);
13961b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor}
13971b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
1398f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitBlockPointerType(const BlockPointerType *T) {
13991b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  // FIXME: Check for blocks support in "to" context.
14001b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  QualType ToPointeeType = Importer.Import(T->getPointeeType());
14011b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  if (ToPointeeType.isNull())
14021b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return QualType();
14031b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
14041b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  return Importer.getToContext().getBlockPointerType(ToPointeeType);
14051b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor}
14061b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
1407f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType
1408f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallASTNodeImporter::VisitLValueReferenceType(const LValueReferenceType *T) {
14091b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  // FIXME: Check for C++ support in "to" context.
14101b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  QualType ToPointeeType = Importer.Import(T->getPointeeTypeAsWritten());
14111b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  if (ToPointeeType.isNull())
14121b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return QualType();
14131b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
14141b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  return Importer.getToContext().getLValueReferenceType(ToPointeeType);
14151b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor}
14161b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
1417f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType
1418f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallASTNodeImporter::VisitRValueReferenceType(const RValueReferenceType *T) {
14191b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  // FIXME: Check for C++0x support in "to" context.
14201b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  QualType ToPointeeType = Importer.Import(T->getPointeeTypeAsWritten());
14211b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  if (ToPointeeType.isNull())
14221b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return QualType();
14231b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
14241b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  return Importer.getToContext().getRValueReferenceType(ToPointeeType);
14251b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor}
14261b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
1427f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitMemberPointerType(const MemberPointerType *T) {
14281b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  // FIXME: Check for C++ support in "to" context.
14291b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  QualType ToPointeeType = Importer.Import(T->getPointeeType());
14301b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  if (ToPointeeType.isNull())
14311b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return QualType();
14321b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
14331b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  QualType ClassType = Importer.Import(QualType(T->getClass(), 0));
14341b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  return Importer.getToContext().getMemberPointerType(ToPointeeType,
14351b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor                                                      ClassType.getTypePtr());
14361b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor}
14371b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
1438f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitConstantArrayType(const ConstantArrayType *T) {
14391b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  QualType ToElementType = Importer.Import(T->getElementType());
14401b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  if (ToElementType.isNull())
14411b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return QualType();
14421b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
14431b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  return Importer.getToContext().getConstantArrayType(ToElementType,
14441b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor                                                      T->getSize(),
14451b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor                                                      T->getSizeModifier(),
14461b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor                                               T->getIndexTypeCVRQualifiers());
14471b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor}
14481b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
1449f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType
1450f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallASTNodeImporter::VisitIncompleteArrayType(const IncompleteArrayType *T) {
14511b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  QualType ToElementType = Importer.Import(T->getElementType());
14521b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  if (ToElementType.isNull())
14531b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return QualType();
14541b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
14551b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  return Importer.getToContext().getIncompleteArrayType(ToElementType,
14561b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor                                                        T->getSizeModifier(),
14571b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor                                                T->getIndexTypeCVRQualifiers());
14581b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor}
14591b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
1460f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitVariableArrayType(const VariableArrayType *T) {
14611b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  QualType ToElementType = Importer.Import(T->getElementType());
14621b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  if (ToElementType.isNull())
14631b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return QualType();
14641b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
14651b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  Expr *Size = Importer.Import(T->getSizeExpr());
14661b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  if (!Size)
14671b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return QualType();
14681b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
14691b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  SourceRange Brackets = Importer.Import(T->getBracketsRange());
14701b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  return Importer.getToContext().getVariableArrayType(ToElementType, Size,
14711b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor                                                      T->getSizeModifier(),
14721b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor                                                T->getIndexTypeCVRQualifiers(),
14731b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor                                                      Brackets);
14741b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor}
14751b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
1476f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitVectorType(const VectorType *T) {
14771b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  QualType ToElementType = Importer.Import(T->getElementType());
14781b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  if (ToElementType.isNull())
14791b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return QualType();
14801b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
14811b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  return Importer.getToContext().getVectorType(ToElementType,
14821b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor                                               T->getNumElements(),
1483e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson                                               T->getVectorKind());
14841b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor}
14851b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
1486f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitExtVectorType(const ExtVectorType *T) {
14871b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  QualType ToElementType = Importer.Import(T->getElementType());
14881b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  if (ToElementType.isNull())
14891b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return QualType();
14901b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
14911b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  return Importer.getToContext().getExtVectorType(ToElementType,
14921b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor                                                  T->getNumElements());
14931b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor}
14941b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
1495f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType
1496f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallASTNodeImporter::VisitFunctionNoProtoType(const FunctionNoProtoType *T) {
14971b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  // FIXME: What happens if we're importing a function without a prototype
14981b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  // into C++? Should we make it variadic?
14991b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  QualType ToResultType = Importer.Import(T->getResultType());
15001b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  if (ToResultType.isNull())
15011b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return QualType();
1502264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola
15031b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  return Importer.getToContext().getFunctionNoProtoType(ToResultType,
1504264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola                                                        T->getExtInfo());
15051b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor}
15061b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
1507f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitFunctionProtoType(const FunctionProtoType *T) {
15081b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  QualType ToResultType = Importer.Import(T->getResultType());
15091b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  if (ToResultType.isNull())
15101b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return QualType();
15111b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
15121b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  // Import argument types
15131b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  llvm::SmallVector<QualType, 4> ArgTypes;
15141b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  for (FunctionProtoType::arg_type_iterator A = T->arg_type_begin(),
15151b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor                                         AEnd = T->arg_type_end();
15161b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor       A != AEnd; ++A) {
15171b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    QualType ArgType = Importer.Import(*A);
15181b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    if (ArgType.isNull())
15191b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor      return QualType();
15201b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    ArgTypes.push_back(ArgType);
15211b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  }
15221b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
15231b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  // Import exception types
15241b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  llvm::SmallVector<QualType, 4> ExceptionTypes;
15251b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  for (FunctionProtoType::exception_iterator E = T->exception_begin(),
15261b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor                                          EEnd = T->exception_end();
15271b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor       E != EEnd; ++E) {
15281b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    QualType ExceptionType = Importer.Import(*E);
15291b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    if (ExceptionType.isNull())
15301b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor      return QualType();
15311b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    ExceptionTypes.push_back(ExceptionType);
15321b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  }
1533e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall
1534e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall  FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo();
1535e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall  EPI.Exceptions = ExceptionTypes.data();
15361b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
15371b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  return Importer.getToContext().getFunctionType(ToResultType, ArgTypes.data(),
1538e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall                                                 ArgTypes.size(), EPI);
15391b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor}
15401b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
1541f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitTypedefType(const TypedefType *T) {
1542162e1c1b487352434552147967c3dd296ebee2f7Richard Smith  TypedefNameDecl *ToDecl
1543162e1c1b487352434552147967c3dd296ebee2f7Richard Smith             = dyn_cast_or_null<TypedefNameDecl>(Importer.Import(T->getDecl()));
15441b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  if (!ToDecl)
15451b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return QualType();
15461b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
15471b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  return Importer.getToContext().getTypeDeclType(ToDecl);
15481b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor}
15491b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
1550f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitTypeOfExprType(const TypeOfExprType *T) {
15511b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  Expr *ToExpr = Importer.Import(T->getUnderlyingExpr());
15521b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  if (!ToExpr)
15531b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return QualType();
15541b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
15551b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  return Importer.getToContext().getTypeOfExprType(ToExpr);
15561b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor}
15571b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
1558f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitTypeOfType(const TypeOfType *T) {
15591b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  QualType ToUnderlyingType = Importer.Import(T->getUnderlyingType());
15601b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  if (ToUnderlyingType.isNull())
15611b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return QualType();
15621b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
15631b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  return Importer.getToContext().getTypeOfType(ToUnderlyingType);
15641b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor}
15651b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
1566f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitDecltypeType(const DecltypeType *T) {
156734b41d939a1328f484511c6002ba2456db879a29Richard Smith  // FIXME: Make sure that the "to" context supports C++0x!
15681b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  Expr *ToExpr = Importer.Import(T->getUnderlyingExpr());
15691b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  if (!ToExpr)
15701b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return QualType();
15711b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
15721b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  return Importer.getToContext().getDecltypeType(ToExpr);
15731b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor}
15741b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
157534b41d939a1328f484511c6002ba2456db879a29Richard SmithQualType ASTNodeImporter::VisitAutoType(const AutoType *T) {
157634b41d939a1328f484511c6002ba2456db879a29Richard Smith  // FIXME: Make sure that the "to" context supports C++0x!
157734b41d939a1328f484511c6002ba2456db879a29Richard Smith  QualType FromDeduced = T->getDeducedType();
157834b41d939a1328f484511c6002ba2456db879a29Richard Smith  QualType ToDeduced;
157934b41d939a1328f484511c6002ba2456db879a29Richard Smith  if (!FromDeduced.isNull()) {
158034b41d939a1328f484511c6002ba2456db879a29Richard Smith    ToDeduced = Importer.Import(FromDeduced);
158134b41d939a1328f484511c6002ba2456db879a29Richard Smith    if (ToDeduced.isNull())
158234b41d939a1328f484511c6002ba2456db879a29Richard Smith      return QualType();
158334b41d939a1328f484511c6002ba2456db879a29Richard Smith  }
158434b41d939a1328f484511c6002ba2456db879a29Richard Smith
158534b41d939a1328f484511c6002ba2456db879a29Richard Smith  return Importer.getToContext().getAutoType(ToDeduced);
158634b41d939a1328f484511c6002ba2456db879a29Richard Smith}
158734b41d939a1328f484511c6002ba2456db879a29Richard Smith
1588f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitRecordType(const RecordType *T) {
15891b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  RecordDecl *ToDecl
15901b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    = dyn_cast_or_null<RecordDecl>(Importer.Import(T->getDecl()));
15911b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  if (!ToDecl)
15921b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return QualType();
15931b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
15941b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  return Importer.getToContext().getTagDeclType(ToDecl);
15951b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor}
15961b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
1597f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitEnumType(const EnumType *T) {
15981b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  EnumDecl *ToDecl
15991b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    = dyn_cast_or_null<EnumDecl>(Importer.Import(T->getDecl()));
16001b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  if (!ToDecl)
16011b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return QualType();
16021b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
16031b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  return Importer.getToContext().getTagDeclType(ToDecl);
16041b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor}
16051b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
1606d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas GregorQualType ASTNodeImporter::VisitTemplateSpecializationType(
1607f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall                                       const TemplateSpecializationType *T) {
1608d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  TemplateName ToTemplate = Importer.Import(T->getTemplateName());
1609d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  if (ToTemplate.isNull())
1610d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    return QualType();
1611d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
1612d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  llvm::SmallVector<TemplateArgument, 2> ToTemplateArgs;
1613d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  if (ImportTemplateArguments(T->getArgs(), T->getNumArgs(), ToTemplateArgs))
1614d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    return QualType();
1615d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
1616d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  QualType ToCanonType;
1617d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  if (!QualType(T, 0).isCanonical()) {
1618d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    QualType FromCanonType
1619d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor      = Importer.getFromContext().getCanonicalType(QualType(T, 0));
1620d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    ToCanonType =Importer.Import(FromCanonType);
1621d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    if (ToCanonType.isNull())
1622d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor      return QualType();
1623d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  }
1624d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  return Importer.getToContext().getTemplateSpecializationType(ToTemplate,
1625d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor                                                         ToTemplateArgs.data(),
1626d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor                                                         ToTemplateArgs.size(),
1627d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor                                                               ToCanonType);
1628d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor}
1629d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
1630f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitElaboratedType(const ElaboratedType *T) {
1631465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  NestedNameSpecifier *ToQualifier = 0;
1632465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  // Note: the qualifier in an ElaboratedType is optional.
1633465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  if (T->getQualifier()) {
1634465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara    ToQualifier = Importer.Import(T->getQualifier());
1635465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara    if (!ToQualifier)
1636465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara      return QualType();
1637465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  }
16381b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
16391b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  QualType ToNamedType = Importer.Import(T->getNamedType());
16401b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  if (ToNamedType.isNull())
16411b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return QualType();
16421b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
1643465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  return Importer.getToContext().getElaboratedType(T->getKeyword(),
1644465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara                                                   ToQualifier, ToNamedType);
16451b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor}
16461b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
1647f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitObjCInterfaceType(const ObjCInterfaceType *T) {
16481b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  ObjCInterfaceDecl *Class
16491b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    = dyn_cast_or_null<ObjCInterfaceDecl>(Importer.Import(T->getDecl()));
16501b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  if (!Class)
16511b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return QualType();
16521b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
1653c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  return Importer.getToContext().getObjCInterfaceType(Class);
1654c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall}
1655c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall
1656f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType ASTNodeImporter::VisitObjCObjectType(const ObjCObjectType *T) {
1657c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  QualType ToBaseType = Importer.Import(T->getBaseType());
1658c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  if (ToBaseType.isNull())
1659c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    return QualType();
1660c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall
16611b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  llvm::SmallVector<ObjCProtocolDecl *, 4> Protocols;
1662c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  for (ObjCObjectType::qual_iterator P = T->qual_begin(),
16631b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor                                     PEnd = T->qual_end();
16641b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor       P != PEnd; ++P) {
16651b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    ObjCProtocolDecl *Protocol
16661b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor      = dyn_cast_or_null<ObjCProtocolDecl>(Importer.Import(*P));
16671b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    if (!Protocol)
16681b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor      return QualType();
16691b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    Protocols.push_back(Protocol);
16701b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  }
16711b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
1672c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  return Importer.getToContext().getObjCObjectType(ToBaseType,
1673c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall                                                   Protocols.data(),
1674c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall                                                   Protocols.size());
16751b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor}
16761b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
1677f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallQualType
1678f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCallASTNodeImporter::VisitObjCObjectPointerType(const ObjCObjectPointerType *T) {
16791b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  QualType ToPointeeType = Importer.Import(T->getPointeeType());
16801b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  if (ToPointeeType.isNull())
16811b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return QualType();
16821b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
1683c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  return Importer.getToContext().getObjCObjectPointerType(ToPointeeType);
16841b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor}
16851b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
1686089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor//----------------------------------------------------------------------------
1687089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor// Import Declarations
1688089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor//----------------------------------------------------------------------------
1689a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregorbool ASTNodeImporter::ImportDeclParts(NamedDecl *D, DeclContext *&DC,
1690a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor                                      DeclContext *&LexicalDC,
1691a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor                                      DeclarationName &Name,
1692a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor                                      SourceLocation &Loc) {
1693089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor  // Import the context of this declaration.
1694a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  DC = Importer.ImportContext(D->getDeclContext());
1695089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor  if (!DC)
1696a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor    return true;
1697a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor
1698a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  LexicalDC = DC;
16999bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor  if (D->getDeclContext() != D->getLexicalDeclContext()) {
17009bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor    LexicalDC = Importer.ImportContext(D->getLexicalDeclContext());
17019bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor    if (!LexicalDC)
1702a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor      return true;
17039bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor  }
1704a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor
1705089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor  // Import the name of this declaration.
1706a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  Name = Importer.Import(D->getDeclName());
1707089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor  if (D->getDeclName() && !Name)
1708a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor    return true;
1709a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor
1710a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  // Import the location of this declaration.
1711a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  Loc = Importer.Import(D->getLocation());
1712a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  return false;
1713a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor}
1714a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor
17152577743c5650c646fb705df01403707e94f2df04Abramo Bagnaravoid
17162577743c5650c646fb705df01403707e94f2df04Abramo BagnaraASTNodeImporter::ImportDeclarationNameLoc(const DeclarationNameInfo &From,
17172577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                          DeclarationNameInfo& To) {
17182577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  // NOTE: To.Name and To.Loc are already imported.
17192577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  // We only have to import To.LocInfo.
17202577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  switch (To.getName().getNameKind()) {
17212577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  case DeclarationName::Identifier:
17222577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  case DeclarationName::ObjCZeroArgSelector:
17232577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  case DeclarationName::ObjCOneArgSelector:
17242577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  case DeclarationName::ObjCMultiArgSelector:
17252577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  case DeclarationName::CXXUsingDirective:
17262577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    return;
17272577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
17282577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  case DeclarationName::CXXOperatorName: {
17292577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    SourceRange Range = From.getCXXOperatorNameRange();
17302577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    To.setCXXOperatorNameRange(Importer.Import(Range));
17312577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    return;
17322577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  }
17332577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  case DeclarationName::CXXLiteralOperatorName: {
17342577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    SourceLocation Loc = From.getCXXLiteralOperatorNameLoc();
17352577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    To.setCXXLiteralOperatorNameLoc(Importer.Import(Loc));
17362577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    return;
17372577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  }
17382577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  case DeclarationName::CXXConstructorName:
17392577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  case DeclarationName::CXXDestructorName:
17402577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  case DeclarationName::CXXConversionFunctionName: {
17412577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    TypeSourceInfo *FromTInfo = From.getNamedTypeInfo();
17422577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    To.setNamedTypeInfo(Importer.Import(FromTInfo));
17432577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    return;
17442577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  }
17452577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    assert(0 && "Unknown name kind.");
17462577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  }
17472577743c5650c646fb705df01403707e94f2df04Abramo Bagnara}
17482577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
1749d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregorvoid ASTNodeImporter::ImportDeclContext(DeclContext *FromDC, bool ForceImport) {
1750d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor  if (Importer.isMinimalImport() && !ForceImport) {
1751d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor    if (DeclContext *ToDC = Importer.ImportContext(FromDC)) {
1752d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor      ToDC->setHasExternalLexicalStorage();
1753d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor      ToDC->setHasExternalVisibleStorage();
1754d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor    }
1755d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor    return;
1756d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor  }
1757d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor
1758083a821bbd02bbc521275a2f144abe39a6c2745cDouglas Gregor  for (DeclContext::decl_iterator From = FromDC->decls_begin(),
1759083a821bbd02bbc521275a2f144abe39a6c2745cDouglas Gregor                               FromEnd = FromDC->decls_end();
1760083a821bbd02bbc521275a2f144abe39a6c2745cDouglas Gregor       From != FromEnd;
1761083a821bbd02bbc521275a2f144abe39a6c2745cDouglas Gregor       ++From)
1762083a821bbd02bbc521275a2f144abe39a6c2745cDouglas Gregor    Importer.Import(*From);
1763083a821bbd02bbc521275a2f144abe39a6c2745cDouglas Gregor}
1764083a821bbd02bbc521275a2f144abe39a6c2745cDouglas Gregor
1765d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregorbool ASTNodeImporter::ImportDefinition(RecordDecl *From, RecordDecl *To) {
1766d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  if (To->getDefinition())
1767d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    return false;
1768d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
1769d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  To->startDefinition();
1770d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
1771d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  // Add base classes.
1772d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  if (CXXRecordDecl *ToCXX = dyn_cast<CXXRecordDecl>(To)) {
1773d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    CXXRecordDecl *FromCXX = cast<CXXRecordDecl>(From);
1774d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
1775d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    llvm::SmallVector<CXXBaseSpecifier *, 4> Bases;
1776d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    for (CXXRecordDecl::base_class_iterator
1777d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor                  Base1 = FromCXX->bases_begin(),
1778d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor            FromBaseEnd = FromCXX->bases_end();
1779d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor         Base1 != FromBaseEnd;
1780d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor         ++Base1) {
1781d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor      QualType T = Importer.Import(Base1->getType());
1782d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor      if (T.isNull())
1783c04d9d1be026cb201a716df1cd28a88878958beeDouglas Gregor        return true;
1784f90b27ad077c3339b62befc892382845339f9490Douglas Gregor
1785f90b27ad077c3339b62befc892382845339f9490Douglas Gregor      SourceLocation EllipsisLoc;
1786f90b27ad077c3339b62befc892382845339f9490Douglas Gregor      if (Base1->isPackExpansion())
1787f90b27ad077c3339b62befc892382845339f9490Douglas Gregor        EllipsisLoc = Importer.Import(Base1->getEllipsisLoc());
1788d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
1789d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor      Bases.push_back(
1790d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor                    new (Importer.getToContext())
1791d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor                      CXXBaseSpecifier(Importer.Import(Base1->getSourceRange()),
1792d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor                                       Base1->isVirtual(),
1793d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor                                       Base1->isBaseOfClass(),
1794d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor                                       Base1->getAccessSpecifierAsWritten(),
1795f90b27ad077c3339b62befc892382845339f9490Douglas Gregor                                   Importer.Import(Base1->getTypeSourceInfo()),
1796f90b27ad077c3339b62befc892382845339f9490Douglas Gregor                                       EllipsisLoc));
1797d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    }
1798d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    if (!Bases.empty())
1799d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor      ToCXX->setBases(Bases.data(), Bases.size());
1800d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  }
1801d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
1802d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  ImportDeclContext(From);
1803d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  To->completeDefinition();
1804c04d9d1be026cb201a716df1cd28a88878958beeDouglas Gregor  return false;
1805d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor}
1806d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
1807040afaeea2313dc69fd532995ac88cccdd62da56Douglas GregorTemplateParameterList *ASTNodeImporter::ImportTemplateParameterList(
1808040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor                                                TemplateParameterList *Params) {
1809040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  llvm::SmallVector<NamedDecl *, 4> ToParams;
1810040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  ToParams.reserve(Params->size());
1811040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  for (TemplateParameterList::iterator P = Params->begin(),
1812040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor                                    PEnd = Params->end();
1813040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor       P != PEnd; ++P) {
1814040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor    Decl *To = Importer.Import(*P);
1815040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor    if (!To)
1816040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor      return 0;
1817040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor
1818040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor    ToParams.push_back(cast<NamedDecl>(To));
1819040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  }
1820040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor
1821040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  return TemplateParameterList::Create(Importer.getToContext(),
1822040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor                                       Importer.Import(Params->getTemplateLoc()),
1823040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor                                       Importer.Import(Params->getLAngleLoc()),
1824040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor                                       ToParams.data(), ToParams.size(),
1825040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor                                       Importer.Import(Params->getRAngleLoc()));
1826040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor}
1827040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor
1828d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas GregorTemplateArgument
1829d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas GregorASTNodeImporter::ImportTemplateArgument(const TemplateArgument &From) {
1830d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  switch (From.getKind()) {
1831d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  case TemplateArgument::Null:
1832d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    return TemplateArgument();
1833d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
1834d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  case TemplateArgument::Type: {
1835d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    QualType ToType = Importer.Import(From.getAsType());
1836d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    if (ToType.isNull())
1837d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor      return TemplateArgument();
1838d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    return TemplateArgument(ToType);
1839d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  }
1840d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
1841d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  case TemplateArgument::Integral: {
1842d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    QualType ToType = Importer.Import(From.getIntegralType());
1843d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    if (ToType.isNull())
1844d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor      return TemplateArgument();
1845d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    return TemplateArgument(*From.getAsIntegral(), ToType);
1846d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  }
1847d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
1848d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  case TemplateArgument::Declaration:
1849d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    if (Decl *To = Importer.Import(From.getAsDecl()))
1850d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor      return TemplateArgument(To);
1851d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    return TemplateArgument();
1852d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
1853d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  case TemplateArgument::Template: {
1854d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    TemplateName ToTemplate = Importer.Import(From.getAsTemplate());
1855d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    if (ToTemplate.isNull())
1856d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor      return TemplateArgument();
1857d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
1858d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    return TemplateArgument(ToTemplate);
1859d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  }
1860a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor
1861a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor  case TemplateArgument::TemplateExpansion: {
1862a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor    TemplateName ToTemplate
1863a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor      = Importer.Import(From.getAsTemplateOrTemplatePattern());
1864a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor    if (ToTemplate.isNull())
1865a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor      return TemplateArgument();
1866a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor
18672be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor    return TemplateArgument(ToTemplate, From.getNumTemplateExpansions());
1868a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor  }
1869a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor
1870d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  case TemplateArgument::Expression:
1871d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    if (Expr *ToExpr = Importer.Import(From.getAsExpr()))
1872d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor      return TemplateArgument(ToExpr);
1873d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    return TemplateArgument();
1874d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
1875d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  case TemplateArgument::Pack: {
1876d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    llvm::SmallVector<TemplateArgument, 2> ToPack;
1877d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    ToPack.reserve(From.pack_size());
1878d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    if (ImportTemplateArguments(From.pack_begin(), From.pack_size(), ToPack))
1879d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor      return TemplateArgument();
1880d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
1881d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    TemplateArgument *ToArgs
1882d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor      = new (Importer.getToContext()) TemplateArgument[ToPack.size()];
1883d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    std::copy(ToPack.begin(), ToPack.end(), ToArgs);
1884d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    return TemplateArgument(ToArgs, ToPack.size());
1885d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  }
1886d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  }
1887d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
1888d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  llvm_unreachable("Invalid template argument kind");
1889d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  return TemplateArgument();
1890d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor}
1891d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
1892d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregorbool ASTNodeImporter::ImportTemplateArguments(const TemplateArgument *FromArgs,
1893d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor                                              unsigned NumFromArgs,
1894d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor                              llvm::SmallVectorImpl<TemplateArgument> &ToArgs) {
1895d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  for (unsigned I = 0; I != NumFromArgs; ++I) {
1896d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    TemplateArgument To = ImportTemplateArgument(FromArgs[I]);
1897d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    if (To.isNull() && !FromArgs[I].isNull())
1898d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor      return true;
1899d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
1900d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    ToArgs.push_back(To);
1901d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  }
1902d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
1903d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  return false;
1904d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor}
1905d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
190696a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregorbool ASTNodeImporter::IsStructuralMatch(RecordDecl *FromRecord,
190773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                        RecordDecl *ToRecord) {
1908bb2d176c4f434e9e73f63f2f9d128f63ce3e10d0Benjamin Kramer  StructuralEquivalenceContext Ctx(Importer.getFromContext(),
190973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                   Importer.getToContext(),
1910ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor                                   Importer.getNonEquivalentDecls());
1911bb2d176c4f434e9e73f63f2f9d128f63ce3e10d0Benjamin Kramer  return Ctx.IsStructurallyEquivalent(FromRecord, ToRecord);
191296a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor}
191396a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor
191436ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregorbool ASTNodeImporter::IsStructuralMatch(EnumDecl *FromEnum, EnumDecl *ToEnum) {
1915bb2d176c4f434e9e73f63f2f9d128f63ce3e10d0Benjamin Kramer  StructuralEquivalenceContext Ctx(Importer.getFromContext(),
191673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                   Importer.getToContext(),
1917ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor                                   Importer.getNonEquivalentDecls());
1918bb2d176c4f434e9e73f63f2f9d128f63ce3e10d0Benjamin Kramer  return Ctx.IsStructurallyEquivalent(FromEnum, ToEnum);
191936ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor}
192036ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor
1921040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregorbool ASTNodeImporter::IsStructuralMatch(ClassTemplateDecl *From,
1922040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor                                        ClassTemplateDecl *To) {
1923040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  StructuralEquivalenceContext Ctx(Importer.getFromContext(),
1924040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor                                   Importer.getToContext(),
1925040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor                                   Importer.getNonEquivalentDecls());
1926040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  return Ctx.IsStructurallyEquivalent(From, To);
1927040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor}
1928040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor
1929a404ea673cbee5e74af710a5f1ab571e71580b67Douglas GregorDecl *ASTNodeImporter::VisitDecl(Decl *D) {
1930a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  Importer.FromDiag(D->getLocation(), diag::err_unsupported_ast_node)
1931a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor    << D->getDeclKindName();
1932a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  return 0;
1933a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor}
1934a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor
1935788c62d1e87bfb596078817237f672a5f000999aDouglas GregorDecl *ASTNodeImporter::VisitNamespaceDecl(NamespaceDecl *D) {
1936788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor  // Import the major distinguishing characteristics of this namespace.
1937788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor  DeclContext *DC, *LexicalDC;
1938788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor  DeclarationName Name;
1939788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor  SourceLocation Loc;
1940788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor  if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
1941788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor    return 0;
1942788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor
1943788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor  NamespaceDecl *MergeWithNamespace = 0;
1944788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor  if (!Name) {
1945788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor    // This is an anonymous namespace. Adopt an existing anonymous
1946788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor    // namespace if we can.
1947788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor    // FIXME: Not testable.
1948788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor    if (TranslationUnitDecl *TU = dyn_cast<TranslationUnitDecl>(DC))
1949788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor      MergeWithNamespace = TU->getAnonymousNamespace();
1950788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor    else
1951788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor      MergeWithNamespace = cast<NamespaceDecl>(DC)->getAnonymousNamespace();
1952788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor  } else {
1953788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor    llvm::SmallVector<NamedDecl *, 4> ConflictingDecls;
1954788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor    for (DeclContext::lookup_result Lookup = DC->lookup(Name);
1955788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor         Lookup.first != Lookup.second;
1956788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor         ++Lookup.first) {
19570d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall      if (!(*Lookup.first)->isInIdentifierNamespace(Decl::IDNS_Namespace))
1958788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor        continue;
1959788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor
1960788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor      if (NamespaceDecl *FoundNS = dyn_cast<NamespaceDecl>(*Lookup.first)) {
1961788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor        MergeWithNamespace = FoundNS;
1962788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor        ConflictingDecls.clear();
1963788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor        break;
1964788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor      }
1965788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor
1966788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor      ConflictingDecls.push_back(*Lookup.first);
1967788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor    }
1968788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor
1969788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor    if (!ConflictingDecls.empty()) {
19700d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall      Name = Importer.HandleNameConflict(Name, DC, Decl::IDNS_Namespace,
1971788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor                                         ConflictingDecls.data(),
1972788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor                                         ConflictingDecls.size());
1973788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor    }
1974788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor  }
1975788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor
1976788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor  // Create the "to" namespace, if needed.
1977788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor  NamespaceDecl *ToNamespace = MergeWithNamespace;
1978788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor  if (!ToNamespace) {
1979acba90f30876b4140b738f0d3dd0e50724053a96Abramo Bagnara    ToNamespace = NamespaceDecl::Create(Importer.getToContext(), DC,
1980acba90f30876b4140b738f0d3dd0e50724053a96Abramo Bagnara                                        Importer.Import(D->getLocStart()),
1981acba90f30876b4140b738f0d3dd0e50724053a96Abramo Bagnara                                        Loc, Name.getAsIdentifierInfo());
1982788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor    ToNamespace->setLexicalDeclContext(LexicalDC);
1983788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor    LexicalDC->addDecl(ToNamespace);
1984788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor
1985788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor    // If this is an anonymous namespace, register it as the anonymous
1986788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor    // namespace within its context.
1987788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor    if (!Name) {
1988788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor      if (TranslationUnitDecl *TU = dyn_cast<TranslationUnitDecl>(DC))
1989788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor        TU->setAnonymousNamespace(ToNamespace);
1990788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor      else
1991788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor        cast<NamespaceDecl>(DC)->setAnonymousNamespace(ToNamespace);
1992788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor    }
1993788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor  }
1994788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor  Importer.Imported(D, ToNamespace);
1995788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor
1996788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor  ImportDeclContext(D);
1997788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor
1998788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor  return ToNamespace;
1999788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor}
2000788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor
2001162e1c1b487352434552147967c3dd296ebee2f7Richard SmithDecl *ASTNodeImporter::VisitTypedefNameDecl(TypedefNameDecl *D, bool IsAlias) {
20029e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor  // Import the major distinguishing characteristics of this typedef.
20039e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor  DeclContext *DC, *LexicalDC;
20049e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor  DeclarationName Name;
20059e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor  SourceLocation Loc;
20069e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor  if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
20079e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor    return 0;
20089e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor
20099e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor  // If this typedef is not in block scope, determine whether we've
20109e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor  // seen a typedef with the same name (that we can merge with) or any
20119e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor  // other entity by that name (which name lookup could conflict with).
20129e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor  if (!DC->isFunctionOrMethod()) {
20139e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor    llvm::SmallVector<NamedDecl *, 4> ConflictingDecls;
20149e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor    unsigned IDNS = Decl::IDNS_Ordinary;
20159e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor    for (DeclContext::lookup_result Lookup = DC->lookup(Name);
20169e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor         Lookup.first != Lookup.second;
20179e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor         ++Lookup.first) {
20189e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor      if (!(*Lookup.first)->isInIdentifierNamespace(IDNS))
20199e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor        continue;
2020162e1c1b487352434552147967c3dd296ebee2f7Richard Smith      if (TypedefNameDecl *FoundTypedef =
2021162e1c1b487352434552147967c3dd296ebee2f7Richard Smith            dyn_cast<TypedefNameDecl>(*Lookup.first)) {
2022ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor        if (Importer.IsStructurallyEquivalent(D->getUnderlyingType(),
2023ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor                                            FoundTypedef->getUnderlyingType()))
20245ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor          return Importer.Imported(D, FoundTypedef);
20259e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor      }
20269e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor
20279e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor      ConflictingDecls.push_back(*Lookup.first);
20289e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor    }
20299e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor
20309e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor    if (!ConflictingDecls.empty()) {
20319e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor      Name = Importer.HandleNameConflict(Name, DC, IDNS,
20329e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor                                         ConflictingDecls.data(),
20339e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor                                         ConflictingDecls.size());
20349e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor      if (!Name)
20359e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor        return 0;
20369e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor    }
20379e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor  }
20389e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor
2039ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  // Import the underlying type of this typedef;
2040ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  QualType T = Importer.Import(D->getUnderlyingType());
2041ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  if (T.isNull())
2042ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor    return 0;
2043ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor
20449e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor  // Create the new typedef node.
20459e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor  TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo());
2046344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara  SourceLocation StartL = Importer.Import(D->getLocStart());
2047162e1c1b487352434552147967c3dd296ebee2f7Richard Smith  TypedefNameDecl *ToTypedef;
2048162e1c1b487352434552147967c3dd296ebee2f7Richard Smith  if (IsAlias)
2049162e1c1b487352434552147967c3dd296ebee2f7Richard Smith    ToTypedef = TypedefDecl::Create(Importer.getToContext(), DC,
2050162e1c1b487352434552147967c3dd296ebee2f7Richard Smith                                    StartL, Loc,
2051162e1c1b487352434552147967c3dd296ebee2f7Richard Smith                                    Name.getAsIdentifierInfo(),
2052162e1c1b487352434552147967c3dd296ebee2f7Richard Smith                                    TInfo);
2053162e1c1b487352434552147967c3dd296ebee2f7Richard Smith  else
2054162e1c1b487352434552147967c3dd296ebee2f7Richard Smith    ToTypedef = TypeAliasDecl::Create(Importer.getToContext(), DC,
2055162e1c1b487352434552147967c3dd296ebee2f7Richard Smith                                  StartL, Loc,
2056162e1c1b487352434552147967c3dd296ebee2f7Richard Smith                                  Name.getAsIdentifierInfo(),
2057162e1c1b487352434552147967c3dd296ebee2f7Richard Smith                                  TInfo);
2058325bf177ac0f1db7888e2d7b194515466ba91762Douglas Gregor  ToTypedef->setAccess(D->getAccess());
20599e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor  ToTypedef->setLexicalDeclContext(LexicalDC);
20605ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor  Importer.Imported(D, ToTypedef);
20619e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor  LexicalDC->addDecl(ToTypedef);
2062ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor
20639e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor  return ToTypedef;
20649e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor}
20659e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor
2066162e1c1b487352434552147967c3dd296ebee2f7Richard SmithDecl *ASTNodeImporter::VisitTypedefDecl(TypedefDecl *D) {
2067162e1c1b487352434552147967c3dd296ebee2f7Richard Smith  return VisitTypedefNameDecl(D, /*IsAlias=*/false);
2068162e1c1b487352434552147967c3dd296ebee2f7Richard Smith}
2069162e1c1b487352434552147967c3dd296ebee2f7Richard Smith
2070162e1c1b487352434552147967c3dd296ebee2f7Richard SmithDecl *ASTNodeImporter::VisitTypeAliasDecl(TypeAliasDecl *D) {
2071162e1c1b487352434552147967c3dd296ebee2f7Richard Smith  return VisitTypedefNameDecl(D, /*IsAlias=*/true);
2072162e1c1b487352434552147967c3dd296ebee2f7Richard Smith}
2073162e1c1b487352434552147967c3dd296ebee2f7Richard Smith
207436ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas GregorDecl *ASTNodeImporter::VisitEnumDecl(EnumDecl *D) {
207536ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  // Import the major distinguishing characteristics of this enum.
207636ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  DeclContext *DC, *LexicalDC;
207736ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  DeclarationName Name;
207836ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  SourceLocation Loc;
207936ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
208036ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor    return 0;
208136ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor
208236ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  // Figure out what enum name we're looking for.
208336ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  unsigned IDNS = Decl::IDNS_Tag;
208436ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  DeclarationName SearchName = Name;
2085162e1c1b487352434552147967c3dd296ebee2f7Richard Smith  if (!SearchName && D->getTypedefNameForAnonDecl()) {
2086162e1c1b487352434552147967c3dd296ebee2f7Richard Smith    SearchName = Importer.Import(D->getTypedefNameForAnonDecl()->getDeclName());
208736ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor    IDNS = Decl::IDNS_Ordinary;
208836ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  } else if (Importer.getToContext().getLangOptions().CPlusPlus)
208936ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor    IDNS |= Decl::IDNS_Ordinary;
209036ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor
209136ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  // We may already have an enum of the same name; try to find and match it.
209236ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  if (!DC->isFunctionOrMethod() && SearchName) {
209336ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor    llvm::SmallVector<NamedDecl *, 4> ConflictingDecls;
209436ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor    for (DeclContext::lookup_result Lookup = DC->lookup(Name);
209536ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor         Lookup.first != Lookup.second;
209636ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor         ++Lookup.first) {
209736ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor      if (!(*Lookup.first)->isInIdentifierNamespace(IDNS))
209836ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor        continue;
209936ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor
210036ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor      Decl *Found = *Lookup.first;
2101162e1c1b487352434552147967c3dd296ebee2f7Richard Smith      if (TypedefNameDecl *Typedef = dyn_cast<TypedefNameDecl>(Found)) {
210236ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor        if (const TagType *Tag = Typedef->getUnderlyingType()->getAs<TagType>())
210336ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor          Found = Tag->getDecl();
210436ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor      }
210536ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor
210636ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor      if (EnumDecl *FoundEnum = dyn_cast<EnumDecl>(Found)) {
21075ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor        if (IsStructuralMatch(D, FoundEnum))
21085ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor          return Importer.Imported(D, FoundEnum);
210936ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor      }
211036ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor
211136ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor      ConflictingDecls.push_back(*Lookup.first);
211236ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor    }
211336ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor
211436ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor    if (!ConflictingDecls.empty()) {
211536ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor      Name = Importer.HandleNameConflict(Name, DC, IDNS,
211636ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor                                         ConflictingDecls.data(),
211736ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor                                         ConflictingDecls.size());
211836ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor    }
211936ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  }
212036ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor
212136ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  // Create the enum declaration.
2122ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara  EnumDecl *D2 = EnumDecl::Create(Importer.getToContext(), DC,
2123ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                  Importer.Import(D->getLocStart()),
2124ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                  Loc, Name.getAsIdentifierInfo(), 0,
2125a88cefd266c428be33cc06f7e8b00ff8fc97c1ffAbramo Bagnara                                  D->isScoped(), D->isScopedUsingClassTag(),
2126a88cefd266c428be33cc06f7e8b00ff8fc97c1ffAbramo Bagnara                                  D->isFixed());
2127b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall  // Import the qualifier, if any.
2128c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  D2->setQualifierInfo(Importer.Import(D->getQualifierLoc()));
2129325bf177ac0f1db7888e2d7b194515466ba91762Douglas Gregor  D2->setAccess(D->getAccess());
213073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  D2->setLexicalDeclContext(LexicalDC);
213173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  Importer.Imported(D, D2);
213273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  LexicalDC->addDecl(D2);
213336ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor
213436ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  // Import the integer type.
213536ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  QualType ToIntegerType = Importer.Import(D->getIntegerType());
213636ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  if (ToIntegerType.isNull())
213736ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor    return 0;
213873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  D2->setIntegerType(ToIntegerType);
213936ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor
214036ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  // Import the definition
214136ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  if (D->isDefinition()) {
214236ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor    QualType T = Importer.Import(Importer.getFromContext().getTypeDeclType(D));
214336ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor    if (T.isNull())
214436ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor      return 0;
214536ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor
214636ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor    QualType ToPromotionType = Importer.Import(D->getPromotionType());
214736ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor    if (ToPromotionType.isNull())
214836ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor      return 0;
214936ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor
215073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    D2->startDefinition();
2151083a821bbd02bbc521275a2f144abe39a6c2745cDouglas Gregor    ImportDeclContext(D);
21521b5a618c59025898806160ed5e7f0ff5bb79e482John McCall
21531b5a618c59025898806160ed5e7f0ff5bb79e482John McCall    // FIXME: we might need to merge the number of positive or negative bits
21541b5a618c59025898806160ed5e7f0ff5bb79e482John McCall    // if the enumerator lists don't match.
21551b5a618c59025898806160ed5e7f0ff5bb79e482John McCall    D2->completeDefinition(T, ToPromotionType,
21561b5a618c59025898806160ed5e7f0ff5bb79e482John McCall                           D->getNumPositiveBits(),
21571b5a618c59025898806160ed5e7f0ff5bb79e482John McCall                           D->getNumNegativeBits());
215836ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  }
215936ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor
216073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  return D2;
216136ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor}
216236ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor
216396a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas GregorDecl *ASTNodeImporter::VisitRecordDecl(RecordDecl *D) {
216496a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  // If this record has a definition in the translation unit we're coming from,
216596a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  // but this particular declaration is not that definition, import the
216696a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  // definition and map to that.
2167952b017601f9c82b51119c3a1600f1312a833db9Douglas Gregor  TagDecl *Definition = D->getDefinition();
216896a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  if (Definition && Definition != D) {
216996a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor    Decl *ImportedDef = Importer.Import(Definition);
21705ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor    if (!ImportedDef)
21715ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor      return 0;
21725ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor
21735ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor    return Importer.Imported(D, ImportedDef);
217496a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  }
217596a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor
217696a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  // Import the major distinguishing characteristics of this record.
217796a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  DeclContext *DC, *LexicalDC;
217896a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  DeclarationName Name;
217996a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  SourceLocation Loc;
218096a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
218196a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor    return 0;
218296a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor
218396a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  // Figure out what structure name we're looking for.
218496a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  unsigned IDNS = Decl::IDNS_Tag;
218596a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  DeclarationName SearchName = Name;
2186162e1c1b487352434552147967c3dd296ebee2f7Richard Smith  if (!SearchName && D->getTypedefNameForAnonDecl()) {
2187162e1c1b487352434552147967c3dd296ebee2f7Richard Smith    SearchName = Importer.Import(D->getTypedefNameForAnonDecl()->getDeclName());
218896a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor    IDNS = Decl::IDNS_Ordinary;
218996a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  } else if (Importer.getToContext().getLangOptions().CPlusPlus)
219096a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor    IDNS |= Decl::IDNS_Ordinary;
219196a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor
219296a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  // We may already have a record of the same name; try to find and match it.
2193e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor  RecordDecl *AdoptDecl = 0;
219496a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  if (!DC->isFunctionOrMethod() && SearchName) {
219596a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor    llvm::SmallVector<NamedDecl *, 4> ConflictingDecls;
219696a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor    for (DeclContext::lookup_result Lookup = DC->lookup(Name);
219796a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor         Lookup.first != Lookup.second;
219896a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor         ++Lookup.first) {
219996a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor      if (!(*Lookup.first)->isInIdentifierNamespace(IDNS))
220096a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor        continue;
220196a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor
220296a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor      Decl *Found = *Lookup.first;
2203162e1c1b487352434552147967c3dd296ebee2f7Richard Smith      if (TypedefNameDecl *Typedef = dyn_cast<TypedefNameDecl>(Found)) {
220496a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor        if (const TagType *Tag = Typedef->getUnderlyingType()->getAs<TagType>())
220596a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor          Found = Tag->getDecl();
220696a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor      }
220796a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor
220896a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor      if (RecordDecl *FoundRecord = dyn_cast<RecordDecl>(Found)) {
2209e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor        if (RecordDecl *FoundDef = FoundRecord->getDefinition()) {
2210e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor          if (!D->isDefinition() || IsStructuralMatch(D, FoundDef)) {
2211e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor            // The record types structurally match, or the "from" translation
2212e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor            // unit only had a forward declaration anyway; call it the same
2213e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor            // function.
2214e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor            // FIXME: For C++, we should also merge methods here.
22155ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor            return Importer.Imported(D, FoundDef);
2216e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor          }
2217e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor        } else {
2218e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor          // We have a forward declaration of this type, so adopt that forward
2219e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor          // declaration rather than building a new one.
2220e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor          AdoptDecl = FoundRecord;
2221e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor          continue;
2222e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor        }
222396a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor      }
222496a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor
222596a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor      ConflictingDecls.push_back(*Lookup.first);
222696a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor    }
222796a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor
222896a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor    if (!ConflictingDecls.empty()) {
222996a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor      Name = Importer.HandleNameConflict(Name, DC, IDNS,
223096a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor                                         ConflictingDecls.data(),
223196a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor                                         ConflictingDecls.size());
223296a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor    }
223396a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  }
223496a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor
223596a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  // Create the record declaration.
223673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  RecordDecl *D2 = AdoptDecl;
2237ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara  SourceLocation StartLoc = Importer.Import(D->getLocStart());
223873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  if (!D2) {
22395250f27420386452a21692a6292c99ee7febdac4John McCall    if (isa<CXXRecordDecl>(D)) {
224073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      CXXRecordDecl *D2CXX = CXXRecordDecl::Create(Importer.getToContext(),
2241e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor                                                   D->getTagKind(),
2242ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                                   DC, StartLoc, Loc,
2243ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                                   Name.getAsIdentifierInfo());
224473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      D2 = D2CXX;
2245325bf177ac0f1db7888e2d7b194515466ba91762Douglas Gregor      D2->setAccess(D->getAccess());
2246e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor    } else {
224773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      D2 = RecordDecl::Create(Importer.getToContext(), D->getTagKind(),
2248ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                              DC, StartLoc, Loc, Name.getAsIdentifierInfo());
224996a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor    }
2250c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor
2251c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor    D2->setQualifierInfo(Importer.Import(D->getQualifierLoc()));
225273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    D2->setLexicalDeclContext(LexicalDC);
225373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    LexicalDC->addDecl(D2);
225496a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  }
22555ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor
225673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  Importer.Imported(D, D2);
2257e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor
2258d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  if (D->isDefinition() && ImportDefinition(D, D2))
2259d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    return 0;
226096a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor
226173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  return D2;
226296a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor}
226396a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor
226436ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas GregorDecl *ASTNodeImporter::VisitEnumConstantDecl(EnumConstantDecl *D) {
226536ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  // Import the major distinguishing characteristics of this enumerator.
226636ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  DeclContext *DC, *LexicalDC;
226736ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  DeclarationName Name;
226836ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  SourceLocation Loc;
2269ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
227036ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor    return 0;
2271ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor
2272ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  QualType T = Importer.Import(D->getType());
2273ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  if (T.isNull())
2274ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor    return 0;
2275ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor
227636ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  // Determine whether there are any other declarations with the same name and
227736ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  // in the same context.
227836ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  if (!LexicalDC->isFunctionOrMethod()) {
227936ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor    llvm::SmallVector<NamedDecl *, 4> ConflictingDecls;
228036ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor    unsigned IDNS = Decl::IDNS_Ordinary;
228136ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor    for (DeclContext::lookup_result Lookup = DC->lookup(Name);
228236ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor         Lookup.first != Lookup.second;
228336ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor         ++Lookup.first) {
228436ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor      if (!(*Lookup.first)->isInIdentifierNamespace(IDNS))
228536ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor        continue;
228636ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor
228736ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor      ConflictingDecls.push_back(*Lookup.first);
228836ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor    }
228936ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor
229036ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor    if (!ConflictingDecls.empty()) {
229136ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor      Name = Importer.HandleNameConflict(Name, DC, IDNS,
229236ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor                                         ConflictingDecls.data(),
229336ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor                                         ConflictingDecls.size());
229436ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor      if (!Name)
229536ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor        return 0;
229636ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor    }
229736ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  }
229836ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor
229936ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  Expr *Init = Importer.Import(D->getInitExpr());
230036ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  if (D->getInitExpr() && !Init)
230136ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor    return 0;
230236ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor
230336ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  EnumConstantDecl *ToEnumerator
230436ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor    = EnumConstantDecl::Create(Importer.getToContext(), cast<EnumDecl>(DC), Loc,
230536ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor                               Name.getAsIdentifierInfo(), T,
230636ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor                               Init, D->getInitVal());
2307325bf177ac0f1db7888e2d7b194515466ba91762Douglas Gregor  ToEnumerator->setAccess(D->getAccess());
230836ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  ToEnumerator->setLexicalDeclContext(LexicalDC);
23095ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor  Importer.Imported(D, ToEnumerator);
231036ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  LexicalDC->addDecl(ToEnumerator);
231136ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  return ToEnumerator;
231236ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor}
231396a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor
2314a404ea673cbee5e74af710a5f1ab571e71580b67Douglas GregorDecl *ASTNodeImporter::VisitFunctionDecl(FunctionDecl *D) {
2315a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  // Import the major distinguishing characteristics of this function.
2316a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  DeclContext *DC, *LexicalDC;
2317a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  DeclarationName Name;
2318a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  SourceLocation Loc;
2319ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
2320089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor    return 0;
23212577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
2322a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  // Try to find a function in our own ("to") context with the same name, same
2323a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  // type, and in the same context as the function we're importing.
2324a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  if (!LexicalDC->isFunctionOrMethod()) {
2325a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor    llvm::SmallVector<NamedDecl *, 4> ConflictingDecls;
2326a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor    unsigned IDNS = Decl::IDNS_Ordinary;
2327a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor    for (DeclContext::lookup_result Lookup = DC->lookup(Name);
2328a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor         Lookup.first != Lookup.second;
2329a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor         ++Lookup.first) {
2330a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor      if (!(*Lookup.first)->isInIdentifierNamespace(IDNS))
2331a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor        continue;
2332a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor
2333a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor      if (FunctionDecl *FoundFunction = dyn_cast<FunctionDecl>(*Lookup.first)) {
2334a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor        if (isExternalLinkage(FoundFunction->getLinkage()) &&
2335a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor            isExternalLinkage(D->getLinkage())) {
2336ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor          if (Importer.IsStructurallyEquivalent(D->getType(),
2337ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor                                                FoundFunction->getType())) {
2338a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor            // FIXME: Actually try to merge the body and other attributes.
23395ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor            return Importer.Imported(D, FoundFunction);
2340a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor          }
2341a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor
2342a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor          // FIXME: Check for overloading more carefully, e.g., by boosting
2343a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor          // Sema::IsOverload out to the AST library.
2344a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor
2345a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor          // Function overloading is okay in C++.
2346a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor          if (Importer.getToContext().getLangOptions().CPlusPlus)
2347a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor            continue;
2348a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor
2349a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor          // Complain about inconsistent function types.
2350a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor          Importer.ToDiag(Loc, diag::err_odr_function_type_inconsistent)
2351ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor            << Name << D->getType() << FoundFunction->getType();
2352a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor          Importer.ToDiag(FoundFunction->getLocation(),
2353a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor                          diag::note_odr_value_here)
2354a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor            << FoundFunction->getType();
2355a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor        }
2356a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor      }
2357a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor
2358a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor      ConflictingDecls.push_back(*Lookup.first);
2359a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor    }
2360a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor
2361a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor    if (!ConflictingDecls.empty()) {
2362a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor      Name = Importer.HandleNameConflict(Name, DC, IDNS,
2363a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor                                         ConflictingDecls.data(),
2364a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor                                         ConflictingDecls.size());
2365a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor      if (!Name)
2366a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor        return 0;
2367a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor    }
2368a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  }
2369ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor
23702577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  DeclarationNameInfo NameInfo(Name, Loc);
23712577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  // Import additional name location/type info.
23722577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  ImportDeclarationNameLoc(D->getNameInfo(), NameInfo);
23732577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
2374ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  // Import the type.
2375ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  QualType T = Importer.Import(D->getType());
2376ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  if (T.isNull())
2377ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor    return 0;
2378a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor
2379a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  // Import the function parameters.
2380a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  llvm::SmallVector<ParmVarDecl *, 8> Parameters;
2381a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  for (FunctionDecl::param_iterator P = D->param_begin(), PEnd = D->param_end();
2382a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor       P != PEnd; ++P) {
2383a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor    ParmVarDecl *ToP = cast_or_null<ParmVarDecl>(Importer.Import(*P));
2384a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor    if (!ToP)
2385a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor      return 0;
2386a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor
2387a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor    Parameters.push_back(ToP);
2388a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  }
2389a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor
2390a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  // Create the imported function.
2391a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo());
2392c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor  FunctionDecl *ToFunction = 0;
2393c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor  if (CXXConstructorDecl *FromConstructor = dyn_cast<CXXConstructorDecl>(D)) {
2394c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor    ToFunction = CXXConstructorDecl::Create(Importer.getToContext(),
2395c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor                                            cast<CXXRecordDecl>(DC),
2396ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                            D->getInnerLocStart(),
23972577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                            NameInfo, T, TInfo,
2398c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor                                            FromConstructor->isExplicit(),
2399c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor                                            D->isInlineSpecified(),
2400c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor                                            D->isImplicit());
2401c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor  } else if (isa<CXXDestructorDecl>(D)) {
2402c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor    ToFunction = CXXDestructorDecl::Create(Importer.getToContext(),
2403c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor                                           cast<CXXRecordDecl>(DC),
2404ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                           D->getInnerLocStart(),
2405b41d899a6023385c00a61eb9dd3e44db9dc7994eCraig Silverstein                                           NameInfo, T, TInfo,
2406c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor                                           D->isInlineSpecified(),
2407c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor                                           D->isImplicit());
2408c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor  } else if (CXXConversionDecl *FromConversion
2409c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor                                           = dyn_cast<CXXConversionDecl>(D)) {
2410c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor    ToFunction = CXXConversionDecl::Create(Importer.getToContext(),
2411c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor                                           cast<CXXRecordDecl>(DC),
2412ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                           D->getInnerLocStart(),
24132577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                           NameInfo, T, TInfo,
2414c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor                                           D->isInlineSpecified(),
2415f52516038ab5d0b1b90a6dd32f46b7d6dabd04c8Douglas Gregor                                           FromConversion->isExplicit(),
2416f52516038ab5d0b1b90a6dd32f46b7d6dabd04c8Douglas Gregor                                           Importer.Import(D->getLocEnd()));
24170629cbe86b6d890076548778ed8597ee298adcbaDouglas Gregor  } else if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(D)) {
24180629cbe86b6d890076548778ed8597ee298adcbaDouglas Gregor    ToFunction = CXXMethodDecl::Create(Importer.getToContext(),
24190629cbe86b6d890076548778ed8597ee298adcbaDouglas Gregor                                       cast<CXXRecordDecl>(DC),
2420ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                       D->getInnerLocStart(),
24210629cbe86b6d890076548778ed8597ee298adcbaDouglas Gregor                                       NameInfo, T, TInfo,
24220629cbe86b6d890076548778ed8597ee298adcbaDouglas Gregor                                       Method->isStatic(),
24230629cbe86b6d890076548778ed8597ee298adcbaDouglas Gregor                                       Method->getStorageClassAsWritten(),
2424f52516038ab5d0b1b90a6dd32f46b7d6dabd04c8Douglas Gregor                                       Method->isInlineSpecified(),
2425f52516038ab5d0b1b90a6dd32f46b7d6dabd04c8Douglas Gregor                                       Importer.Import(D->getLocEnd()));
2426c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor  } else {
24272577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    ToFunction = FunctionDecl::Create(Importer.getToContext(), DC,
2428ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                      D->getInnerLocStart(),
24292577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                      NameInfo, T, TInfo, D->getStorageClass(),
243016573fa9705b546b7597c273b25b85d6321e2b33Douglas Gregor                                      D->getStorageClassAsWritten(),
2431c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor                                      D->isInlineSpecified(),
2432c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor                                      D->hasWrittenPrototype());
2433c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor  }
2434b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall
2435b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall  // Import the qualifier, if any.
2436c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  ToFunction->setQualifierInfo(Importer.Import(D->getQualifierLoc()));
2437325bf177ac0f1db7888e2d7b194515466ba91762Douglas Gregor  ToFunction->setAccess(D->getAccess());
2438c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  ToFunction->setLexicalDeclContext(LexicalDC);
2439f2eca2cf302c50b79891f24b3861d64ea9263831John McCall  ToFunction->setVirtualAsWritten(D->isVirtualAsWritten());
2440f2eca2cf302c50b79891f24b3861d64ea9263831John McCall  ToFunction->setTrivial(D->isTrivial());
2441f2eca2cf302c50b79891f24b3861d64ea9263831John McCall  ToFunction->setPure(D->isPure());
2442c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  Importer.Imported(D, ToFunction);
2443a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor
2444a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  // Set the parameters.
2445a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  for (unsigned I = 0, N = Parameters.size(); I != N; ++I) {
2446c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor    Parameters[I]->setOwningFunction(ToFunction);
2447c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor    ToFunction->addDecl(Parameters[I]);
2448a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  }
2449c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  ToFunction->setParams(Parameters.data(), Parameters.size());
2450a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor
2451a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  // FIXME: Other bits to merge?
245281134ad7a056e45b7cb4ee1b562ab8c8413d65b7Douglas Gregor
245381134ad7a056e45b7cb4ee1b562ab8c8413d65b7Douglas Gregor  // Add this function to the lexical context.
245481134ad7a056e45b7cb4ee1b562ab8c8413d65b7Douglas Gregor  LexicalDC->addDecl(ToFunction);
245581134ad7a056e45b7cb4ee1b562ab8c8413d65b7Douglas Gregor
2456c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  return ToFunction;
2457a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor}
2458a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor
2459c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas GregorDecl *ASTNodeImporter::VisitCXXMethodDecl(CXXMethodDecl *D) {
2460c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor  return VisitFunctionDecl(D);
2461c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor}
2462c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor
2463c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas GregorDecl *ASTNodeImporter::VisitCXXConstructorDecl(CXXConstructorDecl *D) {
2464c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor  return VisitCXXMethodDecl(D);
2465c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor}
2466c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor
2467c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas GregorDecl *ASTNodeImporter::VisitCXXDestructorDecl(CXXDestructorDecl *D) {
2468c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor  return VisitCXXMethodDecl(D);
2469c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor}
2470c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor
2471c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas GregorDecl *ASTNodeImporter::VisitCXXConversionDecl(CXXConversionDecl *D) {
2472c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor  return VisitCXXMethodDecl(D);
2473c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor}
2474c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor
247596a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas GregorDecl *ASTNodeImporter::VisitFieldDecl(FieldDecl *D) {
247696a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  // Import the major distinguishing characteristics of a variable.
247796a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  DeclContext *DC, *LexicalDC;
247896a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  DeclarationName Name;
247996a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  SourceLocation Loc;
2480ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
2481ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor    return 0;
2482ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor
2483ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  // Import the type.
2484ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  QualType T = Importer.Import(D->getType());
2485ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  if (T.isNull())
248696a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor    return 0;
248796a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor
248896a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo());
248996a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  Expr *BitWidth = Importer.Import(D->getBitWidth());
249096a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  if (!BitWidth && D->getBitWidth())
249196a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor    return 0;
249296a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor
2493ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara  FieldDecl *ToField = FieldDecl::Create(Importer.getToContext(), DC,
2494ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                         Importer.Import(D->getInnerLocStart()),
249596a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor                                         Loc, Name.getAsIdentifierInfo(),
249696a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor                                         T, TInfo, BitWidth, D->isMutable());
2497325bf177ac0f1db7888e2d7b194515466ba91762Douglas Gregor  ToField->setAccess(D->getAccess());
249896a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  ToField->setLexicalDeclContext(LexicalDC);
24995ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor  Importer.Imported(D, ToField);
250096a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  LexicalDC->addDecl(ToField);
250196a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  return ToField;
250296a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor}
250396a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor
250487c2e121cf0522fc266efe2922b58091cd2e0182Francois PichetDecl *ASTNodeImporter::VisitIndirectFieldDecl(IndirectFieldDecl *D) {
250587c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet  // Import the major distinguishing characteristics of a variable.
250687c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet  DeclContext *DC, *LexicalDC;
250787c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet  DeclarationName Name;
250887c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet  SourceLocation Loc;
250987c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet  if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
251087c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet    return 0;
251187c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet
251287c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet  // Import the type.
251387c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet  QualType T = Importer.Import(D->getType());
251487c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet  if (T.isNull())
251587c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet    return 0;
251687c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet
251787c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet  NamedDecl **NamedChain =
251887c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet    new (Importer.getToContext())NamedDecl*[D->getChainingSize()];
251987c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet
252087c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet  unsigned i = 0;
252187c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet  for (IndirectFieldDecl::chain_iterator PI = D->chain_begin(),
252287c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet       PE = D->chain_end(); PI != PE; ++PI) {
252387c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet    Decl* D = Importer.Import(*PI);
252487c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet    if (!D)
252587c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet      return 0;
252687c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet    NamedChain[i++] = cast<NamedDecl>(D);
252787c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet  }
252887c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet
252987c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet  IndirectFieldDecl *ToIndirectField = IndirectFieldDecl::Create(
253087c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet                                         Importer.getToContext(), DC,
253187c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet                                         Loc, Name.getAsIdentifierInfo(), T,
253287c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet                                         NamedChain, D->getChainingSize());
253387c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet  ToIndirectField->setAccess(D->getAccess());
253487c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet  ToIndirectField->setLexicalDeclContext(LexicalDC);
253587c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet  Importer.Imported(D, ToIndirectField);
253687c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet  LexicalDC->addDecl(ToIndirectField);
253787c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet  return ToIndirectField;
253887c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet}
253987c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet
25402e55e3af2f6d6c0509495357fade95105dd144cdDouglas GregorDecl *ASTNodeImporter::VisitObjCIvarDecl(ObjCIvarDecl *D) {
25412e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor  // Import the major distinguishing characteristics of an ivar.
25422e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor  DeclContext *DC, *LexicalDC;
25432e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor  DeclarationName Name;
25442e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor  SourceLocation Loc;
25452e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor  if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
25462e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor    return 0;
25472e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor
25482e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor  // Determine whether we've already imported this ivar
25492e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor  for (DeclContext::lookup_result Lookup = DC->lookup(Name);
25502e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor       Lookup.first != Lookup.second;
25512e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor       ++Lookup.first) {
25522e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor    if (ObjCIvarDecl *FoundIvar = dyn_cast<ObjCIvarDecl>(*Lookup.first)) {
25532e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor      if (Importer.IsStructurallyEquivalent(D->getType(),
25542e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor                                            FoundIvar->getType())) {
25552e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor        Importer.Imported(D, FoundIvar);
25562e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor        return FoundIvar;
25572e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor      }
25582e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor
25592e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor      Importer.ToDiag(Loc, diag::err_odr_ivar_type_inconsistent)
25602e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor        << Name << D->getType() << FoundIvar->getType();
25612e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor      Importer.ToDiag(FoundIvar->getLocation(), diag::note_odr_value_here)
25622e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor        << FoundIvar->getType();
25632e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor      return 0;
25642e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor    }
25652e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor  }
25662e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor
25672e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor  // Import the type.
25682e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor  QualType T = Importer.Import(D->getType());
25692e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor  if (T.isNull())
25702e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor    return 0;
25712e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor
25722e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor  TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo());
25732e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor  Expr *BitWidth = Importer.Import(D->getBitWidth());
25742e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor  if (!BitWidth && D->getBitWidth())
25752e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor    return 0;
25762e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor
2577a06549226f45d5b72169a3d054415616dd1014a2Daniel Dunbar  ObjCIvarDecl *ToIvar = ObjCIvarDecl::Create(Importer.getToContext(),
2578a06549226f45d5b72169a3d054415616dd1014a2Daniel Dunbar                                              cast<ObjCContainerDecl>(DC),
2579ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                       Importer.Import(D->getInnerLocStart()),
25802e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor                                              Loc, Name.getAsIdentifierInfo(),
25812e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor                                              T, TInfo, D->getAccessControl(),
2582ac0021ba802e193e0f9f8207768c7862c7603bc0Fariborz Jahanian                                              BitWidth, D->getSynthesize());
25832e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor  ToIvar->setLexicalDeclContext(LexicalDC);
25842e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor  Importer.Imported(D, ToIvar);
25852e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor  LexicalDC->addDecl(ToIvar);
25862e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor  return ToIvar;
25872e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor
25882e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor}
25892e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor
2590a404ea673cbee5e74af710a5f1ab571e71580b67Douglas GregorDecl *ASTNodeImporter::VisitVarDecl(VarDecl *D) {
2591a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  // Import the major distinguishing characteristics of a variable.
2592a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  DeclContext *DC, *LexicalDC;
2593a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  DeclarationName Name;
2594a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  SourceLocation Loc;
2595ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
2596a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor    return 0;
2597089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor
2598089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor  // Try to find a variable in our own ("to") context with the same name and
2599089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor  // in the same context as the variable we're importing.
26009bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor  if (D->isFileVarDecl()) {
2601089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor    VarDecl *MergeWithVar = 0;
2602089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor    llvm::SmallVector<NamedDecl *, 4> ConflictingDecls;
2603089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor    unsigned IDNS = Decl::IDNS_Ordinary;
26049bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor    for (DeclContext::lookup_result Lookup = DC->lookup(Name);
2605089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor         Lookup.first != Lookup.second;
2606089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor         ++Lookup.first) {
2607089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor      if (!(*Lookup.first)->isInIdentifierNamespace(IDNS))
2608089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor        continue;
2609089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor
2610089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor      if (VarDecl *FoundVar = dyn_cast<VarDecl>(*Lookup.first)) {
2611089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor        // We have found a variable that we may need to merge with. Check it.
2612089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor        if (isExternalLinkage(FoundVar->getLinkage()) &&
2613089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor            isExternalLinkage(D->getLinkage())) {
2614ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor          if (Importer.IsStructurallyEquivalent(D->getType(),
2615ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor                                                FoundVar->getType())) {
2616089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor            MergeWithVar = FoundVar;
2617089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor            break;
2618089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor          }
2619089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor
2620d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor          const ArrayType *FoundArray
2621d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor            = Importer.getToContext().getAsArrayType(FoundVar->getType());
2622d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor          const ArrayType *TArray
2623ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor            = Importer.getToContext().getAsArrayType(D->getType());
2624d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor          if (FoundArray && TArray) {
2625d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor            if (isa<IncompleteArrayType>(FoundArray) &&
2626d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor                isa<ConstantArrayType>(TArray)) {
2627ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor              // Import the type.
2628ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor              QualType T = Importer.Import(D->getType());
2629ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor              if (T.isNull())
2630ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor                return 0;
2631ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor
2632d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor              FoundVar->setType(T);
2633d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor              MergeWithVar = FoundVar;
2634d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor              break;
2635d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor            } else if (isa<IncompleteArrayType>(TArray) &&
2636d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor                       isa<ConstantArrayType>(FoundArray)) {
2637d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor              MergeWithVar = FoundVar;
2638d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor              break;
26390f962a8e61e1c094a89df17f9d3ad947d31c4e5cDouglas Gregor            }
26400f962a8e61e1c094a89df17f9d3ad947d31c4e5cDouglas Gregor          }
26410f962a8e61e1c094a89df17f9d3ad947d31c4e5cDouglas Gregor
2642089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor          Importer.ToDiag(Loc, diag::err_odr_variable_type_inconsistent)
2643ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor            << Name << D->getType() << FoundVar->getType();
2644089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor          Importer.ToDiag(FoundVar->getLocation(), diag::note_odr_value_here)
2645089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor            << FoundVar->getType();
2646089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor        }
2647089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor      }
2648089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor
2649089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor      ConflictingDecls.push_back(*Lookup.first);
2650089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor    }
2651089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor
2652089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor    if (MergeWithVar) {
2653089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor      // An equivalent variable with external linkage has been found. Link
2654089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor      // the two declarations, then merge them.
26555ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor      Importer.Imported(D, MergeWithVar);
2656089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor
2657089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor      if (VarDecl *DDef = D->getDefinition()) {
2658089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor        if (VarDecl *ExistingDef = MergeWithVar->getDefinition()) {
2659089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor          Importer.ToDiag(ExistingDef->getLocation(),
2660089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor                          diag::err_odr_variable_multiple_def)
2661089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor            << Name;
2662089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor          Importer.FromDiag(DDef->getLocation(), diag::note_odr_defined_here);
2663089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor        } else {
2664089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor          Expr *Init = Importer.Import(DDef->getInit());
2665838db383b69b9fb55f55c8e9546477df198a4faaDouglas Gregor          MergeWithVar->setInit(Init);
2666089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor        }
2667089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor      }
2668089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor
2669089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor      return MergeWithVar;
2670089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor    }
2671089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor
2672089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor    if (!ConflictingDecls.empty()) {
2673089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor      Name = Importer.HandleNameConflict(Name, DC, IDNS,
2674089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor                                         ConflictingDecls.data(),
2675089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor                                         ConflictingDecls.size());
2676089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor      if (!Name)
2677089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor        return 0;
2678089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor    }
2679089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor  }
268082fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor
2681ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  // Import the type.
2682ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  QualType T = Importer.Import(D->getType());
2683ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  if (T.isNull())
2684ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor    return 0;
2685ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor
2686089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor  // Create the imported variable.
268782fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor  TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo());
2688ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara  VarDecl *ToVar = VarDecl::Create(Importer.getToContext(), DC,
2689ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                   Importer.Import(D->getInnerLocStart()),
2690ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                   Loc, Name.getAsIdentifierInfo(),
2691ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                   T, TInfo,
269216573fa9705b546b7597c273b25b85d6321e2b33Douglas Gregor                                   D->getStorageClass(),
269316573fa9705b546b7597c273b25b85d6321e2b33Douglas Gregor                                   D->getStorageClassAsWritten());
2694c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  ToVar->setQualifierInfo(Importer.Import(D->getQualifierLoc()));
2695325bf177ac0f1db7888e2d7b194515466ba91762Douglas Gregor  ToVar->setAccess(D->getAccess());
26969bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor  ToVar->setLexicalDeclContext(LexicalDC);
26975ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor  Importer.Imported(D, ToVar);
26989bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor  LexicalDC->addDecl(ToVar);
26999bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor
2700089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor  // Merge the initializer.
2701089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor  // FIXME: Can we really import any initializer? Alternatively, we could force
2702089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor  // ourselves to import every declaration of a variable and then only use
2703089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor  // getInit() here.
2704838db383b69b9fb55f55c8e9546477df198a4faaDouglas Gregor  ToVar->setInit(Importer.Import(const_cast<Expr *>(D->getAnyInitializer())));
2705089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor
2706089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor  // FIXME: Other bits to merge?
2707089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor
2708089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor  return ToVar;
2709089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor}
2710089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor
27112cd00932b9b5403047139ce8cfaa3ae47966f894Douglas GregorDecl *ASTNodeImporter::VisitImplicitParamDecl(ImplicitParamDecl *D) {
27122cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor  // Parameters are created in the translation unit's context, then moved
27132cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor  // into the function declaration's context afterward.
27142cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor  DeclContext *DC = Importer.getToContext().getTranslationUnitDecl();
27152cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor
27162cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor  // Import the name of this declaration.
27172cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor  DeclarationName Name = Importer.Import(D->getDeclName());
27182cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor  if (D->getDeclName() && !Name)
27192cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor    return 0;
27202cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor
27212cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor  // Import the location of this declaration.
27222cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor  SourceLocation Loc = Importer.Import(D->getLocation());
27232cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor
27242cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor  // Import the parameter's type.
27252cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor  QualType T = Importer.Import(D->getType());
27262cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor  if (T.isNull())
27272cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor    return 0;
27282cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor
27292cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor  // Create the imported parameter.
27302cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor  ImplicitParamDecl *ToParm
27312cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor    = ImplicitParamDecl::Create(Importer.getToContext(), DC,
27322cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor                                Loc, Name.getAsIdentifierInfo(),
27332cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor                                T);
27342cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor  return Importer.Imported(D, ToParm);
27352cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor}
27362cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor
2737a404ea673cbee5e74af710a5f1ab571e71580b67Douglas GregorDecl *ASTNodeImporter::VisitParmVarDecl(ParmVarDecl *D) {
2738a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  // Parameters are created in the translation unit's context, then moved
2739a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  // into the function declaration's context afterward.
2740a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  DeclContext *DC = Importer.getToContext().getTranslationUnitDecl();
2741a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor
274282fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor  // Import the name of this declaration.
274382fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor  DeclarationName Name = Importer.Import(D->getDeclName());
274482fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor  if (D->getDeclName() && !Name)
274582fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor    return 0;
274682fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor
2747a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  // Import the location of this declaration.
2748a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  SourceLocation Loc = Importer.Import(D->getLocation());
2749a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor
2750a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  // Import the parameter's type.
2751a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  QualType T = Importer.Import(D->getType());
275282fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor  if (T.isNull())
275382fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor    return 0;
275482fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor
2755a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  // Create the imported parameter.
2756a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo());
2757a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  ParmVarDecl *ToParm = ParmVarDecl::Create(Importer.getToContext(), DC,
2758ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                     Importer.Import(D->getInnerLocStart()),
2759a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor                                            Loc, Name.getAsIdentifierInfo(),
2760a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor                                            T, TInfo, D->getStorageClass(),
276116573fa9705b546b7597c273b25b85d6321e2b33Douglas Gregor                                             D->getStorageClassAsWritten(),
2762a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor                                            /*FIXME: Default argument*/ 0);
2763bf73b352acb7a2d041ce8b50171dd7f8e2b2c1bbJohn McCall  ToParm->setHasInheritedDefaultArg(D->hasInheritedDefaultArg());
27645ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor  return Importer.Imported(D, ToParm);
2765a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor}
276682fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor
2767c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas GregorDecl *ASTNodeImporter::VisitObjCMethodDecl(ObjCMethodDecl *D) {
2768c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  // Import the major distinguishing characteristics of a method.
2769c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  DeclContext *DC, *LexicalDC;
2770c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  DeclarationName Name;
2771c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  SourceLocation Loc;
2772c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
2773c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor    return 0;
2774c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor
2775c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  for (DeclContext::lookup_result Lookup = DC->lookup(Name);
2776c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor       Lookup.first != Lookup.second;
2777c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor       ++Lookup.first) {
2778c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor    if (ObjCMethodDecl *FoundMethod = dyn_cast<ObjCMethodDecl>(*Lookup.first)) {
2779c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor      if (FoundMethod->isInstanceMethod() != D->isInstanceMethod())
2780c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor        continue;
2781c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor
2782c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor      // Check return types.
2783c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor      if (!Importer.IsStructurallyEquivalent(D->getResultType(),
2784c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor                                             FoundMethod->getResultType())) {
2785c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor        Importer.ToDiag(Loc, diag::err_odr_objc_method_result_type_inconsistent)
2786c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor          << D->isInstanceMethod() << Name
2787c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor          << D->getResultType() << FoundMethod->getResultType();
2788c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor        Importer.ToDiag(FoundMethod->getLocation(),
2789c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor                        diag::note_odr_objc_method_here)
2790c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor          << D->isInstanceMethod() << Name;
2791c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor        return 0;
2792c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor      }
2793c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor
2794c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor      // Check the number of parameters.
2795c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor      if (D->param_size() != FoundMethod->param_size()) {
2796c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor        Importer.ToDiag(Loc, diag::err_odr_objc_method_num_params_inconsistent)
2797c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor          << D->isInstanceMethod() << Name
2798c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor          << D->param_size() << FoundMethod->param_size();
2799c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor        Importer.ToDiag(FoundMethod->getLocation(),
2800c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor                        diag::note_odr_objc_method_here)
2801c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor          << D->isInstanceMethod() << Name;
2802c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor        return 0;
2803c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor      }
2804c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor
2805c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor      // Check parameter types.
2806c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor      for (ObjCMethodDecl::param_iterator P = D->param_begin(),
2807c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor             PEnd = D->param_end(), FoundP = FoundMethod->param_begin();
2808c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor           P != PEnd; ++P, ++FoundP) {
2809c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor        if (!Importer.IsStructurallyEquivalent((*P)->getType(),
2810c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor                                               (*FoundP)->getType())) {
2811c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor          Importer.FromDiag((*P)->getLocation(),
2812c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor                            diag::err_odr_objc_method_param_type_inconsistent)
2813c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor            << D->isInstanceMethod() << Name
2814c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor            << (*P)->getType() << (*FoundP)->getType();
2815c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor          Importer.ToDiag((*FoundP)->getLocation(), diag::note_odr_value_here)
2816c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor            << (*FoundP)->getType();
2817c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor          return 0;
2818c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor        }
2819c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor      }
2820c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor
2821c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor      // Check variadic/non-variadic.
2822c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor      // Check the number of parameters.
2823c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor      if (D->isVariadic() != FoundMethod->isVariadic()) {
2824c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor        Importer.ToDiag(Loc, diag::err_odr_objc_method_variadic_inconsistent)
2825c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor          << D->isInstanceMethod() << Name;
2826c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor        Importer.ToDiag(FoundMethod->getLocation(),
2827c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor                        diag::note_odr_objc_method_here)
2828c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor          << D->isInstanceMethod() << Name;
2829c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor        return 0;
2830c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor      }
2831c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor
2832c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor      // FIXME: Any other bits we need to merge?
2833c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor      return Importer.Imported(D, FoundMethod);
2834c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor    }
2835c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  }
2836c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor
2837c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  // Import the result type.
2838c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  QualType ResultTy = Importer.Import(D->getResultType());
2839c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  if (ResultTy.isNull())
2840c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor    return 0;
2841c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor
28424bc1cb6aa635a5bf8fae99bf69c56c724c1e786cDouglas Gregor  TypeSourceInfo *ResultTInfo = Importer.Import(D->getResultTypeSourceInfo());
28434bc1cb6aa635a5bf8fae99bf69c56c724c1e786cDouglas Gregor
2844c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  ObjCMethodDecl *ToMethod
2845c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor    = ObjCMethodDecl::Create(Importer.getToContext(),
2846c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor                             Loc,
2847c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor                             Importer.Import(D->getLocEnd()),
2848c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor                             Name.getObjCSelector(),
28494bc1cb6aa635a5bf8fae99bf69c56c724c1e786cDouglas Gregor                             ResultTy, ResultTInfo, DC,
2850c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor                             D->isInstanceMethod(),
2851c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor                             D->isVariadic(),
2852c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor                             D->isSynthesized(),
28533fe104154dd2e8ffb351142d74f308938b5c99bfFariborz Jahanian                             D->isDefined(),
2854c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor                             D->getImplementationControl());
2855c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor
2856c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  // FIXME: When we decide to merge method definitions, we'll need to
2857c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  // deal with implicit parameters.
2858c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor
2859c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  // Import the parameters
2860c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  llvm::SmallVector<ParmVarDecl *, 5> ToParams;
2861c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  for (ObjCMethodDecl::param_iterator FromP = D->param_begin(),
2862c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor                                   FromPEnd = D->param_end();
2863c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor       FromP != FromPEnd;
2864c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor       ++FromP) {
2865c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor    ParmVarDecl *ToP = cast_or_null<ParmVarDecl>(Importer.Import(*FromP));
2866c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor    if (!ToP)
2867c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor      return 0;
2868c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor
2869c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor    ToParams.push_back(ToP);
2870c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  }
2871c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor
2872c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  // Set the parameters.
2873c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  for (unsigned I = 0, N = ToParams.size(); I != N; ++I) {
2874c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor    ToParams[I]->setOwningFunction(ToMethod);
2875c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor    ToMethod->addDecl(ToParams[I]);
2876c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  }
2877c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  ToMethod->setMethodParams(Importer.getToContext(),
28784ecb25fa94897b2c03510292acace710e5262ba5Fariborz Jahanian                            ToParams.data(), ToParams.size(),
28794ecb25fa94897b2c03510292acace710e5262ba5Fariborz Jahanian                            ToParams.size());
2880c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor
2881c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  ToMethod->setLexicalDeclContext(LexicalDC);
2882c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  Importer.Imported(D, ToMethod);
2883c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  LexicalDC->addDecl(ToMethod);
2884c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  return ToMethod;
2885c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor}
2886c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor
2887b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas GregorDecl *ASTNodeImporter::VisitObjCCategoryDecl(ObjCCategoryDecl *D) {
2888b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor  // Import the major distinguishing characteristics of a category.
2889b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor  DeclContext *DC, *LexicalDC;
2890b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor  DeclarationName Name;
2891b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor  SourceLocation Loc;
2892b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor  if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
2893b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor    return 0;
2894b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor
2895b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor  ObjCInterfaceDecl *ToInterface
2896b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor    = cast_or_null<ObjCInterfaceDecl>(Importer.Import(D->getClassInterface()));
2897b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor  if (!ToInterface)
2898b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor    return 0;
2899b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor
2900b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor  // Determine if we've already encountered this category.
2901b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor  ObjCCategoryDecl *MergeWithCategory
2902b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor    = ToInterface->FindCategoryDeclaration(Name.getAsIdentifierInfo());
2903b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor  ObjCCategoryDecl *ToCategory = MergeWithCategory;
2904b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor  if (!ToCategory) {
2905b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor    ToCategory = ObjCCategoryDecl::Create(Importer.getToContext(), DC,
2906b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor                                          Importer.Import(D->getAtLoc()),
2907b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor                                          Loc,
2908b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor                                       Importer.Import(D->getCategoryNameLoc()),
2909b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor                                          Name.getAsIdentifierInfo());
2910b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor    ToCategory->setLexicalDeclContext(LexicalDC);
2911b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor    LexicalDC->addDecl(ToCategory);
2912b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor    Importer.Imported(D, ToCategory);
2913b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor
2914b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor    // Link this category into its class's category list.
2915b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor    ToCategory->setClassInterface(ToInterface);
2916b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor    ToCategory->insertNextClassCategory();
2917b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor
2918b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor    // Import protocols
2919b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor    llvm::SmallVector<ObjCProtocolDecl *, 4> Protocols;
2920b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor    llvm::SmallVector<SourceLocation, 4> ProtocolLocs;
2921b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor    ObjCCategoryDecl::protocol_loc_iterator FromProtoLoc
2922b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor      = D->protocol_loc_begin();
2923b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor    for (ObjCCategoryDecl::protocol_iterator FromProto = D->protocol_begin(),
2924b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor                                          FromProtoEnd = D->protocol_end();
2925b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor         FromProto != FromProtoEnd;
2926b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor         ++FromProto, ++FromProtoLoc) {
2927b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor      ObjCProtocolDecl *ToProto
2928b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor        = cast_or_null<ObjCProtocolDecl>(Importer.Import(*FromProto));
2929b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor      if (!ToProto)
2930b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor        return 0;
2931b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor      Protocols.push_back(ToProto);
2932b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor      ProtocolLocs.push_back(Importer.Import(*FromProtoLoc));
2933b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor    }
2934b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor
2935b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor    // FIXME: If we're merging, make sure that the protocol list is the same.
2936b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor    ToCategory->setProtocolList(Protocols.data(), Protocols.size(),
2937b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor                                ProtocolLocs.data(), Importer.getToContext());
2938b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor
2939b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor  } else {
2940b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor    Importer.Imported(D, ToCategory);
2941b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor  }
2942b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor
2943b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor  // Import all of the members of this category.
2944083a821bbd02bbc521275a2f144abe39a6c2745cDouglas Gregor  ImportDeclContext(D);
2945b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor
2946b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor  // If we have an implementation, import it as well.
2947b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor  if (D->getImplementation()) {
2948b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor    ObjCCategoryImplDecl *Impl
2949cad2c59b0c087edea83d0fbf6eabde4a7960c778Douglas Gregor      = cast_or_null<ObjCCategoryImplDecl>(
2950cad2c59b0c087edea83d0fbf6eabde4a7960c778Douglas Gregor                                       Importer.Import(D->getImplementation()));
2951b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor    if (!Impl)
2952b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor      return 0;
2953b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor
2954b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor    ToCategory->setImplementation(Impl);
2955b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor  }
2956b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor
2957b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor  return ToCategory;
2958b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor}
2959b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor
29602e2a400383c7a64a927f61eeed596b08928e1d4bDouglas GregorDecl *ASTNodeImporter::VisitObjCProtocolDecl(ObjCProtocolDecl *D) {
2961b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor  // Import the major distinguishing characteristics of a protocol.
29622e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor  DeclContext *DC, *LexicalDC;
29632e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor  DeclarationName Name;
29642e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor  SourceLocation Loc;
29652e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor  if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
29662e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor    return 0;
29672e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor
29682e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor  ObjCProtocolDecl *MergeWithProtocol = 0;
29692e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor  for (DeclContext::lookup_result Lookup = DC->lookup(Name);
29702e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor       Lookup.first != Lookup.second;
29712e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor       ++Lookup.first) {
29722e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor    if (!(*Lookup.first)->isInIdentifierNamespace(Decl::IDNS_ObjCProtocol))
29732e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor      continue;
29742e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor
29752e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor    if ((MergeWithProtocol = dyn_cast<ObjCProtocolDecl>(*Lookup.first)))
29762e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor      break;
29772e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor  }
29782e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor
29792e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor  ObjCProtocolDecl *ToProto = MergeWithProtocol;
29802e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor  if (!ToProto || ToProto->isForwardDecl()) {
29812e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor    if (!ToProto) {
29822e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor      ToProto = ObjCProtocolDecl::Create(Importer.getToContext(), DC, Loc,
29832e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor                                         Name.getAsIdentifierInfo());
29842e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor      ToProto->setForwardDecl(D->isForwardDecl());
29852e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor      ToProto->setLexicalDeclContext(LexicalDC);
29862e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor      LexicalDC->addDecl(ToProto);
29872e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor    }
29882e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor    Importer.Imported(D, ToProto);
29892e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor
29902e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor    // Import protocols
29912e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor    llvm::SmallVector<ObjCProtocolDecl *, 4> Protocols;
29922e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor    llvm::SmallVector<SourceLocation, 4> ProtocolLocs;
29932e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor    ObjCProtocolDecl::protocol_loc_iterator
29942e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor      FromProtoLoc = D->protocol_loc_begin();
29952e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor    for (ObjCProtocolDecl::protocol_iterator FromProto = D->protocol_begin(),
29962e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor                                          FromProtoEnd = D->protocol_end();
29972e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor       FromProto != FromProtoEnd;
29982e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor       ++FromProto, ++FromProtoLoc) {
29992e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor      ObjCProtocolDecl *ToProto
30002e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor        = cast_or_null<ObjCProtocolDecl>(Importer.Import(*FromProto));
30012e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor      if (!ToProto)
30022e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor        return 0;
30032e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor      Protocols.push_back(ToProto);
30042e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor      ProtocolLocs.push_back(Importer.Import(*FromProtoLoc));
30052e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor    }
30062e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor
30072e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor    // FIXME: If we're merging, make sure that the protocol list is the same.
30082e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor    ToProto->setProtocolList(Protocols.data(), Protocols.size(),
30092e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor                             ProtocolLocs.data(), Importer.getToContext());
30102e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor  } else {
30112e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor    Importer.Imported(D, ToProto);
30122e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor  }
30132e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor
3014b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor  // Import all of the members of this protocol.
3015083a821bbd02bbc521275a2f144abe39a6c2745cDouglas Gregor  ImportDeclContext(D);
30162e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor
30172e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor  return ToProto;
30182e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor}
30192e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor
3020a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas GregorDecl *ASTNodeImporter::VisitObjCInterfaceDecl(ObjCInterfaceDecl *D) {
3021a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor  // Import the major distinguishing characteristics of an @interface.
3022a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor  DeclContext *DC, *LexicalDC;
3023a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor  DeclarationName Name;
3024a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor  SourceLocation Loc;
3025a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor  if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
3026a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor    return 0;
3027a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor
3028a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor  ObjCInterfaceDecl *MergeWithIface = 0;
3029a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor  for (DeclContext::lookup_result Lookup = DC->lookup(Name);
3030a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor       Lookup.first != Lookup.second;
3031a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor       ++Lookup.first) {
3032a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor    if (!(*Lookup.first)->isInIdentifierNamespace(Decl::IDNS_Ordinary))
3033a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor      continue;
3034a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor
3035a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor    if ((MergeWithIface = dyn_cast<ObjCInterfaceDecl>(*Lookup.first)))
3036a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor      break;
3037a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor  }
3038a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor
3039a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor  ObjCInterfaceDecl *ToIface = MergeWithIface;
3040a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor  if (!ToIface || ToIface->isForwardDecl()) {
3041a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor    if (!ToIface) {
3042a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor      ToIface = ObjCInterfaceDecl::Create(Importer.getToContext(),
3043a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor                                          DC, Loc,
3044a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor                                          Name.getAsIdentifierInfo(),
3045deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor                                          Importer.Import(D->getClassLoc()),
3046a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor                                          D->isForwardDecl(),
3047a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor                                          D->isImplicitInterfaceDecl());
30482e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor      ToIface->setForwardDecl(D->isForwardDecl());
3049a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor      ToIface->setLexicalDeclContext(LexicalDC);
3050a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor      LexicalDC->addDecl(ToIface);
3051a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor    }
3052a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor    Importer.Imported(D, ToIface);
3053a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor
3054a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor    if (D->getSuperClass()) {
3055a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor      ObjCInterfaceDecl *Super
3056a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor        = cast_or_null<ObjCInterfaceDecl>(Importer.Import(D->getSuperClass()));
3057a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor      if (!Super)
3058a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor        return 0;
3059a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor
3060a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor      ToIface->setSuperClass(Super);
3061a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor      ToIface->setSuperClassLoc(Importer.Import(D->getSuperClassLoc()));
3062a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor    }
3063a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor
3064a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor    // Import protocols
3065a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor    llvm::SmallVector<ObjCProtocolDecl *, 4> Protocols;
3066a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor    llvm::SmallVector<SourceLocation, 4> ProtocolLocs;
3067a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor    ObjCInterfaceDecl::protocol_loc_iterator
3068a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor      FromProtoLoc = D->protocol_loc_begin();
306953b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek
307053b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek    // FIXME: Should we be usng all_referenced_protocol_begin() here?
3071a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor    for (ObjCInterfaceDecl::protocol_iterator FromProto = D->protocol_begin(),
3072a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor                                           FromProtoEnd = D->protocol_end();
3073a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor       FromProto != FromProtoEnd;
3074a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor       ++FromProto, ++FromProtoLoc) {
3075a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor      ObjCProtocolDecl *ToProto
3076a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor        = cast_or_null<ObjCProtocolDecl>(Importer.Import(*FromProto));
3077a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor      if (!ToProto)
3078a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor        return 0;
3079a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor      Protocols.push_back(ToProto);
3080a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor      ProtocolLocs.push_back(Importer.Import(*FromProtoLoc));
3081a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor    }
3082a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor
3083a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor    // FIXME: If we're merging, make sure that the protocol list is the same.
3084a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor    ToIface->setProtocolList(Protocols.data(), Protocols.size(),
3085a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor                             ProtocolLocs.data(), Importer.getToContext());
3086a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor
3087a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor    // Import @end range
3088a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor    ToIface->setAtEndRange(Importer.Import(D->getAtEndRange()));
3089a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor  } else {
3090a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor    Importer.Imported(D, ToIface);
30912e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor
30922e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor    // Check for consistency of superclasses.
30932e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor    DeclarationName FromSuperName, ToSuperName;
30942e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor    if (D->getSuperClass())
30952e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor      FromSuperName = Importer.Import(D->getSuperClass()->getDeclName());
30962e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor    if (ToIface->getSuperClass())
30972e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor      ToSuperName = ToIface->getSuperClass()->getDeclName();
30982e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor    if (FromSuperName != ToSuperName) {
30992e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor      Importer.ToDiag(ToIface->getLocation(),
31002e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor                      diag::err_odr_objc_superclass_inconsistent)
31012e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor        << ToIface->getDeclName();
31022e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor      if (ToIface->getSuperClass())
31032e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor        Importer.ToDiag(ToIface->getSuperClassLoc(),
31042e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor                        diag::note_odr_objc_superclass)
31052e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor          << ToIface->getSuperClass()->getDeclName();
31062e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor      else
31072e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor        Importer.ToDiag(ToIface->getLocation(),
31082e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor                        diag::note_odr_objc_missing_superclass);
31092e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor      if (D->getSuperClass())
31102e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor        Importer.FromDiag(D->getSuperClassLoc(),
31112e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor                          diag::note_odr_objc_superclass)
31122e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor          << D->getSuperClass()->getDeclName();
31132e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor      else
31142e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor        Importer.FromDiag(D->getLocation(),
31152e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor                          diag::note_odr_objc_missing_superclass);
31162e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor      return 0;
31172e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor    }
3118a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor  }
3119a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor
3120b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor  // Import categories. When the categories themselves are imported, they'll
3121b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor  // hook themselves into this interface.
3122b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor  for (ObjCCategoryDecl *FromCat = D->getCategoryList(); FromCat;
3123b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor       FromCat = FromCat->getNextClassCategory())
3124b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor    Importer.Import(FromCat);
3125b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor
3126a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor  // Import all of the members of this class.
3127083a821bbd02bbc521275a2f144abe39a6c2745cDouglas Gregor  ImportDeclContext(D);
3128a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor
3129a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor  // If we have an @implementation, import it as well.
3130a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor  if (D->getImplementation()) {
3131dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor    ObjCImplementationDecl *Impl = cast_or_null<ObjCImplementationDecl>(
3132dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor                                       Importer.Import(D->getImplementation()));
3133a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor    if (!Impl)
3134a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor      return 0;
3135a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor
3136a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor    ToIface->setImplementation(Impl);
3137a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor  }
3138a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor
31392e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor  return ToIface;
3140a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor}
3141a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor
31423daef29bf390dbdb3603748280afd5827d1811daDouglas GregorDecl *ASTNodeImporter::VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) {
31433daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor  ObjCCategoryDecl *Category = cast_or_null<ObjCCategoryDecl>(
31443daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor                                        Importer.Import(D->getCategoryDecl()));
31453daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor  if (!Category)
31463daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor    return 0;
31473daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor
31483daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor  ObjCCategoryImplDecl *ToImpl = Category->getImplementation();
31493daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor  if (!ToImpl) {
31503daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor    DeclContext *DC = Importer.ImportContext(D->getDeclContext());
31513daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor    if (!DC)
31523daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor      return 0;
31533daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor
31543daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor    ToImpl = ObjCCategoryImplDecl::Create(Importer.getToContext(), DC,
31553daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor                                          Importer.Import(D->getLocation()),
31563daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor                                          Importer.Import(D->getIdentifier()),
31573daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor                                          Category->getClassInterface());
31583daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor
31593daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor    DeclContext *LexicalDC = DC;
31603daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor    if (D->getDeclContext() != D->getLexicalDeclContext()) {
31613daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor      LexicalDC = Importer.ImportContext(D->getLexicalDeclContext());
31623daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor      if (!LexicalDC)
31633daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor        return 0;
31643daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor
31653daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor      ToImpl->setLexicalDeclContext(LexicalDC);
31663daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor    }
31673daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor
31683daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor    LexicalDC->addDecl(ToImpl);
31693daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor    Category->setImplementation(ToImpl);
31703daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor  }
31713daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor
31723daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor  Importer.Imported(D, ToImpl);
3173cad2c59b0c087edea83d0fbf6eabde4a7960c778Douglas Gregor  ImportDeclContext(D);
31743daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor  return ToImpl;
31753daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor}
31763daef29bf390dbdb3603748280afd5827d1811daDouglas Gregor
3177dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas GregorDecl *ASTNodeImporter::VisitObjCImplementationDecl(ObjCImplementationDecl *D) {
3178dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor  // Find the corresponding interface.
3179dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor  ObjCInterfaceDecl *Iface = cast_or_null<ObjCInterfaceDecl>(
3180dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor                                       Importer.Import(D->getClassInterface()));
3181dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor  if (!Iface)
3182dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor    return 0;
3183dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor
3184dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor  // Import the superclass, if any.
3185dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor  ObjCInterfaceDecl *Super = 0;
3186dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor  if (D->getSuperClass()) {
3187dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor    Super = cast_or_null<ObjCInterfaceDecl>(
3188dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor                                          Importer.Import(D->getSuperClass()));
3189dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor    if (!Super)
3190dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor      return 0;
3191dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor  }
3192dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor
3193dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor  ObjCImplementationDecl *Impl = Iface->getImplementation();
3194dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor  if (!Impl) {
3195dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor    // We haven't imported an implementation yet. Create a new @implementation
3196dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor    // now.
3197dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor    Impl = ObjCImplementationDecl::Create(Importer.getToContext(),
3198dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor                                  Importer.ImportContext(D->getDeclContext()),
3199dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor                                          Importer.Import(D->getLocation()),
3200dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor                                          Iface, Super);
3201dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor
3202dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor    if (D->getDeclContext() != D->getLexicalDeclContext()) {
3203dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor      DeclContext *LexicalDC
3204dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor        = Importer.ImportContext(D->getLexicalDeclContext());
3205dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor      if (!LexicalDC)
3206dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor        return 0;
3207dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor      Impl->setLexicalDeclContext(LexicalDC);
3208dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor    }
3209dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor
3210dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor    // Associate the implementation with the class it implements.
3211dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor    Iface->setImplementation(Impl);
3212dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor    Importer.Imported(D, Iface->getImplementation());
3213dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor  } else {
3214dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor    Importer.Imported(D, Iface->getImplementation());
3215dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor
3216dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor    // Verify that the existing @implementation has the same superclass.
3217dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor    if ((Super && !Impl->getSuperClass()) ||
3218dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor        (!Super && Impl->getSuperClass()) ||
3219dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor        (Super && Impl->getSuperClass() &&
3220dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor         Super->getCanonicalDecl() != Impl->getSuperClass())) {
3221dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor        Importer.ToDiag(Impl->getLocation(),
3222dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor                        diag::err_odr_objc_superclass_inconsistent)
3223dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor          << Iface->getDeclName();
3224dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor        // FIXME: It would be nice to have the location of the superclass
3225dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor        // below.
3226dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor        if (Impl->getSuperClass())
3227dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor          Importer.ToDiag(Impl->getLocation(),
3228dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor                          diag::note_odr_objc_superclass)
3229dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor          << Impl->getSuperClass()->getDeclName();
3230dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor        else
3231dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor          Importer.ToDiag(Impl->getLocation(),
3232dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor                          diag::note_odr_objc_missing_superclass);
3233dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor        if (D->getSuperClass())
3234dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor          Importer.FromDiag(D->getLocation(),
3235dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor                            diag::note_odr_objc_superclass)
3236dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor          << D->getSuperClass()->getDeclName();
3237dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor        else
3238dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor          Importer.FromDiag(D->getLocation(),
3239dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor                            diag::note_odr_objc_missing_superclass);
3240dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor      return 0;
3241dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor    }
3242dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor  }
3243dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor
3244dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor  // Import all of the members of this @implementation.
3245dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor  ImportDeclContext(D);
3246dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor
3247dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor  return Impl;
3248dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor}
3249dd182ff10b9145e432dea1fd2fb67100ccca3b10Douglas Gregor
3250e3261624c1870e52d7efc2ac83e647713361ac6cDouglas GregorDecl *ASTNodeImporter::VisitObjCPropertyDecl(ObjCPropertyDecl *D) {
3251e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor  // Import the major distinguishing characteristics of an @property.
3252e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor  DeclContext *DC, *LexicalDC;
3253e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor  DeclarationName Name;
3254e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor  SourceLocation Loc;
3255e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor  if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
3256e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor    return 0;
3257e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor
3258e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor  // Check whether we have already imported this property.
3259e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor  for (DeclContext::lookup_result Lookup = DC->lookup(Name);
3260e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor       Lookup.first != Lookup.second;
3261e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor       ++Lookup.first) {
3262e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor    if (ObjCPropertyDecl *FoundProp
3263e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor                                = dyn_cast<ObjCPropertyDecl>(*Lookup.first)) {
3264e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor      // Check property types.
3265e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor      if (!Importer.IsStructurallyEquivalent(D->getType(),
3266e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor                                             FoundProp->getType())) {
3267e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor        Importer.ToDiag(Loc, diag::err_odr_objc_property_type_inconsistent)
3268e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor          << Name << D->getType() << FoundProp->getType();
3269e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor        Importer.ToDiag(FoundProp->getLocation(), diag::note_odr_value_here)
3270e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor          << FoundProp->getType();
3271e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor        return 0;
3272e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor      }
3273e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor
3274e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor      // FIXME: Check property attributes, getters, setters, etc.?
3275e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor
3276e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor      // Consider these properties to be equivalent.
3277e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor      Importer.Imported(D, FoundProp);
3278e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor      return FoundProp;
3279e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor    }
3280e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor  }
3281e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor
3282e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor  // Import the type.
328383a230c83a54190366138c1a4f4310ef838b88fcJohn McCall  TypeSourceInfo *T = Importer.Import(D->getTypeSourceInfo());
328483a230c83a54190366138c1a4f4310ef838b88fcJohn McCall  if (!T)
3285e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor    return 0;
3286e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor
3287e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor  // Create the new property.
3288e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor  ObjCPropertyDecl *ToProperty
3289e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor    = ObjCPropertyDecl::Create(Importer.getToContext(), DC, Loc,
3290e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor                               Name.getAsIdentifierInfo(),
3291e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor                               Importer.Import(D->getAtLoc()),
3292e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor                               T,
3293e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor                               D->getPropertyImplementation());
3294e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor  Importer.Imported(D, ToProperty);
3295e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor  ToProperty->setLexicalDeclContext(LexicalDC);
3296e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor  LexicalDC->addDecl(ToProperty);
3297e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor
3298e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor  ToProperty->setPropertyAttributes(D->getPropertyAttributes());
329980aa1cd7973561889e51c1c152c8990a8de9c953Fariborz Jahanian  ToProperty->setPropertyAttributesAsWritten(
330080aa1cd7973561889e51c1c152c8990a8de9c953Fariborz Jahanian                                      D->getPropertyAttributesAsWritten());
3301e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor  ToProperty->setGetterName(Importer.Import(D->getGetterName()));
3302e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor  ToProperty->setSetterName(Importer.Import(D->getSetterName()));
3303e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor  ToProperty->setGetterMethodDecl(
3304e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor     cast_or_null<ObjCMethodDecl>(Importer.Import(D->getGetterMethodDecl())));
3305e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor  ToProperty->setSetterMethodDecl(
3306e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor     cast_or_null<ObjCMethodDecl>(Importer.Import(D->getSetterMethodDecl())));
3307e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor  ToProperty->setPropertyIvarDecl(
3308e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor       cast_or_null<ObjCIvarDecl>(Importer.Import(D->getPropertyIvarDecl())));
3309e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor  return ToProperty;
3310e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor}
3311e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor
3312954e0c75c42f321945aff8b9ee96da43cd90c752Douglas GregorDecl *ASTNodeImporter::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D) {
3313954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor  ObjCPropertyDecl *Property = cast_or_null<ObjCPropertyDecl>(
3314954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor                                        Importer.Import(D->getPropertyDecl()));
3315954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor  if (!Property)
3316954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor    return 0;
3317954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor
3318954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor  DeclContext *DC = Importer.ImportContext(D->getDeclContext());
3319954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor  if (!DC)
3320954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor    return 0;
3321954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor
3322954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor  // Import the lexical declaration context.
3323954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor  DeclContext *LexicalDC = DC;
3324954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor  if (D->getDeclContext() != D->getLexicalDeclContext()) {
3325954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor    LexicalDC = Importer.ImportContext(D->getLexicalDeclContext());
3326954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor    if (!LexicalDC)
3327954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor      return 0;
3328954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor  }
3329954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor
3330954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor  ObjCImplDecl *InImpl = dyn_cast<ObjCImplDecl>(LexicalDC);
3331954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor  if (!InImpl)
3332954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor    return 0;
3333954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor
3334954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor  // Import the ivar (for an @synthesize).
3335954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor  ObjCIvarDecl *Ivar = 0;
3336954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor  if (D->getPropertyIvarDecl()) {
3337954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor    Ivar = cast_or_null<ObjCIvarDecl>(
3338954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor                                    Importer.Import(D->getPropertyIvarDecl()));
3339954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor    if (!Ivar)
3340954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor      return 0;
3341954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor  }
3342954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor
3343954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor  ObjCPropertyImplDecl *ToImpl
3344954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor    = InImpl->FindPropertyImplDecl(Property->getIdentifier());
3345954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor  if (!ToImpl) {
3346954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor    ToImpl = ObjCPropertyImplDecl::Create(Importer.getToContext(), DC,
3347954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor                                          Importer.Import(D->getLocStart()),
3348954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor                                          Importer.Import(D->getLocation()),
3349954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor                                          Property,
3350954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor                                          D->getPropertyImplementation(),
3351954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor                                          Ivar,
3352954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor                                  Importer.Import(D->getPropertyIvarDeclLoc()));
3353954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor    ToImpl->setLexicalDeclContext(LexicalDC);
3354954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor    Importer.Imported(D, ToImpl);
3355954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor    LexicalDC->addDecl(ToImpl);
3356954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor  } else {
3357954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor    // Check that we have the same kind of property implementation (@synthesize
3358954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor    // vs. @dynamic).
3359954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor    if (D->getPropertyImplementation() != ToImpl->getPropertyImplementation()) {
3360954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor      Importer.ToDiag(ToImpl->getLocation(),
3361954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor                      diag::err_odr_objc_property_impl_kind_inconsistent)
3362954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor        << Property->getDeclName()
3363954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor        << (ToImpl->getPropertyImplementation()
3364954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor                                              == ObjCPropertyImplDecl::Dynamic);
3365954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor      Importer.FromDiag(D->getLocation(),
3366954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor                        diag::note_odr_objc_property_impl_kind)
3367954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor        << D->getPropertyDecl()->getDeclName()
3368954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor        << (D->getPropertyImplementation() == ObjCPropertyImplDecl::Dynamic);
3369954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor      return 0;
3370954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor    }
3371954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor
3372954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor    // For @synthesize, check that we have the same
3373954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor    if (D->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize &&
3374954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor        Ivar != ToImpl->getPropertyIvarDecl()) {
3375954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor      Importer.ToDiag(ToImpl->getPropertyIvarDeclLoc(),
3376954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor                      diag::err_odr_objc_synthesize_ivar_inconsistent)
3377954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor        << Property->getDeclName()
3378954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor        << ToImpl->getPropertyIvarDecl()->getDeclName()
3379954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor        << Ivar->getDeclName();
3380954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor      Importer.FromDiag(D->getPropertyIvarDeclLoc(),
3381954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor                        diag::note_odr_objc_synthesize_ivar_here)
3382954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor        << D->getPropertyIvarDecl()->getDeclName();
3383954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor      return 0;
3384954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor    }
3385954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor
3386954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor    // Merge the existing implementation with the new implementation.
3387954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor    Importer.Imported(D, ToImpl);
3388954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor  }
3389954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor
3390954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor  return ToImpl;
3391954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor}
3392954e0c75c42f321945aff8b9ee96da43cd90c752Douglas Gregor
33932b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas GregorDecl *
33942b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas GregorASTNodeImporter::VisitObjCForwardProtocolDecl(ObjCForwardProtocolDecl *D) {
33952b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor  // Import the context of this declaration.
33962b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor  DeclContext *DC = Importer.ImportContext(D->getDeclContext());
33972b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor  if (!DC)
33982b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor    return 0;
33992b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor
34002b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor  DeclContext *LexicalDC = DC;
34012b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor  if (D->getDeclContext() != D->getLexicalDeclContext()) {
34022b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor    LexicalDC = Importer.ImportContext(D->getLexicalDeclContext());
34032b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor    if (!LexicalDC)
34042b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor      return 0;
34052b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor  }
34062b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor
34072b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor  // Import the location of this declaration.
34082b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor  SourceLocation Loc = Importer.Import(D->getLocation());
34092b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor
34102b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor  llvm::SmallVector<ObjCProtocolDecl *, 4> Protocols;
34112b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor  llvm::SmallVector<SourceLocation, 4> Locations;
34122b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor  ObjCForwardProtocolDecl::protocol_loc_iterator FromProtoLoc
34132b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor    = D->protocol_loc_begin();
34142b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor  for (ObjCForwardProtocolDecl::protocol_iterator FromProto
34152b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor         = D->protocol_begin(), FromProtoEnd = D->protocol_end();
34162b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor       FromProto != FromProtoEnd;
34172b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor       ++FromProto, ++FromProtoLoc) {
34182b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor    ObjCProtocolDecl *ToProto
34192b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor      = cast_or_null<ObjCProtocolDecl>(Importer.Import(*FromProto));
34202b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor    if (!ToProto)
34212b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor      continue;
34222b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor
34232b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor    Protocols.push_back(ToProto);
34242b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor    Locations.push_back(Importer.Import(*FromProtoLoc));
34252b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor  }
34262b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor
34272b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor  ObjCForwardProtocolDecl *ToForward
34282b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor    = ObjCForwardProtocolDecl::Create(Importer.getToContext(), DC, Loc,
34292b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor                                      Protocols.data(), Protocols.size(),
34302b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor                                      Locations.data());
34312b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor  ToForward->setLexicalDeclContext(LexicalDC);
34322b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor  LexicalDC->addDecl(ToForward);
34332b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor  Importer.Imported(D, ToForward);
34342b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor  return ToForward;
34352b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor}
34362b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor
3437a2bc15b7463a9f85a5bff1531d833c278426a733Douglas GregorDecl *ASTNodeImporter::VisitObjCClassDecl(ObjCClassDecl *D) {
3438a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor  // Import the context of this declaration.
3439a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor  DeclContext *DC = Importer.ImportContext(D->getDeclContext());
3440a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor  if (!DC)
3441a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor    return 0;
3442a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor
3443a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor  DeclContext *LexicalDC = DC;
3444a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor  if (D->getDeclContext() != D->getLexicalDeclContext()) {
3445a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor    LexicalDC = Importer.ImportContext(D->getLexicalDeclContext());
3446a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor    if (!LexicalDC)
3447a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor      return 0;
3448a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor  }
3449a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor
3450a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor  // Import the location of this declaration.
3451a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor  SourceLocation Loc = Importer.Import(D->getLocation());
3452a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor
3453a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor  llvm::SmallVector<ObjCInterfaceDecl *, 4> Interfaces;
3454a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor  llvm::SmallVector<SourceLocation, 4> Locations;
3455a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor  for (ObjCClassDecl::iterator From = D->begin(), FromEnd = D->end();
3456a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor       From != FromEnd; ++From) {
3457a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor    ObjCInterfaceDecl *ToIface
3458a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor      = cast_or_null<ObjCInterfaceDecl>(Importer.Import(From->getInterface()));
3459a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor    if (!ToIface)
3460a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor      continue;
3461a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor
3462a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor    Interfaces.push_back(ToIface);
3463a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor    Locations.push_back(Importer.Import(From->getLocation()));
3464a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor  }
3465a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor
3466a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor  ObjCClassDecl *ToClass = ObjCClassDecl::Create(Importer.getToContext(), DC,
3467a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor                                                 Loc,
3468a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor                                                 Interfaces.data(),
3469a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor                                                 Locations.data(),
3470a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor                                                 Interfaces.size());
3471a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor  ToClass->setLexicalDeclContext(LexicalDC);
3472a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor  LexicalDC->addDecl(ToClass);
3473a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor  Importer.Imported(D, ToClass);
3474a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor  return ToClass;
3475a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor}
3476a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor
3477040afaeea2313dc69fd532995ac88cccdd62da56Douglas GregorDecl *ASTNodeImporter::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) {
3478040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  // For template arguments, we adopt the translation unit as our declaration
3479040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  // context. This context will be fixed when the actual template declaration
3480040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  // is created.
3481040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor
3482040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  // FIXME: Import default argument.
3483040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  return TemplateTypeParmDecl::Create(Importer.getToContext(),
3484040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor                              Importer.getToContext().getTranslationUnitDecl(),
3485344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara                                      Importer.Import(D->getLocStart()),
3486040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor                                      Importer.Import(D->getLocation()),
3487040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor                                      D->getDepth(),
3488040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor                                      D->getIndex(),
3489040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor                                      Importer.Import(D->getIdentifier()),
3490040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor                                      D->wasDeclaredWithTypename(),
3491040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor                                      D->isParameterPack());
3492040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor}
3493040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor
3494040afaeea2313dc69fd532995ac88cccdd62da56Douglas GregorDecl *
3495040afaeea2313dc69fd532995ac88cccdd62da56Douglas GregorASTNodeImporter::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) {
3496040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  // Import the name of this declaration.
3497040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  DeclarationName Name = Importer.Import(D->getDeclName());
3498040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  if (D->getDeclName() && !Name)
3499040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor    return 0;
3500040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor
3501040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  // Import the location of this declaration.
3502040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  SourceLocation Loc = Importer.Import(D->getLocation());
3503040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor
3504040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  // Import the type of this declaration.
3505040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  QualType T = Importer.Import(D->getType());
3506040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  if (T.isNull())
3507040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor    return 0;
3508040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor
3509040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  // Import type-source information.
3510040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo());
3511040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  if (D->getTypeSourceInfo() && !TInfo)
3512040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor    return 0;
3513040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor
3514040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  // FIXME: Import default argument.
3515040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor
3516040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  return NonTypeTemplateParmDecl::Create(Importer.getToContext(),
3517040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor                               Importer.getToContext().getTranslationUnitDecl(),
3518ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                         Importer.Import(D->getInnerLocStart()),
3519040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor                                         Loc, D->getDepth(), D->getPosition(),
3520040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor                                         Name.getAsIdentifierInfo(),
352110738d36b150aa65206890c1c845cdba076e4200Douglas Gregor                                         T, D->isParameterPack(), TInfo);
3522040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor}
3523040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor
3524040afaeea2313dc69fd532995ac88cccdd62da56Douglas GregorDecl *
3525040afaeea2313dc69fd532995ac88cccdd62da56Douglas GregorASTNodeImporter::VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) {
3526040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  // Import the name of this declaration.
3527040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  DeclarationName Name = Importer.Import(D->getDeclName());
3528040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  if (D->getDeclName() && !Name)
3529040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor    return 0;
3530040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor
3531040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  // Import the location of this declaration.
3532040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  SourceLocation Loc = Importer.Import(D->getLocation());
3533040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor
3534040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  // Import template parameters.
3535040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  TemplateParameterList *TemplateParams
3536040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor    = ImportTemplateParameterList(D->getTemplateParameters());
3537040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  if (!TemplateParams)
3538040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor    return 0;
3539040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor
3540040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  // FIXME: Import default argument.
3541040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor
3542040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  return TemplateTemplateParmDecl::Create(Importer.getToContext(),
3543040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor                              Importer.getToContext().getTranslationUnitDecl(),
3544040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor                                          Loc, D->getDepth(), D->getPosition(),
354561c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor                                          D->isParameterPack(),
3546040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor                                          Name.getAsIdentifierInfo(),
3547040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor                                          TemplateParams);
3548040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor}
3549040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor
3550040afaeea2313dc69fd532995ac88cccdd62da56Douglas GregorDecl *ASTNodeImporter::VisitClassTemplateDecl(ClassTemplateDecl *D) {
3551040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  // If this record has a definition in the translation unit we're coming from,
3552040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  // but this particular declaration is not that definition, import the
3553040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  // definition and map to that.
3554040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  CXXRecordDecl *Definition
3555040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor    = cast_or_null<CXXRecordDecl>(D->getTemplatedDecl()->getDefinition());
3556040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  if (Definition && Definition != D->getTemplatedDecl()) {
3557040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor    Decl *ImportedDef
3558040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor      = Importer.Import(Definition->getDescribedClassTemplate());
3559040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor    if (!ImportedDef)
3560040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor      return 0;
3561040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor
3562040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor    return Importer.Imported(D, ImportedDef);
3563040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  }
3564040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor
3565040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  // Import the major distinguishing characteristics of this class template.
3566040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  DeclContext *DC, *LexicalDC;
3567040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  DeclarationName Name;
3568040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  SourceLocation Loc;
3569040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
3570040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor    return 0;
3571040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor
3572040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  // We may already have a template of the same name; try to find and match it.
3573040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  if (!DC->isFunctionOrMethod()) {
3574040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor    llvm::SmallVector<NamedDecl *, 4> ConflictingDecls;
3575040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor    for (DeclContext::lookup_result Lookup = DC->lookup(Name);
3576040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor         Lookup.first != Lookup.second;
3577040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor         ++Lookup.first) {
3578040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor      if (!(*Lookup.first)->isInIdentifierNamespace(Decl::IDNS_Ordinary))
3579040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor        continue;
3580040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor
3581040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor      Decl *Found = *Lookup.first;
3582040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor      if (ClassTemplateDecl *FoundTemplate
3583040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor                                        = dyn_cast<ClassTemplateDecl>(Found)) {
3584040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor        if (IsStructuralMatch(D, FoundTemplate)) {
3585040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor          // The class templates structurally match; call it the same template.
3586040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor          // FIXME: We may be filling in a forward declaration here. Handle
3587040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor          // this case!
3588040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor          Importer.Imported(D->getTemplatedDecl(),
3589040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor                            FoundTemplate->getTemplatedDecl());
3590040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor          return Importer.Imported(D, FoundTemplate);
3591040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor        }
3592040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor      }
3593040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor
3594040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor      ConflictingDecls.push_back(*Lookup.first);
3595040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor    }
3596040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor
3597040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor    if (!ConflictingDecls.empty()) {
3598040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor      Name = Importer.HandleNameConflict(Name, DC, Decl::IDNS_Ordinary,
3599040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor                                         ConflictingDecls.data(),
3600040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor                                         ConflictingDecls.size());
3601040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor    }
3602040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor
3603040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor    if (!Name)
3604040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor      return 0;
3605040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  }
3606040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor
3607040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  CXXRecordDecl *DTemplated = D->getTemplatedDecl();
3608040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor
3609040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  // Create the declaration that is being templated.
3610ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara  SourceLocation StartLoc = Importer.Import(DTemplated->getLocStart());
3611ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara  SourceLocation IdLoc = Importer.Import(DTemplated->getLocation());
3612040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  CXXRecordDecl *D2Templated = CXXRecordDecl::Create(Importer.getToContext(),
3613040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor                                                     DTemplated->getTagKind(),
3614ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                                     DC, StartLoc, IdLoc,
3615ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                                   Name.getAsIdentifierInfo());
3616040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  D2Templated->setAccess(DTemplated->getAccess());
3617c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  D2Templated->setQualifierInfo(Importer.Import(DTemplated->getQualifierLoc()));
3618040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  D2Templated->setLexicalDeclContext(LexicalDC);
3619040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor
3620040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  // Create the class template declaration itself.
3621040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  TemplateParameterList *TemplateParams
3622040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor    = ImportTemplateParameterList(D->getTemplateParameters());
3623040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  if (!TemplateParams)
3624040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor    return 0;
3625040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor
3626040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  ClassTemplateDecl *D2 = ClassTemplateDecl::Create(Importer.getToContext(), DC,
3627040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor                                                    Loc, Name, TemplateParams,
3628040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor                                                    D2Templated,
3629040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  /*PrevDecl=*/0);
3630040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  D2Templated->setDescribedClassTemplate(D2);
3631040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor
3632040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  D2->setAccess(D->getAccess());
3633040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  D2->setLexicalDeclContext(LexicalDC);
3634040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  LexicalDC->addDecl(D2);
3635040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor
3636040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  // Note the relationship between the class templates.
3637040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  Importer.Imported(D, D2);
3638040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  Importer.Imported(DTemplated, D2Templated);
3639040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor
3640040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  if (DTemplated->isDefinition() && !D2Templated->isDefinition()) {
3641040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor    // FIXME: Import definition!
3642040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  }
3643040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor
3644040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor  return D2;
3645040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor}
3646040afaeea2313dc69fd532995ac88cccdd62da56Douglas Gregor
3647d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas GregorDecl *ASTNodeImporter::VisitClassTemplateSpecializationDecl(
3648d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor                                          ClassTemplateSpecializationDecl *D) {
3649d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  // If this record has a definition in the translation unit we're coming from,
3650d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  // but this particular declaration is not that definition, import the
3651d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  // definition and map to that.
3652d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  TagDecl *Definition = D->getDefinition();
3653d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  if (Definition && Definition != D) {
3654d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    Decl *ImportedDef = Importer.Import(Definition);
3655d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    if (!ImportedDef)
3656d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor      return 0;
3657d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
3658d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    return Importer.Imported(D, ImportedDef);
3659d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  }
3660d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
3661d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  ClassTemplateDecl *ClassTemplate
3662d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    = cast_or_null<ClassTemplateDecl>(Importer.Import(
3663d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor                                                 D->getSpecializedTemplate()));
3664d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  if (!ClassTemplate)
3665d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    return 0;
3666d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
3667d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  // Import the context of this declaration.
3668d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  DeclContext *DC = ClassTemplate->getDeclContext();
3669d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  if (!DC)
3670d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    return 0;
3671d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
3672d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  DeclContext *LexicalDC = DC;
3673d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  if (D->getDeclContext() != D->getLexicalDeclContext()) {
3674d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    LexicalDC = Importer.ImportContext(D->getLexicalDeclContext());
3675d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    if (!LexicalDC)
3676d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor      return 0;
3677d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  }
3678d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
3679d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  // Import the location of this declaration.
3680ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara  SourceLocation StartLoc = Importer.Import(D->getLocStart());
3681ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara  SourceLocation IdLoc = Importer.Import(D->getLocation());
3682d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
3683d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  // Import template arguments.
3684d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  llvm::SmallVector<TemplateArgument, 2> TemplateArgs;
3685d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  if (ImportTemplateArguments(D->getTemplateArgs().data(),
3686d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor                              D->getTemplateArgs().size(),
3687d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor                              TemplateArgs))
3688d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    return 0;
3689d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
3690d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  // Try to find an existing specialization with these template arguments.
3691d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  void *InsertPos = 0;
3692d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  ClassTemplateSpecializationDecl *D2
3693d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    = ClassTemplate->findSpecialization(TemplateArgs.data(),
3694d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor                                        TemplateArgs.size(), InsertPos);
3695d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  if (D2) {
3696d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    // We already have a class template specialization with these template
3697d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    // arguments.
3698d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
3699d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    // FIXME: Check for specialization vs. instantiation errors.
3700d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
3701d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    if (RecordDecl *FoundDef = D2->getDefinition()) {
3702d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor      if (!D->isDefinition() || IsStructuralMatch(D, FoundDef)) {
3703d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor        // The record types structurally match, or the "from" translation
3704d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor        // unit only had a forward declaration anyway; call it the same
3705d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor        // function.
3706d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor        return Importer.Imported(D, FoundDef);
3707d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor      }
3708d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    }
3709d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  } else {
3710d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    // Create a new specialization.
3711d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    D2 = ClassTemplateSpecializationDecl::Create(Importer.getToContext(),
3712d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor                                                 D->getTagKind(), DC,
3713ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                                 StartLoc, IdLoc,
3714ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                                 ClassTemplate,
3715d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor                                                 TemplateArgs.data(),
3716d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor                                                 TemplateArgs.size(),
3717d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor                                                 /*PrevDecl=*/0);
3718d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    D2->setSpecializationKind(D->getSpecializationKind());
3719d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
3720d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    // Add this specialization to the class template.
3721d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    ClassTemplate->AddSpecialization(D2, InsertPos);
3722d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
3723d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    // Import the qualifier, if any.
3724c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor    D2->setQualifierInfo(Importer.Import(D->getQualifierLoc()));
3725d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
3726d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    // Add the specialization to this context.
3727d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    D2->setLexicalDeclContext(LexicalDC);
3728d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    LexicalDC->addDecl(D2);
3729d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  }
3730d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  Importer.Imported(D, D2);
3731d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
3732d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  if (D->isDefinition() && ImportDefinition(D, D2))
3733d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    return 0;
3734d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
3735d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  return D2;
3736d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor}
3737d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
37384800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor//----------------------------------------------------------------------------
37394800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor// Import Statements
37404800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor//----------------------------------------------------------------------------
37414800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor
37424800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas GregorStmt *ASTNodeImporter::VisitStmt(Stmt *S) {
37434800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor  Importer.FromDiag(S->getLocStart(), diag::err_unsupported_ast_node)
37444800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor    << S->getStmtClassName();
37454800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor  return 0;
37464800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor}
37474800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor
37484800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor//----------------------------------------------------------------------------
37494800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor// Import Expressions
37504800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor//----------------------------------------------------------------------------
37514800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas GregorExpr *ASTNodeImporter::VisitExpr(Expr *E) {
37524800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor  Importer.FromDiag(E->getLocStart(), diag::err_unsupported_ast_node)
37534800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor    << E->getStmtClassName();
37544800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor  return 0;
37554800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor}
37564800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor
3757440806306674e23ad74726208cbdc6f37849dd9dDouglas GregorExpr *ASTNodeImporter::VisitDeclRefExpr(DeclRefExpr *E) {
3758440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor  NestedNameSpecifier *Qualifier = 0;
3759440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor  if (E->getQualifier()) {
3760440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor    Qualifier = Importer.Import(E->getQualifier());
3761440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor    if (!E->getQualifier())
3762440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor      return 0;
3763440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor  }
3764440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor
3765440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor  ValueDecl *ToD = cast_or_null<ValueDecl>(Importer.Import(E->getDecl()));
3766440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor  if (!ToD)
3767440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor    return 0;
3768440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor
3769440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor  QualType T = Importer.Import(E->getType());
3770440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor  if (T.isNull())
3771440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor    return 0;
3772440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor
377340d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor  return DeclRefExpr::Create(Importer.getToContext(),
377440d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor                             Importer.Import(E->getQualifierLoc()),
3775440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor                             ToD,
3776440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor                             Importer.Import(E->getLocation()),
3777f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                             T, E->getValueKind(),
3778440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor                             /*FIXME:TemplateArgs=*/0);
3779440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor}
3780440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor
37814800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas GregorExpr *ASTNodeImporter::VisitIntegerLiteral(IntegerLiteral *E) {
37824800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor  QualType T = Importer.Import(E->getType());
37834800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor  if (T.isNull())
37844800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor    return 0;
37854800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor
37869996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  return IntegerLiteral::Create(Importer.getToContext(),
37879996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis                                E->getValue(), T,
37889996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis                                Importer.Import(E->getLocation()));
37894800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor}
37904800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor
3791b2e400aae8c62c4e1616016f40618baace0da065Douglas GregorExpr *ASTNodeImporter::VisitCharacterLiteral(CharacterLiteral *E) {
3792b2e400aae8c62c4e1616016f40618baace0da065Douglas Gregor  QualType T = Importer.Import(E->getType());
3793b2e400aae8c62c4e1616016f40618baace0da065Douglas Gregor  if (T.isNull())
3794b2e400aae8c62c4e1616016f40618baace0da065Douglas Gregor    return 0;
3795b2e400aae8c62c4e1616016f40618baace0da065Douglas Gregor
3796b2e400aae8c62c4e1616016f40618baace0da065Douglas Gregor  return new (Importer.getToContext()) CharacterLiteral(E->getValue(),
3797b2e400aae8c62c4e1616016f40618baace0da065Douglas Gregor                                                        E->isWide(), T,
3798b2e400aae8c62c4e1616016f40618baace0da065Douglas Gregor                                          Importer.Import(E->getLocation()));
3799b2e400aae8c62c4e1616016f40618baace0da065Douglas Gregor}
3800b2e400aae8c62c4e1616016f40618baace0da065Douglas Gregor
3801f638f9580ba0da99a66668f00e1a1d4987067bddDouglas GregorExpr *ASTNodeImporter::VisitParenExpr(ParenExpr *E) {
3802f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor  Expr *SubExpr = Importer.Import(E->getSubExpr());
3803f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor  if (!SubExpr)
3804f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor    return 0;
3805f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor
3806f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor  return new (Importer.getToContext())
3807f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor                                  ParenExpr(Importer.Import(E->getLParen()),
3808f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor                                            Importer.Import(E->getRParen()),
3809f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor                                            SubExpr);
3810f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor}
3811f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor
3812f638f9580ba0da99a66668f00e1a1d4987067bddDouglas GregorExpr *ASTNodeImporter::VisitUnaryOperator(UnaryOperator *E) {
3813f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor  QualType T = Importer.Import(E->getType());
3814f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor  if (T.isNull())
3815f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor    return 0;
3816f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor
3817f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor  Expr *SubExpr = Importer.Import(E->getSubExpr());
3818f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor  if (!SubExpr)
3819f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor    return 0;
3820f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor
3821f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor  return new (Importer.getToContext()) UnaryOperator(SubExpr, E->getOpcode(),
3822f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                                                     T, E->getValueKind(),
3823f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                                                     E->getObjectKind(),
3824f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor                                         Importer.Import(E->getOperatorLoc()));
3825f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor}
3826f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor
3827f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter CollingbourneExpr *ASTNodeImporter::VisitUnaryExprOrTypeTraitExpr(
3828f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne                                            UnaryExprOrTypeTraitExpr *E) {
3829bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor  QualType ResultType = Importer.Import(E->getType());
3830bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor
3831bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor  if (E->isArgumentType()) {
3832bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor    TypeSourceInfo *TInfo = Importer.Import(E->getArgumentTypeInfo());
3833bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor    if (!TInfo)
3834bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor      return 0;
3835bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor
3836f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne    return new (Importer.getToContext()) UnaryExprOrTypeTraitExpr(E->getKind(),
3837f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne                                           TInfo, ResultType,
3838bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor                                           Importer.Import(E->getOperatorLoc()),
3839bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor                                           Importer.Import(E->getRParenLoc()));
3840bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor  }
3841bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor
3842bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor  Expr *SubExpr = Importer.Import(E->getArgumentExpr());
3843bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor  if (!SubExpr)
3844bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor    return 0;
3845bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor
3846f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  return new (Importer.getToContext()) UnaryExprOrTypeTraitExpr(E->getKind(),
3847f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne                                          SubExpr, ResultType,
3848bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor                                          Importer.Import(E->getOperatorLoc()),
3849bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor                                          Importer.Import(E->getRParenLoc()));
3850bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor}
3851bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor
3852f638f9580ba0da99a66668f00e1a1d4987067bddDouglas GregorExpr *ASTNodeImporter::VisitBinaryOperator(BinaryOperator *E) {
3853f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor  QualType T = Importer.Import(E->getType());
3854f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor  if (T.isNull())
3855f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor    return 0;
3856f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor
3857f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor  Expr *LHS = Importer.Import(E->getLHS());
3858f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor  if (!LHS)
3859f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor    return 0;
3860f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor
3861f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor  Expr *RHS = Importer.Import(E->getRHS());
3862f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor  if (!RHS)
3863f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor    return 0;
3864f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor
3865f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor  return new (Importer.getToContext()) BinaryOperator(LHS, RHS, E->getOpcode(),
3866f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                                                      T, E->getValueKind(),
3867f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                                                      E->getObjectKind(),
3868f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor                                          Importer.Import(E->getOperatorLoc()));
3869f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor}
3870f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor
3871f638f9580ba0da99a66668f00e1a1d4987067bddDouglas GregorExpr *ASTNodeImporter::VisitCompoundAssignOperator(CompoundAssignOperator *E) {
3872f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor  QualType T = Importer.Import(E->getType());
3873f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor  if (T.isNull())
3874f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor    return 0;
3875f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor
3876f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor  QualType CompLHSType = Importer.Import(E->getComputationLHSType());
3877f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor  if (CompLHSType.isNull())
3878f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor    return 0;
3879f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor
3880f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor  QualType CompResultType = Importer.Import(E->getComputationResultType());
3881f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor  if (CompResultType.isNull())
3882f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor    return 0;
3883f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor
3884f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor  Expr *LHS = Importer.Import(E->getLHS());
3885f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor  if (!LHS)
3886f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor    return 0;
3887f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor
3888f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor  Expr *RHS = Importer.Import(E->getRHS());
3889f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor  if (!RHS)
3890f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor    return 0;
3891f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor
3892f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor  return new (Importer.getToContext())
3893f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor                        CompoundAssignOperator(LHS, RHS, E->getOpcode(),
3894f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                                               T, E->getValueKind(),
3895f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                                               E->getObjectKind(),
3896f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                                               CompLHSType, CompResultType,
3897f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor                                          Importer.Import(E->getOperatorLoc()));
3898f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor}
3899f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor
3900da57f3eeab7b7f7f6e6788956f0a0d9adf196a7dBenjamin Kramerstatic bool ImportCastPath(CastExpr *E, CXXCastPath &Path) {
3901f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  if (E->path_empty()) return false;
3902f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall
3903f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  // TODO: import cast paths
3904f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  return true;
3905f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall}
3906f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall
390736ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas GregorExpr *ASTNodeImporter::VisitImplicitCastExpr(ImplicitCastExpr *E) {
390836ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  QualType T = Importer.Import(E->getType());
390936ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  if (T.isNull())
391036ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor    return 0;
391136ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor
391236ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  Expr *SubExpr = Importer.Import(E->getSubExpr());
391336ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  if (!SubExpr)
391436ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor    return 0;
3915f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall
3916f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  CXXCastPath BasePath;
3917f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  if (ImportCastPath(E, BasePath))
3918f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall    return 0;
3919f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall
3920f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  return ImplicitCastExpr::Create(Importer.getToContext(), T, E->getCastKind(),
39215baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall                                  SubExpr, &BasePath, E->getValueKind());
392236ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor}
392336ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor
3924008847a70ab122a99911149199855060fb3753b4Douglas GregorExpr *ASTNodeImporter::VisitCStyleCastExpr(CStyleCastExpr *E) {
3925008847a70ab122a99911149199855060fb3753b4Douglas Gregor  QualType T = Importer.Import(E->getType());
3926008847a70ab122a99911149199855060fb3753b4Douglas Gregor  if (T.isNull())
3927008847a70ab122a99911149199855060fb3753b4Douglas Gregor    return 0;
3928008847a70ab122a99911149199855060fb3753b4Douglas Gregor
3929008847a70ab122a99911149199855060fb3753b4Douglas Gregor  Expr *SubExpr = Importer.Import(E->getSubExpr());
3930008847a70ab122a99911149199855060fb3753b4Douglas Gregor  if (!SubExpr)
3931008847a70ab122a99911149199855060fb3753b4Douglas Gregor    return 0;
3932008847a70ab122a99911149199855060fb3753b4Douglas Gregor
3933008847a70ab122a99911149199855060fb3753b4Douglas Gregor  TypeSourceInfo *TInfo = Importer.Import(E->getTypeInfoAsWritten());
3934008847a70ab122a99911149199855060fb3753b4Douglas Gregor  if (!TInfo && E->getTypeInfoAsWritten())
3935008847a70ab122a99911149199855060fb3753b4Douglas Gregor    return 0;
3936008847a70ab122a99911149199855060fb3753b4Douglas Gregor
3937f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  CXXCastPath BasePath;
3938f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  if (ImportCastPath(E, BasePath))
3939f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall    return 0;
3940f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall
3941f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall  return CStyleCastExpr::Create(Importer.getToContext(), T,
3942f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                                E->getValueKind(), E->getCastKind(),
3943f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall                                SubExpr, &BasePath, TInfo,
3944f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall                                Importer.Import(E->getLParenLoc()),
3945f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall                                Importer.Import(E->getRParenLoc()));
3946008847a70ab122a99911149199855060fb3753b4Douglas Gregor}
3947008847a70ab122a99911149199855060fb3753b4Douglas Gregor
394833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios KyrtzidisASTImporter::ASTImporter(ASTContext &ToContext, FileManager &ToFileManager,
3949d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor                         ASTContext &FromContext, FileManager &FromFileManager,
3950d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor                         bool MinimalImport)
39511b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  : ToContext(ToContext), FromContext(FromContext),
3952d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor    ToFileManager(ToFileManager), FromFileManager(FromFileManager),
3953d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor    Minimal(MinimalImport)
3954d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor{
39559bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor  ImportedDecls[FromContext.getTranslationUnitDecl()]
39569bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor    = ToContext.getTranslationUnitDecl();
39579bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor}
39589bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor
39599bed8798964d9f07599c2c9199701f86fbc70e20Douglas GregorASTImporter::~ASTImporter() { }
39601b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
39611b2949d27ec72894dec017c330c0548af4bb2476Douglas GregorQualType ASTImporter::Import(QualType FromT) {
39621b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  if (FromT.isNull())
39631b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return QualType();
3964f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall
3965f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  const Type *fromTy = FromT.getTypePtr();
39661b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
3967169fba50da76d71723cd1d91629cabb310f8bf9eDouglas Gregor  // Check whether we've already imported this type.
3968f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  llvm::DenseMap<const Type *, const Type *>::iterator Pos
3969f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall    = ImportedTypes.find(fromTy);
3970169fba50da76d71723cd1d91629cabb310f8bf9eDouglas Gregor  if (Pos != ImportedTypes.end())
3971f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall    return ToContext.getQualifiedType(Pos->second, FromT.getLocalQualifiers());
39721b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
3973169fba50da76d71723cd1d91629cabb310f8bf9eDouglas Gregor  // Import the type
39741b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  ASTNodeImporter Importer(*this);
3975f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  QualType ToT = Importer.Visit(fromTy);
39761b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  if (ToT.isNull())
39771b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return ToT;
39781b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
3979169fba50da76d71723cd1d91629cabb310f8bf9eDouglas Gregor  // Record the imported type.
3980f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  ImportedTypes[fromTy] = ToT.getTypePtr();
3981169fba50da76d71723cd1d91629cabb310f8bf9eDouglas Gregor
3982f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  return ToContext.getQualifiedType(ToT, FromT.getLocalQualifiers());
39831b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor}
39841b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
39859bed8798964d9f07599c2c9199701f86fbc70e20Douglas GregorTypeSourceInfo *ASTImporter::Import(TypeSourceInfo *FromTSI) {
398682fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor  if (!FromTSI)
398782fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor    return FromTSI;
398882fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor
398982fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor  // FIXME: For now we just create a "trivial" type source info based
39905606220447c7901ba8d80147ddab893bb7949dd5Nick Lewycky  // on the type and a single location. Implement a real version of this.
399182fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor  QualType T = Import(FromTSI->getType());
399282fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor  if (T.isNull())
399382fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor    return 0;
399482fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor
399582fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor  return ToContext.getTrivialTypeSourceInfo(T,
3996bd054dba8a3023821f2a0951b0fae05e3522a7c9Abramo Bagnara                        FromTSI->getTypeLoc().getSourceRange().getBegin());
39979bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor}
39989bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor
39999bed8798964d9f07599c2c9199701f86fbc70e20Douglas GregorDecl *ASTImporter::Import(Decl *FromD) {
40009bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor  if (!FromD)
40019bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor    return 0;
40029bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor
40039bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor  // Check whether we've already imported this declaration.
40049bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor  llvm::DenseMap<Decl *, Decl *>::iterator Pos = ImportedDecls.find(FromD);
40059bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor  if (Pos != ImportedDecls.end())
40069bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor    return Pos->second;
40079bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor
40089bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor  // Import the type
40099bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor  ASTNodeImporter Importer(*this);
40109bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor  Decl *ToD = Importer.Visit(FromD);
40119bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor  if (!ToD)
40129bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor    return 0;
40139bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor
40149bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor  // Record the imported declaration.
40159bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor  ImportedDecls[FromD] = ToD;
4016ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor
4017ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  if (TagDecl *FromTag = dyn_cast<TagDecl>(FromD)) {
4018ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor    // Keep track of anonymous tags that have an associated typedef.
4019162e1c1b487352434552147967c3dd296ebee2f7Richard Smith    if (FromTag->getTypedefNameForAnonDecl())
4020ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor      AnonTagsWithPendingTypedefs.push_back(FromTag);
4021162e1c1b487352434552147967c3dd296ebee2f7Richard Smith  } else if (TypedefNameDecl *FromTypedef = dyn_cast<TypedefNameDecl>(FromD)) {
4022ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor    // When we've finished transforming a typedef, see whether it was the
4023ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor    // typedef for an anonymous tag.
4024ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor    for (llvm::SmallVector<TagDecl *, 4>::iterator
4025ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor               FromTag = AnonTagsWithPendingTypedefs.begin(),
4026ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor            FromTagEnd = AnonTagsWithPendingTypedefs.end();
4027ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor         FromTag != FromTagEnd; ++FromTag) {
4028162e1c1b487352434552147967c3dd296ebee2f7Richard Smith      if ((*FromTag)->getTypedefNameForAnonDecl() == FromTypedef) {
4029ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor        if (TagDecl *ToTag = cast_or_null<TagDecl>(Import(*FromTag))) {
4030ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor          // We found the typedef for an anonymous tag; link them.
4031162e1c1b487352434552147967c3dd296ebee2f7Richard Smith          ToTag->setTypedefNameForAnonDecl(cast<TypedefNameDecl>(ToD));
4032ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor          AnonTagsWithPendingTypedefs.erase(FromTag);
4033ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor          break;
4034ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor        }
4035ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor      }
4036ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor    }
4037ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  }
4038ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor
40399bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor  return ToD;
40409bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor}
40419bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor
40429bed8798964d9f07599c2c9199701f86fbc70e20Douglas GregorDeclContext *ASTImporter::ImportContext(DeclContext *FromDC) {
40439bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor  if (!FromDC)
40449bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor    return FromDC;
40459bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor
40469bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor  return cast_or_null<DeclContext>(Import(cast<Decl>(FromDC)));
40479bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor}
40489bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor
40499bed8798964d9f07599c2c9199701f86fbc70e20Douglas GregorExpr *ASTImporter::Import(Expr *FromE) {
40509bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor  if (!FromE)
40519bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor    return 0;
40529bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor
40539bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor  return cast_or_null<Expr>(Import(cast<Stmt>(FromE)));
40549bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor}
40559bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor
40569bed8798964d9f07599c2c9199701f86fbc70e20Douglas GregorStmt *ASTImporter::Import(Stmt *FromS) {
40579bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor  if (!FromS)
40589bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor    return 0;
40599bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor
40604800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor  // Check whether we've already imported this declaration.
40614800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor  llvm::DenseMap<Stmt *, Stmt *>::iterator Pos = ImportedStmts.find(FromS);
40624800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor  if (Pos != ImportedStmts.end())
40634800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor    return Pos->second;
40644800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor
40654800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor  // Import the type
40664800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor  ASTNodeImporter Importer(*this);
40674800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor  Stmt *ToS = Importer.Visit(FromS);
40684800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor  if (!ToS)
40694800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor    return 0;
40704800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor
40714800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor  // Record the imported declaration.
40724800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor  ImportedStmts[FromS] = ToS;
40734800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor  return ToS;
40749bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor}
40759bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor
40769bed8798964d9f07599c2c9199701f86fbc70e20Douglas GregorNestedNameSpecifier *ASTImporter::Import(NestedNameSpecifier *FromNNS) {
40779bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor  if (!FromNNS)
40789bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor    return 0;
40799bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor
40809bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor  // FIXME: Implement!
40819bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor  return 0;
40829bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor}
40839bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor
4084c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas GregorNestedNameSpecifierLoc ASTImporter::Import(NestedNameSpecifierLoc FromNNS) {
4085c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  // FIXME: Implement!
4086c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  return NestedNameSpecifierLoc();
4087c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor}
4088c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor
4089d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas GregorTemplateName ASTImporter::Import(TemplateName From) {
4090d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  switch (From.getKind()) {
4091d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  case TemplateName::Template:
4092d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    if (TemplateDecl *ToTemplate
4093d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor                = cast_or_null<TemplateDecl>(Import(From.getAsTemplateDecl())))
4094d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor      return TemplateName(ToTemplate);
4095d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
4096d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    return TemplateName();
4097d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
4098d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  case TemplateName::OverloadedTemplate: {
4099d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    OverloadedTemplateStorage *FromStorage = From.getAsOverloadedTemplate();
4100d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    UnresolvedSet<2> ToTemplates;
4101d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    for (OverloadedTemplateStorage::iterator I = FromStorage->begin(),
4102d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor                                             E = FromStorage->end();
4103d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor         I != E; ++I) {
4104d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor      if (NamedDecl *To = cast_or_null<NamedDecl>(Import(*I)))
4105d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor        ToTemplates.addDecl(To);
4106d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor      else
4107d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor        return TemplateName();
4108d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    }
4109d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    return ToContext.getOverloadedTemplateName(ToTemplates.begin(),
4110d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor                                               ToTemplates.end());
4111d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  }
4112d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
4113d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  case TemplateName::QualifiedTemplate: {
4114d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    QualifiedTemplateName *QTN = From.getAsQualifiedTemplateName();
4115d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    NestedNameSpecifier *Qualifier = Import(QTN->getQualifier());
4116d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    if (!Qualifier)
4117d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor      return TemplateName();
4118d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
4119d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    if (TemplateDecl *ToTemplate
4120d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor        = cast_or_null<TemplateDecl>(Import(From.getAsTemplateDecl())))
4121d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor      return ToContext.getQualifiedTemplateName(Qualifier,
4122d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor                                                QTN->hasTemplateKeyword(),
4123d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor                                                ToTemplate);
4124d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
4125d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    return TemplateName();
4126d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  }
4127d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
4128d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  case TemplateName::DependentTemplate: {
4129d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    DependentTemplateName *DTN = From.getAsDependentTemplateName();
4130d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    NestedNameSpecifier *Qualifier = Import(DTN->getQualifier());
4131d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    if (!Qualifier)
4132d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor      return TemplateName();
4133d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
4134d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    if (DTN->isIdentifier()) {
4135d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor      return ToContext.getDependentTemplateName(Qualifier,
4136d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor                                                Import(DTN->getIdentifier()));
4137d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    }
4138d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
4139d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor    return ToContext.getDependentTemplateName(Qualifier, DTN->getOperator());
4140d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  }
41411aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
41421aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  case TemplateName::SubstTemplateTemplateParmPack: {
41431aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    SubstTemplateTemplateParmPackStorage *SubstPack
41441aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor      = From.getAsSubstTemplateTemplateParmPack();
41451aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    TemplateTemplateParmDecl *Param
41461aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor      = cast_or_null<TemplateTemplateParmDecl>(
41471aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor                                        Import(SubstPack->getParameterPack()));
41481aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    if (!Param)
41491aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor      return TemplateName();
41501aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
41511aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    ASTNodeImporter Importer(*this);
41521aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    TemplateArgument ArgPack
41531aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor      = Importer.ImportTemplateArgument(SubstPack->getArgumentPack());
41541aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    if (ArgPack.isNull())
41551aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor      return TemplateName();
41561aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
41571aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    return ToContext.getSubstTemplateTemplateParmPack(Param, ArgPack);
41581aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  }
4159d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  }
4160d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
4161d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  llvm_unreachable("Invalid template name kind");
4162d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor  return TemplateName();
4163d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor}
4164d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas Gregor
41659bed8798964d9f07599c2c9199701f86fbc70e20Douglas GregorSourceLocation ASTImporter::Import(SourceLocation FromLoc) {
41669bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor  if (FromLoc.isInvalid())
41679bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor    return SourceLocation();
41689bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor
4169885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor  SourceManager &FromSM = FromContext.getSourceManager();
4170885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor
4171885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor  // For now, map everything down to its spelling location, so that we
4172885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor  // don't have to import macro instantiations.
4173885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor  // FIXME: Import macro instantiations!
4174885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor  FromLoc = FromSM.getSpellingLoc(FromLoc);
4175885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor  std::pair<FileID, unsigned> Decomposed = FromSM.getDecomposedLoc(FromLoc);
4176885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor  SourceManager &ToSM = ToContext.getSourceManager();
4177885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor  return ToSM.getLocForStartOfFile(Import(Decomposed.first))
4178885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor             .getFileLocWithOffset(Decomposed.second);
41799bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor}
41809bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor
41819bed8798964d9f07599c2c9199701f86fbc70e20Douglas GregorSourceRange ASTImporter::Import(SourceRange FromRange) {
41829bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor  return SourceRange(Import(FromRange.getBegin()), Import(FromRange.getEnd()));
41839bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor}
41849bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor
4185885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas GregorFileID ASTImporter::Import(FileID FromID) {
4186535a3e20104461c136654d59fb833ae80644ae79Sebastian Redl  llvm::DenseMap<FileID, FileID>::iterator Pos
4187535a3e20104461c136654d59fb833ae80644ae79Sebastian Redl    = ImportedFileIDs.find(FromID);
4188885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor  if (Pos != ImportedFileIDs.end())
4189885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor    return Pos->second;
4190885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor
4191885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor  SourceManager &FromSM = FromContext.getSourceManager();
4192885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor  SourceManager &ToSM = ToContext.getSourceManager();
4193885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor  const SrcMgr::SLocEntry &FromSLoc = FromSM.getSLocEntry(FromID);
4194885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor  assert(FromSLoc.isFile() && "Cannot handle macro instantiations yet");
4195885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor
4196885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor  // Include location of this file.
4197885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor  SourceLocation ToIncludeLoc = Import(FromSLoc.getFile().getIncludeLoc());
4198885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor
4199885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor  // Map the FileID for to the "to" source manager.
4200885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor  FileID ToID;
4201885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor  const SrcMgr::ContentCache *Cache = FromSLoc.getFile().getContentCache();
4202b1c86492f9a9bef01a4567408c22f961bbd604feArgyrios Kyrtzidis  if (Cache->OrigEntry) {
4203885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor    // FIXME: We probably want to use getVirtualFile(), so we don't hit the
4204885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor    // disk again
4205885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor    // FIXME: We definitely want to re-use the existing MemoryBuffer, rather
4206885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor    // than mmap the files several times.
4207b1c86492f9a9bef01a4567408c22f961bbd604feArgyrios Kyrtzidis    const FileEntry *Entry = ToFileManager.getFile(Cache->OrigEntry->getName());
4208885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor    ToID = ToSM.createFileID(Entry, ToIncludeLoc,
4209885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor                             FromSLoc.getFile().getFileCharacteristic());
4210885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor  } else {
4211885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor    // FIXME: We want to re-use the existing MemoryBuffer!
421233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    const llvm::MemoryBuffer *
421333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis        FromBuf = Cache->getBuffer(FromContext.getDiagnostics(), FromSM);
4214885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor    llvm::MemoryBuffer *ToBuf
4215a0a270c0f1c0a4e3482438bdc5f4a7bd3d25f0a6Chris Lattner      = llvm::MemoryBuffer::getMemBufferCopy(FromBuf->getBuffer(),
4216885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor                                             FromBuf->getBufferIdentifier());
4217885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor    ToID = ToSM.createFileIDForMemBuffer(ToBuf);
4218885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor  }
4219885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor
4220885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor
4221535a3e20104461c136654d59fb833ae80644ae79Sebastian Redl  ImportedFileIDs[FromID] = ToID;
4222885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor  return ToID;
4223885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor}
4224885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor
4225d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregorvoid ASTImporter::ImportDefinition(Decl *From) {
4226d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor  Decl *To = Import(From);
4227d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor  if (!To)
4228d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor    return;
4229d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor
4230d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor  if (DeclContext *FromDC = cast<DeclContext>(From)) {
4231d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor    ASTNodeImporter Importer(*this);
4232d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor    Importer.ImportDeclContext(FromDC, true);
4233d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor  }
4234d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor}
4235d8868a634d4fd362243dc646e58c3cf956c81dcdDouglas Gregor
42361b2949d27ec72894dec017c330c0548af4bb2476Douglas GregorDeclarationName ASTImporter::Import(DeclarationName FromName) {
42371b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  if (!FromName)
42381b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return DeclarationName();
42391b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
42401b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  switch (FromName.getNameKind()) {
42411b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case DeclarationName::Identifier:
42421b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return Import(FromName.getAsIdentifierInfo());
42431b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
42441b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case DeclarationName::ObjCZeroArgSelector:
42451b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case DeclarationName::ObjCOneArgSelector:
42461b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case DeclarationName::ObjCMultiArgSelector:
42471b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return Import(FromName.getObjCSelector());
42481b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
42491b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case DeclarationName::CXXConstructorName: {
42501b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    QualType T = Import(FromName.getCXXNameType());
42511b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    if (T.isNull())
42521b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor      return DeclarationName();
42531b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
42541b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return ToContext.DeclarationNames.getCXXConstructorName(
42551b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor                                               ToContext.getCanonicalType(T));
42561b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  }
42571b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
42581b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case DeclarationName::CXXDestructorName: {
42591b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    QualType T = Import(FromName.getCXXNameType());
42601b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    if (T.isNull())
42611b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor      return DeclarationName();
42621b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
42631b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return ToContext.DeclarationNames.getCXXDestructorName(
42641b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor                                               ToContext.getCanonicalType(T));
42651b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  }
42661b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
42671b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case DeclarationName::CXXConversionFunctionName: {
42681b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    QualType T = Import(FromName.getCXXNameType());
42691b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    if (T.isNull())
42701b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor      return DeclarationName();
42711b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
42721b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return ToContext.DeclarationNames.getCXXConversionFunctionName(
42731b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor                                               ToContext.getCanonicalType(T));
42741b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  }
42751b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
42761b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case DeclarationName::CXXOperatorName:
42771b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return ToContext.DeclarationNames.getCXXOperatorName(
42781b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor                                          FromName.getCXXOverloadedOperator());
42791b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
42801b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case DeclarationName::CXXLiteralOperatorName:
42811b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return ToContext.DeclarationNames.getCXXLiteralOperatorName(
42821b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor                                   Import(FromName.getCXXLiteralIdentifier()));
42831b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
42841b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case DeclarationName::CXXUsingDirective:
42851b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    // FIXME: STATICS!
42861b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return DeclarationName::getUsingDirectiveName();
42871b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  }
42881b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
42891b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  // Silence bogus GCC warning
42901b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  return DeclarationName();
42911b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor}
42921b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
4293d5dc83a85c1b9aa32f8262126183df5d71c357aeDouglas GregorIdentifierInfo *ASTImporter::Import(const IdentifierInfo *FromId) {
42941b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  if (!FromId)
42951b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return 0;
42961b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
42971b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  return &ToContext.Idents.get(FromId->getName());
42981b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor}
4299089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor
4300c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas GregorSelector ASTImporter::Import(Selector FromSel) {
4301c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  if (FromSel.isNull())
4302c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor    return Selector();
4303c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor
4304c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  llvm::SmallVector<IdentifierInfo *, 4> Idents;
4305c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  Idents.push_back(Import(FromSel.getIdentifierInfoForSlot(0)));
4306c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  for (unsigned I = 1, N = FromSel.getNumArgs(); I < N; ++I)
4307c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor    Idents.push_back(Import(FromSel.getIdentifierInfoForSlot(I)));
4308c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  return ToContext.Selectors.getSelector(FromSel.getNumArgs(), Idents.data());
4309c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor}
4310c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor
4311089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas GregorDeclarationName ASTImporter::HandleNameConflict(DeclarationName Name,
4312089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor                                                DeclContext *DC,
4313089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor                                                unsigned IDNS,
4314089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor                                                NamedDecl **Decls,
4315089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor                                                unsigned NumDecls) {
4316089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor  return Name;
4317089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor}
4318089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor
4319089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas GregorDiagnosticBuilder ASTImporter::ToDiag(SourceLocation Loc, unsigned DiagID) {
432033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  return ToContext.getDiagnostics().Report(Loc, DiagID);
4321089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor}
4322089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor
4323089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas GregorDiagnosticBuilder ASTImporter::FromDiag(SourceLocation Loc, unsigned DiagID) {
432433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  return FromContext.getDiagnostics().Report(Loc, DiagID);
4325089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor}
43265ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor
43275ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas GregorDecl *ASTImporter::Imported(Decl *From, Decl *To) {
43285ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor  ImportedDecls[From] = To;
43295ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor  return To;
4330af667588d53de22795c5304f1496ccaac2a71402Daniel Dunbar}
4331ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor
4332ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregorbool ASTImporter::IsStructurallyEquivalent(QualType From, QualType To) {
4333f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  llvm::DenseMap<const Type *, const Type *>::iterator Pos
4334ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor   = ImportedTypes.find(From.getTypePtr());
4335ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  if (Pos != ImportedTypes.end() && ToContext.hasSameType(Import(From), To))
4336ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor    return true;
4337ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor
433833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  StructuralEquivalenceContext Ctx(FromContext, ToContext, NonEquivalentDecls);
4339bb2d176c4f434e9e73f63f2f9d128f63ce3e10d0Benjamin Kramer  return Ctx.IsStructurallyEquivalent(From, To);
4340ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor}
4341