ASTImporter.cpp revision 16573fa9705b546b7597c273b25b85d6321e2b33
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"
2282fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor#include "clang/AST/TypeLoc.h"
231b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor#include "clang/AST/TypeVisitor.h"
24885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor#include "clang/Basic/FileManager.h"
25885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor#include "clang/Basic/SourceManager.h"
26885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor#include "llvm/Support/MemoryBuffer.h"
2773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor#include <deque>
281b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
291b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregorusing namespace clang;
301b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
311b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregornamespace {
32089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor  class ASTNodeImporter : public TypeVisitor<ASTNodeImporter, QualType>,
334800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor                          public DeclVisitor<ASTNodeImporter, Decl *>,
344800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor                          public StmtVisitor<ASTNodeImporter, Stmt *> {
351b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    ASTImporter &Importer;
361b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
371b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  public:
381b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    explicit ASTNodeImporter(ASTImporter &Importer) : Importer(Importer) { }
391b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
401b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    using TypeVisitor<ASTNodeImporter, QualType>::Visit;
419bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor    using DeclVisitor<ASTNodeImporter, Decl *>::Visit;
424800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor    using StmtVisitor<ASTNodeImporter, Stmt *>::Visit;
431b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
441b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    // Importing types
4589cc9d6e2aaf794fbd2c228a3755c19062ca0ba0Douglas Gregor    QualType VisitType(Type *T);
461b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    QualType VisitBuiltinType(BuiltinType *T);
471b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    QualType VisitComplexType(ComplexType *T);
481b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    QualType VisitPointerType(PointerType *T);
491b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    QualType VisitBlockPointerType(BlockPointerType *T);
501b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    QualType VisitLValueReferenceType(LValueReferenceType *T);
511b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    QualType VisitRValueReferenceType(RValueReferenceType *T);
521b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    QualType VisitMemberPointerType(MemberPointerType *T);
531b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    QualType VisitConstantArrayType(ConstantArrayType *T);
541b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    QualType VisitIncompleteArrayType(IncompleteArrayType *T);
551b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    QualType VisitVariableArrayType(VariableArrayType *T);
561b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    // FIXME: DependentSizedArrayType
571b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    // FIXME: DependentSizedExtVectorType
581b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    QualType VisitVectorType(VectorType *T);
591b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    QualType VisitExtVectorType(ExtVectorType *T);
601b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    QualType VisitFunctionNoProtoType(FunctionNoProtoType *T);
611b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    QualType VisitFunctionProtoType(FunctionProtoType *T);
621b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    // FIXME: UnresolvedUsingType
631b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    QualType VisitTypedefType(TypedefType *T);
641b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    QualType VisitTypeOfExprType(TypeOfExprType *T);
651b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    // FIXME: DependentTypeOfExprType
661b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    QualType VisitTypeOfType(TypeOfType *T);
671b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    QualType VisitDecltypeType(DecltypeType *T);
681b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    // FIXME: DependentDecltypeType
691b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    QualType VisitRecordType(RecordType *T);
701b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    QualType VisitEnumType(EnumType *T);
711b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    QualType VisitElaboratedType(ElaboratedType *T);
721b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    // FIXME: TemplateTypeParmType
731b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    // FIXME: SubstTemplateTypeParmType
741b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    // FIXME: TemplateSpecializationType
751b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    QualType VisitQualifiedNameType(QualifiedNameType *T);
764714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor    // FIXME: DependentNameType
771b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    QualType VisitObjCInterfaceType(ObjCInterfaceType *T);
781b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    QualType VisitObjCObjectPointerType(ObjCObjectPointerType *T);
79089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor
80089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor    // Importing declarations
81a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor    bool ImportDeclParts(NamedDecl *D, DeclContext *&DC,
82a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor                         DeclContext *&LexicalDC, DeclarationName &Name,
83788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor                         SourceLocation &Loc);
84083a821bbd02bbc521275a2f144abe39a6c2745cDouglas Gregor    void ImportDeclContext(DeclContext *FromDC);
8596a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor    bool IsStructuralMatch(RecordDecl *FromRecord, RecordDecl *ToRecord);
8673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    bool IsStructuralMatch(EnumDecl *FromEnum, EnumDecl *ToRecord);
8789cc9d6e2aaf794fbd2c228a3755c19062ca0ba0Douglas Gregor    Decl *VisitDecl(Decl *D);
88788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor    Decl *VisitNamespaceDecl(NamespaceDecl *D);
899e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor    Decl *VisitTypedefDecl(TypedefDecl *D);
9036ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor    Decl *VisitEnumDecl(EnumDecl *D);
9196a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor    Decl *VisitRecordDecl(RecordDecl *D);
9236ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor    Decl *VisitEnumConstantDecl(EnumConstantDecl *D);
93a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor    Decl *VisitFunctionDecl(FunctionDecl *D);
94c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor    Decl *VisitCXXMethodDecl(CXXMethodDecl *D);
95c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor    Decl *VisitCXXConstructorDecl(CXXConstructorDecl *D);
96c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor    Decl *VisitCXXDestructorDecl(CXXDestructorDecl *D);
97c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor    Decl *VisitCXXConversionDecl(CXXConversionDecl *D);
9896a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor    Decl *VisitFieldDecl(FieldDecl *D);
992e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor    Decl *VisitObjCIvarDecl(ObjCIvarDecl *D);
100089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor    Decl *VisitVarDecl(VarDecl *D);
1012cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor    Decl *VisitImplicitParamDecl(ImplicitParamDecl *D);
102a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor    Decl *VisitParmVarDecl(ParmVarDecl *D);
103c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor    Decl *VisitObjCMethodDecl(ObjCMethodDecl *D);
104b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor    Decl *VisitObjCCategoryDecl(ObjCCategoryDecl *D);
1052e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor    Decl *VisitObjCProtocolDecl(ObjCProtocolDecl *D);
106a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor    Decl *VisitObjCInterfaceDecl(ObjCInterfaceDecl *D);
107e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor    Decl *VisitObjCPropertyDecl(ObjCPropertyDecl *D);
1082b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor    Decl *VisitObjCForwardProtocolDecl(ObjCForwardProtocolDecl *D);
109a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor    Decl *VisitObjCClassDecl(ObjCClassDecl *D);
110a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor
1114800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor    // Importing statements
1124800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor    Stmt *VisitStmt(Stmt *S);
1134800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor
1144800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor    // Importing expressions
1154800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor    Expr *VisitExpr(Expr *E);
116440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor    Expr *VisitDeclRefExpr(DeclRefExpr *E);
1174800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor    Expr *VisitIntegerLiteral(IntegerLiteral *E);
118b2e400aae8c62c4e1616016f40618baace0da065Douglas Gregor    Expr *VisitCharacterLiteral(CharacterLiteral *E);
119f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor    Expr *VisitParenExpr(ParenExpr *E);
120f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor    Expr *VisitUnaryOperator(UnaryOperator *E);
121bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor    Expr *VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E);
122f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor    Expr *VisitBinaryOperator(BinaryOperator *E);
123f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor    Expr *VisitCompoundAssignOperator(CompoundAssignOperator *E);
12436ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor    Expr *VisitImplicitCastExpr(ImplicitCastExpr *E);
125008847a70ab122a99911149199855060fb3753b4Douglas Gregor    Expr *VisitCStyleCastExpr(CStyleCastExpr *E);
1261b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  };
1271b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor}
1281b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
1291b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor//----------------------------------------------------------------------------
13073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor// Structural Equivalence
13173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor//----------------------------------------------------------------------------
13273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
13373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregornamespace {
13473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  struct StructuralEquivalenceContext {
13573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    /// \brief AST contexts for which we are checking structural equivalence.
13673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    ASTContext &C1, &C2;
13773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
13873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    /// \brief Diagnostic object used to emit diagnostics.
13973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    Diagnostic &Diags;
14073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
14173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    /// \brief The set of "tentative" equivalences between two canonical
14273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    /// declarations, mapping from a declaration in the first context to the
14373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    /// declaration in the second context that we believe to be equivalent.
14473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    llvm::DenseMap<Decl *, Decl *> TentativeEquivalences;
14573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
14673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    /// \brief Queue of declarations in the first context whose equivalence
14773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    /// with a declaration in the second context still needs to be verified.
14873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    std::deque<Decl *> DeclsToCheck;
14973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
150ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor    /// \brief Declaration (from, to) pairs that are known not to be equivalent
151ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor    /// (which we have already complained about).
152ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor    llvm::DenseSet<std::pair<Decl *, Decl *> > &NonEquivalentDecls;
153ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor
15473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    /// \brief Whether we're being strict about the spelling of types when
15573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    /// unifying two types.
15673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    bool StrictTypeSpelling;
15773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
15873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    StructuralEquivalenceContext(ASTContext &C1, ASTContext &C2,
15973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                 Diagnostic &Diags,
160ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor               llvm::DenseSet<std::pair<Decl *, Decl *> > &NonEquivalentDecls,
16173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                 bool StrictTypeSpelling = false)
162ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor      : C1(C1), C2(C2), Diags(Diags), NonEquivalentDecls(NonEquivalentDecls),
163ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor        StrictTypeSpelling(StrictTypeSpelling) { }
16473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
16573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    /// \brief Determine whether the two declarations are structurally
16673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    /// equivalent.
16773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    bool IsStructurallyEquivalent(Decl *D1, Decl *D2);
16873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
16973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    /// \brief Determine whether the two types are structurally equivalent.
17073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    bool IsStructurallyEquivalent(QualType T1, QualType T2);
17173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
17273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  private:
17373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    /// \brief Finish checking all of the structural equivalences.
17473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    ///
17573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    /// \returns true if an error occurred, false otherwise.
17673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    bool Finish();
17773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
17873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  public:
17973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    DiagnosticBuilder Diag1(SourceLocation Loc, unsigned DiagID) {
18073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return Diags.Report(FullSourceLoc(Loc, C1.getSourceManager()), DiagID);
18173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    }
18273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
18373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    DiagnosticBuilder Diag2(SourceLocation Loc, unsigned DiagID) {
18473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return Diags.Report(FullSourceLoc(Loc, C2.getSourceManager()), DiagID);
18573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    }
18673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  };
18773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor}
18873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
18973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
19073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                     QualType T1, QualType T2);
19173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
19273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                     Decl *D1, Decl *D2);
19373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
19473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// \brief Determine if two APInts have the same value, after zero-extending
19573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// one of them (if needed!) to ensure that the bit-widths match.
19673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsSameValue(const llvm::APInt &I1, const llvm::APInt &I2) {
19773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  if (I1.getBitWidth() == I2.getBitWidth())
19873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    return I1 == I2;
19973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
20073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  if (I1.getBitWidth() > I2.getBitWidth())
20173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    return I1 == llvm::APInt(I2).zext(I1.getBitWidth());
20273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
20373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  return llvm::APInt(I1).zext(I2.getBitWidth()) == I2;
20473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor}
20573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
20673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// \brief Determine if two APSInts have the same value, zero- or sign-extending
20773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// as needed.
20873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsSameValue(const llvm::APSInt &I1, const llvm::APSInt &I2) {
20973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  if (I1.getBitWidth() == I2.getBitWidth() && I1.isSigned() == I2.isSigned())
21073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    return I1 == I2;
21173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
21273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  // Check for a bit-width mismatch.
21373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  if (I1.getBitWidth() > I2.getBitWidth())
21473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    return IsSameValue(I1, llvm::APSInt(I2).extend(I1.getBitWidth()));
21573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  else if (I2.getBitWidth() > I1.getBitWidth())
21673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    return IsSameValue(llvm::APSInt(I1).extend(I2.getBitWidth()), I2);
21773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
21873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  // We have a signedness mismatch. Turn the signed value into an unsigned
21973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  // value.
22073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  if (I1.isSigned()) {
22173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (I1.isNegative())
22273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
22373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
22473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    return llvm::APSInt(I1, true) == I2;
22573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  }
22673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
22773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  if (I2.isNegative())
22873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    return false;
22973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
23073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  return I1 == llvm::APSInt(I2, true);
23173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor}
23273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
23373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// \brief Determine structural equivalence of two expressions.
23473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
23573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                     Expr *E1, Expr *E2) {
23673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  if (!E1 || !E2)
23773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    return E1 == E2;
23873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
23973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  // FIXME: Actually perform a structural comparison!
24073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  return true;
24173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor}
24273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
24373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// \brief Determine whether two identifiers are equivalent.
24473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsStructurallyEquivalent(const IdentifierInfo *Name1,
24573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                     const IdentifierInfo *Name2) {
24673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  if (!Name1 || !Name2)
24773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    return Name1 == Name2;
24873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
24973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  return Name1->getName() == Name2->getName();
25073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor}
25173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
25273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// \brief Determine whether two nested-name-specifiers are equivalent.
25373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
25473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                     NestedNameSpecifier *NNS1,
25573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                     NestedNameSpecifier *NNS2) {
25673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  // FIXME: Implement!
25773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  return true;
25873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor}
25973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
26073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// \brief Determine whether two template arguments are equivalent.
26173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
26273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                     const TemplateArgument &Arg1,
26373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                     const TemplateArgument &Arg2) {
26473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  // FIXME: Implement!
26573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  return true;
26673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor}
26773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
26873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// \brief Determine structural equivalence for the common part of array
26973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// types.
27073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsArrayStructurallyEquivalent(StructuralEquivalenceContext &Context,
27173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                          const ArrayType *Array1,
27273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                          const ArrayType *Array2) {
27373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  if (!IsStructurallyEquivalent(Context,
27473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                Array1->getElementType(),
27573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                Array2->getElementType()))
27673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    return false;
27773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  if (Array1->getSizeModifier() != Array2->getSizeModifier())
27873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    return false;
27973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  if (Array1->getIndexTypeQualifiers() != Array2->getIndexTypeQualifiers())
28073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    return false;
28173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
28273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  return true;
28373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor}
28473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
28573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// \brief Determine structural equivalence of two types.
28673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
28773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                     QualType T1, QualType T2) {
28873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  if (T1.isNull() || T2.isNull())
28973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    return T1.isNull() && T2.isNull();
29073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
29173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  if (!Context.StrictTypeSpelling) {
29273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    // We aren't being strict about token-to-token equivalence of types,
29373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    // so map down to the canonical type.
29473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    T1 = Context.C1.getCanonicalType(T1);
29573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    T2 = Context.C2.getCanonicalType(T2);
29673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  }
29773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
29873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  if (T1.getQualifiers() != T2.getQualifiers())
29973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    return false;
30073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
301ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  Type::TypeClass TC = T1->getTypeClass();
302ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor
303ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  if (T1->getTypeClass() != T2->getTypeClass()) {
304ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor    // Compare function types with prototypes vs. without prototypes as if
305ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor    // both did not have prototypes.
306ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor    if (T1->getTypeClass() == Type::FunctionProto &&
307ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor        T2->getTypeClass() == Type::FunctionNoProto)
308ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor      TC = Type::FunctionNoProto;
309ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor    else if (T1->getTypeClass() == Type::FunctionNoProto &&
310ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor             T2->getTypeClass() == Type::FunctionProto)
311ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor      TC = Type::FunctionNoProto;
312ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor    else
313ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor      return false;
314ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  }
31573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
316ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  switch (TC) {
317ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  case Type::Builtin:
31873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    // FIXME: Deal with Char_S/Char_U.
31973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (cast<BuiltinType>(T1)->getKind() != cast<BuiltinType>(T2)->getKind())
32073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
32173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    break;
32273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
32373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  case Type::Complex:
32473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsStructurallyEquivalent(Context,
32573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  cast<ComplexType>(T1)->getElementType(),
32673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  cast<ComplexType>(T2)->getElementType()))
32773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
32873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    break;
32973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
33073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  case Type::Pointer:
33173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsStructurallyEquivalent(Context,
33273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  cast<PointerType>(T1)->getPointeeType(),
33373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  cast<PointerType>(T2)->getPointeeType()))
33473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
33573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    break;
33673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
33773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  case Type::BlockPointer:
33873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsStructurallyEquivalent(Context,
33973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  cast<BlockPointerType>(T1)->getPointeeType(),
34073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  cast<BlockPointerType>(T2)->getPointeeType()))
34173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
34273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    break;
34373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
34473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  case Type::LValueReference:
34573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  case Type::RValueReference: {
34673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const ReferenceType *Ref1 = cast<ReferenceType>(T1);
34773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const ReferenceType *Ref2 = cast<ReferenceType>(T2);
34873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (Ref1->isSpelledAsLValue() != Ref2->isSpelledAsLValue())
34973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
35073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (Ref1->isInnerRef() != Ref2->isInnerRef())
35173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
35273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsStructurallyEquivalent(Context,
35373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  Ref1->getPointeeTypeAsWritten(),
35473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  Ref2->getPointeeTypeAsWritten()))
35573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
35673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    break;
35773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  }
35873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
35973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  case Type::MemberPointer: {
36073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const MemberPointerType *MemPtr1 = cast<MemberPointerType>(T1);
36173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const MemberPointerType *MemPtr2 = cast<MemberPointerType>(T2);
36273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsStructurallyEquivalent(Context,
36373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  MemPtr1->getPointeeType(),
36473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  MemPtr2->getPointeeType()))
36573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
36673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsStructurallyEquivalent(Context,
36773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  QualType(MemPtr1->getClass(), 0),
36873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  QualType(MemPtr2->getClass(), 0)))
36973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
37073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    break;
37173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  }
37273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
37373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  case Type::ConstantArray: {
37473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const ConstantArrayType *Array1 = cast<ConstantArrayType>(T1);
37573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const ConstantArrayType *Array2 = cast<ConstantArrayType>(T2);
37673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsSameValue(Array1->getSize(), Array2->getSize()))
37773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
37873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
37973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsArrayStructurallyEquivalent(Context, Array1, Array2))
38073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
38173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    break;
38273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  }
38373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
38473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  case Type::IncompleteArray:
38573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsArrayStructurallyEquivalent(Context,
38673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                       cast<ArrayType>(T1),
38773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                       cast<ArrayType>(T2)))
38873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
38973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    break;
39073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
39173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  case Type::VariableArray: {
39273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const VariableArrayType *Array1 = cast<VariableArrayType>(T1);
39373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const VariableArrayType *Array2 = cast<VariableArrayType>(T2);
39473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsStructurallyEquivalent(Context,
39573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  Array1->getSizeExpr(), Array2->getSizeExpr()))
39673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
39773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
39873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsArrayStructurallyEquivalent(Context, Array1, Array2))
39973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
40073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
40173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    break;
40273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  }
40373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
40473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  case Type::DependentSizedArray: {
40573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const DependentSizedArrayType *Array1 = cast<DependentSizedArrayType>(T1);
40673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const DependentSizedArrayType *Array2 = cast<DependentSizedArrayType>(T2);
40773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsStructurallyEquivalent(Context,
40873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  Array1->getSizeExpr(), Array2->getSizeExpr()))
40973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
41073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
41173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsArrayStructurallyEquivalent(Context, Array1, Array2))
41273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
41373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
41473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    break;
41573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  }
41673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
41773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  case Type::DependentSizedExtVector: {
41873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const DependentSizedExtVectorType *Vec1
41973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      = cast<DependentSizedExtVectorType>(T1);
42073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const DependentSizedExtVectorType *Vec2
42173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      = cast<DependentSizedExtVectorType>(T2);
42273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsStructurallyEquivalent(Context,
42373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  Vec1->getSizeExpr(), Vec2->getSizeExpr()))
42473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
42573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsStructurallyEquivalent(Context,
42673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  Vec1->getElementType(),
42773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  Vec2->getElementType()))
42873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
42973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    break;
43073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  }
43173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
43273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  case Type::Vector:
43373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  case Type::ExtVector: {
43473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const VectorType *Vec1 = cast<VectorType>(T1);
43573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const VectorType *Vec2 = cast<VectorType>(T2);
43673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsStructurallyEquivalent(Context,
43773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  Vec1->getElementType(),
43873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  Vec2->getElementType()))
43973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
44073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (Vec1->getNumElements() != Vec2->getNumElements())
44173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
44273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (Vec1->isAltiVec() != Vec2->isAltiVec())
44373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
44473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (Vec1->isPixel() != Vec2->isPixel())
44573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
4460e12b44081c6395a6d60a05a85a6012f7bb23b16Douglas Gregor    break;
44773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  }
44873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
44973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  case Type::FunctionProto: {
45073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const FunctionProtoType *Proto1 = cast<FunctionProtoType>(T1);
45173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const FunctionProtoType *Proto2 = cast<FunctionProtoType>(T2);
45273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (Proto1->getNumArgs() != Proto2->getNumArgs())
45373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
45473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    for (unsigned I = 0, N = Proto1->getNumArgs(); I != N; ++I) {
45573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      if (!IsStructurallyEquivalent(Context,
45673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                    Proto1->getArgType(I),
45773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                    Proto2->getArgType(I)))
45873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        return false;
45973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    }
46073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (Proto1->isVariadic() != Proto2->isVariadic())
46173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
46273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (Proto1->hasExceptionSpec() != Proto2->hasExceptionSpec())
46373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
46473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (Proto1->hasAnyExceptionSpec() != Proto2->hasAnyExceptionSpec())
46573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
46673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (Proto1->getNumExceptions() != Proto2->getNumExceptions())
46773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
46873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    for (unsigned I = 0, N = Proto1->getNumExceptions(); I != N; ++I) {
46973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      if (!IsStructurallyEquivalent(Context,
47073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                    Proto1->getExceptionType(I),
47173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                    Proto2->getExceptionType(I)))
47273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        return false;
47373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    }
47473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (Proto1->getTypeQuals() != Proto2->getTypeQuals())
47573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
47673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
47773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    // Fall through to check the bits common with FunctionNoProtoType.
47873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  }
47973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
48073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  case Type::FunctionNoProto: {
48173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const FunctionType *Function1 = cast<FunctionType>(T1);
48273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const FunctionType *Function2 = cast<FunctionType>(T2);
48373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsStructurallyEquivalent(Context,
48473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  Function1->getResultType(),
48573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  Function2->getResultType()))
48673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
487264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola      if (Function1->getExtInfo() != Function2->getExtInfo())
488264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola        return false;
48973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    break;
49073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  }
49173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
49273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  case Type::UnresolvedUsing:
49373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsStructurallyEquivalent(Context,
49473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  cast<UnresolvedUsingType>(T1)->getDecl(),
49573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  cast<UnresolvedUsingType>(T2)->getDecl()))
49673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
49773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
49873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    break;
49973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
50073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  case Type::Typedef:
50173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsStructurallyEquivalent(Context,
50273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  cast<TypedefType>(T1)->getDecl(),
50373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  cast<TypedefType>(T2)->getDecl()))
50473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
50573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    break;
50673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
50773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  case Type::TypeOfExpr:
50873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsStructurallyEquivalent(Context,
50973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                cast<TypeOfExprType>(T1)->getUnderlyingExpr(),
51073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                cast<TypeOfExprType>(T2)->getUnderlyingExpr()))
51173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
51273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    break;
51373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
51473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  case Type::TypeOf:
51573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsStructurallyEquivalent(Context,
51673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  cast<TypeOfType>(T1)->getUnderlyingType(),
51773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  cast<TypeOfType>(T2)->getUnderlyingType()))
51873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
51973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    break;
52073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
52173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  case Type::Decltype:
52273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsStructurallyEquivalent(Context,
52373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  cast<DecltypeType>(T1)->getUnderlyingExpr(),
52473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  cast<DecltypeType>(T2)->getUnderlyingExpr()))
52573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
52673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    break;
52773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
52873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  case Type::Record:
52973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  case Type::Enum:
53073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsStructurallyEquivalent(Context,
53173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  cast<TagType>(T1)->getDecl(),
53273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  cast<TagType>(T2)->getDecl()))
53373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
53473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    break;
53573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
53673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  case Type::Elaborated: {
53773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const ElaboratedType *Elab1 = cast<ElaboratedType>(T1);
53873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const ElaboratedType *Elab2 = cast<ElaboratedType>(T2);
53973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (Elab1->getTagKind() != Elab2->getTagKind())
54073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
54173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsStructurallyEquivalent(Context,
54273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  Elab1->getUnderlyingType(),
54373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  Elab2->getUnderlyingType()))
54473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
54573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    break;
54673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  }
54773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
54873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  case Type::TemplateTypeParm: {
54973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const TemplateTypeParmType *Parm1 = cast<TemplateTypeParmType>(T1);
55073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const TemplateTypeParmType *Parm2 = cast<TemplateTypeParmType>(T2);
55173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (Parm1->getDepth() != Parm2->getDepth())
55273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
55373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (Parm1->getIndex() != Parm2->getIndex())
55473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
55573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (Parm1->isParameterPack() != Parm2->isParameterPack())
55673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
55773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
55873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    // Names of template type parameters are never significant.
55973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    break;
56073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  }
56173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
56273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  case Type::SubstTemplateTypeParm: {
56373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const SubstTemplateTypeParmType *Subst1
56473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      = cast<SubstTemplateTypeParmType>(T1);
56573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const SubstTemplateTypeParmType *Subst2
56673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      = cast<SubstTemplateTypeParmType>(T2);
56773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsStructurallyEquivalent(Context,
56873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  QualType(Subst1->getReplacedParameter(), 0),
56973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  QualType(Subst2->getReplacedParameter(), 0)))
57073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
57173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsStructurallyEquivalent(Context,
57273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  Subst1->getReplacementType(),
57373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  Subst2->getReplacementType()))
57473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
57573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    break;
57673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  }
57773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
57873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  case Type::TemplateSpecialization: {
57973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const TemplateSpecializationType *Spec1
58073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      = cast<TemplateSpecializationType>(T1);
58173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const TemplateSpecializationType *Spec2
58273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      = cast<TemplateSpecializationType>(T2);
58373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsStructurallyEquivalent(Context,
58473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  Spec1->getTemplateName(),
58573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  Spec2->getTemplateName()))
58673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
58773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (Spec1->getNumArgs() != Spec2->getNumArgs())
58873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
58973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    for (unsigned I = 0, N = Spec1->getNumArgs(); I != N; ++I) {
59073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      if (!IsStructurallyEquivalent(Context,
59173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                    Spec1->getArg(I), Spec2->getArg(I)))
59273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        return false;
59373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    }
59473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    break;
59573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  }
59673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
59773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  case Type::QualifiedName: {
59873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const QualifiedNameType *Qual1 = cast<QualifiedNameType>(T1);
59973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const QualifiedNameType *Qual2 = cast<QualifiedNameType>(T2);
60073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsStructurallyEquivalent(Context,
60173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  Qual1->getQualifier(),
60273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  Qual2->getQualifier()))
60373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
60473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsStructurallyEquivalent(Context,
60573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  Qual1->getNamedType(),
60673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  Qual2->getNamedType()))
60773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
60873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    break;
60973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  }
61073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
6113cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  case Type::InjectedClassName: {
6123cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall    const InjectedClassNameType *Inj1 = cast<InjectedClassNameType>(T1);
6133cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall    const InjectedClassNameType *Inj2 = cast<InjectedClassNameType>(T2);
6143cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall    if (!IsStructurallyEquivalent(Context,
6153cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall                                  Inj1->getUnderlyingType(),
6163cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall                                  Inj2->getUnderlyingType()))
6173cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall      return false;
6183cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall    break;
6193cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  }
6203cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall
6214714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor  case Type::DependentName: {
6224714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor    const DependentNameType *Typename1 = cast<DependentNameType>(T1);
6234714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor    const DependentNameType *Typename2 = cast<DependentNameType>(T2);
62473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsStructurallyEquivalent(Context,
62573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  Typename1->getQualifier(),
62673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  Typename2->getQualifier()))
62773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
62873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsStructurallyEquivalent(Typename1->getIdentifier(),
62973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  Typename2->getIdentifier()))
63073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
63173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsStructurallyEquivalent(Context,
63273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  QualType(Typename1->getTemplateId(), 0),
63373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  QualType(Typename2->getTemplateId(), 0)))
63473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
63573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
63673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    break;
63773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  }
63873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
63973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  case Type::ObjCInterface: {
64073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const ObjCInterfaceType *Iface1 = cast<ObjCInterfaceType>(T1);
64173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const ObjCInterfaceType *Iface2 = cast<ObjCInterfaceType>(T2);
64273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsStructurallyEquivalent(Context,
64373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  Iface1->getDecl(), Iface2->getDecl()))
64473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
64573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (Iface1->getNumProtocols() != Iface2->getNumProtocols())
64673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
64773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    for (unsigned I = 0, N = Iface1->getNumProtocols(); I != N; ++I) {
64873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      if (!IsStructurallyEquivalent(Context,
64973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                    Iface1->getProtocol(I),
65073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                    Iface2->getProtocol(I)))
65173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        return false;
65273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    }
65373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    break;
65473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  }
65573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
65673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  case Type::ObjCObjectPointer: {
65773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const ObjCObjectPointerType *Ptr1 = cast<ObjCObjectPointerType>(T1);
65873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    const ObjCObjectPointerType *Ptr2 = cast<ObjCObjectPointerType>(T2);
65973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsStructurallyEquivalent(Context,
66073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  Ptr1->getPointeeType(),
66173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  Ptr2->getPointeeType()))
66273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
66373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (Ptr1->getNumProtocols() != Ptr2->getNumProtocols())
66473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
66573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    for (unsigned I = 0, N = Ptr1->getNumProtocols(); I != N; ++I) {
66673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      if (!IsStructurallyEquivalent(Context,
66773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                    Ptr1->getProtocol(I),
66873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                    Ptr2->getProtocol(I)))
66973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        return false;
67073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    }
67173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    break;
67273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  }
67373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
67473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  } // end switch
67573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
67673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  return true;
67773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor}
67873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
67973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// \brief Determine structural equivalence of two records.
68073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
68173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                     RecordDecl *D1, RecordDecl *D2) {
68273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  if (D1->isUnion() != D2->isUnion()) {
68373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
68473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      << Context.C2.getTypeDeclType(D2);
68573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    Context.Diag1(D1->getLocation(), diag::note_odr_tag_kind_here)
68673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      << D1->getDeclName() << (unsigned)D1->getTagKind();
68773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    return false;
68873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  }
68973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
690ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  // Compare the definitions of these two records. If either or both are
691ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  // incomplete, we assume that they are equivalent.
692ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  D1 = D1->getDefinition();
693ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  D2 = D2->getDefinition();
694ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  if (!D1 || !D2)
695ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor    return true;
696ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor
69773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  if (CXXRecordDecl *D1CXX = dyn_cast<CXXRecordDecl>(D1)) {
69873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (CXXRecordDecl *D2CXX = dyn_cast<CXXRecordDecl>(D2)) {
69973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      if (D1CXX->getNumBases() != D2CXX->getNumBases()) {
70073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
70173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        << Context.C2.getTypeDeclType(D2);
70273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        Context.Diag2(D2->getLocation(), diag::note_odr_number_of_bases)
70373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        << D2CXX->getNumBases();
70473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        Context.Diag1(D1->getLocation(), diag::note_odr_number_of_bases)
70573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        << D1CXX->getNumBases();
70673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        return false;
70773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      }
70873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
70973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      // Check the base classes.
71073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      for (CXXRecordDecl::base_class_iterator Base1 = D1CXX->bases_begin(),
71173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                           BaseEnd1 = D1CXX->bases_end(),
71273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                                Base2 = D2CXX->bases_begin();
71373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor           Base1 != BaseEnd1;
71473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor           ++Base1, ++Base2) {
71573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        if (!IsStructurallyEquivalent(Context,
71673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                      Base1->getType(), Base2->getType())) {
71773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor          Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
71873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor            << Context.C2.getTypeDeclType(D2);
71973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor          Context.Diag2(Base2->getSourceRange().getBegin(), diag::note_odr_base)
72073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor            << Base2->getType()
72173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor            << Base2->getSourceRange();
72273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor          Context.Diag1(Base1->getSourceRange().getBegin(), diag::note_odr_base)
72373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor            << Base1->getType()
72473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor            << Base1->getSourceRange();
72573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor          return false;
72673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        }
72773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
72873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        // Check virtual vs. non-virtual inheritance mismatch.
72973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        if (Base1->isVirtual() != Base2->isVirtual()) {
73073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor          Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
73173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor            << Context.C2.getTypeDeclType(D2);
73273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor          Context.Diag2(Base2->getSourceRange().getBegin(),
73373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                        diag::note_odr_virtual_base)
73473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor            << Base2->isVirtual() << Base2->getSourceRange();
73573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor          Context.Diag1(Base1->getSourceRange().getBegin(), diag::note_odr_base)
73673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor            << Base1->isVirtual()
73773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor            << Base1->getSourceRange();
73873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor          return false;
73973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        }
74073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      }
74173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    } else if (D1CXX->getNumBases() > 0) {
74273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
74373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        << Context.C2.getTypeDeclType(D2);
74473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      const CXXBaseSpecifier *Base1 = D1CXX->bases_begin();
74573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      Context.Diag1(Base1->getSourceRange().getBegin(), diag::note_odr_base)
74673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        << Base1->getType()
74773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        << Base1->getSourceRange();
74873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      Context.Diag2(D2->getLocation(), diag::note_odr_missing_base);
74973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
75073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    }
75173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  }
75273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
75373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  // Check the fields for consistency.
75473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  CXXRecordDecl::field_iterator Field2 = D2->field_begin(),
75573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                             Field2End = D2->field_end();
75673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  for (CXXRecordDecl::field_iterator Field1 = D1->field_begin(),
75773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  Field1End = D1->field_end();
75873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor       Field1 != Field1End;
75973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor       ++Field1, ++Field2) {
76073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (Field2 == Field2End) {
76173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
76273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        << Context.C2.getTypeDeclType(D2);
76373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      Context.Diag1(Field1->getLocation(), diag::note_odr_field)
76473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        << Field1->getDeclName() << Field1->getType();
76573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      Context.Diag2(D2->getLocation(), diag::note_odr_missing_field);
76673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
76773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    }
76873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
76973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsStructurallyEquivalent(Context,
77073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  Field1->getType(), Field2->getType())) {
77173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
77273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        << Context.C2.getTypeDeclType(D2);
77373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      Context.Diag2(Field2->getLocation(), diag::note_odr_field)
77473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        << Field2->getDeclName() << Field2->getType();
77573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      Context.Diag1(Field1->getLocation(), diag::note_odr_field)
77673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        << Field1->getDeclName() << Field1->getType();
77773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
77873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    }
77973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
78073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (Field1->isBitField() != Field2->isBitField()) {
78173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
78273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        << Context.C2.getTypeDeclType(D2);
78373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      if (Field1->isBitField()) {
78473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        llvm::APSInt Bits;
78573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        Field1->getBitWidth()->isIntegerConstantExpr(Bits, Context.C1);
78673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        Context.Diag1(Field1->getLocation(), diag::note_odr_bit_field)
78773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor          << Field1->getDeclName() << Field1->getType()
78873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor          << Bits.toString(10, false);
78973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        Context.Diag2(Field2->getLocation(), diag::note_odr_not_bit_field)
79073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor          << Field2->getDeclName();
79173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      } else {
79273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        llvm::APSInt Bits;
79373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        Field2->getBitWidth()->isIntegerConstantExpr(Bits, Context.C2);
79473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        Context.Diag2(Field2->getLocation(), diag::note_odr_bit_field)
79573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor          << Field2->getDeclName() << Field2->getType()
79673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor          << Bits.toString(10, false);
79773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        Context.Diag1(Field1->getLocation(),
79873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                          diag::note_odr_not_bit_field)
79973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        << Field1->getDeclName();
80073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      }
80173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
80273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    }
80373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
80473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (Field1->isBitField()) {
80573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      // Make sure that the bit-fields are the same length.
80673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      llvm::APSInt Bits1, Bits2;
80773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      if (!Field1->getBitWidth()->isIntegerConstantExpr(Bits1, Context.C1))
80873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        return false;
80973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      if (!Field2->getBitWidth()->isIntegerConstantExpr(Bits2, Context.C2))
81073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        return false;
81173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
81273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      if (!IsSameValue(Bits1, Bits2)) {
81373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
81473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor          << Context.C2.getTypeDeclType(D2);
81573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        Context.Diag2(Field2->getLocation(), diag::note_odr_bit_field)
81673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor          << Field2->getDeclName() << Field2->getType()
81773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor          << Bits2.toString(10, false);
81873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        Context.Diag1(Field1->getLocation(), diag::note_odr_bit_field)
81973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor          << Field1->getDeclName() << Field1->getType()
82073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor          << Bits1.toString(10, false);
82173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        return false;
82273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      }
82373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    }
82473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  }
82573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
82673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  if (Field2 != Field2End) {
82773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
82873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      << Context.C2.getTypeDeclType(D2);
82973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    Context.Diag2(Field2->getLocation(), diag::note_odr_field)
83073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      << Field2->getDeclName() << Field2->getType();
83173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    Context.Diag1(D1->getLocation(), diag::note_odr_missing_field);
83273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    return false;
83373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  }
83473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
83573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  return true;
83673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor}
83773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
83873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// \brief Determine structural equivalence of two enums.
83973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
84073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                     EnumDecl *D1, EnumDecl *D2) {
84173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  EnumDecl::enumerator_iterator EC2 = D2->enumerator_begin(),
84273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                             EC2End = D2->enumerator_end();
84373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  for (EnumDecl::enumerator_iterator EC1 = D1->enumerator_begin(),
84473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                  EC1End = D1->enumerator_end();
84573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor       EC1 != EC1End; ++EC1, ++EC2) {
84673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (EC2 == EC2End) {
84773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
84873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        << Context.C2.getTypeDeclType(D2);
84973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      Context.Diag1(EC1->getLocation(), diag::note_odr_enumerator)
85073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        << EC1->getDeclName()
85173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        << EC1->getInitVal().toString(10);
85273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      Context.Diag2(D2->getLocation(), diag::note_odr_missing_enumerator);
85373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
85473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    }
85573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
85673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    llvm::APSInt Val1 = EC1->getInitVal();
85773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    llvm::APSInt Val2 = EC2->getInitVal();
85873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (!IsSameValue(Val1, Val2) ||
85973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        !IsStructurallyEquivalent(EC1->getIdentifier(), EC2->getIdentifier())) {
86073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
86173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        << Context.C2.getTypeDeclType(D2);
86273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      Context.Diag2(EC2->getLocation(), diag::note_odr_enumerator)
86373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        << EC2->getDeclName()
86473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        << EC2->getInitVal().toString(10);
86573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      Context.Diag1(EC1->getLocation(), diag::note_odr_enumerator)
86673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        << EC1->getDeclName()
86773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        << EC1->getInitVal().toString(10);
86873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      return false;
86973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    }
87073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  }
87173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
87273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  if (EC2 != EC2End) {
87373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
87473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      << Context.C2.getTypeDeclType(D2);
87573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    Context.Diag2(EC2->getLocation(), diag::note_odr_enumerator)
87673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      << EC2->getDeclName()
87773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      << EC2->getInitVal().toString(10);
87873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    Context.Diag1(D1->getLocation(), diag::note_odr_missing_enumerator);
87973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    return false;
88073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  }
88173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
88273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  return true;
88373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor}
88473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
88573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor/// \brief Determine structural equivalence of two declarations.
88673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
88773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                     Decl *D1, Decl *D2) {
88873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  // FIXME: Check for known structural equivalences via a callback of some sort.
88973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
890ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  // Check whether we already know that these two declarations are not
891ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  // structurally equivalent.
892ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  if (Context.NonEquivalentDecls.count(std::make_pair(D1->getCanonicalDecl(),
893ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor                                                      D2->getCanonicalDecl())))
894ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor    return false;
895ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor
89673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  // Determine whether we've already produced a tentative equivalence for D1.
89773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  Decl *&EquivToD1 = Context.TentativeEquivalences[D1->getCanonicalDecl()];
89873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  if (EquivToD1)
89973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    return EquivToD1 == D2->getCanonicalDecl();
90073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
90173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  // Produce a tentative equivalence D1 <-> D2, which will be checked later.
90273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  EquivToD1 = D2->getCanonicalDecl();
90373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  Context.DeclsToCheck.push_back(D1->getCanonicalDecl());
90473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  return true;
90573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor}
90673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
90773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorbool StructuralEquivalenceContext::IsStructurallyEquivalent(Decl *D1,
90873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                                            Decl *D2) {
90973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  if (!::IsStructurallyEquivalent(*this, D1, D2))
91073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    return false;
91173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
91273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  return !Finish();
91373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor}
91473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
91573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorbool StructuralEquivalenceContext::IsStructurallyEquivalent(QualType T1,
91673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                                            QualType T2) {
91773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  if (!::IsStructurallyEquivalent(*this, T1, T2))
91873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    return false;
91973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
92073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  return !Finish();
92173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor}
92273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
92373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregorbool StructuralEquivalenceContext::Finish() {
92473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  while (!DeclsToCheck.empty()) {
92573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    // Check the next declaration.
92673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    Decl *D1 = DeclsToCheck.front();
92773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    DeclsToCheck.pop_front();
92873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
92973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    Decl *D2 = TentativeEquivalences[D1];
93073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    assert(D2 && "Unrecorded tentative equivalence?");
93173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
932ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor    bool Equivalent = true;
933ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor
93473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    // FIXME: Switch on all declaration kinds. For now, we're just going to
93573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    // check the obvious ones.
93673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (RecordDecl *Record1 = dyn_cast<RecordDecl>(D1)) {
93773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      if (RecordDecl *Record2 = dyn_cast<RecordDecl>(D2)) {
93873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        // Check for equivalent structure names.
93973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        IdentifierInfo *Name1 = Record1->getIdentifier();
94073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        if (!Name1 && Record1->getTypedefForAnonDecl())
94173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor          Name1 = Record1->getTypedefForAnonDecl()->getIdentifier();
94273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        IdentifierInfo *Name2 = Record2->getIdentifier();
94373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        if (!Name2 && Record2->getTypedefForAnonDecl())
94473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor          Name2 = Record2->getTypedefForAnonDecl()->getIdentifier();
945ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor        if (!::IsStructurallyEquivalent(Name1, Name2) ||
946ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor            !::IsStructurallyEquivalent(*this, Record1, Record2))
947ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor          Equivalent = false;
94873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      } else {
94973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        // Record/non-record mismatch.
950ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor        Equivalent = false;
95173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      }
952ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor    } else if (EnumDecl *Enum1 = dyn_cast<EnumDecl>(D1)) {
95373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      if (EnumDecl *Enum2 = dyn_cast<EnumDecl>(D2)) {
95473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        // Check for equivalent enum names.
95573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        IdentifierInfo *Name1 = Enum1->getIdentifier();
95673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        if (!Name1 && Enum1->getTypedefForAnonDecl())
95773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor          Name1 = Enum1->getTypedefForAnonDecl()->getIdentifier();
95873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        IdentifierInfo *Name2 = Enum2->getIdentifier();
95973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        if (!Name2 && Enum2->getTypedefForAnonDecl())
96073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor          Name2 = Enum2->getTypedefForAnonDecl()->getIdentifier();
961ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor        if (!::IsStructurallyEquivalent(Name1, Name2) ||
962ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor            !::IsStructurallyEquivalent(*this, Enum1, Enum2))
963ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor          Equivalent = false;
96473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      } else {
96573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        // Enum/non-enum mismatch
966ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor        Equivalent = false;
96773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      }
968ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor    } else if (TypedefDecl *Typedef1 = dyn_cast<TypedefDecl>(D1)) {
96973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      if (TypedefDecl *Typedef2 = dyn_cast<TypedefDecl>(D2)) {
97073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        if (!::IsStructurallyEquivalent(Typedef1->getIdentifier(),
971ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor                                        Typedef2->getIdentifier()) ||
972ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor            !::IsStructurallyEquivalent(*this,
97373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                        Typedef1->getUnderlyingType(),
97473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                        Typedef2->getUnderlyingType()))
975ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor          Equivalent = false;
97673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      } else {
97773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor        // Typedef/non-typedef mismatch.
978ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor        Equivalent = false;
97973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      }
98073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    }
981ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor
982ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor    if (!Equivalent) {
983ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor      // Note that these two declarations are not equivalent (and we already
984ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor      // know about it).
985ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor      NonEquivalentDecls.insert(std::make_pair(D1->getCanonicalDecl(),
986ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor                                               D2->getCanonicalDecl()));
987ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor      return true;
988ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor    }
98973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    // FIXME: Check other declaration kinds!
99073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  }
99173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
99273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  return false;
99373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor}
99473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor
99573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor//----------------------------------------------------------------------------
9961b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor// Import Types
9971b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor//----------------------------------------------------------------------------
9981b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
99989cc9d6e2aaf794fbd2c228a3755c19062ca0ba0Douglas GregorQualType ASTNodeImporter::VisitType(Type *T) {
100089cc9d6e2aaf794fbd2c228a3755c19062ca0ba0Douglas Gregor  Importer.FromDiag(SourceLocation(), diag::err_unsupported_ast_node)
100189cc9d6e2aaf794fbd2c228a3755c19062ca0ba0Douglas Gregor    << T->getTypeClassName();
100289cc9d6e2aaf794fbd2c228a3755c19062ca0ba0Douglas Gregor  return QualType();
100389cc9d6e2aaf794fbd2c228a3755c19062ca0ba0Douglas Gregor}
100489cc9d6e2aaf794fbd2c228a3755c19062ca0ba0Douglas Gregor
10051b2949d27ec72894dec017c330c0548af4bb2476Douglas GregorQualType ASTNodeImporter::VisitBuiltinType(BuiltinType *T) {
10061b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  switch (T->getKind()) {
10071b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case BuiltinType::Void: return Importer.getToContext().VoidTy;
10081b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case BuiltinType::Bool: return Importer.getToContext().BoolTy;
10091b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
10101b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case BuiltinType::Char_U:
10111b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    // The context we're importing from has an unsigned 'char'. If we're
10121b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    // importing into a context with a signed 'char', translate to
10131b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    // 'unsigned char' instead.
10141b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    if (Importer.getToContext().getLangOptions().CharIsSigned)
10151b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor      return Importer.getToContext().UnsignedCharTy;
10161b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
10171b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return Importer.getToContext().CharTy;
10181b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
10191b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case BuiltinType::UChar: return Importer.getToContext().UnsignedCharTy;
10201b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
10211b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case BuiltinType::Char16:
10221b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    // FIXME: Make sure that the "to" context supports C++!
10231b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return Importer.getToContext().Char16Ty;
10241b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
10251b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case BuiltinType::Char32:
10261b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    // FIXME: Make sure that the "to" context supports C++!
10271b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return Importer.getToContext().Char32Ty;
10281b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
10291b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case BuiltinType::UShort: return Importer.getToContext().UnsignedShortTy;
10301b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case BuiltinType::UInt: return Importer.getToContext().UnsignedIntTy;
10311b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case BuiltinType::ULong: return Importer.getToContext().UnsignedLongTy;
10321b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case BuiltinType::ULongLong:
10331b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return Importer.getToContext().UnsignedLongLongTy;
10341b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case BuiltinType::UInt128: return Importer.getToContext().UnsignedInt128Ty;
10351b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
10361b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case BuiltinType::Char_S:
10371b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    // The context we're importing from has an unsigned 'char'. If we're
10381b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    // importing into a context with a signed 'char', translate to
10391b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    // 'unsigned char' instead.
10401b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    if (!Importer.getToContext().getLangOptions().CharIsSigned)
10411b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor      return Importer.getToContext().SignedCharTy;
10421b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
10431b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return Importer.getToContext().CharTy;
10441b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
10451b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case BuiltinType::SChar: return Importer.getToContext().SignedCharTy;
10461b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case BuiltinType::WChar:
10471b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    // FIXME: If not in C++, shall we translate to the C equivalent of
10481b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    // wchar_t?
10491b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return Importer.getToContext().WCharTy;
10501b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
10511b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case BuiltinType::Short : return Importer.getToContext().ShortTy;
10521b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case BuiltinType::Int : return Importer.getToContext().IntTy;
10531b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case BuiltinType::Long : return Importer.getToContext().LongTy;
10541b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case BuiltinType::LongLong : return Importer.getToContext().LongLongTy;
10551b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case BuiltinType::Int128 : return Importer.getToContext().Int128Ty;
10561b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case BuiltinType::Float: return Importer.getToContext().FloatTy;
10571b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case BuiltinType::Double: return Importer.getToContext().DoubleTy;
10581b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case BuiltinType::LongDouble: return Importer.getToContext().LongDoubleTy;
10591b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
10601b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case BuiltinType::NullPtr:
10611b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    // FIXME: Make sure that the "to" context supports C++0x!
10621b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return Importer.getToContext().NullPtrTy;
10631b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
10641b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case BuiltinType::Overload: return Importer.getToContext().OverloadTy;
10651b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case BuiltinType::Dependent: return Importer.getToContext().DependentTy;
10661b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case BuiltinType::UndeducedAuto:
10671b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    // FIXME: Make sure that the "to" context supports C++0x!
10681b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return Importer.getToContext().UndeducedAutoTy;
10691b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
10701b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case BuiltinType::ObjCId:
10711b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    // FIXME: Make sure that the "to" context supports Objective-C!
10721b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return Importer.getToContext().ObjCBuiltinIdTy;
10731b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
10741b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case BuiltinType::ObjCClass:
10751b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return Importer.getToContext().ObjCBuiltinClassTy;
10761b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
10771b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case BuiltinType::ObjCSel:
10781b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return Importer.getToContext().ObjCBuiltinSelTy;
10791b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  }
10801b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
10811b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  return QualType();
10821b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor}
10831b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
10841b2949d27ec72894dec017c330c0548af4bb2476Douglas GregorQualType ASTNodeImporter::VisitComplexType(ComplexType *T) {
10851b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  QualType ToElementType = Importer.Import(T->getElementType());
10861b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  if (ToElementType.isNull())
10871b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return QualType();
10881b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
10891b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  return Importer.getToContext().getComplexType(ToElementType);
10901b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor}
10911b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
10921b2949d27ec72894dec017c330c0548af4bb2476Douglas GregorQualType ASTNodeImporter::VisitPointerType(PointerType *T) {
10931b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  QualType ToPointeeType = Importer.Import(T->getPointeeType());
10941b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  if (ToPointeeType.isNull())
10951b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return QualType();
10961b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
10971b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  return Importer.getToContext().getPointerType(ToPointeeType);
10981b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor}
10991b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
11001b2949d27ec72894dec017c330c0548af4bb2476Douglas GregorQualType ASTNodeImporter::VisitBlockPointerType(BlockPointerType *T) {
11011b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  // FIXME: Check for blocks support in "to" context.
11021b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  QualType ToPointeeType = Importer.Import(T->getPointeeType());
11031b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  if (ToPointeeType.isNull())
11041b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return QualType();
11051b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
11061b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  return Importer.getToContext().getBlockPointerType(ToPointeeType);
11071b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor}
11081b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
11091b2949d27ec72894dec017c330c0548af4bb2476Douglas GregorQualType ASTNodeImporter::VisitLValueReferenceType(LValueReferenceType *T) {
11101b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  // FIXME: Check for C++ support in "to" context.
11111b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  QualType ToPointeeType = Importer.Import(T->getPointeeTypeAsWritten());
11121b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  if (ToPointeeType.isNull())
11131b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return QualType();
11141b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
11151b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  return Importer.getToContext().getLValueReferenceType(ToPointeeType);
11161b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor}
11171b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
11181b2949d27ec72894dec017c330c0548af4bb2476Douglas GregorQualType ASTNodeImporter::VisitRValueReferenceType(RValueReferenceType *T) {
11191b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  // FIXME: Check for C++0x support in "to" context.
11201b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  QualType ToPointeeType = Importer.Import(T->getPointeeTypeAsWritten());
11211b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  if (ToPointeeType.isNull())
11221b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return QualType();
11231b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
11241b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  return Importer.getToContext().getRValueReferenceType(ToPointeeType);
11251b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor}
11261b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
11271b2949d27ec72894dec017c330c0548af4bb2476Douglas GregorQualType ASTNodeImporter::VisitMemberPointerType(MemberPointerType *T) {
11281b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  // FIXME: Check for C++ support in "to" context.
11291b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  QualType ToPointeeType = Importer.Import(T->getPointeeType());
11301b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  if (ToPointeeType.isNull())
11311b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return QualType();
11321b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
11331b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  QualType ClassType = Importer.Import(QualType(T->getClass(), 0));
11341b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  return Importer.getToContext().getMemberPointerType(ToPointeeType,
11351b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor                                                      ClassType.getTypePtr());
11361b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor}
11371b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
11381b2949d27ec72894dec017c330c0548af4bb2476Douglas GregorQualType ASTNodeImporter::VisitConstantArrayType(ConstantArrayType *T) {
11391b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  QualType ToElementType = Importer.Import(T->getElementType());
11401b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  if (ToElementType.isNull())
11411b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return QualType();
11421b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
11431b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  return Importer.getToContext().getConstantArrayType(ToElementType,
11441b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor                                                      T->getSize(),
11451b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor                                                      T->getSizeModifier(),
11461b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor                                               T->getIndexTypeCVRQualifiers());
11471b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor}
11481b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
11491b2949d27ec72894dec017c330c0548af4bb2476Douglas GregorQualType ASTNodeImporter::VisitIncompleteArrayType(IncompleteArrayType *T) {
11501b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  QualType ToElementType = Importer.Import(T->getElementType());
11511b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  if (ToElementType.isNull())
11521b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return QualType();
11531b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
11541b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  return Importer.getToContext().getIncompleteArrayType(ToElementType,
11551b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor                                                        T->getSizeModifier(),
11561b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor                                                T->getIndexTypeCVRQualifiers());
11571b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor}
11581b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
11591b2949d27ec72894dec017c330c0548af4bb2476Douglas GregorQualType ASTNodeImporter::VisitVariableArrayType(VariableArrayType *T) {
11601b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  QualType ToElementType = Importer.Import(T->getElementType());
11611b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  if (ToElementType.isNull())
11621b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return QualType();
11631b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
11641b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  Expr *Size = Importer.Import(T->getSizeExpr());
11651b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  if (!Size)
11661b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return QualType();
11671b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
11681b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  SourceRange Brackets = Importer.Import(T->getBracketsRange());
11691b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  return Importer.getToContext().getVariableArrayType(ToElementType, Size,
11701b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor                                                      T->getSizeModifier(),
11711b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor                                                T->getIndexTypeCVRQualifiers(),
11721b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor                                                      Brackets);
11731b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor}
11741b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
11751b2949d27ec72894dec017c330c0548af4bb2476Douglas GregorQualType ASTNodeImporter::VisitVectorType(VectorType *T) {
11761b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  QualType ToElementType = Importer.Import(T->getElementType());
11771b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  if (ToElementType.isNull())
11781b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return QualType();
11791b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
11801b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  return Importer.getToContext().getVectorType(ToElementType,
11811b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor                                               T->getNumElements(),
11821b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor                                               T->isAltiVec(),
11831b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor                                               T->isPixel());
11841b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor}
11851b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
11861b2949d27ec72894dec017c330c0548af4bb2476Douglas GregorQualType ASTNodeImporter::VisitExtVectorType(ExtVectorType *T) {
11871b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  QualType ToElementType = Importer.Import(T->getElementType());
11881b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  if (ToElementType.isNull())
11891b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return QualType();
11901b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
11911b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  return Importer.getToContext().getExtVectorType(ToElementType,
11921b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor                                                  T->getNumElements());
11931b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor}
11941b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
11951b2949d27ec72894dec017c330c0548af4bb2476Douglas GregorQualType ASTNodeImporter::VisitFunctionNoProtoType(FunctionNoProtoType *T) {
11961b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  // FIXME: What happens if we're importing a function without a prototype
11971b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  // into C++? Should we make it variadic?
11981b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  QualType ToResultType = Importer.Import(T->getResultType());
11991b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  if (ToResultType.isNull())
12001b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return QualType();
1201264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola
12021b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  return Importer.getToContext().getFunctionNoProtoType(ToResultType,
1203264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola                                                        T->getExtInfo());
12041b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor}
12051b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
12061b2949d27ec72894dec017c330c0548af4bb2476Douglas GregorQualType ASTNodeImporter::VisitFunctionProtoType(FunctionProtoType *T) {
12071b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  QualType ToResultType = Importer.Import(T->getResultType());
12081b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  if (ToResultType.isNull())
12091b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return QualType();
12101b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
12111b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  // Import argument types
12121b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  llvm::SmallVector<QualType, 4> ArgTypes;
12131b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  for (FunctionProtoType::arg_type_iterator A = T->arg_type_begin(),
12141b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor                                         AEnd = T->arg_type_end();
12151b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor       A != AEnd; ++A) {
12161b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    QualType ArgType = Importer.Import(*A);
12171b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    if (ArgType.isNull())
12181b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor      return QualType();
12191b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    ArgTypes.push_back(ArgType);
12201b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  }
12211b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
12221b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  // Import exception types
12231b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  llvm::SmallVector<QualType, 4> ExceptionTypes;
12241b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  for (FunctionProtoType::exception_iterator E = T->exception_begin(),
12251b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor                                          EEnd = T->exception_end();
12261b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor       E != EEnd; ++E) {
12271b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    QualType ExceptionType = Importer.Import(*E);
12281b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    if (ExceptionType.isNull())
12291b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor      return QualType();
12301b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    ExceptionTypes.push_back(ExceptionType);
12311b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  }
12321b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
12331b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  return Importer.getToContext().getFunctionType(ToResultType, ArgTypes.data(),
12341b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor                                                 ArgTypes.size(),
12351b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor                                                 T->isVariadic(),
12361b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor                                                 T->getTypeQuals(),
12371b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor                                                 T->hasExceptionSpec(),
12381b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor                                                 T->hasAnyExceptionSpec(),
12391b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor                                                 ExceptionTypes.size(),
12401b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor                                                 ExceptionTypes.data(),
1241264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola                                                 T->getExtInfo());
12421b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor}
12431b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
12441b2949d27ec72894dec017c330c0548af4bb2476Douglas GregorQualType ASTNodeImporter::VisitTypedefType(TypedefType *T) {
12451b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  TypedefDecl *ToDecl
12461b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor                 = dyn_cast_or_null<TypedefDecl>(Importer.Import(T->getDecl()));
12471b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  if (!ToDecl)
12481b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return QualType();
12491b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
12501b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  return Importer.getToContext().getTypeDeclType(ToDecl);
12511b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor}
12521b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
12531b2949d27ec72894dec017c330c0548af4bb2476Douglas GregorQualType ASTNodeImporter::VisitTypeOfExprType(TypeOfExprType *T) {
12541b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  Expr *ToExpr = Importer.Import(T->getUnderlyingExpr());
12551b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  if (!ToExpr)
12561b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return QualType();
12571b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
12581b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  return Importer.getToContext().getTypeOfExprType(ToExpr);
12591b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor}
12601b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
12611b2949d27ec72894dec017c330c0548af4bb2476Douglas GregorQualType ASTNodeImporter::VisitTypeOfType(TypeOfType *T) {
12621b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  QualType ToUnderlyingType = Importer.Import(T->getUnderlyingType());
12631b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  if (ToUnderlyingType.isNull())
12641b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return QualType();
12651b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
12661b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  return Importer.getToContext().getTypeOfType(ToUnderlyingType);
12671b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor}
12681b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
12691b2949d27ec72894dec017c330c0548af4bb2476Douglas GregorQualType ASTNodeImporter::VisitDecltypeType(DecltypeType *T) {
12701b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  Expr *ToExpr = Importer.Import(T->getUnderlyingExpr());
12711b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  if (!ToExpr)
12721b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return QualType();
12731b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
12741b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  return Importer.getToContext().getDecltypeType(ToExpr);
12751b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor}
12761b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
12771b2949d27ec72894dec017c330c0548af4bb2476Douglas GregorQualType ASTNodeImporter::VisitRecordType(RecordType *T) {
12781b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  RecordDecl *ToDecl
12791b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    = dyn_cast_or_null<RecordDecl>(Importer.Import(T->getDecl()));
12801b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  if (!ToDecl)
12811b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return QualType();
12821b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
12831b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  return Importer.getToContext().getTagDeclType(ToDecl);
12841b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor}
12851b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
12861b2949d27ec72894dec017c330c0548af4bb2476Douglas GregorQualType ASTNodeImporter::VisitEnumType(EnumType *T) {
12871b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  EnumDecl *ToDecl
12881b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    = dyn_cast_or_null<EnumDecl>(Importer.Import(T->getDecl()));
12891b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  if (!ToDecl)
12901b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return QualType();
12911b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
12921b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  return Importer.getToContext().getTagDeclType(ToDecl);
12931b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor}
12941b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
12951b2949d27ec72894dec017c330c0548af4bb2476Douglas GregorQualType ASTNodeImporter::VisitElaboratedType(ElaboratedType *T) {
12961b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  QualType ToUnderlyingType = Importer.Import(T->getUnderlyingType());
12971b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  if (ToUnderlyingType.isNull())
12981b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return QualType();
12991b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
13001b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  return Importer.getToContext().getElaboratedType(ToUnderlyingType,
13011b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor                                                   T->getTagKind());
13021b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor}
13031b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
13041b2949d27ec72894dec017c330c0548af4bb2476Douglas GregorQualType ASTNodeImporter::VisitQualifiedNameType(QualifiedNameType *T) {
13051b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  NestedNameSpecifier *ToQualifier = Importer.Import(T->getQualifier());
13061b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  if (!ToQualifier)
13071b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return QualType();
13081b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
13091b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  QualType ToNamedType = Importer.Import(T->getNamedType());
13101b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  if (ToNamedType.isNull())
13111b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return QualType();
13121b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
13131b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  return Importer.getToContext().getQualifiedNameType(ToQualifier, ToNamedType);
13141b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor}
13151b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
13161b2949d27ec72894dec017c330c0548af4bb2476Douglas GregorQualType ASTNodeImporter::VisitObjCInterfaceType(ObjCInterfaceType *T) {
13171b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  ObjCInterfaceDecl *Class
13181b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    = dyn_cast_or_null<ObjCInterfaceDecl>(Importer.Import(T->getDecl()));
13191b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  if (!Class)
13201b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return QualType();
13211b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
13221b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  llvm::SmallVector<ObjCProtocolDecl *, 4> Protocols;
13231b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  for (ObjCInterfaceType::qual_iterator P = T->qual_begin(),
13241b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor                                     PEnd = T->qual_end();
13251b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor       P != PEnd; ++P) {
13261b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    ObjCProtocolDecl *Protocol
13271b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor      = dyn_cast_or_null<ObjCProtocolDecl>(Importer.Import(*P));
13281b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    if (!Protocol)
13291b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor      return QualType();
13301b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    Protocols.push_back(Protocol);
13311b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  }
13321b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
13331b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  return Importer.getToContext().getObjCInterfaceType(Class,
13341b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor                                                      Protocols.data(),
13351b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor                                                      Protocols.size());
13361b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor}
13371b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
13381b2949d27ec72894dec017c330c0548af4bb2476Douglas GregorQualType ASTNodeImporter::VisitObjCObjectPointerType(ObjCObjectPointerType *T) {
13391b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  QualType ToPointeeType = Importer.Import(T->getPointeeType());
13401b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  if (ToPointeeType.isNull())
13411b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return QualType();
13421b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
13431b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  llvm::SmallVector<ObjCProtocolDecl *, 4> Protocols;
13441b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  for (ObjCObjectPointerType::qual_iterator P = T->qual_begin(),
13451b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor                                         PEnd = T->qual_end();
13461b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor       P != PEnd; ++P) {
13471b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    ObjCProtocolDecl *Protocol
13481b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor      = dyn_cast_or_null<ObjCProtocolDecl>(Importer.Import(*P));
13491b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    if (!Protocol)
13501b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor      return QualType();
13511b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    Protocols.push_back(Protocol);
13521b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  }
13531b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
13541b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  return Importer.getToContext().getObjCObjectPointerType(ToPointeeType,
13551b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor                                                          Protocols.data(),
13561b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor                                                          Protocols.size());
13571b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor}
13581b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
1359089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor//----------------------------------------------------------------------------
1360089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor// Import Declarations
1361089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor//----------------------------------------------------------------------------
1362a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregorbool ASTNodeImporter::ImportDeclParts(NamedDecl *D, DeclContext *&DC,
1363a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor                                      DeclContext *&LexicalDC,
1364a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor                                      DeclarationName &Name,
1365a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor                                      SourceLocation &Loc) {
1366089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor  // Import the context of this declaration.
1367a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  DC = Importer.ImportContext(D->getDeclContext());
1368089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor  if (!DC)
1369a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor    return true;
1370a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor
1371a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  LexicalDC = DC;
13729bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor  if (D->getDeclContext() != D->getLexicalDeclContext()) {
13739bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor    LexicalDC = Importer.ImportContext(D->getLexicalDeclContext());
13749bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor    if (!LexicalDC)
1375a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor      return true;
13769bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor  }
1377a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor
1378089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor  // Import the name of this declaration.
1379a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  Name = Importer.Import(D->getDeclName());
1380089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor  if (D->getDeclName() && !Name)
1381a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor    return true;
1382a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor
1383a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  // Import the location of this declaration.
1384a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  Loc = Importer.Import(D->getLocation());
1385a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  return false;
1386a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor}
1387a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor
1388083a821bbd02bbc521275a2f144abe39a6c2745cDouglas Gregorvoid ASTNodeImporter::ImportDeclContext(DeclContext *FromDC) {
1389083a821bbd02bbc521275a2f144abe39a6c2745cDouglas Gregor  for (DeclContext::decl_iterator From = FromDC->decls_begin(),
1390083a821bbd02bbc521275a2f144abe39a6c2745cDouglas Gregor                               FromEnd = FromDC->decls_end();
1391083a821bbd02bbc521275a2f144abe39a6c2745cDouglas Gregor       From != FromEnd;
1392083a821bbd02bbc521275a2f144abe39a6c2745cDouglas Gregor       ++From)
1393083a821bbd02bbc521275a2f144abe39a6c2745cDouglas Gregor    Importer.Import(*From);
1394083a821bbd02bbc521275a2f144abe39a6c2745cDouglas Gregor}
1395083a821bbd02bbc521275a2f144abe39a6c2745cDouglas Gregor
139696a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregorbool ASTNodeImporter::IsStructuralMatch(RecordDecl *FromRecord,
139773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                        RecordDecl *ToRecord) {
1398bb2d176c4f434e9e73f63f2f9d128f63ce3e10d0Benjamin Kramer  StructuralEquivalenceContext Ctx(Importer.getFromContext(),
139973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                   Importer.getToContext(),
1400ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor                                   Importer.getDiags(),
1401ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor                                   Importer.getNonEquivalentDecls());
1402bb2d176c4f434e9e73f63f2f9d128f63ce3e10d0Benjamin Kramer  return Ctx.IsStructurallyEquivalent(FromRecord, ToRecord);
140396a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor}
140496a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor
140536ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregorbool ASTNodeImporter::IsStructuralMatch(EnumDecl *FromEnum, EnumDecl *ToEnum) {
1406bb2d176c4f434e9e73f63f2f9d128f63ce3e10d0Benjamin Kramer  StructuralEquivalenceContext Ctx(Importer.getFromContext(),
140773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                   Importer.getToContext(),
1408ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor                                   Importer.getDiags(),
1409ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor                                   Importer.getNonEquivalentDecls());
1410bb2d176c4f434e9e73f63f2f9d128f63ce3e10d0Benjamin Kramer  return Ctx.IsStructurallyEquivalent(FromEnum, ToEnum);
141136ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor}
141236ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor
1413a404ea673cbee5e74af710a5f1ab571e71580b67Douglas GregorDecl *ASTNodeImporter::VisitDecl(Decl *D) {
1414a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  Importer.FromDiag(D->getLocation(), diag::err_unsupported_ast_node)
1415a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor    << D->getDeclKindName();
1416a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  return 0;
1417a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor}
1418a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor
1419788c62d1e87bfb596078817237f672a5f000999aDouglas GregorDecl *ASTNodeImporter::VisitNamespaceDecl(NamespaceDecl *D) {
1420788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor  // Import the major distinguishing characteristics of this namespace.
1421788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor  DeclContext *DC, *LexicalDC;
1422788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor  DeclarationName Name;
1423788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor  SourceLocation Loc;
1424788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor  if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
1425788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor    return 0;
1426788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor
1427788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor  NamespaceDecl *MergeWithNamespace = 0;
1428788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor  if (!Name) {
1429788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor    // This is an anonymous namespace. Adopt an existing anonymous
1430788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor    // namespace if we can.
1431788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor    // FIXME: Not testable.
1432788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor    if (TranslationUnitDecl *TU = dyn_cast<TranslationUnitDecl>(DC))
1433788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor      MergeWithNamespace = TU->getAnonymousNamespace();
1434788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor    else
1435788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor      MergeWithNamespace = cast<NamespaceDecl>(DC)->getAnonymousNamespace();
1436788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor  } else {
1437788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor    llvm::SmallVector<NamedDecl *, 4> ConflictingDecls;
1438788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor    for (DeclContext::lookup_result Lookup = DC->lookup(Name);
1439788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor         Lookup.first != Lookup.second;
1440788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor         ++Lookup.first) {
1441788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor      if (!(*Lookup.first)->isInIdentifierNamespace(Decl::IDNS_Ordinary))
1442788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor        continue;
1443788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor
1444788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor      if (NamespaceDecl *FoundNS = dyn_cast<NamespaceDecl>(*Lookup.first)) {
1445788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor        MergeWithNamespace = FoundNS;
1446788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor        ConflictingDecls.clear();
1447788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor        break;
1448788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor      }
1449788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor
1450788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor      ConflictingDecls.push_back(*Lookup.first);
1451788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor    }
1452788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor
1453788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor    if (!ConflictingDecls.empty()) {
1454788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor      Name = Importer.HandleNameConflict(Name, DC, Decl::IDNS_Ordinary,
1455788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor                                         ConflictingDecls.data(),
1456788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor                                         ConflictingDecls.size());
1457788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor    }
1458788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor  }
1459788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor
1460788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor  // Create the "to" namespace, if needed.
1461788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor  NamespaceDecl *ToNamespace = MergeWithNamespace;
1462788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor  if (!ToNamespace) {
1463788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor    ToNamespace = NamespaceDecl::Create(Importer.getToContext(), DC, Loc,
1464788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor                                        Name.getAsIdentifierInfo());
1465788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor    ToNamespace->setLexicalDeclContext(LexicalDC);
1466788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor    LexicalDC->addDecl(ToNamespace);
1467788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor
1468788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor    // If this is an anonymous namespace, register it as the anonymous
1469788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor    // namespace within its context.
1470788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor    if (!Name) {
1471788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor      if (TranslationUnitDecl *TU = dyn_cast<TranslationUnitDecl>(DC))
1472788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor        TU->setAnonymousNamespace(ToNamespace);
1473788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor      else
1474788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor        cast<NamespaceDecl>(DC)->setAnonymousNamespace(ToNamespace);
1475788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor    }
1476788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor  }
1477788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor  Importer.Imported(D, ToNamespace);
1478788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor
1479788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor  ImportDeclContext(D);
1480788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor
1481788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor  return ToNamespace;
1482788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor}
1483788c62d1e87bfb596078817237f672a5f000999aDouglas Gregor
14849e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas GregorDecl *ASTNodeImporter::VisitTypedefDecl(TypedefDecl *D) {
14859e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor  // Import the major distinguishing characteristics of this typedef.
14869e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor  DeclContext *DC, *LexicalDC;
14879e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor  DeclarationName Name;
14889e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor  SourceLocation Loc;
14899e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor  if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
14909e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor    return 0;
14919e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor
14929e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor  // If this typedef is not in block scope, determine whether we've
14939e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor  // seen a typedef with the same name (that we can merge with) or any
14949e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor  // other entity by that name (which name lookup could conflict with).
14959e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor  if (!DC->isFunctionOrMethod()) {
14969e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor    llvm::SmallVector<NamedDecl *, 4> ConflictingDecls;
14979e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor    unsigned IDNS = Decl::IDNS_Ordinary;
14989e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor    for (DeclContext::lookup_result Lookup = DC->lookup(Name);
14999e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor         Lookup.first != Lookup.second;
15009e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor         ++Lookup.first) {
15019e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor      if (!(*Lookup.first)->isInIdentifierNamespace(IDNS))
15029e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor        continue;
15039e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor      if (TypedefDecl *FoundTypedef = dyn_cast<TypedefDecl>(*Lookup.first)) {
1504ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor        if (Importer.IsStructurallyEquivalent(D->getUnderlyingType(),
1505ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor                                            FoundTypedef->getUnderlyingType()))
15065ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor          return Importer.Imported(D, FoundTypedef);
15079e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor      }
15089e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor
15099e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor      ConflictingDecls.push_back(*Lookup.first);
15109e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor    }
15119e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor
15129e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor    if (!ConflictingDecls.empty()) {
15139e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor      Name = Importer.HandleNameConflict(Name, DC, IDNS,
15149e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor                                         ConflictingDecls.data(),
15159e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor                                         ConflictingDecls.size());
15169e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor      if (!Name)
15179e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor        return 0;
15189e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor    }
15199e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor  }
15209e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor
1521ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  // Import the underlying type of this typedef;
1522ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  QualType T = Importer.Import(D->getUnderlyingType());
1523ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  if (T.isNull())
1524ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor    return 0;
1525ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor
15269e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor  // Create the new typedef node.
15279e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor  TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo());
15289e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor  TypedefDecl *ToTypedef = TypedefDecl::Create(Importer.getToContext(), DC,
15299e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor                                               Loc, Name.getAsIdentifierInfo(),
15309e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor                                               TInfo);
1531325bf177ac0f1db7888e2d7b194515466ba91762Douglas Gregor  ToTypedef->setAccess(D->getAccess());
15329e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor  ToTypedef->setLexicalDeclContext(LexicalDC);
15335ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor  Importer.Imported(D, ToTypedef);
15349e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor  LexicalDC->addDecl(ToTypedef);
1535ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor
15369e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor  return ToTypedef;
15379e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor}
15389e5d996444e40fdf5cce44ee82bec0d4e3df3d56Douglas Gregor
153936ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas GregorDecl *ASTNodeImporter::VisitEnumDecl(EnumDecl *D) {
154036ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  // Import the major distinguishing characteristics of this enum.
154136ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  DeclContext *DC, *LexicalDC;
154236ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  DeclarationName Name;
154336ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  SourceLocation Loc;
154436ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
154536ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor    return 0;
154636ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor
154736ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  // Figure out what enum name we're looking for.
154836ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  unsigned IDNS = Decl::IDNS_Tag;
154936ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  DeclarationName SearchName = Name;
155036ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  if (!SearchName && D->getTypedefForAnonDecl()) {
155136ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor    SearchName = Importer.Import(D->getTypedefForAnonDecl()->getDeclName());
155236ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor    IDNS = Decl::IDNS_Ordinary;
155336ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  } else if (Importer.getToContext().getLangOptions().CPlusPlus)
155436ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor    IDNS |= Decl::IDNS_Ordinary;
155536ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor
155636ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  // We may already have an enum of the same name; try to find and match it.
155736ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  if (!DC->isFunctionOrMethod() && SearchName) {
155836ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor    llvm::SmallVector<NamedDecl *, 4> ConflictingDecls;
155936ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor    for (DeclContext::lookup_result Lookup = DC->lookup(Name);
156036ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor         Lookup.first != Lookup.second;
156136ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor         ++Lookup.first) {
156236ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor      if (!(*Lookup.first)->isInIdentifierNamespace(IDNS))
156336ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor        continue;
156436ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor
156536ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor      Decl *Found = *Lookup.first;
156636ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor      if (TypedefDecl *Typedef = dyn_cast<TypedefDecl>(Found)) {
156736ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor        if (const TagType *Tag = Typedef->getUnderlyingType()->getAs<TagType>())
156836ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor          Found = Tag->getDecl();
156936ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor      }
157036ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor
157136ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor      if (EnumDecl *FoundEnum = dyn_cast<EnumDecl>(Found)) {
15725ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor        if (IsStructuralMatch(D, FoundEnum))
15735ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor          return Importer.Imported(D, FoundEnum);
157436ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor      }
157536ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor
157636ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor      ConflictingDecls.push_back(*Lookup.first);
157736ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor    }
157836ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor
157936ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor    if (!ConflictingDecls.empty()) {
158036ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor      Name = Importer.HandleNameConflict(Name, DC, IDNS,
158136ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor                                         ConflictingDecls.data(),
158236ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor                                         ConflictingDecls.size());
158336ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor    }
158436ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  }
158536ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor
158636ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  // Create the enum declaration.
158773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  EnumDecl *D2 = EnumDecl::Create(Importer.getToContext(), DC, Loc,
158836ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor                                      Name.getAsIdentifierInfo(),
158936ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor                                      Importer.Import(D->getTagKeywordLoc()),
159036ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor                                      0);
1591b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall  // Import the qualifier, if any.
1592b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall  if (D->getQualifier()) {
1593b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall    NestedNameSpecifier *NNS = Importer.Import(D->getQualifier());
1594b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall    SourceRange NNSRange = Importer.Import(D->getQualifierRange());
1595b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall    D2->setQualifierInfo(NNS, NNSRange);
1596b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall  }
1597325bf177ac0f1db7888e2d7b194515466ba91762Douglas Gregor  D2->setAccess(D->getAccess());
159873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  D2->setLexicalDeclContext(LexicalDC);
159973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  Importer.Imported(D, D2);
160073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  LexicalDC->addDecl(D2);
160136ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor
160236ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  // Import the integer type.
160336ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  QualType ToIntegerType = Importer.Import(D->getIntegerType());
160436ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  if (ToIntegerType.isNull())
160536ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor    return 0;
160673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  D2->setIntegerType(ToIntegerType);
160736ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor
160836ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  // Import the definition
160936ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  if (D->isDefinition()) {
161036ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor    QualType T = Importer.Import(Importer.getFromContext().getTypeDeclType(D));
161136ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor    if (T.isNull())
161236ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor      return 0;
161336ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor
161436ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor    QualType ToPromotionType = Importer.Import(D->getPromotionType());
161536ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor    if (ToPromotionType.isNull())
161636ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor      return 0;
161736ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor
161873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    D2->startDefinition();
1619083a821bbd02bbc521275a2f144abe39a6c2745cDouglas Gregor    ImportDeclContext(D);
162073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    D2->completeDefinition(T, ToPromotionType);
162136ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  }
162236ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor
162373dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  return D2;
162436ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor}
162536ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor
162696a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas GregorDecl *ASTNodeImporter::VisitRecordDecl(RecordDecl *D) {
162796a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  // If this record has a definition in the translation unit we're coming from,
162896a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  // but this particular declaration is not that definition, import the
162996a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  // definition and map to that.
1630952b017601f9c82b51119c3a1600f1312a833db9Douglas Gregor  TagDecl *Definition = D->getDefinition();
163196a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  if (Definition && Definition != D) {
163296a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor    Decl *ImportedDef = Importer.Import(Definition);
16335ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor    if (!ImportedDef)
16345ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor      return 0;
16355ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor
16365ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor    return Importer.Imported(D, ImportedDef);
163796a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  }
163896a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor
163996a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  // Import the major distinguishing characteristics of this record.
164096a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  DeclContext *DC, *LexicalDC;
164196a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  DeclarationName Name;
164296a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  SourceLocation Loc;
164396a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
164496a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor    return 0;
164596a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor
164696a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  // Figure out what structure name we're looking for.
164796a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  unsigned IDNS = Decl::IDNS_Tag;
164896a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  DeclarationName SearchName = Name;
164996a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  if (!SearchName && D->getTypedefForAnonDecl()) {
165096a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor    SearchName = Importer.Import(D->getTypedefForAnonDecl()->getDeclName());
165196a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor    IDNS = Decl::IDNS_Ordinary;
165296a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  } else if (Importer.getToContext().getLangOptions().CPlusPlus)
165396a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor    IDNS |= Decl::IDNS_Ordinary;
165496a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor
165596a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  // We may already have a record of the same name; try to find and match it.
1656e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor  RecordDecl *AdoptDecl = 0;
165796a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  if (!DC->isFunctionOrMethod() && SearchName) {
165896a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor    llvm::SmallVector<NamedDecl *, 4> ConflictingDecls;
165996a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor    for (DeclContext::lookup_result Lookup = DC->lookup(Name);
166096a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor         Lookup.first != Lookup.second;
166196a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor         ++Lookup.first) {
166296a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor      if (!(*Lookup.first)->isInIdentifierNamespace(IDNS))
166396a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor        continue;
166496a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor
166596a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor      Decl *Found = *Lookup.first;
166696a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor      if (TypedefDecl *Typedef = dyn_cast<TypedefDecl>(Found)) {
166796a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor        if (const TagType *Tag = Typedef->getUnderlyingType()->getAs<TagType>())
166896a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor          Found = Tag->getDecl();
166996a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor      }
167096a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor
167196a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor      if (RecordDecl *FoundRecord = dyn_cast<RecordDecl>(Found)) {
1672e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor        if (RecordDecl *FoundDef = FoundRecord->getDefinition()) {
1673e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor          if (!D->isDefinition() || IsStructuralMatch(D, FoundDef)) {
1674e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor            // The record types structurally match, or the "from" translation
1675e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor            // unit only had a forward declaration anyway; call it the same
1676e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor            // function.
1677e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor            // FIXME: For C++, we should also merge methods here.
16785ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor            return Importer.Imported(D, FoundDef);
1679e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor          }
1680e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor        } else {
1681e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor          // We have a forward declaration of this type, so adopt that forward
1682e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor          // declaration rather than building a new one.
1683e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor          AdoptDecl = FoundRecord;
1684e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor          continue;
1685e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor        }
168696a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor      }
168796a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor
168896a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor      ConflictingDecls.push_back(*Lookup.first);
168996a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor    }
169096a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor
169196a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor    if (!ConflictingDecls.empty()) {
169296a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor      Name = Importer.HandleNameConflict(Name, DC, IDNS,
169396a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor                                         ConflictingDecls.data(),
169496a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor                                         ConflictingDecls.size());
169596a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor    }
169696a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  }
169796a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor
169896a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  // Create the record declaration.
169973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  RecordDecl *D2 = AdoptDecl;
170073dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  if (!D2) {
170173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    if (CXXRecordDecl *D1CXX = dyn_cast<CXXRecordDecl>(D)) {
170273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      CXXRecordDecl *D2CXX = CXXRecordDecl::Create(Importer.getToContext(),
1703e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor                                                   D->getTagKind(),
1704e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor                                                   DC, Loc,
1705e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor                                                   Name.getAsIdentifierInfo(),
170696a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor                                        Importer.Import(D->getTagKeywordLoc()));
170773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      D2 = D2CXX;
1708325bf177ac0f1db7888e2d7b194515466ba91762Douglas Gregor      D2->setAccess(D->getAccess());
1709e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor
1710e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor      if (D->isDefinition()) {
1711e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor        // Add base classes.
1712e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor        llvm::SmallVector<CXXBaseSpecifier *, 4> Bases;
1713e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor        for (CXXRecordDecl::base_class_iterator
171473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                  Base1 = D1CXX->bases_begin(),
171573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor               FromBaseEnd = D1CXX->bases_end();
171673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor             Base1 != FromBaseEnd;
171773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor             ++Base1) {
171873dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor          QualType T = Importer.Import(Base1->getType());
1719e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor          if (T.isNull())
1720e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor            return 0;
1721e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor
1722e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor          Bases.push_back(
1723e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor            new (Importer.getToContext())
172473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                  CXXBaseSpecifier(Importer.Import(Base1->getSourceRange()),
172573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                   Base1->isVirtual(),
172673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                   Base1->isBaseOfClass(),
172773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor                                   Base1->getAccessSpecifierAsWritten(),
172896a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor                                   T));
1729e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor        }
1730e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor        if (!Bases.empty())
173173dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor          D2CXX->setBases(Bases.data(), Bases.size());
173296a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor      }
1733e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor    } else {
173473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor      D2 = RecordDecl::Create(Importer.getToContext(), D->getTagKind(),
1735e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor                                    DC, Loc,
1736e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor                                    Name.getAsIdentifierInfo(),
1737e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor                                    Importer.Import(D->getTagKeywordLoc()));
173896a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor    }
1739b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall    // Import the qualifier, if any.
1740b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall    if (D->getQualifier()) {
1741b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall      NestedNameSpecifier *NNS = Importer.Import(D->getQualifier());
1742b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall      SourceRange NNSRange = Importer.Import(D->getQualifierRange());
1743b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall      D2->setQualifierInfo(NNS, NNSRange);
1744b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall    }
174573dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    D2->setLexicalDeclContext(LexicalDC);
174673dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    LexicalDC->addDecl(D2);
174796a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  }
17485ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor
174973dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  Importer.Imported(D, D2);
1750e72b5dc556805ea4c91f0ae6d8f8404fc341b687Douglas Gregor
175196a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  if (D->isDefinition()) {
175273dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    D2->startDefinition();
1753083a821bbd02bbc521275a2f144abe39a6c2745cDouglas Gregor    ImportDeclContext(D);
175473dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor    D2->completeDefinition();
175596a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  }
175696a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor
175773dc30b71e218ba2b776b10d07dc2aff09cb2c47Douglas Gregor  return D2;
175896a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor}
175996a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor
176036ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas GregorDecl *ASTNodeImporter::VisitEnumConstantDecl(EnumConstantDecl *D) {
176136ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  // Import the major distinguishing characteristics of this enumerator.
176236ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  DeclContext *DC, *LexicalDC;
176336ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  DeclarationName Name;
176436ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  SourceLocation Loc;
1765ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
176636ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor    return 0;
1767ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor
1768ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  QualType T = Importer.Import(D->getType());
1769ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  if (T.isNull())
1770ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor    return 0;
1771ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor
177236ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  // Determine whether there are any other declarations with the same name and
177336ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  // in the same context.
177436ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  if (!LexicalDC->isFunctionOrMethod()) {
177536ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor    llvm::SmallVector<NamedDecl *, 4> ConflictingDecls;
177636ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor    unsigned IDNS = Decl::IDNS_Ordinary;
177736ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor    for (DeclContext::lookup_result Lookup = DC->lookup(Name);
177836ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor         Lookup.first != Lookup.second;
177936ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor         ++Lookup.first) {
178036ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor      if (!(*Lookup.first)->isInIdentifierNamespace(IDNS))
178136ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor        continue;
178236ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor
178336ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor      ConflictingDecls.push_back(*Lookup.first);
178436ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor    }
178536ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor
178636ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor    if (!ConflictingDecls.empty()) {
178736ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor      Name = Importer.HandleNameConflict(Name, DC, IDNS,
178836ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor                                         ConflictingDecls.data(),
178936ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor                                         ConflictingDecls.size());
179036ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor      if (!Name)
179136ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor        return 0;
179236ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor    }
179336ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  }
179436ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor
179536ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  Expr *Init = Importer.Import(D->getInitExpr());
179636ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  if (D->getInitExpr() && !Init)
179736ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor    return 0;
179836ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor
179936ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  EnumConstantDecl *ToEnumerator
180036ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor    = EnumConstantDecl::Create(Importer.getToContext(), cast<EnumDecl>(DC), Loc,
180136ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor                               Name.getAsIdentifierInfo(), T,
180236ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor                               Init, D->getInitVal());
1803325bf177ac0f1db7888e2d7b194515466ba91762Douglas Gregor  ToEnumerator->setAccess(D->getAccess());
180436ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  ToEnumerator->setLexicalDeclContext(LexicalDC);
18055ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor  Importer.Imported(D, ToEnumerator);
180636ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  LexicalDC->addDecl(ToEnumerator);
180736ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  return ToEnumerator;
180836ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor}
180996a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor
1810a404ea673cbee5e74af710a5f1ab571e71580b67Douglas GregorDecl *ASTNodeImporter::VisitFunctionDecl(FunctionDecl *D) {
1811a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  // Import the major distinguishing characteristics of this function.
1812a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  DeclContext *DC, *LexicalDC;
1813a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  DeclarationName Name;
1814a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  SourceLocation Loc;
1815ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
1816089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor    return 0;
1817089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor
1818a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  // Try to find a function in our own ("to") context with the same name, same
1819a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  // type, and in the same context as the function we're importing.
1820a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  if (!LexicalDC->isFunctionOrMethod()) {
1821a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor    llvm::SmallVector<NamedDecl *, 4> ConflictingDecls;
1822a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor    unsigned IDNS = Decl::IDNS_Ordinary;
1823a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor    for (DeclContext::lookup_result Lookup = DC->lookup(Name);
1824a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor         Lookup.first != Lookup.second;
1825a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor         ++Lookup.first) {
1826a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor      if (!(*Lookup.first)->isInIdentifierNamespace(IDNS))
1827a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor        continue;
1828a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor
1829a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor      if (FunctionDecl *FoundFunction = dyn_cast<FunctionDecl>(*Lookup.first)) {
1830a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor        if (isExternalLinkage(FoundFunction->getLinkage()) &&
1831a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor            isExternalLinkage(D->getLinkage())) {
1832ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor          if (Importer.IsStructurallyEquivalent(D->getType(),
1833ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor                                                FoundFunction->getType())) {
1834a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor            // FIXME: Actually try to merge the body and other attributes.
18355ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor            return Importer.Imported(D, FoundFunction);
1836a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor          }
1837a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor
1838a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor          // FIXME: Check for overloading more carefully, e.g., by boosting
1839a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor          // Sema::IsOverload out to the AST library.
1840a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor
1841a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor          // Function overloading is okay in C++.
1842a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor          if (Importer.getToContext().getLangOptions().CPlusPlus)
1843a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor            continue;
1844a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor
1845a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor          // Complain about inconsistent function types.
1846a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor          Importer.ToDiag(Loc, diag::err_odr_function_type_inconsistent)
1847ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor            << Name << D->getType() << FoundFunction->getType();
1848a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor          Importer.ToDiag(FoundFunction->getLocation(),
1849a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor                          diag::note_odr_value_here)
1850a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor            << FoundFunction->getType();
1851a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor        }
1852a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor      }
1853a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor
1854a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor      ConflictingDecls.push_back(*Lookup.first);
1855a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor    }
1856a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor
1857a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor    if (!ConflictingDecls.empty()) {
1858a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor      Name = Importer.HandleNameConflict(Name, DC, IDNS,
1859a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor                                         ConflictingDecls.data(),
1860a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor                                         ConflictingDecls.size());
1861a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor      if (!Name)
1862a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor        return 0;
1863a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor    }
1864a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  }
1865ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor
1866ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  // Import the type.
1867ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  QualType T = Importer.Import(D->getType());
1868ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  if (T.isNull())
1869ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor    return 0;
1870a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor
1871a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  // Import the function parameters.
1872a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  llvm::SmallVector<ParmVarDecl *, 8> Parameters;
1873a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  for (FunctionDecl::param_iterator P = D->param_begin(), PEnd = D->param_end();
1874a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor       P != PEnd; ++P) {
1875a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor    ParmVarDecl *ToP = cast_or_null<ParmVarDecl>(Importer.Import(*P));
1876a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor    if (!ToP)
1877a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor      return 0;
1878a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor
1879a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor    Parameters.push_back(ToP);
1880a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  }
1881a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor
1882a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  // Create the imported function.
1883a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo());
1884c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor  FunctionDecl *ToFunction = 0;
1885c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor  if (CXXConstructorDecl *FromConstructor = dyn_cast<CXXConstructorDecl>(D)) {
1886c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor    ToFunction = CXXConstructorDecl::Create(Importer.getToContext(),
1887c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor                                            cast<CXXRecordDecl>(DC),
1888c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor                                            Loc, Name, T, TInfo,
1889c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor                                            FromConstructor->isExplicit(),
1890c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor                                            D->isInlineSpecified(),
1891c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor                                            D->isImplicit());
1892c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor  } else if (isa<CXXDestructorDecl>(D)) {
1893c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor    ToFunction = CXXDestructorDecl::Create(Importer.getToContext(),
1894c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor                                           cast<CXXRecordDecl>(DC),
1895c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor                                           Loc, Name, T,
1896c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor                                           D->isInlineSpecified(),
1897c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor                                           D->isImplicit());
1898c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor  } else if (CXXConversionDecl *FromConversion
1899c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor                                           = dyn_cast<CXXConversionDecl>(D)) {
1900c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor    ToFunction = CXXConversionDecl::Create(Importer.getToContext(),
1901c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor                                           cast<CXXRecordDecl>(DC),
1902c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor                                           Loc, Name, T, TInfo,
1903c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor                                           D->isInlineSpecified(),
1904c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor                                           FromConversion->isExplicit());
1905c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor  } else {
1906c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor    ToFunction = FunctionDecl::Create(Importer.getToContext(), DC, Loc,
1907c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor                                      Name, T, TInfo, D->getStorageClass(),
190816573fa9705b546b7597c273b25b85d6321e2b33Douglas Gregor                                      D->getStorageClassAsWritten(),
1909c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor                                      D->isInlineSpecified(),
1910c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor                                      D->hasWrittenPrototype());
1911c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor  }
1912b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall
1913b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall  // Import the qualifier, if any.
1914b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall  if (D->getQualifier()) {
1915b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall    NestedNameSpecifier *NNS = Importer.Import(D->getQualifier());
1916b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall    SourceRange NNSRange = Importer.Import(D->getQualifierRange());
1917b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall    ToFunction->setQualifierInfo(NNS, NNSRange);
1918b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall  }
1919325bf177ac0f1db7888e2d7b194515466ba91762Douglas Gregor  ToFunction->setAccess(D->getAccess());
1920c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  ToFunction->setLexicalDeclContext(LexicalDC);
1921c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  Importer.Imported(D, ToFunction);
1922c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  LexicalDC->addDecl(ToFunction);
1923a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor
1924a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  // Set the parameters.
1925a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  for (unsigned I = 0, N = Parameters.size(); I != N; ++I) {
1926c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor    Parameters[I]->setOwningFunction(ToFunction);
1927c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor    ToFunction->addDecl(Parameters[I]);
1928a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  }
1929c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  ToFunction->setParams(Parameters.data(), Parameters.size());
1930a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor
1931a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  // FIXME: Other bits to merge?
1932a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor
1933c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  return ToFunction;
1934a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor}
1935a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor
1936c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas GregorDecl *ASTNodeImporter::VisitCXXMethodDecl(CXXMethodDecl *D) {
1937c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor  return VisitFunctionDecl(D);
1938c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor}
1939c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor
1940c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas GregorDecl *ASTNodeImporter::VisitCXXConstructorDecl(CXXConstructorDecl *D) {
1941c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor  return VisitCXXMethodDecl(D);
1942c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor}
1943c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor
1944c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas GregorDecl *ASTNodeImporter::VisitCXXDestructorDecl(CXXDestructorDecl *D) {
1945c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor  return VisitCXXMethodDecl(D);
1946c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor}
1947c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor
1948c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas GregorDecl *ASTNodeImporter::VisitCXXConversionDecl(CXXConversionDecl *D) {
1949c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor  return VisitCXXMethodDecl(D);
1950c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor}
1951c144f3534e2f7a70ea9ebf8dd83090a2883d61fbDouglas Gregor
195296a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas GregorDecl *ASTNodeImporter::VisitFieldDecl(FieldDecl *D) {
195396a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  // Import the major distinguishing characteristics of a variable.
195496a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  DeclContext *DC, *LexicalDC;
195596a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  DeclarationName Name;
195696a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  SourceLocation Loc;
1957ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
1958ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor    return 0;
1959ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor
1960ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  // Import the type.
1961ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  QualType T = Importer.Import(D->getType());
1962ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  if (T.isNull())
196396a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor    return 0;
196496a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor
196596a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo());
196696a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  Expr *BitWidth = Importer.Import(D->getBitWidth());
196796a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  if (!BitWidth && D->getBitWidth())
196896a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor    return 0;
196996a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor
197096a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  FieldDecl *ToField = FieldDecl::Create(Importer.getToContext(), DC,
197196a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor                                         Loc, Name.getAsIdentifierInfo(),
197296a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor                                         T, TInfo, BitWidth, D->isMutable());
1973325bf177ac0f1db7888e2d7b194515466ba91762Douglas Gregor  ToField->setAccess(D->getAccess());
197496a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  ToField->setLexicalDeclContext(LexicalDC);
19755ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor  Importer.Imported(D, ToField);
197696a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  LexicalDC->addDecl(ToField);
197796a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor  return ToField;
197896a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor}
197996a01b4acf76fb8fe1e05341a97a27b39fb0b914Douglas Gregor
19802e55e3af2f6d6c0509495357fade95105dd144cdDouglas GregorDecl *ASTNodeImporter::VisitObjCIvarDecl(ObjCIvarDecl *D) {
19812e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor  // Import the major distinguishing characteristics of an ivar.
19822e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor  DeclContext *DC, *LexicalDC;
19832e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor  DeclarationName Name;
19842e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor  SourceLocation Loc;
19852e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor  if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
19862e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor    return 0;
19872e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor
19882e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor  // Determine whether we've already imported this ivar
19892e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor  for (DeclContext::lookup_result Lookup = DC->lookup(Name);
19902e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor       Lookup.first != Lookup.second;
19912e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor       ++Lookup.first) {
19922e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor    if (ObjCIvarDecl *FoundIvar = dyn_cast<ObjCIvarDecl>(*Lookup.first)) {
19932e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor      if (Importer.IsStructurallyEquivalent(D->getType(),
19942e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor                                            FoundIvar->getType())) {
19952e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor        Importer.Imported(D, FoundIvar);
19962e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor        return FoundIvar;
19972e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor      }
19982e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor
19992e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor      Importer.ToDiag(Loc, diag::err_odr_ivar_type_inconsistent)
20002e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor        << Name << D->getType() << FoundIvar->getType();
20012e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor      Importer.ToDiag(FoundIvar->getLocation(), diag::note_odr_value_here)
20022e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor        << FoundIvar->getType();
20032e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor      return 0;
20042e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor    }
20052e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor  }
20062e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor
20072e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor  // Import the type.
20082e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor  QualType T = Importer.Import(D->getType());
20092e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor  if (T.isNull())
20102e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor    return 0;
20112e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor
20122e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor  TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo());
20132e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor  Expr *BitWidth = Importer.Import(D->getBitWidth());
20142e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor  if (!BitWidth && D->getBitWidth())
20152e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor    return 0;
20162e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor
2017a06549226f45d5b72169a3d054415616dd1014a2Daniel Dunbar  ObjCIvarDecl *ToIvar = ObjCIvarDecl::Create(Importer.getToContext(),
2018a06549226f45d5b72169a3d054415616dd1014a2Daniel Dunbar                                              cast<ObjCContainerDecl>(DC),
20192e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor                                              Loc, Name.getAsIdentifierInfo(),
20202e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor                                              T, TInfo, D->getAccessControl(),
20212e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor                                              BitWidth);
20222e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor  ToIvar->setLexicalDeclContext(LexicalDC);
20232e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor  Importer.Imported(D, ToIvar);
20242e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor  LexicalDC->addDecl(ToIvar);
20252e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor  return ToIvar;
20262e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor
20272e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor}
20282e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor
2029a404ea673cbee5e74af710a5f1ab571e71580b67Douglas GregorDecl *ASTNodeImporter::VisitVarDecl(VarDecl *D) {
2030a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  // Import the major distinguishing characteristics of a variable.
2031a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  DeclContext *DC, *LexicalDC;
2032a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  DeclarationName Name;
2033a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  SourceLocation Loc;
2034ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
2035a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor    return 0;
2036089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor
2037089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor  // Try to find a variable in our own ("to") context with the same name and
2038089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor  // in the same context as the variable we're importing.
20399bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor  if (D->isFileVarDecl()) {
2040089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor    VarDecl *MergeWithVar = 0;
2041089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor    llvm::SmallVector<NamedDecl *, 4> ConflictingDecls;
2042089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor    unsigned IDNS = Decl::IDNS_Ordinary;
20439bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor    for (DeclContext::lookup_result Lookup = DC->lookup(Name);
2044089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor         Lookup.first != Lookup.second;
2045089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor         ++Lookup.first) {
2046089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor      if (!(*Lookup.first)->isInIdentifierNamespace(IDNS))
2047089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor        continue;
2048089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor
2049089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor      if (VarDecl *FoundVar = dyn_cast<VarDecl>(*Lookup.first)) {
2050089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor        // We have found a variable that we may need to merge with. Check it.
2051089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor        if (isExternalLinkage(FoundVar->getLinkage()) &&
2052089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor            isExternalLinkage(D->getLinkage())) {
2053ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor          if (Importer.IsStructurallyEquivalent(D->getType(),
2054ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor                                                FoundVar->getType())) {
2055089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor            MergeWithVar = FoundVar;
2056089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor            break;
2057089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor          }
2058089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor
2059d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor          const ArrayType *FoundArray
2060d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor            = Importer.getToContext().getAsArrayType(FoundVar->getType());
2061d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor          const ArrayType *TArray
2062ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor            = Importer.getToContext().getAsArrayType(D->getType());
2063d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor          if (FoundArray && TArray) {
2064d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor            if (isa<IncompleteArrayType>(FoundArray) &&
2065d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor                isa<ConstantArrayType>(TArray)) {
2066ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor              // Import the type.
2067ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor              QualType T = Importer.Import(D->getType());
2068ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor              if (T.isNull())
2069ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor                return 0;
2070ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor
2071d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor              FoundVar->setType(T);
2072d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor              MergeWithVar = FoundVar;
2073d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor              break;
2074d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor            } else if (isa<IncompleteArrayType>(TArray) &&
2075d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor                       isa<ConstantArrayType>(FoundArray)) {
2076d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor              MergeWithVar = FoundVar;
2077d014542e1c6710d2c230b65b0cfcb8302a596b21Douglas Gregor              break;
20780f962a8e61e1c094a89df17f9d3ad947d31c4e5cDouglas Gregor            }
20790f962a8e61e1c094a89df17f9d3ad947d31c4e5cDouglas Gregor          }
20800f962a8e61e1c094a89df17f9d3ad947d31c4e5cDouglas Gregor
2081089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor          Importer.ToDiag(Loc, diag::err_odr_variable_type_inconsistent)
2082ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor            << Name << D->getType() << FoundVar->getType();
2083089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor          Importer.ToDiag(FoundVar->getLocation(), diag::note_odr_value_here)
2084089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor            << FoundVar->getType();
2085089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor        }
2086089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor      }
2087089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor
2088089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor      ConflictingDecls.push_back(*Lookup.first);
2089089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor    }
2090089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor
2091089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor    if (MergeWithVar) {
2092089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor      // An equivalent variable with external linkage has been found. Link
2093089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor      // the two declarations, then merge them.
20945ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor      Importer.Imported(D, MergeWithVar);
2095089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor
2096089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor      if (VarDecl *DDef = D->getDefinition()) {
2097089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor        if (VarDecl *ExistingDef = MergeWithVar->getDefinition()) {
2098089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor          Importer.ToDiag(ExistingDef->getLocation(),
2099089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor                          diag::err_odr_variable_multiple_def)
2100089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor            << Name;
2101089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor          Importer.FromDiag(DDef->getLocation(), diag::note_odr_defined_here);
2102089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor        } else {
2103089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor          Expr *Init = Importer.Import(DDef->getInit());
2104838db383b69b9fb55f55c8e9546477df198a4faaDouglas Gregor          MergeWithVar->setInit(Init);
2105089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor        }
2106089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor      }
2107089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor
2108089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor      return MergeWithVar;
2109089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor    }
2110089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor
2111089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor    if (!ConflictingDecls.empty()) {
2112089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor      Name = Importer.HandleNameConflict(Name, DC, IDNS,
2113089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor                                         ConflictingDecls.data(),
2114089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor                                         ConflictingDecls.size());
2115089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor      if (!Name)
2116089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor        return 0;
2117089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor    }
2118089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor  }
211982fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor
2120ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  // Import the type.
2121ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  QualType T = Importer.Import(D->getType());
2122ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  if (T.isNull())
2123ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor    return 0;
2124ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor
2125089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor  // Create the imported variable.
212682fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor  TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo());
2127089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor  VarDecl *ToVar = VarDecl::Create(Importer.getToContext(), DC, Loc,
2128089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor                                   Name.getAsIdentifierInfo(), T, TInfo,
212916573fa9705b546b7597c273b25b85d6321e2b33Douglas Gregor                                   D->getStorageClass(),
213016573fa9705b546b7597c273b25b85d6321e2b33Douglas Gregor                                   D->getStorageClassAsWritten());
2131b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall  // Import the qualifier, if any.
2132b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall  if (D->getQualifier()) {
2133b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall    NestedNameSpecifier *NNS = Importer.Import(D->getQualifier());
2134b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall    SourceRange NNSRange = Importer.Import(D->getQualifierRange());
2135b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall    ToVar->setQualifierInfo(NNS, NNSRange);
2136b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall  }
2137325bf177ac0f1db7888e2d7b194515466ba91762Douglas Gregor  ToVar->setAccess(D->getAccess());
21389bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor  ToVar->setLexicalDeclContext(LexicalDC);
21395ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor  Importer.Imported(D, ToVar);
21409bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor  LexicalDC->addDecl(ToVar);
21419bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor
2142089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor  // Merge the initializer.
2143089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor  // FIXME: Can we really import any initializer? Alternatively, we could force
2144089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor  // ourselves to import every declaration of a variable and then only use
2145089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor  // getInit() here.
2146838db383b69b9fb55f55c8e9546477df198a4faaDouglas Gregor  ToVar->setInit(Importer.Import(const_cast<Expr *>(D->getAnyInitializer())));
2147089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor
2148089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor  // FIXME: Other bits to merge?
2149089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor
2150089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor  return ToVar;
2151089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor}
2152089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor
21532cd00932b9b5403047139ce8cfaa3ae47966f894Douglas GregorDecl *ASTNodeImporter::VisitImplicitParamDecl(ImplicitParamDecl *D) {
21542cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor  // Parameters are created in the translation unit's context, then moved
21552cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor  // into the function declaration's context afterward.
21562cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor  DeclContext *DC = Importer.getToContext().getTranslationUnitDecl();
21572cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor
21582cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor  // Import the name of this declaration.
21592cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor  DeclarationName Name = Importer.Import(D->getDeclName());
21602cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor  if (D->getDeclName() && !Name)
21612cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor    return 0;
21622cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor
21632cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor  // Import the location of this declaration.
21642cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor  SourceLocation Loc = Importer.Import(D->getLocation());
21652cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor
21662cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor  // Import the parameter's type.
21672cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor  QualType T = Importer.Import(D->getType());
21682cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor  if (T.isNull())
21692cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor    return 0;
21702cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor
21712cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor  // Create the imported parameter.
21722cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor  ImplicitParamDecl *ToParm
21732cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor    = ImplicitParamDecl::Create(Importer.getToContext(), DC,
21742cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor                                Loc, Name.getAsIdentifierInfo(),
21752cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor                                T);
21762cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor  return Importer.Imported(D, ToParm);
21772cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor}
21782cd00932b9b5403047139ce8cfaa3ae47966f894Douglas Gregor
2179a404ea673cbee5e74af710a5f1ab571e71580b67Douglas GregorDecl *ASTNodeImporter::VisitParmVarDecl(ParmVarDecl *D) {
2180a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  // Parameters are created in the translation unit's context, then moved
2181a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  // into the function declaration's context afterward.
2182a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  DeclContext *DC = Importer.getToContext().getTranslationUnitDecl();
2183a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor
218482fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor  // Import the name of this declaration.
218582fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor  DeclarationName Name = Importer.Import(D->getDeclName());
218682fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor  if (D->getDeclName() && !Name)
218782fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor    return 0;
218882fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor
2189a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  // Import the location of this declaration.
2190a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  SourceLocation Loc = Importer.Import(D->getLocation());
2191a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor
2192a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  // Import the parameter's type.
2193a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  QualType T = Importer.Import(D->getType());
219482fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor  if (T.isNull())
219582fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor    return 0;
219682fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor
2197a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  // Create the imported parameter.
2198a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo());
2199a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor  ParmVarDecl *ToParm = ParmVarDecl::Create(Importer.getToContext(), DC,
2200a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor                                            Loc, Name.getAsIdentifierInfo(),
2201a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor                                            T, TInfo, D->getStorageClass(),
220216573fa9705b546b7597c273b25b85d6321e2b33Douglas Gregor                                             D->getStorageClassAsWritten(),
2203a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor                                            /*FIXME: Default argument*/ 0);
2204bf73b352acb7a2d041ce8b50171dd7f8e2b2c1bbJohn McCall  ToParm->setHasInheritedDefaultArg(D->hasInheritedDefaultArg());
22055ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor  return Importer.Imported(D, ToParm);
2206a404ea673cbee5e74af710a5f1ab571e71580b67Douglas Gregor}
220782fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor
2208c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas GregorDecl *ASTNodeImporter::VisitObjCMethodDecl(ObjCMethodDecl *D) {
2209c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  // Import the major distinguishing characteristics of a method.
2210c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  DeclContext *DC, *LexicalDC;
2211c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  DeclarationName Name;
2212c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  SourceLocation Loc;
2213c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
2214c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor    return 0;
2215c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor
2216c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  for (DeclContext::lookup_result Lookup = DC->lookup(Name);
2217c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor       Lookup.first != Lookup.second;
2218c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor       ++Lookup.first) {
2219c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor    if (ObjCMethodDecl *FoundMethod = dyn_cast<ObjCMethodDecl>(*Lookup.first)) {
2220c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor      if (FoundMethod->isInstanceMethod() != D->isInstanceMethod())
2221c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor        continue;
2222c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor
2223c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor      // Check return types.
2224c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor      if (!Importer.IsStructurallyEquivalent(D->getResultType(),
2225c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor                                             FoundMethod->getResultType())) {
2226c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor        Importer.ToDiag(Loc, diag::err_odr_objc_method_result_type_inconsistent)
2227c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor          << D->isInstanceMethod() << Name
2228c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor          << D->getResultType() << FoundMethod->getResultType();
2229c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor        Importer.ToDiag(FoundMethod->getLocation(),
2230c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor                        diag::note_odr_objc_method_here)
2231c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor          << D->isInstanceMethod() << Name;
2232c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor        return 0;
2233c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor      }
2234c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor
2235c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor      // Check the number of parameters.
2236c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor      if (D->param_size() != FoundMethod->param_size()) {
2237c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor        Importer.ToDiag(Loc, diag::err_odr_objc_method_num_params_inconsistent)
2238c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor          << D->isInstanceMethod() << Name
2239c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor          << D->param_size() << FoundMethod->param_size();
2240c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor        Importer.ToDiag(FoundMethod->getLocation(),
2241c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor                        diag::note_odr_objc_method_here)
2242c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor          << D->isInstanceMethod() << Name;
2243c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor        return 0;
2244c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor      }
2245c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor
2246c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor      // Check parameter types.
2247c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor      for (ObjCMethodDecl::param_iterator P = D->param_begin(),
2248c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor             PEnd = D->param_end(), FoundP = FoundMethod->param_begin();
2249c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor           P != PEnd; ++P, ++FoundP) {
2250c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor        if (!Importer.IsStructurallyEquivalent((*P)->getType(),
2251c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor                                               (*FoundP)->getType())) {
2252c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor          Importer.FromDiag((*P)->getLocation(),
2253c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor                            diag::err_odr_objc_method_param_type_inconsistent)
2254c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor            << D->isInstanceMethod() << Name
2255c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor            << (*P)->getType() << (*FoundP)->getType();
2256c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor          Importer.ToDiag((*FoundP)->getLocation(), diag::note_odr_value_here)
2257c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor            << (*FoundP)->getType();
2258c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor          return 0;
2259c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor        }
2260c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor      }
2261c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor
2262c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor      // Check variadic/non-variadic.
2263c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor      // Check the number of parameters.
2264c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor      if (D->isVariadic() != FoundMethod->isVariadic()) {
2265c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor        Importer.ToDiag(Loc, diag::err_odr_objc_method_variadic_inconsistent)
2266c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor          << D->isInstanceMethod() << Name;
2267c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor        Importer.ToDiag(FoundMethod->getLocation(),
2268c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor                        diag::note_odr_objc_method_here)
2269c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor          << D->isInstanceMethod() << Name;
2270c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor        return 0;
2271c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor      }
2272c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor
2273c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor      // FIXME: Any other bits we need to merge?
2274c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor      return Importer.Imported(D, FoundMethod);
2275c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor    }
2276c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  }
2277c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor
2278c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  // Import the result type.
2279c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  QualType ResultTy = Importer.Import(D->getResultType());
2280c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  if (ResultTy.isNull())
2281c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor    return 0;
2282c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor
22834bc1cb6aa635a5bf8fae99bf69c56c724c1e786cDouglas Gregor  TypeSourceInfo *ResultTInfo = Importer.Import(D->getResultTypeSourceInfo());
22844bc1cb6aa635a5bf8fae99bf69c56c724c1e786cDouglas Gregor
2285c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  ObjCMethodDecl *ToMethod
2286c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor    = ObjCMethodDecl::Create(Importer.getToContext(),
2287c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor                             Loc,
2288c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor                             Importer.Import(D->getLocEnd()),
2289c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor                             Name.getObjCSelector(),
22904bc1cb6aa635a5bf8fae99bf69c56c724c1e786cDouglas Gregor                             ResultTy, ResultTInfo, DC,
2291c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor                             D->isInstanceMethod(),
2292c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor                             D->isVariadic(),
2293c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor                             D->isSynthesized(),
2294c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor                             D->getImplementationControl());
2295c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor
2296c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  // FIXME: When we decide to merge method definitions, we'll need to
2297c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  // deal with implicit parameters.
2298c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor
2299c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  // Import the parameters
2300c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  llvm::SmallVector<ParmVarDecl *, 5> ToParams;
2301c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  for (ObjCMethodDecl::param_iterator FromP = D->param_begin(),
2302c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor                                   FromPEnd = D->param_end();
2303c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor       FromP != FromPEnd;
2304c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor       ++FromP) {
2305c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor    ParmVarDecl *ToP = cast_or_null<ParmVarDecl>(Importer.Import(*FromP));
2306c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor    if (!ToP)
2307c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor      return 0;
2308c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor
2309c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor    ToParams.push_back(ToP);
2310c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  }
2311c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor
2312c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  // Set the parameters.
2313c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  for (unsigned I = 0, N = ToParams.size(); I != N; ++I) {
2314c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor    ToParams[I]->setOwningFunction(ToMethod);
2315c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor    ToMethod->addDecl(ToParams[I]);
2316c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  }
2317c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  ToMethod->setMethodParams(Importer.getToContext(),
23184ecb25fa94897b2c03510292acace710e5262ba5Fariborz Jahanian                            ToParams.data(), ToParams.size(),
23194ecb25fa94897b2c03510292acace710e5262ba5Fariborz Jahanian                            ToParams.size());
2320c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor
2321c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  ToMethod->setLexicalDeclContext(LexicalDC);
2322c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  Importer.Imported(D, ToMethod);
2323c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  LexicalDC->addDecl(ToMethod);
2324c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  return ToMethod;
2325c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor}
2326c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor
2327b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas GregorDecl *ASTNodeImporter::VisitObjCCategoryDecl(ObjCCategoryDecl *D) {
2328b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor  // Import the major distinguishing characteristics of a category.
2329b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor  DeclContext *DC, *LexicalDC;
2330b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor  DeclarationName Name;
2331b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor  SourceLocation Loc;
2332b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor  if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
2333b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor    return 0;
2334b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor
2335b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor  ObjCInterfaceDecl *ToInterface
2336b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor    = cast_or_null<ObjCInterfaceDecl>(Importer.Import(D->getClassInterface()));
2337b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor  if (!ToInterface)
2338b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor    return 0;
2339b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor
2340b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor  // Determine if we've already encountered this category.
2341b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor  ObjCCategoryDecl *MergeWithCategory
2342b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor    = ToInterface->FindCategoryDeclaration(Name.getAsIdentifierInfo());
2343b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor  ObjCCategoryDecl *ToCategory = MergeWithCategory;
2344b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor  if (!ToCategory) {
2345b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor    ToCategory = ObjCCategoryDecl::Create(Importer.getToContext(), DC,
2346b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor                                          Importer.Import(D->getAtLoc()),
2347b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor                                          Loc,
2348b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor                                       Importer.Import(D->getCategoryNameLoc()),
2349b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor                                          Name.getAsIdentifierInfo());
2350b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor    ToCategory->setLexicalDeclContext(LexicalDC);
2351b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor    LexicalDC->addDecl(ToCategory);
2352b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor    Importer.Imported(D, ToCategory);
2353b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor
2354b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor    // Link this category into its class's category list.
2355b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor    ToCategory->setClassInterface(ToInterface);
2356b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor    ToCategory->insertNextClassCategory();
2357b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor
2358b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor    // Import protocols
2359b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor    llvm::SmallVector<ObjCProtocolDecl *, 4> Protocols;
2360b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor    llvm::SmallVector<SourceLocation, 4> ProtocolLocs;
2361b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor    ObjCCategoryDecl::protocol_loc_iterator FromProtoLoc
2362b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor      = D->protocol_loc_begin();
2363b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor    for (ObjCCategoryDecl::protocol_iterator FromProto = D->protocol_begin(),
2364b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor                                          FromProtoEnd = D->protocol_end();
2365b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor         FromProto != FromProtoEnd;
2366b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor         ++FromProto, ++FromProtoLoc) {
2367b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor      ObjCProtocolDecl *ToProto
2368b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor        = cast_or_null<ObjCProtocolDecl>(Importer.Import(*FromProto));
2369b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor      if (!ToProto)
2370b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor        return 0;
2371b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor      Protocols.push_back(ToProto);
2372b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor      ProtocolLocs.push_back(Importer.Import(*FromProtoLoc));
2373b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor    }
2374b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor
2375b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor    // FIXME: If we're merging, make sure that the protocol list is the same.
2376b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor    ToCategory->setProtocolList(Protocols.data(), Protocols.size(),
2377b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor                                ProtocolLocs.data(), Importer.getToContext());
2378b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor
2379b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor  } else {
2380b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor    Importer.Imported(D, ToCategory);
2381b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor  }
2382b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor
2383b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor  // Import all of the members of this category.
2384083a821bbd02bbc521275a2f144abe39a6c2745cDouglas Gregor  ImportDeclContext(D);
2385b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor
2386b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor  // If we have an implementation, import it as well.
2387b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor  if (D->getImplementation()) {
2388b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor    ObjCCategoryImplDecl *Impl
2389b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor      = cast<ObjCCategoryImplDecl>(Importer.Import(D->getImplementation()));
2390b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor    if (!Impl)
2391b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor      return 0;
2392b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor
2393b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor    ToCategory->setImplementation(Impl);
2394b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor  }
2395b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor
2396b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor  return ToCategory;
2397b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor}
2398b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor
23992e2a400383c7a64a927f61eeed596b08928e1d4bDouglas GregorDecl *ASTNodeImporter::VisitObjCProtocolDecl(ObjCProtocolDecl *D) {
2400b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor  // Import the major distinguishing characteristics of a protocol.
24012e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor  DeclContext *DC, *LexicalDC;
24022e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor  DeclarationName Name;
24032e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor  SourceLocation Loc;
24042e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor  if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
24052e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor    return 0;
24062e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor
24072e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor  ObjCProtocolDecl *MergeWithProtocol = 0;
24082e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor  for (DeclContext::lookup_result Lookup = DC->lookup(Name);
24092e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor       Lookup.first != Lookup.second;
24102e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor       ++Lookup.first) {
24112e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor    if (!(*Lookup.first)->isInIdentifierNamespace(Decl::IDNS_ObjCProtocol))
24122e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor      continue;
24132e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor
24142e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor    if ((MergeWithProtocol = dyn_cast<ObjCProtocolDecl>(*Lookup.first)))
24152e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor      break;
24162e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor  }
24172e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor
24182e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor  ObjCProtocolDecl *ToProto = MergeWithProtocol;
24192e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor  if (!ToProto || ToProto->isForwardDecl()) {
24202e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor    if (!ToProto) {
24212e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor      ToProto = ObjCProtocolDecl::Create(Importer.getToContext(), DC, Loc,
24222e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor                                         Name.getAsIdentifierInfo());
24232e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor      ToProto->setForwardDecl(D->isForwardDecl());
24242e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor      ToProto->setLexicalDeclContext(LexicalDC);
24252e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor      LexicalDC->addDecl(ToProto);
24262e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor    }
24272e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor    Importer.Imported(D, ToProto);
24282e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor
24292e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor    // Import protocols
24302e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor    llvm::SmallVector<ObjCProtocolDecl *, 4> Protocols;
24312e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor    llvm::SmallVector<SourceLocation, 4> ProtocolLocs;
24322e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor    ObjCProtocolDecl::protocol_loc_iterator
24332e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor      FromProtoLoc = D->protocol_loc_begin();
24342e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor    for (ObjCProtocolDecl::protocol_iterator FromProto = D->protocol_begin(),
24352e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor                                          FromProtoEnd = D->protocol_end();
24362e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor       FromProto != FromProtoEnd;
24372e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor       ++FromProto, ++FromProtoLoc) {
24382e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor      ObjCProtocolDecl *ToProto
24392e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor        = cast_or_null<ObjCProtocolDecl>(Importer.Import(*FromProto));
24402e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor      if (!ToProto)
24412e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor        return 0;
24422e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor      Protocols.push_back(ToProto);
24432e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor      ProtocolLocs.push_back(Importer.Import(*FromProtoLoc));
24442e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor    }
24452e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor
24462e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor    // FIXME: If we're merging, make sure that the protocol list is the same.
24472e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor    ToProto->setProtocolList(Protocols.data(), Protocols.size(),
24482e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor                             ProtocolLocs.data(), Importer.getToContext());
24492e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor  } else {
24502e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor    Importer.Imported(D, ToProto);
24512e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor  }
24522e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor
2453b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor  // Import all of the members of this protocol.
2454083a821bbd02bbc521275a2f144abe39a6c2745cDouglas Gregor  ImportDeclContext(D);
24552e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor
24562e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor  return ToProto;
24572e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor}
24582e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor
2459a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas GregorDecl *ASTNodeImporter::VisitObjCInterfaceDecl(ObjCInterfaceDecl *D) {
2460a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor  // Import the major distinguishing characteristics of an @interface.
2461a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor  DeclContext *DC, *LexicalDC;
2462a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor  DeclarationName Name;
2463a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor  SourceLocation Loc;
2464a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor  if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
2465a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor    return 0;
2466a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor
2467a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor  ObjCInterfaceDecl *MergeWithIface = 0;
2468a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor  for (DeclContext::lookup_result Lookup = DC->lookup(Name);
2469a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor       Lookup.first != Lookup.second;
2470a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor       ++Lookup.first) {
2471a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor    if (!(*Lookup.first)->isInIdentifierNamespace(Decl::IDNS_Ordinary))
2472a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor      continue;
2473a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor
2474a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor    if ((MergeWithIface = dyn_cast<ObjCInterfaceDecl>(*Lookup.first)))
2475a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor      break;
2476a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor  }
2477a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor
2478a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor  ObjCInterfaceDecl *ToIface = MergeWithIface;
2479a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor  if (!ToIface || ToIface->isForwardDecl()) {
2480a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor    if (!ToIface) {
2481a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor      ToIface = ObjCInterfaceDecl::Create(Importer.getToContext(),
2482a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor                                          DC, Loc,
2483a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor                                          Name.getAsIdentifierInfo(),
2484a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor                                          Importer.Import(D->getClassLoc()),
2485a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor                                          D->isForwardDecl(),
2486a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor                                          D->isImplicitInterfaceDecl());
24872e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor      ToIface->setForwardDecl(D->isForwardDecl());
2488a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor      ToIface->setLexicalDeclContext(LexicalDC);
2489a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor      LexicalDC->addDecl(ToIface);
2490a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor    }
2491a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor    Importer.Imported(D, ToIface);
2492a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor
2493a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor    if (D->getSuperClass()) {
2494a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor      ObjCInterfaceDecl *Super
2495a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor        = cast_or_null<ObjCInterfaceDecl>(Importer.Import(D->getSuperClass()));
2496a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor      if (!Super)
2497a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor        return 0;
2498a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor
2499a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor      ToIface->setSuperClass(Super);
2500a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor      ToIface->setSuperClassLoc(Importer.Import(D->getSuperClassLoc()));
2501a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor    }
2502a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor
2503a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor    // Import protocols
2504a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor    llvm::SmallVector<ObjCProtocolDecl *, 4> Protocols;
2505a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor    llvm::SmallVector<SourceLocation, 4> ProtocolLocs;
2506a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor    ObjCInterfaceDecl::protocol_loc_iterator
2507a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor      FromProtoLoc = D->protocol_loc_begin();
2508a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor    for (ObjCInterfaceDecl::protocol_iterator FromProto = D->protocol_begin(),
2509a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor                                           FromProtoEnd = D->protocol_end();
2510a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor       FromProto != FromProtoEnd;
2511a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor       ++FromProto, ++FromProtoLoc) {
2512a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor      ObjCProtocolDecl *ToProto
2513a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor        = cast_or_null<ObjCProtocolDecl>(Importer.Import(*FromProto));
2514a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor      if (!ToProto)
2515a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor        return 0;
2516a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor      Protocols.push_back(ToProto);
2517a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor      ProtocolLocs.push_back(Importer.Import(*FromProtoLoc));
2518a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor    }
2519a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor
2520a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor    // FIXME: If we're merging, make sure that the protocol list is the same.
2521a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor    ToIface->setProtocolList(Protocols.data(), Protocols.size(),
2522a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor                             ProtocolLocs.data(), Importer.getToContext());
2523a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor
2524a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor    // Import @end range
2525a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor    ToIface->setAtEndRange(Importer.Import(D->getAtEndRange()));
2526a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor  } else {
2527a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor    Importer.Imported(D, ToIface);
25282e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor
25292e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor    // Check for consistency of superclasses.
25302e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor    DeclarationName FromSuperName, ToSuperName;
25312e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor    if (D->getSuperClass())
25322e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor      FromSuperName = Importer.Import(D->getSuperClass()->getDeclName());
25332e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor    if (ToIface->getSuperClass())
25342e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor      ToSuperName = ToIface->getSuperClass()->getDeclName();
25352e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor    if (FromSuperName != ToSuperName) {
25362e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor      Importer.ToDiag(ToIface->getLocation(),
25372e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor                      diag::err_odr_objc_superclass_inconsistent)
25382e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor        << ToIface->getDeclName();
25392e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor      if (ToIface->getSuperClass())
25402e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor        Importer.ToDiag(ToIface->getSuperClassLoc(),
25412e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor                        diag::note_odr_objc_superclass)
25422e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor          << ToIface->getSuperClass()->getDeclName();
25432e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor      else
25442e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor        Importer.ToDiag(ToIface->getLocation(),
25452e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor                        diag::note_odr_objc_missing_superclass);
25462e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor      if (D->getSuperClass())
25472e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor        Importer.FromDiag(D->getSuperClassLoc(),
25482e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor                          diag::note_odr_objc_superclass)
25492e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor          << D->getSuperClass()->getDeclName();
25502e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor      else
25512e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor        Importer.FromDiag(D->getLocation(),
25522e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor                          diag::note_odr_objc_missing_superclass);
25532e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor      return 0;
25542e55e3af2f6d6c0509495357fade95105dd144cdDouglas Gregor    }
2555a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor  }
2556a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor
2557b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor  // Import categories. When the categories themselves are imported, they'll
2558b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor  // hook themselves into this interface.
2559b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor  for (ObjCCategoryDecl *FromCat = D->getCategoryList(); FromCat;
2560b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor       FromCat = FromCat->getNextClassCategory())
2561b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor    Importer.Import(FromCat);
2562b4677b62a8e9bba0913dfe1456bd9d689cdbccacDouglas Gregor
2563a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor  // Import all of the members of this class.
2564083a821bbd02bbc521275a2f144abe39a6c2745cDouglas Gregor  ImportDeclContext(D);
2565a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor
2566a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor  // If we have an @implementation, import it as well.
2567a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor  if (D->getImplementation()) {
2568a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor    ObjCImplementationDecl *Impl
2569a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor      = cast<ObjCImplementationDecl>(Importer.Import(D->getImplementation()));
2570a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor    if (!Impl)
2571a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor      return 0;
2572a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor
2573a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor    ToIface->setImplementation(Impl);
2574a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor  }
2575a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor
25762e2a400383c7a64a927f61eeed596b08928e1d4bDouglas Gregor  return ToIface;
2577a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor}
2578a12d294db5bd59cd8836b9bd0dafadaaa2e3dd8aDouglas Gregor
2579e3261624c1870e52d7efc2ac83e647713361ac6cDouglas GregorDecl *ASTNodeImporter::VisitObjCPropertyDecl(ObjCPropertyDecl *D) {
2580e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor  // Import the major distinguishing characteristics of an @property.
2581e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor  DeclContext *DC, *LexicalDC;
2582e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor  DeclarationName Name;
2583e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor  SourceLocation Loc;
2584e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor  if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
2585e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor    return 0;
2586e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor
2587e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor  // Check whether we have already imported this property.
2588e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor  for (DeclContext::lookup_result Lookup = DC->lookup(Name);
2589e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor       Lookup.first != Lookup.second;
2590e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor       ++Lookup.first) {
2591e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor    if (ObjCPropertyDecl *FoundProp
2592e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor                                = dyn_cast<ObjCPropertyDecl>(*Lookup.first)) {
2593e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor      // Check property types.
2594e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor      if (!Importer.IsStructurallyEquivalent(D->getType(),
2595e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor                                             FoundProp->getType())) {
2596e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor        Importer.ToDiag(Loc, diag::err_odr_objc_property_type_inconsistent)
2597e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor          << Name << D->getType() << FoundProp->getType();
2598e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor        Importer.ToDiag(FoundProp->getLocation(), diag::note_odr_value_here)
2599e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor          << FoundProp->getType();
2600e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor        return 0;
2601e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor      }
2602e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor
2603e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor      // FIXME: Check property attributes, getters, setters, etc.?
2604e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor
2605e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor      // Consider these properties to be equivalent.
2606e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor      Importer.Imported(D, FoundProp);
2607e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor      return FoundProp;
2608e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor    }
2609e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor  }
2610e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor
2611e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor  // Import the type.
2612e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor  QualType T = Importer.Import(D->getType());
2613e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor  if (T.isNull())
2614e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor    return 0;
2615e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor
2616e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor  // Create the new property.
2617e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor  ObjCPropertyDecl *ToProperty
2618e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor    = ObjCPropertyDecl::Create(Importer.getToContext(), DC, Loc,
2619e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor                               Name.getAsIdentifierInfo(),
2620e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor                               Importer.Import(D->getAtLoc()),
2621e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor                               T,
2622e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor                               D->getPropertyImplementation());
2623e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor  Importer.Imported(D, ToProperty);
2624e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor  ToProperty->setLexicalDeclContext(LexicalDC);
2625e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor  LexicalDC->addDecl(ToProperty);
2626e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor
2627e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor  ToProperty->setPropertyAttributes(D->getPropertyAttributes());
2628e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor  ToProperty->setGetterName(Importer.Import(D->getGetterName()));
2629e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor  ToProperty->setSetterName(Importer.Import(D->getSetterName()));
2630e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor  ToProperty->setGetterMethodDecl(
2631e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor     cast_or_null<ObjCMethodDecl>(Importer.Import(D->getGetterMethodDecl())));
2632e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor  ToProperty->setSetterMethodDecl(
2633e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor     cast_or_null<ObjCMethodDecl>(Importer.Import(D->getSetterMethodDecl())));
2634e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor  ToProperty->setPropertyIvarDecl(
2635e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor       cast_or_null<ObjCIvarDecl>(Importer.Import(D->getPropertyIvarDecl())));
2636e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor  return ToProperty;
2637e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor}
2638e3261624c1870e52d7efc2ac83e647713361ac6cDouglas Gregor
26392b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas GregorDecl *
26402b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas GregorASTNodeImporter::VisitObjCForwardProtocolDecl(ObjCForwardProtocolDecl *D) {
26412b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor  // Import the context of this declaration.
26422b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor  DeclContext *DC = Importer.ImportContext(D->getDeclContext());
26432b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor  if (!DC)
26442b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor    return 0;
26452b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor
26462b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor  DeclContext *LexicalDC = DC;
26472b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor  if (D->getDeclContext() != D->getLexicalDeclContext()) {
26482b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor    LexicalDC = Importer.ImportContext(D->getLexicalDeclContext());
26492b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor    if (!LexicalDC)
26502b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor      return 0;
26512b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor  }
26522b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor
26532b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor  // Import the location of this declaration.
26542b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor  SourceLocation Loc = Importer.Import(D->getLocation());
26552b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor
26562b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor  llvm::SmallVector<ObjCProtocolDecl *, 4> Protocols;
26572b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor  llvm::SmallVector<SourceLocation, 4> Locations;
26582b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor  ObjCForwardProtocolDecl::protocol_loc_iterator FromProtoLoc
26592b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor    = D->protocol_loc_begin();
26602b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor  for (ObjCForwardProtocolDecl::protocol_iterator FromProto
26612b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor         = D->protocol_begin(), FromProtoEnd = D->protocol_end();
26622b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor       FromProto != FromProtoEnd;
26632b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor       ++FromProto, ++FromProtoLoc) {
26642b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor    ObjCProtocolDecl *ToProto
26652b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor      = cast_or_null<ObjCProtocolDecl>(Importer.Import(*FromProto));
26662b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor    if (!ToProto)
26672b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor      continue;
26682b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor
26692b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor    Protocols.push_back(ToProto);
26702b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor    Locations.push_back(Importer.Import(*FromProtoLoc));
26712b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor  }
26722b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor
26732b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor  ObjCForwardProtocolDecl *ToForward
26742b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor    = ObjCForwardProtocolDecl::Create(Importer.getToContext(), DC, Loc,
26752b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor                                      Protocols.data(), Protocols.size(),
26762b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor                                      Locations.data());
26772b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor  ToForward->setLexicalDeclContext(LexicalDC);
26782b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor  LexicalDC->addDecl(ToForward);
26792b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor  Importer.Imported(D, ToForward);
26802b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor  return ToForward;
26812b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor}
26822b785022973202ea6bafe304a50eb3cac1a0aeb8Douglas Gregor
2683a2bc15b7463a9f85a5bff1531d833c278426a733Douglas GregorDecl *ASTNodeImporter::VisitObjCClassDecl(ObjCClassDecl *D) {
2684a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor  // Import the context of this declaration.
2685a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor  DeclContext *DC = Importer.ImportContext(D->getDeclContext());
2686a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor  if (!DC)
2687a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor    return 0;
2688a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor
2689a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor  DeclContext *LexicalDC = DC;
2690a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor  if (D->getDeclContext() != D->getLexicalDeclContext()) {
2691a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor    LexicalDC = Importer.ImportContext(D->getLexicalDeclContext());
2692a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor    if (!LexicalDC)
2693a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor      return 0;
2694a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor  }
2695a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor
2696a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor  // Import the location of this declaration.
2697a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor  SourceLocation Loc = Importer.Import(D->getLocation());
2698a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor
2699a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor  llvm::SmallVector<ObjCInterfaceDecl *, 4> Interfaces;
2700a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor  llvm::SmallVector<SourceLocation, 4> Locations;
2701a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor  for (ObjCClassDecl::iterator From = D->begin(), FromEnd = D->end();
2702a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor       From != FromEnd; ++From) {
2703a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor    ObjCInterfaceDecl *ToIface
2704a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor      = cast_or_null<ObjCInterfaceDecl>(Importer.Import(From->getInterface()));
2705a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor    if (!ToIface)
2706a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor      continue;
2707a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor
2708a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor    Interfaces.push_back(ToIface);
2709a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor    Locations.push_back(Importer.Import(From->getLocation()));
2710a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor  }
2711a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor
2712a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor  ObjCClassDecl *ToClass = ObjCClassDecl::Create(Importer.getToContext(), DC,
2713a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor                                                 Loc,
2714a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor                                                 Interfaces.data(),
2715a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor                                                 Locations.data(),
2716a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor                                                 Interfaces.size());
2717a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor  ToClass->setLexicalDeclContext(LexicalDC);
2718a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor  LexicalDC->addDecl(ToClass);
2719a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor  Importer.Imported(D, ToClass);
2720a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor  return ToClass;
2721a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor}
2722a2bc15b7463a9f85a5bff1531d833c278426a733Douglas Gregor
27234800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor//----------------------------------------------------------------------------
27244800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor// Import Statements
27254800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor//----------------------------------------------------------------------------
27264800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor
27274800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas GregorStmt *ASTNodeImporter::VisitStmt(Stmt *S) {
27284800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor  Importer.FromDiag(S->getLocStart(), diag::err_unsupported_ast_node)
27294800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor    << S->getStmtClassName();
27304800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor  return 0;
27314800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor}
27324800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor
27334800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor//----------------------------------------------------------------------------
27344800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor// Import Expressions
27354800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor//----------------------------------------------------------------------------
27364800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas GregorExpr *ASTNodeImporter::VisitExpr(Expr *E) {
27374800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor  Importer.FromDiag(E->getLocStart(), diag::err_unsupported_ast_node)
27384800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor    << E->getStmtClassName();
27394800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor  return 0;
27404800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor}
27414800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor
2742440806306674e23ad74726208cbdc6f37849dd9dDouglas GregorExpr *ASTNodeImporter::VisitDeclRefExpr(DeclRefExpr *E) {
2743440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor  NestedNameSpecifier *Qualifier = 0;
2744440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor  if (E->getQualifier()) {
2745440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor    Qualifier = Importer.Import(E->getQualifier());
2746440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor    if (!E->getQualifier())
2747440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor      return 0;
2748440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor  }
2749440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor
2750440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor  ValueDecl *ToD = cast_or_null<ValueDecl>(Importer.Import(E->getDecl()));
2751440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor  if (!ToD)
2752440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor    return 0;
2753440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor
2754440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor  QualType T = Importer.Import(E->getType());
2755440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor  if (T.isNull())
2756440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor    return 0;
2757440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor
2758440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor  return DeclRefExpr::Create(Importer.getToContext(), Qualifier,
2759440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor                             Importer.Import(E->getQualifierRange()),
2760440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor                             ToD,
2761440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor                             Importer.Import(E->getLocation()),
2762440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor                             T,
2763440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor                             /*FIXME:TemplateArgs=*/0);
2764440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor}
2765440806306674e23ad74726208cbdc6f37849dd9dDouglas Gregor
27664800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas GregorExpr *ASTNodeImporter::VisitIntegerLiteral(IntegerLiteral *E) {
27674800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor  QualType T = Importer.Import(E->getType());
27684800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor  if (T.isNull())
27694800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor    return 0;
27704800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor
27714800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor  return new (Importer.getToContext())
27724800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor    IntegerLiteral(E->getValue(), T, Importer.Import(E->getLocation()));
27734800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor}
27744800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor
2775b2e400aae8c62c4e1616016f40618baace0da065Douglas GregorExpr *ASTNodeImporter::VisitCharacterLiteral(CharacterLiteral *E) {
2776b2e400aae8c62c4e1616016f40618baace0da065Douglas Gregor  QualType T = Importer.Import(E->getType());
2777b2e400aae8c62c4e1616016f40618baace0da065Douglas Gregor  if (T.isNull())
2778b2e400aae8c62c4e1616016f40618baace0da065Douglas Gregor    return 0;
2779b2e400aae8c62c4e1616016f40618baace0da065Douglas Gregor
2780b2e400aae8c62c4e1616016f40618baace0da065Douglas Gregor  return new (Importer.getToContext()) CharacterLiteral(E->getValue(),
2781b2e400aae8c62c4e1616016f40618baace0da065Douglas Gregor                                                        E->isWide(), T,
2782b2e400aae8c62c4e1616016f40618baace0da065Douglas Gregor                                          Importer.Import(E->getLocation()));
2783b2e400aae8c62c4e1616016f40618baace0da065Douglas Gregor}
2784b2e400aae8c62c4e1616016f40618baace0da065Douglas Gregor
2785f638f9580ba0da99a66668f00e1a1d4987067bddDouglas GregorExpr *ASTNodeImporter::VisitParenExpr(ParenExpr *E) {
2786f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor  Expr *SubExpr = Importer.Import(E->getSubExpr());
2787f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor  if (!SubExpr)
2788f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor    return 0;
2789f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor
2790f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor  return new (Importer.getToContext())
2791f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor                                  ParenExpr(Importer.Import(E->getLParen()),
2792f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor                                            Importer.Import(E->getRParen()),
2793f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor                                            SubExpr);
2794f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor}
2795f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor
2796f638f9580ba0da99a66668f00e1a1d4987067bddDouglas GregorExpr *ASTNodeImporter::VisitUnaryOperator(UnaryOperator *E) {
2797f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor  QualType T = Importer.Import(E->getType());
2798f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor  if (T.isNull())
2799f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor    return 0;
2800f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor
2801f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor  Expr *SubExpr = Importer.Import(E->getSubExpr());
2802f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor  if (!SubExpr)
2803f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor    return 0;
2804f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor
2805f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor  return new (Importer.getToContext()) UnaryOperator(SubExpr, E->getOpcode(),
2806f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor                                                     T,
2807f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor                                         Importer.Import(E->getOperatorLoc()));
2808f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor}
2809f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor
2810bd249a542878a626192746c1e0c0b21f164e6df7Douglas GregorExpr *ASTNodeImporter::VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) {
2811bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor  QualType ResultType = Importer.Import(E->getType());
2812bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor
2813bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor  if (E->isArgumentType()) {
2814bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor    TypeSourceInfo *TInfo = Importer.Import(E->getArgumentTypeInfo());
2815bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor    if (!TInfo)
2816bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor      return 0;
2817bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor
2818bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor    return new (Importer.getToContext()) SizeOfAlignOfExpr(E->isSizeOf(),
2819bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor                                                           TInfo, ResultType,
2820bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor                                           Importer.Import(E->getOperatorLoc()),
2821bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor                                           Importer.Import(E->getRParenLoc()));
2822bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor  }
2823bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor
2824bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor  Expr *SubExpr = Importer.Import(E->getArgumentExpr());
2825bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor  if (!SubExpr)
2826bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor    return 0;
2827bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor
2828bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor  return new (Importer.getToContext()) SizeOfAlignOfExpr(E->isSizeOf(),
2829bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor                                                         SubExpr, ResultType,
2830bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor                                          Importer.Import(E->getOperatorLoc()),
2831bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor                                          Importer.Import(E->getRParenLoc()));
2832bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor}
2833bd249a542878a626192746c1e0c0b21f164e6df7Douglas Gregor
2834f638f9580ba0da99a66668f00e1a1d4987067bddDouglas GregorExpr *ASTNodeImporter::VisitBinaryOperator(BinaryOperator *E) {
2835f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor  QualType T = Importer.Import(E->getType());
2836f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor  if (T.isNull())
2837f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor    return 0;
2838f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor
2839f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor  Expr *LHS = Importer.Import(E->getLHS());
2840f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor  if (!LHS)
2841f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor    return 0;
2842f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor
2843f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor  Expr *RHS = Importer.Import(E->getRHS());
2844f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor  if (!RHS)
2845f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor    return 0;
2846f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor
2847f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor  return new (Importer.getToContext()) BinaryOperator(LHS, RHS, E->getOpcode(),
2848f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor                                                      T,
2849f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor                                          Importer.Import(E->getOperatorLoc()));
2850f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor}
2851f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor
2852f638f9580ba0da99a66668f00e1a1d4987067bddDouglas GregorExpr *ASTNodeImporter::VisitCompoundAssignOperator(CompoundAssignOperator *E) {
2853f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor  QualType T = Importer.Import(E->getType());
2854f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor  if (T.isNull())
2855f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor    return 0;
2856f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor
2857f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor  QualType CompLHSType = Importer.Import(E->getComputationLHSType());
2858f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor  if (CompLHSType.isNull())
2859f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor    return 0;
2860f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor
2861f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor  QualType CompResultType = Importer.Import(E->getComputationResultType());
2862f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor  if (CompResultType.isNull())
2863f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor    return 0;
2864f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor
2865f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor  Expr *LHS = Importer.Import(E->getLHS());
2866f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor  if (!LHS)
2867f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor    return 0;
2868f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor
2869f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor  Expr *RHS = Importer.Import(E->getRHS());
2870f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor  if (!RHS)
2871f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor    return 0;
2872f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor
2873f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor  return new (Importer.getToContext())
2874f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor                        CompoundAssignOperator(LHS, RHS, E->getOpcode(),
2875f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor                                               T, CompLHSType, CompResultType,
2876f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor                                          Importer.Import(E->getOperatorLoc()));
2877f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor}
2878f638f9580ba0da99a66668f00e1a1d4987067bddDouglas Gregor
287936ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas GregorExpr *ASTNodeImporter::VisitImplicitCastExpr(ImplicitCastExpr *E) {
288036ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  QualType T = Importer.Import(E->getType());
288136ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  if (T.isNull())
288236ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor    return 0;
288336ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor
288436ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  Expr *SubExpr = Importer.Import(E->getSubExpr());
288536ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  if (!SubExpr)
288636ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor    return 0;
288736ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor
288836ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor  return new (Importer.getToContext()) ImplicitCastExpr(T, E->getCastKind(),
288936ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor                                                        SubExpr,
289036ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor                                                        E->isLvalueCast());
289136ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor}
289236ead2e992abb30aa3b4a40b4c8cb22cc9389fefDouglas Gregor
2893008847a70ab122a99911149199855060fb3753b4Douglas GregorExpr *ASTNodeImporter::VisitCStyleCastExpr(CStyleCastExpr *E) {
2894008847a70ab122a99911149199855060fb3753b4Douglas Gregor  QualType T = Importer.Import(E->getType());
2895008847a70ab122a99911149199855060fb3753b4Douglas Gregor  if (T.isNull())
2896008847a70ab122a99911149199855060fb3753b4Douglas Gregor    return 0;
2897008847a70ab122a99911149199855060fb3753b4Douglas Gregor
2898008847a70ab122a99911149199855060fb3753b4Douglas Gregor  Expr *SubExpr = Importer.Import(E->getSubExpr());
2899008847a70ab122a99911149199855060fb3753b4Douglas Gregor  if (!SubExpr)
2900008847a70ab122a99911149199855060fb3753b4Douglas Gregor    return 0;
2901008847a70ab122a99911149199855060fb3753b4Douglas Gregor
2902008847a70ab122a99911149199855060fb3753b4Douglas Gregor  TypeSourceInfo *TInfo = Importer.Import(E->getTypeInfoAsWritten());
2903008847a70ab122a99911149199855060fb3753b4Douglas Gregor  if (!TInfo && E->getTypeInfoAsWritten())
2904008847a70ab122a99911149199855060fb3753b4Douglas Gregor    return 0;
2905008847a70ab122a99911149199855060fb3753b4Douglas Gregor
2906008847a70ab122a99911149199855060fb3753b4Douglas Gregor  return new (Importer.getToContext()) CStyleCastExpr(T, E->getCastKind(),
2907008847a70ab122a99911149199855060fb3753b4Douglas Gregor                                                      SubExpr, TInfo,
2908008847a70ab122a99911149199855060fb3753b4Douglas Gregor                                            Importer.Import(E->getLParenLoc()),
2909008847a70ab122a99911149199855060fb3753b4Douglas Gregor                                            Importer.Import(E->getRParenLoc()));
2910008847a70ab122a99911149199855060fb3753b4Douglas Gregor}
2911008847a70ab122a99911149199855060fb3753b4Douglas Gregor
29124800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas GregorASTImporter::ASTImporter(Diagnostic &Diags,
29134800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor                         ASTContext &ToContext, FileManager &ToFileManager,
29144800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor                         ASTContext &FromContext, FileManager &FromFileManager)
29151b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  : ToContext(ToContext), FromContext(FromContext),
2916885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor    ToFileManager(ToFileManager), FromFileManager(FromFileManager),
29174800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor    Diags(Diags) {
29189bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor  ImportedDecls[FromContext.getTranslationUnitDecl()]
29199bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor    = ToContext.getTranslationUnitDecl();
29209bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor}
29219bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor
29229bed8798964d9f07599c2c9199701f86fbc70e20Douglas GregorASTImporter::~ASTImporter() { }
29231b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
29241b2949d27ec72894dec017c330c0548af4bb2476Douglas GregorQualType ASTImporter::Import(QualType FromT) {
29251b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  if (FromT.isNull())
29261b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return QualType();
29271b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
2928169fba50da76d71723cd1d91629cabb310f8bf9eDouglas Gregor  // Check whether we've already imported this type.
2929169fba50da76d71723cd1d91629cabb310f8bf9eDouglas Gregor  llvm::DenseMap<Type *, Type *>::iterator Pos
2930169fba50da76d71723cd1d91629cabb310f8bf9eDouglas Gregor    = ImportedTypes.find(FromT.getTypePtr());
2931169fba50da76d71723cd1d91629cabb310f8bf9eDouglas Gregor  if (Pos != ImportedTypes.end())
2932169fba50da76d71723cd1d91629cabb310f8bf9eDouglas Gregor    return ToContext.getQualifiedType(Pos->second, FromT.getQualifiers());
29331b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
2934169fba50da76d71723cd1d91629cabb310f8bf9eDouglas Gregor  // Import the type
29351b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  ASTNodeImporter Importer(*this);
29361b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  QualType ToT = Importer.Visit(FromT.getTypePtr());
29371b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  if (ToT.isNull())
29381b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return ToT;
29391b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
2940169fba50da76d71723cd1d91629cabb310f8bf9eDouglas Gregor  // Record the imported type.
2941169fba50da76d71723cd1d91629cabb310f8bf9eDouglas Gregor  ImportedTypes[FromT.getTypePtr()] = ToT.getTypePtr();
2942169fba50da76d71723cd1d91629cabb310f8bf9eDouglas Gregor
29431b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  return ToContext.getQualifiedType(ToT, FromT.getQualifiers());
29441b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor}
29451b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
29469bed8798964d9f07599c2c9199701f86fbc70e20Douglas GregorTypeSourceInfo *ASTImporter::Import(TypeSourceInfo *FromTSI) {
294782fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor  if (!FromTSI)
294882fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor    return FromTSI;
294982fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor
295082fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor  // FIXME: For now we just create a "trivial" type source info based
295182fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor  // on the type and a seingle location. Implement a real version of
295282fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor  // this.
295382fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor  QualType T = Import(FromTSI->getType());
295482fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor  if (T.isNull())
295582fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor    return 0;
295682fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor
295782fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor  return ToContext.getTrivialTypeSourceInfo(T,
295882fc4bfa6f8ea35488b9038dd83d40766c3645cfDouglas Gregor                        FromTSI->getTypeLoc().getFullSourceRange().getBegin());
29599bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor}
29609bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor
29619bed8798964d9f07599c2c9199701f86fbc70e20Douglas GregorDecl *ASTImporter::Import(Decl *FromD) {
29629bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor  if (!FromD)
29639bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor    return 0;
29649bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor
29659bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor  // Check whether we've already imported this declaration.
29669bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor  llvm::DenseMap<Decl *, Decl *>::iterator Pos = ImportedDecls.find(FromD);
29679bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor  if (Pos != ImportedDecls.end())
29689bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor    return Pos->second;
29699bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor
29709bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor  // Import the type
29719bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor  ASTNodeImporter Importer(*this);
29729bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor  Decl *ToD = Importer.Visit(FromD);
29739bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor  if (!ToD)
29749bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor    return 0;
29759bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor
29769bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor  // Record the imported declaration.
29779bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor  ImportedDecls[FromD] = ToD;
2978ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor
2979ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  if (TagDecl *FromTag = dyn_cast<TagDecl>(FromD)) {
2980ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor    // Keep track of anonymous tags that have an associated typedef.
2981ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor    if (FromTag->getTypedefForAnonDecl())
2982ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor      AnonTagsWithPendingTypedefs.push_back(FromTag);
2983ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  } else if (TypedefDecl *FromTypedef = dyn_cast<TypedefDecl>(FromD)) {
2984ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor    // When we've finished transforming a typedef, see whether it was the
2985ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor    // typedef for an anonymous tag.
2986ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor    for (llvm::SmallVector<TagDecl *, 4>::iterator
2987ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor               FromTag = AnonTagsWithPendingTypedefs.begin(),
2988ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor            FromTagEnd = AnonTagsWithPendingTypedefs.end();
2989ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor         FromTag != FromTagEnd; ++FromTag) {
2990ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor      if ((*FromTag)->getTypedefForAnonDecl() == FromTypedef) {
2991ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor        if (TagDecl *ToTag = cast_or_null<TagDecl>(Import(*FromTag))) {
2992ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor          // We found the typedef for an anonymous tag; link them.
2993ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor          ToTag->setTypedefForAnonDecl(cast<TypedefDecl>(ToD));
2994ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor          AnonTagsWithPendingTypedefs.erase(FromTag);
2995ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor          break;
2996ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor        }
2997ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor      }
2998ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor    }
2999ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  }
3000ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor
30019bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor  return ToD;
30029bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor}
30039bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor
30049bed8798964d9f07599c2c9199701f86fbc70e20Douglas GregorDeclContext *ASTImporter::ImportContext(DeclContext *FromDC) {
30059bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor  if (!FromDC)
30069bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor    return FromDC;
30079bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor
30089bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor  return cast_or_null<DeclContext>(Import(cast<Decl>(FromDC)));
30099bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor}
30109bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor
30119bed8798964d9f07599c2c9199701f86fbc70e20Douglas GregorExpr *ASTImporter::Import(Expr *FromE) {
30129bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor  if (!FromE)
30139bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor    return 0;
30149bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor
30159bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor  return cast_or_null<Expr>(Import(cast<Stmt>(FromE)));
30169bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor}
30179bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor
30189bed8798964d9f07599c2c9199701f86fbc70e20Douglas GregorStmt *ASTImporter::Import(Stmt *FromS) {
30199bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor  if (!FromS)
30209bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor    return 0;
30219bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor
30224800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor  // Check whether we've already imported this declaration.
30234800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor  llvm::DenseMap<Stmt *, Stmt *>::iterator Pos = ImportedStmts.find(FromS);
30244800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor  if (Pos != ImportedStmts.end())
30254800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor    return Pos->second;
30264800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor
30274800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor  // Import the type
30284800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor  ASTNodeImporter Importer(*this);
30294800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor  Stmt *ToS = Importer.Visit(FromS);
30304800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor  if (!ToS)
30314800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor    return 0;
30324800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor
30334800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor  // Record the imported declaration.
30344800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor  ImportedStmts[FromS] = ToS;
30354800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor  return ToS;
30369bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor}
30379bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor
30389bed8798964d9f07599c2c9199701f86fbc70e20Douglas GregorNestedNameSpecifier *ASTImporter::Import(NestedNameSpecifier *FromNNS) {
30399bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor  if (!FromNNS)
30409bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor    return 0;
30419bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor
30429bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor  // FIXME: Implement!
30439bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor  return 0;
30449bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor}
30459bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor
30469bed8798964d9f07599c2c9199701f86fbc70e20Douglas GregorSourceLocation ASTImporter::Import(SourceLocation FromLoc) {
30479bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor  if (FromLoc.isInvalid())
30489bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor    return SourceLocation();
30499bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor
3050885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor  SourceManager &FromSM = FromContext.getSourceManager();
3051885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor
3052885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor  // For now, map everything down to its spelling location, so that we
3053885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor  // don't have to import macro instantiations.
3054885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor  // FIXME: Import macro instantiations!
3055885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor  FromLoc = FromSM.getSpellingLoc(FromLoc);
3056885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor  std::pair<FileID, unsigned> Decomposed = FromSM.getDecomposedLoc(FromLoc);
3057885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor  SourceManager &ToSM = ToContext.getSourceManager();
3058885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor  return ToSM.getLocForStartOfFile(Import(Decomposed.first))
3059885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor             .getFileLocWithOffset(Decomposed.second);
30609bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor}
30619bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor
30629bed8798964d9f07599c2c9199701f86fbc70e20Douglas GregorSourceRange ASTImporter::Import(SourceRange FromRange) {
30639bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor  return SourceRange(Import(FromRange.getBegin()), Import(FromRange.getEnd()));
30649bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor}
30659bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor
3066885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas GregorFileID ASTImporter::Import(FileID FromID) {
3067885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor  llvm::DenseMap<unsigned, FileID>::iterator Pos
3068885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor    = ImportedFileIDs.find(FromID.getHashValue());
3069885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor  if (Pos != ImportedFileIDs.end())
3070885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor    return Pos->second;
3071885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor
3072885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor  SourceManager &FromSM = FromContext.getSourceManager();
3073885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor  SourceManager &ToSM = ToContext.getSourceManager();
3074885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor  const SrcMgr::SLocEntry &FromSLoc = FromSM.getSLocEntry(FromID);
3075885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor  assert(FromSLoc.isFile() && "Cannot handle macro instantiations yet");
3076885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor
3077885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor  // Include location of this file.
3078885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor  SourceLocation ToIncludeLoc = Import(FromSLoc.getFile().getIncludeLoc());
3079885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor
3080885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor  // Map the FileID for to the "to" source manager.
3081885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor  FileID ToID;
3082885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor  const SrcMgr::ContentCache *Cache = FromSLoc.getFile().getContentCache();
3083885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor  if (Cache->Entry) {
3084885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor    // FIXME: We probably want to use getVirtualFile(), so we don't hit the
3085885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor    // disk again
3086885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor    // FIXME: We definitely want to re-use the existing MemoryBuffer, rather
3087885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor    // than mmap the files several times.
3088885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor    const FileEntry *Entry = ToFileManager.getFile(Cache->Entry->getName());
3089885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor    ToID = ToSM.createFileID(Entry, ToIncludeLoc,
3090885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor                             FromSLoc.getFile().getFileCharacteristic());
3091885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor  } else {
3092885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor    // FIXME: We want to re-use the existing MemoryBuffer!
309336c35ba0aca641e60e5dbee8efbc620c08b9bd61Douglas Gregor    const llvm::MemoryBuffer *FromBuf = Cache->getBuffer(getDiags());
3094885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor    llvm::MemoryBuffer *ToBuf
3095a0a270c0f1c0a4e3482438bdc5f4a7bd3d25f0a6Chris Lattner      = llvm::MemoryBuffer::getMemBufferCopy(FromBuf->getBuffer(),
3096885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor                                             FromBuf->getBufferIdentifier());
3097885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor    ToID = ToSM.createFileIDForMemBuffer(ToBuf);
3098885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor  }
3099885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor
3100885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor
3101885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor  ImportedFileIDs[FromID.getHashValue()] = ToID;
3102885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor  return ToID;
3103885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor}
3104885237354fd902998c6ae9d7cc3dc8de96b123dcDouglas Gregor
31051b2949d27ec72894dec017c330c0548af4bb2476Douglas GregorDeclarationName ASTImporter::Import(DeclarationName FromName) {
31061b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  if (!FromName)
31071b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return DeclarationName();
31081b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
31091b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  switch (FromName.getNameKind()) {
31101b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case DeclarationName::Identifier:
31111b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return Import(FromName.getAsIdentifierInfo());
31121b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
31131b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case DeclarationName::ObjCZeroArgSelector:
31141b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case DeclarationName::ObjCOneArgSelector:
31151b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case DeclarationName::ObjCMultiArgSelector:
31161b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return Import(FromName.getObjCSelector());
31171b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
31181b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case DeclarationName::CXXConstructorName: {
31191b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    QualType T = Import(FromName.getCXXNameType());
31201b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    if (T.isNull())
31211b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor      return DeclarationName();
31221b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
31231b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return ToContext.DeclarationNames.getCXXConstructorName(
31241b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor                                               ToContext.getCanonicalType(T));
31251b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  }
31261b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
31271b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case DeclarationName::CXXDestructorName: {
31281b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    QualType T = Import(FromName.getCXXNameType());
31291b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    if (T.isNull())
31301b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor      return DeclarationName();
31311b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
31321b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return ToContext.DeclarationNames.getCXXDestructorName(
31331b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor                                               ToContext.getCanonicalType(T));
31341b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  }
31351b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
31361b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case DeclarationName::CXXConversionFunctionName: {
31371b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    QualType T = Import(FromName.getCXXNameType());
31381b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    if (T.isNull())
31391b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor      return DeclarationName();
31401b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
31411b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return ToContext.DeclarationNames.getCXXConversionFunctionName(
31421b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor                                               ToContext.getCanonicalType(T));
31431b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  }
31441b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
31451b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case DeclarationName::CXXOperatorName:
31461b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return ToContext.DeclarationNames.getCXXOperatorName(
31471b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor                                          FromName.getCXXOverloadedOperator());
31481b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
31491b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case DeclarationName::CXXLiteralOperatorName:
31501b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return ToContext.DeclarationNames.getCXXLiteralOperatorName(
31511b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor                                   Import(FromName.getCXXLiteralIdentifier()));
31521b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
31531b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  case DeclarationName::CXXUsingDirective:
31541b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    // FIXME: STATICS!
31551b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return DeclarationName::getUsingDirectiveName();
31561b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  }
31571b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
31581b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  // Silence bogus GCC warning
31591b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  return DeclarationName();
31601b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor}
31611b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
31621b2949d27ec72894dec017c330c0548af4bb2476Douglas GregorIdentifierInfo *ASTImporter::Import(IdentifierInfo *FromId) {
31631b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  if (!FromId)
31641b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor    return 0;
31651b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor
31661b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor  return &ToContext.Idents.get(FromId->getName());
31671b2949d27ec72894dec017c330c0548af4bb2476Douglas Gregor}
3168089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor
3169c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas GregorSelector ASTImporter::Import(Selector FromSel) {
3170c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  if (FromSel.isNull())
3171c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor    return Selector();
3172c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor
3173c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  llvm::SmallVector<IdentifierInfo *, 4> Idents;
3174c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  Idents.push_back(Import(FromSel.getIdentifierInfoForSlot(0)));
3175c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  for (unsigned I = 1, N = FromSel.getNumArgs(); I < N; ++I)
3176c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor    Idents.push_back(Import(FromSel.getIdentifierInfoForSlot(I)));
3177c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor  return ToContext.Selectors.getSelector(FromSel.getNumArgs(), Idents.data());
3178c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor}
3179c3f2d2bb839593eed8861bce14228df0faf7b6c0Douglas Gregor
3180089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas GregorDeclarationName ASTImporter::HandleNameConflict(DeclarationName Name,
3181089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor                                                DeclContext *DC,
3182089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor                                                unsigned IDNS,
3183089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor                                                NamedDecl **Decls,
3184089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor                                                unsigned NumDecls) {
3185089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor  return Name;
3186089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor}
3187089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor
3188089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas GregorDiagnosticBuilder ASTImporter::ToDiag(SourceLocation Loc, unsigned DiagID) {
31894800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor  return Diags.Report(FullSourceLoc(Loc, ToContext.getSourceManager()),
31904800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor                      DiagID);
3191089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor}
3192089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor
3193089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas GregorDiagnosticBuilder ASTImporter::FromDiag(SourceLocation Loc, unsigned DiagID) {
31944800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor  return Diags.Report(FullSourceLoc(Loc, FromContext.getSourceManager()),
31954800d95d28b20eca5d57c108ae3d2e6e312c1182Douglas Gregor                      DiagID);
3196089459a16bf7e9cd10617d1fac5ec0240a0a1ee6Douglas Gregor}
31975ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor
31985ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas GregorDecl *ASTImporter::Imported(Decl *From, Decl *To) {
31995ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor  ImportedDecls[From] = To;
32005ce5dab3c30e4255b8f62b148b6a86f09a444aaaDouglas Gregor  return To;
3201af667588d53de22795c5304f1496ccaac2a71402Daniel Dunbar}
3202ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor
3203ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregorbool ASTImporter::IsStructurallyEquivalent(QualType From, QualType To) {
3204ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  llvm::DenseMap<Type *, Type *>::iterator Pos
3205ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor   = ImportedTypes.find(From.getTypePtr());
3206ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor  if (Pos != ImportedTypes.end() && ToContext.hasSameType(Import(From), To))
3207ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor    return true;
3208ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor
3209bb2d176c4f434e9e73f63f2f9d128f63ce3e10d0Benjamin Kramer  StructuralEquivalenceContext Ctx(FromContext, ToContext, Diags,
3210ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor                                   NonEquivalentDecls);
3211bb2d176c4f434e9e73f63f2f9d128f63ce3e10d0Benjamin Kramer  return Ctx.IsStructurallyEquivalent(From, To);
3212ea35d11905f756ad33b87bd89cd3ac1e7ce57994Douglas Gregor}
3213