1 //===--- ASTImporter.cpp - Importing ASTs from other Contexts ---*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file defines the ASTImporter class which imports AST nodes from one
11 // context into another context.
13 //===----------------------------------------------------------------------===//
14 #include "clang/AST/ASTImporter.h"
15 #include "clang/AST/ASTContext.h"
16 #include "clang/AST/ASTDiagnostic.h"
17 #include "clang/AST/DeclCXX.h"
18 #include "clang/AST/DeclObjC.h"
19 #include "clang/AST/DeclVisitor.h"
20 #include "clang/AST/StmtVisitor.h"
21 #include "clang/AST/TypeVisitor.h"
22 #include "clang/Basic/FileManager.h"
23 #include "clang/Basic/SourceManager.h"
24 #include "llvm/Support/MemoryBuffer.h"
28 class ASTNodeImporter : public TypeVisitor<ASTNodeImporter, QualType>,
29 public DeclVisitor<ASTNodeImporter, Decl *>,
30 public StmtVisitor<ASTNodeImporter, Stmt *> {
31 ASTImporter &Importer;
34 explicit ASTNodeImporter(ASTImporter &Importer) : Importer(Importer) { }
36 using TypeVisitor<ASTNodeImporter, QualType>::Visit;
37 using DeclVisitor<ASTNodeImporter, Decl *>::Visit;
38 using StmtVisitor<ASTNodeImporter, Stmt *>::Visit;
41 QualType VisitType(const Type *T);
42 QualType VisitBuiltinType(const BuiltinType *T);
43 QualType VisitComplexType(const ComplexType *T);
44 QualType VisitPointerType(const PointerType *T);
45 QualType VisitBlockPointerType(const BlockPointerType *T);
46 QualType VisitLValueReferenceType(const LValueReferenceType *T);
47 QualType VisitRValueReferenceType(const RValueReferenceType *T);
48 QualType VisitMemberPointerType(const MemberPointerType *T);
49 QualType VisitConstantArrayType(const ConstantArrayType *T);
50 QualType VisitIncompleteArrayType(const IncompleteArrayType *T);
51 QualType VisitVariableArrayType(const VariableArrayType *T);
52 // FIXME: DependentSizedArrayType
53 // FIXME: DependentSizedExtVectorType
54 QualType VisitVectorType(const VectorType *T);
55 QualType VisitExtVectorType(const ExtVectorType *T);
56 QualType VisitFunctionNoProtoType(const FunctionNoProtoType *T);
57 QualType VisitFunctionProtoType(const FunctionProtoType *T);
58 // FIXME: UnresolvedUsingType
59 QualType VisitParenType(const ParenType *T);
60 QualType VisitTypedefType(const TypedefType *T);
61 QualType VisitTypeOfExprType(const TypeOfExprType *T);
62 // FIXME: DependentTypeOfExprType
63 QualType VisitTypeOfType(const TypeOfType *T);
64 QualType VisitDecltypeType(const DecltypeType *T);
65 QualType VisitUnaryTransformType(const UnaryTransformType *T);
66 QualType VisitAutoType(const AutoType *T);
67 // FIXME: DependentDecltypeType
68 QualType VisitRecordType(const RecordType *T);
69 QualType VisitEnumType(const EnumType *T);
70 QualType VisitAttributedType(const AttributedType *T);
71 // FIXME: TemplateTypeParmType
72 // FIXME: SubstTemplateTypeParmType
73 QualType VisitTemplateSpecializationType(const TemplateSpecializationType *T);
74 QualType VisitElaboratedType(const ElaboratedType *T);
75 // FIXME: DependentNameType
76 // FIXME: DependentTemplateSpecializationType
77 QualType VisitObjCInterfaceType(const ObjCInterfaceType *T);
78 QualType VisitObjCObjectType(const ObjCObjectType *T);
79 QualType VisitObjCObjectPointerType(const ObjCObjectPointerType *T);
81 // Importing declarations
82 bool ImportDeclParts(NamedDecl *D, DeclContext *&DC,
83 DeclContext *&LexicalDC, DeclarationName &Name,
84 NamedDecl *&ToD, SourceLocation &Loc);
85 void ImportDefinitionIfNeeded(Decl *FromD, Decl *ToD = nullptr);
86 void ImportDeclarationNameLoc(const DeclarationNameInfo &From,
87 DeclarationNameInfo& To);
88 void ImportDeclContext(DeclContext *FromDC, bool ForceImport = false);
90 /// \brief What we should import from the definition.
91 enum ImportDefinitionKind {
92 /// \brief Import the default subset of the definition, which might be
93 /// nothing (if minimal import is set) or might be everything (if minimal
94 /// import is not set).
96 /// \brief Import everything.
98 /// \brief Import only the bare bones needed to establish a valid
103 bool shouldForceImportDeclContext(ImportDefinitionKind IDK) {
104 return IDK == IDK_Everything ||
105 (IDK == IDK_Default && !Importer.isMinimalImport());
108 bool ImportDefinition(RecordDecl *From, RecordDecl *To,
109 ImportDefinitionKind Kind = IDK_Default);
110 bool ImportDefinition(VarDecl *From, VarDecl *To,
111 ImportDefinitionKind Kind = IDK_Default);
112 bool ImportDefinition(EnumDecl *From, EnumDecl *To,
113 ImportDefinitionKind Kind = IDK_Default);
114 bool ImportDefinition(ObjCInterfaceDecl *From, ObjCInterfaceDecl *To,
115 ImportDefinitionKind Kind = IDK_Default);
116 bool ImportDefinition(ObjCProtocolDecl *From, ObjCProtocolDecl *To,
117 ImportDefinitionKind Kind = IDK_Default);
118 TemplateParameterList *ImportTemplateParameterList(
119 TemplateParameterList *Params);
120 TemplateArgument ImportTemplateArgument(const TemplateArgument &From);
121 bool ImportTemplateArguments(const TemplateArgument *FromArgs,
122 unsigned NumFromArgs,
123 SmallVectorImpl<TemplateArgument> &ToArgs);
124 bool IsStructuralMatch(RecordDecl *FromRecord, RecordDecl *ToRecord,
125 bool Complain = true);
126 bool IsStructuralMatch(VarDecl *FromVar, VarDecl *ToVar,
127 bool Complain = true);
128 bool IsStructuralMatch(EnumDecl *FromEnum, EnumDecl *ToRecord);
129 bool IsStructuralMatch(EnumConstantDecl *FromEC, EnumConstantDecl *ToEC);
130 bool IsStructuralMatch(ClassTemplateDecl *From, ClassTemplateDecl *To);
131 bool IsStructuralMatch(VarTemplateDecl *From, VarTemplateDecl *To);
132 Decl *VisitDecl(Decl *D);
133 Decl *VisitAccessSpecDecl(AccessSpecDecl *D);
134 Decl *VisitTranslationUnitDecl(TranslationUnitDecl *D);
135 Decl *VisitNamespaceDecl(NamespaceDecl *D);
136 Decl *VisitTypedefNameDecl(TypedefNameDecl *D, bool IsAlias);
137 Decl *VisitTypedefDecl(TypedefDecl *D);
138 Decl *VisitTypeAliasDecl(TypeAliasDecl *D);
139 Decl *VisitEnumDecl(EnumDecl *D);
140 Decl *VisitRecordDecl(RecordDecl *D);
141 Decl *VisitEnumConstantDecl(EnumConstantDecl *D);
142 Decl *VisitFunctionDecl(FunctionDecl *D);
143 Decl *VisitCXXMethodDecl(CXXMethodDecl *D);
144 Decl *VisitCXXConstructorDecl(CXXConstructorDecl *D);
145 Decl *VisitCXXDestructorDecl(CXXDestructorDecl *D);
146 Decl *VisitCXXConversionDecl(CXXConversionDecl *D);
147 Decl *VisitFieldDecl(FieldDecl *D);
148 Decl *VisitIndirectFieldDecl(IndirectFieldDecl *D);
149 Decl *VisitObjCIvarDecl(ObjCIvarDecl *D);
150 Decl *VisitVarDecl(VarDecl *D);
151 Decl *VisitImplicitParamDecl(ImplicitParamDecl *D);
152 Decl *VisitParmVarDecl(ParmVarDecl *D);
153 Decl *VisitObjCMethodDecl(ObjCMethodDecl *D);
154 Decl *VisitObjCTypeParamDecl(ObjCTypeParamDecl *D);
155 Decl *VisitObjCCategoryDecl(ObjCCategoryDecl *D);
156 Decl *VisitObjCProtocolDecl(ObjCProtocolDecl *D);
157 Decl *VisitLinkageSpecDecl(LinkageSpecDecl *D);
159 ObjCTypeParamList *ImportObjCTypeParamList(ObjCTypeParamList *list);
160 Decl *VisitObjCInterfaceDecl(ObjCInterfaceDecl *D);
161 Decl *VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D);
162 Decl *VisitObjCImplementationDecl(ObjCImplementationDecl *D);
163 Decl *VisitObjCPropertyDecl(ObjCPropertyDecl *D);
164 Decl *VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D);
165 Decl *VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D);
166 Decl *VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D);
167 Decl *VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D);
168 Decl *VisitClassTemplateDecl(ClassTemplateDecl *D);
169 Decl *VisitClassTemplateSpecializationDecl(
170 ClassTemplateSpecializationDecl *D);
171 Decl *VisitVarTemplateDecl(VarTemplateDecl *D);
172 Decl *VisitVarTemplateSpecializationDecl(VarTemplateSpecializationDecl *D);
174 // Importing statements
175 DeclGroupRef ImportDeclGroup(DeclGroupRef DG);
177 Stmt *VisitStmt(Stmt *S);
178 Stmt *VisitDeclStmt(DeclStmt *S);
179 Stmt *VisitNullStmt(NullStmt *S);
180 Stmt *VisitCompoundStmt(CompoundStmt *S);
181 Stmt *VisitCaseStmt(CaseStmt *S);
182 Stmt *VisitDefaultStmt(DefaultStmt *S);
183 Stmt *VisitLabelStmt(LabelStmt *S);
184 Stmt *VisitAttributedStmt(AttributedStmt *S);
185 Stmt *VisitIfStmt(IfStmt *S);
186 Stmt *VisitSwitchStmt(SwitchStmt *S);
187 Stmt *VisitWhileStmt(WhileStmt *S);
188 Stmt *VisitDoStmt(DoStmt *S);
189 Stmt *VisitForStmt(ForStmt *S);
190 Stmt *VisitGotoStmt(GotoStmt *S);
191 Stmt *VisitIndirectGotoStmt(IndirectGotoStmt *S);
192 Stmt *VisitContinueStmt(ContinueStmt *S);
193 Stmt *VisitBreakStmt(BreakStmt *S);
194 Stmt *VisitReturnStmt(ReturnStmt *S);
197 // FIXME: SEHExceptStmt
198 // FIXME: SEHFinallyStmt
200 // FIXME: SEHLeaveStmt
201 // FIXME: CapturedStmt
202 Stmt *VisitCXXCatchStmt(CXXCatchStmt *S);
203 Stmt *VisitCXXTryStmt(CXXTryStmt *S);
204 Stmt *VisitCXXForRangeStmt(CXXForRangeStmt *S);
205 // FIXME: MSDependentExistsStmt
206 Stmt *VisitObjCForCollectionStmt(ObjCForCollectionStmt *S);
207 Stmt *VisitObjCAtCatchStmt(ObjCAtCatchStmt *S);
208 Stmt *VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S);
209 Stmt *VisitObjCAtTryStmt(ObjCAtTryStmt *S);
210 Stmt *VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *S);
211 Stmt *VisitObjCAtThrowStmt(ObjCAtThrowStmt *S);
212 Stmt *VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt *S);
214 // Importing expressions
215 Expr *VisitExpr(Expr *E);
216 Expr *VisitDeclRefExpr(DeclRefExpr *E);
217 Expr *VisitIntegerLiteral(IntegerLiteral *E);
218 Expr *VisitCharacterLiteral(CharacterLiteral *E);
219 Expr *VisitParenExpr(ParenExpr *E);
220 Expr *VisitUnaryOperator(UnaryOperator *E);
221 Expr *VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E);
222 Expr *VisitBinaryOperator(BinaryOperator *E);
223 Expr *VisitCompoundAssignOperator(CompoundAssignOperator *E);
224 Expr *VisitImplicitCastExpr(ImplicitCastExpr *E);
225 Expr *VisitCStyleCastExpr(CStyleCastExpr *E);
226 Expr *VisitCXXConstructExpr(CXXConstructExpr *E);
227 Expr *VisitMemberExpr(MemberExpr *E);
228 Expr *VisitCallExpr(CallExpr *E);
231 using namespace clang;
233 //----------------------------------------------------------------------------
234 // Structural Equivalence
235 //----------------------------------------------------------------------------
238 struct StructuralEquivalenceContext {
239 /// \brief AST contexts for which we are checking structural equivalence.
242 /// \brief The set of "tentative" equivalences between two canonical
243 /// declarations, mapping from a declaration in the first context to the
244 /// declaration in the second context that we believe to be equivalent.
245 llvm::DenseMap<Decl *, Decl *> TentativeEquivalences;
247 /// \brief Queue of declarations in the first context whose equivalence
248 /// with a declaration in the second context still needs to be verified.
249 std::deque<Decl *> DeclsToCheck;
251 /// \brief Declaration (from, to) pairs that are known not to be equivalent
252 /// (which we have already complained about).
253 llvm::DenseSet<std::pair<Decl *, Decl *> > &NonEquivalentDecls;
255 /// \brief Whether we're being strict about the spelling of types when
256 /// unifying two types.
257 bool StrictTypeSpelling;
259 /// \brief Whether to complain about failures.
262 /// \brief \c true if the last diagnostic came from C2.
265 StructuralEquivalenceContext(ASTContext &C1, ASTContext &C2,
266 llvm::DenseSet<std::pair<Decl *, Decl *> > &NonEquivalentDecls,
267 bool StrictTypeSpelling = false,
268 bool Complain = true)
269 : C1(C1), C2(C2), NonEquivalentDecls(NonEquivalentDecls),
270 StrictTypeSpelling(StrictTypeSpelling), Complain(Complain),
271 LastDiagFromC2(false) {}
273 /// \brief Determine whether the two declarations are structurally
275 bool IsStructurallyEquivalent(Decl *D1, Decl *D2);
277 /// \brief Determine whether the two types are structurally equivalent.
278 bool IsStructurallyEquivalent(QualType T1, QualType T2);
281 /// \brief Finish checking all of the structural equivalences.
283 /// \returns true if an error occurred, false otherwise.
287 DiagnosticBuilder Diag1(SourceLocation Loc, unsigned DiagID) {
288 assert(Complain && "Not allowed to complain");
290 C1.getDiagnostics().notePriorDiagnosticFrom(C2.getDiagnostics());
291 LastDiagFromC2 = false;
292 return C1.getDiagnostics().Report(Loc, DiagID);
295 DiagnosticBuilder Diag2(SourceLocation Loc, unsigned DiagID) {
296 assert(Complain && "Not allowed to complain");
298 C2.getDiagnostics().notePriorDiagnosticFrom(C1.getDiagnostics());
299 LastDiagFromC2 = true;
300 return C2.getDiagnostics().Report(Loc, DiagID);
305 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
306 QualType T1, QualType T2);
307 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
310 /// \brief Determine structural equivalence of two expressions.
311 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
312 Expr *E1, Expr *E2) {
316 // FIXME: Actually perform a structural comparison!
320 /// \brief Determine whether two identifiers are equivalent.
321 static bool IsStructurallyEquivalent(const IdentifierInfo *Name1,
322 const IdentifierInfo *Name2) {
323 if (!Name1 || !Name2)
324 return Name1 == Name2;
326 return Name1->getName() == Name2->getName();
329 /// \brief Determine whether two nested-name-specifiers are equivalent.
330 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
331 NestedNameSpecifier *NNS1,
332 NestedNameSpecifier *NNS2) {
337 /// \brief Determine whether two template arguments are equivalent.
338 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
339 const TemplateArgument &Arg1,
340 const TemplateArgument &Arg2) {
341 if (Arg1.getKind() != Arg2.getKind())
344 switch (Arg1.getKind()) {
345 case TemplateArgument::Null:
348 case TemplateArgument::Type:
349 return Context.IsStructurallyEquivalent(Arg1.getAsType(), Arg2.getAsType());
351 case TemplateArgument::Integral:
352 if (!Context.IsStructurallyEquivalent(Arg1.getIntegralType(),
353 Arg2.getIntegralType()))
356 return llvm::APSInt::isSameValue(Arg1.getAsIntegral(), Arg2.getAsIntegral());
358 case TemplateArgument::Declaration:
359 return Context.IsStructurallyEquivalent(Arg1.getAsDecl(), Arg2.getAsDecl());
361 case TemplateArgument::NullPtr:
362 return true; // FIXME: Is this correct?
364 case TemplateArgument::Template:
365 return IsStructurallyEquivalent(Context,
366 Arg1.getAsTemplate(),
367 Arg2.getAsTemplate());
369 case TemplateArgument::TemplateExpansion:
370 return IsStructurallyEquivalent(Context,
371 Arg1.getAsTemplateOrTemplatePattern(),
372 Arg2.getAsTemplateOrTemplatePattern());
374 case TemplateArgument::Expression:
375 return IsStructurallyEquivalent(Context,
376 Arg1.getAsExpr(), Arg2.getAsExpr());
378 case TemplateArgument::Pack:
379 if (Arg1.pack_size() != Arg2.pack_size())
382 for (unsigned I = 0, N = Arg1.pack_size(); I != N; ++I)
383 if (!IsStructurallyEquivalent(Context,
384 Arg1.pack_begin()[I],
385 Arg2.pack_begin()[I]))
391 llvm_unreachable("Invalid template argument kind");
394 /// \brief Determine structural equivalence for the common part of array
396 static bool IsArrayStructurallyEquivalent(StructuralEquivalenceContext &Context,
397 const ArrayType *Array1,
398 const ArrayType *Array2) {
399 if (!IsStructurallyEquivalent(Context,
400 Array1->getElementType(),
401 Array2->getElementType()))
403 if (Array1->getSizeModifier() != Array2->getSizeModifier())
405 if (Array1->getIndexTypeQualifiers() != Array2->getIndexTypeQualifiers())
411 /// \brief Determine structural equivalence of two types.
412 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
413 QualType T1, QualType T2) {
414 if (T1.isNull() || T2.isNull())
415 return T1.isNull() && T2.isNull();
417 if (!Context.StrictTypeSpelling) {
418 // We aren't being strict about token-to-token equivalence of types,
419 // so map down to the canonical type.
420 T1 = Context.C1.getCanonicalType(T1);
421 T2 = Context.C2.getCanonicalType(T2);
424 if (T1.getQualifiers() != T2.getQualifiers())
427 Type::TypeClass TC = T1->getTypeClass();
429 if (T1->getTypeClass() != T2->getTypeClass()) {
430 // Compare function types with prototypes vs. without prototypes as if
431 // both did not have prototypes.
432 if (T1->getTypeClass() == Type::FunctionProto &&
433 T2->getTypeClass() == Type::FunctionNoProto)
434 TC = Type::FunctionNoProto;
435 else if (T1->getTypeClass() == Type::FunctionNoProto &&
436 T2->getTypeClass() == Type::FunctionProto)
437 TC = Type::FunctionNoProto;
444 // FIXME: Deal with Char_S/Char_U.
445 if (cast<BuiltinType>(T1)->getKind() != cast<BuiltinType>(T2)->getKind())
450 if (!IsStructurallyEquivalent(Context,
451 cast<ComplexType>(T1)->getElementType(),
452 cast<ComplexType>(T2)->getElementType()))
458 if (!IsStructurallyEquivalent(Context,
459 cast<AdjustedType>(T1)->getOriginalType(),
460 cast<AdjustedType>(T2)->getOriginalType()))
465 if (!IsStructurallyEquivalent(Context,
466 cast<PointerType>(T1)->getPointeeType(),
467 cast<PointerType>(T2)->getPointeeType()))
471 case Type::BlockPointer:
472 if (!IsStructurallyEquivalent(Context,
473 cast<BlockPointerType>(T1)->getPointeeType(),
474 cast<BlockPointerType>(T2)->getPointeeType()))
478 case Type::LValueReference:
479 case Type::RValueReference: {
480 const ReferenceType *Ref1 = cast<ReferenceType>(T1);
481 const ReferenceType *Ref2 = cast<ReferenceType>(T2);
482 if (Ref1->isSpelledAsLValue() != Ref2->isSpelledAsLValue())
484 if (Ref1->isInnerRef() != Ref2->isInnerRef())
486 if (!IsStructurallyEquivalent(Context,
487 Ref1->getPointeeTypeAsWritten(),
488 Ref2->getPointeeTypeAsWritten()))
493 case Type::MemberPointer: {
494 const MemberPointerType *MemPtr1 = cast<MemberPointerType>(T1);
495 const MemberPointerType *MemPtr2 = cast<MemberPointerType>(T2);
496 if (!IsStructurallyEquivalent(Context,
497 MemPtr1->getPointeeType(),
498 MemPtr2->getPointeeType()))
500 if (!IsStructurallyEquivalent(Context,
501 QualType(MemPtr1->getClass(), 0),
502 QualType(MemPtr2->getClass(), 0)))
507 case Type::ConstantArray: {
508 const ConstantArrayType *Array1 = cast<ConstantArrayType>(T1);
509 const ConstantArrayType *Array2 = cast<ConstantArrayType>(T2);
510 if (!llvm::APInt::isSameValue(Array1->getSize(), Array2->getSize()))
513 if (!IsArrayStructurallyEquivalent(Context, Array1, Array2))
518 case Type::IncompleteArray:
519 if (!IsArrayStructurallyEquivalent(Context,
521 cast<ArrayType>(T2)))
525 case Type::VariableArray: {
526 const VariableArrayType *Array1 = cast<VariableArrayType>(T1);
527 const VariableArrayType *Array2 = cast<VariableArrayType>(T2);
528 if (!IsStructurallyEquivalent(Context,
529 Array1->getSizeExpr(), Array2->getSizeExpr()))
532 if (!IsArrayStructurallyEquivalent(Context, Array1, Array2))
538 case Type::DependentSizedArray: {
539 const DependentSizedArrayType *Array1 = cast<DependentSizedArrayType>(T1);
540 const DependentSizedArrayType *Array2 = cast<DependentSizedArrayType>(T2);
541 if (!IsStructurallyEquivalent(Context,
542 Array1->getSizeExpr(), Array2->getSizeExpr()))
545 if (!IsArrayStructurallyEquivalent(Context, Array1, Array2))
551 case Type::DependentSizedExtVector: {
552 const DependentSizedExtVectorType *Vec1
553 = cast<DependentSizedExtVectorType>(T1);
554 const DependentSizedExtVectorType *Vec2
555 = cast<DependentSizedExtVectorType>(T2);
556 if (!IsStructurallyEquivalent(Context,
557 Vec1->getSizeExpr(), Vec2->getSizeExpr()))
559 if (!IsStructurallyEquivalent(Context,
560 Vec1->getElementType(),
561 Vec2->getElementType()))
567 case Type::ExtVector: {
568 const VectorType *Vec1 = cast<VectorType>(T1);
569 const VectorType *Vec2 = cast<VectorType>(T2);
570 if (!IsStructurallyEquivalent(Context,
571 Vec1->getElementType(),
572 Vec2->getElementType()))
574 if (Vec1->getNumElements() != Vec2->getNumElements())
576 if (Vec1->getVectorKind() != Vec2->getVectorKind())
581 case Type::FunctionProto: {
582 const FunctionProtoType *Proto1 = cast<FunctionProtoType>(T1);
583 const FunctionProtoType *Proto2 = cast<FunctionProtoType>(T2);
584 if (Proto1->getNumParams() != Proto2->getNumParams())
586 for (unsigned I = 0, N = Proto1->getNumParams(); I != N; ++I) {
587 if (!IsStructurallyEquivalent(Context, Proto1->getParamType(I),
588 Proto2->getParamType(I)))
591 if (Proto1->isVariadic() != Proto2->isVariadic())
593 if (Proto1->getExceptionSpecType() != Proto2->getExceptionSpecType())
595 if (Proto1->getExceptionSpecType() == EST_Dynamic) {
596 if (Proto1->getNumExceptions() != Proto2->getNumExceptions())
598 for (unsigned I = 0, N = Proto1->getNumExceptions(); I != N; ++I) {
599 if (!IsStructurallyEquivalent(Context,
600 Proto1->getExceptionType(I),
601 Proto2->getExceptionType(I)))
604 } else if (Proto1->getExceptionSpecType() == EST_ComputedNoexcept) {
605 if (!IsStructurallyEquivalent(Context,
606 Proto1->getNoexceptExpr(),
607 Proto2->getNoexceptExpr()))
610 if (Proto1->getTypeQuals() != Proto2->getTypeQuals())
613 // Fall through to check the bits common with FunctionNoProtoType.
616 case Type::FunctionNoProto: {
617 const FunctionType *Function1 = cast<FunctionType>(T1);
618 const FunctionType *Function2 = cast<FunctionType>(T2);
619 if (!IsStructurallyEquivalent(Context, Function1->getReturnType(),
620 Function2->getReturnType()))
622 if (Function1->getExtInfo() != Function2->getExtInfo())
627 case Type::UnresolvedUsing:
628 if (!IsStructurallyEquivalent(Context,
629 cast<UnresolvedUsingType>(T1)->getDecl(),
630 cast<UnresolvedUsingType>(T2)->getDecl()))
635 case Type::Attributed:
636 if (!IsStructurallyEquivalent(Context,
637 cast<AttributedType>(T1)->getModifiedType(),
638 cast<AttributedType>(T2)->getModifiedType()))
640 if (!IsStructurallyEquivalent(Context,
641 cast<AttributedType>(T1)->getEquivalentType(),
642 cast<AttributedType>(T2)->getEquivalentType()))
647 if (!IsStructurallyEquivalent(Context,
648 cast<ParenType>(T1)->getInnerType(),
649 cast<ParenType>(T2)->getInnerType()))
654 if (!IsStructurallyEquivalent(Context,
655 cast<TypedefType>(T1)->getDecl(),
656 cast<TypedefType>(T2)->getDecl()))
660 case Type::TypeOfExpr:
661 if (!IsStructurallyEquivalent(Context,
662 cast<TypeOfExprType>(T1)->getUnderlyingExpr(),
663 cast<TypeOfExprType>(T2)->getUnderlyingExpr()))
668 if (!IsStructurallyEquivalent(Context,
669 cast<TypeOfType>(T1)->getUnderlyingType(),
670 cast<TypeOfType>(T2)->getUnderlyingType()))
674 case Type::UnaryTransform:
675 if (!IsStructurallyEquivalent(Context,
676 cast<UnaryTransformType>(T1)->getUnderlyingType(),
677 cast<UnaryTransformType>(T1)->getUnderlyingType()))
682 if (!IsStructurallyEquivalent(Context,
683 cast<DecltypeType>(T1)->getUnderlyingExpr(),
684 cast<DecltypeType>(T2)->getUnderlyingExpr()))
689 if (!IsStructurallyEquivalent(Context,
690 cast<AutoType>(T1)->getDeducedType(),
691 cast<AutoType>(T2)->getDeducedType()))
697 if (!IsStructurallyEquivalent(Context,
698 cast<TagType>(T1)->getDecl(),
699 cast<TagType>(T2)->getDecl()))
703 case Type::TemplateTypeParm: {
704 const TemplateTypeParmType *Parm1 = cast<TemplateTypeParmType>(T1);
705 const TemplateTypeParmType *Parm2 = cast<TemplateTypeParmType>(T2);
706 if (Parm1->getDepth() != Parm2->getDepth())
708 if (Parm1->getIndex() != Parm2->getIndex())
710 if (Parm1->isParameterPack() != Parm2->isParameterPack())
713 // Names of template type parameters are never significant.
717 case Type::SubstTemplateTypeParm: {
718 const SubstTemplateTypeParmType *Subst1
719 = cast<SubstTemplateTypeParmType>(T1);
720 const SubstTemplateTypeParmType *Subst2
721 = cast<SubstTemplateTypeParmType>(T2);
722 if (!IsStructurallyEquivalent(Context,
723 QualType(Subst1->getReplacedParameter(), 0),
724 QualType(Subst2->getReplacedParameter(), 0)))
726 if (!IsStructurallyEquivalent(Context,
727 Subst1->getReplacementType(),
728 Subst2->getReplacementType()))
733 case Type::SubstTemplateTypeParmPack: {
734 const SubstTemplateTypeParmPackType *Subst1
735 = cast<SubstTemplateTypeParmPackType>(T1);
736 const SubstTemplateTypeParmPackType *Subst2
737 = cast<SubstTemplateTypeParmPackType>(T2);
738 if (!IsStructurallyEquivalent(Context,
739 QualType(Subst1->getReplacedParameter(), 0),
740 QualType(Subst2->getReplacedParameter(), 0)))
742 if (!IsStructurallyEquivalent(Context,
743 Subst1->getArgumentPack(),
744 Subst2->getArgumentPack()))
748 case Type::TemplateSpecialization: {
749 const TemplateSpecializationType *Spec1
750 = cast<TemplateSpecializationType>(T1);
751 const TemplateSpecializationType *Spec2
752 = cast<TemplateSpecializationType>(T2);
753 if (!IsStructurallyEquivalent(Context,
754 Spec1->getTemplateName(),
755 Spec2->getTemplateName()))
757 if (Spec1->getNumArgs() != Spec2->getNumArgs())
759 for (unsigned I = 0, N = Spec1->getNumArgs(); I != N; ++I) {
760 if (!IsStructurallyEquivalent(Context,
761 Spec1->getArg(I), Spec2->getArg(I)))
767 case Type::Elaborated: {
768 const ElaboratedType *Elab1 = cast<ElaboratedType>(T1);
769 const ElaboratedType *Elab2 = cast<ElaboratedType>(T2);
770 // CHECKME: what if a keyword is ETK_None or ETK_typename ?
771 if (Elab1->getKeyword() != Elab2->getKeyword())
773 if (!IsStructurallyEquivalent(Context,
774 Elab1->getQualifier(),
775 Elab2->getQualifier()))
777 if (!IsStructurallyEquivalent(Context,
778 Elab1->getNamedType(),
779 Elab2->getNamedType()))
784 case Type::InjectedClassName: {
785 const InjectedClassNameType *Inj1 = cast<InjectedClassNameType>(T1);
786 const InjectedClassNameType *Inj2 = cast<InjectedClassNameType>(T2);
787 if (!IsStructurallyEquivalent(Context,
788 Inj1->getInjectedSpecializationType(),
789 Inj2->getInjectedSpecializationType()))
794 case Type::DependentName: {
795 const DependentNameType *Typename1 = cast<DependentNameType>(T1);
796 const DependentNameType *Typename2 = cast<DependentNameType>(T2);
797 if (!IsStructurallyEquivalent(Context,
798 Typename1->getQualifier(),
799 Typename2->getQualifier()))
801 if (!IsStructurallyEquivalent(Typename1->getIdentifier(),
802 Typename2->getIdentifier()))
808 case Type::DependentTemplateSpecialization: {
809 const DependentTemplateSpecializationType *Spec1 =
810 cast<DependentTemplateSpecializationType>(T1);
811 const DependentTemplateSpecializationType *Spec2 =
812 cast<DependentTemplateSpecializationType>(T2);
813 if (!IsStructurallyEquivalent(Context,
814 Spec1->getQualifier(),
815 Spec2->getQualifier()))
817 if (!IsStructurallyEquivalent(Spec1->getIdentifier(),
818 Spec2->getIdentifier()))
820 if (Spec1->getNumArgs() != Spec2->getNumArgs())
822 for (unsigned I = 0, N = Spec1->getNumArgs(); I != N; ++I) {
823 if (!IsStructurallyEquivalent(Context,
824 Spec1->getArg(I), Spec2->getArg(I)))
830 case Type::PackExpansion:
831 if (!IsStructurallyEquivalent(Context,
832 cast<PackExpansionType>(T1)->getPattern(),
833 cast<PackExpansionType>(T2)->getPattern()))
837 case Type::ObjCInterface: {
838 const ObjCInterfaceType *Iface1 = cast<ObjCInterfaceType>(T1);
839 const ObjCInterfaceType *Iface2 = cast<ObjCInterfaceType>(T2);
840 if (!IsStructurallyEquivalent(Context,
841 Iface1->getDecl(), Iface2->getDecl()))
846 case Type::ObjCObject: {
847 const ObjCObjectType *Obj1 = cast<ObjCObjectType>(T1);
848 const ObjCObjectType *Obj2 = cast<ObjCObjectType>(T2);
849 if (!IsStructurallyEquivalent(Context,
851 Obj2->getBaseType()))
853 if (Obj1->getNumProtocols() != Obj2->getNumProtocols())
855 for (unsigned I = 0, N = Obj1->getNumProtocols(); I != N; ++I) {
856 if (!IsStructurallyEquivalent(Context,
857 Obj1->getProtocol(I),
858 Obj2->getProtocol(I)))
864 case Type::ObjCObjectPointer: {
865 const ObjCObjectPointerType *Ptr1 = cast<ObjCObjectPointerType>(T1);
866 const ObjCObjectPointerType *Ptr2 = cast<ObjCObjectPointerType>(T2);
867 if (!IsStructurallyEquivalent(Context,
868 Ptr1->getPointeeType(),
869 Ptr2->getPointeeType()))
875 if (!IsStructurallyEquivalent(Context,
876 cast<AtomicType>(T1)->getValueType(),
877 cast<AtomicType>(T2)->getValueType()))
883 if (!IsStructurallyEquivalent(Context,
884 cast<PipeType>(T1)->getElementType(),
885 cast<PipeType>(T2)->getElementType()))
895 /// \brief Determine structural equivalence of two fields.
896 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
897 FieldDecl *Field1, FieldDecl *Field2) {
898 RecordDecl *Owner2 = cast<RecordDecl>(Field2->getDeclContext());
900 // For anonymous structs/unions, match up the anonymous struct/union type
901 // declarations directly, so that we don't go off searching for anonymous
903 if (Field1->isAnonymousStructOrUnion() &&
904 Field2->isAnonymousStructOrUnion()) {
905 RecordDecl *D1 = Field1->getType()->castAs<RecordType>()->getDecl();
906 RecordDecl *D2 = Field2->getType()->castAs<RecordType>()->getDecl();
907 return IsStructurallyEquivalent(Context, D1, D2);
910 // Check for equivalent field names.
911 IdentifierInfo *Name1 = Field1->getIdentifier();
912 IdentifierInfo *Name2 = Field2->getIdentifier();
913 if (!::IsStructurallyEquivalent(Name1, Name2))
916 if (!IsStructurallyEquivalent(Context,
917 Field1->getType(), Field2->getType())) {
918 if (Context.Complain) {
919 Context.Diag2(Owner2->getLocation(), diag::warn_odr_tag_type_inconsistent)
920 << Context.C2.getTypeDeclType(Owner2);
921 Context.Diag2(Field2->getLocation(), diag::note_odr_field)
922 << Field2->getDeclName() << Field2->getType();
923 Context.Diag1(Field1->getLocation(), diag::note_odr_field)
924 << Field1->getDeclName() << Field1->getType();
929 if (Field1->isBitField() != Field2->isBitField()) {
930 if (Context.Complain) {
931 Context.Diag2(Owner2->getLocation(), diag::warn_odr_tag_type_inconsistent)
932 << Context.C2.getTypeDeclType(Owner2);
933 if (Field1->isBitField()) {
934 Context.Diag1(Field1->getLocation(), diag::note_odr_bit_field)
935 << Field1->getDeclName() << Field1->getType()
936 << Field1->getBitWidthValue(Context.C1);
937 Context.Diag2(Field2->getLocation(), diag::note_odr_not_bit_field)
938 << Field2->getDeclName();
940 Context.Diag2(Field2->getLocation(), diag::note_odr_bit_field)
941 << Field2->getDeclName() << Field2->getType()
942 << Field2->getBitWidthValue(Context.C2);
943 Context.Diag1(Field1->getLocation(), diag::note_odr_not_bit_field)
944 << Field1->getDeclName();
950 if (Field1->isBitField()) {
951 // Make sure that the bit-fields are the same length.
952 unsigned Bits1 = Field1->getBitWidthValue(Context.C1);
953 unsigned Bits2 = Field2->getBitWidthValue(Context.C2);
955 if (Bits1 != Bits2) {
956 if (Context.Complain) {
957 Context.Diag2(Owner2->getLocation(), diag::warn_odr_tag_type_inconsistent)
958 << Context.C2.getTypeDeclType(Owner2);
959 Context.Diag2(Field2->getLocation(), diag::note_odr_bit_field)
960 << Field2->getDeclName() << Field2->getType() << Bits2;
961 Context.Diag1(Field1->getLocation(), diag::note_odr_bit_field)
962 << Field1->getDeclName() << Field1->getType() << Bits1;
971 /// \brief Find the index of the given anonymous struct/union within its
974 /// \returns Returns the index of this anonymous struct/union in its context,
975 /// including the next assigned index (if none of them match). Returns an
976 /// empty option if the context is not a record, i.e.. if the anonymous
977 /// struct/union is at namespace or block scope.
978 static Optional<unsigned> findAnonymousStructOrUnionIndex(RecordDecl *Anon) {
979 ASTContext &Context = Anon->getASTContext();
980 QualType AnonTy = Context.getRecordType(Anon);
982 RecordDecl *Owner = dyn_cast<RecordDecl>(Anon->getDeclContext());
987 for (const auto *D : Owner->noload_decls()) {
988 const auto *F = dyn_cast<FieldDecl>(D);
989 if (!F || !F->isAnonymousStructOrUnion())
992 if (Context.hasSameType(F->getType(), AnonTy))
1001 /// \brief Determine structural equivalence of two records.
1002 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
1003 RecordDecl *D1, RecordDecl *D2) {
1004 if (D1->isUnion() != D2->isUnion()) {
1005 if (Context.Complain) {
1006 Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
1007 << Context.C2.getTypeDeclType(D2);
1008 Context.Diag1(D1->getLocation(), diag::note_odr_tag_kind_here)
1009 << D1->getDeclName() << (unsigned)D1->getTagKind();
1014 if (D1->isAnonymousStructOrUnion() && D2->isAnonymousStructOrUnion()) {
1015 // If both anonymous structs/unions are in a record context, make sure
1016 // they occur in the same location in the context records.
1017 if (Optional<unsigned> Index1 = findAnonymousStructOrUnionIndex(D1)) {
1018 if (Optional<unsigned> Index2 = findAnonymousStructOrUnionIndex(D2)) {
1019 if (*Index1 != *Index2)
1025 // If both declarations are class template specializations, we know
1026 // the ODR applies, so check the template and template arguments.
1027 ClassTemplateSpecializationDecl *Spec1
1028 = dyn_cast<ClassTemplateSpecializationDecl>(D1);
1029 ClassTemplateSpecializationDecl *Spec2
1030 = dyn_cast<ClassTemplateSpecializationDecl>(D2);
1031 if (Spec1 && Spec2) {
1032 // Check that the specialized templates are the same.
1033 if (!IsStructurallyEquivalent(Context, Spec1->getSpecializedTemplate(),
1034 Spec2->getSpecializedTemplate()))
1037 // Check that the template arguments are the same.
1038 if (Spec1->getTemplateArgs().size() != Spec2->getTemplateArgs().size())
1041 for (unsigned I = 0, N = Spec1->getTemplateArgs().size(); I != N; ++I)
1042 if (!IsStructurallyEquivalent(Context,
1043 Spec1->getTemplateArgs().get(I),
1044 Spec2->getTemplateArgs().get(I)))
1047 // If one is a class template specialization and the other is not, these
1048 // structures are different.
1049 else if (Spec1 || Spec2)
1052 // Compare the definitions of these two records. If either or both are
1053 // incomplete, we assume that they are equivalent.
1054 D1 = D1->getDefinition();
1055 D2 = D2->getDefinition();
1059 if (CXXRecordDecl *D1CXX = dyn_cast<CXXRecordDecl>(D1)) {
1060 if (CXXRecordDecl *D2CXX = dyn_cast<CXXRecordDecl>(D2)) {
1061 if (D1CXX->getNumBases() != D2CXX->getNumBases()) {
1062 if (Context.Complain) {
1063 Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
1064 << Context.C2.getTypeDeclType(D2);
1065 Context.Diag2(D2->getLocation(), diag::note_odr_number_of_bases)
1066 << D2CXX->getNumBases();
1067 Context.Diag1(D1->getLocation(), diag::note_odr_number_of_bases)
1068 << D1CXX->getNumBases();
1073 // Check the base classes.
1074 for (CXXRecordDecl::base_class_iterator Base1 = D1CXX->bases_begin(),
1075 BaseEnd1 = D1CXX->bases_end(),
1076 Base2 = D2CXX->bases_begin();
1079 if (!IsStructurallyEquivalent(Context,
1080 Base1->getType(), Base2->getType())) {
1081 if (Context.Complain) {
1082 Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
1083 << Context.C2.getTypeDeclType(D2);
1084 Context.Diag2(Base2->getLocStart(), diag::note_odr_base)
1086 << Base2->getSourceRange();
1087 Context.Diag1(Base1->getLocStart(), diag::note_odr_base)
1089 << Base1->getSourceRange();
1094 // Check virtual vs. non-virtual inheritance mismatch.
1095 if (Base1->isVirtual() != Base2->isVirtual()) {
1096 if (Context.Complain) {
1097 Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
1098 << Context.C2.getTypeDeclType(D2);
1099 Context.Diag2(Base2->getLocStart(),
1100 diag::note_odr_virtual_base)
1101 << Base2->isVirtual() << Base2->getSourceRange();
1102 Context.Diag1(Base1->getLocStart(), diag::note_odr_base)
1103 << Base1->isVirtual()
1104 << Base1->getSourceRange();
1109 } else if (D1CXX->getNumBases() > 0) {
1110 if (Context.Complain) {
1111 Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
1112 << Context.C2.getTypeDeclType(D2);
1113 const CXXBaseSpecifier *Base1 = D1CXX->bases_begin();
1114 Context.Diag1(Base1->getLocStart(), diag::note_odr_base)
1116 << Base1->getSourceRange();
1117 Context.Diag2(D2->getLocation(), diag::note_odr_missing_base);
1123 // Check the fields for consistency.
1124 RecordDecl::field_iterator Field2 = D2->field_begin(),
1125 Field2End = D2->field_end();
1126 for (RecordDecl::field_iterator Field1 = D1->field_begin(),
1127 Field1End = D1->field_end();
1128 Field1 != Field1End;
1129 ++Field1, ++Field2) {
1130 if (Field2 == Field2End) {
1131 if (Context.Complain) {
1132 Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
1133 << Context.C2.getTypeDeclType(D2);
1134 Context.Diag1(Field1->getLocation(), diag::note_odr_field)
1135 << Field1->getDeclName() << Field1->getType();
1136 Context.Diag2(D2->getLocation(), diag::note_odr_missing_field);
1141 if (!IsStructurallyEquivalent(Context, *Field1, *Field2))
1145 if (Field2 != Field2End) {
1146 if (Context.Complain) {
1147 Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
1148 << Context.C2.getTypeDeclType(D2);
1149 Context.Diag2(Field2->getLocation(), diag::note_odr_field)
1150 << Field2->getDeclName() << Field2->getType();
1151 Context.Diag1(D1->getLocation(), diag::note_odr_missing_field);
1159 /// \brief Determine structural equivalence of two enums.
1160 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
1161 EnumDecl *D1, EnumDecl *D2) {
1162 EnumDecl::enumerator_iterator EC2 = D2->enumerator_begin(),
1163 EC2End = D2->enumerator_end();
1164 for (EnumDecl::enumerator_iterator EC1 = D1->enumerator_begin(),
1165 EC1End = D1->enumerator_end();
1166 EC1 != EC1End; ++EC1, ++EC2) {
1167 if (EC2 == EC2End) {
1168 if (Context.Complain) {
1169 Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
1170 << Context.C2.getTypeDeclType(D2);
1171 Context.Diag1(EC1->getLocation(), diag::note_odr_enumerator)
1172 << EC1->getDeclName()
1173 << EC1->getInitVal().toString(10);
1174 Context.Diag2(D2->getLocation(), diag::note_odr_missing_enumerator);
1179 llvm::APSInt Val1 = EC1->getInitVal();
1180 llvm::APSInt Val2 = EC2->getInitVal();
1181 if (!llvm::APSInt::isSameValue(Val1, Val2) ||
1182 !IsStructurallyEquivalent(EC1->getIdentifier(), EC2->getIdentifier())) {
1183 if (Context.Complain) {
1184 Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
1185 << Context.C2.getTypeDeclType(D2);
1186 Context.Diag2(EC2->getLocation(), diag::note_odr_enumerator)
1187 << EC2->getDeclName()
1188 << EC2->getInitVal().toString(10);
1189 Context.Diag1(EC1->getLocation(), diag::note_odr_enumerator)
1190 << EC1->getDeclName()
1191 << EC1->getInitVal().toString(10);
1197 if (EC2 != EC2End) {
1198 if (Context.Complain) {
1199 Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent)
1200 << Context.C2.getTypeDeclType(D2);
1201 Context.Diag2(EC2->getLocation(), diag::note_odr_enumerator)
1202 << EC2->getDeclName()
1203 << EC2->getInitVal().toString(10);
1204 Context.Diag1(D1->getLocation(), diag::note_odr_missing_enumerator);
1212 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
1213 TemplateParameterList *Params1,
1214 TemplateParameterList *Params2) {
1215 if (Params1->size() != Params2->size()) {
1216 if (Context.Complain) {
1217 Context.Diag2(Params2->getTemplateLoc(),
1218 diag::err_odr_different_num_template_parameters)
1219 << Params1->size() << Params2->size();
1220 Context.Diag1(Params1->getTemplateLoc(),
1221 diag::note_odr_template_parameter_list);
1226 for (unsigned I = 0, N = Params1->size(); I != N; ++I) {
1227 if (Params1->getParam(I)->getKind() != Params2->getParam(I)->getKind()) {
1228 if (Context.Complain) {
1229 Context.Diag2(Params2->getParam(I)->getLocation(),
1230 diag::err_odr_different_template_parameter_kind);
1231 Context.Diag1(Params1->getParam(I)->getLocation(),
1232 diag::note_odr_template_parameter_here);
1237 if (!Context.IsStructurallyEquivalent(Params1->getParam(I),
1238 Params2->getParam(I))) {
1247 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
1248 TemplateTypeParmDecl *D1,
1249 TemplateTypeParmDecl *D2) {
1250 if (D1->isParameterPack() != D2->isParameterPack()) {
1251 if (Context.Complain) {
1252 Context.Diag2(D2->getLocation(), diag::err_odr_parameter_pack_non_pack)
1253 << D2->isParameterPack();
1254 Context.Diag1(D1->getLocation(), diag::note_odr_parameter_pack_non_pack)
1255 << D1->isParameterPack();
1263 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
1264 NonTypeTemplateParmDecl *D1,
1265 NonTypeTemplateParmDecl *D2) {
1266 if (D1->isParameterPack() != D2->isParameterPack()) {
1267 if (Context.Complain) {
1268 Context.Diag2(D2->getLocation(), diag::err_odr_parameter_pack_non_pack)
1269 << D2->isParameterPack();
1270 Context.Diag1(D1->getLocation(), diag::note_odr_parameter_pack_non_pack)
1271 << D1->isParameterPack();
1277 if (!Context.IsStructurallyEquivalent(D1->getType(), D2->getType())) {
1278 if (Context.Complain) {
1279 Context.Diag2(D2->getLocation(),
1280 diag::err_odr_non_type_parameter_type_inconsistent)
1281 << D2->getType() << D1->getType();
1282 Context.Diag1(D1->getLocation(), diag::note_odr_value_here)
1291 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
1292 TemplateTemplateParmDecl *D1,
1293 TemplateTemplateParmDecl *D2) {
1294 if (D1->isParameterPack() != D2->isParameterPack()) {
1295 if (Context.Complain) {
1296 Context.Diag2(D2->getLocation(), diag::err_odr_parameter_pack_non_pack)
1297 << D2->isParameterPack();
1298 Context.Diag1(D1->getLocation(), diag::note_odr_parameter_pack_non_pack)
1299 << D1->isParameterPack();
1304 // Check template parameter lists.
1305 return IsStructurallyEquivalent(Context, D1->getTemplateParameters(),
1306 D2->getTemplateParameters());
1309 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
1310 ClassTemplateDecl *D1,
1311 ClassTemplateDecl *D2) {
1312 // Check template parameters.
1313 if (!IsStructurallyEquivalent(Context,
1314 D1->getTemplateParameters(),
1315 D2->getTemplateParameters()))
1318 // Check the templated declaration.
1319 return Context.IsStructurallyEquivalent(D1->getTemplatedDecl(),
1320 D2->getTemplatedDecl());
1323 /// \brief Determine structural equivalence of two declarations.
1324 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
1325 Decl *D1, Decl *D2) {
1326 // FIXME: Check for known structural equivalences via a callback of some sort.
1328 // Check whether we already know that these two declarations are not
1329 // structurally equivalent.
1330 if (Context.NonEquivalentDecls.count(std::make_pair(D1->getCanonicalDecl(),
1331 D2->getCanonicalDecl())))
1334 // Determine whether we've already produced a tentative equivalence for D1.
1335 Decl *&EquivToD1 = Context.TentativeEquivalences[D1->getCanonicalDecl()];
1337 return EquivToD1 == D2->getCanonicalDecl();
1339 // Produce a tentative equivalence D1 <-> D2, which will be checked later.
1340 EquivToD1 = D2->getCanonicalDecl();
1341 Context.DeclsToCheck.push_back(D1->getCanonicalDecl());
1345 bool StructuralEquivalenceContext::IsStructurallyEquivalent(Decl *D1,
1347 if (!::IsStructurallyEquivalent(*this, D1, D2))
1353 bool StructuralEquivalenceContext::IsStructurallyEquivalent(QualType T1,
1355 if (!::IsStructurallyEquivalent(*this, T1, T2))
1361 bool StructuralEquivalenceContext::Finish() {
1362 while (!DeclsToCheck.empty()) {
1363 // Check the next declaration.
1364 Decl *D1 = DeclsToCheck.front();
1365 DeclsToCheck.pop_front();
1367 Decl *D2 = TentativeEquivalences[D1];
1368 assert(D2 && "Unrecorded tentative equivalence?");
1370 bool Equivalent = true;
1372 // FIXME: Switch on all declaration kinds. For now, we're just going to
1373 // check the obvious ones.
1374 if (RecordDecl *Record1 = dyn_cast<RecordDecl>(D1)) {
1375 if (RecordDecl *Record2 = dyn_cast<RecordDecl>(D2)) {
1376 // Check for equivalent structure names.
1377 IdentifierInfo *Name1 = Record1->getIdentifier();
1378 if (!Name1 && Record1->getTypedefNameForAnonDecl())
1379 Name1 = Record1->getTypedefNameForAnonDecl()->getIdentifier();
1380 IdentifierInfo *Name2 = Record2->getIdentifier();
1381 if (!Name2 && Record2->getTypedefNameForAnonDecl())
1382 Name2 = Record2->getTypedefNameForAnonDecl()->getIdentifier();
1383 if (!::IsStructurallyEquivalent(Name1, Name2) ||
1384 !::IsStructurallyEquivalent(*this, Record1, Record2))
1387 // Record/non-record mismatch.
1390 } else if (EnumDecl *Enum1 = dyn_cast<EnumDecl>(D1)) {
1391 if (EnumDecl *Enum2 = dyn_cast<EnumDecl>(D2)) {
1392 // Check for equivalent enum names.
1393 IdentifierInfo *Name1 = Enum1->getIdentifier();
1394 if (!Name1 && Enum1->getTypedefNameForAnonDecl())
1395 Name1 = Enum1->getTypedefNameForAnonDecl()->getIdentifier();
1396 IdentifierInfo *Name2 = Enum2->getIdentifier();
1397 if (!Name2 && Enum2->getTypedefNameForAnonDecl())
1398 Name2 = Enum2->getTypedefNameForAnonDecl()->getIdentifier();
1399 if (!::IsStructurallyEquivalent(Name1, Name2) ||
1400 !::IsStructurallyEquivalent(*this, Enum1, Enum2))
1403 // Enum/non-enum mismatch
1406 } else if (TypedefNameDecl *Typedef1 = dyn_cast<TypedefNameDecl>(D1)) {
1407 if (TypedefNameDecl *Typedef2 = dyn_cast<TypedefNameDecl>(D2)) {
1408 if (!::IsStructurallyEquivalent(Typedef1->getIdentifier(),
1409 Typedef2->getIdentifier()) ||
1410 !::IsStructurallyEquivalent(*this,
1411 Typedef1->getUnderlyingType(),
1412 Typedef2->getUnderlyingType()))
1415 // Typedef/non-typedef mismatch.
1418 } else if (ClassTemplateDecl *ClassTemplate1
1419 = dyn_cast<ClassTemplateDecl>(D1)) {
1420 if (ClassTemplateDecl *ClassTemplate2 = dyn_cast<ClassTemplateDecl>(D2)) {
1421 if (!::IsStructurallyEquivalent(ClassTemplate1->getIdentifier(),
1422 ClassTemplate2->getIdentifier()) ||
1423 !::IsStructurallyEquivalent(*this, ClassTemplate1, ClassTemplate2))
1426 // Class template/non-class-template mismatch.
1429 } else if (TemplateTypeParmDecl *TTP1= dyn_cast<TemplateTypeParmDecl>(D1)) {
1430 if (TemplateTypeParmDecl *TTP2 = dyn_cast<TemplateTypeParmDecl>(D2)) {
1431 if (!::IsStructurallyEquivalent(*this, TTP1, TTP2))
1437 } else if (NonTypeTemplateParmDecl *NTTP1
1438 = dyn_cast<NonTypeTemplateParmDecl>(D1)) {
1439 if (NonTypeTemplateParmDecl *NTTP2
1440 = dyn_cast<NonTypeTemplateParmDecl>(D2)) {
1441 if (!::IsStructurallyEquivalent(*this, NTTP1, NTTP2))
1447 } else if (TemplateTemplateParmDecl *TTP1
1448 = dyn_cast<TemplateTemplateParmDecl>(D1)) {
1449 if (TemplateTemplateParmDecl *TTP2
1450 = dyn_cast<TemplateTemplateParmDecl>(D2)) {
1451 if (!::IsStructurallyEquivalent(*this, TTP1, TTP2))
1460 // Note that these two declarations are not equivalent (and we already
1462 NonEquivalentDecls.insert(std::make_pair(D1->getCanonicalDecl(),
1463 D2->getCanonicalDecl()));
1466 // FIXME: Check other declaration kinds!
1472 //----------------------------------------------------------------------------
1474 //----------------------------------------------------------------------------
1476 QualType ASTNodeImporter::VisitType(const Type *T) {
1477 Importer.FromDiag(SourceLocation(), diag::err_unsupported_ast_node)
1478 << T->getTypeClassName();
1482 QualType ASTNodeImporter::VisitBuiltinType(const BuiltinType *T) {
1483 switch (T->getKind()) {
1484 #define SHARED_SINGLETON_TYPE(Expansion)
1485 #define BUILTIN_TYPE(Id, SingletonId) \
1486 case BuiltinType::Id: return Importer.getToContext().SingletonId;
1487 #include "clang/AST/BuiltinTypes.def"
1489 // FIXME: for Char16, Char32, and NullPtr, make sure that the "to"
1490 // context supports C++.
1492 // FIXME: for ObjCId, ObjCClass, and ObjCSel, make sure that the "to"
1493 // context supports ObjC.
1495 case BuiltinType::Char_U:
1496 // The context we're importing from has an unsigned 'char'. If we're
1497 // importing into a context with a signed 'char', translate to
1498 // 'unsigned char' instead.
1499 if (Importer.getToContext().getLangOpts().CharIsSigned)
1500 return Importer.getToContext().UnsignedCharTy;
1502 return Importer.getToContext().CharTy;
1504 case BuiltinType::Char_S:
1505 // The context we're importing from has an unsigned 'char'. If we're
1506 // importing into a context with a signed 'char', translate to
1507 // 'unsigned char' instead.
1508 if (!Importer.getToContext().getLangOpts().CharIsSigned)
1509 return Importer.getToContext().SignedCharTy;
1511 return Importer.getToContext().CharTy;
1513 case BuiltinType::WChar_S:
1514 case BuiltinType::WChar_U:
1515 // FIXME: If not in C++, shall we translate to the C equivalent of
1517 return Importer.getToContext().WCharTy;
1520 llvm_unreachable("Invalid BuiltinType Kind!");
1523 QualType ASTNodeImporter::VisitComplexType(const ComplexType *T) {
1524 QualType ToElementType = Importer.Import(T->getElementType());
1525 if (ToElementType.isNull())
1528 return Importer.getToContext().getComplexType(ToElementType);
1531 QualType ASTNodeImporter::VisitPointerType(const PointerType *T) {
1532 QualType ToPointeeType = Importer.Import(T->getPointeeType());
1533 if (ToPointeeType.isNull())
1536 return Importer.getToContext().getPointerType(ToPointeeType);
1539 QualType ASTNodeImporter::VisitBlockPointerType(const BlockPointerType *T) {
1540 // FIXME: Check for blocks support in "to" context.
1541 QualType ToPointeeType = Importer.Import(T->getPointeeType());
1542 if (ToPointeeType.isNull())
1545 return Importer.getToContext().getBlockPointerType(ToPointeeType);
1549 ASTNodeImporter::VisitLValueReferenceType(const LValueReferenceType *T) {
1550 // FIXME: Check for C++ support in "to" context.
1551 QualType ToPointeeType = Importer.Import(T->getPointeeTypeAsWritten());
1552 if (ToPointeeType.isNull())
1555 return Importer.getToContext().getLValueReferenceType(ToPointeeType);
1559 ASTNodeImporter::VisitRValueReferenceType(const RValueReferenceType *T) {
1560 // FIXME: Check for C++0x support in "to" context.
1561 QualType ToPointeeType = Importer.Import(T->getPointeeTypeAsWritten());
1562 if (ToPointeeType.isNull())
1565 return Importer.getToContext().getRValueReferenceType(ToPointeeType);
1568 QualType ASTNodeImporter::VisitMemberPointerType(const MemberPointerType *T) {
1569 // FIXME: Check for C++ support in "to" context.
1570 QualType ToPointeeType = Importer.Import(T->getPointeeType());
1571 if (ToPointeeType.isNull())
1574 QualType ClassType = Importer.Import(QualType(T->getClass(), 0));
1575 return Importer.getToContext().getMemberPointerType(ToPointeeType,
1576 ClassType.getTypePtr());
1579 QualType ASTNodeImporter::VisitConstantArrayType(const ConstantArrayType *T) {
1580 QualType ToElementType = Importer.Import(T->getElementType());
1581 if (ToElementType.isNull())
1584 return Importer.getToContext().getConstantArrayType(ToElementType,
1586 T->getSizeModifier(),
1587 T->getIndexTypeCVRQualifiers());
1591 ASTNodeImporter::VisitIncompleteArrayType(const IncompleteArrayType *T) {
1592 QualType ToElementType = Importer.Import(T->getElementType());
1593 if (ToElementType.isNull())
1596 return Importer.getToContext().getIncompleteArrayType(ToElementType,
1597 T->getSizeModifier(),
1598 T->getIndexTypeCVRQualifiers());
1601 QualType ASTNodeImporter::VisitVariableArrayType(const VariableArrayType *T) {
1602 QualType ToElementType = Importer.Import(T->getElementType());
1603 if (ToElementType.isNull())
1606 Expr *Size = Importer.Import(T->getSizeExpr());
1610 SourceRange Brackets = Importer.Import(T->getBracketsRange());
1611 return Importer.getToContext().getVariableArrayType(ToElementType, Size,
1612 T->getSizeModifier(),
1613 T->getIndexTypeCVRQualifiers(),
1617 QualType ASTNodeImporter::VisitVectorType(const VectorType *T) {
1618 QualType ToElementType = Importer.Import(T->getElementType());
1619 if (ToElementType.isNull())
1622 return Importer.getToContext().getVectorType(ToElementType,
1623 T->getNumElements(),
1624 T->getVectorKind());
1627 QualType ASTNodeImporter::VisitExtVectorType(const ExtVectorType *T) {
1628 QualType ToElementType = Importer.Import(T->getElementType());
1629 if (ToElementType.isNull())
1632 return Importer.getToContext().getExtVectorType(ToElementType,
1633 T->getNumElements());
1637 ASTNodeImporter::VisitFunctionNoProtoType(const FunctionNoProtoType *T) {
1638 // FIXME: What happens if we're importing a function without a prototype
1639 // into C++? Should we make it variadic?
1640 QualType ToResultType = Importer.Import(T->getReturnType());
1641 if (ToResultType.isNull())
1644 return Importer.getToContext().getFunctionNoProtoType(ToResultType,
1648 QualType ASTNodeImporter::VisitFunctionProtoType(const FunctionProtoType *T) {
1649 QualType ToResultType = Importer.Import(T->getReturnType());
1650 if (ToResultType.isNull())
1653 // Import argument types
1654 SmallVector<QualType, 4> ArgTypes;
1655 for (const auto &A : T->param_types()) {
1656 QualType ArgType = Importer.Import(A);
1657 if (ArgType.isNull())
1659 ArgTypes.push_back(ArgType);
1662 // Import exception types
1663 SmallVector<QualType, 4> ExceptionTypes;
1664 for (const auto &E : T->exceptions()) {
1665 QualType ExceptionType = Importer.Import(E);
1666 if (ExceptionType.isNull())
1668 ExceptionTypes.push_back(ExceptionType);
1671 FunctionProtoType::ExtProtoInfo FromEPI = T->getExtProtoInfo();
1672 FunctionProtoType::ExtProtoInfo ToEPI;
1674 ToEPI.ExtInfo = FromEPI.ExtInfo;
1675 ToEPI.Variadic = FromEPI.Variadic;
1676 ToEPI.HasTrailingReturn = FromEPI.HasTrailingReturn;
1677 ToEPI.TypeQuals = FromEPI.TypeQuals;
1678 ToEPI.RefQualifier = FromEPI.RefQualifier;
1679 ToEPI.ExceptionSpec.Type = FromEPI.ExceptionSpec.Type;
1680 ToEPI.ExceptionSpec.Exceptions = ExceptionTypes;
1681 ToEPI.ExceptionSpec.NoexceptExpr =
1682 Importer.Import(FromEPI.ExceptionSpec.NoexceptExpr);
1683 ToEPI.ExceptionSpec.SourceDecl = cast_or_null<FunctionDecl>(
1684 Importer.Import(FromEPI.ExceptionSpec.SourceDecl));
1685 ToEPI.ExceptionSpec.SourceTemplate = cast_or_null<FunctionDecl>(
1686 Importer.Import(FromEPI.ExceptionSpec.SourceTemplate));
1688 return Importer.getToContext().getFunctionType(ToResultType, ArgTypes, ToEPI);
1691 QualType ASTNodeImporter::VisitParenType(const ParenType *T) {
1692 QualType ToInnerType = Importer.Import(T->getInnerType());
1693 if (ToInnerType.isNull())
1696 return Importer.getToContext().getParenType(ToInnerType);
1699 QualType ASTNodeImporter::VisitTypedefType(const TypedefType *T) {
1700 TypedefNameDecl *ToDecl
1701 = dyn_cast_or_null<TypedefNameDecl>(Importer.Import(T->getDecl()));
1705 return Importer.getToContext().getTypeDeclType(ToDecl);
1708 QualType ASTNodeImporter::VisitTypeOfExprType(const TypeOfExprType *T) {
1709 Expr *ToExpr = Importer.Import(T->getUnderlyingExpr());
1713 return Importer.getToContext().getTypeOfExprType(ToExpr);
1716 QualType ASTNodeImporter::VisitTypeOfType(const TypeOfType *T) {
1717 QualType ToUnderlyingType = Importer.Import(T->getUnderlyingType());
1718 if (ToUnderlyingType.isNull())
1721 return Importer.getToContext().getTypeOfType(ToUnderlyingType);
1724 QualType ASTNodeImporter::VisitDecltypeType(const DecltypeType *T) {
1725 // FIXME: Make sure that the "to" context supports C++0x!
1726 Expr *ToExpr = Importer.Import(T->getUnderlyingExpr());
1730 QualType UnderlyingType = Importer.Import(T->getUnderlyingType());
1731 if (UnderlyingType.isNull())
1734 return Importer.getToContext().getDecltypeType(ToExpr, UnderlyingType);
1737 QualType ASTNodeImporter::VisitUnaryTransformType(const UnaryTransformType *T) {
1738 QualType ToBaseType = Importer.Import(T->getBaseType());
1739 QualType ToUnderlyingType = Importer.Import(T->getUnderlyingType());
1740 if (ToBaseType.isNull() || ToUnderlyingType.isNull())
1743 return Importer.getToContext().getUnaryTransformType(ToBaseType,
1748 QualType ASTNodeImporter::VisitAutoType(const AutoType *T) {
1749 // FIXME: Make sure that the "to" context supports C++11!
1750 QualType FromDeduced = T->getDeducedType();
1752 if (!FromDeduced.isNull()) {
1753 ToDeduced = Importer.Import(FromDeduced);
1754 if (ToDeduced.isNull())
1758 return Importer.getToContext().getAutoType(ToDeduced, T->getKeyword(),
1759 /*IsDependent*/false);
1762 QualType ASTNodeImporter::VisitRecordType(const RecordType *T) {
1764 = dyn_cast_or_null<RecordDecl>(Importer.Import(T->getDecl()));
1768 return Importer.getToContext().getTagDeclType(ToDecl);
1771 QualType ASTNodeImporter::VisitEnumType(const EnumType *T) {
1773 = dyn_cast_or_null<EnumDecl>(Importer.Import(T->getDecl()));
1777 return Importer.getToContext().getTagDeclType(ToDecl);
1780 QualType ASTNodeImporter::VisitAttributedType(const AttributedType *T) {
1781 QualType FromModifiedType = T->getModifiedType();
1782 QualType FromEquivalentType = T->getEquivalentType();
1783 QualType ToModifiedType;
1784 QualType ToEquivalentType;
1786 if (!FromModifiedType.isNull()) {
1787 ToModifiedType = Importer.Import(FromModifiedType);
1788 if (ToModifiedType.isNull())
1791 if (!FromEquivalentType.isNull()) {
1792 ToEquivalentType = Importer.Import(FromEquivalentType);
1793 if (ToEquivalentType.isNull())
1797 return Importer.getToContext().getAttributedType(T->getAttrKind(),
1798 ToModifiedType, ToEquivalentType);
1801 QualType ASTNodeImporter::VisitTemplateSpecializationType(
1802 const TemplateSpecializationType *T) {
1803 TemplateName ToTemplate = Importer.Import(T->getTemplateName());
1804 if (ToTemplate.isNull())
1807 SmallVector<TemplateArgument, 2> ToTemplateArgs;
1808 if (ImportTemplateArguments(T->getArgs(), T->getNumArgs(), ToTemplateArgs))
1811 QualType ToCanonType;
1812 if (!QualType(T, 0).isCanonical()) {
1813 QualType FromCanonType
1814 = Importer.getFromContext().getCanonicalType(QualType(T, 0));
1815 ToCanonType =Importer.Import(FromCanonType);
1816 if (ToCanonType.isNull())
1819 return Importer.getToContext().getTemplateSpecializationType(ToTemplate,
1820 ToTemplateArgs.data(),
1821 ToTemplateArgs.size(),
1825 QualType ASTNodeImporter::VisitElaboratedType(const ElaboratedType *T) {
1826 NestedNameSpecifier *ToQualifier = nullptr;
1827 // Note: the qualifier in an ElaboratedType is optional.
1828 if (T->getQualifier()) {
1829 ToQualifier = Importer.Import(T->getQualifier());
1834 QualType ToNamedType = Importer.Import(T->getNamedType());
1835 if (ToNamedType.isNull())
1838 return Importer.getToContext().getElaboratedType(T->getKeyword(),
1839 ToQualifier, ToNamedType);
1842 QualType ASTNodeImporter::VisitObjCInterfaceType(const ObjCInterfaceType *T) {
1843 ObjCInterfaceDecl *Class
1844 = dyn_cast_or_null<ObjCInterfaceDecl>(Importer.Import(T->getDecl()));
1848 return Importer.getToContext().getObjCInterfaceType(Class);
1851 QualType ASTNodeImporter::VisitObjCObjectType(const ObjCObjectType *T) {
1852 QualType ToBaseType = Importer.Import(T->getBaseType());
1853 if (ToBaseType.isNull())
1856 SmallVector<QualType, 4> TypeArgs;
1857 for (auto TypeArg : T->getTypeArgsAsWritten()) {
1858 QualType ImportedTypeArg = Importer.Import(TypeArg);
1859 if (ImportedTypeArg.isNull())
1862 TypeArgs.push_back(ImportedTypeArg);
1865 SmallVector<ObjCProtocolDecl *, 4> Protocols;
1866 for (auto *P : T->quals()) {
1867 ObjCProtocolDecl *Protocol
1868 = dyn_cast_or_null<ObjCProtocolDecl>(Importer.Import(P));
1871 Protocols.push_back(Protocol);
1874 return Importer.getToContext().getObjCObjectType(ToBaseType, TypeArgs,
1876 T->isKindOfTypeAsWritten());
1880 ASTNodeImporter::VisitObjCObjectPointerType(const ObjCObjectPointerType *T) {
1881 QualType ToPointeeType = Importer.Import(T->getPointeeType());
1882 if (ToPointeeType.isNull())
1885 return Importer.getToContext().getObjCObjectPointerType(ToPointeeType);
1888 //----------------------------------------------------------------------------
1889 // Import Declarations
1890 //----------------------------------------------------------------------------
1891 bool ASTNodeImporter::ImportDeclParts(NamedDecl *D, DeclContext *&DC,
1892 DeclContext *&LexicalDC,
1893 DeclarationName &Name,
1895 SourceLocation &Loc) {
1896 // Import the context of this declaration.
1897 DC = Importer.ImportContext(D->getDeclContext());
1902 if (D->getDeclContext() != D->getLexicalDeclContext()) {
1903 LexicalDC = Importer.ImportContext(D->getLexicalDeclContext());
1908 // Import the name of this declaration.
1909 Name = Importer.Import(D->getDeclName());
1910 if (D->getDeclName() && !Name)
1913 // Import the location of this declaration.
1914 Loc = Importer.Import(D->getLocation());
1915 ToD = cast_or_null<NamedDecl>(Importer.GetAlreadyImportedOrNull(D));
1919 void ASTNodeImporter::ImportDefinitionIfNeeded(Decl *FromD, Decl *ToD) {
1924 ToD = Importer.Import(FromD);
1929 if (RecordDecl *FromRecord = dyn_cast<RecordDecl>(FromD)) {
1930 if (RecordDecl *ToRecord = cast_or_null<RecordDecl>(ToD)) {
1931 if (FromRecord->getDefinition() && FromRecord->isCompleteDefinition() && !ToRecord->getDefinition()) {
1932 ImportDefinition(FromRecord, ToRecord);
1938 if (EnumDecl *FromEnum = dyn_cast<EnumDecl>(FromD)) {
1939 if (EnumDecl *ToEnum = cast_or_null<EnumDecl>(ToD)) {
1940 if (FromEnum->getDefinition() && !ToEnum->getDefinition()) {
1941 ImportDefinition(FromEnum, ToEnum);
1949 ASTNodeImporter::ImportDeclarationNameLoc(const DeclarationNameInfo &From,
1950 DeclarationNameInfo& To) {
1951 // NOTE: To.Name and To.Loc are already imported.
1952 // We only have to import To.LocInfo.
1953 switch (To.getName().getNameKind()) {
1954 case DeclarationName::Identifier:
1955 case DeclarationName::ObjCZeroArgSelector:
1956 case DeclarationName::ObjCOneArgSelector:
1957 case DeclarationName::ObjCMultiArgSelector:
1958 case DeclarationName::CXXUsingDirective:
1961 case DeclarationName::CXXOperatorName: {
1962 SourceRange Range = From.getCXXOperatorNameRange();
1963 To.setCXXOperatorNameRange(Importer.Import(Range));
1966 case DeclarationName::CXXLiteralOperatorName: {
1967 SourceLocation Loc = From.getCXXLiteralOperatorNameLoc();
1968 To.setCXXLiteralOperatorNameLoc(Importer.Import(Loc));
1971 case DeclarationName::CXXConstructorName:
1972 case DeclarationName::CXXDestructorName:
1973 case DeclarationName::CXXConversionFunctionName: {
1974 TypeSourceInfo *FromTInfo = From.getNamedTypeInfo();
1975 To.setNamedTypeInfo(Importer.Import(FromTInfo));
1979 llvm_unreachable("Unknown name kind.");
1982 void ASTNodeImporter::ImportDeclContext(DeclContext *FromDC, bool ForceImport) {
1983 if (Importer.isMinimalImport() && !ForceImport) {
1984 Importer.ImportContext(FromDC);
1988 for (auto *From : FromDC->decls())
1989 Importer.Import(From);
1992 bool ASTNodeImporter::ImportDefinition(RecordDecl *From, RecordDecl *To,
1993 ImportDefinitionKind Kind) {
1994 if (To->getDefinition() || To->isBeingDefined()) {
1995 if (Kind == IDK_Everything)
1996 ImportDeclContext(From, /*ForceImport=*/true);
2001 To->startDefinition();
2003 // Add base classes.
2004 if (CXXRecordDecl *ToCXX = dyn_cast<CXXRecordDecl>(To)) {
2005 CXXRecordDecl *FromCXX = cast<CXXRecordDecl>(From);
2007 struct CXXRecordDecl::DefinitionData &ToData = ToCXX->data();
2008 struct CXXRecordDecl::DefinitionData &FromData = FromCXX->data();
2009 ToData.UserDeclaredConstructor = FromData.UserDeclaredConstructor;
2010 ToData.UserDeclaredSpecialMembers = FromData.UserDeclaredSpecialMembers;
2011 ToData.Aggregate = FromData.Aggregate;
2012 ToData.PlainOldData = FromData.PlainOldData;
2013 ToData.Empty = FromData.Empty;
2014 ToData.Polymorphic = FromData.Polymorphic;
2015 ToData.Abstract = FromData.Abstract;
2016 ToData.IsStandardLayout = FromData.IsStandardLayout;
2017 ToData.HasNoNonEmptyBases = FromData.HasNoNonEmptyBases;
2018 ToData.HasPrivateFields = FromData.HasPrivateFields;
2019 ToData.HasProtectedFields = FromData.HasProtectedFields;
2020 ToData.HasPublicFields = FromData.HasPublicFields;
2021 ToData.HasMutableFields = FromData.HasMutableFields;
2022 ToData.HasVariantMembers = FromData.HasVariantMembers;
2023 ToData.HasOnlyCMembers = FromData.HasOnlyCMembers;
2024 ToData.HasInClassInitializer = FromData.HasInClassInitializer;
2025 ToData.HasUninitializedReferenceMember
2026 = FromData.HasUninitializedReferenceMember;
2027 ToData.HasUninitializedFields = FromData.HasUninitializedFields;
2028 ToData.NeedOverloadResolutionForMoveConstructor
2029 = FromData.NeedOverloadResolutionForMoveConstructor;
2030 ToData.NeedOverloadResolutionForMoveAssignment
2031 = FromData.NeedOverloadResolutionForMoveAssignment;
2032 ToData.NeedOverloadResolutionForDestructor
2033 = FromData.NeedOverloadResolutionForDestructor;
2034 ToData.DefaultedMoveConstructorIsDeleted
2035 = FromData.DefaultedMoveConstructorIsDeleted;
2036 ToData.DefaultedMoveAssignmentIsDeleted
2037 = FromData.DefaultedMoveAssignmentIsDeleted;
2038 ToData.DefaultedDestructorIsDeleted = FromData.DefaultedDestructorIsDeleted;
2039 ToData.HasTrivialSpecialMembers = FromData.HasTrivialSpecialMembers;
2040 ToData.HasIrrelevantDestructor = FromData.HasIrrelevantDestructor;
2041 ToData.HasConstexprNonCopyMoveConstructor
2042 = FromData.HasConstexprNonCopyMoveConstructor;
2043 ToData.HasDefaultedDefaultConstructor
2044 = FromData.HasDefaultedDefaultConstructor;
2045 ToData.DefaultedDefaultConstructorIsConstexpr
2046 = FromData.DefaultedDefaultConstructorIsConstexpr;
2047 ToData.HasConstexprDefaultConstructor
2048 = FromData.HasConstexprDefaultConstructor;
2049 ToData.HasNonLiteralTypeFieldsOrBases
2050 = FromData.HasNonLiteralTypeFieldsOrBases;
2051 // ComputedVisibleConversions not imported.
2052 ToData.UserProvidedDefaultConstructor
2053 = FromData.UserProvidedDefaultConstructor;
2054 ToData.DeclaredSpecialMembers = FromData.DeclaredSpecialMembers;
2055 ToData.ImplicitCopyConstructorHasConstParam
2056 = FromData.ImplicitCopyConstructorHasConstParam;
2057 ToData.ImplicitCopyAssignmentHasConstParam
2058 = FromData.ImplicitCopyAssignmentHasConstParam;
2059 ToData.HasDeclaredCopyConstructorWithConstParam
2060 = FromData.HasDeclaredCopyConstructorWithConstParam;
2061 ToData.HasDeclaredCopyAssignmentWithConstParam
2062 = FromData.HasDeclaredCopyAssignmentWithConstParam;
2063 ToData.IsLambda = FromData.IsLambda;
2065 SmallVector<CXXBaseSpecifier *, 4> Bases;
2066 for (const auto &Base1 : FromCXX->bases()) {
2067 QualType T = Importer.Import(Base1.getType());
2071 SourceLocation EllipsisLoc;
2072 if (Base1.isPackExpansion())
2073 EllipsisLoc = Importer.Import(Base1.getEllipsisLoc());
2075 // Ensure that we have a definition for the base.
2076 ImportDefinitionIfNeeded(Base1.getType()->getAsCXXRecordDecl());
2079 new (Importer.getToContext())
2080 CXXBaseSpecifier(Importer.Import(Base1.getSourceRange()),
2082 Base1.isBaseOfClass(),
2083 Base1.getAccessSpecifierAsWritten(),
2084 Importer.Import(Base1.getTypeSourceInfo()),
2088 ToCXX->setBases(Bases.data(), Bases.size());
2091 if (shouldForceImportDeclContext(Kind))
2092 ImportDeclContext(From, /*ForceImport=*/true);
2094 To->completeDefinition();
2098 bool ASTNodeImporter::ImportDefinition(VarDecl *From, VarDecl *To,
2099 ImportDefinitionKind Kind) {
2100 if (To->getAnyInitializer())
2103 // FIXME: Can we really import any initializer? Alternatively, we could force
2104 // ourselves to import every declaration of a variable and then only use
2106 To->setInit(Importer.Import(const_cast<Expr *>(From->getAnyInitializer())));
2108 // FIXME: Other bits to merge?
2113 bool ASTNodeImporter::ImportDefinition(EnumDecl *From, EnumDecl *To,
2114 ImportDefinitionKind Kind) {
2115 if (To->getDefinition() || To->isBeingDefined()) {
2116 if (Kind == IDK_Everything)
2117 ImportDeclContext(From, /*ForceImport=*/true);
2121 To->startDefinition();
2123 QualType T = Importer.Import(Importer.getFromContext().getTypeDeclType(From));
2127 QualType ToPromotionType = Importer.Import(From->getPromotionType());
2128 if (ToPromotionType.isNull())
2131 if (shouldForceImportDeclContext(Kind))
2132 ImportDeclContext(From, /*ForceImport=*/true);
2134 // FIXME: we might need to merge the number of positive or negative bits
2135 // if the enumerator lists don't match.
2136 To->completeDefinition(T, ToPromotionType,
2137 From->getNumPositiveBits(),
2138 From->getNumNegativeBits());
2142 TemplateParameterList *ASTNodeImporter::ImportTemplateParameterList(
2143 TemplateParameterList *Params) {
2144 SmallVector<NamedDecl *, 4> ToParams;
2145 ToParams.reserve(Params->size());
2146 for (TemplateParameterList::iterator P = Params->begin(),
2147 PEnd = Params->end();
2149 Decl *To = Importer.Import(*P);
2153 ToParams.push_back(cast<NamedDecl>(To));
2156 return TemplateParameterList::Create(Importer.getToContext(),
2157 Importer.Import(Params->getTemplateLoc()),
2158 Importer.Import(Params->getLAngleLoc()),
2160 Importer.Import(Params->getRAngleLoc()));
2164 ASTNodeImporter::ImportTemplateArgument(const TemplateArgument &From) {
2165 switch (From.getKind()) {
2166 case TemplateArgument::Null:
2167 return TemplateArgument();
2169 case TemplateArgument::Type: {
2170 QualType ToType = Importer.Import(From.getAsType());
2171 if (ToType.isNull())
2172 return TemplateArgument();
2173 return TemplateArgument(ToType);
2176 case TemplateArgument::Integral: {
2177 QualType ToType = Importer.Import(From.getIntegralType());
2178 if (ToType.isNull())
2179 return TemplateArgument();
2180 return TemplateArgument(From, ToType);
2183 case TemplateArgument::Declaration: {
2184 ValueDecl *To = cast_or_null<ValueDecl>(Importer.Import(From.getAsDecl()));
2185 QualType ToType = Importer.Import(From.getParamTypeForDecl());
2186 if (!To || ToType.isNull())
2187 return TemplateArgument();
2188 return TemplateArgument(To, ToType);
2191 case TemplateArgument::NullPtr: {
2192 QualType ToType = Importer.Import(From.getNullPtrType());
2193 if (ToType.isNull())
2194 return TemplateArgument();
2195 return TemplateArgument(ToType, /*isNullPtr*/true);
2198 case TemplateArgument::Template: {
2199 TemplateName ToTemplate = Importer.Import(From.getAsTemplate());
2200 if (ToTemplate.isNull())
2201 return TemplateArgument();
2203 return TemplateArgument(ToTemplate);
2206 case TemplateArgument::TemplateExpansion: {
2207 TemplateName ToTemplate
2208 = Importer.Import(From.getAsTemplateOrTemplatePattern());
2209 if (ToTemplate.isNull())
2210 return TemplateArgument();
2212 return TemplateArgument(ToTemplate, From.getNumTemplateExpansions());
2215 case TemplateArgument::Expression:
2216 if (Expr *ToExpr = Importer.Import(From.getAsExpr()))
2217 return TemplateArgument(ToExpr);
2218 return TemplateArgument();
2220 case TemplateArgument::Pack: {
2221 SmallVector<TemplateArgument, 2> ToPack;
2222 ToPack.reserve(From.pack_size());
2223 if (ImportTemplateArguments(From.pack_begin(), From.pack_size(), ToPack))
2224 return TemplateArgument();
2226 return TemplateArgument(
2227 llvm::makeArrayRef(ToPack).copy(Importer.getToContext()));
2231 llvm_unreachable("Invalid template argument kind");
2234 bool ASTNodeImporter::ImportTemplateArguments(const TemplateArgument *FromArgs,
2235 unsigned NumFromArgs,
2236 SmallVectorImpl<TemplateArgument> &ToArgs) {
2237 for (unsigned I = 0; I != NumFromArgs; ++I) {
2238 TemplateArgument To = ImportTemplateArgument(FromArgs[I]);
2239 if (To.isNull() && !FromArgs[I].isNull())
2242 ToArgs.push_back(To);
2248 bool ASTNodeImporter::IsStructuralMatch(RecordDecl *FromRecord,
2249 RecordDecl *ToRecord, bool Complain) {
2250 // Eliminate a potential failure point where we attempt to re-import
2251 // something we're trying to import while completing ToRecord.
2252 Decl *ToOrigin = Importer.GetOriginalDecl(ToRecord);
2254 RecordDecl *ToOriginRecord = dyn_cast<RecordDecl>(ToOrigin);
2256 ToRecord = ToOriginRecord;
2259 StructuralEquivalenceContext Ctx(Importer.getFromContext(),
2260 ToRecord->getASTContext(),
2261 Importer.getNonEquivalentDecls(),
2263 return Ctx.IsStructurallyEquivalent(FromRecord, ToRecord);
2266 bool ASTNodeImporter::IsStructuralMatch(VarDecl *FromVar, VarDecl *ToVar,
2268 StructuralEquivalenceContext Ctx(
2269 Importer.getFromContext(), Importer.getToContext(),
2270 Importer.getNonEquivalentDecls(), false, Complain);
2271 return Ctx.IsStructurallyEquivalent(FromVar, ToVar);
2274 bool ASTNodeImporter::IsStructuralMatch(EnumDecl *FromEnum, EnumDecl *ToEnum) {
2275 StructuralEquivalenceContext Ctx(Importer.getFromContext(),
2276 Importer.getToContext(),
2277 Importer.getNonEquivalentDecls());
2278 return Ctx.IsStructurallyEquivalent(FromEnum, ToEnum);
2281 bool ASTNodeImporter::IsStructuralMatch(EnumConstantDecl *FromEC,
2282 EnumConstantDecl *ToEC)
2284 const llvm::APSInt &FromVal = FromEC->getInitVal();
2285 const llvm::APSInt &ToVal = ToEC->getInitVal();
2287 return FromVal.isSigned() == ToVal.isSigned() &&
2288 FromVal.getBitWidth() == ToVal.getBitWidth() &&
2292 bool ASTNodeImporter::IsStructuralMatch(ClassTemplateDecl *From,
2293 ClassTemplateDecl *To) {
2294 StructuralEquivalenceContext Ctx(Importer.getFromContext(),
2295 Importer.getToContext(),
2296 Importer.getNonEquivalentDecls());
2297 return Ctx.IsStructurallyEquivalent(From, To);
2300 bool ASTNodeImporter::IsStructuralMatch(VarTemplateDecl *From,
2301 VarTemplateDecl *To) {
2302 StructuralEquivalenceContext Ctx(Importer.getFromContext(),
2303 Importer.getToContext(),
2304 Importer.getNonEquivalentDecls());
2305 return Ctx.IsStructurallyEquivalent(From, To);
2308 Decl *ASTNodeImporter::VisitDecl(Decl *D) {
2309 Importer.FromDiag(D->getLocation(), diag::err_unsupported_ast_node)
2310 << D->getDeclKindName();
2314 Decl *ASTNodeImporter::VisitTranslationUnitDecl(TranslationUnitDecl *D) {
2315 TranslationUnitDecl *ToD =
2316 Importer.getToContext().getTranslationUnitDecl();
2318 Importer.Imported(D, ToD);
2323 Decl *ASTNodeImporter::VisitAccessSpecDecl(AccessSpecDecl *D) {
2325 SourceLocation Loc = Importer.Import(D->getLocation());
2326 SourceLocation ColonLoc = Importer.Import(D->getColonLoc());
2328 // Import the context of this declaration.
2329 DeclContext *DC = Importer.ImportContext(D->getDeclContext());
2333 AccessSpecDecl *accessSpecDecl
2334 = AccessSpecDecl::Create(Importer.getToContext(), D->getAccess(),
2337 if (!accessSpecDecl)
2340 // Lexical DeclContext and Semantic DeclContext
2341 // is always the same for the accessSpec.
2342 accessSpecDecl->setLexicalDeclContext(DC);
2343 DC->addDeclInternal(accessSpecDecl);
2345 return accessSpecDecl;
2348 Decl *ASTNodeImporter::VisitNamespaceDecl(NamespaceDecl *D) {
2349 // Import the major distinguishing characteristics of this namespace.
2350 DeclContext *DC, *LexicalDC;
2351 DeclarationName Name;
2354 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
2359 NamespaceDecl *MergeWithNamespace = nullptr;
2361 // This is an anonymous namespace. Adopt an existing anonymous
2362 // namespace if we can.
2363 // FIXME: Not testable.
2364 if (TranslationUnitDecl *TU = dyn_cast<TranslationUnitDecl>(DC))
2365 MergeWithNamespace = TU->getAnonymousNamespace();
2367 MergeWithNamespace = cast<NamespaceDecl>(DC)->getAnonymousNamespace();
2369 SmallVector<NamedDecl *, 4> ConflictingDecls;
2370 SmallVector<NamedDecl *, 2> FoundDecls;
2371 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls);
2372 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
2373 if (!FoundDecls[I]->isInIdentifierNamespace(Decl::IDNS_Namespace))
2376 if (NamespaceDecl *FoundNS = dyn_cast<NamespaceDecl>(FoundDecls[I])) {
2377 MergeWithNamespace = FoundNS;
2378 ConflictingDecls.clear();
2382 ConflictingDecls.push_back(FoundDecls[I]);
2385 if (!ConflictingDecls.empty()) {
2386 Name = Importer.HandleNameConflict(Name, DC, Decl::IDNS_Namespace,
2387 ConflictingDecls.data(),
2388 ConflictingDecls.size());
2392 // Create the "to" namespace, if needed.
2393 NamespaceDecl *ToNamespace = MergeWithNamespace;
2395 ToNamespace = NamespaceDecl::Create(Importer.getToContext(), DC,
2397 Importer.Import(D->getLocStart()),
2398 Loc, Name.getAsIdentifierInfo(),
2399 /*PrevDecl=*/nullptr);
2400 ToNamespace->setLexicalDeclContext(LexicalDC);
2401 LexicalDC->addDeclInternal(ToNamespace);
2403 // If this is an anonymous namespace, register it as the anonymous
2404 // namespace within its context.
2406 if (TranslationUnitDecl *TU = dyn_cast<TranslationUnitDecl>(DC))
2407 TU->setAnonymousNamespace(ToNamespace);
2409 cast<NamespaceDecl>(DC)->setAnonymousNamespace(ToNamespace);
2412 Importer.Imported(D, ToNamespace);
2414 ImportDeclContext(D);
2419 Decl *ASTNodeImporter::VisitTypedefNameDecl(TypedefNameDecl *D, bool IsAlias) {
2420 // Import the major distinguishing characteristics of this typedef.
2421 DeclContext *DC, *LexicalDC;
2422 DeclarationName Name;
2425 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
2430 // If this typedef is not in block scope, determine whether we've
2431 // seen a typedef with the same name (that we can merge with) or any
2432 // other entity by that name (which name lookup could conflict with).
2433 if (!DC->isFunctionOrMethod()) {
2434 SmallVector<NamedDecl *, 4> ConflictingDecls;
2435 unsigned IDNS = Decl::IDNS_Ordinary;
2436 SmallVector<NamedDecl *, 2> FoundDecls;
2437 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls);
2438 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
2439 if (!FoundDecls[I]->isInIdentifierNamespace(IDNS))
2441 if (TypedefNameDecl *FoundTypedef =
2442 dyn_cast<TypedefNameDecl>(FoundDecls[I])) {
2443 if (Importer.IsStructurallyEquivalent(D->getUnderlyingType(),
2444 FoundTypedef->getUnderlyingType()))
2445 return Importer.Imported(D, FoundTypedef);
2448 ConflictingDecls.push_back(FoundDecls[I]);
2451 if (!ConflictingDecls.empty()) {
2452 Name = Importer.HandleNameConflict(Name, DC, IDNS,
2453 ConflictingDecls.data(),
2454 ConflictingDecls.size());
2460 // Import the underlying type of this typedef;
2461 QualType T = Importer.Import(D->getUnderlyingType());
2465 // Create the new typedef node.
2466 TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo());
2467 SourceLocation StartL = Importer.Import(D->getLocStart());
2468 TypedefNameDecl *ToTypedef;
2470 ToTypedef = TypeAliasDecl::Create(Importer.getToContext(), DC,
2472 Name.getAsIdentifierInfo(),
2475 ToTypedef = TypedefDecl::Create(Importer.getToContext(), DC,
2477 Name.getAsIdentifierInfo(),
2480 ToTypedef->setAccess(D->getAccess());
2481 ToTypedef->setLexicalDeclContext(LexicalDC);
2482 Importer.Imported(D, ToTypedef);
2483 LexicalDC->addDeclInternal(ToTypedef);
2488 Decl *ASTNodeImporter::VisitTypedefDecl(TypedefDecl *D) {
2489 return VisitTypedefNameDecl(D, /*IsAlias=*/false);
2492 Decl *ASTNodeImporter::VisitTypeAliasDecl(TypeAliasDecl *D) {
2493 return VisitTypedefNameDecl(D, /*IsAlias=*/true);
2496 Decl *ASTNodeImporter::VisitEnumDecl(EnumDecl *D) {
2497 // Import the major distinguishing characteristics of this enum.
2498 DeclContext *DC, *LexicalDC;
2499 DeclarationName Name;
2502 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
2507 // Figure out what enum name we're looking for.
2508 unsigned IDNS = Decl::IDNS_Tag;
2509 DeclarationName SearchName = Name;
2510 if (!SearchName && D->getTypedefNameForAnonDecl()) {
2511 SearchName = Importer.Import(D->getTypedefNameForAnonDecl()->getDeclName());
2512 IDNS = Decl::IDNS_Ordinary;
2513 } else if (Importer.getToContext().getLangOpts().CPlusPlus)
2514 IDNS |= Decl::IDNS_Ordinary;
2516 // We may already have an enum of the same name; try to find and match it.
2517 if (!DC->isFunctionOrMethod() && SearchName) {
2518 SmallVector<NamedDecl *, 4> ConflictingDecls;
2519 SmallVector<NamedDecl *, 2> FoundDecls;
2520 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls);
2521 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
2522 if (!FoundDecls[I]->isInIdentifierNamespace(IDNS))
2525 Decl *Found = FoundDecls[I];
2526 if (TypedefNameDecl *Typedef = dyn_cast<TypedefNameDecl>(Found)) {
2527 if (const TagType *Tag = Typedef->getUnderlyingType()->getAs<TagType>())
2528 Found = Tag->getDecl();
2531 if (EnumDecl *FoundEnum = dyn_cast<EnumDecl>(Found)) {
2532 if (IsStructuralMatch(D, FoundEnum))
2533 return Importer.Imported(D, FoundEnum);
2536 ConflictingDecls.push_back(FoundDecls[I]);
2539 if (!ConflictingDecls.empty()) {
2540 Name = Importer.HandleNameConflict(Name, DC, IDNS,
2541 ConflictingDecls.data(),
2542 ConflictingDecls.size());
2546 // Create the enum declaration.
2547 EnumDecl *D2 = EnumDecl::Create(Importer.getToContext(), DC,
2548 Importer.Import(D->getLocStart()),
2549 Loc, Name.getAsIdentifierInfo(), nullptr,
2550 D->isScoped(), D->isScopedUsingClassTag(),
2552 // Import the qualifier, if any.
2553 D2->setQualifierInfo(Importer.Import(D->getQualifierLoc()));
2554 D2->setAccess(D->getAccess());
2555 D2->setLexicalDeclContext(LexicalDC);
2556 Importer.Imported(D, D2);
2557 LexicalDC->addDeclInternal(D2);
2559 // Import the integer type.
2560 QualType ToIntegerType = Importer.Import(D->getIntegerType());
2561 if (ToIntegerType.isNull())
2563 D2->setIntegerType(ToIntegerType);
2565 // Import the definition
2566 if (D->isCompleteDefinition() && ImportDefinition(D, D2))
2572 Decl *ASTNodeImporter::VisitRecordDecl(RecordDecl *D) {
2573 // If this record has a definition in the translation unit we're coming from,
2574 // but this particular declaration is not that definition, import the
2575 // definition and map to that.
2576 TagDecl *Definition = D->getDefinition();
2577 if (Definition && Definition != D) {
2578 Decl *ImportedDef = Importer.Import(Definition);
2582 return Importer.Imported(D, ImportedDef);
2585 // Import the major distinguishing characteristics of this record.
2586 DeclContext *DC, *LexicalDC;
2587 DeclarationName Name;
2590 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
2595 // Figure out what structure name we're looking for.
2596 unsigned IDNS = Decl::IDNS_Tag;
2597 DeclarationName SearchName = Name;
2598 if (!SearchName && D->getTypedefNameForAnonDecl()) {
2599 SearchName = Importer.Import(D->getTypedefNameForAnonDecl()->getDeclName());
2600 IDNS = Decl::IDNS_Ordinary;
2601 } else if (Importer.getToContext().getLangOpts().CPlusPlus)
2602 IDNS |= Decl::IDNS_Ordinary;
2604 // We may already have a record of the same name; try to find and match it.
2605 RecordDecl *AdoptDecl = nullptr;
2606 if (!DC->isFunctionOrMethod()) {
2607 SmallVector<NamedDecl *, 4> ConflictingDecls;
2608 SmallVector<NamedDecl *, 2> FoundDecls;
2609 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls);
2610 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
2611 if (!FoundDecls[I]->isInIdentifierNamespace(IDNS))
2614 Decl *Found = FoundDecls[I];
2615 if (TypedefNameDecl *Typedef = dyn_cast<TypedefNameDecl>(Found)) {
2616 if (const TagType *Tag = Typedef->getUnderlyingType()->getAs<TagType>())
2617 Found = Tag->getDecl();
2620 if (RecordDecl *FoundRecord = dyn_cast<RecordDecl>(Found)) {
2621 if (D->isAnonymousStructOrUnion() &&
2622 FoundRecord->isAnonymousStructOrUnion()) {
2623 // If both anonymous structs/unions are in a record context, make sure
2624 // they occur in the same location in the context records.
2625 if (Optional<unsigned> Index1
2626 = findAnonymousStructOrUnionIndex(D)) {
2627 if (Optional<unsigned> Index2 =
2628 findAnonymousStructOrUnionIndex(FoundRecord)) {
2629 if (*Index1 != *Index2)
2635 if (RecordDecl *FoundDef = FoundRecord->getDefinition()) {
2636 if ((SearchName && !D->isCompleteDefinition())
2637 || (D->isCompleteDefinition() &&
2638 D->isAnonymousStructOrUnion()
2639 == FoundDef->isAnonymousStructOrUnion() &&
2640 IsStructuralMatch(D, FoundDef))) {
2641 // The record types structurally match, or the "from" translation
2642 // unit only had a forward declaration anyway; call it the same
2644 // FIXME: For C++, we should also merge methods here.
2645 return Importer.Imported(D, FoundDef);
2647 } else if (!D->isCompleteDefinition()) {
2648 // We have a forward declaration of this type, so adopt that forward
2649 // declaration rather than building a new one.
2651 // If one or both can be completed from external storage then try one
2652 // last time to complete and compare them before doing this.
2654 if (FoundRecord->hasExternalLexicalStorage() &&
2655 !FoundRecord->isCompleteDefinition())
2656 FoundRecord->getASTContext().getExternalSource()->CompleteType(FoundRecord);
2657 if (D->hasExternalLexicalStorage())
2658 D->getASTContext().getExternalSource()->CompleteType(D);
2660 if (FoundRecord->isCompleteDefinition() &&
2661 D->isCompleteDefinition() &&
2662 !IsStructuralMatch(D, FoundRecord))
2665 AdoptDecl = FoundRecord;
2667 } else if (!SearchName) {
2672 ConflictingDecls.push_back(FoundDecls[I]);
2675 if (!ConflictingDecls.empty() && SearchName) {
2676 Name = Importer.HandleNameConflict(Name, DC, IDNS,
2677 ConflictingDecls.data(),
2678 ConflictingDecls.size());
2682 // Create the record declaration.
2683 RecordDecl *D2 = AdoptDecl;
2684 SourceLocation StartLoc = Importer.Import(D->getLocStart());
2686 if (isa<CXXRecordDecl>(D)) {
2687 CXXRecordDecl *D2CXX = CXXRecordDecl::Create(Importer.getToContext(),
2690 Name.getAsIdentifierInfo());
2692 D2->setAccess(D->getAccess());
2694 D2 = RecordDecl::Create(Importer.getToContext(), D->getTagKind(),
2695 DC, StartLoc, Loc, Name.getAsIdentifierInfo());
2698 D2->setQualifierInfo(Importer.Import(D->getQualifierLoc()));
2699 D2->setLexicalDeclContext(LexicalDC);
2700 LexicalDC->addDeclInternal(D2);
2701 if (D->isAnonymousStructOrUnion())
2702 D2->setAnonymousStructOrUnion(true);
2705 Importer.Imported(D, D2);
2707 if (D->isCompleteDefinition() && ImportDefinition(D, D2, IDK_Default))
2713 Decl *ASTNodeImporter::VisitEnumConstantDecl(EnumConstantDecl *D) {
2714 // Import the major distinguishing characteristics of this enumerator.
2715 DeclContext *DC, *LexicalDC;
2716 DeclarationName Name;
2719 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
2724 QualType T = Importer.Import(D->getType());
2728 // Determine whether there are any other declarations with the same name and
2729 // in the same context.
2730 if (!LexicalDC->isFunctionOrMethod()) {
2731 SmallVector<NamedDecl *, 4> ConflictingDecls;
2732 unsigned IDNS = Decl::IDNS_Ordinary;
2733 SmallVector<NamedDecl *, 2> FoundDecls;
2734 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls);
2735 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
2736 if (!FoundDecls[I]->isInIdentifierNamespace(IDNS))
2739 if (EnumConstantDecl *FoundEnumConstant
2740 = dyn_cast<EnumConstantDecl>(FoundDecls[I])) {
2741 if (IsStructuralMatch(D, FoundEnumConstant))
2742 return Importer.Imported(D, FoundEnumConstant);
2745 ConflictingDecls.push_back(FoundDecls[I]);
2748 if (!ConflictingDecls.empty()) {
2749 Name = Importer.HandleNameConflict(Name, DC, IDNS,
2750 ConflictingDecls.data(),
2751 ConflictingDecls.size());
2757 Expr *Init = Importer.Import(D->getInitExpr());
2758 if (D->getInitExpr() && !Init)
2761 EnumConstantDecl *ToEnumerator
2762 = EnumConstantDecl::Create(Importer.getToContext(), cast<EnumDecl>(DC), Loc,
2763 Name.getAsIdentifierInfo(), T,
2764 Init, D->getInitVal());
2765 ToEnumerator->setAccess(D->getAccess());
2766 ToEnumerator->setLexicalDeclContext(LexicalDC);
2767 Importer.Imported(D, ToEnumerator);
2768 LexicalDC->addDeclInternal(ToEnumerator);
2769 return ToEnumerator;
2772 Decl *ASTNodeImporter::VisitFunctionDecl(FunctionDecl *D) {
2773 // Import the major distinguishing characteristics of this function.
2774 DeclContext *DC, *LexicalDC;
2775 DeclarationName Name;
2778 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
2783 // Try to find a function in our own ("to") context with the same name, same
2784 // type, and in the same context as the function we're importing.
2785 if (!LexicalDC->isFunctionOrMethod()) {
2786 SmallVector<NamedDecl *, 4> ConflictingDecls;
2787 unsigned IDNS = Decl::IDNS_Ordinary;
2788 SmallVector<NamedDecl *, 2> FoundDecls;
2789 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls);
2790 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
2791 if (!FoundDecls[I]->isInIdentifierNamespace(IDNS))
2794 if (FunctionDecl *FoundFunction = dyn_cast<FunctionDecl>(FoundDecls[I])) {
2795 if (FoundFunction->hasExternalFormalLinkage() &&
2796 D->hasExternalFormalLinkage()) {
2797 if (Importer.IsStructurallyEquivalent(D->getType(),
2798 FoundFunction->getType())) {
2799 // FIXME: Actually try to merge the body and other attributes.
2800 return Importer.Imported(D, FoundFunction);
2803 // FIXME: Check for overloading more carefully, e.g., by boosting
2804 // Sema::IsOverload out to the AST library.
2806 // Function overloading is okay in C++.
2807 if (Importer.getToContext().getLangOpts().CPlusPlus)
2810 // Complain about inconsistent function types.
2811 Importer.ToDiag(Loc, diag::err_odr_function_type_inconsistent)
2812 << Name << D->getType() << FoundFunction->getType();
2813 Importer.ToDiag(FoundFunction->getLocation(),
2814 diag::note_odr_value_here)
2815 << FoundFunction->getType();
2819 ConflictingDecls.push_back(FoundDecls[I]);
2822 if (!ConflictingDecls.empty()) {
2823 Name = Importer.HandleNameConflict(Name, DC, IDNS,
2824 ConflictingDecls.data(),
2825 ConflictingDecls.size());
2831 DeclarationNameInfo NameInfo(Name, Loc);
2832 // Import additional name location/type info.
2833 ImportDeclarationNameLoc(D->getNameInfo(), NameInfo);
2835 QualType FromTy = D->getType();
2836 bool usedDifferentExceptionSpec = false;
2838 if (const FunctionProtoType *
2839 FromFPT = D->getType()->getAs<FunctionProtoType>()) {
2840 FunctionProtoType::ExtProtoInfo FromEPI = FromFPT->getExtProtoInfo();
2841 // FunctionProtoType::ExtProtoInfo's ExceptionSpecDecl can point to the
2842 // FunctionDecl that we are importing the FunctionProtoType for.
2843 // To avoid an infinite recursion when importing, create the FunctionDecl
2844 // with a simplified function type and update it afterwards.
2845 if (FromEPI.ExceptionSpec.SourceDecl ||
2846 FromEPI.ExceptionSpec.SourceTemplate ||
2847 FromEPI.ExceptionSpec.NoexceptExpr) {
2848 FunctionProtoType::ExtProtoInfo DefaultEPI;
2849 FromTy = Importer.getFromContext().getFunctionType(
2850 FromFPT->getReturnType(), FromFPT->getParamTypes(), DefaultEPI);
2851 usedDifferentExceptionSpec = true;
2856 QualType T = Importer.Import(FromTy);
2860 // Import the function parameters.
2861 SmallVector<ParmVarDecl *, 8> Parameters;
2862 for (auto P : D->params()) {
2863 ParmVarDecl *ToP = cast_or_null<ParmVarDecl>(Importer.Import(P));
2867 Parameters.push_back(ToP);
2870 // Create the imported function.
2871 TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo());
2872 FunctionDecl *ToFunction = nullptr;
2873 SourceLocation InnerLocStart = Importer.Import(D->getInnerLocStart());
2874 if (CXXConstructorDecl *FromConstructor = dyn_cast<CXXConstructorDecl>(D)) {
2875 ToFunction = CXXConstructorDecl::Create(Importer.getToContext(),
2876 cast<CXXRecordDecl>(DC),
2879 FromConstructor->isExplicit(),
2880 D->isInlineSpecified(),
2883 } else if (isa<CXXDestructorDecl>(D)) {
2884 ToFunction = CXXDestructorDecl::Create(Importer.getToContext(),
2885 cast<CXXRecordDecl>(DC),
2888 D->isInlineSpecified(),
2890 } else if (CXXConversionDecl *FromConversion
2891 = dyn_cast<CXXConversionDecl>(D)) {
2892 ToFunction = CXXConversionDecl::Create(Importer.getToContext(),
2893 cast<CXXRecordDecl>(DC),
2896 D->isInlineSpecified(),
2897 FromConversion->isExplicit(),
2899 Importer.Import(D->getLocEnd()));
2900 } else if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(D)) {
2901 ToFunction = CXXMethodDecl::Create(Importer.getToContext(),
2902 cast<CXXRecordDecl>(DC),
2905 Method->getStorageClass(),
2906 Method->isInlineSpecified(),
2908 Importer.Import(D->getLocEnd()));
2910 ToFunction = FunctionDecl::Create(Importer.getToContext(), DC,
2912 NameInfo, T, TInfo, D->getStorageClass(),
2913 D->isInlineSpecified(),
2914 D->hasWrittenPrototype(),
2918 // Import the qualifier, if any.
2919 ToFunction->setQualifierInfo(Importer.Import(D->getQualifierLoc()));
2920 ToFunction->setAccess(D->getAccess());
2921 ToFunction->setLexicalDeclContext(LexicalDC);
2922 ToFunction->setVirtualAsWritten(D->isVirtualAsWritten());
2923 ToFunction->setTrivial(D->isTrivial());
2924 ToFunction->setPure(D->isPure());
2925 Importer.Imported(D, ToFunction);
2927 // Set the parameters.
2928 for (unsigned I = 0, N = Parameters.size(); I != N; ++I) {
2929 Parameters[I]->setOwningFunction(ToFunction);
2930 ToFunction->addDeclInternal(Parameters[I]);
2932 ToFunction->setParams(Parameters);
2934 if (usedDifferentExceptionSpec) {
2935 // Update FunctionProtoType::ExtProtoInfo.
2936 QualType T = Importer.Import(D->getType());
2939 ToFunction->setType(T);
2942 // Import the body, if any.
2943 if (Stmt *FromBody = D->getBody()) {
2944 if (Stmt *ToBody = Importer.Import(FromBody)) {
2945 ToFunction->setBody(ToBody);
2949 // FIXME: Other bits to merge?
2951 // Add this function to the lexical context.
2952 LexicalDC->addDeclInternal(ToFunction);
2957 Decl *ASTNodeImporter::VisitCXXMethodDecl(CXXMethodDecl *D) {
2958 return VisitFunctionDecl(D);
2961 Decl *ASTNodeImporter::VisitCXXConstructorDecl(CXXConstructorDecl *D) {
2962 return VisitCXXMethodDecl(D);
2965 Decl *ASTNodeImporter::VisitCXXDestructorDecl(CXXDestructorDecl *D) {
2966 return VisitCXXMethodDecl(D);
2969 Decl *ASTNodeImporter::VisitCXXConversionDecl(CXXConversionDecl *D) {
2970 return VisitCXXMethodDecl(D);
2973 static unsigned getFieldIndex(Decl *F) {
2974 RecordDecl *Owner = dyn_cast<RecordDecl>(F->getDeclContext());
2979 for (const auto *D : Owner->noload_decls()) {
2983 if (isa<FieldDecl>(*D) || isa<IndirectFieldDecl>(*D))
2990 Decl *ASTNodeImporter::VisitFieldDecl(FieldDecl *D) {
2991 // Import the major distinguishing characteristics of a variable.
2992 DeclContext *DC, *LexicalDC;
2993 DeclarationName Name;
2996 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
3001 // Determine whether we've already imported this field.
3002 SmallVector<NamedDecl *, 2> FoundDecls;
3003 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls);
3004 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
3005 if (FieldDecl *FoundField = dyn_cast<FieldDecl>(FoundDecls[I])) {
3006 // For anonymous fields, match up by index.
3007 if (!Name && getFieldIndex(D) != getFieldIndex(FoundField))
3010 if (Importer.IsStructurallyEquivalent(D->getType(),
3011 FoundField->getType())) {
3012 Importer.Imported(D, FoundField);
3016 Importer.ToDiag(Loc, diag::err_odr_field_type_inconsistent)
3017 << Name << D->getType() << FoundField->getType();
3018 Importer.ToDiag(FoundField->getLocation(), diag::note_odr_value_here)
3019 << FoundField->getType();
3025 QualType T = Importer.Import(D->getType());
3029 TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo());
3030 Expr *BitWidth = Importer.Import(D->getBitWidth());
3031 if (!BitWidth && D->getBitWidth())
3034 FieldDecl *ToField = FieldDecl::Create(Importer.getToContext(), DC,
3035 Importer.Import(D->getInnerLocStart()),
3036 Loc, Name.getAsIdentifierInfo(),
3037 T, TInfo, BitWidth, D->isMutable(),
3038 D->getInClassInitStyle());
3039 ToField->setAccess(D->getAccess());
3040 ToField->setLexicalDeclContext(LexicalDC);
3041 if (Expr *FromInitializer = D->getInClassInitializer()) {
3042 Expr *ToInitializer = Importer.Import(FromInitializer);
3044 ToField->setInClassInitializer(ToInitializer);
3048 ToField->setImplicit(D->isImplicit());
3049 Importer.Imported(D, ToField);
3050 LexicalDC->addDeclInternal(ToField);
3054 Decl *ASTNodeImporter::VisitIndirectFieldDecl(IndirectFieldDecl *D) {
3055 // Import the major distinguishing characteristics of a variable.
3056 DeclContext *DC, *LexicalDC;
3057 DeclarationName Name;
3060 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
3065 // Determine whether we've already imported this field.
3066 SmallVector<NamedDecl *, 2> FoundDecls;
3067 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls);
3068 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
3069 if (IndirectFieldDecl *FoundField
3070 = dyn_cast<IndirectFieldDecl>(FoundDecls[I])) {
3071 // For anonymous indirect fields, match up by index.
3072 if (!Name && getFieldIndex(D) != getFieldIndex(FoundField))
3075 if (Importer.IsStructurallyEquivalent(D->getType(),
3076 FoundField->getType(),
3078 Importer.Imported(D, FoundField);
3082 // If there are more anonymous fields to check, continue.
3083 if (!Name && I < N-1)
3086 Importer.ToDiag(Loc, diag::err_odr_field_type_inconsistent)
3087 << Name << D->getType() << FoundField->getType();
3088 Importer.ToDiag(FoundField->getLocation(), diag::note_odr_value_here)
3089 << FoundField->getType();
3095 QualType T = Importer.Import(D->getType());
3099 NamedDecl **NamedChain =
3100 new (Importer.getToContext())NamedDecl*[D->getChainingSize()];
3103 for (auto *PI : D->chain()) {
3104 Decl *D = Importer.Import(PI);
3107 NamedChain[i++] = cast<NamedDecl>(D);
3110 IndirectFieldDecl *ToIndirectField = IndirectFieldDecl::Create(
3111 Importer.getToContext(), DC, Loc, Name.getAsIdentifierInfo(), T,
3112 NamedChain, D->getChainingSize());
3114 for (const auto *Attr : D->attrs())
3115 ToIndirectField->addAttr(Attr->clone(Importer.getToContext()));
3117 ToIndirectField->setAccess(D->getAccess());
3118 ToIndirectField->setLexicalDeclContext(LexicalDC);
3119 Importer.Imported(D, ToIndirectField);
3120 LexicalDC->addDeclInternal(ToIndirectField);
3121 return ToIndirectField;
3124 Decl *ASTNodeImporter::VisitObjCIvarDecl(ObjCIvarDecl *D) {
3125 // Import the major distinguishing characteristics of an ivar.
3126 DeclContext *DC, *LexicalDC;
3127 DeclarationName Name;
3130 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
3135 // Determine whether we've already imported this ivar
3136 SmallVector<NamedDecl *, 2> FoundDecls;
3137 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls);
3138 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
3139 if (ObjCIvarDecl *FoundIvar = dyn_cast<ObjCIvarDecl>(FoundDecls[I])) {
3140 if (Importer.IsStructurallyEquivalent(D->getType(),
3141 FoundIvar->getType())) {
3142 Importer.Imported(D, FoundIvar);
3146 Importer.ToDiag(Loc, diag::err_odr_ivar_type_inconsistent)
3147 << Name << D->getType() << FoundIvar->getType();
3148 Importer.ToDiag(FoundIvar->getLocation(), diag::note_odr_value_here)
3149 << FoundIvar->getType();
3155 QualType T = Importer.Import(D->getType());
3159 TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo());
3160 Expr *BitWidth = Importer.Import(D->getBitWidth());
3161 if (!BitWidth && D->getBitWidth())
3164 ObjCIvarDecl *ToIvar = ObjCIvarDecl::Create(Importer.getToContext(),
3165 cast<ObjCContainerDecl>(DC),
3166 Importer.Import(D->getInnerLocStart()),
3167 Loc, Name.getAsIdentifierInfo(),
3168 T, TInfo, D->getAccessControl(),
3169 BitWidth, D->getSynthesize());
3170 ToIvar->setLexicalDeclContext(LexicalDC);
3171 Importer.Imported(D, ToIvar);
3172 LexicalDC->addDeclInternal(ToIvar);
3177 Decl *ASTNodeImporter::VisitVarDecl(VarDecl *D) {
3178 // Import the major distinguishing characteristics of a variable.
3179 DeclContext *DC, *LexicalDC;
3180 DeclarationName Name;
3183 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
3188 // Try to find a variable in our own ("to") context with the same name and
3189 // in the same context as the variable we're importing.
3190 if (D->isFileVarDecl()) {
3191 VarDecl *MergeWithVar = nullptr;
3192 SmallVector<NamedDecl *, 4> ConflictingDecls;
3193 unsigned IDNS = Decl::IDNS_Ordinary;
3194 SmallVector<NamedDecl *, 2> FoundDecls;
3195 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls);
3196 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
3197 if (!FoundDecls[I]->isInIdentifierNamespace(IDNS))
3200 if (VarDecl *FoundVar = dyn_cast<VarDecl>(FoundDecls[I])) {
3201 // We have found a variable that we may need to merge with. Check it.
3202 if (FoundVar->hasExternalFormalLinkage() &&
3203 D->hasExternalFormalLinkage()) {
3204 if (Importer.IsStructurallyEquivalent(D->getType(),
3205 FoundVar->getType())) {
3206 MergeWithVar = FoundVar;
3210 const ArrayType *FoundArray
3211 = Importer.getToContext().getAsArrayType(FoundVar->getType());
3212 const ArrayType *TArray
3213 = Importer.getToContext().getAsArrayType(D->getType());
3214 if (FoundArray && TArray) {
3215 if (isa<IncompleteArrayType>(FoundArray) &&
3216 isa<ConstantArrayType>(TArray)) {
3218 QualType T = Importer.Import(D->getType());
3222 FoundVar->setType(T);
3223 MergeWithVar = FoundVar;
3225 } else if (isa<IncompleteArrayType>(TArray) &&
3226 isa<ConstantArrayType>(FoundArray)) {
3227 MergeWithVar = FoundVar;
3232 Importer.ToDiag(Loc, diag::err_odr_variable_type_inconsistent)
3233 << Name << D->getType() << FoundVar->getType();
3234 Importer.ToDiag(FoundVar->getLocation(), diag::note_odr_value_here)
3235 << FoundVar->getType();
3239 ConflictingDecls.push_back(FoundDecls[I]);
3243 // An equivalent variable with external linkage has been found. Link
3244 // the two declarations, then merge them.
3245 Importer.Imported(D, MergeWithVar);
3247 if (VarDecl *DDef = D->getDefinition()) {
3248 if (VarDecl *ExistingDef = MergeWithVar->getDefinition()) {
3249 Importer.ToDiag(ExistingDef->getLocation(),
3250 diag::err_odr_variable_multiple_def)
3252 Importer.FromDiag(DDef->getLocation(), diag::note_odr_defined_here);
3254 Expr *Init = Importer.Import(DDef->getInit());
3255 MergeWithVar->setInit(Init);
3256 if (DDef->isInitKnownICE()) {
3257 EvaluatedStmt *Eval = MergeWithVar->ensureEvaluatedStmt();
3258 Eval->CheckedICE = true;
3259 Eval->IsICE = DDef->isInitICE();
3264 return MergeWithVar;
3267 if (!ConflictingDecls.empty()) {
3268 Name = Importer.HandleNameConflict(Name, DC, IDNS,
3269 ConflictingDecls.data(),
3270 ConflictingDecls.size());
3277 QualType T = Importer.Import(D->getType());
3281 // Create the imported variable.
3282 TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo());
3283 VarDecl *ToVar = VarDecl::Create(Importer.getToContext(), DC,
3284 Importer.Import(D->getInnerLocStart()),
3285 Loc, Name.getAsIdentifierInfo(),
3287 D->getStorageClass());
3288 ToVar->setQualifierInfo(Importer.Import(D->getQualifierLoc()));
3289 ToVar->setAccess(D->getAccess());
3290 ToVar->setLexicalDeclContext(LexicalDC);
3291 Importer.Imported(D, ToVar);
3292 LexicalDC->addDeclInternal(ToVar);
3294 if (!D->isFileVarDecl() &&
3298 // Merge the initializer.
3299 if (ImportDefinition(D, ToVar))
3305 Decl *ASTNodeImporter::VisitImplicitParamDecl(ImplicitParamDecl *D) {
3306 // Parameters are created in the translation unit's context, then moved
3307 // into the function declaration's context afterward.
3308 DeclContext *DC = Importer.getToContext().getTranslationUnitDecl();
3310 // Import the name of this declaration.
3311 DeclarationName Name = Importer.Import(D->getDeclName());
3312 if (D->getDeclName() && !Name)
3315 // Import the location of this declaration.
3316 SourceLocation Loc = Importer.Import(D->getLocation());
3318 // Import the parameter's type.
3319 QualType T = Importer.Import(D->getType());
3323 // Create the imported parameter.
3324 ImplicitParamDecl *ToParm
3325 = ImplicitParamDecl::Create(Importer.getToContext(), DC,
3326 Loc, Name.getAsIdentifierInfo(),
3328 return Importer.Imported(D, ToParm);
3331 Decl *ASTNodeImporter::VisitParmVarDecl(ParmVarDecl *D) {
3332 // Parameters are created in the translation unit's context, then moved
3333 // into the function declaration's context afterward.
3334 DeclContext *DC = Importer.getToContext().getTranslationUnitDecl();
3336 // Import the name of this declaration.
3337 DeclarationName Name = Importer.Import(D->getDeclName());
3338 if (D->getDeclName() && !Name)
3341 // Import the location of this declaration.
3342 SourceLocation Loc = Importer.Import(D->getLocation());
3344 // Import the parameter's type.
3345 QualType T = Importer.Import(D->getType());
3349 // Create the imported parameter.
3350 TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo());
3351 ParmVarDecl *ToParm = ParmVarDecl::Create(Importer.getToContext(), DC,
3352 Importer.Import(D->getInnerLocStart()),
3353 Loc, Name.getAsIdentifierInfo(),
3354 T, TInfo, D->getStorageClass(),
3355 /*FIXME: Default argument*/nullptr);
3356 ToParm->setHasInheritedDefaultArg(D->hasInheritedDefaultArg());
3359 ToParm->setIsUsed();
3361 return Importer.Imported(D, ToParm);
3364 Decl *ASTNodeImporter::VisitObjCMethodDecl(ObjCMethodDecl *D) {
3365 // Import the major distinguishing characteristics of a method.
3366 DeclContext *DC, *LexicalDC;
3367 DeclarationName Name;
3370 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
3375 SmallVector<NamedDecl *, 2> FoundDecls;
3376 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls);
3377 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
3378 if (ObjCMethodDecl *FoundMethod = dyn_cast<ObjCMethodDecl>(FoundDecls[I])) {
3379 if (FoundMethod->isInstanceMethod() != D->isInstanceMethod())
3382 // Check return types.
3383 if (!Importer.IsStructurallyEquivalent(D->getReturnType(),
3384 FoundMethod->getReturnType())) {
3385 Importer.ToDiag(Loc, diag::err_odr_objc_method_result_type_inconsistent)
3386 << D->isInstanceMethod() << Name << D->getReturnType()
3387 << FoundMethod->getReturnType();
3388 Importer.ToDiag(FoundMethod->getLocation(),
3389 diag::note_odr_objc_method_here)
3390 << D->isInstanceMethod() << Name;
3394 // Check the number of parameters.
3395 if (D->param_size() != FoundMethod->param_size()) {
3396 Importer.ToDiag(Loc, diag::err_odr_objc_method_num_params_inconsistent)
3397 << D->isInstanceMethod() << Name
3398 << D->param_size() << FoundMethod->param_size();
3399 Importer.ToDiag(FoundMethod->getLocation(),
3400 diag::note_odr_objc_method_here)
3401 << D->isInstanceMethod() << Name;
3405 // Check parameter types.
3406 for (ObjCMethodDecl::param_iterator P = D->param_begin(),
3407 PEnd = D->param_end(), FoundP = FoundMethod->param_begin();
3408 P != PEnd; ++P, ++FoundP) {
3409 if (!Importer.IsStructurallyEquivalent((*P)->getType(),
3410 (*FoundP)->getType())) {
3411 Importer.FromDiag((*P)->getLocation(),
3412 diag::err_odr_objc_method_param_type_inconsistent)
3413 << D->isInstanceMethod() << Name
3414 << (*P)->getType() << (*FoundP)->getType();
3415 Importer.ToDiag((*FoundP)->getLocation(), diag::note_odr_value_here)
3416 << (*FoundP)->getType();
3421 // Check variadic/non-variadic.
3422 // Check the number of parameters.
3423 if (D->isVariadic() != FoundMethod->isVariadic()) {
3424 Importer.ToDiag(Loc, diag::err_odr_objc_method_variadic_inconsistent)
3425 << D->isInstanceMethod() << Name;
3426 Importer.ToDiag(FoundMethod->getLocation(),
3427 diag::note_odr_objc_method_here)
3428 << D->isInstanceMethod() << Name;
3432 // FIXME: Any other bits we need to merge?
3433 return Importer.Imported(D, FoundMethod);
3437 // Import the result type.
3438 QualType ResultTy = Importer.Import(D->getReturnType());
3439 if (ResultTy.isNull())
3442 TypeSourceInfo *ReturnTInfo = Importer.Import(D->getReturnTypeSourceInfo());
3444 ObjCMethodDecl *ToMethod = ObjCMethodDecl::Create(
3445 Importer.getToContext(), Loc, Importer.Import(D->getLocEnd()),
3446 Name.getObjCSelector(), ResultTy, ReturnTInfo, DC, D->isInstanceMethod(),
3447 D->isVariadic(), D->isPropertyAccessor(), D->isImplicit(), D->isDefined(),
3448 D->getImplementationControl(), D->hasRelatedResultType());
3450 // FIXME: When we decide to merge method definitions, we'll need to
3451 // deal with implicit parameters.
3453 // Import the parameters
3454 SmallVector<ParmVarDecl *, 5> ToParams;
3455 for (auto *FromP : D->params()) {
3456 ParmVarDecl *ToP = cast_or_null<ParmVarDecl>(Importer.Import(FromP));
3460 ToParams.push_back(ToP);
3463 // Set the parameters.
3464 for (unsigned I = 0, N = ToParams.size(); I != N; ++I) {
3465 ToParams[I]->setOwningFunction(ToMethod);
3466 ToMethod->addDeclInternal(ToParams[I]);
3468 SmallVector<SourceLocation, 12> SelLocs;
3469 D->getSelectorLocs(SelLocs);
3470 ToMethod->setMethodParams(Importer.getToContext(), ToParams, SelLocs);
3472 ToMethod->setLexicalDeclContext(LexicalDC);
3473 Importer.Imported(D, ToMethod);
3474 LexicalDC->addDeclInternal(ToMethod);
3478 Decl *ASTNodeImporter::VisitObjCTypeParamDecl(ObjCTypeParamDecl *D) {
3479 // Import the major distinguishing characteristics of a category.
3480 DeclContext *DC, *LexicalDC;
3481 DeclarationName Name;
3484 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
3489 TypeSourceInfo *BoundInfo = Importer.Import(D->getTypeSourceInfo());
3493 ObjCTypeParamDecl *Result = ObjCTypeParamDecl::Create(
3494 Importer.getToContext(), DC,
3496 Importer.Import(D->getVarianceLoc()),
3498 Importer.Import(D->getLocation()),
3499 Name.getAsIdentifierInfo(),
3500 Importer.Import(D->getColonLoc()),
3502 Importer.Imported(D, Result);
3503 Result->setLexicalDeclContext(LexicalDC);
3507 Decl *ASTNodeImporter::VisitObjCCategoryDecl(ObjCCategoryDecl *D) {
3508 // Import the major distinguishing characteristics of a category.
3509 DeclContext *DC, *LexicalDC;
3510 DeclarationName Name;
3513 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
3518 ObjCInterfaceDecl *ToInterface
3519 = cast_or_null<ObjCInterfaceDecl>(Importer.Import(D->getClassInterface()));
3523 // Determine if we've already encountered this category.
3524 ObjCCategoryDecl *MergeWithCategory
3525 = ToInterface->FindCategoryDeclaration(Name.getAsIdentifierInfo());
3526 ObjCCategoryDecl *ToCategory = MergeWithCategory;
3528 ToCategory = ObjCCategoryDecl::Create(Importer.getToContext(), DC,
3529 Importer.Import(D->getAtStartLoc()),
3531 Importer.Import(D->getCategoryNameLoc()),
3532 Name.getAsIdentifierInfo(),
3534 /*TypeParamList=*/nullptr,
3535 Importer.Import(D->getIvarLBraceLoc()),
3536 Importer.Import(D->getIvarRBraceLoc()));
3537 ToCategory->setLexicalDeclContext(LexicalDC);
3538 LexicalDC->addDeclInternal(ToCategory);
3539 Importer.Imported(D, ToCategory);
3540 // Import the type parameter list after calling Imported, to avoid
3541 // loops when bringing in their DeclContext.
3542 ToCategory->setTypeParamList(ImportObjCTypeParamList(
3543 D->getTypeParamList()));
3546 SmallVector<ObjCProtocolDecl *, 4> Protocols;
3547 SmallVector<SourceLocation, 4> ProtocolLocs;
3548 ObjCCategoryDecl::protocol_loc_iterator FromProtoLoc
3549 = D->protocol_loc_begin();
3550 for (ObjCCategoryDecl::protocol_iterator FromProto = D->protocol_begin(),
3551 FromProtoEnd = D->protocol_end();
3552 FromProto != FromProtoEnd;
3553 ++FromProto, ++FromProtoLoc) {
3554 ObjCProtocolDecl *ToProto
3555 = cast_or_null<ObjCProtocolDecl>(Importer.Import(*FromProto));
3558 Protocols.push_back(ToProto);
3559 ProtocolLocs.push_back(Importer.Import(*FromProtoLoc));
3562 // FIXME: If we're merging, make sure that the protocol list is the same.
3563 ToCategory->setProtocolList(Protocols.data(), Protocols.size(),
3564 ProtocolLocs.data(), Importer.getToContext());
3567 Importer.Imported(D, ToCategory);
3570 // Import all of the members of this category.
3571 ImportDeclContext(D);
3573 // If we have an implementation, import it as well.
3574 if (D->getImplementation()) {
3575 ObjCCategoryImplDecl *Impl
3576 = cast_or_null<ObjCCategoryImplDecl>(
3577 Importer.Import(D->getImplementation()));
3581 ToCategory->setImplementation(Impl);
3587 bool ASTNodeImporter::ImportDefinition(ObjCProtocolDecl *From,
3588 ObjCProtocolDecl *To,
3589 ImportDefinitionKind Kind) {
3590 if (To->getDefinition()) {
3591 if (shouldForceImportDeclContext(Kind))
3592 ImportDeclContext(From);
3596 // Start the protocol definition
3597 To->startDefinition();
3600 SmallVector<ObjCProtocolDecl *, 4> Protocols;
3601 SmallVector<SourceLocation, 4> ProtocolLocs;
3602 ObjCProtocolDecl::protocol_loc_iterator
3603 FromProtoLoc = From->protocol_loc_begin();
3604 for (ObjCProtocolDecl::protocol_iterator FromProto = From->protocol_begin(),
3605 FromProtoEnd = From->protocol_end();
3606 FromProto != FromProtoEnd;
3607 ++FromProto, ++FromProtoLoc) {
3608 ObjCProtocolDecl *ToProto
3609 = cast_or_null<ObjCProtocolDecl>(Importer.Import(*FromProto));
3612 Protocols.push_back(ToProto);
3613 ProtocolLocs.push_back(Importer.Import(*FromProtoLoc));
3616 // FIXME: If we're merging, make sure that the protocol list is the same.
3617 To->setProtocolList(Protocols.data(), Protocols.size(),
3618 ProtocolLocs.data(), Importer.getToContext());
3620 if (shouldForceImportDeclContext(Kind)) {
3621 // Import all of the members of this protocol.
3622 ImportDeclContext(From, /*ForceImport=*/true);
3627 Decl *ASTNodeImporter::VisitObjCProtocolDecl(ObjCProtocolDecl *D) {
3628 // If this protocol has a definition in the translation unit we're coming
3629 // from, but this particular declaration is not that definition, import the
3630 // definition and map to that.
3631 ObjCProtocolDecl *Definition = D->getDefinition();
3632 if (Definition && Definition != D) {
3633 Decl *ImportedDef = Importer.Import(Definition);
3637 return Importer.Imported(D, ImportedDef);
3640 // Import the major distinguishing characteristics of a protocol.
3641 DeclContext *DC, *LexicalDC;
3642 DeclarationName Name;
3645 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
3650 ObjCProtocolDecl *MergeWithProtocol = nullptr;
3651 SmallVector<NamedDecl *, 2> FoundDecls;
3652 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls);
3653 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
3654 if (!FoundDecls[I]->isInIdentifierNamespace(Decl::IDNS_ObjCProtocol))
3657 if ((MergeWithProtocol = dyn_cast<ObjCProtocolDecl>(FoundDecls[I])))
3661 ObjCProtocolDecl *ToProto = MergeWithProtocol;
3663 ToProto = ObjCProtocolDecl::Create(Importer.getToContext(), DC,
3664 Name.getAsIdentifierInfo(), Loc,
3665 Importer.Import(D->getAtStartLoc()),
3666 /*PrevDecl=*/nullptr);
3667 ToProto->setLexicalDeclContext(LexicalDC);
3668 LexicalDC->addDeclInternal(ToProto);
3671 Importer.Imported(D, ToProto);
3673 if (D->isThisDeclarationADefinition() && ImportDefinition(D, ToProto))
3679 Decl *ASTNodeImporter::VisitLinkageSpecDecl(LinkageSpecDecl *D) {
3680 DeclContext *DC = Importer.ImportContext(D->getDeclContext());
3681 DeclContext *LexicalDC = Importer.ImportContext(D->getLexicalDeclContext());
3683 SourceLocation ExternLoc = Importer.Import(D->getExternLoc());
3684 SourceLocation LangLoc = Importer.Import(D->getLocation());
3686 bool HasBraces = D->hasBraces();
3688 LinkageSpecDecl *ToLinkageSpec =
3689 LinkageSpecDecl::Create(Importer.getToContext(),
3697 SourceLocation RBraceLoc = Importer.Import(D->getRBraceLoc());
3698 ToLinkageSpec->setRBraceLoc(RBraceLoc);
3701 ToLinkageSpec->setLexicalDeclContext(LexicalDC);
3702 LexicalDC->addDeclInternal(ToLinkageSpec);
3704 Importer.Imported(D, ToLinkageSpec);
3706 return ToLinkageSpec;
3709 bool ASTNodeImporter::ImportDefinition(ObjCInterfaceDecl *From,
3710 ObjCInterfaceDecl *To,
3711 ImportDefinitionKind Kind) {
3712 if (To->getDefinition()) {
3713 // Check consistency of superclass.
3714 ObjCInterfaceDecl *FromSuper = From->getSuperClass();
3716 FromSuper = cast_or_null<ObjCInterfaceDecl>(Importer.Import(FromSuper));
3721 ObjCInterfaceDecl *ToSuper = To->getSuperClass();
3722 if ((bool)FromSuper != (bool)ToSuper ||
3723 (FromSuper && !declaresSameEntity(FromSuper, ToSuper))) {
3724 Importer.ToDiag(To->getLocation(),
3725 diag::err_odr_objc_superclass_inconsistent)
3726 << To->getDeclName();
3728 Importer.ToDiag(To->getSuperClassLoc(), diag::note_odr_objc_superclass)
3729 << To->getSuperClass()->getDeclName();
3731 Importer.ToDiag(To->getLocation(),
3732 diag::note_odr_objc_missing_superclass);
3733 if (From->getSuperClass())
3734 Importer.FromDiag(From->getSuperClassLoc(),
3735 diag::note_odr_objc_superclass)
3736 << From->getSuperClass()->getDeclName();
3738 Importer.FromDiag(From->getLocation(),
3739 diag::note_odr_objc_missing_superclass);
3742 if (shouldForceImportDeclContext(Kind))
3743 ImportDeclContext(From);
3747 // Start the definition.
3748 To->startDefinition();
3750 // If this class has a superclass, import it.
3751 if (From->getSuperClass()) {
3752 TypeSourceInfo *SuperTInfo = Importer.Import(From->getSuperClassTInfo());
3756 To->setSuperClass(SuperTInfo);
3760 SmallVector<ObjCProtocolDecl *, 4> Protocols;
3761 SmallVector<SourceLocation, 4> ProtocolLocs;
3762 ObjCInterfaceDecl::protocol_loc_iterator
3763 FromProtoLoc = From->protocol_loc_begin();
3765 for (ObjCInterfaceDecl::protocol_iterator FromProto = From->protocol_begin(),
3766 FromProtoEnd = From->protocol_end();
3767 FromProto != FromProtoEnd;
3768 ++FromProto, ++FromProtoLoc) {
3769 ObjCProtocolDecl *ToProto
3770 = cast_or_null<ObjCProtocolDecl>(Importer.Import(*FromProto));
3773 Protocols.push_back(ToProto);
3774 ProtocolLocs.push_back(Importer.Import(*FromProtoLoc));
3777 // FIXME: If we're merging, make sure that the protocol list is the same.
3778 To->setProtocolList(Protocols.data(), Protocols.size(),
3779 ProtocolLocs.data(), Importer.getToContext());
3781 // Import categories. When the categories themselves are imported, they'll
3782 // hook themselves into this interface.
3783 for (auto *Cat : From->known_categories())
3784 Importer.Import(Cat);
3786 // If we have an @implementation, import it as well.
3787 if (From->getImplementation()) {
3788 ObjCImplementationDecl *Impl = cast_or_null<ObjCImplementationDecl>(
3789 Importer.Import(From->getImplementation()));
3793 To->setImplementation(Impl);
3796 if (shouldForceImportDeclContext(Kind)) {
3797 // Import all of the members of this class.
3798 ImportDeclContext(From, /*ForceImport=*/true);
3804 ASTNodeImporter::ImportObjCTypeParamList(ObjCTypeParamList *list) {
3808 SmallVector<ObjCTypeParamDecl *, 4> toTypeParams;
3809 for (auto fromTypeParam : *list) {
3810 auto toTypeParam = cast_or_null<ObjCTypeParamDecl>(
3811 Importer.Import(fromTypeParam));
3815 toTypeParams.push_back(toTypeParam);
3818 return ObjCTypeParamList::create(Importer.getToContext(),
3819 Importer.Import(list->getLAngleLoc()),
3821 Importer.Import(list->getRAngleLoc()));
3824 Decl *ASTNodeImporter::VisitObjCInterfaceDecl(ObjCInterfaceDecl *D) {
3825 // If this class has a definition in the translation unit we're coming from,
3826 // but this particular declaration is not that definition, import the
3827 // definition and map to that.
3828 ObjCInterfaceDecl *Definition = D->getDefinition();
3829 if (Definition && Definition != D) {
3830 Decl *ImportedDef = Importer.Import(Definition);
3834 return Importer.Imported(D, ImportedDef);
3837 // Import the major distinguishing characteristics of an @interface.
3838 DeclContext *DC, *LexicalDC;
3839 DeclarationName Name;
3842 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
3847 // Look for an existing interface with the same name.
3848 ObjCInterfaceDecl *MergeWithIface = nullptr;
3849 SmallVector<NamedDecl *, 2> FoundDecls;
3850 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls);
3851 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
3852 if (!FoundDecls[I]->isInIdentifierNamespace(Decl::IDNS_Ordinary))
3855 if ((MergeWithIface = dyn_cast<ObjCInterfaceDecl>(FoundDecls[I])))
3859 // Create an interface declaration, if one does not already exist.
3860 ObjCInterfaceDecl *ToIface = MergeWithIface;
3862 ToIface = ObjCInterfaceDecl::Create(Importer.getToContext(), DC,
3863 Importer.Import(D->getAtStartLoc()),
3864 Name.getAsIdentifierInfo(),
3865 /*TypeParamList=*/nullptr,
3866 /*PrevDecl=*/nullptr, Loc,
3867 D->isImplicitInterfaceDecl());
3868 ToIface->setLexicalDeclContext(LexicalDC);
3869 LexicalDC->addDeclInternal(ToIface);
3871 Importer.Imported(D, ToIface);
3872 // Import the type parameter list after calling Imported, to avoid
3873 // loops when bringing in their DeclContext.
3874 ToIface->setTypeParamList(ImportObjCTypeParamList(
3875 D->getTypeParamListAsWritten()));
3877 if (D->isThisDeclarationADefinition() && ImportDefinition(D, ToIface))
3883 Decl *ASTNodeImporter::VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) {
3884 ObjCCategoryDecl *Category = cast_or_null<ObjCCategoryDecl>(
3885 Importer.Import(D->getCategoryDecl()));
3889 ObjCCategoryImplDecl *ToImpl = Category->getImplementation();
3891 DeclContext *DC = Importer.ImportContext(D->getDeclContext());
3895 SourceLocation CategoryNameLoc = Importer.Import(D->getCategoryNameLoc());
3896 ToImpl = ObjCCategoryImplDecl::Create(Importer.getToContext(), DC,
3897 Importer.Import(D->getIdentifier()),
3898 Category->getClassInterface(),
3899 Importer.Import(D->getLocation()),
3900 Importer.Import(D->getAtStartLoc()),
3903 DeclContext *LexicalDC = DC;
3904 if (D->getDeclContext() != D->getLexicalDeclContext()) {
3905 LexicalDC = Importer.ImportContext(D->getLexicalDeclContext());
3909 ToImpl->setLexicalDeclContext(LexicalDC);
3912 LexicalDC->addDeclInternal(ToImpl);
3913 Category->setImplementation(ToImpl);
3916 Importer.Imported(D, ToImpl);
3917 ImportDeclContext(D);
3921 Decl *ASTNodeImporter::VisitObjCImplementationDecl(ObjCImplementationDecl *D) {
3922 // Find the corresponding interface.
3923 ObjCInterfaceDecl *Iface = cast_or_null<ObjCInterfaceDecl>(
3924 Importer.Import(D->getClassInterface()));
3928 // Import the superclass, if any.
3929 ObjCInterfaceDecl *Super = nullptr;
3930 if (D->getSuperClass()) {
3931 Super = cast_or_null<ObjCInterfaceDecl>(
3932 Importer.Import(D->getSuperClass()));
3937 ObjCImplementationDecl *Impl = Iface->getImplementation();
3939 // We haven't imported an implementation yet. Create a new @implementation
3941 Impl = ObjCImplementationDecl::Create(Importer.getToContext(),
3942 Importer.ImportContext(D->getDeclContext()),
3944 Importer.Import(D->getLocation()),
3945 Importer.Import(D->getAtStartLoc()),
3946 Importer.Import(D->getSuperClassLoc()),
3947 Importer.Import(D->getIvarLBraceLoc()),
3948 Importer.Import(D->getIvarRBraceLoc()));
3950 if (D->getDeclContext() != D->getLexicalDeclContext()) {
3951 DeclContext *LexicalDC
3952 = Importer.ImportContext(D->getLexicalDeclContext());
3955 Impl->setLexicalDeclContext(LexicalDC);
3958 // Associate the implementation with the class it implements.
3959 Iface->setImplementation(Impl);
3960 Importer.Imported(D, Iface->getImplementation());
3962 Importer.Imported(D, Iface->getImplementation());
3964 // Verify that the existing @implementation has the same superclass.
3965 if ((Super && !Impl->getSuperClass()) ||
3966 (!Super && Impl->getSuperClass()) ||
3967 (Super && Impl->getSuperClass() &&
3968 !declaresSameEntity(Super->getCanonicalDecl(),
3969 Impl->getSuperClass()))) {
3970 Importer.ToDiag(Impl->getLocation(),
3971 diag::err_odr_objc_superclass_inconsistent)
3972 << Iface->getDeclName();
3973 // FIXME: It would be nice to have the location of the superclass
3975 if (Impl->getSuperClass())
3976 Importer.ToDiag(Impl->getLocation(),
3977 diag::note_odr_objc_superclass)
3978 << Impl->getSuperClass()->getDeclName();
3980 Importer.ToDiag(Impl->getLocation(),
3981 diag::note_odr_objc_missing_superclass);
3982 if (D->getSuperClass())
3983 Importer.FromDiag(D->getLocation(),
3984 diag::note_odr_objc_superclass)
3985 << D->getSuperClass()->getDeclName();
3987 Importer.FromDiag(D->getLocation(),
3988 diag::note_odr_objc_missing_superclass);
3993 // Import all of the members of this @implementation.
3994 ImportDeclContext(D);
3999 Decl *ASTNodeImporter::VisitObjCPropertyDecl(ObjCPropertyDecl *D) {
4000 // Import the major distinguishing characteristics of an @property.
4001 DeclContext *DC, *LexicalDC;
4002 DeclarationName Name;
4005 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
4010 // Check whether we have already imported this property.
4011 SmallVector<NamedDecl *, 2> FoundDecls;
4012 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls);
4013 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
4014 if (ObjCPropertyDecl *FoundProp
4015 = dyn_cast<ObjCPropertyDecl>(FoundDecls[I])) {
4016 // Check property types.
4017 if (!Importer.IsStructurallyEquivalent(D->getType(),
4018 FoundProp->getType())) {
4019 Importer.ToDiag(Loc, diag::err_odr_objc_property_type_inconsistent)
4020 << Name << D->getType() << FoundProp->getType();
4021 Importer.ToDiag(FoundProp->getLocation(), diag::note_odr_value_here)
4022 << FoundProp->getType();
4026 // FIXME: Check property attributes, getters, setters, etc.?
4028 // Consider these properties to be equivalent.
4029 Importer.Imported(D, FoundProp);
4035 TypeSourceInfo *TSI = Importer.Import(D->getTypeSourceInfo());
4039 // Create the new property.
4040 ObjCPropertyDecl *ToProperty
4041 = ObjCPropertyDecl::Create(Importer.getToContext(), DC, Loc,
4042 Name.getAsIdentifierInfo(),
4043 Importer.Import(D->getAtLoc()),
4044 Importer.Import(D->getLParenLoc()),
4045 Importer.Import(D->getType()),
4047 D->getPropertyImplementation());
4048 Importer.Imported(D, ToProperty);
4049 ToProperty->setLexicalDeclContext(LexicalDC);
4050 LexicalDC->addDeclInternal(ToProperty);
4052 ToProperty->setPropertyAttributes(D->getPropertyAttributes());
4053 ToProperty->setPropertyAttributesAsWritten(
4054 D->getPropertyAttributesAsWritten());
4055 ToProperty->setGetterName(Importer.Import(D->getGetterName()));
4056 ToProperty->setSetterName(Importer.Import(D->getSetterName()));
4057 ToProperty->setGetterMethodDecl(
4058 cast_or_null<ObjCMethodDecl>(Importer.Import(D->getGetterMethodDecl())));
4059 ToProperty->setSetterMethodDecl(
4060 cast_or_null<ObjCMethodDecl>(Importer.Import(D->getSetterMethodDecl())));
4061 ToProperty->setPropertyIvarDecl(
4062 cast_or_null<ObjCIvarDecl>(Importer.Import(D->getPropertyIvarDecl())));
4066 Decl *ASTNodeImporter::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D) {
4067 ObjCPropertyDecl *Property = cast_or_null<ObjCPropertyDecl>(
4068 Importer.Import(D->getPropertyDecl()));
4072 DeclContext *DC = Importer.ImportContext(D->getDeclContext());
4076 // Import the lexical declaration context.
4077 DeclContext *LexicalDC = DC;
4078 if (D->getDeclContext() != D->getLexicalDeclContext()) {
4079 LexicalDC = Importer.ImportContext(D->getLexicalDeclContext());
4084 ObjCImplDecl *InImpl = dyn_cast<ObjCImplDecl>(LexicalDC);
4088 // Import the ivar (for an @synthesize).
4089 ObjCIvarDecl *Ivar = nullptr;
4090 if (D->getPropertyIvarDecl()) {
4091 Ivar = cast_or_null<ObjCIvarDecl>(
4092 Importer.Import(D->getPropertyIvarDecl()));
4097 ObjCPropertyImplDecl *ToImpl
4098 = InImpl->FindPropertyImplDecl(Property->getIdentifier(),
4099 Property->getQueryKind());
4101 ToImpl = ObjCPropertyImplDecl::Create(Importer.getToContext(), DC,
4102 Importer.Import(D->getLocStart()),
4103 Importer.Import(D->getLocation()),
4105 D->getPropertyImplementation(),
4107 Importer.Import(D->getPropertyIvarDeclLoc()));
4108 ToImpl->setLexicalDeclContext(LexicalDC);
4109 Importer.Imported(D, ToImpl);
4110 LexicalDC->addDeclInternal(ToImpl);
4112 // Check that we have the same kind of property implementation (@synthesize
4114 if (D->getPropertyImplementation() != ToImpl->getPropertyImplementation()) {
4115 Importer.ToDiag(ToImpl->getLocation(),
4116 diag::err_odr_objc_property_impl_kind_inconsistent)
4117 << Property->getDeclName()
4118 << (ToImpl->getPropertyImplementation()
4119 == ObjCPropertyImplDecl::Dynamic);
4120 Importer.FromDiag(D->getLocation(),
4121 diag::note_odr_objc_property_impl_kind)
4122 << D->getPropertyDecl()->getDeclName()
4123 << (D->getPropertyImplementation() == ObjCPropertyImplDecl::Dynamic);
4127 // For @synthesize, check that we have the same
4128 if (D->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize &&
4129 Ivar != ToImpl->getPropertyIvarDecl()) {
4130 Importer.ToDiag(ToImpl->getPropertyIvarDeclLoc(),
4131 diag::err_odr_objc_synthesize_ivar_inconsistent)
4132 << Property->getDeclName()
4133 << ToImpl->getPropertyIvarDecl()->getDeclName()
4134 << Ivar->getDeclName();
4135 Importer.FromDiag(D->getPropertyIvarDeclLoc(),
4136 diag::note_odr_objc_synthesize_ivar_here)
4137 << D->getPropertyIvarDecl()->getDeclName();
4141 // Merge the existing implementation with the new implementation.
4142 Importer.Imported(D, ToImpl);
4148 Decl *ASTNodeImporter::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) {
4149 // For template arguments, we adopt the translation unit as our declaration
4150 // context. This context will be fixed when the actual template declaration
4153 // FIXME: Import default argument.
4154 return TemplateTypeParmDecl::Create(Importer.getToContext(),
4155 Importer.getToContext().getTranslationUnitDecl(),
4156 Importer.Import(D->getLocStart()),
4157 Importer.Import(D->getLocation()),
4160 Importer.Import(D->getIdentifier()),
4161 D->wasDeclaredWithTypename(),
4162 D->isParameterPack());
4166 ASTNodeImporter::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) {
4167 // Import the name of this declaration.
4168 DeclarationName Name = Importer.Import(D->getDeclName());
4169 if (D->getDeclName() && !Name)
4172 // Import the location of this declaration.
4173 SourceLocation Loc = Importer.Import(D->getLocation());
4175 // Import the type of this declaration.
4176 QualType T = Importer.Import(D->getType());
4180 // Import type-source information.
4181 TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo());
4182 if (D->getTypeSourceInfo() && !TInfo)
4185 // FIXME: Import default argument.
4187 return NonTypeTemplateParmDecl::Create(Importer.getToContext(),
4188 Importer.getToContext().getTranslationUnitDecl(),
4189 Importer.Import(D->getInnerLocStart()),
4190 Loc, D->getDepth(), D->getPosition(),
4191 Name.getAsIdentifierInfo(),
4192 T, D->isParameterPack(), TInfo);
4196 ASTNodeImporter::VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) {
4197 // Import the name of this declaration.
4198 DeclarationName Name = Importer.Import(D->getDeclName());
4199 if (D->getDeclName() && !Name)
4202 // Import the location of this declaration.
4203 SourceLocation Loc = Importer.Import(D->getLocation());
4205 // Import template parameters.
4206 TemplateParameterList *TemplateParams
4207 = ImportTemplateParameterList(D->getTemplateParameters());
4208 if (!TemplateParams)
4211 // FIXME: Import default argument.
4213 return TemplateTemplateParmDecl::Create(Importer.getToContext(),
4214 Importer.getToContext().getTranslationUnitDecl(),
4215 Loc, D->getDepth(), D->getPosition(),
4216 D->isParameterPack(),
4217 Name.getAsIdentifierInfo(),
4221 Decl *ASTNodeImporter::VisitClassTemplateDecl(ClassTemplateDecl *D) {
4222 // If this record has a definition in the translation unit we're coming from,
4223 // but this particular declaration is not that definition, import the
4224 // definition and map to that.
4225 CXXRecordDecl *Definition
4226 = cast_or_null<CXXRecordDecl>(D->getTemplatedDecl()->getDefinition());
4227 if (Definition && Definition != D->getTemplatedDecl()) {
4229 = Importer.Import(Definition->getDescribedClassTemplate());
4233 return Importer.Imported(D, ImportedDef);
4236 // Import the major distinguishing characteristics of this class template.
4237 DeclContext *DC, *LexicalDC;
4238 DeclarationName Name;
4241 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
4246 // We may already have a template of the same name; try to find and match it.
4247 if (!DC->isFunctionOrMethod()) {
4248 SmallVector<NamedDecl *, 4> ConflictingDecls;
4249 SmallVector<NamedDecl *, 2> FoundDecls;
4250 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls);
4251 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
4252 if (!FoundDecls[I]->isInIdentifierNamespace(Decl::IDNS_Ordinary))
4255 Decl *Found = FoundDecls[I];
4256 if (ClassTemplateDecl *FoundTemplate
4257 = dyn_cast<ClassTemplateDecl>(Found)) {
4258 if (IsStructuralMatch(D, FoundTemplate)) {
4259 // The class templates structurally match; call it the same template.
4260 // FIXME: We may be filling in a forward declaration here. Handle
4262 Importer.Imported(D->getTemplatedDecl(),
4263 FoundTemplate->getTemplatedDecl());
4264 return Importer.Imported(D, FoundTemplate);
4268 ConflictingDecls.push_back(FoundDecls[I]);
4271 if (!ConflictingDecls.empty()) {
4272 Name = Importer.HandleNameConflict(Name, DC, Decl::IDNS_Ordinary,
4273 ConflictingDecls.data(),
4274 ConflictingDecls.size());
4281 CXXRecordDecl *DTemplated = D->getTemplatedDecl();
4283 // Create the declaration that is being templated.
4284 SourceLocation StartLoc = Importer.Import(DTemplated->getLocStart());
4285 SourceLocation IdLoc = Importer.Import(DTemplated->getLocation());
4286 CXXRecordDecl *D2Templated = CXXRecordDecl::Create(Importer.getToContext(),
4287 DTemplated->getTagKind(),
4288 DC, StartLoc, IdLoc,
4289 Name.getAsIdentifierInfo());
4290 D2Templated->setAccess(DTemplated->getAccess());
4291 D2Templated->setQualifierInfo(Importer.Import(DTemplated->getQualifierLoc()));
4292 D2Templated->setLexicalDeclContext(LexicalDC);
4294 // Create the class template declaration itself.
4295 TemplateParameterList *TemplateParams
4296 = ImportTemplateParameterList(D->getTemplateParameters());
4297 if (!TemplateParams)
4300 ClassTemplateDecl *D2 = ClassTemplateDecl::Create(Importer.getToContext(), DC,
4301 Loc, Name, TemplateParams,
4303 /*PrevDecl=*/nullptr);
4304 D2Templated->setDescribedClassTemplate(D2);
4306 D2->setAccess(D->getAccess());
4307 D2->setLexicalDeclContext(LexicalDC);
4308 LexicalDC->addDeclInternal(D2);
4310 // Note the relationship between the class templates.
4311 Importer.Imported(D, D2);
4312 Importer.Imported(DTemplated, D2Templated);
4314 if (DTemplated->isCompleteDefinition() &&
4315 !D2Templated->isCompleteDefinition()) {
4316 // FIXME: Import definition!
4322 Decl *ASTNodeImporter::VisitClassTemplateSpecializationDecl(
4323 ClassTemplateSpecializationDecl *D) {
4324 // If this record has a definition in the translation unit we're coming from,
4325 // but this particular declaration is not that definition, import the
4326 // definition and map to that.
4327 TagDecl *Definition = D->getDefinition();
4328 if (Definition && Definition != D) {
4329 Decl *ImportedDef = Importer.Import(Definition);
4333 return Importer.Imported(D, ImportedDef);
4336 ClassTemplateDecl *ClassTemplate
4337 = cast_or_null<ClassTemplateDecl>(Importer.Import(
4338 D->getSpecializedTemplate()));
4342 // Import the context of this declaration.
4343 DeclContext *DC = ClassTemplate->getDeclContext();
4347 DeclContext *LexicalDC = DC;
4348 if (D->getDeclContext() != D->getLexicalDeclContext()) {
4349 LexicalDC = Importer.ImportContext(D->getLexicalDeclContext());
4354 // Import the location of this declaration.
4355 SourceLocation StartLoc = Importer.Import(D->getLocStart());
4356 SourceLocation IdLoc = Importer.Import(D->getLocation());
4358 // Import template arguments.
4359 SmallVector<TemplateArgument, 2> TemplateArgs;
4360 if (ImportTemplateArguments(D->getTemplateArgs().data(),
4361 D->getTemplateArgs().size(),
4365 // Try to find an existing specialization with these template arguments.
4366 void *InsertPos = nullptr;
4367 ClassTemplateSpecializationDecl *D2
4368 = ClassTemplate->findSpecialization(TemplateArgs, InsertPos);
4370 // We already have a class template specialization with these template
4373 // FIXME: Check for specialization vs. instantiation errors.
4375 if (RecordDecl *FoundDef = D2->getDefinition()) {
4376 if (!D->isCompleteDefinition() || IsStructuralMatch(D, FoundDef)) {
4377 // The record types structurally match, or the "from" translation
4378 // unit only had a forward declaration anyway; call it the same
4380 return Importer.Imported(D, FoundDef);
4384 // Create a new specialization.
4385 D2 = ClassTemplateSpecializationDecl::Create(Importer.getToContext(),
4386 D->getTagKind(), DC,
4389 TemplateArgs.data(),
4390 TemplateArgs.size(),
4391 /*PrevDecl=*/nullptr);
4392 D2->setSpecializationKind(D->getSpecializationKind());
4394 // Add this specialization to the class template.
4395 ClassTemplate->AddSpecialization(D2, InsertPos);
4397 // Import the qualifier, if any.
4398 D2->setQualifierInfo(Importer.Import(D->getQualifierLoc()));
4400 // Add the specialization to this context.
4401 D2->setLexicalDeclContext(LexicalDC);
4402 LexicalDC->addDeclInternal(D2);
4404 Importer.Imported(D, D2);
4406 if (D->isCompleteDefinition() && ImportDefinition(D, D2))
4412 Decl *ASTNodeImporter::VisitVarTemplateDecl(VarTemplateDecl *D) {
4413 // If this variable has a definition in the translation unit we're coming
4415 // but this particular declaration is not that definition, import the
4416 // definition and map to that.
4417 VarDecl *Definition =
4418 cast_or_null<VarDecl>(D->getTemplatedDecl()->getDefinition());
4419 if (Definition && Definition != D->getTemplatedDecl()) {
4420 Decl *ImportedDef = Importer.Import(Definition->getDescribedVarTemplate());
4424 return Importer.Imported(D, ImportedDef);
4427 // Import the major distinguishing characteristics of this variable template.
4428 DeclContext *DC, *LexicalDC;
4429 DeclarationName Name;
4432 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
4437 // We may already have a template of the same name; try to find and match it.
4438 assert(!DC->isFunctionOrMethod() &&
4439 "Variable templates cannot be declared at function scope");
4440 SmallVector<NamedDecl *, 4> ConflictingDecls;
4441 SmallVector<NamedDecl *, 2> FoundDecls;
4442 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls);
4443 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
4444 if (!FoundDecls[I]->isInIdentifierNamespace(Decl::IDNS_Ordinary))
4447 Decl *Found = FoundDecls[I];
4448 if (VarTemplateDecl *FoundTemplate = dyn_cast<VarTemplateDecl>(Found)) {
4449 if (IsStructuralMatch(D, FoundTemplate)) {
4450 // The variable templates structurally match; call it the same template.
4451 Importer.Imported(D->getTemplatedDecl(),
4452 FoundTemplate->getTemplatedDecl());
4453 return Importer.Imported(D, FoundTemplate);
4457 ConflictingDecls.push_back(FoundDecls[I]);
4460 if (!ConflictingDecls.empty()) {
4461 Name = Importer.HandleNameConflict(Name, DC, Decl::IDNS_Ordinary,
4462 ConflictingDecls.data(),
4463 ConflictingDecls.size());
4469 VarDecl *DTemplated = D->getTemplatedDecl();
4472 QualType T = Importer.Import(DTemplated->getType());
4476 // Create the declaration that is being templated.
4477 SourceLocation StartLoc = Importer.Import(DTemplated->getLocStart());
4478 SourceLocation IdLoc = Importer.Import(DTemplated->getLocation());
4479 TypeSourceInfo *TInfo = Importer.Import(DTemplated->getTypeSourceInfo());
4480 VarDecl *D2Templated = VarDecl::Create(Importer.getToContext(), DC, StartLoc,
4481 IdLoc, Name.getAsIdentifierInfo(), T,
4482 TInfo, DTemplated->getStorageClass());
4483 D2Templated->setAccess(DTemplated->getAccess());
4484 D2Templated->setQualifierInfo(Importer.Import(DTemplated->getQualifierLoc()));
4485 D2Templated->setLexicalDeclContext(LexicalDC);
4487 // Importer.Imported(DTemplated, D2Templated);
4488 // LexicalDC->addDeclInternal(D2Templated);
4490 // Merge the initializer.
4491 if (ImportDefinition(DTemplated, D2Templated))
4494 // Create the variable template declaration itself.
4495 TemplateParameterList *TemplateParams =
4496 ImportTemplateParameterList(D->getTemplateParameters());
4497 if (!TemplateParams)
4500 VarTemplateDecl *D2 = VarTemplateDecl::Create(
4501 Importer.getToContext(), DC, Loc, Name, TemplateParams, D2Templated);
4502 D2Templated->setDescribedVarTemplate(D2);
4504 D2->setAccess(D->getAccess());
4505 D2->setLexicalDeclContext(LexicalDC);
4506 LexicalDC->addDeclInternal(D2);
4508 // Note the relationship between the variable templates.
4509 Importer.Imported(D, D2);
4510 Importer.Imported(DTemplated, D2Templated);
4512 if (DTemplated->isThisDeclarationADefinition() &&
4513 !D2Templated->isThisDeclarationADefinition()) {
4514 // FIXME: Import definition!
4520 Decl *ASTNodeImporter::VisitVarTemplateSpecializationDecl(
4521 VarTemplateSpecializationDecl *D) {
4522 // If this record has a definition in the translation unit we're coming from,
4523 // but this particular declaration is not that definition, import the
4524 // definition and map to that.
4525 VarDecl *Definition = D->getDefinition();
4526 if (Definition && Definition != D) {
4527 Decl *ImportedDef = Importer.Import(Definition);
4531 return Importer.Imported(D, ImportedDef);
4534 VarTemplateDecl *VarTemplate = cast_or_null<VarTemplateDecl>(
4535 Importer.Import(D->getSpecializedTemplate()));
4539 // Import the context of this declaration.
4540 DeclContext *DC = VarTemplate->getDeclContext();
4544 DeclContext *LexicalDC = DC;
4545 if (D->getDeclContext() != D->getLexicalDeclContext()) {
4546 LexicalDC = Importer.ImportContext(D->getLexicalDeclContext());
4551 // Import the location of this declaration.
4552 SourceLocation StartLoc = Importer.Import(D->getLocStart());
4553 SourceLocation IdLoc = Importer.Import(D->getLocation());
4555 // Import template arguments.
4556 SmallVector<TemplateArgument, 2> TemplateArgs;
4557 if (ImportTemplateArguments(D->getTemplateArgs().data(),
4558 D->getTemplateArgs().size(), TemplateArgs))
4561 // Try to find an existing specialization with these template arguments.
4562 void *InsertPos = nullptr;
4563 VarTemplateSpecializationDecl *D2 = VarTemplate->findSpecialization(
4564 TemplateArgs, InsertPos);
4566 // We already have a variable template specialization with these template
4569 // FIXME: Check for specialization vs. instantiation errors.
4571 if (VarDecl *FoundDef = D2->getDefinition()) {
4572 if (!D->isThisDeclarationADefinition() ||
4573 IsStructuralMatch(D, FoundDef)) {
4574 // The record types structurally match, or the "from" translation
4575 // unit only had a forward declaration anyway; call it the same
4577 return Importer.Imported(D, FoundDef);
4583 QualType T = Importer.Import(D->getType());
4586 TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo());
4588 // Create a new specialization.
4589 D2 = VarTemplateSpecializationDecl::Create(
4590 Importer.getToContext(), DC, StartLoc, IdLoc, VarTemplate, T, TInfo,
4591 D->getStorageClass(), TemplateArgs.data(), TemplateArgs.size());
4592 D2->setSpecializationKind(D->getSpecializationKind());
4593 D2->setTemplateArgsInfo(D->getTemplateArgsInfo());
4595 // Add this specialization to the class template.
4596 VarTemplate->AddSpecialization(D2, InsertPos);
4598 // Import the qualifier, if any.
4599 D2->setQualifierInfo(Importer.Import(D->getQualifierLoc()));
4601 // Add the specialization to this context.
4602 D2->setLexicalDeclContext(LexicalDC);
4603 LexicalDC->addDeclInternal(D2);
4605 Importer.Imported(D, D2);
4607 if (D->isThisDeclarationADefinition() && ImportDefinition(D, D2))
4613 //----------------------------------------------------------------------------
4614 // Import Statements
4615 //----------------------------------------------------------------------------
4617 DeclGroupRef ASTNodeImporter::ImportDeclGroup(DeclGroupRef DG) {
4619 return DeclGroupRef::Create(Importer.getToContext(), nullptr, 0);
4620 size_t NumDecls = DG.end() - DG.begin();
4621 SmallVector<Decl *, 1> ToDecls(NumDecls);
4622 auto &_Importer = this->Importer;
4623 std::transform(DG.begin(), DG.end(), ToDecls.begin(),
4624 [&_Importer](Decl *D) -> Decl * {
4625 return _Importer.Import(D);
4627 return DeclGroupRef::Create(Importer.getToContext(),
4632 Stmt *ASTNodeImporter::VisitStmt(Stmt *S) {
4633 Importer.FromDiag(S->getLocStart(), diag::err_unsupported_ast_node)
4634 << S->getStmtClassName();
4638 Stmt *ASTNodeImporter::VisitDeclStmt(DeclStmt *S) {
4639 DeclGroupRef ToDG = ImportDeclGroup(S->getDeclGroup());
4640 for (Decl *ToD : ToDG) {
4644 SourceLocation ToStartLoc = Importer.Import(S->getStartLoc());
4645 SourceLocation ToEndLoc = Importer.Import(S->getEndLoc());
4646 return new (Importer.getToContext()) DeclStmt(ToDG, ToStartLoc, ToEndLoc);
4649 Stmt *ASTNodeImporter::VisitNullStmt(NullStmt *S) {
4650 SourceLocation ToSemiLoc = Importer.Import(S->getSemiLoc());
4651 return new (Importer.getToContext()) NullStmt(ToSemiLoc,
4652 S->hasLeadingEmptyMacro());
4655 Stmt *ASTNodeImporter::VisitCompoundStmt(CompoundStmt *S) {
4656 SmallVector<Stmt *, 4> ToStmts(S->size());
4657 auto &_Importer = this->Importer;
4658 std::transform(S->body_begin(), S->body_end(), ToStmts.begin(),
4659 [&_Importer](Stmt *CS) -> Stmt * {
4660 return _Importer.Import(CS);
4662 for (Stmt *ToS : ToStmts) {
4666 SourceLocation ToLBraceLoc = Importer.Import(S->getLBracLoc());
4667 SourceLocation ToRBraceLoc = Importer.Import(S->getRBracLoc());
4668 return new (Importer.getToContext()) CompoundStmt(Importer.getToContext(),
4670 ToLBraceLoc, ToRBraceLoc);
4673 Stmt *ASTNodeImporter::VisitCaseStmt(CaseStmt *S) {
4674 Expr *ToLHS = Importer.Import(S->getLHS());
4677 Expr *ToRHS = Importer.Import(S->getRHS());
4678 if (!ToRHS && S->getRHS())
4680 SourceLocation ToCaseLoc = Importer.Import(S->getCaseLoc());
4681 SourceLocation ToEllipsisLoc = Importer.Import(S->getEllipsisLoc());
4682 SourceLocation ToColonLoc = Importer.Import(S->getColonLoc());
4683 return new (Importer.getToContext()) CaseStmt(ToLHS, ToRHS,
4684 ToCaseLoc, ToEllipsisLoc,
4688 Stmt *ASTNodeImporter::VisitDefaultStmt(DefaultStmt *S) {
4689 SourceLocation ToDefaultLoc = Importer.Import(S->getDefaultLoc());
4690 SourceLocation ToColonLoc = Importer.Import(S->getColonLoc());
4691 Stmt *ToSubStmt = Importer.Import(S->getSubStmt());
4692 if (!ToSubStmt && S->getSubStmt())
4694 return new (Importer.getToContext()) DefaultStmt(ToDefaultLoc, ToColonLoc,
4698 Stmt *ASTNodeImporter::VisitLabelStmt(LabelStmt *S) {
4699 SourceLocation ToIdentLoc = Importer.Import(S->getIdentLoc());
4700 LabelDecl *ToLabelDecl =
4701 cast_or_null<LabelDecl>(Importer.Import(S->getDecl()));
4702 if (!ToLabelDecl && S->getDecl())
4704 Stmt *ToSubStmt = Importer.Import(S->getSubStmt());
4705 if (!ToSubStmt && S->getSubStmt())
4707 return new (Importer.getToContext()) LabelStmt(ToIdentLoc, ToLabelDecl,
4711 Stmt *ASTNodeImporter::VisitAttributedStmt(AttributedStmt *S) {
4712 SourceLocation ToAttrLoc = Importer.Import(S->getAttrLoc());
4713 ArrayRef<const Attr*> FromAttrs(S->getAttrs());
4714 SmallVector<const Attr *, 1> ToAttrs(FromAttrs.size());
4715 ASTContext &_ToContext = Importer.getToContext();
4716 std::transform(FromAttrs.begin(), FromAttrs.end(), ToAttrs.begin(),
4717 [&_ToContext](const Attr *A) -> const Attr * {
4718 return A->clone(_ToContext);
4720 for (const Attr *ToA : ToAttrs) {
4724 Stmt *ToSubStmt = Importer.Import(S->getSubStmt());
4725 if (!ToSubStmt && S->getSubStmt())
4727 return AttributedStmt::Create(Importer.getToContext(), ToAttrLoc,
4728 ToAttrs, ToSubStmt);
4731 Stmt *ASTNodeImporter::VisitIfStmt(IfStmt *S) {
4732 SourceLocation ToIfLoc = Importer.Import(S->getIfLoc());
4733 VarDecl *ToConditionVariable = nullptr;
4734 if (VarDecl *FromConditionVariable = S->getConditionVariable()) {
4735 ToConditionVariable =
4736 dyn_cast_or_null<VarDecl>(Importer.Import(FromConditionVariable));
4737 if (!ToConditionVariable)
4740 Expr *ToCondition = Importer.Import(S->getCond());
4741 if (!ToCondition && S->getCond())
4743 Stmt *ToThenStmt = Importer.Import(S->getThen());
4744 if (!ToThenStmt && S->getThen())
4746 SourceLocation ToElseLoc = Importer.Import(S->getElseLoc());
4747 Stmt *ToElseStmt = Importer.Import(S->getElse());
4748 if (!ToElseStmt && S->getElse())
4750 return new (Importer.getToContext()) IfStmt(Importer.getToContext(),
4751 ToIfLoc, ToConditionVariable,
4752 ToCondition, ToThenStmt,
4753 ToElseLoc, ToElseStmt);
4756 Stmt *ASTNodeImporter::VisitSwitchStmt(SwitchStmt *S) {
4757 VarDecl *ToConditionVariable = nullptr;
4758 if (VarDecl *FromConditionVariable = S->getConditionVariable()) {
4759 ToConditionVariable =
4760 dyn_cast_or_null<VarDecl>(Importer.Import(FromConditionVariable));
4761 if (!ToConditionVariable)
4764 Expr *ToCondition = Importer.Import(S->getCond());
4765 if (!ToCondition && S->getCond())
4767 SwitchStmt *ToStmt = new (Importer.getToContext()) SwitchStmt(
4768 Importer.getToContext(), ToConditionVariable,
4770 Stmt *ToBody = Importer.Import(S->getBody());
4771 if (!ToBody && S->getBody())
4773 ToStmt->setBody(ToBody);
4774 ToStmt->setSwitchLoc(Importer.Import(S->getSwitchLoc()));
4775 // Now we have to re-chain the cases.
4776 SwitchCase *LastChainedSwitchCase = nullptr;
4777 for (SwitchCase *SC = S->getSwitchCaseList(); SC != nullptr;
4778 SC = SC->getNextSwitchCase()) {
4779 SwitchCase *ToSC = dyn_cast_or_null<SwitchCase>(Importer.Import(SC));
4782 if (LastChainedSwitchCase)
4783 LastChainedSwitchCase->setNextSwitchCase(ToSC);
4785 ToStmt->setSwitchCaseList(ToSC);
4786 LastChainedSwitchCase = ToSC;
4791 Stmt *ASTNodeImporter::VisitWhileStmt(WhileStmt *S) {
4792 VarDecl *ToConditionVariable = nullptr;
4793 if (VarDecl *FromConditionVariable = S->getConditionVariable()) {
4794 ToConditionVariable =
4795 dyn_cast_or_null<VarDecl>(Importer.Import(FromConditionVariable));
4796 if (!ToConditionVariable)
4799 Expr *ToCondition = Importer.Import(S->getCond());
4800 if (!ToCondition && S->getCond())
4802 Stmt *ToBody = Importer.Import(S->getBody());
4803 if (!ToBody && S->getBody())
4805 SourceLocation ToWhileLoc = Importer.Import(S->getWhileLoc());
4806 return new (Importer.getToContext()) WhileStmt(Importer.getToContext(),
4807 ToConditionVariable,
4808 ToCondition, ToBody,
4812 Stmt *ASTNodeImporter::VisitDoStmt(DoStmt *S) {
4813 Stmt *ToBody = Importer.Import(S->getBody());
4814 if (!ToBody && S->getBody())
4816 Expr *ToCondition = Importer.Import(S->getCond());
4817 if (!ToCondition && S->getCond())
4819 SourceLocation ToDoLoc = Importer.Import(S->getDoLoc());
4820 SourceLocation ToWhileLoc = Importer.Import(S->getWhileLoc());
4821 SourceLocation ToRParenLoc = Importer.Import(S->getRParenLoc());
4822 return new (Importer.getToContext()) DoStmt(ToBody, ToCondition,
4823 ToDoLoc, ToWhileLoc,
4827 Stmt *ASTNodeImporter::VisitForStmt(ForStmt *S) {
4828 Stmt *ToInit = Importer.Import(S->getInit());
4829 if (!ToInit && S->getInit())
4831 Expr *ToCondition = Importer.Import(S->getCond());
4832 if (!ToCondition && S->getCond())
4834 VarDecl *ToConditionVariable = nullptr;
4835 if (VarDecl *FromConditionVariable = S->getConditionVariable()) {
4836 ToConditionVariable =
4837 dyn_cast_or_null<VarDecl>(Importer.Import(FromConditionVariable));
4838 if (!ToConditionVariable)
4841 Expr *ToInc = Importer.Import(S->getInc());
4842 if (!ToInc && S->getInc())
4844 Stmt *ToBody = Importer.Import(S->getBody());
4845 if (!ToBody && S->getBody())
4847 SourceLocation ToForLoc = Importer.Import(S->getForLoc());
4848 SourceLocation ToLParenLoc = Importer.Import(S->getLParenLoc());
4849 SourceLocation ToRParenLoc = Importer.Import(S->getRParenLoc());
4850 return new (Importer.getToContext()) ForStmt(Importer.getToContext(),
4851 ToInit, ToCondition,
4852 ToConditionVariable,
4854 ToForLoc, ToLParenLoc,
4858 Stmt *ASTNodeImporter::VisitGotoStmt(GotoStmt *S) {
4859 LabelDecl *ToLabel = nullptr;
4860 if (LabelDecl *FromLabel = S->getLabel()) {
4861 ToLabel = dyn_cast_or_null<LabelDecl>(Importer.Import(FromLabel));
4865 SourceLocation ToGotoLoc = Importer.Import(S->getGotoLoc());
4866 SourceLocation ToLabelLoc = Importer.Import(S->getLabelLoc());
4867 return new (Importer.getToContext()) GotoStmt(ToLabel,
4868 ToGotoLoc, ToLabelLoc);
4871 Stmt *ASTNodeImporter::VisitIndirectGotoStmt(IndirectGotoStmt *S) {
4872 SourceLocation ToGotoLoc = Importer.Import(S->getGotoLoc());
4873 SourceLocation ToStarLoc = Importer.Import(S->getStarLoc());
4874 Expr *ToTarget = Importer.Import(S->getTarget());
4875 if (!ToTarget && S->getTarget())
4877 return new (Importer.getToContext()) IndirectGotoStmt(ToGotoLoc, ToStarLoc,
4881 Stmt *ASTNodeImporter::VisitContinueStmt(ContinueStmt *S) {
4882 SourceLocation ToContinueLoc = Importer.Import(S->getContinueLoc());
4883 return new (Importer.getToContext()) ContinueStmt(ToContinueLoc);
4886 Stmt *ASTNodeImporter::VisitBreakStmt(BreakStmt *S) {
4887 SourceLocation ToBreakLoc = Importer.Import(S->getBreakLoc());
4888 return new (Importer.getToContext()) BreakStmt(ToBreakLoc);
4891 Stmt *ASTNodeImporter::VisitReturnStmt(ReturnStmt *S) {
4892 SourceLocation ToRetLoc = Importer.Import(S->getReturnLoc());
4893 Expr *ToRetExpr = Importer.Import(S->getRetValue());
4894 if (!ToRetExpr && S->getRetValue())
4896 VarDecl *NRVOCandidate = const_cast<VarDecl*>(S->getNRVOCandidate());
4897 VarDecl *ToNRVOCandidate = cast_or_null<VarDecl>(Importer.Import(NRVOCandidate));
4898 if (!ToNRVOCandidate && NRVOCandidate)
4900 return new (Importer.getToContext()) ReturnStmt(ToRetLoc, ToRetExpr,
4904 Stmt *ASTNodeImporter::VisitCXXCatchStmt(CXXCatchStmt *S) {
4905 SourceLocation ToCatchLoc = Importer.Import(S->getCatchLoc());
4906 VarDecl *ToExceptionDecl = nullptr;
4907 if (VarDecl *FromExceptionDecl = S->getExceptionDecl()) {
4909 dyn_cast_or_null<VarDecl>(Importer.Import(FromExceptionDecl));
4910 if (!ToExceptionDecl)
4913 Stmt *ToHandlerBlock = Importer.Import(S->getHandlerBlock());
4914 if (!ToHandlerBlock && S->getHandlerBlock())
4916 return new (Importer.getToContext()) CXXCatchStmt(ToCatchLoc,
4921 Stmt *ASTNodeImporter::VisitCXXTryStmt(CXXTryStmt *S) {
4922 SourceLocation ToTryLoc = Importer.Import(S->getTryLoc());
4923 Stmt *ToTryBlock = Importer.Import(S->getTryBlock());
4924 if (!ToTryBlock && S->getTryBlock())
4926 SmallVector<Stmt *, 1> ToHandlers(S->getNumHandlers());
4927 for (unsigned HI = 0, HE = S->getNumHandlers(); HI != HE; ++HI) {
4928 CXXCatchStmt *FromHandler = S->getHandler(HI);
4929 if (Stmt *ToHandler = Importer.Import(FromHandler))
4930 ToHandlers[HI] = ToHandler;
4934 return CXXTryStmt::Create(Importer.getToContext(), ToTryLoc, ToTryBlock,
4938 Stmt *ASTNodeImporter::VisitCXXForRangeStmt(CXXForRangeStmt *S) {
4940 dyn_cast_or_null<DeclStmt>(Importer.Import(S->getRangeStmt()));
4941 if (!ToRange && S->getRangeStmt())
4944 dyn_cast_or_null<DeclStmt>(Importer.Import(S->getBeginStmt()));
4945 if (!ToBegin && S->getBeginStmt())
4948 dyn_cast_or_null<DeclStmt>(Importer.Import(S->getEndStmt()));
4949 if (!ToEnd && S->getEndStmt())
4951 Expr *ToCond = Importer.Import(S->getCond());
4952 if (!ToCond && S->getCond())
4954 Expr *ToInc = Importer.Import(S->getInc());
4955 if (!ToInc && S->getInc())
4957 DeclStmt *ToLoopVar =
4958 dyn_cast_or_null<DeclStmt>(Importer.Import(S->getLoopVarStmt()));
4959 if (!ToLoopVar && S->getLoopVarStmt())
4961 Stmt *ToBody = Importer.Import(S->getBody());
4962 if (!ToBody && S->getBody())
4964 SourceLocation ToForLoc = Importer.Import(S->getForLoc());
4965 SourceLocation ToCoawaitLoc = Importer.Import(S->getCoawaitLoc());
4966 SourceLocation ToColonLoc = Importer.Import(S->getColonLoc());
4967 SourceLocation ToRParenLoc = Importer.Import(S->getRParenLoc());
4968 return new (Importer.getToContext()) CXXForRangeStmt(ToRange, ToBegin, ToEnd,
4971 ToForLoc, ToCoawaitLoc,
4972 ToColonLoc, ToRParenLoc);
4975 Stmt *ASTNodeImporter::VisitObjCForCollectionStmt(ObjCForCollectionStmt *S) {
4976 Stmt *ToElem = Importer.Import(S->getElement());
4977 if (!ToElem && S->getElement())
4979 Expr *ToCollect = Importer.Import(S->getCollection());
4980 if (!ToCollect && S->getCollection())
4982 Stmt *ToBody = Importer.Import(S->getBody());
4983 if (!ToBody && S->getBody())
4985 SourceLocation ToForLoc = Importer.Import(S->getForLoc());
4986 SourceLocation ToRParenLoc = Importer.Import(S->getRParenLoc());
4987 return new (Importer.getToContext()) ObjCForCollectionStmt(ToElem,
4993 Stmt *ASTNodeImporter::VisitObjCAtCatchStmt(ObjCAtCatchStmt *S) {
4994 SourceLocation ToAtCatchLoc = Importer.Import(S->getAtCatchLoc());
4995 SourceLocation ToRParenLoc = Importer.Import(S->getRParenLoc());
4996 VarDecl *ToExceptionDecl = nullptr;
4997 if (VarDecl *FromExceptionDecl = S->getCatchParamDecl()) {
4999 dyn_cast_or_null<VarDecl>(Importer.Import(FromExceptionDecl));
5000 if (!ToExceptionDecl)
5003 Stmt *ToBody = Importer.Import(S->getCatchBody());
5004 if (!ToBody && S->getCatchBody())
5006 return new (Importer.getToContext()) ObjCAtCatchStmt(ToAtCatchLoc,
5012 Stmt *ASTNodeImporter::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
5013 SourceLocation ToAtFinallyLoc = Importer.Import(S->getAtFinallyLoc());
5014 Stmt *ToAtFinallyStmt = Importer.Import(S->getFinallyBody());
5015 if (!ToAtFinallyStmt && S->getFinallyBody())
5017 return new (Importer.getToContext()) ObjCAtFinallyStmt(ToAtFinallyLoc,
5021 Stmt *ASTNodeImporter::VisitObjCAtTryStmt(ObjCAtTryStmt *S) {
5022 SourceLocation ToAtTryLoc = Importer.Import(S->getAtTryLoc());
5023 Stmt *ToAtTryStmt = Importer.Import(S->getTryBody());
5024 if (!ToAtTryStmt && S->getTryBody())
5026 SmallVector<Stmt *, 1> ToCatchStmts(S->getNumCatchStmts());
5027 for (unsigned CI = 0, CE = S->getNumCatchStmts(); CI != CE; ++CI) {
5028 ObjCAtCatchStmt *FromCatchStmt = S->getCatchStmt(CI);
5029 if (Stmt *ToCatchStmt = Importer.Import(FromCatchStmt))
5030 ToCatchStmts[CI] = ToCatchStmt;
5034 Stmt *ToAtFinallyStmt = Importer.Import(S->getFinallyStmt());
5035 if (!ToAtFinallyStmt && S->getFinallyStmt())
5037 return ObjCAtTryStmt::Create(Importer.getToContext(),
5038 ToAtTryLoc, ToAtTryStmt,
5039 ToCatchStmts.begin(), ToCatchStmts.size(),
5043 Stmt *ASTNodeImporter::VisitObjCAtSynchronizedStmt
5044 (ObjCAtSynchronizedStmt *S) {
5045 SourceLocation ToAtSynchronizedLoc =
5046 Importer.Import(S->getAtSynchronizedLoc());
5047 Expr *ToSynchExpr = Importer.Import(S->getSynchExpr());
5048 if (!ToSynchExpr && S->getSynchExpr())
5050 Stmt *ToSynchBody = Importer.Import(S->getSynchBody());
5051 if (!ToSynchBody && S->getSynchBody())
5053 return new (Importer.getToContext()) ObjCAtSynchronizedStmt(
5054 ToAtSynchronizedLoc, ToSynchExpr, ToSynchBody);
5057 Stmt *ASTNodeImporter::VisitObjCAtThrowStmt(ObjCAtThrowStmt *S) {
5058 SourceLocation ToAtThrowLoc = Importer.Import(S->getThrowLoc());
5059 Expr *ToThrow = Importer.Import(S->getThrowExpr());
5060 if (!ToThrow && S->getThrowExpr())
5062 return new (Importer.getToContext()) ObjCAtThrowStmt(ToAtThrowLoc, ToThrow);
5065 Stmt *ASTNodeImporter::VisitObjCAutoreleasePoolStmt
5066 (ObjCAutoreleasePoolStmt *S) {
5067 SourceLocation ToAtLoc = Importer.Import(S->getAtLoc());
5068 Stmt *ToSubStmt = Importer.Import(S->getSubStmt());
5069 if (!ToSubStmt && S->getSubStmt())
5071 return new (Importer.getToContext()) ObjCAutoreleasePoolStmt(ToAtLoc,
5075 //----------------------------------------------------------------------------
5076 // Import Expressions
5077 //----------------------------------------------------------------------------
5078 Expr *ASTNodeImporter::VisitExpr(Expr *E) {
5079 Importer.FromDiag(E->getLocStart(), diag::err_unsupported_ast_node)
5080 << E->getStmtClassName();
5084 Expr *ASTNodeImporter::VisitDeclRefExpr(DeclRefExpr *E) {
5085 ValueDecl *ToD = cast_or_null<ValueDecl>(Importer.Import(E->getDecl()));
5089 NamedDecl *FoundD = nullptr;
5090 if (E->getDecl() != E->getFoundDecl()) {
5091 FoundD = cast_or_null<NamedDecl>(Importer.Import(E->getFoundDecl()));
5096 QualType T = Importer.Import(E->getType());
5100 DeclRefExpr *DRE = DeclRefExpr::Create(Importer.getToContext(),
5101 Importer.Import(E->getQualifierLoc()),
5102 Importer.Import(E->getTemplateKeywordLoc()),
5104 E->refersToEnclosingVariableOrCapture(),
5105 Importer.Import(E->getLocation()),
5106 T, E->getValueKind(),
5108 /*FIXME:TemplateArgs=*/nullptr);
5109 if (E->hadMultipleCandidates())
5110 DRE->setHadMultipleCandidates(true);
5114 Expr *ASTNodeImporter::VisitIntegerLiteral(IntegerLiteral *E) {
5115 QualType T = Importer.Import(E->getType());
5119 return IntegerLiteral::Create(Importer.getToContext(),
5121 Importer.Import(E->getLocation()));
5124 Expr *ASTNodeImporter::VisitCharacterLiteral(CharacterLiteral *E) {
5125 QualType T = Importer.Import(E->getType());
5129 return new (Importer.getToContext()) CharacterLiteral(E->getValue(),
5131 Importer.Import(E->getLocation()));
5134 Expr *ASTNodeImporter::VisitParenExpr(ParenExpr *E) {
5135 Expr *SubExpr = Importer.Import(E->getSubExpr());
5139 return new (Importer.getToContext())
5140 ParenExpr(Importer.Import(E->getLParen()),
5141 Importer.Import(E->getRParen()),
5145 Expr *ASTNodeImporter::VisitUnaryOperator(UnaryOperator *E) {
5146 QualType T = Importer.Import(E->getType());
5150 Expr *SubExpr = Importer.Import(E->getSubExpr());
5154 return new (Importer.getToContext()) UnaryOperator(SubExpr, E->getOpcode(),
5155 T, E->getValueKind(),
5157 Importer.Import(E->getOperatorLoc()));
5160 Expr *ASTNodeImporter::VisitUnaryExprOrTypeTraitExpr(
5161 UnaryExprOrTypeTraitExpr *E) {
5162 QualType ResultType = Importer.Import(E->getType());
5164 if (E->isArgumentType()) {
5165 TypeSourceInfo *TInfo = Importer.Import(E->getArgumentTypeInfo());
5169 return new (Importer.getToContext()) UnaryExprOrTypeTraitExpr(E->getKind(),
5171 Importer.Import(E->getOperatorLoc()),
5172 Importer.Import(E->getRParenLoc()));
5175 Expr *SubExpr = Importer.Import(E->getArgumentExpr());
5179 return new (Importer.getToContext()) UnaryExprOrTypeTraitExpr(E->getKind(),
5180 SubExpr, ResultType,
5181 Importer.Import(E->getOperatorLoc()),
5182 Importer.Import(E->getRParenLoc()));
5185 Expr *ASTNodeImporter::VisitBinaryOperator(BinaryOperator *E) {
5186 QualType T = Importer.Import(E->getType());
5190 Expr *LHS = Importer.Import(E->getLHS());
5194 Expr *RHS = Importer.Import(E->getRHS());
5198 return new (Importer.getToContext()) BinaryOperator(LHS, RHS, E->getOpcode(),
5199 T, E->getValueKind(),
5201 Importer.Import(E->getOperatorLoc()),
5202 E->isFPContractable());
5205 Expr *ASTNodeImporter::VisitCompoundAssignOperator(CompoundAssignOperator *E) {
5206 QualType T = Importer.Import(E->getType());
5210 QualType CompLHSType = Importer.Import(E->getComputationLHSType());
5211 if (CompLHSType.isNull())
5214 QualType CompResultType = Importer.Import(E->getComputationResultType());
5215 if (CompResultType.isNull())
5218 Expr *LHS = Importer.Import(E->getLHS());
5222 Expr *RHS = Importer.Import(E->getRHS());
5226 return new (Importer.getToContext())
5227 CompoundAssignOperator(LHS, RHS, E->getOpcode(),
5228 T, E->getValueKind(),
5230 CompLHSType, CompResultType,
5231 Importer.Import(E->getOperatorLoc()),
5232 E->isFPContractable());
5235 static bool ImportCastPath(CastExpr *E, CXXCastPath &Path) {
5236 if (E->path_empty()) return false;
5238 // TODO: import cast paths
5242 Expr *ASTNodeImporter::VisitImplicitCastExpr(ImplicitCastExpr *E) {
5243 QualType T = Importer.Import(E->getType());
5247 Expr *SubExpr = Importer.Import(E->getSubExpr());
5251 CXXCastPath BasePath;
5252 if (ImportCastPath(E, BasePath))
5255 return ImplicitCastExpr::Create(Importer.getToContext(), T, E->getCastKind(),
5256 SubExpr, &BasePath, E->getValueKind());
5259 Expr *ASTNodeImporter::VisitCStyleCastExpr(CStyleCastExpr *E) {
5260 QualType T = Importer.Import(E->getType());
5264 Expr *SubExpr = Importer.Import(E->getSubExpr());
5268 TypeSourceInfo *TInfo = Importer.Import(E->getTypeInfoAsWritten());
5269 if (!TInfo && E->getTypeInfoAsWritten())
5272 CXXCastPath BasePath;
5273 if (ImportCastPath(E, BasePath))
5276 return CStyleCastExpr::Create(Importer.getToContext(), T,
5277 E->getValueKind(), E->getCastKind(),
5278 SubExpr, &BasePath, TInfo,
5279 Importer.Import(E->getLParenLoc()),
5280 Importer.Import(E->getRParenLoc()));
5283 Expr *ASTNodeImporter::VisitCXXConstructExpr(CXXConstructExpr *E) {
5284 QualType T = Importer.Import(E->getType());
5288 CXXConstructorDecl *ToCCD =
5289 dyn_cast<CXXConstructorDecl>(Importer.Import(E->getConstructor()));
5290 if (!ToCCD && E->getConstructor())
5293 size_t NumArgs = E->getNumArgs();
5294 SmallVector<Expr *, 1> ToArgs(NumArgs);
5295 ASTImporter &_Importer = Importer;
5296 std::transform(E->arg_begin(), E->arg_end(), ToArgs.begin(),
5297 [&_Importer](Expr *AE) -> Expr * {
5298 return _Importer.Import(AE);
5300 for (Expr *ToA : ToArgs) {
5305 return CXXConstructExpr::Create(Importer.getToContext(), T,
5306 Importer.Import(E->getLocation()),
5307 ToCCD, E->isElidable(),
5308 ToArgs, E->hadMultipleCandidates(),
5309 E->isListInitialization(),
5310 E->isStdInitListInitialization(),
5311 E->requiresZeroInitialization(),
5312 E->getConstructionKind(),
5313 Importer.Import(E->getParenOrBraceRange()));
5316 Expr *ASTNodeImporter::VisitMemberExpr(MemberExpr *E) {
5317 QualType T = Importer.Import(E->getType());
5321 Expr *ToBase = Importer.Import(E->getBase());
5322 if (!ToBase && E->getBase())
5325 ValueDecl *ToMember = dyn_cast<ValueDecl>(Importer.Import(E->getMemberDecl()));
5326 if (!ToMember && E->getMemberDecl())
5329 DeclAccessPair ToFoundDecl = DeclAccessPair::make(
5330 dyn_cast<NamedDecl>(Importer.Import(E->getFoundDecl().getDecl())),
5331 E->getFoundDecl().getAccess());
5333 DeclarationNameInfo ToMemberNameInfo(
5334 Importer.Import(E->getMemberNameInfo().getName()),
5335 Importer.Import(E->getMemberNameInfo().getLoc()));
5337 if (E->hasExplicitTemplateArgs()) {
5338 return nullptr; // FIXME: handle template arguments
5341 return MemberExpr::Create(Importer.getToContext(), ToBase,
5343 Importer.Import(E->getOperatorLoc()),
5344 Importer.Import(E->getQualifierLoc()),
5345 Importer.Import(E->getTemplateKeywordLoc()),
5346 ToMember, ToFoundDecl, ToMemberNameInfo,
5347 nullptr, T, E->getValueKind(),
5348 E->getObjectKind());
5351 Expr *ASTNodeImporter::VisitCallExpr(CallExpr *E) {
5352 QualType T = Importer.Import(E->getType());
5356 Expr *ToCallee = Importer.Import(E->getCallee());
5357 if (!ToCallee && E->getCallee())
5360 unsigned NumArgs = E->getNumArgs();
5362 llvm::SmallVector<Expr *, 2> ToArgs(NumArgs);
5364 for (unsigned ai = 0, ae = NumArgs; ai != ae; ++ai) {
5365 Expr *FromArg = E->getArg(ai);
5366 Expr *ToArg = Importer.Import(FromArg);
5372 Expr **ToArgs_Copied = new (Importer.getToContext())
5375 for (unsigned ai = 0, ae = NumArgs; ai != ae; ++ai)
5376 ToArgs_Copied[ai] = ToArgs[ai];
5378 return new (Importer.getToContext())
5379 CallExpr(Importer.getToContext(), ToCallee,
5380 llvm::makeArrayRef(ToArgs_Copied, NumArgs), T, E->getValueKind(),
5381 Importer.Import(E->getRParenLoc()));
5384 ASTImporter::ASTImporter(ASTContext &ToContext, FileManager &ToFileManager,
5385 ASTContext &FromContext, FileManager &FromFileManager,
5387 : ToContext(ToContext), FromContext(FromContext),
5388 ToFileManager(ToFileManager), FromFileManager(FromFileManager),
5389 Minimal(MinimalImport), LastDiagFromFrom(false)
5391 ImportedDecls[FromContext.getTranslationUnitDecl()]
5392 = ToContext.getTranslationUnitDecl();
5395 ASTImporter::~ASTImporter() { }
5397 QualType ASTImporter::Import(QualType FromT) {
5401 const Type *fromTy = FromT.getTypePtr();
5403 // Check whether we've already imported this type.
5404 llvm::DenseMap<const Type *, const Type *>::iterator Pos
5405 = ImportedTypes.find(fromTy);
5406 if (Pos != ImportedTypes.end())
5407 return ToContext.getQualifiedType(Pos->second, FromT.getLocalQualifiers());
5410 ASTNodeImporter Importer(*this);
5411 QualType ToT = Importer.Visit(fromTy);
5415 // Record the imported type.
5416 ImportedTypes[fromTy] = ToT.getTypePtr();
5418 return ToContext.getQualifiedType(ToT, FromT.getLocalQualifiers());
5421 TypeSourceInfo *ASTImporter::Import(TypeSourceInfo *FromTSI) {
5425 // FIXME: For now we just create a "trivial" type source info based
5426 // on the type and a single location. Implement a real version of this.
5427 QualType T = Import(FromTSI->getType());
5431 return ToContext.getTrivialTypeSourceInfo(T,
5432 Import(FromTSI->getTypeLoc().getLocStart()));
5435 Decl *ASTImporter::GetAlreadyImportedOrNull(Decl *FromD) {
5436 llvm::DenseMap<Decl *, Decl *>::iterator Pos = ImportedDecls.find(FromD);
5437 if (Pos != ImportedDecls.end()) {
5438 Decl *ToD = Pos->second;
5439 ASTNodeImporter(*this).ImportDefinitionIfNeeded(FromD, ToD);
5446 Decl *ASTImporter::Import(Decl *FromD) {
5450 ASTNodeImporter Importer(*this);
5452 // Check whether we've already imported this declaration.
5453 llvm::DenseMap<Decl *, Decl *>::iterator Pos = ImportedDecls.find(FromD);
5454 if (Pos != ImportedDecls.end()) {
5455 Decl *ToD = Pos->second;
5456 Importer.ImportDefinitionIfNeeded(FromD, ToD);
5461 Decl *ToD = Importer.Visit(FromD);
5465 // Record the imported declaration.
5466 ImportedDecls[FromD] = ToD;
5468 if (TagDecl *FromTag = dyn_cast<TagDecl>(FromD)) {
5469 // Keep track of anonymous tags that have an associated typedef.
5470 if (FromTag->getTypedefNameForAnonDecl())
5471 AnonTagsWithPendingTypedefs.push_back(FromTag);
5472 } else if (TypedefNameDecl *FromTypedef = dyn_cast<TypedefNameDecl>(FromD)) {
5473 // When we've finished transforming a typedef, see whether it was the
5474 // typedef for an anonymous tag.
5475 for (SmallVectorImpl<TagDecl *>::iterator
5476 FromTag = AnonTagsWithPendingTypedefs.begin(),
5477 FromTagEnd = AnonTagsWithPendingTypedefs.end();
5478 FromTag != FromTagEnd; ++FromTag) {
5479 if ((*FromTag)->getTypedefNameForAnonDecl() == FromTypedef) {
5480 if (TagDecl *ToTag = cast_or_null<TagDecl>(Import(*FromTag))) {
5481 // We found the typedef for an anonymous tag; link them.
5482 ToTag->setTypedefNameForAnonDecl(cast<TypedefNameDecl>(ToD));
5483 AnonTagsWithPendingTypedefs.erase(FromTag);
5493 DeclContext *ASTImporter::ImportContext(DeclContext *FromDC) {
5497 DeclContext *ToDC = cast_or_null<DeclContext>(Import(cast<Decl>(FromDC)));
5501 // When we're using a record/enum/Objective-C class/protocol as a context, we
5502 // need it to have a definition.
5503 if (RecordDecl *ToRecord = dyn_cast<RecordDecl>(ToDC)) {
5504 RecordDecl *FromRecord = cast<RecordDecl>(FromDC);
5505 if (ToRecord->isCompleteDefinition()) {
5507 } else if (FromRecord->isCompleteDefinition()) {
5508 ASTNodeImporter(*this).ImportDefinition(FromRecord, ToRecord,
5509 ASTNodeImporter::IDK_Basic);
5511 CompleteDecl(ToRecord);
5513 } else if (EnumDecl *ToEnum = dyn_cast<EnumDecl>(ToDC)) {
5514 EnumDecl *FromEnum = cast<EnumDecl>(FromDC);
5515 if (ToEnum->isCompleteDefinition()) {
5517 } else if (FromEnum->isCompleteDefinition()) {
5518 ASTNodeImporter(*this).ImportDefinition(FromEnum, ToEnum,
5519 ASTNodeImporter::IDK_Basic);
5521 CompleteDecl(ToEnum);
5523 } else if (ObjCInterfaceDecl *ToClass = dyn_cast<ObjCInterfaceDecl>(ToDC)) {
5524 ObjCInterfaceDecl *FromClass = cast<ObjCInterfaceDecl>(FromDC);
5525 if (ToClass->getDefinition()) {
5527 } else if (ObjCInterfaceDecl *FromDef = FromClass->getDefinition()) {
5528 ASTNodeImporter(*this).ImportDefinition(FromDef, ToClass,
5529 ASTNodeImporter::IDK_Basic);
5531 CompleteDecl(ToClass);
5533 } else if (ObjCProtocolDecl *ToProto = dyn_cast<ObjCProtocolDecl>(ToDC)) {
5534 ObjCProtocolDecl *FromProto = cast<ObjCProtocolDecl>(FromDC);
5535 if (ToProto->getDefinition()) {
5537 } else if (ObjCProtocolDecl *FromDef = FromProto->getDefinition()) {
5538 ASTNodeImporter(*this).ImportDefinition(FromDef, ToProto,
5539 ASTNodeImporter::IDK_Basic);
5541 CompleteDecl(ToProto);
5548 Expr *ASTImporter::Import(Expr *FromE) {
5552 return cast_or_null<Expr>(Import(cast<Stmt>(FromE)));
5555 Stmt *ASTImporter::Import(Stmt *FromS) {
5559 // Check whether we've already imported this declaration.
5560 llvm::DenseMap<Stmt *, Stmt *>::iterator Pos = ImportedStmts.find(FromS);
5561 if (Pos != ImportedStmts.end())
5565 ASTNodeImporter Importer(*this);
5566 Stmt *ToS = Importer.Visit(FromS);
5570 // Record the imported declaration.
5571 ImportedStmts[FromS] = ToS;
5575 NestedNameSpecifier *ASTImporter::Import(NestedNameSpecifier *FromNNS) {
5579 NestedNameSpecifier *prefix = Import(FromNNS->getPrefix());
5581 switch (FromNNS->getKind()) {
5582 case NestedNameSpecifier::Identifier:
5583 if (IdentifierInfo *II = Import(FromNNS->getAsIdentifier())) {
5584 return NestedNameSpecifier::Create(ToContext, prefix, II);
5588 case NestedNameSpecifier::Namespace:
5589 if (NamespaceDecl *NS =
5590 cast<NamespaceDecl>(Import(FromNNS->getAsNamespace()))) {
5591 return NestedNameSpecifier::Create(ToContext, prefix, NS);
5595 case NestedNameSpecifier::NamespaceAlias:
5596 if (NamespaceAliasDecl *NSAD =
5597 cast<NamespaceAliasDecl>(Import(FromNNS->getAsNamespaceAlias()))) {
5598 return NestedNameSpecifier::Create(ToContext, prefix, NSAD);
5602 case NestedNameSpecifier::Global:
5603 return NestedNameSpecifier::GlobalSpecifier(ToContext);
5605 case NestedNameSpecifier::Super:
5606 if (CXXRecordDecl *RD =
5607 cast<CXXRecordDecl>(Import(FromNNS->getAsRecordDecl()))) {
5608 return NestedNameSpecifier::SuperSpecifier(ToContext, RD);
5612 case NestedNameSpecifier::TypeSpec:
5613 case NestedNameSpecifier::TypeSpecWithTemplate: {
5614 QualType T = Import(QualType(FromNNS->getAsType(), 0u));
5616 bool bTemplate = FromNNS->getKind() ==
5617 NestedNameSpecifier::TypeSpecWithTemplate;
5618 return NestedNameSpecifier::Create(ToContext, prefix,
5619 bTemplate, T.getTypePtr());
5625 llvm_unreachable("Invalid nested name specifier kind");
5628 NestedNameSpecifierLoc ASTImporter::Import(NestedNameSpecifierLoc FromNNS) {
5629 // FIXME: Implement!
5630 return NestedNameSpecifierLoc();
5633 TemplateName ASTImporter::Import(TemplateName From) {
5634 switch (From.getKind()) {
5635 case TemplateName::Template:
5636 if (TemplateDecl *ToTemplate
5637 = cast_or_null<TemplateDecl>(Import(From.getAsTemplateDecl())))
5638 return TemplateName(ToTemplate);
5640 return TemplateName();
5642 case TemplateName::OverloadedTemplate: {
5643 OverloadedTemplateStorage *FromStorage = From.getAsOverloadedTemplate();
5644 UnresolvedSet<2> ToTemplates;
5645 for (OverloadedTemplateStorage::iterator I = FromStorage->begin(),
5646 E = FromStorage->end();
5648 if (NamedDecl *To = cast_or_null<NamedDecl>(Import(*I)))
5649 ToTemplates.addDecl(To);
5651 return TemplateName();
5653 return ToContext.getOverloadedTemplateName(ToTemplates.begin(),
5657 case TemplateName::QualifiedTemplate: {
5658 QualifiedTemplateName *QTN = From.getAsQualifiedTemplateName();
5659 NestedNameSpecifier *Qualifier = Import(QTN->getQualifier());
5661 return TemplateName();
5663 if (TemplateDecl *ToTemplate
5664 = cast_or_null<TemplateDecl>(Import(From.getAsTemplateDecl())))
5665 return ToContext.getQualifiedTemplateName(Qualifier,
5666 QTN->hasTemplateKeyword(),
5669 return TemplateName();
5672 case TemplateName::DependentTemplate: {
5673 DependentTemplateName *DTN = From.getAsDependentTemplateName();
5674 NestedNameSpecifier *Qualifier = Import(DTN->getQualifier());
5676 return TemplateName();
5678 if (DTN->isIdentifier()) {
5679 return ToContext.getDependentTemplateName(Qualifier,
5680 Import(DTN->getIdentifier()));
5683 return ToContext.getDependentTemplateName(Qualifier, DTN->getOperator());
5686 case TemplateName::SubstTemplateTemplateParm: {
5687 SubstTemplateTemplateParmStorage *subst
5688 = From.getAsSubstTemplateTemplateParm();
5689 TemplateTemplateParmDecl *param
5690 = cast_or_null<TemplateTemplateParmDecl>(Import(subst->getParameter()));
5692 return TemplateName();
5694 TemplateName replacement = Import(subst->getReplacement());
5695 if (replacement.isNull()) return TemplateName();
5697 return ToContext.getSubstTemplateTemplateParm(param, replacement);
5700 case TemplateName::SubstTemplateTemplateParmPack: {
5701 SubstTemplateTemplateParmPackStorage *SubstPack
5702 = From.getAsSubstTemplateTemplateParmPack();
5703 TemplateTemplateParmDecl *Param
5704 = cast_or_null<TemplateTemplateParmDecl>(
5705 Import(SubstPack->getParameterPack()));
5707 return TemplateName();
5709 ASTNodeImporter Importer(*this);
5710 TemplateArgument ArgPack
5711 = Importer.ImportTemplateArgument(SubstPack->getArgumentPack());
5712 if (ArgPack.isNull())
5713 return TemplateName();
5715 return ToContext.getSubstTemplateTemplateParmPack(Param, ArgPack);
5719 llvm_unreachable("Invalid template name kind");
5722 SourceLocation ASTImporter::Import(SourceLocation FromLoc) {
5723 if (FromLoc.isInvalid())
5724 return SourceLocation();
5726 SourceManager &FromSM = FromContext.getSourceManager();
5728 // For now, map everything down to its spelling location, so that we
5729 // don't have to import macro expansions.
5730 // FIXME: Import macro expansions!
5731 FromLoc = FromSM.getSpellingLoc(FromLoc);
5732 std::pair<FileID, unsigned> Decomposed = FromSM.getDecomposedLoc(FromLoc);
5733 SourceManager &ToSM = ToContext.getSourceManager();
5734 FileID ToFileID = Import(Decomposed.first);
5735 if (ToFileID.isInvalid())
5736 return SourceLocation();
5737 SourceLocation ret = ToSM.getLocForStartOfFile(ToFileID)
5738 .getLocWithOffset(Decomposed.second);
5742 SourceRange ASTImporter::Import(SourceRange FromRange) {
5743 return SourceRange(Import(FromRange.getBegin()), Import(FromRange.getEnd()));
5746 FileID ASTImporter::Import(FileID FromID) {
5747 llvm::DenseMap<FileID, FileID>::iterator Pos
5748 = ImportedFileIDs.find(FromID);
5749 if (Pos != ImportedFileIDs.end())
5752 SourceManager &FromSM = FromContext.getSourceManager();
5753 SourceManager &ToSM = ToContext.getSourceManager();
5754 const SrcMgr::SLocEntry &FromSLoc = FromSM.getSLocEntry(FromID);
5755 assert(FromSLoc.isFile() && "Cannot handle macro expansions yet");
5757 // Include location of this file.
5758 SourceLocation ToIncludeLoc = Import(FromSLoc.getFile().getIncludeLoc());
5760 // Map the FileID for to the "to" source manager.
5762 const SrcMgr::ContentCache *Cache = FromSLoc.getFile().getContentCache();
5763 if (Cache->OrigEntry && Cache->OrigEntry->getDir()) {
5764 // FIXME: We probably want to use getVirtualFile(), so we don't hit the
5766 // FIXME: We definitely want to re-use the existing MemoryBuffer, rather
5767 // than mmap the files several times.
5768 const FileEntry *Entry = ToFileManager.getFile(Cache->OrigEntry->getName());
5771 ToID = ToSM.createFileID(Entry, ToIncludeLoc,
5772 FromSLoc.getFile().getFileCharacteristic());
5774 // FIXME: We want to re-use the existing MemoryBuffer!
5775 const llvm::MemoryBuffer *
5776 FromBuf = Cache->getBuffer(FromContext.getDiagnostics(), FromSM);
5777 std::unique_ptr<llvm::MemoryBuffer> ToBuf
5778 = llvm::MemoryBuffer::getMemBufferCopy(FromBuf->getBuffer(),
5779 FromBuf->getBufferIdentifier());
5780 ToID = ToSM.createFileID(std::move(ToBuf),
5781 FromSLoc.getFile().getFileCharacteristic());
5785 ImportedFileIDs[FromID] = ToID;
5789 void ASTImporter::ImportDefinition(Decl *From) {
5790 Decl *To = Import(From);
5794 if (DeclContext *FromDC = cast<DeclContext>(From)) {
5795 ASTNodeImporter Importer(*this);
5797 if (RecordDecl *ToRecord = dyn_cast<RecordDecl>(To)) {
5798 if (!ToRecord->getDefinition()) {
5799 Importer.ImportDefinition(cast<RecordDecl>(FromDC), ToRecord,
5800 ASTNodeImporter::IDK_Everything);
5805 if (EnumDecl *ToEnum = dyn_cast<EnumDecl>(To)) {
5806 if (!ToEnum->getDefinition()) {
5807 Importer.ImportDefinition(cast<EnumDecl>(FromDC), ToEnum,
5808 ASTNodeImporter::IDK_Everything);
5813 if (ObjCInterfaceDecl *ToIFace = dyn_cast<ObjCInterfaceDecl>(To)) {
5814 if (!ToIFace->getDefinition()) {
5815 Importer.ImportDefinition(cast<ObjCInterfaceDecl>(FromDC), ToIFace,
5816 ASTNodeImporter::IDK_Everything);
5821 if (ObjCProtocolDecl *ToProto = dyn_cast<ObjCProtocolDecl>(To)) {
5822 if (!ToProto->getDefinition()) {
5823 Importer.ImportDefinition(cast<ObjCProtocolDecl>(FromDC), ToProto,
5824 ASTNodeImporter::IDK_Everything);
5829 Importer.ImportDeclContext(FromDC, true);
5833 DeclarationName ASTImporter::Import(DeclarationName FromName) {
5835 return DeclarationName();
5837 switch (FromName.getNameKind()) {
5838 case DeclarationName::Identifier:
5839 return Import(FromName.getAsIdentifierInfo());
5841 case DeclarationName::ObjCZeroArgSelector:
5842 case DeclarationName::ObjCOneArgSelector:
5843 case DeclarationName::ObjCMultiArgSelector:
5844 return Import(FromName.getObjCSelector());
5846 case DeclarationName::CXXConstructorName: {
5847 QualType T = Import(FromName.getCXXNameType());
5849 return DeclarationName();
5851 return ToContext.DeclarationNames.getCXXConstructorName(
5852 ToContext.getCanonicalType(T));
5855 case DeclarationName::CXXDestructorName: {
5856 QualType T = Import(FromName.getCXXNameType());
5858 return DeclarationName();
5860 return ToContext.DeclarationNames.getCXXDestructorName(
5861 ToContext.getCanonicalType(T));
5864 case DeclarationName::CXXConversionFunctionName: {
5865 QualType T = Import(FromName.getCXXNameType());
5867 return DeclarationName();
5869 return ToContext.DeclarationNames.getCXXConversionFunctionName(
5870 ToContext.getCanonicalType(T));
5873 case DeclarationName::CXXOperatorName:
5874 return ToContext.DeclarationNames.getCXXOperatorName(
5875 FromName.getCXXOverloadedOperator());
5877 case DeclarationName::CXXLiteralOperatorName:
5878 return ToContext.DeclarationNames.getCXXLiteralOperatorName(
5879 Import(FromName.getCXXLiteralIdentifier()));
5881 case DeclarationName::CXXUsingDirective:
5883 return DeclarationName::getUsingDirectiveName();
5886 llvm_unreachable("Invalid DeclarationName Kind!");
5889 IdentifierInfo *ASTImporter::Import(const IdentifierInfo *FromId) {
5893 return &ToContext.Idents.get(FromId->getName());
5896 Selector ASTImporter::Import(Selector FromSel) {
5897 if (FromSel.isNull())
5900 SmallVector<IdentifierInfo *, 4> Idents;
5901 Idents.push_back(Import(FromSel.getIdentifierInfoForSlot(0)));
5902 for (unsigned I = 1, N = FromSel.getNumArgs(); I < N; ++I)
5903 Idents.push_back(Import(FromSel.getIdentifierInfoForSlot(I)));
5904 return ToContext.Selectors.getSelector(FromSel.getNumArgs(), Idents.data());
5907 DeclarationName ASTImporter::HandleNameConflict(DeclarationName Name,
5911 unsigned NumDecls) {
5915 DiagnosticBuilder ASTImporter::ToDiag(SourceLocation Loc, unsigned DiagID) {
5916 if (LastDiagFromFrom)
5917 ToContext.getDiagnostics().notePriorDiagnosticFrom(
5918 FromContext.getDiagnostics());
5919 LastDiagFromFrom = false;
5920 return ToContext.getDiagnostics().Report(Loc, DiagID);
5923 DiagnosticBuilder ASTImporter::FromDiag(SourceLocation Loc, unsigned DiagID) {
5924 if (!LastDiagFromFrom)
5925 FromContext.getDiagnostics().notePriorDiagnosticFrom(
5926 ToContext.getDiagnostics());
5927 LastDiagFromFrom = true;
5928 return FromContext.getDiagnostics().Report(Loc, DiagID);
5931 void ASTImporter::CompleteDecl (Decl *D) {
5932 if (ObjCInterfaceDecl *ID = dyn_cast<ObjCInterfaceDecl>(D)) {
5933 if (!ID->getDefinition())
5934 ID->startDefinition();
5936 else if (ObjCProtocolDecl *PD = dyn_cast<ObjCProtocolDecl>(D)) {
5937 if (!PD->getDefinition())
5938 PD->startDefinition();
5940 else if (TagDecl *TD = dyn_cast<TagDecl>(D)) {
5941 if (!TD->getDefinition() && !TD->isBeingDefined()) {
5942 TD->startDefinition();
5943 TD->setCompleteDefinition(true);
5947 assert (0 && "CompleteDecl called on a Decl that can't be completed");
5951 Decl *ASTImporter::Imported(Decl *From, Decl *To) {
5952 ImportedDecls[From] = To;
5956 bool ASTImporter::IsStructurallyEquivalent(QualType From, QualType To,
5958 llvm::DenseMap<const Type *, const Type *>::iterator Pos
5959 = ImportedTypes.find(From.getTypePtr());
5960 if (Pos != ImportedTypes.end() && ToContext.hasSameType(Import(From), To))
5963 StructuralEquivalenceContext Ctx(FromContext, ToContext, NonEquivalentDecls,
5965 return Ctx.IsStructurallyEquivalent(From, To);