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