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