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 VisitAtomicType(const AtomicType *T);
43     QualType VisitBuiltinType(const BuiltinType *T);
44     QualType VisitDecayedType(const DecayedType *T);
45     QualType VisitComplexType(const ComplexType *T);
46     QualType VisitPointerType(const PointerType *T);
47     QualType VisitBlockPointerType(const BlockPointerType *T);
48     QualType VisitLValueReferenceType(const LValueReferenceType *T);
49     QualType VisitRValueReferenceType(const RValueReferenceType *T);
50     QualType VisitMemberPointerType(const MemberPointerType *T);
51     QualType VisitConstantArrayType(const ConstantArrayType *T);
52     QualType VisitIncompleteArrayType(const IncompleteArrayType *T);
53     QualType VisitVariableArrayType(const VariableArrayType *T);
54     // FIXME: DependentSizedArrayType
55     // FIXME: DependentSizedExtVectorType
56     QualType VisitVectorType(const VectorType *T);
57     QualType VisitExtVectorType(const ExtVectorType *T);
58     QualType VisitFunctionNoProtoType(const FunctionNoProtoType *T);
59     QualType VisitFunctionProtoType(const FunctionProtoType *T);
60     // FIXME: UnresolvedUsingType
61     QualType VisitParenType(const ParenType *T);
62     QualType VisitTypedefType(const TypedefType *T);
63     QualType VisitTypeOfExprType(const TypeOfExprType *T);
64     // FIXME: DependentTypeOfExprType
65     QualType VisitTypeOfType(const TypeOfType *T);
66     QualType VisitDecltypeType(const DecltypeType *T);
67     QualType VisitUnaryTransformType(const UnaryTransformType *T);
68     QualType VisitAutoType(const AutoType *T);
69     QualType VisitInjectedClassNameType(const InjectedClassNameType *T);
70     // FIXME: DependentDecltypeType
71     QualType VisitRecordType(const RecordType *T);
72     QualType VisitEnumType(const EnumType *T);
73     QualType VisitAttributedType(const AttributedType *T);
74     QualType VisitTemplateTypeParmType(const TemplateTypeParmType *T);
75     QualType VisitSubstTemplateTypeParmType(const SubstTemplateTypeParmType *T);
76     QualType VisitTemplateSpecializationType(const TemplateSpecializationType *T);
77     QualType VisitElaboratedType(const ElaboratedType *T);
78     // FIXME: DependentNameType
79     // FIXME: DependentTemplateSpecializationType
80     QualType VisitObjCInterfaceType(const ObjCInterfaceType *T);
81     QualType VisitObjCObjectType(const ObjCObjectType *T);
82     QualType VisitObjCObjectPointerType(const ObjCObjectPointerType *T);
83 
84     // Importing declarations
85     bool ImportDeclParts(NamedDecl *D, DeclContext *&DC,
86                          DeclContext *&LexicalDC, DeclarationName &Name,
87                          NamedDecl *&ToD, SourceLocation &Loc);
88     void ImportDefinitionIfNeeded(Decl *FromD, Decl *ToD = nullptr);
89     void ImportDeclarationNameLoc(const DeclarationNameInfo &From,
90                                   DeclarationNameInfo& To);
91     void ImportDeclContext(DeclContext *FromDC, bool ForceImport = false);
92 
93     bool ImportCastPath(CastExpr *E, CXXCastPath &Path);
94 
95     typedef DesignatedInitExpr::Designator Designator;
96     Designator ImportDesignator(const Designator &D);
97 
98 
99     /// \brief What we should import from the definition.
100     enum ImportDefinitionKind {
101       /// \brief Import the default subset of the definition, which might be
102       /// nothing (if minimal import is set) or might be everything (if minimal
103       /// import is not set).
104       IDK_Default,
105       /// \brief Import everything.
106       IDK_Everything,
107       /// \brief Import only the bare bones needed to establish a valid
108       /// DeclContext.
109       IDK_Basic
110     };
111 
112     bool shouldForceImportDeclContext(ImportDefinitionKind IDK) {
113       return IDK == IDK_Everything ||
114              (IDK == IDK_Default && !Importer.isMinimalImport());
115     }
116 
117     bool ImportDefinition(RecordDecl *From, RecordDecl *To,
118                           ImportDefinitionKind Kind = IDK_Default);
119     bool ImportDefinition(VarDecl *From, VarDecl *To,
120                           ImportDefinitionKind Kind = IDK_Default);
121     bool ImportDefinition(EnumDecl *From, EnumDecl *To,
122                           ImportDefinitionKind Kind = IDK_Default);
123     bool ImportDefinition(ObjCInterfaceDecl *From, ObjCInterfaceDecl *To,
124                           ImportDefinitionKind Kind = IDK_Default);
125     bool ImportDefinition(ObjCProtocolDecl *From, ObjCProtocolDecl *To,
126                           ImportDefinitionKind Kind = IDK_Default);
127     TemplateParameterList *ImportTemplateParameterList(
128                                                  TemplateParameterList *Params);
129     TemplateArgument ImportTemplateArgument(const TemplateArgument &From);
130     TemplateArgumentLoc ImportTemplateArgumentLoc(
131         const TemplateArgumentLoc &TALoc, bool &Error);
132     bool ImportTemplateArguments(const TemplateArgument *FromArgs,
133                                  unsigned NumFromArgs,
134                                SmallVectorImpl<TemplateArgument> &ToArgs);
135     bool IsStructuralMatch(RecordDecl *FromRecord, RecordDecl *ToRecord,
136                            bool Complain = true);
137     bool IsStructuralMatch(VarDecl *FromVar, VarDecl *ToVar,
138                            bool Complain = true);
139     bool IsStructuralMatch(EnumDecl *FromEnum, EnumDecl *ToRecord);
140     bool IsStructuralMatch(EnumConstantDecl *FromEC, EnumConstantDecl *ToEC);
141     bool IsStructuralMatch(ClassTemplateDecl *From, ClassTemplateDecl *To);
142     bool IsStructuralMatch(VarTemplateDecl *From, VarTemplateDecl *To);
143     Decl *VisitDecl(Decl *D);
144     Decl *VisitAccessSpecDecl(AccessSpecDecl *D);
145     Decl *VisitStaticAssertDecl(StaticAssertDecl *D);
146     Decl *VisitTranslationUnitDecl(TranslationUnitDecl *D);
147     Decl *VisitNamespaceDecl(NamespaceDecl *D);
148     Decl *VisitTypedefNameDecl(TypedefNameDecl *D, bool IsAlias);
149     Decl *VisitTypedefDecl(TypedefDecl *D);
150     Decl *VisitTypeAliasDecl(TypeAliasDecl *D);
151     Decl *VisitLabelDecl(LabelDecl *D);
152     Decl *VisitEnumDecl(EnumDecl *D);
153     Decl *VisitRecordDecl(RecordDecl *D);
154     Decl *VisitEnumConstantDecl(EnumConstantDecl *D);
155     Decl *VisitFunctionDecl(FunctionDecl *D);
156     Decl *VisitCXXMethodDecl(CXXMethodDecl *D);
157     Decl *VisitCXXConstructorDecl(CXXConstructorDecl *D);
158     Decl *VisitCXXDestructorDecl(CXXDestructorDecl *D);
159     Decl *VisitCXXConversionDecl(CXXConversionDecl *D);
160     Decl *VisitFieldDecl(FieldDecl *D);
161     Decl *VisitIndirectFieldDecl(IndirectFieldDecl *D);
162     Decl *VisitFriendDecl(FriendDecl *D);
163     Decl *VisitObjCIvarDecl(ObjCIvarDecl *D);
164     Decl *VisitVarDecl(VarDecl *D);
165     Decl *VisitImplicitParamDecl(ImplicitParamDecl *D);
166     Decl *VisitParmVarDecl(ParmVarDecl *D);
167     Decl *VisitObjCMethodDecl(ObjCMethodDecl *D);
168     Decl *VisitObjCTypeParamDecl(ObjCTypeParamDecl *D);
169     Decl *VisitObjCCategoryDecl(ObjCCategoryDecl *D);
170     Decl *VisitObjCProtocolDecl(ObjCProtocolDecl *D);
171     Decl *VisitLinkageSpecDecl(LinkageSpecDecl *D);
172 
173     ObjCTypeParamList *ImportObjCTypeParamList(ObjCTypeParamList *list);
174     Decl *VisitObjCInterfaceDecl(ObjCInterfaceDecl *D);
175     Decl *VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D);
176     Decl *VisitObjCImplementationDecl(ObjCImplementationDecl *D);
177     Decl *VisitObjCPropertyDecl(ObjCPropertyDecl *D);
178     Decl *VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D);
179     Decl *VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D);
180     Decl *VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D);
181     Decl *VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D);
182     Decl *VisitClassTemplateDecl(ClassTemplateDecl *D);
183     Decl *VisitClassTemplateSpecializationDecl(
184                                             ClassTemplateSpecializationDecl *D);
185     Decl *VisitVarTemplateDecl(VarTemplateDecl *D);
186     Decl *VisitVarTemplateSpecializationDecl(VarTemplateSpecializationDecl *D);
187 
188     // Importing statements
189     DeclGroupRef ImportDeclGroup(DeclGroupRef DG);
190 
191     Stmt *VisitStmt(Stmt *S);
192     Stmt *VisitGCCAsmStmt(GCCAsmStmt *S);
193     Stmt *VisitDeclStmt(DeclStmt *S);
194     Stmt *VisitNullStmt(NullStmt *S);
195     Stmt *VisitCompoundStmt(CompoundStmt *S);
196     Stmt *VisitCaseStmt(CaseStmt *S);
197     Stmt *VisitDefaultStmt(DefaultStmt *S);
198     Stmt *VisitLabelStmt(LabelStmt *S);
199     Stmt *VisitAttributedStmt(AttributedStmt *S);
200     Stmt *VisitIfStmt(IfStmt *S);
201     Stmt *VisitSwitchStmt(SwitchStmt *S);
202     Stmt *VisitWhileStmt(WhileStmt *S);
203     Stmt *VisitDoStmt(DoStmt *S);
204     Stmt *VisitForStmt(ForStmt *S);
205     Stmt *VisitGotoStmt(GotoStmt *S);
206     Stmt *VisitIndirectGotoStmt(IndirectGotoStmt *S);
207     Stmt *VisitContinueStmt(ContinueStmt *S);
208     Stmt *VisitBreakStmt(BreakStmt *S);
209     Stmt *VisitReturnStmt(ReturnStmt *S);
210     // FIXME: MSAsmStmt
211     // FIXME: SEHExceptStmt
212     // FIXME: SEHFinallyStmt
213     // FIXME: SEHTryStmt
214     // FIXME: SEHLeaveStmt
215     // FIXME: CapturedStmt
216     Stmt *VisitCXXCatchStmt(CXXCatchStmt *S);
217     Stmt *VisitCXXTryStmt(CXXTryStmt *S);
218     Stmt *VisitCXXForRangeStmt(CXXForRangeStmt *S);
219     // FIXME: MSDependentExistsStmt
220     Stmt *VisitObjCForCollectionStmt(ObjCForCollectionStmt *S);
221     Stmt *VisitObjCAtCatchStmt(ObjCAtCatchStmt *S);
222     Stmt *VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S);
223     Stmt *VisitObjCAtTryStmt(ObjCAtTryStmt *S);
224     Stmt *VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *S);
225     Stmt *VisitObjCAtThrowStmt(ObjCAtThrowStmt *S);
226     Stmt *VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt *S);
227 
228     // Importing expressions
229     Expr *VisitExpr(Expr *E);
230     Expr *VisitVAArgExpr(VAArgExpr *E);
231     Expr *VisitGNUNullExpr(GNUNullExpr *E);
232     Expr *VisitPredefinedExpr(PredefinedExpr *E);
233     Expr *VisitDeclRefExpr(DeclRefExpr *E);
234     Expr *VisitImplicitValueInitExpr(ImplicitValueInitExpr *ILE);
235     Expr *VisitDesignatedInitExpr(DesignatedInitExpr *E);
236     Expr *VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E);
237     Expr *VisitIntegerLiteral(IntegerLiteral *E);
238     Expr *VisitFloatingLiteral(FloatingLiteral *E);
239     Expr *VisitCharacterLiteral(CharacterLiteral *E);
240     Expr *VisitStringLiteral(StringLiteral *E);
241     Expr *VisitCompoundLiteralExpr(CompoundLiteralExpr *E);
242     Expr *VisitAtomicExpr(AtomicExpr *E);
243     Expr *VisitAddrLabelExpr(AddrLabelExpr *E);
244     Expr *VisitParenExpr(ParenExpr *E);
245     Expr *VisitParenListExpr(ParenListExpr *E);
246     Expr *VisitStmtExpr(StmtExpr *E);
247     Expr *VisitUnaryOperator(UnaryOperator *E);
248     Expr *VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E);
249     Expr *VisitBinaryOperator(BinaryOperator *E);
250     Expr *VisitConditionalOperator(ConditionalOperator *E);
251     Expr *VisitBinaryConditionalOperator(BinaryConditionalOperator *E);
252     Expr *VisitOpaqueValueExpr(OpaqueValueExpr *E);
253     Expr *VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E);
254     Expr *VisitExpressionTraitExpr(ExpressionTraitExpr *E);
255     Expr *VisitArraySubscriptExpr(ArraySubscriptExpr *E);
256     Expr *VisitCompoundAssignOperator(CompoundAssignOperator *E);
257     Expr *VisitImplicitCastExpr(ImplicitCastExpr *E);
258     Expr *VisitExplicitCastExpr(ExplicitCastExpr *E);
259     Expr *VisitOffsetOfExpr(OffsetOfExpr *OE);
260     Expr *VisitCXXThrowExpr(CXXThrowExpr *E);
261     Expr *VisitCXXNoexceptExpr(CXXNoexceptExpr *E);
262     Expr *VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E);
263     Expr *VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E);
264     Expr *VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E);
265     Expr *VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *CE);
266     Expr *VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *E);
267     Expr *VisitCXXNewExpr(CXXNewExpr *CE);
268     Expr *VisitCXXDeleteExpr(CXXDeleteExpr *E);
269     Expr *VisitCXXConstructExpr(CXXConstructExpr *E);
270     Expr *VisitCXXMemberCallExpr(CXXMemberCallExpr *E);
271     Expr *VisitExprWithCleanups(ExprWithCleanups *EWC);
272     Expr *VisitCXXThisExpr(CXXThisExpr *E);
273     Expr *VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E);
274     Expr *VisitMemberExpr(MemberExpr *E);
275     Expr *VisitCallExpr(CallExpr *E);
276     Expr *VisitInitListExpr(InitListExpr *E);
277     Expr *VisitArrayInitLoopExpr(ArrayInitLoopExpr *E);
278     Expr *VisitArrayInitIndexExpr(ArrayInitIndexExpr *E);
279     Expr *VisitCXXDefaultInitExpr(CXXDefaultInitExpr *E);
280     Expr *VisitCXXNamedCastExpr(CXXNamedCastExpr *E);
281     Expr *VisitSubstNonTypeTemplateParmExpr(SubstNonTypeTemplateParmExpr *E);
282 
283 
284     template<typename IIter, typename OIter>
285     void ImportArray(IIter Ibegin, IIter Iend, OIter Obegin) {
286       typedef typename std::remove_reference<decltype(*Obegin)>::type ItemT;
287       ASTImporter &ImporterRef = Importer;
288       std::transform(Ibegin, Iend, Obegin,
289                      [&ImporterRef](ItemT From) -> ItemT {
290                        return ImporterRef.Import(From);
291                      });
292     }
293 
294     template<typename IIter, typename OIter>
295     bool ImportArrayChecked(IIter Ibegin, IIter Iend, OIter Obegin) {
296       typedef typename std::remove_reference<decltype(**Obegin)>::type ItemT;
297       ASTImporter &ImporterRef = Importer;
298       bool Failed = false;
299       std::transform(Ibegin, Iend, Obegin,
300                      [&ImporterRef, &Failed](ItemT *From) -> ItemT * {
301                        ItemT *To = cast_or_null<ItemT>(
302                              ImporterRef.Import(From));
303                        if (!To && From)
304                          Failed = true;
305                        return To;
306                      });
307       return Failed;
308     }
309 
310     template<typename InContainerTy, typename OutContainerTy>
311     bool ImportContainerChecked(const InContainerTy &InContainer,
312                                 OutContainerTy &OutContainer) {
313       return ImportArrayChecked(InContainer.begin(), InContainer.end(),
314                                 OutContainer.begin());
315     }
316 
317     template<typename InContainerTy, typename OIter>
318     bool ImportArrayChecked(const InContainerTy &InContainer, OIter Obegin) {
319       return ImportArrayChecked(InContainer.begin(), InContainer.end(), Obegin);
320     }
321   };
322 }
323 
324 using namespace clang;
325 
326 //----------------------------------------------------------------------------
327 // Structural Equivalence
328 //----------------------------------------------------------------------------
329 
330 namespace {
331   struct StructuralEquivalenceContext {
332     /// \brief AST contexts for which we are checking structural equivalence.
333     ASTContext &C1, &C2;
334 
335     /// \brief The set of "tentative" equivalences between two canonical
336     /// declarations, mapping from a declaration in the first context to the
337     /// declaration in the second context that we believe to be equivalent.
338     llvm::DenseMap<Decl *, Decl *> TentativeEquivalences;
339 
340     /// \brief Queue of declarations in the first context whose equivalence
341     /// with a declaration in the second context still needs to be verified.
342     std::deque<Decl *> DeclsToCheck;
343 
344     /// \brief Declaration (from, to) pairs that are known not to be equivalent
345     /// (which we have already complained about).
346     llvm::DenseSet<std::pair<Decl *, Decl *> > &NonEquivalentDecls;
347 
348     /// \brief Whether we're being strict about the spelling of types when
349     /// unifying two types.
350     bool StrictTypeSpelling;
351 
352     /// \brief Whether to complain about failures.
353     bool Complain;
354 
355     /// \brief \c true if the last diagnostic came from C2.
356     bool LastDiagFromC2;
357 
358     StructuralEquivalenceContext(ASTContext &C1, ASTContext &C2,
359                llvm::DenseSet<std::pair<Decl *, Decl *> > &NonEquivalentDecls,
360                                  bool StrictTypeSpelling = false,
361                                  bool Complain = true)
362       : C1(C1), C2(C2), NonEquivalentDecls(NonEquivalentDecls),
363         StrictTypeSpelling(StrictTypeSpelling), Complain(Complain),
364         LastDiagFromC2(false) {}
365 
366     /// \brief Determine whether the two declarations are structurally
367     /// equivalent.
368     bool IsStructurallyEquivalent(Decl *D1, Decl *D2);
369 
370     /// \brief Determine whether the two types are structurally equivalent.
371     bool IsStructurallyEquivalent(QualType T1, QualType T2);
372 
373   private:
374     /// \brief Finish checking all of the structural equivalences.
375     ///
376     /// \returns true if an error occurred, false otherwise.
377     bool Finish();
378 
379   public:
380     DiagnosticBuilder Diag1(SourceLocation Loc, unsigned DiagID) {
381       assert(Complain && "Not allowed to complain");
382       if (LastDiagFromC2)
383         C1.getDiagnostics().notePriorDiagnosticFrom(C2.getDiagnostics());
384       LastDiagFromC2 = false;
385       return C1.getDiagnostics().Report(Loc, DiagID);
386     }
387 
388     DiagnosticBuilder Diag2(SourceLocation Loc, unsigned DiagID) {
389       assert(Complain && "Not allowed to complain");
390       if (!LastDiagFromC2)
391         C2.getDiagnostics().notePriorDiagnosticFrom(C1.getDiagnostics());
392       LastDiagFromC2 = true;
393       return C2.getDiagnostics().Report(Loc, DiagID);
394     }
395   };
396 }
397 
398 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
399                                      QualType T1, QualType T2);
400 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
401                                      Decl *D1, Decl *D2);
402 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
403                                      const TemplateArgument &Arg1,
404                                      const TemplateArgument &Arg2);
405 
406 /// \brief Determine structural equivalence of two expressions.
407 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
408                                      Expr *E1, Expr *E2) {
409   if (!E1 || !E2)
410     return E1 == E2;
411 
412   // FIXME: Actually perform a structural comparison!
413   return true;
414 }
415 
416 /// \brief Determine whether two identifiers are equivalent.
417 static bool IsStructurallyEquivalent(const IdentifierInfo *Name1,
418                                      const IdentifierInfo *Name2) {
419   if (!Name1 || !Name2)
420     return Name1 == Name2;
421 
422   return Name1->getName() == Name2->getName();
423 }
424 
425 /// \brief Determine whether two nested-name-specifiers are equivalent.
426 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
427                                      NestedNameSpecifier *NNS1,
428                                      NestedNameSpecifier *NNS2) {
429   if (NNS1->getKind() != NNS2->getKind())
430     return false;
431 
432   NestedNameSpecifier *Prefix1 = NNS1->getPrefix(),
433       *Prefix2 = NNS2->getPrefix();
434   if ((bool)Prefix1 != (bool)Prefix2)
435     return false;
436 
437   if (Prefix1)
438     if (!IsStructurallyEquivalent(Context, Prefix1, Prefix2))
439       return false;
440 
441   switch (NNS1->getKind()) {
442   case NestedNameSpecifier::Identifier:
443     return IsStructurallyEquivalent(NNS1->getAsIdentifier(),
444                                     NNS2->getAsIdentifier());
445   case NestedNameSpecifier::Namespace:
446     return IsStructurallyEquivalent(Context, NNS1->getAsNamespace(),
447                                     NNS2->getAsNamespace());
448   case NestedNameSpecifier::NamespaceAlias:
449     return IsStructurallyEquivalent(Context, NNS1->getAsNamespaceAlias(),
450                                     NNS2->getAsNamespaceAlias());
451   case NestedNameSpecifier::TypeSpec:
452   case NestedNameSpecifier::TypeSpecWithTemplate:
453     return IsStructurallyEquivalent(Context, QualType(NNS1->getAsType(), 0),
454                                     QualType(NNS2->getAsType(), 0));
455   case NestedNameSpecifier::Global:
456     return true;
457   case NestedNameSpecifier::Super:
458     return IsStructurallyEquivalent(Context, NNS1->getAsRecordDecl(),
459                                     NNS2->getAsRecordDecl());
460   }
461   return false;
462 }
463 
464 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
465                                      const TemplateName &N1,
466                                      const TemplateName &N2) {
467   if (N1.getKind() != N2.getKind())
468     return false;
469   switch (N1.getKind()) {
470   case TemplateName::Template:
471     return IsStructurallyEquivalent(Context, N1.getAsTemplateDecl(),
472                                     N2.getAsTemplateDecl());
473 
474   case TemplateName::OverloadedTemplate: {
475     OverloadedTemplateStorage *OS1 = N1.getAsOverloadedTemplate(),
476         *OS2 = N2.getAsOverloadedTemplate();
477     OverloadedTemplateStorage::iterator I1 = OS1->begin(), I2 = OS2->begin(),
478         E1 = OS1->end(), E2 = OS2->end();
479     for (; I1 != E1 && I2 != E2; ++I1, ++I2)
480       if (!IsStructurallyEquivalent(Context, *I1, *I2))
481         return false;
482     return I1 == E1 && I2 == E2;
483   }
484 
485   case TemplateName::QualifiedTemplate: {
486     QualifiedTemplateName *QN1 = N1.getAsQualifiedTemplateName(),
487         *QN2 = N2.getAsQualifiedTemplateName();
488     return IsStructurallyEquivalent(Context, QN1->getDecl(), QN2->getDecl()) &&
489         IsStructurallyEquivalent(Context, QN1->getQualifier(),
490                                  QN2->getQualifier());
491   }
492 
493   case TemplateName::DependentTemplate: {
494       DependentTemplateName *DN1 = N1.getAsDependentTemplateName(),
495           *DN2 = N2.getAsDependentTemplateName();
496       if (!IsStructurallyEquivalent(Context, DN1->getQualifier(),
497                                     DN2->getQualifier()))
498         return false;
499       if (DN1->isIdentifier() && DN2->isIdentifier())
500         return IsStructurallyEquivalent(DN1->getIdentifier(),
501                                         DN2->getIdentifier());
502       else if (DN1->isOverloadedOperator() && DN2->isOverloadedOperator())
503         return DN1->getOperator() == DN2->getOperator();
504       return false;
505   }
506 
507   case TemplateName::SubstTemplateTemplateParm: {
508     SubstTemplateTemplateParmStorage *TS1 = N1.getAsSubstTemplateTemplateParm(),
509         *TS2 = N2.getAsSubstTemplateTemplateParm();
510     return IsStructurallyEquivalent(Context, TS1->getParameter(),
511                                     TS2->getParameter()) &&
512         IsStructurallyEquivalent(Context, TS1->getReplacement(),
513                                  TS2->getReplacement());
514     }
515   case TemplateName::SubstTemplateTemplateParmPack: {
516     SubstTemplateTemplateParmPackStorage
517         *P1 = N1.getAsSubstTemplateTemplateParmPack(),
518         *P2 = N2.getAsSubstTemplateTemplateParmPack();
519     return IsStructurallyEquivalent(Context, P1->getArgumentPack(),
520                                     P2->getArgumentPack()) &&
521         IsStructurallyEquivalent(Context, P1->getParameterPack(),
522                                  P2->getParameterPack());
523   }
524   }
525   return false;
526 }
527 
528 /// \brief Determine whether two template arguments are equivalent.
529 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
530                                      const TemplateArgument &Arg1,
531                                      const TemplateArgument &Arg2) {
532   if (Arg1.getKind() != Arg2.getKind())
533     return false;
534 
535   switch (Arg1.getKind()) {
536   case TemplateArgument::Null:
537     return true;
538 
539   case TemplateArgument::Type:
540     return Context.IsStructurallyEquivalent(Arg1.getAsType(), Arg2.getAsType());
541 
542   case TemplateArgument::Integral:
543     if (!Context.IsStructurallyEquivalent(Arg1.getIntegralType(),
544                                           Arg2.getIntegralType()))
545       return false;
546 
547     return llvm::APSInt::isSameValue(Arg1.getAsIntegral(), Arg2.getAsIntegral());
548 
549   case TemplateArgument::Declaration:
550     return Context.IsStructurallyEquivalent(Arg1.getAsDecl(), Arg2.getAsDecl());
551 
552   case TemplateArgument::NullPtr:
553     return true; // FIXME: Is this correct?
554 
555   case TemplateArgument::Template:
556     return IsStructurallyEquivalent(Context,
557                                     Arg1.getAsTemplate(),
558                                     Arg2.getAsTemplate());
559 
560   case TemplateArgument::TemplateExpansion:
561     return IsStructurallyEquivalent(Context,
562                                     Arg1.getAsTemplateOrTemplatePattern(),
563                                     Arg2.getAsTemplateOrTemplatePattern());
564 
565   case TemplateArgument::Expression:
566     return IsStructurallyEquivalent(Context,
567                                     Arg1.getAsExpr(), Arg2.getAsExpr());
568 
569   case TemplateArgument::Pack:
570     if (Arg1.pack_size() != Arg2.pack_size())
571       return false;
572 
573     for (unsigned I = 0, N = Arg1.pack_size(); I != N; ++I)
574       if (!IsStructurallyEquivalent(Context,
575                                     Arg1.pack_begin()[I],
576                                     Arg2.pack_begin()[I]))
577         return false;
578 
579     return true;
580   }
581 
582   llvm_unreachable("Invalid template argument kind");
583 }
584 
585 /// \brief Determine structural equivalence for the common part of array
586 /// types.
587 static bool IsArrayStructurallyEquivalent(StructuralEquivalenceContext &Context,
588                                           const ArrayType *Array1,
589                                           const ArrayType *Array2) {
590   if (!IsStructurallyEquivalent(Context,
591                                 Array1->getElementType(),
592                                 Array2->getElementType()))
593     return false;
594   if (Array1->getSizeModifier() != Array2->getSizeModifier())
595     return false;
596   if (Array1->getIndexTypeQualifiers() != Array2->getIndexTypeQualifiers())
597     return false;
598 
599   return true;
600 }
601 
602 /// \brief Determine structural equivalence of two types.
603 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
604                                      QualType T1, QualType T2) {
605   if (T1.isNull() || T2.isNull())
606     return T1.isNull() && T2.isNull();
607 
608   if (!Context.StrictTypeSpelling) {
609     // We aren't being strict about token-to-token equivalence of types,
610     // so map down to the canonical type.
611     T1 = Context.C1.getCanonicalType(T1);
612     T2 = Context.C2.getCanonicalType(T2);
613   }
614 
615   if (T1.getQualifiers() != T2.getQualifiers())
616     return false;
617 
618   Type::TypeClass TC = T1->getTypeClass();
619 
620   if (T1->getTypeClass() != T2->getTypeClass()) {
621     // Compare function types with prototypes vs. without prototypes as if
622     // both did not have prototypes.
623     if (T1->getTypeClass() == Type::FunctionProto &&
624         T2->getTypeClass() == Type::FunctionNoProto)
625       TC = Type::FunctionNoProto;
626     else if (T1->getTypeClass() == Type::FunctionNoProto &&
627              T2->getTypeClass() == Type::FunctionProto)
628       TC = Type::FunctionNoProto;
629     else
630       return false;
631   }
632 
633   switch (TC) {
634   case Type::Builtin:
635     // FIXME: Deal with Char_S/Char_U.
636     if (cast<BuiltinType>(T1)->getKind() != cast<BuiltinType>(T2)->getKind())
637       return false;
638     break;
639 
640   case Type::Complex:
641     if (!IsStructurallyEquivalent(Context,
642                                   cast<ComplexType>(T1)->getElementType(),
643                                   cast<ComplexType>(T2)->getElementType()))
644       return false;
645     break;
646 
647   case Type::Adjusted:
648   case Type::Decayed:
649     if (!IsStructurallyEquivalent(Context,
650                                   cast<AdjustedType>(T1)->getOriginalType(),
651                                   cast<AdjustedType>(T2)->getOriginalType()))
652       return false;
653     break;
654 
655   case Type::Pointer:
656     if (!IsStructurallyEquivalent(Context,
657                                   cast<PointerType>(T1)->getPointeeType(),
658                                   cast<PointerType>(T2)->getPointeeType()))
659       return false;
660     break;
661 
662   case Type::BlockPointer:
663     if (!IsStructurallyEquivalent(Context,
664                                   cast<BlockPointerType>(T1)->getPointeeType(),
665                                   cast<BlockPointerType>(T2)->getPointeeType()))
666       return false;
667     break;
668 
669   case Type::LValueReference:
670   case Type::RValueReference: {
671     const ReferenceType *Ref1 = cast<ReferenceType>(T1);
672     const ReferenceType *Ref2 = cast<ReferenceType>(T2);
673     if (Ref1->isSpelledAsLValue() != Ref2->isSpelledAsLValue())
674       return false;
675     if (Ref1->isInnerRef() != Ref2->isInnerRef())
676       return false;
677     if (!IsStructurallyEquivalent(Context,
678                                   Ref1->getPointeeTypeAsWritten(),
679                                   Ref2->getPointeeTypeAsWritten()))
680       return false;
681     break;
682   }
683 
684   case Type::MemberPointer: {
685     const MemberPointerType *MemPtr1 = cast<MemberPointerType>(T1);
686     const MemberPointerType *MemPtr2 = cast<MemberPointerType>(T2);
687     if (!IsStructurallyEquivalent(Context,
688                                   MemPtr1->getPointeeType(),
689                                   MemPtr2->getPointeeType()))
690       return false;
691     if (!IsStructurallyEquivalent(Context,
692                                   QualType(MemPtr1->getClass(), 0),
693                                   QualType(MemPtr2->getClass(), 0)))
694       return false;
695     break;
696   }
697 
698   case Type::ConstantArray: {
699     const ConstantArrayType *Array1 = cast<ConstantArrayType>(T1);
700     const ConstantArrayType *Array2 = cast<ConstantArrayType>(T2);
701     if (!llvm::APInt::isSameValue(Array1->getSize(), Array2->getSize()))
702       return false;
703 
704     if (!IsArrayStructurallyEquivalent(Context, Array1, Array2))
705       return false;
706     break;
707   }
708 
709   case Type::IncompleteArray:
710     if (!IsArrayStructurallyEquivalent(Context,
711                                        cast<ArrayType>(T1),
712                                        cast<ArrayType>(T2)))
713       return false;
714     break;
715 
716   case Type::VariableArray: {
717     const VariableArrayType *Array1 = cast<VariableArrayType>(T1);
718     const VariableArrayType *Array2 = cast<VariableArrayType>(T2);
719     if (!IsStructurallyEquivalent(Context,
720                                   Array1->getSizeExpr(), Array2->getSizeExpr()))
721       return false;
722 
723     if (!IsArrayStructurallyEquivalent(Context, Array1, Array2))
724       return false;
725 
726     break;
727   }
728 
729   case Type::DependentSizedArray: {
730     const DependentSizedArrayType *Array1 = cast<DependentSizedArrayType>(T1);
731     const DependentSizedArrayType *Array2 = cast<DependentSizedArrayType>(T2);
732     if (!IsStructurallyEquivalent(Context,
733                                   Array1->getSizeExpr(), Array2->getSizeExpr()))
734       return false;
735 
736     if (!IsArrayStructurallyEquivalent(Context, Array1, Array2))
737       return false;
738 
739     break;
740   }
741 
742   case Type::DependentSizedExtVector: {
743     const DependentSizedExtVectorType *Vec1
744       = cast<DependentSizedExtVectorType>(T1);
745     const DependentSizedExtVectorType *Vec2
746       = cast<DependentSizedExtVectorType>(T2);
747     if (!IsStructurallyEquivalent(Context,
748                                   Vec1->getSizeExpr(), Vec2->getSizeExpr()))
749       return false;
750     if (!IsStructurallyEquivalent(Context,
751                                   Vec1->getElementType(),
752                                   Vec2->getElementType()))
753       return false;
754     break;
755   }
756 
757   case Type::Vector:
758   case Type::ExtVector: {
759     const VectorType *Vec1 = cast<VectorType>(T1);
760     const VectorType *Vec2 = cast<VectorType>(T2);
761     if (!IsStructurallyEquivalent(Context,
762                                   Vec1->getElementType(),
763                                   Vec2->getElementType()))
764       return false;
765     if (Vec1->getNumElements() != Vec2->getNumElements())
766       return false;
767     if (Vec1->getVectorKind() != Vec2->getVectorKind())
768       return false;
769     break;
770   }
771 
772   case Type::FunctionProto: {
773     const FunctionProtoType *Proto1 = cast<FunctionProtoType>(T1);
774     const FunctionProtoType *Proto2 = cast<FunctionProtoType>(T2);
775     if (Proto1->getNumParams() != Proto2->getNumParams())
776       return false;
777     for (unsigned I = 0, N = Proto1->getNumParams(); I != N; ++I) {
778       if (!IsStructurallyEquivalent(Context, Proto1->getParamType(I),
779                                     Proto2->getParamType(I)))
780         return false;
781     }
782     if (Proto1->isVariadic() != Proto2->isVariadic())
783       return false;
784     if (Proto1->getExceptionSpecType() != Proto2->getExceptionSpecType())
785       return false;
786     if (Proto1->getExceptionSpecType() == EST_Dynamic) {
787       if (Proto1->getNumExceptions() != Proto2->getNumExceptions())
788         return false;
789       for (unsigned I = 0, N = Proto1->getNumExceptions(); I != N; ++I) {
790         if (!IsStructurallyEquivalent(Context,
791                                       Proto1->getExceptionType(I),
792                                       Proto2->getExceptionType(I)))
793           return false;
794       }
795     } else if (Proto1->getExceptionSpecType() == EST_ComputedNoexcept) {
796       if (!IsStructurallyEquivalent(Context,
797                                     Proto1->getNoexceptExpr(),
798                                     Proto2->getNoexceptExpr()))
799         return false;
800     }
801     if (Proto1->getTypeQuals() != Proto2->getTypeQuals())
802       return false;
803 
804     // Fall through to check the bits common with FunctionNoProtoType.
805   }
806 
807   case Type::FunctionNoProto: {
808     const FunctionType *Function1 = cast<FunctionType>(T1);
809     const FunctionType *Function2 = cast<FunctionType>(T2);
810     if (!IsStructurallyEquivalent(Context, Function1->getReturnType(),
811                                   Function2->getReturnType()))
812       return false;
813     if (Function1->getExtInfo() != Function2->getExtInfo())
814       return false;
815     break;
816   }
817 
818   case Type::UnresolvedUsing:
819     if (!IsStructurallyEquivalent(Context,
820                                   cast<UnresolvedUsingType>(T1)->getDecl(),
821                                   cast<UnresolvedUsingType>(T2)->getDecl()))
822       return false;
823 
824     break;
825 
826   case Type::Attributed:
827     if (!IsStructurallyEquivalent(Context,
828                                   cast<AttributedType>(T1)->getModifiedType(),
829                                   cast<AttributedType>(T2)->getModifiedType()))
830       return false;
831     if (!IsStructurallyEquivalent(Context,
832                                 cast<AttributedType>(T1)->getEquivalentType(),
833                                 cast<AttributedType>(T2)->getEquivalentType()))
834       return false;
835     break;
836 
837   case Type::Paren:
838     if (!IsStructurallyEquivalent(Context,
839                                   cast<ParenType>(T1)->getInnerType(),
840                                   cast<ParenType>(T2)->getInnerType()))
841       return false;
842     break;
843 
844   case Type::Typedef:
845     if (!IsStructurallyEquivalent(Context,
846                                   cast<TypedefType>(T1)->getDecl(),
847                                   cast<TypedefType>(T2)->getDecl()))
848       return false;
849     break;
850 
851   case Type::TypeOfExpr:
852     if (!IsStructurallyEquivalent(Context,
853                                 cast<TypeOfExprType>(T1)->getUnderlyingExpr(),
854                                 cast<TypeOfExprType>(T2)->getUnderlyingExpr()))
855       return false;
856     break;
857 
858   case Type::TypeOf:
859     if (!IsStructurallyEquivalent(Context,
860                                   cast<TypeOfType>(T1)->getUnderlyingType(),
861                                   cast<TypeOfType>(T2)->getUnderlyingType()))
862       return false;
863     break;
864 
865   case Type::UnaryTransform:
866     if (!IsStructurallyEquivalent(Context,
867                              cast<UnaryTransformType>(T1)->getUnderlyingType(),
868                              cast<UnaryTransformType>(T1)->getUnderlyingType()))
869       return false;
870     break;
871 
872   case Type::Decltype:
873     if (!IsStructurallyEquivalent(Context,
874                                   cast<DecltypeType>(T1)->getUnderlyingExpr(),
875                                   cast<DecltypeType>(T2)->getUnderlyingExpr()))
876       return false;
877     break;
878 
879   case Type::Auto:
880     if (!IsStructurallyEquivalent(Context,
881                                   cast<AutoType>(T1)->getDeducedType(),
882                                   cast<AutoType>(T2)->getDeducedType()))
883       return false;
884     break;
885 
886   case Type::DeducedTemplateSpecialization: {
887     auto *DT1 = cast<DeducedTemplateSpecializationType>(T1);
888     auto *DT2 = cast<DeducedTemplateSpecializationType>(T2);
889     if (!IsStructurallyEquivalent(Context,
890                                   DT1->getTemplateName(),
891                                   DT2->getTemplateName()))
892       return false;
893     if (!IsStructurallyEquivalent(Context,
894                                   DT1->getDeducedType(),
895                                   DT2->getDeducedType()))
896       return false;
897     break;
898   }
899 
900   case Type::Record:
901   case Type::Enum:
902     if (!IsStructurallyEquivalent(Context,
903                                   cast<TagType>(T1)->getDecl(),
904                                   cast<TagType>(T2)->getDecl()))
905       return false;
906     break;
907 
908   case Type::TemplateTypeParm: {
909     const TemplateTypeParmType *Parm1 = cast<TemplateTypeParmType>(T1);
910     const TemplateTypeParmType *Parm2 = cast<TemplateTypeParmType>(T2);
911     if (Parm1->getDepth() != Parm2->getDepth())
912       return false;
913     if (Parm1->getIndex() != Parm2->getIndex())
914       return false;
915     if (Parm1->isParameterPack() != Parm2->isParameterPack())
916       return false;
917 
918     // Names of template type parameters are never significant.
919     break;
920   }
921 
922   case Type::SubstTemplateTypeParm: {
923     const SubstTemplateTypeParmType *Subst1
924       = cast<SubstTemplateTypeParmType>(T1);
925     const SubstTemplateTypeParmType *Subst2
926       = cast<SubstTemplateTypeParmType>(T2);
927     if (!IsStructurallyEquivalent(Context,
928                                   QualType(Subst1->getReplacedParameter(), 0),
929                                   QualType(Subst2->getReplacedParameter(), 0)))
930       return false;
931     if (!IsStructurallyEquivalent(Context,
932                                   Subst1->getReplacementType(),
933                                   Subst2->getReplacementType()))
934       return false;
935     break;
936   }
937 
938   case Type::SubstTemplateTypeParmPack: {
939     const SubstTemplateTypeParmPackType *Subst1
940       = cast<SubstTemplateTypeParmPackType>(T1);
941     const SubstTemplateTypeParmPackType *Subst2
942       = cast<SubstTemplateTypeParmPackType>(T2);
943     if (!IsStructurallyEquivalent(Context,
944                                   QualType(Subst1->getReplacedParameter(), 0),
945                                   QualType(Subst2->getReplacedParameter(), 0)))
946       return false;
947     if (!IsStructurallyEquivalent(Context,
948                                   Subst1->getArgumentPack(),
949                                   Subst2->getArgumentPack()))
950       return false;
951     break;
952   }
953   case Type::TemplateSpecialization: {
954     const TemplateSpecializationType *Spec1
955       = cast<TemplateSpecializationType>(T1);
956     const TemplateSpecializationType *Spec2
957       = cast<TemplateSpecializationType>(T2);
958     if (!IsStructurallyEquivalent(Context,
959                                   Spec1->getTemplateName(),
960                                   Spec2->getTemplateName()))
961       return false;
962     if (Spec1->getNumArgs() != Spec2->getNumArgs())
963       return false;
964     for (unsigned I = 0, N = Spec1->getNumArgs(); I != N; ++I) {
965       if (!IsStructurallyEquivalent(Context,
966                                     Spec1->getArg(I), Spec2->getArg(I)))
967         return false;
968     }
969     break;
970   }
971 
972   case Type::Elaborated: {
973     const ElaboratedType *Elab1 = cast<ElaboratedType>(T1);
974     const ElaboratedType *Elab2 = cast<ElaboratedType>(T2);
975     // CHECKME: what if a keyword is ETK_None or ETK_typename ?
976     if (Elab1->getKeyword() != Elab2->getKeyword())
977       return false;
978     if (!IsStructurallyEquivalent(Context,
979                                   Elab1->getQualifier(),
980                                   Elab2->getQualifier()))
981       return false;
982     if (!IsStructurallyEquivalent(Context,
983                                   Elab1->getNamedType(),
984                                   Elab2->getNamedType()))
985       return false;
986     break;
987   }
988 
989   case Type::InjectedClassName: {
990     const InjectedClassNameType *Inj1 = cast<InjectedClassNameType>(T1);
991     const InjectedClassNameType *Inj2 = cast<InjectedClassNameType>(T2);
992     if (!IsStructurallyEquivalent(Context,
993                                   Inj1->getInjectedSpecializationType(),
994                                   Inj2->getInjectedSpecializationType()))
995       return false;
996     break;
997   }
998 
999   case Type::DependentName: {
1000     const DependentNameType *Typename1 = cast<DependentNameType>(T1);
1001     const DependentNameType *Typename2 = cast<DependentNameType>(T2);
1002     if (!IsStructurallyEquivalent(Context,
1003                                   Typename1->getQualifier(),
1004                                   Typename2->getQualifier()))
1005       return false;
1006     if (!IsStructurallyEquivalent(Typename1->getIdentifier(),
1007                                   Typename2->getIdentifier()))
1008       return false;
1009 
1010     break;
1011   }
1012 
1013   case Type::DependentTemplateSpecialization: {
1014     const DependentTemplateSpecializationType *Spec1 =
1015       cast<DependentTemplateSpecializationType>(T1);
1016     const DependentTemplateSpecializationType *Spec2 =
1017       cast<DependentTemplateSpecializationType>(T2);
1018     if (!IsStructurallyEquivalent(Context,
1019                                   Spec1->getQualifier(),
1020                                   Spec2->getQualifier()))
1021       return false;
1022     if (!IsStructurallyEquivalent(Spec1->getIdentifier(),
1023                                   Spec2->getIdentifier()))
1024       return false;
1025     if (Spec1->getNumArgs() != Spec2->getNumArgs())
1026       return false;
1027     for (unsigned I = 0, N = Spec1->getNumArgs(); I != N; ++I) {
1028       if (!IsStructurallyEquivalent(Context,
1029                                     Spec1->getArg(I), Spec2->getArg(I)))
1030         return false;
1031     }
1032     break;
1033   }
1034 
1035   case Type::PackExpansion:
1036     if (!IsStructurallyEquivalent(Context,
1037                                   cast<PackExpansionType>(T1)->getPattern(),
1038                                   cast<PackExpansionType>(T2)->getPattern()))
1039       return false;
1040     break;
1041 
1042   case Type::ObjCInterface: {
1043     const ObjCInterfaceType *Iface1 = cast<ObjCInterfaceType>(T1);
1044     const ObjCInterfaceType *Iface2 = cast<ObjCInterfaceType>(T2);
1045     if (!IsStructurallyEquivalent(Context,
1046                                   Iface1->getDecl(), Iface2->getDecl()))
1047       return false;
1048     break;
1049   }
1050 
1051   case Type::ObjCTypeParam: {
1052     const ObjCTypeParamType *Obj1 = cast<ObjCTypeParamType>(T1);
1053     const ObjCTypeParamType *Obj2 = cast<ObjCTypeParamType>(T2);
1054     if (!IsStructurallyEquivalent(Context, Obj1->getDecl(),
1055                                   Obj2->getDecl()))
1056       return false;
1057 
1058     if (Obj1->getNumProtocols() != Obj2->getNumProtocols())
1059       return false;
1060     for (unsigned I = 0, N = Obj1->getNumProtocols(); I != N; ++I) {
1061       if (!IsStructurallyEquivalent(Context,
1062                                     Obj1->getProtocol(I),
1063                                     Obj2->getProtocol(I)))
1064         return false;
1065     }
1066     break;
1067   }
1068   case Type::ObjCObject: {
1069     const ObjCObjectType *Obj1 = cast<ObjCObjectType>(T1);
1070     const ObjCObjectType *Obj2 = cast<ObjCObjectType>(T2);
1071     if (!IsStructurallyEquivalent(Context,
1072                                   Obj1->getBaseType(),
1073                                   Obj2->getBaseType()))
1074       return false;
1075     if (Obj1->getNumProtocols() != Obj2->getNumProtocols())
1076       return false;
1077     for (unsigned I = 0, N = Obj1->getNumProtocols(); I != N; ++I) {
1078       if (!IsStructurallyEquivalent(Context,
1079                                     Obj1->getProtocol(I),
1080                                     Obj2->getProtocol(I)))
1081         return false;
1082     }
1083     break;
1084   }
1085 
1086   case Type::ObjCObjectPointer: {
1087     const ObjCObjectPointerType *Ptr1 = cast<ObjCObjectPointerType>(T1);
1088     const ObjCObjectPointerType *Ptr2 = cast<ObjCObjectPointerType>(T2);
1089     if (!IsStructurallyEquivalent(Context,
1090                                   Ptr1->getPointeeType(),
1091                                   Ptr2->getPointeeType()))
1092       return false;
1093     break;
1094   }
1095 
1096   case Type::Atomic: {
1097     if (!IsStructurallyEquivalent(Context,
1098                                   cast<AtomicType>(T1)->getValueType(),
1099                                   cast<AtomicType>(T2)->getValueType()))
1100       return false;
1101     break;
1102   }
1103 
1104   case Type::Pipe: {
1105     if (!IsStructurallyEquivalent(Context,
1106                                   cast<PipeType>(T1)->getElementType(),
1107                                   cast<PipeType>(T2)->getElementType()))
1108       return false;
1109     break;
1110   }
1111 
1112   } // end switch
1113 
1114   return true;
1115 }
1116 
1117 /// \brief Determine structural equivalence of two fields.
1118 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
1119                                      FieldDecl *Field1, FieldDecl *Field2) {
1120   RecordDecl *Owner2 = cast<RecordDecl>(Field2->getDeclContext());
1121 
1122   // For anonymous structs/unions, match up the anonymous struct/union type
1123   // declarations directly, so that we don't go off searching for anonymous
1124   // types
1125   if (Field1->isAnonymousStructOrUnion() &&
1126       Field2->isAnonymousStructOrUnion()) {
1127     RecordDecl *D1 = Field1->getType()->castAs<RecordType>()->getDecl();
1128     RecordDecl *D2 = Field2->getType()->castAs<RecordType>()->getDecl();
1129     return IsStructurallyEquivalent(Context, D1, D2);
1130   }
1131 
1132   // Check for equivalent field names.
1133   IdentifierInfo *Name1 = Field1->getIdentifier();
1134   IdentifierInfo *Name2 = Field2->getIdentifier();
1135   if (!::IsStructurallyEquivalent(Name1, Name2))
1136     return false;
1137 
1138   if (!IsStructurallyEquivalent(Context,
1139                                 Field1->getType(), Field2->getType())) {
1140     if (Context.Complain) {
1141       Context.Diag2(Owner2->getLocation(), diag::warn_odr_tag_type_inconsistent)
1142         << Context.C2.getTypeDeclType(Owner2);
1143       Context.Diag2(Field2->getLocation(), diag::note_odr_field)
1144         << Field2->getDeclName() << Field2->getType();
1145       Context.Diag1(Field1->getLocation(), diag::note_odr_field)
1146         << Field1->getDeclName() << Field1->getType();
1147     }
1148     return false;
1149   }
1150 
1151   if (Field1->isBitField() != Field2->isBitField()) {
1152     if (Context.Complain) {
1153       Context.Diag2(Owner2->getLocation(), diag::warn_odr_tag_type_inconsistent)
1154         << Context.C2.getTypeDeclType(Owner2);
1155       if (Field1->isBitField()) {
1156         Context.Diag1(Field1->getLocation(), diag::note_odr_bit_field)
1157         << Field1->getDeclName() << Field1->getType()
1158         << Field1->getBitWidthValue(Context.C1);
1159         Context.Diag2(Field2->getLocation(), diag::note_odr_not_bit_field)
1160         << Field2->getDeclName();
1161       } else {
1162         Context.Diag2(Field2->getLocation(), diag::note_odr_bit_field)
1163         << Field2->getDeclName() << Field2->getType()
1164         << Field2->getBitWidthValue(Context.C2);
1165         Context.Diag1(Field1->getLocation(), diag::note_odr_not_bit_field)
1166         << Field1->getDeclName();
1167       }
1168     }
1169     return false;
1170   }
1171 
1172   if (Field1->isBitField()) {
1173     // Make sure that the bit-fields are the same length.
1174     unsigned Bits1 = Field1->getBitWidthValue(Context.C1);
1175     unsigned Bits2 = Field2->getBitWidthValue(Context.C2);
1176 
1177     if (Bits1 != Bits2) {
1178       if (Context.Complain) {
1179         Context.Diag2(Owner2->getLocation(), diag::warn_odr_tag_type_inconsistent)
1180           << Context.C2.getTypeDeclType(Owner2);
1181         Context.Diag2(Field2->getLocation(), diag::note_odr_bit_field)
1182           << Field2->getDeclName() << Field2->getType() << Bits2;
1183         Context.Diag1(Field1->getLocation(), diag::note_odr_bit_field)
1184           << Field1->getDeclName() << Field1->getType() << Bits1;
1185       }
1186       return false;
1187     }
1188   }
1189 
1190   return true;
1191 }
1192 
1193 /// \brief Find the index of the given anonymous struct/union within its
1194 /// context.
1195 ///
1196 /// \returns Returns the index of this anonymous struct/union in its context,
1197 /// including the next assigned index (if none of them match). Returns an
1198 /// empty option if the context is not a record, i.e.. if the anonymous
1199 /// struct/union is at namespace or block scope.
1200 static Optional<unsigned> findUntaggedStructOrUnionIndex(RecordDecl *Anon) {
1201   ASTContext &Context = Anon->getASTContext();
1202   QualType AnonTy = Context.getRecordType(Anon);
1203 
1204   RecordDecl *Owner = dyn_cast<RecordDecl>(Anon->getDeclContext());
1205   if (!Owner)
1206     return None;
1207 
1208   unsigned Index = 0;
1209   for (const auto *D : Owner->noload_decls()) {
1210     const auto *F = dyn_cast<FieldDecl>(D);
1211     if (!F)
1212       continue;
1213 
1214     if (F->isAnonymousStructOrUnion()) {
1215       if (Context.hasSameType(F->getType(), AnonTy))
1216         break;
1217       ++Index;
1218       continue;
1219     }
1220 
1221     // If the field looks like this:
1222     // struct { ... } A;
1223     QualType FieldType = F->getType();
1224     if (const auto *RecType = dyn_cast<RecordType>(FieldType)) {
1225       const RecordDecl *RecDecl = RecType->getDecl();
1226       if (RecDecl->getDeclContext() == Owner &&
1227           !RecDecl->getIdentifier()) {
1228         if (Context.hasSameType(FieldType, AnonTy))
1229           break;
1230         ++Index;
1231         continue;
1232       }
1233     }
1234   }
1235 
1236   return Index;
1237 }
1238 
1239 /// \brief Determine structural equivalence of two records.
1240 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
1241                                      RecordDecl *D1, RecordDecl *D2) {
1242   if (D1->isUnion() != D2->isUnion()) {
1243     if (Context.Complain) {
1244       Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
1245         << Context.C2.getTypeDeclType(D2);
1246       Context.Diag1(D1->getLocation(), diag::note_odr_tag_kind_here)
1247         << D1->getDeclName() << (unsigned)D1->getTagKind();
1248     }
1249     return false;
1250   }
1251 
1252   if (D1->isAnonymousStructOrUnion() && D2->isAnonymousStructOrUnion()) {
1253     // If both anonymous structs/unions are in a record context, make sure
1254     // they occur in the same location in the context records.
1255     if (Optional<unsigned> Index1 = findUntaggedStructOrUnionIndex(D1)) {
1256       if (Optional<unsigned> Index2 = findUntaggedStructOrUnionIndex(D2)) {
1257         if (*Index1 != *Index2)
1258           return false;
1259       }
1260     }
1261   }
1262 
1263   // If both declarations are class template specializations, we know
1264   // the ODR applies, so check the template and template arguments.
1265   ClassTemplateSpecializationDecl *Spec1
1266     = dyn_cast<ClassTemplateSpecializationDecl>(D1);
1267   ClassTemplateSpecializationDecl *Spec2
1268     = dyn_cast<ClassTemplateSpecializationDecl>(D2);
1269   if (Spec1 && Spec2) {
1270     // Check that the specialized templates are the same.
1271     if (!IsStructurallyEquivalent(Context, Spec1->getSpecializedTemplate(),
1272                                   Spec2->getSpecializedTemplate()))
1273       return false;
1274 
1275     // Check that the template arguments are the same.
1276     if (Spec1->getTemplateArgs().size() != Spec2->getTemplateArgs().size())
1277       return false;
1278 
1279     for (unsigned I = 0, N = Spec1->getTemplateArgs().size(); I != N; ++I)
1280       if (!IsStructurallyEquivalent(Context,
1281                                     Spec1->getTemplateArgs().get(I),
1282                                     Spec2->getTemplateArgs().get(I)))
1283         return false;
1284   }
1285   // If one is a class template specialization and the other is not, these
1286   // structures are different.
1287   else if (Spec1 || Spec2)
1288     return false;
1289 
1290   // Compare the definitions of these two records. If either or both are
1291   // incomplete, we assume that they are equivalent.
1292   D1 = D1->getDefinition();
1293   D2 = D2->getDefinition();
1294   if (!D1 || !D2)
1295     return true;
1296 
1297   if (CXXRecordDecl *D1CXX = dyn_cast<CXXRecordDecl>(D1)) {
1298     if (CXXRecordDecl *D2CXX = dyn_cast<CXXRecordDecl>(D2)) {
1299       if (D1CXX->getNumBases() != D2CXX->getNumBases()) {
1300         if (Context.Complain) {
1301           Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
1302             << Context.C2.getTypeDeclType(D2);
1303           Context.Diag2(D2->getLocation(), diag::note_odr_number_of_bases)
1304             << D2CXX->getNumBases();
1305           Context.Diag1(D1->getLocation(), diag::note_odr_number_of_bases)
1306             << D1CXX->getNumBases();
1307         }
1308         return false;
1309       }
1310 
1311       // Check the base classes.
1312       for (CXXRecordDecl::base_class_iterator Base1 = D1CXX->bases_begin(),
1313                                            BaseEnd1 = D1CXX->bases_end(),
1314                                                 Base2 = D2CXX->bases_begin();
1315            Base1 != BaseEnd1;
1316            ++Base1, ++Base2) {
1317         if (!IsStructurallyEquivalent(Context,
1318                                       Base1->getType(), Base2->getType())) {
1319           if (Context.Complain) {
1320             Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
1321               << Context.C2.getTypeDeclType(D2);
1322             Context.Diag2(Base2->getLocStart(), diag::note_odr_base)
1323               << Base2->getType()
1324               << Base2->getSourceRange();
1325             Context.Diag1(Base1->getLocStart(), diag::note_odr_base)
1326               << Base1->getType()
1327               << Base1->getSourceRange();
1328           }
1329           return false;
1330         }
1331 
1332         // Check virtual vs. non-virtual inheritance mismatch.
1333         if (Base1->isVirtual() != Base2->isVirtual()) {
1334           if (Context.Complain) {
1335             Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
1336               << Context.C2.getTypeDeclType(D2);
1337             Context.Diag2(Base2->getLocStart(),
1338                           diag::note_odr_virtual_base)
1339               << Base2->isVirtual() << Base2->getSourceRange();
1340             Context.Diag1(Base1->getLocStart(), diag::note_odr_base)
1341               << Base1->isVirtual()
1342               << Base1->getSourceRange();
1343           }
1344           return false;
1345         }
1346       }
1347     } else if (D1CXX->getNumBases() > 0) {
1348       if (Context.Complain) {
1349         Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
1350           << Context.C2.getTypeDeclType(D2);
1351         const CXXBaseSpecifier *Base1 = D1CXX->bases_begin();
1352         Context.Diag1(Base1->getLocStart(), diag::note_odr_base)
1353           << Base1->getType()
1354           << Base1->getSourceRange();
1355         Context.Diag2(D2->getLocation(), diag::note_odr_missing_base);
1356       }
1357       return false;
1358     }
1359   }
1360 
1361   // Check the fields for consistency.
1362   RecordDecl::field_iterator Field2 = D2->field_begin(),
1363                              Field2End = D2->field_end();
1364   for (RecordDecl::field_iterator Field1 = D1->field_begin(),
1365                                   Field1End = D1->field_end();
1366        Field1 != Field1End;
1367        ++Field1, ++Field2) {
1368     if (Field2 == Field2End) {
1369       if (Context.Complain) {
1370         Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
1371           << Context.C2.getTypeDeclType(D2);
1372         Context.Diag1(Field1->getLocation(), diag::note_odr_field)
1373           << Field1->getDeclName() << Field1->getType();
1374         Context.Diag2(D2->getLocation(), diag::note_odr_missing_field);
1375       }
1376       return false;
1377     }
1378 
1379     if (!IsStructurallyEquivalent(Context, *Field1, *Field2))
1380       return false;
1381   }
1382 
1383   if (Field2 != Field2End) {
1384     if (Context.Complain) {
1385       Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
1386         << Context.C2.getTypeDeclType(D2);
1387       Context.Diag2(Field2->getLocation(), diag::note_odr_field)
1388         << Field2->getDeclName() << Field2->getType();
1389       Context.Diag1(D1->getLocation(), diag::note_odr_missing_field);
1390     }
1391     return false;
1392   }
1393 
1394   return true;
1395 }
1396 
1397 /// \brief Determine structural equivalence of two enums.
1398 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
1399                                      EnumDecl *D1, EnumDecl *D2) {
1400   EnumDecl::enumerator_iterator EC2 = D2->enumerator_begin(),
1401                              EC2End = D2->enumerator_end();
1402   for (EnumDecl::enumerator_iterator EC1 = D1->enumerator_begin(),
1403                                   EC1End = D1->enumerator_end();
1404        EC1 != EC1End; ++EC1, ++EC2) {
1405     if (EC2 == EC2End) {
1406       if (Context.Complain) {
1407         Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
1408           << Context.C2.getTypeDeclType(D2);
1409         Context.Diag1(EC1->getLocation(), diag::note_odr_enumerator)
1410           << EC1->getDeclName()
1411           << EC1->getInitVal().toString(10);
1412         Context.Diag2(D2->getLocation(), diag::note_odr_missing_enumerator);
1413       }
1414       return false;
1415     }
1416 
1417     llvm::APSInt Val1 = EC1->getInitVal();
1418     llvm::APSInt Val2 = EC2->getInitVal();
1419     if (!llvm::APSInt::isSameValue(Val1, Val2) ||
1420         !IsStructurallyEquivalent(EC1->getIdentifier(), EC2->getIdentifier())) {
1421       if (Context.Complain) {
1422         Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
1423           << Context.C2.getTypeDeclType(D2);
1424         Context.Diag2(EC2->getLocation(), diag::note_odr_enumerator)
1425           << EC2->getDeclName()
1426           << EC2->getInitVal().toString(10);
1427         Context.Diag1(EC1->getLocation(), diag::note_odr_enumerator)
1428           << EC1->getDeclName()
1429           << EC1->getInitVal().toString(10);
1430       }
1431       return false;
1432     }
1433   }
1434 
1435   if (EC2 != EC2End) {
1436     if (Context.Complain) {
1437       Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
1438         << Context.C2.getTypeDeclType(D2);
1439       Context.Diag2(EC2->getLocation(), diag::note_odr_enumerator)
1440         << EC2->getDeclName()
1441         << EC2->getInitVal().toString(10);
1442       Context.Diag1(D1->getLocation(), diag::note_odr_missing_enumerator);
1443     }
1444     return false;
1445   }
1446 
1447   return true;
1448 }
1449 
1450 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
1451                                      TemplateParameterList *Params1,
1452                                      TemplateParameterList *Params2) {
1453   if (Params1->size() != Params2->size()) {
1454     if (Context.Complain) {
1455       Context.Diag2(Params2->getTemplateLoc(),
1456                     diag::err_odr_different_num_template_parameters)
1457         << Params1->size() << Params2->size();
1458       Context.Diag1(Params1->getTemplateLoc(),
1459                     diag::note_odr_template_parameter_list);
1460     }
1461     return false;
1462   }
1463 
1464   for (unsigned I = 0, N = Params1->size(); I != N; ++I) {
1465     if (Params1->getParam(I)->getKind() != Params2->getParam(I)->getKind()) {
1466       if (Context.Complain) {
1467         Context.Diag2(Params2->getParam(I)->getLocation(),
1468                       diag::err_odr_different_template_parameter_kind);
1469         Context.Diag1(Params1->getParam(I)->getLocation(),
1470                       diag::note_odr_template_parameter_here);
1471       }
1472       return false;
1473     }
1474 
1475     if (!Context.IsStructurallyEquivalent(Params1->getParam(I),
1476                                           Params2->getParam(I))) {
1477 
1478       return false;
1479     }
1480   }
1481 
1482   return true;
1483 }
1484 
1485 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
1486                                      TemplateTypeParmDecl *D1,
1487                                      TemplateTypeParmDecl *D2) {
1488   if (D1->isParameterPack() != D2->isParameterPack()) {
1489     if (Context.Complain) {
1490       Context.Diag2(D2->getLocation(), diag::err_odr_parameter_pack_non_pack)
1491         << D2->isParameterPack();
1492       Context.Diag1(D1->getLocation(), diag::note_odr_parameter_pack_non_pack)
1493         << D1->isParameterPack();
1494     }
1495     return false;
1496   }
1497 
1498   return true;
1499 }
1500 
1501 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
1502                                      NonTypeTemplateParmDecl *D1,
1503                                      NonTypeTemplateParmDecl *D2) {
1504   if (D1->isParameterPack() != D2->isParameterPack()) {
1505     if (Context.Complain) {
1506       Context.Diag2(D2->getLocation(), diag::err_odr_parameter_pack_non_pack)
1507         << D2->isParameterPack();
1508       Context.Diag1(D1->getLocation(), diag::note_odr_parameter_pack_non_pack)
1509         << D1->isParameterPack();
1510     }
1511     return false;
1512   }
1513 
1514   // Check types.
1515   if (!Context.IsStructurallyEquivalent(D1->getType(), D2->getType())) {
1516     if (Context.Complain) {
1517       Context.Diag2(D2->getLocation(),
1518                     diag::err_odr_non_type_parameter_type_inconsistent)
1519         << D2->getType() << D1->getType();
1520       Context.Diag1(D1->getLocation(), diag::note_odr_value_here)
1521         << D1->getType();
1522     }
1523     return false;
1524   }
1525 
1526   return true;
1527 }
1528 
1529 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
1530                                      TemplateTemplateParmDecl *D1,
1531                                      TemplateTemplateParmDecl *D2) {
1532   if (D1->isParameterPack() != D2->isParameterPack()) {
1533     if (Context.Complain) {
1534       Context.Diag2(D2->getLocation(), diag::err_odr_parameter_pack_non_pack)
1535         << D2->isParameterPack();
1536       Context.Diag1(D1->getLocation(), diag::note_odr_parameter_pack_non_pack)
1537         << D1->isParameterPack();
1538     }
1539     return false;
1540   }
1541 
1542   // Check template parameter lists.
1543   return IsStructurallyEquivalent(Context, D1->getTemplateParameters(),
1544                                   D2->getTemplateParameters());
1545 }
1546 
1547 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
1548                                      ClassTemplateDecl *D1,
1549                                      ClassTemplateDecl *D2) {
1550   // Check template parameters.
1551   if (!IsStructurallyEquivalent(Context,
1552                                 D1->getTemplateParameters(),
1553                                 D2->getTemplateParameters()))
1554     return false;
1555 
1556   // Check the templated declaration.
1557   return Context.IsStructurallyEquivalent(D1->getTemplatedDecl(),
1558                                           D2->getTemplatedDecl());
1559 }
1560 
1561 /// \brief Determine structural equivalence of two declarations.
1562 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
1563                                      Decl *D1, Decl *D2) {
1564   // FIXME: Check for known structural equivalences via a callback of some sort.
1565 
1566   // Check whether we already know that these two declarations are not
1567   // structurally equivalent.
1568   if (Context.NonEquivalentDecls.count(std::make_pair(D1->getCanonicalDecl(),
1569                                                       D2->getCanonicalDecl())))
1570     return false;
1571 
1572   // Determine whether we've already produced a tentative equivalence for D1.
1573   Decl *&EquivToD1 = Context.TentativeEquivalences[D1->getCanonicalDecl()];
1574   if (EquivToD1)
1575     return EquivToD1 == D2->getCanonicalDecl();
1576 
1577   // Produce a tentative equivalence D1 <-> D2, which will be checked later.
1578   EquivToD1 = D2->getCanonicalDecl();
1579   Context.DeclsToCheck.push_back(D1->getCanonicalDecl());
1580   return true;
1581 }
1582 
1583 bool StructuralEquivalenceContext::IsStructurallyEquivalent(Decl *D1,
1584                                                             Decl *D2) {
1585   if (!::IsStructurallyEquivalent(*this, D1, D2))
1586     return false;
1587 
1588   return !Finish();
1589 }
1590 
1591 bool StructuralEquivalenceContext::IsStructurallyEquivalent(QualType T1,
1592                                                             QualType T2) {
1593   if (!::IsStructurallyEquivalent(*this, T1, T2))
1594     return false;
1595 
1596   return !Finish();
1597 }
1598 
1599 bool StructuralEquivalenceContext::Finish() {
1600   while (!DeclsToCheck.empty()) {
1601     // Check the next declaration.
1602     Decl *D1 = DeclsToCheck.front();
1603     DeclsToCheck.pop_front();
1604 
1605     Decl *D2 = TentativeEquivalences[D1];
1606     assert(D2 && "Unrecorded tentative equivalence?");
1607 
1608     bool Equivalent = true;
1609 
1610     // FIXME: Switch on all declaration kinds. For now, we're just going to
1611     // check the obvious ones.
1612     if (RecordDecl *Record1 = dyn_cast<RecordDecl>(D1)) {
1613       if (RecordDecl *Record2 = dyn_cast<RecordDecl>(D2)) {
1614         // Check for equivalent structure names.
1615         IdentifierInfo *Name1 = Record1->getIdentifier();
1616         if (!Name1 && Record1->getTypedefNameForAnonDecl())
1617           Name1 = Record1->getTypedefNameForAnonDecl()->getIdentifier();
1618         IdentifierInfo *Name2 = Record2->getIdentifier();
1619         if (!Name2 && Record2->getTypedefNameForAnonDecl())
1620           Name2 = Record2->getTypedefNameForAnonDecl()->getIdentifier();
1621         if (!::IsStructurallyEquivalent(Name1, Name2) ||
1622             !::IsStructurallyEquivalent(*this, Record1, Record2))
1623           Equivalent = false;
1624       } else {
1625         // Record/non-record mismatch.
1626         Equivalent = false;
1627       }
1628     } else if (EnumDecl *Enum1 = dyn_cast<EnumDecl>(D1)) {
1629       if (EnumDecl *Enum2 = dyn_cast<EnumDecl>(D2)) {
1630         // Check for equivalent enum names.
1631         IdentifierInfo *Name1 = Enum1->getIdentifier();
1632         if (!Name1 && Enum1->getTypedefNameForAnonDecl())
1633           Name1 = Enum1->getTypedefNameForAnonDecl()->getIdentifier();
1634         IdentifierInfo *Name2 = Enum2->getIdentifier();
1635         if (!Name2 && Enum2->getTypedefNameForAnonDecl())
1636           Name2 = Enum2->getTypedefNameForAnonDecl()->getIdentifier();
1637         if (!::IsStructurallyEquivalent(Name1, Name2) ||
1638             !::IsStructurallyEquivalent(*this, Enum1, Enum2))
1639           Equivalent = false;
1640       } else {
1641         // Enum/non-enum mismatch
1642         Equivalent = false;
1643       }
1644     } else if (TypedefNameDecl *Typedef1 = dyn_cast<TypedefNameDecl>(D1)) {
1645       if (TypedefNameDecl *Typedef2 = dyn_cast<TypedefNameDecl>(D2)) {
1646         if (!::IsStructurallyEquivalent(Typedef1->getIdentifier(),
1647                                         Typedef2->getIdentifier()) ||
1648             !::IsStructurallyEquivalent(*this,
1649                                         Typedef1->getUnderlyingType(),
1650                                         Typedef2->getUnderlyingType()))
1651           Equivalent = false;
1652       } else {
1653         // Typedef/non-typedef mismatch.
1654         Equivalent = false;
1655       }
1656     } else if (ClassTemplateDecl *ClassTemplate1
1657                                            = dyn_cast<ClassTemplateDecl>(D1)) {
1658       if (ClassTemplateDecl *ClassTemplate2 = dyn_cast<ClassTemplateDecl>(D2)) {
1659         if (!::IsStructurallyEquivalent(ClassTemplate1->getIdentifier(),
1660                                         ClassTemplate2->getIdentifier()) ||
1661             !::IsStructurallyEquivalent(*this, ClassTemplate1, ClassTemplate2))
1662           Equivalent = false;
1663       } else {
1664         // Class template/non-class-template mismatch.
1665         Equivalent = false;
1666       }
1667     } else if (TemplateTypeParmDecl *TTP1= dyn_cast<TemplateTypeParmDecl>(D1)) {
1668       if (TemplateTypeParmDecl *TTP2 = dyn_cast<TemplateTypeParmDecl>(D2)) {
1669         if (!::IsStructurallyEquivalent(*this, TTP1, TTP2))
1670           Equivalent = false;
1671       } else {
1672         // Kind mismatch.
1673         Equivalent = false;
1674       }
1675     } else if (NonTypeTemplateParmDecl *NTTP1
1676                                      = dyn_cast<NonTypeTemplateParmDecl>(D1)) {
1677       if (NonTypeTemplateParmDecl *NTTP2
1678                                       = dyn_cast<NonTypeTemplateParmDecl>(D2)) {
1679         if (!::IsStructurallyEquivalent(*this, NTTP1, NTTP2))
1680           Equivalent = false;
1681       } else {
1682         // Kind mismatch.
1683         Equivalent = false;
1684       }
1685     } else if (TemplateTemplateParmDecl *TTP1
1686                                   = dyn_cast<TemplateTemplateParmDecl>(D1)) {
1687       if (TemplateTemplateParmDecl *TTP2
1688                                     = dyn_cast<TemplateTemplateParmDecl>(D2)) {
1689         if (!::IsStructurallyEquivalent(*this, TTP1, TTP2))
1690           Equivalent = false;
1691       } else {
1692         // Kind mismatch.
1693         Equivalent = false;
1694       }
1695     }
1696 
1697     if (!Equivalent) {
1698       // Note that these two declarations are not equivalent (and we already
1699       // know about it).
1700       NonEquivalentDecls.insert(std::make_pair(D1->getCanonicalDecl(),
1701                                                D2->getCanonicalDecl()));
1702       return true;
1703     }
1704     // FIXME: Check other declaration kinds!
1705   }
1706 
1707   return false;
1708 }
1709 
1710 //----------------------------------------------------------------------------
1711 // Import Types
1712 //----------------------------------------------------------------------------
1713 
1714 QualType ASTNodeImporter::VisitType(const Type *T) {
1715   Importer.FromDiag(SourceLocation(), diag::err_unsupported_ast_node)
1716     << T->getTypeClassName();
1717   return QualType();
1718 }
1719 
1720 QualType ASTNodeImporter::VisitAtomicType(const AtomicType *T){
1721   QualType UnderlyingType = Importer.Import(T->getValueType());
1722   if(UnderlyingType.isNull())
1723     return QualType();
1724 
1725   return Importer.getToContext().getAtomicType(UnderlyingType);
1726 }
1727 
1728 QualType ASTNodeImporter::VisitBuiltinType(const BuiltinType *T) {
1729   switch (T->getKind()) {
1730 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
1731   case BuiltinType::Id: \
1732     return Importer.getToContext().SingletonId;
1733 #include "clang/Basic/OpenCLImageTypes.def"
1734 #define SHARED_SINGLETON_TYPE(Expansion)
1735 #define BUILTIN_TYPE(Id, SingletonId) \
1736   case BuiltinType::Id: return Importer.getToContext().SingletonId;
1737 #include "clang/AST/BuiltinTypes.def"
1738 
1739   // FIXME: for Char16, Char32, and NullPtr, make sure that the "to"
1740   // context supports C++.
1741 
1742   // FIXME: for ObjCId, ObjCClass, and ObjCSel, make sure that the "to"
1743   // context supports ObjC.
1744 
1745   case BuiltinType::Char_U:
1746     // The context we're importing from has an unsigned 'char'. If we're
1747     // importing into a context with a signed 'char', translate to
1748     // 'unsigned char' instead.
1749     if (Importer.getToContext().getLangOpts().CharIsSigned)
1750       return Importer.getToContext().UnsignedCharTy;
1751 
1752     return Importer.getToContext().CharTy;
1753 
1754   case BuiltinType::Char_S:
1755     // The context we're importing from has an unsigned 'char'. If we're
1756     // importing into a context with a signed 'char', translate to
1757     // 'unsigned char' instead.
1758     if (!Importer.getToContext().getLangOpts().CharIsSigned)
1759       return Importer.getToContext().SignedCharTy;
1760 
1761     return Importer.getToContext().CharTy;
1762 
1763   case BuiltinType::WChar_S:
1764   case BuiltinType::WChar_U:
1765     // FIXME: If not in C++, shall we translate to the C equivalent of
1766     // wchar_t?
1767     return Importer.getToContext().WCharTy;
1768   }
1769 
1770   llvm_unreachable("Invalid BuiltinType Kind!");
1771 }
1772 
1773 QualType ASTNodeImporter::VisitDecayedType(const DecayedType *T) {
1774   QualType OrigT = Importer.Import(T->getOriginalType());
1775   if (OrigT.isNull())
1776     return QualType();
1777 
1778   return Importer.getToContext().getDecayedType(OrigT);
1779 }
1780 
1781 QualType ASTNodeImporter::VisitComplexType(const ComplexType *T) {
1782   QualType ToElementType = Importer.Import(T->getElementType());
1783   if (ToElementType.isNull())
1784     return QualType();
1785 
1786   return Importer.getToContext().getComplexType(ToElementType);
1787 }
1788 
1789 QualType ASTNodeImporter::VisitPointerType(const PointerType *T) {
1790   QualType ToPointeeType = Importer.Import(T->getPointeeType());
1791   if (ToPointeeType.isNull())
1792     return QualType();
1793 
1794   return Importer.getToContext().getPointerType(ToPointeeType);
1795 }
1796 
1797 QualType ASTNodeImporter::VisitBlockPointerType(const BlockPointerType *T) {
1798   // FIXME: Check for blocks support in "to" context.
1799   QualType ToPointeeType = Importer.Import(T->getPointeeType());
1800   if (ToPointeeType.isNull())
1801     return QualType();
1802 
1803   return Importer.getToContext().getBlockPointerType(ToPointeeType);
1804 }
1805 
1806 QualType
1807 ASTNodeImporter::VisitLValueReferenceType(const LValueReferenceType *T) {
1808   // FIXME: Check for C++ support in "to" context.
1809   QualType ToPointeeType = Importer.Import(T->getPointeeTypeAsWritten());
1810   if (ToPointeeType.isNull())
1811     return QualType();
1812 
1813   return Importer.getToContext().getLValueReferenceType(ToPointeeType);
1814 }
1815 
1816 QualType
1817 ASTNodeImporter::VisitRValueReferenceType(const RValueReferenceType *T) {
1818   // FIXME: Check for C++0x support in "to" context.
1819   QualType ToPointeeType = Importer.Import(T->getPointeeTypeAsWritten());
1820   if (ToPointeeType.isNull())
1821     return QualType();
1822 
1823   return Importer.getToContext().getRValueReferenceType(ToPointeeType);
1824 }
1825 
1826 QualType ASTNodeImporter::VisitMemberPointerType(const MemberPointerType *T) {
1827   // FIXME: Check for C++ support in "to" context.
1828   QualType ToPointeeType = Importer.Import(T->getPointeeType());
1829   if (ToPointeeType.isNull())
1830     return QualType();
1831 
1832   QualType ClassType = Importer.Import(QualType(T->getClass(), 0));
1833   return Importer.getToContext().getMemberPointerType(ToPointeeType,
1834                                                       ClassType.getTypePtr());
1835 }
1836 
1837 QualType ASTNodeImporter::VisitConstantArrayType(const ConstantArrayType *T) {
1838   QualType ToElementType = Importer.Import(T->getElementType());
1839   if (ToElementType.isNull())
1840     return QualType();
1841 
1842   return Importer.getToContext().getConstantArrayType(ToElementType,
1843                                                       T->getSize(),
1844                                                       T->getSizeModifier(),
1845                                                T->getIndexTypeCVRQualifiers());
1846 }
1847 
1848 QualType
1849 ASTNodeImporter::VisitIncompleteArrayType(const IncompleteArrayType *T) {
1850   QualType ToElementType = Importer.Import(T->getElementType());
1851   if (ToElementType.isNull())
1852     return QualType();
1853 
1854   return Importer.getToContext().getIncompleteArrayType(ToElementType,
1855                                                         T->getSizeModifier(),
1856                                                 T->getIndexTypeCVRQualifiers());
1857 }
1858 
1859 QualType ASTNodeImporter::VisitVariableArrayType(const VariableArrayType *T) {
1860   QualType ToElementType = Importer.Import(T->getElementType());
1861   if (ToElementType.isNull())
1862     return QualType();
1863 
1864   Expr *Size = Importer.Import(T->getSizeExpr());
1865   if (!Size)
1866     return QualType();
1867 
1868   SourceRange Brackets = Importer.Import(T->getBracketsRange());
1869   return Importer.getToContext().getVariableArrayType(ToElementType, Size,
1870                                                       T->getSizeModifier(),
1871                                                 T->getIndexTypeCVRQualifiers(),
1872                                                       Brackets);
1873 }
1874 
1875 QualType ASTNodeImporter::VisitVectorType(const VectorType *T) {
1876   QualType ToElementType = Importer.Import(T->getElementType());
1877   if (ToElementType.isNull())
1878     return QualType();
1879 
1880   return Importer.getToContext().getVectorType(ToElementType,
1881                                                T->getNumElements(),
1882                                                T->getVectorKind());
1883 }
1884 
1885 QualType ASTNodeImporter::VisitExtVectorType(const ExtVectorType *T) {
1886   QualType ToElementType = Importer.Import(T->getElementType());
1887   if (ToElementType.isNull())
1888     return QualType();
1889 
1890   return Importer.getToContext().getExtVectorType(ToElementType,
1891                                                   T->getNumElements());
1892 }
1893 
1894 QualType
1895 ASTNodeImporter::VisitFunctionNoProtoType(const FunctionNoProtoType *T) {
1896   // FIXME: What happens if we're importing a function without a prototype
1897   // into C++? Should we make it variadic?
1898   QualType ToResultType = Importer.Import(T->getReturnType());
1899   if (ToResultType.isNull())
1900     return QualType();
1901 
1902   return Importer.getToContext().getFunctionNoProtoType(ToResultType,
1903                                                         T->getExtInfo());
1904 }
1905 
1906 QualType ASTNodeImporter::VisitFunctionProtoType(const FunctionProtoType *T) {
1907   QualType ToResultType = Importer.Import(T->getReturnType());
1908   if (ToResultType.isNull())
1909     return QualType();
1910 
1911   // Import argument types
1912   SmallVector<QualType, 4> ArgTypes;
1913   for (const auto &A : T->param_types()) {
1914     QualType ArgType = Importer.Import(A);
1915     if (ArgType.isNull())
1916       return QualType();
1917     ArgTypes.push_back(ArgType);
1918   }
1919 
1920   // Import exception types
1921   SmallVector<QualType, 4> ExceptionTypes;
1922   for (const auto &E : T->exceptions()) {
1923     QualType ExceptionType = Importer.Import(E);
1924     if (ExceptionType.isNull())
1925       return QualType();
1926     ExceptionTypes.push_back(ExceptionType);
1927   }
1928 
1929   FunctionProtoType::ExtProtoInfo FromEPI = T->getExtProtoInfo();
1930   FunctionProtoType::ExtProtoInfo ToEPI;
1931 
1932   ToEPI.ExtInfo = FromEPI.ExtInfo;
1933   ToEPI.Variadic = FromEPI.Variadic;
1934   ToEPI.HasTrailingReturn = FromEPI.HasTrailingReturn;
1935   ToEPI.TypeQuals = FromEPI.TypeQuals;
1936   ToEPI.RefQualifier = FromEPI.RefQualifier;
1937   ToEPI.ExceptionSpec.Type = FromEPI.ExceptionSpec.Type;
1938   ToEPI.ExceptionSpec.Exceptions = ExceptionTypes;
1939   ToEPI.ExceptionSpec.NoexceptExpr =
1940       Importer.Import(FromEPI.ExceptionSpec.NoexceptExpr);
1941   ToEPI.ExceptionSpec.SourceDecl = cast_or_null<FunctionDecl>(
1942       Importer.Import(FromEPI.ExceptionSpec.SourceDecl));
1943   ToEPI.ExceptionSpec.SourceTemplate = cast_or_null<FunctionDecl>(
1944       Importer.Import(FromEPI.ExceptionSpec.SourceTemplate));
1945 
1946   return Importer.getToContext().getFunctionType(ToResultType, ArgTypes, ToEPI);
1947 }
1948 
1949 QualType ASTNodeImporter::VisitParenType(const ParenType *T) {
1950   QualType ToInnerType = Importer.Import(T->getInnerType());
1951   if (ToInnerType.isNull())
1952     return QualType();
1953 
1954   return Importer.getToContext().getParenType(ToInnerType);
1955 }
1956 
1957 QualType ASTNodeImporter::VisitTypedefType(const TypedefType *T) {
1958   TypedefNameDecl *ToDecl
1959              = dyn_cast_or_null<TypedefNameDecl>(Importer.Import(T->getDecl()));
1960   if (!ToDecl)
1961     return QualType();
1962 
1963   return Importer.getToContext().getTypeDeclType(ToDecl);
1964 }
1965 
1966 QualType ASTNodeImporter::VisitTypeOfExprType(const TypeOfExprType *T) {
1967   Expr *ToExpr = Importer.Import(T->getUnderlyingExpr());
1968   if (!ToExpr)
1969     return QualType();
1970 
1971   return Importer.getToContext().getTypeOfExprType(ToExpr);
1972 }
1973 
1974 QualType ASTNodeImporter::VisitTypeOfType(const TypeOfType *T) {
1975   QualType ToUnderlyingType = Importer.Import(T->getUnderlyingType());
1976   if (ToUnderlyingType.isNull())
1977     return QualType();
1978 
1979   return Importer.getToContext().getTypeOfType(ToUnderlyingType);
1980 }
1981 
1982 QualType ASTNodeImporter::VisitDecltypeType(const DecltypeType *T) {
1983   // FIXME: Make sure that the "to" context supports C++0x!
1984   Expr *ToExpr = Importer.Import(T->getUnderlyingExpr());
1985   if (!ToExpr)
1986     return QualType();
1987 
1988   QualType UnderlyingType = Importer.Import(T->getUnderlyingType());
1989   if (UnderlyingType.isNull())
1990     return QualType();
1991 
1992   return Importer.getToContext().getDecltypeType(ToExpr, UnderlyingType);
1993 }
1994 
1995 QualType ASTNodeImporter::VisitUnaryTransformType(const UnaryTransformType *T) {
1996   QualType ToBaseType = Importer.Import(T->getBaseType());
1997   QualType ToUnderlyingType = Importer.Import(T->getUnderlyingType());
1998   if (ToBaseType.isNull() || ToUnderlyingType.isNull())
1999     return QualType();
2000 
2001   return Importer.getToContext().getUnaryTransformType(ToBaseType,
2002                                                        ToUnderlyingType,
2003                                                        T->getUTTKind());
2004 }
2005 
2006 QualType ASTNodeImporter::VisitAutoType(const AutoType *T) {
2007   // FIXME: Make sure that the "to" context supports C++11!
2008   QualType FromDeduced = T->getDeducedType();
2009   QualType ToDeduced;
2010   if (!FromDeduced.isNull()) {
2011     ToDeduced = Importer.Import(FromDeduced);
2012     if (ToDeduced.isNull())
2013       return QualType();
2014   }
2015 
2016   return Importer.getToContext().getAutoType(ToDeduced, T->getKeyword(),
2017                                              /*IsDependent*/false);
2018 }
2019 
2020 QualType ASTNodeImporter::VisitInjectedClassNameType(
2021     const InjectedClassNameType *T) {
2022   CXXRecordDecl *D = cast_or_null<CXXRecordDecl>(Importer.Import(T->getDecl()));
2023   if (!D)
2024     return QualType();
2025 
2026   QualType InjType = Importer.Import(T->getInjectedSpecializationType());
2027   if (InjType.isNull())
2028     return QualType();
2029 
2030   // FIXME: ASTContext::getInjectedClassNameType is not suitable for AST reading
2031   // See comments in InjectedClassNameType definition for details
2032   // return Importer.getToContext().getInjectedClassNameType(D, InjType);
2033   enum {
2034     TypeAlignmentInBits = 4,
2035     TypeAlignment = 1 << TypeAlignmentInBits
2036   };
2037 
2038   return QualType(new (Importer.getToContext(), TypeAlignment)
2039                   InjectedClassNameType(D, InjType), 0);
2040 }
2041 
2042 QualType ASTNodeImporter::VisitRecordType(const RecordType *T) {
2043   RecordDecl *ToDecl
2044     = dyn_cast_or_null<RecordDecl>(Importer.Import(T->getDecl()));
2045   if (!ToDecl)
2046     return QualType();
2047 
2048   return Importer.getToContext().getTagDeclType(ToDecl);
2049 }
2050 
2051 QualType ASTNodeImporter::VisitEnumType(const EnumType *T) {
2052   EnumDecl *ToDecl
2053     = dyn_cast_or_null<EnumDecl>(Importer.Import(T->getDecl()));
2054   if (!ToDecl)
2055     return QualType();
2056 
2057   return Importer.getToContext().getTagDeclType(ToDecl);
2058 }
2059 
2060 QualType ASTNodeImporter::VisitAttributedType(const AttributedType *T) {
2061   QualType FromModifiedType = T->getModifiedType();
2062   QualType FromEquivalentType = T->getEquivalentType();
2063   QualType ToModifiedType;
2064   QualType ToEquivalentType;
2065 
2066   if (!FromModifiedType.isNull()) {
2067     ToModifiedType = Importer.Import(FromModifiedType);
2068     if (ToModifiedType.isNull())
2069       return QualType();
2070   }
2071   if (!FromEquivalentType.isNull()) {
2072     ToEquivalentType = Importer.Import(FromEquivalentType);
2073     if (ToEquivalentType.isNull())
2074       return QualType();
2075   }
2076 
2077   return Importer.getToContext().getAttributedType(T->getAttrKind(),
2078     ToModifiedType, ToEquivalentType);
2079 }
2080 
2081 
2082 QualType ASTNodeImporter::VisitTemplateTypeParmType(
2083     const TemplateTypeParmType *T) {
2084   TemplateTypeParmDecl *ParmDecl =
2085       cast_or_null<TemplateTypeParmDecl>(Importer.Import(T->getDecl()));
2086   if (!ParmDecl && T->getDecl())
2087     return QualType();
2088 
2089   return Importer.getToContext().getTemplateTypeParmType(
2090         T->getDepth(), T->getIndex(), T->isParameterPack(), ParmDecl);
2091 }
2092 
2093 QualType ASTNodeImporter::VisitSubstTemplateTypeParmType(
2094     const SubstTemplateTypeParmType *T) {
2095   const TemplateTypeParmType *Replaced =
2096       cast_or_null<TemplateTypeParmType>(Importer.Import(
2097         QualType(T->getReplacedParameter(), 0)).getTypePtr());
2098   if (!Replaced)
2099     return QualType();
2100 
2101   QualType Replacement = Importer.Import(T->getReplacementType());
2102   if (Replacement.isNull())
2103     return QualType();
2104   Replacement = Replacement.getCanonicalType();
2105 
2106   return Importer.getToContext().getSubstTemplateTypeParmType(
2107         Replaced, Replacement);
2108 }
2109 
2110 QualType ASTNodeImporter::VisitTemplateSpecializationType(
2111                                        const TemplateSpecializationType *T) {
2112   TemplateName ToTemplate = Importer.Import(T->getTemplateName());
2113   if (ToTemplate.isNull())
2114     return QualType();
2115 
2116   SmallVector<TemplateArgument, 2> ToTemplateArgs;
2117   if (ImportTemplateArguments(T->getArgs(), T->getNumArgs(), ToTemplateArgs))
2118     return QualType();
2119 
2120   QualType ToCanonType;
2121   if (!QualType(T, 0).isCanonical()) {
2122     QualType FromCanonType
2123       = Importer.getFromContext().getCanonicalType(QualType(T, 0));
2124     ToCanonType =Importer.Import(FromCanonType);
2125     if (ToCanonType.isNull())
2126       return QualType();
2127   }
2128   return Importer.getToContext().getTemplateSpecializationType(ToTemplate,
2129                                                                ToTemplateArgs,
2130                                                                ToCanonType);
2131 }
2132 
2133 QualType ASTNodeImporter::VisitElaboratedType(const ElaboratedType *T) {
2134   NestedNameSpecifier *ToQualifier = nullptr;
2135   // Note: the qualifier in an ElaboratedType is optional.
2136   if (T->getQualifier()) {
2137     ToQualifier = Importer.Import(T->getQualifier());
2138     if (!ToQualifier)
2139       return QualType();
2140   }
2141 
2142   QualType ToNamedType = Importer.Import(T->getNamedType());
2143   if (ToNamedType.isNull())
2144     return QualType();
2145 
2146   return Importer.getToContext().getElaboratedType(T->getKeyword(),
2147                                                    ToQualifier, ToNamedType);
2148 }
2149 
2150 QualType ASTNodeImporter::VisitObjCInterfaceType(const ObjCInterfaceType *T) {
2151   ObjCInterfaceDecl *Class
2152     = dyn_cast_or_null<ObjCInterfaceDecl>(Importer.Import(T->getDecl()));
2153   if (!Class)
2154     return QualType();
2155 
2156   return Importer.getToContext().getObjCInterfaceType(Class);
2157 }
2158 
2159 QualType ASTNodeImporter::VisitObjCObjectType(const ObjCObjectType *T) {
2160   QualType ToBaseType = Importer.Import(T->getBaseType());
2161   if (ToBaseType.isNull())
2162     return QualType();
2163 
2164   SmallVector<QualType, 4> TypeArgs;
2165   for (auto TypeArg : T->getTypeArgsAsWritten()) {
2166     QualType ImportedTypeArg = Importer.Import(TypeArg);
2167     if (ImportedTypeArg.isNull())
2168       return QualType();
2169 
2170     TypeArgs.push_back(ImportedTypeArg);
2171   }
2172 
2173   SmallVector<ObjCProtocolDecl *, 4> Protocols;
2174   for (auto *P : T->quals()) {
2175     ObjCProtocolDecl *Protocol
2176       = dyn_cast_or_null<ObjCProtocolDecl>(Importer.Import(P));
2177     if (!Protocol)
2178       return QualType();
2179     Protocols.push_back(Protocol);
2180   }
2181 
2182   return Importer.getToContext().getObjCObjectType(ToBaseType, TypeArgs,
2183                                                    Protocols,
2184                                                    T->isKindOfTypeAsWritten());
2185 }
2186 
2187 QualType
2188 ASTNodeImporter::VisitObjCObjectPointerType(const ObjCObjectPointerType *T) {
2189   QualType ToPointeeType = Importer.Import(T->getPointeeType());
2190   if (ToPointeeType.isNull())
2191     return QualType();
2192 
2193   return Importer.getToContext().getObjCObjectPointerType(ToPointeeType);
2194 }
2195 
2196 //----------------------------------------------------------------------------
2197 // Import Declarations
2198 //----------------------------------------------------------------------------
2199 bool ASTNodeImporter::ImportDeclParts(NamedDecl *D, DeclContext *&DC,
2200                                       DeclContext *&LexicalDC,
2201                                       DeclarationName &Name,
2202                                       NamedDecl *&ToD,
2203                                       SourceLocation &Loc) {
2204   // Import the context of this declaration.
2205   DC = Importer.ImportContext(D->getDeclContext());
2206   if (!DC)
2207     return true;
2208 
2209   LexicalDC = DC;
2210   if (D->getDeclContext() != D->getLexicalDeclContext()) {
2211     LexicalDC = Importer.ImportContext(D->getLexicalDeclContext());
2212     if (!LexicalDC)
2213       return true;
2214   }
2215 
2216   // Import the name of this declaration.
2217   Name = Importer.Import(D->getDeclName());
2218   if (D->getDeclName() && !Name)
2219     return true;
2220 
2221   // Import the location of this declaration.
2222   Loc = Importer.Import(D->getLocation());
2223   ToD = cast_or_null<NamedDecl>(Importer.GetAlreadyImportedOrNull(D));
2224   return false;
2225 }
2226 
2227 void ASTNodeImporter::ImportDefinitionIfNeeded(Decl *FromD, Decl *ToD) {
2228   if (!FromD)
2229     return;
2230 
2231   if (!ToD) {
2232     ToD = Importer.Import(FromD);
2233     if (!ToD)
2234       return;
2235   }
2236 
2237   if (RecordDecl *FromRecord = dyn_cast<RecordDecl>(FromD)) {
2238     if (RecordDecl *ToRecord = cast_or_null<RecordDecl>(ToD)) {
2239       if (FromRecord->getDefinition() && FromRecord->isCompleteDefinition() && !ToRecord->getDefinition()) {
2240         ImportDefinition(FromRecord, ToRecord);
2241       }
2242     }
2243     return;
2244   }
2245 
2246   if (EnumDecl *FromEnum = dyn_cast<EnumDecl>(FromD)) {
2247     if (EnumDecl *ToEnum = cast_or_null<EnumDecl>(ToD)) {
2248       if (FromEnum->getDefinition() && !ToEnum->getDefinition()) {
2249         ImportDefinition(FromEnum, ToEnum);
2250       }
2251     }
2252     return;
2253   }
2254 }
2255 
2256 void
2257 ASTNodeImporter::ImportDeclarationNameLoc(const DeclarationNameInfo &From,
2258                                           DeclarationNameInfo& To) {
2259   // NOTE: To.Name and To.Loc are already imported.
2260   // We only have to import To.LocInfo.
2261   switch (To.getName().getNameKind()) {
2262   case DeclarationName::Identifier:
2263   case DeclarationName::ObjCZeroArgSelector:
2264   case DeclarationName::ObjCOneArgSelector:
2265   case DeclarationName::ObjCMultiArgSelector:
2266   case DeclarationName::CXXUsingDirective:
2267   case DeclarationName::CXXDeductionGuideName:
2268     return;
2269 
2270   case DeclarationName::CXXOperatorName: {
2271     SourceRange Range = From.getCXXOperatorNameRange();
2272     To.setCXXOperatorNameRange(Importer.Import(Range));
2273     return;
2274   }
2275   case DeclarationName::CXXLiteralOperatorName: {
2276     SourceLocation Loc = From.getCXXLiteralOperatorNameLoc();
2277     To.setCXXLiteralOperatorNameLoc(Importer.Import(Loc));
2278     return;
2279   }
2280   case DeclarationName::CXXConstructorName:
2281   case DeclarationName::CXXDestructorName:
2282   case DeclarationName::CXXConversionFunctionName: {
2283     TypeSourceInfo *FromTInfo = From.getNamedTypeInfo();
2284     To.setNamedTypeInfo(Importer.Import(FromTInfo));
2285     return;
2286   }
2287   }
2288   llvm_unreachable("Unknown name kind.");
2289 }
2290 
2291 void ASTNodeImporter::ImportDeclContext(DeclContext *FromDC, bool ForceImport) {
2292   if (Importer.isMinimalImport() && !ForceImport) {
2293     Importer.ImportContext(FromDC);
2294     return;
2295   }
2296 
2297   for (auto *From : FromDC->decls())
2298     Importer.Import(From);
2299 }
2300 
2301 bool ASTNodeImporter::ImportDefinition(RecordDecl *From, RecordDecl *To,
2302                                        ImportDefinitionKind Kind) {
2303   if (To->getDefinition() || To->isBeingDefined()) {
2304     if (Kind == IDK_Everything)
2305       ImportDeclContext(From, /*ForceImport=*/true);
2306 
2307     return false;
2308   }
2309 
2310   To->startDefinition();
2311 
2312   // Add base classes.
2313   if (CXXRecordDecl *ToCXX = dyn_cast<CXXRecordDecl>(To)) {
2314     CXXRecordDecl *FromCXX = cast<CXXRecordDecl>(From);
2315 
2316     struct CXXRecordDecl::DefinitionData &ToData = ToCXX->data();
2317     struct CXXRecordDecl::DefinitionData &FromData = FromCXX->data();
2318     ToData.UserDeclaredConstructor = FromData.UserDeclaredConstructor;
2319     ToData.UserDeclaredSpecialMembers = FromData.UserDeclaredSpecialMembers;
2320     ToData.Aggregate = FromData.Aggregate;
2321     ToData.PlainOldData = FromData.PlainOldData;
2322     ToData.Empty = FromData.Empty;
2323     ToData.Polymorphic = FromData.Polymorphic;
2324     ToData.Abstract = FromData.Abstract;
2325     ToData.IsStandardLayout = FromData.IsStandardLayout;
2326     ToData.HasNoNonEmptyBases = FromData.HasNoNonEmptyBases;
2327     ToData.HasPrivateFields = FromData.HasPrivateFields;
2328     ToData.HasProtectedFields = FromData.HasProtectedFields;
2329     ToData.HasPublicFields = FromData.HasPublicFields;
2330     ToData.HasMutableFields = FromData.HasMutableFields;
2331     ToData.HasVariantMembers = FromData.HasVariantMembers;
2332     ToData.HasOnlyCMembers = FromData.HasOnlyCMembers;
2333     ToData.HasInClassInitializer = FromData.HasInClassInitializer;
2334     ToData.HasUninitializedReferenceMember
2335       = FromData.HasUninitializedReferenceMember;
2336     ToData.HasUninitializedFields = FromData.HasUninitializedFields;
2337     ToData.HasInheritedConstructor = FromData.HasInheritedConstructor;
2338     ToData.HasInheritedAssignment = FromData.HasInheritedAssignment;
2339     ToData.NeedOverloadResolutionForMoveConstructor
2340       = FromData.NeedOverloadResolutionForMoveConstructor;
2341     ToData.NeedOverloadResolutionForMoveAssignment
2342       = FromData.NeedOverloadResolutionForMoveAssignment;
2343     ToData.NeedOverloadResolutionForDestructor
2344       = FromData.NeedOverloadResolutionForDestructor;
2345     ToData.DefaultedMoveConstructorIsDeleted
2346       = FromData.DefaultedMoveConstructorIsDeleted;
2347     ToData.DefaultedMoveAssignmentIsDeleted
2348       = FromData.DefaultedMoveAssignmentIsDeleted;
2349     ToData.DefaultedDestructorIsDeleted = FromData.DefaultedDestructorIsDeleted;
2350     ToData.HasTrivialSpecialMembers = FromData.HasTrivialSpecialMembers;
2351     ToData.HasIrrelevantDestructor = FromData.HasIrrelevantDestructor;
2352     ToData.HasConstexprNonCopyMoveConstructor
2353       = FromData.HasConstexprNonCopyMoveConstructor;
2354     ToData.HasDefaultedDefaultConstructor
2355       = FromData.HasDefaultedDefaultConstructor;
2356     ToData.DefaultedDefaultConstructorIsConstexpr
2357       = FromData.DefaultedDefaultConstructorIsConstexpr;
2358     ToData.HasConstexprDefaultConstructor
2359       = FromData.HasConstexprDefaultConstructor;
2360     ToData.HasNonLiteralTypeFieldsOrBases
2361       = FromData.HasNonLiteralTypeFieldsOrBases;
2362     // ComputedVisibleConversions not imported.
2363     ToData.UserProvidedDefaultConstructor
2364       = FromData.UserProvidedDefaultConstructor;
2365     ToData.DeclaredSpecialMembers = FromData.DeclaredSpecialMembers;
2366     ToData.ImplicitCopyConstructorCanHaveConstParamForVBase
2367       = FromData.ImplicitCopyConstructorCanHaveConstParamForVBase;
2368     ToData.ImplicitCopyConstructorCanHaveConstParamForNonVBase
2369       = FromData.ImplicitCopyConstructorCanHaveConstParamForNonVBase;
2370     ToData.ImplicitCopyAssignmentHasConstParam
2371       = FromData.ImplicitCopyAssignmentHasConstParam;
2372     ToData.HasDeclaredCopyConstructorWithConstParam
2373       = FromData.HasDeclaredCopyConstructorWithConstParam;
2374     ToData.HasDeclaredCopyAssignmentWithConstParam
2375       = FromData.HasDeclaredCopyAssignmentWithConstParam;
2376     ToData.IsLambda = FromData.IsLambda;
2377 
2378     SmallVector<CXXBaseSpecifier *, 4> Bases;
2379     for (const auto &Base1 : FromCXX->bases()) {
2380       QualType T = Importer.Import(Base1.getType());
2381       if (T.isNull())
2382         return true;
2383 
2384       SourceLocation EllipsisLoc;
2385       if (Base1.isPackExpansion())
2386         EllipsisLoc = Importer.Import(Base1.getEllipsisLoc());
2387 
2388       // Ensure that we have a definition for the base.
2389       ImportDefinitionIfNeeded(Base1.getType()->getAsCXXRecordDecl());
2390 
2391       Bases.push_back(
2392                     new (Importer.getToContext())
2393                       CXXBaseSpecifier(Importer.Import(Base1.getSourceRange()),
2394                                        Base1.isVirtual(),
2395                                        Base1.isBaseOfClass(),
2396                                        Base1.getAccessSpecifierAsWritten(),
2397                                    Importer.Import(Base1.getTypeSourceInfo()),
2398                                        EllipsisLoc));
2399     }
2400     if (!Bases.empty())
2401       ToCXX->setBases(Bases.data(), Bases.size());
2402   }
2403 
2404   if (shouldForceImportDeclContext(Kind))
2405     ImportDeclContext(From, /*ForceImport=*/true);
2406 
2407   To->completeDefinition();
2408   return false;
2409 }
2410 
2411 bool ASTNodeImporter::ImportDefinition(VarDecl *From, VarDecl *To,
2412                                        ImportDefinitionKind Kind) {
2413   if (To->getAnyInitializer())
2414     return false;
2415 
2416   // FIXME: Can we really import any initializer? Alternatively, we could force
2417   // ourselves to import every declaration of a variable and then only use
2418   // getInit() here.
2419   To->setInit(Importer.Import(const_cast<Expr *>(From->getAnyInitializer())));
2420 
2421   // FIXME: Other bits to merge?
2422 
2423   return false;
2424 }
2425 
2426 bool ASTNodeImporter::ImportDefinition(EnumDecl *From, EnumDecl *To,
2427                                        ImportDefinitionKind Kind) {
2428   if (To->getDefinition() || To->isBeingDefined()) {
2429     if (Kind == IDK_Everything)
2430       ImportDeclContext(From, /*ForceImport=*/true);
2431     return false;
2432   }
2433 
2434   To->startDefinition();
2435 
2436   QualType T = Importer.Import(Importer.getFromContext().getTypeDeclType(From));
2437   if (T.isNull())
2438     return true;
2439 
2440   QualType ToPromotionType = Importer.Import(From->getPromotionType());
2441   if (ToPromotionType.isNull())
2442     return true;
2443 
2444   if (shouldForceImportDeclContext(Kind))
2445     ImportDeclContext(From, /*ForceImport=*/true);
2446 
2447   // FIXME: we might need to merge the number of positive or negative bits
2448   // if the enumerator lists don't match.
2449   To->completeDefinition(T, ToPromotionType,
2450                          From->getNumPositiveBits(),
2451                          From->getNumNegativeBits());
2452   return false;
2453 }
2454 
2455 TemplateParameterList *ASTNodeImporter::ImportTemplateParameterList(
2456                                                 TemplateParameterList *Params) {
2457   SmallVector<NamedDecl *, 4> ToParams(Params->size());
2458   if (ImportContainerChecked(*Params, ToParams))
2459     return nullptr;
2460 
2461   Expr *ToRequiresClause;
2462   if (Expr *const R = Params->getRequiresClause()) {
2463     ToRequiresClause = Importer.Import(R);
2464     if (!ToRequiresClause)
2465       return nullptr;
2466   } else {
2467     ToRequiresClause = nullptr;
2468   }
2469 
2470   return TemplateParameterList::Create(Importer.getToContext(),
2471                                        Importer.Import(Params->getTemplateLoc()),
2472                                        Importer.Import(Params->getLAngleLoc()),
2473                                        ToParams,
2474                                        Importer.Import(Params->getRAngleLoc()),
2475                                        ToRequiresClause);
2476 }
2477 
2478 TemplateArgument
2479 ASTNodeImporter::ImportTemplateArgument(const TemplateArgument &From) {
2480   switch (From.getKind()) {
2481   case TemplateArgument::Null:
2482     return TemplateArgument();
2483 
2484   case TemplateArgument::Type: {
2485     QualType ToType = Importer.Import(From.getAsType());
2486     if (ToType.isNull())
2487       return TemplateArgument();
2488     return TemplateArgument(ToType);
2489   }
2490 
2491   case TemplateArgument::Integral: {
2492     QualType ToType = Importer.Import(From.getIntegralType());
2493     if (ToType.isNull())
2494       return TemplateArgument();
2495     return TemplateArgument(From, ToType);
2496   }
2497 
2498   case TemplateArgument::Declaration: {
2499     ValueDecl *To = cast_or_null<ValueDecl>(Importer.Import(From.getAsDecl()));
2500     QualType ToType = Importer.Import(From.getParamTypeForDecl());
2501     if (!To || ToType.isNull())
2502       return TemplateArgument();
2503     return TemplateArgument(To, ToType);
2504   }
2505 
2506   case TemplateArgument::NullPtr: {
2507     QualType ToType = Importer.Import(From.getNullPtrType());
2508     if (ToType.isNull())
2509       return TemplateArgument();
2510     return TemplateArgument(ToType, /*isNullPtr*/true);
2511   }
2512 
2513   case TemplateArgument::Template: {
2514     TemplateName ToTemplate = Importer.Import(From.getAsTemplate());
2515     if (ToTemplate.isNull())
2516       return TemplateArgument();
2517 
2518     return TemplateArgument(ToTemplate);
2519   }
2520 
2521   case TemplateArgument::TemplateExpansion: {
2522     TemplateName ToTemplate
2523       = Importer.Import(From.getAsTemplateOrTemplatePattern());
2524     if (ToTemplate.isNull())
2525       return TemplateArgument();
2526 
2527     return TemplateArgument(ToTemplate, From.getNumTemplateExpansions());
2528   }
2529 
2530   case TemplateArgument::Expression:
2531     if (Expr *ToExpr = Importer.Import(From.getAsExpr()))
2532       return TemplateArgument(ToExpr);
2533     return TemplateArgument();
2534 
2535   case TemplateArgument::Pack: {
2536     SmallVector<TemplateArgument, 2> ToPack;
2537     ToPack.reserve(From.pack_size());
2538     if (ImportTemplateArguments(From.pack_begin(), From.pack_size(), ToPack))
2539       return TemplateArgument();
2540 
2541     return TemplateArgument(
2542         llvm::makeArrayRef(ToPack).copy(Importer.getToContext()));
2543   }
2544   }
2545 
2546   llvm_unreachable("Invalid template argument kind");
2547 }
2548 
2549 TemplateArgumentLoc ASTNodeImporter::ImportTemplateArgumentLoc(
2550     const TemplateArgumentLoc &TALoc, bool &Error) {
2551   Error = false;
2552   TemplateArgument Arg = ImportTemplateArgument(TALoc.getArgument());
2553   TemplateArgumentLocInfo FromInfo = TALoc.getLocInfo();
2554   TemplateArgumentLocInfo ToInfo;
2555   if (Arg.getKind() == TemplateArgument::Expression) {
2556     Expr *E = Importer.Import(FromInfo.getAsExpr());
2557     ToInfo = TemplateArgumentLocInfo(E);
2558     if (!E)
2559       Error = true;
2560   } else if (Arg.getKind() == TemplateArgument::Type) {
2561     if (TypeSourceInfo *TSI = Importer.Import(FromInfo.getAsTypeSourceInfo()))
2562       ToInfo = TemplateArgumentLocInfo(TSI);
2563     else
2564       Error = true;
2565   } else {
2566     ToInfo = TemplateArgumentLocInfo(
2567           Importer.Import(FromInfo.getTemplateQualifierLoc()),
2568           Importer.Import(FromInfo.getTemplateNameLoc()),
2569           Importer.Import(FromInfo.getTemplateEllipsisLoc()));
2570   }
2571   return TemplateArgumentLoc(Arg, ToInfo);
2572 }
2573 
2574 bool ASTNodeImporter::ImportTemplateArguments(const TemplateArgument *FromArgs,
2575                                               unsigned NumFromArgs,
2576                               SmallVectorImpl<TemplateArgument> &ToArgs) {
2577   for (unsigned I = 0; I != NumFromArgs; ++I) {
2578     TemplateArgument To = ImportTemplateArgument(FromArgs[I]);
2579     if (To.isNull() && !FromArgs[I].isNull())
2580       return true;
2581 
2582     ToArgs.push_back(To);
2583   }
2584 
2585   return false;
2586 }
2587 
2588 bool ASTNodeImporter::IsStructuralMatch(RecordDecl *FromRecord,
2589                                         RecordDecl *ToRecord, bool Complain) {
2590   // Eliminate a potential failure point where we attempt to re-import
2591   // something we're trying to import while completing ToRecord.
2592   Decl *ToOrigin = Importer.GetOriginalDecl(ToRecord);
2593   if (ToOrigin) {
2594     RecordDecl *ToOriginRecord = dyn_cast<RecordDecl>(ToOrigin);
2595     if (ToOriginRecord)
2596       ToRecord = ToOriginRecord;
2597   }
2598 
2599   StructuralEquivalenceContext Ctx(Importer.getFromContext(),
2600                                    ToRecord->getASTContext(),
2601                                    Importer.getNonEquivalentDecls(),
2602                                    false, Complain);
2603   return Ctx.IsStructurallyEquivalent(FromRecord, ToRecord);
2604 }
2605 
2606 bool ASTNodeImporter::IsStructuralMatch(VarDecl *FromVar, VarDecl *ToVar,
2607                                         bool Complain) {
2608   StructuralEquivalenceContext Ctx(
2609       Importer.getFromContext(), Importer.getToContext(),
2610       Importer.getNonEquivalentDecls(), false, Complain);
2611   return Ctx.IsStructurallyEquivalent(FromVar, ToVar);
2612 }
2613 
2614 bool ASTNodeImporter::IsStructuralMatch(EnumDecl *FromEnum, EnumDecl *ToEnum) {
2615   StructuralEquivalenceContext Ctx(Importer.getFromContext(),
2616                                    Importer.getToContext(),
2617                                    Importer.getNonEquivalentDecls());
2618   return Ctx.IsStructurallyEquivalent(FromEnum, ToEnum);
2619 }
2620 
2621 bool ASTNodeImporter::IsStructuralMatch(EnumConstantDecl *FromEC,
2622                                         EnumConstantDecl *ToEC)
2623 {
2624   const llvm::APSInt &FromVal = FromEC->getInitVal();
2625   const llvm::APSInt &ToVal = ToEC->getInitVal();
2626 
2627   return FromVal.isSigned() == ToVal.isSigned() &&
2628          FromVal.getBitWidth() == ToVal.getBitWidth() &&
2629          FromVal == ToVal;
2630 }
2631 
2632 bool ASTNodeImporter::IsStructuralMatch(ClassTemplateDecl *From,
2633                                         ClassTemplateDecl *To) {
2634   StructuralEquivalenceContext Ctx(Importer.getFromContext(),
2635                                    Importer.getToContext(),
2636                                    Importer.getNonEquivalentDecls());
2637   return Ctx.IsStructurallyEquivalent(From, To);
2638 }
2639 
2640 bool ASTNodeImporter::IsStructuralMatch(VarTemplateDecl *From,
2641                                         VarTemplateDecl *To) {
2642   StructuralEquivalenceContext Ctx(Importer.getFromContext(),
2643                                    Importer.getToContext(),
2644                                    Importer.getNonEquivalentDecls());
2645   return Ctx.IsStructurallyEquivalent(From, To);
2646 }
2647 
2648 Decl *ASTNodeImporter::VisitDecl(Decl *D) {
2649   Importer.FromDiag(D->getLocation(), diag::err_unsupported_ast_node)
2650     << D->getDeclKindName();
2651   return nullptr;
2652 }
2653 
2654 Decl *ASTNodeImporter::VisitTranslationUnitDecl(TranslationUnitDecl *D) {
2655   TranslationUnitDecl *ToD =
2656     Importer.getToContext().getTranslationUnitDecl();
2657 
2658   Importer.Imported(D, ToD);
2659 
2660   return ToD;
2661 }
2662 
2663 Decl *ASTNodeImporter::VisitAccessSpecDecl(AccessSpecDecl *D) {
2664 
2665   SourceLocation Loc = Importer.Import(D->getLocation());
2666   SourceLocation ColonLoc = Importer.Import(D->getColonLoc());
2667 
2668   // Import the context of this declaration.
2669   DeclContext *DC = Importer.ImportContext(D->getDeclContext());
2670   if (!DC)
2671     return nullptr;
2672 
2673   AccessSpecDecl *accessSpecDecl
2674     = AccessSpecDecl::Create(Importer.getToContext(), D->getAccess(),
2675                              DC, Loc, ColonLoc);
2676 
2677   if (!accessSpecDecl)
2678     return nullptr;
2679 
2680   // Lexical DeclContext and Semantic DeclContext
2681   // is always the same for the accessSpec.
2682   accessSpecDecl->setLexicalDeclContext(DC);
2683   DC->addDeclInternal(accessSpecDecl);
2684 
2685   return accessSpecDecl;
2686 }
2687 
2688 Decl *ASTNodeImporter::VisitStaticAssertDecl(StaticAssertDecl *D) {
2689   DeclContext *DC = Importer.ImportContext(D->getDeclContext());
2690   if (!DC)
2691     return nullptr;
2692 
2693   DeclContext *LexicalDC = DC;
2694 
2695   // Import the location of this declaration.
2696   SourceLocation Loc = Importer.Import(D->getLocation());
2697 
2698   Expr *AssertExpr = Importer.Import(D->getAssertExpr());
2699   if (!AssertExpr)
2700     return nullptr;
2701 
2702   StringLiteral *FromMsg = D->getMessage();
2703   StringLiteral *ToMsg = cast_or_null<StringLiteral>(Importer.Import(FromMsg));
2704   if (!ToMsg && FromMsg)
2705     return nullptr;
2706 
2707   StaticAssertDecl *ToD = StaticAssertDecl::Create(
2708         Importer.getToContext(), DC, Loc, AssertExpr, ToMsg,
2709         Importer.Import(D->getRParenLoc()), D->isFailed());
2710 
2711   ToD->setLexicalDeclContext(LexicalDC);
2712   LexicalDC->addDeclInternal(ToD);
2713   Importer.Imported(D, ToD);
2714   return ToD;
2715 }
2716 
2717 Decl *ASTNodeImporter::VisitNamespaceDecl(NamespaceDecl *D) {
2718   // Import the major distinguishing characteristics of this namespace.
2719   DeclContext *DC, *LexicalDC;
2720   DeclarationName Name;
2721   SourceLocation Loc;
2722   NamedDecl *ToD;
2723   if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
2724     return nullptr;
2725   if (ToD)
2726     return ToD;
2727 
2728   NamespaceDecl *MergeWithNamespace = nullptr;
2729   if (!Name) {
2730     // This is an anonymous namespace. Adopt an existing anonymous
2731     // namespace if we can.
2732     // FIXME: Not testable.
2733     if (TranslationUnitDecl *TU = dyn_cast<TranslationUnitDecl>(DC))
2734       MergeWithNamespace = TU->getAnonymousNamespace();
2735     else
2736       MergeWithNamespace = cast<NamespaceDecl>(DC)->getAnonymousNamespace();
2737   } else {
2738     SmallVector<NamedDecl *, 4> ConflictingDecls;
2739     SmallVector<NamedDecl *, 2> FoundDecls;
2740     DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls);
2741     for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
2742       if (!FoundDecls[I]->isInIdentifierNamespace(Decl::IDNS_Namespace))
2743         continue;
2744 
2745       if (NamespaceDecl *FoundNS = dyn_cast<NamespaceDecl>(FoundDecls[I])) {
2746         MergeWithNamespace = FoundNS;
2747         ConflictingDecls.clear();
2748         break;
2749       }
2750 
2751       ConflictingDecls.push_back(FoundDecls[I]);
2752     }
2753 
2754     if (!ConflictingDecls.empty()) {
2755       Name = Importer.HandleNameConflict(Name, DC, Decl::IDNS_Namespace,
2756                                          ConflictingDecls.data(),
2757                                          ConflictingDecls.size());
2758     }
2759   }
2760 
2761   // Create the "to" namespace, if needed.
2762   NamespaceDecl *ToNamespace = MergeWithNamespace;
2763   if (!ToNamespace) {
2764     ToNamespace = NamespaceDecl::Create(Importer.getToContext(), DC,
2765                                         D->isInline(),
2766                                         Importer.Import(D->getLocStart()),
2767                                         Loc, Name.getAsIdentifierInfo(),
2768                                         /*PrevDecl=*/nullptr);
2769     ToNamespace->setLexicalDeclContext(LexicalDC);
2770     LexicalDC->addDeclInternal(ToNamespace);
2771 
2772     // If this is an anonymous namespace, register it as the anonymous
2773     // namespace within its context.
2774     if (!Name) {
2775       if (TranslationUnitDecl *TU = dyn_cast<TranslationUnitDecl>(DC))
2776         TU->setAnonymousNamespace(ToNamespace);
2777       else
2778         cast<NamespaceDecl>(DC)->setAnonymousNamespace(ToNamespace);
2779     }
2780   }
2781   Importer.Imported(D, ToNamespace);
2782 
2783   ImportDeclContext(D);
2784 
2785   return ToNamespace;
2786 }
2787 
2788 Decl *ASTNodeImporter::VisitTypedefNameDecl(TypedefNameDecl *D, bool IsAlias) {
2789   // Import the major distinguishing characteristics of this typedef.
2790   DeclContext *DC, *LexicalDC;
2791   DeclarationName Name;
2792   SourceLocation Loc;
2793   NamedDecl *ToD;
2794   if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
2795     return nullptr;
2796   if (ToD)
2797     return ToD;
2798 
2799   // If this typedef is not in block scope, determine whether we've
2800   // seen a typedef with the same name (that we can merge with) or any
2801   // other entity by that name (which name lookup could conflict with).
2802   if (!DC->isFunctionOrMethod()) {
2803     SmallVector<NamedDecl *, 4> ConflictingDecls;
2804     unsigned IDNS = Decl::IDNS_Ordinary;
2805     SmallVector<NamedDecl *, 2> FoundDecls;
2806     DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls);
2807     for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
2808       if (!FoundDecls[I]->isInIdentifierNamespace(IDNS))
2809         continue;
2810       if (TypedefNameDecl *FoundTypedef =
2811             dyn_cast<TypedefNameDecl>(FoundDecls[I])) {
2812         if (Importer.IsStructurallyEquivalent(D->getUnderlyingType(),
2813                                             FoundTypedef->getUnderlyingType()))
2814           return Importer.Imported(D, FoundTypedef);
2815       }
2816 
2817       ConflictingDecls.push_back(FoundDecls[I]);
2818     }
2819 
2820     if (!ConflictingDecls.empty()) {
2821       Name = Importer.HandleNameConflict(Name, DC, IDNS,
2822                                          ConflictingDecls.data(),
2823                                          ConflictingDecls.size());
2824       if (!Name)
2825         return nullptr;
2826     }
2827   }
2828 
2829   // Import the underlying type of this typedef;
2830   QualType T = Importer.Import(D->getUnderlyingType());
2831   if (T.isNull())
2832     return nullptr;
2833 
2834   // Create the new typedef node.
2835   TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo());
2836   SourceLocation StartL = Importer.Import(D->getLocStart());
2837   TypedefNameDecl *ToTypedef;
2838   if (IsAlias)
2839     ToTypedef = TypeAliasDecl::Create(Importer.getToContext(), DC,
2840                                       StartL, Loc,
2841                                       Name.getAsIdentifierInfo(),
2842                                       TInfo);
2843   else
2844     ToTypedef = TypedefDecl::Create(Importer.getToContext(), DC,
2845                                     StartL, Loc,
2846                                     Name.getAsIdentifierInfo(),
2847                                     TInfo);
2848 
2849   ToTypedef->setAccess(D->getAccess());
2850   ToTypedef->setLexicalDeclContext(LexicalDC);
2851   Importer.Imported(D, ToTypedef);
2852   LexicalDC->addDeclInternal(ToTypedef);
2853 
2854   return ToTypedef;
2855 }
2856 
2857 Decl *ASTNodeImporter::VisitTypedefDecl(TypedefDecl *D) {
2858   return VisitTypedefNameDecl(D, /*IsAlias=*/false);
2859 }
2860 
2861 Decl *ASTNodeImporter::VisitTypeAliasDecl(TypeAliasDecl *D) {
2862   return VisitTypedefNameDecl(D, /*IsAlias=*/true);
2863 }
2864 
2865 Decl *ASTNodeImporter::VisitLabelDecl(LabelDecl *D) {
2866   // Import the major distinguishing characteristics of this label.
2867   DeclContext *DC, *LexicalDC;
2868   DeclarationName Name;
2869   SourceLocation Loc;
2870   NamedDecl *ToD;
2871   if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
2872     return nullptr;
2873   if (ToD)
2874     return ToD;
2875 
2876   assert(LexicalDC->isFunctionOrMethod());
2877 
2878   LabelDecl *ToLabel = D->isGnuLocal()
2879       ? LabelDecl::Create(Importer.getToContext(),
2880                           DC, Importer.Import(D->getLocation()),
2881                           Name.getAsIdentifierInfo(),
2882                           Importer.Import(D->getLocStart()))
2883       : LabelDecl::Create(Importer.getToContext(),
2884                           DC, Importer.Import(D->getLocation()),
2885                           Name.getAsIdentifierInfo());
2886   Importer.Imported(D, ToLabel);
2887 
2888   LabelStmt *Label = cast_or_null<LabelStmt>(Importer.Import(D->getStmt()));
2889   if (!Label)
2890     return nullptr;
2891 
2892   ToLabel->setStmt(Label);
2893   ToLabel->setLexicalDeclContext(LexicalDC);
2894   LexicalDC->addDeclInternal(ToLabel);
2895   return ToLabel;
2896 }
2897 
2898 Decl *ASTNodeImporter::VisitEnumDecl(EnumDecl *D) {
2899   // Import the major distinguishing characteristics of this enum.
2900   DeclContext *DC, *LexicalDC;
2901   DeclarationName Name;
2902   SourceLocation Loc;
2903   NamedDecl *ToD;
2904   if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
2905     return nullptr;
2906   if (ToD)
2907     return ToD;
2908 
2909   // Figure out what enum name we're looking for.
2910   unsigned IDNS = Decl::IDNS_Tag;
2911   DeclarationName SearchName = Name;
2912   if (!SearchName && D->getTypedefNameForAnonDecl()) {
2913     SearchName = Importer.Import(D->getTypedefNameForAnonDecl()->getDeclName());
2914     IDNS = Decl::IDNS_Ordinary;
2915   } else if (Importer.getToContext().getLangOpts().CPlusPlus)
2916     IDNS |= Decl::IDNS_Ordinary;
2917 
2918   // We may already have an enum of the same name; try to find and match it.
2919   if (!DC->isFunctionOrMethod() && SearchName) {
2920     SmallVector<NamedDecl *, 4> ConflictingDecls;
2921     SmallVector<NamedDecl *, 2> FoundDecls;
2922     DC->getRedeclContext()->localUncachedLookup(SearchName, FoundDecls);
2923     for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
2924       if (!FoundDecls[I]->isInIdentifierNamespace(IDNS))
2925         continue;
2926 
2927       Decl *Found = FoundDecls[I];
2928       if (TypedefNameDecl *Typedef = dyn_cast<TypedefNameDecl>(Found)) {
2929         if (const TagType *Tag = Typedef->getUnderlyingType()->getAs<TagType>())
2930           Found = Tag->getDecl();
2931       }
2932 
2933       if (EnumDecl *FoundEnum = dyn_cast<EnumDecl>(Found)) {
2934         if (IsStructuralMatch(D, FoundEnum))
2935           return Importer.Imported(D, FoundEnum);
2936       }
2937 
2938       ConflictingDecls.push_back(FoundDecls[I]);
2939     }
2940 
2941     if (!ConflictingDecls.empty()) {
2942       Name = Importer.HandleNameConflict(Name, DC, IDNS,
2943                                          ConflictingDecls.data(),
2944                                          ConflictingDecls.size());
2945     }
2946   }
2947 
2948   // Create the enum declaration.
2949   EnumDecl *D2 = EnumDecl::Create(Importer.getToContext(), DC,
2950                                   Importer.Import(D->getLocStart()),
2951                                   Loc, Name.getAsIdentifierInfo(), nullptr,
2952                                   D->isScoped(), D->isScopedUsingClassTag(),
2953                                   D->isFixed());
2954   // Import the qualifier, if any.
2955   D2->setQualifierInfo(Importer.Import(D->getQualifierLoc()));
2956   D2->setAccess(D->getAccess());
2957   D2->setLexicalDeclContext(LexicalDC);
2958   Importer.Imported(D, D2);
2959   LexicalDC->addDeclInternal(D2);
2960 
2961   // Import the integer type.
2962   QualType ToIntegerType = Importer.Import(D->getIntegerType());
2963   if (ToIntegerType.isNull())
2964     return nullptr;
2965   D2->setIntegerType(ToIntegerType);
2966 
2967   // Import the definition
2968   if (D->isCompleteDefinition() && ImportDefinition(D, D2))
2969     return nullptr;
2970 
2971   return D2;
2972 }
2973 
2974 Decl *ASTNodeImporter::VisitRecordDecl(RecordDecl *D) {
2975   // If this record has a definition in the translation unit we're coming from,
2976   // but this particular declaration is not that definition, import the
2977   // definition and map to that.
2978   TagDecl *Definition = D->getDefinition();
2979   if (Definition && Definition != D) {
2980     Decl *ImportedDef = Importer.Import(Definition);
2981     if (!ImportedDef)
2982       return nullptr;
2983 
2984     return Importer.Imported(D, ImportedDef);
2985   }
2986 
2987   // Import the major distinguishing characteristics of this record.
2988   DeclContext *DC, *LexicalDC;
2989   DeclarationName Name;
2990   SourceLocation Loc;
2991   NamedDecl *ToD;
2992   if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
2993     return nullptr;
2994   if (ToD)
2995     return ToD;
2996 
2997   // Figure out what structure name we're looking for.
2998   unsigned IDNS = Decl::IDNS_Tag;
2999   DeclarationName SearchName = Name;
3000   if (!SearchName && D->getTypedefNameForAnonDecl()) {
3001     SearchName = Importer.Import(D->getTypedefNameForAnonDecl()->getDeclName());
3002     IDNS = Decl::IDNS_Ordinary;
3003   } else if (Importer.getToContext().getLangOpts().CPlusPlus)
3004     IDNS |= Decl::IDNS_Ordinary;
3005 
3006   // We may already have a record of the same name; try to find and match it.
3007   RecordDecl *AdoptDecl = nullptr;
3008   if (!DC->isFunctionOrMethod()) {
3009     SmallVector<NamedDecl *, 4> ConflictingDecls;
3010     SmallVector<NamedDecl *, 2> FoundDecls;
3011     DC->getRedeclContext()->localUncachedLookup(SearchName, FoundDecls);
3012     for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
3013       if (!FoundDecls[I]->isInIdentifierNamespace(IDNS))
3014         continue;
3015 
3016       Decl *Found = FoundDecls[I];
3017       if (TypedefNameDecl *Typedef = dyn_cast<TypedefNameDecl>(Found)) {
3018         if (const TagType *Tag = Typedef->getUnderlyingType()->getAs<TagType>())
3019           Found = Tag->getDecl();
3020       }
3021 
3022       if (RecordDecl *FoundRecord = dyn_cast<RecordDecl>(Found)) {
3023         if (D->isAnonymousStructOrUnion() &&
3024             FoundRecord->isAnonymousStructOrUnion()) {
3025           // If both anonymous structs/unions are in a record context, make sure
3026           // they occur in the same location in the context records.
3027           if (Optional<unsigned> Index1
3028               = findUntaggedStructOrUnionIndex(D)) {
3029             if (Optional<unsigned> Index2 =
3030                     findUntaggedStructOrUnionIndex(FoundRecord)) {
3031               if (*Index1 != *Index2)
3032                 continue;
3033             }
3034           }
3035         }
3036 
3037         if (RecordDecl *FoundDef = FoundRecord->getDefinition()) {
3038           if ((SearchName && !D->isCompleteDefinition())
3039               || (D->isCompleteDefinition() &&
3040                   D->isAnonymousStructOrUnion()
3041                     == FoundDef->isAnonymousStructOrUnion() &&
3042                   IsStructuralMatch(D, FoundDef))) {
3043             // The record types structurally match, or the "from" translation
3044             // unit only had a forward declaration anyway; call it the same
3045             // function.
3046             // FIXME: For C++, we should also merge methods here.
3047             return Importer.Imported(D, FoundDef);
3048           }
3049         } else if (!D->isCompleteDefinition()) {
3050           // We have a forward declaration of this type, so adopt that forward
3051           // declaration rather than building a new one.
3052 
3053           // If one or both can be completed from external storage then try one
3054           // last time to complete and compare them before doing this.
3055 
3056           if (FoundRecord->hasExternalLexicalStorage() &&
3057               !FoundRecord->isCompleteDefinition())
3058             FoundRecord->getASTContext().getExternalSource()->CompleteType(FoundRecord);
3059           if (D->hasExternalLexicalStorage())
3060             D->getASTContext().getExternalSource()->CompleteType(D);
3061 
3062           if (FoundRecord->isCompleteDefinition() &&
3063               D->isCompleteDefinition() &&
3064               !IsStructuralMatch(D, FoundRecord))
3065             continue;
3066 
3067           AdoptDecl = FoundRecord;
3068           continue;
3069         } else if (!SearchName) {
3070           continue;
3071         }
3072       }
3073 
3074       ConflictingDecls.push_back(FoundDecls[I]);
3075     }
3076 
3077     if (!ConflictingDecls.empty() && SearchName) {
3078       Name = Importer.HandleNameConflict(Name, DC, IDNS,
3079                                          ConflictingDecls.data(),
3080                                          ConflictingDecls.size());
3081     }
3082   }
3083 
3084   // Create the record declaration.
3085   RecordDecl *D2 = AdoptDecl;
3086   SourceLocation StartLoc = Importer.Import(D->getLocStart());
3087   if (!D2) {
3088     CXXRecordDecl *D2CXX = nullptr;
3089     if (CXXRecordDecl *DCXX = llvm::dyn_cast<CXXRecordDecl>(D)) {
3090       if (DCXX->isLambda()) {
3091         TypeSourceInfo *TInfo = Importer.Import(DCXX->getLambdaTypeInfo());
3092         D2CXX = CXXRecordDecl::CreateLambda(Importer.getToContext(),
3093                                             DC, TInfo, Loc,
3094                                             DCXX->isDependentLambda(),
3095                                             DCXX->isGenericLambda(),
3096                                             DCXX->getLambdaCaptureDefault());
3097         Decl *CDecl = Importer.Import(DCXX->getLambdaContextDecl());
3098         if (DCXX->getLambdaContextDecl() && !CDecl)
3099           return nullptr;
3100         D2CXX->setLambdaMangling(DCXX->getLambdaManglingNumber(), CDecl);
3101       } else if (DCXX->isInjectedClassName()) {
3102         // We have to be careful to do a similar dance to the one in
3103         // Sema::ActOnStartCXXMemberDeclarations
3104         CXXRecordDecl *const PrevDecl = nullptr;
3105         const bool DelayTypeCreation = true;
3106         D2CXX = CXXRecordDecl::Create(
3107             Importer.getToContext(), D->getTagKind(), DC, StartLoc, Loc,
3108             Name.getAsIdentifierInfo(), PrevDecl, DelayTypeCreation);
3109         Importer.getToContext().getTypeDeclType(
3110             D2CXX, llvm::dyn_cast<CXXRecordDecl>(DC));
3111       } else {
3112         D2CXX = CXXRecordDecl::Create(Importer.getToContext(),
3113                                       D->getTagKind(),
3114                                       DC, StartLoc, Loc,
3115                                       Name.getAsIdentifierInfo());
3116       }
3117       D2 = D2CXX;
3118       D2->setAccess(D->getAccess());
3119     } else {
3120       D2 = RecordDecl::Create(Importer.getToContext(), D->getTagKind(),
3121                               DC, StartLoc, Loc, Name.getAsIdentifierInfo());
3122     }
3123 
3124     D2->setQualifierInfo(Importer.Import(D->getQualifierLoc()));
3125     D2->setLexicalDeclContext(LexicalDC);
3126     LexicalDC->addDeclInternal(D2);
3127     if (D->isAnonymousStructOrUnion())
3128       D2->setAnonymousStructOrUnion(true);
3129   }
3130 
3131   Importer.Imported(D, D2);
3132 
3133   if (D->isCompleteDefinition() && ImportDefinition(D, D2, IDK_Default))
3134     return nullptr;
3135 
3136   return D2;
3137 }
3138 
3139 Decl *ASTNodeImporter::VisitEnumConstantDecl(EnumConstantDecl *D) {
3140   // Import the major distinguishing characteristics of this enumerator.
3141   DeclContext *DC, *LexicalDC;
3142   DeclarationName Name;
3143   SourceLocation Loc;
3144   NamedDecl *ToD;
3145   if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
3146     return nullptr;
3147   if (ToD)
3148     return ToD;
3149 
3150   QualType T = Importer.Import(D->getType());
3151   if (T.isNull())
3152     return nullptr;
3153 
3154   // Determine whether there are any other declarations with the same name and
3155   // in the same context.
3156   if (!LexicalDC->isFunctionOrMethod()) {
3157     SmallVector<NamedDecl *, 4> ConflictingDecls;
3158     unsigned IDNS = Decl::IDNS_Ordinary;
3159     SmallVector<NamedDecl *, 2> FoundDecls;
3160     DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls);
3161     for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
3162       if (!FoundDecls[I]->isInIdentifierNamespace(IDNS))
3163         continue;
3164 
3165       if (EnumConstantDecl *FoundEnumConstant
3166             = dyn_cast<EnumConstantDecl>(FoundDecls[I])) {
3167         if (IsStructuralMatch(D, FoundEnumConstant))
3168           return Importer.Imported(D, FoundEnumConstant);
3169       }
3170 
3171       ConflictingDecls.push_back(FoundDecls[I]);
3172     }
3173 
3174     if (!ConflictingDecls.empty()) {
3175       Name = Importer.HandleNameConflict(Name, DC, IDNS,
3176                                          ConflictingDecls.data(),
3177                                          ConflictingDecls.size());
3178       if (!Name)
3179         return nullptr;
3180     }
3181   }
3182 
3183   Expr *Init = Importer.Import(D->getInitExpr());
3184   if (D->getInitExpr() && !Init)
3185     return nullptr;
3186 
3187   EnumConstantDecl *ToEnumerator
3188     = EnumConstantDecl::Create(Importer.getToContext(), cast<EnumDecl>(DC), Loc,
3189                                Name.getAsIdentifierInfo(), T,
3190                                Init, D->getInitVal());
3191   ToEnumerator->setAccess(D->getAccess());
3192   ToEnumerator->setLexicalDeclContext(LexicalDC);
3193   Importer.Imported(D, ToEnumerator);
3194   LexicalDC->addDeclInternal(ToEnumerator);
3195   return ToEnumerator;
3196 }
3197 
3198 Decl *ASTNodeImporter::VisitFunctionDecl(FunctionDecl *D) {
3199   // Import the major distinguishing characteristics of this function.
3200   DeclContext *DC, *LexicalDC;
3201   DeclarationName Name;
3202   SourceLocation Loc;
3203   NamedDecl *ToD;
3204   if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
3205     return nullptr;
3206   if (ToD)
3207     return ToD;
3208 
3209   // Try to find a function in our own ("to") context with the same name, same
3210   // type, and in the same context as the function we're importing.
3211   if (!LexicalDC->isFunctionOrMethod()) {
3212     SmallVector<NamedDecl *, 4> ConflictingDecls;
3213     unsigned IDNS = Decl::IDNS_Ordinary;
3214     SmallVector<NamedDecl *, 2> FoundDecls;
3215     DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls);
3216     for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
3217       if (!FoundDecls[I]->isInIdentifierNamespace(IDNS))
3218         continue;
3219 
3220       if (FunctionDecl *FoundFunction = dyn_cast<FunctionDecl>(FoundDecls[I])) {
3221         if (FoundFunction->hasExternalFormalLinkage() &&
3222             D->hasExternalFormalLinkage()) {
3223           if (Importer.IsStructurallyEquivalent(D->getType(),
3224                                                 FoundFunction->getType())) {
3225             // FIXME: Actually try to merge the body and other attributes.
3226             return Importer.Imported(D, FoundFunction);
3227           }
3228 
3229           // FIXME: Check for overloading more carefully, e.g., by boosting
3230           // Sema::IsOverload out to the AST library.
3231 
3232           // Function overloading is okay in C++.
3233           if (Importer.getToContext().getLangOpts().CPlusPlus)
3234             continue;
3235 
3236           // Complain about inconsistent function types.
3237           Importer.ToDiag(Loc, diag::err_odr_function_type_inconsistent)
3238             << Name << D->getType() << FoundFunction->getType();
3239           Importer.ToDiag(FoundFunction->getLocation(),
3240                           diag::note_odr_value_here)
3241             << FoundFunction->getType();
3242         }
3243       }
3244 
3245       ConflictingDecls.push_back(FoundDecls[I]);
3246     }
3247 
3248     if (!ConflictingDecls.empty()) {
3249       Name = Importer.HandleNameConflict(Name, DC, IDNS,
3250                                          ConflictingDecls.data(),
3251                                          ConflictingDecls.size());
3252       if (!Name)
3253         return nullptr;
3254     }
3255   }
3256 
3257   DeclarationNameInfo NameInfo(Name, Loc);
3258   // Import additional name location/type info.
3259   ImportDeclarationNameLoc(D->getNameInfo(), NameInfo);
3260 
3261   QualType FromTy = D->getType();
3262   bool usedDifferentExceptionSpec = false;
3263 
3264   if (const FunctionProtoType *
3265         FromFPT = D->getType()->getAs<FunctionProtoType>()) {
3266     FunctionProtoType::ExtProtoInfo FromEPI = FromFPT->getExtProtoInfo();
3267     // FunctionProtoType::ExtProtoInfo's ExceptionSpecDecl can point to the
3268     // FunctionDecl that we are importing the FunctionProtoType for.
3269     // To avoid an infinite recursion when importing, create the FunctionDecl
3270     // with a simplified function type and update it afterwards.
3271     if (FromEPI.ExceptionSpec.SourceDecl ||
3272         FromEPI.ExceptionSpec.SourceTemplate ||
3273         FromEPI.ExceptionSpec.NoexceptExpr) {
3274       FunctionProtoType::ExtProtoInfo DefaultEPI;
3275       FromTy = Importer.getFromContext().getFunctionType(
3276           FromFPT->getReturnType(), FromFPT->getParamTypes(), DefaultEPI);
3277       usedDifferentExceptionSpec = true;
3278     }
3279   }
3280 
3281   // Import the type.
3282   QualType T = Importer.Import(FromTy);
3283   if (T.isNull())
3284     return nullptr;
3285 
3286   // Import the function parameters.
3287   SmallVector<ParmVarDecl *, 8> Parameters;
3288   for (auto P : D->parameters()) {
3289     ParmVarDecl *ToP = cast_or_null<ParmVarDecl>(Importer.Import(P));
3290     if (!ToP)
3291       return nullptr;
3292 
3293     Parameters.push_back(ToP);
3294   }
3295 
3296   // Create the imported function.
3297   TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo());
3298   FunctionDecl *ToFunction = nullptr;
3299   SourceLocation InnerLocStart = Importer.Import(D->getInnerLocStart());
3300   if (CXXConstructorDecl *FromConstructor = dyn_cast<CXXConstructorDecl>(D)) {
3301     ToFunction = CXXConstructorDecl::Create(Importer.getToContext(),
3302                                             cast<CXXRecordDecl>(DC),
3303                                             InnerLocStart,
3304                                             NameInfo, T, TInfo,
3305                                             FromConstructor->isExplicit(),
3306                                             D->isInlineSpecified(),
3307                                             D->isImplicit(),
3308                                             D->isConstexpr());
3309     if (unsigned NumInitializers = FromConstructor->getNumCtorInitializers()) {
3310       SmallVector<CXXCtorInitializer *, 4> CtorInitializers;
3311       for (CXXCtorInitializer *I : FromConstructor->inits()) {
3312         CXXCtorInitializer *ToI =
3313             cast_or_null<CXXCtorInitializer>(Importer.Import(I));
3314         if (!ToI && I)
3315           return nullptr;
3316         CtorInitializers.push_back(ToI);
3317       }
3318       CXXCtorInitializer **Memory =
3319           new (Importer.getToContext()) CXXCtorInitializer *[NumInitializers];
3320       std::copy(CtorInitializers.begin(), CtorInitializers.end(), Memory);
3321       CXXConstructorDecl *ToCtor = llvm::cast<CXXConstructorDecl>(ToFunction);
3322       ToCtor->setCtorInitializers(Memory);
3323       ToCtor->setNumCtorInitializers(NumInitializers);
3324     }
3325   } else if (isa<CXXDestructorDecl>(D)) {
3326     ToFunction = CXXDestructorDecl::Create(Importer.getToContext(),
3327                                            cast<CXXRecordDecl>(DC),
3328                                            InnerLocStart,
3329                                            NameInfo, T, TInfo,
3330                                            D->isInlineSpecified(),
3331                                            D->isImplicit());
3332   } else if (CXXConversionDecl *FromConversion
3333                                            = dyn_cast<CXXConversionDecl>(D)) {
3334     ToFunction = CXXConversionDecl::Create(Importer.getToContext(),
3335                                            cast<CXXRecordDecl>(DC),
3336                                            InnerLocStart,
3337                                            NameInfo, T, TInfo,
3338                                            D->isInlineSpecified(),
3339                                            FromConversion->isExplicit(),
3340                                            D->isConstexpr(),
3341                                            Importer.Import(D->getLocEnd()));
3342   } else if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(D)) {
3343     ToFunction = CXXMethodDecl::Create(Importer.getToContext(),
3344                                        cast<CXXRecordDecl>(DC),
3345                                        InnerLocStart,
3346                                        NameInfo, T, TInfo,
3347                                        Method->getStorageClass(),
3348                                        Method->isInlineSpecified(),
3349                                        D->isConstexpr(),
3350                                        Importer.Import(D->getLocEnd()));
3351   } else {
3352     ToFunction = FunctionDecl::Create(Importer.getToContext(), DC,
3353                                       InnerLocStart,
3354                                       NameInfo, T, TInfo, D->getStorageClass(),
3355                                       D->isInlineSpecified(),
3356                                       D->hasWrittenPrototype(),
3357                                       D->isConstexpr());
3358   }
3359 
3360   // Import the qualifier, if any.
3361   ToFunction->setQualifierInfo(Importer.Import(D->getQualifierLoc()));
3362   ToFunction->setAccess(D->getAccess());
3363   ToFunction->setLexicalDeclContext(LexicalDC);
3364   ToFunction->setVirtualAsWritten(D->isVirtualAsWritten());
3365   ToFunction->setTrivial(D->isTrivial());
3366   ToFunction->setPure(D->isPure());
3367   Importer.Imported(D, ToFunction);
3368 
3369   // Set the parameters.
3370   for (unsigned I = 0, N = Parameters.size(); I != N; ++I) {
3371     Parameters[I]->setOwningFunction(ToFunction);
3372     ToFunction->addDeclInternal(Parameters[I]);
3373   }
3374   ToFunction->setParams(Parameters);
3375 
3376   if (usedDifferentExceptionSpec) {
3377     // Update FunctionProtoType::ExtProtoInfo.
3378     QualType T = Importer.Import(D->getType());
3379     if (T.isNull())
3380       return nullptr;
3381     ToFunction->setType(T);
3382   }
3383 
3384   // Import the body, if any.
3385   if (Stmt *FromBody = D->getBody()) {
3386     if (Stmt *ToBody = Importer.Import(FromBody)) {
3387       ToFunction->setBody(ToBody);
3388     }
3389   }
3390 
3391   // FIXME: Other bits to merge?
3392 
3393   // Add this function to the lexical context.
3394   LexicalDC->addDeclInternal(ToFunction);
3395 
3396   return ToFunction;
3397 }
3398 
3399 Decl *ASTNodeImporter::VisitCXXMethodDecl(CXXMethodDecl *D) {
3400   return VisitFunctionDecl(D);
3401 }
3402 
3403 Decl *ASTNodeImporter::VisitCXXConstructorDecl(CXXConstructorDecl *D) {
3404   return VisitCXXMethodDecl(D);
3405 }
3406 
3407 Decl *ASTNodeImporter::VisitCXXDestructorDecl(CXXDestructorDecl *D) {
3408   return VisitCXXMethodDecl(D);
3409 }
3410 
3411 Decl *ASTNodeImporter::VisitCXXConversionDecl(CXXConversionDecl *D) {
3412   return VisitCXXMethodDecl(D);
3413 }
3414 
3415 static unsigned getFieldIndex(Decl *F) {
3416   RecordDecl *Owner = dyn_cast<RecordDecl>(F->getDeclContext());
3417   if (!Owner)
3418     return 0;
3419 
3420   unsigned Index = 1;
3421   for (const auto *D : Owner->noload_decls()) {
3422     if (D == F)
3423       return Index;
3424 
3425     if (isa<FieldDecl>(*D) || isa<IndirectFieldDecl>(*D))
3426       ++Index;
3427   }
3428 
3429   return Index;
3430 }
3431 
3432 Decl *ASTNodeImporter::VisitFieldDecl(FieldDecl *D) {
3433   // Import the major distinguishing characteristics of a variable.
3434   DeclContext *DC, *LexicalDC;
3435   DeclarationName Name;
3436   SourceLocation Loc;
3437   NamedDecl *ToD;
3438   if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
3439     return nullptr;
3440   if (ToD)
3441     return ToD;
3442 
3443   // Determine whether we've already imported this field.
3444   SmallVector<NamedDecl *, 2> FoundDecls;
3445   DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls);
3446   for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
3447     if (FieldDecl *FoundField = dyn_cast<FieldDecl>(FoundDecls[I])) {
3448       // For anonymous fields, match up by index.
3449       if (!Name && getFieldIndex(D) != getFieldIndex(FoundField))
3450         continue;
3451 
3452       if (Importer.IsStructurallyEquivalent(D->getType(),
3453                                             FoundField->getType())) {
3454         Importer.Imported(D, FoundField);
3455         return FoundField;
3456       }
3457 
3458       Importer.ToDiag(Loc, diag::err_odr_field_type_inconsistent)
3459         << Name << D->getType() << FoundField->getType();
3460       Importer.ToDiag(FoundField->getLocation(), diag::note_odr_value_here)
3461         << FoundField->getType();
3462       return nullptr;
3463     }
3464   }
3465 
3466   // Import the type.
3467   QualType T = Importer.Import(D->getType());
3468   if (T.isNull())
3469     return nullptr;
3470 
3471   TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo());
3472   Expr *BitWidth = Importer.Import(D->getBitWidth());
3473   if (!BitWidth && D->getBitWidth())
3474     return nullptr;
3475 
3476   FieldDecl *ToField = FieldDecl::Create(Importer.getToContext(), DC,
3477                                          Importer.Import(D->getInnerLocStart()),
3478                                          Loc, Name.getAsIdentifierInfo(),
3479                                          T, TInfo, BitWidth, D->isMutable(),
3480                                          D->getInClassInitStyle());
3481   ToField->setAccess(D->getAccess());
3482   ToField->setLexicalDeclContext(LexicalDC);
3483   if (Expr *FromInitializer = D->getInClassInitializer()) {
3484     Expr *ToInitializer = Importer.Import(FromInitializer);
3485     if (ToInitializer)
3486       ToField->setInClassInitializer(ToInitializer);
3487     else
3488       return nullptr;
3489   }
3490   ToField->setImplicit(D->isImplicit());
3491   Importer.Imported(D, ToField);
3492   LexicalDC->addDeclInternal(ToField);
3493   return ToField;
3494 }
3495 
3496 Decl *ASTNodeImporter::VisitIndirectFieldDecl(IndirectFieldDecl *D) {
3497   // Import the major distinguishing characteristics of a variable.
3498   DeclContext *DC, *LexicalDC;
3499   DeclarationName Name;
3500   SourceLocation Loc;
3501   NamedDecl *ToD;
3502   if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
3503     return nullptr;
3504   if (ToD)
3505     return ToD;
3506 
3507   // Determine whether we've already imported this field.
3508   SmallVector<NamedDecl *, 2> FoundDecls;
3509   DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls);
3510   for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
3511     if (IndirectFieldDecl *FoundField
3512                                 = dyn_cast<IndirectFieldDecl>(FoundDecls[I])) {
3513       // For anonymous indirect fields, match up by index.
3514       if (!Name && getFieldIndex(D) != getFieldIndex(FoundField))
3515         continue;
3516 
3517       if (Importer.IsStructurallyEquivalent(D->getType(),
3518                                             FoundField->getType(),
3519                                             !Name.isEmpty())) {
3520         Importer.Imported(D, FoundField);
3521         return FoundField;
3522       }
3523 
3524       // If there are more anonymous fields to check, continue.
3525       if (!Name && I < N-1)
3526         continue;
3527 
3528       Importer.ToDiag(Loc, diag::err_odr_field_type_inconsistent)
3529         << Name << D->getType() << FoundField->getType();
3530       Importer.ToDiag(FoundField->getLocation(), diag::note_odr_value_here)
3531         << FoundField->getType();
3532       return nullptr;
3533     }
3534   }
3535 
3536   // Import the type.
3537   QualType T = Importer.Import(D->getType());
3538   if (T.isNull())
3539     return nullptr;
3540 
3541   NamedDecl **NamedChain =
3542     new (Importer.getToContext())NamedDecl*[D->getChainingSize()];
3543 
3544   unsigned i = 0;
3545   for (auto *PI : D->chain()) {
3546     Decl *D = Importer.Import(PI);
3547     if (!D)
3548       return nullptr;
3549     NamedChain[i++] = cast<NamedDecl>(D);
3550   }
3551 
3552   IndirectFieldDecl *ToIndirectField = IndirectFieldDecl::Create(
3553       Importer.getToContext(), DC, Loc, Name.getAsIdentifierInfo(), T,
3554       {NamedChain, D->getChainingSize()});
3555 
3556   for (const auto *Attr : D->attrs())
3557     ToIndirectField->addAttr(Attr->clone(Importer.getToContext()));
3558 
3559   ToIndirectField->setAccess(D->getAccess());
3560   ToIndirectField->setLexicalDeclContext(LexicalDC);
3561   Importer.Imported(D, ToIndirectField);
3562   LexicalDC->addDeclInternal(ToIndirectField);
3563   return ToIndirectField;
3564 }
3565 
3566 Decl *ASTNodeImporter::VisitFriendDecl(FriendDecl *D) {
3567   // Import the major distinguishing characteristics of a declaration.
3568   DeclContext *DC = Importer.ImportContext(D->getDeclContext());
3569   DeclContext *LexicalDC = D->getDeclContext() == D->getLexicalDeclContext()
3570       ? DC : Importer.ImportContext(D->getLexicalDeclContext());
3571   if (!DC || !LexicalDC)
3572     return nullptr;
3573 
3574   // Determine whether we've already imported this decl.
3575   // FriendDecl is not a NamedDecl so we cannot use localUncachedLookup.
3576   auto *RD = cast<CXXRecordDecl>(DC);
3577   FriendDecl *ImportedFriend = RD->getFirstFriend();
3578   StructuralEquivalenceContext Context(
3579       Importer.getFromContext(), Importer.getToContext(),
3580       Importer.getNonEquivalentDecls(), false, false);
3581 
3582   while (ImportedFriend) {
3583     if (D->getFriendDecl() && ImportedFriend->getFriendDecl()) {
3584       if (Context.IsStructurallyEquivalent(D->getFriendDecl(),
3585                                            ImportedFriend->getFriendDecl()))
3586         return Importer.Imported(D, ImportedFriend);
3587 
3588     } else if (D->getFriendType() && ImportedFriend->getFriendType()) {
3589       if (Importer.IsStructurallyEquivalent(
3590             D->getFriendType()->getType(),
3591             ImportedFriend->getFriendType()->getType(), true))
3592         return Importer.Imported(D, ImportedFriend);
3593     }
3594     ImportedFriend = ImportedFriend->getNextFriend();
3595   }
3596 
3597   // Not found. Create it.
3598   FriendDecl::FriendUnion ToFU;
3599   if (NamedDecl *FriendD = D->getFriendDecl())
3600     ToFU = cast_or_null<NamedDecl>(Importer.Import(FriendD));
3601   else
3602     ToFU = Importer.Import(D->getFriendType());
3603   if (!ToFU)
3604     return nullptr;
3605 
3606   SmallVector<TemplateParameterList *, 1> ToTPLists(D->NumTPLists);
3607   TemplateParameterList **FromTPLists =
3608       D->getTrailingObjects<TemplateParameterList *>();
3609   for (unsigned I = 0; I < D->NumTPLists; I++) {
3610     TemplateParameterList *List = ImportTemplateParameterList(FromTPLists[I]);
3611     if (!List)
3612       return nullptr;
3613     ToTPLists[I] = List;
3614   }
3615 
3616   FriendDecl *FrD = FriendDecl::Create(Importer.getToContext(), DC,
3617                                        Importer.Import(D->getLocation()),
3618                                        ToFU, Importer.Import(D->getFriendLoc()),
3619                                        ToTPLists);
3620 
3621   Importer.Imported(D, FrD);
3622   RD->pushFriendDecl(FrD);
3623 
3624   FrD->setAccess(D->getAccess());
3625   FrD->setLexicalDeclContext(LexicalDC);
3626   LexicalDC->addDeclInternal(FrD);
3627   return FrD;
3628 }
3629 
3630 Decl *ASTNodeImporter::VisitObjCIvarDecl(ObjCIvarDecl *D) {
3631   // Import the major distinguishing characteristics of an ivar.
3632   DeclContext *DC, *LexicalDC;
3633   DeclarationName Name;
3634   SourceLocation Loc;
3635   NamedDecl *ToD;
3636   if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
3637     return nullptr;
3638   if (ToD)
3639     return ToD;
3640 
3641   // Determine whether we've already imported this ivar
3642   SmallVector<NamedDecl *, 2> FoundDecls;
3643   DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls);
3644   for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
3645     if (ObjCIvarDecl *FoundIvar = dyn_cast<ObjCIvarDecl>(FoundDecls[I])) {
3646       if (Importer.IsStructurallyEquivalent(D->getType(),
3647                                             FoundIvar->getType())) {
3648         Importer.Imported(D, FoundIvar);
3649         return FoundIvar;
3650       }
3651 
3652       Importer.ToDiag(Loc, diag::err_odr_ivar_type_inconsistent)
3653         << Name << D->getType() << FoundIvar->getType();
3654       Importer.ToDiag(FoundIvar->getLocation(), diag::note_odr_value_here)
3655         << FoundIvar->getType();
3656       return nullptr;
3657     }
3658   }
3659 
3660   // Import the type.
3661   QualType T = Importer.Import(D->getType());
3662   if (T.isNull())
3663     return nullptr;
3664 
3665   TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo());
3666   Expr *BitWidth = Importer.Import(D->getBitWidth());
3667   if (!BitWidth && D->getBitWidth())
3668     return nullptr;
3669 
3670   ObjCIvarDecl *ToIvar = ObjCIvarDecl::Create(Importer.getToContext(),
3671                                               cast<ObjCContainerDecl>(DC),
3672                                        Importer.Import(D->getInnerLocStart()),
3673                                               Loc, Name.getAsIdentifierInfo(),
3674                                               T, TInfo, D->getAccessControl(),
3675                                               BitWidth, D->getSynthesize());
3676   ToIvar->setLexicalDeclContext(LexicalDC);
3677   Importer.Imported(D, ToIvar);
3678   LexicalDC->addDeclInternal(ToIvar);
3679   return ToIvar;
3680 
3681 }
3682 
3683 Decl *ASTNodeImporter::VisitVarDecl(VarDecl *D) {
3684   // Import the major distinguishing characteristics of a variable.
3685   DeclContext *DC, *LexicalDC;
3686   DeclarationName Name;
3687   SourceLocation Loc;
3688   NamedDecl *ToD;
3689   if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
3690     return nullptr;
3691   if (ToD)
3692     return ToD;
3693 
3694   // Try to find a variable in our own ("to") context with the same name and
3695   // in the same context as the variable we're importing.
3696   if (D->isFileVarDecl()) {
3697     VarDecl *MergeWithVar = nullptr;
3698     SmallVector<NamedDecl *, 4> ConflictingDecls;
3699     unsigned IDNS = Decl::IDNS_Ordinary;
3700     SmallVector<NamedDecl *, 2> FoundDecls;
3701     DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls);
3702     for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
3703       if (!FoundDecls[I]->isInIdentifierNamespace(IDNS))
3704         continue;
3705 
3706       if (VarDecl *FoundVar = dyn_cast<VarDecl>(FoundDecls[I])) {
3707         // We have found a variable that we may need to merge with. Check it.
3708         if (FoundVar->hasExternalFormalLinkage() &&
3709             D->hasExternalFormalLinkage()) {
3710           if (Importer.IsStructurallyEquivalent(D->getType(),
3711                                                 FoundVar->getType())) {
3712             MergeWithVar = FoundVar;
3713             break;
3714           }
3715 
3716           const ArrayType *FoundArray
3717             = Importer.getToContext().getAsArrayType(FoundVar->getType());
3718           const ArrayType *TArray
3719             = Importer.getToContext().getAsArrayType(D->getType());
3720           if (FoundArray && TArray) {
3721             if (isa<IncompleteArrayType>(FoundArray) &&
3722                 isa<ConstantArrayType>(TArray)) {
3723               // Import the type.
3724               QualType T = Importer.Import(D->getType());
3725               if (T.isNull())
3726                 return nullptr;
3727 
3728               FoundVar->setType(T);
3729               MergeWithVar = FoundVar;
3730               break;
3731             } else if (isa<IncompleteArrayType>(TArray) &&
3732                        isa<ConstantArrayType>(FoundArray)) {
3733               MergeWithVar = FoundVar;
3734               break;
3735             }
3736           }
3737 
3738           Importer.ToDiag(Loc, diag::err_odr_variable_type_inconsistent)
3739             << Name << D->getType() << FoundVar->getType();
3740           Importer.ToDiag(FoundVar->getLocation(), diag::note_odr_value_here)
3741             << FoundVar->getType();
3742         }
3743       }
3744 
3745       ConflictingDecls.push_back(FoundDecls[I]);
3746     }
3747 
3748     if (MergeWithVar) {
3749       // An equivalent variable with external linkage has been found. Link
3750       // the two declarations, then merge them.
3751       Importer.Imported(D, MergeWithVar);
3752 
3753       if (VarDecl *DDef = D->getDefinition()) {
3754         if (VarDecl *ExistingDef = MergeWithVar->getDefinition()) {
3755           Importer.ToDiag(ExistingDef->getLocation(),
3756                           diag::err_odr_variable_multiple_def)
3757             << Name;
3758           Importer.FromDiag(DDef->getLocation(), diag::note_odr_defined_here);
3759         } else {
3760           Expr *Init = Importer.Import(DDef->getInit());
3761           MergeWithVar->setInit(Init);
3762           if (DDef->isInitKnownICE()) {
3763             EvaluatedStmt *Eval = MergeWithVar->ensureEvaluatedStmt();
3764             Eval->CheckedICE = true;
3765             Eval->IsICE = DDef->isInitICE();
3766           }
3767         }
3768       }
3769 
3770       return MergeWithVar;
3771     }
3772 
3773     if (!ConflictingDecls.empty()) {
3774       Name = Importer.HandleNameConflict(Name, DC, IDNS,
3775                                          ConflictingDecls.data(),
3776                                          ConflictingDecls.size());
3777       if (!Name)
3778         return nullptr;
3779     }
3780   }
3781 
3782   // Import the type.
3783   QualType T = Importer.Import(D->getType());
3784   if (T.isNull())
3785     return nullptr;
3786 
3787   // Create the imported variable.
3788   TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo());
3789   VarDecl *ToVar = VarDecl::Create(Importer.getToContext(), DC,
3790                                    Importer.Import(D->getInnerLocStart()),
3791                                    Loc, Name.getAsIdentifierInfo(),
3792                                    T, TInfo,
3793                                    D->getStorageClass());
3794   ToVar->setQualifierInfo(Importer.Import(D->getQualifierLoc()));
3795   ToVar->setAccess(D->getAccess());
3796   ToVar->setLexicalDeclContext(LexicalDC);
3797   Importer.Imported(D, ToVar);
3798   LexicalDC->addDeclInternal(ToVar);
3799 
3800   if (!D->isFileVarDecl() &&
3801       D->isUsed())
3802     ToVar->setIsUsed();
3803 
3804   // Merge the initializer.
3805   if (ImportDefinition(D, ToVar))
3806     return nullptr;
3807 
3808   if (D->isConstexpr())
3809     ToVar->setConstexpr(true);
3810 
3811   return ToVar;
3812 }
3813 
3814 Decl *ASTNodeImporter::VisitImplicitParamDecl(ImplicitParamDecl *D) {
3815   // Parameters are created in the translation unit's context, then moved
3816   // into the function declaration's context afterward.
3817   DeclContext *DC = Importer.getToContext().getTranslationUnitDecl();
3818 
3819   // Import the name of this declaration.
3820   DeclarationName Name = Importer.Import(D->getDeclName());
3821   if (D->getDeclName() && !Name)
3822     return nullptr;
3823 
3824   // Import the location of this declaration.
3825   SourceLocation Loc = Importer.Import(D->getLocation());
3826 
3827   // Import the parameter's type.
3828   QualType T = Importer.Import(D->getType());
3829   if (T.isNull())
3830     return nullptr;
3831 
3832   // Create the imported parameter.
3833   ImplicitParamDecl *ToParm
3834     = ImplicitParamDecl::Create(Importer.getToContext(), DC,
3835                                 Loc, Name.getAsIdentifierInfo(),
3836                                 T);
3837   return Importer.Imported(D, ToParm);
3838 }
3839 
3840 Decl *ASTNodeImporter::VisitParmVarDecl(ParmVarDecl *D) {
3841   // Parameters are created in the translation unit's context, then moved
3842   // into the function declaration's context afterward.
3843   DeclContext *DC = Importer.getToContext().getTranslationUnitDecl();
3844 
3845   // Import the name of this declaration.
3846   DeclarationName Name = Importer.Import(D->getDeclName());
3847   if (D->getDeclName() && !Name)
3848     return nullptr;
3849 
3850   // Import the location of this declaration.
3851   SourceLocation Loc = Importer.Import(D->getLocation());
3852 
3853   // Import the parameter's type.
3854   QualType T = Importer.Import(D->getType());
3855   if (T.isNull())
3856     return nullptr;
3857 
3858   // Create the imported parameter.
3859   TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo());
3860   ParmVarDecl *ToParm = ParmVarDecl::Create(Importer.getToContext(), DC,
3861                                      Importer.Import(D->getInnerLocStart()),
3862                                             Loc, Name.getAsIdentifierInfo(),
3863                                             T, TInfo, D->getStorageClass(),
3864                                             /*DefaultArg*/ nullptr);
3865 
3866   // Set the default argument.
3867   ToParm->setHasInheritedDefaultArg(D->hasInheritedDefaultArg());
3868   ToParm->setKNRPromoted(D->isKNRPromoted());
3869 
3870   Expr *ToDefArg = nullptr;
3871   Expr *FromDefArg = nullptr;
3872   if (D->hasUninstantiatedDefaultArg()) {
3873     FromDefArg = D->getUninstantiatedDefaultArg();
3874     ToDefArg = Importer.Import(FromDefArg);
3875     ToParm->setUninstantiatedDefaultArg(ToDefArg);
3876   } else if (D->hasUnparsedDefaultArg()) {
3877     ToParm->setUnparsedDefaultArg();
3878   } else if (D->hasDefaultArg()) {
3879     FromDefArg = D->getDefaultArg();
3880     ToDefArg = Importer.Import(FromDefArg);
3881     ToParm->setDefaultArg(ToDefArg);
3882   }
3883   if (FromDefArg && !ToDefArg)
3884     return nullptr;
3885 
3886   if (D->isUsed())
3887     ToParm->setIsUsed();
3888 
3889   return Importer.Imported(D, ToParm);
3890 }
3891 
3892 Decl *ASTNodeImporter::VisitObjCMethodDecl(ObjCMethodDecl *D) {
3893   // Import the major distinguishing characteristics of a method.
3894   DeclContext *DC, *LexicalDC;
3895   DeclarationName Name;
3896   SourceLocation Loc;
3897   NamedDecl *ToD;
3898   if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
3899     return nullptr;
3900   if (ToD)
3901     return ToD;
3902 
3903   SmallVector<NamedDecl *, 2> FoundDecls;
3904   DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls);
3905   for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
3906     if (ObjCMethodDecl *FoundMethod = dyn_cast<ObjCMethodDecl>(FoundDecls[I])) {
3907       if (FoundMethod->isInstanceMethod() != D->isInstanceMethod())
3908         continue;
3909 
3910       // Check return types.
3911       if (!Importer.IsStructurallyEquivalent(D->getReturnType(),
3912                                              FoundMethod->getReturnType())) {
3913         Importer.ToDiag(Loc, diag::err_odr_objc_method_result_type_inconsistent)
3914             << D->isInstanceMethod() << Name << D->getReturnType()
3915             << FoundMethod->getReturnType();
3916         Importer.ToDiag(FoundMethod->getLocation(),
3917                         diag::note_odr_objc_method_here)
3918           << D->isInstanceMethod() << Name;
3919         return nullptr;
3920       }
3921 
3922       // Check the number of parameters.
3923       if (D->param_size() != FoundMethod->param_size()) {
3924         Importer.ToDiag(Loc, diag::err_odr_objc_method_num_params_inconsistent)
3925           << D->isInstanceMethod() << Name
3926           << D->param_size() << FoundMethod->param_size();
3927         Importer.ToDiag(FoundMethod->getLocation(),
3928                         diag::note_odr_objc_method_here)
3929           << D->isInstanceMethod() << Name;
3930         return nullptr;
3931       }
3932 
3933       // Check parameter types.
3934       for (ObjCMethodDecl::param_iterator P = D->param_begin(),
3935              PEnd = D->param_end(), FoundP = FoundMethod->param_begin();
3936            P != PEnd; ++P, ++FoundP) {
3937         if (!Importer.IsStructurallyEquivalent((*P)->getType(),
3938                                                (*FoundP)->getType())) {
3939           Importer.FromDiag((*P)->getLocation(),
3940                             diag::err_odr_objc_method_param_type_inconsistent)
3941             << D->isInstanceMethod() << Name
3942             << (*P)->getType() << (*FoundP)->getType();
3943           Importer.ToDiag((*FoundP)->getLocation(), diag::note_odr_value_here)
3944             << (*FoundP)->getType();
3945           return nullptr;
3946         }
3947       }
3948 
3949       // Check variadic/non-variadic.
3950       // Check the number of parameters.
3951       if (D->isVariadic() != FoundMethod->isVariadic()) {
3952         Importer.ToDiag(Loc, diag::err_odr_objc_method_variadic_inconsistent)
3953           << D->isInstanceMethod() << Name;
3954         Importer.ToDiag(FoundMethod->getLocation(),
3955                         diag::note_odr_objc_method_here)
3956           << D->isInstanceMethod() << Name;
3957         return nullptr;
3958       }
3959 
3960       // FIXME: Any other bits we need to merge?
3961       return Importer.Imported(D, FoundMethod);
3962     }
3963   }
3964 
3965   // Import the result type.
3966   QualType ResultTy = Importer.Import(D->getReturnType());
3967   if (ResultTy.isNull())
3968     return nullptr;
3969 
3970   TypeSourceInfo *ReturnTInfo = Importer.Import(D->getReturnTypeSourceInfo());
3971 
3972   ObjCMethodDecl *ToMethod = ObjCMethodDecl::Create(
3973       Importer.getToContext(), Loc, Importer.Import(D->getLocEnd()),
3974       Name.getObjCSelector(), ResultTy, ReturnTInfo, DC, D->isInstanceMethod(),
3975       D->isVariadic(), D->isPropertyAccessor(), D->isImplicit(), D->isDefined(),
3976       D->getImplementationControl(), D->hasRelatedResultType());
3977 
3978   // FIXME: When we decide to merge method definitions, we'll need to
3979   // deal with implicit parameters.
3980 
3981   // Import the parameters
3982   SmallVector<ParmVarDecl *, 5> ToParams;
3983   for (auto *FromP : D->parameters()) {
3984     ParmVarDecl *ToP = cast_or_null<ParmVarDecl>(Importer.Import(FromP));
3985     if (!ToP)
3986       return nullptr;
3987 
3988     ToParams.push_back(ToP);
3989   }
3990 
3991   // Set the parameters.
3992   for (unsigned I = 0, N = ToParams.size(); I != N; ++I) {
3993     ToParams[I]->setOwningFunction(ToMethod);
3994     ToMethod->addDeclInternal(ToParams[I]);
3995   }
3996   SmallVector<SourceLocation, 12> SelLocs;
3997   D->getSelectorLocs(SelLocs);
3998   ToMethod->setMethodParams(Importer.getToContext(), ToParams, SelLocs);
3999 
4000   ToMethod->setLexicalDeclContext(LexicalDC);
4001   Importer.Imported(D, ToMethod);
4002   LexicalDC->addDeclInternal(ToMethod);
4003   return ToMethod;
4004 }
4005 
4006 Decl *ASTNodeImporter::VisitObjCTypeParamDecl(ObjCTypeParamDecl *D) {
4007   // Import the major distinguishing characteristics of a category.
4008   DeclContext *DC, *LexicalDC;
4009   DeclarationName Name;
4010   SourceLocation Loc;
4011   NamedDecl *ToD;
4012   if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
4013     return nullptr;
4014   if (ToD)
4015     return ToD;
4016 
4017   TypeSourceInfo *BoundInfo = Importer.Import(D->getTypeSourceInfo());
4018   if (!BoundInfo)
4019     return nullptr;
4020 
4021   ObjCTypeParamDecl *Result = ObjCTypeParamDecl::Create(
4022                                 Importer.getToContext(), DC,
4023                                 D->getVariance(),
4024                                 Importer.Import(D->getVarianceLoc()),
4025                                 D->getIndex(),
4026                                 Importer.Import(D->getLocation()),
4027                                 Name.getAsIdentifierInfo(),
4028                                 Importer.Import(D->getColonLoc()),
4029                                 BoundInfo);
4030   Importer.Imported(D, Result);
4031   Result->setLexicalDeclContext(LexicalDC);
4032   return Result;
4033 }
4034 
4035 Decl *ASTNodeImporter::VisitObjCCategoryDecl(ObjCCategoryDecl *D) {
4036   // Import the major distinguishing characteristics of a category.
4037   DeclContext *DC, *LexicalDC;
4038   DeclarationName Name;
4039   SourceLocation Loc;
4040   NamedDecl *ToD;
4041   if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
4042     return nullptr;
4043   if (ToD)
4044     return ToD;
4045 
4046   ObjCInterfaceDecl *ToInterface
4047     = cast_or_null<ObjCInterfaceDecl>(Importer.Import(D->getClassInterface()));
4048   if (!ToInterface)
4049     return nullptr;
4050 
4051   // Determine if we've already encountered this category.
4052   ObjCCategoryDecl *MergeWithCategory
4053     = ToInterface->FindCategoryDeclaration(Name.getAsIdentifierInfo());
4054   ObjCCategoryDecl *ToCategory = MergeWithCategory;
4055   if (!ToCategory) {
4056     ToCategory = ObjCCategoryDecl::Create(Importer.getToContext(), DC,
4057                                           Importer.Import(D->getAtStartLoc()),
4058                                           Loc,
4059                                        Importer.Import(D->getCategoryNameLoc()),
4060                                           Name.getAsIdentifierInfo(),
4061                                           ToInterface,
4062                                           /*TypeParamList=*/nullptr,
4063                                        Importer.Import(D->getIvarLBraceLoc()),
4064                                        Importer.Import(D->getIvarRBraceLoc()));
4065     ToCategory->setLexicalDeclContext(LexicalDC);
4066     LexicalDC->addDeclInternal(ToCategory);
4067     Importer.Imported(D, ToCategory);
4068     // Import the type parameter list after calling Imported, to avoid
4069     // loops when bringing in their DeclContext.
4070     ToCategory->setTypeParamList(ImportObjCTypeParamList(
4071                                    D->getTypeParamList()));
4072 
4073     // Import protocols
4074     SmallVector<ObjCProtocolDecl *, 4> Protocols;
4075     SmallVector<SourceLocation, 4> ProtocolLocs;
4076     ObjCCategoryDecl::protocol_loc_iterator FromProtoLoc
4077       = D->protocol_loc_begin();
4078     for (ObjCCategoryDecl::protocol_iterator FromProto = D->protocol_begin(),
4079                                           FromProtoEnd = D->protocol_end();
4080          FromProto != FromProtoEnd;
4081          ++FromProto, ++FromProtoLoc) {
4082       ObjCProtocolDecl *ToProto
4083         = cast_or_null<ObjCProtocolDecl>(Importer.Import(*FromProto));
4084       if (!ToProto)
4085         return nullptr;
4086       Protocols.push_back(ToProto);
4087       ProtocolLocs.push_back(Importer.Import(*FromProtoLoc));
4088     }
4089 
4090     // FIXME: If we're merging, make sure that the protocol list is the same.
4091     ToCategory->setProtocolList(Protocols.data(), Protocols.size(),
4092                                 ProtocolLocs.data(), Importer.getToContext());
4093 
4094   } else {
4095     Importer.Imported(D, ToCategory);
4096   }
4097 
4098   // Import all of the members of this category.
4099   ImportDeclContext(D);
4100 
4101   // If we have an implementation, import it as well.
4102   if (D->getImplementation()) {
4103     ObjCCategoryImplDecl *Impl
4104       = cast_or_null<ObjCCategoryImplDecl>(
4105                                        Importer.Import(D->getImplementation()));
4106     if (!Impl)
4107       return nullptr;
4108 
4109     ToCategory->setImplementation(Impl);
4110   }
4111 
4112   return ToCategory;
4113 }
4114 
4115 bool ASTNodeImporter::ImportDefinition(ObjCProtocolDecl *From,
4116                                        ObjCProtocolDecl *To,
4117                                        ImportDefinitionKind Kind) {
4118   if (To->getDefinition()) {
4119     if (shouldForceImportDeclContext(Kind))
4120       ImportDeclContext(From);
4121     return false;
4122   }
4123 
4124   // Start the protocol definition
4125   To->startDefinition();
4126 
4127   // Import protocols
4128   SmallVector<ObjCProtocolDecl *, 4> Protocols;
4129   SmallVector<SourceLocation, 4> ProtocolLocs;
4130   ObjCProtocolDecl::protocol_loc_iterator
4131   FromProtoLoc = From->protocol_loc_begin();
4132   for (ObjCProtocolDecl::protocol_iterator FromProto = From->protocol_begin(),
4133                                         FromProtoEnd = From->protocol_end();
4134        FromProto != FromProtoEnd;
4135        ++FromProto, ++FromProtoLoc) {
4136     ObjCProtocolDecl *ToProto
4137       = cast_or_null<ObjCProtocolDecl>(Importer.Import(*FromProto));
4138     if (!ToProto)
4139       return true;
4140     Protocols.push_back(ToProto);
4141     ProtocolLocs.push_back(Importer.Import(*FromProtoLoc));
4142   }
4143 
4144   // FIXME: If we're merging, make sure that the protocol list is the same.
4145   To->setProtocolList(Protocols.data(), Protocols.size(),
4146                       ProtocolLocs.data(), Importer.getToContext());
4147 
4148   if (shouldForceImportDeclContext(Kind)) {
4149     // Import all of the members of this protocol.
4150     ImportDeclContext(From, /*ForceImport=*/true);
4151   }
4152   return false;
4153 }
4154 
4155 Decl *ASTNodeImporter::VisitObjCProtocolDecl(ObjCProtocolDecl *D) {
4156   // If this protocol has a definition in the translation unit we're coming
4157   // from, but this particular declaration is not that definition, import the
4158   // definition and map to that.
4159   ObjCProtocolDecl *Definition = D->getDefinition();
4160   if (Definition && Definition != D) {
4161     Decl *ImportedDef = Importer.Import(Definition);
4162     if (!ImportedDef)
4163       return nullptr;
4164 
4165     return Importer.Imported(D, ImportedDef);
4166   }
4167 
4168   // Import the major distinguishing characteristics of a protocol.
4169   DeclContext *DC, *LexicalDC;
4170   DeclarationName Name;
4171   SourceLocation Loc;
4172   NamedDecl *ToD;
4173   if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
4174     return nullptr;
4175   if (ToD)
4176     return ToD;
4177 
4178   ObjCProtocolDecl *MergeWithProtocol = nullptr;
4179   SmallVector<NamedDecl *, 2> FoundDecls;
4180   DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls);
4181   for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
4182     if (!FoundDecls[I]->isInIdentifierNamespace(Decl::IDNS_ObjCProtocol))
4183       continue;
4184 
4185     if ((MergeWithProtocol = dyn_cast<ObjCProtocolDecl>(FoundDecls[I])))
4186       break;
4187   }
4188 
4189   ObjCProtocolDecl *ToProto = MergeWithProtocol;
4190   if (!ToProto) {
4191     ToProto = ObjCProtocolDecl::Create(Importer.getToContext(), DC,
4192                                        Name.getAsIdentifierInfo(), Loc,
4193                                        Importer.Import(D->getAtStartLoc()),
4194                                        /*PrevDecl=*/nullptr);
4195     ToProto->setLexicalDeclContext(LexicalDC);
4196     LexicalDC->addDeclInternal(ToProto);
4197   }
4198 
4199   Importer.Imported(D, ToProto);
4200 
4201   if (D->isThisDeclarationADefinition() && ImportDefinition(D, ToProto))
4202     return nullptr;
4203 
4204   return ToProto;
4205 }
4206 
4207 Decl *ASTNodeImporter::VisitLinkageSpecDecl(LinkageSpecDecl *D) {
4208   DeclContext *DC = Importer.ImportContext(D->getDeclContext());
4209   DeclContext *LexicalDC = Importer.ImportContext(D->getLexicalDeclContext());
4210 
4211   SourceLocation ExternLoc = Importer.Import(D->getExternLoc());
4212   SourceLocation LangLoc = Importer.Import(D->getLocation());
4213 
4214   bool HasBraces = D->hasBraces();
4215 
4216   LinkageSpecDecl *ToLinkageSpec =
4217     LinkageSpecDecl::Create(Importer.getToContext(),
4218                             DC,
4219                             ExternLoc,
4220                             LangLoc,
4221                             D->getLanguage(),
4222                             HasBraces);
4223 
4224   if (HasBraces) {
4225     SourceLocation RBraceLoc = Importer.Import(D->getRBraceLoc());
4226     ToLinkageSpec->setRBraceLoc(RBraceLoc);
4227   }
4228 
4229   ToLinkageSpec->setLexicalDeclContext(LexicalDC);
4230   LexicalDC->addDeclInternal(ToLinkageSpec);
4231 
4232   Importer.Imported(D, ToLinkageSpec);
4233 
4234   return ToLinkageSpec;
4235 }
4236 
4237 bool ASTNodeImporter::ImportDefinition(ObjCInterfaceDecl *From,
4238                                        ObjCInterfaceDecl *To,
4239                                        ImportDefinitionKind Kind) {
4240   if (To->getDefinition()) {
4241     // Check consistency of superclass.
4242     ObjCInterfaceDecl *FromSuper = From->getSuperClass();
4243     if (FromSuper) {
4244       FromSuper = cast_or_null<ObjCInterfaceDecl>(Importer.Import(FromSuper));
4245       if (!FromSuper)
4246         return true;
4247     }
4248 
4249     ObjCInterfaceDecl *ToSuper = To->getSuperClass();
4250     if ((bool)FromSuper != (bool)ToSuper ||
4251         (FromSuper && !declaresSameEntity(FromSuper, ToSuper))) {
4252       Importer.ToDiag(To->getLocation(),
4253                       diag::err_odr_objc_superclass_inconsistent)
4254         << To->getDeclName();
4255       if (ToSuper)
4256         Importer.ToDiag(To->getSuperClassLoc(), diag::note_odr_objc_superclass)
4257           << To->getSuperClass()->getDeclName();
4258       else
4259         Importer.ToDiag(To->getLocation(),
4260                         diag::note_odr_objc_missing_superclass);
4261       if (From->getSuperClass())
4262         Importer.FromDiag(From->getSuperClassLoc(),
4263                           diag::note_odr_objc_superclass)
4264         << From->getSuperClass()->getDeclName();
4265       else
4266         Importer.FromDiag(From->getLocation(),
4267                           diag::note_odr_objc_missing_superclass);
4268     }
4269 
4270     if (shouldForceImportDeclContext(Kind))
4271       ImportDeclContext(From);
4272     return false;
4273   }
4274 
4275   // Start the definition.
4276   To->startDefinition();
4277 
4278   // If this class has a superclass, import it.
4279   if (From->getSuperClass()) {
4280     TypeSourceInfo *SuperTInfo = Importer.Import(From->getSuperClassTInfo());
4281     if (!SuperTInfo)
4282       return true;
4283 
4284     To->setSuperClass(SuperTInfo);
4285   }
4286 
4287   // Import protocols
4288   SmallVector<ObjCProtocolDecl *, 4> Protocols;
4289   SmallVector<SourceLocation, 4> ProtocolLocs;
4290   ObjCInterfaceDecl::protocol_loc_iterator
4291   FromProtoLoc = From->protocol_loc_begin();
4292 
4293   for (ObjCInterfaceDecl::protocol_iterator FromProto = From->protocol_begin(),
4294                                          FromProtoEnd = From->protocol_end();
4295        FromProto != FromProtoEnd;
4296        ++FromProto, ++FromProtoLoc) {
4297     ObjCProtocolDecl *ToProto
4298       = cast_or_null<ObjCProtocolDecl>(Importer.Import(*FromProto));
4299     if (!ToProto)
4300       return true;
4301     Protocols.push_back(ToProto);
4302     ProtocolLocs.push_back(Importer.Import(*FromProtoLoc));
4303   }
4304 
4305   // FIXME: If we're merging, make sure that the protocol list is the same.
4306   To->setProtocolList(Protocols.data(), Protocols.size(),
4307                       ProtocolLocs.data(), Importer.getToContext());
4308 
4309   // Import categories. When the categories themselves are imported, they'll
4310   // hook themselves into this interface.
4311   for (auto *Cat : From->known_categories())
4312     Importer.Import(Cat);
4313 
4314   // If we have an @implementation, import it as well.
4315   if (From->getImplementation()) {
4316     ObjCImplementationDecl *Impl = cast_or_null<ObjCImplementationDecl>(
4317                                      Importer.Import(From->getImplementation()));
4318     if (!Impl)
4319       return true;
4320 
4321     To->setImplementation(Impl);
4322   }
4323 
4324   if (shouldForceImportDeclContext(Kind)) {
4325     // Import all of the members of this class.
4326     ImportDeclContext(From, /*ForceImport=*/true);
4327   }
4328   return false;
4329 }
4330 
4331 ObjCTypeParamList *
4332 ASTNodeImporter::ImportObjCTypeParamList(ObjCTypeParamList *list) {
4333   if (!list)
4334     return nullptr;
4335 
4336   SmallVector<ObjCTypeParamDecl *, 4> toTypeParams;
4337   for (auto fromTypeParam : *list) {
4338     auto toTypeParam = cast_or_null<ObjCTypeParamDecl>(
4339                          Importer.Import(fromTypeParam));
4340     if (!toTypeParam)
4341       return nullptr;
4342 
4343     toTypeParams.push_back(toTypeParam);
4344   }
4345 
4346   return ObjCTypeParamList::create(Importer.getToContext(),
4347                                    Importer.Import(list->getLAngleLoc()),
4348                                    toTypeParams,
4349                                    Importer.Import(list->getRAngleLoc()));
4350 }
4351 
4352 Decl *ASTNodeImporter::VisitObjCInterfaceDecl(ObjCInterfaceDecl *D) {
4353   // If this class has a definition in the translation unit we're coming from,
4354   // but this particular declaration is not that definition, import the
4355   // definition and map to that.
4356   ObjCInterfaceDecl *Definition = D->getDefinition();
4357   if (Definition && Definition != D) {
4358     Decl *ImportedDef = Importer.Import(Definition);
4359     if (!ImportedDef)
4360       return nullptr;
4361 
4362     return Importer.Imported(D, ImportedDef);
4363   }
4364 
4365   // Import the major distinguishing characteristics of an @interface.
4366   DeclContext *DC, *LexicalDC;
4367   DeclarationName Name;
4368   SourceLocation Loc;
4369   NamedDecl *ToD;
4370   if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
4371     return nullptr;
4372   if (ToD)
4373     return ToD;
4374 
4375   // Look for an existing interface with the same name.
4376   ObjCInterfaceDecl *MergeWithIface = nullptr;
4377   SmallVector<NamedDecl *, 2> FoundDecls;
4378   DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls);
4379   for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
4380     if (!FoundDecls[I]->isInIdentifierNamespace(Decl::IDNS_Ordinary))
4381       continue;
4382 
4383     if ((MergeWithIface = dyn_cast<ObjCInterfaceDecl>(FoundDecls[I])))
4384       break;
4385   }
4386 
4387   // Create an interface declaration, if one does not already exist.
4388   ObjCInterfaceDecl *ToIface = MergeWithIface;
4389   if (!ToIface) {
4390     ToIface = ObjCInterfaceDecl::Create(Importer.getToContext(), DC,
4391                                         Importer.Import(D->getAtStartLoc()),
4392                                         Name.getAsIdentifierInfo(),
4393                                         /*TypeParamList=*/nullptr,
4394                                         /*PrevDecl=*/nullptr, Loc,
4395                                         D->isImplicitInterfaceDecl());
4396     ToIface->setLexicalDeclContext(LexicalDC);
4397     LexicalDC->addDeclInternal(ToIface);
4398   }
4399   Importer.Imported(D, ToIface);
4400   // Import the type parameter list after calling Imported, to avoid
4401   // loops when bringing in their DeclContext.
4402   ToIface->setTypeParamList(ImportObjCTypeParamList(
4403                               D->getTypeParamListAsWritten()));
4404 
4405   if (D->isThisDeclarationADefinition() && ImportDefinition(D, ToIface))
4406     return nullptr;
4407 
4408   return ToIface;
4409 }
4410 
4411 Decl *ASTNodeImporter::VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) {
4412   ObjCCategoryDecl *Category = cast_or_null<ObjCCategoryDecl>(
4413                                         Importer.Import(D->getCategoryDecl()));
4414   if (!Category)
4415     return nullptr;
4416 
4417   ObjCCategoryImplDecl *ToImpl = Category->getImplementation();
4418   if (!ToImpl) {
4419     DeclContext *DC = Importer.ImportContext(D->getDeclContext());
4420     if (!DC)
4421       return nullptr;
4422 
4423     SourceLocation CategoryNameLoc = Importer.Import(D->getCategoryNameLoc());
4424     ToImpl = ObjCCategoryImplDecl::Create(Importer.getToContext(), DC,
4425                                           Importer.Import(D->getIdentifier()),
4426                                           Category->getClassInterface(),
4427                                           Importer.Import(D->getLocation()),
4428                                           Importer.Import(D->getAtStartLoc()),
4429                                           CategoryNameLoc);
4430 
4431     DeclContext *LexicalDC = DC;
4432     if (D->getDeclContext() != D->getLexicalDeclContext()) {
4433       LexicalDC = Importer.ImportContext(D->getLexicalDeclContext());
4434       if (!LexicalDC)
4435         return nullptr;
4436 
4437       ToImpl->setLexicalDeclContext(LexicalDC);
4438     }
4439 
4440     LexicalDC->addDeclInternal(ToImpl);
4441     Category->setImplementation(ToImpl);
4442   }
4443 
4444   Importer.Imported(D, ToImpl);
4445   ImportDeclContext(D);
4446   return ToImpl;
4447 }
4448 
4449 Decl *ASTNodeImporter::VisitObjCImplementationDecl(ObjCImplementationDecl *D) {
4450   // Find the corresponding interface.
4451   ObjCInterfaceDecl *Iface = cast_or_null<ObjCInterfaceDecl>(
4452                                        Importer.Import(D->getClassInterface()));
4453   if (!Iface)
4454     return nullptr;
4455 
4456   // Import the superclass, if any.
4457   ObjCInterfaceDecl *Super = nullptr;
4458   if (D->getSuperClass()) {
4459     Super = cast_or_null<ObjCInterfaceDecl>(
4460                                           Importer.Import(D->getSuperClass()));
4461     if (!Super)
4462       return nullptr;
4463   }
4464 
4465   ObjCImplementationDecl *Impl = Iface->getImplementation();
4466   if (!Impl) {
4467     // We haven't imported an implementation yet. Create a new @implementation
4468     // now.
4469     Impl = ObjCImplementationDecl::Create(Importer.getToContext(),
4470                                   Importer.ImportContext(D->getDeclContext()),
4471                                           Iface, Super,
4472                                           Importer.Import(D->getLocation()),
4473                                           Importer.Import(D->getAtStartLoc()),
4474                                           Importer.Import(D->getSuperClassLoc()),
4475                                           Importer.Import(D->getIvarLBraceLoc()),
4476                                           Importer.Import(D->getIvarRBraceLoc()));
4477 
4478     if (D->getDeclContext() != D->getLexicalDeclContext()) {
4479       DeclContext *LexicalDC
4480         = Importer.ImportContext(D->getLexicalDeclContext());
4481       if (!LexicalDC)
4482         return nullptr;
4483       Impl->setLexicalDeclContext(LexicalDC);
4484     }
4485 
4486     // Associate the implementation with the class it implements.
4487     Iface->setImplementation(Impl);
4488     Importer.Imported(D, Iface->getImplementation());
4489   } else {
4490     Importer.Imported(D, Iface->getImplementation());
4491 
4492     // Verify that the existing @implementation has the same superclass.
4493     if ((Super && !Impl->getSuperClass()) ||
4494         (!Super && Impl->getSuperClass()) ||
4495         (Super && Impl->getSuperClass() &&
4496          !declaresSameEntity(Super->getCanonicalDecl(),
4497                              Impl->getSuperClass()))) {
4498       Importer.ToDiag(Impl->getLocation(),
4499                       diag::err_odr_objc_superclass_inconsistent)
4500         << Iface->getDeclName();
4501       // FIXME: It would be nice to have the location of the superclass
4502       // below.
4503       if (Impl->getSuperClass())
4504         Importer.ToDiag(Impl->getLocation(),
4505                         diag::note_odr_objc_superclass)
4506         << Impl->getSuperClass()->getDeclName();
4507       else
4508         Importer.ToDiag(Impl->getLocation(),
4509                         diag::note_odr_objc_missing_superclass);
4510       if (D->getSuperClass())
4511         Importer.FromDiag(D->getLocation(),
4512                           diag::note_odr_objc_superclass)
4513         << D->getSuperClass()->getDeclName();
4514       else
4515         Importer.FromDiag(D->getLocation(),
4516                           diag::note_odr_objc_missing_superclass);
4517       return nullptr;
4518     }
4519   }
4520 
4521   // Import all of the members of this @implementation.
4522   ImportDeclContext(D);
4523 
4524   return Impl;
4525 }
4526 
4527 Decl *ASTNodeImporter::VisitObjCPropertyDecl(ObjCPropertyDecl *D) {
4528   // Import the major distinguishing characteristics of an @property.
4529   DeclContext *DC, *LexicalDC;
4530   DeclarationName Name;
4531   SourceLocation Loc;
4532   NamedDecl *ToD;
4533   if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
4534     return nullptr;
4535   if (ToD)
4536     return ToD;
4537 
4538   // Check whether we have already imported this property.
4539   SmallVector<NamedDecl *, 2> FoundDecls;
4540   DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls);
4541   for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
4542     if (ObjCPropertyDecl *FoundProp
4543                                 = dyn_cast<ObjCPropertyDecl>(FoundDecls[I])) {
4544       // Check property types.
4545       if (!Importer.IsStructurallyEquivalent(D->getType(),
4546                                              FoundProp->getType())) {
4547         Importer.ToDiag(Loc, diag::err_odr_objc_property_type_inconsistent)
4548           << Name << D->getType() << FoundProp->getType();
4549         Importer.ToDiag(FoundProp->getLocation(), diag::note_odr_value_here)
4550           << FoundProp->getType();
4551         return nullptr;
4552       }
4553 
4554       // FIXME: Check property attributes, getters, setters, etc.?
4555 
4556       // Consider these properties to be equivalent.
4557       Importer.Imported(D, FoundProp);
4558       return FoundProp;
4559     }
4560   }
4561 
4562   // Import the type.
4563   TypeSourceInfo *TSI = Importer.Import(D->getTypeSourceInfo());
4564   if (!TSI)
4565     return nullptr;
4566 
4567   // Create the new property.
4568   ObjCPropertyDecl *ToProperty
4569     = ObjCPropertyDecl::Create(Importer.getToContext(), DC, Loc,
4570                                Name.getAsIdentifierInfo(),
4571                                Importer.Import(D->getAtLoc()),
4572                                Importer.Import(D->getLParenLoc()),
4573                                Importer.Import(D->getType()),
4574                                TSI,
4575                                D->getPropertyImplementation());
4576   Importer.Imported(D, ToProperty);
4577   ToProperty->setLexicalDeclContext(LexicalDC);
4578   LexicalDC->addDeclInternal(ToProperty);
4579 
4580   ToProperty->setPropertyAttributes(D->getPropertyAttributes());
4581   ToProperty->setPropertyAttributesAsWritten(
4582                                       D->getPropertyAttributesAsWritten());
4583   ToProperty->setGetterName(Importer.Import(D->getGetterName()),
4584                             Importer.Import(D->getGetterNameLoc()));
4585   ToProperty->setSetterName(Importer.Import(D->getSetterName()),
4586                             Importer.Import(D->getSetterNameLoc()));
4587   ToProperty->setGetterMethodDecl(
4588      cast_or_null<ObjCMethodDecl>(Importer.Import(D->getGetterMethodDecl())));
4589   ToProperty->setSetterMethodDecl(
4590      cast_or_null<ObjCMethodDecl>(Importer.Import(D->getSetterMethodDecl())));
4591   ToProperty->setPropertyIvarDecl(
4592        cast_or_null<ObjCIvarDecl>(Importer.Import(D->getPropertyIvarDecl())));
4593   return ToProperty;
4594 }
4595 
4596 Decl *ASTNodeImporter::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D) {
4597   ObjCPropertyDecl *Property = cast_or_null<ObjCPropertyDecl>(
4598                                         Importer.Import(D->getPropertyDecl()));
4599   if (!Property)
4600     return nullptr;
4601 
4602   DeclContext *DC = Importer.ImportContext(D->getDeclContext());
4603   if (!DC)
4604     return nullptr;
4605 
4606   // Import the lexical declaration context.
4607   DeclContext *LexicalDC = DC;
4608   if (D->getDeclContext() != D->getLexicalDeclContext()) {
4609     LexicalDC = Importer.ImportContext(D->getLexicalDeclContext());
4610     if (!LexicalDC)
4611       return nullptr;
4612   }
4613 
4614   ObjCImplDecl *InImpl = dyn_cast<ObjCImplDecl>(LexicalDC);
4615   if (!InImpl)
4616     return nullptr;
4617 
4618   // Import the ivar (for an @synthesize).
4619   ObjCIvarDecl *Ivar = nullptr;
4620   if (D->getPropertyIvarDecl()) {
4621     Ivar = cast_or_null<ObjCIvarDecl>(
4622                                     Importer.Import(D->getPropertyIvarDecl()));
4623     if (!Ivar)
4624       return nullptr;
4625   }
4626 
4627   ObjCPropertyImplDecl *ToImpl
4628     = InImpl->FindPropertyImplDecl(Property->getIdentifier(),
4629                                    Property->getQueryKind());
4630   if (!ToImpl) {
4631     ToImpl = ObjCPropertyImplDecl::Create(Importer.getToContext(), DC,
4632                                           Importer.Import(D->getLocStart()),
4633                                           Importer.Import(D->getLocation()),
4634                                           Property,
4635                                           D->getPropertyImplementation(),
4636                                           Ivar,
4637                                   Importer.Import(D->getPropertyIvarDeclLoc()));
4638     ToImpl->setLexicalDeclContext(LexicalDC);
4639     Importer.Imported(D, ToImpl);
4640     LexicalDC->addDeclInternal(ToImpl);
4641   } else {
4642     // Check that we have the same kind of property implementation (@synthesize
4643     // vs. @dynamic).
4644     if (D->getPropertyImplementation() != ToImpl->getPropertyImplementation()) {
4645       Importer.ToDiag(ToImpl->getLocation(),
4646                       diag::err_odr_objc_property_impl_kind_inconsistent)
4647         << Property->getDeclName()
4648         << (ToImpl->getPropertyImplementation()
4649                                               == ObjCPropertyImplDecl::Dynamic);
4650       Importer.FromDiag(D->getLocation(),
4651                         diag::note_odr_objc_property_impl_kind)
4652         << D->getPropertyDecl()->getDeclName()
4653         << (D->getPropertyImplementation() == ObjCPropertyImplDecl::Dynamic);
4654       return nullptr;
4655     }
4656 
4657     // For @synthesize, check that we have the same
4658     if (D->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize &&
4659         Ivar != ToImpl->getPropertyIvarDecl()) {
4660       Importer.ToDiag(ToImpl->getPropertyIvarDeclLoc(),
4661                       diag::err_odr_objc_synthesize_ivar_inconsistent)
4662         << Property->getDeclName()
4663         << ToImpl->getPropertyIvarDecl()->getDeclName()
4664         << Ivar->getDeclName();
4665       Importer.FromDiag(D->getPropertyIvarDeclLoc(),
4666                         diag::note_odr_objc_synthesize_ivar_here)
4667         << D->getPropertyIvarDecl()->getDeclName();
4668       return nullptr;
4669     }
4670 
4671     // Merge the existing implementation with the new implementation.
4672     Importer.Imported(D, ToImpl);
4673   }
4674 
4675   return ToImpl;
4676 }
4677 
4678 Decl *ASTNodeImporter::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) {
4679   // For template arguments, we adopt the translation unit as our declaration
4680   // context. This context will be fixed when the actual template declaration
4681   // is created.
4682 
4683   // FIXME: Import default argument.
4684   return TemplateTypeParmDecl::Create(Importer.getToContext(),
4685                               Importer.getToContext().getTranslationUnitDecl(),
4686                                       Importer.Import(D->getLocStart()),
4687                                       Importer.Import(D->getLocation()),
4688                                       D->getDepth(),
4689                                       D->getIndex(),
4690                                       Importer.Import(D->getIdentifier()),
4691                                       D->wasDeclaredWithTypename(),
4692                                       D->isParameterPack());
4693 }
4694 
4695 Decl *
4696 ASTNodeImporter::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) {
4697   // Import the name of this declaration.
4698   DeclarationName Name = Importer.Import(D->getDeclName());
4699   if (D->getDeclName() && !Name)
4700     return nullptr;
4701 
4702   // Import the location of this declaration.
4703   SourceLocation Loc = Importer.Import(D->getLocation());
4704 
4705   // Import the type of this declaration.
4706   QualType T = Importer.Import(D->getType());
4707   if (T.isNull())
4708     return nullptr;
4709 
4710   // Import type-source information.
4711   TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo());
4712   if (D->getTypeSourceInfo() && !TInfo)
4713     return nullptr;
4714 
4715   // FIXME: Import default argument.
4716 
4717   return NonTypeTemplateParmDecl::Create(Importer.getToContext(),
4718                                Importer.getToContext().getTranslationUnitDecl(),
4719                                          Importer.Import(D->getInnerLocStart()),
4720                                          Loc, D->getDepth(), D->getPosition(),
4721                                          Name.getAsIdentifierInfo(),
4722                                          T, D->isParameterPack(), TInfo);
4723 }
4724 
4725 Decl *
4726 ASTNodeImporter::VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) {
4727   // Import the name of this declaration.
4728   DeclarationName Name = Importer.Import(D->getDeclName());
4729   if (D->getDeclName() && !Name)
4730     return nullptr;
4731 
4732   // Import the location of this declaration.
4733   SourceLocation Loc = Importer.Import(D->getLocation());
4734 
4735   // Import template parameters.
4736   TemplateParameterList *TemplateParams
4737     = ImportTemplateParameterList(D->getTemplateParameters());
4738   if (!TemplateParams)
4739     return nullptr;
4740 
4741   // FIXME: Import default argument.
4742 
4743   return TemplateTemplateParmDecl::Create(Importer.getToContext(),
4744                               Importer.getToContext().getTranslationUnitDecl(),
4745                                           Loc, D->getDepth(), D->getPosition(),
4746                                           D->isParameterPack(),
4747                                           Name.getAsIdentifierInfo(),
4748                                           TemplateParams);
4749 }
4750 
4751 Decl *ASTNodeImporter::VisitClassTemplateDecl(ClassTemplateDecl *D) {
4752   // If this record has a definition in the translation unit we're coming from,
4753   // but this particular declaration is not that definition, import the
4754   // definition and map to that.
4755   CXXRecordDecl *Definition
4756     = cast_or_null<CXXRecordDecl>(D->getTemplatedDecl()->getDefinition());
4757   if (Definition && Definition != D->getTemplatedDecl()) {
4758     Decl *ImportedDef
4759       = Importer.Import(Definition->getDescribedClassTemplate());
4760     if (!ImportedDef)
4761       return nullptr;
4762 
4763     return Importer.Imported(D, ImportedDef);
4764   }
4765 
4766   // Import the major distinguishing characteristics of this class template.
4767   DeclContext *DC, *LexicalDC;
4768   DeclarationName Name;
4769   SourceLocation Loc;
4770   NamedDecl *ToD;
4771   if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
4772     return nullptr;
4773   if (ToD)
4774     return ToD;
4775 
4776   // We may already have a template of the same name; try to find and match it.
4777   if (!DC->isFunctionOrMethod()) {
4778     SmallVector<NamedDecl *, 4> ConflictingDecls;
4779     SmallVector<NamedDecl *, 2> FoundDecls;
4780     DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls);
4781     for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
4782       if (!FoundDecls[I]->isInIdentifierNamespace(Decl::IDNS_Ordinary))
4783         continue;
4784 
4785       Decl *Found = FoundDecls[I];
4786       if (ClassTemplateDecl *FoundTemplate
4787                                         = dyn_cast<ClassTemplateDecl>(Found)) {
4788         if (IsStructuralMatch(D, FoundTemplate)) {
4789           // The class templates structurally match; call it the same template.
4790           // FIXME: We may be filling in a forward declaration here. Handle
4791           // this case!
4792           Importer.Imported(D->getTemplatedDecl(),
4793                             FoundTemplate->getTemplatedDecl());
4794           return Importer.Imported(D, FoundTemplate);
4795         }
4796       }
4797 
4798       ConflictingDecls.push_back(FoundDecls[I]);
4799     }
4800 
4801     if (!ConflictingDecls.empty()) {
4802       Name = Importer.HandleNameConflict(Name, DC, Decl::IDNS_Ordinary,
4803                                          ConflictingDecls.data(),
4804                                          ConflictingDecls.size());
4805     }
4806 
4807     if (!Name)
4808       return nullptr;
4809   }
4810 
4811   CXXRecordDecl *DTemplated = D->getTemplatedDecl();
4812 
4813   // Create the declaration that is being templated.
4814   // Create the declaration that is being templated.
4815   CXXRecordDecl *D2Templated = cast_or_null<CXXRecordDecl>(
4816         Importer.Import(DTemplated));
4817   if (!D2Templated)
4818     return nullptr;
4819 
4820   // Resolve possible cyclic import.
4821   if (Decl *AlreadyImported = Importer.GetAlreadyImportedOrNull(D))
4822     return AlreadyImported;
4823 
4824   // Create the class template declaration itself.
4825   TemplateParameterList *TemplateParams
4826     = ImportTemplateParameterList(D->getTemplateParameters());
4827   if (!TemplateParams)
4828     return nullptr;
4829 
4830   ClassTemplateDecl *D2 = ClassTemplateDecl::Create(Importer.getToContext(), DC,
4831                                                     Loc, Name, TemplateParams,
4832                                                     D2Templated);
4833   D2Templated->setDescribedClassTemplate(D2);
4834 
4835   D2->setAccess(D->getAccess());
4836   D2->setLexicalDeclContext(LexicalDC);
4837   LexicalDC->addDeclInternal(D2);
4838 
4839   // Note the relationship between the class templates.
4840   Importer.Imported(D, D2);
4841   Importer.Imported(DTemplated, D2Templated);
4842 
4843   if (DTemplated->isCompleteDefinition() &&
4844       !D2Templated->isCompleteDefinition()) {
4845     // FIXME: Import definition!
4846   }
4847 
4848   return D2;
4849 }
4850 
4851 Decl *ASTNodeImporter::VisitClassTemplateSpecializationDecl(
4852                                           ClassTemplateSpecializationDecl *D) {
4853   // If this record has a definition in the translation unit we're coming from,
4854   // but this particular declaration is not that definition, import the
4855   // definition and map to that.
4856   TagDecl *Definition = D->getDefinition();
4857   if (Definition && Definition != D) {
4858     Decl *ImportedDef = Importer.Import(Definition);
4859     if (!ImportedDef)
4860       return nullptr;
4861 
4862     return Importer.Imported(D, ImportedDef);
4863   }
4864 
4865   ClassTemplateDecl *ClassTemplate
4866     = cast_or_null<ClassTemplateDecl>(Importer.Import(
4867                                                  D->getSpecializedTemplate()));
4868   if (!ClassTemplate)
4869     return nullptr;
4870 
4871   // Import the context of this declaration.
4872   DeclContext *DC = ClassTemplate->getDeclContext();
4873   if (!DC)
4874     return nullptr;
4875 
4876   DeclContext *LexicalDC = DC;
4877   if (D->getDeclContext() != D->getLexicalDeclContext()) {
4878     LexicalDC = Importer.ImportContext(D->getLexicalDeclContext());
4879     if (!LexicalDC)
4880       return nullptr;
4881   }
4882 
4883   // Import the location of this declaration.
4884   SourceLocation StartLoc = Importer.Import(D->getLocStart());
4885   SourceLocation IdLoc = Importer.Import(D->getLocation());
4886 
4887   // Import template arguments.
4888   SmallVector<TemplateArgument, 2> TemplateArgs;
4889   if (ImportTemplateArguments(D->getTemplateArgs().data(),
4890                               D->getTemplateArgs().size(),
4891                               TemplateArgs))
4892     return nullptr;
4893 
4894   // Try to find an existing specialization with these template arguments.
4895   void *InsertPos = nullptr;
4896   ClassTemplateSpecializationDecl *D2
4897     = ClassTemplate->findSpecialization(TemplateArgs, InsertPos);
4898   if (D2) {
4899     // We already have a class template specialization with these template
4900     // arguments.
4901 
4902     // FIXME: Check for specialization vs. instantiation errors.
4903 
4904     if (RecordDecl *FoundDef = D2->getDefinition()) {
4905       if (!D->isCompleteDefinition() || IsStructuralMatch(D, FoundDef)) {
4906         // The record types structurally match, or the "from" translation
4907         // unit only had a forward declaration anyway; call it the same
4908         // function.
4909         return Importer.Imported(D, FoundDef);
4910       }
4911     }
4912   } else {
4913     // Create a new specialization.
4914     if (ClassTemplatePartialSpecializationDecl *PartialSpec =
4915         dyn_cast<ClassTemplatePartialSpecializationDecl>(D)) {
4916 
4917       // Import TemplateArgumentListInfo
4918       TemplateArgumentListInfo ToTAInfo;
4919       auto &ASTTemplateArgs = *PartialSpec->getTemplateArgsAsWritten();
4920       for (unsigned I = 0, E = ASTTemplateArgs.NumTemplateArgs; I < E; ++I) {
4921         bool Error = false;
4922         auto ToLoc = ImportTemplateArgumentLoc(ASTTemplateArgs[I], Error);
4923         if (Error)
4924           return nullptr;
4925         ToTAInfo.addArgument(ToLoc);
4926       }
4927 
4928       QualType CanonInjType = Importer.Import(
4929             PartialSpec->getInjectedSpecializationType());
4930       if (CanonInjType.isNull())
4931         return nullptr;
4932       CanonInjType = CanonInjType.getCanonicalType();
4933 
4934       TemplateParameterList *ToTPList = ImportTemplateParameterList(
4935             PartialSpec->getTemplateParameters());
4936       if (!ToTPList && PartialSpec->getTemplateParameters())
4937         return nullptr;
4938 
4939       D2 = ClassTemplatePartialSpecializationDecl::Create(
4940             Importer.getToContext(), D->getTagKind(), DC, StartLoc, IdLoc,
4941             ToTPList, ClassTemplate,
4942             llvm::makeArrayRef(TemplateArgs.data(), TemplateArgs.size()),
4943             ToTAInfo, CanonInjType, nullptr);
4944 
4945     } else {
4946       D2 = ClassTemplateSpecializationDecl::Create(Importer.getToContext(),
4947                                                    D->getTagKind(), DC,
4948                                                    StartLoc, IdLoc,
4949                                                    ClassTemplate,
4950                                                    TemplateArgs,
4951                                                    /*PrevDecl=*/nullptr);
4952     }
4953 
4954     D2->setSpecializationKind(D->getSpecializationKind());
4955 
4956     // Add this specialization to the class template.
4957     ClassTemplate->AddSpecialization(D2, InsertPos);
4958 
4959     // Import the qualifier, if any.
4960     D2->setQualifierInfo(Importer.Import(D->getQualifierLoc()));
4961 
4962     Importer.Imported(D, D2);
4963 
4964     if (auto *TSI = D->getTypeAsWritten()) {
4965       TypeSourceInfo *TInfo = Importer.Import(TSI);
4966       if (!TInfo)
4967         return nullptr;
4968       D2->setTypeAsWritten(TInfo);
4969       D2->setTemplateKeywordLoc(Importer.Import(D->getTemplateKeywordLoc()));
4970       D2->setExternLoc(Importer.Import(D->getExternLoc()));
4971     }
4972 
4973     SourceLocation POI = Importer.Import(D->getPointOfInstantiation());
4974     if (POI.isValid())
4975       D2->setPointOfInstantiation(POI);
4976     else if (D->getPointOfInstantiation().isValid())
4977       return nullptr;
4978 
4979     D2->setTemplateSpecializationKind(D->getTemplateSpecializationKind());
4980 
4981     // Add the specialization to this context.
4982     D2->setLexicalDeclContext(LexicalDC);
4983     LexicalDC->addDeclInternal(D2);
4984   }
4985   Importer.Imported(D, D2);
4986   if (D->isCompleteDefinition() && ImportDefinition(D, D2))
4987     return nullptr;
4988 
4989   return D2;
4990 }
4991 
4992 Decl *ASTNodeImporter::VisitVarTemplateDecl(VarTemplateDecl *D) {
4993   // If this variable has a definition in the translation unit we're coming
4994   // from,
4995   // but this particular declaration is not that definition, import the
4996   // definition and map to that.
4997   VarDecl *Definition =
4998       cast_or_null<VarDecl>(D->getTemplatedDecl()->getDefinition());
4999   if (Definition && Definition != D->getTemplatedDecl()) {
5000     Decl *ImportedDef = Importer.Import(Definition->getDescribedVarTemplate());
5001     if (!ImportedDef)
5002       return nullptr;
5003 
5004     return Importer.Imported(D, ImportedDef);
5005   }
5006 
5007   // Import the major distinguishing characteristics of this variable template.
5008   DeclContext *DC, *LexicalDC;
5009   DeclarationName Name;
5010   SourceLocation Loc;
5011   NamedDecl *ToD;
5012   if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
5013     return nullptr;
5014   if (ToD)
5015     return ToD;
5016 
5017   // We may already have a template of the same name; try to find and match it.
5018   assert(!DC->isFunctionOrMethod() &&
5019          "Variable templates cannot be declared at function scope");
5020   SmallVector<NamedDecl *, 4> ConflictingDecls;
5021   SmallVector<NamedDecl *, 2> FoundDecls;
5022   DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls);
5023   for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
5024     if (!FoundDecls[I]->isInIdentifierNamespace(Decl::IDNS_Ordinary))
5025       continue;
5026 
5027     Decl *Found = FoundDecls[I];
5028     if (VarTemplateDecl *FoundTemplate = dyn_cast<VarTemplateDecl>(Found)) {
5029       if (IsStructuralMatch(D, FoundTemplate)) {
5030         // The variable templates structurally match; call it the same template.
5031         Importer.Imported(D->getTemplatedDecl(),
5032                           FoundTemplate->getTemplatedDecl());
5033         return Importer.Imported(D, FoundTemplate);
5034       }
5035     }
5036 
5037     ConflictingDecls.push_back(FoundDecls[I]);
5038   }
5039 
5040   if (!ConflictingDecls.empty()) {
5041     Name = Importer.HandleNameConflict(Name, DC, Decl::IDNS_Ordinary,
5042                                        ConflictingDecls.data(),
5043                                        ConflictingDecls.size());
5044   }
5045 
5046   if (!Name)
5047     return nullptr;
5048 
5049   VarDecl *DTemplated = D->getTemplatedDecl();
5050 
5051   // Import the type.
5052   QualType T = Importer.Import(DTemplated->getType());
5053   if (T.isNull())
5054     return nullptr;
5055 
5056   // Create the declaration that is being templated.
5057   SourceLocation StartLoc = Importer.Import(DTemplated->getLocStart());
5058   SourceLocation IdLoc = Importer.Import(DTemplated->getLocation());
5059   TypeSourceInfo *TInfo = Importer.Import(DTemplated->getTypeSourceInfo());
5060   VarDecl *D2Templated = VarDecl::Create(Importer.getToContext(), DC, StartLoc,
5061                                          IdLoc, Name.getAsIdentifierInfo(), T,
5062                                          TInfo, DTemplated->getStorageClass());
5063   D2Templated->setAccess(DTemplated->getAccess());
5064   D2Templated->setQualifierInfo(Importer.Import(DTemplated->getQualifierLoc()));
5065   D2Templated->setLexicalDeclContext(LexicalDC);
5066 
5067   // Importer.Imported(DTemplated, D2Templated);
5068   // LexicalDC->addDeclInternal(D2Templated);
5069 
5070   // Merge the initializer.
5071   if (ImportDefinition(DTemplated, D2Templated))
5072     return nullptr;
5073 
5074   // Create the variable template declaration itself.
5075   TemplateParameterList *TemplateParams =
5076       ImportTemplateParameterList(D->getTemplateParameters());
5077   if (!TemplateParams)
5078     return nullptr;
5079 
5080   VarTemplateDecl *D2 = VarTemplateDecl::Create(
5081       Importer.getToContext(), DC, Loc, Name, TemplateParams, D2Templated);
5082   D2Templated->setDescribedVarTemplate(D2);
5083 
5084   D2->setAccess(D->getAccess());
5085   D2->setLexicalDeclContext(LexicalDC);
5086   LexicalDC->addDeclInternal(D2);
5087 
5088   // Note the relationship between the variable templates.
5089   Importer.Imported(D, D2);
5090   Importer.Imported(DTemplated, D2Templated);
5091 
5092   if (DTemplated->isThisDeclarationADefinition() &&
5093       !D2Templated->isThisDeclarationADefinition()) {
5094     // FIXME: Import definition!
5095   }
5096 
5097   return D2;
5098 }
5099 
5100 Decl *ASTNodeImporter::VisitVarTemplateSpecializationDecl(
5101     VarTemplateSpecializationDecl *D) {
5102   // If this record has a definition in the translation unit we're coming from,
5103   // but this particular declaration is not that definition, import the
5104   // definition and map to that.
5105   VarDecl *Definition = D->getDefinition();
5106   if (Definition && Definition != D) {
5107     Decl *ImportedDef = Importer.Import(Definition);
5108     if (!ImportedDef)
5109       return nullptr;
5110 
5111     return Importer.Imported(D, ImportedDef);
5112   }
5113 
5114   VarTemplateDecl *VarTemplate = cast_or_null<VarTemplateDecl>(
5115       Importer.Import(D->getSpecializedTemplate()));
5116   if (!VarTemplate)
5117     return nullptr;
5118 
5119   // Import the context of this declaration.
5120   DeclContext *DC = VarTemplate->getDeclContext();
5121   if (!DC)
5122     return nullptr;
5123 
5124   DeclContext *LexicalDC = DC;
5125   if (D->getDeclContext() != D->getLexicalDeclContext()) {
5126     LexicalDC = Importer.ImportContext(D->getLexicalDeclContext());
5127     if (!LexicalDC)
5128       return nullptr;
5129   }
5130 
5131   // Import the location of this declaration.
5132   SourceLocation StartLoc = Importer.Import(D->getLocStart());
5133   SourceLocation IdLoc = Importer.Import(D->getLocation());
5134 
5135   // Import template arguments.
5136   SmallVector<TemplateArgument, 2> TemplateArgs;
5137   if (ImportTemplateArguments(D->getTemplateArgs().data(),
5138                               D->getTemplateArgs().size(), TemplateArgs))
5139     return nullptr;
5140 
5141   // Try to find an existing specialization with these template arguments.
5142   void *InsertPos = nullptr;
5143   VarTemplateSpecializationDecl *D2 = VarTemplate->findSpecialization(
5144       TemplateArgs, InsertPos);
5145   if (D2) {
5146     // We already have a variable template specialization with these template
5147     // arguments.
5148 
5149     // FIXME: Check for specialization vs. instantiation errors.
5150 
5151     if (VarDecl *FoundDef = D2->getDefinition()) {
5152       if (!D->isThisDeclarationADefinition() ||
5153           IsStructuralMatch(D, FoundDef)) {
5154         // The record types structurally match, or the "from" translation
5155         // unit only had a forward declaration anyway; call it the same
5156         // variable.
5157         return Importer.Imported(D, FoundDef);
5158       }
5159     }
5160   } else {
5161 
5162     // Import the type.
5163     QualType T = Importer.Import(D->getType());
5164     if (T.isNull())
5165       return nullptr;
5166     TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo());
5167 
5168     // Create a new specialization.
5169     D2 = VarTemplateSpecializationDecl::Create(
5170         Importer.getToContext(), DC, StartLoc, IdLoc, VarTemplate, T, TInfo,
5171         D->getStorageClass(), TemplateArgs);
5172     D2->setSpecializationKind(D->getSpecializationKind());
5173     D2->setTemplateArgsInfo(D->getTemplateArgsInfo());
5174 
5175     // Add this specialization to the class template.
5176     VarTemplate->AddSpecialization(D2, InsertPos);
5177 
5178     // Import the qualifier, if any.
5179     D2->setQualifierInfo(Importer.Import(D->getQualifierLoc()));
5180 
5181     // Add the specialization to this context.
5182     D2->setLexicalDeclContext(LexicalDC);
5183     LexicalDC->addDeclInternal(D2);
5184   }
5185   Importer.Imported(D, D2);
5186 
5187   if (D->isThisDeclarationADefinition() && ImportDefinition(D, D2))
5188     return nullptr;
5189 
5190   return D2;
5191 }
5192 
5193 //----------------------------------------------------------------------------
5194 // Import Statements
5195 //----------------------------------------------------------------------------
5196 
5197 DeclGroupRef ASTNodeImporter::ImportDeclGroup(DeclGroupRef DG) {
5198   if (DG.isNull())
5199     return DeclGroupRef::Create(Importer.getToContext(), nullptr, 0);
5200   size_t NumDecls = DG.end() - DG.begin();
5201   SmallVector<Decl *, 1> ToDecls(NumDecls);
5202   auto &_Importer = this->Importer;
5203   std::transform(DG.begin(), DG.end(), ToDecls.begin(),
5204     [&_Importer](Decl *D) -> Decl * {
5205       return _Importer.Import(D);
5206     });
5207   return DeclGroupRef::Create(Importer.getToContext(),
5208                               ToDecls.begin(),
5209                               NumDecls);
5210 }
5211 
5212  Stmt *ASTNodeImporter::VisitStmt(Stmt *S) {
5213    Importer.FromDiag(S->getLocStart(), diag::err_unsupported_ast_node)
5214      << S->getStmtClassName();
5215    return nullptr;
5216  }
5217 
5218 
5219 Stmt *ASTNodeImporter::VisitGCCAsmStmt(GCCAsmStmt *S) {
5220   SmallVector<IdentifierInfo *, 4> Names;
5221   for (unsigned I = 0, E = S->getNumOutputs(); I != E; I++) {
5222     IdentifierInfo *ToII = Importer.Import(S->getOutputIdentifier(I));
5223     // ToII is nullptr when no symbolic name is given for output operand
5224     // see ParseStmtAsm::ParseAsmOperandsOpt
5225     if (!ToII && S->getOutputIdentifier(I))
5226       return nullptr;
5227     Names.push_back(ToII);
5228   }
5229   for (unsigned I = 0, E = S->getNumInputs(); I != E; I++) {
5230     IdentifierInfo *ToII = Importer.Import(S->getInputIdentifier(I));
5231     // ToII is nullptr when no symbolic name is given for input operand
5232     // see ParseStmtAsm::ParseAsmOperandsOpt
5233     if (!ToII && S->getInputIdentifier(I))
5234       return nullptr;
5235     Names.push_back(ToII);
5236   }
5237 
5238   SmallVector<StringLiteral *, 4> Clobbers;
5239   for (unsigned I = 0, E = S->getNumClobbers(); I != E; I++) {
5240     StringLiteral *Clobber = cast_or_null<StringLiteral>(
5241           Importer.Import(S->getClobberStringLiteral(I)));
5242     if (!Clobber)
5243       return nullptr;
5244     Clobbers.push_back(Clobber);
5245   }
5246 
5247   SmallVector<StringLiteral *, 4> Constraints;
5248   for (unsigned I = 0, E = S->getNumOutputs(); I != E; I++) {
5249     StringLiteral *Output = cast_or_null<StringLiteral>(
5250           Importer.Import(S->getOutputConstraintLiteral(I)));
5251     if (!Output)
5252       return nullptr;
5253     Constraints.push_back(Output);
5254   }
5255 
5256   for (unsigned I = 0, E = S->getNumInputs(); I != E; I++) {
5257     StringLiteral *Input = cast_or_null<StringLiteral>(
5258           Importer.Import(S->getInputConstraintLiteral(I)));
5259     if (!Input)
5260       return nullptr;
5261     Constraints.push_back(Input);
5262   }
5263 
5264   SmallVector<Expr *, 4> Exprs(S->getNumOutputs() + S->getNumInputs());
5265   if (ImportContainerChecked(S->outputs(), Exprs))
5266     return nullptr;
5267 
5268   if (ImportArrayChecked(S->inputs(), Exprs.begin() + S->getNumOutputs()))
5269     return nullptr;
5270 
5271   StringLiteral *AsmStr = cast_or_null<StringLiteral>(
5272         Importer.Import(S->getAsmString()));
5273   if (!AsmStr)
5274     return nullptr;
5275 
5276   return new (Importer.getToContext()) GCCAsmStmt(
5277         Importer.getToContext(),
5278         Importer.Import(S->getAsmLoc()),
5279         S->isSimple(),
5280         S->isVolatile(),
5281         S->getNumOutputs(),
5282         S->getNumInputs(),
5283         Names.data(),
5284         Constraints.data(),
5285         Exprs.data(),
5286         AsmStr,
5287         S->getNumClobbers(),
5288         Clobbers.data(),
5289         Importer.Import(S->getRParenLoc()));
5290 }
5291 
5292 Stmt *ASTNodeImporter::VisitDeclStmt(DeclStmt *S) {
5293   DeclGroupRef ToDG = ImportDeclGroup(S->getDeclGroup());
5294   for (Decl *ToD : ToDG) {
5295     if (!ToD)
5296       return nullptr;
5297   }
5298   SourceLocation ToStartLoc = Importer.Import(S->getStartLoc());
5299   SourceLocation ToEndLoc = Importer.Import(S->getEndLoc());
5300   return new (Importer.getToContext()) DeclStmt(ToDG, ToStartLoc, ToEndLoc);
5301 }
5302 
5303 Stmt *ASTNodeImporter::VisitNullStmt(NullStmt *S) {
5304   SourceLocation ToSemiLoc = Importer.Import(S->getSemiLoc());
5305   return new (Importer.getToContext()) NullStmt(ToSemiLoc,
5306                                                 S->hasLeadingEmptyMacro());
5307 }
5308 
5309 Stmt *ASTNodeImporter::VisitCompoundStmt(CompoundStmt *S) {
5310   llvm::SmallVector<Stmt *, 8> ToStmts(S->size());
5311 
5312   if (ImportContainerChecked(S->body(), ToStmts))
5313     return nullptr;
5314 
5315   SourceLocation ToLBraceLoc = Importer.Import(S->getLBracLoc());
5316   SourceLocation ToRBraceLoc = Importer.Import(S->getRBracLoc());
5317   return new (Importer.getToContext()) CompoundStmt(Importer.getToContext(),
5318                                                     ToStmts,
5319                                                     ToLBraceLoc, ToRBraceLoc);
5320 }
5321 
5322 Stmt *ASTNodeImporter::VisitCaseStmt(CaseStmt *S) {
5323   Expr *ToLHS = Importer.Import(S->getLHS());
5324   if (!ToLHS)
5325     return nullptr;
5326   Expr *ToRHS = Importer.Import(S->getRHS());
5327   if (!ToRHS && S->getRHS())
5328     return nullptr;
5329   SourceLocation ToCaseLoc = Importer.Import(S->getCaseLoc());
5330   SourceLocation ToEllipsisLoc = Importer.Import(S->getEllipsisLoc());
5331   SourceLocation ToColonLoc = Importer.Import(S->getColonLoc());
5332   return new (Importer.getToContext()) CaseStmt(ToLHS, ToRHS,
5333                                                 ToCaseLoc, ToEllipsisLoc,
5334                                                 ToColonLoc);
5335 }
5336 
5337 Stmt *ASTNodeImporter::VisitDefaultStmt(DefaultStmt *S) {
5338   SourceLocation ToDefaultLoc = Importer.Import(S->getDefaultLoc());
5339   SourceLocation ToColonLoc = Importer.Import(S->getColonLoc());
5340   Stmt *ToSubStmt = Importer.Import(S->getSubStmt());
5341   if (!ToSubStmt && S->getSubStmt())
5342     return nullptr;
5343   return new (Importer.getToContext()) DefaultStmt(ToDefaultLoc, ToColonLoc,
5344                                                    ToSubStmt);
5345 }
5346 
5347 Stmt *ASTNodeImporter::VisitLabelStmt(LabelStmt *S) {
5348   SourceLocation ToIdentLoc = Importer.Import(S->getIdentLoc());
5349   LabelDecl *ToLabelDecl =
5350     cast_or_null<LabelDecl>(Importer.Import(S->getDecl()));
5351   if (!ToLabelDecl && S->getDecl())
5352     return nullptr;
5353   Stmt *ToSubStmt = Importer.Import(S->getSubStmt());
5354   if (!ToSubStmt && S->getSubStmt())
5355     return nullptr;
5356   return new (Importer.getToContext()) LabelStmt(ToIdentLoc, ToLabelDecl,
5357                                                  ToSubStmt);
5358 }
5359 
5360 Stmt *ASTNodeImporter::VisitAttributedStmt(AttributedStmt *S) {
5361   SourceLocation ToAttrLoc = Importer.Import(S->getAttrLoc());
5362   ArrayRef<const Attr*> FromAttrs(S->getAttrs());
5363   SmallVector<const Attr *, 1> ToAttrs(FromAttrs.size());
5364   ASTContext &_ToContext = Importer.getToContext();
5365   std::transform(FromAttrs.begin(), FromAttrs.end(), ToAttrs.begin(),
5366     [&_ToContext](const Attr *A) -> const Attr * {
5367       return A->clone(_ToContext);
5368     });
5369   for (const Attr *ToA : ToAttrs) {
5370     if (!ToA)
5371       return nullptr;
5372   }
5373   Stmt *ToSubStmt = Importer.Import(S->getSubStmt());
5374   if (!ToSubStmt && S->getSubStmt())
5375     return nullptr;
5376   return AttributedStmt::Create(Importer.getToContext(), ToAttrLoc,
5377                                 ToAttrs, ToSubStmt);
5378 }
5379 
5380 Stmt *ASTNodeImporter::VisitIfStmt(IfStmt *S) {
5381   SourceLocation ToIfLoc = Importer.Import(S->getIfLoc());
5382   Stmt *ToInit = Importer.Import(S->getInit());
5383   if (!ToInit && S->getInit())
5384     return nullptr;
5385   VarDecl *ToConditionVariable = nullptr;
5386   if (VarDecl *FromConditionVariable = S->getConditionVariable()) {
5387     ToConditionVariable =
5388       dyn_cast_or_null<VarDecl>(Importer.Import(FromConditionVariable));
5389     if (!ToConditionVariable)
5390       return nullptr;
5391   }
5392   Expr *ToCondition = Importer.Import(S->getCond());
5393   if (!ToCondition && S->getCond())
5394     return nullptr;
5395   Stmt *ToThenStmt = Importer.Import(S->getThen());
5396   if (!ToThenStmt && S->getThen())
5397     return nullptr;
5398   SourceLocation ToElseLoc = Importer.Import(S->getElseLoc());
5399   Stmt *ToElseStmt = Importer.Import(S->getElse());
5400   if (!ToElseStmt && S->getElse())
5401     return nullptr;
5402   return new (Importer.getToContext()) IfStmt(Importer.getToContext(),
5403                                               ToIfLoc, S->isConstexpr(),
5404                                               ToInit,
5405                                               ToConditionVariable,
5406                                               ToCondition, ToThenStmt,
5407                                               ToElseLoc, ToElseStmt);
5408 }
5409 
5410 Stmt *ASTNodeImporter::VisitSwitchStmt(SwitchStmt *S) {
5411   Stmt *ToInit = Importer.Import(S->getInit());
5412   if (!ToInit && S->getInit())
5413     return nullptr;
5414   VarDecl *ToConditionVariable = nullptr;
5415   if (VarDecl *FromConditionVariable = S->getConditionVariable()) {
5416     ToConditionVariable =
5417       dyn_cast_or_null<VarDecl>(Importer.Import(FromConditionVariable));
5418     if (!ToConditionVariable)
5419       return nullptr;
5420   }
5421   Expr *ToCondition = Importer.Import(S->getCond());
5422   if (!ToCondition && S->getCond())
5423     return nullptr;
5424   SwitchStmt *ToStmt = new (Importer.getToContext()) SwitchStmt(
5425                          Importer.getToContext(), ToInit,
5426                          ToConditionVariable, ToCondition);
5427   Stmt *ToBody = Importer.Import(S->getBody());
5428   if (!ToBody && S->getBody())
5429     return nullptr;
5430   ToStmt->setBody(ToBody);
5431   ToStmt->setSwitchLoc(Importer.Import(S->getSwitchLoc()));
5432   // Now we have to re-chain the cases.
5433   SwitchCase *LastChainedSwitchCase = nullptr;
5434   for (SwitchCase *SC = S->getSwitchCaseList(); SC != nullptr;
5435        SC = SC->getNextSwitchCase()) {
5436     SwitchCase *ToSC = dyn_cast_or_null<SwitchCase>(Importer.Import(SC));
5437     if (!ToSC)
5438       return nullptr;
5439     if (LastChainedSwitchCase)
5440       LastChainedSwitchCase->setNextSwitchCase(ToSC);
5441     else
5442       ToStmt->setSwitchCaseList(ToSC);
5443     LastChainedSwitchCase = ToSC;
5444   }
5445   return ToStmt;
5446 }
5447 
5448 Stmt *ASTNodeImporter::VisitWhileStmt(WhileStmt *S) {
5449   VarDecl *ToConditionVariable = nullptr;
5450   if (VarDecl *FromConditionVariable = S->getConditionVariable()) {
5451     ToConditionVariable =
5452       dyn_cast_or_null<VarDecl>(Importer.Import(FromConditionVariable));
5453     if (!ToConditionVariable)
5454       return nullptr;
5455   }
5456   Expr *ToCondition = Importer.Import(S->getCond());
5457   if (!ToCondition && S->getCond())
5458     return nullptr;
5459   Stmt *ToBody = Importer.Import(S->getBody());
5460   if (!ToBody && S->getBody())
5461     return nullptr;
5462   SourceLocation ToWhileLoc = Importer.Import(S->getWhileLoc());
5463   return new (Importer.getToContext()) WhileStmt(Importer.getToContext(),
5464                                                  ToConditionVariable,
5465                                                  ToCondition, ToBody,
5466                                                  ToWhileLoc);
5467 }
5468 
5469 Stmt *ASTNodeImporter::VisitDoStmt(DoStmt *S) {
5470   Stmt *ToBody = Importer.Import(S->getBody());
5471   if (!ToBody && S->getBody())
5472     return nullptr;
5473   Expr *ToCondition = Importer.Import(S->getCond());
5474   if (!ToCondition && S->getCond())
5475     return nullptr;
5476   SourceLocation ToDoLoc = Importer.Import(S->getDoLoc());
5477   SourceLocation ToWhileLoc = Importer.Import(S->getWhileLoc());
5478   SourceLocation ToRParenLoc = Importer.Import(S->getRParenLoc());
5479   return new (Importer.getToContext()) DoStmt(ToBody, ToCondition,
5480                                               ToDoLoc, ToWhileLoc,
5481                                               ToRParenLoc);
5482 }
5483 
5484 Stmt *ASTNodeImporter::VisitForStmt(ForStmt *S) {
5485   Stmt *ToInit = Importer.Import(S->getInit());
5486   if (!ToInit && S->getInit())
5487     return nullptr;
5488   Expr *ToCondition = Importer.Import(S->getCond());
5489   if (!ToCondition && S->getCond())
5490     return nullptr;
5491   VarDecl *ToConditionVariable = nullptr;
5492   if (VarDecl *FromConditionVariable = S->getConditionVariable()) {
5493     ToConditionVariable =
5494       dyn_cast_or_null<VarDecl>(Importer.Import(FromConditionVariable));
5495     if (!ToConditionVariable)
5496       return nullptr;
5497   }
5498   Expr *ToInc = Importer.Import(S->getInc());
5499   if (!ToInc && S->getInc())
5500     return nullptr;
5501   Stmt *ToBody = Importer.Import(S->getBody());
5502   if (!ToBody && S->getBody())
5503     return nullptr;
5504   SourceLocation ToForLoc = Importer.Import(S->getForLoc());
5505   SourceLocation ToLParenLoc = Importer.Import(S->getLParenLoc());
5506   SourceLocation ToRParenLoc = Importer.Import(S->getRParenLoc());
5507   return new (Importer.getToContext()) ForStmt(Importer.getToContext(),
5508                                                ToInit, ToCondition,
5509                                                ToConditionVariable,
5510                                                ToInc, ToBody,
5511                                                ToForLoc, ToLParenLoc,
5512                                                ToRParenLoc);
5513 }
5514 
5515 Stmt *ASTNodeImporter::VisitGotoStmt(GotoStmt *S) {
5516   LabelDecl *ToLabel = nullptr;
5517   if (LabelDecl *FromLabel = S->getLabel()) {
5518     ToLabel = dyn_cast_or_null<LabelDecl>(Importer.Import(FromLabel));
5519     if (!ToLabel)
5520       return nullptr;
5521   }
5522   SourceLocation ToGotoLoc = Importer.Import(S->getGotoLoc());
5523   SourceLocation ToLabelLoc = Importer.Import(S->getLabelLoc());
5524   return new (Importer.getToContext()) GotoStmt(ToLabel,
5525                                                 ToGotoLoc, ToLabelLoc);
5526 }
5527 
5528 Stmt *ASTNodeImporter::VisitIndirectGotoStmt(IndirectGotoStmt *S) {
5529   SourceLocation ToGotoLoc = Importer.Import(S->getGotoLoc());
5530   SourceLocation ToStarLoc = Importer.Import(S->getStarLoc());
5531   Expr *ToTarget = Importer.Import(S->getTarget());
5532   if (!ToTarget && S->getTarget())
5533     return nullptr;
5534   return new (Importer.getToContext()) IndirectGotoStmt(ToGotoLoc, ToStarLoc,
5535                                                         ToTarget);
5536 }
5537 
5538 Stmt *ASTNodeImporter::VisitContinueStmt(ContinueStmt *S) {
5539   SourceLocation ToContinueLoc = Importer.Import(S->getContinueLoc());
5540   return new (Importer.getToContext()) ContinueStmt(ToContinueLoc);
5541 }
5542 
5543 Stmt *ASTNodeImporter::VisitBreakStmt(BreakStmt *S) {
5544   SourceLocation ToBreakLoc = Importer.Import(S->getBreakLoc());
5545   return new (Importer.getToContext()) BreakStmt(ToBreakLoc);
5546 }
5547 
5548 Stmt *ASTNodeImporter::VisitReturnStmt(ReturnStmt *S) {
5549   SourceLocation ToRetLoc = Importer.Import(S->getReturnLoc());
5550   Expr *ToRetExpr = Importer.Import(S->getRetValue());
5551   if (!ToRetExpr && S->getRetValue())
5552     return nullptr;
5553   VarDecl *NRVOCandidate = const_cast<VarDecl*>(S->getNRVOCandidate());
5554   VarDecl *ToNRVOCandidate = cast_or_null<VarDecl>(Importer.Import(NRVOCandidate));
5555   if (!ToNRVOCandidate && NRVOCandidate)
5556     return nullptr;
5557   return new (Importer.getToContext()) ReturnStmt(ToRetLoc, ToRetExpr,
5558                                                   ToNRVOCandidate);
5559 }
5560 
5561 Stmt *ASTNodeImporter::VisitCXXCatchStmt(CXXCatchStmt *S) {
5562   SourceLocation ToCatchLoc = Importer.Import(S->getCatchLoc());
5563   VarDecl *ToExceptionDecl = nullptr;
5564   if (VarDecl *FromExceptionDecl = S->getExceptionDecl()) {
5565     ToExceptionDecl =
5566       dyn_cast_or_null<VarDecl>(Importer.Import(FromExceptionDecl));
5567     if (!ToExceptionDecl)
5568       return nullptr;
5569   }
5570   Stmt *ToHandlerBlock = Importer.Import(S->getHandlerBlock());
5571   if (!ToHandlerBlock && S->getHandlerBlock())
5572     return nullptr;
5573   return new (Importer.getToContext()) CXXCatchStmt(ToCatchLoc,
5574                                                     ToExceptionDecl,
5575                                                     ToHandlerBlock);
5576 }
5577 
5578 Stmt *ASTNodeImporter::VisitCXXTryStmt(CXXTryStmt *S) {
5579   SourceLocation ToTryLoc = Importer.Import(S->getTryLoc());
5580   Stmt *ToTryBlock = Importer.Import(S->getTryBlock());
5581   if (!ToTryBlock && S->getTryBlock())
5582     return nullptr;
5583   SmallVector<Stmt *, 1> ToHandlers(S->getNumHandlers());
5584   for (unsigned HI = 0, HE = S->getNumHandlers(); HI != HE; ++HI) {
5585     CXXCatchStmt *FromHandler = S->getHandler(HI);
5586     if (Stmt *ToHandler = Importer.Import(FromHandler))
5587       ToHandlers[HI] = ToHandler;
5588     else
5589       return nullptr;
5590   }
5591   return CXXTryStmt::Create(Importer.getToContext(), ToTryLoc, ToTryBlock,
5592                             ToHandlers);
5593 }
5594 
5595 Stmt *ASTNodeImporter::VisitCXXForRangeStmt(CXXForRangeStmt *S) {
5596   DeclStmt *ToRange =
5597     dyn_cast_or_null<DeclStmt>(Importer.Import(S->getRangeStmt()));
5598   if (!ToRange && S->getRangeStmt())
5599     return nullptr;
5600   DeclStmt *ToBegin =
5601     dyn_cast_or_null<DeclStmt>(Importer.Import(S->getBeginStmt()));
5602   if (!ToBegin && S->getBeginStmt())
5603     return nullptr;
5604   DeclStmt *ToEnd =
5605     dyn_cast_or_null<DeclStmt>(Importer.Import(S->getEndStmt()));
5606   if (!ToEnd && S->getEndStmt())
5607     return nullptr;
5608   Expr *ToCond = Importer.Import(S->getCond());
5609   if (!ToCond && S->getCond())
5610     return nullptr;
5611   Expr *ToInc = Importer.Import(S->getInc());
5612   if (!ToInc && S->getInc())
5613     return nullptr;
5614   DeclStmt *ToLoopVar =
5615     dyn_cast_or_null<DeclStmt>(Importer.Import(S->getLoopVarStmt()));
5616   if (!ToLoopVar && S->getLoopVarStmt())
5617     return nullptr;
5618   Stmt *ToBody = Importer.Import(S->getBody());
5619   if (!ToBody && S->getBody())
5620     return nullptr;
5621   SourceLocation ToForLoc = Importer.Import(S->getForLoc());
5622   SourceLocation ToCoawaitLoc = Importer.Import(S->getCoawaitLoc());
5623   SourceLocation ToColonLoc = Importer.Import(S->getColonLoc());
5624   SourceLocation ToRParenLoc = Importer.Import(S->getRParenLoc());
5625   return new (Importer.getToContext()) CXXForRangeStmt(ToRange, ToBegin, ToEnd,
5626                                                        ToCond, ToInc,
5627                                                        ToLoopVar, ToBody,
5628                                                        ToForLoc, ToCoawaitLoc,
5629                                                        ToColonLoc, ToRParenLoc);
5630 }
5631 
5632 Stmt *ASTNodeImporter::VisitObjCForCollectionStmt(ObjCForCollectionStmt *S) {
5633   Stmt *ToElem = Importer.Import(S->getElement());
5634   if (!ToElem && S->getElement())
5635     return nullptr;
5636   Expr *ToCollect = Importer.Import(S->getCollection());
5637   if (!ToCollect && S->getCollection())
5638     return nullptr;
5639   Stmt *ToBody = Importer.Import(S->getBody());
5640   if (!ToBody && S->getBody())
5641     return nullptr;
5642   SourceLocation ToForLoc = Importer.Import(S->getForLoc());
5643   SourceLocation ToRParenLoc = Importer.Import(S->getRParenLoc());
5644   return new (Importer.getToContext()) ObjCForCollectionStmt(ToElem,
5645                                                              ToCollect,
5646                                                              ToBody, ToForLoc,
5647                                                              ToRParenLoc);
5648 }
5649 
5650 Stmt *ASTNodeImporter::VisitObjCAtCatchStmt(ObjCAtCatchStmt *S) {
5651   SourceLocation ToAtCatchLoc = Importer.Import(S->getAtCatchLoc());
5652   SourceLocation ToRParenLoc = Importer.Import(S->getRParenLoc());
5653   VarDecl *ToExceptionDecl = nullptr;
5654   if (VarDecl *FromExceptionDecl = S->getCatchParamDecl()) {
5655     ToExceptionDecl =
5656       dyn_cast_or_null<VarDecl>(Importer.Import(FromExceptionDecl));
5657     if (!ToExceptionDecl)
5658       return nullptr;
5659   }
5660   Stmt *ToBody = Importer.Import(S->getCatchBody());
5661   if (!ToBody && S->getCatchBody())
5662     return nullptr;
5663   return new (Importer.getToContext()) ObjCAtCatchStmt(ToAtCatchLoc,
5664                                                        ToRParenLoc,
5665                                                        ToExceptionDecl,
5666                                                        ToBody);
5667 }
5668 
5669 Stmt *ASTNodeImporter::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
5670   SourceLocation ToAtFinallyLoc = Importer.Import(S->getAtFinallyLoc());
5671   Stmt *ToAtFinallyStmt = Importer.Import(S->getFinallyBody());
5672   if (!ToAtFinallyStmt && S->getFinallyBody())
5673     return nullptr;
5674   return new (Importer.getToContext()) ObjCAtFinallyStmt(ToAtFinallyLoc,
5675                                                          ToAtFinallyStmt);
5676 }
5677 
5678 Stmt *ASTNodeImporter::VisitObjCAtTryStmt(ObjCAtTryStmt *S) {
5679   SourceLocation ToAtTryLoc = Importer.Import(S->getAtTryLoc());
5680   Stmt *ToAtTryStmt = Importer.Import(S->getTryBody());
5681   if (!ToAtTryStmt && S->getTryBody())
5682     return nullptr;
5683   SmallVector<Stmt *, 1> ToCatchStmts(S->getNumCatchStmts());
5684   for (unsigned CI = 0, CE = S->getNumCatchStmts(); CI != CE; ++CI) {
5685     ObjCAtCatchStmt *FromCatchStmt = S->getCatchStmt(CI);
5686     if (Stmt *ToCatchStmt = Importer.Import(FromCatchStmt))
5687       ToCatchStmts[CI] = ToCatchStmt;
5688     else
5689       return nullptr;
5690   }
5691   Stmt *ToAtFinallyStmt = Importer.Import(S->getFinallyStmt());
5692   if (!ToAtFinallyStmt && S->getFinallyStmt())
5693     return nullptr;
5694   return ObjCAtTryStmt::Create(Importer.getToContext(),
5695                                ToAtTryLoc, ToAtTryStmt,
5696                                ToCatchStmts.begin(), ToCatchStmts.size(),
5697                                ToAtFinallyStmt);
5698 }
5699 
5700 Stmt *ASTNodeImporter::VisitObjCAtSynchronizedStmt
5701   (ObjCAtSynchronizedStmt *S) {
5702   SourceLocation ToAtSynchronizedLoc =
5703     Importer.Import(S->getAtSynchronizedLoc());
5704   Expr *ToSynchExpr = Importer.Import(S->getSynchExpr());
5705   if (!ToSynchExpr && S->getSynchExpr())
5706     return nullptr;
5707   Stmt *ToSynchBody = Importer.Import(S->getSynchBody());
5708   if (!ToSynchBody && S->getSynchBody())
5709     return nullptr;
5710   return new (Importer.getToContext()) ObjCAtSynchronizedStmt(
5711     ToAtSynchronizedLoc, ToSynchExpr, ToSynchBody);
5712 }
5713 
5714 Stmt *ASTNodeImporter::VisitObjCAtThrowStmt(ObjCAtThrowStmt *S) {
5715   SourceLocation ToAtThrowLoc = Importer.Import(S->getThrowLoc());
5716   Expr *ToThrow = Importer.Import(S->getThrowExpr());
5717   if (!ToThrow && S->getThrowExpr())
5718     return nullptr;
5719   return new (Importer.getToContext()) ObjCAtThrowStmt(ToAtThrowLoc, ToThrow);
5720 }
5721 
5722 Stmt *ASTNodeImporter::VisitObjCAutoreleasePoolStmt
5723   (ObjCAutoreleasePoolStmt *S) {
5724   SourceLocation ToAtLoc = Importer.Import(S->getAtLoc());
5725   Stmt *ToSubStmt = Importer.Import(S->getSubStmt());
5726   if (!ToSubStmt && S->getSubStmt())
5727     return nullptr;
5728   return new (Importer.getToContext()) ObjCAutoreleasePoolStmt(ToAtLoc,
5729                                                                ToSubStmt);
5730 }
5731 
5732 //----------------------------------------------------------------------------
5733 // Import Expressions
5734 //----------------------------------------------------------------------------
5735 Expr *ASTNodeImporter::VisitExpr(Expr *E) {
5736   Importer.FromDiag(E->getLocStart(), diag::err_unsupported_ast_node)
5737     << E->getStmtClassName();
5738   return nullptr;
5739 }
5740 
5741 Expr *ASTNodeImporter::VisitVAArgExpr(VAArgExpr *E) {
5742   QualType T = Importer.Import(E->getType());
5743   if (T.isNull())
5744     return nullptr;
5745 
5746   Expr *SubExpr = Importer.Import(E->getSubExpr());
5747   if (!SubExpr && E->getSubExpr())
5748     return nullptr;
5749 
5750   TypeSourceInfo *TInfo = Importer.Import(E->getWrittenTypeInfo());
5751   if (!TInfo)
5752     return nullptr;
5753 
5754   return new (Importer.getToContext()) VAArgExpr(
5755         Importer.Import(E->getBuiltinLoc()), SubExpr, TInfo,
5756         Importer.Import(E->getRParenLoc()), T, E->isMicrosoftABI());
5757 }
5758 
5759 
5760 Expr *ASTNodeImporter::VisitGNUNullExpr(GNUNullExpr *E) {
5761   QualType T = Importer.Import(E->getType());
5762   if (T.isNull())
5763     return nullptr;
5764 
5765   return new (Importer.getToContext()) GNUNullExpr(
5766         T, Importer.Import(E->getLocStart()));
5767 }
5768 
5769 Expr *ASTNodeImporter::VisitPredefinedExpr(PredefinedExpr *E) {
5770   QualType T = Importer.Import(E->getType());
5771   if (T.isNull())
5772     return nullptr;
5773 
5774   StringLiteral *SL = cast_or_null<StringLiteral>(
5775         Importer.Import(E->getFunctionName()));
5776   if (!SL && E->getFunctionName())
5777     return nullptr;
5778 
5779   return new (Importer.getToContext()) PredefinedExpr(
5780         Importer.Import(E->getLocStart()), T, E->getIdentType(), SL);
5781 }
5782 
5783 Expr *ASTNodeImporter::VisitDeclRefExpr(DeclRefExpr *E) {
5784   ValueDecl *ToD = cast_or_null<ValueDecl>(Importer.Import(E->getDecl()));
5785   if (!ToD)
5786     return nullptr;
5787 
5788   NamedDecl *FoundD = nullptr;
5789   if (E->getDecl() != E->getFoundDecl()) {
5790     FoundD = cast_or_null<NamedDecl>(Importer.Import(E->getFoundDecl()));
5791     if (!FoundD)
5792       return nullptr;
5793   }
5794 
5795   QualType T = Importer.Import(E->getType());
5796   if (T.isNull())
5797     return nullptr;
5798 
5799 
5800   TemplateArgumentListInfo ToTAInfo;
5801   TemplateArgumentListInfo *ResInfo = nullptr;
5802   if (E->hasExplicitTemplateArgs()) {
5803     for (const auto &FromLoc : E->template_arguments()) {
5804       bool Error = false;
5805       TemplateArgumentLoc ToTALoc = ImportTemplateArgumentLoc(FromLoc, Error);
5806       if (Error)
5807         return nullptr;
5808       ToTAInfo.addArgument(ToTALoc);
5809     }
5810     ResInfo = &ToTAInfo;
5811   }
5812 
5813   DeclRefExpr *DRE = DeclRefExpr::Create(Importer.getToContext(),
5814                                          Importer.Import(E->getQualifierLoc()),
5815                                    Importer.Import(E->getTemplateKeywordLoc()),
5816                                          ToD,
5817                                         E->refersToEnclosingVariableOrCapture(),
5818                                          Importer.Import(E->getLocation()),
5819                                          T, E->getValueKind(),
5820                                          FoundD, ResInfo);
5821   if (E->hadMultipleCandidates())
5822     DRE->setHadMultipleCandidates(true);
5823   return DRE;
5824 }
5825 
5826 Expr *ASTNodeImporter::VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) {
5827   QualType T = Importer.Import(E->getType());
5828   if (T.isNull())
5829     return nullptr;
5830 
5831   return new (Importer.getToContext()) ImplicitValueInitExpr(T);
5832 }
5833 
5834 ASTNodeImporter::Designator
5835 ASTNodeImporter::ImportDesignator(const Designator &D) {
5836   if (D.isFieldDesignator()) {
5837     IdentifierInfo *ToFieldName = Importer.Import(D.getFieldName());
5838     // Caller checks for import error
5839     return Designator(ToFieldName, Importer.Import(D.getDotLoc()),
5840                       Importer.Import(D.getFieldLoc()));
5841   }
5842   if (D.isArrayDesignator())
5843     return Designator(D.getFirstExprIndex(),
5844                       Importer.Import(D.getLBracketLoc()),
5845                       Importer.Import(D.getRBracketLoc()));
5846 
5847   assert(D.isArrayRangeDesignator());
5848   return Designator(D.getFirstExprIndex(),
5849                     Importer.Import(D.getLBracketLoc()),
5850                     Importer.Import(D.getEllipsisLoc()),
5851                     Importer.Import(D.getRBracketLoc()));
5852 }
5853 
5854 
5855 Expr *ASTNodeImporter::VisitDesignatedInitExpr(DesignatedInitExpr *DIE) {
5856   Expr *Init = cast_or_null<Expr>(Importer.Import(DIE->getInit()));
5857   if (!Init)
5858     return nullptr;
5859 
5860   SmallVector<Expr *, 4> IndexExprs(DIE->getNumSubExprs() - 1);
5861   // List elements from the second, the first is Init itself
5862   for (unsigned I = 1, E = DIE->getNumSubExprs(); I < E; I++) {
5863     if (Expr *Arg = cast_or_null<Expr>(Importer.Import(DIE->getSubExpr(I))))
5864       IndexExprs[I - 1] = Arg;
5865     else
5866       return nullptr;
5867   }
5868 
5869   SmallVector<Designator, 4> Designators(DIE->size());
5870   llvm::transform(DIE->designators(), Designators.begin(),
5871                   [this](const Designator &D) -> Designator {
5872                     return ImportDesignator(D);
5873                   });
5874 
5875   for (const Designator &D : DIE->designators())
5876     if (D.isFieldDesignator() && !D.getFieldName())
5877       return nullptr;
5878 
5879   return DesignatedInitExpr::Create(
5880         Importer.getToContext(), Designators,
5881         IndexExprs, Importer.Import(DIE->getEqualOrColonLoc()),
5882         DIE->usesGNUSyntax(), Init);
5883 }
5884 
5885 Expr *ASTNodeImporter::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) {
5886   QualType T = Importer.Import(E->getType());
5887   if (T.isNull())
5888     return nullptr;
5889 
5890   return new (Importer.getToContext())
5891       CXXNullPtrLiteralExpr(T, Importer.Import(E->getLocation()));
5892 }
5893 
5894 Expr *ASTNodeImporter::VisitIntegerLiteral(IntegerLiteral *E) {
5895   QualType T = Importer.Import(E->getType());
5896   if (T.isNull())
5897     return nullptr;
5898 
5899   return IntegerLiteral::Create(Importer.getToContext(),
5900                                 E->getValue(), T,
5901                                 Importer.Import(E->getLocation()));
5902 }
5903 
5904 Expr *ASTNodeImporter::VisitFloatingLiteral(FloatingLiteral *E) {
5905   QualType T = Importer.Import(E->getType());
5906   if (T.isNull())
5907     return nullptr;
5908 
5909   return FloatingLiteral::Create(Importer.getToContext(),
5910                                 E->getValue(), E->isExact(), T,
5911                                 Importer.Import(E->getLocation()));
5912 }
5913 
5914 Expr *ASTNodeImporter::VisitCharacterLiteral(CharacterLiteral *E) {
5915   QualType T = Importer.Import(E->getType());
5916   if (T.isNull())
5917     return nullptr;
5918 
5919   return new (Importer.getToContext()) CharacterLiteral(E->getValue(),
5920                                                         E->getKind(), T,
5921                                           Importer.Import(E->getLocation()));
5922 }
5923 
5924 Expr *ASTNodeImporter::VisitStringLiteral(StringLiteral *E) {
5925   QualType T = Importer.Import(E->getType());
5926   if (T.isNull())
5927     return nullptr;
5928 
5929   SmallVector<SourceLocation, 4> Locations(E->getNumConcatenated());
5930   ImportArray(E->tokloc_begin(), E->tokloc_end(), Locations.begin());
5931 
5932   return StringLiteral::Create(Importer.getToContext(), E->getBytes(),
5933                                E->getKind(), E->isPascal(), T,
5934                                Locations.data(), Locations.size());
5935 }
5936 
5937 Expr *ASTNodeImporter::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
5938   QualType T = Importer.Import(E->getType());
5939   if (T.isNull())
5940     return nullptr;
5941 
5942   TypeSourceInfo *TInfo = Importer.Import(E->getTypeSourceInfo());
5943   if (!TInfo)
5944     return nullptr;
5945 
5946   Expr *Init = Importer.Import(E->getInitializer());
5947   if (!Init)
5948     return nullptr;
5949 
5950   return new (Importer.getToContext()) CompoundLiteralExpr(
5951         Importer.Import(E->getLParenLoc()), TInfo, T, E->getValueKind(),
5952         Init, E->isFileScope());
5953 }
5954 
5955 Expr *ASTNodeImporter::VisitAtomicExpr(AtomicExpr *E) {
5956   QualType T = Importer.Import(E->getType());
5957   if (T.isNull())
5958     return nullptr;
5959 
5960   SmallVector<Expr *, 6> Exprs(E->getNumSubExprs());
5961   if (ImportArrayChecked(
5962         E->getSubExprs(), E->getSubExprs() + E->getNumSubExprs(),
5963         Exprs.begin()))
5964     return nullptr;
5965 
5966   return new (Importer.getToContext()) AtomicExpr(
5967         Importer.Import(E->getBuiltinLoc()), Exprs, T, E->getOp(),
5968         Importer.Import(E->getRParenLoc()));
5969 }
5970 
5971 Expr *ASTNodeImporter::VisitAddrLabelExpr(AddrLabelExpr *E) {
5972   QualType T = Importer.Import(E->getType());
5973   if (T.isNull())
5974     return nullptr;
5975 
5976   LabelDecl *ToLabel = cast_or_null<LabelDecl>(Importer.Import(E->getLabel()));
5977   if (!ToLabel)
5978     return nullptr;
5979 
5980   return new (Importer.getToContext()) AddrLabelExpr(
5981         Importer.Import(E->getAmpAmpLoc()), Importer.Import(E->getLabelLoc()),
5982         ToLabel, T);
5983 }
5984 
5985 Expr *ASTNodeImporter::VisitParenExpr(ParenExpr *E) {
5986   Expr *SubExpr = Importer.Import(E->getSubExpr());
5987   if (!SubExpr)
5988     return nullptr;
5989 
5990   return new (Importer.getToContext())
5991                                   ParenExpr(Importer.Import(E->getLParen()),
5992                                             Importer.Import(E->getRParen()),
5993                                             SubExpr);
5994 }
5995 
5996 Expr *ASTNodeImporter::VisitParenListExpr(ParenListExpr *E) {
5997   SmallVector<Expr *, 4> Exprs(E->getNumExprs());
5998   if (ImportContainerChecked(E->exprs(), Exprs))
5999     return nullptr;
6000 
6001   return new (Importer.getToContext()) ParenListExpr(
6002         Importer.getToContext(), Importer.Import(E->getLParenLoc()),
6003         Exprs, Importer.Import(E->getLParenLoc()));
6004 }
6005 
6006 Expr *ASTNodeImporter::VisitStmtExpr(StmtExpr *E) {
6007   QualType T = Importer.Import(E->getType());
6008   if (T.isNull())
6009     return nullptr;
6010 
6011   CompoundStmt *ToSubStmt = cast_or_null<CompoundStmt>(
6012         Importer.Import(E->getSubStmt()));
6013   if (!ToSubStmt && E->getSubStmt())
6014     return nullptr;
6015 
6016   return new (Importer.getToContext()) StmtExpr(ToSubStmt, T,
6017         Importer.Import(E->getLParenLoc()), Importer.Import(E->getRParenLoc()));
6018 }
6019 
6020 Expr *ASTNodeImporter::VisitUnaryOperator(UnaryOperator *E) {
6021   QualType T = Importer.Import(E->getType());
6022   if (T.isNull())
6023     return nullptr;
6024 
6025   Expr *SubExpr = Importer.Import(E->getSubExpr());
6026   if (!SubExpr)
6027     return nullptr;
6028 
6029   return new (Importer.getToContext()) UnaryOperator(SubExpr, E->getOpcode(),
6030                                                      T, E->getValueKind(),
6031                                                      E->getObjectKind(),
6032                                          Importer.Import(E->getOperatorLoc()));
6033 }
6034 
6035 Expr *ASTNodeImporter::VisitUnaryExprOrTypeTraitExpr(
6036                                             UnaryExprOrTypeTraitExpr *E) {
6037   QualType ResultType = Importer.Import(E->getType());
6038 
6039   if (E->isArgumentType()) {
6040     TypeSourceInfo *TInfo = Importer.Import(E->getArgumentTypeInfo());
6041     if (!TInfo)
6042       return nullptr;
6043 
6044     return new (Importer.getToContext()) UnaryExprOrTypeTraitExpr(E->getKind(),
6045                                            TInfo, ResultType,
6046                                            Importer.Import(E->getOperatorLoc()),
6047                                            Importer.Import(E->getRParenLoc()));
6048   }
6049 
6050   Expr *SubExpr = Importer.Import(E->getArgumentExpr());
6051   if (!SubExpr)
6052     return nullptr;
6053 
6054   return new (Importer.getToContext()) UnaryExprOrTypeTraitExpr(E->getKind(),
6055                                           SubExpr, ResultType,
6056                                           Importer.Import(E->getOperatorLoc()),
6057                                           Importer.Import(E->getRParenLoc()));
6058 }
6059 
6060 Expr *ASTNodeImporter::VisitBinaryOperator(BinaryOperator *E) {
6061   QualType T = Importer.Import(E->getType());
6062   if (T.isNull())
6063     return nullptr;
6064 
6065   Expr *LHS = Importer.Import(E->getLHS());
6066   if (!LHS)
6067     return nullptr;
6068 
6069   Expr *RHS = Importer.Import(E->getRHS());
6070   if (!RHS)
6071     return nullptr;
6072 
6073   return new (Importer.getToContext()) BinaryOperator(LHS, RHS, E->getOpcode(),
6074                                                       T, E->getValueKind(),
6075                                                       E->getObjectKind(),
6076                                            Importer.Import(E->getOperatorLoc()),
6077                                                       E->getFPFeatures());
6078 }
6079 
6080 Expr *ASTNodeImporter::VisitConditionalOperator(ConditionalOperator *E) {
6081   QualType T = Importer.Import(E->getType());
6082   if (T.isNull())
6083     return nullptr;
6084 
6085   Expr *ToLHS = Importer.Import(E->getLHS());
6086   if (!ToLHS)
6087     return nullptr;
6088 
6089   Expr *ToRHS = Importer.Import(E->getRHS());
6090   if (!ToRHS)
6091     return nullptr;
6092 
6093   Expr *ToCond = Importer.Import(E->getCond());
6094   if (!ToCond)
6095     return nullptr;
6096 
6097   return new (Importer.getToContext()) ConditionalOperator(
6098         ToCond, Importer.Import(E->getQuestionLoc()),
6099         ToLHS, Importer.Import(E->getColonLoc()),
6100         ToRHS, T, E->getValueKind(), E->getObjectKind());
6101 }
6102 
6103 Expr *ASTNodeImporter::VisitBinaryConditionalOperator(
6104     BinaryConditionalOperator *E) {
6105   QualType T = Importer.Import(E->getType());
6106   if (T.isNull())
6107     return nullptr;
6108 
6109   Expr *Common = Importer.Import(E->getCommon());
6110   if (!Common)
6111     return nullptr;
6112 
6113   Expr *Cond = Importer.Import(E->getCond());
6114   if (!Cond)
6115     return nullptr;
6116 
6117   OpaqueValueExpr *OpaqueValue = cast_or_null<OpaqueValueExpr>(
6118         Importer.Import(E->getOpaqueValue()));
6119   if (!OpaqueValue)
6120     return nullptr;
6121 
6122   Expr *TrueExpr = Importer.Import(E->getTrueExpr());
6123   if (!TrueExpr)
6124     return nullptr;
6125 
6126   Expr *FalseExpr = Importer.Import(E->getFalseExpr());
6127   if (!FalseExpr)
6128     return nullptr;
6129 
6130   return new (Importer.getToContext()) BinaryConditionalOperator(
6131         Common, OpaqueValue, Cond, TrueExpr, FalseExpr,
6132         Importer.Import(E->getQuestionLoc()), Importer.Import(E->getColonLoc()),
6133         T, E->getValueKind(), E->getObjectKind());
6134 }
6135 
6136 Expr *ASTNodeImporter::VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
6137   QualType T = Importer.Import(E->getType());
6138   if (T.isNull())
6139     return nullptr;
6140 
6141   TypeSourceInfo *ToQueried = Importer.Import(E->getQueriedTypeSourceInfo());
6142   if (!ToQueried)
6143     return nullptr;
6144 
6145   Expr *Dim = Importer.Import(E->getDimensionExpression());
6146   if (!Dim && E->getDimensionExpression())
6147     return nullptr;
6148 
6149   return new (Importer.getToContext()) ArrayTypeTraitExpr(
6150         Importer.Import(E->getLocStart()), E->getTrait(), ToQueried,
6151         E->getValue(), Dim, Importer.Import(E->getLocEnd()), T);
6152 }
6153 
6154 Expr *ASTNodeImporter::VisitExpressionTraitExpr(ExpressionTraitExpr *E) {
6155   QualType T = Importer.Import(E->getType());
6156   if (T.isNull())
6157     return nullptr;
6158 
6159   Expr *ToQueried = Importer.Import(E->getQueriedExpression());
6160   if (!ToQueried)
6161     return nullptr;
6162 
6163   return new (Importer.getToContext()) ExpressionTraitExpr(
6164         Importer.Import(E->getLocStart()), E->getTrait(), ToQueried,
6165         E->getValue(), Importer.Import(E->getLocEnd()), T);
6166 }
6167 
6168 Expr *ASTNodeImporter::VisitOpaqueValueExpr(OpaqueValueExpr *E) {
6169   QualType T = Importer.Import(E->getType());
6170   if (T.isNull())
6171     return nullptr;
6172 
6173   Expr *SourceExpr = Importer.Import(E->getSourceExpr());
6174   if (!SourceExpr && E->getSourceExpr())
6175     return nullptr;
6176 
6177   return new (Importer.getToContext()) OpaqueValueExpr(
6178         Importer.Import(E->getLocation()), T, E->getValueKind(),
6179         E->getObjectKind(), SourceExpr);
6180 }
6181 
6182 Expr *ASTNodeImporter::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {
6183   QualType T = Importer.Import(E->getType());
6184   if (T.isNull())
6185     return nullptr;
6186 
6187   Expr *ToLHS = Importer.Import(E->getLHS());
6188   if (!ToLHS)
6189     return nullptr;
6190 
6191   Expr *ToRHS = Importer.Import(E->getRHS());
6192   if (!ToRHS)
6193     return nullptr;
6194 
6195   return new (Importer.getToContext()) ArraySubscriptExpr(
6196         ToLHS, ToRHS, T, E->getValueKind(), E->getObjectKind(),
6197         Importer.Import(E->getRBracketLoc()));
6198 }
6199 
6200 Expr *ASTNodeImporter::VisitCompoundAssignOperator(CompoundAssignOperator *E) {
6201   QualType T = Importer.Import(E->getType());
6202   if (T.isNull())
6203     return nullptr;
6204 
6205   QualType CompLHSType = Importer.Import(E->getComputationLHSType());
6206   if (CompLHSType.isNull())
6207     return nullptr;
6208 
6209   QualType CompResultType = Importer.Import(E->getComputationResultType());
6210   if (CompResultType.isNull())
6211     return nullptr;
6212 
6213   Expr *LHS = Importer.Import(E->getLHS());
6214   if (!LHS)
6215     return nullptr;
6216 
6217   Expr *RHS = Importer.Import(E->getRHS());
6218   if (!RHS)
6219     return nullptr;
6220 
6221   return new (Importer.getToContext())
6222                         CompoundAssignOperator(LHS, RHS, E->getOpcode(),
6223                                                T, E->getValueKind(),
6224                                                E->getObjectKind(),
6225                                                CompLHSType, CompResultType,
6226                                            Importer.Import(E->getOperatorLoc()),
6227                                                E->getFPFeatures());
6228 }
6229 
6230 bool ASTNodeImporter::ImportCastPath(CastExpr *CE, CXXCastPath &Path) {
6231   for (auto I = CE->path_begin(), E = CE->path_end(); I != E; ++I) {
6232     if (CXXBaseSpecifier *Spec = Importer.Import(*I))
6233       Path.push_back(Spec);
6234     else
6235       return true;
6236   }
6237   return false;
6238 }
6239 
6240 Expr *ASTNodeImporter::VisitImplicitCastExpr(ImplicitCastExpr *E) {
6241   QualType T = Importer.Import(E->getType());
6242   if (T.isNull())
6243     return nullptr;
6244 
6245   Expr *SubExpr = Importer.Import(E->getSubExpr());
6246   if (!SubExpr)
6247     return nullptr;
6248 
6249   CXXCastPath BasePath;
6250   if (ImportCastPath(E, BasePath))
6251     return nullptr;
6252 
6253   return ImplicitCastExpr::Create(Importer.getToContext(), T, E->getCastKind(),
6254                                   SubExpr, &BasePath, E->getValueKind());
6255 }
6256 
6257 Expr *ASTNodeImporter::VisitExplicitCastExpr(ExplicitCastExpr *E) {
6258   QualType T = Importer.Import(E->getType());
6259   if (T.isNull())
6260     return nullptr;
6261 
6262   Expr *SubExpr = Importer.Import(E->getSubExpr());
6263   if (!SubExpr)
6264     return nullptr;
6265 
6266   TypeSourceInfo *TInfo = Importer.Import(E->getTypeInfoAsWritten());
6267   if (!TInfo && E->getTypeInfoAsWritten())
6268     return nullptr;
6269 
6270   CXXCastPath BasePath;
6271   if (ImportCastPath(E, BasePath))
6272     return nullptr;
6273 
6274   switch (E->getStmtClass()) {
6275   case Stmt::CStyleCastExprClass: {
6276     CStyleCastExpr *CCE = cast<CStyleCastExpr>(E);
6277     return CStyleCastExpr::Create(Importer.getToContext(), T,
6278                                   E->getValueKind(), E->getCastKind(),
6279                                   SubExpr, &BasePath, TInfo,
6280                                   Importer.Import(CCE->getLParenLoc()),
6281                                   Importer.Import(CCE->getRParenLoc()));
6282   }
6283 
6284   case Stmt::CXXFunctionalCastExprClass: {
6285     CXXFunctionalCastExpr *FCE = cast<CXXFunctionalCastExpr>(E);
6286     return CXXFunctionalCastExpr::Create(Importer.getToContext(), T,
6287                                          E->getValueKind(), TInfo,
6288                                          E->getCastKind(), SubExpr, &BasePath,
6289                                          Importer.Import(FCE->getLParenLoc()),
6290                                          Importer.Import(FCE->getRParenLoc()));
6291   }
6292 
6293   case Stmt::ObjCBridgedCastExprClass: {
6294       ObjCBridgedCastExpr *OCE = cast<ObjCBridgedCastExpr>(E);
6295       return new (Importer.getToContext()) ObjCBridgedCastExpr(
6296             Importer.Import(OCE->getLParenLoc()), OCE->getBridgeKind(),
6297             E->getCastKind(), Importer.Import(OCE->getBridgeKeywordLoc()),
6298             TInfo, SubExpr);
6299   }
6300   default:
6301     break; // just fall through
6302   }
6303 
6304   CXXNamedCastExpr *Named = cast<CXXNamedCastExpr>(E);
6305   SourceLocation ExprLoc = Importer.Import(Named->getOperatorLoc()),
6306       RParenLoc = Importer.Import(Named->getRParenLoc());
6307   SourceRange Brackets = Importer.Import(Named->getAngleBrackets());
6308 
6309   switch (E->getStmtClass()) {
6310   case Stmt::CXXStaticCastExprClass:
6311     return CXXStaticCastExpr::Create(Importer.getToContext(), T,
6312                                      E->getValueKind(), E->getCastKind(),
6313                                      SubExpr, &BasePath, TInfo,
6314                                      ExprLoc, RParenLoc, Brackets);
6315 
6316   case Stmt::CXXDynamicCastExprClass:
6317     return CXXDynamicCastExpr::Create(Importer.getToContext(), T,
6318                                       E->getValueKind(), E->getCastKind(),
6319                                       SubExpr, &BasePath, TInfo,
6320                                       ExprLoc, RParenLoc, Brackets);
6321 
6322   case Stmt::CXXReinterpretCastExprClass:
6323     return CXXReinterpretCastExpr::Create(Importer.getToContext(), T,
6324                                           E->getValueKind(), E->getCastKind(),
6325                                           SubExpr, &BasePath, TInfo,
6326                                           ExprLoc, RParenLoc, Brackets);
6327 
6328   case Stmt::CXXConstCastExprClass:
6329     return CXXConstCastExpr::Create(Importer.getToContext(), T,
6330                                     E->getValueKind(), SubExpr, TInfo, ExprLoc,
6331                                     RParenLoc, Brackets);
6332   default:
6333     llvm_unreachable("Cast expression of unsupported type!");
6334     return nullptr;
6335   }
6336 }
6337 
6338 Expr *ASTNodeImporter::VisitOffsetOfExpr(OffsetOfExpr *OE) {
6339   QualType T = Importer.Import(OE->getType());
6340   if (T.isNull())
6341     return nullptr;
6342 
6343   SmallVector<OffsetOfNode, 4> Nodes;
6344   for (int I = 0, E = OE->getNumComponents(); I < E; ++I) {
6345     const OffsetOfNode &Node = OE->getComponent(I);
6346 
6347     switch (Node.getKind()) {
6348     case OffsetOfNode::Array:
6349       Nodes.push_back(OffsetOfNode(Importer.Import(Node.getLocStart()),
6350                                    Node.getArrayExprIndex(),
6351                                    Importer.Import(Node.getLocEnd())));
6352       break;
6353 
6354     case OffsetOfNode::Base: {
6355       CXXBaseSpecifier *BS = Importer.Import(Node.getBase());
6356       if (!BS && Node.getBase())
6357         return nullptr;
6358       Nodes.push_back(OffsetOfNode(BS));
6359       break;
6360     }
6361     case OffsetOfNode::Field: {
6362       FieldDecl *FD = cast_or_null<FieldDecl>(Importer.Import(Node.getField()));
6363       if (!FD)
6364         return nullptr;
6365       Nodes.push_back(OffsetOfNode(Importer.Import(Node.getLocStart()), FD,
6366                                    Importer.Import(Node.getLocEnd())));
6367       break;
6368     }
6369     case OffsetOfNode::Identifier: {
6370       IdentifierInfo *ToII = Importer.Import(Node.getFieldName());
6371       if (!ToII)
6372         return nullptr;
6373       Nodes.push_back(OffsetOfNode(Importer.Import(Node.getLocStart()), ToII,
6374                                    Importer.Import(Node.getLocEnd())));
6375       break;
6376     }
6377     }
6378   }
6379 
6380   SmallVector<Expr *, 4> Exprs(OE->getNumExpressions());
6381   for (int I = 0, E = OE->getNumExpressions(); I < E; ++I) {
6382     Expr *ToIndexExpr = Importer.Import(OE->getIndexExpr(I));
6383     if (!ToIndexExpr)
6384       return nullptr;
6385     Exprs[I] = ToIndexExpr;
6386   }
6387 
6388   TypeSourceInfo *TInfo = Importer.Import(OE->getTypeSourceInfo());
6389   if (!TInfo && OE->getTypeSourceInfo())
6390     return nullptr;
6391 
6392   return OffsetOfExpr::Create(Importer.getToContext(), T,
6393                               Importer.Import(OE->getOperatorLoc()),
6394                               TInfo, Nodes, Exprs,
6395                               Importer.Import(OE->getRParenLoc()));
6396 }
6397 
6398 Expr *ASTNodeImporter::VisitCXXNoexceptExpr(CXXNoexceptExpr *E) {
6399   QualType T = Importer.Import(E->getType());
6400   if (T.isNull())
6401     return nullptr;
6402 
6403   Expr *Operand = Importer.Import(E->getOperand());
6404   if (!Operand)
6405     return nullptr;
6406 
6407   CanThrowResult CanThrow;
6408   if (E->isValueDependent())
6409     CanThrow = CT_Dependent;
6410   else
6411     CanThrow = E->getValue() ? CT_Can : CT_Cannot;
6412 
6413   return new (Importer.getToContext()) CXXNoexceptExpr(
6414         T, Operand, CanThrow,
6415         Importer.Import(E->getLocStart()), Importer.Import(E->getLocEnd()));
6416 }
6417 
6418 Expr *ASTNodeImporter::VisitCXXThrowExpr(CXXThrowExpr *E) {
6419   QualType T = Importer.Import(E->getType());
6420   if (T.isNull())
6421     return nullptr;
6422 
6423   Expr *SubExpr = Importer.Import(E->getSubExpr());
6424   if (!SubExpr && E->getSubExpr())
6425     return nullptr;
6426 
6427   return new (Importer.getToContext()) CXXThrowExpr(
6428         SubExpr, T, Importer.Import(E->getThrowLoc()),
6429         E->isThrownVariableInScope());
6430 }
6431 
6432 Expr *ASTNodeImporter::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
6433   ParmVarDecl *Param = cast_or_null<ParmVarDecl>(
6434         Importer.Import(E->getParam()));
6435   if (!Param)
6436     return nullptr;
6437 
6438   return CXXDefaultArgExpr::Create(
6439         Importer.getToContext(), Importer.Import(E->getUsedLocation()), Param);
6440 }
6441 
6442 Expr *ASTNodeImporter::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E) {
6443   QualType T = Importer.Import(E->getType());
6444   if (T.isNull())
6445     return nullptr;
6446 
6447   TypeSourceInfo *TypeInfo = Importer.Import(E->getTypeSourceInfo());
6448   if (!TypeInfo)
6449     return nullptr;
6450 
6451   return new (Importer.getToContext()) CXXScalarValueInitExpr(
6452         T, TypeInfo, Importer.Import(E->getRParenLoc()));
6453 }
6454 
6455 Expr *ASTNodeImporter::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
6456   Expr *SubExpr = Importer.Import(E->getSubExpr());
6457   if (!SubExpr)
6458     return nullptr;
6459 
6460   auto *Dtor = cast_or_null<CXXDestructorDecl>(
6461         Importer.Import(const_cast<CXXDestructorDecl *>(
6462                           E->getTemporary()->getDestructor())));
6463   if (!Dtor)
6464     return nullptr;
6465 
6466   ASTContext &ToCtx = Importer.getToContext();
6467   CXXTemporary *Temp = CXXTemporary::Create(ToCtx, Dtor);
6468   return CXXBindTemporaryExpr::Create(ToCtx, Temp, SubExpr);
6469 }
6470 
6471 Expr *ASTNodeImporter::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *CE) {
6472   QualType T = Importer.Import(CE->getType());
6473   if (T.isNull())
6474     return nullptr;
6475 
6476   SmallVector<Expr *, 8> Args(CE->getNumArgs());
6477   if (ImportContainerChecked(CE->arguments(), Args))
6478     return nullptr;
6479 
6480   auto *Ctor = cast_or_null<CXXConstructorDecl>(
6481         Importer.Import(CE->getConstructor()));
6482   if (!Ctor)
6483     return nullptr;
6484 
6485   return CXXTemporaryObjectExpr::Create(
6486         Importer.getToContext(), T,
6487         Importer.Import(CE->getLocStart()),
6488         Ctor,
6489         CE->isElidable(),
6490         Args,
6491         CE->hadMultipleCandidates(),
6492         CE->isListInitialization(),
6493         CE->isStdInitListInitialization(),
6494         CE->requiresZeroInitialization(),
6495         CE->getConstructionKind(),
6496         Importer.Import(CE->getParenOrBraceRange()));
6497 }
6498 
6499 Expr *
6500 ASTNodeImporter::VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *E) {
6501   QualType T = Importer.Import(E->getType());
6502   if (T.isNull())
6503     return nullptr;
6504 
6505   Expr *TempE = Importer.Import(E->GetTemporaryExpr());
6506   if (!TempE)
6507     return nullptr;
6508 
6509   ValueDecl *ExtendedBy = cast_or_null<ValueDecl>(
6510         Importer.Import(const_cast<ValueDecl *>(E->getExtendingDecl())));
6511   if (!ExtendedBy && E->getExtendingDecl())
6512     return nullptr;
6513 
6514   auto *ToMTE =  new (Importer.getToContext()) MaterializeTemporaryExpr(
6515         T, TempE, E->isBoundToLvalueReference());
6516 
6517   // FIXME: Should ManglingNumber get numbers associated with 'to' context?
6518   ToMTE->setExtendingDecl(ExtendedBy, E->getManglingNumber());
6519   return ToMTE;
6520 }
6521 
6522 Expr *ASTNodeImporter::VisitCXXNewExpr(CXXNewExpr *CE) {
6523   QualType T = Importer.Import(CE->getType());
6524   if (T.isNull())
6525     return nullptr;
6526 
6527   SmallVector<Expr *, 4> PlacementArgs(CE->getNumPlacementArgs());
6528   if (ImportContainerChecked(CE->placement_arguments(), PlacementArgs))
6529     return nullptr;
6530 
6531   FunctionDecl *OperatorNewDecl = cast_or_null<FunctionDecl>(
6532         Importer.Import(CE->getOperatorNew()));
6533   if (!OperatorNewDecl && CE->getOperatorNew())
6534     return nullptr;
6535 
6536   FunctionDecl *OperatorDeleteDecl = cast_or_null<FunctionDecl>(
6537         Importer.Import(CE->getOperatorDelete()));
6538   if (!OperatorDeleteDecl && CE->getOperatorDelete())
6539     return nullptr;
6540 
6541   Expr *ToInit = Importer.Import(CE->getInitializer());
6542   if (!ToInit && CE->getInitializer())
6543     return nullptr;
6544 
6545   TypeSourceInfo *TInfo = Importer.Import(CE->getAllocatedTypeSourceInfo());
6546   if (!TInfo)
6547     return nullptr;
6548 
6549   Expr *ToArrSize = Importer.Import(CE->getArraySize());
6550   if (!ToArrSize && CE->getArraySize())
6551     return nullptr;
6552 
6553   return new (Importer.getToContext()) CXXNewExpr(
6554         Importer.getToContext(),
6555         CE->isGlobalNew(),
6556         OperatorNewDecl, OperatorDeleteDecl,
6557         CE->passAlignment(),
6558         CE->doesUsualArrayDeleteWantSize(),
6559         PlacementArgs,
6560         Importer.Import(CE->getTypeIdParens()),
6561         ToArrSize, CE->getInitializationStyle(), ToInit, T, TInfo,
6562         Importer.Import(CE->getSourceRange()),
6563         Importer.Import(CE->getDirectInitRange()));
6564 }
6565 
6566 Expr *ASTNodeImporter::VisitCXXDeleteExpr(CXXDeleteExpr *E) {
6567   QualType T = Importer.Import(E->getType());
6568   if (T.isNull())
6569     return nullptr;
6570 
6571   FunctionDecl *OperatorDeleteDecl = cast_or_null<FunctionDecl>(
6572         Importer.Import(E->getOperatorDelete()));
6573   if (!OperatorDeleteDecl && E->getOperatorDelete())
6574     return nullptr;
6575 
6576   Expr *ToArg = Importer.Import(E->getArgument());
6577   if (!ToArg && E->getArgument())
6578     return nullptr;
6579 
6580   return new (Importer.getToContext()) CXXDeleteExpr(
6581         T, E->isGlobalDelete(),
6582         E->isArrayForm(),
6583         E->isArrayFormAsWritten(),
6584         E->doesUsualArrayDeleteWantSize(),
6585         OperatorDeleteDecl,
6586         ToArg,
6587         Importer.Import(E->getLocStart()));
6588 }
6589 
6590 Expr *ASTNodeImporter::VisitCXXConstructExpr(CXXConstructExpr *E) {
6591   QualType T = Importer.Import(E->getType());
6592   if (T.isNull())
6593     return nullptr;
6594 
6595   CXXConstructorDecl *ToCCD =
6596     dyn_cast_or_null<CXXConstructorDecl>(Importer.Import(E->getConstructor()));
6597   if (!ToCCD)
6598     return nullptr;
6599 
6600   SmallVector<Expr *, 6> ToArgs(E->getNumArgs());
6601   if (ImportContainerChecked(E->arguments(), ToArgs))
6602     return nullptr;
6603 
6604   return CXXConstructExpr::Create(Importer.getToContext(), T,
6605                                   Importer.Import(E->getLocation()),
6606                                   ToCCD, E->isElidable(),
6607                                   ToArgs, E->hadMultipleCandidates(),
6608                                   E->isListInitialization(),
6609                                   E->isStdInitListInitialization(),
6610                                   E->requiresZeroInitialization(),
6611                                   E->getConstructionKind(),
6612                                   Importer.Import(E->getParenOrBraceRange()));
6613 }
6614 
6615 Expr *ASTNodeImporter::VisitExprWithCleanups(ExprWithCleanups *EWC) {
6616   Expr *SubExpr = Importer.Import(EWC->getSubExpr());
6617   if (!SubExpr && EWC->getSubExpr())
6618     return nullptr;
6619 
6620   SmallVector<ExprWithCleanups::CleanupObject, 8> Objs(EWC->getNumObjects());
6621   for (unsigned I = 0, E = EWC->getNumObjects(); I < E; I++)
6622     if (ExprWithCleanups::CleanupObject Obj =
6623         cast_or_null<BlockDecl>(Importer.Import(EWC->getObject(I))))
6624       Objs[I] = Obj;
6625     else
6626       return nullptr;
6627 
6628   return ExprWithCleanups::Create(Importer.getToContext(),
6629                                   SubExpr, EWC->cleanupsHaveSideEffects(),
6630                                   Objs);
6631 }
6632 
6633 Expr *ASTNodeImporter::VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {
6634   QualType T = Importer.Import(E->getType());
6635   if (T.isNull())
6636     return nullptr;
6637 
6638   Expr *ToFn = Importer.Import(E->getCallee());
6639   if (!ToFn)
6640     return nullptr;
6641 
6642   SmallVector<Expr *, 4> ToArgs(E->getNumArgs());
6643   if (ImportContainerChecked(E->arguments(), ToArgs))
6644     return nullptr;
6645 
6646   return new (Importer.getToContext()) CXXMemberCallExpr(
6647         Importer.getToContext(), ToFn, ToArgs, T, E->getValueKind(),
6648         Importer.Import(E->getRParenLoc()));
6649 }
6650 
6651 Expr *ASTNodeImporter::VisitCXXThisExpr(CXXThisExpr *E) {
6652   QualType T = Importer.Import(E->getType());
6653   if (T.isNull())
6654     return nullptr;
6655 
6656   return new (Importer.getToContext())
6657   CXXThisExpr(Importer.Import(E->getLocation()), T, E->isImplicit());
6658 }
6659 
6660 Expr *ASTNodeImporter::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
6661   QualType T = Importer.Import(E->getType());
6662   if (T.isNull())
6663     return nullptr;
6664 
6665   return new (Importer.getToContext())
6666   CXXBoolLiteralExpr(E->getValue(), T, Importer.Import(E->getLocation()));
6667 }
6668 
6669 
6670 Expr *ASTNodeImporter::VisitMemberExpr(MemberExpr *E) {
6671   QualType T = Importer.Import(E->getType());
6672   if (T.isNull())
6673     return nullptr;
6674 
6675   Expr *ToBase = Importer.Import(E->getBase());
6676   if (!ToBase && E->getBase())
6677     return nullptr;
6678 
6679   ValueDecl *ToMember = dyn_cast<ValueDecl>(Importer.Import(E->getMemberDecl()));
6680   if (!ToMember && E->getMemberDecl())
6681     return nullptr;
6682 
6683   DeclAccessPair ToFoundDecl = DeclAccessPair::make(
6684     dyn_cast<NamedDecl>(Importer.Import(E->getFoundDecl().getDecl())),
6685     E->getFoundDecl().getAccess());
6686 
6687   DeclarationNameInfo ToMemberNameInfo(
6688     Importer.Import(E->getMemberNameInfo().getName()),
6689     Importer.Import(E->getMemberNameInfo().getLoc()));
6690 
6691   if (E->hasExplicitTemplateArgs()) {
6692     return nullptr; // FIXME: handle template arguments
6693   }
6694 
6695   return MemberExpr::Create(Importer.getToContext(), ToBase,
6696                             E->isArrow(),
6697                             Importer.Import(E->getOperatorLoc()),
6698                             Importer.Import(E->getQualifierLoc()),
6699                             Importer.Import(E->getTemplateKeywordLoc()),
6700                             ToMember, ToFoundDecl, ToMemberNameInfo,
6701                             nullptr, T, E->getValueKind(),
6702                             E->getObjectKind());
6703 }
6704 
6705 Expr *ASTNodeImporter::VisitCallExpr(CallExpr *E) {
6706   QualType T = Importer.Import(E->getType());
6707   if (T.isNull())
6708     return nullptr;
6709 
6710   Expr *ToCallee = Importer.Import(E->getCallee());
6711   if (!ToCallee && E->getCallee())
6712     return nullptr;
6713 
6714   unsigned NumArgs = E->getNumArgs();
6715 
6716   llvm::SmallVector<Expr *, 2> ToArgs(NumArgs);
6717 
6718   for (unsigned ai = 0, ae = NumArgs; ai != ae; ++ai) {
6719     Expr *FromArg = E->getArg(ai);
6720     Expr *ToArg = Importer.Import(FromArg);
6721     if (!ToArg)
6722       return nullptr;
6723     ToArgs[ai] = ToArg;
6724   }
6725 
6726   Expr **ToArgs_Copied = new (Importer.getToContext())
6727     Expr*[NumArgs];
6728 
6729   for (unsigned ai = 0, ae = NumArgs; ai != ae; ++ai)
6730     ToArgs_Copied[ai] = ToArgs[ai];
6731 
6732   return new (Importer.getToContext())
6733     CallExpr(Importer.getToContext(), ToCallee,
6734              llvm::makeArrayRef(ToArgs_Copied, NumArgs), T, E->getValueKind(),
6735              Importer.Import(E->getRParenLoc()));
6736 }
6737 
6738 Expr *ASTNodeImporter::VisitInitListExpr(InitListExpr *ILE) {
6739   QualType T = Importer.Import(ILE->getType());
6740   if (T.isNull())
6741     return nullptr;
6742 
6743   llvm::SmallVector<Expr *, 4> Exprs(ILE->getNumInits());
6744   if (ImportContainerChecked(ILE->inits(), Exprs))
6745     return nullptr;
6746 
6747   ASTContext &ToCtx = Importer.getToContext();
6748   InitListExpr *To = new (ToCtx) InitListExpr(
6749         ToCtx, Importer.Import(ILE->getLBraceLoc()),
6750         Exprs, Importer.Import(ILE->getLBraceLoc()));
6751   To->setType(T);
6752 
6753   if (ILE->hasArrayFiller()) {
6754     Expr *Filler = Importer.Import(ILE->getArrayFiller());
6755     if (!Filler)
6756       return nullptr;
6757     To->setArrayFiller(Filler);
6758   }
6759 
6760   if (FieldDecl *FromFD = ILE->getInitializedFieldInUnion()) {
6761     FieldDecl *ToFD = cast_or_null<FieldDecl>(Importer.Import(FromFD));
6762     if (!ToFD)
6763       return nullptr;
6764     To->setInitializedFieldInUnion(ToFD);
6765   }
6766 
6767   if (InitListExpr *SyntForm = ILE->getSyntacticForm()) {
6768     InitListExpr *ToSyntForm = cast_or_null<InitListExpr>(
6769           Importer.Import(SyntForm));
6770     if (!ToSyntForm)
6771       return nullptr;
6772     To->setSyntacticForm(ToSyntForm);
6773   }
6774 
6775   To->sawArrayRangeDesignator(ILE->hadArrayRangeDesignator());
6776   To->setValueDependent(ILE->isValueDependent());
6777   To->setInstantiationDependent(ILE->isInstantiationDependent());
6778 
6779   return To;
6780 }
6781 
6782 Expr *ASTNodeImporter::VisitArrayInitLoopExpr(ArrayInitLoopExpr *E) {
6783   QualType ToType = Importer.Import(E->getType());
6784   if (ToType.isNull())
6785     return nullptr;
6786 
6787   Expr *ToCommon = Importer.Import(E->getCommonExpr());
6788   if (!ToCommon && E->getCommonExpr())
6789     return nullptr;
6790 
6791   Expr *ToSubExpr = Importer.Import(E->getSubExpr());
6792   if (!ToSubExpr && E->getSubExpr())
6793     return nullptr;
6794 
6795   return new (Importer.getToContext())
6796       ArrayInitLoopExpr(ToType, ToCommon, ToSubExpr);
6797 }
6798 
6799 Expr *ASTNodeImporter::VisitArrayInitIndexExpr(ArrayInitIndexExpr *E) {
6800   QualType ToType = Importer.Import(E->getType());
6801   if (ToType.isNull())
6802     return nullptr;
6803   return new (Importer.getToContext()) ArrayInitIndexExpr(ToType);
6804 }
6805 
6806 Expr *ASTNodeImporter::VisitCXXDefaultInitExpr(CXXDefaultInitExpr *DIE) {
6807   FieldDecl *ToField = llvm::dyn_cast_or_null<FieldDecl>(
6808       Importer.Import(DIE->getField()));
6809   if (!ToField && DIE->getField())
6810     return nullptr;
6811 
6812   return CXXDefaultInitExpr::Create(
6813       Importer.getToContext(), Importer.Import(DIE->getLocStart()), ToField);
6814 }
6815 
6816 Expr *ASTNodeImporter::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) {
6817   QualType ToType = Importer.Import(E->getType());
6818   if (ToType.isNull() && !E->getType().isNull())
6819     return nullptr;
6820   ExprValueKind VK = E->getValueKind();
6821   CastKind CK = E->getCastKind();
6822   Expr *ToOp = Importer.Import(E->getSubExpr());
6823   if (!ToOp && E->getSubExpr())
6824     return nullptr;
6825   CXXCastPath BasePath;
6826   if (ImportCastPath(E, BasePath))
6827     return nullptr;
6828   TypeSourceInfo *ToWritten = Importer.Import(E->getTypeInfoAsWritten());
6829   SourceLocation ToOperatorLoc = Importer.Import(E->getOperatorLoc());
6830   SourceLocation ToRParenLoc = Importer.Import(E->getRParenLoc());
6831   SourceRange ToAngleBrackets = Importer.Import(E->getAngleBrackets());
6832 
6833   if (isa<CXXStaticCastExpr>(E)) {
6834     return CXXStaticCastExpr::Create(
6835         Importer.getToContext(), ToType, VK, CK, ToOp, &BasePath,
6836         ToWritten, ToOperatorLoc, ToRParenLoc, ToAngleBrackets);
6837   } else if (isa<CXXDynamicCastExpr>(E)) {
6838     return CXXDynamicCastExpr::Create(
6839         Importer.getToContext(), ToType, VK, CK, ToOp, &BasePath,
6840         ToWritten, ToOperatorLoc, ToRParenLoc, ToAngleBrackets);
6841   } else if (isa<CXXReinterpretCastExpr>(E)) {
6842     return CXXReinterpretCastExpr::Create(
6843         Importer.getToContext(), ToType, VK, CK, ToOp, &BasePath,
6844         ToWritten, ToOperatorLoc, ToRParenLoc, ToAngleBrackets);
6845   } else {
6846     return nullptr;
6847   }
6848 }
6849 
6850 
6851 Expr *ASTNodeImporter::VisitSubstNonTypeTemplateParmExpr(
6852     SubstNonTypeTemplateParmExpr *E) {
6853   QualType T = Importer.Import(E->getType());
6854   if (T.isNull())
6855     return nullptr;
6856 
6857   NonTypeTemplateParmDecl *Param = cast_or_null<NonTypeTemplateParmDecl>(
6858         Importer.Import(E->getParameter()));
6859   if (!Param)
6860     return nullptr;
6861 
6862   Expr *Replacement = Importer.Import(E->getReplacement());
6863   if (!Replacement)
6864     return nullptr;
6865 
6866   return new (Importer.getToContext()) SubstNonTypeTemplateParmExpr(
6867         T, E->getValueKind(), Importer.Import(E->getExprLoc()), Param,
6868         Replacement);
6869 }
6870 
6871 ASTImporter::ASTImporter(ASTContext &ToContext, FileManager &ToFileManager,
6872                          ASTContext &FromContext, FileManager &FromFileManager,
6873                          bool MinimalImport)
6874   : ToContext(ToContext), FromContext(FromContext),
6875     ToFileManager(ToFileManager), FromFileManager(FromFileManager),
6876     Minimal(MinimalImport), LastDiagFromFrom(false)
6877 {
6878   ImportedDecls[FromContext.getTranslationUnitDecl()]
6879     = ToContext.getTranslationUnitDecl();
6880 }
6881 
6882 ASTImporter::~ASTImporter() { }
6883 
6884 QualType ASTImporter::Import(QualType FromT) {
6885   if (FromT.isNull())
6886     return QualType();
6887 
6888   const Type *fromTy = FromT.getTypePtr();
6889 
6890   // Check whether we've already imported this type.
6891   llvm::DenseMap<const Type *, const Type *>::iterator Pos
6892     = ImportedTypes.find(fromTy);
6893   if (Pos != ImportedTypes.end())
6894     return ToContext.getQualifiedType(Pos->second, FromT.getLocalQualifiers());
6895 
6896   // Import the type
6897   ASTNodeImporter Importer(*this);
6898   QualType ToT = Importer.Visit(fromTy);
6899   if (ToT.isNull())
6900     return ToT;
6901 
6902   // Record the imported type.
6903   ImportedTypes[fromTy] = ToT.getTypePtr();
6904 
6905   return ToContext.getQualifiedType(ToT, FromT.getLocalQualifiers());
6906 }
6907 
6908 TypeSourceInfo *ASTImporter::Import(TypeSourceInfo *FromTSI) {
6909   if (!FromTSI)
6910     return FromTSI;
6911 
6912   // FIXME: For now we just create a "trivial" type source info based
6913   // on the type and a single location. Implement a real version of this.
6914   QualType T = Import(FromTSI->getType());
6915   if (T.isNull())
6916     return nullptr;
6917 
6918   return ToContext.getTrivialTypeSourceInfo(T,
6919            Import(FromTSI->getTypeLoc().getLocStart()));
6920 }
6921 
6922 Decl *ASTImporter::GetAlreadyImportedOrNull(Decl *FromD) {
6923   llvm::DenseMap<Decl *, Decl *>::iterator Pos = ImportedDecls.find(FromD);
6924   if (Pos != ImportedDecls.end()) {
6925     Decl *ToD = Pos->second;
6926     ASTNodeImporter(*this).ImportDefinitionIfNeeded(FromD, ToD);
6927     return ToD;
6928   } else {
6929     return nullptr;
6930   }
6931 }
6932 
6933 Decl *ASTImporter::Import(Decl *FromD) {
6934   if (!FromD)
6935     return nullptr;
6936 
6937   ASTNodeImporter Importer(*this);
6938 
6939   // Check whether we've already imported this declaration.
6940   llvm::DenseMap<Decl *, Decl *>::iterator Pos = ImportedDecls.find(FromD);
6941   if (Pos != ImportedDecls.end()) {
6942     Decl *ToD = Pos->second;
6943     Importer.ImportDefinitionIfNeeded(FromD, ToD);
6944     return ToD;
6945   }
6946 
6947   // Import the type
6948   Decl *ToD = Importer.Visit(FromD);
6949   if (!ToD)
6950     return nullptr;
6951 
6952   // Record the imported declaration.
6953   ImportedDecls[FromD] = ToD;
6954 
6955   if (TagDecl *FromTag = dyn_cast<TagDecl>(FromD)) {
6956     // Keep track of anonymous tags that have an associated typedef.
6957     if (FromTag->getTypedefNameForAnonDecl())
6958       AnonTagsWithPendingTypedefs.push_back(FromTag);
6959   } else if (TypedefNameDecl *FromTypedef = dyn_cast<TypedefNameDecl>(FromD)) {
6960     // When we've finished transforming a typedef, see whether it was the
6961     // typedef for an anonymous tag.
6962     for (SmallVectorImpl<TagDecl *>::iterator
6963                FromTag = AnonTagsWithPendingTypedefs.begin(),
6964             FromTagEnd = AnonTagsWithPendingTypedefs.end();
6965          FromTag != FromTagEnd; ++FromTag) {
6966       if ((*FromTag)->getTypedefNameForAnonDecl() == FromTypedef) {
6967         if (TagDecl *ToTag = cast_or_null<TagDecl>(Import(*FromTag))) {
6968           // We found the typedef for an anonymous tag; link them.
6969           ToTag->setTypedefNameForAnonDecl(cast<TypedefNameDecl>(ToD));
6970           AnonTagsWithPendingTypedefs.erase(FromTag);
6971           break;
6972         }
6973       }
6974     }
6975   }
6976 
6977   return ToD;
6978 }
6979 
6980 DeclContext *ASTImporter::ImportContext(DeclContext *FromDC) {
6981   if (!FromDC)
6982     return FromDC;
6983 
6984   DeclContext *ToDC = cast_or_null<DeclContext>(Import(cast<Decl>(FromDC)));
6985   if (!ToDC)
6986     return nullptr;
6987 
6988   // When we're using a record/enum/Objective-C class/protocol as a context, we
6989   // need it to have a definition.
6990   if (RecordDecl *ToRecord = dyn_cast<RecordDecl>(ToDC)) {
6991     RecordDecl *FromRecord = cast<RecordDecl>(FromDC);
6992     if (ToRecord->isCompleteDefinition()) {
6993       // Do nothing.
6994     } else if (FromRecord->isCompleteDefinition()) {
6995       ASTNodeImporter(*this).ImportDefinition(FromRecord, ToRecord,
6996                                               ASTNodeImporter::IDK_Basic);
6997     } else {
6998       CompleteDecl(ToRecord);
6999     }
7000   } else if (EnumDecl *ToEnum = dyn_cast<EnumDecl>(ToDC)) {
7001     EnumDecl *FromEnum = cast<EnumDecl>(FromDC);
7002     if (ToEnum->isCompleteDefinition()) {
7003       // Do nothing.
7004     } else if (FromEnum->isCompleteDefinition()) {
7005       ASTNodeImporter(*this).ImportDefinition(FromEnum, ToEnum,
7006                                               ASTNodeImporter::IDK_Basic);
7007     } else {
7008       CompleteDecl(ToEnum);
7009     }
7010   } else if (ObjCInterfaceDecl *ToClass = dyn_cast<ObjCInterfaceDecl>(ToDC)) {
7011     ObjCInterfaceDecl *FromClass = cast<ObjCInterfaceDecl>(FromDC);
7012     if (ToClass->getDefinition()) {
7013       // Do nothing.
7014     } else if (ObjCInterfaceDecl *FromDef = FromClass->getDefinition()) {
7015       ASTNodeImporter(*this).ImportDefinition(FromDef, ToClass,
7016                                               ASTNodeImporter::IDK_Basic);
7017     } else {
7018       CompleteDecl(ToClass);
7019     }
7020   } else if (ObjCProtocolDecl *ToProto = dyn_cast<ObjCProtocolDecl>(ToDC)) {
7021     ObjCProtocolDecl *FromProto = cast<ObjCProtocolDecl>(FromDC);
7022     if (ToProto->getDefinition()) {
7023       // Do nothing.
7024     } else if (ObjCProtocolDecl *FromDef = FromProto->getDefinition()) {
7025       ASTNodeImporter(*this).ImportDefinition(FromDef, ToProto,
7026                                               ASTNodeImporter::IDK_Basic);
7027     } else {
7028       CompleteDecl(ToProto);
7029     }
7030   }
7031 
7032   return ToDC;
7033 }
7034 
7035 Expr *ASTImporter::Import(Expr *FromE) {
7036   if (!FromE)
7037     return nullptr;
7038 
7039   return cast_or_null<Expr>(Import(cast<Stmt>(FromE)));
7040 }
7041 
7042 Stmt *ASTImporter::Import(Stmt *FromS) {
7043   if (!FromS)
7044     return nullptr;
7045 
7046   // Check whether we've already imported this declaration.
7047   llvm::DenseMap<Stmt *, Stmt *>::iterator Pos = ImportedStmts.find(FromS);
7048   if (Pos != ImportedStmts.end())
7049     return Pos->second;
7050 
7051   // Import the type
7052   ASTNodeImporter Importer(*this);
7053   Stmt *ToS = Importer.Visit(FromS);
7054   if (!ToS)
7055     return nullptr;
7056 
7057   // Record the imported declaration.
7058   ImportedStmts[FromS] = ToS;
7059   return ToS;
7060 }
7061 
7062 NestedNameSpecifier *ASTImporter::Import(NestedNameSpecifier *FromNNS) {
7063   if (!FromNNS)
7064     return nullptr;
7065 
7066   NestedNameSpecifier *prefix = Import(FromNNS->getPrefix());
7067 
7068   switch (FromNNS->getKind()) {
7069   case NestedNameSpecifier::Identifier:
7070     if (IdentifierInfo *II = Import(FromNNS->getAsIdentifier())) {
7071       return NestedNameSpecifier::Create(ToContext, prefix, II);
7072     }
7073     return nullptr;
7074 
7075   case NestedNameSpecifier::Namespace:
7076     if (NamespaceDecl *NS =
7077           cast_or_null<NamespaceDecl>(Import(FromNNS->getAsNamespace()))) {
7078       return NestedNameSpecifier::Create(ToContext, prefix, NS);
7079     }
7080     return nullptr;
7081 
7082   case NestedNameSpecifier::NamespaceAlias:
7083     if (NamespaceAliasDecl *NSAD =
7084           cast_or_null<NamespaceAliasDecl>(Import(FromNNS->getAsNamespaceAlias()))) {
7085       return NestedNameSpecifier::Create(ToContext, prefix, NSAD);
7086     }
7087     return nullptr;
7088 
7089   case NestedNameSpecifier::Global:
7090     return NestedNameSpecifier::GlobalSpecifier(ToContext);
7091 
7092   case NestedNameSpecifier::Super:
7093     if (CXXRecordDecl *RD =
7094             cast_or_null<CXXRecordDecl>(Import(FromNNS->getAsRecordDecl()))) {
7095       return NestedNameSpecifier::SuperSpecifier(ToContext, RD);
7096     }
7097     return nullptr;
7098 
7099   case NestedNameSpecifier::TypeSpec:
7100   case NestedNameSpecifier::TypeSpecWithTemplate: {
7101       QualType T = Import(QualType(FromNNS->getAsType(), 0u));
7102       if (!T.isNull()) {
7103         bool bTemplate = FromNNS->getKind() ==
7104                          NestedNameSpecifier::TypeSpecWithTemplate;
7105         return NestedNameSpecifier::Create(ToContext, prefix,
7106                                            bTemplate, T.getTypePtr());
7107       }
7108     }
7109       return nullptr;
7110   }
7111 
7112   llvm_unreachable("Invalid nested name specifier kind");
7113 }
7114 
7115 NestedNameSpecifierLoc ASTImporter::Import(NestedNameSpecifierLoc FromNNS) {
7116   // Copied from NestedNameSpecifier mostly.
7117   SmallVector<NestedNameSpecifierLoc , 8> NestedNames;
7118   NestedNameSpecifierLoc NNS = FromNNS;
7119 
7120   // Push each of the nested-name-specifiers's onto a stack for
7121   // serialization in reverse order.
7122   while (NNS) {
7123     NestedNames.push_back(NNS);
7124     NNS = NNS.getPrefix();
7125   }
7126 
7127   NestedNameSpecifierLocBuilder Builder;
7128 
7129   while (!NestedNames.empty()) {
7130     NNS = NestedNames.pop_back_val();
7131     NestedNameSpecifier *Spec = Import(NNS.getNestedNameSpecifier());
7132     if (!Spec)
7133       return NestedNameSpecifierLoc();
7134 
7135     NestedNameSpecifier::SpecifierKind Kind = Spec->getKind();
7136     switch (Kind) {
7137     case NestedNameSpecifier::Identifier:
7138       Builder.Extend(getToContext(),
7139                      Spec->getAsIdentifier(),
7140                      Import(NNS.getLocalBeginLoc()),
7141                      Import(NNS.getLocalEndLoc()));
7142       break;
7143 
7144     case NestedNameSpecifier::Namespace:
7145       Builder.Extend(getToContext(),
7146                      Spec->getAsNamespace(),
7147                      Import(NNS.getLocalBeginLoc()),
7148                      Import(NNS.getLocalEndLoc()));
7149       break;
7150 
7151     case NestedNameSpecifier::NamespaceAlias:
7152       Builder.Extend(getToContext(),
7153                      Spec->getAsNamespaceAlias(),
7154                      Import(NNS.getLocalBeginLoc()),
7155                      Import(NNS.getLocalEndLoc()));
7156       break;
7157 
7158     case NestedNameSpecifier::TypeSpec:
7159     case NestedNameSpecifier::TypeSpecWithTemplate: {
7160       TypeSourceInfo *TSI = getToContext().getTrivialTypeSourceInfo(
7161             QualType(Spec->getAsType(), 0));
7162       Builder.Extend(getToContext(),
7163                      Import(NNS.getLocalBeginLoc()),
7164                      TSI->getTypeLoc(),
7165                      Import(NNS.getLocalEndLoc()));
7166       break;
7167     }
7168 
7169     case NestedNameSpecifier::Global:
7170       Builder.MakeGlobal(getToContext(), Import(NNS.getLocalBeginLoc()));
7171       break;
7172 
7173     case NestedNameSpecifier::Super: {
7174       SourceRange ToRange = Import(NNS.getSourceRange());
7175       Builder.MakeSuper(getToContext(),
7176                         Spec->getAsRecordDecl(),
7177                         ToRange.getBegin(),
7178                         ToRange.getEnd());
7179     }
7180   }
7181   }
7182 
7183   return Builder.getWithLocInContext(getToContext());
7184 }
7185 
7186 TemplateName ASTImporter::Import(TemplateName From) {
7187   switch (From.getKind()) {
7188   case TemplateName::Template:
7189     if (TemplateDecl *ToTemplate
7190                 = cast_or_null<TemplateDecl>(Import(From.getAsTemplateDecl())))
7191       return TemplateName(ToTemplate);
7192 
7193     return TemplateName();
7194 
7195   case TemplateName::OverloadedTemplate: {
7196     OverloadedTemplateStorage *FromStorage = From.getAsOverloadedTemplate();
7197     UnresolvedSet<2> ToTemplates;
7198     for (OverloadedTemplateStorage::iterator I = FromStorage->begin(),
7199                                              E = FromStorage->end();
7200          I != E; ++I) {
7201       if (NamedDecl *To = cast_or_null<NamedDecl>(Import(*I)))
7202         ToTemplates.addDecl(To);
7203       else
7204         return TemplateName();
7205     }
7206     return ToContext.getOverloadedTemplateName(ToTemplates.begin(),
7207                                                ToTemplates.end());
7208   }
7209 
7210   case TemplateName::QualifiedTemplate: {
7211     QualifiedTemplateName *QTN = From.getAsQualifiedTemplateName();
7212     NestedNameSpecifier *Qualifier = Import(QTN->getQualifier());
7213     if (!Qualifier)
7214       return TemplateName();
7215 
7216     if (TemplateDecl *ToTemplate
7217         = cast_or_null<TemplateDecl>(Import(From.getAsTemplateDecl())))
7218       return ToContext.getQualifiedTemplateName(Qualifier,
7219                                                 QTN->hasTemplateKeyword(),
7220                                                 ToTemplate);
7221 
7222     return TemplateName();
7223   }
7224 
7225   case TemplateName::DependentTemplate: {
7226     DependentTemplateName *DTN = From.getAsDependentTemplateName();
7227     NestedNameSpecifier *Qualifier = Import(DTN->getQualifier());
7228     if (!Qualifier)
7229       return TemplateName();
7230 
7231     if (DTN->isIdentifier()) {
7232       return ToContext.getDependentTemplateName(Qualifier,
7233                                                 Import(DTN->getIdentifier()));
7234     }
7235 
7236     return ToContext.getDependentTemplateName(Qualifier, DTN->getOperator());
7237   }
7238 
7239   case TemplateName::SubstTemplateTemplateParm: {
7240     SubstTemplateTemplateParmStorage *subst
7241       = From.getAsSubstTemplateTemplateParm();
7242     TemplateTemplateParmDecl *param
7243       = cast_or_null<TemplateTemplateParmDecl>(Import(subst->getParameter()));
7244     if (!param)
7245       return TemplateName();
7246 
7247     TemplateName replacement = Import(subst->getReplacement());
7248     if (replacement.isNull()) return TemplateName();
7249 
7250     return ToContext.getSubstTemplateTemplateParm(param, replacement);
7251   }
7252 
7253   case TemplateName::SubstTemplateTemplateParmPack: {
7254     SubstTemplateTemplateParmPackStorage *SubstPack
7255       = From.getAsSubstTemplateTemplateParmPack();
7256     TemplateTemplateParmDecl *Param
7257       = cast_or_null<TemplateTemplateParmDecl>(
7258                                         Import(SubstPack->getParameterPack()));
7259     if (!Param)
7260       return TemplateName();
7261 
7262     ASTNodeImporter Importer(*this);
7263     TemplateArgument ArgPack
7264       = Importer.ImportTemplateArgument(SubstPack->getArgumentPack());
7265     if (ArgPack.isNull())
7266       return TemplateName();
7267 
7268     return ToContext.getSubstTemplateTemplateParmPack(Param, ArgPack);
7269   }
7270   }
7271 
7272   llvm_unreachable("Invalid template name kind");
7273 }
7274 
7275 SourceLocation ASTImporter::Import(SourceLocation FromLoc) {
7276   if (FromLoc.isInvalid())
7277     return SourceLocation();
7278 
7279   SourceManager &FromSM = FromContext.getSourceManager();
7280 
7281   // For now, map everything down to its file location, so that we
7282   // don't have to import macro expansions.
7283   // FIXME: Import macro expansions!
7284   FromLoc = FromSM.getFileLoc(FromLoc);
7285   std::pair<FileID, unsigned> Decomposed = FromSM.getDecomposedLoc(FromLoc);
7286   SourceManager &ToSM = ToContext.getSourceManager();
7287   FileID ToFileID = Import(Decomposed.first);
7288   if (ToFileID.isInvalid())
7289     return SourceLocation();
7290   SourceLocation ret = ToSM.getLocForStartOfFile(ToFileID)
7291                            .getLocWithOffset(Decomposed.second);
7292   return ret;
7293 }
7294 
7295 SourceRange ASTImporter::Import(SourceRange FromRange) {
7296   return SourceRange(Import(FromRange.getBegin()), Import(FromRange.getEnd()));
7297 }
7298 
7299 FileID ASTImporter::Import(FileID FromID) {
7300   llvm::DenseMap<FileID, FileID>::iterator Pos
7301     = ImportedFileIDs.find(FromID);
7302   if (Pos != ImportedFileIDs.end())
7303     return Pos->second;
7304 
7305   SourceManager &FromSM = FromContext.getSourceManager();
7306   SourceManager &ToSM = ToContext.getSourceManager();
7307   const SrcMgr::SLocEntry &FromSLoc = FromSM.getSLocEntry(FromID);
7308   assert(FromSLoc.isFile() && "Cannot handle macro expansions yet");
7309 
7310   // Include location of this file.
7311   SourceLocation ToIncludeLoc = Import(FromSLoc.getFile().getIncludeLoc());
7312 
7313   // Map the FileID for to the "to" source manager.
7314   FileID ToID;
7315   const SrcMgr::ContentCache *Cache = FromSLoc.getFile().getContentCache();
7316   if (Cache->OrigEntry && Cache->OrigEntry->getDir()) {
7317     // FIXME: We probably want to use getVirtualFile(), so we don't hit the
7318     // disk again
7319     // FIXME: We definitely want to re-use the existing MemoryBuffer, rather
7320     // than mmap the files several times.
7321     const FileEntry *Entry = ToFileManager.getFile(Cache->OrigEntry->getName());
7322     if (!Entry)
7323       return FileID();
7324     ToID = ToSM.createFileID(Entry, ToIncludeLoc,
7325                              FromSLoc.getFile().getFileCharacteristic());
7326   } else {
7327     // FIXME: We want to re-use the existing MemoryBuffer!
7328     const llvm::MemoryBuffer *
7329         FromBuf = Cache->getBuffer(FromContext.getDiagnostics(), FromSM);
7330     std::unique_ptr<llvm::MemoryBuffer> ToBuf
7331       = llvm::MemoryBuffer::getMemBufferCopy(FromBuf->getBuffer(),
7332                                              FromBuf->getBufferIdentifier());
7333     ToID = ToSM.createFileID(std::move(ToBuf),
7334                              FromSLoc.getFile().getFileCharacteristic());
7335   }
7336 
7337 
7338   ImportedFileIDs[FromID] = ToID;
7339   return ToID;
7340 }
7341 
7342 CXXCtorInitializer *ASTImporter::Import(CXXCtorInitializer *From) {
7343   Expr *ToExpr = Import(From->getInit());
7344   if (!ToExpr && From->getInit())
7345     return nullptr;
7346 
7347   if (From->isBaseInitializer()) {
7348     TypeSourceInfo *ToTInfo = Import(From->getTypeSourceInfo());
7349     if (!ToTInfo && From->getTypeSourceInfo())
7350       return nullptr;
7351 
7352     return new (ToContext) CXXCtorInitializer(
7353         ToContext, ToTInfo, From->isBaseVirtual(), Import(From->getLParenLoc()),
7354         ToExpr, Import(From->getRParenLoc()),
7355         From->isPackExpansion() ? Import(From->getEllipsisLoc())
7356                                 : SourceLocation());
7357   } else if (From->isMemberInitializer()) {
7358     FieldDecl *ToField =
7359         llvm::cast_or_null<FieldDecl>(Import(From->getMember()));
7360     if (!ToField && From->getMember())
7361       return nullptr;
7362 
7363     return new (ToContext) CXXCtorInitializer(
7364         ToContext, ToField, Import(From->getMemberLocation()),
7365         Import(From->getLParenLoc()), ToExpr, Import(From->getRParenLoc()));
7366   } else if (From->isIndirectMemberInitializer()) {
7367     IndirectFieldDecl *ToIField = llvm::cast_or_null<IndirectFieldDecl>(
7368         Import(From->getIndirectMember()));
7369     if (!ToIField && From->getIndirectMember())
7370       return nullptr;
7371 
7372     return new (ToContext) CXXCtorInitializer(
7373         ToContext, ToIField, Import(From->getMemberLocation()),
7374         Import(From->getLParenLoc()), ToExpr, Import(From->getRParenLoc()));
7375   } else if (From->isDelegatingInitializer()) {
7376     TypeSourceInfo *ToTInfo = Import(From->getTypeSourceInfo());
7377     if (!ToTInfo && From->getTypeSourceInfo())
7378       return nullptr;
7379 
7380     return new (ToContext)
7381         CXXCtorInitializer(ToContext, ToTInfo, Import(From->getLParenLoc()),
7382                            ToExpr, Import(From->getRParenLoc()));
7383   } else {
7384     return nullptr;
7385   }
7386 }
7387 
7388 
7389 CXXBaseSpecifier *ASTImporter::Import(const CXXBaseSpecifier *BaseSpec) {
7390   auto Pos = ImportedCXXBaseSpecifiers.find(BaseSpec);
7391   if (Pos != ImportedCXXBaseSpecifiers.end())
7392     return Pos->second;
7393 
7394   CXXBaseSpecifier *Imported = new (ToContext) CXXBaseSpecifier(
7395         Import(BaseSpec->getSourceRange()),
7396         BaseSpec->isVirtual(), BaseSpec->isBaseOfClass(),
7397         BaseSpec->getAccessSpecifierAsWritten(),
7398         Import(BaseSpec->getTypeSourceInfo()),
7399         Import(BaseSpec->getEllipsisLoc()));
7400   ImportedCXXBaseSpecifiers[BaseSpec] = Imported;
7401   return Imported;
7402 }
7403 
7404 void ASTImporter::ImportDefinition(Decl *From) {
7405   Decl *To = Import(From);
7406   if (!To)
7407     return;
7408 
7409   if (DeclContext *FromDC = cast<DeclContext>(From)) {
7410     ASTNodeImporter Importer(*this);
7411 
7412     if (RecordDecl *ToRecord = dyn_cast<RecordDecl>(To)) {
7413       if (!ToRecord->getDefinition()) {
7414         Importer.ImportDefinition(cast<RecordDecl>(FromDC), ToRecord,
7415                                   ASTNodeImporter::IDK_Everything);
7416         return;
7417       }
7418     }
7419 
7420     if (EnumDecl *ToEnum = dyn_cast<EnumDecl>(To)) {
7421       if (!ToEnum->getDefinition()) {
7422         Importer.ImportDefinition(cast<EnumDecl>(FromDC), ToEnum,
7423                                   ASTNodeImporter::IDK_Everything);
7424         return;
7425       }
7426     }
7427 
7428     if (ObjCInterfaceDecl *ToIFace = dyn_cast<ObjCInterfaceDecl>(To)) {
7429       if (!ToIFace->getDefinition()) {
7430         Importer.ImportDefinition(cast<ObjCInterfaceDecl>(FromDC), ToIFace,
7431                                   ASTNodeImporter::IDK_Everything);
7432         return;
7433       }
7434     }
7435 
7436     if (ObjCProtocolDecl *ToProto = dyn_cast<ObjCProtocolDecl>(To)) {
7437       if (!ToProto->getDefinition()) {
7438         Importer.ImportDefinition(cast<ObjCProtocolDecl>(FromDC), ToProto,
7439                                   ASTNodeImporter::IDK_Everything);
7440         return;
7441       }
7442     }
7443 
7444     Importer.ImportDeclContext(FromDC, true);
7445   }
7446 }
7447 
7448 DeclarationName ASTImporter::Import(DeclarationName FromName) {
7449   if (!FromName)
7450     return DeclarationName();
7451 
7452   switch (FromName.getNameKind()) {
7453   case DeclarationName::Identifier:
7454     return Import(FromName.getAsIdentifierInfo());
7455 
7456   case DeclarationName::ObjCZeroArgSelector:
7457   case DeclarationName::ObjCOneArgSelector:
7458   case DeclarationName::ObjCMultiArgSelector:
7459     return Import(FromName.getObjCSelector());
7460 
7461   case DeclarationName::CXXConstructorName: {
7462     QualType T = Import(FromName.getCXXNameType());
7463     if (T.isNull())
7464       return DeclarationName();
7465 
7466     return ToContext.DeclarationNames.getCXXConstructorName(
7467                                                ToContext.getCanonicalType(T));
7468   }
7469 
7470   case DeclarationName::CXXDestructorName: {
7471     QualType T = Import(FromName.getCXXNameType());
7472     if (T.isNull())
7473       return DeclarationName();
7474 
7475     return ToContext.DeclarationNames.getCXXDestructorName(
7476                                                ToContext.getCanonicalType(T));
7477   }
7478 
7479   case DeclarationName::CXXDeductionGuideName: {
7480     TemplateDecl *Template = cast_or_null<TemplateDecl>(
7481         Import(FromName.getCXXDeductionGuideTemplate()));
7482     if (!Template)
7483       return DeclarationName();
7484     return ToContext.DeclarationNames.getCXXDeductionGuideName(Template);
7485   }
7486 
7487   case DeclarationName::CXXConversionFunctionName: {
7488     QualType T = Import(FromName.getCXXNameType());
7489     if (T.isNull())
7490       return DeclarationName();
7491 
7492     return ToContext.DeclarationNames.getCXXConversionFunctionName(
7493                                                ToContext.getCanonicalType(T));
7494   }
7495 
7496   case DeclarationName::CXXOperatorName:
7497     return ToContext.DeclarationNames.getCXXOperatorName(
7498                                           FromName.getCXXOverloadedOperator());
7499 
7500   case DeclarationName::CXXLiteralOperatorName:
7501     return ToContext.DeclarationNames.getCXXLiteralOperatorName(
7502                                    Import(FromName.getCXXLiteralIdentifier()));
7503 
7504   case DeclarationName::CXXUsingDirective:
7505     // FIXME: STATICS!
7506     return DeclarationName::getUsingDirectiveName();
7507   }
7508 
7509   llvm_unreachable("Invalid DeclarationName Kind!");
7510 }
7511 
7512 IdentifierInfo *ASTImporter::Import(const IdentifierInfo *FromId) {
7513   if (!FromId)
7514     return nullptr;
7515 
7516   IdentifierInfo *ToId = &ToContext.Idents.get(FromId->getName());
7517 
7518   if (!ToId->getBuiltinID() && FromId->getBuiltinID())
7519     ToId->setBuiltinID(FromId->getBuiltinID());
7520 
7521   return ToId;
7522 }
7523 
7524 Selector ASTImporter::Import(Selector FromSel) {
7525   if (FromSel.isNull())
7526     return Selector();
7527 
7528   SmallVector<IdentifierInfo *, 4> Idents;
7529   Idents.push_back(Import(FromSel.getIdentifierInfoForSlot(0)));
7530   for (unsigned I = 1, N = FromSel.getNumArgs(); I < N; ++I)
7531     Idents.push_back(Import(FromSel.getIdentifierInfoForSlot(I)));
7532   return ToContext.Selectors.getSelector(FromSel.getNumArgs(), Idents.data());
7533 }
7534 
7535 DeclarationName ASTImporter::HandleNameConflict(DeclarationName Name,
7536                                                 DeclContext *DC,
7537                                                 unsigned IDNS,
7538                                                 NamedDecl **Decls,
7539                                                 unsigned NumDecls) {
7540   return Name;
7541 }
7542 
7543 DiagnosticBuilder ASTImporter::ToDiag(SourceLocation Loc, unsigned DiagID) {
7544   if (LastDiagFromFrom)
7545     ToContext.getDiagnostics().notePriorDiagnosticFrom(
7546       FromContext.getDiagnostics());
7547   LastDiagFromFrom = false;
7548   return ToContext.getDiagnostics().Report(Loc, DiagID);
7549 }
7550 
7551 DiagnosticBuilder ASTImporter::FromDiag(SourceLocation Loc, unsigned DiagID) {
7552   if (!LastDiagFromFrom)
7553     FromContext.getDiagnostics().notePriorDiagnosticFrom(
7554       ToContext.getDiagnostics());
7555   LastDiagFromFrom = true;
7556   return FromContext.getDiagnostics().Report(Loc, DiagID);
7557 }
7558 
7559 void ASTImporter::CompleteDecl (Decl *D) {
7560   if (ObjCInterfaceDecl *ID = dyn_cast<ObjCInterfaceDecl>(D)) {
7561     if (!ID->getDefinition())
7562       ID->startDefinition();
7563   }
7564   else if (ObjCProtocolDecl *PD = dyn_cast<ObjCProtocolDecl>(D)) {
7565     if (!PD->getDefinition())
7566       PD->startDefinition();
7567   }
7568   else if (TagDecl *TD = dyn_cast<TagDecl>(D)) {
7569     if (!TD->getDefinition() && !TD->isBeingDefined()) {
7570       TD->startDefinition();
7571       TD->setCompleteDefinition(true);
7572     }
7573   }
7574   else {
7575     assert (0 && "CompleteDecl called on a Decl that can't be completed");
7576   }
7577 }
7578 
7579 Decl *ASTImporter::Imported(Decl *From, Decl *To) {
7580   if (From->hasAttrs()) {
7581     for (Attr *FromAttr : From->getAttrs())
7582       To->addAttr(FromAttr->clone(To->getASTContext()));
7583   }
7584   if (From->isUsed()) {
7585     To->setIsUsed();
7586   }
7587   if (From->isImplicit()) {
7588     To->setImplicit();
7589   }
7590   ImportedDecls[From] = To;
7591   return To;
7592 }
7593 
7594 bool ASTImporter::IsStructurallyEquivalent(QualType From, QualType To,
7595                                            bool Complain) {
7596   llvm::DenseMap<const Type *, const Type *>::iterator Pos
7597    = ImportedTypes.find(From.getTypePtr());
7598   if (Pos != ImportedTypes.end() && ToContext.hasSameType(Import(From), To))
7599     return true;
7600 
7601   StructuralEquivalenceContext Ctx(FromContext, ToContext, NonEquivalentDecls,
7602                                    false, Complain);
7603   return Ctx.IsStructurallyEquivalent(From, To);
7604 }
7605