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