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