Home | History | Annotate | Download | only in AST
      1 //===--- ASTImporter.cpp - Importing ASTs from other Contexts ---*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 //  This file defines the ASTImporter class which imports AST nodes from one
     11 //  context into another context.
     12 //
     13 //===----------------------------------------------------------------------===//
     14 #include "clang/AST/ASTImporter.h"
     15 #include "clang/AST/ASTContext.h"
     16 #include "clang/AST/ASTDiagnostic.h"
     17 #include "clang/AST/DeclCXX.h"
     18 #include "clang/AST/DeclObjC.h"
     19 #include "clang/AST/DeclVisitor.h"
     20 #include "clang/AST/StmtVisitor.h"
     21 #include "clang/AST/TypeVisitor.h"
     22 #include "clang/Basic/FileManager.h"
     23 #include "clang/Basic/SourceManager.h"
     24 #include "llvm/Support/MemoryBuffer.h"
     25 #include <deque>
     26 
     27 namespace clang {
     28   class ASTNodeImporter : public TypeVisitor<ASTNodeImporter, QualType>,
     29                           public DeclVisitor<ASTNodeImporter, Decl *>,
     30                           public StmtVisitor<ASTNodeImporter, Stmt *> {
     31     ASTImporter &Importer;
     32 
     33   public:
     34     explicit ASTNodeImporter(ASTImporter &Importer) : Importer(Importer) { }
     35 
     36     using TypeVisitor<ASTNodeImporter, QualType>::Visit;
     37     using DeclVisitor<ASTNodeImporter, Decl *>::Visit;
     38     using StmtVisitor<ASTNodeImporter, Stmt *>::Visit;
     39 
     40     // Importing types
     41     QualType VisitType(const Type *T);
     42     QualType VisitBuiltinType(const BuiltinType *T);
     43     QualType VisitComplexType(const ComplexType *T);
     44     QualType VisitPointerType(const PointerType *T);
     45     QualType VisitBlockPointerType(const BlockPointerType *T);
     46     QualType VisitLValueReferenceType(const LValueReferenceType *T);
     47     QualType VisitRValueReferenceType(const RValueReferenceType *T);
     48     QualType VisitMemberPointerType(const MemberPointerType *T);
     49     QualType VisitConstantArrayType(const ConstantArrayType *T);
     50     QualType VisitIncompleteArrayType(const IncompleteArrayType *T);
     51     QualType VisitVariableArrayType(const VariableArrayType *T);
     52     // FIXME: DependentSizedArrayType
     53     // FIXME: DependentSizedExtVectorType
     54     QualType VisitVectorType(const VectorType *T);
     55     QualType VisitExtVectorType(const ExtVectorType *T);
     56     QualType VisitFunctionNoProtoType(const FunctionNoProtoType *T);
     57     QualType VisitFunctionProtoType(const FunctionProtoType *T);
     58     // FIXME: UnresolvedUsingType
     59     QualType VisitParenType(const ParenType *T);
     60     QualType VisitTypedefType(const TypedefType *T);
     61     QualType VisitTypeOfExprType(const TypeOfExprType *T);
     62     // FIXME: DependentTypeOfExprType
     63     QualType VisitTypeOfType(const TypeOfType *T);
     64     QualType VisitDecltypeType(const DecltypeType *T);
     65     QualType VisitUnaryTransformType(const UnaryTransformType *T);
     66     QualType VisitAutoType(const AutoType *T);
     67     // FIXME: DependentDecltypeType
     68     QualType VisitRecordType(const RecordType *T);
     69     QualType VisitEnumType(const EnumType *T);
     70     // FIXME: TemplateTypeParmType
     71     // FIXME: SubstTemplateTypeParmType
     72     QualType VisitTemplateSpecializationType(const TemplateSpecializationType *T);
     73     QualType VisitElaboratedType(const ElaboratedType *T);
     74     // FIXME: DependentNameType
     75     // FIXME: DependentTemplateSpecializationType
     76     QualType VisitObjCInterfaceType(const ObjCInterfaceType *T);
     77     QualType VisitObjCObjectType(const ObjCObjectType *T);
     78     QualType VisitObjCObjectPointerType(const ObjCObjectPointerType *T);
     79 
     80     // Importing declarations
     81     bool ImportDeclParts(NamedDecl *D, DeclContext *&DC,
     82                          DeclContext *&LexicalDC, DeclarationName &Name,
     83                          SourceLocation &Loc);
     84     void ImportDefinitionIfNeeded(Decl *FromD, Decl *ToD = nullptr);
     85     void ImportDeclarationNameLoc(const DeclarationNameInfo &From,
     86                                   DeclarationNameInfo& To);
     87     void ImportDeclContext(DeclContext *FromDC, bool ForceImport = false);
     88 
     89     /// \brief What we should import from the definition.
     90     enum ImportDefinitionKind {
     91       /// \brief Import the default subset of the definition, which might be
     92       /// nothing (if minimal import is set) or might be everything (if minimal
     93       /// import is not set).
     94       IDK_Default,
     95       /// \brief Import everything.
     96       IDK_Everything,
     97       /// \brief Import only the bare bones needed to establish a valid
     98       /// DeclContext.
     99       IDK_Basic
    100     };
    101 
    102     bool shouldForceImportDeclContext(ImportDefinitionKind IDK) {
    103       return IDK == IDK_Everything ||
    104              (IDK == IDK_Default && !Importer.isMinimalImport());
    105     }
    106 
    107     bool ImportDefinition(RecordDecl *From, RecordDecl *To,
    108                           ImportDefinitionKind Kind = IDK_Default);
    109     bool ImportDefinition(VarDecl *From, VarDecl *To,
    110                           ImportDefinitionKind Kind = IDK_Default);
    111     bool ImportDefinition(EnumDecl *From, EnumDecl *To,
    112                           ImportDefinitionKind Kind = IDK_Default);
    113     bool ImportDefinition(ObjCInterfaceDecl *From, ObjCInterfaceDecl *To,
    114                           ImportDefinitionKind Kind = IDK_Default);
    115     bool ImportDefinition(ObjCProtocolDecl *From, ObjCProtocolDecl *To,
    116                           ImportDefinitionKind Kind = IDK_Default);
    117     TemplateParameterList *ImportTemplateParameterList(
    118                                                  TemplateParameterList *Params);
    119     TemplateArgument ImportTemplateArgument(const TemplateArgument &From);
    120     bool ImportTemplateArguments(const TemplateArgument *FromArgs,
    121                                  unsigned NumFromArgs,
    122                                SmallVectorImpl<TemplateArgument> &ToArgs);
    123     bool IsStructuralMatch(RecordDecl *FromRecord, RecordDecl *ToRecord,
    124                            bool Complain = true);
    125     bool IsStructuralMatch(VarDecl *FromVar, VarDecl *ToVar,
    126                            bool Complain = true);
    127     bool IsStructuralMatch(EnumDecl *FromEnum, EnumDecl *ToRecord);
    128     bool IsStructuralMatch(EnumConstantDecl *FromEC, EnumConstantDecl *ToEC);
    129     bool IsStructuralMatch(ClassTemplateDecl *From, ClassTemplateDecl *To);
    130     bool IsStructuralMatch(VarTemplateDecl *From, VarTemplateDecl *To);
    131     Decl *VisitDecl(Decl *D);
    132     Decl *VisitTranslationUnitDecl(TranslationUnitDecl *D);
    133     Decl *VisitNamespaceDecl(NamespaceDecl *D);
    134     Decl *VisitTypedefNameDecl(TypedefNameDecl *D, bool IsAlias);
    135     Decl *VisitTypedefDecl(TypedefDecl *D);
    136     Decl *VisitTypeAliasDecl(TypeAliasDecl *D);
    137     Decl *VisitEnumDecl(EnumDecl *D);
    138     Decl *VisitRecordDecl(RecordDecl *D);
    139     Decl *VisitEnumConstantDecl(EnumConstantDecl *D);
    140     Decl *VisitFunctionDecl(FunctionDecl *D);
    141     Decl *VisitCXXMethodDecl(CXXMethodDecl *D);
    142     Decl *VisitCXXConstructorDecl(CXXConstructorDecl *D);
    143     Decl *VisitCXXDestructorDecl(CXXDestructorDecl *D);
    144     Decl *VisitCXXConversionDecl(CXXConversionDecl *D);
    145     Decl *VisitFieldDecl(FieldDecl *D);
    146     Decl *VisitIndirectFieldDecl(IndirectFieldDecl *D);
    147     Decl *VisitObjCIvarDecl(ObjCIvarDecl *D);
    148     Decl *VisitVarDecl(VarDecl *D);
    149     Decl *VisitImplicitParamDecl(ImplicitParamDecl *D);
    150     Decl *VisitParmVarDecl(ParmVarDecl *D);
    151     Decl *VisitObjCMethodDecl(ObjCMethodDecl *D);
    152     Decl *VisitObjCCategoryDecl(ObjCCategoryDecl *D);
    153     Decl *VisitObjCProtocolDecl(ObjCProtocolDecl *D);
    154     Decl *VisitObjCInterfaceDecl(ObjCInterfaceDecl *D);
    155     Decl *VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D);
    156     Decl *VisitObjCImplementationDecl(ObjCImplementationDecl *D);
    157     Decl *VisitObjCPropertyDecl(ObjCPropertyDecl *D);
    158     Decl *VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D);
    159     Decl *VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D);
    160     Decl *VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D);
    161     Decl *VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D);
    162     Decl *VisitClassTemplateDecl(ClassTemplateDecl *D);
    163     Decl *VisitClassTemplateSpecializationDecl(
    164                                             ClassTemplateSpecializationDecl *D);
    165     Decl *VisitVarTemplateDecl(VarTemplateDecl *D);
    166     Decl *VisitVarTemplateSpecializationDecl(VarTemplateSpecializationDecl *D);
    167 
    168     // Importing statements
    169     Stmt *VisitStmt(Stmt *S);
    170 
    171     // Importing expressions
    172     Expr *VisitExpr(Expr *E);
    173     Expr *VisitDeclRefExpr(DeclRefExpr *E);
    174     Expr *VisitIntegerLiteral(IntegerLiteral *E);
    175     Expr *VisitCharacterLiteral(CharacterLiteral *E);
    176     Expr *VisitParenExpr(ParenExpr *E);
    177     Expr *VisitUnaryOperator(UnaryOperator *E);
    178     Expr *VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E);
    179     Expr *VisitBinaryOperator(BinaryOperator *E);
    180     Expr *VisitCompoundAssignOperator(CompoundAssignOperator *E);
    181     Expr *VisitImplicitCastExpr(ImplicitCastExpr *E);
    182     Expr *VisitCStyleCastExpr(CStyleCastExpr *E);
    183   };
    184 }
    185 using namespace clang;
    186 
    187 //----------------------------------------------------------------------------
    188 // Structural Equivalence
    189 //----------------------------------------------------------------------------
    190 
    191 namespace {
    192   struct StructuralEquivalenceContext {
    193     /// \brief AST contexts for which we are checking structural equivalence.
    194     ASTContext &C1, &C2;
    195 
    196     /// \brief The set of "tentative" equivalences between two canonical
    197     /// declarations, mapping from a declaration in the first context to the
    198     /// declaration in the second context that we believe to be equivalent.
    199     llvm::DenseMap<Decl *, Decl *> TentativeEquivalences;
    200 
    201     /// \brief Queue of declarations in the first context whose equivalence
    202     /// with a declaration in the second context still needs to be verified.
    203     std::deque<Decl *> DeclsToCheck;
    204 
    205     /// \brief Declaration (from, to) pairs that are known not to be equivalent
    206     /// (which we have already complained about).
    207     llvm::DenseSet<std::pair<Decl *, Decl *> > &NonEquivalentDecls;
    208 
    209     /// \brief Whether we're being strict about the spelling of types when
    210     /// unifying two types.
    211     bool StrictTypeSpelling;
    212 
    213     /// \brief Whether to complain about failures.
    214     bool Complain;
    215 
    216     /// \brief \c true if the last diagnostic came from C2.
    217     bool LastDiagFromC2;
    218 
    219     StructuralEquivalenceContext(ASTContext &C1, ASTContext &C2,
    220                llvm::DenseSet<std::pair<Decl *, Decl *> > &NonEquivalentDecls,
    221                                  bool StrictTypeSpelling = false,
    222                                  bool Complain = true)
    223       : C1(C1), C2(C2), NonEquivalentDecls(NonEquivalentDecls),
    224         StrictTypeSpelling(StrictTypeSpelling), Complain(Complain),
    225         LastDiagFromC2(false) {}
    226 
    227     /// \brief Determine whether the two declarations are structurally
    228     /// equivalent.
    229     bool IsStructurallyEquivalent(Decl *D1, Decl *D2);
    230 
    231     /// \brief Determine whether the two types are structurally equivalent.
    232     bool IsStructurallyEquivalent(QualType T1, QualType T2);
    233 
    234   private:
    235     /// \brief Finish checking all of the structural equivalences.
    236     ///
    237     /// \returns true if an error occurred, false otherwise.
    238     bool Finish();
    239 
    240   public:
    241     DiagnosticBuilder Diag1(SourceLocation Loc, unsigned DiagID) {
    242       assert(Complain && "Not allowed to complain");
    243       if (LastDiagFromC2)
    244         C1.getDiagnostics().notePriorDiagnosticFrom(C2.getDiagnostics());
    245       LastDiagFromC2 = false;
    246       return C1.getDiagnostics().Report(Loc, DiagID);
    247     }
    248 
    249     DiagnosticBuilder Diag2(SourceLocation Loc, unsigned DiagID) {
    250       assert(Complain && "Not allowed to complain");
    251       if (!LastDiagFromC2)
    252         C2.getDiagnostics().notePriorDiagnosticFrom(C1.getDiagnostics());
    253       LastDiagFromC2 = true;
    254       return C2.getDiagnostics().Report(Loc, DiagID);
    255     }
    256   };
    257 }
    258 
    259 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
    260                                      QualType T1, QualType T2);
    261 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
    262                                      Decl *D1, Decl *D2);
    263 
    264 /// \brief Determine structural equivalence of two expressions.
    265 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
    266                                      Expr *E1, Expr *E2) {
    267   if (!E1 || !E2)
    268     return E1 == E2;
    269 
    270   // FIXME: Actually perform a structural comparison!
    271   return true;
    272 }
    273 
    274 /// \brief Determine whether two identifiers are equivalent.
    275 static bool IsStructurallyEquivalent(const IdentifierInfo *Name1,
    276                                      const IdentifierInfo *Name2) {
    277   if (!Name1 || !Name2)
    278     return Name1 == Name2;
    279 
    280   return Name1->getName() == Name2->getName();
    281 }
    282 
    283 /// \brief Determine whether two nested-name-specifiers are equivalent.
    284 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
    285                                      NestedNameSpecifier *NNS1,
    286                                      NestedNameSpecifier *NNS2) {
    287   // FIXME: Implement!
    288   return true;
    289 }
    290 
    291 /// \brief Determine whether two template arguments are equivalent.
    292 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
    293                                      const TemplateArgument &Arg1,
    294                                      const TemplateArgument &Arg2) {
    295   if (Arg1.getKind() != Arg2.getKind())
    296     return false;
    297 
    298   switch (Arg1.getKind()) {
    299   case TemplateArgument::Null:
    300     return true;
    301 
    302   case TemplateArgument::Type:
    303     return Context.IsStructurallyEquivalent(Arg1.getAsType(), Arg2.getAsType());
    304 
    305   case TemplateArgument::Integral:
    306     if (!Context.IsStructurallyEquivalent(Arg1.getIntegralType(),
    307                                           Arg2.getIntegralType()))
    308       return false;
    309 
    310     return llvm::APSInt::isSameValue(Arg1.getAsIntegral(), Arg2.getAsIntegral());
    311 
    312   case TemplateArgument::Declaration:
    313     return Context.IsStructurallyEquivalent(Arg1.getAsDecl(), Arg2.getAsDecl());
    314 
    315   case TemplateArgument::NullPtr:
    316     return true; // FIXME: Is this correct?
    317 
    318   case TemplateArgument::Template:
    319     return IsStructurallyEquivalent(Context,
    320                                     Arg1.getAsTemplate(),
    321                                     Arg2.getAsTemplate());
    322 
    323   case TemplateArgument::TemplateExpansion:
    324     return IsStructurallyEquivalent(Context,
    325                                     Arg1.getAsTemplateOrTemplatePattern(),
    326                                     Arg2.getAsTemplateOrTemplatePattern());
    327 
    328   case TemplateArgument::Expression:
    329     return IsStructurallyEquivalent(Context,
    330                                     Arg1.getAsExpr(), Arg2.getAsExpr());
    331 
    332   case TemplateArgument::Pack:
    333     if (Arg1.pack_size() != Arg2.pack_size())
    334       return false;
    335 
    336     for (unsigned I = 0, N = Arg1.pack_size(); I != N; ++I)
    337       if (!IsStructurallyEquivalent(Context,
    338                                     Arg1.pack_begin()[I],
    339                                     Arg2.pack_begin()[I]))
    340         return false;
    341 
    342     return true;
    343   }
    344 
    345   llvm_unreachable("Invalid template argument kind");
    346 }
    347 
    348 /// \brief Determine structural equivalence for the common part of array
    349 /// types.
    350 static bool IsArrayStructurallyEquivalent(StructuralEquivalenceContext &Context,
    351                                           const ArrayType *Array1,
    352                                           const ArrayType *Array2) {
    353   if (!IsStructurallyEquivalent(Context,
    354                                 Array1->getElementType(),
    355                                 Array2->getElementType()))
    356     return false;
    357   if (Array1->getSizeModifier() != Array2->getSizeModifier())
    358     return false;
    359   if (Array1->getIndexTypeQualifiers() != Array2->getIndexTypeQualifiers())
    360     return false;
    361 
    362   return true;
    363 }
    364 
    365 /// \brief Determine structural equivalence of two types.
    366 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
    367                                      QualType T1, QualType T2) {
    368   if (T1.isNull() || T2.isNull())
    369     return T1.isNull() && T2.isNull();
    370 
    371   if (!Context.StrictTypeSpelling) {
    372     // We aren't being strict about token-to-token equivalence of types,
    373     // so map down to the canonical type.
    374     T1 = Context.C1.getCanonicalType(T1);
    375     T2 = Context.C2.getCanonicalType(T2);
    376   }
    377 
    378   if (T1.getQualifiers() != T2.getQualifiers())
    379     return false;
    380 
    381   Type::TypeClass TC = T1->getTypeClass();
    382 
    383   if (T1->getTypeClass() != T2->getTypeClass()) {
    384     // Compare function types with prototypes vs. without prototypes as if
    385     // both did not have prototypes.
    386     if (T1->getTypeClass() == Type::FunctionProto &&
    387         T2->getTypeClass() == Type::FunctionNoProto)
    388       TC = Type::FunctionNoProto;
    389     else if (T1->getTypeClass() == Type::FunctionNoProto &&
    390              T2->getTypeClass() == Type::FunctionProto)
    391       TC = Type::FunctionNoProto;
    392     else
    393       return false;
    394   }
    395 
    396   switch (TC) {
    397   case Type::Builtin:
    398     // FIXME: Deal with Char_S/Char_U.
    399     if (cast<BuiltinType>(T1)->getKind() != cast<BuiltinType>(T2)->getKind())
    400       return false;
    401     break;
    402 
    403   case Type::Complex:
    404     if (!IsStructurallyEquivalent(Context,
    405                                   cast<ComplexType>(T1)->getElementType(),
    406                                   cast<ComplexType>(T2)->getElementType()))
    407       return false;
    408     break;
    409 
    410   case Type::Adjusted:
    411   case Type::Decayed:
    412     if (!IsStructurallyEquivalent(Context,
    413                                   cast<AdjustedType>(T1)->getOriginalType(),
    414                                   cast<AdjustedType>(T2)->getOriginalType()))
    415       return false;
    416     break;
    417 
    418   case Type::Pointer:
    419     if (!IsStructurallyEquivalent(Context,
    420                                   cast<PointerType>(T1)->getPointeeType(),
    421                                   cast<PointerType>(T2)->getPointeeType()))
    422       return false;
    423     break;
    424 
    425   case Type::BlockPointer:
    426     if (!IsStructurallyEquivalent(Context,
    427                                   cast<BlockPointerType>(T1)->getPointeeType(),
    428                                   cast<BlockPointerType>(T2)->getPointeeType()))
    429       return false;
    430     break;
    431 
    432   case Type::LValueReference:
    433   case Type::RValueReference: {
    434     const ReferenceType *Ref1 = cast<ReferenceType>(T1);
    435     const ReferenceType *Ref2 = cast<ReferenceType>(T2);
    436     if (Ref1->isSpelledAsLValue() != Ref2->isSpelledAsLValue())
    437       return false;
    438     if (Ref1->isInnerRef() != Ref2->isInnerRef())
    439       return false;
    440     if (!IsStructurallyEquivalent(Context,
    441                                   Ref1->getPointeeTypeAsWritten(),
    442                                   Ref2->getPointeeTypeAsWritten()))
    443       return false;
    444     break;
    445   }
    446 
    447   case Type::MemberPointer: {
    448     const MemberPointerType *MemPtr1 = cast<MemberPointerType>(T1);
    449     const MemberPointerType *MemPtr2 = cast<MemberPointerType>(T2);
    450     if (!IsStructurallyEquivalent(Context,
    451                                   MemPtr1->getPointeeType(),
    452                                   MemPtr2->getPointeeType()))
    453       return false;
    454     if (!IsStructurallyEquivalent(Context,
    455                                   QualType(MemPtr1->getClass(), 0),
    456                                   QualType(MemPtr2->getClass(), 0)))
    457       return false;
    458     break;
    459   }
    460 
    461   case Type::ConstantArray: {
    462     const ConstantArrayType *Array1 = cast<ConstantArrayType>(T1);
    463     const ConstantArrayType *Array2 = cast<ConstantArrayType>(T2);
    464     if (!llvm::APInt::isSameValue(Array1->getSize(), Array2->getSize()))
    465       return false;
    466 
    467     if (!IsArrayStructurallyEquivalent(Context, Array1, Array2))
    468       return false;
    469     break;
    470   }
    471 
    472   case Type::IncompleteArray:
    473     if (!IsArrayStructurallyEquivalent(Context,
    474                                        cast<ArrayType>(T1),
    475                                        cast<ArrayType>(T2)))
    476       return false;
    477     break;
    478 
    479   case Type::VariableArray: {
    480     const VariableArrayType *Array1 = cast<VariableArrayType>(T1);
    481     const VariableArrayType *Array2 = cast<VariableArrayType>(T2);
    482     if (!IsStructurallyEquivalent(Context,
    483                                   Array1->getSizeExpr(), Array2->getSizeExpr()))
    484       return false;
    485 
    486     if (!IsArrayStructurallyEquivalent(Context, Array1, Array2))
    487       return false;
    488 
    489     break;
    490   }
    491 
    492   case Type::DependentSizedArray: {
    493     const DependentSizedArrayType *Array1 = cast<DependentSizedArrayType>(T1);
    494     const DependentSizedArrayType *Array2 = cast<DependentSizedArrayType>(T2);
    495     if (!IsStructurallyEquivalent(Context,
    496                                   Array1->getSizeExpr(), Array2->getSizeExpr()))
    497       return false;
    498 
    499     if (!IsArrayStructurallyEquivalent(Context, Array1, Array2))
    500       return false;
    501 
    502     break;
    503   }
    504 
    505   case Type::DependentSizedExtVector: {
    506     const DependentSizedExtVectorType *Vec1
    507       = cast<DependentSizedExtVectorType>(T1);
    508     const DependentSizedExtVectorType *Vec2
    509       = cast<DependentSizedExtVectorType>(T2);
    510     if (!IsStructurallyEquivalent(Context,
    511                                   Vec1->getSizeExpr(), Vec2->getSizeExpr()))
    512       return false;
    513     if (!IsStructurallyEquivalent(Context,
    514                                   Vec1->getElementType(),
    515                                   Vec2->getElementType()))
    516       return false;
    517     break;
    518   }
    519 
    520   case Type::Vector:
    521   case Type::ExtVector: {
    522     const VectorType *Vec1 = cast<VectorType>(T1);
    523     const VectorType *Vec2 = cast<VectorType>(T2);
    524     if (!IsStructurallyEquivalent(Context,
    525                                   Vec1->getElementType(),
    526                                   Vec2->getElementType()))
    527       return false;
    528     if (Vec1->getNumElements() != Vec2->getNumElements())
    529       return false;
    530     if (Vec1->getVectorKind() != Vec2->getVectorKind())
    531       return false;
    532     break;
    533   }
    534 
    535   case Type::FunctionProto: {
    536     const FunctionProtoType *Proto1 = cast<FunctionProtoType>(T1);
    537     const FunctionProtoType *Proto2 = cast<FunctionProtoType>(T2);
    538     if (Proto1->getNumParams() != Proto2->getNumParams())
    539       return false;
    540     for (unsigned I = 0, N = Proto1->getNumParams(); I != N; ++I) {
    541       if (!IsStructurallyEquivalent(Context, Proto1->getParamType(I),
    542                                     Proto2->getParamType(I)))
    543         return false;
    544     }
    545     if (Proto1->isVariadic() != Proto2->isVariadic())
    546       return false;
    547     if (Proto1->getExceptionSpecType() != Proto2->getExceptionSpecType())
    548       return false;
    549     if (Proto1->getExceptionSpecType() == EST_Dynamic) {
    550       if (Proto1->getNumExceptions() != Proto2->getNumExceptions())
    551         return false;
    552       for (unsigned I = 0, N = Proto1->getNumExceptions(); I != N; ++I) {
    553         if (!IsStructurallyEquivalent(Context,
    554                                       Proto1->getExceptionType(I),
    555                                       Proto2->getExceptionType(I)))
    556           return false;
    557       }
    558     } else if (Proto1->getExceptionSpecType() == EST_ComputedNoexcept) {
    559       if (!IsStructurallyEquivalent(Context,
    560                                     Proto1->getNoexceptExpr(),
    561                                     Proto2->getNoexceptExpr()))
    562         return false;
    563     }
    564     if (Proto1->getTypeQuals() != Proto2->getTypeQuals())
    565       return false;
    566 
    567     // Fall through to check the bits common with FunctionNoProtoType.
    568   }
    569 
    570   case Type::FunctionNoProto: {
    571     const FunctionType *Function1 = cast<FunctionType>(T1);
    572     const FunctionType *Function2 = cast<FunctionType>(T2);
    573     if (!IsStructurallyEquivalent(Context, Function1->getReturnType(),
    574                                   Function2->getReturnType()))
    575       return false;
    576       if (Function1->getExtInfo() != Function2->getExtInfo())
    577         return false;
    578     break;
    579   }
    580 
    581   case Type::UnresolvedUsing:
    582     if (!IsStructurallyEquivalent(Context,
    583                                   cast<UnresolvedUsingType>(T1)->getDecl(),
    584                                   cast<UnresolvedUsingType>(T2)->getDecl()))
    585       return false;
    586 
    587     break;
    588 
    589   case Type::Attributed:
    590     if (!IsStructurallyEquivalent(Context,
    591                                   cast<AttributedType>(T1)->getModifiedType(),
    592                                   cast<AttributedType>(T2)->getModifiedType()))
    593       return false;
    594     if (!IsStructurallyEquivalent(Context,
    595                                 cast<AttributedType>(T1)->getEquivalentType(),
    596                                 cast<AttributedType>(T2)->getEquivalentType()))
    597       return false;
    598     break;
    599 
    600   case Type::Paren:
    601     if (!IsStructurallyEquivalent(Context,
    602                                   cast<ParenType>(T1)->getInnerType(),
    603                                   cast<ParenType>(T2)->getInnerType()))
    604       return false;
    605     break;
    606 
    607   case Type::Typedef:
    608     if (!IsStructurallyEquivalent(Context,
    609                                   cast<TypedefType>(T1)->getDecl(),
    610                                   cast<TypedefType>(T2)->getDecl()))
    611       return false;
    612     break;
    613 
    614   case Type::TypeOfExpr:
    615     if (!IsStructurallyEquivalent(Context,
    616                                 cast<TypeOfExprType>(T1)->getUnderlyingExpr(),
    617                                 cast<TypeOfExprType>(T2)->getUnderlyingExpr()))
    618       return false;
    619     break;
    620 
    621   case Type::TypeOf:
    622     if (!IsStructurallyEquivalent(Context,
    623                                   cast<TypeOfType>(T1)->getUnderlyingType(),
    624                                   cast<TypeOfType>(T2)->getUnderlyingType()))
    625       return false;
    626     break;
    627 
    628   case Type::UnaryTransform:
    629     if (!IsStructurallyEquivalent(Context,
    630                              cast<UnaryTransformType>(T1)->getUnderlyingType(),
    631                              cast<UnaryTransformType>(T1)->getUnderlyingType()))
    632       return false;
    633     break;
    634 
    635   case Type::Decltype:
    636     if (!IsStructurallyEquivalent(Context,
    637                                   cast<DecltypeType>(T1)->getUnderlyingExpr(),
    638                                   cast<DecltypeType>(T2)->getUnderlyingExpr()))
    639       return false;
    640     break;
    641 
    642   case Type::Auto:
    643     if (!IsStructurallyEquivalent(Context,
    644                                   cast<AutoType>(T1)->getDeducedType(),
    645                                   cast<AutoType>(T2)->getDeducedType()))
    646       return false;
    647     break;
    648 
    649   case Type::Record:
    650   case Type::Enum:
    651     if (!IsStructurallyEquivalent(Context,
    652                                   cast<TagType>(T1)->getDecl(),
    653                                   cast<TagType>(T2)->getDecl()))
    654       return false;
    655     break;
    656 
    657   case Type::TemplateTypeParm: {
    658     const TemplateTypeParmType *Parm1 = cast<TemplateTypeParmType>(T1);
    659     const TemplateTypeParmType *Parm2 = cast<TemplateTypeParmType>(T2);
    660     if (Parm1->getDepth() != Parm2->getDepth())
    661       return false;
    662     if (Parm1->getIndex() != Parm2->getIndex())
    663       return false;
    664     if (Parm1->isParameterPack() != Parm2->isParameterPack())
    665       return false;
    666 
    667     // Names of template type parameters are never significant.
    668     break;
    669   }
    670 
    671   case Type::SubstTemplateTypeParm: {
    672     const SubstTemplateTypeParmType *Subst1
    673       = cast<SubstTemplateTypeParmType>(T1);
    674     const SubstTemplateTypeParmType *Subst2
    675       = cast<SubstTemplateTypeParmType>(T2);
    676     if (!IsStructurallyEquivalent(Context,
    677                                   QualType(Subst1->getReplacedParameter(), 0),
    678                                   QualType(Subst2->getReplacedParameter(), 0)))
    679       return false;
    680     if (!IsStructurallyEquivalent(Context,
    681                                   Subst1->getReplacementType(),
    682                                   Subst2->getReplacementType()))
    683       return false;
    684     break;
    685   }
    686 
    687   case Type::SubstTemplateTypeParmPack: {
    688     const SubstTemplateTypeParmPackType *Subst1
    689       = cast<SubstTemplateTypeParmPackType>(T1);
    690     const SubstTemplateTypeParmPackType *Subst2
    691       = cast<SubstTemplateTypeParmPackType>(T2);
    692     if (!IsStructurallyEquivalent(Context,
    693                                   QualType(Subst1->getReplacedParameter(), 0),
    694                                   QualType(Subst2->getReplacedParameter(), 0)))
    695       return false;
    696     if (!IsStructurallyEquivalent(Context,
    697                                   Subst1->getArgumentPack(),
    698                                   Subst2->getArgumentPack()))
    699       return false;
    700     break;
    701   }
    702   case Type::TemplateSpecialization: {
    703     const TemplateSpecializationType *Spec1
    704       = cast<TemplateSpecializationType>(T1);
    705     const TemplateSpecializationType *Spec2
    706       = cast<TemplateSpecializationType>(T2);
    707     if (!IsStructurallyEquivalent(Context,
    708                                   Spec1->getTemplateName(),
    709                                   Spec2->getTemplateName()))
    710       return false;
    711     if (Spec1->getNumArgs() != Spec2->getNumArgs())
    712       return false;
    713     for (unsigned I = 0, N = Spec1->getNumArgs(); I != N; ++I) {
    714       if (!IsStructurallyEquivalent(Context,
    715                                     Spec1->getArg(I), Spec2->getArg(I)))
    716         return false;
    717     }
    718     break;
    719   }
    720 
    721   case Type::Elaborated: {
    722     const ElaboratedType *Elab1 = cast<ElaboratedType>(T1);
    723     const ElaboratedType *Elab2 = cast<ElaboratedType>(T2);
    724     // CHECKME: what if a keyword is ETK_None or ETK_typename ?
    725     if (Elab1->getKeyword() != Elab2->getKeyword())
    726       return false;
    727     if (!IsStructurallyEquivalent(Context,
    728                                   Elab1->getQualifier(),
    729                                   Elab2->getQualifier()))
    730       return false;
    731     if (!IsStructurallyEquivalent(Context,
    732                                   Elab1->getNamedType(),
    733                                   Elab2->getNamedType()))
    734       return false;
    735     break;
    736   }
    737 
    738   case Type::InjectedClassName: {
    739     const InjectedClassNameType *Inj1 = cast<InjectedClassNameType>(T1);
    740     const InjectedClassNameType *Inj2 = cast<InjectedClassNameType>(T2);
    741     if (!IsStructurallyEquivalent(Context,
    742                                   Inj1->getInjectedSpecializationType(),
    743                                   Inj2->getInjectedSpecializationType()))
    744       return false;
    745     break;
    746   }
    747 
    748   case Type::DependentName: {
    749     const DependentNameType *Typename1 = cast<DependentNameType>(T1);
    750     const DependentNameType *Typename2 = cast<DependentNameType>(T2);
    751     if (!IsStructurallyEquivalent(Context,
    752                                   Typename1->getQualifier(),
    753                                   Typename2->getQualifier()))
    754       return false;
    755     if (!IsStructurallyEquivalent(Typename1->getIdentifier(),
    756                                   Typename2->getIdentifier()))
    757       return false;
    758 
    759     break;
    760   }
    761 
    762   case Type::DependentTemplateSpecialization: {
    763     const DependentTemplateSpecializationType *Spec1 =
    764       cast<DependentTemplateSpecializationType>(T1);
    765     const DependentTemplateSpecializationType *Spec2 =
    766       cast<DependentTemplateSpecializationType>(T2);
    767     if (!IsStructurallyEquivalent(Context,
    768                                   Spec1->getQualifier(),
    769                                   Spec2->getQualifier()))
    770       return false;
    771     if (!IsStructurallyEquivalent(Spec1->getIdentifier(),
    772                                   Spec2->getIdentifier()))
    773       return false;
    774     if (Spec1->getNumArgs() != Spec2->getNumArgs())
    775       return false;
    776     for (unsigned I = 0, N = Spec1->getNumArgs(); I != N; ++I) {
    777       if (!IsStructurallyEquivalent(Context,
    778                                     Spec1->getArg(I), Spec2->getArg(I)))
    779         return false;
    780     }
    781     break;
    782   }
    783 
    784   case Type::PackExpansion:
    785     if (!IsStructurallyEquivalent(Context,
    786                                   cast<PackExpansionType>(T1)->getPattern(),
    787                                   cast<PackExpansionType>(T2)->getPattern()))
    788       return false;
    789     break;
    790 
    791   case Type::ObjCInterface: {
    792     const ObjCInterfaceType *Iface1 = cast<ObjCInterfaceType>(T1);
    793     const ObjCInterfaceType *Iface2 = cast<ObjCInterfaceType>(T2);
    794     if (!IsStructurallyEquivalent(Context,
    795                                   Iface1->getDecl(), Iface2->getDecl()))
    796       return false;
    797     break;
    798   }
    799 
    800   case Type::ObjCObject: {
    801     const ObjCObjectType *Obj1 = cast<ObjCObjectType>(T1);
    802     const ObjCObjectType *Obj2 = cast<ObjCObjectType>(T2);
    803     if (!IsStructurallyEquivalent(Context,
    804                                   Obj1->getBaseType(),
    805                                   Obj2->getBaseType()))
    806       return false;
    807     if (Obj1->getNumProtocols() != Obj2->getNumProtocols())
    808       return false;
    809     for (unsigned I = 0, N = Obj1->getNumProtocols(); I != N; ++I) {
    810       if (!IsStructurallyEquivalent(Context,
    811                                     Obj1->getProtocol(I),
    812                                     Obj2->getProtocol(I)))
    813         return false;
    814     }
    815     break;
    816   }
    817 
    818   case Type::ObjCObjectPointer: {
    819     const ObjCObjectPointerType *Ptr1 = cast<ObjCObjectPointerType>(T1);
    820     const ObjCObjectPointerType *Ptr2 = cast<ObjCObjectPointerType>(T2);
    821     if (!IsStructurallyEquivalent(Context,
    822                                   Ptr1->getPointeeType(),
    823                                   Ptr2->getPointeeType()))
    824       return false;
    825     break;
    826   }
    827 
    828   case Type::Atomic: {
    829     if (!IsStructurallyEquivalent(Context,
    830                                   cast<AtomicType>(T1)->getValueType(),
    831                                   cast<AtomicType>(T2)->getValueType()))
    832       return false;
    833     break;
    834   }
    835 
    836   } // end switch
    837 
    838   return true;
    839 }
    840 
    841 /// \brief Determine structural equivalence of two fields.
    842 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
    843                                      FieldDecl *Field1, FieldDecl *Field2) {
    844   RecordDecl *Owner2 = cast<RecordDecl>(Field2->getDeclContext());
    845 
    846   // For anonymous structs/unions, match up the anonymous struct/union type
    847   // declarations directly, so that we don't go off searching for anonymous
    848   // types
    849   if (Field1->isAnonymousStructOrUnion() &&
    850       Field2->isAnonymousStructOrUnion()) {
    851     RecordDecl *D1 = Field1->getType()->castAs<RecordType>()->getDecl();
    852     RecordDecl *D2 = Field2->getType()->castAs<RecordType>()->getDecl();
    853     return IsStructurallyEquivalent(Context, D1, D2);
    854   }
    855 
    856   // Check for equivalent field names.
    857   IdentifierInfo *Name1 = Field1->getIdentifier();
    858   IdentifierInfo *Name2 = Field2->getIdentifier();
    859   if (!::IsStructurallyEquivalent(Name1, Name2))
    860     return false;
    861 
    862   if (!IsStructurallyEquivalent(Context,
    863                                 Field1->getType(), Field2->getType())) {
    864     if (Context.Complain) {
    865       Context.Diag2(Owner2->getLocation(), diag::warn_odr_tag_type_inconsistent)
    866         << Context.C2.getTypeDeclType(Owner2);
    867       Context.Diag2(Field2->getLocation(), diag::note_odr_field)
    868         << Field2->getDeclName() << Field2->getType();
    869       Context.Diag1(Field1->getLocation(), diag::note_odr_field)
    870         << Field1->getDeclName() << Field1->getType();
    871     }
    872     return false;
    873   }
    874 
    875   if (Field1->isBitField() != Field2->isBitField()) {
    876     if (Context.Complain) {
    877       Context.Diag2(Owner2->getLocation(), diag::warn_odr_tag_type_inconsistent)
    878         << Context.C2.getTypeDeclType(Owner2);
    879       if (Field1->isBitField()) {
    880         Context.Diag1(Field1->getLocation(), diag::note_odr_bit_field)
    881         << Field1->getDeclName() << Field1->getType()
    882         << Field1->getBitWidthValue(Context.C1);
    883         Context.Diag2(Field2->getLocation(), diag::note_odr_not_bit_field)
    884         << Field2->getDeclName();
    885       } else {
    886         Context.Diag2(Field2->getLocation(), diag::note_odr_bit_field)
    887         << Field2->getDeclName() << Field2->getType()
    888         << Field2->getBitWidthValue(Context.C2);
    889         Context.Diag1(Field1->getLocation(), diag::note_odr_not_bit_field)
    890         << Field1->getDeclName();
    891       }
    892     }
    893     return false;
    894   }
    895 
    896   if (Field1->isBitField()) {
    897     // Make sure that the bit-fields are the same length.
    898     unsigned Bits1 = Field1->getBitWidthValue(Context.C1);
    899     unsigned Bits2 = Field2->getBitWidthValue(Context.C2);
    900 
    901     if (Bits1 != Bits2) {
    902       if (Context.Complain) {
    903         Context.Diag2(Owner2->getLocation(), diag::warn_odr_tag_type_inconsistent)
    904           << Context.C2.getTypeDeclType(Owner2);
    905         Context.Diag2(Field2->getLocation(), diag::note_odr_bit_field)
    906           << Field2->getDeclName() << Field2->getType() << Bits2;
    907         Context.Diag1(Field1->getLocation(), diag::note_odr_bit_field)
    908           << Field1->getDeclName() << Field1->getType() << Bits1;
    909       }
    910       return false;
    911     }
    912   }
    913 
    914   return true;
    915 }
    916 
    917 /// \brief Find the index of the given anonymous struct/union within its
    918 /// context.
    919 ///
    920 /// \returns Returns the index of this anonymous struct/union in its context,
    921 /// including the next assigned index (if none of them match). Returns an
    922 /// empty option if the context is not a record, i.e.. if the anonymous
    923 /// struct/union is at namespace or block scope.
    924 static Optional<unsigned> findAnonymousStructOrUnionIndex(RecordDecl *Anon) {
    925   ASTContext &Context = Anon->getASTContext();
    926   QualType AnonTy = Context.getRecordType(Anon);
    927 
    928   RecordDecl *Owner = dyn_cast<RecordDecl>(Anon->getDeclContext());
    929   if (!Owner)
    930     return None;
    931 
    932   unsigned Index = 0;
    933   for (const auto *D : Owner->noload_decls()) {
    934     const auto *F = dyn_cast<FieldDecl>(D);
    935     if (!F || !F->isAnonymousStructOrUnion())
    936       continue;
    937 
    938     if (Context.hasSameType(F->getType(), AnonTy))
    939       break;
    940 
    941     ++Index;
    942   }
    943 
    944   return Index;
    945 }
    946 
    947 /// \brief Determine structural equivalence of two records.
    948 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
    949                                      RecordDecl *D1, RecordDecl *D2) {
    950   if (D1->isUnion() != D2->isUnion()) {
    951     if (Context.Complain) {
    952       Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
    953         << Context.C2.getTypeDeclType(D2);
    954       Context.Diag1(D1->getLocation(), diag::note_odr_tag_kind_here)
    955         << D1->getDeclName() << (unsigned)D1->getTagKind();
    956     }
    957     return false;
    958   }
    959 
    960   if (D1->isAnonymousStructOrUnion() && D2->isAnonymousStructOrUnion()) {
    961     // If both anonymous structs/unions are in a record context, make sure
    962     // they occur in the same location in the context records.
    963     if (Optional<unsigned> Index1 = findAnonymousStructOrUnionIndex(D1)) {
    964       if (Optional<unsigned> Index2 = findAnonymousStructOrUnionIndex(D2)) {
    965         if (*Index1 != *Index2)
    966           return false;
    967       }
    968     }
    969   }
    970 
    971   // If both declarations are class template specializations, we know
    972   // the ODR applies, so check the template and template arguments.
    973   ClassTemplateSpecializationDecl *Spec1
    974     = dyn_cast<ClassTemplateSpecializationDecl>(D1);
    975   ClassTemplateSpecializationDecl *Spec2
    976     = dyn_cast<ClassTemplateSpecializationDecl>(D2);
    977   if (Spec1 && Spec2) {
    978     // Check that the specialized templates are the same.
    979     if (!IsStructurallyEquivalent(Context, Spec1->getSpecializedTemplate(),
    980                                   Spec2->getSpecializedTemplate()))
    981       return false;
    982 
    983     // Check that the template arguments are the same.
    984     if (Spec1->getTemplateArgs().size() != Spec2->getTemplateArgs().size())
    985       return false;
    986 
    987     for (unsigned I = 0, N = Spec1->getTemplateArgs().size(); I != N; ++I)
    988       if (!IsStructurallyEquivalent(Context,
    989                                     Spec1->getTemplateArgs().get(I),
    990                                     Spec2->getTemplateArgs().get(I)))
    991         return false;
    992   }
    993   // If one is a class template specialization and the other is not, these
    994   // structures are different.
    995   else if (Spec1 || Spec2)
    996     return false;
    997 
    998   // Compare the definitions of these two records. If either or both are
    999   // incomplete, we assume that they are equivalent.
   1000   D1 = D1->getDefinition();
   1001   D2 = D2->getDefinition();
   1002   if (!D1 || !D2)
   1003     return true;
   1004 
   1005   if (CXXRecordDecl *D1CXX = dyn_cast<CXXRecordDecl>(D1)) {
   1006     if (CXXRecordDecl *D2CXX = dyn_cast<CXXRecordDecl>(D2)) {
   1007       if (D1CXX->getNumBases() != D2CXX->getNumBases()) {
   1008         if (Context.Complain) {
   1009           Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
   1010             << Context.C2.getTypeDeclType(D2);
   1011           Context.Diag2(D2->getLocation(), diag::note_odr_number_of_bases)
   1012             << D2CXX->getNumBases();
   1013           Context.Diag1(D1->getLocation(), diag::note_odr_number_of_bases)
   1014             << D1CXX->getNumBases();
   1015         }
   1016         return false;
   1017       }
   1018 
   1019       // Check the base classes.
   1020       for (CXXRecordDecl::base_class_iterator Base1 = D1CXX->bases_begin(),
   1021                                            BaseEnd1 = D1CXX->bases_end(),
   1022                                                 Base2 = D2CXX->bases_begin();
   1023            Base1 != BaseEnd1;
   1024            ++Base1, ++Base2) {
   1025         if (!IsStructurallyEquivalent(Context,
   1026                                       Base1->getType(), Base2->getType())) {
   1027           if (Context.Complain) {
   1028             Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
   1029               << Context.C2.getTypeDeclType(D2);
   1030             Context.Diag2(Base2->getLocStart(), diag::note_odr_base)
   1031               << Base2->getType()
   1032               << Base2->getSourceRange();
   1033             Context.Diag1(Base1->getLocStart(), diag::note_odr_base)
   1034               << Base1->getType()
   1035               << Base1->getSourceRange();
   1036           }
   1037           return false;
   1038         }
   1039 
   1040         // Check virtual vs. non-virtual inheritance mismatch.
   1041         if (Base1->isVirtual() != Base2->isVirtual()) {
   1042           if (Context.Complain) {
   1043             Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
   1044               << Context.C2.getTypeDeclType(D2);
   1045             Context.Diag2(Base2->getLocStart(),
   1046                           diag::note_odr_virtual_base)
   1047               << Base2->isVirtual() << Base2->getSourceRange();
   1048             Context.Diag1(Base1->getLocStart(), diag::note_odr_base)
   1049               << Base1->isVirtual()
   1050               << Base1->getSourceRange();
   1051           }
   1052           return false;
   1053         }
   1054       }
   1055     } else if (D1CXX->getNumBases() > 0) {
   1056       if (Context.Complain) {
   1057         Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
   1058           << Context.C2.getTypeDeclType(D2);
   1059         const CXXBaseSpecifier *Base1 = D1CXX->bases_begin();
   1060         Context.Diag1(Base1->getLocStart(), diag::note_odr_base)
   1061           << Base1->getType()
   1062           << Base1->getSourceRange();
   1063         Context.Diag2(D2->getLocation(), diag::note_odr_missing_base);
   1064       }
   1065       return false;
   1066     }
   1067   }
   1068 
   1069   // Check the fields for consistency.
   1070   RecordDecl::field_iterator Field2 = D2->field_begin(),
   1071                              Field2End = D2->field_end();
   1072   for (RecordDecl::field_iterator Field1 = D1->field_begin(),
   1073                                   Field1End = D1->field_end();
   1074        Field1 != Field1End;
   1075        ++Field1, ++Field2) {
   1076     if (Field2 == Field2End) {
   1077       if (Context.Complain) {
   1078         Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
   1079           << Context.C2.getTypeDeclType(D2);
   1080         Context.Diag1(Field1->getLocation(), diag::note_odr_field)
   1081           << Field1->getDeclName() << Field1->getType();
   1082         Context.Diag2(D2->getLocation(), diag::note_odr_missing_field);
   1083       }
   1084       return false;
   1085     }
   1086 
   1087     if (!IsStructurallyEquivalent(Context, *Field1, *Field2))
   1088       return false;
   1089   }
   1090 
   1091   if (Field2 != Field2End) {
   1092     if (Context.Complain) {
   1093       Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
   1094         << Context.C2.getTypeDeclType(D2);
   1095       Context.Diag2(Field2->getLocation(), diag::note_odr_field)
   1096         << Field2->getDeclName() << Field2->getType();
   1097       Context.Diag1(D1->getLocation(), diag::note_odr_missing_field);
   1098     }
   1099     return false;
   1100   }
   1101 
   1102   return true;
   1103 }
   1104 
   1105 /// \brief Determine structural equivalence of two enums.
   1106 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
   1107                                      EnumDecl *D1, EnumDecl *D2) {
   1108   EnumDecl::enumerator_iterator EC2 = D2->enumerator_begin(),
   1109                              EC2End = D2->enumerator_end();
   1110   for (EnumDecl::enumerator_iterator EC1 = D1->enumerator_begin(),
   1111                                   EC1End = D1->enumerator_end();
   1112        EC1 != EC1End; ++EC1, ++EC2) {
   1113     if (EC2 == EC2End) {
   1114       if (Context.Complain) {
   1115         Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
   1116           << Context.C2.getTypeDeclType(D2);
   1117         Context.Diag1(EC1->getLocation(), diag::note_odr_enumerator)
   1118           << EC1->getDeclName()
   1119           << EC1->getInitVal().toString(10);
   1120         Context.Diag2(D2->getLocation(), diag::note_odr_missing_enumerator);
   1121       }
   1122       return false;
   1123     }
   1124 
   1125     llvm::APSInt Val1 = EC1->getInitVal();
   1126     llvm::APSInt Val2 = EC2->getInitVal();
   1127     if (!llvm::APSInt::isSameValue(Val1, Val2) ||
   1128         !IsStructurallyEquivalent(EC1->getIdentifier(), EC2->getIdentifier())) {
   1129       if (Context.Complain) {
   1130         Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
   1131           << Context.C2.getTypeDeclType(D2);
   1132         Context.Diag2(EC2->getLocation(), diag::note_odr_enumerator)
   1133           << EC2->getDeclName()
   1134           << EC2->getInitVal().toString(10);
   1135         Context.Diag1(EC1->getLocation(), diag::note_odr_enumerator)
   1136           << EC1->getDeclName()
   1137           << EC1->getInitVal().toString(10);
   1138       }
   1139       return false;
   1140     }
   1141   }
   1142 
   1143   if (EC2 != EC2End) {
   1144     if (Context.Complain) {
   1145       Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
   1146         << Context.C2.getTypeDeclType(D2);
   1147       Context.Diag2(EC2->getLocation(), diag::note_odr_enumerator)
   1148         << EC2->getDeclName()
   1149         << EC2->getInitVal().toString(10);
   1150       Context.Diag1(D1->getLocation(), diag::note_odr_missing_enumerator);
   1151     }
   1152     return false;
   1153   }
   1154 
   1155   return true;
   1156 }
   1157 
   1158 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
   1159                                      TemplateParameterList *Params1,
   1160                                      TemplateParameterList *Params2) {
   1161   if (Params1->size() != Params2->size()) {
   1162     if (Context.Complain) {
   1163       Context.Diag2(Params2->getTemplateLoc(),
   1164                     diag::err_odr_different_num_template_parameters)
   1165         << Params1->size() << Params2->size();
   1166       Context.Diag1(Params1->getTemplateLoc(),
   1167                     diag::note_odr_template_parameter_list);
   1168     }
   1169     return false;
   1170   }
   1171 
   1172   for (unsigned I = 0, N = Params1->size(); I != N; ++I) {
   1173     if (Params1->getParam(I)->getKind() != Params2->getParam(I)->getKind()) {
   1174       if (Context.Complain) {
   1175         Context.Diag2(Params2->getParam(I)->getLocation(),
   1176                       diag::err_odr_different_template_parameter_kind);
   1177         Context.Diag1(Params1->getParam(I)->getLocation(),
   1178                       diag::note_odr_template_parameter_here);
   1179       }
   1180       return false;
   1181     }
   1182 
   1183     if (!Context.IsStructurallyEquivalent(Params1->getParam(I),
   1184                                           Params2->getParam(I))) {
   1185 
   1186       return false;
   1187     }
   1188   }
   1189 
   1190   return true;
   1191 }
   1192 
   1193 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
   1194                                      TemplateTypeParmDecl *D1,
   1195                                      TemplateTypeParmDecl *D2) {
   1196   if (D1->isParameterPack() != D2->isParameterPack()) {
   1197     if (Context.Complain) {
   1198       Context.Diag2(D2->getLocation(), diag::err_odr_parameter_pack_non_pack)
   1199         << D2->isParameterPack();
   1200       Context.Diag1(D1->getLocation(), diag::note_odr_parameter_pack_non_pack)
   1201         << D1->isParameterPack();
   1202     }
   1203     return false;
   1204   }
   1205 
   1206   return true;
   1207 }
   1208 
   1209 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
   1210                                      NonTypeTemplateParmDecl *D1,
   1211                                      NonTypeTemplateParmDecl *D2) {
   1212   if (D1->isParameterPack() != D2->isParameterPack()) {
   1213     if (Context.Complain) {
   1214       Context.Diag2(D2->getLocation(), diag::err_odr_parameter_pack_non_pack)
   1215         << D2->isParameterPack();
   1216       Context.Diag1(D1->getLocation(), diag::note_odr_parameter_pack_non_pack)
   1217         << D1->isParameterPack();
   1218     }
   1219     return false;
   1220   }
   1221 
   1222   // Check types.
   1223   if (!Context.IsStructurallyEquivalent(D1->getType(), D2->getType())) {
   1224     if (Context.Complain) {
   1225       Context.Diag2(D2->getLocation(),
   1226                     diag::err_odr_non_type_parameter_type_inconsistent)
   1227         << D2->getType() << D1->getType();
   1228       Context.Diag1(D1->getLocation(), diag::note_odr_value_here)
   1229         << D1->getType();
   1230     }
   1231     return false;
   1232   }
   1233 
   1234   return true;
   1235 }
   1236 
   1237 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
   1238                                      TemplateTemplateParmDecl *D1,
   1239                                      TemplateTemplateParmDecl *D2) {
   1240   if (D1->isParameterPack() != D2->isParameterPack()) {
   1241     if (Context.Complain) {
   1242       Context.Diag2(D2->getLocation(), diag::err_odr_parameter_pack_non_pack)
   1243         << D2->isParameterPack();
   1244       Context.Diag1(D1->getLocation(), diag::note_odr_parameter_pack_non_pack)
   1245         << D1->isParameterPack();
   1246     }
   1247     return false;
   1248   }
   1249 
   1250   // Check template parameter lists.
   1251   return IsStructurallyEquivalent(Context, D1->getTemplateParameters(),
   1252                                   D2->getTemplateParameters());
   1253 }
   1254 
   1255 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
   1256                                      ClassTemplateDecl *D1,
   1257                                      ClassTemplateDecl *D2) {
   1258   // Check template parameters.
   1259   if (!IsStructurallyEquivalent(Context,
   1260                                 D1->getTemplateParameters(),
   1261                                 D2->getTemplateParameters()))
   1262     return false;
   1263 
   1264   // Check the templated declaration.
   1265   return Context.IsStructurallyEquivalent(D1->getTemplatedDecl(),
   1266                                           D2->getTemplatedDecl());
   1267 }
   1268 
   1269 /// \brief Determine structural equivalence of two declarations.
   1270 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
   1271                                      Decl *D1, Decl *D2) {
   1272   // FIXME: Check for known structural equivalences via a callback of some sort.
   1273 
   1274   // Check whether we already know that these two declarations are not
   1275   // structurally equivalent.
   1276   if (Context.NonEquivalentDecls.count(std::make_pair(D1->getCanonicalDecl(),
   1277                                                       D2->getCanonicalDecl())))
   1278     return false;
   1279 
   1280   // Determine whether we've already produced a tentative equivalence for D1.
   1281   Decl *&EquivToD1 = Context.TentativeEquivalences[D1->getCanonicalDecl()];
   1282   if (EquivToD1)
   1283     return EquivToD1 == D2->getCanonicalDecl();
   1284 
   1285   // Produce a tentative equivalence D1 <-> D2, which will be checked later.
   1286   EquivToD1 = D2->getCanonicalDecl();
   1287   Context.DeclsToCheck.push_back(D1->getCanonicalDecl());
   1288   return true;
   1289 }
   1290 
   1291 bool StructuralEquivalenceContext::IsStructurallyEquivalent(Decl *D1,
   1292                                                             Decl *D2) {
   1293   if (!::IsStructurallyEquivalent(*this, D1, D2))
   1294     return false;
   1295 
   1296   return !Finish();
   1297 }
   1298 
   1299 bool StructuralEquivalenceContext::IsStructurallyEquivalent(QualType T1,
   1300                                                             QualType T2) {
   1301   if (!::IsStructurallyEquivalent(*this, T1, T2))
   1302     return false;
   1303 
   1304   return !Finish();
   1305 }
   1306 
   1307 bool StructuralEquivalenceContext::Finish() {
   1308   while (!DeclsToCheck.empty()) {
   1309     // Check the next declaration.
   1310     Decl *D1 = DeclsToCheck.front();
   1311     DeclsToCheck.pop_front();
   1312 
   1313     Decl *D2 = TentativeEquivalences[D1];
   1314     assert(D2 && "Unrecorded tentative equivalence?");
   1315 
   1316     bool Equivalent = true;
   1317 
   1318     // FIXME: Switch on all declaration kinds. For now, we're just going to
   1319     // check the obvious ones.
   1320     if (RecordDecl *Record1 = dyn_cast<RecordDecl>(D1)) {
   1321       if (RecordDecl *Record2 = dyn_cast<RecordDecl>(D2)) {
   1322         // Check for equivalent structure names.
   1323         IdentifierInfo *Name1 = Record1->getIdentifier();
   1324         if (!Name1 && Record1->getTypedefNameForAnonDecl())
   1325           Name1 = Record1->getTypedefNameForAnonDecl()->getIdentifier();
   1326         IdentifierInfo *Name2 = Record2->getIdentifier();
   1327         if (!Name2 && Record2->getTypedefNameForAnonDecl())
   1328           Name2 = Record2->getTypedefNameForAnonDecl()->getIdentifier();
   1329         if (!::IsStructurallyEquivalent(Name1, Name2) ||
   1330             !::IsStructurallyEquivalent(*this, Record1, Record2))
   1331           Equivalent = false;
   1332       } else {
   1333         // Record/non-record mismatch.
   1334         Equivalent = false;
   1335       }
   1336     } else if (EnumDecl *Enum1 = dyn_cast<EnumDecl>(D1)) {
   1337       if (EnumDecl *Enum2 = dyn_cast<EnumDecl>(D2)) {
   1338         // Check for equivalent enum names.
   1339         IdentifierInfo *Name1 = Enum1->getIdentifier();
   1340         if (!Name1 && Enum1->getTypedefNameForAnonDecl())
   1341           Name1 = Enum1->getTypedefNameForAnonDecl()->getIdentifier();
   1342         IdentifierInfo *Name2 = Enum2->getIdentifier();
   1343         if (!Name2 && Enum2->getTypedefNameForAnonDecl())
   1344           Name2 = Enum2->getTypedefNameForAnonDecl()->getIdentifier();
   1345         if (!::IsStructurallyEquivalent(Name1, Name2) ||
   1346             !::IsStructurallyEquivalent(*this, Enum1, Enum2))
   1347           Equivalent = false;
   1348       } else {
   1349         // Enum/non-enum mismatch
   1350         Equivalent = false;
   1351       }
   1352     } else if (TypedefNameDecl *Typedef1 = dyn_cast<TypedefNameDecl>(D1)) {
   1353       if (TypedefNameDecl *Typedef2 = dyn_cast<TypedefNameDecl>(D2)) {
   1354         if (!::IsStructurallyEquivalent(Typedef1->getIdentifier(),
   1355                                         Typedef2->getIdentifier()) ||
   1356             !::IsStructurallyEquivalent(*this,
   1357                                         Typedef1->getUnderlyingType(),
   1358                                         Typedef2->getUnderlyingType()))
   1359           Equivalent = false;
   1360       } else {
   1361         // Typedef/non-typedef mismatch.
   1362         Equivalent = false;
   1363       }
   1364     } else if (ClassTemplateDecl *ClassTemplate1
   1365                                            = dyn_cast<ClassTemplateDecl>(D1)) {
   1366       if (ClassTemplateDecl *ClassTemplate2 = dyn_cast<ClassTemplateDecl>(D2)) {
   1367         if (!::IsStructurallyEquivalent(ClassTemplate1->getIdentifier(),
   1368                                         ClassTemplate2->getIdentifier()) ||
   1369             !::IsStructurallyEquivalent(*this, ClassTemplate1, ClassTemplate2))
   1370           Equivalent = false;
   1371       } else {
   1372         // Class template/non-class-template mismatch.
   1373         Equivalent = false;
   1374       }
   1375     } else if (TemplateTypeParmDecl *TTP1= dyn_cast<TemplateTypeParmDecl>(D1)) {
   1376       if (TemplateTypeParmDecl *TTP2 = dyn_cast<TemplateTypeParmDecl>(D2)) {
   1377         if (!::IsStructurallyEquivalent(*this, TTP1, TTP2))
   1378           Equivalent = false;
   1379       } else {
   1380         // Kind mismatch.
   1381         Equivalent = false;
   1382       }
   1383     } else if (NonTypeTemplateParmDecl *NTTP1
   1384                                      = dyn_cast<NonTypeTemplateParmDecl>(D1)) {
   1385       if (NonTypeTemplateParmDecl *NTTP2
   1386                                       = dyn_cast<NonTypeTemplateParmDecl>(D2)) {
   1387         if (!::IsStructurallyEquivalent(*this, NTTP1, NTTP2))
   1388           Equivalent = false;
   1389       } else {
   1390         // Kind mismatch.
   1391         Equivalent = false;
   1392       }
   1393     } else if (TemplateTemplateParmDecl *TTP1
   1394                                   = dyn_cast<TemplateTemplateParmDecl>(D1)) {
   1395       if (TemplateTemplateParmDecl *TTP2
   1396                                     = dyn_cast<TemplateTemplateParmDecl>(D2)) {
   1397         if (!::IsStructurallyEquivalent(*this, TTP1, TTP2))
   1398           Equivalent = false;
   1399       } else {
   1400         // Kind mismatch.
   1401         Equivalent = false;
   1402       }
   1403     }
   1404 
   1405     if (!Equivalent) {
   1406       // Note that these two declarations are not equivalent (and we already
   1407       // know about it).
   1408       NonEquivalentDecls.insert(std::make_pair(D1->getCanonicalDecl(),
   1409                                                D2->getCanonicalDecl()));
   1410       return true;
   1411     }
   1412     // FIXME: Check other declaration kinds!
   1413   }
   1414 
   1415   return false;
   1416 }
   1417 
   1418 //----------------------------------------------------------------------------
   1419 // Import Types
   1420 //----------------------------------------------------------------------------
   1421 
   1422 QualType ASTNodeImporter::VisitType(const Type *T) {
   1423   Importer.FromDiag(SourceLocation(), diag::err_unsupported_ast_node)
   1424     << T->getTypeClassName();
   1425   return QualType();
   1426 }
   1427 
   1428 QualType ASTNodeImporter::VisitBuiltinType(const BuiltinType *T) {
   1429   switch (T->getKind()) {
   1430 #define SHARED_SINGLETON_TYPE(Expansion)
   1431 #define BUILTIN_TYPE(Id, SingletonId) \
   1432   case BuiltinType::Id: return Importer.getToContext().SingletonId;
   1433 #include "clang/AST/BuiltinTypes.def"
   1434 
   1435   // FIXME: for Char16, Char32, and NullPtr, make sure that the "to"
   1436   // context supports C++.
   1437 
   1438   // FIXME: for ObjCId, ObjCClass, and ObjCSel, make sure that the "to"
   1439   // context supports ObjC.
   1440 
   1441   case BuiltinType::Char_U:
   1442     // The context we're importing from has an unsigned 'char'. If we're
   1443     // importing into a context with a signed 'char', translate to
   1444     // 'unsigned char' instead.
   1445     if (Importer.getToContext().getLangOpts().CharIsSigned)
   1446       return Importer.getToContext().UnsignedCharTy;
   1447 
   1448     return Importer.getToContext().CharTy;
   1449 
   1450   case BuiltinType::Char_S:
   1451     // The context we're importing from has an unsigned 'char'. If we're
   1452     // importing into a context with a signed 'char', translate to
   1453     // 'unsigned char' instead.
   1454     if (!Importer.getToContext().getLangOpts().CharIsSigned)
   1455       return Importer.getToContext().SignedCharTy;
   1456 
   1457     return Importer.getToContext().CharTy;
   1458 
   1459   case BuiltinType::WChar_S:
   1460   case BuiltinType::WChar_U:
   1461     // FIXME: If not in C++, shall we translate to the C equivalent of
   1462     // wchar_t?
   1463     return Importer.getToContext().WCharTy;
   1464   }
   1465 
   1466   llvm_unreachable("Invalid BuiltinType Kind!");
   1467 }
   1468 
   1469 QualType ASTNodeImporter::VisitComplexType(const ComplexType *T) {
   1470   QualType ToElementType = Importer.Import(T->getElementType());
   1471   if (ToElementType.isNull())
   1472     return QualType();
   1473 
   1474   return Importer.getToContext().getComplexType(ToElementType);
   1475 }
   1476 
   1477 QualType ASTNodeImporter::VisitPointerType(const PointerType *T) {
   1478   QualType ToPointeeType = Importer.Import(T->getPointeeType());
   1479   if (ToPointeeType.isNull())
   1480     return QualType();
   1481 
   1482   return Importer.getToContext().getPointerType(ToPointeeType);
   1483 }
   1484 
   1485 QualType ASTNodeImporter::VisitBlockPointerType(const BlockPointerType *T) {
   1486   // FIXME: Check for blocks support in "to" context.
   1487   QualType ToPointeeType = Importer.Import(T->getPointeeType());
   1488   if (ToPointeeType.isNull())
   1489     return QualType();
   1490 
   1491   return Importer.getToContext().getBlockPointerType(ToPointeeType);
   1492 }
   1493 
   1494 QualType
   1495 ASTNodeImporter::VisitLValueReferenceType(const LValueReferenceType *T) {
   1496   // FIXME: Check for C++ support in "to" context.
   1497   QualType ToPointeeType = Importer.Import(T->getPointeeTypeAsWritten());
   1498   if (ToPointeeType.isNull())
   1499     return QualType();
   1500 
   1501   return Importer.getToContext().getLValueReferenceType(ToPointeeType);
   1502 }
   1503 
   1504 QualType
   1505 ASTNodeImporter::VisitRValueReferenceType(const RValueReferenceType *T) {
   1506   // FIXME: Check for C++0x support in "to" context.
   1507   QualType ToPointeeType = Importer.Import(T->getPointeeTypeAsWritten());
   1508   if (ToPointeeType.isNull())
   1509     return QualType();
   1510 
   1511   return Importer.getToContext().getRValueReferenceType(ToPointeeType);
   1512 }
   1513 
   1514 QualType ASTNodeImporter::VisitMemberPointerType(const MemberPointerType *T) {
   1515   // FIXME: Check for C++ support in "to" context.
   1516   QualType ToPointeeType = Importer.Import(T->getPointeeType());
   1517   if (ToPointeeType.isNull())
   1518     return QualType();
   1519 
   1520   QualType ClassType = Importer.Import(QualType(T->getClass(), 0));
   1521   return Importer.getToContext().getMemberPointerType(ToPointeeType,
   1522                                                       ClassType.getTypePtr());
   1523 }
   1524 
   1525 QualType ASTNodeImporter::VisitConstantArrayType(const ConstantArrayType *T) {
   1526   QualType ToElementType = Importer.Import(T->getElementType());
   1527   if (ToElementType.isNull())
   1528     return QualType();
   1529 
   1530   return Importer.getToContext().getConstantArrayType(ToElementType,
   1531                                                       T->getSize(),
   1532                                                       T->getSizeModifier(),
   1533                                                T->getIndexTypeCVRQualifiers());
   1534 }
   1535 
   1536 QualType
   1537 ASTNodeImporter::VisitIncompleteArrayType(const IncompleteArrayType *T) {
   1538   QualType ToElementType = Importer.Import(T->getElementType());
   1539   if (ToElementType.isNull())
   1540     return QualType();
   1541 
   1542   return Importer.getToContext().getIncompleteArrayType(ToElementType,
   1543                                                         T->getSizeModifier(),
   1544                                                 T->getIndexTypeCVRQualifiers());
   1545 }
   1546 
   1547 QualType ASTNodeImporter::VisitVariableArrayType(const VariableArrayType *T) {
   1548   QualType ToElementType = Importer.Import(T->getElementType());
   1549   if (ToElementType.isNull())
   1550     return QualType();
   1551 
   1552   Expr *Size = Importer.Import(T->getSizeExpr());
   1553   if (!Size)
   1554     return QualType();
   1555 
   1556   SourceRange Brackets = Importer.Import(T->getBracketsRange());
   1557   return Importer.getToContext().getVariableArrayType(ToElementType, Size,
   1558                                                       T->getSizeModifier(),
   1559                                                 T->getIndexTypeCVRQualifiers(),
   1560                                                       Brackets);
   1561 }
   1562 
   1563 QualType ASTNodeImporter::VisitVectorType(const VectorType *T) {
   1564   QualType ToElementType = Importer.Import(T->getElementType());
   1565   if (ToElementType.isNull())
   1566     return QualType();
   1567 
   1568   return Importer.getToContext().getVectorType(ToElementType,
   1569                                                T->getNumElements(),
   1570                                                T->getVectorKind());
   1571 }
   1572 
   1573 QualType ASTNodeImporter::VisitExtVectorType(const ExtVectorType *T) {
   1574   QualType ToElementType = Importer.Import(T->getElementType());
   1575   if (ToElementType.isNull())
   1576     return QualType();
   1577 
   1578   return Importer.getToContext().getExtVectorType(ToElementType,
   1579                                                   T->getNumElements());
   1580 }
   1581 
   1582 QualType
   1583 ASTNodeImporter::VisitFunctionNoProtoType(const FunctionNoProtoType *T) {
   1584   // FIXME: What happens if we're importing a function without a prototype
   1585   // into C++? Should we make it variadic?
   1586   QualType ToResultType = Importer.Import(T->getReturnType());
   1587   if (ToResultType.isNull())
   1588     return QualType();
   1589 
   1590   return Importer.getToContext().getFunctionNoProtoType(ToResultType,
   1591                                                         T->getExtInfo());
   1592 }
   1593 
   1594 QualType ASTNodeImporter::VisitFunctionProtoType(const FunctionProtoType *T) {
   1595   QualType ToResultType = Importer.Import(T->getReturnType());
   1596   if (ToResultType.isNull())
   1597     return QualType();
   1598 
   1599   // Import argument types
   1600   SmallVector<QualType, 4> ArgTypes;
   1601   for (const auto &A : T->param_types()) {
   1602     QualType ArgType = Importer.Import(A);
   1603     if (ArgType.isNull())
   1604       return QualType();
   1605     ArgTypes.push_back(ArgType);
   1606   }
   1607 
   1608   // Import exception types
   1609   SmallVector<QualType, 4> ExceptionTypes;
   1610   for (const auto &E : T->exceptions()) {
   1611     QualType ExceptionType = Importer.Import(E);
   1612     if (ExceptionType.isNull())
   1613       return QualType();
   1614     ExceptionTypes.push_back(ExceptionType);
   1615   }
   1616 
   1617   FunctionProtoType::ExtProtoInfo FromEPI = T->getExtProtoInfo();
   1618   FunctionProtoType::ExtProtoInfo ToEPI;
   1619 
   1620   ToEPI.ExtInfo = FromEPI.ExtInfo;
   1621   ToEPI.Variadic = FromEPI.Variadic;
   1622   ToEPI.HasTrailingReturn = FromEPI.HasTrailingReturn;
   1623   ToEPI.TypeQuals = FromEPI.TypeQuals;
   1624   ToEPI.RefQualifier = FromEPI.RefQualifier;
   1625   ToEPI.NumExceptions = ExceptionTypes.size();
   1626   ToEPI.Exceptions = ExceptionTypes.data();
   1627   ToEPI.ConsumedParameters = FromEPI.ConsumedParameters;
   1628   ToEPI.ExceptionSpecType = FromEPI.ExceptionSpecType;
   1629   ToEPI.NoexceptExpr = Importer.Import(FromEPI.NoexceptExpr);
   1630   ToEPI.ExceptionSpecDecl = cast_or_null<FunctionDecl>(
   1631                                 Importer.Import(FromEPI.ExceptionSpecDecl));
   1632   ToEPI.ExceptionSpecTemplate = cast_or_null<FunctionDecl>(
   1633                                 Importer.Import(FromEPI.ExceptionSpecTemplate));
   1634 
   1635   return Importer.getToContext().getFunctionType(ToResultType, ArgTypes, ToEPI);
   1636 }
   1637 
   1638 QualType ASTNodeImporter::VisitParenType(const ParenType *T) {
   1639   QualType ToInnerType = Importer.Import(T->getInnerType());
   1640   if (ToInnerType.isNull())
   1641     return QualType();
   1642 
   1643   return Importer.getToContext().getParenType(ToInnerType);
   1644 }
   1645 
   1646 QualType ASTNodeImporter::VisitTypedefType(const TypedefType *T) {
   1647   TypedefNameDecl *ToDecl
   1648              = dyn_cast_or_null<TypedefNameDecl>(Importer.Import(T->getDecl()));
   1649   if (!ToDecl)
   1650     return QualType();
   1651 
   1652   return Importer.getToContext().getTypeDeclType(ToDecl);
   1653 }
   1654 
   1655 QualType ASTNodeImporter::VisitTypeOfExprType(const TypeOfExprType *T) {
   1656   Expr *ToExpr = Importer.Import(T->getUnderlyingExpr());
   1657   if (!ToExpr)
   1658     return QualType();
   1659 
   1660   return Importer.getToContext().getTypeOfExprType(ToExpr);
   1661 }
   1662 
   1663 QualType ASTNodeImporter::VisitTypeOfType(const TypeOfType *T) {
   1664   QualType ToUnderlyingType = Importer.Import(T->getUnderlyingType());
   1665   if (ToUnderlyingType.isNull())
   1666     return QualType();
   1667 
   1668   return Importer.getToContext().getTypeOfType(ToUnderlyingType);
   1669 }
   1670 
   1671 QualType ASTNodeImporter::VisitDecltypeType(const DecltypeType *T) {
   1672   // FIXME: Make sure that the "to" context supports C++0x!
   1673   Expr *ToExpr = Importer.Import(T->getUnderlyingExpr());
   1674   if (!ToExpr)
   1675     return QualType();
   1676 
   1677   QualType UnderlyingType = Importer.Import(T->getUnderlyingType());
   1678   if (UnderlyingType.isNull())
   1679     return QualType();
   1680 
   1681   return Importer.getToContext().getDecltypeType(ToExpr, UnderlyingType);
   1682 }
   1683 
   1684 QualType ASTNodeImporter::VisitUnaryTransformType(const UnaryTransformType *T) {
   1685   QualType ToBaseType = Importer.Import(T->getBaseType());
   1686   QualType ToUnderlyingType = Importer.Import(T->getUnderlyingType());
   1687   if (ToBaseType.isNull() || ToUnderlyingType.isNull())
   1688     return QualType();
   1689 
   1690   return Importer.getToContext().getUnaryTransformType(ToBaseType,
   1691                                                        ToUnderlyingType,
   1692                                                        T->getUTTKind());
   1693 }
   1694 
   1695 QualType ASTNodeImporter::VisitAutoType(const AutoType *T) {
   1696   // FIXME: Make sure that the "to" context supports C++11!
   1697   QualType FromDeduced = T->getDeducedType();
   1698   QualType ToDeduced;
   1699   if (!FromDeduced.isNull()) {
   1700     ToDeduced = Importer.Import(FromDeduced);
   1701     if (ToDeduced.isNull())
   1702       return QualType();
   1703   }
   1704 
   1705   return Importer.getToContext().getAutoType(ToDeduced, T->isDecltypeAuto(),
   1706                                              /*IsDependent*/false);
   1707 }
   1708 
   1709 QualType ASTNodeImporter::VisitRecordType(const RecordType *T) {
   1710   RecordDecl *ToDecl
   1711     = dyn_cast_or_null<RecordDecl>(Importer.Import(T->getDecl()));
   1712   if (!ToDecl)
   1713     return QualType();
   1714 
   1715   return Importer.getToContext().getTagDeclType(ToDecl);
   1716 }
   1717 
   1718 QualType ASTNodeImporter::VisitEnumType(const EnumType *T) {
   1719   EnumDecl *ToDecl
   1720     = dyn_cast_or_null<EnumDecl>(Importer.Import(T->getDecl()));
   1721   if (!ToDecl)
   1722     return QualType();
   1723 
   1724   return Importer.getToContext().getTagDeclType(ToDecl);
   1725 }
   1726 
   1727 QualType ASTNodeImporter::VisitTemplateSpecializationType(
   1728                                        const TemplateSpecializationType *T) {
   1729   TemplateName ToTemplate = Importer.Import(T->getTemplateName());
   1730   if (ToTemplate.isNull())
   1731     return QualType();
   1732 
   1733   SmallVector<TemplateArgument, 2> ToTemplateArgs;
   1734   if (ImportTemplateArguments(T->getArgs(), T->getNumArgs(), ToTemplateArgs))
   1735     return QualType();
   1736 
   1737   QualType ToCanonType;
   1738   if (!QualType(T, 0).isCanonical()) {
   1739     QualType FromCanonType
   1740       = Importer.getFromContext().getCanonicalType(QualType(T, 0));
   1741     ToCanonType =Importer.Import(FromCanonType);
   1742     if (ToCanonType.isNull())
   1743       return QualType();
   1744   }
   1745   return Importer.getToContext().getTemplateSpecializationType(ToTemplate,
   1746                                                          ToTemplateArgs.data(),
   1747                                                          ToTemplateArgs.size(),
   1748                                                                ToCanonType);
   1749 }
   1750 
   1751 QualType ASTNodeImporter::VisitElaboratedType(const ElaboratedType *T) {
   1752   NestedNameSpecifier *ToQualifier = nullptr;
   1753   // Note: the qualifier in an ElaboratedType is optional.
   1754   if (T->getQualifier()) {
   1755     ToQualifier = Importer.Import(T->getQualifier());
   1756     if (!ToQualifier)
   1757       return QualType();
   1758   }
   1759 
   1760   QualType ToNamedType = Importer.Import(T->getNamedType());
   1761   if (ToNamedType.isNull())
   1762     return QualType();
   1763 
   1764   return Importer.getToContext().getElaboratedType(T->getKeyword(),
   1765                                                    ToQualifier, ToNamedType);
   1766 }
   1767 
   1768 QualType ASTNodeImporter::VisitObjCInterfaceType(const ObjCInterfaceType *T) {
   1769   ObjCInterfaceDecl *Class
   1770     = dyn_cast_or_null<ObjCInterfaceDecl>(Importer.Import(T->getDecl()));
   1771   if (!Class)
   1772     return QualType();
   1773 
   1774   return Importer.getToContext().getObjCInterfaceType(Class);
   1775 }
   1776 
   1777 QualType ASTNodeImporter::VisitObjCObjectType(const ObjCObjectType *T) {
   1778   QualType ToBaseType = Importer.Import(T->getBaseType());
   1779   if (ToBaseType.isNull())
   1780     return QualType();
   1781 
   1782   SmallVector<ObjCProtocolDecl *, 4> Protocols;
   1783   for (auto *P : T->quals()) {
   1784     ObjCProtocolDecl *Protocol
   1785       = dyn_cast_or_null<ObjCProtocolDecl>(Importer.Import(P));
   1786     if (!Protocol)
   1787       return QualType();
   1788     Protocols.push_back(Protocol);
   1789   }
   1790 
   1791   return Importer.getToContext().getObjCObjectType(ToBaseType,
   1792                                                    Protocols.data(),
   1793                                                    Protocols.size());
   1794 }
   1795 
   1796 QualType
   1797 ASTNodeImporter::VisitObjCObjectPointerType(const ObjCObjectPointerType *T) {
   1798   QualType ToPointeeType = Importer.Import(T->getPointeeType());
   1799   if (ToPointeeType.isNull())
   1800     return QualType();
   1801 
   1802   return Importer.getToContext().getObjCObjectPointerType(ToPointeeType);
   1803 }
   1804 
   1805 //----------------------------------------------------------------------------
   1806 // Import Declarations
   1807 //----------------------------------------------------------------------------
   1808 bool ASTNodeImporter::ImportDeclParts(NamedDecl *D, DeclContext *&DC,
   1809                                       DeclContext *&LexicalDC,
   1810                                       DeclarationName &Name,
   1811                                       SourceLocation &Loc) {
   1812   // Import the context of this declaration.
   1813   DC = Importer.ImportContext(D->getDeclContext());
   1814   if (!DC)
   1815     return true;
   1816 
   1817   LexicalDC = DC;
   1818   if (D->getDeclContext() != D->getLexicalDeclContext()) {
   1819     LexicalDC = Importer.ImportContext(D->getLexicalDeclContext());
   1820     if (!LexicalDC)
   1821       return true;
   1822   }
   1823 
   1824   // Import the name of this declaration.
   1825   Name = Importer.Import(D->getDeclName());
   1826   if (D->getDeclName() && !Name)
   1827     return true;
   1828 
   1829   // Import the location of this declaration.
   1830   Loc = Importer.Import(D->getLocation());
   1831   return false;
   1832 }
   1833 
   1834 void ASTNodeImporter::ImportDefinitionIfNeeded(Decl *FromD, Decl *ToD) {
   1835   if (!FromD)
   1836     return;
   1837 
   1838   if (!ToD) {
   1839     ToD = Importer.Import(FromD);
   1840     if (!ToD)
   1841       return;
   1842   }
   1843 
   1844   if (RecordDecl *FromRecord = dyn_cast<RecordDecl>(FromD)) {
   1845     if (RecordDecl *ToRecord = cast_or_null<RecordDecl>(ToD)) {
   1846       if (FromRecord->getDefinition() && FromRecord->isCompleteDefinition() && !ToRecord->getDefinition()) {
   1847         ImportDefinition(FromRecord, ToRecord);
   1848       }
   1849     }
   1850     return;
   1851   }
   1852 
   1853   if (EnumDecl *FromEnum = dyn_cast<EnumDecl>(FromD)) {
   1854     if (EnumDecl *ToEnum = cast_or_null<EnumDecl>(ToD)) {
   1855       if (FromEnum->getDefinition() && !ToEnum->getDefinition()) {
   1856         ImportDefinition(FromEnum, ToEnum);
   1857       }
   1858     }
   1859     return;
   1860   }
   1861 }
   1862 
   1863 void
   1864 ASTNodeImporter::ImportDeclarationNameLoc(const DeclarationNameInfo &From,
   1865                                           DeclarationNameInfo& To) {
   1866   // NOTE: To.Name and To.Loc are already imported.
   1867   // We only have to import To.LocInfo.
   1868   switch (To.getName().getNameKind()) {
   1869   case DeclarationName::Identifier:
   1870   case DeclarationName::ObjCZeroArgSelector:
   1871   case DeclarationName::ObjCOneArgSelector:
   1872   case DeclarationName::ObjCMultiArgSelector:
   1873   case DeclarationName::CXXUsingDirective:
   1874     return;
   1875 
   1876   case DeclarationName::CXXOperatorName: {
   1877     SourceRange Range = From.getCXXOperatorNameRange();
   1878     To.setCXXOperatorNameRange(Importer.Import(Range));
   1879     return;
   1880   }
   1881   case DeclarationName::CXXLiteralOperatorName: {
   1882     SourceLocation Loc = From.getCXXLiteralOperatorNameLoc();
   1883     To.setCXXLiteralOperatorNameLoc(Importer.Import(Loc));
   1884     return;
   1885   }
   1886   case DeclarationName::CXXConstructorName:
   1887   case DeclarationName::CXXDestructorName:
   1888   case DeclarationName::CXXConversionFunctionName: {
   1889     TypeSourceInfo *FromTInfo = From.getNamedTypeInfo();
   1890     To.setNamedTypeInfo(Importer.Import(FromTInfo));
   1891     return;
   1892   }
   1893   }
   1894   llvm_unreachable("Unknown name kind.");
   1895 }
   1896 
   1897 void ASTNodeImporter::ImportDeclContext(DeclContext *FromDC, bool ForceImport) {
   1898   if (Importer.isMinimalImport() && !ForceImport) {
   1899     Importer.ImportContext(FromDC);
   1900     return;
   1901   }
   1902 
   1903   for (auto *From : FromDC->decls())
   1904     Importer.Import(From);
   1905 }
   1906 
   1907 bool ASTNodeImporter::ImportDefinition(RecordDecl *From, RecordDecl *To,
   1908                                        ImportDefinitionKind Kind) {
   1909   if (To->getDefinition() || To->isBeingDefined()) {
   1910     if (Kind == IDK_Everything)
   1911       ImportDeclContext(From, /*ForceImport=*/true);
   1912 
   1913     return false;
   1914   }
   1915 
   1916   To->startDefinition();
   1917 
   1918   // Add base classes.
   1919   if (CXXRecordDecl *ToCXX = dyn_cast<CXXRecordDecl>(To)) {
   1920     CXXRecordDecl *FromCXX = cast<CXXRecordDecl>(From);
   1921 
   1922     struct CXXRecordDecl::DefinitionData &ToData = ToCXX->data();
   1923     struct CXXRecordDecl::DefinitionData &FromData = FromCXX->data();
   1924     ToData.UserDeclaredConstructor = FromData.UserDeclaredConstructor;
   1925     ToData.UserDeclaredSpecialMembers = FromData.UserDeclaredSpecialMembers;
   1926     ToData.Aggregate = FromData.Aggregate;
   1927     ToData.PlainOldData = FromData.PlainOldData;
   1928     ToData.Empty = FromData.Empty;
   1929     ToData.Polymorphic = FromData.Polymorphic;
   1930     ToData.Abstract = FromData.Abstract;
   1931     ToData.IsStandardLayout = FromData.IsStandardLayout;
   1932     ToData.HasNoNonEmptyBases = FromData.HasNoNonEmptyBases;
   1933     ToData.HasPrivateFields = FromData.HasPrivateFields;
   1934     ToData.HasProtectedFields = FromData.HasProtectedFields;
   1935     ToData.HasPublicFields = FromData.HasPublicFields;
   1936     ToData.HasMutableFields = FromData.HasMutableFields;
   1937     ToData.HasVariantMembers = FromData.HasVariantMembers;
   1938     ToData.HasOnlyCMembers = FromData.HasOnlyCMembers;
   1939     ToData.HasInClassInitializer = FromData.HasInClassInitializer;
   1940     ToData.HasUninitializedReferenceMember
   1941       = FromData.HasUninitializedReferenceMember;
   1942     ToData.NeedOverloadResolutionForMoveConstructor
   1943       = FromData.NeedOverloadResolutionForMoveConstructor;
   1944     ToData.NeedOverloadResolutionForMoveAssignment
   1945       = FromData.NeedOverloadResolutionForMoveAssignment;
   1946     ToData.NeedOverloadResolutionForDestructor
   1947       = FromData.NeedOverloadResolutionForDestructor;
   1948     ToData.DefaultedMoveConstructorIsDeleted
   1949       = FromData.DefaultedMoveConstructorIsDeleted;
   1950     ToData.DefaultedMoveAssignmentIsDeleted
   1951       = FromData.DefaultedMoveAssignmentIsDeleted;
   1952     ToData.DefaultedDestructorIsDeleted = FromData.DefaultedDestructorIsDeleted;
   1953     ToData.HasTrivialSpecialMembers = FromData.HasTrivialSpecialMembers;
   1954     ToData.HasIrrelevantDestructor = FromData.HasIrrelevantDestructor;
   1955     ToData.HasConstexprNonCopyMoveConstructor
   1956       = FromData.HasConstexprNonCopyMoveConstructor;
   1957     ToData.DefaultedDefaultConstructorIsConstexpr
   1958       = FromData.DefaultedDefaultConstructorIsConstexpr;
   1959     ToData.HasConstexprDefaultConstructor
   1960       = FromData.HasConstexprDefaultConstructor;
   1961     ToData.HasNonLiteralTypeFieldsOrBases
   1962       = FromData.HasNonLiteralTypeFieldsOrBases;
   1963     // ComputedVisibleConversions not imported.
   1964     ToData.UserProvidedDefaultConstructor
   1965       = FromData.UserProvidedDefaultConstructor;
   1966     ToData.DeclaredSpecialMembers = FromData.DeclaredSpecialMembers;
   1967     ToData.ImplicitCopyConstructorHasConstParam
   1968       = FromData.ImplicitCopyConstructorHasConstParam;
   1969     ToData.ImplicitCopyAssignmentHasConstParam
   1970       = FromData.ImplicitCopyAssignmentHasConstParam;
   1971     ToData.HasDeclaredCopyConstructorWithConstParam
   1972       = FromData.HasDeclaredCopyConstructorWithConstParam;
   1973     ToData.HasDeclaredCopyAssignmentWithConstParam
   1974       = FromData.HasDeclaredCopyAssignmentWithConstParam;
   1975     ToData.IsLambda = FromData.IsLambda;
   1976 
   1977     SmallVector<CXXBaseSpecifier *, 4> Bases;
   1978     for (const auto &Base1 : FromCXX->bases()) {
   1979       QualType T = Importer.Import(Base1.getType());
   1980       if (T.isNull())
   1981         return true;
   1982 
   1983       SourceLocation EllipsisLoc;
   1984       if (Base1.isPackExpansion())
   1985         EllipsisLoc = Importer.Import(Base1.getEllipsisLoc());
   1986 
   1987       // Ensure that we have a definition for the base.
   1988       ImportDefinitionIfNeeded(Base1.getType()->getAsCXXRecordDecl());
   1989 
   1990       Bases.push_back(
   1991                     new (Importer.getToContext())
   1992                       CXXBaseSpecifier(Importer.Import(Base1.getSourceRange()),
   1993                                        Base1.isVirtual(),
   1994                                        Base1.isBaseOfClass(),
   1995                                        Base1.getAccessSpecifierAsWritten(),
   1996                                    Importer.Import(Base1.getTypeSourceInfo()),
   1997                                        EllipsisLoc));
   1998     }
   1999     if (!Bases.empty())
   2000       ToCXX->setBases(Bases.data(), Bases.size());
   2001   }
   2002 
   2003   if (shouldForceImportDeclContext(Kind))
   2004     ImportDeclContext(From, /*ForceImport=*/true);
   2005 
   2006   To->completeDefinition();
   2007   return false;
   2008 }
   2009 
   2010 bool ASTNodeImporter::ImportDefinition(VarDecl *From, VarDecl *To,
   2011                                        ImportDefinitionKind Kind) {
   2012   if (To->getDefinition())
   2013     return false;
   2014 
   2015   // FIXME: Can we really import any initializer? Alternatively, we could force
   2016   // ourselves to import every declaration of a variable and then only use
   2017   // getInit() here.
   2018   To->setInit(Importer.Import(const_cast<Expr *>(From->getAnyInitializer())));
   2019 
   2020   // FIXME: Other bits to merge?
   2021 
   2022   return false;
   2023 }
   2024 
   2025 bool ASTNodeImporter::ImportDefinition(EnumDecl *From, EnumDecl *To,
   2026                                        ImportDefinitionKind Kind) {
   2027   if (To->getDefinition() || To->isBeingDefined()) {
   2028     if (Kind == IDK_Everything)
   2029       ImportDeclContext(From, /*ForceImport=*/true);
   2030     return false;
   2031   }
   2032 
   2033   To->startDefinition();
   2034 
   2035   QualType T = Importer.Import(Importer.getFromContext().getTypeDeclType(From));
   2036   if (T.isNull())
   2037     return true;
   2038 
   2039   QualType ToPromotionType = Importer.Import(From->getPromotionType());
   2040   if (ToPromotionType.isNull())
   2041     return true;
   2042 
   2043   if (shouldForceImportDeclContext(Kind))
   2044     ImportDeclContext(From, /*ForceImport=*/true);
   2045 
   2046   // FIXME: we might need to merge the number of positive or negative bits
   2047   // if the enumerator lists don't match.
   2048   To->completeDefinition(T, ToPromotionType,
   2049                          From->getNumPositiveBits(),
   2050                          From->getNumNegativeBits());
   2051   return false;
   2052 }
   2053 
   2054 TemplateParameterList *ASTNodeImporter::ImportTemplateParameterList(
   2055                                                 TemplateParameterList *Params) {
   2056   SmallVector<NamedDecl *, 4> ToParams;
   2057   ToParams.reserve(Params->size());
   2058   for (TemplateParameterList::iterator P = Params->begin(),
   2059                                     PEnd = Params->end();
   2060        P != PEnd; ++P) {
   2061     Decl *To = Importer.Import(*P);
   2062     if (!To)
   2063       return nullptr;
   2064 
   2065     ToParams.push_back(cast<NamedDecl>(To));
   2066   }
   2067 
   2068   return TemplateParameterList::Create(Importer.getToContext(),
   2069                                        Importer.Import(Params->getTemplateLoc()),
   2070                                        Importer.Import(Params->getLAngleLoc()),
   2071                                        ToParams.data(), ToParams.size(),
   2072                                        Importer.Import(Params->getRAngleLoc()));
   2073 }
   2074 
   2075 TemplateArgument
   2076 ASTNodeImporter::ImportTemplateArgument(const TemplateArgument &From) {
   2077   switch (From.getKind()) {
   2078   case TemplateArgument::Null:
   2079     return TemplateArgument();
   2080 
   2081   case TemplateArgument::Type: {
   2082     QualType ToType = Importer.Import(From.getAsType());
   2083     if (ToType.isNull())
   2084       return TemplateArgument();
   2085     return TemplateArgument(ToType);
   2086   }
   2087 
   2088   case TemplateArgument::Integral: {
   2089     QualType ToType = Importer.Import(From.getIntegralType());
   2090     if (ToType.isNull())
   2091       return TemplateArgument();
   2092     return TemplateArgument(From, ToType);
   2093   }
   2094 
   2095   case TemplateArgument::Declaration: {
   2096     ValueDecl *FromD = From.getAsDecl();
   2097     if (ValueDecl *To = cast_or_null<ValueDecl>(Importer.Import(FromD)))
   2098       return TemplateArgument(To, From.isDeclForReferenceParam());
   2099     return TemplateArgument();
   2100   }
   2101 
   2102   case TemplateArgument::NullPtr: {
   2103     QualType ToType = Importer.Import(From.getNullPtrType());
   2104     if (ToType.isNull())
   2105       return TemplateArgument();
   2106     return TemplateArgument(ToType, /*isNullPtr*/true);
   2107   }
   2108 
   2109   case TemplateArgument::Template: {
   2110     TemplateName ToTemplate = Importer.Import(From.getAsTemplate());
   2111     if (ToTemplate.isNull())
   2112       return TemplateArgument();
   2113 
   2114     return TemplateArgument(ToTemplate);
   2115   }
   2116 
   2117   case TemplateArgument::TemplateExpansion: {
   2118     TemplateName ToTemplate
   2119       = Importer.Import(From.getAsTemplateOrTemplatePattern());
   2120     if (ToTemplate.isNull())
   2121       return TemplateArgument();
   2122 
   2123     return TemplateArgument(ToTemplate, From.getNumTemplateExpansions());
   2124   }
   2125 
   2126   case TemplateArgument::Expression:
   2127     if (Expr *ToExpr = Importer.Import(From.getAsExpr()))
   2128       return TemplateArgument(ToExpr);
   2129     return TemplateArgument();
   2130 
   2131   case TemplateArgument::Pack: {
   2132     SmallVector<TemplateArgument, 2> ToPack;
   2133     ToPack.reserve(From.pack_size());
   2134     if (ImportTemplateArguments(From.pack_begin(), From.pack_size(), ToPack))
   2135       return TemplateArgument();
   2136 
   2137     TemplateArgument *ToArgs
   2138       = new (Importer.getToContext()) TemplateArgument[ToPack.size()];
   2139     std::copy(ToPack.begin(), ToPack.end(), ToArgs);
   2140     return TemplateArgument(ToArgs, ToPack.size());
   2141   }
   2142   }
   2143 
   2144   llvm_unreachable("Invalid template argument kind");
   2145 }
   2146 
   2147 bool ASTNodeImporter::ImportTemplateArguments(const TemplateArgument *FromArgs,
   2148                                               unsigned NumFromArgs,
   2149                               SmallVectorImpl<TemplateArgument> &ToArgs) {
   2150   for (unsigned I = 0; I != NumFromArgs; ++I) {
   2151     TemplateArgument To = ImportTemplateArgument(FromArgs[I]);
   2152     if (To.isNull() && !FromArgs[I].isNull())
   2153       return true;
   2154 
   2155     ToArgs.push_back(To);
   2156   }
   2157 
   2158   return false;
   2159 }
   2160 
   2161 bool ASTNodeImporter::IsStructuralMatch(RecordDecl *FromRecord,
   2162                                         RecordDecl *ToRecord, bool Complain) {
   2163   // Eliminate a potential failure point where we attempt to re-import
   2164   // something we're trying to import while completing ToRecord.
   2165   Decl *ToOrigin = Importer.GetOriginalDecl(ToRecord);
   2166   if (ToOrigin) {
   2167     RecordDecl *ToOriginRecord = dyn_cast<RecordDecl>(ToOrigin);
   2168     if (ToOriginRecord)
   2169       ToRecord = ToOriginRecord;
   2170   }
   2171 
   2172   StructuralEquivalenceContext Ctx(Importer.getFromContext(),
   2173                                    ToRecord->getASTContext(),
   2174                                    Importer.getNonEquivalentDecls(),
   2175                                    false, Complain);
   2176   return Ctx.IsStructurallyEquivalent(FromRecord, ToRecord);
   2177 }
   2178 
   2179 bool ASTNodeImporter::IsStructuralMatch(VarDecl *FromVar, VarDecl *ToVar,
   2180                                         bool Complain) {
   2181   StructuralEquivalenceContext Ctx(
   2182       Importer.getFromContext(), Importer.getToContext(),
   2183       Importer.getNonEquivalentDecls(), false, Complain);
   2184   return Ctx.IsStructurallyEquivalent(FromVar, ToVar);
   2185 }
   2186 
   2187 bool ASTNodeImporter::IsStructuralMatch(EnumDecl *FromEnum, EnumDecl *ToEnum) {
   2188   StructuralEquivalenceContext Ctx(Importer.getFromContext(),
   2189                                    Importer.getToContext(),
   2190                                    Importer.getNonEquivalentDecls());
   2191   return Ctx.IsStructurallyEquivalent(FromEnum, ToEnum);
   2192 }
   2193 
   2194 bool ASTNodeImporter::IsStructuralMatch(EnumConstantDecl *FromEC,
   2195                                         EnumConstantDecl *ToEC)
   2196 {
   2197   const llvm::APSInt &FromVal = FromEC->getInitVal();
   2198   const llvm::APSInt &ToVal = ToEC->getInitVal();
   2199 
   2200   return FromVal.isSigned() == ToVal.isSigned() &&
   2201          FromVal.getBitWidth() == ToVal.getBitWidth() &&
   2202          FromVal == ToVal;
   2203 }
   2204 
   2205 bool ASTNodeImporter::IsStructuralMatch(ClassTemplateDecl *From,
   2206                                         ClassTemplateDecl *To) {
   2207   StructuralEquivalenceContext Ctx(Importer.getFromContext(),
   2208                                    Importer.getToContext(),
   2209                                    Importer.getNonEquivalentDecls());
   2210   return Ctx.IsStructurallyEquivalent(From, To);
   2211 }
   2212 
   2213 bool ASTNodeImporter::IsStructuralMatch(VarTemplateDecl *From,
   2214                                         VarTemplateDecl *To) {
   2215   StructuralEquivalenceContext Ctx(Importer.getFromContext(),
   2216                                    Importer.getToContext(),
   2217                                    Importer.getNonEquivalentDecls());
   2218   return Ctx.IsStructurallyEquivalent(From, To);
   2219 }
   2220 
   2221 Decl *ASTNodeImporter::VisitDecl(Decl *D) {
   2222   Importer.FromDiag(D->getLocation(), diag::err_unsupported_ast_node)
   2223     << D->getDeclKindName();
   2224   return nullptr;
   2225 }
   2226 
   2227 Decl *ASTNodeImporter::VisitTranslationUnitDecl(TranslationUnitDecl *D) {
   2228   TranslationUnitDecl *ToD =
   2229     Importer.getToContext().getTranslationUnitDecl();
   2230 
   2231   Importer.Imported(D, ToD);
   2232 
   2233   return ToD;
   2234 }
   2235 
   2236 Decl *ASTNodeImporter::VisitNamespaceDecl(NamespaceDecl *D) {
   2237   // Import the major distinguishing characteristics of this namespace.
   2238   DeclContext *DC, *LexicalDC;
   2239   DeclarationName Name;
   2240   SourceLocation Loc;
   2241   if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
   2242     return nullptr;
   2243 
   2244   NamespaceDecl *MergeWithNamespace = nullptr;
   2245   if (!Name) {
   2246     // This is an anonymous namespace. Adopt an existing anonymous
   2247     // namespace if we can.
   2248     // FIXME: Not testable.
   2249     if (TranslationUnitDecl *TU = dyn_cast<TranslationUnitDecl>(DC))
   2250       MergeWithNamespace = TU->getAnonymousNamespace();
   2251     else
   2252       MergeWithNamespace = cast<NamespaceDecl>(DC)->getAnonymousNamespace();
   2253   } else {
   2254     SmallVector<NamedDecl *, 4> ConflictingDecls;
   2255     SmallVector<NamedDecl *, 2> FoundDecls;
   2256     DC->localUncachedLookup(Name, FoundDecls);
   2257     for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
   2258       if (!FoundDecls[I]->isInIdentifierNamespace(Decl::IDNS_Namespace))
   2259         continue;
   2260 
   2261       if (NamespaceDecl *FoundNS = dyn_cast<NamespaceDecl>(FoundDecls[I])) {
   2262         MergeWithNamespace = FoundNS;
   2263         ConflictingDecls.clear();
   2264         break;
   2265       }
   2266 
   2267       ConflictingDecls.push_back(FoundDecls[I]);
   2268     }
   2269 
   2270     if (!ConflictingDecls.empty()) {
   2271       Name = Importer.HandleNameConflict(Name, DC, Decl::IDNS_Namespace,
   2272                                          ConflictingDecls.data(),
   2273                                          ConflictingDecls.size());
   2274     }
   2275   }
   2276 
   2277   // Create the "to" namespace, if needed.
   2278   NamespaceDecl *ToNamespace = MergeWithNamespace;
   2279   if (!ToNamespace) {
   2280     ToNamespace = NamespaceDecl::Create(Importer.getToContext(), DC,
   2281                                         D->isInline(),
   2282                                         Importer.Import(D->getLocStart()),
   2283                                         Loc, Name.getAsIdentifierInfo(),
   2284                                         /*PrevDecl=*/nullptr);
   2285     ToNamespace->setLexicalDeclContext(LexicalDC);
   2286     LexicalDC->addDeclInternal(ToNamespace);
   2287 
   2288     // If this is an anonymous namespace, register it as the anonymous
   2289     // namespace within its context.
   2290     if (!Name) {
   2291       if (TranslationUnitDecl *TU = dyn_cast<TranslationUnitDecl>(DC))
   2292         TU->setAnonymousNamespace(ToNamespace);
   2293       else
   2294         cast<NamespaceDecl>(DC)->setAnonymousNamespace(ToNamespace);
   2295     }
   2296   }
   2297   Importer.Imported(D, ToNamespace);
   2298 
   2299   ImportDeclContext(D);
   2300 
   2301   return ToNamespace;
   2302 }
   2303 
   2304 Decl *ASTNodeImporter::VisitTypedefNameDecl(TypedefNameDecl *D, bool IsAlias) {
   2305   // Import the major distinguishing characteristics of this typedef.
   2306   DeclContext *DC, *LexicalDC;
   2307   DeclarationName Name;
   2308   SourceLocation Loc;
   2309   if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
   2310     return nullptr;
   2311 
   2312   // If this typedef is not in block scope, determine whether we've
   2313   // seen a typedef with the same name (that we can merge with) or any
   2314   // other entity by that name (which name lookup could conflict with).
   2315   if (!DC->isFunctionOrMethod()) {
   2316     SmallVector<NamedDecl *, 4> ConflictingDecls;
   2317     unsigned IDNS = Decl::IDNS_Ordinary;
   2318     SmallVector<NamedDecl *, 2> FoundDecls;
   2319     DC->localUncachedLookup(Name, FoundDecls);
   2320     for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
   2321       if (!FoundDecls[I]->isInIdentifierNamespace(IDNS))
   2322         continue;
   2323       if (TypedefNameDecl *FoundTypedef =
   2324             dyn_cast<TypedefNameDecl>(FoundDecls[I])) {
   2325         if (Importer.IsStructurallyEquivalent(D->getUnderlyingType(),
   2326                                             FoundTypedef->getUnderlyingType()))
   2327           return Importer.Imported(D, FoundTypedef);
   2328       }
   2329 
   2330       ConflictingDecls.push_back(FoundDecls[I]);
   2331     }
   2332 
   2333     if (!ConflictingDecls.empty()) {
   2334       Name = Importer.HandleNameConflict(Name, DC, IDNS,
   2335                                          ConflictingDecls.data(),
   2336                                          ConflictingDecls.size());
   2337       if (!Name)
   2338         return nullptr;
   2339     }
   2340   }
   2341 
   2342   // Import the underlying type of this typedef;
   2343   QualType T = Importer.Import(D->getUnderlyingType());
   2344   if (T.isNull())
   2345     return nullptr;
   2346 
   2347   // Create the new typedef node.
   2348   TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo());
   2349   SourceLocation StartL = Importer.Import(D->getLocStart());
   2350   TypedefNameDecl *ToTypedef;
   2351   if (IsAlias)
   2352     ToTypedef = TypeAliasDecl::Create(Importer.getToContext(), DC,
   2353                                       StartL, Loc,
   2354                                       Name.getAsIdentifierInfo(),
   2355                                       TInfo);
   2356   else
   2357     ToTypedef = TypedefDecl::Create(Importer.getToContext(), DC,
   2358                                     StartL, Loc,
   2359                                     Name.getAsIdentifierInfo(),
   2360                                     TInfo);
   2361 
   2362   ToTypedef->setAccess(D->getAccess());
   2363   ToTypedef->setLexicalDeclContext(LexicalDC);
   2364   Importer.Imported(D, ToTypedef);
   2365   LexicalDC->addDeclInternal(ToTypedef);
   2366 
   2367   return ToTypedef;
   2368 }
   2369 
   2370 Decl *ASTNodeImporter::VisitTypedefDecl(TypedefDecl *D) {
   2371   return VisitTypedefNameDecl(D, /*IsAlias=*/false);
   2372 }
   2373 
   2374 Decl *ASTNodeImporter::VisitTypeAliasDecl(TypeAliasDecl *D) {
   2375   return VisitTypedefNameDecl(D, /*IsAlias=*/true);
   2376 }
   2377 
   2378 Decl *ASTNodeImporter::VisitEnumDecl(EnumDecl *D) {
   2379   // Import the major distinguishing characteristics of this enum.
   2380   DeclContext *DC, *LexicalDC;
   2381   DeclarationName Name;
   2382   SourceLocation Loc;
   2383   if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
   2384     return nullptr;
   2385 
   2386   // Figure out what enum name we're looking for.
   2387   unsigned IDNS = Decl::IDNS_Tag;
   2388   DeclarationName SearchName = Name;
   2389   if (!SearchName && D->getTypedefNameForAnonDecl()) {
   2390     SearchName = Importer.Import(D->getTypedefNameForAnonDecl()->getDeclName());
   2391     IDNS = Decl::IDNS_Ordinary;
   2392   } else if (Importer.getToContext().getLangOpts().CPlusPlus)
   2393     IDNS |= Decl::IDNS_Ordinary;
   2394 
   2395   // We may already have an enum of the same name; try to find and match it.
   2396   if (!DC->isFunctionOrMethod() && SearchName) {
   2397     SmallVector<NamedDecl *, 4> ConflictingDecls;
   2398     SmallVector<NamedDecl *, 2> FoundDecls;
   2399     DC->localUncachedLookup(SearchName, FoundDecls);
   2400     for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
   2401       if (!FoundDecls[I]->isInIdentifierNamespace(IDNS))
   2402         continue;
   2403 
   2404       Decl *Found = FoundDecls[I];
   2405       if (TypedefNameDecl *Typedef = dyn_cast<TypedefNameDecl>(Found)) {
   2406         if (const TagType *Tag = Typedef->getUnderlyingType()->getAs<TagType>())
   2407           Found = Tag->getDecl();
   2408       }
   2409 
   2410       if (EnumDecl *FoundEnum = dyn_cast<EnumDecl>(Found)) {
   2411         if (IsStructuralMatch(D, FoundEnum))
   2412           return Importer.Imported(D, FoundEnum);
   2413       }
   2414 
   2415       ConflictingDecls.push_back(FoundDecls[I]);
   2416     }
   2417 
   2418     if (!ConflictingDecls.empty()) {
   2419       Name = Importer.HandleNameConflict(Name, DC, IDNS,
   2420                                          ConflictingDecls.data(),
   2421                                          ConflictingDecls.size());
   2422     }
   2423   }
   2424 
   2425   // Create the enum declaration.
   2426   EnumDecl *D2 = EnumDecl::Create(Importer.getToContext(), DC,
   2427                                   Importer.Import(D->getLocStart()),
   2428                                   Loc, Name.getAsIdentifierInfo(), nullptr,
   2429                                   D->isScoped(), D->isScopedUsingClassTag(),
   2430                                   D->isFixed());
   2431   // Import the qualifier, if any.
   2432   D2->setQualifierInfo(Importer.Import(D->getQualifierLoc()));
   2433   D2->setAccess(D->getAccess());
   2434   D2->setLexicalDeclContext(LexicalDC);
   2435   Importer.Imported(D, D2);
   2436   LexicalDC->addDeclInternal(D2);
   2437 
   2438   // Import the integer type.
   2439   QualType ToIntegerType = Importer.Import(D->getIntegerType());
   2440   if (ToIntegerType.isNull())
   2441     return nullptr;
   2442   D2->setIntegerType(ToIntegerType);
   2443 
   2444   // Import the definition
   2445   if (D->isCompleteDefinition() && ImportDefinition(D, D2))
   2446     return nullptr;
   2447 
   2448   return D2;
   2449 }
   2450 
   2451 Decl *ASTNodeImporter::VisitRecordDecl(RecordDecl *D) {
   2452   // If this record has a definition in the translation unit we're coming from,
   2453   // but this particular declaration is not that definition, import the
   2454   // definition and map to that.
   2455   TagDecl *Definition = D->getDefinition();
   2456   if (Definition && Definition != D) {
   2457     Decl *ImportedDef = Importer.Import(Definition);
   2458     if (!ImportedDef)
   2459       return nullptr;
   2460 
   2461     return Importer.Imported(D, ImportedDef);
   2462   }
   2463 
   2464   // Import the major distinguishing characteristics of this record.
   2465   DeclContext *DC, *LexicalDC;
   2466   DeclarationName Name;
   2467   SourceLocation Loc;
   2468   if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
   2469     return nullptr;
   2470 
   2471   // Figure out what structure name we're looking for.
   2472   unsigned IDNS = Decl::IDNS_Tag;
   2473   DeclarationName SearchName = Name;
   2474   if (!SearchName && D->getTypedefNameForAnonDecl()) {
   2475     SearchName = Importer.Import(D->getTypedefNameForAnonDecl()->getDeclName());
   2476     IDNS = Decl::IDNS_Ordinary;
   2477   } else if (Importer.getToContext().getLangOpts().CPlusPlus)
   2478     IDNS |= Decl::IDNS_Ordinary;
   2479 
   2480   // We may already have a record of the same name; try to find and match it.
   2481   RecordDecl *AdoptDecl = nullptr;
   2482   if (!DC->isFunctionOrMethod()) {
   2483     SmallVector<NamedDecl *, 4> ConflictingDecls;
   2484     SmallVector<NamedDecl *, 2> FoundDecls;
   2485     DC->localUncachedLookup(SearchName, FoundDecls);
   2486     for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
   2487       if (!FoundDecls[I]->isInIdentifierNamespace(IDNS))
   2488         continue;
   2489 
   2490       Decl *Found = FoundDecls[I];
   2491       if (TypedefNameDecl *Typedef = dyn_cast<TypedefNameDecl>(Found)) {
   2492         if (const TagType *Tag = Typedef->getUnderlyingType()->getAs<TagType>())
   2493           Found = Tag->getDecl();
   2494       }
   2495 
   2496       if (RecordDecl *FoundRecord = dyn_cast<RecordDecl>(Found)) {
   2497         if (D->isAnonymousStructOrUnion() &&
   2498             FoundRecord->isAnonymousStructOrUnion()) {
   2499           // If both anonymous structs/unions are in a record context, make sure
   2500           // they occur in the same location in the context records.
   2501           if (Optional<unsigned> Index1
   2502               = findAnonymousStructOrUnionIndex(D)) {
   2503             if (Optional<unsigned> Index2 =
   2504                     findAnonymousStructOrUnionIndex(FoundRecord)) {
   2505               if (*Index1 != *Index2)
   2506                 continue;
   2507             }
   2508           }
   2509         }
   2510 
   2511         if (RecordDecl *FoundDef = FoundRecord->getDefinition()) {
   2512           if ((SearchName && !D->isCompleteDefinition())
   2513               || (D->isCompleteDefinition() &&
   2514                   D->isAnonymousStructOrUnion()
   2515                     == FoundDef->isAnonymousStructOrUnion() &&
   2516                   IsStructuralMatch(D, FoundDef))) {
   2517             // The record types structurally match, or the "from" translation
   2518             // unit only had a forward declaration anyway; call it the same
   2519             // function.
   2520             // FIXME: For C++, we should also merge methods here.
   2521             return Importer.Imported(D, FoundDef);
   2522           }
   2523         } else if (!D->isCompleteDefinition()) {
   2524           // We have a forward declaration of this type, so adopt that forward
   2525           // declaration rather than building a new one.
   2526 
   2527           // If one or both can be completed from external storage then try one
   2528           // last time to complete and compare them before doing this.
   2529 
   2530           if (FoundRecord->hasExternalLexicalStorage() &&
   2531               !FoundRecord->isCompleteDefinition())
   2532             FoundRecord->getASTContext().getExternalSource()->CompleteType(FoundRecord);
   2533           if (D->hasExternalLexicalStorage())
   2534             D->getASTContext().getExternalSource()->CompleteType(D);
   2535 
   2536           if (FoundRecord->isCompleteDefinition() &&
   2537               D->isCompleteDefinition() &&
   2538               !IsStructuralMatch(D, FoundRecord))
   2539             continue;
   2540 
   2541           AdoptDecl = FoundRecord;
   2542           continue;
   2543         } else if (!SearchName) {
   2544           continue;
   2545         }
   2546       }
   2547 
   2548       ConflictingDecls.push_back(FoundDecls[I]);
   2549     }
   2550 
   2551     if (!ConflictingDecls.empty() && SearchName) {
   2552       Name = Importer.HandleNameConflict(Name, DC, IDNS,
   2553                                          ConflictingDecls.data(),
   2554                                          ConflictingDecls.size());
   2555     }
   2556   }
   2557 
   2558   // Create the record declaration.
   2559   RecordDecl *D2 = AdoptDecl;
   2560   SourceLocation StartLoc = Importer.Import(D->getLocStart());
   2561   if (!D2) {
   2562     if (isa<CXXRecordDecl>(D)) {
   2563       CXXRecordDecl *D2CXX = CXXRecordDecl::Create(Importer.getToContext(),
   2564                                                    D->getTagKind(),
   2565                                                    DC, StartLoc, Loc,
   2566                                                    Name.getAsIdentifierInfo());
   2567       D2 = D2CXX;
   2568       D2->setAccess(D->getAccess());
   2569     } else {
   2570       D2 = RecordDecl::Create(Importer.getToContext(), D->getTagKind(),
   2571                               DC, StartLoc, Loc, Name.getAsIdentifierInfo());
   2572     }
   2573 
   2574     D2->setQualifierInfo(Importer.Import(D->getQualifierLoc()));
   2575     D2->setLexicalDeclContext(LexicalDC);
   2576     LexicalDC->addDeclInternal(D2);
   2577     if (D->isAnonymousStructOrUnion())
   2578       D2->setAnonymousStructOrUnion(true);
   2579   }
   2580 
   2581   Importer.Imported(D, D2);
   2582 
   2583   if (D->isCompleteDefinition() && ImportDefinition(D, D2, IDK_Default))
   2584     return nullptr;
   2585 
   2586   return D2;
   2587 }
   2588 
   2589 Decl *ASTNodeImporter::VisitEnumConstantDecl(EnumConstantDecl *D) {
   2590   // Import the major distinguishing characteristics of this enumerator.
   2591   DeclContext *DC, *LexicalDC;
   2592   DeclarationName Name;
   2593   SourceLocation Loc;
   2594   if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
   2595     return nullptr;
   2596 
   2597   QualType T = Importer.Import(D->getType());
   2598   if (T.isNull())
   2599     return nullptr;
   2600 
   2601   // Determine whether there are any other declarations with the same name and
   2602   // in the same context.
   2603   if (!LexicalDC->isFunctionOrMethod()) {
   2604     SmallVector<NamedDecl *, 4> ConflictingDecls;
   2605     unsigned IDNS = Decl::IDNS_Ordinary;
   2606     SmallVector<NamedDecl *, 2> FoundDecls;
   2607     DC->localUncachedLookup(Name, FoundDecls);
   2608     for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
   2609       if (!FoundDecls[I]->isInIdentifierNamespace(IDNS))
   2610         continue;
   2611 
   2612       if (EnumConstantDecl *FoundEnumConstant
   2613             = dyn_cast<EnumConstantDecl>(FoundDecls[I])) {
   2614         if (IsStructuralMatch(D, FoundEnumConstant))
   2615           return Importer.Imported(D, FoundEnumConstant);
   2616       }
   2617 
   2618       ConflictingDecls.push_back(FoundDecls[I]);
   2619     }
   2620 
   2621     if (!ConflictingDecls.empty()) {
   2622       Name = Importer.HandleNameConflict(Name, DC, IDNS,
   2623                                          ConflictingDecls.data(),
   2624                                          ConflictingDecls.size());
   2625       if (!Name)
   2626         return nullptr;
   2627     }
   2628   }
   2629 
   2630   Expr *Init = Importer.Import(D->getInitExpr());
   2631   if (D->getInitExpr() && !Init)
   2632     return nullptr;
   2633 
   2634   EnumConstantDecl *ToEnumerator
   2635     = EnumConstantDecl::Create(Importer.getToContext(), cast<EnumDecl>(DC), Loc,
   2636                                Name.getAsIdentifierInfo(), T,
   2637                                Init, D->getInitVal());
   2638   ToEnumerator->setAccess(D->getAccess());
   2639   ToEnumerator->setLexicalDeclContext(LexicalDC);
   2640   Importer.Imported(D, ToEnumerator);
   2641   LexicalDC->addDeclInternal(ToEnumerator);
   2642   return ToEnumerator;
   2643 }
   2644 
   2645 Decl *ASTNodeImporter::VisitFunctionDecl(FunctionDecl *D) {
   2646   // Import the major distinguishing characteristics of this function.
   2647   DeclContext *DC, *LexicalDC;
   2648   DeclarationName Name;
   2649   SourceLocation Loc;
   2650   if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
   2651     return nullptr;
   2652 
   2653   // Try to find a function in our own ("to") context with the same name, same
   2654   // type, and in the same context as the function we're importing.
   2655   if (!LexicalDC->isFunctionOrMethod()) {
   2656     SmallVector<NamedDecl *, 4> ConflictingDecls;
   2657     unsigned IDNS = Decl::IDNS_Ordinary;
   2658     SmallVector<NamedDecl *, 2> FoundDecls;
   2659     DC->localUncachedLookup(Name, FoundDecls);
   2660     for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
   2661       if (!FoundDecls[I]->isInIdentifierNamespace(IDNS))
   2662         continue;
   2663 
   2664       if (FunctionDecl *FoundFunction = dyn_cast<FunctionDecl>(FoundDecls[I])) {
   2665         if (FoundFunction->hasExternalFormalLinkage() &&
   2666             D->hasExternalFormalLinkage()) {
   2667           if (Importer.IsStructurallyEquivalent(D->getType(),
   2668                                                 FoundFunction->getType())) {
   2669             // FIXME: Actually try to merge the body and other attributes.
   2670             return Importer.Imported(D, FoundFunction);
   2671           }
   2672 
   2673           // FIXME: Check for overloading more carefully, e.g., by boosting
   2674           // Sema::IsOverload out to the AST library.
   2675 
   2676           // Function overloading is okay in C++.
   2677           if (Importer.getToContext().getLangOpts().CPlusPlus)
   2678             continue;
   2679 
   2680           // Complain about inconsistent function types.
   2681           Importer.ToDiag(Loc, diag::err_odr_function_type_inconsistent)
   2682             << Name << D->getType() << FoundFunction->getType();
   2683           Importer.ToDiag(FoundFunction->getLocation(),
   2684                           diag::note_odr_value_here)
   2685             << FoundFunction->getType();
   2686         }
   2687       }
   2688 
   2689       ConflictingDecls.push_back(FoundDecls[I]);
   2690     }
   2691 
   2692     if (!ConflictingDecls.empty()) {
   2693       Name = Importer.HandleNameConflict(Name, DC, IDNS,
   2694                                          ConflictingDecls.data(),
   2695                                          ConflictingDecls.size());
   2696       if (!Name)
   2697         return nullptr;
   2698     }
   2699   }
   2700 
   2701   DeclarationNameInfo NameInfo(Name, Loc);
   2702   // Import additional name location/type info.
   2703   ImportDeclarationNameLoc(D->getNameInfo(), NameInfo);
   2704 
   2705   QualType FromTy = D->getType();
   2706   bool usedDifferentExceptionSpec = false;
   2707 
   2708   if (const FunctionProtoType *
   2709         FromFPT = D->getType()->getAs<FunctionProtoType>()) {
   2710     FunctionProtoType::ExtProtoInfo FromEPI = FromFPT->getExtProtoInfo();
   2711     // FunctionProtoType::ExtProtoInfo's ExceptionSpecDecl can point to the
   2712     // FunctionDecl that we are importing the FunctionProtoType for.
   2713     // To avoid an infinite recursion when importing, create the FunctionDecl
   2714     // with a simplified function type and update it afterwards.
   2715     if (FromEPI.ExceptionSpecDecl || FromEPI.ExceptionSpecTemplate ||
   2716         FromEPI.NoexceptExpr) {
   2717       FunctionProtoType::ExtProtoInfo DefaultEPI;
   2718       FromTy = Importer.getFromContext().getFunctionType(
   2719           FromFPT->getReturnType(), FromFPT->getParamTypes(), DefaultEPI);
   2720       usedDifferentExceptionSpec = true;
   2721     }
   2722   }
   2723 
   2724   // Import the type.
   2725   QualType T = Importer.Import(FromTy);
   2726   if (T.isNull())
   2727     return nullptr;
   2728 
   2729   // Import the function parameters.
   2730   SmallVector<ParmVarDecl *, 8> Parameters;
   2731   for (auto P : D->params()) {
   2732     ParmVarDecl *ToP = cast_or_null<ParmVarDecl>(Importer.Import(P));
   2733     if (!ToP)
   2734       return nullptr;
   2735 
   2736     Parameters.push_back(ToP);
   2737   }
   2738 
   2739   // Create the imported function.
   2740   TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo());
   2741   FunctionDecl *ToFunction = nullptr;
   2742   if (CXXConstructorDecl *FromConstructor = dyn_cast<CXXConstructorDecl>(D)) {
   2743     ToFunction = CXXConstructorDecl::Create(Importer.getToContext(),
   2744                                             cast<CXXRecordDecl>(DC),
   2745                                             D->getInnerLocStart(),
   2746                                             NameInfo, T, TInfo,
   2747                                             FromConstructor->isExplicit(),
   2748                                             D->isInlineSpecified(),
   2749                                             D->isImplicit(),
   2750                                             D->isConstexpr());
   2751   } else if (isa<CXXDestructorDecl>(D)) {
   2752     ToFunction = CXXDestructorDecl::Create(Importer.getToContext(),
   2753                                            cast<CXXRecordDecl>(DC),
   2754                                            D->getInnerLocStart(),
   2755                                            NameInfo, T, TInfo,
   2756                                            D->isInlineSpecified(),
   2757                                            D->isImplicit());
   2758   } else if (CXXConversionDecl *FromConversion
   2759                                            = dyn_cast<CXXConversionDecl>(D)) {
   2760     ToFunction = CXXConversionDecl::Create(Importer.getToContext(),
   2761                                            cast<CXXRecordDecl>(DC),
   2762                                            D->getInnerLocStart(),
   2763                                            NameInfo, T, TInfo,
   2764                                            D->isInlineSpecified(),
   2765                                            FromConversion->isExplicit(),
   2766                                            D->isConstexpr(),
   2767                                            Importer.Import(D->getLocEnd()));
   2768   } else if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(D)) {
   2769     ToFunction = CXXMethodDecl::Create(Importer.getToContext(),
   2770                                        cast<CXXRecordDecl>(DC),
   2771                                        D->getInnerLocStart(),
   2772                                        NameInfo, T, TInfo,
   2773                                        Method->getStorageClass(),
   2774                                        Method->isInlineSpecified(),
   2775                                        D->isConstexpr(),
   2776                                        Importer.Import(D->getLocEnd()));
   2777   } else {
   2778     ToFunction = FunctionDecl::Create(Importer.getToContext(), DC,
   2779                                       D->getInnerLocStart(),
   2780                                       NameInfo, T, TInfo, D->getStorageClass(),
   2781                                       D->isInlineSpecified(),
   2782                                       D->hasWrittenPrototype(),
   2783                                       D->isConstexpr());
   2784   }
   2785 
   2786   // Import the qualifier, if any.
   2787   ToFunction->setQualifierInfo(Importer.Import(D->getQualifierLoc()));
   2788   ToFunction->setAccess(D->getAccess());
   2789   ToFunction->setLexicalDeclContext(LexicalDC);
   2790   ToFunction->setVirtualAsWritten(D->isVirtualAsWritten());
   2791   ToFunction->setTrivial(D->isTrivial());
   2792   ToFunction->setPure(D->isPure());
   2793   Importer.Imported(D, ToFunction);
   2794 
   2795   // Set the parameters.
   2796   for (unsigned I = 0, N = Parameters.size(); I != N; ++I) {
   2797     Parameters[I]->setOwningFunction(ToFunction);
   2798     ToFunction->addDeclInternal(Parameters[I]);
   2799   }
   2800   ToFunction->setParams(Parameters);
   2801 
   2802   if (usedDifferentExceptionSpec) {
   2803     // Update FunctionProtoType::ExtProtoInfo.
   2804     QualType T = Importer.Import(D->getType());
   2805     if (T.isNull())
   2806       return nullptr;
   2807     ToFunction->setType(T);
   2808   }
   2809 
   2810   // FIXME: Other bits to merge?
   2811 
   2812   // Add this function to the lexical context.
   2813   LexicalDC->addDeclInternal(ToFunction);
   2814 
   2815   return ToFunction;
   2816 }
   2817 
   2818 Decl *ASTNodeImporter::VisitCXXMethodDecl(CXXMethodDecl *D) {
   2819   return VisitFunctionDecl(D);
   2820 }
   2821 
   2822 Decl *ASTNodeImporter::VisitCXXConstructorDecl(CXXConstructorDecl *D) {
   2823   return VisitCXXMethodDecl(D);
   2824 }
   2825 
   2826 Decl *ASTNodeImporter::VisitCXXDestructorDecl(CXXDestructorDecl *D) {
   2827   return VisitCXXMethodDecl(D);
   2828 }
   2829 
   2830 Decl *ASTNodeImporter::VisitCXXConversionDecl(CXXConversionDecl *D) {
   2831   return VisitCXXMethodDecl(D);
   2832 }
   2833 
   2834 static unsigned getFieldIndex(Decl *F) {
   2835   RecordDecl *Owner = dyn_cast<RecordDecl>(F->getDeclContext());
   2836   if (!Owner)
   2837     return 0;
   2838 
   2839   unsigned Index = 1;
   2840   for (const auto *D : Owner->noload_decls()) {
   2841     if (D == F)
   2842       return Index;
   2843 
   2844     if (isa<FieldDecl>(*D) || isa<IndirectFieldDecl>(*D))
   2845       ++Index;
   2846   }
   2847 
   2848   return Index;
   2849 }
   2850 
   2851 Decl *ASTNodeImporter::VisitFieldDecl(FieldDecl *D) {
   2852   // Import the major distinguishing characteristics of a variable.
   2853   DeclContext *DC, *LexicalDC;
   2854   DeclarationName Name;
   2855   SourceLocation Loc;
   2856   if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
   2857     return nullptr;
   2858 
   2859   // Determine whether we've already imported this field.
   2860   SmallVector<NamedDecl *, 2> FoundDecls;
   2861   DC->localUncachedLookup(Name, FoundDecls);
   2862   for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
   2863     if (FieldDecl *FoundField = dyn_cast<FieldDecl>(FoundDecls[I])) {
   2864       // For anonymous fields, match up by index.
   2865       if (!Name && getFieldIndex(D) != getFieldIndex(FoundField))
   2866         continue;
   2867 
   2868       if (Importer.IsStructurallyEquivalent(D->getType(),
   2869                                             FoundField->getType())) {
   2870         Importer.Imported(D, FoundField);
   2871         return FoundField;
   2872       }
   2873 
   2874       Importer.ToDiag(Loc, diag::err_odr_field_type_inconsistent)
   2875         << Name << D->getType() << FoundField->getType();
   2876       Importer.ToDiag(FoundField->getLocation(), diag::note_odr_value_here)
   2877         << FoundField->getType();
   2878       return nullptr;
   2879     }
   2880   }
   2881 
   2882   // Import the type.
   2883   QualType T = Importer.Import(D->getType());
   2884   if (T.isNull())
   2885     return nullptr;
   2886 
   2887   TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo());
   2888   Expr *BitWidth = Importer.Import(D->getBitWidth());
   2889   if (!BitWidth && D->getBitWidth())
   2890     return nullptr;
   2891 
   2892   FieldDecl *ToField = FieldDecl::Create(Importer.getToContext(), DC,
   2893                                          Importer.Import(D->getInnerLocStart()),
   2894                                          Loc, Name.getAsIdentifierInfo(),
   2895                                          T, TInfo, BitWidth, D->isMutable(),
   2896                                          D->getInClassInitStyle());
   2897   ToField->setAccess(D->getAccess());
   2898   ToField->setLexicalDeclContext(LexicalDC);
   2899   if (ToField->hasInClassInitializer())
   2900     ToField->setInClassInitializer(D->getInClassInitializer());
   2901   ToField->setImplicit(D->isImplicit());
   2902   Importer.Imported(D, ToField);
   2903   LexicalDC->addDeclInternal(ToField);
   2904   return ToField;
   2905 }
   2906 
   2907 Decl *ASTNodeImporter::VisitIndirectFieldDecl(IndirectFieldDecl *D) {
   2908   // Import the major distinguishing characteristics of a variable.
   2909   DeclContext *DC, *LexicalDC;
   2910   DeclarationName Name;
   2911   SourceLocation Loc;
   2912   if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
   2913     return nullptr;
   2914 
   2915   // Determine whether we've already imported this field.
   2916   SmallVector<NamedDecl *, 2> FoundDecls;
   2917   DC->localUncachedLookup(Name, FoundDecls);
   2918   for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
   2919     if (IndirectFieldDecl *FoundField
   2920                                 = dyn_cast<IndirectFieldDecl>(FoundDecls[I])) {
   2921       // For anonymous indirect fields, match up by index.
   2922       if (!Name && getFieldIndex(D) != getFieldIndex(FoundField))
   2923         continue;
   2924 
   2925       if (Importer.IsStructurallyEquivalent(D->getType(),
   2926                                             FoundField->getType(),
   2927                                             !Name.isEmpty())) {
   2928         Importer.Imported(D, FoundField);
   2929         return FoundField;
   2930       }
   2931 
   2932       // If there are more anonymous fields to check, continue.
   2933       if (!Name && I < N-1)
   2934         continue;
   2935 
   2936       Importer.ToDiag(Loc, diag::err_odr_field_type_inconsistent)
   2937         << Name << D->getType() << FoundField->getType();
   2938       Importer.ToDiag(FoundField->getLocation(), diag::note_odr_value_here)
   2939         << FoundField->getType();
   2940       return nullptr;
   2941     }
   2942   }
   2943 
   2944   // Import the type.
   2945   QualType T = Importer.Import(D->getType());
   2946   if (T.isNull())
   2947     return nullptr;
   2948 
   2949   NamedDecl **NamedChain =
   2950     new (Importer.getToContext())NamedDecl*[D->getChainingSize()];
   2951 
   2952   unsigned i = 0;
   2953   for (auto *PI : D->chain()) {
   2954     Decl *D = Importer.Import(PI);
   2955     if (!D)
   2956       return nullptr;
   2957     NamedChain[i++] = cast<NamedDecl>(D);
   2958   }
   2959 
   2960   IndirectFieldDecl *ToIndirectField = IndirectFieldDecl::Create(
   2961                                          Importer.getToContext(), DC,
   2962                                          Loc, Name.getAsIdentifierInfo(), T,
   2963                                          NamedChain, D->getChainingSize());
   2964   ToIndirectField->setAccess(D->getAccess());
   2965   ToIndirectField->setLexicalDeclContext(LexicalDC);
   2966   Importer.Imported(D, ToIndirectField);
   2967   LexicalDC->addDeclInternal(ToIndirectField);
   2968   return ToIndirectField;
   2969 }
   2970 
   2971 Decl *ASTNodeImporter::VisitObjCIvarDecl(ObjCIvarDecl *D) {
   2972   // Import the major distinguishing characteristics of an ivar.
   2973   DeclContext *DC, *LexicalDC;
   2974   DeclarationName Name;
   2975   SourceLocation Loc;
   2976   if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
   2977     return nullptr;
   2978 
   2979   // Determine whether we've already imported this ivar
   2980   SmallVector<NamedDecl *, 2> FoundDecls;
   2981   DC->localUncachedLookup(Name, FoundDecls);
   2982   for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
   2983     if (ObjCIvarDecl *FoundIvar = dyn_cast<ObjCIvarDecl>(FoundDecls[I])) {
   2984       if (Importer.IsStructurallyEquivalent(D->getType(),
   2985                                             FoundIvar->getType())) {
   2986         Importer.Imported(D, FoundIvar);
   2987         return FoundIvar;
   2988       }
   2989 
   2990       Importer.ToDiag(Loc, diag::err_odr_ivar_type_inconsistent)
   2991         << Name << D->getType() << FoundIvar->getType();
   2992       Importer.ToDiag(FoundIvar->getLocation(), diag::note_odr_value_here)
   2993         << FoundIvar->getType();
   2994       return nullptr;
   2995     }
   2996   }
   2997 
   2998   // Import the type.
   2999   QualType T = Importer.Import(D->getType());
   3000   if (T.isNull())
   3001     return nullptr;
   3002 
   3003   TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo());
   3004   Expr *BitWidth = Importer.Import(D->getBitWidth());
   3005   if (!BitWidth && D->getBitWidth())
   3006     return nullptr;
   3007 
   3008   ObjCIvarDecl *ToIvar = ObjCIvarDecl::Create(Importer.getToContext(),
   3009                                               cast<ObjCContainerDecl>(DC),
   3010                                        Importer.Import(D->getInnerLocStart()),
   3011                                               Loc, Name.getAsIdentifierInfo(),
   3012                                               T, TInfo, D->getAccessControl(),
   3013                                               BitWidth, D->getSynthesize());
   3014   ToIvar->setLexicalDeclContext(LexicalDC);
   3015   Importer.Imported(D, ToIvar);
   3016   LexicalDC->addDeclInternal(ToIvar);
   3017   return ToIvar;
   3018 
   3019 }
   3020 
   3021 Decl *ASTNodeImporter::VisitVarDecl(VarDecl *D) {
   3022   // Import the major distinguishing characteristics of a variable.
   3023   DeclContext *DC, *LexicalDC;
   3024   DeclarationName Name;
   3025   SourceLocation Loc;
   3026   if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
   3027     return nullptr;
   3028 
   3029   // Try to find a variable in our own ("to") context with the same name and
   3030   // in the same context as the variable we're importing.
   3031   if (D->isFileVarDecl()) {
   3032     VarDecl *MergeWithVar = nullptr;
   3033     SmallVector<NamedDecl *, 4> ConflictingDecls;
   3034     unsigned IDNS = Decl::IDNS_Ordinary;
   3035     SmallVector<NamedDecl *, 2> FoundDecls;
   3036     DC->localUncachedLookup(Name, FoundDecls);
   3037     for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
   3038       if (!FoundDecls[I]->isInIdentifierNamespace(IDNS))
   3039         continue;
   3040 
   3041       if (VarDecl *FoundVar = dyn_cast<VarDecl>(FoundDecls[I])) {
   3042         // We have found a variable that we may need to merge with. Check it.
   3043         if (FoundVar->hasExternalFormalLinkage() &&
   3044             D->hasExternalFormalLinkage()) {
   3045           if (Importer.IsStructurallyEquivalent(D->getType(),
   3046                                                 FoundVar->getType())) {
   3047             MergeWithVar = FoundVar;
   3048             break;
   3049           }
   3050 
   3051           const ArrayType *FoundArray
   3052             = Importer.getToContext().getAsArrayType(FoundVar->getType());
   3053           const ArrayType *TArray
   3054             = Importer.getToContext().getAsArrayType(D->getType());
   3055           if (FoundArray && TArray) {
   3056             if (isa<IncompleteArrayType>(FoundArray) &&
   3057                 isa<ConstantArrayType>(TArray)) {
   3058               // Import the type.
   3059               QualType T = Importer.Import(D->getType());
   3060               if (T.isNull())
   3061                 return nullptr;
   3062 
   3063               FoundVar->setType(T);
   3064               MergeWithVar = FoundVar;
   3065               break;
   3066             } else if (isa<IncompleteArrayType>(TArray) &&
   3067                        isa<ConstantArrayType>(FoundArray)) {
   3068               MergeWithVar = FoundVar;
   3069               break;
   3070             }
   3071           }
   3072 
   3073           Importer.ToDiag(Loc, diag::err_odr_variable_type_inconsistent)
   3074             << Name << D->getType() << FoundVar->getType();
   3075           Importer.ToDiag(FoundVar->getLocation(), diag::note_odr_value_here)
   3076             << FoundVar->getType();
   3077         }
   3078       }
   3079 
   3080       ConflictingDecls.push_back(FoundDecls[I]);
   3081     }
   3082 
   3083     if (MergeWithVar) {
   3084       // An equivalent variable with external linkage has been found. Link
   3085       // the two declarations, then merge them.
   3086       Importer.Imported(D, MergeWithVar);
   3087 
   3088       if (VarDecl *DDef = D->getDefinition()) {
   3089         if (VarDecl *ExistingDef = MergeWithVar->getDefinition()) {
   3090           Importer.ToDiag(ExistingDef->getLocation(),
   3091                           diag::err_odr_variable_multiple_def)
   3092             << Name;
   3093           Importer.FromDiag(DDef->getLocation(), diag::note_odr_defined_here);
   3094         } else {
   3095           Expr *Init = Importer.Import(DDef->getInit());
   3096           MergeWithVar->setInit(Init);
   3097           if (DDef->isInitKnownICE()) {
   3098             EvaluatedStmt *Eval = MergeWithVar->ensureEvaluatedStmt();
   3099             Eval->CheckedICE = true;
   3100             Eval->IsICE = DDef->isInitICE();
   3101           }
   3102         }
   3103       }
   3104 
   3105       return MergeWithVar;
   3106     }
   3107 
   3108     if (!ConflictingDecls.empty()) {
   3109       Name = Importer.HandleNameConflict(Name, DC, IDNS,
   3110                                          ConflictingDecls.data(),
   3111                                          ConflictingDecls.size());
   3112       if (!Name)
   3113         return nullptr;
   3114     }
   3115   }
   3116 
   3117   // Import the type.
   3118   QualType T = Importer.Import(D->getType());
   3119   if (T.isNull())
   3120     return nullptr;
   3121 
   3122   // Create the imported variable.
   3123   TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo());
   3124   VarDecl *ToVar = VarDecl::Create(Importer.getToContext(), DC,
   3125                                    Importer.Import(D->getInnerLocStart()),
   3126                                    Loc, Name.getAsIdentifierInfo(),
   3127                                    T, TInfo,
   3128                                    D->getStorageClass());
   3129   ToVar->setQualifierInfo(Importer.Import(D->getQualifierLoc()));
   3130   ToVar->setAccess(D->getAccess());
   3131   ToVar->setLexicalDeclContext(LexicalDC);
   3132   Importer.Imported(D, ToVar);
   3133   LexicalDC->addDeclInternal(ToVar);
   3134 
   3135   // Merge the initializer.
   3136   if (ImportDefinition(D, ToVar))
   3137     return nullptr;
   3138 
   3139   return ToVar;
   3140 }
   3141 
   3142 Decl *ASTNodeImporter::VisitImplicitParamDecl(ImplicitParamDecl *D) {
   3143   // Parameters are created in the translation unit's context, then moved
   3144   // into the function declaration's context afterward.
   3145   DeclContext *DC = Importer.getToContext().getTranslationUnitDecl();
   3146 
   3147   // Import the name of this declaration.
   3148   DeclarationName Name = Importer.Import(D->getDeclName());
   3149   if (D->getDeclName() && !Name)
   3150     return nullptr;
   3151 
   3152   // Import the location of this declaration.
   3153   SourceLocation Loc = Importer.Import(D->getLocation());
   3154 
   3155   // Import the parameter's type.
   3156   QualType T = Importer.Import(D->getType());
   3157   if (T.isNull())
   3158     return nullptr;
   3159 
   3160   // Create the imported parameter.
   3161   ImplicitParamDecl *ToParm
   3162     = ImplicitParamDecl::Create(Importer.getToContext(), DC,
   3163                                 Loc, Name.getAsIdentifierInfo(),
   3164                                 T);
   3165   return Importer.Imported(D, ToParm);
   3166 }
   3167 
   3168 Decl *ASTNodeImporter::VisitParmVarDecl(ParmVarDecl *D) {
   3169   // Parameters are created in the translation unit's context, then moved
   3170   // into the function declaration's context afterward.
   3171   DeclContext *DC = Importer.getToContext().getTranslationUnitDecl();
   3172 
   3173   // Import the name of this declaration.
   3174   DeclarationName Name = Importer.Import(D->getDeclName());
   3175   if (D->getDeclName() && !Name)
   3176     return nullptr;
   3177 
   3178   // Import the location of this declaration.
   3179   SourceLocation Loc = Importer.Import(D->getLocation());
   3180 
   3181   // Import the parameter's type.
   3182   QualType T = Importer.Import(D->getType());
   3183   if (T.isNull())
   3184     return nullptr;
   3185 
   3186   // Create the imported parameter.
   3187   TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo());
   3188   ParmVarDecl *ToParm = ParmVarDecl::Create(Importer.getToContext(), DC,
   3189                                      Importer.Import(D->getInnerLocStart()),
   3190                                             Loc, Name.getAsIdentifierInfo(),
   3191                                             T, TInfo, D->getStorageClass(),
   3192                                             /*FIXME: Default argument*/nullptr);
   3193   ToParm->setHasInheritedDefaultArg(D->hasInheritedDefaultArg());
   3194   return Importer.Imported(D, ToParm);
   3195 }
   3196 
   3197 Decl *ASTNodeImporter::VisitObjCMethodDecl(ObjCMethodDecl *D) {
   3198   // Import the major distinguishing characteristics of a method.
   3199   DeclContext *DC, *LexicalDC;
   3200   DeclarationName Name;
   3201   SourceLocation Loc;
   3202   if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
   3203     return nullptr;
   3204 
   3205   SmallVector<NamedDecl *, 2> FoundDecls;
   3206   DC->localUncachedLookup(Name, FoundDecls);
   3207   for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
   3208     if (ObjCMethodDecl *FoundMethod = dyn_cast<ObjCMethodDecl>(FoundDecls[I])) {
   3209       if (FoundMethod->isInstanceMethod() != D->isInstanceMethod())
   3210         continue;
   3211 
   3212       // Check return types.
   3213       if (!Importer.IsStructurallyEquivalent(D->getReturnType(),
   3214                                              FoundMethod->getReturnType())) {
   3215         Importer.ToDiag(Loc, diag::err_odr_objc_method_result_type_inconsistent)
   3216             << D->isInstanceMethod() << Name << D->getReturnType()
   3217             << FoundMethod->getReturnType();
   3218         Importer.ToDiag(FoundMethod->getLocation(),
   3219                         diag::note_odr_objc_method_here)
   3220           << D->isInstanceMethod() << Name;
   3221         return nullptr;
   3222       }
   3223 
   3224       // Check the number of parameters.
   3225       if (D->param_size() != FoundMethod->param_size()) {
   3226         Importer.ToDiag(Loc, diag::err_odr_objc_method_num_params_inconsistent)
   3227           << D->isInstanceMethod() << Name
   3228           << D->param_size() << FoundMethod->param_size();
   3229         Importer.ToDiag(FoundMethod->getLocation(),
   3230                         diag::note_odr_objc_method_here)
   3231           << D->isInstanceMethod() << Name;
   3232         return nullptr;
   3233       }
   3234 
   3235       // Check parameter types.
   3236       for (ObjCMethodDecl::param_iterator P = D->param_begin(),
   3237              PEnd = D->param_end(), FoundP = FoundMethod->param_begin();
   3238            P != PEnd; ++P, ++FoundP) {
   3239         if (!Importer.IsStructurallyEquivalent((*P)->getType(),
   3240                                                (*FoundP)->getType())) {
   3241           Importer.FromDiag((*P)->getLocation(),
   3242                             diag::err_odr_objc_method_param_type_inconsistent)
   3243             << D->isInstanceMethod() << Name
   3244             << (*P)->getType() << (*FoundP)->getType();
   3245           Importer.ToDiag((*FoundP)->getLocation(), diag::note_odr_value_here)
   3246             << (*FoundP)->getType();
   3247           return nullptr;
   3248         }
   3249       }
   3250 
   3251       // Check variadic/non-variadic.
   3252       // Check the number of parameters.
   3253       if (D->isVariadic() != FoundMethod->isVariadic()) {
   3254         Importer.ToDiag(Loc, diag::err_odr_objc_method_variadic_inconsistent)
   3255           << D->isInstanceMethod() << Name;
   3256         Importer.ToDiag(FoundMethod->getLocation(),
   3257                         diag::note_odr_objc_method_here)
   3258           << D->isInstanceMethod() << Name;
   3259         return nullptr;
   3260       }
   3261 
   3262       // FIXME: Any other bits we need to merge?
   3263       return Importer.Imported(D, FoundMethod);
   3264     }
   3265   }
   3266 
   3267   // Import the result type.
   3268   QualType ResultTy = Importer.Import(D->getReturnType());
   3269   if (ResultTy.isNull())
   3270     return nullptr;
   3271 
   3272   TypeSourceInfo *ReturnTInfo = Importer.Import(D->getReturnTypeSourceInfo());
   3273 
   3274   ObjCMethodDecl *ToMethod = ObjCMethodDecl::Create(
   3275       Importer.getToContext(), Loc, Importer.Import(D->getLocEnd()),
   3276       Name.getObjCSelector(), ResultTy, ReturnTInfo, DC, D->isInstanceMethod(),
   3277       D->isVariadic(), D->isPropertyAccessor(), D->isImplicit(), D->isDefined(),
   3278       D->getImplementationControl(), D->hasRelatedResultType());
   3279 
   3280   // FIXME: When we decide to merge method definitions, we'll need to
   3281   // deal with implicit parameters.
   3282 
   3283   // Import the parameters
   3284   SmallVector<ParmVarDecl *, 5> ToParams;
   3285   for (auto *FromP : D->params()) {
   3286     ParmVarDecl *ToP = cast_or_null<ParmVarDecl>(Importer.Import(FromP));
   3287     if (!ToP)
   3288       return nullptr;
   3289 
   3290     ToParams.push_back(ToP);
   3291   }
   3292 
   3293   // Set the parameters.
   3294   for (unsigned I = 0, N = ToParams.size(); I != N; ++I) {
   3295     ToParams[I]->setOwningFunction(ToMethod);
   3296     ToMethod->addDeclInternal(ToParams[I]);
   3297   }
   3298   SmallVector<SourceLocation, 12> SelLocs;
   3299   D->getSelectorLocs(SelLocs);
   3300   ToMethod->setMethodParams(Importer.getToContext(), ToParams, SelLocs);
   3301 
   3302   ToMethod->setLexicalDeclContext(LexicalDC);
   3303   Importer.Imported(D, ToMethod);
   3304   LexicalDC->addDeclInternal(ToMethod);
   3305   return ToMethod;
   3306 }
   3307 
   3308 Decl *ASTNodeImporter::VisitObjCCategoryDecl(ObjCCategoryDecl *D) {
   3309   // Import the major distinguishing characteristics of a category.
   3310   DeclContext *DC, *LexicalDC;
   3311   DeclarationName Name;
   3312   SourceLocation Loc;
   3313   if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
   3314     return nullptr;
   3315 
   3316   ObjCInterfaceDecl *ToInterface
   3317     = cast_or_null<ObjCInterfaceDecl>(Importer.Import(D->getClassInterface()));
   3318   if (!ToInterface)
   3319     return nullptr;
   3320 
   3321   // Determine if we've already encountered this category.
   3322   ObjCCategoryDecl *MergeWithCategory
   3323     = ToInterface->FindCategoryDeclaration(Name.getAsIdentifierInfo());
   3324   ObjCCategoryDecl *ToCategory = MergeWithCategory;
   3325   if (!ToCategory) {
   3326     ToCategory = ObjCCategoryDecl::Create(Importer.getToContext(), DC,
   3327                                           Importer.Import(D->getAtStartLoc()),
   3328                                           Loc,
   3329                                        Importer.Import(D->getCategoryNameLoc()),
   3330                                           Name.getAsIdentifierInfo(),
   3331                                           ToInterface,
   3332                                        Importer.Import(D->getIvarLBraceLoc()),
   3333                                        Importer.Import(D->getIvarRBraceLoc()));
   3334     ToCategory->setLexicalDeclContext(LexicalDC);
   3335     LexicalDC->addDeclInternal(ToCategory);
   3336     Importer.Imported(D, ToCategory);
   3337 
   3338     // Import protocols
   3339     SmallVector<ObjCProtocolDecl *, 4> Protocols;
   3340     SmallVector<SourceLocation, 4> ProtocolLocs;
   3341     ObjCCategoryDecl::protocol_loc_iterator FromProtoLoc
   3342       = D->protocol_loc_begin();
   3343     for (ObjCCategoryDecl::protocol_iterator FromProto = D->protocol_begin(),
   3344                                           FromProtoEnd = D->protocol_end();
   3345          FromProto != FromProtoEnd;
   3346          ++FromProto, ++FromProtoLoc) {
   3347       ObjCProtocolDecl *ToProto
   3348         = cast_or_null<ObjCProtocolDecl>(Importer.Import(*FromProto));
   3349       if (!ToProto)
   3350         return nullptr;
   3351       Protocols.push_back(ToProto);
   3352       ProtocolLocs.push_back(Importer.Import(*FromProtoLoc));
   3353     }
   3354 
   3355     // FIXME: If we're merging, make sure that the protocol list is the same.
   3356     ToCategory->setProtocolList(Protocols.data(), Protocols.size(),
   3357                                 ProtocolLocs.data(), Importer.getToContext());
   3358 
   3359   } else {
   3360     Importer.Imported(D, ToCategory);
   3361   }
   3362 
   3363   // Import all of the members of this category.
   3364   ImportDeclContext(D);
   3365 
   3366   // If we have an implementation, import it as well.
   3367   if (D->getImplementation()) {
   3368     ObjCCategoryImplDecl *Impl
   3369       = cast_or_null<ObjCCategoryImplDecl>(
   3370                                        Importer.Import(D->getImplementation()));
   3371     if (!Impl)
   3372       return nullptr;
   3373 
   3374     ToCategory->setImplementation(Impl);
   3375   }
   3376 
   3377   return ToCategory;
   3378 }
   3379 
   3380 bool ASTNodeImporter::ImportDefinition(ObjCProtocolDecl *From,
   3381                                        ObjCProtocolDecl *To,
   3382                                        ImportDefinitionKind Kind) {
   3383   if (To->getDefinition()) {
   3384     if (shouldForceImportDeclContext(Kind))
   3385       ImportDeclContext(From);
   3386     return false;
   3387   }
   3388 
   3389   // Start the protocol definition
   3390   To->startDefinition();
   3391 
   3392   // Import protocols
   3393   SmallVector<ObjCProtocolDecl *, 4> Protocols;
   3394   SmallVector<SourceLocation, 4> ProtocolLocs;
   3395   ObjCProtocolDecl::protocol_loc_iterator
   3396   FromProtoLoc = From->protocol_loc_begin();
   3397   for (ObjCProtocolDecl::protocol_iterator FromProto = From->protocol_begin(),
   3398                                         FromProtoEnd = From->protocol_end();
   3399        FromProto != FromProtoEnd;
   3400        ++FromProto, ++FromProtoLoc) {
   3401     ObjCProtocolDecl *ToProto
   3402       = cast_or_null<ObjCProtocolDecl>(Importer.Import(*FromProto));
   3403     if (!ToProto)
   3404       return true;
   3405     Protocols.push_back(ToProto);
   3406     ProtocolLocs.push_back(Importer.Import(*FromProtoLoc));
   3407   }
   3408 
   3409   // FIXME: If we're merging, make sure that the protocol list is the same.
   3410   To->setProtocolList(Protocols.data(), Protocols.size(),
   3411                       ProtocolLocs.data(), Importer.getToContext());
   3412 
   3413   if (shouldForceImportDeclContext(Kind)) {
   3414     // Import all of the members of this protocol.
   3415     ImportDeclContext(From, /*ForceImport=*/true);
   3416   }
   3417   return false;
   3418 }
   3419 
   3420 Decl *ASTNodeImporter::VisitObjCProtocolDecl(ObjCProtocolDecl *D) {
   3421   // If this protocol has a definition in the translation unit we're coming
   3422   // from, but this particular declaration is not that definition, import the
   3423   // definition and map to that.
   3424   ObjCProtocolDecl *Definition = D->getDefinition();
   3425   if (Definition && Definition != D) {
   3426     Decl *ImportedDef = Importer.Import(Definition);
   3427     if (!ImportedDef)
   3428       return nullptr;
   3429 
   3430     return Importer.Imported(D, ImportedDef);
   3431   }
   3432 
   3433   // Import the major distinguishing characteristics of a protocol.
   3434   DeclContext *DC, *LexicalDC;
   3435   DeclarationName Name;
   3436   SourceLocation Loc;
   3437   if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
   3438     return nullptr;
   3439 
   3440   ObjCProtocolDecl *MergeWithProtocol = nullptr;
   3441   SmallVector<NamedDecl *, 2> FoundDecls;
   3442   DC->localUncachedLookup(Name, FoundDecls);
   3443   for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
   3444     if (!FoundDecls[I]->isInIdentifierNamespace(Decl::IDNS_ObjCProtocol))
   3445       continue;
   3446 
   3447     if ((MergeWithProtocol = dyn_cast<ObjCProtocolDecl>(FoundDecls[I])))
   3448       break;
   3449   }
   3450 
   3451   ObjCProtocolDecl *ToProto = MergeWithProtocol;
   3452   if (!ToProto) {
   3453     ToProto = ObjCProtocolDecl::Create(Importer.getToContext(), DC,
   3454                                        Name.getAsIdentifierInfo(), Loc,
   3455                                        Importer.Import(D->getAtStartLoc()),
   3456                                        /*PrevDecl=*/nullptr);
   3457     ToProto->setLexicalDeclContext(LexicalDC);
   3458     LexicalDC->addDeclInternal(ToProto);
   3459   }
   3460 
   3461   Importer.Imported(D, ToProto);
   3462 
   3463   if (D->isThisDeclarationADefinition() && ImportDefinition(D, ToProto))
   3464     return nullptr;
   3465 
   3466   return ToProto;
   3467 }
   3468 
   3469 bool ASTNodeImporter::ImportDefinition(ObjCInterfaceDecl *From,
   3470                                        ObjCInterfaceDecl *To,
   3471                                        ImportDefinitionKind Kind) {
   3472   if (To->getDefinition()) {
   3473     // Check consistency of superclass.
   3474     ObjCInterfaceDecl *FromSuper = From->getSuperClass();
   3475     if (FromSuper) {
   3476       FromSuper = cast_or_null<ObjCInterfaceDecl>(Importer.Import(FromSuper));
   3477       if (!FromSuper)
   3478         return true;
   3479     }
   3480 
   3481     ObjCInterfaceDecl *ToSuper = To->getSuperClass();
   3482     if ((bool)FromSuper != (bool)ToSuper ||
   3483         (FromSuper && !declaresSameEntity(FromSuper, ToSuper))) {
   3484       Importer.ToDiag(To->getLocation(),
   3485                       diag::err_odr_objc_superclass_inconsistent)
   3486         << To->getDeclName();
   3487       if (ToSuper)
   3488         Importer.ToDiag(To->getSuperClassLoc(), diag::note_odr_objc_superclass)
   3489           << To->getSuperClass()->getDeclName();
   3490       else
   3491         Importer.ToDiag(To->getLocation(),
   3492                         diag::note_odr_objc_missing_superclass);
   3493       if (From->getSuperClass())
   3494         Importer.FromDiag(From->getSuperClassLoc(),
   3495                           diag::note_odr_objc_superclass)
   3496         << From->getSuperClass()->getDeclName();
   3497       else
   3498         Importer.FromDiag(From->getLocation(),
   3499                           diag::note_odr_objc_missing_superclass);
   3500     }
   3501 
   3502     if (shouldForceImportDeclContext(Kind))
   3503       ImportDeclContext(From);
   3504     return false;
   3505   }
   3506 
   3507   // Start the definition.
   3508   To->startDefinition();
   3509 
   3510   // If this class has a superclass, import it.
   3511   if (From->getSuperClass()) {
   3512     ObjCInterfaceDecl *Super = cast_or_null<ObjCInterfaceDecl>(
   3513                                  Importer.Import(From->getSuperClass()));
   3514     if (!Super)
   3515       return true;
   3516 
   3517     To->setSuperClass(Super);
   3518     To->setSuperClassLoc(Importer.Import(From->getSuperClassLoc()));
   3519   }
   3520 
   3521   // Import protocols
   3522   SmallVector<ObjCProtocolDecl *, 4> Protocols;
   3523   SmallVector<SourceLocation, 4> ProtocolLocs;
   3524   ObjCInterfaceDecl::protocol_loc_iterator
   3525   FromProtoLoc = From->protocol_loc_begin();
   3526 
   3527   for (ObjCInterfaceDecl::protocol_iterator FromProto = From->protocol_begin(),
   3528                                          FromProtoEnd = From->protocol_end();
   3529        FromProto != FromProtoEnd;
   3530        ++FromProto, ++FromProtoLoc) {
   3531     ObjCProtocolDecl *ToProto
   3532       = cast_or_null<ObjCProtocolDecl>(Importer.Import(*FromProto));
   3533     if (!ToProto)
   3534       return true;
   3535     Protocols.push_back(ToProto);
   3536     ProtocolLocs.push_back(Importer.Import(*FromProtoLoc));
   3537   }
   3538 
   3539   // FIXME: If we're merging, make sure that the protocol list is the same.
   3540   To->setProtocolList(Protocols.data(), Protocols.size(),
   3541                       ProtocolLocs.data(), Importer.getToContext());
   3542 
   3543   // Import categories. When the categories themselves are imported, they'll
   3544   // hook themselves into this interface.
   3545   for (auto *Cat : From->known_categories())
   3546     Importer.Import(Cat);
   3547 
   3548   // If we have an @implementation, import it as well.
   3549   if (From->getImplementation()) {
   3550     ObjCImplementationDecl *Impl = cast_or_null<ObjCImplementationDecl>(
   3551                                      Importer.Import(From->getImplementation()));
   3552     if (!Impl)
   3553       return true;
   3554 
   3555     To->setImplementation(Impl);
   3556   }
   3557 
   3558   if (shouldForceImportDeclContext(Kind)) {
   3559     // Import all of the members of this class.
   3560     ImportDeclContext(From, /*ForceImport=*/true);
   3561   }
   3562   return false;
   3563 }
   3564 
   3565 Decl *ASTNodeImporter::VisitObjCInterfaceDecl(ObjCInterfaceDecl *D) {
   3566   // If this class has a definition in the translation unit we're coming from,
   3567   // but this particular declaration is not that definition, import the
   3568   // definition and map to that.
   3569   ObjCInterfaceDecl *Definition = D->getDefinition();
   3570   if (Definition && Definition != D) {
   3571     Decl *ImportedDef = Importer.Import(Definition);
   3572     if (!ImportedDef)
   3573       return nullptr;
   3574 
   3575     return Importer.Imported(D, ImportedDef);
   3576   }
   3577 
   3578   // Import the major distinguishing characteristics of an @interface.
   3579   DeclContext *DC, *LexicalDC;
   3580   DeclarationName Name;
   3581   SourceLocation Loc;
   3582   if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
   3583     return nullptr;
   3584 
   3585   // Look for an existing interface with the same name.
   3586   ObjCInterfaceDecl *MergeWithIface = nullptr;
   3587   SmallVector<NamedDecl *, 2> FoundDecls;
   3588   DC->localUncachedLookup(Name, FoundDecls);
   3589   for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
   3590     if (!FoundDecls[I]->isInIdentifierNamespace(Decl::IDNS_Ordinary))
   3591       continue;
   3592 
   3593     if ((MergeWithIface = dyn_cast<ObjCInterfaceDecl>(FoundDecls[I])))
   3594       break;
   3595   }
   3596 
   3597   // Create an interface declaration, if one does not already exist.
   3598   ObjCInterfaceDecl *ToIface = MergeWithIface;
   3599   if (!ToIface) {
   3600     ToIface = ObjCInterfaceDecl::Create(Importer.getToContext(), DC,
   3601                                         Importer.Import(D->getAtStartLoc()),
   3602                                         Name.getAsIdentifierInfo(),
   3603                                         /*PrevDecl=*/nullptr, Loc,
   3604                                         D->isImplicitInterfaceDecl());
   3605     ToIface->setLexicalDeclContext(LexicalDC);
   3606     LexicalDC->addDeclInternal(ToIface);
   3607   }
   3608   Importer.Imported(D, ToIface);
   3609 
   3610   if (D->isThisDeclarationADefinition() && ImportDefinition(D, ToIface))
   3611     return nullptr;
   3612 
   3613   return ToIface;
   3614 }
   3615 
   3616 Decl *ASTNodeImporter::VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) {
   3617   ObjCCategoryDecl *Category = cast_or_null<ObjCCategoryDecl>(
   3618                                         Importer.Import(D->getCategoryDecl()));
   3619   if (!Category)
   3620     return nullptr;
   3621 
   3622   ObjCCategoryImplDecl *ToImpl = Category->getImplementation();
   3623   if (!ToImpl) {
   3624     DeclContext *DC = Importer.ImportContext(D->getDeclContext());
   3625     if (!DC)
   3626       return nullptr;
   3627 
   3628     SourceLocation CategoryNameLoc = Importer.Import(D->getCategoryNameLoc());
   3629     ToImpl = ObjCCategoryImplDecl::Create(Importer.getToContext(), DC,
   3630                                           Importer.Import(D->getIdentifier()),
   3631                                           Category->getClassInterface(),
   3632                                           Importer.Import(D->getLocation()),
   3633                                           Importer.Import(D->getAtStartLoc()),
   3634                                           CategoryNameLoc);
   3635 
   3636     DeclContext *LexicalDC = DC;
   3637     if (D->getDeclContext() != D->getLexicalDeclContext()) {
   3638       LexicalDC = Importer.ImportContext(D->getLexicalDeclContext());
   3639       if (!LexicalDC)
   3640         return nullptr;
   3641 
   3642       ToImpl->setLexicalDeclContext(LexicalDC);
   3643     }
   3644 
   3645     LexicalDC->addDeclInternal(ToImpl);
   3646     Category->setImplementation(ToImpl);
   3647   }
   3648 
   3649   Importer.Imported(D, ToImpl);
   3650   ImportDeclContext(D);
   3651   return ToImpl;
   3652 }
   3653 
   3654 Decl *ASTNodeImporter::VisitObjCImplementationDecl(ObjCImplementationDecl *D) {
   3655   // Find the corresponding interface.
   3656   ObjCInterfaceDecl *Iface = cast_or_null<ObjCInterfaceDecl>(
   3657                                        Importer.Import(D->getClassInterface()));
   3658   if (!Iface)
   3659     return nullptr;
   3660 
   3661   // Import the superclass, if any.
   3662   ObjCInterfaceDecl *Super = nullptr;
   3663   if (D->getSuperClass()) {
   3664     Super = cast_or_null<ObjCInterfaceDecl>(
   3665                                           Importer.Import(D->getSuperClass()));
   3666     if (!Super)
   3667       return nullptr;
   3668   }
   3669 
   3670   ObjCImplementationDecl *Impl = Iface->getImplementation();
   3671   if (!Impl) {
   3672     // We haven't imported an implementation yet. Create a new @implementation
   3673     // now.
   3674     Impl = ObjCImplementationDecl::Create(Importer.getToContext(),
   3675                                   Importer.ImportContext(D->getDeclContext()),
   3676                                           Iface, Super,
   3677                                           Importer.Import(D->getLocation()),
   3678                                           Importer.Import(D->getAtStartLoc()),
   3679                                           Importer.Import(D->getSuperClassLoc()),
   3680                                           Importer.Import(D->getIvarLBraceLoc()),
   3681                                           Importer.Import(D->getIvarRBraceLoc()));
   3682 
   3683     if (D->getDeclContext() != D->getLexicalDeclContext()) {
   3684       DeclContext *LexicalDC
   3685         = Importer.ImportContext(D->getLexicalDeclContext());
   3686       if (!LexicalDC)
   3687         return nullptr;
   3688       Impl->setLexicalDeclContext(LexicalDC);
   3689     }
   3690 
   3691     // Associate the implementation with the class it implements.
   3692     Iface->setImplementation(Impl);
   3693     Importer.Imported(D, Iface->getImplementation());
   3694   } else {
   3695     Importer.Imported(D, Iface->getImplementation());
   3696 
   3697     // Verify that the existing @implementation has the same superclass.
   3698     if ((Super && !Impl->getSuperClass()) ||
   3699         (!Super && Impl->getSuperClass()) ||
   3700         (Super && Impl->getSuperClass() &&
   3701          !declaresSameEntity(Super->getCanonicalDecl(),
   3702                              Impl->getSuperClass()))) {
   3703       Importer.ToDiag(Impl->getLocation(),
   3704                       diag::err_odr_objc_superclass_inconsistent)
   3705         << Iface->getDeclName();
   3706       // FIXME: It would be nice to have the location of the superclass
   3707       // below.
   3708       if (Impl->getSuperClass())
   3709         Importer.ToDiag(Impl->getLocation(),
   3710                         diag::note_odr_objc_superclass)
   3711         << Impl->getSuperClass()->getDeclName();
   3712       else
   3713         Importer.ToDiag(Impl->getLocation(),
   3714                         diag::note_odr_objc_missing_superclass);
   3715       if (D->getSuperClass())
   3716         Importer.FromDiag(D->getLocation(),
   3717                           diag::note_odr_objc_superclass)
   3718         << D->getSuperClass()->getDeclName();
   3719       else
   3720         Importer.FromDiag(D->getLocation(),
   3721                           diag::note_odr_objc_missing_superclass);
   3722       return nullptr;
   3723     }
   3724   }
   3725 
   3726   // Import all of the members of this @implementation.
   3727   ImportDeclContext(D);
   3728 
   3729   return Impl;
   3730 }
   3731 
   3732 Decl *ASTNodeImporter::VisitObjCPropertyDecl(ObjCPropertyDecl *D) {
   3733   // Import the major distinguishing characteristics of an @property.
   3734   DeclContext *DC, *LexicalDC;
   3735   DeclarationName Name;
   3736   SourceLocation Loc;
   3737   if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
   3738     return nullptr;
   3739 
   3740   // Check whether we have already imported this property.
   3741   SmallVector<NamedDecl *, 2> FoundDecls;
   3742   DC->localUncachedLookup(Name, FoundDecls);
   3743   for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
   3744     if (ObjCPropertyDecl *FoundProp
   3745                                 = dyn_cast<ObjCPropertyDecl>(FoundDecls[I])) {
   3746       // Check property types.
   3747       if (!Importer.IsStructurallyEquivalent(D->getType(),
   3748                                              FoundProp->getType())) {
   3749         Importer.ToDiag(Loc, diag::err_odr_objc_property_type_inconsistent)
   3750           << Name << D->getType() << FoundProp->getType();
   3751         Importer.ToDiag(FoundProp->getLocation(), diag::note_odr_value_here)
   3752           << FoundProp->getType();
   3753         return nullptr;
   3754       }
   3755 
   3756       // FIXME: Check property attributes, getters, setters, etc.?
   3757 
   3758       // Consider these properties to be equivalent.
   3759       Importer.Imported(D, FoundProp);
   3760       return FoundProp;
   3761     }
   3762   }
   3763 
   3764   // Import the type.
   3765   TypeSourceInfo *T = Importer.Import(D->getTypeSourceInfo());
   3766   if (!T)
   3767     return nullptr;
   3768 
   3769   // Create the new property.
   3770   ObjCPropertyDecl *ToProperty
   3771     = ObjCPropertyDecl::Create(Importer.getToContext(), DC, Loc,
   3772                                Name.getAsIdentifierInfo(),
   3773                                Importer.Import(D->getAtLoc()),
   3774                                Importer.Import(D->getLParenLoc()),
   3775                                T,
   3776                                D->getPropertyImplementation());
   3777   Importer.Imported(D, ToProperty);
   3778   ToProperty->setLexicalDeclContext(LexicalDC);
   3779   LexicalDC->addDeclInternal(ToProperty);
   3780 
   3781   ToProperty->setPropertyAttributes(D->getPropertyAttributes());
   3782   ToProperty->setPropertyAttributesAsWritten(
   3783                                       D->getPropertyAttributesAsWritten());
   3784   ToProperty->setGetterName(Importer.Import(D->getGetterName()));
   3785   ToProperty->setSetterName(Importer.Import(D->getSetterName()));
   3786   ToProperty->setGetterMethodDecl(
   3787      cast_or_null<ObjCMethodDecl>(Importer.Import(D->getGetterMethodDecl())));
   3788   ToProperty->setSetterMethodDecl(
   3789      cast_or_null<ObjCMethodDecl>(Importer.Import(D->getSetterMethodDecl())));
   3790   ToProperty->setPropertyIvarDecl(
   3791        cast_or_null<ObjCIvarDecl>(Importer.Import(D->getPropertyIvarDecl())));
   3792   return ToProperty;
   3793 }
   3794 
   3795 Decl *ASTNodeImporter::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D) {
   3796   ObjCPropertyDecl *Property = cast_or_null<ObjCPropertyDecl>(
   3797                                         Importer.Import(D->getPropertyDecl()));
   3798   if (!Property)
   3799     return nullptr;
   3800 
   3801   DeclContext *DC = Importer.ImportContext(D->getDeclContext());
   3802   if (!DC)
   3803     return nullptr;
   3804 
   3805   // Import the lexical declaration context.
   3806   DeclContext *LexicalDC = DC;
   3807   if (D->getDeclContext() != D->getLexicalDeclContext()) {
   3808     LexicalDC = Importer.ImportContext(D->getLexicalDeclContext());
   3809     if (!LexicalDC)
   3810       return nullptr;
   3811   }
   3812 
   3813   ObjCImplDecl *InImpl = dyn_cast<ObjCImplDecl>(LexicalDC);
   3814   if (!InImpl)
   3815     return nullptr;
   3816 
   3817   // Import the ivar (for an @synthesize).
   3818   ObjCIvarDecl *Ivar = nullptr;
   3819   if (D->getPropertyIvarDecl()) {
   3820     Ivar = cast_or_null<ObjCIvarDecl>(
   3821                                     Importer.Import(D->getPropertyIvarDecl()));
   3822     if (!Ivar)
   3823       return nullptr;
   3824   }
   3825 
   3826   ObjCPropertyImplDecl *ToImpl
   3827     = InImpl->FindPropertyImplDecl(Property->getIdentifier());
   3828   if (!ToImpl) {
   3829     ToImpl = ObjCPropertyImplDecl::Create(Importer.getToContext(), DC,
   3830                                           Importer.Import(D->getLocStart()),
   3831                                           Importer.Import(D->getLocation()),
   3832                                           Property,
   3833                                           D->getPropertyImplementation(),
   3834                                           Ivar,
   3835                                   Importer.Import(D->getPropertyIvarDeclLoc()));
   3836     ToImpl->setLexicalDeclContext(LexicalDC);
   3837     Importer.Imported(D, ToImpl);
   3838     LexicalDC->addDeclInternal(ToImpl);
   3839   } else {
   3840     // Check that we have the same kind of property implementation (@synthesize
   3841     // vs. @dynamic).
   3842     if (D->getPropertyImplementation() != ToImpl->getPropertyImplementation()) {
   3843       Importer.ToDiag(ToImpl->getLocation(),
   3844                       diag::err_odr_objc_property_impl_kind_inconsistent)
   3845         << Property->getDeclName()
   3846         << (ToImpl->getPropertyImplementation()
   3847                                               == ObjCPropertyImplDecl::Dynamic);
   3848       Importer.FromDiag(D->getLocation(),
   3849                         diag::note_odr_objc_property_impl_kind)
   3850         << D->getPropertyDecl()->getDeclName()
   3851         << (D->getPropertyImplementation() == ObjCPropertyImplDecl::Dynamic);
   3852       return nullptr;
   3853     }
   3854 
   3855     // For @synthesize, check that we have the same
   3856     if (D->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize &&
   3857         Ivar != ToImpl->getPropertyIvarDecl()) {
   3858       Importer.ToDiag(ToImpl->getPropertyIvarDeclLoc(),
   3859                       diag::err_odr_objc_synthesize_ivar_inconsistent)
   3860         << Property->getDeclName()
   3861         << ToImpl->getPropertyIvarDecl()->getDeclName()
   3862         << Ivar->getDeclName();
   3863       Importer.FromDiag(D->getPropertyIvarDeclLoc(),
   3864                         diag::note_odr_objc_synthesize_ivar_here)
   3865         << D->getPropertyIvarDecl()->getDeclName();
   3866       return nullptr;
   3867     }
   3868 
   3869     // Merge the existing implementation with the new implementation.
   3870     Importer.Imported(D, ToImpl);
   3871   }
   3872 
   3873   return ToImpl;
   3874 }
   3875 
   3876 Decl *ASTNodeImporter::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) {
   3877   // For template arguments, we adopt the translation unit as our declaration
   3878   // context. This context will be fixed when the actual template declaration
   3879   // is created.
   3880 
   3881   // FIXME: Import default argument.
   3882   return TemplateTypeParmDecl::Create(Importer.getToContext(),
   3883                               Importer.getToContext().getTranslationUnitDecl(),
   3884                                       Importer.Import(D->getLocStart()),
   3885                                       Importer.Import(D->getLocation()),
   3886                                       D->getDepth(),
   3887                                       D->getIndex(),
   3888                                       Importer.Import(D->getIdentifier()),
   3889                                       D->wasDeclaredWithTypename(),
   3890                                       D->isParameterPack());
   3891 }
   3892 
   3893 Decl *
   3894 ASTNodeImporter::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) {
   3895   // Import the name of this declaration.
   3896   DeclarationName Name = Importer.Import(D->getDeclName());
   3897   if (D->getDeclName() && !Name)
   3898     return nullptr;
   3899 
   3900   // Import the location of this declaration.
   3901   SourceLocation Loc = Importer.Import(D->getLocation());
   3902 
   3903   // Import the type of this declaration.
   3904   QualType T = Importer.Import(D->getType());
   3905   if (T.isNull())
   3906     return nullptr;
   3907 
   3908   // Import type-source information.
   3909   TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo());
   3910   if (D->getTypeSourceInfo() && !TInfo)
   3911     return nullptr;
   3912 
   3913   // FIXME: Import default argument.
   3914 
   3915   return NonTypeTemplateParmDecl::Create(Importer.getToContext(),
   3916                                Importer.getToContext().getTranslationUnitDecl(),
   3917                                          Importer.Import(D->getInnerLocStart()),
   3918                                          Loc, D->getDepth(), D->getPosition(),
   3919                                          Name.getAsIdentifierInfo(),
   3920                                          T, D->isParameterPack(), TInfo);
   3921 }
   3922 
   3923 Decl *
   3924 ASTNodeImporter::VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) {
   3925   // Import the name of this declaration.
   3926   DeclarationName Name = Importer.Import(D->getDeclName());
   3927   if (D->getDeclName() && !Name)
   3928     return nullptr;
   3929 
   3930   // Import the location of this declaration.
   3931   SourceLocation Loc = Importer.Import(D->getLocation());
   3932 
   3933   // Import template parameters.
   3934   TemplateParameterList *TemplateParams
   3935     = ImportTemplateParameterList(D->getTemplateParameters());
   3936   if (!TemplateParams)
   3937     return nullptr;
   3938 
   3939   // FIXME: Import default argument.
   3940 
   3941   return TemplateTemplateParmDecl::Create(Importer.getToContext(),
   3942                               Importer.getToContext().getTranslationUnitDecl(),
   3943                                           Loc, D->getDepth(), D->getPosition(),
   3944                                           D->isParameterPack(),
   3945                                           Name.getAsIdentifierInfo(),
   3946                                           TemplateParams);
   3947 }
   3948 
   3949 Decl *ASTNodeImporter::VisitClassTemplateDecl(ClassTemplateDecl *D) {
   3950   // If this record has a definition in the translation unit we're coming from,
   3951   // but this particular declaration is not that definition, import the
   3952   // definition and map to that.
   3953   CXXRecordDecl *Definition
   3954     = cast_or_null<CXXRecordDecl>(D->getTemplatedDecl()->getDefinition());
   3955   if (Definition && Definition != D->getTemplatedDecl()) {
   3956     Decl *ImportedDef
   3957       = Importer.Import(Definition->getDescribedClassTemplate());
   3958     if (!ImportedDef)
   3959       return nullptr;
   3960 
   3961     return Importer.Imported(D, ImportedDef);
   3962   }
   3963 
   3964   // Import the major distinguishing characteristics of this class template.
   3965   DeclContext *DC, *LexicalDC;
   3966   DeclarationName Name;
   3967   SourceLocation Loc;
   3968   if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
   3969     return nullptr;
   3970 
   3971   // We may already have a template of the same name; try to find and match it.
   3972   if (!DC->isFunctionOrMethod()) {
   3973     SmallVector<NamedDecl *, 4> ConflictingDecls;
   3974     SmallVector<NamedDecl *, 2> FoundDecls;
   3975     DC->localUncachedLookup(Name, FoundDecls);
   3976     for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
   3977       if (!FoundDecls[I]->isInIdentifierNamespace(Decl::IDNS_Ordinary))
   3978         continue;
   3979 
   3980       Decl *Found = FoundDecls[I];
   3981       if (ClassTemplateDecl *FoundTemplate
   3982                                         = dyn_cast<ClassTemplateDecl>(Found)) {
   3983         if (IsStructuralMatch(D, FoundTemplate)) {
   3984           // The class templates structurally match; call it the same template.
   3985           // FIXME: We may be filling in a forward declaration here. Handle
   3986           // this case!
   3987           Importer.Imported(D->getTemplatedDecl(),
   3988                             FoundTemplate->getTemplatedDecl());
   3989           return Importer.Imported(D, FoundTemplate);
   3990         }
   3991       }
   3992 
   3993       ConflictingDecls.push_back(FoundDecls[I]);
   3994     }
   3995 
   3996     if (!ConflictingDecls.empty()) {
   3997       Name = Importer.HandleNameConflict(Name, DC, Decl::IDNS_Ordinary,
   3998                                          ConflictingDecls.data(),
   3999                                          ConflictingDecls.size());
   4000     }
   4001 
   4002     if (!Name)
   4003       return nullptr;
   4004   }
   4005 
   4006   CXXRecordDecl *DTemplated = D->getTemplatedDecl();
   4007 
   4008   // Create the declaration that is being templated.
   4009   SourceLocation StartLoc = Importer.Import(DTemplated->getLocStart());
   4010   SourceLocation IdLoc = Importer.Import(DTemplated->getLocation());
   4011   CXXRecordDecl *D2Templated = CXXRecordDecl::Create(Importer.getToContext(),
   4012                                                      DTemplated->getTagKind(),
   4013                                                      DC, StartLoc, IdLoc,
   4014                                                    Name.getAsIdentifierInfo());
   4015   D2Templated->setAccess(DTemplated->getAccess());
   4016   D2Templated->setQualifierInfo(Importer.Import(DTemplated->getQualifierLoc()));
   4017   D2Templated->setLexicalDeclContext(LexicalDC);
   4018 
   4019   // Create the class template declaration itself.
   4020   TemplateParameterList *TemplateParams
   4021     = ImportTemplateParameterList(D->getTemplateParameters());
   4022   if (!TemplateParams)
   4023     return nullptr;
   4024 
   4025   ClassTemplateDecl *D2 = ClassTemplateDecl::Create(Importer.getToContext(), DC,
   4026                                                     Loc, Name, TemplateParams,
   4027                                                     D2Templated,
   4028                                                     /*PrevDecl=*/nullptr);
   4029   D2Templated->setDescribedClassTemplate(D2);
   4030 
   4031   D2->setAccess(D->getAccess());
   4032   D2->setLexicalDeclContext(LexicalDC);
   4033   LexicalDC->addDeclInternal(D2);
   4034 
   4035   // Note the relationship between the class templates.
   4036   Importer.Imported(D, D2);
   4037   Importer.Imported(DTemplated, D2Templated);
   4038 
   4039   if (DTemplated->isCompleteDefinition() &&
   4040       !D2Templated->isCompleteDefinition()) {
   4041     // FIXME: Import definition!
   4042   }
   4043 
   4044   return D2;
   4045 }
   4046 
   4047 Decl *ASTNodeImporter::VisitClassTemplateSpecializationDecl(
   4048                                           ClassTemplateSpecializationDecl *D) {
   4049   // If this record has a definition in the translation unit we're coming from,
   4050   // but this particular declaration is not that definition, import the
   4051   // definition and map to that.
   4052   TagDecl *Definition = D->getDefinition();
   4053   if (Definition && Definition != D) {
   4054     Decl *ImportedDef = Importer.Import(Definition);
   4055     if (!ImportedDef)
   4056       return nullptr;
   4057 
   4058     return Importer.Imported(D, ImportedDef);
   4059   }
   4060 
   4061   ClassTemplateDecl *ClassTemplate
   4062     = cast_or_null<ClassTemplateDecl>(Importer.Import(
   4063                                                  D->getSpecializedTemplate()));
   4064   if (!ClassTemplate)
   4065     return nullptr;
   4066 
   4067   // Import the context of this declaration.
   4068   DeclContext *DC = ClassTemplate->getDeclContext();
   4069   if (!DC)
   4070     return nullptr;
   4071 
   4072   DeclContext *LexicalDC = DC;
   4073   if (D->getDeclContext() != D->getLexicalDeclContext()) {
   4074     LexicalDC = Importer.ImportContext(D->getLexicalDeclContext());
   4075     if (!LexicalDC)
   4076       return nullptr;
   4077   }
   4078 
   4079   // Import the location of this declaration.
   4080   SourceLocation StartLoc = Importer.Import(D->getLocStart());
   4081   SourceLocation IdLoc = Importer.Import(D->getLocation());
   4082 
   4083   // Import template arguments.
   4084   SmallVector<TemplateArgument, 2> TemplateArgs;
   4085   if (ImportTemplateArguments(D->getTemplateArgs().data(),
   4086                               D->getTemplateArgs().size(),
   4087                               TemplateArgs))
   4088     return nullptr;
   4089 
   4090   // Try to find an existing specialization with these template arguments.
   4091   void *InsertPos = nullptr;
   4092   ClassTemplateSpecializationDecl *D2
   4093     = ClassTemplate->findSpecialization(TemplateArgs, InsertPos);
   4094   if (D2) {
   4095     // We already have a class template specialization with these template
   4096     // arguments.
   4097 
   4098     // FIXME: Check for specialization vs. instantiation errors.
   4099 
   4100     if (RecordDecl *FoundDef = D2->getDefinition()) {
   4101       if (!D->isCompleteDefinition() || IsStructuralMatch(D, FoundDef)) {
   4102         // The record types structurally match, or the "from" translation
   4103         // unit only had a forward declaration anyway; call it the same
   4104         // function.
   4105         return Importer.Imported(D, FoundDef);
   4106       }
   4107     }
   4108   } else {
   4109     // Create a new specialization.
   4110     D2 = ClassTemplateSpecializationDecl::Create(Importer.getToContext(),
   4111                                                  D->getTagKind(), DC,
   4112                                                  StartLoc, IdLoc,
   4113                                                  ClassTemplate,
   4114                                                  TemplateArgs.data(),
   4115                                                  TemplateArgs.size(),
   4116                                                  /*PrevDecl=*/nullptr);
   4117     D2->setSpecializationKind(D->getSpecializationKind());
   4118 
   4119     // Add this specialization to the class template.
   4120     ClassTemplate->AddSpecialization(D2, InsertPos);
   4121 
   4122     // Import the qualifier, if any.
   4123     D2->setQualifierInfo(Importer.Import(D->getQualifierLoc()));
   4124 
   4125     // Add the specialization to this context.
   4126     D2->setLexicalDeclContext(LexicalDC);
   4127     LexicalDC->addDeclInternal(D2);
   4128   }
   4129   Importer.Imported(D, D2);
   4130 
   4131   if (D->isCompleteDefinition() && ImportDefinition(D, D2))
   4132     return nullptr;
   4133 
   4134   return D2;
   4135 }
   4136 
   4137 Decl *ASTNodeImporter::VisitVarTemplateDecl(VarTemplateDecl *D) {
   4138   // If this variable has a definition in the translation unit we're coming
   4139   // from,
   4140   // but this particular declaration is not that definition, import the
   4141   // definition and map to that.
   4142   VarDecl *Definition =
   4143       cast_or_null<VarDecl>(D->getTemplatedDecl()->getDefinition());
   4144   if (Definition && Definition != D->getTemplatedDecl()) {
   4145     Decl *ImportedDef = Importer.Import(Definition->getDescribedVarTemplate());
   4146     if (!ImportedDef)
   4147       return nullptr;
   4148 
   4149     return Importer.Imported(D, ImportedDef);
   4150   }
   4151 
   4152   // Import the major distinguishing characteristics of this variable template.
   4153   DeclContext *DC, *LexicalDC;
   4154   DeclarationName Name;
   4155   SourceLocation Loc;
   4156   if (ImportDeclParts(D, DC, LexicalDC, Name, Loc))
   4157     return nullptr;
   4158 
   4159   // We may already have a template of the same name; try to find and match it.
   4160   assert(!DC->isFunctionOrMethod() &&
   4161          "Variable templates cannot be declared at function scope");
   4162   SmallVector<NamedDecl *, 4> ConflictingDecls;
   4163   SmallVector<NamedDecl *, 2> FoundDecls;
   4164   DC->localUncachedLookup(Name, FoundDecls);
   4165   for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
   4166     if (!FoundDecls[I]->isInIdentifierNamespace(Decl::IDNS_Ordinary))
   4167       continue;
   4168 
   4169     Decl *Found = FoundDecls[I];
   4170     if (VarTemplateDecl *FoundTemplate = dyn_cast<VarTemplateDecl>(Found)) {
   4171       if (IsStructuralMatch(D, FoundTemplate)) {
   4172         // The variable templates structurally match; call it the same template.
   4173         Importer.Imported(D->getTemplatedDecl(),
   4174                           FoundTemplate->getTemplatedDecl());
   4175         return Importer.Imported(D, FoundTemplate);
   4176       }
   4177     }
   4178 
   4179     ConflictingDecls.push_back(FoundDecls[I]);
   4180   }
   4181 
   4182   if (!ConflictingDecls.empty()) {
   4183     Name = Importer.HandleNameConflict(Name, DC, Decl::IDNS_Ordinary,
   4184                                        ConflictingDecls.data(),
   4185                                        ConflictingDecls.size());
   4186   }
   4187 
   4188   if (!Name)
   4189     return nullptr;
   4190 
   4191   VarDecl *DTemplated = D->getTemplatedDecl();
   4192 
   4193   // Import the type.
   4194   QualType T = Importer.Import(DTemplated->getType());
   4195   if (T.isNull())
   4196     return nullptr;
   4197 
   4198   // Create the declaration that is being templated.
   4199   SourceLocation StartLoc = Importer.Import(DTemplated->getLocStart());
   4200   SourceLocation IdLoc = Importer.Import(DTemplated->getLocation());
   4201   TypeSourceInfo *TInfo = Importer.Import(DTemplated->getTypeSourceInfo());
   4202   VarDecl *D2Templated = VarDecl::Create(Importer.getToContext(), DC, StartLoc,
   4203                                          IdLoc, Name.getAsIdentifierInfo(), T,
   4204                                          TInfo, DTemplated->getStorageClass());
   4205   D2Templated->setAccess(DTemplated->getAccess());
   4206   D2Templated->setQualifierInfo(Importer.Import(DTemplated->getQualifierLoc()));
   4207   D2Templated->setLexicalDeclContext(LexicalDC);
   4208 
   4209   // Importer.Imported(DTemplated, D2Templated);
   4210   // LexicalDC->addDeclInternal(D2Templated);
   4211 
   4212   // Merge the initializer.
   4213   if (ImportDefinition(DTemplated, D2Templated))
   4214     return nullptr;
   4215 
   4216   // Create the variable template declaration itself.
   4217   TemplateParameterList *TemplateParams =
   4218       ImportTemplateParameterList(D->getTemplateParameters());
   4219   if (!TemplateParams)
   4220     return nullptr;
   4221 
   4222   VarTemplateDecl *D2 = VarTemplateDecl::Create(
   4223       Importer.getToContext(), DC, Loc, Name, TemplateParams, D2Templated);
   4224   D2Templated->setDescribedVarTemplate(D2);
   4225 
   4226   D2->setAccess(D->getAccess());
   4227   D2->setLexicalDeclContext(LexicalDC);
   4228   LexicalDC->addDeclInternal(D2);
   4229 
   4230   // Note the relationship between the variable templates.
   4231   Importer.Imported(D, D2);
   4232   Importer.Imported(DTemplated, D2Templated);
   4233 
   4234   if (DTemplated->isThisDeclarationADefinition() &&
   4235       !D2Templated->isThisDeclarationADefinition()) {
   4236     // FIXME: Import definition!
   4237   }
   4238 
   4239   return D2;
   4240 }
   4241 
   4242 Decl *ASTNodeImporter::VisitVarTemplateSpecializationDecl(
   4243     VarTemplateSpecializationDecl *D) {
   4244   // If this record has a definition in the translation unit we're coming from,
   4245   // but this particular declaration is not that definition, import the
   4246   // definition and map to that.
   4247   VarDecl *Definition = D->getDefinition();
   4248   if (Definition && Definition != D) {
   4249     Decl *ImportedDef = Importer.Import(Definition);
   4250     if (!ImportedDef)
   4251       return nullptr;
   4252 
   4253     return Importer.Imported(D, ImportedDef);
   4254   }
   4255 
   4256   VarTemplateDecl *VarTemplate = cast_or_null<VarTemplateDecl>(
   4257       Importer.Import(D->getSpecializedTemplate()));
   4258   if (!VarTemplate)
   4259     return nullptr;
   4260 
   4261   // Import the context of this declaration.
   4262   DeclContext *DC = VarTemplate->getDeclContext();
   4263   if (!DC)
   4264     return nullptr;
   4265 
   4266   DeclContext *LexicalDC = DC;
   4267   if (D->getDeclContext() != D->getLexicalDeclContext()) {
   4268     LexicalDC = Importer.ImportContext(D->getLexicalDeclContext());
   4269     if (!LexicalDC)
   4270       return nullptr;
   4271   }
   4272 
   4273   // Import the location of this declaration.
   4274   SourceLocation StartLoc = Importer.Import(D->getLocStart());
   4275   SourceLocation IdLoc = Importer.Import(D->getLocation());
   4276 
   4277   // Import template arguments.
   4278   SmallVector<TemplateArgument, 2> TemplateArgs;
   4279   if (ImportTemplateArguments(D->getTemplateArgs().data(),
   4280                               D->getTemplateArgs().size(), TemplateArgs))
   4281     return nullptr;
   4282 
   4283   // Try to find an existing specialization with these template arguments.
   4284   void *InsertPos = nullptr;
   4285   VarTemplateSpecializationDecl *D2 = VarTemplate->findSpecialization(
   4286       TemplateArgs, InsertPos);
   4287   if (D2) {
   4288     // We already have a variable template specialization with these template
   4289     // arguments.
   4290 
   4291     // FIXME: Check for specialization vs. instantiation errors.
   4292 
   4293     if (VarDecl *FoundDef = D2->getDefinition()) {
   4294       if (!D->isThisDeclarationADefinition() ||
   4295           IsStructuralMatch(D, FoundDef)) {
   4296         // The record types structurally match, or the "from" translation
   4297         // unit only had a forward declaration anyway; call it the same
   4298         // variable.
   4299         return Importer.Imported(D, FoundDef);
   4300       }
   4301     }
   4302   } else {
   4303 
   4304     // Import the type.
   4305     QualType T = Importer.Import(D->getType());
   4306     if (T.isNull())
   4307       return nullptr;
   4308     TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo());
   4309 
   4310     // Create a new specialization.
   4311     D2 = VarTemplateSpecializationDecl::Create(
   4312         Importer.getToContext(), DC, StartLoc, IdLoc, VarTemplate, T, TInfo,
   4313         D->getStorageClass(), TemplateArgs.data(), TemplateArgs.size());
   4314     D2->setSpecializationKind(D->getSpecializationKind());
   4315     D2->setTemplateArgsInfo(D->getTemplateArgsInfo());
   4316 
   4317     // Add this specialization to the class template.
   4318     VarTemplate->AddSpecialization(D2, InsertPos);
   4319 
   4320     // Import the qualifier, if any.
   4321     D2->setQualifierInfo(Importer.Import(D->getQualifierLoc()));
   4322 
   4323     // Add the specialization to this context.
   4324     D2->setLexicalDeclContext(LexicalDC);
   4325     LexicalDC->addDeclInternal(D2);
   4326   }
   4327   Importer.Imported(D, D2);
   4328 
   4329   if (D->isThisDeclarationADefinition() && ImportDefinition(D, D2))
   4330     return nullptr;
   4331 
   4332   return D2;
   4333 }
   4334 
   4335 //----------------------------------------------------------------------------
   4336 // Import Statements
   4337 //----------------------------------------------------------------------------
   4338 
   4339 Stmt *ASTNodeImporter::VisitStmt(Stmt *S) {
   4340   Importer.FromDiag(S->getLocStart(), diag::err_unsupported_ast_node)
   4341     << S->getStmtClassName();
   4342   return nullptr;
   4343 }
   4344 
   4345 //----------------------------------------------------------------------------
   4346 // Import Expressions
   4347 //----------------------------------------------------------------------------
   4348 Expr *ASTNodeImporter::VisitExpr(Expr *E) {
   4349   Importer.FromDiag(E->getLocStart(), diag::err_unsupported_ast_node)
   4350     << E->getStmtClassName();
   4351   return nullptr;
   4352 }
   4353 
   4354 Expr *ASTNodeImporter::VisitDeclRefExpr(DeclRefExpr *E) {
   4355   ValueDecl *ToD = cast_or_null<ValueDecl>(Importer.Import(E->getDecl()));
   4356   if (!ToD)
   4357     return nullptr;
   4358 
   4359   NamedDecl *FoundD = nullptr;
   4360   if (E->getDecl() != E->getFoundDecl()) {
   4361     FoundD = cast_or_null<NamedDecl>(Importer.Import(E->getFoundDecl()));
   4362     if (!FoundD)
   4363       return nullptr;
   4364   }
   4365 
   4366   QualType T = Importer.Import(E->getType());
   4367   if (T.isNull())
   4368     return nullptr;
   4369 
   4370   DeclRefExpr *DRE = DeclRefExpr::Create(Importer.getToContext(),
   4371                                          Importer.Import(E->getQualifierLoc()),
   4372                                    Importer.Import(E->getTemplateKeywordLoc()),
   4373                                          ToD,
   4374                                          E->refersToEnclosingLocal(),
   4375                                          Importer.Import(E->getLocation()),
   4376                                          T, E->getValueKind(),
   4377                                          FoundD,
   4378                                          /*FIXME:TemplateArgs=*/nullptr);
   4379   if (E->hadMultipleCandidates())
   4380     DRE->setHadMultipleCandidates(true);
   4381   return DRE;
   4382 }
   4383 
   4384 Expr *ASTNodeImporter::VisitIntegerLiteral(IntegerLiteral *E) {
   4385   QualType T = Importer.Import(E->getType());
   4386   if (T.isNull())
   4387     return nullptr;
   4388 
   4389   return IntegerLiteral::Create(Importer.getToContext(),
   4390                                 E->getValue(), T,
   4391                                 Importer.Import(E->getLocation()));
   4392 }
   4393 
   4394 Expr *ASTNodeImporter::VisitCharacterLiteral(CharacterLiteral *E) {
   4395   QualType T = Importer.Import(E->getType());
   4396   if (T.isNull())
   4397     return nullptr;
   4398 
   4399   return new (Importer.getToContext()) CharacterLiteral(E->getValue(),
   4400                                                         E->getKind(), T,
   4401                                           Importer.Import(E->getLocation()));
   4402 }
   4403 
   4404 Expr *ASTNodeImporter::VisitParenExpr(ParenExpr *E) {
   4405   Expr *SubExpr = Importer.Import(E->getSubExpr());
   4406   if (!SubExpr)
   4407     return nullptr;
   4408 
   4409   return new (Importer.getToContext())
   4410                                   ParenExpr(Importer.Import(E->getLParen()),
   4411                                             Importer.Import(E->getRParen()),
   4412                                             SubExpr);
   4413 }
   4414 
   4415 Expr *ASTNodeImporter::VisitUnaryOperator(UnaryOperator *E) {
   4416   QualType T = Importer.Import(E->getType());
   4417   if (T.isNull())
   4418     return nullptr;
   4419 
   4420   Expr *SubExpr = Importer.Import(E->getSubExpr());
   4421   if (!SubExpr)
   4422     return nullptr;
   4423 
   4424   return new (Importer.getToContext()) UnaryOperator(SubExpr, E->getOpcode(),
   4425                                                      T, E->getValueKind(),
   4426                                                      E->getObjectKind(),
   4427                                          Importer.Import(E->getOperatorLoc()));
   4428 }
   4429 
   4430 Expr *ASTNodeImporter::VisitUnaryExprOrTypeTraitExpr(
   4431                                             UnaryExprOrTypeTraitExpr *E) {
   4432   QualType ResultType = Importer.Import(E->getType());
   4433 
   4434   if (E->isArgumentType()) {
   4435     TypeSourceInfo *TInfo = Importer.Import(E->getArgumentTypeInfo());
   4436     if (!TInfo)
   4437       return nullptr;
   4438 
   4439     return new (Importer.getToContext()) UnaryExprOrTypeTraitExpr(E->getKind(),
   4440                                            TInfo, ResultType,
   4441                                            Importer.Import(E->getOperatorLoc()),
   4442                                            Importer.Import(E->getRParenLoc()));
   4443   }
   4444 
   4445   Expr *SubExpr = Importer.Import(E->getArgumentExpr());
   4446   if (!SubExpr)
   4447     return nullptr;
   4448 
   4449   return new (Importer.getToContext()) UnaryExprOrTypeTraitExpr(E->getKind(),
   4450                                           SubExpr, ResultType,
   4451                                           Importer.Import(E->getOperatorLoc()),
   4452                                           Importer.Import(E->getRParenLoc()));
   4453 }
   4454 
   4455 Expr *ASTNodeImporter::VisitBinaryOperator(BinaryOperator *E) {
   4456   QualType T = Importer.Import(E->getType());
   4457   if (T.isNull())
   4458     return nullptr;
   4459 
   4460   Expr *LHS = Importer.Import(E->getLHS());
   4461   if (!LHS)
   4462     return nullptr;
   4463 
   4464   Expr *RHS = Importer.Import(E->getRHS());
   4465   if (!RHS)
   4466     return nullptr;
   4467 
   4468   return new (Importer.getToContext()) BinaryOperator(LHS, RHS, E->getOpcode(),
   4469                                                       T, E->getValueKind(),
   4470                                                       E->getObjectKind(),
   4471                                            Importer.Import(E->getOperatorLoc()),
   4472                                                       E->isFPContractable());
   4473 }
   4474 
   4475 Expr *ASTNodeImporter::VisitCompoundAssignOperator(CompoundAssignOperator *E) {
   4476   QualType T = Importer.Import(E->getType());
   4477   if (T.isNull())
   4478     return nullptr;
   4479 
   4480   QualType CompLHSType = Importer.Import(E->getComputationLHSType());
   4481   if (CompLHSType.isNull())
   4482     return nullptr;
   4483 
   4484   QualType CompResultType = Importer.Import(E->getComputationResultType());
   4485   if (CompResultType.isNull())
   4486     return nullptr;
   4487 
   4488   Expr *LHS = Importer.Import(E->getLHS());
   4489   if (!LHS)
   4490     return nullptr;
   4491 
   4492   Expr *RHS = Importer.Import(E->getRHS());
   4493   if (!RHS)
   4494     return nullptr;
   4495 
   4496   return new (Importer.getToContext())
   4497                         CompoundAssignOperator(LHS, RHS, E->getOpcode(),
   4498                                                T, E->getValueKind(),
   4499                                                E->getObjectKind(),
   4500                                                CompLHSType, CompResultType,
   4501                                            Importer.Import(E->getOperatorLoc()),
   4502                                                E->isFPContractable());
   4503 }
   4504 
   4505 static bool ImportCastPath(CastExpr *E, CXXCastPath &Path) {
   4506   if (E->path_empty()) return false;
   4507 
   4508   // TODO: import cast paths
   4509   return true;
   4510 }
   4511 
   4512 Expr *ASTNodeImporter::VisitImplicitCastExpr(ImplicitCastExpr *E) {
   4513   QualType T = Importer.Import(E->getType());
   4514   if (T.isNull())
   4515     return nullptr;
   4516 
   4517   Expr *SubExpr = Importer.Import(E->getSubExpr());
   4518   if (!SubExpr)
   4519     return nullptr;
   4520 
   4521   CXXCastPath BasePath;
   4522   if (ImportCastPath(E, BasePath))
   4523     return nullptr;
   4524 
   4525   return ImplicitCastExpr::Create(Importer.getToContext(), T, E->getCastKind(),
   4526                                   SubExpr, &BasePath, E->getValueKind());
   4527 }
   4528 
   4529 Expr *ASTNodeImporter::VisitCStyleCastExpr(CStyleCastExpr *E) {
   4530   QualType T = Importer.Import(E->getType());
   4531   if (T.isNull())
   4532     return nullptr;
   4533 
   4534   Expr *SubExpr = Importer.Import(E->getSubExpr());
   4535   if (!SubExpr)
   4536     return nullptr;
   4537 
   4538   TypeSourceInfo *TInfo = Importer.Import(E->getTypeInfoAsWritten());
   4539   if (!TInfo && E->getTypeInfoAsWritten())
   4540     return nullptr;
   4541 
   4542   CXXCastPath BasePath;
   4543   if (ImportCastPath(E, BasePath))
   4544     return nullptr;
   4545 
   4546   return CStyleCastExpr::Create(Importer.getToContext(), T,
   4547                                 E->getValueKind(), E->getCastKind(),
   4548                                 SubExpr, &BasePath, TInfo,
   4549                                 Importer.Import(E->getLParenLoc()),
   4550                                 Importer.Import(E->getRParenLoc()));
   4551 }
   4552 
   4553 ASTImporter::ASTImporter(ASTContext &ToContext, FileManager &ToFileManager,
   4554                          ASTContext &FromContext, FileManager &FromFileManager,
   4555                          bool MinimalImport)
   4556   : ToContext(ToContext), FromContext(FromContext),
   4557     ToFileManager(ToFileManager), FromFileManager(FromFileManager),
   4558     Minimal(MinimalImport), LastDiagFromFrom(false)
   4559 {
   4560   ImportedDecls[FromContext.getTranslationUnitDecl()]
   4561     = ToContext.getTranslationUnitDecl();
   4562 }
   4563 
   4564 ASTImporter::~ASTImporter() { }
   4565 
   4566 QualType ASTImporter::Import(QualType FromT) {
   4567   if (FromT.isNull())
   4568     return QualType();
   4569 
   4570   const Type *fromTy = FromT.getTypePtr();
   4571 
   4572   // Check whether we've already imported this type.
   4573   llvm::DenseMap<const Type *, const Type *>::iterator Pos
   4574     = ImportedTypes.find(fromTy);
   4575   if (Pos != ImportedTypes.end())
   4576     return ToContext.getQualifiedType(Pos->second, FromT.getLocalQualifiers());
   4577 
   4578   // Import the type
   4579   ASTNodeImporter Importer(*this);
   4580   QualType ToT = Importer.Visit(fromTy);
   4581   if (ToT.isNull())
   4582     return ToT;
   4583 
   4584   // Record the imported type.
   4585   ImportedTypes[fromTy] = ToT.getTypePtr();
   4586 
   4587   return ToContext.getQualifiedType(ToT, FromT.getLocalQualifiers());
   4588 }
   4589 
   4590 TypeSourceInfo *ASTImporter::Import(TypeSourceInfo *FromTSI) {
   4591   if (!FromTSI)
   4592     return FromTSI;
   4593 
   4594   // FIXME: For now we just create a "trivial" type source info based
   4595   // on the type and a single location. Implement a real version of this.
   4596   QualType T = Import(FromTSI->getType());
   4597   if (T.isNull())
   4598     return nullptr;
   4599 
   4600   return ToContext.getTrivialTypeSourceInfo(T,
   4601                         FromTSI->getTypeLoc().getLocStart());
   4602 }
   4603 
   4604 Decl *ASTImporter::Import(Decl *FromD) {
   4605   if (!FromD)
   4606     return nullptr;
   4607 
   4608   ASTNodeImporter Importer(*this);
   4609 
   4610   // Check whether we've already imported this declaration.
   4611   llvm::DenseMap<Decl *, Decl *>::iterator Pos = ImportedDecls.find(FromD);
   4612   if (Pos != ImportedDecls.end()) {
   4613     Decl *ToD = Pos->second;
   4614     Importer.ImportDefinitionIfNeeded(FromD, ToD);
   4615     return ToD;
   4616   }
   4617 
   4618   // Import the type
   4619   Decl *ToD = Importer.Visit(FromD);
   4620   if (!ToD)
   4621     return nullptr;
   4622 
   4623   // Record the imported declaration.
   4624   ImportedDecls[FromD] = ToD;
   4625 
   4626   if (TagDecl *FromTag = dyn_cast<TagDecl>(FromD)) {
   4627     // Keep track of anonymous tags that have an associated typedef.
   4628     if (FromTag->getTypedefNameForAnonDecl())
   4629       AnonTagsWithPendingTypedefs.push_back(FromTag);
   4630   } else if (TypedefNameDecl *FromTypedef = dyn_cast<TypedefNameDecl>(FromD)) {
   4631     // When we've finished transforming a typedef, see whether it was the
   4632     // typedef for an anonymous tag.
   4633     for (SmallVectorImpl<TagDecl *>::iterator
   4634                FromTag = AnonTagsWithPendingTypedefs.begin(),
   4635             FromTagEnd = AnonTagsWithPendingTypedefs.end();
   4636          FromTag != FromTagEnd; ++FromTag) {
   4637       if ((*FromTag)->getTypedefNameForAnonDecl() == FromTypedef) {
   4638         if (TagDecl *ToTag = cast_or_null<TagDecl>(Import(*FromTag))) {
   4639           // We found the typedef for an anonymous tag; link them.
   4640           ToTag->setTypedefNameForAnonDecl(cast<TypedefNameDecl>(ToD));
   4641           AnonTagsWithPendingTypedefs.erase(FromTag);
   4642           break;
   4643         }
   4644       }
   4645     }
   4646   }
   4647 
   4648   return ToD;
   4649 }
   4650 
   4651 DeclContext *ASTImporter::ImportContext(DeclContext *FromDC) {
   4652   if (!FromDC)
   4653     return FromDC;
   4654 
   4655   DeclContext *ToDC = cast_or_null<DeclContext>(Import(cast<Decl>(FromDC)));
   4656   if (!ToDC)
   4657     return nullptr;
   4658 
   4659   // When we're using a record/enum/Objective-C class/protocol as a context, we
   4660   // need it to have a definition.
   4661   if (RecordDecl *ToRecord = dyn_cast<RecordDecl>(ToDC)) {
   4662     RecordDecl *FromRecord = cast<RecordDecl>(FromDC);
   4663     if (ToRecord->isCompleteDefinition()) {
   4664       // Do nothing.
   4665     } else if (FromRecord->isCompleteDefinition()) {
   4666       ASTNodeImporter(*this).ImportDefinition(FromRecord, ToRecord,
   4667                                               ASTNodeImporter::IDK_Basic);
   4668     } else {
   4669       CompleteDecl(ToRecord);
   4670     }
   4671   } else if (EnumDecl *ToEnum = dyn_cast<EnumDecl>(ToDC)) {
   4672     EnumDecl *FromEnum = cast<EnumDecl>(FromDC);
   4673     if (ToEnum->isCompleteDefinition()) {
   4674       // Do nothing.
   4675     } else if (FromEnum->isCompleteDefinition()) {
   4676       ASTNodeImporter(*this).ImportDefinition(FromEnum, ToEnum,
   4677                                               ASTNodeImporter::IDK_Basic);
   4678     } else {
   4679       CompleteDecl(ToEnum);
   4680     }
   4681   } else if (ObjCInterfaceDecl *ToClass = dyn_cast<ObjCInterfaceDecl>(ToDC)) {
   4682     ObjCInterfaceDecl *FromClass = cast<ObjCInterfaceDecl>(FromDC);
   4683     if (ToClass->getDefinition()) {
   4684       // Do nothing.
   4685     } else if (ObjCInterfaceDecl *FromDef = FromClass->getDefinition()) {
   4686       ASTNodeImporter(*this).ImportDefinition(FromDef, ToClass,
   4687                                               ASTNodeImporter::IDK_Basic);
   4688     } else {
   4689       CompleteDecl(ToClass);
   4690     }
   4691   } else if (ObjCProtocolDecl *ToProto = dyn_cast<ObjCProtocolDecl>(ToDC)) {
   4692     ObjCProtocolDecl *FromProto = cast<ObjCProtocolDecl>(FromDC);
   4693     if (ToProto->getDefinition()) {
   4694       // Do nothing.
   4695     } else if (ObjCProtocolDecl *FromDef = FromProto->getDefinition()) {
   4696       ASTNodeImporter(*this).ImportDefinition(FromDef, ToProto,
   4697                                               ASTNodeImporter::IDK_Basic);
   4698     } else {
   4699       CompleteDecl(ToProto);
   4700     }
   4701   }
   4702 
   4703   return ToDC;
   4704 }
   4705 
   4706 Expr *ASTImporter::Import(Expr *FromE) {
   4707   if (!FromE)
   4708     return nullptr;
   4709 
   4710   return cast_or_null<Expr>(Import(cast<Stmt>(FromE)));
   4711 }
   4712 
   4713 Stmt *ASTImporter::Import(Stmt *FromS) {
   4714   if (!FromS)
   4715     return nullptr;
   4716 
   4717   // Check whether we've already imported this declaration.
   4718   llvm::DenseMap<Stmt *, Stmt *>::iterator Pos = ImportedStmts.find(FromS);
   4719   if (Pos != ImportedStmts.end())
   4720     return Pos->second;
   4721 
   4722   // Import the type
   4723   ASTNodeImporter Importer(*this);
   4724   Stmt *ToS = Importer.Visit(FromS);
   4725   if (!ToS)
   4726     return nullptr;
   4727 
   4728   // Record the imported declaration.
   4729   ImportedStmts[FromS] = ToS;
   4730   return ToS;
   4731 }
   4732 
   4733 NestedNameSpecifier *ASTImporter::Import(NestedNameSpecifier *FromNNS) {
   4734   if (!FromNNS)
   4735     return nullptr;
   4736 
   4737   NestedNameSpecifier *prefix = Import(FromNNS->getPrefix());
   4738 
   4739   switch (FromNNS->getKind()) {
   4740   case NestedNameSpecifier::Identifier:
   4741     if (IdentifierInfo *II = Import(FromNNS->getAsIdentifier())) {
   4742       return NestedNameSpecifier::Create(ToContext, prefix, II);
   4743     }
   4744     return nullptr;
   4745 
   4746   case NestedNameSpecifier::Namespace:
   4747     if (NamespaceDecl *NS =
   4748           cast<NamespaceDecl>(Import(FromNNS->getAsNamespace()))) {
   4749       return NestedNameSpecifier::Create(ToContext, prefix, NS);
   4750     }
   4751     return nullptr;
   4752 
   4753   case NestedNameSpecifier::NamespaceAlias:
   4754     if (NamespaceAliasDecl *NSAD =
   4755           cast<NamespaceAliasDecl>(Import(FromNNS->getAsNamespaceAlias()))) {
   4756       return NestedNameSpecifier::Create(ToContext, prefix, NSAD);
   4757     }
   4758     return nullptr;
   4759 
   4760   case NestedNameSpecifier::Global:
   4761     return NestedNameSpecifier::GlobalSpecifier(ToContext);
   4762 
   4763   case NestedNameSpecifier::TypeSpec:
   4764   case NestedNameSpecifier::TypeSpecWithTemplate: {
   4765       QualType T = Import(QualType(FromNNS->getAsType(), 0u));
   4766       if (!T.isNull()) {
   4767         bool bTemplate = FromNNS->getKind() ==
   4768                          NestedNameSpecifier::TypeSpecWithTemplate;
   4769         return NestedNameSpecifier::Create(ToContext, prefix,
   4770                                            bTemplate, T.getTypePtr());
   4771       }
   4772     }
   4773       return nullptr;
   4774   }
   4775 
   4776   llvm_unreachable("Invalid nested name specifier kind");
   4777 }
   4778 
   4779 NestedNameSpecifierLoc ASTImporter::Import(NestedNameSpecifierLoc FromNNS) {
   4780   // FIXME: Implement!
   4781   return NestedNameSpecifierLoc();
   4782 }
   4783 
   4784 TemplateName ASTImporter::Import(TemplateName From) {
   4785   switch (From.getKind()) {
   4786   case TemplateName::Template:
   4787     if (TemplateDecl *ToTemplate
   4788                 = cast_or_null<TemplateDecl>(Import(From.getAsTemplateDecl())))
   4789       return TemplateName(ToTemplate);
   4790 
   4791     return TemplateName();
   4792 
   4793   case TemplateName::OverloadedTemplate: {
   4794     OverloadedTemplateStorage *FromStorage = From.getAsOverloadedTemplate();
   4795     UnresolvedSet<2> ToTemplates;
   4796     for (OverloadedTemplateStorage::iterator I = FromStorage->begin(),
   4797                                              E = FromStorage->end();
   4798          I != E; ++I) {
   4799       if (NamedDecl *To = cast_or_null<NamedDecl>(Import(*I)))
   4800         ToTemplates.addDecl(To);
   4801       else
   4802         return TemplateName();
   4803     }
   4804     return ToContext.getOverloadedTemplateName(ToTemplates.begin(),
   4805                                                ToTemplates.end());
   4806   }
   4807 
   4808   case TemplateName::QualifiedTemplate: {
   4809     QualifiedTemplateName *QTN = From.getAsQualifiedTemplateName();
   4810     NestedNameSpecifier *Qualifier = Import(QTN->getQualifier());
   4811     if (!Qualifier)
   4812       return TemplateName();
   4813 
   4814     if (TemplateDecl *ToTemplate
   4815         = cast_or_null<TemplateDecl>(Import(From.getAsTemplateDecl())))
   4816       return ToContext.getQualifiedTemplateName(Qualifier,
   4817                                                 QTN->hasTemplateKeyword(),
   4818                                                 ToTemplate);
   4819 
   4820     return TemplateName();
   4821   }
   4822 
   4823   case TemplateName::DependentTemplate: {
   4824     DependentTemplateName *DTN = From.getAsDependentTemplateName();
   4825     NestedNameSpecifier *Qualifier = Import(DTN->getQualifier());
   4826     if (!Qualifier)
   4827       return TemplateName();
   4828 
   4829     if (DTN->isIdentifier()) {
   4830       return ToContext.getDependentTemplateName(Qualifier,
   4831                                                 Import(DTN->getIdentifier()));
   4832     }
   4833 
   4834     return ToContext.getDependentTemplateName(Qualifier, DTN->getOperator());
   4835   }
   4836 
   4837   case TemplateName::SubstTemplateTemplateParm: {
   4838     SubstTemplateTemplateParmStorage *subst
   4839       = From.getAsSubstTemplateTemplateParm();
   4840     TemplateTemplateParmDecl *param
   4841       = cast_or_null<TemplateTemplateParmDecl>(Import(subst->getParameter()));
   4842     if (!param)
   4843       return TemplateName();
   4844 
   4845     TemplateName replacement = Import(subst->getReplacement());
   4846     if (replacement.isNull()) return TemplateName();
   4847 
   4848     return ToContext.getSubstTemplateTemplateParm(param, replacement);
   4849   }
   4850 
   4851   case TemplateName::SubstTemplateTemplateParmPack: {
   4852     SubstTemplateTemplateParmPackStorage *SubstPack
   4853       = From.getAsSubstTemplateTemplateParmPack();
   4854     TemplateTemplateParmDecl *Param
   4855       = cast_or_null<TemplateTemplateParmDecl>(
   4856                                         Import(SubstPack->getParameterPack()));
   4857     if (!Param)
   4858       return TemplateName();
   4859 
   4860     ASTNodeImporter Importer(*this);
   4861     TemplateArgument ArgPack
   4862       = Importer.ImportTemplateArgument(SubstPack->getArgumentPack());
   4863     if (ArgPack.isNull())
   4864       return TemplateName();
   4865 
   4866     return ToContext.getSubstTemplateTemplateParmPack(Param, ArgPack);
   4867   }
   4868   }
   4869 
   4870   llvm_unreachable("Invalid template name kind");
   4871 }
   4872 
   4873 SourceLocation ASTImporter::Import(SourceLocation FromLoc) {
   4874   if (FromLoc.isInvalid())
   4875     return SourceLocation();
   4876 
   4877   SourceManager &FromSM = FromContext.getSourceManager();
   4878 
   4879   // For now, map everything down to its spelling location, so that we
   4880   // don't have to import macro expansions.
   4881   // FIXME: Import macro expansions!
   4882   FromLoc = FromSM.getSpellingLoc(FromLoc);
   4883   std::pair<FileID, unsigned> Decomposed = FromSM.getDecomposedLoc(FromLoc);
   4884   SourceManager &ToSM = ToContext.getSourceManager();
   4885   return ToSM.getLocForStartOfFile(Import(Decomposed.first))
   4886              .getLocWithOffset(Decomposed.second);
   4887 }
   4888 
   4889 SourceRange ASTImporter::Import(SourceRange FromRange) {
   4890   return SourceRange(Import(FromRange.getBegin()), Import(FromRange.getEnd()));
   4891 }
   4892 
   4893 FileID ASTImporter::Import(FileID FromID) {
   4894   llvm::DenseMap<FileID, FileID>::iterator Pos
   4895     = ImportedFileIDs.find(FromID);
   4896   if (Pos != ImportedFileIDs.end())
   4897     return Pos->second;
   4898 
   4899   SourceManager &FromSM = FromContext.getSourceManager();
   4900   SourceManager &ToSM = ToContext.getSourceManager();
   4901   const SrcMgr::SLocEntry &FromSLoc = FromSM.getSLocEntry(FromID);
   4902   assert(FromSLoc.isFile() && "Cannot handle macro expansions yet");
   4903 
   4904   // Include location of this file.
   4905   SourceLocation ToIncludeLoc = Import(FromSLoc.getFile().getIncludeLoc());
   4906 
   4907   // Map the FileID for to the "to" source manager.
   4908   FileID ToID;
   4909   const SrcMgr::ContentCache *Cache = FromSLoc.getFile().getContentCache();
   4910   if (Cache->OrigEntry) {
   4911     // FIXME: We probably want to use getVirtualFile(), so we don't hit the
   4912     // disk again
   4913     // FIXME: We definitely want to re-use the existing MemoryBuffer, rather
   4914     // than mmap the files several times.
   4915     const FileEntry *Entry = ToFileManager.getFile(Cache->OrigEntry->getName());
   4916     ToID = ToSM.createFileID(Entry, ToIncludeLoc,
   4917                              FromSLoc.getFile().getFileCharacteristic());
   4918   } else {
   4919     // FIXME: We want to re-use the existing MemoryBuffer!
   4920     const llvm::MemoryBuffer *
   4921         FromBuf = Cache->getBuffer(FromContext.getDiagnostics(), FromSM);
   4922     llvm::MemoryBuffer *ToBuf
   4923       = llvm::MemoryBuffer::getMemBufferCopy(FromBuf->getBuffer(),
   4924                                              FromBuf->getBufferIdentifier());
   4925     ToID = ToSM.createFileID(ToBuf, FromSLoc.getFile().getFileCharacteristic());
   4926   }
   4927 
   4928 
   4929   ImportedFileIDs[FromID] = ToID;
   4930   return ToID;
   4931 }
   4932 
   4933 void ASTImporter::ImportDefinition(Decl *From) {
   4934   Decl *To = Import(From);
   4935   if (!To)
   4936     return;
   4937 
   4938   if (DeclContext *FromDC = cast<DeclContext>(From)) {
   4939     ASTNodeImporter Importer(*this);
   4940 
   4941     if (RecordDecl *ToRecord = dyn_cast<RecordDecl>(To)) {
   4942       if (!ToRecord->getDefinition()) {
   4943         Importer.ImportDefinition(cast<RecordDecl>(FromDC), ToRecord,
   4944                                   ASTNodeImporter::IDK_Everything);
   4945         return;
   4946       }
   4947     }
   4948 
   4949     if (EnumDecl *ToEnum = dyn_cast<EnumDecl>(To)) {
   4950       if (!ToEnum->getDefinition()) {
   4951         Importer.ImportDefinition(cast<EnumDecl>(FromDC), ToEnum,
   4952                                   ASTNodeImporter::IDK_Everything);
   4953         return;
   4954       }
   4955     }
   4956 
   4957     if (ObjCInterfaceDecl *ToIFace = dyn_cast<ObjCInterfaceDecl>(To)) {
   4958       if (!ToIFace->getDefinition()) {
   4959         Importer.ImportDefinition(cast<ObjCInterfaceDecl>(FromDC), ToIFace,
   4960                                   ASTNodeImporter::IDK_Everything);
   4961         return;
   4962       }
   4963     }
   4964 
   4965     if (ObjCProtocolDecl *ToProto = dyn_cast<ObjCProtocolDecl>(To)) {
   4966       if (!ToProto->getDefinition()) {
   4967         Importer.ImportDefinition(cast<ObjCProtocolDecl>(FromDC), ToProto,
   4968                                   ASTNodeImporter::IDK_Everything);
   4969         return;
   4970       }
   4971     }
   4972 
   4973     Importer.ImportDeclContext(FromDC, true);
   4974   }
   4975 }
   4976 
   4977 DeclarationName ASTImporter::Import(DeclarationName FromName) {
   4978   if (!FromName)
   4979     return DeclarationName();
   4980 
   4981   switch (FromName.getNameKind()) {
   4982   case DeclarationName::Identifier:
   4983     return Import(FromName.getAsIdentifierInfo());
   4984 
   4985   case DeclarationName::ObjCZeroArgSelector:
   4986   case DeclarationName::ObjCOneArgSelector:
   4987   case DeclarationName::ObjCMultiArgSelector:
   4988     return Import(FromName.getObjCSelector());
   4989 
   4990   case DeclarationName::CXXConstructorName: {
   4991     QualType T = Import(FromName.getCXXNameType());
   4992     if (T.isNull())
   4993       return DeclarationName();
   4994 
   4995     return ToContext.DeclarationNames.getCXXConstructorName(
   4996                                                ToContext.getCanonicalType(T));
   4997   }
   4998 
   4999   case DeclarationName::CXXDestructorName: {
   5000     QualType T = Import(FromName.getCXXNameType());
   5001     if (T.isNull())
   5002       return DeclarationName();
   5003 
   5004     return ToContext.DeclarationNames.getCXXDestructorName(
   5005                                                ToContext.getCanonicalType(T));
   5006   }
   5007 
   5008   case DeclarationName::CXXConversionFunctionName: {
   5009     QualType T = Import(FromName.getCXXNameType());
   5010     if (T.isNull())
   5011       return DeclarationName();
   5012 
   5013     return ToContext.DeclarationNames.getCXXConversionFunctionName(
   5014                                                ToContext.getCanonicalType(T));
   5015   }
   5016 
   5017   case DeclarationName::CXXOperatorName:
   5018     return ToContext.DeclarationNames.getCXXOperatorName(
   5019                                           FromName.getCXXOverloadedOperator());
   5020 
   5021   case DeclarationName::CXXLiteralOperatorName:
   5022     return ToContext.DeclarationNames.getCXXLiteralOperatorName(
   5023                                    Import(FromName.getCXXLiteralIdentifier()));
   5024 
   5025   case DeclarationName::CXXUsingDirective:
   5026     // FIXME: STATICS!
   5027     return DeclarationName::getUsingDirectiveName();
   5028   }
   5029 
   5030   llvm_unreachable("Invalid DeclarationName Kind!");
   5031 }
   5032 
   5033 IdentifierInfo *ASTImporter::Import(const IdentifierInfo *FromId) {
   5034   if (!FromId)
   5035     return nullptr;
   5036 
   5037   return &ToContext.Idents.get(FromId->getName());
   5038 }
   5039 
   5040 Selector ASTImporter::Import(Selector FromSel) {
   5041   if (FromSel.isNull())
   5042     return Selector();
   5043 
   5044   SmallVector<IdentifierInfo *, 4> Idents;
   5045   Idents.push_back(Import(FromSel.getIdentifierInfoForSlot(0)));
   5046   for (unsigned I = 1, N = FromSel.getNumArgs(); I < N; ++I)
   5047     Idents.push_back(Import(FromSel.getIdentifierInfoForSlot(I)));
   5048   return ToContext.Selectors.getSelector(FromSel.getNumArgs(), Idents.data());
   5049 }
   5050 
   5051 DeclarationName ASTImporter::HandleNameConflict(DeclarationName Name,
   5052                                                 DeclContext *DC,
   5053                                                 unsigned IDNS,
   5054                                                 NamedDecl **Decls,
   5055                                                 unsigned NumDecls) {
   5056   return Name;
   5057 }
   5058 
   5059 DiagnosticBuilder ASTImporter::ToDiag(SourceLocation Loc, unsigned DiagID) {
   5060   if (LastDiagFromFrom)
   5061     ToContext.getDiagnostics().notePriorDiagnosticFrom(
   5062       FromContext.getDiagnostics());
   5063   LastDiagFromFrom = false;
   5064   return ToContext.getDiagnostics().Report(Loc, DiagID);
   5065 }
   5066 
   5067 DiagnosticBuilder ASTImporter::FromDiag(SourceLocation Loc, unsigned DiagID) {
   5068   if (!LastDiagFromFrom)
   5069     FromContext.getDiagnostics().notePriorDiagnosticFrom(
   5070       ToContext.getDiagnostics());
   5071   LastDiagFromFrom = true;
   5072   return FromContext.getDiagnostics().Report(Loc, DiagID);
   5073 }
   5074 
   5075 void ASTImporter::CompleteDecl (Decl *D) {
   5076   if (ObjCInterfaceDecl *ID = dyn_cast<ObjCInterfaceDecl>(D)) {
   5077     if (!ID->getDefinition())
   5078       ID->startDefinition();
   5079   }
   5080   else if (ObjCProtocolDecl *PD = dyn_cast<ObjCProtocolDecl>(D)) {
   5081     if (!PD->getDefinition())
   5082       PD->startDefinition();
   5083   }
   5084   else if (TagDecl *TD = dyn_cast<TagDecl>(D)) {
   5085     if (!TD->getDefinition() && !TD->isBeingDefined()) {
   5086       TD->startDefinition();
   5087       TD->setCompleteDefinition(true);
   5088     }
   5089   }
   5090   else {
   5091     assert (0 && "CompleteDecl called on a Decl that can't be completed");
   5092   }
   5093 }
   5094 
   5095 Decl *ASTImporter::Imported(Decl *From, Decl *To) {
   5096   ImportedDecls[From] = To;
   5097   return To;
   5098 }
   5099 
   5100 bool ASTImporter::IsStructurallyEquivalent(QualType From, QualType To,
   5101                                            bool Complain) {
   5102   llvm::DenseMap<const Type *, const Type *>::iterator Pos
   5103    = ImportedTypes.find(From.getTypePtr());
   5104   if (Pos != ImportedTypes.end() && ToContext.hasSameType(Import(From), To))
   5105     return true;
   5106 
   5107   StructuralEquivalenceContext Ctx(FromContext, ToContext, NonEquivalentDecls,
   5108                                    false, Complain);
   5109   return Ctx.IsStructurallyEquivalent(From, To);
   5110 }
   5111