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