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 (ToField->hasInClassInitializer())
3042 ToField->setInClassInitializer(D->getInClassInitializer());
3043 ToField->setImplicit(D->isImplicit());
3044 Importer.Imported(D, ToField);
3045 LexicalDC->addDeclInternal(ToField);
3049 Decl *ASTNodeImporter::VisitIndirectFieldDecl(IndirectFieldDecl *D) {
3050 // Import the major distinguishing characteristics of a variable.
3051 DeclContext *DC, *LexicalDC;
3052 DeclarationName Name;
3055 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
3060 // Determine whether we've already imported this field.
3061 SmallVector<NamedDecl *, 2> FoundDecls;
3062 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls);
3063 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
3064 if (IndirectFieldDecl *FoundField
3065 = dyn_cast<IndirectFieldDecl>(FoundDecls[I])) {
3066 // For anonymous indirect fields, match up by index.
3067 if (!Name && getFieldIndex(D) != getFieldIndex(FoundField))
3070 if (Importer.IsStructurallyEquivalent(D->getType(),
3071 FoundField->getType(),
3073 Importer.Imported(D, FoundField);
3077 // If there are more anonymous fields to check, continue.
3078 if (!Name && I < N-1)
3081 Importer.ToDiag(Loc, diag::err_odr_field_type_inconsistent)
3082 << Name << D->getType() << FoundField->getType();
3083 Importer.ToDiag(FoundField->getLocation(), diag::note_odr_value_here)
3084 << FoundField->getType();
3090 QualType T = Importer.Import(D->getType());
3094 NamedDecl **NamedChain =
3095 new (Importer.getToContext())NamedDecl*[D->getChainingSize()];
3098 for (auto *PI : D->chain()) {
3099 Decl *D = Importer.Import(PI);
3102 NamedChain[i++] = cast<NamedDecl>(D);
3105 IndirectFieldDecl *ToIndirectField = IndirectFieldDecl::Create(
3106 Importer.getToContext(), DC, Loc, Name.getAsIdentifierInfo(), T,
3107 NamedChain, D->getChainingSize());
3109 for (const auto *Attr : D->attrs())
3110 ToIndirectField->addAttr(Attr->clone(Importer.getToContext()));
3112 ToIndirectField->setAccess(D->getAccess());
3113 ToIndirectField->setLexicalDeclContext(LexicalDC);
3114 Importer.Imported(D, ToIndirectField);
3115 LexicalDC->addDeclInternal(ToIndirectField);
3116 return ToIndirectField;
3119 Decl *ASTNodeImporter::VisitObjCIvarDecl(ObjCIvarDecl *D) {
3120 // Import the major distinguishing characteristics of an ivar.
3121 DeclContext *DC, *LexicalDC;
3122 DeclarationName Name;
3125 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
3130 // Determine whether we've already imported this ivar
3131 SmallVector<NamedDecl *, 2> FoundDecls;
3132 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls);
3133 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
3134 if (ObjCIvarDecl *FoundIvar = dyn_cast<ObjCIvarDecl>(FoundDecls[I])) {
3135 if (Importer.IsStructurallyEquivalent(D->getType(),
3136 FoundIvar->getType())) {
3137 Importer.Imported(D, FoundIvar);
3141 Importer.ToDiag(Loc, diag::err_odr_ivar_type_inconsistent)
3142 << Name << D->getType() << FoundIvar->getType();
3143 Importer.ToDiag(FoundIvar->getLocation(), diag::note_odr_value_here)
3144 << FoundIvar->getType();
3150 QualType T = Importer.Import(D->getType());
3154 TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo());
3155 Expr *BitWidth = Importer.Import(D->getBitWidth());
3156 if (!BitWidth && D->getBitWidth())
3159 ObjCIvarDecl *ToIvar = ObjCIvarDecl::Create(Importer.getToContext(),
3160 cast<ObjCContainerDecl>(DC),
3161 Importer.Import(D->getInnerLocStart()),
3162 Loc, Name.getAsIdentifierInfo(),
3163 T, TInfo, D->getAccessControl(),
3164 BitWidth, D->getSynthesize());
3165 ToIvar->setLexicalDeclContext(LexicalDC);
3166 Importer.Imported(D, ToIvar);
3167 LexicalDC->addDeclInternal(ToIvar);
3172 Decl *ASTNodeImporter::VisitVarDecl(VarDecl *D) {
3173 // Import the major distinguishing characteristics of a variable.
3174 DeclContext *DC, *LexicalDC;
3175 DeclarationName Name;
3178 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
3183 // Try to find a variable in our own ("to") context with the same name and
3184 // in the same context as the variable we're importing.
3185 if (D->isFileVarDecl()) {
3186 VarDecl *MergeWithVar = nullptr;
3187 SmallVector<NamedDecl *, 4> ConflictingDecls;
3188 unsigned IDNS = Decl::IDNS_Ordinary;
3189 SmallVector<NamedDecl *, 2> FoundDecls;
3190 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls);
3191 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
3192 if (!FoundDecls[I]->isInIdentifierNamespace(IDNS))
3195 if (VarDecl *FoundVar = dyn_cast<VarDecl>(FoundDecls[I])) {
3196 // We have found a variable that we may need to merge with. Check it.
3197 if (FoundVar->hasExternalFormalLinkage() &&
3198 D->hasExternalFormalLinkage()) {
3199 if (Importer.IsStructurallyEquivalent(D->getType(),
3200 FoundVar->getType())) {
3201 MergeWithVar = FoundVar;
3205 const ArrayType *FoundArray
3206 = Importer.getToContext().getAsArrayType(FoundVar->getType());
3207 const ArrayType *TArray
3208 = Importer.getToContext().getAsArrayType(D->getType());
3209 if (FoundArray && TArray) {
3210 if (isa<IncompleteArrayType>(FoundArray) &&
3211 isa<ConstantArrayType>(TArray)) {
3213 QualType T = Importer.Import(D->getType());
3217 FoundVar->setType(T);
3218 MergeWithVar = FoundVar;
3220 } else if (isa<IncompleteArrayType>(TArray) &&
3221 isa<ConstantArrayType>(FoundArray)) {
3222 MergeWithVar = FoundVar;
3227 Importer.ToDiag(Loc, diag::err_odr_variable_type_inconsistent)
3228 << Name << D->getType() << FoundVar->getType();
3229 Importer.ToDiag(FoundVar->getLocation(), diag::note_odr_value_here)
3230 << FoundVar->getType();
3234 ConflictingDecls.push_back(FoundDecls[I]);
3238 // An equivalent variable with external linkage has been found. Link
3239 // the two declarations, then merge them.
3240 Importer.Imported(D, MergeWithVar);
3242 if (VarDecl *DDef = D->getDefinition()) {
3243 if (VarDecl *ExistingDef = MergeWithVar->getDefinition()) {
3244 Importer.ToDiag(ExistingDef->getLocation(),
3245 diag::err_odr_variable_multiple_def)
3247 Importer.FromDiag(DDef->getLocation(), diag::note_odr_defined_here);
3249 Expr *Init = Importer.Import(DDef->getInit());
3250 MergeWithVar->setInit(Init);
3251 if (DDef->isInitKnownICE()) {
3252 EvaluatedStmt *Eval = MergeWithVar->ensureEvaluatedStmt();
3253 Eval->CheckedICE = true;
3254 Eval->IsICE = DDef->isInitICE();
3259 return MergeWithVar;
3262 if (!ConflictingDecls.empty()) {
3263 Name = Importer.HandleNameConflict(Name, DC, IDNS,
3264 ConflictingDecls.data(),
3265 ConflictingDecls.size());
3272 QualType T = Importer.Import(D->getType());
3276 // Create the imported variable.
3277 TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo());
3278 VarDecl *ToVar = VarDecl::Create(Importer.getToContext(), DC,
3279 Importer.Import(D->getInnerLocStart()),
3280 Loc, Name.getAsIdentifierInfo(),
3282 D->getStorageClass());
3283 ToVar->setQualifierInfo(Importer.Import(D->getQualifierLoc()));
3284 ToVar->setAccess(D->getAccess());
3285 ToVar->setLexicalDeclContext(LexicalDC);
3286 Importer.Imported(D, ToVar);
3287 LexicalDC->addDeclInternal(ToVar);
3289 if (!D->isFileVarDecl() &&
3293 // Merge the initializer.
3294 if (ImportDefinition(D, ToVar))
3300 Decl *ASTNodeImporter::VisitImplicitParamDecl(ImplicitParamDecl *D) {
3301 // Parameters are created in the translation unit's context, then moved
3302 // into the function declaration's context afterward.
3303 DeclContext *DC = Importer.getToContext().getTranslationUnitDecl();
3305 // Import the name of this declaration.
3306 DeclarationName Name = Importer.Import(D->getDeclName());
3307 if (D->getDeclName() && !Name)
3310 // Import the location of this declaration.
3311 SourceLocation Loc = Importer.Import(D->getLocation());
3313 // Import the parameter's type.
3314 QualType T = Importer.Import(D->getType());
3318 // Create the imported parameter.
3319 ImplicitParamDecl *ToParm
3320 = ImplicitParamDecl::Create(Importer.getToContext(), DC,
3321 Loc, Name.getAsIdentifierInfo(),
3323 return Importer.Imported(D, ToParm);
3326 Decl *ASTNodeImporter::VisitParmVarDecl(ParmVarDecl *D) {
3327 // Parameters are created in the translation unit's context, then moved
3328 // into the function declaration's context afterward.
3329 DeclContext *DC = Importer.getToContext().getTranslationUnitDecl();
3331 // Import the name of this declaration.
3332 DeclarationName Name = Importer.Import(D->getDeclName());
3333 if (D->getDeclName() && !Name)
3336 // Import the location of this declaration.
3337 SourceLocation Loc = Importer.Import(D->getLocation());
3339 // Import the parameter's type.
3340 QualType T = Importer.Import(D->getType());
3344 // Create the imported parameter.
3345 TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo());
3346 ParmVarDecl *ToParm = ParmVarDecl::Create(Importer.getToContext(), DC,
3347 Importer.Import(D->getInnerLocStart()),
3348 Loc, Name.getAsIdentifierInfo(),
3349 T, TInfo, D->getStorageClass(),
3350 /*FIXME: Default argument*/nullptr);
3351 ToParm->setHasInheritedDefaultArg(D->hasInheritedDefaultArg());
3354 ToParm->setIsUsed();
3356 return Importer.Imported(D, ToParm);
3359 Decl *ASTNodeImporter::VisitObjCMethodDecl(ObjCMethodDecl *D) {
3360 // Import the major distinguishing characteristics of a method.
3361 DeclContext *DC, *LexicalDC;
3362 DeclarationName Name;
3365 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
3370 SmallVector<NamedDecl *, 2> FoundDecls;
3371 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls);
3372 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
3373 if (ObjCMethodDecl *FoundMethod = dyn_cast<ObjCMethodDecl>(FoundDecls[I])) {
3374 if (FoundMethod->isInstanceMethod() != D->isInstanceMethod())
3377 // Check return types.
3378 if (!Importer.IsStructurallyEquivalent(D->getReturnType(),
3379 FoundMethod->getReturnType())) {
3380 Importer.ToDiag(Loc, diag::err_odr_objc_method_result_type_inconsistent)
3381 << D->isInstanceMethod() << Name << D->getReturnType()
3382 << FoundMethod->getReturnType();
3383 Importer.ToDiag(FoundMethod->getLocation(),
3384 diag::note_odr_objc_method_here)
3385 << D->isInstanceMethod() << Name;
3389 // Check the number of parameters.
3390 if (D->param_size() != FoundMethod->param_size()) {
3391 Importer.ToDiag(Loc, diag::err_odr_objc_method_num_params_inconsistent)
3392 << D->isInstanceMethod() << Name
3393 << D->param_size() << FoundMethod->param_size();
3394 Importer.ToDiag(FoundMethod->getLocation(),
3395 diag::note_odr_objc_method_here)
3396 << D->isInstanceMethod() << Name;
3400 // Check parameter types.
3401 for (ObjCMethodDecl::param_iterator P = D->param_begin(),
3402 PEnd = D->param_end(), FoundP = FoundMethod->param_begin();
3403 P != PEnd; ++P, ++FoundP) {
3404 if (!Importer.IsStructurallyEquivalent((*P)->getType(),
3405 (*FoundP)->getType())) {
3406 Importer.FromDiag((*P)->getLocation(),
3407 diag::err_odr_objc_method_param_type_inconsistent)
3408 << D->isInstanceMethod() << Name
3409 << (*P)->getType() << (*FoundP)->getType();
3410 Importer.ToDiag((*FoundP)->getLocation(), diag::note_odr_value_here)
3411 << (*FoundP)->getType();
3416 // Check variadic/non-variadic.
3417 // Check the number of parameters.
3418 if (D->isVariadic() != FoundMethod->isVariadic()) {
3419 Importer.ToDiag(Loc, diag::err_odr_objc_method_variadic_inconsistent)
3420 << D->isInstanceMethod() << Name;
3421 Importer.ToDiag(FoundMethod->getLocation(),
3422 diag::note_odr_objc_method_here)
3423 << D->isInstanceMethod() << Name;
3427 // FIXME: Any other bits we need to merge?
3428 return Importer.Imported(D, FoundMethod);
3432 // Import the result type.
3433 QualType ResultTy = Importer.Import(D->getReturnType());
3434 if (ResultTy.isNull())
3437 TypeSourceInfo *ReturnTInfo = Importer.Import(D->getReturnTypeSourceInfo());
3439 ObjCMethodDecl *ToMethod = ObjCMethodDecl::Create(
3440 Importer.getToContext(), Loc, Importer.Import(D->getLocEnd()),
3441 Name.getObjCSelector(), ResultTy, ReturnTInfo, DC, D->isInstanceMethod(),
3442 D->isVariadic(), D->isPropertyAccessor(), D->isImplicit(), D->isDefined(),
3443 D->getImplementationControl(), D->hasRelatedResultType());
3445 // FIXME: When we decide to merge method definitions, we'll need to
3446 // deal with implicit parameters.
3448 // Import the parameters
3449 SmallVector<ParmVarDecl *, 5> ToParams;
3450 for (auto *FromP : D->params()) {
3451 ParmVarDecl *ToP = cast_or_null<ParmVarDecl>(Importer.Import(FromP));
3455 ToParams.push_back(ToP);
3458 // Set the parameters.
3459 for (unsigned I = 0, N = ToParams.size(); I != N; ++I) {
3460 ToParams[I]->setOwningFunction(ToMethod);
3461 ToMethod->addDeclInternal(ToParams[I]);
3463 SmallVector<SourceLocation, 12> SelLocs;
3464 D->getSelectorLocs(SelLocs);
3465 ToMethod->setMethodParams(Importer.getToContext(), ToParams, SelLocs);
3467 ToMethod->setLexicalDeclContext(LexicalDC);
3468 Importer.Imported(D, ToMethod);
3469 LexicalDC->addDeclInternal(ToMethod);
3473 Decl *ASTNodeImporter::VisitObjCTypeParamDecl(ObjCTypeParamDecl *D) {
3474 // Import the major distinguishing characteristics of a category.
3475 DeclContext *DC, *LexicalDC;
3476 DeclarationName Name;
3479 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
3484 TypeSourceInfo *BoundInfo = Importer.Import(D->getTypeSourceInfo());
3488 ObjCTypeParamDecl *Result = ObjCTypeParamDecl::Create(
3489 Importer.getToContext(), DC,
3491 Importer.Import(D->getVarianceLoc()),
3493 Importer.Import(D->getLocation()),
3494 Name.getAsIdentifierInfo(),
3495 Importer.Import(D->getColonLoc()),
3497 Importer.Imported(D, Result);
3498 Result->setLexicalDeclContext(LexicalDC);
3502 Decl *ASTNodeImporter::VisitObjCCategoryDecl(ObjCCategoryDecl *D) {
3503 // Import the major distinguishing characteristics of a category.
3504 DeclContext *DC, *LexicalDC;
3505 DeclarationName Name;
3508 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
3513 ObjCInterfaceDecl *ToInterface
3514 = cast_or_null<ObjCInterfaceDecl>(Importer.Import(D->getClassInterface()));
3518 // Determine if we've already encountered this category.
3519 ObjCCategoryDecl *MergeWithCategory
3520 = ToInterface->FindCategoryDeclaration(Name.getAsIdentifierInfo());
3521 ObjCCategoryDecl *ToCategory = MergeWithCategory;
3523 ToCategory = ObjCCategoryDecl::Create(Importer.getToContext(), DC,
3524 Importer.Import(D->getAtStartLoc()),
3526 Importer.Import(D->getCategoryNameLoc()),
3527 Name.getAsIdentifierInfo(),
3529 /*TypeParamList=*/nullptr,
3530 Importer.Import(D->getIvarLBraceLoc()),
3531 Importer.Import(D->getIvarRBraceLoc()));
3532 ToCategory->setLexicalDeclContext(LexicalDC);
3533 LexicalDC->addDeclInternal(ToCategory);
3534 Importer.Imported(D, ToCategory);
3535 // Import the type parameter list after calling Imported, to avoid
3536 // loops when bringing in their DeclContext.
3537 ToCategory->setTypeParamList(ImportObjCTypeParamList(
3538 D->getTypeParamList()));
3541 SmallVector<ObjCProtocolDecl *, 4> Protocols;
3542 SmallVector<SourceLocation, 4> ProtocolLocs;
3543 ObjCCategoryDecl::protocol_loc_iterator FromProtoLoc
3544 = D->protocol_loc_begin();
3545 for (ObjCCategoryDecl::protocol_iterator FromProto = D->protocol_begin(),
3546 FromProtoEnd = D->protocol_end();
3547 FromProto != FromProtoEnd;
3548 ++FromProto, ++FromProtoLoc) {
3549 ObjCProtocolDecl *ToProto
3550 = cast_or_null<ObjCProtocolDecl>(Importer.Import(*FromProto));
3553 Protocols.push_back(ToProto);
3554 ProtocolLocs.push_back(Importer.Import(*FromProtoLoc));
3557 // FIXME: If we're merging, make sure that the protocol list is the same.
3558 ToCategory->setProtocolList(Protocols.data(), Protocols.size(),
3559 ProtocolLocs.data(), Importer.getToContext());
3562 Importer.Imported(D, ToCategory);
3565 // Import all of the members of this category.
3566 ImportDeclContext(D);
3568 // If we have an implementation, import it as well.
3569 if (D->getImplementation()) {
3570 ObjCCategoryImplDecl *Impl
3571 = cast_or_null<ObjCCategoryImplDecl>(
3572 Importer.Import(D->getImplementation()));
3576 ToCategory->setImplementation(Impl);
3582 bool ASTNodeImporter::ImportDefinition(ObjCProtocolDecl *From,
3583 ObjCProtocolDecl *To,
3584 ImportDefinitionKind Kind) {
3585 if (To->getDefinition()) {
3586 if (shouldForceImportDeclContext(Kind))
3587 ImportDeclContext(From);
3591 // Start the protocol definition
3592 To->startDefinition();
3595 SmallVector<ObjCProtocolDecl *, 4> Protocols;
3596 SmallVector<SourceLocation, 4> ProtocolLocs;
3597 ObjCProtocolDecl::protocol_loc_iterator
3598 FromProtoLoc = From->protocol_loc_begin();
3599 for (ObjCProtocolDecl::protocol_iterator FromProto = From->protocol_begin(),
3600 FromProtoEnd = From->protocol_end();
3601 FromProto != FromProtoEnd;
3602 ++FromProto, ++FromProtoLoc) {
3603 ObjCProtocolDecl *ToProto
3604 = cast_or_null<ObjCProtocolDecl>(Importer.Import(*FromProto));
3607 Protocols.push_back(ToProto);
3608 ProtocolLocs.push_back(Importer.Import(*FromProtoLoc));
3611 // FIXME: If we're merging, make sure that the protocol list is the same.
3612 To->setProtocolList(Protocols.data(), Protocols.size(),
3613 ProtocolLocs.data(), Importer.getToContext());
3615 if (shouldForceImportDeclContext(Kind)) {
3616 // Import all of the members of this protocol.
3617 ImportDeclContext(From, /*ForceImport=*/true);
3622 Decl *ASTNodeImporter::VisitObjCProtocolDecl(ObjCProtocolDecl *D) {
3623 // If this protocol has a definition in the translation unit we're coming
3624 // from, but this particular declaration is not that definition, import the
3625 // definition and map to that.
3626 ObjCProtocolDecl *Definition = D->getDefinition();
3627 if (Definition && Definition != D) {
3628 Decl *ImportedDef = Importer.Import(Definition);
3632 return Importer.Imported(D, ImportedDef);
3635 // Import the major distinguishing characteristics of a protocol.
3636 DeclContext *DC, *LexicalDC;
3637 DeclarationName Name;
3640 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
3645 ObjCProtocolDecl *MergeWithProtocol = nullptr;
3646 SmallVector<NamedDecl *, 2> FoundDecls;
3647 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls);
3648 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
3649 if (!FoundDecls[I]->isInIdentifierNamespace(Decl::IDNS_ObjCProtocol))
3652 if ((MergeWithProtocol = dyn_cast<ObjCProtocolDecl>(FoundDecls[I])))
3656 ObjCProtocolDecl *ToProto = MergeWithProtocol;
3658 ToProto = ObjCProtocolDecl::Create(Importer.getToContext(), DC,
3659 Name.getAsIdentifierInfo(), Loc,
3660 Importer.Import(D->getAtStartLoc()),
3661 /*PrevDecl=*/nullptr);
3662 ToProto->setLexicalDeclContext(LexicalDC);
3663 LexicalDC->addDeclInternal(ToProto);
3666 Importer.Imported(D, ToProto);
3668 if (D->isThisDeclarationADefinition() && ImportDefinition(D, ToProto))
3674 Decl *ASTNodeImporter::VisitLinkageSpecDecl(LinkageSpecDecl *D) {
3675 DeclContext *DC = Importer.ImportContext(D->getDeclContext());
3676 DeclContext *LexicalDC = Importer.ImportContext(D->getLexicalDeclContext());
3678 SourceLocation ExternLoc = Importer.Import(D->getExternLoc());
3679 SourceLocation LangLoc = Importer.Import(D->getLocation());
3681 bool HasBraces = D->hasBraces();
3683 LinkageSpecDecl *ToLinkageSpec =
3684 LinkageSpecDecl::Create(Importer.getToContext(),
3692 SourceLocation RBraceLoc = Importer.Import(D->getRBraceLoc());
3693 ToLinkageSpec->setRBraceLoc(RBraceLoc);
3696 ToLinkageSpec->setLexicalDeclContext(LexicalDC);
3697 LexicalDC->addDeclInternal(ToLinkageSpec);
3699 Importer.Imported(D, ToLinkageSpec);
3701 return ToLinkageSpec;
3704 bool ASTNodeImporter::ImportDefinition(ObjCInterfaceDecl *From,
3705 ObjCInterfaceDecl *To,
3706 ImportDefinitionKind Kind) {
3707 if (To->getDefinition()) {
3708 // Check consistency of superclass.
3709 ObjCInterfaceDecl *FromSuper = From->getSuperClass();
3711 FromSuper = cast_or_null<ObjCInterfaceDecl>(Importer.Import(FromSuper));
3716 ObjCInterfaceDecl *ToSuper = To->getSuperClass();
3717 if ((bool)FromSuper != (bool)ToSuper ||
3718 (FromSuper && !declaresSameEntity(FromSuper, ToSuper))) {
3719 Importer.ToDiag(To->getLocation(),
3720 diag::err_odr_objc_superclass_inconsistent)
3721 << To->getDeclName();
3723 Importer.ToDiag(To->getSuperClassLoc(), diag::note_odr_objc_superclass)
3724 << To->getSuperClass()->getDeclName();
3726 Importer.ToDiag(To->getLocation(),
3727 diag::note_odr_objc_missing_superclass);
3728 if (From->getSuperClass())
3729 Importer.FromDiag(From->getSuperClassLoc(),
3730 diag::note_odr_objc_superclass)
3731 << From->getSuperClass()->getDeclName();
3733 Importer.FromDiag(From->getLocation(),
3734 diag::note_odr_objc_missing_superclass);
3737 if (shouldForceImportDeclContext(Kind))
3738 ImportDeclContext(From);
3742 // Start the definition.
3743 To->startDefinition();
3745 // If this class has a superclass, import it.
3746 if (From->getSuperClass()) {
3747 TypeSourceInfo *SuperTInfo = Importer.Import(From->getSuperClassTInfo());
3751 To->setSuperClass(SuperTInfo);
3755 SmallVector<ObjCProtocolDecl *, 4> Protocols;
3756 SmallVector<SourceLocation, 4> ProtocolLocs;
3757 ObjCInterfaceDecl::protocol_loc_iterator
3758 FromProtoLoc = From->protocol_loc_begin();
3760 for (ObjCInterfaceDecl::protocol_iterator FromProto = From->protocol_begin(),
3761 FromProtoEnd = From->protocol_end();
3762 FromProto != FromProtoEnd;
3763 ++FromProto, ++FromProtoLoc) {
3764 ObjCProtocolDecl *ToProto
3765 = cast_or_null<ObjCProtocolDecl>(Importer.Import(*FromProto));
3768 Protocols.push_back(ToProto);
3769 ProtocolLocs.push_back(Importer.Import(*FromProtoLoc));
3772 // FIXME: If we're merging, make sure that the protocol list is the same.
3773 To->setProtocolList(Protocols.data(), Protocols.size(),
3774 ProtocolLocs.data(), Importer.getToContext());
3776 // Import categories. When the categories themselves are imported, they'll
3777 // hook themselves into this interface.
3778 for (auto *Cat : From->known_categories())
3779 Importer.Import(Cat);
3781 // If we have an @implementation, import it as well.
3782 if (From->getImplementation()) {
3783 ObjCImplementationDecl *Impl = cast_or_null<ObjCImplementationDecl>(
3784 Importer.Import(From->getImplementation()));
3788 To->setImplementation(Impl);
3791 if (shouldForceImportDeclContext(Kind)) {
3792 // Import all of the members of this class.
3793 ImportDeclContext(From, /*ForceImport=*/true);
3799 ASTNodeImporter::ImportObjCTypeParamList(ObjCTypeParamList *list) {
3803 SmallVector<ObjCTypeParamDecl *, 4> toTypeParams;
3804 for (auto fromTypeParam : *list) {
3805 auto toTypeParam = cast_or_null<ObjCTypeParamDecl>(
3806 Importer.Import(fromTypeParam));
3810 toTypeParams.push_back(toTypeParam);
3813 return ObjCTypeParamList::create(Importer.getToContext(),
3814 Importer.Import(list->getLAngleLoc()),
3816 Importer.Import(list->getRAngleLoc()));
3819 Decl *ASTNodeImporter::VisitObjCInterfaceDecl(ObjCInterfaceDecl *D) {
3820 // If this class has a definition in the translation unit we're coming from,
3821 // but this particular declaration is not that definition, import the
3822 // definition and map to that.
3823 ObjCInterfaceDecl *Definition = D->getDefinition();
3824 if (Definition && Definition != D) {
3825 Decl *ImportedDef = Importer.Import(Definition);
3829 return Importer.Imported(D, ImportedDef);
3832 // Import the major distinguishing characteristics of an @interface.
3833 DeclContext *DC, *LexicalDC;
3834 DeclarationName Name;
3837 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
3842 // Look for an existing interface with the same name.
3843 ObjCInterfaceDecl *MergeWithIface = nullptr;
3844 SmallVector<NamedDecl *, 2> FoundDecls;
3845 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls);
3846 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
3847 if (!FoundDecls[I]->isInIdentifierNamespace(Decl::IDNS_Ordinary))
3850 if ((MergeWithIface = dyn_cast<ObjCInterfaceDecl>(FoundDecls[I])))
3854 // Create an interface declaration, if one does not already exist.
3855 ObjCInterfaceDecl *ToIface = MergeWithIface;
3857 ToIface = ObjCInterfaceDecl::Create(Importer.getToContext(), DC,
3858 Importer.Import(D->getAtStartLoc()),
3859 Name.getAsIdentifierInfo(),
3860 /*TypeParamList=*/nullptr,
3861 /*PrevDecl=*/nullptr, Loc,
3862 D->isImplicitInterfaceDecl());
3863 ToIface->setLexicalDeclContext(LexicalDC);
3864 LexicalDC->addDeclInternal(ToIface);
3866 Importer.Imported(D, ToIface);
3867 // Import the type parameter list after calling Imported, to avoid
3868 // loops when bringing in their DeclContext.
3869 ToIface->setTypeParamList(ImportObjCTypeParamList(
3870 D->getTypeParamListAsWritten()));
3872 if (D->isThisDeclarationADefinition() && ImportDefinition(D, ToIface))
3878 Decl *ASTNodeImporter::VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) {
3879 ObjCCategoryDecl *Category = cast_or_null<ObjCCategoryDecl>(
3880 Importer.Import(D->getCategoryDecl()));
3884 ObjCCategoryImplDecl *ToImpl = Category->getImplementation();
3886 DeclContext *DC = Importer.ImportContext(D->getDeclContext());
3890 SourceLocation CategoryNameLoc = Importer.Import(D->getCategoryNameLoc());
3891 ToImpl = ObjCCategoryImplDecl::Create(Importer.getToContext(), DC,
3892 Importer.Import(D->getIdentifier()),
3893 Category->getClassInterface(),
3894 Importer.Import(D->getLocation()),
3895 Importer.Import(D->getAtStartLoc()),
3898 DeclContext *LexicalDC = DC;
3899 if (D->getDeclContext() != D->getLexicalDeclContext()) {
3900 LexicalDC = Importer.ImportContext(D->getLexicalDeclContext());
3904 ToImpl->setLexicalDeclContext(LexicalDC);
3907 LexicalDC->addDeclInternal(ToImpl);
3908 Category->setImplementation(ToImpl);
3911 Importer.Imported(D, ToImpl);
3912 ImportDeclContext(D);
3916 Decl *ASTNodeImporter::VisitObjCImplementationDecl(ObjCImplementationDecl *D) {
3917 // Find the corresponding interface.
3918 ObjCInterfaceDecl *Iface = cast_or_null<ObjCInterfaceDecl>(
3919 Importer.Import(D->getClassInterface()));
3923 // Import the superclass, if any.
3924 ObjCInterfaceDecl *Super = nullptr;
3925 if (D->getSuperClass()) {
3926 Super = cast_or_null<ObjCInterfaceDecl>(
3927 Importer.Import(D->getSuperClass()));
3932 ObjCImplementationDecl *Impl = Iface->getImplementation();
3934 // We haven't imported an implementation yet. Create a new @implementation
3936 Impl = ObjCImplementationDecl::Create(Importer.getToContext(),
3937 Importer.ImportContext(D->getDeclContext()),
3939 Importer.Import(D->getLocation()),
3940 Importer.Import(D->getAtStartLoc()),
3941 Importer.Import(D->getSuperClassLoc()),
3942 Importer.Import(D->getIvarLBraceLoc()),
3943 Importer.Import(D->getIvarRBraceLoc()));
3945 if (D->getDeclContext() != D->getLexicalDeclContext()) {
3946 DeclContext *LexicalDC
3947 = Importer.ImportContext(D->getLexicalDeclContext());
3950 Impl->setLexicalDeclContext(LexicalDC);
3953 // Associate the implementation with the class it implements.
3954 Iface->setImplementation(Impl);
3955 Importer.Imported(D, Iface->getImplementation());
3957 Importer.Imported(D, Iface->getImplementation());
3959 // Verify that the existing @implementation has the same superclass.
3960 if ((Super && !Impl->getSuperClass()) ||
3961 (!Super && Impl->getSuperClass()) ||
3962 (Super && Impl->getSuperClass() &&
3963 !declaresSameEntity(Super->getCanonicalDecl(),
3964 Impl->getSuperClass()))) {
3965 Importer.ToDiag(Impl->getLocation(),
3966 diag::err_odr_objc_superclass_inconsistent)
3967 << Iface->getDeclName();
3968 // FIXME: It would be nice to have the location of the superclass
3970 if (Impl->getSuperClass())
3971 Importer.ToDiag(Impl->getLocation(),
3972 diag::note_odr_objc_superclass)
3973 << Impl->getSuperClass()->getDeclName();
3975 Importer.ToDiag(Impl->getLocation(),
3976 diag::note_odr_objc_missing_superclass);
3977 if (D->getSuperClass())
3978 Importer.FromDiag(D->getLocation(),
3979 diag::note_odr_objc_superclass)
3980 << D->getSuperClass()->getDeclName();
3982 Importer.FromDiag(D->getLocation(),
3983 diag::note_odr_objc_missing_superclass);
3988 // Import all of the members of this @implementation.
3989 ImportDeclContext(D);
3994 Decl *ASTNodeImporter::VisitObjCPropertyDecl(ObjCPropertyDecl *D) {
3995 // Import the major distinguishing characteristics of an @property.
3996 DeclContext *DC, *LexicalDC;
3997 DeclarationName Name;
4000 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
4005 // Check whether we have already imported this property.
4006 SmallVector<NamedDecl *, 2> FoundDecls;
4007 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls);
4008 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
4009 if (ObjCPropertyDecl *FoundProp
4010 = dyn_cast<ObjCPropertyDecl>(FoundDecls[I])) {
4011 // Check property types.
4012 if (!Importer.IsStructurallyEquivalent(D->getType(),
4013 FoundProp->getType())) {
4014 Importer.ToDiag(Loc, diag::err_odr_objc_property_type_inconsistent)
4015 << Name << D->getType() << FoundProp->getType();
4016 Importer.ToDiag(FoundProp->getLocation(), diag::note_odr_value_here)
4017 << FoundProp->getType();
4021 // FIXME: Check property attributes, getters, setters, etc.?
4023 // Consider these properties to be equivalent.
4024 Importer.Imported(D, FoundProp);
4030 TypeSourceInfo *TSI = Importer.Import(D->getTypeSourceInfo());
4034 // Create the new property.
4035 ObjCPropertyDecl *ToProperty
4036 = ObjCPropertyDecl::Create(Importer.getToContext(), DC, Loc,
4037 Name.getAsIdentifierInfo(),
4038 Importer.Import(D->getAtLoc()),
4039 Importer.Import(D->getLParenLoc()),
4040 Importer.Import(D->getType()),
4042 D->getPropertyImplementation());
4043 Importer.Imported(D, ToProperty);
4044 ToProperty->setLexicalDeclContext(LexicalDC);
4045 LexicalDC->addDeclInternal(ToProperty);
4047 ToProperty->setPropertyAttributes(D->getPropertyAttributes());
4048 ToProperty->setPropertyAttributesAsWritten(
4049 D->getPropertyAttributesAsWritten());
4050 ToProperty->setGetterName(Importer.Import(D->getGetterName()));
4051 ToProperty->setSetterName(Importer.Import(D->getSetterName()));
4052 ToProperty->setGetterMethodDecl(
4053 cast_or_null<ObjCMethodDecl>(Importer.Import(D->getGetterMethodDecl())));
4054 ToProperty->setSetterMethodDecl(
4055 cast_or_null<ObjCMethodDecl>(Importer.Import(D->getSetterMethodDecl())));
4056 ToProperty->setPropertyIvarDecl(
4057 cast_or_null<ObjCIvarDecl>(Importer.Import(D->getPropertyIvarDecl())));
4061 Decl *ASTNodeImporter::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D) {
4062 ObjCPropertyDecl *Property = cast_or_null<ObjCPropertyDecl>(
4063 Importer.Import(D->getPropertyDecl()));
4067 DeclContext *DC = Importer.ImportContext(D->getDeclContext());
4071 // Import the lexical declaration context.
4072 DeclContext *LexicalDC = DC;
4073 if (D->getDeclContext() != D->getLexicalDeclContext()) {
4074 LexicalDC = Importer.ImportContext(D->getLexicalDeclContext());
4079 ObjCImplDecl *InImpl = dyn_cast<ObjCImplDecl>(LexicalDC);
4083 // Import the ivar (for an @synthesize).
4084 ObjCIvarDecl *Ivar = nullptr;
4085 if (D->getPropertyIvarDecl()) {
4086 Ivar = cast_or_null<ObjCIvarDecl>(
4087 Importer.Import(D->getPropertyIvarDecl()));
4092 ObjCPropertyImplDecl *ToImpl
4093 = InImpl->FindPropertyImplDecl(Property->getIdentifier(),
4094 Property->getQueryKind());
4096 ToImpl = ObjCPropertyImplDecl::Create(Importer.getToContext(), DC,
4097 Importer.Import(D->getLocStart()),
4098 Importer.Import(D->getLocation()),
4100 D->getPropertyImplementation(),
4102 Importer.Import(D->getPropertyIvarDeclLoc()));
4103 ToImpl->setLexicalDeclContext(LexicalDC);
4104 Importer.Imported(D, ToImpl);
4105 LexicalDC->addDeclInternal(ToImpl);
4107 // Check that we have the same kind of property implementation (@synthesize
4109 if (D->getPropertyImplementation() != ToImpl->getPropertyImplementation()) {
4110 Importer.ToDiag(ToImpl->getLocation(),
4111 diag::err_odr_objc_property_impl_kind_inconsistent)
4112 << Property->getDeclName()
4113 << (ToImpl->getPropertyImplementation()
4114 == ObjCPropertyImplDecl::Dynamic);
4115 Importer.FromDiag(D->getLocation(),
4116 diag::note_odr_objc_property_impl_kind)
4117 << D->getPropertyDecl()->getDeclName()
4118 << (D->getPropertyImplementation() == ObjCPropertyImplDecl::Dynamic);
4122 // For @synthesize, check that we have the same
4123 if (D->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize &&
4124 Ivar != ToImpl->getPropertyIvarDecl()) {
4125 Importer.ToDiag(ToImpl->getPropertyIvarDeclLoc(),
4126 diag::err_odr_objc_synthesize_ivar_inconsistent)
4127 << Property->getDeclName()
4128 << ToImpl->getPropertyIvarDecl()->getDeclName()
4129 << Ivar->getDeclName();
4130 Importer.FromDiag(D->getPropertyIvarDeclLoc(),
4131 diag::note_odr_objc_synthesize_ivar_here)
4132 << D->getPropertyIvarDecl()->getDeclName();
4136 // Merge the existing implementation with the new implementation.
4137 Importer.Imported(D, ToImpl);
4143 Decl *ASTNodeImporter::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) {
4144 // For template arguments, we adopt the translation unit as our declaration
4145 // context. This context will be fixed when the actual template declaration
4148 // FIXME: Import default argument.
4149 return TemplateTypeParmDecl::Create(Importer.getToContext(),
4150 Importer.getToContext().getTranslationUnitDecl(),
4151 Importer.Import(D->getLocStart()),
4152 Importer.Import(D->getLocation()),
4155 Importer.Import(D->getIdentifier()),
4156 D->wasDeclaredWithTypename(),
4157 D->isParameterPack());
4161 ASTNodeImporter::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) {
4162 // Import the name of this declaration.
4163 DeclarationName Name = Importer.Import(D->getDeclName());
4164 if (D->getDeclName() && !Name)
4167 // Import the location of this declaration.
4168 SourceLocation Loc = Importer.Import(D->getLocation());
4170 // Import the type of this declaration.
4171 QualType T = Importer.Import(D->getType());
4175 // Import type-source information.
4176 TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo());
4177 if (D->getTypeSourceInfo() && !TInfo)
4180 // FIXME: Import default argument.
4182 return NonTypeTemplateParmDecl::Create(Importer.getToContext(),
4183 Importer.getToContext().getTranslationUnitDecl(),
4184 Importer.Import(D->getInnerLocStart()),
4185 Loc, D->getDepth(), D->getPosition(),
4186 Name.getAsIdentifierInfo(),
4187 T, D->isParameterPack(), TInfo);
4191 ASTNodeImporter::VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) {
4192 // Import the name of this declaration.
4193 DeclarationName Name = Importer.Import(D->getDeclName());
4194 if (D->getDeclName() && !Name)
4197 // Import the location of this declaration.
4198 SourceLocation Loc = Importer.Import(D->getLocation());
4200 // Import template parameters.
4201 TemplateParameterList *TemplateParams
4202 = ImportTemplateParameterList(D->getTemplateParameters());
4203 if (!TemplateParams)
4206 // FIXME: Import default argument.
4208 return TemplateTemplateParmDecl::Create(Importer.getToContext(),
4209 Importer.getToContext().getTranslationUnitDecl(),
4210 Loc, D->getDepth(), D->getPosition(),
4211 D->isParameterPack(),
4212 Name.getAsIdentifierInfo(),
4216 Decl *ASTNodeImporter::VisitClassTemplateDecl(ClassTemplateDecl *D) {
4217 // If this record has a definition in the translation unit we're coming from,
4218 // but this particular declaration is not that definition, import the
4219 // definition and map to that.
4220 CXXRecordDecl *Definition
4221 = cast_or_null<CXXRecordDecl>(D->getTemplatedDecl()->getDefinition());
4222 if (Definition && Definition != D->getTemplatedDecl()) {
4224 = Importer.Import(Definition->getDescribedClassTemplate());
4228 return Importer.Imported(D, ImportedDef);
4231 // Import the major distinguishing characteristics of this class template.
4232 DeclContext *DC, *LexicalDC;
4233 DeclarationName Name;
4236 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
4241 // We may already have a template of the same name; try to find and match it.
4242 if (!DC->isFunctionOrMethod()) {
4243 SmallVector<NamedDecl *, 4> ConflictingDecls;
4244 SmallVector<NamedDecl *, 2> FoundDecls;
4245 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls);
4246 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
4247 if (!FoundDecls[I]->isInIdentifierNamespace(Decl::IDNS_Ordinary))
4250 Decl *Found = FoundDecls[I];
4251 if (ClassTemplateDecl *FoundTemplate
4252 = dyn_cast<ClassTemplateDecl>(Found)) {
4253 if (IsStructuralMatch(D, FoundTemplate)) {
4254 // The class templates structurally match; call it the same template.
4255 // FIXME: We may be filling in a forward declaration here. Handle
4257 Importer.Imported(D->getTemplatedDecl(),
4258 FoundTemplate->getTemplatedDecl());
4259 return Importer.Imported(D, FoundTemplate);
4263 ConflictingDecls.push_back(FoundDecls[I]);
4266 if (!ConflictingDecls.empty()) {
4267 Name = Importer.HandleNameConflict(Name, DC, Decl::IDNS_Ordinary,
4268 ConflictingDecls.data(),
4269 ConflictingDecls.size());
4276 CXXRecordDecl *DTemplated = D->getTemplatedDecl();
4278 // Create the declaration that is being templated.
4279 SourceLocation StartLoc = Importer.Import(DTemplated->getLocStart());
4280 SourceLocation IdLoc = Importer.Import(DTemplated->getLocation());
4281 CXXRecordDecl *D2Templated = CXXRecordDecl::Create(Importer.getToContext(),
4282 DTemplated->getTagKind(),
4283 DC, StartLoc, IdLoc,
4284 Name.getAsIdentifierInfo());
4285 D2Templated->setAccess(DTemplated->getAccess());
4286 D2Templated->setQualifierInfo(Importer.Import(DTemplated->getQualifierLoc()));
4287 D2Templated->setLexicalDeclContext(LexicalDC);
4289 // Create the class template declaration itself.
4290 TemplateParameterList *TemplateParams
4291 = ImportTemplateParameterList(D->getTemplateParameters());
4292 if (!TemplateParams)
4295 ClassTemplateDecl *D2 = ClassTemplateDecl::Create(Importer.getToContext(), DC,
4296 Loc, Name, TemplateParams,
4298 /*PrevDecl=*/nullptr);
4299 D2Templated->setDescribedClassTemplate(D2);
4301 D2->setAccess(D->getAccess());
4302 D2->setLexicalDeclContext(LexicalDC);
4303 LexicalDC->addDeclInternal(D2);
4305 // Note the relationship between the class templates.
4306 Importer.Imported(D, D2);
4307 Importer.Imported(DTemplated, D2Templated);
4309 if (DTemplated->isCompleteDefinition() &&
4310 !D2Templated->isCompleteDefinition()) {
4311 // FIXME: Import definition!
4317 Decl *ASTNodeImporter::VisitClassTemplateSpecializationDecl(
4318 ClassTemplateSpecializationDecl *D) {
4319 // If this record has a definition in the translation unit we're coming from,
4320 // but this particular declaration is not that definition, import the
4321 // definition and map to that.
4322 TagDecl *Definition = D->getDefinition();
4323 if (Definition && Definition != D) {
4324 Decl *ImportedDef = Importer.Import(Definition);
4328 return Importer.Imported(D, ImportedDef);
4331 ClassTemplateDecl *ClassTemplate
4332 = cast_or_null<ClassTemplateDecl>(Importer.Import(
4333 D->getSpecializedTemplate()));
4337 // Import the context of this declaration.
4338 DeclContext *DC = ClassTemplate->getDeclContext();
4342 DeclContext *LexicalDC = DC;
4343 if (D->getDeclContext() != D->getLexicalDeclContext()) {
4344 LexicalDC = Importer.ImportContext(D->getLexicalDeclContext());
4349 // Import the location of this declaration.
4350 SourceLocation StartLoc = Importer.Import(D->getLocStart());
4351 SourceLocation IdLoc = Importer.Import(D->getLocation());
4353 // Import template arguments.
4354 SmallVector<TemplateArgument, 2> TemplateArgs;
4355 if (ImportTemplateArguments(D->getTemplateArgs().data(),
4356 D->getTemplateArgs().size(),
4360 // Try to find an existing specialization with these template arguments.
4361 void *InsertPos = nullptr;
4362 ClassTemplateSpecializationDecl *D2
4363 = ClassTemplate->findSpecialization(TemplateArgs, InsertPos);
4365 // We already have a class template specialization with these template
4368 // FIXME: Check for specialization vs. instantiation errors.
4370 if (RecordDecl *FoundDef = D2->getDefinition()) {
4371 if (!D->isCompleteDefinition() || IsStructuralMatch(D, FoundDef)) {
4372 // The record types structurally match, or the "from" translation
4373 // unit only had a forward declaration anyway; call it the same
4375 return Importer.Imported(D, FoundDef);
4379 // Create a new specialization.
4380 D2 = ClassTemplateSpecializationDecl::Create(Importer.getToContext(),
4381 D->getTagKind(), DC,
4384 TemplateArgs.data(),
4385 TemplateArgs.size(),
4386 /*PrevDecl=*/nullptr);
4387 D2->setSpecializationKind(D->getSpecializationKind());
4389 // Add this specialization to the class template.
4390 ClassTemplate->AddSpecialization(D2, InsertPos);
4392 // Import the qualifier, if any.
4393 D2->setQualifierInfo(Importer.Import(D->getQualifierLoc()));
4395 // Add the specialization to this context.
4396 D2->setLexicalDeclContext(LexicalDC);
4397 LexicalDC->addDeclInternal(D2);
4399 Importer.Imported(D, D2);
4401 if (D->isCompleteDefinition() && ImportDefinition(D, D2))
4407 Decl *ASTNodeImporter::VisitVarTemplateDecl(VarTemplateDecl *D) {
4408 // If this variable has a definition in the translation unit we're coming
4410 // but this particular declaration is not that definition, import the
4411 // definition and map to that.
4412 VarDecl *Definition =
4413 cast_or_null<VarDecl>(D->getTemplatedDecl()->getDefinition());
4414 if (Definition && Definition != D->getTemplatedDecl()) {
4415 Decl *ImportedDef = Importer.Import(Definition->getDescribedVarTemplate());
4419 return Importer.Imported(D, ImportedDef);
4422 // Import the major distinguishing characteristics of this variable template.
4423 DeclContext *DC, *LexicalDC;
4424 DeclarationName Name;
4427 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
4432 // We may already have a template of the same name; try to find and match it.
4433 assert(!DC->isFunctionOrMethod() &&
4434 "Variable templates cannot be declared at function scope");
4435 SmallVector<NamedDecl *, 4> ConflictingDecls;
4436 SmallVector<NamedDecl *, 2> FoundDecls;
4437 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls);
4438 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
4439 if (!FoundDecls[I]->isInIdentifierNamespace(Decl::IDNS_Ordinary))
4442 Decl *Found = FoundDecls[I];
4443 if (VarTemplateDecl *FoundTemplate = dyn_cast<VarTemplateDecl>(Found)) {
4444 if (IsStructuralMatch(D, FoundTemplate)) {
4445 // The variable templates structurally match; call it the same template.
4446 Importer.Imported(D->getTemplatedDecl(),
4447 FoundTemplate->getTemplatedDecl());
4448 return Importer.Imported(D, FoundTemplate);
4452 ConflictingDecls.push_back(FoundDecls[I]);
4455 if (!ConflictingDecls.empty()) {
4456 Name = Importer.HandleNameConflict(Name, DC, Decl::IDNS_Ordinary,
4457 ConflictingDecls.data(),
4458 ConflictingDecls.size());
4464 VarDecl *DTemplated = D->getTemplatedDecl();
4467 QualType T = Importer.Import(DTemplated->getType());
4471 // Create the declaration that is being templated.
4472 SourceLocation StartLoc = Importer.Import(DTemplated->getLocStart());
4473 SourceLocation IdLoc = Importer.Import(DTemplated->getLocation());
4474 TypeSourceInfo *TInfo = Importer.Import(DTemplated->getTypeSourceInfo());
4475 VarDecl *D2Templated = VarDecl::Create(Importer.getToContext(), DC, StartLoc,
4476 IdLoc, Name.getAsIdentifierInfo(), T,
4477 TInfo, DTemplated->getStorageClass());
4478 D2Templated->setAccess(DTemplated->getAccess());
4479 D2Templated->setQualifierInfo(Importer.Import(DTemplated->getQualifierLoc()));
4480 D2Templated->setLexicalDeclContext(LexicalDC);
4482 // Importer.Imported(DTemplated, D2Templated);
4483 // LexicalDC->addDeclInternal(D2Templated);
4485 // Merge the initializer.
4486 if (ImportDefinition(DTemplated, D2Templated))
4489 // Create the variable template declaration itself.
4490 TemplateParameterList *TemplateParams =
4491 ImportTemplateParameterList(D->getTemplateParameters());
4492 if (!TemplateParams)
4495 VarTemplateDecl *D2 = VarTemplateDecl::Create(
4496 Importer.getToContext(), DC, Loc, Name, TemplateParams, D2Templated);
4497 D2Templated->setDescribedVarTemplate(D2);
4499 D2->setAccess(D->getAccess());
4500 D2->setLexicalDeclContext(LexicalDC);
4501 LexicalDC->addDeclInternal(D2);
4503 // Note the relationship between the variable templates.
4504 Importer.Imported(D, D2);
4505 Importer.Imported(DTemplated, D2Templated);
4507 if (DTemplated->isThisDeclarationADefinition() &&
4508 !D2Templated->isThisDeclarationADefinition()) {
4509 // FIXME: Import definition!
4515 Decl *ASTNodeImporter::VisitVarTemplateSpecializationDecl(
4516 VarTemplateSpecializationDecl *D) {
4517 // If this record has a definition in the translation unit we're coming from,
4518 // but this particular declaration is not that definition, import the
4519 // definition and map to that.
4520 VarDecl *Definition = D->getDefinition();
4521 if (Definition && Definition != D) {
4522 Decl *ImportedDef = Importer.Import(Definition);
4526 return Importer.Imported(D, ImportedDef);
4529 VarTemplateDecl *VarTemplate = cast_or_null<VarTemplateDecl>(
4530 Importer.Import(D->getSpecializedTemplate()));
4534 // Import the context of this declaration.
4535 DeclContext *DC = VarTemplate->getDeclContext();
4539 DeclContext *LexicalDC = DC;
4540 if (D->getDeclContext() != D->getLexicalDeclContext()) {
4541 LexicalDC = Importer.ImportContext(D->getLexicalDeclContext());
4546 // Import the location of this declaration.
4547 SourceLocation StartLoc = Importer.Import(D->getLocStart());
4548 SourceLocation IdLoc = Importer.Import(D->getLocation());
4550 // Import template arguments.
4551 SmallVector<TemplateArgument, 2> TemplateArgs;
4552 if (ImportTemplateArguments(D->getTemplateArgs().data(),
4553 D->getTemplateArgs().size(), TemplateArgs))
4556 // Try to find an existing specialization with these template arguments.
4557 void *InsertPos = nullptr;
4558 VarTemplateSpecializationDecl *D2 = VarTemplate->findSpecialization(
4559 TemplateArgs, InsertPos);
4561 // We already have a variable template specialization with these template
4564 // FIXME: Check for specialization vs. instantiation errors.
4566 if (VarDecl *FoundDef = D2->getDefinition()) {
4567 if (!D->isThisDeclarationADefinition() ||
4568 IsStructuralMatch(D, FoundDef)) {
4569 // The record types structurally match, or the "from" translation
4570 // unit only had a forward declaration anyway; call it the same
4572 return Importer.Imported(D, FoundDef);
4578 QualType T = Importer.Import(D->getType());
4581 TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo());
4583 // Create a new specialization.
4584 D2 = VarTemplateSpecializationDecl::Create(
4585 Importer.getToContext(), DC, StartLoc, IdLoc, VarTemplate, T, TInfo,
4586 D->getStorageClass(), TemplateArgs.data(), TemplateArgs.size());
4587 D2->setSpecializationKind(D->getSpecializationKind());
4588 D2->setTemplateArgsInfo(D->getTemplateArgsInfo());
4590 // Add this specialization to the class template.
4591 VarTemplate->AddSpecialization(D2, InsertPos);
4593 // Import the qualifier, if any.
4594 D2->setQualifierInfo(Importer.Import(D->getQualifierLoc()));
4596 // Add the specialization to this context.
4597 D2->setLexicalDeclContext(LexicalDC);
4598 LexicalDC->addDeclInternal(D2);
4600 Importer.Imported(D, D2);
4602 if (D->isThisDeclarationADefinition() && ImportDefinition(D, D2))
4608 //----------------------------------------------------------------------------
4609 // Import Statements
4610 //----------------------------------------------------------------------------
4612 DeclGroupRef ASTNodeImporter::ImportDeclGroup(DeclGroupRef DG) {
4614 return DeclGroupRef::Create(Importer.getToContext(), nullptr, 0);
4615 size_t NumDecls = DG.end() - DG.begin();
4616 SmallVector<Decl *, 1> ToDecls(NumDecls);
4617 auto &_Importer = this->Importer;
4618 std::transform(DG.begin(), DG.end(), ToDecls.begin(),
4619 [&_Importer](Decl *D) -> Decl * {
4620 return _Importer.Import(D);
4622 return DeclGroupRef::Create(Importer.getToContext(),
4627 Stmt *ASTNodeImporter::VisitStmt(Stmt *S) {
4628 Importer.FromDiag(S->getLocStart(), diag::err_unsupported_ast_node)
4629 << S->getStmtClassName();
4633 Stmt *ASTNodeImporter::VisitDeclStmt(DeclStmt *S) {
4634 DeclGroupRef ToDG = ImportDeclGroup(S->getDeclGroup());
4635 for (Decl *ToD : ToDG) {
4639 SourceLocation ToStartLoc = Importer.Import(S->getStartLoc());
4640 SourceLocation ToEndLoc = Importer.Import(S->getEndLoc());
4641 return new (Importer.getToContext()) DeclStmt(ToDG, ToStartLoc, ToEndLoc);
4644 Stmt *ASTNodeImporter::VisitNullStmt(NullStmt *S) {
4645 SourceLocation ToSemiLoc = Importer.Import(S->getSemiLoc());
4646 return new (Importer.getToContext()) NullStmt(ToSemiLoc,
4647 S->hasLeadingEmptyMacro());
4650 Stmt *ASTNodeImporter::VisitCompoundStmt(CompoundStmt *S) {
4651 SmallVector<Stmt *, 4> ToStmts(S->size());
4652 auto &_Importer = this->Importer;
4653 std::transform(S->body_begin(), S->body_end(), ToStmts.begin(),
4654 [&_Importer](Stmt *CS) -> Stmt * {
4655 return _Importer.Import(CS);
4657 for (Stmt *ToS : ToStmts) {
4661 SourceLocation ToLBraceLoc = Importer.Import(S->getLBracLoc());
4662 SourceLocation ToRBraceLoc = Importer.Import(S->getRBracLoc());
4663 return new (Importer.getToContext()) CompoundStmt(Importer.getToContext(),
4665 ToLBraceLoc, ToRBraceLoc);
4668 Stmt *ASTNodeImporter::VisitCaseStmt(CaseStmt *S) {
4669 Expr *ToLHS = Importer.Import(S->getLHS());
4672 Expr *ToRHS = Importer.Import(S->getRHS());
4673 if (!ToRHS && S->getRHS())
4675 SourceLocation ToCaseLoc = Importer.Import(S->getCaseLoc());
4676 SourceLocation ToEllipsisLoc = Importer.Import(S->getEllipsisLoc());
4677 SourceLocation ToColonLoc = Importer.Import(S->getColonLoc());
4678 return new (Importer.getToContext()) CaseStmt(ToLHS, ToRHS,
4679 ToCaseLoc, ToEllipsisLoc,
4683 Stmt *ASTNodeImporter::VisitDefaultStmt(DefaultStmt *S) {
4684 SourceLocation ToDefaultLoc = Importer.Import(S->getDefaultLoc());
4685 SourceLocation ToColonLoc = Importer.Import(S->getColonLoc());
4686 Stmt *ToSubStmt = Importer.Import(S->getSubStmt());
4687 if (!ToSubStmt && S->getSubStmt())
4689 return new (Importer.getToContext()) DefaultStmt(ToDefaultLoc, ToColonLoc,
4693 Stmt *ASTNodeImporter::VisitLabelStmt(LabelStmt *S) {
4694 SourceLocation ToIdentLoc = Importer.Import(S->getIdentLoc());
4695 LabelDecl *ToLabelDecl =
4696 cast_or_null<LabelDecl>(Importer.Import(S->getDecl()));
4697 if (!ToLabelDecl && S->getDecl())
4699 Stmt *ToSubStmt = Importer.Import(S->getSubStmt());
4700 if (!ToSubStmt && S->getSubStmt())
4702 return new (Importer.getToContext()) LabelStmt(ToIdentLoc, ToLabelDecl,
4706 Stmt *ASTNodeImporter::VisitAttributedStmt(AttributedStmt *S) {
4707 SourceLocation ToAttrLoc = Importer.Import(S->getAttrLoc());
4708 ArrayRef<const Attr*> FromAttrs(S->getAttrs());
4709 SmallVector<const Attr *, 1> ToAttrs(FromAttrs.size());
4710 ASTContext &_ToContext = Importer.getToContext();
4711 std::transform(FromAttrs.begin(), FromAttrs.end(), ToAttrs.begin(),
4712 [&_ToContext](const Attr *A) -> const Attr * {
4713 return A->clone(_ToContext);
4715 for (const Attr *ToA : ToAttrs) {
4719 Stmt *ToSubStmt = Importer.Import(S->getSubStmt());
4720 if (!ToSubStmt && S->getSubStmt())
4722 return AttributedStmt::Create(Importer.getToContext(), ToAttrLoc,
4723 ToAttrs, ToSubStmt);
4726 Stmt *ASTNodeImporter::VisitIfStmt(IfStmt *S) {
4727 SourceLocation ToIfLoc = Importer.Import(S->getIfLoc());
4728 VarDecl *ToConditionVariable = nullptr;
4729 if (VarDecl *FromConditionVariable = S->getConditionVariable()) {
4730 ToConditionVariable =
4731 dyn_cast_or_null<VarDecl>(Importer.Import(FromConditionVariable));
4732 if (!ToConditionVariable)
4735 Expr *ToCondition = Importer.Import(S->getCond());
4736 if (!ToCondition && S->getCond())
4738 Stmt *ToThenStmt = Importer.Import(S->getThen());
4739 if (!ToThenStmt && S->getThen())
4741 SourceLocation ToElseLoc = Importer.Import(S->getElseLoc());
4742 Stmt *ToElseStmt = Importer.Import(S->getElse());
4743 if (!ToElseStmt && S->getElse())
4745 return new (Importer.getToContext()) IfStmt(Importer.getToContext(),
4746 ToIfLoc, ToConditionVariable,
4747 ToCondition, ToThenStmt,
4748 ToElseLoc, ToElseStmt);
4751 Stmt *ASTNodeImporter::VisitSwitchStmt(SwitchStmt *S) {
4752 VarDecl *ToConditionVariable = nullptr;
4753 if (VarDecl *FromConditionVariable = S->getConditionVariable()) {
4754 ToConditionVariable =
4755 dyn_cast_or_null<VarDecl>(Importer.Import(FromConditionVariable));
4756 if (!ToConditionVariable)
4759 Expr *ToCondition = Importer.Import(S->getCond());
4760 if (!ToCondition && S->getCond())
4762 SwitchStmt *ToStmt = new (Importer.getToContext()) SwitchStmt(
4763 Importer.getToContext(), ToConditionVariable,
4765 Stmt *ToBody = Importer.Import(S->getBody());
4766 if (!ToBody && S->getBody())
4768 ToStmt->setBody(ToBody);
4769 ToStmt->setSwitchLoc(Importer.Import(S->getSwitchLoc()));
4770 // Now we have to re-chain the cases.
4771 SwitchCase *LastChainedSwitchCase = nullptr;
4772 for (SwitchCase *SC = S->getSwitchCaseList(); SC != nullptr;
4773 SC = SC->getNextSwitchCase()) {
4774 SwitchCase *ToSC = dyn_cast_or_null<SwitchCase>(Importer.Import(SC));
4777 if (LastChainedSwitchCase)
4778 LastChainedSwitchCase->setNextSwitchCase(ToSC);
4780 ToStmt->setSwitchCaseList(ToSC);
4781 LastChainedSwitchCase = ToSC;
4786 Stmt *ASTNodeImporter::VisitWhileStmt(WhileStmt *S) {
4787 VarDecl *ToConditionVariable = nullptr;
4788 if (VarDecl *FromConditionVariable = S->getConditionVariable()) {
4789 ToConditionVariable =
4790 dyn_cast_or_null<VarDecl>(Importer.Import(FromConditionVariable));
4791 if (!ToConditionVariable)
4794 Expr *ToCondition = Importer.Import(S->getCond());
4795 if (!ToCondition && S->getCond())
4797 Stmt *ToBody = Importer.Import(S->getBody());
4798 if (!ToBody && S->getBody())
4800 SourceLocation ToWhileLoc = Importer.Import(S->getWhileLoc());
4801 return new (Importer.getToContext()) WhileStmt(Importer.getToContext(),
4802 ToConditionVariable,
4803 ToCondition, ToBody,
4807 Stmt *ASTNodeImporter::VisitDoStmt(DoStmt *S) {
4808 Stmt *ToBody = Importer.Import(S->getBody());
4809 if (!ToBody && S->getBody())
4811 Expr *ToCondition = Importer.Import(S->getCond());
4812 if (!ToCondition && S->getCond())
4814 SourceLocation ToDoLoc = Importer.Import(S->getDoLoc());
4815 SourceLocation ToWhileLoc = Importer.Import(S->getWhileLoc());
4816 SourceLocation ToRParenLoc = Importer.Import(S->getRParenLoc());
4817 return new (Importer.getToContext()) DoStmt(ToBody, ToCondition,
4818 ToDoLoc, ToWhileLoc,
4822 Stmt *ASTNodeImporter::VisitForStmt(ForStmt *S) {
4823 Stmt *ToInit = Importer.Import(S->getInit());
4824 if (!ToInit && S->getInit())
4826 Expr *ToCondition = Importer.Import(S->getCond());
4827 if (!ToCondition && S->getCond())
4829 VarDecl *ToConditionVariable = nullptr;
4830 if (VarDecl *FromConditionVariable = S->getConditionVariable()) {
4831 ToConditionVariable =
4832 dyn_cast_or_null<VarDecl>(Importer.Import(FromConditionVariable));
4833 if (!ToConditionVariable)
4836 Expr *ToInc = Importer.Import(S->getInc());
4837 if (!ToInc && S->getInc())
4839 Stmt *ToBody = Importer.Import(S->getBody());
4840 if (!ToBody && S->getBody())
4842 SourceLocation ToForLoc = Importer.Import(S->getForLoc());
4843 SourceLocation ToLParenLoc = Importer.Import(S->getLParenLoc());
4844 SourceLocation ToRParenLoc = Importer.Import(S->getRParenLoc());
4845 return new (Importer.getToContext()) ForStmt(Importer.getToContext(),
4846 ToInit, ToCondition,
4847 ToConditionVariable,
4849 ToForLoc, ToLParenLoc,
4853 Stmt *ASTNodeImporter::VisitGotoStmt(GotoStmt *S) {
4854 LabelDecl *ToLabel = nullptr;
4855 if (LabelDecl *FromLabel = S->getLabel()) {
4856 ToLabel = dyn_cast_or_null<LabelDecl>(Importer.Import(FromLabel));
4860 SourceLocation ToGotoLoc = Importer.Import(S->getGotoLoc());
4861 SourceLocation ToLabelLoc = Importer.Import(S->getLabelLoc());
4862 return new (Importer.getToContext()) GotoStmt(ToLabel,
4863 ToGotoLoc, ToLabelLoc);
4866 Stmt *ASTNodeImporter::VisitIndirectGotoStmt(IndirectGotoStmt *S) {
4867 SourceLocation ToGotoLoc = Importer.Import(S->getGotoLoc());
4868 SourceLocation ToStarLoc = Importer.Import(S->getStarLoc());
4869 Expr *ToTarget = Importer.Import(S->getTarget());
4870 if (!ToTarget && S->getTarget())
4872 return new (Importer.getToContext()) IndirectGotoStmt(ToGotoLoc, ToStarLoc,
4876 Stmt *ASTNodeImporter::VisitContinueStmt(ContinueStmt *S) {
4877 SourceLocation ToContinueLoc = Importer.Import(S->getContinueLoc());
4878 return new (Importer.getToContext()) ContinueStmt(ToContinueLoc);
4881 Stmt *ASTNodeImporter::VisitBreakStmt(BreakStmt *S) {
4882 SourceLocation ToBreakLoc = Importer.Import(S->getBreakLoc());
4883 return new (Importer.getToContext()) BreakStmt(ToBreakLoc);
4886 Stmt *ASTNodeImporter::VisitReturnStmt(ReturnStmt *S) {
4887 SourceLocation ToRetLoc = Importer.Import(S->getReturnLoc());
4888 Expr *ToRetExpr = Importer.Import(S->getRetValue());
4889 if (!ToRetExpr && S->getRetValue())
4891 VarDecl *NRVOCandidate = const_cast<VarDecl*>(S->getNRVOCandidate());
4892 VarDecl *ToNRVOCandidate = cast_or_null<VarDecl>(Importer.Import(NRVOCandidate));
4893 if (!ToNRVOCandidate && NRVOCandidate)
4895 return new (Importer.getToContext()) ReturnStmt(ToRetLoc, ToRetExpr,
4899 Stmt *ASTNodeImporter::VisitCXXCatchStmt(CXXCatchStmt *S) {
4900 SourceLocation ToCatchLoc = Importer.Import(S->getCatchLoc());
4901 VarDecl *ToExceptionDecl = nullptr;
4902 if (VarDecl *FromExceptionDecl = S->getExceptionDecl()) {
4904 dyn_cast_or_null<VarDecl>(Importer.Import(FromExceptionDecl));
4905 if (!ToExceptionDecl)
4908 Stmt *ToHandlerBlock = Importer.Import(S->getHandlerBlock());
4909 if (!ToHandlerBlock && S->getHandlerBlock())
4911 return new (Importer.getToContext()) CXXCatchStmt(ToCatchLoc,
4916 Stmt *ASTNodeImporter::VisitCXXTryStmt(CXXTryStmt *S) {
4917 SourceLocation ToTryLoc = Importer.Import(S->getTryLoc());
4918 Stmt *ToTryBlock = Importer.Import(S->getTryBlock());
4919 if (!ToTryBlock && S->getTryBlock())
4921 SmallVector<Stmt *, 1> ToHandlers(S->getNumHandlers());
4922 for (unsigned HI = 0, HE = S->getNumHandlers(); HI != HE; ++HI) {
4923 CXXCatchStmt *FromHandler = S->getHandler(HI);
4924 if (Stmt *ToHandler = Importer.Import(FromHandler))
4925 ToHandlers[HI] = ToHandler;
4929 return CXXTryStmt::Create(Importer.getToContext(), ToTryLoc, ToTryBlock,
4933 Stmt *ASTNodeImporter::VisitCXXForRangeStmt(CXXForRangeStmt *S) {
4935 dyn_cast_or_null<DeclStmt>(Importer.Import(S->getRangeStmt()));
4936 if (!ToRange && S->getRangeStmt())
4938 DeclStmt *ToBeginEnd =
4939 dyn_cast_or_null<DeclStmt>(Importer.Import(S->getBeginEndStmt()));
4940 if (!ToBeginEnd && S->getBeginEndStmt())
4942 Expr *ToCond = Importer.Import(S->getCond());
4943 if (!ToCond && S->getCond())
4945 Expr *ToInc = Importer.Import(S->getInc());
4946 if (!ToInc && S->getInc())
4948 DeclStmt *ToLoopVar =
4949 dyn_cast_or_null<DeclStmt>(Importer.Import(S->getLoopVarStmt()));
4950 if (!ToLoopVar && S->getLoopVarStmt())
4952 Stmt *ToBody = Importer.Import(S->getBody());
4953 if (!ToBody && S->getBody())
4955 SourceLocation ToForLoc = Importer.Import(S->getForLoc());
4956 SourceLocation ToCoawaitLoc = Importer.Import(S->getCoawaitLoc());
4957 SourceLocation ToColonLoc = Importer.Import(S->getColonLoc());
4958 SourceLocation ToRParenLoc = Importer.Import(S->getRParenLoc());
4959 return new (Importer.getToContext()) CXXForRangeStmt(ToRange, ToBeginEnd,
4962 ToForLoc, ToCoawaitLoc,
4963 ToColonLoc, ToRParenLoc);
4966 Stmt *ASTNodeImporter::VisitObjCForCollectionStmt(ObjCForCollectionStmt *S) {
4967 Stmt *ToElem = Importer.Import(S->getElement());
4968 if (!ToElem && S->getElement())
4970 Expr *ToCollect = Importer.Import(S->getCollection());
4971 if (!ToCollect && S->getCollection())
4973 Stmt *ToBody = Importer.Import(S->getBody());
4974 if (!ToBody && S->getBody())
4976 SourceLocation ToForLoc = Importer.Import(S->getForLoc());
4977 SourceLocation ToRParenLoc = Importer.Import(S->getRParenLoc());
4978 return new (Importer.getToContext()) ObjCForCollectionStmt(ToElem,
4984 Stmt *ASTNodeImporter::VisitObjCAtCatchStmt(ObjCAtCatchStmt *S) {
4985 SourceLocation ToAtCatchLoc = Importer.Import(S->getAtCatchLoc());
4986 SourceLocation ToRParenLoc = Importer.Import(S->getRParenLoc());
4987 VarDecl *ToExceptionDecl = nullptr;
4988 if (VarDecl *FromExceptionDecl = S->getCatchParamDecl()) {
4990 dyn_cast_or_null<VarDecl>(Importer.Import(FromExceptionDecl));
4991 if (!ToExceptionDecl)
4994 Stmt *ToBody = Importer.Import(S->getCatchBody());
4995 if (!ToBody && S->getCatchBody())
4997 return new (Importer.getToContext()) ObjCAtCatchStmt(ToAtCatchLoc,
5003 Stmt *ASTNodeImporter::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
5004 SourceLocation ToAtFinallyLoc = Importer.Import(S->getAtFinallyLoc());
5005 Stmt *ToAtFinallyStmt = Importer.Import(S->getFinallyBody());
5006 if (!ToAtFinallyStmt && S->getFinallyBody())
5008 return new (Importer.getToContext()) ObjCAtFinallyStmt(ToAtFinallyLoc,
5012 Stmt *ASTNodeImporter::VisitObjCAtTryStmt(ObjCAtTryStmt *S) {
5013 SourceLocation ToAtTryLoc = Importer.Import(S->getAtTryLoc());
5014 Stmt *ToAtTryStmt = Importer.Import(S->getTryBody());
5015 if (!ToAtTryStmt && S->getTryBody())
5017 SmallVector<Stmt *, 1> ToCatchStmts(S->getNumCatchStmts());
5018 for (unsigned CI = 0, CE = S->getNumCatchStmts(); CI != CE; ++CI) {
5019 ObjCAtCatchStmt *FromCatchStmt = S->getCatchStmt(CI);
5020 if (Stmt *ToCatchStmt = Importer.Import(FromCatchStmt))
5021 ToCatchStmts[CI] = ToCatchStmt;
5025 Stmt *ToAtFinallyStmt = Importer.Import(S->getFinallyStmt());
5026 if (!ToAtFinallyStmt && S->getFinallyStmt())
5028 return ObjCAtTryStmt::Create(Importer.getToContext(),
5029 ToAtTryLoc, ToAtTryStmt,
5030 ToCatchStmts.begin(), ToCatchStmts.size(),
5034 Stmt *ASTNodeImporter::VisitObjCAtSynchronizedStmt
5035 (ObjCAtSynchronizedStmt *S) {
5036 SourceLocation ToAtSynchronizedLoc =
5037 Importer.Import(S->getAtSynchronizedLoc());
5038 Expr *ToSynchExpr = Importer.Import(S->getSynchExpr());
5039 if (!ToSynchExpr && S->getSynchExpr())
5041 Stmt *ToSynchBody = Importer.Import(S->getSynchBody());
5042 if (!ToSynchBody && S->getSynchBody())
5044 return new (Importer.getToContext()) ObjCAtSynchronizedStmt(
5045 ToAtSynchronizedLoc, ToSynchExpr, ToSynchBody);
5048 Stmt *ASTNodeImporter::VisitObjCAtThrowStmt(ObjCAtThrowStmt *S) {
5049 SourceLocation ToAtThrowLoc = Importer.Import(S->getThrowLoc());
5050 Expr *ToThrow = Importer.Import(S->getThrowExpr());
5051 if (!ToThrow && S->getThrowExpr())
5053 return new (Importer.getToContext()) ObjCAtThrowStmt(ToAtThrowLoc, ToThrow);
5056 Stmt *ASTNodeImporter::VisitObjCAutoreleasePoolStmt
5057 (ObjCAutoreleasePoolStmt *S) {
5058 SourceLocation ToAtLoc = Importer.Import(S->getAtLoc());
5059 Stmt *ToSubStmt = Importer.Import(S->getSubStmt());
5060 if (!ToSubStmt && S->getSubStmt())
5062 return new (Importer.getToContext()) ObjCAutoreleasePoolStmt(ToAtLoc,
5066 //----------------------------------------------------------------------------
5067 // Import Expressions
5068 //----------------------------------------------------------------------------
5069 Expr *ASTNodeImporter::VisitExpr(Expr *E) {
5070 Importer.FromDiag(E->getLocStart(), diag::err_unsupported_ast_node)
5071 << E->getStmtClassName();
5075 Expr *ASTNodeImporter::VisitDeclRefExpr(DeclRefExpr *E) {
5076 ValueDecl *ToD = cast_or_null<ValueDecl>(Importer.Import(E->getDecl()));
5080 NamedDecl *FoundD = nullptr;
5081 if (E->getDecl() != E->getFoundDecl()) {
5082 FoundD = cast_or_null<NamedDecl>(Importer.Import(E->getFoundDecl()));
5087 QualType T = Importer.Import(E->getType());
5091 DeclRefExpr *DRE = DeclRefExpr::Create(Importer.getToContext(),
5092 Importer.Import(E->getQualifierLoc()),
5093 Importer.Import(E->getTemplateKeywordLoc()),
5095 E->refersToEnclosingVariableOrCapture(),
5096 Importer.Import(E->getLocation()),
5097 T, E->getValueKind(),
5099 /*FIXME:TemplateArgs=*/nullptr);
5100 if (E->hadMultipleCandidates())
5101 DRE->setHadMultipleCandidates(true);
5105 Expr *ASTNodeImporter::VisitIntegerLiteral(IntegerLiteral *E) {
5106 QualType T = Importer.Import(E->getType());
5110 return IntegerLiteral::Create(Importer.getToContext(),
5112 Importer.Import(E->getLocation()));
5115 Expr *ASTNodeImporter::VisitCharacterLiteral(CharacterLiteral *E) {
5116 QualType T = Importer.Import(E->getType());
5120 return new (Importer.getToContext()) CharacterLiteral(E->getValue(),
5122 Importer.Import(E->getLocation()));
5125 Expr *ASTNodeImporter::VisitParenExpr(ParenExpr *E) {
5126 Expr *SubExpr = Importer.Import(E->getSubExpr());
5130 return new (Importer.getToContext())
5131 ParenExpr(Importer.Import(E->getLParen()),
5132 Importer.Import(E->getRParen()),
5136 Expr *ASTNodeImporter::VisitUnaryOperator(UnaryOperator *E) {
5137 QualType T = Importer.Import(E->getType());
5141 Expr *SubExpr = Importer.Import(E->getSubExpr());
5145 return new (Importer.getToContext()) UnaryOperator(SubExpr, E->getOpcode(),
5146 T, E->getValueKind(),
5148 Importer.Import(E->getOperatorLoc()));
5151 Expr *ASTNodeImporter::VisitUnaryExprOrTypeTraitExpr(
5152 UnaryExprOrTypeTraitExpr *E) {
5153 QualType ResultType = Importer.Import(E->getType());
5155 if (E->isArgumentType()) {
5156 TypeSourceInfo *TInfo = Importer.Import(E->getArgumentTypeInfo());
5160 return new (Importer.getToContext()) UnaryExprOrTypeTraitExpr(E->getKind(),
5162 Importer.Import(E->getOperatorLoc()),
5163 Importer.Import(E->getRParenLoc()));
5166 Expr *SubExpr = Importer.Import(E->getArgumentExpr());
5170 return new (Importer.getToContext()) UnaryExprOrTypeTraitExpr(E->getKind(),
5171 SubExpr, ResultType,
5172 Importer.Import(E->getOperatorLoc()),
5173 Importer.Import(E->getRParenLoc()));
5176 Expr *ASTNodeImporter::VisitBinaryOperator(BinaryOperator *E) {
5177 QualType T = Importer.Import(E->getType());
5181 Expr *LHS = Importer.Import(E->getLHS());
5185 Expr *RHS = Importer.Import(E->getRHS());
5189 return new (Importer.getToContext()) BinaryOperator(LHS, RHS, E->getOpcode(),
5190 T, E->getValueKind(),
5192 Importer.Import(E->getOperatorLoc()),
5193 E->isFPContractable());
5196 Expr *ASTNodeImporter::VisitCompoundAssignOperator(CompoundAssignOperator *E) {
5197 QualType T = Importer.Import(E->getType());
5201 QualType CompLHSType = Importer.Import(E->getComputationLHSType());
5202 if (CompLHSType.isNull())
5205 QualType CompResultType = Importer.Import(E->getComputationResultType());
5206 if (CompResultType.isNull())
5209 Expr *LHS = Importer.Import(E->getLHS());
5213 Expr *RHS = Importer.Import(E->getRHS());
5217 return new (Importer.getToContext())
5218 CompoundAssignOperator(LHS, RHS, E->getOpcode(),
5219 T, E->getValueKind(),
5221 CompLHSType, CompResultType,
5222 Importer.Import(E->getOperatorLoc()),
5223 E->isFPContractable());
5226 static bool ImportCastPath(CastExpr *E, CXXCastPath &Path) {
5227 if (E->path_empty()) return false;
5229 // TODO: import cast paths
5233 Expr *ASTNodeImporter::VisitImplicitCastExpr(ImplicitCastExpr *E) {
5234 QualType T = Importer.Import(E->getType());
5238 Expr *SubExpr = Importer.Import(E->getSubExpr());
5242 CXXCastPath BasePath;
5243 if (ImportCastPath(E, BasePath))
5246 return ImplicitCastExpr::Create(Importer.getToContext(), T, E->getCastKind(),
5247 SubExpr, &BasePath, E->getValueKind());
5250 Expr *ASTNodeImporter::VisitCStyleCastExpr(CStyleCastExpr *E) {
5251 QualType T = Importer.Import(E->getType());
5255 Expr *SubExpr = Importer.Import(E->getSubExpr());
5259 TypeSourceInfo *TInfo = Importer.Import(E->getTypeInfoAsWritten());
5260 if (!TInfo && E->getTypeInfoAsWritten())
5263 CXXCastPath BasePath;
5264 if (ImportCastPath(E, BasePath))
5267 return CStyleCastExpr::Create(Importer.getToContext(), T,
5268 E->getValueKind(), E->getCastKind(),
5269 SubExpr, &BasePath, TInfo,
5270 Importer.Import(E->getLParenLoc()),
5271 Importer.Import(E->getRParenLoc()));
5274 Expr *ASTNodeImporter::VisitCXXConstructExpr(CXXConstructExpr *E) {
5275 QualType T = Importer.Import(E->getType());
5279 CXXConstructorDecl *ToCCD =
5280 dyn_cast<CXXConstructorDecl>(Importer.Import(E->getConstructor()));
5281 if (!ToCCD && E->getConstructor())
5284 size_t NumArgs = E->getNumArgs();
5285 SmallVector<Expr *, 1> ToArgs(NumArgs);
5286 ASTImporter &_Importer = Importer;
5287 std::transform(E->arg_begin(), E->arg_end(), ToArgs.begin(),
5288 [&_Importer](Expr *AE) -> Expr * {
5289 return _Importer.Import(AE);
5291 for (Expr *ToA : ToArgs) {
5296 return CXXConstructExpr::Create(Importer.getToContext(), T,
5297 Importer.Import(E->getLocation()),
5298 ToCCD, E->isElidable(),
5299 ToArgs, E->hadMultipleCandidates(),
5300 E->isListInitialization(),
5301 E->isStdInitListInitialization(),
5302 E->requiresZeroInitialization(),
5303 E->getConstructionKind(),
5304 Importer.Import(E->getParenOrBraceRange()));
5307 Expr *ASTNodeImporter::VisitMemberExpr(MemberExpr *E) {
5308 QualType T = Importer.Import(E->getType());
5312 Expr *ToBase = Importer.Import(E->getBase());
5313 if (!ToBase && E->getBase())
5316 ValueDecl *ToMember = dyn_cast<ValueDecl>(Importer.Import(E->getMemberDecl()));
5317 if (!ToMember && E->getMemberDecl())
5320 DeclAccessPair ToFoundDecl = DeclAccessPair::make(
5321 dyn_cast<NamedDecl>(Importer.Import(E->getFoundDecl().getDecl())),
5322 E->getFoundDecl().getAccess());
5324 DeclarationNameInfo ToMemberNameInfo(
5325 Importer.Import(E->getMemberNameInfo().getName()),
5326 Importer.Import(E->getMemberNameInfo().getLoc()));
5328 if (E->hasExplicitTemplateArgs()) {
5329 return nullptr; // FIXME: handle template arguments
5332 return MemberExpr::Create(Importer.getToContext(), ToBase,
5334 Importer.Import(E->getOperatorLoc()),
5335 Importer.Import(E->getQualifierLoc()),
5336 Importer.Import(E->getTemplateKeywordLoc()),
5337 ToMember, ToFoundDecl, ToMemberNameInfo,
5338 nullptr, T, E->getValueKind(),
5339 E->getObjectKind());
5342 Expr *ASTNodeImporter::VisitCallExpr(CallExpr *E) {
5343 QualType T = Importer.Import(E->getType());
5347 Expr *ToCallee = Importer.Import(E->getCallee());
5348 if (!ToCallee && E->getCallee())
5351 unsigned NumArgs = E->getNumArgs();
5353 llvm::SmallVector<Expr *, 2> ToArgs(NumArgs);
5355 for (unsigned ai = 0, ae = NumArgs; ai != ae; ++ai) {
5356 Expr *FromArg = E->getArg(ai);
5357 Expr *ToArg = Importer.Import(FromArg);
5363 Expr **ToArgs_Copied = new (Importer.getToContext())
5366 for (unsigned ai = 0, ae = NumArgs; ai != ae; ++ai)
5367 ToArgs_Copied[ai] = ToArgs[ai];
5369 return new (Importer.getToContext())
5370 CallExpr(Importer.getToContext(), ToCallee,
5371 llvm::makeArrayRef(ToArgs_Copied, NumArgs), T, E->getValueKind(),
5372 Importer.Import(E->getRParenLoc()));
5375 ASTImporter::ASTImporter(ASTContext &ToContext, FileManager &ToFileManager,
5376 ASTContext &FromContext, FileManager &FromFileManager,
5378 : ToContext(ToContext), FromContext(FromContext),
5379 ToFileManager(ToFileManager), FromFileManager(FromFileManager),
5380 Minimal(MinimalImport), LastDiagFromFrom(false)
5382 ImportedDecls[FromContext.getTranslationUnitDecl()]
5383 = ToContext.getTranslationUnitDecl();
5386 ASTImporter::~ASTImporter() { }
5388 QualType ASTImporter::Import(QualType FromT) {
5392 const Type *fromTy = FromT.getTypePtr();
5394 // Check whether we've already imported this type.
5395 llvm::DenseMap<const Type *, const Type *>::iterator Pos
5396 = ImportedTypes.find(fromTy);
5397 if (Pos != ImportedTypes.end())
5398 return ToContext.getQualifiedType(Pos->second, FromT.getLocalQualifiers());
5401 ASTNodeImporter Importer(*this);
5402 QualType ToT = Importer.Visit(fromTy);
5406 // Record the imported type.
5407 ImportedTypes[fromTy] = ToT.getTypePtr();
5409 return ToContext.getQualifiedType(ToT, FromT.getLocalQualifiers());
5412 TypeSourceInfo *ASTImporter::Import(TypeSourceInfo *FromTSI) {
5416 // FIXME: For now we just create a "trivial" type source info based
5417 // on the type and a single location. Implement a real version of this.
5418 QualType T = Import(FromTSI->getType());
5422 return ToContext.getTrivialTypeSourceInfo(T,
5423 Import(FromTSI->getTypeLoc().getLocStart()));
5426 Decl *ASTImporter::GetAlreadyImportedOrNull(Decl *FromD) {
5427 llvm::DenseMap<Decl *, Decl *>::iterator Pos = ImportedDecls.find(FromD);
5428 if (Pos != ImportedDecls.end()) {
5429 Decl *ToD = Pos->second;
5430 ASTNodeImporter(*this).ImportDefinitionIfNeeded(FromD, ToD);
5437 Decl *ASTImporter::Import(Decl *FromD) {
5441 ASTNodeImporter Importer(*this);
5443 // Check whether we've already imported this declaration.
5444 llvm::DenseMap<Decl *, Decl *>::iterator Pos = ImportedDecls.find(FromD);
5445 if (Pos != ImportedDecls.end()) {
5446 Decl *ToD = Pos->second;
5447 Importer.ImportDefinitionIfNeeded(FromD, ToD);
5452 Decl *ToD = Importer.Visit(FromD);
5456 // Record the imported declaration.
5457 ImportedDecls[FromD] = ToD;
5459 if (TagDecl *FromTag = dyn_cast<TagDecl>(FromD)) {
5460 // Keep track of anonymous tags that have an associated typedef.
5461 if (FromTag->getTypedefNameForAnonDecl())
5462 AnonTagsWithPendingTypedefs.push_back(FromTag);
5463 } else if (TypedefNameDecl *FromTypedef = dyn_cast<TypedefNameDecl>(FromD)) {
5464 // When we've finished transforming a typedef, see whether it was the
5465 // typedef for an anonymous tag.
5466 for (SmallVectorImpl<TagDecl *>::iterator
5467 FromTag = AnonTagsWithPendingTypedefs.begin(),
5468 FromTagEnd = AnonTagsWithPendingTypedefs.end();
5469 FromTag != FromTagEnd; ++FromTag) {
5470 if ((*FromTag)->getTypedefNameForAnonDecl() == FromTypedef) {
5471 if (TagDecl *ToTag = cast_or_null<TagDecl>(Import(*FromTag))) {
5472 // We found the typedef for an anonymous tag; link them.
5473 ToTag->setTypedefNameForAnonDecl(cast<TypedefNameDecl>(ToD));
5474 AnonTagsWithPendingTypedefs.erase(FromTag);
5484 DeclContext *ASTImporter::ImportContext(DeclContext *FromDC) {
5488 DeclContext *ToDC = cast_or_null<DeclContext>(Import(cast<Decl>(FromDC)));
5492 // When we're using a record/enum/Objective-C class/protocol as a context, we
5493 // need it to have a definition.
5494 if (RecordDecl *ToRecord = dyn_cast<RecordDecl>(ToDC)) {
5495 RecordDecl *FromRecord = cast<RecordDecl>(FromDC);
5496 if (ToRecord->isCompleteDefinition()) {
5498 } else if (FromRecord->isCompleteDefinition()) {
5499 ASTNodeImporter(*this).ImportDefinition(FromRecord, ToRecord,
5500 ASTNodeImporter::IDK_Basic);
5502 CompleteDecl(ToRecord);
5504 } else if (EnumDecl *ToEnum = dyn_cast<EnumDecl>(ToDC)) {
5505 EnumDecl *FromEnum = cast<EnumDecl>(FromDC);
5506 if (ToEnum->isCompleteDefinition()) {
5508 } else if (FromEnum->isCompleteDefinition()) {
5509 ASTNodeImporter(*this).ImportDefinition(FromEnum, ToEnum,
5510 ASTNodeImporter::IDK_Basic);
5512 CompleteDecl(ToEnum);
5514 } else if (ObjCInterfaceDecl *ToClass = dyn_cast<ObjCInterfaceDecl>(ToDC)) {
5515 ObjCInterfaceDecl *FromClass = cast<ObjCInterfaceDecl>(FromDC);
5516 if (ToClass->getDefinition()) {
5518 } else if (ObjCInterfaceDecl *FromDef = FromClass->getDefinition()) {
5519 ASTNodeImporter(*this).ImportDefinition(FromDef, ToClass,
5520 ASTNodeImporter::IDK_Basic);
5522 CompleteDecl(ToClass);
5524 } else if (ObjCProtocolDecl *ToProto = dyn_cast<ObjCProtocolDecl>(ToDC)) {
5525 ObjCProtocolDecl *FromProto = cast<ObjCProtocolDecl>(FromDC);
5526 if (ToProto->getDefinition()) {
5528 } else if (ObjCProtocolDecl *FromDef = FromProto->getDefinition()) {
5529 ASTNodeImporter(*this).ImportDefinition(FromDef, ToProto,
5530 ASTNodeImporter::IDK_Basic);
5532 CompleteDecl(ToProto);
5539 Expr *ASTImporter::Import(Expr *FromE) {
5543 return cast_or_null<Expr>(Import(cast<Stmt>(FromE)));
5546 Stmt *ASTImporter::Import(Stmt *FromS) {
5550 // Check whether we've already imported this declaration.
5551 llvm::DenseMap<Stmt *, Stmt *>::iterator Pos = ImportedStmts.find(FromS);
5552 if (Pos != ImportedStmts.end())
5556 ASTNodeImporter Importer(*this);
5557 Stmt *ToS = Importer.Visit(FromS);
5561 // Record the imported declaration.
5562 ImportedStmts[FromS] = ToS;
5566 NestedNameSpecifier *ASTImporter::Import(NestedNameSpecifier *FromNNS) {
5570 NestedNameSpecifier *prefix = Import(FromNNS->getPrefix());
5572 switch (FromNNS->getKind()) {
5573 case NestedNameSpecifier::Identifier:
5574 if (IdentifierInfo *II = Import(FromNNS->getAsIdentifier())) {
5575 return NestedNameSpecifier::Create(ToContext, prefix, II);
5579 case NestedNameSpecifier::Namespace:
5580 if (NamespaceDecl *NS =
5581 cast<NamespaceDecl>(Import(FromNNS->getAsNamespace()))) {
5582 return NestedNameSpecifier::Create(ToContext, prefix, NS);
5586 case NestedNameSpecifier::NamespaceAlias:
5587 if (NamespaceAliasDecl *NSAD =
5588 cast<NamespaceAliasDecl>(Import(FromNNS->getAsNamespaceAlias()))) {
5589 return NestedNameSpecifier::Create(ToContext, prefix, NSAD);
5593 case NestedNameSpecifier::Global:
5594 return NestedNameSpecifier::GlobalSpecifier(ToContext);
5596 case NestedNameSpecifier::Super:
5597 if (CXXRecordDecl *RD =
5598 cast<CXXRecordDecl>(Import(FromNNS->getAsRecordDecl()))) {
5599 return NestedNameSpecifier::SuperSpecifier(ToContext, RD);
5603 case NestedNameSpecifier::TypeSpec:
5604 case NestedNameSpecifier::TypeSpecWithTemplate: {
5605 QualType T = Import(QualType(FromNNS->getAsType(), 0u));
5607 bool bTemplate = FromNNS->getKind() ==
5608 NestedNameSpecifier::TypeSpecWithTemplate;
5609 return NestedNameSpecifier::Create(ToContext, prefix,
5610 bTemplate, T.getTypePtr());
5616 llvm_unreachable("Invalid nested name specifier kind");
5619 NestedNameSpecifierLoc ASTImporter::Import(NestedNameSpecifierLoc FromNNS) {
5620 // FIXME: Implement!
5621 return NestedNameSpecifierLoc();
5624 TemplateName ASTImporter::Import(TemplateName From) {
5625 switch (From.getKind()) {
5626 case TemplateName::Template:
5627 if (TemplateDecl *ToTemplate
5628 = cast_or_null<TemplateDecl>(Import(From.getAsTemplateDecl())))
5629 return TemplateName(ToTemplate);
5631 return TemplateName();
5633 case TemplateName::OverloadedTemplate: {
5634 OverloadedTemplateStorage *FromStorage = From.getAsOverloadedTemplate();
5635 UnresolvedSet<2> ToTemplates;
5636 for (OverloadedTemplateStorage::iterator I = FromStorage->begin(),
5637 E = FromStorage->end();
5639 if (NamedDecl *To = cast_or_null<NamedDecl>(Import(*I)))
5640 ToTemplates.addDecl(To);
5642 return TemplateName();
5644 return ToContext.getOverloadedTemplateName(ToTemplates.begin(),
5648 case TemplateName::QualifiedTemplate: {
5649 QualifiedTemplateName *QTN = From.getAsQualifiedTemplateName();
5650 NestedNameSpecifier *Qualifier = Import(QTN->getQualifier());
5652 return TemplateName();
5654 if (TemplateDecl *ToTemplate
5655 = cast_or_null<TemplateDecl>(Import(From.getAsTemplateDecl())))
5656 return ToContext.getQualifiedTemplateName(Qualifier,
5657 QTN->hasTemplateKeyword(),
5660 return TemplateName();
5663 case TemplateName::DependentTemplate: {
5664 DependentTemplateName *DTN = From.getAsDependentTemplateName();
5665 NestedNameSpecifier *Qualifier = Import(DTN->getQualifier());
5667 return TemplateName();
5669 if (DTN->isIdentifier()) {
5670 return ToContext.getDependentTemplateName(Qualifier,
5671 Import(DTN->getIdentifier()));
5674 return ToContext.getDependentTemplateName(Qualifier, DTN->getOperator());
5677 case TemplateName::SubstTemplateTemplateParm: {
5678 SubstTemplateTemplateParmStorage *subst
5679 = From.getAsSubstTemplateTemplateParm();
5680 TemplateTemplateParmDecl *param
5681 = cast_or_null<TemplateTemplateParmDecl>(Import(subst->getParameter()));
5683 return TemplateName();
5685 TemplateName replacement = Import(subst->getReplacement());
5686 if (replacement.isNull()) return TemplateName();
5688 return ToContext.getSubstTemplateTemplateParm(param, replacement);
5691 case TemplateName::SubstTemplateTemplateParmPack: {
5692 SubstTemplateTemplateParmPackStorage *SubstPack
5693 = From.getAsSubstTemplateTemplateParmPack();
5694 TemplateTemplateParmDecl *Param
5695 = cast_or_null<TemplateTemplateParmDecl>(
5696 Import(SubstPack->getParameterPack()));
5698 return TemplateName();
5700 ASTNodeImporter Importer(*this);
5701 TemplateArgument ArgPack
5702 = Importer.ImportTemplateArgument(SubstPack->getArgumentPack());
5703 if (ArgPack.isNull())
5704 return TemplateName();
5706 return ToContext.getSubstTemplateTemplateParmPack(Param, ArgPack);
5710 llvm_unreachable("Invalid template name kind");
5713 SourceLocation ASTImporter::Import(SourceLocation FromLoc) {
5714 if (FromLoc.isInvalid())
5715 return SourceLocation();
5717 SourceManager &FromSM = FromContext.getSourceManager();
5719 // For now, map everything down to its spelling location, so that we
5720 // don't have to import macro expansions.
5721 // FIXME: Import macro expansions!
5722 FromLoc = FromSM.getSpellingLoc(FromLoc);
5723 std::pair<FileID, unsigned> Decomposed = FromSM.getDecomposedLoc(FromLoc);
5724 SourceManager &ToSM = ToContext.getSourceManager();
5725 FileID ToFileID = Import(Decomposed.first);
5726 if (ToFileID.isInvalid())
5727 return SourceLocation();
5728 SourceLocation ret = ToSM.getLocForStartOfFile(ToFileID)
5729 .getLocWithOffset(Decomposed.second);
5733 SourceRange ASTImporter::Import(SourceRange FromRange) {
5734 return SourceRange(Import(FromRange.getBegin()), Import(FromRange.getEnd()));
5737 FileID ASTImporter::Import(FileID FromID) {
5738 llvm::DenseMap<FileID, FileID>::iterator Pos
5739 = ImportedFileIDs.find(FromID);
5740 if (Pos != ImportedFileIDs.end())
5743 SourceManager &FromSM = FromContext.getSourceManager();
5744 SourceManager &ToSM = ToContext.getSourceManager();
5745 const SrcMgr::SLocEntry &FromSLoc = FromSM.getSLocEntry(FromID);
5746 assert(FromSLoc.isFile() && "Cannot handle macro expansions yet");
5748 // Include location of this file.
5749 SourceLocation ToIncludeLoc = Import(FromSLoc.getFile().getIncludeLoc());
5751 // Map the FileID for to the "to" source manager.
5753 const SrcMgr::ContentCache *Cache = FromSLoc.getFile().getContentCache();
5754 if (Cache->OrigEntry && Cache->OrigEntry->getDir()) {
5755 // FIXME: We probably want to use getVirtualFile(), so we don't hit the
5757 // FIXME: We definitely want to re-use the existing MemoryBuffer, rather
5758 // than mmap the files several times.
5759 const FileEntry *Entry = ToFileManager.getFile(Cache->OrigEntry->getName());
5762 ToID = ToSM.createFileID(Entry, ToIncludeLoc,
5763 FromSLoc.getFile().getFileCharacteristic());
5765 // FIXME: We want to re-use the existing MemoryBuffer!
5766 const llvm::MemoryBuffer *
5767 FromBuf = Cache->getBuffer(FromContext.getDiagnostics(), FromSM);
5768 std::unique_ptr<llvm::MemoryBuffer> ToBuf
5769 = llvm::MemoryBuffer::getMemBufferCopy(FromBuf->getBuffer(),
5770 FromBuf->getBufferIdentifier());
5771 ToID = ToSM.createFileID(std::move(ToBuf),
5772 FromSLoc.getFile().getFileCharacteristic());
5776 ImportedFileIDs[FromID] = ToID;
5780 void ASTImporter::ImportDefinition(Decl *From) {
5781 Decl *To = Import(From);
5785 if (DeclContext *FromDC = cast<DeclContext>(From)) {
5786 ASTNodeImporter Importer(*this);
5788 if (RecordDecl *ToRecord = dyn_cast<RecordDecl>(To)) {
5789 if (!ToRecord->getDefinition()) {
5790 Importer.ImportDefinition(cast<RecordDecl>(FromDC), ToRecord,
5791 ASTNodeImporter::IDK_Everything);
5796 if (EnumDecl *ToEnum = dyn_cast<EnumDecl>(To)) {
5797 if (!ToEnum->getDefinition()) {
5798 Importer.ImportDefinition(cast<EnumDecl>(FromDC), ToEnum,
5799 ASTNodeImporter::IDK_Everything);
5804 if (ObjCInterfaceDecl *ToIFace = dyn_cast<ObjCInterfaceDecl>(To)) {
5805 if (!ToIFace->getDefinition()) {
5806 Importer.ImportDefinition(cast<ObjCInterfaceDecl>(FromDC), ToIFace,
5807 ASTNodeImporter::IDK_Everything);
5812 if (ObjCProtocolDecl *ToProto = dyn_cast<ObjCProtocolDecl>(To)) {
5813 if (!ToProto->getDefinition()) {
5814 Importer.ImportDefinition(cast<ObjCProtocolDecl>(FromDC), ToProto,
5815 ASTNodeImporter::IDK_Everything);
5820 Importer.ImportDeclContext(FromDC, true);
5824 DeclarationName ASTImporter::Import(DeclarationName FromName) {
5826 return DeclarationName();
5828 switch (FromName.getNameKind()) {
5829 case DeclarationName::Identifier:
5830 return Import(FromName.getAsIdentifierInfo());
5832 case DeclarationName::ObjCZeroArgSelector:
5833 case DeclarationName::ObjCOneArgSelector:
5834 case DeclarationName::ObjCMultiArgSelector:
5835 return Import(FromName.getObjCSelector());
5837 case DeclarationName::CXXConstructorName: {
5838 QualType T = Import(FromName.getCXXNameType());
5840 return DeclarationName();
5842 return ToContext.DeclarationNames.getCXXConstructorName(
5843 ToContext.getCanonicalType(T));
5846 case DeclarationName::CXXDestructorName: {
5847 QualType T = Import(FromName.getCXXNameType());
5849 return DeclarationName();
5851 return ToContext.DeclarationNames.getCXXDestructorName(
5852 ToContext.getCanonicalType(T));
5855 case DeclarationName::CXXConversionFunctionName: {
5856 QualType T = Import(FromName.getCXXNameType());
5858 return DeclarationName();
5860 return ToContext.DeclarationNames.getCXXConversionFunctionName(
5861 ToContext.getCanonicalType(T));
5864 case DeclarationName::CXXOperatorName:
5865 return ToContext.DeclarationNames.getCXXOperatorName(
5866 FromName.getCXXOverloadedOperator());
5868 case DeclarationName::CXXLiteralOperatorName:
5869 return ToContext.DeclarationNames.getCXXLiteralOperatorName(
5870 Import(FromName.getCXXLiteralIdentifier()));
5872 case DeclarationName::CXXUsingDirective:
5874 return DeclarationName::getUsingDirectiveName();
5877 llvm_unreachable("Invalid DeclarationName Kind!");
5880 IdentifierInfo *ASTImporter::Import(const IdentifierInfo *FromId) {
5884 return &ToContext.Idents.get(FromId->getName());
5887 Selector ASTImporter::Import(Selector FromSel) {
5888 if (FromSel.isNull())
5891 SmallVector<IdentifierInfo *, 4> Idents;
5892 Idents.push_back(Import(FromSel.getIdentifierInfoForSlot(0)));
5893 for (unsigned I = 1, N = FromSel.getNumArgs(); I < N; ++I)
5894 Idents.push_back(Import(FromSel.getIdentifierInfoForSlot(I)));
5895 return ToContext.Selectors.getSelector(FromSel.getNumArgs(), Idents.data());
5898 DeclarationName ASTImporter::HandleNameConflict(DeclarationName Name,
5902 unsigned NumDecls) {
5906 DiagnosticBuilder ASTImporter::ToDiag(SourceLocation Loc, unsigned DiagID) {
5907 if (LastDiagFromFrom)
5908 ToContext.getDiagnostics().notePriorDiagnosticFrom(
5909 FromContext.getDiagnostics());
5910 LastDiagFromFrom = false;
5911 return ToContext.getDiagnostics().Report(Loc, DiagID);
5914 DiagnosticBuilder ASTImporter::FromDiag(SourceLocation Loc, unsigned DiagID) {
5915 if (!LastDiagFromFrom)
5916 FromContext.getDiagnostics().notePriorDiagnosticFrom(
5917 ToContext.getDiagnostics());
5918 LastDiagFromFrom = true;
5919 return FromContext.getDiagnostics().Report(Loc, DiagID);
5922 void ASTImporter::CompleteDecl (Decl *D) {
5923 if (ObjCInterfaceDecl *ID = dyn_cast<ObjCInterfaceDecl>(D)) {
5924 if (!ID->getDefinition())
5925 ID->startDefinition();
5927 else if (ObjCProtocolDecl *PD = dyn_cast<ObjCProtocolDecl>(D)) {
5928 if (!PD->getDefinition())
5929 PD->startDefinition();
5931 else if (TagDecl *TD = dyn_cast<TagDecl>(D)) {
5932 if (!TD->getDefinition() && !TD->isBeingDefined()) {
5933 TD->startDefinition();
5934 TD->setCompleteDefinition(true);
5938 assert (0 && "CompleteDecl called on a Decl that can't be completed");
5942 Decl *ASTImporter::Imported(Decl *From, Decl *To) {
5943 ImportedDecls[From] = To;
5947 bool ASTImporter::IsStructurallyEquivalent(QualType From, QualType To,
5949 llvm::DenseMap<const Type *, const Type *>::iterator Pos
5950 = ImportedTypes.find(From.getTypePtr());
5951 if (Pos != ImportedTypes.end() && ToContext.hasSameType(Import(From), To))
5954 StructuralEquivalenceContext Ctx(FromContext, ToContext, NonEquivalentDecls,
5956 return Ctx.IsStructurallyEquivalent(From, To);