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.NeedOverloadResolutionForMoveConstructor
2028 = FromData.NeedOverloadResolutionForMoveConstructor;
2029 ToData.NeedOverloadResolutionForMoveAssignment
2030 = FromData.NeedOverloadResolutionForMoveAssignment;
2031 ToData.NeedOverloadResolutionForDestructor
2032 = FromData.NeedOverloadResolutionForDestructor;
2033 ToData.DefaultedMoveConstructorIsDeleted
2034 = FromData.DefaultedMoveConstructorIsDeleted;
2035 ToData.DefaultedMoveAssignmentIsDeleted
2036 = FromData.DefaultedMoveAssignmentIsDeleted;
2037 ToData.DefaultedDestructorIsDeleted = FromData.DefaultedDestructorIsDeleted;
2038 ToData.HasTrivialSpecialMembers = FromData.HasTrivialSpecialMembers;
2039 ToData.HasIrrelevantDestructor = FromData.HasIrrelevantDestructor;
2040 ToData.HasConstexprNonCopyMoveConstructor
2041 = FromData.HasConstexprNonCopyMoveConstructor;
2042 ToData.DefaultedDefaultConstructorIsConstexpr
2043 = FromData.DefaultedDefaultConstructorIsConstexpr;
2044 ToData.HasConstexprDefaultConstructor
2045 = FromData.HasConstexprDefaultConstructor;
2046 ToData.HasNonLiteralTypeFieldsOrBases
2047 = FromData.HasNonLiteralTypeFieldsOrBases;
2048 // ComputedVisibleConversions not imported.
2049 ToData.UserProvidedDefaultConstructor
2050 = FromData.UserProvidedDefaultConstructor;
2051 ToData.DeclaredSpecialMembers = FromData.DeclaredSpecialMembers;
2052 ToData.ImplicitCopyConstructorHasConstParam
2053 = FromData.ImplicitCopyConstructorHasConstParam;
2054 ToData.ImplicitCopyAssignmentHasConstParam
2055 = FromData.ImplicitCopyAssignmentHasConstParam;
2056 ToData.HasDeclaredCopyConstructorWithConstParam
2057 = FromData.HasDeclaredCopyConstructorWithConstParam;
2058 ToData.HasDeclaredCopyAssignmentWithConstParam
2059 = FromData.HasDeclaredCopyAssignmentWithConstParam;
2060 ToData.IsLambda = FromData.IsLambda;
2062 SmallVector<CXXBaseSpecifier *, 4> Bases;
2063 for (const auto &Base1 : FromCXX->bases()) {
2064 QualType T = Importer.Import(Base1.getType());
2068 SourceLocation EllipsisLoc;
2069 if (Base1.isPackExpansion())
2070 EllipsisLoc = Importer.Import(Base1.getEllipsisLoc());
2072 // Ensure that we have a definition for the base.
2073 ImportDefinitionIfNeeded(Base1.getType()->getAsCXXRecordDecl());
2076 new (Importer.getToContext())
2077 CXXBaseSpecifier(Importer.Import(Base1.getSourceRange()),
2079 Base1.isBaseOfClass(),
2080 Base1.getAccessSpecifierAsWritten(),
2081 Importer.Import(Base1.getTypeSourceInfo()),
2085 ToCXX->setBases(Bases.data(), Bases.size());
2088 if (shouldForceImportDeclContext(Kind))
2089 ImportDeclContext(From, /*ForceImport=*/true);
2091 To->completeDefinition();
2095 bool ASTNodeImporter::ImportDefinition(VarDecl *From, VarDecl *To,
2096 ImportDefinitionKind Kind) {
2097 if (To->getAnyInitializer())
2100 // FIXME: Can we really import any initializer? Alternatively, we could force
2101 // ourselves to import every declaration of a variable and then only use
2103 To->setInit(Importer.Import(const_cast<Expr *>(From->getAnyInitializer())));
2105 // FIXME: Other bits to merge?
2110 bool ASTNodeImporter::ImportDefinition(EnumDecl *From, EnumDecl *To,
2111 ImportDefinitionKind Kind) {
2112 if (To->getDefinition() || To->isBeingDefined()) {
2113 if (Kind == IDK_Everything)
2114 ImportDeclContext(From, /*ForceImport=*/true);
2118 To->startDefinition();
2120 QualType T = Importer.Import(Importer.getFromContext().getTypeDeclType(From));
2124 QualType ToPromotionType = Importer.Import(From->getPromotionType());
2125 if (ToPromotionType.isNull())
2128 if (shouldForceImportDeclContext(Kind))
2129 ImportDeclContext(From, /*ForceImport=*/true);
2131 // FIXME: we might need to merge the number of positive or negative bits
2132 // if the enumerator lists don't match.
2133 To->completeDefinition(T, ToPromotionType,
2134 From->getNumPositiveBits(),
2135 From->getNumNegativeBits());
2139 TemplateParameterList *ASTNodeImporter::ImportTemplateParameterList(
2140 TemplateParameterList *Params) {
2141 SmallVector<NamedDecl *, 4> ToParams;
2142 ToParams.reserve(Params->size());
2143 for (TemplateParameterList::iterator P = Params->begin(),
2144 PEnd = Params->end();
2146 Decl *To = Importer.Import(*P);
2150 ToParams.push_back(cast<NamedDecl>(To));
2153 return TemplateParameterList::Create(Importer.getToContext(),
2154 Importer.Import(Params->getTemplateLoc()),
2155 Importer.Import(Params->getLAngleLoc()),
2157 Importer.Import(Params->getRAngleLoc()));
2161 ASTNodeImporter::ImportTemplateArgument(const TemplateArgument &From) {
2162 switch (From.getKind()) {
2163 case TemplateArgument::Null:
2164 return TemplateArgument();
2166 case TemplateArgument::Type: {
2167 QualType ToType = Importer.Import(From.getAsType());
2168 if (ToType.isNull())
2169 return TemplateArgument();
2170 return TemplateArgument(ToType);
2173 case TemplateArgument::Integral: {
2174 QualType ToType = Importer.Import(From.getIntegralType());
2175 if (ToType.isNull())
2176 return TemplateArgument();
2177 return TemplateArgument(From, ToType);
2180 case TemplateArgument::Declaration: {
2181 ValueDecl *To = cast_or_null<ValueDecl>(Importer.Import(From.getAsDecl()));
2182 QualType ToType = Importer.Import(From.getParamTypeForDecl());
2183 if (!To || ToType.isNull())
2184 return TemplateArgument();
2185 return TemplateArgument(To, ToType);
2188 case TemplateArgument::NullPtr: {
2189 QualType ToType = Importer.Import(From.getNullPtrType());
2190 if (ToType.isNull())
2191 return TemplateArgument();
2192 return TemplateArgument(ToType, /*isNullPtr*/true);
2195 case TemplateArgument::Template: {
2196 TemplateName ToTemplate = Importer.Import(From.getAsTemplate());
2197 if (ToTemplate.isNull())
2198 return TemplateArgument();
2200 return TemplateArgument(ToTemplate);
2203 case TemplateArgument::TemplateExpansion: {
2204 TemplateName ToTemplate
2205 = Importer.Import(From.getAsTemplateOrTemplatePattern());
2206 if (ToTemplate.isNull())
2207 return TemplateArgument();
2209 return TemplateArgument(ToTemplate, From.getNumTemplateExpansions());
2212 case TemplateArgument::Expression:
2213 if (Expr *ToExpr = Importer.Import(From.getAsExpr()))
2214 return TemplateArgument(ToExpr);
2215 return TemplateArgument();
2217 case TemplateArgument::Pack: {
2218 SmallVector<TemplateArgument, 2> ToPack;
2219 ToPack.reserve(From.pack_size());
2220 if (ImportTemplateArguments(From.pack_begin(), From.pack_size(), ToPack))
2221 return TemplateArgument();
2223 return TemplateArgument(
2224 llvm::makeArrayRef(ToPack).copy(Importer.getToContext()));
2228 llvm_unreachable("Invalid template argument kind");
2231 bool ASTNodeImporter::ImportTemplateArguments(const TemplateArgument *FromArgs,
2232 unsigned NumFromArgs,
2233 SmallVectorImpl<TemplateArgument> &ToArgs) {
2234 for (unsigned I = 0; I != NumFromArgs; ++I) {
2235 TemplateArgument To = ImportTemplateArgument(FromArgs[I]);
2236 if (To.isNull() && !FromArgs[I].isNull())
2239 ToArgs.push_back(To);
2245 bool ASTNodeImporter::IsStructuralMatch(RecordDecl *FromRecord,
2246 RecordDecl *ToRecord, bool Complain) {
2247 // Eliminate a potential failure point where we attempt to re-import
2248 // something we're trying to import while completing ToRecord.
2249 Decl *ToOrigin = Importer.GetOriginalDecl(ToRecord);
2251 RecordDecl *ToOriginRecord = dyn_cast<RecordDecl>(ToOrigin);
2253 ToRecord = ToOriginRecord;
2256 StructuralEquivalenceContext Ctx(Importer.getFromContext(),
2257 ToRecord->getASTContext(),
2258 Importer.getNonEquivalentDecls(),
2260 return Ctx.IsStructurallyEquivalent(FromRecord, ToRecord);
2263 bool ASTNodeImporter::IsStructuralMatch(VarDecl *FromVar, VarDecl *ToVar,
2265 StructuralEquivalenceContext Ctx(
2266 Importer.getFromContext(), Importer.getToContext(),
2267 Importer.getNonEquivalentDecls(), false, Complain);
2268 return Ctx.IsStructurallyEquivalent(FromVar, ToVar);
2271 bool ASTNodeImporter::IsStructuralMatch(EnumDecl *FromEnum, EnumDecl *ToEnum) {
2272 StructuralEquivalenceContext Ctx(Importer.getFromContext(),
2273 Importer.getToContext(),
2274 Importer.getNonEquivalentDecls());
2275 return Ctx.IsStructurallyEquivalent(FromEnum, ToEnum);
2278 bool ASTNodeImporter::IsStructuralMatch(EnumConstantDecl *FromEC,
2279 EnumConstantDecl *ToEC)
2281 const llvm::APSInt &FromVal = FromEC->getInitVal();
2282 const llvm::APSInt &ToVal = ToEC->getInitVal();
2284 return FromVal.isSigned() == ToVal.isSigned() &&
2285 FromVal.getBitWidth() == ToVal.getBitWidth() &&
2289 bool ASTNodeImporter::IsStructuralMatch(ClassTemplateDecl *From,
2290 ClassTemplateDecl *To) {
2291 StructuralEquivalenceContext Ctx(Importer.getFromContext(),
2292 Importer.getToContext(),
2293 Importer.getNonEquivalentDecls());
2294 return Ctx.IsStructurallyEquivalent(From, To);
2297 bool ASTNodeImporter::IsStructuralMatch(VarTemplateDecl *From,
2298 VarTemplateDecl *To) {
2299 StructuralEquivalenceContext Ctx(Importer.getFromContext(),
2300 Importer.getToContext(),
2301 Importer.getNonEquivalentDecls());
2302 return Ctx.IsStructurallyEquivalent(From, To);
2305 Decl *ASTNodeImporter::VisitDecl(Decl *D) {
2306 Importer.FromDiag(D->getLocation(), diag::err_unsupported_ast_node)
2307 << D->getDeclKindName();
2311 Decl *ASTNodeImporter::VisitTranslationUnitDecl(TranslationUnitDecl *D) {
2312 TranslationUnitDecl *ToD =
2313 Importer.getToContext().getTranslationUnitDecl();
2315 Importer.Imported(D, ToD);
2320 Decl *ASTNodeImporter::VisitAccessSpecDecl(AccessSpecDecl *D) {
2322 SourceLocation Loc = Importer.Import(D->getLocation());
2323 SourceLocation ColonLoc = Importer.Import(D->getColonLoc());
2325 // Import the context of this declaration.
2326 DeclContext *DC = Importer.ImportContext(D->getDeclContext());
2330 AccessSpecDecl *accessSpecDecl
2331 = AccessSpecDecl::Create(Importer.getToContext(), D->getAccess(),
2334 if (!accessSpecDecl)
2337 // Lexical DeclContext and Semantic DeclContext
2338 // is always the same for the accessSpec.
2339 accessSpecDecl->setLexicalDeclContext(DC);
2340 DC->addDeclInternal(accessSpecDecl);
2342 return accessSpecDecl;
2345 Decl *ASTNodeImporter::VisitNamespaceDecl(NamespaceDecl *D) {
2346 // Import the major distinguishing characteristics of this namespace.
2347 DeclContext *DC, *LexicalDC;
2348 DeclarationName Name;
2351 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
2356 NamespaceDecl *MergeWithNamespace = nullptr;
2358 // This is an anonymous namespace. Adopt an existing anonymous
2359 // namespace if we can.
2360 // FIXME: Not testable.
2361 if (TranslationUnitDecl *TU = dyn_cast<TranslationUnitDecl>(DC))
2362 MergeWithNamespace = TU->getAnonymousNamespace();
2364 MergeWithNamespace = cast<NamespaceDecl>(DC)->getAnonymousNamespace();
2366 SmallVector<NamedDecl *, 4> ConflictingDecls;
2367 SmallVector<NamedDecl *, 2> FoundDecls;
2368 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls);
2369 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
2370 if (!FoundDecls[I]->isInIdentifierNamespace(Decl::IDNS_Namespace))
2373 if (NamespaceDecl *FoundNS = dyn_cast<NamespaceDecl>(FoundDecls[I])) {
2374 MergeWithNamespace = FoundNS;
2375 ConflictingDecls.clear();
2379 ConflictingDecls.push_back(FoundDecls[I]);
2382 if (!ConflictingDecls.empty()) {
2383 Name = Importer.HandleNameConflict(Name, DC, Decl::IDNS_Namespace,
2384 ConflictingDecls.data(),
2385 ConflictingDecls.size());
2389 // Create the "to" namespace, if needed.
2390 NamespaceDecl *ToNamespace = MergeWithNamespace;
2392 ToNamespace = NamespaceDecl::Create(Importer.getToContext(), DC,
2394 Importer.Import(D->getLocStart()),
2395 Loc, Name.getAsIdentifierInfo(),
2396 /*PrevDecl=*/nullptr);
2397 ToNamespace->setLexicalDeclContext(LexicalDC);
2398 LexicalDC->addDeclInternal(ToNamespace);
2400 // If this is an anonymous namespace, register it as the anonymous
2401 // namespace within its context.
2403 if (TranslationUnitDecl *TU = dyn_cast<TranslationUnitDecl>(DC))
2404 TU->setAnonymousNamespace(ToNamespace);
2406 cast<NamespaceDecl>(DC)->setAnonymousNamespace(ToNamespace);
2409 Importer.Imported(D, ToNamespace);
2411 ImportDeclContext(D);
2416 Decl *ASTNodeImporter::VisitTypedefNameDecl(TypedefNameDecl *D, bool IsAlias) {
2417 // Import the major distinguishing characteristics of this typedef.
2418 DeclContext *DC, *LexicalDC;
2419 DeclarationName Name;
2422 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
2427 // If this typedef is not in block scope, determine whether we've
2428 // seen a typedef with the same name (that we can merge with) or any
2429 // other entity by that name (which name lookup could conflict with).
2430 if (!DC->isFunctionOrMethod()) {
2431 SmallVector<NamedDecl *, 4> ConflictingDecls;
2432 unsigned IDNS = Decl::IDNS_Ordinary;
2433 SmallVector<NamedDecl *, 2> FoundDecls;
2434 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls);
2435 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
2436 if (!FoundDecls[I]->isInIdentifierNamespace(IDNS))
2438 if (TypedefNameDecl *FoundTypedef =
2439 dyn_cast<TypedefNameDecl>(FoundDecls[I])) {
2440 if (Importer.IsStructurallyEquivalent(D->getUnderlyingType(),
2441 FoundTypedef->getUnderlyingType()))
2442 return Importer.Imported(D, FoundTypedef);
2445 ConflictingDecls.push_back(FoundDecls[I]);
2448 if (!ConflictingDecls.empty()) {
2449 Name = Importer.HandleNameConflict(Name, DC, IDNS,
2450 ConflictingDecls.data(),
2451 ConflictingDecls.size());
2457 // Import the underlying type of this typedef;
2458 QualType T = Importer.Import(D->getUnderlyingType());
2462 // Create the new typedef node.
2463 TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo());
2464 SourceLocation StartL = Importer.Import(D->getLocStart());
2465 TypedefNameDecl *ToTypedef;
2467 ToTypedef = TypeAliasDecl::Create(Importer.getToContext(), DC,
2469 Name.getAsIdentifierInfo(),
2472 ToTypedef = TypedefDecl::Create(Importer.getToContext(), DC,
2474 Name.getAsIdentifierInfo(),
2477 ToTypedef->setAccess(D->getAccess());
2478 ToTypedef->setLexicalDeclContext(LexicalDC);
2479 Importer.Imported(D, ToTypedef);
2480 LexicalDC->addDeclInternal(ToTypedef);
2485 Decl *ASTNodeImporter::VisitTypedefDecl(TypedefDecl *D) {
2486 return VisitTypedefNameDecl(D, /*IsAlias=*/false);
2489 Decl *ASTNodeImporter::VisitTypeAliasDecl(TypeAliasDecl *D) {
2490 return VisitTypedefNameDecl(D, /*IsAlias=*/true);
2493 Decl *ASTNodeImporter::VisitEnumDecl(EnumDecl *D) {
2494 // Import the major distinguishing characteristics of this enum.
2495 DeclContext *DC, *LexicalDC;
2496 DeclarationName Name;
2499 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
2504 // Figure out what enum name we're looking for.
2505 unsigned IDNS = Decl::IDNS_Tag;
2506 DeclarationName SearchName = Name;
2507 if (!SearchName && D->getTypedefNameForAnonDecl()) {
2508 SearchName = Importer.Import(D->getTypedefNameForAnonDecl()->getDeclName());
2509 IDNS = Decl::IDNS_Ordinary;
2510 } else if (Importer.getToContext().getLangOpts().CPlusPlus)
2511 IDNS |= Decl::IDNS_Ordinary;
2513 // We may already have an enum of the same name; try to find and match it.
2514 if (!DC->isFunctionOrMethod() && SearchName) {
2515 SmallVector<NamedDecl *, 4> ConflictingDecls;
2516 SmallVector<NamedDecl *, 2> FoundDecls;
2517 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls);
2518 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
2519 if (!FoundDecls[I]->isInIdentifierNamespace(IDNS))
2522 Decl *Found = FoundDecls[I];
2523 if (TypedefNameDecl *Typedef = dyn_cast<TypedefNameDecl>(Found)) {
2524 if (const TagType *Tag = Typedef->getUnderlyingType()->getAs<TagType>())
2525 Found = Tag->getDecl();
2528 if (EnumDecl *FoundEnum = dyn_cast<EnumDecl>(Found)) {
2529 if (IsStructuralMatch(D, FoundEnum))
2530 return Importer.Imported(D, FoundEnum);
2533 ConflictingDecls.push_back(FoundDecls[I]);
2536 if (!ConflictingDecls.empty()) {
2537 Name = Importer.HandleNameConflict(Name, DC, IDNS,
2538 ConflictingDecls.data(),
2539 ConflictingDecls.size());
2543 // Create the enum declaration.
2544 EnumDecl *D2 = EnumDecl::Create(Importer.getToContext(), DC,
2545 Importer.Import(D->getLocStart()),
2546 Loc, Name.getAsIdentifierInfo(), nullptr,
2547 D->isScoped(), D->isScopedUsingClassTag(),
2549 // Import the qualifier, if any.
2550 D2->setQualifierInfo(Importer.Import(D->getQualifierLoc()));
2551 D2->setAccess(D->getAccess());
2552 D2->setLexicalDeclContext(LexicalDC);
2553 Importer.Imported(D, D2);
2554 LexicalDC->addDeclInternal(D2);
2556 // Import the integer type.
2557 QualType ToIntegerType = Importer.Import(D->getIntegerType());
2558 if (ToIntegerType.isNull())
2560 D2->setIntegerType(ToIntegerType);
2562 // Import the definition
2563 if (D->isCompleteDefinition() && ImportDefinition(D, D2))
2569 Decl *ASTNodeImporter::VisitRecordDecl(RecordDecl *D) {
2570 // If this record has a definition in the translation unit we're coming from,
2571 // but this particular declaration is not that definition, import the
2572 // definition and map to that.
2573 TagDecl *Definition = D->getDefinition();
2574 if (Definition && Definition != D) {
2575 Decl *ImportedDef = Importer.Import(Definition);
2579 return Importer.Imported(D, ImportedDef);
2582 // Import the major distinguishing characteristics of this record.
2583 DeclContext *DC, *LexicalDC;
2584 DeclarationName Name;
2587 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
2592 // Figure out what structure name we're looking for.
2593 unsigned IDNS = Decl::IDNS_Tag;
2594 DeclarationName SearchName = Name;
2595 if (!SearchName && D->getTypedefNameForAnonDecl()) {
2596 SearchName = Importer.Import(D->getTypedefNameForAnonDecl()->getDeclName());
2597 IDNS = Decl::IDNS_Ordinary;
2598 } else if (Importer.getToContext().getLangOpts().CPlusPlus)
2599 IDNS |= Decl::IDNS_Ordinary;
2601 // We may already have a record of the same name; try to find and match it.
2602 RecordDecl *AdoptDecl = nullptr;
2603 if (!DC->isFunctionOrMethod()) {
2604 SmallVector<NamedDecl *, 4> ConflictingDecls;
2605 SmallVector<NamedDecl *, 2> FoundDecls;
2606 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls);
2607 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
2608 if (!FoundDecls[I]->isInIdentifierNamespace(IDNS))
2611 Decl *Found = FoundDecls[I];
2612 if (TypedefNameDecl *Typedef = dyn_cast<TypedefNameDecl>(Found)) {
2613 if (const TagType *Tag = Typedef->getUnderlyingType()->getAs<TagType>())
2614 Found = Tag->getDecl();
2617 if (RecordDecl *FoundRecord = dyn_cast<RecordDecl>(Found)) {
2618 if (D->isAnonymousStructOrUnion() &&
2619 FoundRecord->isAnonymousStructOrUnion()) {
2620 // If both anonymous structs/unions are in a record context, make sure
2621 // they occur in the same location in the context records.
2622 if (Optional<unsigned> Index1
2623 = findAnonymousStructOrUnionIndex(D)) {
2624 if (Optional<unsigned> Index2 =
2625 findAnonymousStructOrUnionIndex(FoundRecord)) {
2626 if (*Index1 != *Index2)
2632 if (RecordDecl *FoundDef = FoundRecord->getDefinition()) {
2633 if ((SearchName && !D->isCompleteDefinition())
2634 || (D->isCompleteDefinition() &&
2635 D->isAnonymousStructOrUnion()
2636 == FoundDef->isAnonymousStructOrUnion() &&
2637 IsStructuralMatch(D, FoundDef))) {
2638 // The record types structurally match, or the "from" translation
2639 // unit only had a forward declaration anyway; call it the same
2641 // FIXME: For C++, we should also merge methods here.
2642 return Importer.Imported(D, FoundDef);
2644 } else if (!D->isCompleteDefinition()) {
2645 // We have a forward declaration of this type, so adopt that forward
2646 // declaration rather than building a new one.
2648 // If one or both can be completed from external storage then try one
2649 // last time to complete and compare them before doing this.
2651 if (FoundRecord->hasExternalLexicalStorage() &&
2652 !FoundRecord->isCompleteDefinition())
2653 FoundRecord->getASTContext().getExternalSource()->CompleteType(FoundRecord);
2654 if (D->hasExternalLexicalStorage())
2655 D->getASTContext().getExternalSource()->CompleteType(D);
2657 if (FoundRecord->isCompleteDefinition() &&
2658 D->isCompleteDefinition() &&
2659 !IsStructuralMatch(D, FoundRecord))
2662 AdoptDecl = FoundRecord;
2664 } else if (!SearchName) {
2669 ConflictingDecls.push_back(FoundDecls[I]);
2672 if (!ConflictingDecls.empty() && SearchName) {
2673 Name = Importer.HandleNameConflict(Name, DC, IDNS,
2674 ConflictingDecls.data(),
2675 ConflictingDecls.size());
2679 // Create the record declaration.
2680 RecordDecl *D2 = AdoptDecl;
2681 SourceLocation StartLoc = Importer.Import(D->getLocStart());
2683 if (isa<CXXRecordDecl>(D)) {
2684 CXXRecordDecl *D2CXX = CXXRecordDecl::Create(Importer.getToContext(),
2687 Name.getAsIdentifierInfo());
2689 D2->setAccess(D->getAccess());
2691 D2 = RecordDecl::Create(Importer.getToContext(), D->getTagKind(),
2692 DC, StartLoc, Loc, Name.getAsIdentifierInfo());
2695 D2->setQualifierInfo(Importer.Import(D->getQualifierLoc()));
2696 D2->setLexicalDeclContext(LexicalDC);
2697 LexicalDC->addDeclInternal(D2);
2698 if (D->isAnonymousStructOrUnion())
2699 D2->setAnonymousStructOrUnion(true);
2702 Importer.Imported(D, D2);
2704 if (D->isCompleteDefinition() && ImportDefinition(D, D2, IDK_Default))
2710 Decl *ASTNodeImporter::VisitEnumConstantDecl(EnumConstantDecl *D) {
2711 // Import the major distinguishing characteristics of this enumerator.
2712 DeclContext *DC, *LexicalDC;
2713 DeclarationName Name;
2716 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
2721 QualType T = Importer.Import(D->getType());
2725 // Determine whether there are any other declarations with the same name and
2726 // in the same context.
2727 if (!LexicalDC->isFunctionOrMethod()) {
2728 SmallVector<NamedDecl *, 4> ConflictingDecls;
2729 unsigned IDNS = Decl::IDNS_Ordinary;
2730 SmallVector<NamedDecl *, 2> FoundDecls;
2731 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls);
2732 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
2733 if (!FoundDecls[I]->isInIdentifierNamespace(IDNS))
2736 if (EnumConstantDecl *FoundEnumConstant
2737 = dyn_cast<EnumConstantDecl>(FoundDecls[I])) {
2738 if (IsStructuralMatch(D, FoundEnumConstant))
2739 return Importer.Imported(D, FoundEnumConstant);
2742 ConflictingDecls.push_back(FoundDecls[I]);
2745 if (!ConflictingDecls.empty()) {
2746 Name = Importer.HandleNameConflict(Name, DC, IDNS,
2747 ConflictingDecls.data(),
2748 ConflictingDecls.size());
2754 Expr *Init = Importer.Import(D->getInitExpr());
2755 if (D->getInitExpr() && !Init)
2758 EnumConstantDecl *ToEnumerator
2759 = EnumConstantDecl::Create(Importer.getToContext(), cast<EnumDecl>(DC), Loc,
2760 Name.getAsIdentifierInfo(), T,
2761 Init, D->getInitVal());
2762 ToEnumerator->setAccess(D->getAccess());
2763 ToEnumerator->setLexicalDeclContext(LexicalDC);
2764 Importer.Imported(D, ToEnumerator);
2765 LexicalDC->addDeclInternal(ToEnumerator);
2766 return ToEnumerator;
2769 Decl *ASTNodeImporter::VisitFunctionDecl(FunctionDecl *D) {
2770 // Import the major distinguishing characteristics of this function.
2771 DeclContext *DC, *LexicalDC;
2772 DeclarationName Name;
2775 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
2780 // Try to find a function in our own ("to") context with the same name, same
2781 // type, and in the same context as the function we're importing.
2782 if (!LexicalDC->isFunctionOrMethod()) {
2783 SmallVector<NamedDecl *, 4> ConflictingDecls;
2784 unsigned IDNS = Decl::IDNS_Ordinary;
2785 SmallVector<NamedDecl *, 2> FoundDecls;
2786 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls);
2787 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
2788 if (!FoundDecls[I]->isInIdentifierNamespace(IDNS))
2791 if (FunctionDecl *FoundFunction = dyn_cast<FunctionDecl>(FoundDecls[I])) {
2792 if (FoundFunction->hasExternalFormalLinkage() &&
2793 D->hasExternalFormalLinkage()) {
2794 if (Importer.IsStructurallyEquivalent(D->getType(),
2795 FoundFunction->getType())) {
2796 // FIXME: Actually try to merge the body and other attributes.
2797 return Importer.Imported(D, FoundFunction);
2800 // FIXME: Check for overloading more carefully, e.g., by boosting
2801 // Sema::IsOverload out to the AST library.
2803 // Function overloading is okay in C++.
2804 if (Importer.getToContext().getLangOpts().CPlusPlus)
2807 // Complain about inconsistent function types.
2808 Importer.ToDiag(Loc, diag::err_odr_function_type_inconsistent)
2809 << Name << D->getType() << FoundFunction->getType();
2810 Importer.ToDiag(FoundFunction->getLocation(),
2811 diag::note_odr_value_here)
2812 << FoundFunction->getType();
2816 ConflictingDecls.push_back(FoundDecls[I]);
2819 if (!ConflictingDecls.empty()) {
2820 Name = Importer.HandleNameConflict(Name, DC, IDNS,
2821 ConflictingDecls.data(),
2822 ConflictingDecls.size());
2828 DeclarationNameInfo NameInfo(Name, Loc);
2829 // Import additional name location/type info.
2830 ImportDeclarationNameLoc(D->getNameInfo(), NameInfo);
2832 QualType FromTy = D->getType();
2833 bool usedDifferentExceptionSpec = false;
2835 if (const FunctionProtoType *
2836 FromFPT = D->getType()->getAs<FunctionProtoType>()) {
2837 FunctionProtoType::ExtProtoInfo FromEPI = FromFPT->getExtProtoInfo();
2838 // FunctionProtoType::ExtProtoInfo's ExceptionSpecDecl can point to the
2839 // FunctionDecl that we are importing the FunctionProtoType for.
2840 // To avoid an infinite recursion when importing, create the FunctionDecl
2841 // with a simplified function type and update it afterwards.
2842 if (FromEPI.ExceptionSpec.SourceDecl ||
2843 FromEPI.ExceptionSpec.SourceTemplate ||
2844 FromEPI.ExceptionSpec.NoexceptExpr) {
2845 FunctionProtoType::ExtProtoInfo DefaultEPI;
2846 FromTy = Importer.getFromContext().getFunctionType(
2847 FromFPT->getReturnType(), FromFPT->getParamTypes(), DefaultEPI);
2848 usedDifferentExceptionSpec = true;
2853 QualType T = Importer.Import(FromTy);
2857 // Import the function parameters.
2858 SmallVector<ParmVarDecl *, 8> Parameters;
2859 for (auto P : D->params()) {
2860 ParmVarDecl *ToP = cast_or_null<ParmVarDecl>(Importer.Import(P));
2864 Parameters.push_back(ToP);
2867 // Create the imported function.
2868 TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo());
2869 FunctionDecl *ToFunction = nullptr;
2870 SourceLocation InnerLocStart = Importer.Import(D->getInnerLocStart());
2871 if (CXXConstructorDecl *FromConstructor = dyn_cast<CXXConstructorDecl>(D)) {
2872 ToFunction = CXXConstructorDecl::Create(Importer.getToContext(),
2873 cast<CXXRecordDecl>(DC),
2876 FromConstructor->isExplicit(),
2877 D->isInlineSpecified(),
2880 } else if (isa<CXXDestructorDecl>(D)) {
2881 ToFunction = CXXDestructorDecl::Create(Importer.getToContext(),
2882 cast<CXXRecordDecl>(DC),
2885 D->isInlineSpecified(),
2887 } else if (CXXConversionDecl *FromConversion
2888 = dyn_cast<CXXConversionDecl>(D)) {
2889 ToFunction = CXXConversionDecl::Create(Importer.getToContext(),
2890 cast<CXXRecordDecl>(DC),
2893 D->isInlineSpecified(),
2894 FromConversion->isExplicit(),
2896 Importer.Import(D->getLocEnd()));
2897 } else if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(D)) {
2898 ToFunction = CXXMethodDecl::Create(Importer.getToContext(),
2899 cast<CXXRecordDecl>(DC),
2902 Method->getStorageClass(),
2903 Method->isInlineSpecified(),
2905 Importer.Import(D->getLocEnd()));
2907 ToFunction = FunctionDecl::Create(Importer.getToContext(), DC,
2909 NameInfo, T, TInfo, D->getStorageClass(),
2910 D->isInlineSpecified(),
2911 D->hasWrittenPrototype(),
2915 // Import the qualifier, if any.
2916 ToFunction->setQualifierInfo(Importer.Import(D->getQualifierLoc()));
2917 ToFunction->setAccess(D->getAccess());
2918 ToFunction->setLexicalDeclContext(LexicalDC);
2919 ToFunction->setVirtualAsWritten(D->isVirtualAsWritten());
2920 ToFunction->setTrivial(D->isTrivial());
2921 ToFunction->setPure(D->isPure());
2922 Importer.Imported(D, ToFunction);
2924 // Set the parameters.
2925 for (unsigned I = 0, N = Parameters.size(); I != N; ++I) {
2926 Parameters[I]->setOwningFunction(ToFunction);
2927 ToFunction->addDeclInternal(Parameters[I]);
2929 ToFunction->setParams(Parameters);
2931 if (usedDifferentExceptionSpec) {
2932 // Update FunctionProtoType::ExtProtoInfo.
2933 QualType T = Importer.Import(D->getType());
2936 ToFunction->setType(T);
2939 // Import the body, if any.
2940 if (Stmt *FromBody = D->getBody()) {
2941 if (Stmt *ToBody = Importer.Import(FromBody)) {
2942 ToFunction->setBody(ToBody);
2946 // FIXME: Other bits to merge?
2948 // Add this function to the lexical context.
2949 LexicalDC->addDeclInternal(ToFunction);
2954 Decl *ASTNodeImporter::VisitCXXMethodDecl(CXXMethodDecl *D) {
2955 return VisitFunctionDecl(D);
2958 Decl *ASTNodeImporter::VisitCXXConstructorDecl(CXXConstructorDecl *D) {
2959 return VisitCXXMethodDecl(D);
2962 Decl *ASTNodeImporter::VisitCXXDestructorDecl(CXXDestructorDecl *D) {
2963 return VisitCXXMethodDecl(D);
2966 Decl *ASTNodeImporter::VisitCXXConversionDecl(CXXConversionDecl *D) {
2967 return VisitCXXMethodDecl(D);
2970 static unsigned getFieldIndex(Decl *F) {
2971 RecordDecl *Owner = dyn_cast<RecordDecl>(F->getDeclContext());
2976 for (const auto *D : Owner->noload_decls()) {
2980 if (isa<FieldDecl>(*D) || isa<IndirectFieldDecl>(*D))
2987 Decl *ASTNodeImporter::VisitFieldDecl(FieldDecl *D) {
2988 // Import the major distinguishing characteristics of a variable.
2989 DeclContext *DC, *LexicalDC;
2990 DeclarationName Name;
2993 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
2998 // Determine whether we've already imported this field.
2999 SmallVector<NamedDecl *, 2> FoundDecls;
3000 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls);
3001 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
3002 if (FieldDecl *FoundField = dyn_cast<FieldDecl>(FoundDecls[I])) {
3003 // For anonymous fields, match up by index.
3004 if (!Name && getFieldIndex(D) != getFieldIndex(FoundField))
3007 if (Importer.IsStructurallyEquivalent(D->getType(),
3008 FoundField->getType())) {
3009 Importer.Imported(D, FoundField);
3013 Importer.ToDiag(Loc, diag::err_odr_field_type_inconsistent)
3014 << Name << D->getType() << FoundField->getType();
3015 Importer.ToDiag(FoundField->getLocation(), diag::note_odr_value_here)
3016 << FoundField->getType();
3022 QualType T = Importer.Import(D->getType());
3026 TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo());
3027 Expr *BitWidth = Importer.Import(D->getBitWidth());
3028 if (!BitWidth && D->getBitWidth())
3031 FieldDecl *ToField = FieldDecl::Create(Importer.getToContext(), DC,
3032 Importer.Import(D->getInnerLocStart()),
3033 Loc, Name.getAsIdentifierInfo(),
3034 T, TInfo, BitWidth, D->isMutable(),
3035 D->getInClassInitStyle());
3036 ToField->setAccess(D->getAccess());
3037 ToField->setLexicalDeclContext(LexicalDC);
3038 if (ToField->hasInClassInitializer())
3039 ToField->setInClassInitializer(D->getInClassInitializer());
3040 ToField->setImplicit(D->isImplicit());
3041 Importer.Imported(D, ToField);
3042 LexicalDC->addDeclInternal(ToField);
3046 Decl *ASTNodeImporter::VisitIndirectFieldDecl(IndirectFieldDecl *D) {
3047 // Import the major distinguishing characteristics of a variable.
3048 DeclContext *DC, *LexicalDC;
3049 DeclarationName Name;
3052 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
3057 // Determine whether we've already imported this field.
3058 SmallVector<NamedDecl *, 2> FoundDecls;
3059 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls);
3060 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
3061 if (IndirectFieldDecl *FoundField
3062 = dyn_cast<IndirectFieldDecl>(FoundDecls[I])) {
3063 // For anonymous indirect fields, match up by index.
3064 if (!Name && getFieldIndex(D) != getFieldIndex(FoundField))
3067 if (Importer.IsStructurallyEquivalent(D->getType(),
3068 FoundField->getType(),
3070 Importer.Imported(D, FoundField);
3074 // If there are more anonymous fields to check, continue.
3075 if (!Name && I < N-1)
3078 Importer.ToDiag(Loc, diag::err_odr_field_type_inconsistent)
3079 << Name << D->getType() << FoundField->getType();
3080 Importer.ToDiag(FoundField->getLocation(), diag::note_odr_value_here)
3081 << FoundField->getType();
3087 QualType T = Importer.Import(D->getType());
3091 NamedDecl **NamedChain =
3092 new (Importer.getToContext())NamedDecl*[D->getChainingSize()];
3095 for (auto *PI : D->chain()) {
3096 Decl *D = Importer.Import(PI);
3099 NamedChain[i++] = cast<NamedDecl>(D);
3102 IndirectFieldDecl *ToIndirectField = IndirectFieldDecl::Create(
3103 Importer.getToContext(), DC, Loc, Name.getAsIdentifierInfo(), T,
3104 NamedChain, D->getChainingSize());
3106 for (const auto *Attr : D->attrs())
3107 ToIndirectField->addAttr(Attr->clone(Importer.getToContext()));
3109 ToIndirectField->setAccess(D->getAccess());
3110 ToIndirectField->setLexicalDeclContext(LexicalDC);
3111 Importer.Imported(D, ToIndirectField);
3112 LexicalDC->addDeclInternal(ToIndirectField);
3113 return ToIndirectField;
3116 Decl *ASTNodeImporter::VisitObjCIvarDecl(ObjCIvarDecl *D) {
3117 // Import the major distinguishing characteristics of an ivar.
3118 DeclContext *DC, *LexicalDC;
3119 DeclarationName Name;
3122 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
3127 // Determine whether we've already imported this ivar
3128 SmallVector<NamedDecl *, 2> FoundDecls;
3129 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls);
3130 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
3131 if (ObjCIvarDecl *FoundIvar = dyn_cast<ObjCIvarDecl>(FoundDecls[I])) {
3132 if (Importer.IsStructurallyEquivalent(D->getType(),
3133 FoundIvar->getType())) {
3134 Importer.Imported(D, FoundIvar);
3138 Importer.ToDiag(Loc, diag::err_odr_ivar_type_inconsistent)
3139 << Name << D->getType() << FoundIvar->getType();
3140 Importer.ToDiag(FoundIvar->getLocation(), diag::note_odr_value_here)
3141 << FoundIvar->getType();
3147 QualType T = Importer.Import(D->getType());
3151 TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo());
3152 Expr *BitWidth = Importer.Import(D->getBitWidth());
3153 if (!BitWidth && D->getBitWidth())
3156 ObjCIvarDecl *ToIvar = ObjCIvarDecl::Create(Importer.getToContext(),
3157 cast<ObjCContainerDecl>(DC),
3158 Importer.Import(D->getInnerLocStart()),
3159 Loc, Name.getAsIdentifierInfo(),
3160 T, TInfo, D->getAccessControl(),
3161 BitWidth, D->getSynthesize());
3162 ToIvar->setLexicalDeclContext(LexicalDC);
3163 Importer.Imported(D, ToIvar);
3164 LexicalDC->addDeclInternal(ToIvar);
3169 Decl *ASTNodeImporter::VisitVarDecl(VarDecl *D) {
3170 // Import the major distinguishing characteristics of a variable.
3171 DeclContext *DC, *LexicalDC;
3172 DeclarationName Name;
3175 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
3180 // Try to find a variable in our own ("to") context with the same name and
3181 // in the same context as the variable we're importing.
3182 if (D->isFileVarDecl()) {
3183 VarDecl *MergeWithVar = nullptr;
3184 SmallVector<NamedDecl *, 4> ConflictingDecls;
3185 unsigned IDNS = Decl::IDNS_Ordinary;
3186 SmallVector<NamedDecl *, 2> FoundDecls;
3187 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls);
3188 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
3189 if (!FoundDecls[I]->isInIdentifierNamespace(IDNS))
3192 if (VarDecl *FoundVar = dyn_cast<VarDecl>(FoundDecls[I])) {
3193 // We have found a variable that we may need to merge with. Check it.
3194 if (FoundVar->hasExternalFormalLinkage() &&
3195 D->hasExternalFormalLinkage()) {
3196 if (Importer.IsStructurallyEquivalent(D->getType(),
3197 FoundVar->getType())) {
3198 MergeWithVar = FoundVar;
3202 const ArrayType *FoundArray
3203 = Importer.getToContext().getAsArrayType(FoundVar->getType());
3204 const ArrayType *TArray
3205 = Importer.getToContext().getAsArrayType(D->getType());
3206 if (FoundArray && TArray) {
3207 if (isa<IncompleteArrayType>(FoundArray) &&
3208 isa<ConstantArrayType>(TArray)) {
3210 QualType T = Importer.Import(D->getType());
3214 FoundVar->setType(T);
3215 MergeWithVar = FoundVar;
3217 } else if (isa<IncompleteArrayType>(TArray) &&
3218 isa<ConstantArrayType>(FoundArray)) {
3219 MergeWithVar = FoundVar;
3224 Importer.ToDiag(Loc, diag::err_odr_variable_type_inconsistent)
3225 << Name << D->getType() << FoundVar->getType();
3226 Importer.ToDiag(FoundVar->getLocation(), diag::note_odr_value_here)
3227 << FoundVar->getType();
3231 ConflictingDecls.push_back(FoundDecls[I]);
3235 // An equivalent variable with external linkage has been found. Link
3236 // the two declarations, then merge them.
3237 Importer.Imported(D, MergeWithVar);
3239 if (VarDecl *DDef = D->getDefinition()) {
3240 if (VarDecl *ExistingDef = MergeWithVar->getDefinition()) {
3241 Importer.ToDiag(ExistingDef->getLocation(),
3242 diag::err_odr_variable_multiple_def)
3244 Importer.FromDiag(DDef->getLocation(), diag::note_odr_defined_here);
3246 Expr *Init = Importer.Import(DDef->getInit());
3247 MergeWithVar->setInit(Init);
3248 if (DDef->isInitKnownICE()) {
3249 EvaluatedStmt *Eval = MergeWithVar->ensureEvaluatedStmt();
3250 Eval->CheckedICE = true;
3251 Eval->IsICE = DDef->isInitICE();
3256 return MergeWithVar;
3259 if (!ConflictingDecls.empty()) {
3260 Name = Importer.HandleNameConflict(Name, DC, IDNS,
3261 ConflictingDecls.data(),
3262 ConflictingDecls.size());
3269 QualType T = Importer.Import(D->getType());
3273 // Create the imported variable.
3274 TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo());
3275 VarDecl *ToVar = VarDecl::Create(Importer.getToContext(), DC,
3276 Importer.Import(D->getInnerLocStart()),
3277 Loc, Name.getAsIdentifierInfo(),
3279 D->getStorageClass());
3280 ToVar->setQualifierInfo(Importer.Import(D->getQualifierLoc()));
3281 ToVar->setAccess(D->getAccess());
3282 ToVar->setLexicalDeclContext(LexicalDC);
3283 Importer.Imported(D, ToVar);
3284 LexicalDC->addDeclInternal(ToVar);
3286 if (!D->isFileVarDecl() &&
3290 // Merge the initializer.
3291 if (ImportDefinition(D, ToVar))
3297 Decl *ASTNodeImporter::VisitImplicitParamDecl(ImplicitParamDecl *D) {
3298 // Parameters are created in the translation unit's context, then moved
3299 // into the function declaration's context afterward.
3300 DeclContext *DC = Importer.getToContext().getTranslationUnitDecl();
3302 // Import the name of this declaration.
3303 DeclarationName Name = Importer.Import(D->getDeclName());
3304 if (D->getDeclName() && !Name)
3307 // Import the location of this declaration.
3308 SourceLocation Loc = Importer.Import(D->getLocation());
3310 // Import the parameter's type.
3311 QualType T = Importer.Import(D->getType());
3315 // Create the imported parameter.
3316 ImplicitParamDecl *ToParm
3317 = ImplicitParamDecl::Create(Importer.getToContext(), DC,
3318 Loc, Name.getAsIdentifierInfo(),
3320 return Importer.Imported(D, ToParm);
3323 Decl *ASTNodeImporter::VisitParmVarDecl(ParmVarDecl *D) {
3324 // Parameters are created in the translation unit's context, then moved
3325 // into the function declaration's context afterward.
3326 DeclContext *DC = Importer.getToContext().getTranslationUnitDecl();
3328 // Import the name of this declaration.
3329 DeclarationName Name = Importer.Import(D->getDeclName());
3330 if (D->getDeclName() && !Name)
3333 // Import the location of this declaration.
3334 SourceLocation Loc = Importer.Import(D->getLocation());
3336 // Import the parameter's type.
3337 QualType T = Importer.Import(D->getType());
3341 // Create the imported parameter.
3342 TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo());
3343 ParmVarDecl *ToParm = ParmVarDecl::Create(Importer.getToContext(), DC,
3344 Importer.Import(D->getInnerLocStart()),
3345 Loc, Name.getAsIdentifierInfo(),
3346 T, TInfo, D->getStorageClass(),
3347 /*FIXME: Default argument*/nullptr);
3348 ToParm->setHasInheritedDefaultArg(D->hasInheritedDefaultArg());
3351 ToParm->setIsUsed();
3353 return Importer.Imported(D, ToParm);
3356 Decl *ASTNodeImporter::VisitObjCMethodDecl(ObjCMethodDecl *D) {
3357 // Import the major distinguishing characteristics of a method.
3358 DeclContext *DC, *LexicalDC;
3359 DeclarationName Name;
3362 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
3367 SmallVector<NamedDecl *, 2> FoundDecls;
3368 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls);
3369 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
3370 if (ObjCMethodDecl *FoundMethod = dyn_cast<ObjCMethodDecl>(FoundDecls[I])) {
3371 if (FoundMethod->isInstanceMethod() != D->isInstanceMethod())
3374 // Check return types.
3375 if (!Importer.IsStructurallyEquivalent(D->getReturnType(),
3376 FoundMethod->getReturnType())) {
3377 Importer.ToDiag(Loc, diag::err_odr_objc_method_result_type_inconsistent)
3378 << D->isInstanceMethod() << Name << D->getReturnType()
3379 << FoundMethod->getReturnType();
3380 Importer.ToDiag(FoundMethod->getLocation(),
3381 diag::note_odr_objc_method_here)
3382 << D->isInstanceMethod() << Name;
3386 // Check the number of parameters.
3387 if (D->param_size() != FoundMethod->param_size()) {
3388 Importer.ToDiag(Loc, diag::err_odr_objc_method_num_params_inconsistent)
3389 << D->isInstanceMethod() << Name
3390 << D->param_size() << FoundMethod->param_size();
3391 Importer.ToDiag(FoundMethod->getLocation(),
3392 diag::note_odr_objc_method_here)
3393 << D->isInstanceMethod() << Name;
3397 // Check parameter types.
3398 for (ObjCMethodDecl::param_iterator P = D->param_begin(),
3399 PEnd = D->param_end(), FoundP = FoundMethod->param_begin();
3400 P != PEnd; ++P, ++FoundP) {
3401 if (!Importer.IsStructurallyEquivalent((*P)->getType(),
3402 (*FoundP)->getType())) {
3403 Importer.FromDiag((*P)->getLocation(),
3404 diag::err_odr_objc_method_param_type_inconsistent)
3405 << D->isInstanceMethod() << Name
3406 << (*P)->getType() << (*FoundP)->getType();
3407 Importer.ToDiag((*FoundP)->getLocation(), diag::note_odr_value_here)
3408 << (*FoundP)->getType();
3413 // Check variadic/non-variadic.
3414 // Check the number of parameters.
3415 if (D->isVariadic() != FoundMethod->isVariadic()) {
3416 Importer.ToDiag(Loc, diag::err_odr_objc_method_variadic_inconsistent)
3417 << D->isInstanceMethod() << Name;
3418 Importer.ToDiag(FoundMethod->getLocation(),
3419 diag::note_odr_objc_method_here)
3420 << D->isInstanceMethod() << Name;
3424 // FIXME: Any other bits we need to merge?
3425 return Importer.Imported(D, FoundMethod);
3429 // Import the result type.
3430 QualType ResultTy = Importer.Import(D->getReturnType());
3431 if (ResultTy.isNull())
3434 TypeSourceInfo *ReturnTInfo = Importer.Import(D->getReturnTypeSourceInfo());
3436 ObjCMethodDecl *ToMethod = ObjCMethodDecl::Create(
3437 Importer.getToContext(), Loc, Importer.Import(D->getLocEnd()),
3438 Name.getObjCSelector(), ResultTy, ReturnTInfo, DC, D->isInstanceMethod(),
3439 D->isVariadic(), D->isPropertyAccessor(), D->isImplicit(), D->isDefined(),
3440 D->getImplementationControl(), D->hasRelatedResultType());
3442 // FIXME: When we decide to merge method definitions, we'll need to
3443 // deal with implicit parameters.
3445 // Import the parameters
3446 SmallVector<ParmVarDecl *, 5> ToParams;
3447 for (auto *FromP : D->params()) {
3448 ParmVarDecl *ToP = cast_or_null<ParmVarDecl>(Importer.Import(FromP));
3452 ToParams.push_back(ToP);
3455 // Set the parameters.
3456 for (unsigned I = 0, N = ToParams.size(); I != N; ++I) {
3457 ToParams[I]->setOwningFunction(ToMethod);
3458 ToMethod->addDeclInternal(ToParams[I]);
3460 SmallVector<SourceLocation, 12> SelLocs;
3461 D->getSelectorLocs(SelLocs);
3462 ToMethod->setMethodParams(Importer.getToContext(), ToParams, SelLocs);
3464 ToMethod->setLexicalDeclContext(LexicalDC);
3465 Importer.Imported(D, ToMethod);
3466 LexicalDC->addDeclInternal(ToMethod);
3470 Decl *ASTNodeImporter::VisitObjCTypeParamDecl(ObjCTypeParamDecl *D) {
3471 // Import the major distinguishing characteristics of a category.
3472 DeclContext *DC, *LexicalDC;
3473 DeclarationName Name;
3476 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
3481 TypeSourceInfo *BoundInfo = Importer.Import(D->getTypeSourceInfo());
3485 ObjCTypeParamDecl *Result = ObjCTypeParamDecl::Create(
3486 Importer.getToContext(), DC,
3488 Importer.Import(D->getVarianceLoc()),
3490 Importer.Import(D->getLocation()),
3491 Name.getAsIdentifierInfo(),
3492 Importer.Import(D->getColonLoc()),
3494 Importer.Imported(D, Result);
3495 Result->setLexicalDeclContext(LexicalDC);
3499 Decl *ASTNodeImporter::VisitObjCCategoryDecl(ObjCCategoryDecl *D) {
3500 // Import the major distinguishing characteristics of a category.
3501 DeclContext *DC, *LexicalDC;
3502 DeclarationName Name;
3505 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
3510 ObjCInterfaceDecl *ToInterface
3511 = cast_or_null<ObjCInterfaceDecl>(Importer.Import(D->getClassInterface()));
3515 // Determine if we've already encountered this category.
3516 ObjCCategoryDecl *MergeWithCategory
3517 = ToInterface->FindCategoryDeclaration(Name.getAsIdentifierInfo());
3518 ObjCCategoryDecl *ToCategory = MergeWithCategory;
3520 ToCategory = ObjCCategoryDecl::Create(Importer.getToContext(), DC,
3521 Importer.Import(D->getAtStartLoc()),
3523 Importer.Import(D->getCategoryNameLoc()),
3524 Name.getAsIdentifierInfo(),
3526 /*TypeParamList=*/nullptr,
3527 Importer.Import(D->getIvarLBraceLoc()),
3528 Importer.Import(D->getIvarRBraceLoc()));
3529 ToCategory->setLexicalDeclContext(LexicalDC);
3530 LexicalDC->addDeclInternal(ToCategory);
3531 Importer.Imported(D, ToCategory);
3532 // Import the type parameter list after calling Imported, to avoid
3533 // loops when bringing in their DeclContext.
3534 ToCategory->setTypeParamList(ImportObjCTypeParamList(
3535 D->getTypeParamList()));
3538 SmallVector<ObjCProtocolDecl *, 4> Protocols;
3539 SmallVector<SourceLocation, 4> ProtocolLocs;
3540 ObjCCategoryDecl::protocol_loc_iterator FromProtoLoc
3541 = D->protocol_loc_begin();
3542 for (ObjCCategoryDecl::protocol_iterator FromProto = D->protocol_begin(),
3543 FromProtoEnd = D->protocol_end();
3544 FromProto != FromProtoEnd;
3545 ++FromProto, ++FromProtoLoc) {
3546 ObjCProtocolDecl *ToProto
3547 = cast_or_null<ObjCProtocolDecl>(Importer.Import(*FromProto));
3550 Protocols.push_back(ToProto);
3551 ProtocolLocs.push_back(Importer.Import(*FromProtoLoc));
3554 // FIXME: If we're merging, make sure that the protocol list is the same.
3555 ToCategory->setProtocolList(Protocols.data(), Protocols.size(),
3556 ProtocolLocs.data(), Importer.getToContext());
3559 Importer.Imported(D, ToCategory);
3562 // Import all of the members of this category.
3563 ImportDeclContext(D);
3565 // If we have an implementation, import it as well.
3566 if (D->getImplementation()) {
3567 ObjCCategoryImplDecl *Impl
3568 = cast_or_null<ObjCCategoryImplDecl>(
3569 Importer.Import(D->getImplementation()));
3573 ToCategory->setImplementation(Impl);
3579 bool ASTNodeImporter::ImportDefinition(ObjCProtocolDecl *From,
3580 ObjCProtocolDecl *To,
3581 ImportDefinitionKind Kind) {
3582 if (To->getDefinition()) {
3583 if (shouldForceImportDeclContext(Kind))
3584 ImportDeclContext(From);
3588 // Start the protocol definition
3589 To->startDefinition();
3592 SmallVector<ObjCProtocolDecl *, 4> Protocols;
3593 SmallVector<SourceLocation, 4> ProtocolLocs;
3594 ObjCProtocolDecl::protocol_loc_iterator
3595 FromProtoLoc = From->protocol_loc_begin();
3596 for (ObjCProtocolDecl::protocol_iterator FromProto = From->protocol_begin(),
3597 FromProtoEnd = From->protocol_end();
3598 FromProto != FromProtoEnd;
3599 ++FromProto, ++FromProtoLoc) {
3600 ObjCProtocolDecl *ToProto
3601 = cast_or_null<ObjCProtocolDecl>(Importer.Import(*FromProto));
3604 Protocols.push_back(ToProto);
3605 ProtocolLocs.push_back(Importer.Import(*FromProtoLoc));
3608 // FIXME: If we're merging, make sure that the protocol list is the same.
3609 To->setProtocolList(Protocols.data(), Protocols.size(),
3610 ProtocolLocs.data(), Importer.getToContext());
3612 if (shouldForceImportDeclContext(Kind)) {
3613 // Import all of the members of this protocol.
3614 ImportDeclContext(From, /*ForceImport=*/true);
3619 Decl *ASTNodeImporter::VisitObjCProtocolDecl(ObjCProtocolDecl *D) {
3620 // If this protocol has a definition in the translation unit we're coming
3621 // from, but this particular declaration is not that definition, import the
3622 // definition and map to that.
3623 ObjCProtocolDecl *Definition = D->getDefinition();
3624 if (Definition && Definition != D) {
3625 Decl *ImportedDef = Importer.Import(Definition);
3629 return Importer.Imported(D, ImportedDef);
3632 // Import the major distinguishing characteristics of a protocol.
3633 DeclContext *DC, *LexicalDC;
3634 DeclarationName Name;
3637 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
3642 ObjCProtocolDecl *MergeWithProtocol = nullptr;
3643 SmallVector<NamedDecl *, 2> FoundDecls;
3644 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls);
3645 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
3646 if (!FoundDecls[I]->isInIdentifierNamespace(Decl::IDNS_ObjCProtocol))
3649 if ((MergeWithProtocol = dyn_cast<ObjCProtocolDecl>(FoundDecls[I])))
3653 ObjCProtocolDecl *ToProto = MergeWithProtocol;
3655 ToProto = ObjCProtocolDecl::Create(Importer.getToContext(), DC,
3656 Name.getAsIdentifierInfo(), Loc,
3657 Importer.Import(D->getAtStartLoc()),
3658 /*PrevDecl=*/nullptr);
3659 ToProto->setLexicalDeclContext(LexicalDC);
3660 LexicalDC->addDeclInternal(ToProto);
3663 Importer.Imported(D, ToProto);
3665 if (D->isThisDeclarationADefinition() && ImportDefinition(D, ToProto))
3671 Decl *ASTNodeImporter::VisitLinkageSpecDecl(LinkageSpecDecl *D) {
3672 DeclContext *DC = Importer.ImportContext(D->getDeclContext());
3673 DeclContext *LexicalDC = Importer.ImportContext(D->getLexicalDeclContext());
3675 SourceLocation ExternLoc = Importer.Import(D->getExternLoc());
3676 SourceLocation LangLoc = Importer.Import(D->getLocation());
3678 bool HasBraces = D->hasBraces();
3680 LinkageSpecDecl *ToLinkageSpec =
3681 LinkageSpecDecl::Create(Importer.getToContext(),
3689 SourceLocation RBraceLoc = Importer.Import(D->getRBraceLoc());
3690 ToLinkageSpec->setRBraceLoc(RBraceLoc);
3693 ToLinkageSpec->setLexicalDeclContext(LexicalDC);
3694 LexicalDC->addDeclInternal(ToLinkageSpec);
3696 Importer.Imported(D, ToLinkageSpec);
3698 return ToLinkageSpec;
3701 bool ASTNodeImporter::ImportDefinition(ObjCInterfaceDecl *From,
3702 ObjCInterfaceDecl *To,
3703 ImportDefinitionKind Kind) {
3704 if (To->getDefinition()) {
3705 // Check consistency of superclass.
3706 ObjCInterfaceDecl *FromSuper = From->getSuperClass();
3708 FromSuper = cast_or_null<ObjCInterfaceDecl>(Importer.Import(FromSuper));
3713 ObjCInterfaceDecl *ToSuper = To->getSuperClass();
3714 if ((bool)FromSuper != (bool)ToSuper ||
3715 (FromSuper && !declaresSameEntity(FromSuper, ToSuper))) {
3716 Importer.ToDiag(To->getLocation(),
3717 diag::err_odr_objc_superclass_inconsistent)
3718 << To->getDeclName();
3720 Importer.ToDiag(To->getSuperClassLoc(), diag::note_odr_objc_superclass)
3721 << To->getSuperClass()->getDeclName();
3723 Importer.ToDiag(To->getLocation(),
3724 diag::note_odr_objc_missing_superclass);
3725 if (From->getSuperClass())
3726 Importer.FromDiag(From->getSuperClassLoc(),
3727 diag::note_odr_objc_superclass)
3728 << From->getSuperClass()->getDeclName();
3730 Importer.FromDiag(From->getLocation(),
3731 diag::note_odr_objc_missing_superclass);
3734 if (shouldForceImportDeclContext(Kind))
3735 ImportDeclContext(From);
3739 // Start the definition.
3740 To->startDefinition();
3742 // If this class has a superclass, import it.
3743 if (From->getSuperClass()) {
3744 TypeSourceInfo *SuperTInfo = Importer.Import(From->getSuperClassTInfo());
3748 To->setSuperClass(SuperTInfo);
3752 SmallVector<ObjCProtocolDecl *, 4> Protocols;
3753 SmallVector<SourceLocation, 4> ProtocolLocs;
3754 ObjCInterfaceDecl::protocol_loc_iterator
3755 FromProtoLoc = From->protocol_loc_begin();
3757 for (ObjCInterfaceDecl::protocol_iterator FromProto = From->protocol_begin(),
3758 FromProtoEnd = From->protocol_end();
3759 FromProto != FromProtoEnd;
3760 ++FromProto, ++FromProtoLoc) {
3761 ObjCProtocolDecl *ToProto
3762 = cast_or_null<ObjCProtocolDecl>(Importer.Import(*FromProto));
3765 Protocols.push_back(ToProto);
3766 ProtocolLocs.push_back(Importer.Import(*FromProtoLoc));
3769 // FIXME: If we're merging, make sure that the protocol list is the same.
3770 To->setProtocolList(Protocols.data(), Protocols.size(),
3771 ProtocolLocs.data(), Importer.getToContext());
3773 // Import categories. When the categories themselves are imported, they'll
3774 // hook themselves into this interface.
3775 for (auto *Cat : From->known_categories())
3776 Importer.Import(Cat);
3778 // If we have an @implementation, import it as well.
3779 if (From->getImplementation()) {
3780 ObjCImplementationDecl *Impl = cast_or_null<ObjCImplementationDecl>(
3781 Importer.Import(From->getImplementation()));
3785 To->setImplementation(Impl);
3788 if (shouldForceImportDeclContext(Kind)) {
3789 // Import all of the members of this class.
3790 ImportDeclContext(From, /*ForceImport=*/true);
3796 ASTNodeImporter::ImportObjCTypeParamList(ObjCTypeParamList *list) {
3800 SmallVector<ObjCTypeParamDecl *, 4> toTypeParams;
3801 for (auto fromTypeParam : *list) {
3802 auto toTypeParam = cast_or_null<ObjCTypeParamDecl>(
3803 Importer.Import(fromTypeParam));
3807 toTypeParams.push_back(toTypeParam);
3810 return ObjCTypeParamList::create(Importer.getToContext(),
3811 Importer.Import(list->getLAngleLoc()),
3813 Importer.Import(list->getRAngleLoc()));
3816 Decl *ASTNodeImporter::VisitObjCInterfaceDecl(ObjCInterfaceDecl *D) {
3817 // If this class has a definition in the translation unit we're coming from,
3818 // but this particular declaration is not that definition, import the
3819 // definition and map to that.
3820 ObjCInterfaceDecl *Definition = D->getDefinition();
3821 if (Definition && Definition != D) {
3822 Decl *ImportedDef = Importer.Import(Definition);
3826 return Importer.Imported(D, ImportedDef);
3829 // Import the major distinguishing characteristics of an @interface.
3830 DeclContext *DC, *LexicalDC;
3831 DeclarationName Name;
3834 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
3839 // Look for an existing interface with the same name.
3840 ObjCInterfaceDecl *MergeWithIface = nullptr;
3841 SmallVector<NamedDecl *, 2> FoundDecls;
3842 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls);
3843 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
3844 if (!FoundDecls[I]->isInIdentifierNamespace(Decl::IDNS_Ordinary))
3847 if ((MergeWithIface = dyn_cast<ObjCInterfaceDecl>(FoundDecls[I])))
3851 // Create an interface declaration, if one does not already exist.
3852 ObjCInterfaceDecl *ToIface = MergeWithIface;
3854 ToIface = ObjCInterfaceDecl::Create(Importer.getToContext(), DC,
3855 Importer.Import(D->getAtStartLoc()),
3856 Name.getAsIdentifierInfo(),
3857 /*TypeParamList=*/nullptr,
3858 /*PrevDecl=*/nullptr, Loc,
3859 D->isImplicitInterfaceDecl());
3860 ToIface->setLexicalDeclContext(LexicalDC);
3861 LexicalDC->addDeclInternal(ToIface);
3863 Importer.Imported(D, ToIface);
3864 // Import the type parameter list after calling Imported, to avoid
3865 // loops when bringing in their DeclContext.
3866 ToIface->setTypeParamList(ImportObjCTypeParamList(
3867 D->getTypeParamListAsWritten()));
3869 if (D->isThisDeclarationADefinition() && ImportDefinition(D, ToIface))
3875 Decl *ASTNodeImporter::VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) {
3876 ObjCCategoryDecl *Category = cast_or_null<ObjCCategoryDecl>(
3877 Importer.Import(D->getCategoryDecl()));
3881 ObjCCategoryImplDecl *ToImpl = Category->getImplementation();
3883 DeclContext *DC = Importer.ImportContext(D->getDeclContext());
3887 SourceLocation CategoryNameLoc = Importer.Import(D->getCategoryNameLoc());
3888 ToImpl = ObjCCategoryImplDecl::Create(Importer.getToContext(), DC,
3889 Importer.Import(D->getIdentifier()),
3890 Category->getClassInterface(),
3891 Importer.Import(D->getLocation()),
3892 Importer.Import(D->getAtStartLoc()),
3895 DeclContext *LexicalDC = DC;
3896 if (D->getDeclContext() != D->getLexicalDeclContext()) {
3897 LexicalDC = Importer.ImportContext(D->getLexicalDeclContext());
3901 ToImpl->setLexicalDeclContext(LexicalDC);
3904 LexicalDC->addDeclInternal(ToImpl);
3905 Category->setImplementation(ToImpl);
3908 Importer.Imported(D, ToImpl);
3909 ImportDeclContext(D);
3913 Decl *ASTNodeImporter::VisitObjCImplementationDecl(ObjCImplementationDecl *D) {
3914 // Find the corresponding interface.
3915 ObjCInterfaceDecl *Iface = cast_or_null<ObjCInterfaceDecl>(
3916 Importer.Import(D->getClassInterface()));
3920 // Import the superclass, if any.
3921 ObjCInterfaceDecl *Super = nullptr;
3922 if (D->getSuperClass()) {
3923 Super = cast_or_null<ObjCInterfaceDecl>(
3924 Importer.Import(D->getSuperClass()));
3929 ObjCImplementationDecl *Impl = Iface->getImplementation();
3931 // We haven't imported an implementation yet. Create a new @implementation
3933 Impl = ObjCImplementationDecl::Create(Importer.getToContext(),
3934 Importer.ImportContext(D->getDeclContext()),
3936 Importer.Import(D->getLocation()),
3937 Importer.Import(D->getAtStartLoc()),
3938 Importer.Import(D->getSuperClassLoc()),
3939 Importer.Import(D->getIvarLBraceLoc()),
3940 Importer.Import(D->getIvarRBraceLoc()));
3942 if (D->getDeclContext() != D->getLexicalDeclContext()) {
3943 DeclContext *LexicalDC
3944 = Importer.ImportContext(D->getLexicalDeclContext());
3947 Impl->setLexicalDeclContext(LexicalDC);
3950 // Associate the implementation with the class it implements.
3951 Iface->setImplementation(Impl);
3952 Importer.Imported(D, Iface->getImplementation());
3954 Importer.Imported(D, Iface->getImplementation());
3956 // Verify that the existing @implementation has the same superclass.
3957 if ((Super && !Impl->getSuperClass()) ||
3958 (!Super && Impl->getSuperClass()) ||
3959 (Super && Impl->getSuperClass() &&
3960 !declaresSameEntity(Super->getCanonicalDecl(),
3961 Impl->getSuperClass()))) {
3962 Importer.ToDiag(Impl->getLocation(),
3963 diag::err_odr_objc_superclass_inconsistent)
3964 << Iface->getDeclName();
3965 // FIXME: It would be nice to have the location of the superclass
3967 if (Impl->getSuperClass())
3968 Importer.ToDiag(Impl->getLocation(),
3969 diag::note_odr_objc_superclass)
3970 << Impl->getSuperClass()->getDeclName();
3972 Importer.ToDiag(Impl->getLocation(),
3973 diag::note_odr_objc_missing_superclass);
3974 if (D->getSuperClass())
3975 Importer.FromDiag(D->getLocation(),
3976 diag::note_odr_objc_superclass)
3977 << D->getSuperClass()->getDeclName();
3979 Importer.FromDiag(D->getLocation(),
3980 diag::note_odr_objc_missing_superclass);
3985 // Import all of the members of this @implementation.
3986 ImportDeclContext(D);
3991 Decl *ASTNodeImporter::VisitObjCPropertyDecl(ObjCPropertyDecl *D) {
3992 // Import the major distinguishing characteristics of an @property.
3993 DeclContext *DC, *LexicalDC;
3994 DeclarationName Name;
3997 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
4002 // Check whether we have already imported this property.
4003 SmallVector<NamedDecl *, 2> FoundDecls;
4004 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls);
4005 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
4006 if (ObjCPropertyDecl *FoundProp
4007 = dyn_cast<ObjCPropertyDecl>(FoundDecls[I])) {
4008 // Check property types.
4009 if (!Importer.IsStructurallyEquivalent(D->getType(),
4010 FoundProp->getType())) {
4011 Importer.ToDiag(Loc, diag::err_odr_objc_property_type_inconsistent)
4012 << Name << D->getType() << FoundProp->getType();
4013 Importer.ToDiag(FoundProp->getLocation(), diag::note_odr_value_here)
4014 << FoundProp->getType();
4018 // FIXME: Check property attributes, getters, setters, etc.?
4020 // Consider these properties to be equivalent.
4021 Importer.Imported(D, FoundProp);
4027 TypeSourceInfo *TSI = Importer.Import(D->getTypeSourceInfo());
4031 // Create the new property.
4032 ObjCPropertyDecl *ToProperty
4033 = ObjCPropertyDecl::Create(Importer.getToContext(), DC, Loc,
4034 Name.getAsIdentifierInfo(),
4035 Importer.Import(D->getAtLoc()),
4036 Importer.Import(D->getLParenLoc()),
4037 Importer.Import(D->getType()),
4039 D->getPropertyImplementation());
4040 Importer.Imported(D, ToProperty);
4041 ToProperty->setLexicalDeclContext(LexicalDC);
4042 LexicalDC->addDeclInternal(ToProperty);
4044 ToProperty->setPropertyAttributes(D->getPropertyAttributes());
4045 ToProperty->setPropertyAttributesAsWritten(
4046 D->getPropertyAttributesAsWritten());
4047 ToProperty->setGetterName(Importer.Import(D->getGetterName()));
4048 ToProperty->setSetterName(Importer.Import(D->getSetterName()));
4049 ToProperty->setGetterMethodDecl(
4050 cast_or_null<ObjCMethodDecl>(Importer.Import(D->getGetterMethodDecl())));
4051 ToProperty->setSetterMethodDecl(
4052 cast_or_null<ObjCMethodDecl>(Importer.Import(D->getSetterMethodDecl())));
4053 ToProperty->setPropertyIvarDecl(
4054 cast_or_null<ObjCIvarDecl>(Importer.Import(D->getPropertyIvarDecl())));
4058 Decl *ASTNodeImporter::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D) {
4059 ObjCPropertyDecl *Property = cast_or_null<ObjCPropertyDecl>(
4060 Importer.Import(D->getPropertyDecl()));
4064 DeclContext *DC = Importer.ImportContext(D->getDeclContext());
4068 // Import the lexical declaration context.
4069 DeclContext *LexicalDC = DC;
4070 if (D->getDeclContext() != D->getLexicalDeclContext()) {
4071 LexicalDC = Importer.ImportContext(D->getLexicalDeclContext());
4076 ObjCImplDecl *InImpl = dyn_cast<ObjCImplDecl>(LexicalDC);
4080 // Import the ivar (for an @synthesize).
4081 ObjCIvarDecl *Ivar = nullptr;
4082 if (D->getPropertyIvarDecl()) {
4083 Ivar = cast_or_null<ObjCIvarDecl>(
4084 Importer.Import(D->getPropertyIvarDecl()));
4089 ObjCPropertyImplDecl *ToImpl
4090 = InImpl->FindPropertyImplDecl(Property->getIdentifier(),
4091 Property->getQueryKind());
4093 ToImpl = ObjCPropertyImplDecl::Create(Importer.getToContext(), DC,
4094 Importer.Import(D->getLocStart()),
4095 Importer.Import(D->getLocation()),
4097 D->getPropertyImplementation(),
4099 Importer.Import(D->getPropertyIvarDeclLoc()));
4100 ToImpl->setLexicalDeclContext(LexicalDC);
4101 Importer.Imported(D, ToImpl);
4102 LexicalDC->addDeclInternal(ToImpl);
4104 // Check that we have the same kind of property implementation (@synthesize
4106 if (D->getPropertyImplementation() != ToImpl->getPropertyImplementation()) {
4107 Importer.ToDiag(ToImpl->getLocation(),
4108 diag::err_odr_objc_property_impl_kind_inconsistent)
4109 << Property->getDeclName()
4110 << (ToImpl->getPropertyImplementation()
4111 == ObjCPropertyImplDecl::Dynamic);
4112 Importer.FromDiag(D->getLocation(),
4113 diag::note_odr_objc_property_impl_kind)
4114 << D->getPropertyDecl()->getDeclName()
4115 << (D->getPropertyImplementation() == ObjCPropertyImplDecl::Dynamic);
4119 // For @synthesize, check that we have the same
4120 if (D->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize &&
4121 Ivar != ToImpl->getPropertyIvarDecl()) {
4122 Importer.ToDiag(ToImpl->getPropertyIvarDeclLoc(),
4123 diag::err_odr_objc_synthesize_ivar_inconsistent)
4124 << Property->getDeclName()
4125 << ToImpl->getPropertyIvarDecl()->getDeclName()
4126 << Ivar->getDeclName();
4127 Importer.FromDiag(D->getPropertyIvarDeclLoc(),
4128 diag::note_odr_objc_synthesize_ivar_here)
4129 << D->getPropertyIvarDecl()->getDeclName();
4133 // Merge the existing implementation with the new implementation.
4134 Importer.Imported(D, ToImpl);
4140 Decl *ASTNodeImporter::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) {
4141 // For template arguments, we adopt the translation unit as our declaration
4142 // context. This context will be fixed when the actual template declaration
4145 // FIXME: Import default argument.
4146 return TemplateTypeParmDecl::Create(Importer.getToContext(),
4147 Importer.getToContext().getTranslationUnitDecl(),
4148 Importer.Import(D->getLocStart()),
4149 Importer.Import(D->getLocation()),
4152 Importer.Import(D->getIdentifier()),
4153 D->wasDeclaredWithTypename(),
4154 D->isParameterPack());
4158 ASTNodeImporter::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) {
4159 // Import the name of this declaration.
4160 DeclarationName Name = Importer.Import(D->getDeclName());
4161 if (D->getDeclName() && !Name)
4164 // Import the location of this declaration.
4165 SourceLocation Loc = Importer.Import(D->getLocation());
4167 // Import the type of this declaration.
4168 QualType T = Importer.Import(D->getType());
4172 // Import type-source information.
4173 TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo());
4174 if (D->getTypeSourceInfo() && !TInfo)
4177 // FIXME: Import default argument.
4179 return NonTypeTemplateParmDecl::Create(Importer.getToContext(),
4180 Importer.getToContext().getTranslationUnitDecl(),
4181 Importer.Import(D->getInnerLocStart()),
4182 Loc, D->getDepth(), D->getPosition(),
4183 Name.getAsIdentifierInfo(),
4184 T, D->isParameterPack(), TInfo);
4188 ASTNodeImporter::VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) {
4189 // Import the name of this declaration.
4190 DeclarationName Name = Importer.Import(D->getDeclName());
4191 if (D->getDeclName() && !Name)
4194 // Import the location of this declaration.
4195 SourceLocation Loc = Importer.Import(D->getLocation());
4197 // Import template parameters.
4198 TemplateParameterList *TemplateParams
4199 = ImportTemplateParameterList(D->getTemplateParameters());
4200 if (!TemplateParams)
4203 // FIXME: Import default argument.
4205 return TemplateTemplateParmDecl::Create(Importer.getToContext(),
4206 Importer.getToContext().getTranslationUnitDecl(),
4207 Loc, D->getDepth(), D->getPosition(),
4208 D->isParameterPack(),
4209 Name.getAsIdentifierInfo(),
4213 Decl *ASTNodeImporter::VisitClassTemplateDecl(ClassTemplateDecl *D) {
4214 // If this record has a definition in the translation unit we're coming from,
4215 // but this particular declaration is not that definition, import the
4216 // definition and map to that.
4217 CXXRecordDecl *Definition
4218 = cast_or_null<CXXRecordDecl>(D->getTemplatedDecl()->getDefinition());
4219 if (Definition && Definition != D->getTemplatedDecl()) {
4221 = Importer.Import(Definition->getDescribedClassTemplate());
4225 return Importer.Imported(D, ImportedDef);
4228 // Import the major distinguishing characteristics of this class template.
4229 DeclContext *DC, *LexicalDC;
4230 DeclarationName Name;
4233 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
4238 // We may already have a template of the same name; try to find and match it.
4239 if (!DC->isFunctionOrMethod()) {
4240 SmallVector<NamedDecl *, 4> ConflictingDecls;
4241 SmallVector<NamedDecl *, 2> FoundDecls;
4242 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls);
4243 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
4244 if (!FoundDecls[I]->isInIdentifierNamespace(Decl::IDNS_Ordinary))
4247 Decl *Found = FoundDecls[I];
4248 if (ClassTemplateDecl *FoundTemplate
4249 = dyn_cast<ClassTemplateDecl>(Found)) {
4250 if (IsStructuralMatch(D, FoundTemplate)) {
4251 // The class templates structurally match; call it the same template.
4252 // FIXME: We may be filling in a forward declaration here. Handle
4254 Importer.Imported(D->getTemplatedDecl(),
4255 FoundTemplate->getTemplatedDecl());
4256 return Importer.Imported(D, FoundTemplate);
4260 ConflictingDecls.push_back(FoundDecls[I]);
4263 if (!ConflictingDecls.empty()) {
4264 Name = Importer.HandleNameConflict(Name, DC, Decl::IDNS_Ordinary,
4265 ConflictingDecls.data(),
4266 ConflictingDecls.size());
4273 CXXRecordDecl *DTemplated = D->getTemplatedDecl();
4275 // Create the declaration that is being templated.
4276 SourceLocation StartLoc = Importer.Import(DTemplated->getLocStart());
4277 SourceLocation IdLoc = Importer.Import(DTemplated->getLocation());
4278 CXXRecordDecl *D2Templated = CXXRecordDecl::Create(Importer.getToContext(),
4279 DTemplated->getTagKind(),
4280 DC, StartLoc, IdLoc,
4281 Name.getAsIdentifierInfo());
4282 D2Templated->setAccess(DTemplated->getAccess());
4283 D2Templated->setQualifierInfo(Importer.Import(DTemplated->getQualifierLoc()));
4284 D2Templated->setLexicalDeclContext(LexicalDC);
4286 // Create the class template declaration itself.
4287 TemplateParameterList *TemplateParams
4288 = ImportTemplateParameterList(D->getTemplateParameters());
4289 if (!TemplateParams)
4292 ClassTemplateDecl *D2 = ClassTemplateDecl::Create(Importer.getToContext(), DC,
4293 Loc, Name, TemplateParams,
4295 /*PrevDecl=*/nullptr);
4296 D2Templated->setDescribedClassTemplate(D2);
4298 D2->setAccess(D->getAccess());
4299 D2->setLexicalDeclContext(LexicalDC);
4300 LexicalDC->addDeclInternal(D2);
4302 // Note the relationship between the class templates.
4303 Importer.Imported(D, D2);
4304 Importer.Imported(DTemplated, D2Templated);
4306 if (DTemplated->isCompleteDefinition() &&
4307 !D2Templated->isCompleteDefinition()) {
4308 // FIXME: Import definition!
4314 Decl *ASTNodeImporter::VisitClassTemplateSpecializationDecl(
4315 ClassTemplateSpecializationDecl *D) {
4316 // If this record has a definition in the translation unit we're coming from,
4317 // but this particular declaration is not that definition, import the
4318 // definition and map to that.
4319 TagDecl *Definition = D->getDefinition();
4320 if (Definition && Definition != D) {
4321 Decl *ImportedDef = Importer.Import(Definition);
4325 return Importer.Imported(D, ImportedDef);
4328 ClassTemplateDecl *ClassTemplate
4329 = cast_or_null<ClassTemplateDecl>(Importer.Import(
4330 D->getSpecializedTemplate()));
4334 // Import the context of this declaration.
4335 DeclContext *DC = ClassTemplate->getDeclContext();
4339 DeclContext *LexicalDC = DC;
4340 if (D->getDeclContext() != D->getLexicalDeclContext()) {
4341 LexicalDC = Importer.ImportContext(D->getLexicalDeclContext());
4346 // Import the location of this declaration.
4347 SourceLocation StartLoc = Importer.Import(D->getLocStart());
4348 SourceLocation IdLoc = Importer.Import(D->getLocation());
4350 // Import template arguments.
4351 SmallVector<TemplateArgument, 2> TemplateArgs;
4352 if (ImportTemplateArguments(D->getTemplateArgs().data(),
4353 D->getTemplateArgs().size(),
4357 // Try to find an existing specialization with these template arguments.
4358 void *InsertPos = nullptr;
4359 ClassTemplateSpecializationDecl *D2
4360 = ClassTemplate->findSpecialization(TemplateArgs, InsertPos);
4362 // We already have a class template specialization with these template
4365 // FIXME: Check for specialization vs. instantiation errors.
4367 if (RecordDecl *FoundDef = D2->getDefinition()) {
4368 if (!D->isCompleteDefinition() || IsStructuralMatch(D, FoundDef)) {
4369 // The record types structurally match, or the "from" translation
4370 // unit only had a forward declaration anyway; call it the same
4372 return Importer.Imported(D, FoundDef);
4376 // Create a new specialization.
4377 D2 = ClassTemplateSpecializationDecl::Create(Importer.getToContext(),
4378 D->getTagKind(), DC,
4381 TemplateArgs.data(),
4382 TemplateArgs.size(),
4383 /*PrevDecl=*/nullptr);
4384 D2->setSpecializationKind(D->getSpecializationKind());
4386 // Add this specialization to the class template.
4387 ClassTemplate->AddSpecialization(D2, InsertPos);
4389 // Import the qualifier, if any.
4390 D2->setQualifierInfo(Importer.Import(D->getQualifierLoc()));
4392 // Add the specialization to this context.
4393 D2->setLexicalDeclContext(LexicalDC);
4394 LexicalDC->addDeclInternal(D2);
4396 Importer.Imported(D, D2);
4398 if (D->isCompleteDefinition() && ImportDefinition(D, D2))
4404 Decl *ASTNodeImporter::VisitVarTemplateDecl(VarTemplateDecl *D) {
4405 // If this variable has a definition in the translation unit we're coming
4407 // but this particular declaration is not that definition, import the
4408 // definition and map to that.
4409 VarDecl *Definition =
4410 cast_or_null<VarDecl>(D->getTemplatedDecl()->getDefinition());
4411 if (Definition && Definition != D->getTemplatedDecl()) {
4412 Decl *ImportedDef = Importer.Import(Definition->getDescribedVarTemplate());
4416 return Importer.Imported(D, ImportedDef);
4419 // Import the major distinguishing characteristics of this variable template.
4420 DeclContext *DC, *LexicalDC;
4421 DeclarationName Name;
4424 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
4429 // We may already have a template of the same name; try to find and match it.
4430 assert(!DC->isFunctionOrMethod() &&
4431 "Variable templates cannot be declared at function scope");
4432 SmallVector<NamedDecl *, 4> ConflictingDecls;
4433 SmallVector<NamedDecl *, 2> FoundDecls;
4434 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls);
4435 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
4436 if (!FoundDecls[I]->isInIdentifierNamespace(Decl::IDNS_Ordinary))
4439 Decl *Found = FoundDecls[I];
4440 if (VarTemplateDecl *FoundTemplate = dyn_cast<VarTemplateDecl>(Found)) {
4441 if (IsStructuralMatch(D, FoundTemplate)) {
4442 // The variable templates structurally match; call it the same template.
4443 Importer.Imported(D->getTemplatedDecl(),
4444 FoundTemplate->getTemplatedDecl());
4445 return Importer.Imported(D, FoundTemplate);
4449 ConflictingDecls.push_back(FoundDecls[I]);
4452 if (!ConflictingDecls.empty()) {
4453 Name = Importer.HandleNameConflict(Name, DC, Decl::IDNS_Ordinary,
4454 ConflictingDecls.data(),
4455 ConflictingDecls.size());
4461 VarDecl *DTemplated = D->getTemplatedDecl();
4464 QualType T = Importer.Import(DTemplated->getType());
4468 // Create the declaration that is being templated.
4469 SourceLocation StartLoc = Importer.Import(DTemplated->getLocStart());
4470 SourceLocation IdLoc = Importer.Import(DTemplated->getLocation());
4471 TypeSourceInfo *TInfo = Importer.Import(DTemplated->getTypeSourceInfo());
4472 VarDecl *D2Templated = VarDecl::Create(Importer.getToContext(), DC, StartLoc,
4473 IdLoc, Name.getAsIdentifierInfo(), T,
4474 TInfo, DTemplated->getStorageClass());
4475 D2Templated->setAccess(DTemplated->getAccess());
4476 D2Templated->setQualifierInfo(Importer.Import(DTemplated->getQualifierLoc()));
4477 D2Templated->setLexicalDeclContext(LexicalDC);
4479 // Importer.Imported(DTemplated, D2Templated);
4480 // LexicalDC->addDeclInternal(D2Templated);
4482 // Merge the initializer.
4483 if (ImportDefinition(DTemplated, D2Templated))
4486 // Create the variable template declaration itself.
4487 TemplateParameterList *TemplateParams =
4488 ImportTemplateParameterList(D->getTemplateParameters());
4489 if (!TemplateParams)
4492 VarTemplateDecl *D2 = VarTemplateDecl::Create(
4493 Importer.getToContext(), DC, Loc, Name, TemplateParams, D2Templated);
4494 D2Templated->setDescribedVarTemplate(D2);
4496 D2->setAccess(D->getAccess());
4497 D2->setLexicalDeclContext(LexicalDC);
4498 LexicalDC->addDeclInternal(D2);
4500 // Note the relationship between the variable templates.
4501 Importer.Imported(D, D2);
4502 Importer.Imported(DTemplated, D2Templated);
4504 if (DTemplated->isThisDeclarationADefinition() &&
4505 !D2Templated->isThisDeclarationADefinition()) {
4506 // FIXME: Import definition!
4512 Decl *ASTNodeImporter::VisitVarTemplateSpecializationDecl(
4513 VarTemplateSpecializationDecl *D) {
4514 // If this record has a definition in the translation unit we're coming from,
4515 // but this particular declaration is not that definition, import the
4516 // definition and map to that.
4517 VarDecl *Definition = D->getDefinition();
4518 if (Definition && Definition != D) {
4519 Decl *ImportedDef = Importer.Import(Definition);
4523 return Importer.Imported(D, ImportedDef);
4526 VarTemplateDecl *VarTemplate = cast_or_null<VarTemplateDecl>(
4527 Importer.Import(D->getSpecializedTemplate()));
4531 // Import the context of this declaration.
4532 DeclContext *DC = VarTemplate->getDeclContext();
4536 DeclContext *LexicalDC = DC;
4537 if (D->getDeclContext() != D->getLexicalDeclContext()) {
4538 LexicalDC = Importer.ImportContext(D->getLexicalDeclContext());
4543 // Import the location of this declaration.
4544 SourceLocation StartLoc = Importer.Import(D->getLocStart());
4545 SourceLocation IdLoc = Importer.Import(D->getLocation());
4547 // Import template arguments.
4548 SmallVector<TemplateArgument, 2> TemplateArgs;
4549 if (ImportTemplateArguments(D->getTemplateArgs().data(),
4550 D->getTemplateArgs().size(), TemplateArgs))
4553 // Try to find an existing specialization with these template arguments.
4554 void *InsertPos = nullptr;
4555 VarTemplateSpecializationDecl *D2 = VarTemplate->findSpecialization(
4556 TemplateArgs, InsertPos);
4558 // We already have a variable template specialization with these template
4561 // FIXME: Check for specialization vs. instantiation errors.
4563 if (VarDecl *FoundDef = D2->getDefinition()) {
4564 if (!D->isThisDeclarationADefinition() ||
4565 IsStructuralMatch(D, FoundDef)) {
4566 // The record types structurally match, or the "from" translation
4567 // unit only had a forward declaration anyway; call it the same
4569 return Importer.Imported(D, FoundDef);
4575 QualType T = Importer.Import(D->getType());
4578 TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo());
4580 // Create a new specialization.
4581 D2 = VarTemplateSpecializationDecl::Create(
4582 Importer.getToContext(), DC, StartLoc, IdLoc, VarTemplate, T, TInfo,
4583 D->getStorageClass(), TemplateArgs.data(), TemplateArgs.size());
4584 D2->setSpecializationKind(D->getSpecializationKind());
4585 D2->setTemplateArgsInfo(D->getTemplateArgsInfo());
4587 // Add this specialization to the class template.
4588 VarTemplate->AddSpecialization(D2, InsertPos);
4590 // Import the qualifier, if any.
4591 D2->setQualifierInfo(Importer.Import(D->getQualifierLoc()));
4593 // Add the specialization to this context.
4594 D2->setLexicalDeclContext(LexicalDC);
4595 LexicalDC->addDeclInternal(D2);
4597 Importer.Imported(D, D2);
4599 if (D->isThisDeclarationADefinition() && ImportDefinition(D, D2))
4605 //----------------------------------------------------------------------------
4606 // Import Statements
4607 //----------------------------------------------------------------------------
4609 DeclGroupRef ASTNodeImporter::ImportDeclGroup(DeclGroupRef DG) {
4611 return DeclGroupRef::Create(Importer.getToContext(), nullptr, 0);
4612 size_t NumDecls = DG.end() - DG.begin();
4613 SmallVector<Decl *, 1> ToDecls(NumDecls);
4614 auto &_Importer = this->Importer;
4615 std::transform(DG.begin(), DG.end(), ToDecls.begin(),
4616 [&_Importer](Decl *D) -> Decl * {
4617 return _Importer.Import(D);
4619 return DeclGroupRef::Create(Importer.getToContext(),
4624 Stmt *ASTNodeImporter::VisitStmt(Stmt *S) {
4625 Importer.FromDiag(S->getLocStart(), diag::err_unsupported_ast_node)
4626 << S->getStmtClassName();
4630 Stmt *ASTNodeImporter::VisitDeclStmt(DeclStmt *S) {
4631 DeclGroupRef ToDG = ImportDeclGroup(S->getDeclGroup());
4632 for (Decl *ToD : ToDG) {
4636 SourceLocation ToStartLoc = Importer.Import(S->getStartLoc());
4637 SourceLocation ToEndLoc = Importer.Import(S->getEndLoc());
4638 return new (Importer.getToContext()) DeclStmt(ToDG, ToStartLoc, ToEndLoc);
4641 Stmt *ASTNodeImporter::VisitNullStmt(NullStmt *S) {
4642 SourceLocation ToSemiLoc = Importer.Import(S->getSemiLoc());
4643 return new (Importer.getToContext()) NullStmt(ToSemiLoc,
4644 S->hasLeadingEmptyMacro());
4647 Stmt *ASTNodeImporter::VisitCompoundStmt(CompoundStmt *S) {
4648 SmallVector<Stmt *, 4> ToStmts(S->size());
4649 auto &_Importer = this->Importer;
4650 std::transform(S->body_begin(), S->body_end(), ToStmts.begin(),
4651 [&_Importer](Stmt *CS) -> Stmt * {
4652 return _Importer.Import(CS);
4654 for (Stmt *ToS : ToStmts) {
4658 SourceLocation ToLBraceLoc = Importer.Import(S->getLBracLoc());
4659 SourceLocation ToRBraceLoc = Importer.Import(S->getRBracLoc());
4660 return new (Importer.getToContext()) CompoundStmt(Importer.getToContext(),
4662 ToLBraceLoc, ToRBraceLoc);
4665 Stmt *ASTNodeImporter::VisitCaseStmt(CaseStmt *S) {
4666 Expr *ToLHS = Importer.Import(S->getLHS());
4669 Expr *ToRHS = Importer.Import(S->getRHS());
4670 if (!ToRHS && S->getRHS())
4672 SourceLocation ToCaseLoc = Importer.Import(S->getCaseLoc());
4673 SourceLocation ToEllipsisLoc = Importer.Import(S->getEllipsisLoc());
4674 SourceLocation ToColonLoc = Importer.Import(S->getColonLoc());
4675 return new (Importer.getToContext()) CaseStmt(ToLHS, ToRHS,
4676 ToCaseLoc, ToEllipsisLoc,
4680 Stmt *ASTNodeImporter::VisitDefaultStmt(DefaultStmt *S) {
4681 SourceLocation ToDefaultLoc = Importer.Import(S->getDefaultLoc());
4682 SourceLocation ToColonLoc = Importer.Import(S->getColonLoc());
4683 Stmt *ToSubStmt = Importer.Import(S->getSubStmt());
4684 if (!ToSubStmt && S->getSubStmt())
4686 return new (Importer.getToContext()) DefaultStmt(ToDefaultLoc, ToColonLoc,
4690 Stmt *ASTNodeImporter::VisitLabelStmt(LabelStmt *S) {
4691 SourceLocation ToIdentLoc = Importer.Import(S->getIdentLoc());
4692 LabelDecl *ToLabelDecl =
4693 cast_or_null<LabelDecl>(Importer.Import(S->getDecl()));
4694 if (!ToLabelDecl && S->getDecl())
4696 Stmt *ToSubStmt = Importer.Import(S->getSubStmt());
4697 if (!ToSubStmt && S->getSubStmt())
4699 return new (Importer.getToContext()) LabelStmt(ToIdentLoc, ToLabelDecl,
4703 Stmt *ASTNodeImporter::VisitAttributedStmt(AttributedStmt *S) {
4704 SourceLocation ToAttrLoc = Importer.Import(S->getAttrLoc());
4705 ArrayRef<const Attr*> FromAttrs(S->getAttrs());
4706 SmallVector<const Attr *, 1> ToAttrs(FromAttrs.size());
4707 ASTContext &_ToContext = Importer.getToContext();
4708 std::transform(FromAttrs.begin(), FromAttrs.end(), ToAttrs.begin(),
4709 [&_ToContext](const Attr *A) -> const Attr * {
4710 return A->clone(_ToContext);
4712 for (const Attr *ToA : ToAttrs) {
4716 Stmt *ToSubStmt = Importer.Import(S->getSubStmt());
4717 if (!ToSubStmt && S->getSubStmt())
4719 return AttributedStmt::Create(Importer.getToContext(), ToAttrLoc,
4720 ToAttrs, ToSubStmt);
4723 Stmt *ASTNodeImporter::VisitIfStmt(IfStmt *S) {
4724 SourceLocation ToIfLoc = Importer.Import(S->getIfLoc());
4725 VarDecl *ToConditionVariable = nullptr;
4726 if (VarDecl *FromConditionVariable = S->getConditionVariable()) {
4727 ToConditionVariable =
4728 dyn_cast_or_null<VarDecl>(Importer.Import(FromConditionVariable));
4729 if (!ToConditionVariable)
4732 Expr *ToCondition = Importer.Import(S->getCond());
4733 if (!ToCondition && S->getCond())
4735 Stmt *ToThenStmt = Importer.Import(S->getThen());
4736 if (!ToThenStmt && S->getThen())
4738 SourceLocation ToElseLoc = Importer.Import(S->getElseLoc());
4739 Stmt *ToElseStmt = Importer.Import(S->getElse());
4740 if (!ToElseStmt && S->getElse())
4742 return new (Importer.getToContext()) IfStmt(Importer.getToContext(),
4743 ToIfLoc, ToConditionVariable,
4744 ToCondition, ToThenStmt,
4745 ToElseLoc, ToElseStmt);
4748 Stmt *ASTNodeImporter::VisitSwitchStmt(SwitchStmt *S) {
4749 VarDecl *ToConditionVariable = nullptr;
4750 if (VarDecl *FromConditionVariable = S->getConditionVariable()) {
4751 ToConditionVariable =
4752 dyn_cast_or_null<VarDecl>(Importer.Import(FromConditionVariable));
4753 if (!ToConditionVariable)
4756 Expr *ToCondition = Importer.Import(S->getCond());
4757 if (!ToCondition && S->getCond())
4759 SwitchStmt *ToStmt = new (Importer.getToContext()) SwitchStmt(
4760 Importer.getToContext(), ToConditionVariable,
4762 Stmt *ToBody = Importer.Import(S->getBody());
4763 if (!ToBody && S->getBody())
4765 ToStmt->setBody(ToBody);
4766 ToStmt->setSwitchLoc(Importer.Import(S->getSwitchLoc()));
4767 // Now we have to re-chain the cases.
4768 SwitchCase *LastChainedSwitchCase = nullptr;
4769 for (SwitchCase *SC = S->getSwitchCaseList(); SC != nullptr;
4770 SC = SC->getNextSwitchCase()) {
4771 SwitchCase *ToSC = dyn_cast_or_null<SwitchCase>(Importer.Import(SC));
4774 if (LastChainedSwitchCase)
4775 LastChainedSwitchCase->setNextSwitchCase(ToSC);
4777 ToStmt->setSwitchCaseList(ToSC);
4778 LastChainedSwitchCase = ToSC;
4783 Stmt *ASTNodeImporter::VisitWhileStmt(WhileStmt *S) {
4784 VarDecl *ToConditionVariable = nullptr;
4785 if (VarDecl *FromConditionVariable = S->getConditionVariable()) {
4786 ToConditionVariable =
4787 dyn_cast_or_null<VarDecl>(Importer.Import(FromConditionVariable));
4788 if (!ToConditionVariable)
4791 Expr *ToCondition = Importer.Import(S->getCond());
4792 if (!ToCondition && S->getCond())
4794 Stmt *ToBody = Importer.Import(S->getBody());
4795 if (!ToBody && S->getBody())
4797 SourceLocation ToWhileLoc = Importer.Import(S->getWhileLoc());
4798 return new (Importer.getToContext()) WhileStmt(Importer.getToContext(),
4799 ToConditionVariable,
4800 ToCondition, ToBody,
4804 Stmt *ASTNodeImporter::VisitDoStmt(DoStmt *S) {
4805 Stmt *ToBody = Importer.Import(S->getBody());
4806 if (!ToBody && S->getBody())
4808 Expr *ToCondition = Importer.Import(S->getCond());
4809 if (!ToCondition && S->getCond())
4811 SourceLocation ToDoLoc = Importer.Import(S->getDoLoc());
4812 SourceLocation ToWhileLoc = Importer.Import(S->getWhileLoc());
4813 SourceLocation ToRParenLoc = Importer.Import(S->getRParenLoc());
4814 return new (Importer.getToContext()) DoStmt(ToBody, ToCondition,
4815 ToDoLoc, ToWhileLoc,
4819 Stmt *ASTNodeImporter::VisitForStmt(ForStmt *S) {
4820 Stmt *ToInit = Importer.Import(S->getInit());
4821 if (!ToInit && S->getInit())
4823 Expr *ToCondition = Importer.Import(S->getCond());
4824 if (!ToCondition && S->getCond())
4826 VarDecl *ToConditionVariable = nullptr;
4827 if (VarDecl *FromConditionVariable = S->getConditionVariable()) {
4828 ToConditionVariable =
4829 dyn_cast_or_null<VarDecl>(Importer.Import(FromConditionVariable));
4830 if (!ToConditionVariable)
4833 Expr *ToInc = Importer.Import(S->getInc());
4834 if (!ToInc && S->getInc())
4836 Stmt *ToBody = Importer.Import(S->getBody());
4837 if (!ToBody && S->getBody())
4839 SourceLocation ToForLoc = Importer.Import(S->getForLoc());
4840 SourceLocation ToLParenLoc = Importer.Import(S->getLParenLoc());
4841 SourceLocation ToRParenLoc = Importer.Import(S->getRParenLoc());
4842 return new (Importer.getToContext()) ForStmt(Importer.getToContext(),
4843 ToInit, ToCondition,
4844 ToConditionVariable,
4846 ToForLoc, ToLParenLoc,
4850 Stmt *ASTNodeImporter::VisitGotoStmt(GotoStmt *S) {
4851 LabelDecl *ToLabel = nullptr;
4852 if (LabelDecl *FromLabel = S->getLabel()) {
4853 ToLabel = dyn_cast_or_null<LabelDecl>(Importer.Import(FromLabel));
4857 SourceLocation ToGotoLoc = Importer.Import(S->getGotoLoc());
4858 SourceLocation ToLabelLoc = Importer.Import(S->getLabelLoc());
4859 return new (Importer.getToContext()) GotoStmt(ToLabel,
4860 ToGotoLoc, ToLabelLoc);
4863 Stmt *ASTNodeImporter::VisitIndirectGotoStmt(IndirectGotoStmt *S) {
4864 SourceLocation ToGotoLoc = Importer.Import(S->getGotoLoc());
4865 SourceLocation ToStarLoc = Importer.Import(S->getStarLoc());
4866 Expr *ToTarget = Importer.Import(S->getTarget());
4867 if (!ToTarget && S->getTarget())
4869 return new (Importer.getToContext()) IndirectGotoStmt(ToGotoLoc, ToStarLoc,
4873 Stmt *ASTNodeImporter::VisitContinueStmt(ContinueStmt *S) {
4874 SourceLocation ToContinueLoc = Importer.Import(S->getContinueLoc());
4875 return new (Importer.getToContext()) ContinueStmt(ToContinueLoc);
4878 Stmt *ASTNodeImporter::VisitBreakStmt(BreakStmt *S) {
4879 SourceLocation ToBreakLoc = Importer.Import(S->getBreakLoc());
4880 return new (Importer.getToContext()) BreakStmt(ToBreakLoc);
4883 Stmt *ASTNodeImporter::VisitReturnStmt(ReturnStmt *S) {
4884 SourceLocation ToRetLoc = Importer.Import(S->getReturnLoc());
4885 Expr *ToRetExpr = Importer.Import(S->getRetValue());
4886 if (!ToRetExpr && S->getRetValue())
4888 VarDecl *NRVOCandidate = const_cast<VarDecl*>(S->getNRVOCandidate());
4889 VarDecl *ToNRVOCandidate = cast_or_null<VarDecl>(Importer.Import(NRVOCandidate));
4890 if (!ToNRVOCandidate && NRVOCandidate)
4892 return new (Importer.getToContext()) ReturnStmt(ToRetLoc, ToRetExpr,
4896 Stmt *ASTNodeImporter::VisitCXXCatchStmt(CXXCatchStmt *S) {
4897 SourceLocation ToCatchLoc = Importer.Import(S->getCatchLoc());
4898 VarDecl *ToExceptionDecl = nullptr;
4899 if (VarDecl *FromExceptionDecl = S->getExceptionDecl()) {
4901 dyn_cast_or_null<VarDecl>(Importer.Import(FromExceptionDecl));
4902 if (!ToExceptionDecl)
4905 Stmt *ToHandlerBlock = Importer.Import(S->getHandlerBlock());
4906 if (!ToHandlerBlock && S->getHandlerBlock())
4908 return new (Importer.getToContext()) CXXCatchStmt(ToCatchLoc,
4913 Stmt *ASTNodeImporter::VisitCXXTryStmt(CXXTryStmt *S) {
4914 SourceLocation ToTryLoc = Importer.Import(S->getTryLoc());
4915 Stmt *ToTryBlock = Importer.Import(S->getTryBlock());
4916 if (!ToTryBlock && S->getTryBlock())
4918 SmallVector<Stmt *, 1> ToHandlers(S->getNumHandlers());
4919 for (unsigned HI = 0, HE = S->getNumHandlers(); HI != HE; ++HI) {
4920 CXXCatchStmt *FromHandler = S->getHandler(HI);
4921 if (Stmt *ToHandler = Importer.Import(FromHandler))
4922 ToHandlers[HI] = ToHandler;
4926 return CXXTryStmt::Create(Importer.getToContext(), ToTryLoc, ToTryBlock,
4930 Stmt *ASTNodeImporter::VisitCXXForRangeStmt(CXXForRangeStmt *S) {
4932 dyn_cast_or_null<DeclStmt>(Importer.Import(S->getRangeStmt()));
4933 if (!ToRange && S->getRangeStmt())
4935 DeclStmt *ToBeginEnd =
4936 dyn_cast_or_null<DeclStmt>(Importer.Import(S->getBeginEndStmt()));
4937 if (!ToBeginEnd && S->getBeginEndStmt())
4939 Expr *ToCond = Importer.Import(S->getCond());
4940 if (!ToCond && S->getCond())
4942 Expr *ToInc = Importer.Import(S->getInc());
4943 if (!ToInc && S->getInc())
4945 DeclStmt *ToLoopVar =
4946 dyn_cast_or_null<DeclStmt>(Importer.Import(S->getLoopVarStmt()));
4947 if (!ToLoopVar && S->getLoopVarStmt())
4949 Stmt *ToBody = Importer.Import(S->getBody());
4950 if (!ToBody && S->getBody())
4952 SourceLocation ToForLoc = Importer.Import(S->getForLoc());
4953 SourceLocation ToCoawaitLoc = Importer.Import(S->getCoawaitLoc());
4954 SourceLocation ToColonLoc = Importer.Import(S->getColonLoc());
4955 SourceLocation ToRParenLoc = Importer.Import(S->getRParenLoc());
4956 return new (Importer.getToContext()) CXXForRangeStmt(ToRange, ToBeginEnd,
4959 ToForLoc, ToCoawaitLoc,
4960 ToColonLoc, ToRParenLoc);
4963 Stmt *ASTNodeImporter::VisitObjCForCollectionStmt(ObjCForCollectionStmt *S) {
4964 Stmt *ToElem = Importer.Import(S->getElement());
4965 if (!ToElem && S->getElement())
4967 Expr *ToCollect = Importer.Import(S->getCollection());
4968 if (!ToCollect && S->getCollection())
4970 Stmt *ToBody = Importer.Import(S->getBody());
4971 if (!ToBody && S->getBody())
4973 SourceLocation ToForLoc = Importer.Import(S->getForLoc());
4974 SourceLocation ToRParenLoc = Importer.Import(S->getRParenLoc());
4975 return new (Importer.getToContext()) ObjCForCollectionStmt(ToElem,
4981 Stmt *ASTNodeImporter::VisitObjCAtCatchStmt(ObjCAtCatchStmt *S) {
4982 SourceLocation ToAtCatchLoc = Importer.Import(S->getAtCatchLoc());
4983 SourceLocation ToRParenLoc = Importer.Import(S->getRParenLoc());
4984 VarDecl *ToExceptionDecl = nullptr;
4985 if (VarDecl *FromExceptionDecl = S->getCatchParamDecl()) {
4987 dyn_cast_or_null<VarDecl>(Importer.Import(FromExceptionDecl));
4988 if (!ToExceptionDecl)
4991 Stmt *ToBody = Importer.Import(S->getCatchBody());
4992 if (!ToBody && S->getCatchBody())
4994 return new (Importer.getToContext()) ObjCAtCatchStmt(ToAtCatchLoc,
5000 Stmt *ASTNodeImporter::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
5001 SourceLocation ToAtFinallyLoc = Importer.Import(S->getAtFinallyLoc());
5002 Stmt *ToAtFinallyStmt = Importer.Import(S->getFinallyBody());
5003 if (!ToAtFinallyStmt && S->getFinallyBody())
5005 return new (Importer.getToContext()) ObjCAtFinallyStmt(ToAtFinallyLoc,
5009 Stmt *ASTNodeImporter::VisitObjCAtTryStmt(ObjCAtTryStmt *S) {
5010 SourceLocation ToAtTryLoc = Importer.Import(S->getAtTryLoc());
5011 Stmt *ToAtTryStmt = Importer.Import(S->getTryBody());
5012 if (!ToAtTryStmt && S->getTryBody())
5014 SmallVector<Stmt *, 1> ToCatchStmts(S->getNumCatchStmts());
5015 for (unsigned CI = 0, CE = S->getNumCatchStmts(); CI != CE; ++CI) {
5016 ObjCAtCatchStmt *FromCatchStmt = S->getCatchStmt(CI);
5017 if (Stmt *ToCatchStmt = Importer.Import(FromCatchStmt))
5018 ToCatchStmts[CI] = ToCatchStmt;
5022 Stmt *ToAtFinallyStmt = Importer.Import(S->getFinallyStmt());
5023 if (!ToAtFinallyStmt && S->getFinallyStmt())
5025 return ObjCAtTryStmt::Create(Importer.getToContext(),
5026 ToAtTryLoc, ToAtTryStmt,
5027 ToCatchStmts.begin(), ToCatchStmts.size(),
5031 Stmt *ASTNodeImporter::VisitObjCAtSynchronizedStmt
5032 (ObjCAtSynchronizedStmt *S) {
5033 SourceLocation ToAtSynchronizedLoc =
5034 Importer.Import(S->getAtSynchronizedLoc());
5035 Expr *ToSynchExpr = Importer.Import(S->getSynchExpr());
5036 if (!ToSynchExpr && S->getSynchExpr())
5038 Stmt *ToSynchBody = Importer.Import(S->getSynchBody());
5039 if (!ToSynchBody && S->getSynchBody())
5041 return new (Importer.getToContext()) ObjCAtSynchronizedStmt(
5042 ToAtSynchronizedLoc, ToSynchExpr, ToSynchBody);
5045 Stmt *ASTNodeImporter::VisitObjCAtThrowStmt(ObjCAtThrowStmt *S) {
5046 SourceLocation ToAtThrowLoc = Importer.Import(S->getThrowLoc());
5047 Expr *ToThrow = Importer.Import(S->getThrowExpr());
5048 if (!ToThrow && S->getThrowExpr())
5050 return new (Importer.getToContext()) ObjCAtThrowStmt(ToAtThrowLoc, ToThrow);
5053 Stmt *ASTNodeImporter::VisitObjCAutoreleasePoolStmt
5054 (ObjCAutoreleasePoolStmt *S) {
5055 SourceLocation ToAtLoc = Importer.Import(S->getAtLoc());
5056 Stmt *ToSubStmt = Importer.Import(S->getSubStmt());
5057 if (!ToSubStmt && S->getSubStmt())
5059 return new (Importer.getToContext()) ObjCAutoreleasePoolStmt(ToAtLoc,
5063 //----------------------------------------------------------------------------
5064 // Import Expressions
5065 //----------------------------------------------------------------------------
5066 Expr *ASTNodeImporter::VisitExpr(Expr *E) {
5067 Importer.FromDiag(E->getLocStart(), diag::err_unsupported_ast_node)
5068 << E->getStmtClassName();
5072 Expr *ASTNodeImporter::VisitDeclRefExpr(DeclRefExpr *E) {
5073 ValueDecl *ToD = cast_or_null<ValueDecl>(Importer.Import(E->getDecl()));
5077 NamedDecl *FoundD = nullptr;
5078 if (E->getDecl() != E->getFoundDecl()) {
5079 FoundD = cast_or_null<NamedDecl>(Importer.Import(E->getFoundDecl()));
5084 QualType T = Importer.Import(E->getType());
5088 DeclRefExpr *DRE = DeclRefExpr::Create(Importer.getToContext(),
5089 Importer.Import(E->getQualifierLoc()),
5090 Importer.Import(E->getTemplateKeywordLoc()),
5092 E->refersToEnclosingVariableOrCapture(),
5093 Importer.Import(E->getLocation()),
5094 T, E->getValueKind(),
5096 /*FIXME:TemplateArgs=*/nullptr);
5097 if (E->hadMultipleCandidates())
5098 DRE->setHadMultipleCandidates(true);
5102 Expr *ASTNodeImporter::VisitIntegerLiteral(IntegerLiteral *E) {
5103 QualType T = Importer.Import(E->getType());
5107 return IntegerLiteral::Create(Importer.getToContext(),
5109 Importer.Import(E->getLocation()));
5112 Expr *ASTNodeImporter::VisitCharacterLiteral(CharacterLiteral *E) {
5113 QualType T = Importer.Import(E->getType());
5117 return new (Importer.getToContext()) CharacterLiteral(E->getValue(),
5119 Importer.Import(E->getLocation()));
5122 Expr *ASTNodeImporter::VisitParenExpr(ParenExpr *E) {
5123 Expr *SubExpr = Importer.Import(E->getSubExpr());
5127 return new (Importer.getToContext())
5128 ParenExpr(Importer.Import(E->getLParen()),
5129 Importer.Import(E->getRParen()),
5133 Expr *ASTNodeImporter::VisitUnaryOperator(UnaryOperator *E) {
5134 QualType T = Importer.Import(E->getType());
5138 Expr *SubExpr = Importer.Import(E->getSubExpr());
5142 return new (Importer.getToContext()) UnaryOperator(SubExpr, E->getOpcode(),
5143 T, E->getValueKind(),
5145 Importer.Import(E->getOperatorLoc()));
5148 Expr *ASTNodeImporter::VisitUnaryExprOrTypeTraitExpr(
5149 UnaryExprOrTypeTraitExpr *E) {
5150 QualType ResultType = Importer.Import(E->getType());
5152 if (E->isArgumentType()) {
5153 TypeSourceInfo *TInfo = Importer.Import(E->getArgumentTypeInfo());
5157 return new (Importer.getToContext()) UnaryExprOrTypeTraitExpr(E->getKind(),
5159 Importer.Import(E->getOperatorLoc()),
5160 Importer.Import(E->getRParenLoc()));
5163 Expr *SubExpr = Importer.Import(E->getArgumentExpr());
5167 return new (Importer.getToContext()) UnaryExprOrTypeTraitExpr(E->getKind(),
5168 SubExpr, ResultType,
5169 Importer.Import(E->getOperatorLoc()),
5170 Importer.Import(E->getRParenLoc()));
5173 Expr *ASTNodeImporter::VisitBinaryOperator(BinaryOperator *E) {
5174 QualType T = Importer.Import(E->getType());
5178 Expr *LHS = Importer.Import(E->getLHS());
5182 Expr *RHS = Importer.Import(E->getRHS());
5186 return new (Importer.getToContext()) BinaryOperator(LHS, RHS, E->getOpcode(),
5187 T, E->getValueKind(),
5189 Importer.Import(E->getOperatorLoc()),
5190 E->isFPContractable());
5193 Expr *ASTNodeImporter::VisitCompoundAssignOperator(CompoundAssignOperator *E) {
5194 QualType T = Importer.Import(E->getType());
5198 QualType CompLHSType = Importer.Import(E->getComputationLHSType());
5199 if (CompLHSType.isNull())
5202 QualType CompResultType = Importer.Import(E->getComputationResultType());
5203 if (CompResultType.isNull())
5206 Expr *LHS = Importer.Import(E->getLHS());
5210 Expr *RHS = Importer.Import(E->getRHS());
5214 return new (Importer.getToContext())
5215 CompoundAssignOperator(LHS, RHS, E->getOpcode(),
5216 T, E->getValueKind(),
5218 CompLHSType, CompResultType,
5219 Importer.Import(E->getOperatorLoc()),
5220 E->isFPContractable());
5223 static bool ImportCastPath(CastExpr *E, CXXCastPath &Path) {
5224 if (E->path_empty()) return false;
5226 // TODO: import cast paths
5230 Expr *ASTNodeImporter::VisitImplicitCastExpr(ImplicitCastExpr *E) {
5231 QualType T = Importer.Import(E->getType());
5235 Expr *SubExpr = Importer.Import(E->getSubExpr());
5239 CXXCastPath BasePath;
5240 if (ImportCastPath(E, BasePath))
5243 return ImplicitCastExpr::Create(Importer.getToContext(), T, E->getCastKind(),
5244 SubExpr, &BasePath, E->getValueKind());
5247 Expr *ASTNodeImporter::VisitCStyleCastExpr(CStyleCastExpr *E) {
5248 QualType T = Importer.Import(E->getType());
5252 Expr *SubExpr = Importer.Import(E->getSubExpr());
5256 TypeSourceInfo *TInfo = Importer.Import(E->getTypeInfoAsWritten());
5257 if (!TInfo && E->getTypeInfoAsWritten())
5260 CXXCastPath BasePath;
5261 if (ImportCastPath(E, BasePath))
5264 return CStyleCastExpr::Create(Importer.getToContext(), T,
5265 E->getValueKind(), E->getCastKind(),
5266 SubExpr, &BasePath, TInfo,
5267 Importer.Import(E->getLParenLoc()),
5268 Importer.Import(E->getRParenLoc()));
5271 Expr *ASTNodeImporter::VisitCXXConstructExpr(CXXConstructExpr *E) {
5272 QualType T = Importer.Import(E->getType());
5276 CXXConstructorDecl *ToCCD =
5277 dyn_cast<CXXConstructorDecl>(Importer.Import(E->getConstructor()));
5278 if (!ToCCD && E->getConstructor())
5281 size_t NumArgs = E->getNumArgs();
5282 SmallVector<Expr *, 1> ToArgs(NumArgs);
5283 ASTImporter &_Importer = Importer;
5284 std::transform(E->arg_begin(), E->arg_end(), ToArgs.begin(),
5285 [&_Importer](Expr *AE) -> Expr * {
5286 return _Importer.Import(AE);
5288 for (Expr *ToA : ToArgs) {
5293 return CXXConstructExpr::Create(Importer.getToContext(), T,
5294 Importer.Import(E->getLocation()),
5295 ToCCD, E->isElidable(),
5296 ToArgs, E->hadMultipleCandidates(),
5297 E->isListInitialization(),
5298 E->isStdInitListInitialization(),
5299 E->requiresZeroInitialization(),
5300 E->getConstructionKind(),
5301 Importer.Import(E->getParenOrBraceRange()));
5304 Expr *ASTNodeImporter::VisitMemberExpr(MemberExpr *E) {
5305 QualType T = Importer.Import(E->getType());
5309 Expr *ToBase = Importer.Import(E->getBase());
5310 if (!ToBase && E->getBase())
5313 ValueDecl *ToMember = dyn_cast<ValueDecl>(Importer.Import(E->getMemberDecl()));
5314 if (!ToMember && E->getMemberDecl())
5317 DeclAccessPair ToFoundDecl = DeclAccessPair::make(
5318 dyn_cast<NamedDecl>(Importer.Import(E->getFoundDecl().getDecl())),
5319 E->getFoundDecl().getAccess());
5321 DeclarationNameInfo ToMemberNameInfo(
5322 Importer.Import(E->getMemberNameInfo().getName()),
5323 Importer.Import(E->getMemberNameInfo().getLoc()));
5325 if (E->hasExplicitTemplateArgs()) {
5326 return nullptr; // FIXME: handle template arguments
5329 return MemberExpr::Create(Importer.getToContext(), ToBase,
5331 Importer.Import(E->getOperatorLoc()),
5332 Importer.Import(E->getQualifierLoc()),
5333 Importer.Import(E->getTemplateKeywordLoc()),
5334 ToMember, ToFoundDecl, ToMemberNameInfo,
5335 nullptr, T, E->getValueKind(),
5336 E->getObjectKind());
5339 Expr *ASTNodeImporter::VisitCallExpr(CallExpr *E) {
5340 QualType T = Importer.Import(E->getType());
5344 Expr *ToCallee = Importer.Import(E->getCallee());
5345 if (!ToCallee && E->getCallee())
5348 unsigned NumArgs = E->getNumArgs();
5350 llvm::SmallVector<Expr *, 2> ToArgs(NumArgs);
5352 for (unsigned ai = 0, ae = NumArgs; ai != ae; ++ai) {
5353 Expr *FromArg = E->getArg(ai);
5354 Expr *ToArg = Importer.Import(FromArg);
5360 Expr **ToArgs_Copied = new (Importer.getToContext())
5363 for (unsigned ai = 0, ae = NumArgs; ai != ae; ++ai)
5364 ToArgs_Copied[ai] = ToArgs[ai];
5366 return new (Importer.getToContext())
5367 CallExpr(Importer.getToContext(), ToCallee,
5368 llvm::makeArrayRef(ToArgs_Copied, NumArgs), T, E->getValueKind(),
5369 Importer.Import(E->getRParenLoc()));
5372 ASTImporter::ASTImporter(ASTContext &ToContext, FileManager &ToFileManager,
5373 ASTContext &FromContext, FileManager &FromFileManager,
5375 : ToContext(ToContext), FromContext(FromContext),
5376 ToFileManager(ToFileManager), FromFileManager(FromFileManager),
5377 Minimal(MinimalImport), LastDiagFromFrom(false)
5379 ImportedDecls[FromContext.getTranslationUnitDecl()]
5380 = ToContext.getTranslationUnitDecl();
5383 ASTImporter::~ASTImporter() { }
5385 QualType ASTImporter::Import(QualType FromT) {
5389 const Type *fromTy = FromT.getTypePtr();
5391 // Check whether we've already imported this type.
5392 llvm::DenseMap<const Type *, const Type *>::iterator Pos
5393 = ImportedTypes.find(fromTy);
5394 if (Pos != ImportedTypes.end())
5395 return ToContext.getQualifiedType(Pos->second, FromT.getLocalQualifiers());
5398 ASTNodeImporter Importer(*this);
5399 QualType ToT = Importer.Visit(fromTy);
5403 // Record the imported type.
5404 ImportedTypes[fromTy] = ToT.getTypePtr();
5406 return ToContext.getQualifiedType(ToT, FromT.getLocalQualifiers());
5409 TypeSourceInfo *ASTImporter::Import(TypeSourceInfo *FromTSI) {
5413 // FIXME: For now we just create a "trivial" type source info based
5414 // on the type and a single location. Implement a real version of this.
5415 QualType T = Import(FromTSI->getType());
5419 return ToContext.getTrivialTypeSourceInfo(T,
5420 Import(FromTSI->getTypeLoc().getLocStart()));
5423 Decl *ASTImporter::GetAlreadyImportedOrNull(Decl *FromD) {
5424 llvm::DenseMap<Decl *, Decl *>::iterator Pos = ImportedDecls.find(FromD);
5425 if (Pos != ImportedDecls.end()) {
5426 Decl *ToD = Pos->second;
5427 ASTNodeImporter(*this).ImportDefinitionIfNeeded(FromD, ToD);
5434 Decl *ASTImporter::Import(Decl *FromD) {
5438 ASTNodeImporter Importer(*this);
5440 // Check whether we've already imported this declaration.
5441 llvm::DenseMap<Decl *, Decl *>::iterator Pos = ImportedDecls.find(FromD);
5442 if (Pos != ImportedDecls.end()) {
5443 Decl *ToD = Pos->second;
5444 Importer.ImportDefinitionIfNeeded(FromD, ToD);
5449 Decl *ToD = Importer.Visit(FromD);
5453 // Record the imported declaration.
5454 ImportedDecls[FromD] = ToD;
5456 if (TagDecl *FromTag = dyn_cast<TagDecl>(FromD)) {
5457 // Keep track of anonymous tags that have an associated typedef.
5458 if (FromTag->getTypedefNameForAnonDecl())
5459 AnonTagsWithPendingTypedefs.push_back(FromTag);
5460 } else if (TypedefNameDecl *FromTypedef = dyn_cast<TypedefNameDecl>(FromD)) {
5461 // When we've finished transforming a typedef, see whether it was the
5462 // typedef for an anonymous tag.
5463 for (SmallVectorImpl<TagDecl *>::iterator
5464 FromTag = AnonTagsWithPendingTypedefs.begin(),
5465 FromTagEnd = AnonTagsWithPendingTypedefs.end();
5466 FromTag != FromTagEnd; ++FromTag) {
5467 if ((*FromTag)->getTypedefNameForAnonDecl() == FromTypedef) {
5468 if (TagDecl *ToTag = cast_or_null<TagDecl>(Import(*FromTag))) {
5469 // We found the typedef for an anonymous tag; link them.
5470 ToTag->setTypedefNameForAnonDecl(cast<TypedefNameDecl>(ToD));
5471 AnonTagsWithPendingTypedefs.erase(FromTag);
5481 DeclContext *ASTImporter::ImportContext(DeclContext *FromDC) {
5485 DeclContext *ToDC = cast_or_null<DeclContext>(Import(cast<Decl>(FromDC)));
5489 // When we're using a record/enum/Objective-C class/protocol as a context, we
5490 // need it to have a definition.
5491 if (RecordDecl *ToRecord = dyn_cast<RecordDecl>(ToDC)) {
5492 RecordDecl *FromRecord = cast<RecordDecl>(FromDC);
5493 if (ToRecord->isCompleteDefinition()) {
5495 } else if (FromRecord->isCompleteDefinition()) {
5496 ASTNodeImporter(*this).ImportDefinition(FromRecord, ToRecord,
5497 ASTNodeImporter::IDK_Basic);
5499 CompleteDecl(ToRecord);
5501 } else if (EnumDecl *ToEnum = dyn_cast<EnumDecl>(ToDC)) {
5502 EnumDecl *FromEnum = cast<EnumDecl>(FromDC);
5503 if (ToEnum->isCompleteDefinition()) {
5505 } else if (FromEnum->isCompleteDefinition()) {
5506 ASTNodeImporter(*this).ImportDefinition(FromEnum, ToEnum,
5507 ASTNodeImporter::IDK_Basic);
5509 CompleteDecl(ToEnum);
5511 } else if (ObjCInterfaceDecl *ToClass = dyn_cast<ObjCInterfaceDecl>(ToDC)) {
5512 ObjCInterfaceDecl *FromClass = cast<ObjCInterfaceDecl>(FromDC);
5513 if (ToClass->getDefinition()) {
5515 } else if (ObjCInterfaceDecl *FromDef = FromClass->getDefinition()) {
5516 ASTNodeImporter(*this).ImportDefinition(FromDef, ToClass,
5517 ASTNodeImporter::IDK_Basic);
5519 CompleteDecl(ToClass);
5521 } else if (ObjCProtocolDecl *ToProto = dyn_cast<ObjCProtocolDecl>(ToDC)) {
5522 ObjCProtocolDecl *FromProto = cast<ObjCProtocolDecl>(FromDC);
5523 if (ToProto->getDefinition()) {
5525 } else if (ObjCProtocolDecl *FromDef = FromProto->getDefinition()) {
5526 ASTNodeImporter(*this).ImportDefinition(FromDef, ToProto,
5527 ASTNodeImporter::IDK_Basic);
5529 CompleteDecl(ToProto);
5536 Expr *ASTImporter::Import(Expr *FromE) {
5540 return cast_or_null<Expr>(Import(cast<Stmt>(FromE)));
5543 Stmt *ASTImporter::Import(Stmt *FromS) {
5547 // Check whether we've already imported this declaration.
5548 llvm::DenseMap<Stmt *, Stmt *>::iterator Pos = ImportedStmts.find(FromS);
5549 if (Pos != ImportedStmts.end())
5553 ASTNodeImporter Importer(*this);
5554 Stmt *ToS = Importer.Visit(FromS);
5558 // Record the imported declaration.
5559 ImportedStmts[FromS] = ToS;
5563 NestedNameSpecifier *ASTImporter::Import(NestedNameSpecifier *FromNNS) {
5567 NestedNameSpecifier *prefix = Import(FromNNS->getPrefix());
5569 switch (FromNNS->getKind()) {
5570 case NestedNameSpecifier::Identifier:
5571 if (IdentifierInfo *II = Import(FromNNS->getAsIdentifier())) {
5572 return NestedNameSpecifier::Create(ToContext, prefix, II);
5576 case NestedNameSpecifier::Namespace:
5577 if (NamespaceDecl *NS =
5578 cast<NamespaceDecl>(Import(FromNNS->getAsNamespace()))) {
5579 return NestedNameSpecifier::Create(ToContext, prefix, NS);
5583 case NestedNameSpecifier::NamespaceAlias:
5584 if (NamespaceAliasDecl *NSAD =
5585 cast<NamespaceAliasDecl>(Import(FromNNS->getAsNamespaceAlias()))) {
5586 return NestedNameSpecifier::Create(ToContext, prefix, NSAD);
5590 case NestedNameSpecifier::Global:
5591 return NestedNameSpecifier::GlobalSpecifier(ToContext);
5593 case NestedNameSpecifier::Super:
5594 if (CXXRecordDecl *RD =
5595 cast<CXXRecordDecl>(Import(FromNNS->getAsRecordDecl()))) {
5596 return NestedNameSpecifier::SuperSpecifier(ToContext, RD);
5600 case NestedNameSpecifier::TypeSpec:
5601 case NestedNameSpecifier::TypeSpecWithTemplate: {
5602 QualType T = Import(QualType(FromNNS->getAsType(), 0u));
5604 bool bTemplate = FromNNS->getKind() ==
5605 NestedNameSpecifier::TypeSpecWithTemplate;
5606 return NestedNameSpecifier::Create(ToContext, prefix,
5607 bTemplate, T.getTypePtr());
5613 llvm_unreachable("Invalid nested name specifier kind");
5616 NestedNameSpecifierLoc ASTImporter::Import(NestedNameSpecifierLoc FromNNS) {
5617 // FIXME: Implement!
5618 return NestedNameSpecifierLoc();
5621 TemplateName ASTImporter::Import(TemplateName From) {
5622 switch (From.getKind()) {
5623 case TemplateName::Template:
5624 if (TemplateDecl *ToTemplate
5625 = cast_or_null<TemplateDecl>(Import(From.getAsTemplateDecl())))
5626 return TemplateName(ToTemplate);
5628 return TemplateName();
5630 case TemplateName::OverloadedTemplate: {
5631 OverloadedTemplateStorage *FromStorage = From.getAsOverloadedTemplate();
5632 UnresolvedSet<2> ToTemplates;
5633 for (OverloadedTemplateStorage::iterator I = FromStorage->begin(),
5634 E = FromStorage->end();
5636 if (NamedDecl *To = cast_or_null<NamedDecl>(Import(*I)))
5637 ToTemplates.addDecl(To);
5639 return TemplateName();
5641 return ToContext.getOverloadedTemplateName(ToTemplates.begin(),
5645 case TemplateName::QualifiedTemplate: {
5646 QualifiedTemplateName *QTN = From.getAsQualifiedTemplateName();
5647 NestedNameSpecifier *Qualifier = Import(QTN->getQualifier());
5649 return TemplateName();
5651 if (TemplateDecl *ToTemplate
5652 = cast_or_null<TemplateDecl>(Import(From.getAsTemplateDecl())))
5653 return ToContext.getQualifiedTemplateName(Qualifier,
5654 QTN->hasTemplateKeyword(),
5657 return TemplateName();
5660 case TemplateName::DependentTemplate: {
5661 DependentTemplateName *DTN = From.getAsDependentTemplateName();
5662 NestedNameSpecifier *Qualifier = Import(DTN->getQualifier());
5664 return TemplateName();
5666 if (DTN->isIdentifier()) {
5667 return ToContext.getDependentTemplateName(Qualifier,
5668 Import(DTN->getIdentifier()));
5671 return ToContext.getDependentTemplateName(Qualifier, DTN->getOperator());
5674 case TemplateName::SubstTemplateTemplateParm: {
5675 SubstTemplateTemplateParmStorage *subst
5676 = From.getAsSubstTemplateTemplateParm();
5677 TemplateTemplateParmDecl *param
5678 = cast_or_null<TemplateTemplateParmDecl>(Import(subst->getParameter()));
5680 return TemplateName();
5682 TemplateName replacement = Import(subst->getReplacement());
5683 if (replacement.isNull()) return TemplateName();
5685 return ToContext.getSubstTemplateTemplateParm(param, replacement);
5688 case TemplateName::SubstTemplateTemplateParmPack: {
5689 SubstTemplateTemplateParmPackStorage *SubstPack
5690 = From.getAsSubstTemplateTemplateParmPack();
5691 TemplateTemplateParmDecl *Param
5692 = cast_or_null<TemplateTemplateParmDecl>(
5693 Import(SubstPack->getParameterPack()));
5695 return TemplateName();
5697 ASTNodeImporter Importer(*this);
5698 TemplateArgument ArgPack
5699 = Importer.ImportTemplateArgument(SubstPack->getArgumentPack());
5700 if (ArgPack.isNull())
5701 return TemplateName();
5703 return ToContext.getSubstTemplateTemplateParmPack(Param, ArgPack);
5707 llvm_unreachable("Invalid template name kind");
5710 SourceLocation ASTImporter::Import(SourceLocation FromLoc) {
5711 if (FromLoc.isInvalid())
5712 return SourceLocation();
5714 SourceManager &FromSM = FromContext.getSourceManager();
5716 // For now, map everything down to its spelling location, so that we
5717 // don't have to import macro expansions.
5718 // FIXME: Import macro expansions!
5719 FromLoc = FromSM.getSpellingLoc(FromLoc);
5720 std::pair<FileID, unsigned> Decomposed = FromSM.getDecomposedLoc(FromLoc);
5721 SourceManager &ToSM = ToContext.getSourceManager();
5722 FileID ToFileID = Import(Decomposed.first);
5723 if (ToFileID.isInvalid())
5724 return SourceLocation();
5725 SourceLocation ret = ToSM.getLocForStartOfFile(ToFileID)
5726 .getLocWithOffset(Decomposed.second);
5730 SourceRange ASTImporter::Import(SourceRange FromRange) {
5731 return SourceRange(Import(FromRange.getBegin()), Import(FromRange.getEnd()));
5734 FileID ASTImporter::Import(FileID FromID) {
5735 llvm::DenseMap<FileID, FileID>::iterator Pos
5736 = ImportedFileIDs.find(FromID);
5737 if (Pos != ImportedFileIDs.end())
5740 SourceManager &FromSM = FromContext.getSourceManager();
5741 SourceManager &ToSM = ToContext.getSourceManager();
5742 const SrcMgr::SLocEntry &FromSLoc = FromSM.getSLocEntry(FromID);
5743 assert(FromSLoc.isFile() && "Cannot handle macro expansions yet");
5745 // Include location of this file.
5746 SourceLocation ToIncludeLoc = Import(FromSLoc.getFile().getIncludeLoc());
5748 // Map the FileID for to the "to" source manager.
5750 const SrcMgr::ContentCache *Cache = FromSLoc.getFile().getContentCache();
5751 if (Cache->OrigEntry && Cache->OrigEntry->getDir()) {
5752 // FIXME: We probably want to use getVirtualFile(), so we don't hit the
5754 // FIXME: We definitely want to re-use the existing MemoryBuffer, rather
5755 // than mmap the files several times.
5756 const FileEntry *Entry = ToFileManager.getFile(Cache->OrigEntry->getName());
5759 ToID = ToSM.createFileID(Entry, ToIncludeLoc,
5760 FromSLoc.getFile().getFileCharacteristic());
5762 // FIXME: We want to re-use the existing MemoryBuffer!
5763 const llvm::MemoryBuffer *
5764 FromBuf = Cache->getBuffer(FromContext.getDiagnostics(), FromSM);
5765 std::unique_ptr<llvm::MemoryBuffer> ToBuf
5766 = llvm::MemoryBuffer::getMemBufferCopy(FromBuf->getBuffer(),
5767 FromBuf->getBufferIdentifier());
5768 ToID = ToSM.createFileID(std::move(ToBuf),
5769 FromSLoc.getFile().getFileCharacteristic());
5773 ImportedFileIDs[FromID] = ToID;
5777 void ASTImporter::ImportDefinition(Decl *From) {
5778 Decl *To = Import(From);
5782 if (DeclContext *FromDC = cast<DeclContext>(From)) {
5783 ASTNodeImporter Importer(*this);
5785 if (RecordDecl *ToRecord = dyn_cast<RecordDecl>(To)) {
5786 if (!ToRecord->getDefinition()) {
5787 Importer.ImportDefinition(cast<RecordDecl>(FromDC), ToRecord,
5788 ASTNodeImporter::IDK_Everything);
5793 if (EnumDecl *ToEnum = dyn_cast<EnumDecl>(To)) {
5794 if (!ToEnum->getDefinition()) {
5795 Importer.ImportDefinition(cast<EnumDecl>(FromDC), ToEnum,
5796 ASTNodeImporter::IDK_Everything);
5801 if (ObjCInterfaceDecl *ToIFace = dyn_cast<ObjCInterfaceDecl>(To)) {
5802 if (!ToIFace->getDefinition()) {
5803 Importer.ImportDefinition(cast<ObjCInterfaceDecl>(FromDC), ToIFace,
5804 ASTNodeImporter::IDK_Everything);
5809 if (ObjCProtocolDecl *ToProto = dyn_cast<ObjCProtocolDecl>(To)) {
5810 if (!ToProto->getDefinition()) {
5811 Importer.ImportDefinition(cast<ObjCProtocolDecl>(FromDC), ToProto,
5812 ASTNodeImporter::IDK_Everything);
5817 Importer.ImportDeclContext(FromDC, true);
5821 DeclarationName ASTImporter::Import(DeclarationName FromName) {
5823 return DeclarationName();
5825 switch (FromName.getNameKind()) {
5826 case DeclarationName::Identifier:
5827 return Import(FromName.getAsIdentifierInfo());
5829 case DeclarationName::ObjCZeroArgSelector:
5830 case DeclarationName::ObjCOneArgSelector:
5831 case DeclarationName::ObjCMultiArgSelector:
5832 return Import(FromName.getObjCSelector());
5834 case DeclarationName::CXXConstructorName: {
5835 QualType T = Import(FromName.getCXXNameType());
5837 return DeclarationName();
5839 return ToContext.DeclarationNames.getCXXConstructorName(
5840 ToContext.getCanonicalType(T));
5843 case DeclarationName::CXXDestructorName: {
5844 QualType T = Import(FromName.getCXXNameType());
5846 return DeclarationName();
5848 return ToContext.DeclarationNames.getCXXDestructorName(
5849 ToContext.getCanonicalType(T));
5852 case DeclarationName::CXXConversionFunctionName: {
5853 QualType T = Import(FromName.getCXXNameType());
5855 return DeclarationName();
5857 return ToContext.DeclarationNames.getCXXConversionFunctionName(
5858 ToContext.getCanonicalType(T));
5861 case DeclarationName::CXXOperatorName:
5862 return ToContext.DeclarationNames.getCXXOperatorName(
5863 FromName.getCXXOverloadedOperator());
5865 case DeclarationName::CXXLiteralOperatorName:
5866 return ToContext.DeclarationNames.getCXXLiteralOperatorName(
5867 Import(FromName.getCXXLiteralIdentifier()));
5869 case DeclarationName::CXXUsingDirective:
5871 return DeclarationName::getUsingDirectiveName();
5874 llvm_unreachable("Invalid DeclarationName Kind!");
5877 IdentifierInfo *ASTImporter::Import(const IdentifierInfo *FromId) {
5881 return &ToContext.Idents.get(FromId->getName());
5884 Selector ASTImporter::Import(Selector FromSel) {
5885 if (FromSel.isNull())
5888 SmallVector<IdentifierInfo *, 4> Idents;
5889 Idents.push_back(Import(FromSel.getIdentifierInfoForSlot(0)));
5890 for (unsigned I = 1, N = FromSel.getNumArgs(); I < N; ++I)
5891 Idents.push_back(Import(FromSel.getIdentifierInfoForSlot(I)));
5892 return ToContext.Selectors.getSelector(FromSel.getNumArgs(), Idents.data());
5895 DeclarationName ASTImporter::HandleNameConflict(DeclarationName Name,
5899 unsigned NumDecls) {
5903 DiagnosticBuilder ASTImporter::ToDiag(SourceLocation Loc, unsigned DiagID) {
5904 if (LastDiagFromFrom)
5905 ToContext.getDiagnostics().notePriorDiagnosticFrom(
5906 FromContext.getDiagnostics());
5907 LastDiagFromFrom = false;
5908 return ToContext.getDiagnostics().Report(Loc, DiagID);
5911 DiagnosticBuilder ASTImporter::FromDiag(SourceLocation Loc, unsigned DiagID) {
5912 if (!LastDiagFromFrom)
5913 FromContext.getDiagnostics().notePriorDiagnosticFrom(
5914 ToContext.getDiagnostics());
5915 LastDiagFromFrom = true;
5916 return FromContext.getDiagnostics().Report(Loc, DiagID);
5919 void ASTImporter::CompleteDecl (Decl *D) {
5920 if (ObjCInterfaceDecl *ID = dyn_cast<ObjCInterfaceDecl>(D)) {
5921 if (!ID->getDefinition())
5922 ID->startDefinition();
5924 else if (ObjCProtocolDecl *PD = dyn_cast<ObjCProtocolDecl>(D)) {
5925 if (!PD->getDefinition())
5926 PD->startDefinition();
5928 else if (TagDecl *TD = dyn_cast<TagDecl>(D)) {
5929 if (!TD->getDefinition() && !TD->isBeingDefined()) {
5930 TD->startDefinition();
5931 TD->setCompleteDefinition(true);
5935 assert (0 && "CompleteDecl called on a Decl that can't be completed");
5939 Decl *ASTImporter::Imported(Decl *From, Decl *To) {
5940 ImportedDecls[From] = To;
5944 bool ASTImporter::IsStructurallyEquivalent(QualType From, QualType To,
5946 llvm::DenseMap<const Type *, const Type *>::iterator Pos
5947 = ImportedTypes.find(From.getTypePtr());
5948 if (Pos != ImportedTypes.end() && ToContext.hasSameType(Import(From), To))
5951 StructuralEquivalenceContext Ctx(FromContext, ToContext, NonEquivalentDecls,
5953 return Ctx.IsStructurallyEquivalent(From, To);