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 // FIXME: TemplateTypeParmType
71 // FIXME: SubstTemplateTypeParmType
72 QualType
VisitTemplateSpecializationType(const TemplateSpecializationType
*T
);
73 QualType
VisitElaboratedType(const ElaboratedType
*T
);
74 // FIXME: DependentNameType
75 // FIXME: DependentTemplateSpecializationType
76 QualType
VisitObjCInterfaceType(const ObjCInterfaceType
*T
);
77 QualType
VisitObjCObjectType(const ObjCObjectType
*T
);
78 QualType
VisitObjCObjectPointerType(const ObjCObjectPointerType
*T
);
80 // Importing declarations
81 bool ImportDeclParts(NamedDecl
*D
, DeclContext
*&DC
,
82 DeclContext
*&LexicalDC
, DeclarationName
&Name
,
84 void ImportDefinitionIfNeeded(Decl
*FromD
, Decl
*ToD
= nullptr);
85 void ImportDeclarationNameLoc(const DeclarationNameInfo
&From
,
86 DeclarationNameInfo
& To
);
87 void ImportDeclContext(DeclContext
*FromDC
, bool ForceImport
= false);
89 /// \brief What we should import from the definition.
90 enum ImportDefinitionKind
{
91 /// \brief Import the default subset of the definition, which might be
92 /// nothing (if minimal import is set) or might be everything (if minimal
93 /// import is not set).
95 /// \brief Import everything.
97 /// \brief Import only the bare bones needed to establish a valid
102 bool shouldForceImportDeclContext(ImportDefinitionKind IDK
) {
103 return IDK
== IDK_Everything
||
104 (IDK
== IDK_Default
&& !Importer
.isMinimalImport());
107 bool ImportDefinition(RecordDecl
*From
, RecordDecl
*To
,
108 ImportDefinitionKind Kind
= IDK_Default
);
109 bool ImportDefinition(VarDecl
*From
, VarDecl
*To
,
110 ImportDefinitionKind Kind
= IDK_Default
);
111 bool ImportDefinition(EnumDecl
*From
, EnumDecl
*To
,
112 ImportDefinitionKind Kind
= IDK_Default
);
113 bool ImportDefinition(ObjCInterfaceDecl
*From
, ObjCInterfaceDecl
*To
,
114 ImportDefinitionKind Kind
= IDK_Default
);
115 bool ImportDefinition(ObjCProtocolDecl
*From
, ObjCProtocolDecl
*To
,
116 ImportDefinitionKind Kind
= IDK_Default
);
117 TemplateParameterList
*ImportTemplateParameterList(
118 TemplateParameterList
*Params
);
119 TemplateArgument
ImportTemplateArgument(const TemplateArgument
&From
);
120 bool ImportTemplateArguments(const TemplateArgument
*FromArgs
,
121 unsigned NumFromArgs
,
122 SmallVectorImpl
<TemplateArgument
> &ToArgs
);
123 bool IsStructuralMatch(RecordDecl
*FromRecord
, RecordDecl
*ToRecord
,
124 bool Complain
= true);
125 bool IsStructuralMatch(VarDecl
*FromVar
, VarDecl
*ToVar
,
126 bool Complain
= true);
127 bool IsStructuralMatch(EnumDecl
*FromEnum
, EnumDecl
*ToRecord
);
128 bool IsStructuralMatch(EnumConstantDecl
*FromEC
, EnumConstantDecl
*ToEC
);
129 bool IsStructuralMatch(ClassTemplateDecl
*From
, ClassTemplateDecl
*To
);
130 bool IsStructuralMatch(VarTemplateDecl
*From
, VarTemplateDecl
*To
);
131 Decl
*VisitDecl(Decl
*D
);
132 Decl
*VisitTranslationUnitDecl(TranslationUnitDecl
*D
);
133 Decl
*VisitNamespaceDecl(NamespaceDecl
*D
);
134 Decl
*VisitTypedefNameDecl(TypedefNameDecl
*D
, bool IsAlias
);
135 Decl
*VisitTypedefDecl(TypedefDecl
*D
);
136 Decl
*VisitTypeAliasDecl(TypeAliasDecl
*D
);
137 Decl
*VisitEnumDecl(EnumDecl
*D
);
138 Decl
*VisitRecordDecl(RecordDecl
*D
);
139 Decl
*VisitEnumConstantDecl(EnumConstantDecl
*D
);
140 Decl
*VisitFunctionDecl(FunctionDecl
*D
);
141 Decl
*VisitCXXMethodDecl(CXXMethodDecl
*D
);
142 Decl
*VisitCXXConstructorDecl(CXXConstructorDecl
*D
);
143 Decl
*VisitCXXDestructorDecl(CXXDestructorDecl
*D
);
144 Decl
*VisitCXXConversionDecl(CXXConversionDecl
*D
);
145 Decl
*VisitFieldDecl(FieldDecl
*D
);
146 Decl
*VisitIndirectFieldDecl(IndirectFieldDecl
*D
);
147 Decl
*VisitObjCIvarDecl(ObjCIvarDecl
*D
);
148 Decl
*VisitVarDecl(VarDecl
*D
);
149 Decl
*VisitImplicitParamDecl(ImplicitParamDecl
*D
);
150 Decl
*VisitParmVarDecl(ParmVarDecl
*D
);
151 Decl
*VisitObjCMethodDecl(ObjCMethodDecl
*D
);
152 Decl
*VisitObjCCategoryDecl(ObjCCategoryDecl
*D
);
153 Decl
*VisitObjCProtocolDecl(ObjCProtocolDecl
*D
);
154 Decl
*VisitLinkageSpecDecl(LinkageSpecDecl
*D
);
155 Decl
*VisitObjCInterfaceDecl(ObjCInterfaceDecl
*D
);
156 Decl
*VisitObjCCategoryImplDecl(ObjCCategoryImplDecl
*D
);
157 Decl
*VisitObjCImplementationDecl(ObjCImplementationDecl
*D
);
158 Decl
*VisitObjCPropertyDecl(ObjCPropertyDecl
*D
);
159 Decl
*VisitObjCPropertyImplDecl(ObjCPropertyImplDecl
*D
);
160 Decl
*VisitTemplateTypeParmDecl(TemplateTypeParmDecl
*D
);
161 Decl
*VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl
*D
);
162 Decl
*VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl
*D
);
163 Decl
*VisitClassTemplateDecl(ClassTemplateDecl
*D
);
164 Decl
*VisitClassTemplateSpecializationDecl(
165 ClassTemplateSpecializationDecl
*D
);
166 Decl
*VisitVarTemplateDecl(VarTemplateDecl
*D
);
167 Decl
*VisitVarTemplateSpecializationDecl(VarTemplateSpecializationDecl
*D
);
169 // Importing statements
170 Stmt
*VisitStmt(Stmt
*S
);
172 // Importing expressions
173 Expr
*VisitExpr(Expr
*E
);
174 Expr
*VisitDeclRefExpr(DeclRefExpr
*E
);
175 Expr
*VisitIntegerLiteral(IntegerLiteral
*E
);
176 Expr
*VisitCharacterLiteral(CharacterLiteral
*E
);
177 Expr
*VisitParenExpr(ParenExpr
*E
);
178 Expr
*VisitUnaryOperator(UnaryOperator
*E
);
179 Expr
*VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr
*E
);
180 Expr
*VisitBinaryOperator(BinaryOperator
*E
);
181 Expr
*VisitCompoundAssignOperator(CompoundAssignOperator
*E
);
182 Expr
*VisitImplicitCastExpr(ImplicitCastExpr
*E
);
183 Expr
*VisitCStyleCastExpr(CStyleCastExpr
*E
);
186 using namespace clang
;
188 //----------------------------------------------------------------------------
189 // Structural Equivalence
190 //----------------------------------------------------------------------------
193 struct StructuralEquivalenceContext
{
194 /// \brief AST contexts for which we are checking structural equivalence.
197 /// \brief The set of "tentative" equivalences between two canonical
198 /// declarations, mapping from a declaration in the first context to the
199 /// declaration in the second context that we believe to be equivalent.
200 llvm::DenseMap
<Decl
*, Decl
*> TentativeEquivalences
;
202 /// \brief Queue of declarations in the first context whose equivalence
203 /// with a declaration in the second context still needs to be verified.
204 std::deque
<Decl
*> DeclsToCheck
;
206 /// \brief Declaration (from, to) pairs that are known not to be equivalent
207 /// (which we have already complained about).
208 llvm::DenseSet
<std::pair
<Decl
*, Decl
*> > &NonEquivalentDecls
;
210 /// \brief Whether we're being strict about the spelling of types when
211 /// unifying two types.
212 bool StrictTypeSpelling
;
214 /// \brief Whether to complain about failures.
217 /// \brief \c true if the last diagnostic came from C2.
220 StructuralEquivalenceContext(ASTContext
&C1
, ASTContext
&C2
,
221 llvm::DenseSet
<std::pair
<Decl
*, Decl
*> > &NonEquivalentDecls
,
222 bool StrictTypeSpelling
= false,
223 bool Complain
= true)
224 : C1(C1
), C2(C2
), NonEquivalentDecls(NonEquivalentDecls
),
225 StrictTypeSpelling(StrictTypeSpelling
), Complain(Complain
),
226 LastDiagFromC2(false) {}
228 /// \brief Determine whether the two declarations are structurally
230 bool IsStructurallyEquivalent(Decl
*D1
, Decl
*D2
);
232 /// \brief Determine whether the two types are structurally equivalent.
233 bool IsStructurallyEquivalent(QualType T1
, QualType T2
);
236 /// \brief Finish checking all of the structural equivalences.
238 /// \returns true if an error occurred, false otherwise.
242 DiagnosticBuilder
Diag1(SourceLocation Loc
, unsigned DiagID
) {
243 assert(Complain
&& "Not allowed to complain");
245 C1
.getDiagnostics().notePriorDiagnosticFrom(C2
.getDiagnostics());
246 LastDiagFromC2
= false;
247 return C1
.getDiagnostics().Report(Loc
, DiagID
);
250 DiagnosticBuilder
Diag2(SourceLocation Loc
, unsigned DiagID
) {
251 assert(Complain
&& "Not allowed to complain");
253 C2
.getDiagnostics().notePriorDiagnosticFrom(C1
.getDiagnostics());
254 LastDiagFromC2
= true;
255 return C2
.getDiagnostics().Report(Loc
, DiagID
);
260 static bool IsStructurallyEquivalent(StructuralEquivalenceContext
&Context
,
261 QualType T1
, QualType T2
);
262 static bool IsStructurallyEquivalent(StructuralEquivalenceContext
&Context
,
265 /// \brief Determine structural equivalence of two expressions.
266 static bool IsStructurallyEquivalent(StructuralEquivalenceContext
&Context
,
267 Expr
*E1
, Expr
*E2
) {
271 // FIXME: Actually perform a structural comparison!
275 /// \brief Determine whether two identifiers are equivalent.
276 static bool IsStructurallyEquivalent(const IdentifierInfo
*Name1
,
277 const IdentifierInfo
*Name2
) {
278 if (!Name1
|| !Name2
)
279 return Name1
== Name2
;
281 return Name1
->getName() == Name2
->getName();
284 /// \brief Determine whether two nested-name-specifiers are equivalent.
285 static bool IsStructurallyEquivalent(StructuralEquivalenceContext
&Context
,
286 NestedNameSpecifier
*NNS1
,
287 NestedNameSpecifier
*NNS2
) {
292 /// \brief Determine whether two template arguments are equivalent.
293 static bool IsStructurallyEquivalent(StructuralEquivalenceContext
&Context
,
294 const TemplateArgument
&Arg1
,
295 const TemplateArgument
&Arg2
) {
296 if (Arg1
.getKind() != Arg2
.getKind())
299 switch (Arg1
.getKind()) {
300 case TemplateArgument::Null
:
303 case TemplateArgument::Type
:
304 return Context
.IsStructurallyEquivalent(Arg1
.getAsType(), Arg2
.getAsType());
306 case TemplateArgument::Integral
:
307 if (!Context
.IsStructurallyEquivalent(Arg1
.getIntegralType(),
308 Arg2
.getIntegralType()))
311 return llvm::APSInt::isSameValue(Arg1
.getAsIntegral(), Arg2
.getAsIntegral());
313 case TemplateArgument::Declaration
:
314 return Context
.IsStructurallyEquivalent(Arg1
.getAsDecl(), Arg2
.getAsDecl());
316 case TemplateArgument::NullPtr
:
317 return true; // FIXME: Is this correct?
319 case TemplateArgument::Template
:
320 return IsStructurallyEquivalent(Context
,
321 Arg1
.getAsTemplate(),
322 Arg2
.getAsTemplate());
324 case TemplateArgument::TemplateExpansion
:
325 return IsStructurallyEquivalent(Context
,
326 Arg1
.getAsTemplateOrTemplatePattern(),
327 Arg2
.getAsTemplateOrTemplatePattern());
329 case TemplateArgument::Expression
:
330 return IsStructurallyEquivalent(Context
,
331 Arg1
.getAsExpr(), Arg2
.getAsExpr());
333 case TemplateArgument::Pack
:
334 if (Arg1
.pack_size() != Arg2
.pack_size())
337 for (unsigned I
= 0, N
= Arg1
.pack_size(); I
!= N
; ++I
)
338 if (!IsStructurallyEquivalent(Context
,
339 Arg1
.pack_begin()[I
],
340 Arg2
.pack_begin()[I
]))
346 llvm_unreachable("Invalid template argument kind");
349 /// \brief Determine structural equivalence for the common part of array
351 static bool IsArrayStructurallyEquivalent(StructuralEquivalenceContext
&Context
,
352 const ArrayType
*Array1
,
353 const ArrayType
*Array2
) {
354 if (!IsStructurallyEquivalent(Context
,
355 Array1
->getElementType(),
356 Array2
->getElementType()))
358 if (Array1
->getSizeModifier() != Array2
->getSizeModifier())
360 if (Array1
->getIndexTypeQualifiers() != Array2
->getIndexTypeQualifiers())
366 /// \brief Determine structural equivalence of two types.
367 static bool IsStructurallyEquivalent(StructuralEquivalenceContext
&Context
,
368 QualType T1
, QualType T2
) {
369 if (T1
.isNull() || T2
.isNull())
370 return T1
.isNull() && T2
.isNull();
372 if (!Context
.StrictTypeSpelling
) {
373 // We aren't being strict about token-to-token equivalence of types,
374 // so map down to the canonical type.
375 T1
= Context
.C1
.getCanonicalType(T1
);
376 T2
= Context
.C2
.getCanonicalType(T2
);
379 if (T1
.getQualifiers() != T2
.getQualifiers())
382 Type::TypeClass TC
= T1
->getTypeClass();
384 if (T1
->getTypeClass() != T2
->getTypeClass()) {
385 // Compare function types with prototypes vs. without prototypes as if
386 // both did not have prototypes.
387 if (T1
->getTypeClass() == Type::FunctionProto
&&
388 T2
->getTypeClass() == Type::FunctionNoProto
)
389 TC
= Type::FunctionNoProto
;
390 else if (T1
->getTypeClass() == Type::FunctionNoProto
&&
391 T2
->getTypeClass() == Type::FunctionProto
)
392 TC
= Type::FunctionNoProto
;
399 // FIXME: Deal with Char_S/Char_U.
400 if (cast
<BuiltinType
>(T1
)->getKind() != cast
<BuiltinType
>(T2
)->getKind())
405 if (!IsStructurallyEquivalent(Context
,
406 cast
<ComplexType
>(T1
)->getElementType(),
407 cast
<ComplexType
>(T2
)->getElementType()))
413 if (!IsStructurallyEquivalent(Context
,
414 cast
<AdjustedType
>(T1
)->getOriginalType(),
415 cast
<AdjustedType
>(T2
)->getOriginalType()))
420 if (!IsStructurallyEquivalent(Context
,
421 cast
<PointerType
>(T1
)->getPointeeType(),
422 cast
<PointerType
>(T2
)->getPointeeType()))
426 case Type::BlockPointer
:
427 if (!IsStructurallyEquivalent(Context
,
428 cast
<BlockPointerType
>(T1
)->getPointeeType(),
429 cast
<BlockPointerType
>(T2
)->getPointeeType()))
433 case Type::LValueReference
:
434 case Type::RValueReference
: {
435 const ReferenceType
*Ref1
= cast
<ReferenceType
>(T1
);
436 const ReferenceType
*Ref2
= cast
<ReferenceType
>(T2
);
437 if (Ref1
->isSpelledAsLValue() != Ref2
->isSpelledAsLValue())
439 if (Ref1
->isInnerRef() != Ref2
->isInnerRef())
441 if (!IsStructurallyEquivalent(Context
,
442 Ref1
->getPointeeTypeAsWritten(),
443 Ref2
->getPointeeTypeAsWritten()))
448 case Type::MemberPointer
: {
449 const MemberPointerType
*MemPtr1
= cast
<MemberPointerType
>(T1
);
450 const MemberPointerType
*MemPtr2
= cast
<MemberPointerType
>(T2
);
451 if (!IsStructurallyEquivalent(Context
,
452 MemPtr1
->getPointeeType(),
453 MemPtr2
->getPointeeType()))
455 if (!IsStructurallyEquivalent(Context
,
456 QualType(MemPtr1
->getClass(), 0),
457 QualType(MemPtr2
->getClass(), 0)))
462 case Type::ConstantArray
: {
463 const ConstantArrayType
*Array1
= cast
<ConstantArrayType
>(T1
);
464 const ConstantArrayType
*Array2
= cast
<ConstantArrayType
>(T2
);
465 if (!llvm::APInt::isSameValue(Array1
->getSize(), Array2
->getSize()))
468 if (!IsArrayStructurallyEquivalent(Context
, Array1
, Array2
))
473 case Type::IncompleteArray
:
474 if (!IsArrayStructurallyEquivalent(Context
,
476 cast
<ArrayType
>(T2
)))
480 case Type::VariableArray
: {
481 const VariableArrayType
*Array1
= cast
<VariableArrayType
>(T1
);
482 const VariableArrayType
*Array2
= cast
<VariableArrayType
>(T2
);
483 if (!IsStructurallyEquivalent(Context
,
484 Array1
->getSizeExpr(), Array2
->getSizeExpr()))
487 if (!IsArrayStructurallyEquivalent(Context
, Array1
, Array2
))
493 case Type::DependentSizedArray
: {
494 const DependentSizedArrayType
*Array1
= cast
<DependentSizedArrayType
>(T1
);
495 const DependentSizedArrayType
*Array2
= cast
<DependentSizedArrayType
>(T2
);
496 if (!IsStructurallyEquivalent(Context
,
497 Array1
->getSizeExpr(), Array2
->getSizeExpr()))
500 if (!IsArrayStructurallyEquivalent(Context
, Array1
, Array2
))
506 case Type::DependentSizedExtVector
: {
507 const DependentSizedExtVectorType
*Vec1
508 = cast
<DependentSizedExtVectorType
>(T1
);
509 const DependentSizedExtVectorType
*Vec2
510 = cast
<DependentSizedExtVectorType
>(T2
);
511 if (!IsStructurallyEquivalent(Context
,
512 Vec1
->getSizeExpr(), Vec2
->getSizeExpr()))
514 if (!IsStructurallyEquivalent(Context
,
515 Vec1
->getElementType(),
516 Vec2
->getElementType()))
522 case Type::ExtVector
: {
523 const VectorType
*Vec1
= cast
<VectorType
>(T1
);
524 const VectorType
*Vec2
= cast
<VectorType
>(T2
);
525 if (!IsStructurallyEquivalent(Context
,
526 Vec1
->getElementType(),
527 Vec2
->getElementType()))
529 if (Vec1
->getNumElements() != Vec2
->getNumElements())
531 if (Vec1
->getVectorKind() != Vec2
->getVectorKind())
536 case Type::FunctionProto
: {
537 const FunctionProtoType
*Proto1
= cast
<FunctionProtoType
>(T1
);
538 const FunctionProtoType
*Proto2
= cast
<FunctionProtoType
>(T2
);
539 if (Proto1
->getNumParams() != Proto2
->getNumParams())
541 for (unsigned I
= 0, N
= Proto1
->getNumParams(); I
!= N
; ++I
) {
542 if (!IsStructurallyEquivalent(Context
, Proto1
->getParamType(I
),
543 Proto2
->getParamType(I
)))
546 if (Proto1
->isVariadic() != Proto2
->isVariadic())
548 if (Proto1
->getExceptionSpecType() != Proto2
->getExceptionSpecType())
550 if (Proto1
->getExceptionSpecType() == EST_Dynamic
) {
551 if (Proto1
->getNumExceptions() != Proto2
->getNumExceptions())
553 for (unsigned I
= 0, N
= Proto1
->getNumExceptions(); I
!= N
; ++I
) {
554 if (!IsStructurallyEquivalent(Context
,
555 Proto1
->getExceptionType(I
),
556 Proto2
->getExceptionType(I
)))
559 } else if (Proto1
->getExceptionSpecType() == EST_ComputedNoexcept
) {
560 if (!IsStructurallyEquivalent(Context
,
561 Proto1
->getNoexceptExpr(),
562 Proto2
->getNoexceptExpr()))
565 if (Proto1
->getTypeQuals() != Proto2
->getTypeQuals())
568 // Fall through to check the bits common with FunctionNoProtoType.
571 case Type::FunctionNoProto
: {
572 const FunctionType
*Function1
= cast
<FunctionType
>(T1
);
573 const FunctionType
*Function2
= cast
<FunctionType
>(T2
);
574 if (!IsStructurallyEquivalent(Context
, Function1
->getReturnType(),
575 Function2
->getReturnType()))
577 if (Function1
->getExtInfo() != Function2
->getExtInfo())
582 case Type::UnresolvedUsing
:
583 if (!IsStructurallyEquivalent(Context
,
584 cast
<UnresolvedUsingType
>(T1
)->getDecl(),
585 cast
<UnresolvedUsingType
>(T2
)->getDecl()))
590 case Type::Attributed
:
591 if (!IsStructurallyEquivalent(Context
,
592 cast
<AttributedType
>(T1
)->getModifiedType(),
593 cast
<AttributedType
>(T2
)->getModifiedType()))
595 if (!IsStructurallyEquivalent(Context
,
596 cast
<AttributedType
>(T1
)->getEquivalentType(),
597 cast
<AttributedType
>(T2
)->getEquivalentType()))
602 if (!IsStructurallyEquivalent(Context
,
603 cast
<ParenType
>(T1
)->getInnerType(),
604 cast
<ParenType
>(T2
)->getInnerType()))
609 if (!IsStructurallyEquivalent(Context
,
610 cast
<TypedefType
>(T1
)->getDecl(),
611 cast
<TypedefType
>(T2
)->getDecl()))
615 case Type::TypeOfExpr
:
616 if (!IsStructurallyEquivalent(Context
,
617 cast
<TypeOfExprType
>(T1
)->getUnderlyingExpr(),
618 cast
<TypeOfExprType
>(T2
)->getUnderlyingExpr()))
623 if (!IsStructurallyEquivalent(Context
,
624 cast
<TypeOfType
>(T1
)->getUnderlyingType(),
625 cast
<TypeOfType
>(T2
)->getUnderlyingType()))
629 case Type::UnaryTransform
:
630 if (!IsStructurallyEquivalent(Context
,
631 cast
<UnaryTransformType
>(T1
)->getUnderlyingType(),
632 cast
<UnaryTransformType
>(T1
)->getUnderlyingType()))
637 if (!IsStructurallyEquivalent(Context
,
638 cast
<DecltypeType
>(T1
)->getUnderlyingExpr(),
639 cast
<DecltypeType
>(T2
)->getUnderlyingExpr()))
644 if (!IsStructurallyEquivalent(Context
,
645 cast
<AutoType
>(T1
)->getDeducedType(),
646 cast
<AutoType
>(T2
)->getDeducedType()))
652 if (!IsStructurallyEquivalent(Context
,
653 cast
<TagType
>(T1
)->getDecl(),
654 cast
<TagType
>(T2
)->getDecl()))
658 case Type::TemplateTypeParm
: {
659 const TemplateTypeParmType
*Parm1
= cast
<TemplateTypeParmType
>(T1
);
660 const TemplateTypeParmType
*Parm2
= cast
<TemplateTypeParmType
>(T2
);
661 if (Parm1
->getDepth() != Parm2
->getDepth())
663 if (Parm1
->getIndex() != Parm2
->getIndex())
665 if (Parm1
->isParameterPack() != Parm2
->isParameterPack())
668 // Names of template type parameters are never significant.
672 case Type::SubstTemplateTypeParm
: {
673 const SubstTemplateTypeParmType
*Subst1
674 = cast
<SubstTemplateTypeParmType
>(T1
);
675 const SubstTemplateTypeParmType
*Subst2
676 = cast
<SubstTemplateTypeParmType
>(T2
);
677 if (!IsStructurallyEquivalent(Context
,
678 QualType(Subst1
->getReplacedParameter(), 0),
679 QualType(Subst2
->getReplacedParameter(), 0)))
681 if (!IsStructurallyEquivalent(Context
,
682 Subst1
->getReplacementType(),
683 Subst2
->getReplacementType()))
688 case Type::SubstTemplateTypeParmPack
: {
689 const SubstTemplateTypeParmPackType
*Subst1
690 = cast
<SubstTemplateTypeParmPackType
>(T1
);
691 const SubstTemplateTypeParmPackType
*Subst2
692 = cast
<SubstTemplateTypeParmPackType
>(T2
);
693 if (!IsStructurallyEquivalent(Context
,
694 QualType(Subst1
->getReplacedParameter(), 0),
695 QualType(Subst2
->getReplacedParameter(), 0)))
697 if (!IsStructurallyEquivalent(Context
,
698 Subst1
->getArgumentPack(),
699 Subst2
->getArgumentPack()))
703 case Type::TemplateSpecialization
: {
704 const TemplateSpecializationType
*Spec1
705 = cast
<TemplateSpecializationType
>(T1
);
706 const TemplateSpecializationType
*Spec2
707 = cast
<TemplateSpecializationType
>(T2
);
708 if (!IsStructurallyEquivalent(Context
,
709 Spec1
->getTemplateName(),
710 Spec2
->getTemplateName()))
712 if (Spec1
->getNumArgs() != Spec2
->getNumArgs())
714 for (unsigned I
= 0, N
= Spec1
->getNumArgs(); I
!= N
; ++I
) {
715 if (!IsStructurallyEquivalent(Context
,
716 Spec1
->getArg(I
), Spec2
->getArg(I
)))
722 case Type::Elaborated
: {
723 const ElaboratedType
*Elab1
= cast
<ElaboratedType
>(T1
);
724 const ElaboratedType
*Elab2
= cast
<ElaboratedType
>(T2
);
725 // CHECKME: what if a keyword is ETK_None or ETK_typename ?
726 if (Elab1
->getKeyword() != Elab2
->getKeyword())
728 if (!IsStructurallyEquivalent(Context
,
729 Elab1
->getQualifier(),
730 Elab2
->getQualifier()))
732 if (!IsStructurallyEquivalent(Context
,
733 Elab1
->getNamedType(),
734 Elab2
->getNamedType()))
739 case Type::InjectedClassName
: {
740 const InjectedClassNameType
*Inj1
= cast
<InjectedClassNameType
>(T1
);
741 const InjectedClassNameType
*Inj2
= cast
<InjectedClassNameType
>(T2
);
742 if (!IsStructurallyEquivalent(Context
,
743 Inj1
->getInjectedSpecializationType(),
744 Inj2
->getInjectedSpecializationType()))
749 case Type::DependentName
: {
750 const DependentNameType
*Typename1
= cast
<DependentNameType
>(T1
);
751 const DependentNameType
*Typename2
= cast
<DependentNameType
>(T2
);
752 if (!IsStructurallyEquivalent(Context
,
753 Typename1
->getQualifier(),
754 Typename2
->getQualifier()))
756 if (!IsStructurallyEquivalent(Typename1
->getIdentifier(),
757 Typename2
->getIdentifier()))
763 case Type::DependentTemplateSpecialization
: {
764 const DependentTemplateSpecializationType
*Spec1
=
765 cast
<DependentTemplateSpecializationType
>(T1
);
766 const DependentTemplateSpecializationType
*Spec2
=
767 cast
<DependentTemplateSpecializationType
>(T2
);
768 if (!IsStructurallyEquivalent(Context
,
769 Spec1
->getQualifier(),
770 Spec2
->getQualifier()))
772 if (!IsStructurallyEquivalent(Spec1
->getIdentifier(),
773 Spec2
->getIdentifier()))
775 if (Spec1
->getNumArgs() != Spec2
->getNumArgs())
777 for (unsigned I
= 0, N
= Spec1
->getNumArgs(); I
!= N
; ++I
) {
778 if (!IsStructurallyEquivalent(Context
,
779 Spec1
->getArg(I
), Spec2
->getArg(I
)))
785 case Type::PackExpansion
:
786 if (!IsStructurallyEquivalent(Context
,
787 cast
<PackExpansionType
>(T1
)->getPattern(),
788 cast
<PackExpansionType
>(T2
)->getPattern()))
792 case Type::ObjCInterface
: {
793 const ObjCInterfaceType
*Iface1
= cast
<ObjCInterfaceType
>(T1
);
794 const ObjCInterfaceType
*Iface2
= cast
<ObjCInterfaceType
>(T2
);
795 if (!IsStructurallyEquivalent(Context
,
796 Iface1
->getDecl(), Iface2
->getDecl()))
801 case Type::ObjCObject
: {
802 const ObjCObjectType
*Obj1
= cast
<ObjCObjectType
>(T1
);
803 const ObjCObjectType
*Obj2
= cast
<ObjCObjectType
>(T2
);
804 if (!IsStructurallyEquivalent(Context
,
806 Obj2
->getBaseType()))
808 if (Obj1
->getNumProtocols() != Obj2
->getNumProtocols())
810 for (unsigned I
= 0, N
= Obj1
->getNumProtocols(); I
!= N
; ++I
) {
811 if (!IsStructurallyEquivalent(Context
,
812 Obj1
->getProtocol(I
),
813 Obj2
->getProtocol(I
)))
819 case Type::ObjCObjectPointer
: {
820 const ObjCObjectPointerType
*Ptr1
= cast
<ObjCObjectPointerType
>(T1
);
821 const ObjCObjectPointerType
*Ptr2
= cast
<ObjCObjectPointerType
>(T2
);
822 if (!IsStructurallyEquivalent(Context
,
823 Ptr1
->getPointeeType(),
824 Ptr2
->getPointeeType()))
830 if (!IsStructurallyEquivalent(Context
,
831 cast
<AtomicType
>(T1
)->getValueType(),
832 cast
<AtomicType
>(T2
)->getValueType()))
842 /// \brief Determine structural equivalence of two fields.
843 static bool IsStructurallyEquivalent(StructuralEquivalenceContext
&Context
,
844 FieldDecl
*Field1
, FieldDecl
*Field2
) {
845 RecordDecl
*Owner2
= cast
<RecordDecl
>(Field2
->getDeclContext());
847 // For anonymous structs/unions, match up the anonymous struct/union type
848 // declarations directly, so that we don't go off searching for anonymous
850 if (Field1
->isAnonymousStructOrUnion() &&
851 Field2
->isAnonymousStructOrUnion()) {
852 RecordDecl
*D1
= Field1
->getType()->castAs
<RecordType
>()->getDecl();
853 RecordDecl
*D2
= Field2
->getType()->castAs
<RecordType
>()->getDecl();
854 return IsStructurallyEquivalent(Context
, D1
, D2
);
857 // Check for equivalent field names.
858 IdentifierInfo
*Name1
= Field1
->getIdentifier();
859 IdentifierInfo
*Name2
= Field2
->getIdentifier();
860 if (!::IsStructurallyEquivalent(Name1
, Name2
))
863 if (!IsStructurallyEquivalent(Context
,
864 Field1
->getType(), Field2
->getType())) {
865 if (Context
.Complain
) {
866 Context
.Diag2(Owner2
->getLocation(), diag::warn_odr_tag_type_inconsistent
)
867 << Context
.C2
.getTypeDeclType(Owner2
);
868 Context
.Diag2(Field2
->getLocation(), diag::note_odr_field
)
869 << Field2
->getDeclName() << Field2
->getType();
870 Context
.Diag1(Field1
->getLocation(), diag::note_odr_field
)
871 << Field1
->getDeclName() << Field1
->getType();
876 if (Field1
->isBitField() != Field2
->isBitField()) {
877 if (Context
.Complain
) {
878 Context
.Diag2(Owner2
->getLocation(), diag::warn_odr_tag_type_inconsistent
)
879 << Context
.C2
.getTypeDeclType(Owner2
);
880 if (Field1
->isBitField()) {
881 Context
.Diag1(Field1
->getLocation(), diag::note_odr_bit_field
)
882 << Field1
->getDeclName() << Field1
->getType()
883 << Field1
->getBitWidthValue(Context
.C1
);
884 Context
.Diag2(Field2
->getLocation(), diag::note_odr_not_bit_field
)
885 << Field2
->getDeclName();
887 Context
.Diag2(Field2
->getLocation(), diag::note_odr_bit_field
)
888 << Field2
->getDeclName() << Field2
->getType()
889 << Field2
->getBitWidthValue(Context
.C2
);
890 Context
.Diag1(Field1
->getLocation(), diag::note_odr_not_bit_field
)
891 << Field1
->getDeclName();
897 if (Field1
->isBitField()) {
898 // Make sure that the bit-fields are the same length.
899 unsigned Bits1
= Field1
->getBitWidthValue(Context
.C1
);
900 unsigned Bits2
= Field2
->getBitWidthValue(Context
.C2
);
902 if (Bits1
!= Bits2
) {
903 if (Context
.Complain
) {
904 Context
.Diag2(Owner2
->getLocation(), diag::warn_odr_tag_type_inconsistent
)
905 << Context
.C2
.getTypeDeclType(Owner2
);
906 Context
.Diag2(Field2
->getLocation(), diag::note_odr_bit_field
)
907 << Field2
->getDeclName() << Field2
->getType() << Bits2
;
908 Context
.Diag1(Field1
->getLocation(), diag::note_odr_bit_field
)
909 << Field1
->getDeclName() << Field1
->getType() << Bits1
;
918 /// \brief Find the index of the given anonymous struct/union within its
921 /// \returns Returns the index of this anonymous struct/union in its context,
922 /// including the next assigned index (if none of them match). Returns an
923 /// empty option if the context is not a record, i.e.. if the anonymous
924 /// struct/union is at namespace or block scope.
925 static Optional
<unsigned> findAnonymousStructOrUnionIndex(RecordDecl
*Anon
) {
926 ASTContext
&Context
= Anon
->getASTContext();
927 QualType AnonTy
= Context
.getRecordType(Anon
);
929 RecordDecl
*Owner
= dyn_cast
<RecordDecl
>(Anon
->getDeclContext());
934 for (const auto *D
: Owner
->noload_decls()) {
935 const auto *F
= dyn_cast
<FieldDecl
>(D
);
936 if (!F
|| !F
->isAnonymousStructOrUnion())
939 if (Context
.hasSameType(F
->getType(), AnonTy
))
948 /// \brief Determine structural equivalence of two records.
949 static bool IsStructurallyEquivalent(StructuralEquivalenceContext
&Context
,
950 RecordDecl
*D1
, RecordDecl
*D2
) {
951 if (D1
->isUnion() != D2
->isUnion()) {
952 if (Context
.Complain
) {
953 Context
.Diag2(D2
->getLocation(), diag::warn_odr_tag_type_inconsistent
)
954 << Context
.C2
.getTypeDeclType(D2
);
955 Context
.Diag1(D1
->getLocation(), diag::note_odr_tag_kind_here
)
956 << D1
->getDeclName() << (unsigned)D1
->getTagKind();
961 if (D1
->isAnonymousStructOrUnion() && D2
->isAnonymousStructOrUnion()) {
962 // If both anonymous structs/unions are in a record context, make sure
963 // they occur in the same location in the context records.
964 if (Optional
<unsigned> Index1
= findAnonymousStructOrUnionIndex(D1
)) {
965 if (Optional
<unsigned> Index2
= findAnonymousStructOrUnionIndex(D2
)) {
966 if (*Index1
!= *Index2
)
972 // If both declarations are class template specializations, we know
973 // the ODR applies, so check the template and template arguments.
974 ClassTemplateSpecializationDecl
*Spec1
975 = dyn_cast
<ClassTemplateSpecializationDecl
>(D1
);
976 ClassTemplateSpecializationDecl
*Spec2
977 = dyn_cast
<ClassTemplateSpecializationDecl
>(D2
);
978 if (Spec1
&& Spec2
) {
979 // Check that the specialized templates are the same.
980 if (!IsStructurallyEquivalent(Context
, Spec1
->getSpecializedTemplate(),
981 Spec2
->getSpecializedTemplate()))
984 // Check that the template arguments are the same.
985 if (Spec1
->getTemplateArgs().size() != Spec2
->getTemplateArgs().size())
988 for (unsigned I
= 0, N
= Spec1
->getTemplateArgs().size(); I
!= N
; ++I
)
989 if (!IsStructurallyEquivalent(Context
,
990 Spec1
->getTemplateArgs().get(I
),
991 Spec2
->getTemplateArgs().get(I
)))
994 // If one is a class template specialization and the other is not, these
995 // structures are different.
996 else if (Spec1
|| Spec2
)
999 // Compare the definitions of these two records. If either or both are
1000 // incomplete, we assume that they are equivalent.
1001 D1
= D1
->getDefinition();
1002 D2
= D2
->getDefinition();
1006 if (CXXRecordDecl
*D1CXX
= dyn_cast
<CXXRecordDecl
>(D1
)) {
1007 if (CXXRecordDecl
*D2CXX
= dyn_cast
<CXXRecordDecl
>(D2
)) {
1008 if (D1CXX
->getNumBases() != D2CXX
->getNumBases()) {
1009 if (Context
.Complain
) {
1010 Context
.Diag2(D2
->getLocation(), diag::warn_odr_tag_type_inconsistent
)
1011 << Context
.C2
.getTypeDeclType(D2
);
1012 Context
.Diag2(D2
->getLocation(), diag::note_odr_number_of_bases
)
1013 << D2CXX
->getNumBases();
1014 Context
.Diag1(D1
->getLocation(), diag::note_odr_number_of_bases
)
1015 << D1CXX
->getNumBases();
1020 // Check the base classes.
1021 for (CXXRecordDecl::base_class_iterator Base1
= D1CXX
->bases_begin(),
1022 BaseEnd1
= D1CXX
->bases_end(),
1023 Base2
= D2CXX
->bases_begin();
1026 if (!IsStructurallyEquivalent(Context
,
1027 Base1
->getType(), Base2
->getType())) {
1028 if (Context
.Complain
) {
1029 Context
.Diag2(D2
->getLocation(), diag::warn_odr_tag_type_inconsistent
)
1030 << Context
.C2
.getTypeDeclType(D2
);
1031 Context
.Diag2(Base2
->getLocStart(), diag::note_odr_base
)
1033 << Base2
->getSourceRange();
1034 Context
.Diag1(Base1
->getLocStart(), diag::note_odr_base
)
1036 << Base1
->getSourceRange();
1041 // Check virtual vs. non-virtual inheritance mismatch.
1042 if (Base1
->isVirtual() != Base2
->isVirtual()) {
1043 if (Context
.Complain
) {
1044 Context
.Diag2(D2
->getLocation(), diag::warn_odr_tag_type_inconsistent
)
1045 << Context
.C2
.getTypeDeclType(D2
);
1046 Context
.Diag2(Base2
->getLocStart(),
1047 diag::note_odr_virtual_base
)
1048 << Base2
->isVirtual() << Base2
->getSourceRange();
1049 Context
.Diag1(Base1
->getLocStart(), diag::note_odr_base
)
1050 << Base1
->isVirtual()
1051 << Base1
->getSourceRange();
1056 } else if (D1CXX
->getNumBases() > 0) {
1057 if (Context
.Complain
) {
1058 Context
.Diag2(D2
->getLocation(), diag::warn_odr_tag_type_inconsistent
)
1059 << Context
.C2
.getTypeDeclType(D2
);
1060 const CXXBaseSpecifier
*Base1
= D1CXX
->bases_begin();
1061 Context
.Diag1(Base1
->getLocStart(), diag::note_odr_base
)
1063 << Base1
->getSourceRange();
1064 Context
.Diag2(D2
->getLocation(), diag::note_odr_missing_base
);
1070 // Check the fields for consistency.
1071 RecordDecl::field_iterator Field2
= D2
->field_begin(),
1072 Field2End
= D2
->field_end();
1073 for (RecordDecl::field_iterator Field1
= D1
->field_begin(),
1074 Field1End
= D1
->field_end();
1075 Field1
!= Field1End
;
1076 ++Field1
, ++Field2
) {
1077 if (Field2
== Field2End
) {
1078 if (Context
.Complain
) {
1079 Context
.Diag2(D2
->getLocation(), diag::warn_odr_tag_type_inconsistent
)
1080 << Context
.C2
.getTypeDeclType(D2
);
1081 Context
.Diag1(Field1
->getLocation(), diag::note_odr_field
)
1082 << Field1
->getDeclName() << Field1
->getType();
1083 Context
.Diag2(D2
->getLocation(), diag::note_odr_missing_field
);
1088 if (!IsStructurallyEquivalent(Context
, *Field1
, *Field2
))
1092 if (Field2
!= Field2End
) {
1093 if (Context
.Complain
) {
1094 Context
.Diag2(D2
->getLocation(), diag::warn_odr_tag_type_inconsistent
)
1095 << Context
.C2
.getTypeDeclType(D2
);
1096 Context
.Diag2(Field2
->getLocation(), diag::note_odr_field
)
1097 << Field2
->getDeclName() << Field2
->getType();
1098 Context
.Diag1(D1
->getLocation(), diag::note_odr_missing_field
);
1106 /// \brief Determine structural equivalence of two enums.
1107 static bool IsStructurallyEquivalent(StructuralEquivalenceContext
&Context
,
1108 EnumDecl
*D1
, EnumDecl
*D2
) {
1109 EnumDecl::enumerator_iterator EC2
= D2
->enumerator_begin(),
1110 EC2End
= D2
->enumerator_end();
1111 for (EnumDecl::enumerator_iterator EC1
= D1
->enumerator_begin(),
1112 EC1End
= D1
->enumerator_end();
1113 EC1
!= EC1End
; ++EC1
, ++EC2
) {
1114 if (EC2
== EC2End
) {
1115 if (Context
.Complain
) {
1116 Context
.Diag2(D2
->getLocation(), diag::warn_odr_tag_type_inconsistent
)
1117 << Context
.C2
.getTypeDeclType(D2
);
1118 Context
.Diag1(EC1
->getLocation(), diag::note_odr_enumerator
)
1119 << EC1
->getDeclName()
1120 << EC1
->getInitVal().toString(10);
1121 Context
.Diag2(D2
->getLocation(), diag::note_odr_missing_enumerator
);
1126 llvm::APSInt Val1
= EC1
->getInitVal();
1127 llvm::APSInt Val2
= EC2
->getInitVal();
1128 if (!llvm::APSInt::isSameValue(Val1
, Val2
) ||
1129 !IsStructurallyEquivalent(EC1
->getIdentifier(), EC2
->getIdentifier())) {
1130 if (Context
.Complain
) {
1131 Context
.Diag2(D2
->getLocation(), diag::warn_odr_tag_type_inconsistent
)
1132 << Context
.C2
.getTypeDeclType(D2
);
1133 Context
.Diag2(EC2
->getLocation(), diag::note_odr_enumerator
)
1134 << EC2
->getDeclName()
1135 << EC2
->getInitVal().toString(10);
1136 Context
.Diag1(EC1
->getLocation(), diag::note_odr_enumerator
)
1137 << EC1
->getDeclName()
1138 << EC1
->getInitVal().toString(10);
1144 if (EC2
!= EC2End
) {
1145 if (Context
.Complain
) {
1146 Context
.Diag2(D2
->getLocation(), diag::warn_odr_tag_type_inconsistent
)
1147 << Context
.C2
.getTypeDeclType(D2
);
1148 Context
.Diag2(EC2
->getLocation(), diag::note_odr_enumerator
)
1149 << EC2
->getDeclName()
1150 << EC2
->getInitVal().toString(10);
1151 Context
.Diag1(D1
->getLocation(), diag::note_odr_missing_enumerator
);
1159 static bool IsStructurallyEquivalent(StructuralEquivalenceContext
&Context
,
1160 TemplateParameterList
*Params1
,
1161 TemplateParameterList
*Params2
) {
1162 if (Params1
->size() != Params2
->size()) {
1163 if (Context
.Complain
) {
1164 Context
.Diag2(Params2
->getTemplateLoc(),
1165 diag::err_odr_different_num_template_parameters
)
1166 << Params1
->size() << Params2
->size();
1167 Context
.Diag1(Params1
->getTemplateLoc(),
1168 diag::note_odr_template_parameter_list
);
1173 for (unsigned I
= 0, N
= Params1
->size(); I
!= N
; ++I
) {
1174 if (Params1
->getParam(I
)->getKind() != Params2
->getParam(I
)->getKind()) {
1175 if (Context
.Complain
) {
1176 Context
.Diag2(Params2
->getParam(I
)->getLocation(),
1177 diag::err_odr_different_template_parameter_kind
);
1178 Context
.Diag1(Params1
->getParam(I
)->getLocation(),
1179 diag::note_odr_template_parameter_here
);
1184 if (!Context
.IsStructurallyEquivalent(Params1
->getParam(I
),
1185 Params2
->getParam(I
))) {
1194 static bool IsStructurallyEquivalent(StructuralEquivalenceContext
&Context
,
1195 TemplateTypeParmDecl
*D1
,
1196 TemplateTypeParmDecl
*D2
) {
1197 if (D1
->isParameterPack() != D2
->isParameterPack()) {
1198 if (Context
.Complain
) {
1199 Context
.Diag2(D2
->getLocation(), diag::err_odr_parameter_pack_non_pack
)
1200 << D2
->isParameterPack();
1201 Context
.Diag1(D1
->getLocation(), diag::note_odr_parameter_pack_non_pack
)
1202 << D1
->isParameterPack();
1210 static bool IsStructurallyEquivalent(StructuralEquivalenceContext
&Context
,
1211 NonTypeTemplateParmDecl
*D1
,
1212 NonTypeTemplateParmDecl
*D2
) {
1213 if (D1
->isParameterPack() != D2
->isParameterPack()) {
1214 if (Context
.Complain
) {
1215 Context
.Diag2(D2
->getLocation(), diag::err_odr_parameter_pack_non_pack
)
1216 << D2
->isParameterPack();
1217 Context
.Diag1(D1
->getLocation(), diag::note_odr_parameter_pack_non_pack
)
1218 << D1
->isParameterPack();
1224 if (!Context
.IsStructurallyEquivalent(D1
->getType(), D2
->getType())) {
1225 if (Context
.Complain
) {
1226 Context
.Diag2(D2
->getLocation(),
1227 diag::err_odr_non_type_parameter_type_inconsistent
)
1228 << D2
->getType() << D1
->getType();
1229 Context
.Diag1(D1
->getLocation(), diag::note_odr_value_here
)
1238 static bool IsStructurallyEquivalent(StructuralEquivalenceContext
&Context
,
1239 TemplateTemplateParmDecl
*D1
,
1240 TemplateTemplateParmDecl
*D2
) {
1241 if (D1
->isParameterPack() != D2
->isParameterPack()) {
1242 if (Context
.Complain
) {
1243 Context
.Diag2(D2
->getLocation(), diag::err_odr_parameter_pack_non_pack
)
1244 << D2
->isParameterPack();
1245 Context
.Diag1(D1
->getLocation(), diag::note_odr_parameter_pack_non_pack
)
1246 << D1
->isParameterPack();
1251 // Check template parameter lists.
1252 return IsStructurallyEquivalent(Context
, D1
->getTemplateParameters(),
1253 D2
->getTemplateParameters());
1256 static bool IsStructurallyEquivalent(StructuralEquivalenceContext
&Context
,
1257 ClassTemplateDecl
*D1
,
1258 ClassTemplateDecl
*D2
) {
1259 // Check template parameters.
1260 if (!IsStructurallyEquivalent(Context
,
1261 D1
->getTemplateParameters(),
1262 D2
->getTemplateParameters()))
1265 // Check the templated declaration.
1266 return Context
.IsStructurallyEquivalent(D1
->getTemplatedDecl(),
1267 D2
->getTemplatedDecl());
1270 /// \brief Determine structural equivalence of two declarations.
1271 static bool IsStructurallyEquivalent(StructuralEquivalenceContext
&Context
,
1272 Decl
*D1
, Decl
*D2
) {
1273 // FIXME: Check for known structural equivalences via a callback of some sort.
1275 // Check whether we already know that these two declarations are not
1276 // structurally equivalent.
1277 if (Context
.NonEquivalentDecls
.count(std::make_pair(D1
->getCanonicalDecl(),
1278 D2
->getCanonicalDecl())))
1281 // Determine whether we've already produced a tentative equivalence for D1.
1282 Decl
*&EquivToD1
= Context
.TentativeEquivalences
[D1
->getCanonicalDecl()];
1284 return EquivToD1
== D2
->getCanonicalDecl();
1286 // Produce a tentative equivalence D1 <-> D2, which will be checked later.
1287 EquivToD1
= D2
->getCanonicalDecl();
1288 Context
.DeclsToCheck
.push_back(D1
->getCanonicalDecl());
1292 bool StructuralEquivalenceContext::IsStructurallyEquivalent(Decl
*D1
,
1294 if (!::IsStructurallyEquivalent(*this, D1
, D2
))
1300 bool StructuralEquivalenceContext::IsStructurallyEquivalent(QualType T1
,
1302 if (!::IsStructurallyEquivalent(*this, T1
, T2
))
1308 bool StructuralEquivalenceContext::Finish() {
1309 while (!DeclsToCheck
.empty()) {
1310 // Check the next declaration.
1311 Decl
*D1
= DeclsToCheck
.front();
1312 DeclsToCheck
.pop_front();
1314 Decl
*D2
= TentativeEquivalences
[D1
];
1315 assert(D2
&& "Unrecorded tentative equivalence?");
1317 bool Equivalent
= true;
1319 // FIXME: Switch on all declaration kinds. For now, we're just going to
1320 // check the obvious ones.
1321 if (RecordDecl
*Record1
= dyn_cast
<RecordDecl
>(D1
)) {
1322 if (RecordDecl
*Record2
= dyn_cast
<RecordDecl
>(D2
)) {
1323 // Check for equivalent structure names.
1324 IdentifierInfo
*Name1
= Record1
->getIdentifier();
1325 if (!Name1
&& Record1
->getTypedefNameForAnonDecl())
1326 Name1
= Record1
->getTypedefNameForAnonDecl()->getIdentifier();
1327 IdentifierInfo
*Name2
= Record2
->getIdentifier();
1328 if (!Name2
&& Record2
->getTypedefNameForAnonDecl())
1329 Name2
= Record2
->getTypedefNameForAnonDecl()->getIdentifier();
1330 if (!::IsStructurallyEquivalent(Name1
, Name2
) ||
1331 !::IsStructurallyEquivalent(*this, Record1
, Record2
))
1334 // Record/non-record mismatch.
1337 } else if (EnumDecl
*Enum1
= dyn_cast
<EnumDecl
>(D1
)) {
1338 if (EnumDecl
*Enum2
= dyn_cast
<EnumDecl
>(D2
)) {
1339 // Check for equivalent enum names.
1340 IdentifierInfo
*Name1
= Enum1
->getIdentifier();
1341 if (!Name1
&& Enum1
->getTypedefNameForAnonDecl())
1342 Name1
= Enum1
->getTypedefNameForAnonDecl()->getIdentifier();
1343 IdentifierInfo
*Name2
= Enum2
->getIdentifier();
1344 if (!Name2
&& Enum2
->getTypedefNameForAnonDecl())
1345 Name2
= Enum2
->getTypedefNameForAnonDecl()->getIdentifier();
1346 if (!::IsStructurallyEquivalent(Name1
, Name2
) ||
1347 !::IsStructurallyEquivalent(*this, Enum1
, Enum2
))
1350 // Enum/non-enum mismatch
1353 } else if (TypedefNameDecl
*Typedef1
= dyn_cast
<TypedefNameDecl
>(D1
)) {
1354 if (TypedefNameDecl
*Typedef2
= dyn_cast
<TypedefNameDecl
>(D2
)) {
1355 if (!::IsStructurallyEquivalent(Typedef1
->getIdentifier(),
1356 Typedef2
->getIdentifier()) ||
1357 !::IsStructurallyEquivalent(*this,
1358 Typedef1
->getUnderlyingType(),
1359 Typedef2
->getUnderlyingType()))
1362 // Typedef/non-typedef mismatch.
1365 } else if (ClassTemplateDecl
*ClassTemplate1
1366 = dyn_cast
<ClassTemplateDecl
>(D1
)) {
1367 if (ClassTemplateDecl
*ClassTemplate2
= dyn_cast
<ClassTemplateDecl
>(D2
)) {
1368 if (!::IsStructurallyEquivalent(ClassTemplate1
->getIdentifier(),
1369 ClassTemplate2
->getIdentifier()) ||
1370 !::IsStructurallyEquivalent(*this, ClassTemplate1
, ClassTemplate2
))
1373 // Class template/non-class-template mismatch.
1376 } else if (TemplateTypeParmDecl
*TTP1
= dyn_cast
<TemplateTypeParmDecl
>(D1
)) {
1377 if (TemplateTypeParmDecl
*TTP2
= dyn_cast
<TemplateTypeParmDecl
>(D2
)) {
1378 if (!::IsStructurallyEquivalent(*this, TTP1
, TTP2
))
1384 } else if (NonTypeTemplateParmDecl
*NTTP1
1385 = dyn_cast
<NonTypeTemplateParmDecl
>(D1
)) {
1386 if (NonTypeTemplateParmDecl
*NTTP2
1387 = dyn_cast
<NonTypeTemplateParmDecl
>(D2
)) {
1388 if (!::IsStructurallyEquivalent(*this, NTTP1
, NTTP2
))
1394 } else if (TemplateTemplateParmDecl
*TTP1
1395 = dyn_cast
<TemplateTemplateParmDecl
>(D1
)) {
1396 if (TemplateTemplateParmDecl
*TTP2
1397 = dyn_cast
<TemplateTemplateParmDecl
>(D2
)) {
1398 if (!::IsStructurallyEquivalent(*this, TTP1
, TTP2
))
1407 // Note that these two declarations are not equivalent (and we already
1409 NonEquivalentDecls
.insert(std::make_pair(D1
->getCanonicalDecl(),
1410 D2
->getCanonicalDecl()));
1413 // FIXME: Check other declaration kinds!
1419 //----------------------------------------------------------------------------
1421 //----------------------------------------------------------------------------
1423 QualType
ASTNodeImporter::VisitType(const Type
*T
) {
1424 Importer
.FromDiag(SourceLocation(), diag::err_unsupported_ast_node
)
1425 << T
->getTypeClassName();
1429 QualType
ASTNodeImporter::VisitBuiltinType(const BuiltinType
*T
) {
1430 switch (T
->getKind()) {
1431 #define SHARED_SINGLETON_TYPE(Expansion)
1432 #define BUILTIN_TYPE(Id, SingletonId) \
1433 case BuiltinType::Id: return Importer.getToContext().SingletonId;
1434 #include "clang/AST/BuiltinTypes.def"
1436 // FIXME: for Char16, Char32, and NullPtr, make sure that the "to"
1437 // context supports C++.
1439 // FIXME: for ObjCId, ObjCClass, and ObjCSel, make sure that the "to"
1440 // context supports ObjC.
1442 case BuiltinType::Char_U
:
1443 // The context we're importing from has an unsigned 'char'. If we're
1444 // importing into a context with a signed 'char', translate to
1445 // 'unsigned char' instead.
1446 if (Importer
.getToContext().getLangOpts().CharIsSigned
)
1447 return Importer
.getToContext().UnsignedCharTy
;
1449 return Importer
.getToContext().CharTy
;
1451 case BuiltinType::Char_S
:
1452 // The context we're importing from has an unsigned 'char'. If we're
1453 // importing into a context with a signed 'char', translate to
1454 // 'unsigned char' instead.
1455 if (!Importer
.getToContext().getLangOpts().CharIsSigned
)
1456 return Importer
.getToContext().SignedCharTy
;
1458 return Importer
.getToContext().CharTy
;
1460 case BuiltinType::WChar_S
:
1461 case BuiltinType::WChar_U
:
1462 // FIXME: If not in C++, shall we translate to the C equivalent of
1464 return Importer
.getToContext().WCharTy
;
1467 llvm_unreachable("Invalid BuiltinType Kind!");
1470 QualType
ASTNodeImporter::VisitComplexType(const ComplexType
*T
) {
1471 QualType ToElementType
= Importer
.Import(T
->getElementType());
1472 if (ToElementType
.isNull())
1475 return Importer
.getToContext().getComplexType(ToElementType
);
1478 QualType
ASTNodeImporter::VisitPointerType(const PointerType
*T
) {
1479 QualType ToPointeeType
= Importer
.Import(T
->getPointeeType());
1480 if (ToPointeeType
.isNull())
1483 return Importer
.getToContext().getPointerType(ToPointeeType
);
1486 QualType
ASTNodeImporter::VisitBlockPointerType(const BlockPointerType
*T
) {
1487 // FIXME: Check for blocks support in "to" context.
1488 QualType ToPointeeType
= Importer
.Import(T
->getPointeeType());
1489 if (ToPointeeType
.isNull())
1492 return Importer
.getToContext().getBlockPointerType(ToPointeeType
);
1496 ASTNodeImporter::VisitLValueReferenceType(const LValueReferenceType
*T
) {
1497 // FIXME: Check for C++ support in "to" context.
1498 QualType ToPointeeType
= Importer
.Import(T
->getPointeeTypeAsWritten());
1499 if (ToPointeeType
.isNull())
1502 return Importer
.getToContext().getLValueReferenceType(ToPointeeType
);
1506 ASTNodeImporter::VisitRValueReferenceType(const RValueReferenceType
*T
) {
1507 // FIXME: Check for C++0x support in "to" context.
1508 QualType ToPointeeType
= Importer
.Import(T
->getPointeeTypeAsWritten());
1509 if (ToPointeeType
.isNull())
1512 return Importer
.getToContext().getRValueReferenceType(ToPointeeType
);
1515 QualType
ASTNodeImporter::VisitMemberPointerType(const MemberPointerType
*T
) {
1516 // FIXME: Check for C++ support in "to" context.
1517 QualType ToPointeeType
= Importer
.Import(T
->getPointeeType());
1518 if (ToPointeeType
.isNull())
1521 QualType ClassType
= Importer
.Import(QualType(T
->getClass(), 0));
1522 return Importer
.getToContext().getMemberPointerType(ToPointeeType
,
1523 ClassType
.getTypePtr());
1526 QualType
ASTNodeImporter::VisitConstantArrayType(const ConstantArrayType
*T
) {
1527 QualType ToElementType
= Importer
.Import(T
->getElementType());
1528 if (ToElementType
.isNull())
1531 return Importer
.getToContext().getConstantArrayType(ToElementType
,
1533 T
->getSizeModifier(),
1534 T
->getIndexTypeCVRQualifiers());
1538 ASTNodeImporter::VisitIncompleteArrayType(const IncompleteArrayType
*T
) {
1539 QualType ToElementType
= Importer
.Import(T
->getElementType());
1540 if (ToElementType
.isNull())
1543 return Importer
.getToContext().getIncompleteArrayType(ToElementType
,
1544 T
->getSizeModifier(),
1545 T
->getIndexTypeCVRQualifiers());
1548 QualType
ASTNodeImporter::VisitVariableArrayType(const VariableArrayType
*T
) {
1549 QualType ToElementType
= Importer
.Import(T
->getElementType());
1550 if (ToElementType
.isNull())
1553 Expr
*Size
= Importer
.Import(T
->getSizeExpr());
1557 SourceRange Brackets
= Importer
.Import(T
->getBracketsRange());
1558 return Importer
.getToContext().getVariableArrayType(ToElementType
, Size
,
1559 T
->getSizeModifier(),
1560 T
->getIndexTypeCVRQualifiers(),
1564 QualType
ASTNodeImporter::VisitVectorType(const VectorType
*T
) {
1565 QualType ToElementType
= Importer
.Import(T
->getElementType());
1566 if (ToElementType
.isNull())
1569 return Importer
.getToContext().getVectorType(ToElementType
,
1570 T
->getNumElements(),
1571 T
->getVectorKind());
1574 QualType
ASTNodeImporter::VisitExtVectorType(const ExtVectorType
*T
) {
1575 QualType ToElementType
= Importer
.Import(T
->getElementType());
1576 if (ToElementType
.isNull())
1579 return Importer
.getToContext().getExtVectorType(ToElementType
,
1580 T
->getNumElements());
1584 ASTNodeImporter::VisitFunctionNoProtoType(const FunctionNoProtoType
*T
) {
1585 // FIXME: What happens if we're importing a function without a prototype
1586 // into C++? Should we make it variadic?
1587 QualType ToResultType
= Importer
.Import(T
->getReturnType());
1588 if (ToResultType
.isNull())
1591 return Importer
.getToContext().getFunctionNoProtoType(ToResultType
,
1595 QualType
ASTNodeImporter::VisitFunctionProtoType(const FunctionProtoType
*T
) {
1596 QualType ToResultType
= Importer
.Import(T
->getReturnType());
1597 if (ToResultType
.isNull())
1600 // Import argument types
1601 SmallVector
<QualType
, 4> ArgTypes
;
1602 for (const auto &A
: T
->param_types()) {
1603 QualType ArgType
= Importer
.Import(A
);
1604 if (ArgType
.isNull())
1606 ArgTypes
.push_back(ArgType
);
1609 // Import exception types
1610 SmallVector
<QualType
, 4> ExceptionTypes
;
1611 for (const auto &E
: T
->exceptions()) {
1612 QualType ExceptionType
= Importer
.Import(E
);
1613 if (ExceptionType
.isNull())
1615 ExceptionTypes
.push_back(ExceptionType
);
1618 FunctionProtoType::ExtProtoInfo FromEPI
= T
->getExtProtoInfo();
1619 FunctionProtoType::ExtProtoInfo ToEPI
;
1621 ToEPI
.ExtInfo
= FromEPI
.ExtInfo
;
1622 ToEPI
.Variadic
= FromEPI
.Variadic
;
1623 ToEPI
.HasTrailingReturn
= FromEPI
.HasTrailingReturn
;
1624 ToEPI
.TypeQuals
= FromEPI
.TypeQuals
;
1625 ToEPI
.RefQualifier
= FromEPI
.RefQualifier
;
1626 ToEPI
.ExceptionSpec
.Type
= FromEPI
.ExceptionSpec
.Type
;
1627 ToEPI
.ExceptionSpec
.Exceptions
= ExceptionTypes
;
1628 ToEPI
.ExceptionSpec
.NoexceptExpr
=
1629 Importer
.Import(FromEPI
.ExceptionSpec
.NoexceptExpr
);
1630 ToEPI
.ExceptionSpec
.SourceDecl
= cast_or_null
<FunctionDecl
>(
1631 Importer
.Import(FromEPI
.ExceptionSpec
.SourceDecl
));
1632 ToEPI
.ExceptionSpec
.SourceTemplate
= cast_or_null
<FunctionDecl
>(
1633 Importer
.Import(FromEPI
.ExceptionSpec
.SourceTemplate
));
1635 return Importer
.getToContext().getFunctionType(ToResultType
, ArgTypes
, ToEPI
);
1638 QualType
ASTNodeImporter::VisitParenType(const ParenType
*T
) {
1639 QualType ToInnerType
= Importer
.Import(T
->getInnerType());
1640 if (ToInnerType
.isNull())
1643 return Importer
.getToContext().getParenType(ToInnerType
);
1646 QualType
ASTNodeImporter::VisitTypedefType(const TypedefType
*T
) {
1647 TypedefNameDecl
*ToDecl
1648 = dyn_cast_or_null
<TypedefNameDecl
>(Importer
.Import(T
->getDecl()));
1652 return Importer
.getToContext().getTypeDeclType(ToDecl
);
1655 QualType
ASTNodeImporter::VisitTypeOfExprType(const TypeOfExprType
*T
) {
1656 Expr
*ToExpr
= Importer
.Import(T
->getUnderlyingExpr());
1660 return Importer
.getToContext().getTypeOfExprType(ToExpr
);
1663 QualType
ASTNodeImporter::VisitTypeOfType(const TypeOfType
*T
) {
1664 QualType ToUnderlyingType
= Importer
.Import(T
->getUnderlyingType());
1665 if (ToUnderlyingType
.isNull())
1668 return Importer
.getToContext().getTypeOfType(ToUnderlyingType
);
1671 QualType
ASTNodeImporter::VisitDecltypeType(const DecltypeType
*T
) {
1672 // FIXME: Make sure that the "to" context supports C++0x!
1673 Expr
*ToExpr
= Importer
.Import(T
->getUnderlyingExpr());
1677 QualType UnderlyingType
= Importer
.Import(T
->getUnderlyingType());
1678 if (UnderlyingType
.isNull())
1681 return Importer
.getToContext().getDecltypeType(ToExpr
, UnderlyingType
);
1684 QualType
ASTNodeImporter::VisitUnaryTransformType(const UnaryTransformType
*T
) {
1685 QualType ToBaseType
= Importer
.Import(T
->getBaseType());
1686 QualType ToUnderlyingType
= Importer
.Import(T
->getUnderlyingType());
1687 if (ToBaseType
.isNull() || ToUnderlyingType
.isNull())
1690 return Importer
.getToContext().getUnaryTransformType(ToBaseType
,
1695 QualType
ASTNodeImporter::VisitAutoType(const AutoType
*T
) {
1696 // FIXME: Make sure that the "to" context supports C++11!
1697 QualType FromDeduced
= T
->getDeducedType();
1699 if (!FromDeduced
.isNull()) {
1700 ToDeduced
= Importer
.Import(FromDeduced
);
1701 if (ToDeduced
.isNull())
1705 return Importer
.getToContext().getAutoType(ToDeduced
, T
->isDecltypeAuto(),
1706 /*IsDependent*/false);
1709 QualType
ASTNodeImporter::VisitRecordType(const RecordType
*T
) {
1711 = dyn_cast_or_null
<RecordDecl
>(Importer
.Import(T
->getDecl()));
1715 return Importer
.getToContext().getTagDeclType(ToDecl
);
1718 QualType
ASTNodeImporter::VisitEnumType(const EnumType
*T
) {
1720 = dyn_cast_or_null
<EnumDecl
>(Importer
.Import(T
->getDecl()));
1724 return Importer
.getToContext().getTagDeclType(ToDecl
);
1727 QualType
ASTNodeImporter::VisitTemplateSpecializationType(
1728 const TemplateSpecializationType
*T
) {
1729 TemplateName ToTemplate
= Importer
.Import(T
->getTemplateName());
1730 if (ToTemplate
.isNull())
1733 SmallVector
<TemplateArgument
, 2> ToTemplateArgs
;
1734 if (ImportTemplateArguments(T
->getArgs(), T
->getNumArgs(), ToTemplateArgs
))
1737 QualType ToCanonType
;
1738 if (!QualType(T
, 0).isCanonical()) {
1739 QualType FromCanonType
1740 = Importer
.getFromContext().getCanonicalType(QualType(T
, 0));
1741 ToCanonType
=Importer
.Import(FromCanonType
);
1742 if (ToCanonType
.isNull())
1745 return Importer
.getToContext().getTemplateSpecializationType(ToTemplate
,
1746 ToTemplateArgs
.data(),
1747 ToTemplateArgs
.size(),
1751 QualType
ASTNodeImporter::VisitElaboratedType(const ElaboratedType
*T
) {
1752 NestedNameSpecifier
*ToQualifier
= nullptr;
1753 // Note: the qualifier in an ElaboratedType is optional.
1754 if (T
->getQualifier()) {
1755 ToQualifier
= Importer
.Import(T
->getQualifier());
1760 QualType ToNamedType
= Importer
.Import(T
->getNamedType());
1761 if (ToNamedType
.isNull())
1764 return Importer
.getToContext().getElaboratedType(T
->getKeyword(),
1765 ToQualifier
, ToNamedType
);
1768 QualType
ASTNodeImporter::VisitObjCInterfaceType(const ObjCInterfaceType
*T
) {
1769 ObjCInterfaceDecl
*Class
1770 = dyn_cast_or_null
<ObjCInterfaceDecl
>(Importer
.Import(T
->getDecl()));
1774 return Importer
.getToContext().getObjCInterfaceType(Class
);
1777 QualType
ASTNodeImporter::VisitObjCObjectType(const ObjCObjectType
*T
) {
1778 QualType ToBaseType
= Importer
.Import(T
->getBaseType());
1779 if (ToBaseType
.isNull())
1782 SmallVector
<ObjCProtocolDecl
*, 4> Protocols
;
1783 for (auto *P
: T
->quals()) {
1784 ObjCProtocolDecl
*Protocol
1785 = dyn_cast_or_null
<ObjCProtocolDecl
>(Importer
.Import(P
));
1788 Protocols
.push_back(Protocol
);
1791 return Importer
.getToContext().getObjCObjectType(ToBaseType
,
1797 ASTNodeImporter::VisitObjCObjectPointerType(const ObjCObjectPointerType
*T
) {
1798 QualType ToPointeeType
= Importer
.Import(T
->getPointeeType());
1799 if (ToPointeeType
.isNull())
1802 return Importer
.getToContext().getObjCObjectPointerType(ToPointeeType
);
1805 //----------------------------------------------------------------------------
1806 // Import Declarations
1807 //----------------------------------------------------------------------------
1808 bool ASTNodeImporter::ImportDeclParts(NamedDecl
*D
, DeclContext
*&DC
,
1809 DeclContext
*&LexicalDC
,
1810 DeclarationName
&Name
,
1811 SourceLocation
&Loc
) {
1812 // Import the context of this declaration.
1813 DC
= Importer
.ImportContext(D
->getDeclContext());
1818 if (D
->getDeclContext() != D
->getLexicalDeclContext()) {
1819 LexicalDC
= Importer
.ImportContext(D
->getLexicalDeclContext());
1824 // Import the name of this declaration.
1825 Name
= Importer
.Import(D
->getDeclName());
1826 if (D
->getDeclName() && !Name
)
1829 // Import the location of this declaration.
1830 Loc
= Importer
.Import(D
->getLocation());
1834 void ASTNodeImporter::ImportDefinitionIfNeeded(Decl
*FromD
, Decl
*ToD
) {
1839 ToD
= Importer
.Import(FromD
);
1844 if (RecordDecl
*FromRecord
= dyn_cast
<RecordDecl
>(FromD
)) {
1845 if (RecordDecl
*ToRecord
= cast_or_null
<RecordDecl
>(ToD
)) {
1846 if (FromRecord
->getDefinition() && FromRecord
->isCompleteDefinition() && !ToRecord
->getDefinition()) {
1847 ImportDefinition(FromRecord
, ToRecord
);
1853 if (EnumDecl
*FromEnum
= dyn_cast
<EnumDecl
>(FromD
)) {
1854 if (EnumDecl
*ToEnum
= cast_or_null
<EnumDecl
>(ToD
)) {
1855 if (FromEnum
->getDefinition() && !ToEnum
->getDefinition()) {
1856 ImportDefinition(FromEnum
, ToEnum
);
1864 ASTNodeImporter::ImportDeclarationNameLoc(const DeclarationNameInfo
&From
,
1865 DeclarationNameInfo
& To
) {
1866 // NOTE: To.Name and To.Loc are already imported.
1867 // We only have to import To.LocInfo.
1868 switch (To
.getName().getNameKind()) {
1869 case DeclarationName::Identifier
:
1870 case DeclarationName::ObjCZeroArgSelector
:
1871 case DeclarationName::ObjCOneArgSelector
:
1872 case DeclarationName::ObjCMultiArgSelector
:
1873 case DeclarationName::CXXUsingDirective
:
1876 case DeclarationName::CXXOperatorName
: {
1877 SourceRange Range
= From
.getCXXOperatorNameRange();
1878 To
.setCXXOperatorNameRange(Importer
.Import(Range
));
1881 case DeclarationName::CXXLiteralOperatorName
: {
1882 SourceLocation Loc
= From
.getCXXLiteralOperatorNameLoc();
1883 To
.setCXXLiteralOperatorNameLoc(Importer
.Import(Loc
));
1886 case DeclarationName::CXXConstructorName
:
1887 case DeclarationName::CXXDestructorName
:
1888 case DeclarationName::CXXConversionFunctionName
: {
1889 TypeSourceInfo
*FromTInfo
= From
.getNamedTypeInfo();
1890 To
.setNamedTypeInfo(Importer
.Import(FromTInfo
));
1894 llvm_unreachable("Unknown name kind.");
1897 void ASTNodeImporter::ImportDeclContext(DeclContext
*FromDC
, bool ForceImport
) {
1898 if (Importer
.isMinimalImport() && !ForceImport
) {
1899 Importer
.ImportContext(FromDC
);
1903 for (auto *From
: FromDC
->decls())
1904 Importer
.Import(From
);
1907 bool ASTNodeImporter::ImportDefinition(RecordDecl
*From
, RecordDecl
*To
,
1908 ImportDefinitionKind Kind
) {
1909 if (To
->getDefinition() || To
->isBeingDefined()) {
1910 if (Kind
== IDK_Everything
)
1911 ImportDeclContext(From
, /*ForceImport=*/true);
1916 To
->startDefinition();
1918 // Add base classes.
1919 if (CXXRecordDecl
*ToCXX
= dyn_cast
<CXXRecordDecl
>(To
)) {
1920 CXXRecordDecl
*FromCXX
= cast
<CXXRecordDecl
>(From
);
1922 struct CXXRecordDecl::DefinitionData
&ToData
= ToCXX
->data();
1923 struct CXXRecordDecl::DefinitionData
&FromData
= FromCXX
->data();
1924 ToData
.UserDeclaredConstructor
= FromData
.UserDeclaredConstructor
;
1925 ToData
.UserDeclaredSpecialMembers
= FromData
.UserDeclaredSpecialMembers
;
1926 ToData
.Aggregate
= FromData
.Aggregate
;
1927 ToData
.PlainOldData
= FromData
.PlainOldData
;
1928 ToData
.Empty
= FromData
.Empty
;
1929 ToData
.Polymorphic
= FromData
.Polymorphic
;
1930 ToData
.Abstract
= FromData
.Abstract
;
1931 ToData
.IsStandardLayout
= FromData
.IsStandardLayout
;
1932 ToData
.HasNoNonEmptyBases
= FromData
.HasNoNonEmptyBases
;
1933 ToData
.HasPrivateFields
= FromData
.HasPrivateFields
;
1934 ToData
.HasProtectedFields
= FromData
.HasProtectedFields
;
1935 ToData
.HasPublicFields
= FromData
.HasPublicFields
;
1936 ToData
.HasMutableFields
= FromData
.HasMutableFields
;
1937 ToData
.HasVariantMembers
= FromData
.HasVariantMembers
;
1938 ToData
.HasOnlyCMembers
= FromData
.HasOnlyCMembers
;
1939 ToData
.HasInClassInitializer
= FromData
.HasInClassInitializer
;
1940 ToData
.HasUninitializedReferenceMember
1941 = FromData
.HasUninitializedReferenceMember
;
1942 ToData
.NeedOverloadResolutionForMoveConstructor
1943 = FromData
.NeedOverloadResolutionForMoveConstructor
;
1944 ToData
.NeedOverloadResolutionForMoveAssignment
1945 = FromData
.NeedOverloadResolutionForMoveAssignment
;
1946 ToData
.NeedOverloadResolutionForDestructor
1947 = FromData
.NeedOverloadResolutionForDestructor
;
1948 ToData
.DefaultedMoveConstructorIsDeleted
1949 = FromData
.DefaultedMoveConstructorIsDeleted
;
1950 ToData
.DefaultedMoveAssignmentIsDeleted
1951 = FromData
.DefaultedMoveAssignmentIsDeleted
;
1952 ToData
.DefaultedDestructorIsDeleted
= FromData
.DefaultedDestructorIsDeleted
;
1953 ToData
.HasTrivialSpecialMembers
= FromData
.HasTrivialSpecialMembers
;
1954 ToData
.HasIrrelevantDestructor
= FromData
.HasIrrelevantDestructor
;
1955 ToData
.HasConstexprNonCopyMoveConstructor
1956 = FromData
.HasConstexprNonCopyMoveConstructor
;
1957 ToData
.DefaultedDefaultConstructorIsConstexpr
1958 = FromData
.DefaultedDefaultConstructorIsConstexpr
;
1959 ToData
.HasConstexprDefaultConstructor
1960 = FromData
.HasConstexprDefaultConstructor
;
1961 ToData
.HasNonLiteralTypeFieldsOrBases
1962 = FromData
.HasNonLiteralTypeFieldsOrBases
;
1963 // ComputedVisibleConversions not imported.
1964 ToData
.UserProvidedDefaultConstructor
1965 = FromData
.UserProvidedDefaultConstructor
;
1966 ToData
.DeclaredSpecialMembers
= FromData
.DeclaredSpecialMembers
;
1967 ToData
.ImplicitCopyConstructorHasConstParam
1968 = FromData
.ImplicitCopyConstructorHasConstParam
;
1969 ToData
.ImplicitCopyAssignmentHasConstParam
1970 = FromData
.ImplicitCopyAssignmentHasConstParam
;
1971 ToData
.HasDeclaredCopyConstructorWithConstParam
1972 = FromData
.HasDeclaredCopyConstructorWithConstParam
;
1973 ToData
.HasDeclaredCopyAssignmentWithConstParam
1974 = FromData
.HasDeclaredCopyAssignmentWithConstParam
;
1975 ToData
.IsLambda
= FromData
.IsLambda
;
1977 SmallVector
<CXXBaseSpecifier
*, 4> Bases
;
1978 for (const auto &Base1
: FromCXX
->bases()) {
1979 QualType T
= Importer
.Import(Base1
.getType());
1983 SourceLocation EllipsisLoc
;
1984 if (Base1
.isPackExpansion())
1985 EllipsisLoc
= Importer
.Import(Base1
.getEllipsisLoc());
1987 // Ensure that we have a definition for the base.
1988 ImportDefinitionIfNeeded(Base1
.getType()->getAsCXXRecordDecl());
1991 new (Importer
.getToContext())
1992 CXXBaseSpecifier(Importer
.Import(Base1
.getSourceRange()),
1994 Base1
.isBaseOfClass(),
1995 Base1
.getAccessSpecifierAsWritten(),
1996 Importer
.Import(Base1
.getTypeSourceInfo()),
2000 ToCXX
->setBases(Bases
.data(), Bases
.size());
2003 if (shouldForceImportDeclContext(Kind
))
2004 ImportDeclContext(From
, /*ForceImport=*/true);
2006 To
->completeDefinition();
2010 bool ASTNodeImporter::ImportDefinition(VarDecl
*From
, VarDecl
*To
,
2011 ImportDefinitionKind Kind
) {
2012 if (To
->getDefinition())
2015 // FIXME: Can we really import any initializer? Alternatively, we could force
2016 // ourselves to import every declaration of a variable and then only use
2018 To
->setInit(Importer
.Import(const_cast<Expr
*>(From
->getAnyInitializer())));
2020 // FIXME: Other bits to merge?
2025 bool ASTNodeImporter::ImportDefinition(EnumDecl
*From
, EnumDecl
*To
,
2026 ImportDefinitionKind Kind
) {
2027 if (To
->getDefinition() || To
->isBeingDefined()) {
2028 if (Kind
== IDK_Everything
)
2029 ImportDeclContext(From
, /*ForceImport=*/true);
2033 To
->startDefinition();
2035 QualType T
= Importer
.Import(Importer
.getFromContext().getTypeDeclType(From
));
2039 QualType ToPromotionType
= Importer
.Import(From
->getPromotionType());
2040 if (ToPromotionType
.isNull())
2043 if (shouldForceImportDeclContext(Kind
))
2044 ImportDeclContext(From
, /*ForceImport=*/true);
2046 // FIXME: we might need to merge the number of positive or negative bits
2047 // if the enumerator lists don't match.
2048 To
->completeDefinition(T
, ToPromotionType
,
2049 From
->getNumPositiveBits(),
2050 From
->getNumNegativeBits());
2054 TemplateParameterList
*ASTNodeImporter::ImportTemplateParameterList(
2055 TemplateParameterList
*Params
) {
2056 SmallVector
<NamedDecl
*, 4> ToParams
;
2057 ToParams
.reserve(Params
->size());
2058 for (TemplateParameterList::iterator P
= Params
->begin(),
2059 PEnd
= Params
->end();
2061 Decl
*To
= Importer
.Import(*P
);
2065 ToParams
.push_back(cast
<NamedDecl
>(To
));
2068 return TemplateParameterList::Create(Importer
.getToContext(),
2069 Importer
.Import(Params
->getTemplateLoc()),
2070 Importer
.Import(Params
->getLAngleLoc()),
2071 ToParams
.data(), ToParams
.size(),
2072 Importer
.Import(Params
->getRAngleLoc()));
2076 ASTNodeImporter::ImportTemplateArgument(const TemplateArgument
&From
) {
2077 switch (From
.getKind()) {
2078 case TemplateArgument::Null
:
2079 return TemplateArgument();
2081 case TemplateArgument::Type
: {
2082 QualType ToType
= Importer
.Import(From
.getAsType());
2083 if (ToType
.isNull())
2084 return TemplateArgument();
2085 return TemplateArgument(ToType
);
2088 case TemplateArgument::Integral
: {
2089 QualType ToType
= Importer
.Import(From
.getIntegralType());
2090 if (ToType
.isNull())
2091 return TemplateArgument();
2092 return TemplateArgument(From
, ToType
);
2095 case TemplateArgument::Declaration
: {
2096 ValueDecl
*To
= cast_or_null
<ValueDecl
>(Importer
.Import(From
.getAsDecl()));
2097 QualType ToType
= Importer
.Import(From
.getParamTypeForDecl());
2098 if (!To
|| ToType
.isNull())
2099 return TemplateArgument();
2100 return TemplateArgument(To
, ToType
);
2103 case TemplateArgument::NullPtr
: {
2104 QualType ToType
= Importer
.Import(From
.getNullPtrType());
2105 if (ToType
.isNull())
2106 return TemplateArgument();
2107 return TemplateArgument(ToType
, /*isNullPtr*/true);
2110 case TemplateArgument::Template
: {
2111 TemplateName ToTemplate
= Importer
.Import(From
.getAsTemplate());
2112 if (ToTemplate
.isNull())
2113 return TemplateArgument();
2115 return TemplateArgument(ToTemplate
);
2118 case TemplateArgument::TemplateExpansion
: {
2119 TemplateName ToTemplate
2120 = Importer
.Import(From
.getAsTemplateOrTemplatePattern());
2121 if (ToTemplate
.isNull())
2122 return TemplateArgument();
2124 return TemplateArgument(ToTemplate
, From
.getNumTemplateExpansions());
2127 case TemplateArgument::Expression
:
2128 if (Expr
*ToExpr
= Importer
.Import(From
.getAsExpr()))
2129 return TemplateArgument(ToExpr
);
2130 return TemplateArgument();
2132 case TemplateArgument::Pack
: {
2133 SmallVector
<TemplateArgument
, 2> ToPack
;
2134 ToPack
.reserve(From
.pack_size());
2135 if (ImportTemplateArguments(From
.pack_begin(), From
.pack_size(), ToPack
))
2136 return TemplateArgument();
2138 TemplateArgument
*ToArgs
2139 = new (Importer
.getToContext()) TemplateArgument
[ToPack
.size()];
2140 std::copy(ToPack
.begin(), ToPack
.end(), ToArgs
);
2141 return TemplateArgument(ToArgs
, ToPack
.size());
2145 llvm_unreachable("Invalid template argument kind");
2148 bool ASTNodeImporter::ImportTemplateArguments(const TemplateArgument
*FromArgs
,
2149 unsigned NumFromArgs
,
2150 SmallVectorImpl
<TemplateArgument
> &ToArgs
) {
2151 for (unsigned I
= 0; I
!= NumFromArgs
; ++I
) {
2152 TemplateArgument To
= ImportTemplateArgument(FromArgs
[I
]);
2153 if (To
.isNull() && !FromArgs
[I
].isNull())
2156 ToArgs
.push_back(To
);
2162 bool ASTNodeImporter::IsStructuralMatch(RecordDecl
*FromRecord
,
2163 RecordDecl
*ToRecord
, bool Complain
) {
2164 // Eliminate a potential failure point where we attempt to re-import
2165 // something we're trying to import while completing ToRecord.
2166 Decl
*ToOrigin
= Importer
.GetOriginalDecl(ToRecord
);
2168 RecordDecl
*ToOriginRecord
= dyn_cast
<RecordDecl
>(ToOrigin
);
2170 ToRecord
= ToOriginRecord
;
2173 StructuralEquivalenceContext
Ctx(Importer
.getFromContext(),
2174 ToRecord
->getASTContext(),
2175 Importer
.getNonEquivalentDecls(),
2177 return Ctx
.IsStructurallyEquivalent(FromRecord
, ToRecord
);
2180 bool ASTNodeImporter::IsStructuralMatch(VarDecl
*FromVar
, VarDecl
*ToVar
,
2182 StructuralEquivalenceContext
Ctx(
2183 Importer
.getFromContext(), Importer
.getToContext(),
2184 Importer
.getNonEquivalentDecls(), false, Complain
);
2185 return Ctx
.IsStructurallyEquivalent(FromVar
, ToVar
);
2188 bool ASTNodeImporter::IsStructuralMatch(EnumDecl
*FromEnum
, EnumDecl
*ToEnum
) {
2189 StructuralEquivalenceContext
Ctx(Importer
.getFromContext(),
2190 Importer
.getToContext(),
2191 Importer
.getNonEquivalentDecls());
2192 return Ctx
.IsStructurallyEquivalent(FromEnum
, ToEnum
);
2195 bool ASTNodeImporter::IsStructuralMatch(EnumConstantDecl
*FromEC
,
2196 EnumConstantDecl
*ToEC
)
2198 const llvm::APSInt
&FromVal
= FromEC
->getInitVal();
2199 const llvm::APSInt
&ToVal
= ToEC
->getInitVal();
2201 return FromVal
.isSigned() == ToVal
.isSigned() &&
2202 FromVal
.getBitWidth() == ToVal
.getBitWidth() &&
2206 bool ASTNodeImporter::IsStructuralMatch(ClassTemplateDecl
*From
,
2207 ClassTemplateDecl
*To
) {
2208 StructuralEquivalenceContext
Ctx(Importer
.getFromContext(),
2209 Importer
.getToContext(),
2210 Importer
.getNonEquivalentDecls());
2211 return Ctx
.IsStructurallyEquivalent(From
, To
);
2214 bool ASTNodeImporter::IsStructuralMatch(VarTemplateDecl
*From
,
2215 VarTemplateDecl
*To
) {
2216 StructuralEquivalenceContext
Ctx(Importer
.getFromContext(),
2217 Importer
.getToContext(),
2218 Importer
.getNonEquivalentDecls());
2219 return Ctx
.IsStructurallyEquivalent(From
, To
);
2222 Decl
*ASTNodeImporter::VisitDecl(Decl
*D
) {
2223 Importer
.FromDiag(D
->getLocation(), diag::err_unsupported_ast_node
)
2224 << D
->getDeclKindName();
2228 Decl
*ASTNodeImporter::VisitTranslationUnitDecl(TranslationUnitDecl
*D
) {
2229 TranslationUnitDecl
*ToD
=
2230 Importer
.getToContext().getTranslationUnitDecl();
2232 Importer
.Imported(D
, ToD
);
2237 Decl
*ASTNodeImporter::VisitNamespaceDecl(NamespaceDecl
*D
) {
2238 // Import the major distinguishing characteristics of this namespace.
2239 DeclContext
*DC
, *LexicalDC
;
2240 DeclarationName Name
;
2242 if (ImportDeclParts(D
, DC
, LexicalDC
, Name
, Loc
))
2245 NamespaceDecl
*MergeWithNamespace
= nullptr;
2247 // This is an anonymous namespace. Adopt an existing anonymous
2248 // namespace if we can.
2249 // FIXME: Not testable.
2250 if (TranslationUnitDecl
*TU
= dyn_cast
<TranslationUnitDecl
>(DC
))
2251 MergeWithNamespace
= TU
->getAnonymousNamespace();
2253 MergeWithNamespace
= cast
<NamespaceDecl
>(DC
)->getAnonymousNamespace();
2255 SmallVector
<NamedDecl
*, 4> ConflictingDecls
;
2256 SmallVector
<NamedDecl
*, 2> FoundDecls
;
2257 DC
->getRedeclContext()->localUncachedLookup(Name
, FoundDecls
);
2258 for (unsigned I
= 0, N
= FoundDecls
.size(); I
!= N
; ++I
) {
2259 if (!FoundDecls
[I
]->isInIdentifierNamespace(Decl::IDNS_Namespace
))
2262 if (NamespaceDecl
*FoundNS
= dyn_cast
<NamespaceDecl
>(FoundDecls
[I
])) {
2263 MergeWithNamespace
= FoundNS
;
2264 ConflictingDecls
.clear();
2268 ConflictingDecls
.push_back(FoundDecls
[I
]);
2271 if (!ConflictingDecls
.empty()) {
2272 Name
= Importer
.HandleNameConflict(Name
, DC
, Decl::IDNS_Namespace
,
2273 ConflictingDecls
.data(),
2274 ConflictingDecls
.size());
2278 // Create the "to" namespace, if needed.
2279 NamespaceDecl
*ToNamespace
= MergeWithNamespace
;
2281 ToNamespace
= NamespaceDecl::Create(Importer
.getToContext(), DC
,
2283 Importer
.Import(D
->getLocStart()),
2284 Loc
, Name
.getAsIdentifierInfo(),
2285 /*PrevDecl=*/nullptr);
2286 ToNamespace
->setLexicalDeclContext(LexicalDC
);
2287 LexicalDC
->addDeclInternal(ToNamespace
);
2289 // If this is an anonymous namespace, register it as the anonymous
2290 // namespace within its context.
2292 if (TranslationUnitDecl
*TU
= dyn_cast
<TranslationUnitDecl
>(DC
))
2293 TU
->setAnonymousNamespace(ToNamespace
);
2295 cast
<NamespaceDecl
>(DC
)->setAnonymousNamespace(ToNamespace
);
2298 Importer
.Imported(D
, ToNamespace
);
2300 ImportDeclContext(D
);
2305 Decl
*ASTNodeImporter::VisitTypedefNameDecl(TypedefNameDecl
*D
, bool IsAlias
) {
2306 // Import the major distinguishing characteristics of this typedef.
2307 DeclContext
*DC
, *LexicalDC
;
2308 DeclarationName Name
;
2310 if (ImportDeclParts(D
, DC
, LexicalDC
, Name
, Loc
))
2313 // If this typedef is not in block scope, determine whether we've
2314 // seen a typedef with the same name (that we can merge with) or any
2315 // other entity by that name (which name lookup could conflict with).
2316 if (!DC
->isFunctionOrMethod()) {
2317 SmallVector
<NamedDecl
*, 4> ConflictingDecls
;
2318 unsigned IDNS
= Decl::IDNS_Ordinary
;
2319 SmallVector
<NamedDecl
*, 2> FoundDecls
;
2320 DC
->getRedeclContext()->localUncachedLookup(Name
, FoundDecls
);
2321 for (unsigned I
= 0, N
= FoundDecls
.size(); I
!= N
; ++I
) {
2322 if (!FoundDecls
[I
]->isInIdentifierNamespace(IDNS
))
2324 if (TypedefNameDecl
*FoundTypedef
=
2325 dyn_cast
<TypedefNameDecl
>(FoundDecls
[I
])) {
2326 if (Importer
.IsStructurallyEquivalent(D
->getUnderlyingType(),
2327 FoundTypedef
->getUnderlyingType()))
2328 return Importer
.Imported(D
, FoundTypedef
);
2331 ConflictingDecls
.push_back(FoundDecls
[I
]);
2334 if (!ConflictingDecls
.empty()) {
2335 Name
= Importer
.HandleNameConflict(Name
, DC
, IDNS
,
2336 ConflictingDecls
.data(),
2337 ConflictingDecls
.size());
2343 // Import the underlying type of this typedef;
2344 QualType T
= Importer
.Import(D
->getUnderlyingType());
2348 // Create the new typedef node.
2349 TypeSourceInfo
*TInfo
= Importer
.Import(D
->getTypeSourceInfo());
2350 SourceLocation StartL
= Importer
.Import(D
->getLocStart());
2351 TypedefNameDecl
*ToTypedef
;
2353 ToTypedef
= TypeAliasDecl::Create(Importer
.getToContext(), DC
,
2355 Name
.getAsIdentifierInfo(),
2358 ToTypedef
= TypedefDecl::Create(Importer
.getToContext(), DC
,
2360 Name
.getAsIdentifierInfo(),
2363 ToTypedef
->setAccess(D
->getAccess());
2364 ToTypedef
->setLexicalDeclContext(LexicalDC
);
2365 Importer
.Imported(D
, ToTypedef
);
2366 LexicalDC
->addDeclInternal(ToTypedef
);
2371 Decl
*ASTNodeImporter::VisitTypedefDecl(TypedefDecl
*D
) {
2372 return VisitTypedefNameDecl(D
, /*IsAlias=*/false);
2375 Decl
*ASTNodeImporter::VisitTypeAliasDecl(TypeAliasDecl
*D
) {
2376 return VisitTypedefNameDecl(D
, /*IsAlias=*/true);
2379 Decl
*ASTNodeImporter::VisitEnumDecl(EnumDecl
*D
) {
2380 // Import the major distinguishing characteristics of this enum.
2381 DeclContext
*DC
, *LexicalDC
;
2382 DeclarationName Name
;
2384 if (ImportDeclParts(D
, DC
, LexicalDC
, Name
, Loc
))
2387 // Figure out what enum name we're looking for.
2388 unsigned IDNS
= Decl::IDNS_Tag
;
2389 DeclarationName SearchName
= Name
;
2390 if (!SearchName
&& D
->getTypedefNameForAnonDecl()) {
2391 SearchName
= Importer
.Import(D
->getTypedefNameForAnonDecl()->getDeclName());
2392 IDNS
= Decl::IDNS_Ordinary
;
2393 } else if (Importer
.getToContext().getLangOpts().CPlusPlus
)
2394 IDNS
|= Decl::IDNS_Ordinary
;
2396 // We may already have an enum of the same name; try to find and match it.
2397 if (!DC
->isFunctionOrMethod() && SearchName
) {
2398 SmallVector
<NamedDecl
*, 4> ConflictingDecls
;
2399 SmallVector
<NamedDecl
*, 2> FoundDecls
;
2400 DC
->getRedeclContext()->localUncachedLookup(Name
, FoundDecls
);
2401 for (unsigned I
= 0, N
= FoundDecls
.size(); I
!= N
; ++I
) {
2402 if (!FoundDecls
[I
]->isInIdentifierNamespace(IDNS
))
2405 Decl
*Found
= FoundDecls
[I
];
2406 if (TypedefNameDecl
*Typedef
= dyn_cast
<TypedefNameDecl
>(Found
)) {
2407 if (const TagType
*Tag
= Typedef
->getUnderlyingType()->getAs
<TagType
>())
2408 Found
= Tag
->getDecl();
2411 if (EnumDecl
*FoundEnum
= dyn_cast
<EnumDecl
>(Found
)) {
2412 if (IsStructuralMatch(D
, FoundEnum
))
2413 return Importer
.Imported(D
, FoundEnum
);
2416 ConflictingDecls
.push_back(FoundDecls
[I
]);
2419 if (!ConflictingDecls
.empty()) {
2420 Name
= Importer
.HandleNameConflict(Name
, DC
, IDNS
,
2421 ConflictingDecls
.data(),
2422 ConflictingDecls
.size());
2426 // Create the enum declaration.
2427 EnumDecl
*D2
= EnumDecl::Create(Importer
.getToContext(), DC
,
2428 Importer
.Import(D
->getLocStart()),
2429 Loc
, Name
.getAsIdentifierInfo(), nullptr,
2430 D
->isScoped(), D
->isScopedUsingClassTag(),
2432 // Import the qualifier, if any.
2433 D2
->setQualifierInfo(Importer
.Import(D
->getQualifierLoc()));
2434 D2
->setAccess(D
->getAccess());
2435 D2
->setLexicalDeclContext(LexicalDC
);
2436 Importer
.Imported(D
, D2
);
2437 LexicalDC
->addDeclInternal(D2
);
2439 // Import the integer type.
2440 QualType ToIntegerType
= Importer
.Import(D
->getIntegerType());
2441 if (ToIntegerType
.isNull())
2443 D2
->setIntegerType(ToIntegerType
);
2445 // Import the definition
2446 if (D
->isCompleteDefinition() && ImportDefinition(D
, D2
))
2452 Decl
*ASTNodeImporter::VisitRecordDecl(RecordDecl
*D
) {
2453 // If this record has a definition in the translation unit we're coming from,
2454 // but this particular declaration is not that definition, import the
2455 // definition and map to that.
2456 TagDecl
*Definition
= D
->getDefinition();
2457 if (Definition
&& Definition
!= D
) {
2458 Decl
*ImportedDef
= Importer
.Import(Definition
);
2462 return Importer
.Imported(D
, ImportedDef
);
2465 // Import the major distinguishing characteristics of this record.
2466 DeclContext
*DC
, *LexicalDC
;
2467 DeclarationName Name
;
2469 if (ImportDeclParts(D
, DC
, LexicalDC
, Name
, Loc
))
2472 // Figure out what structure name we're looking for.
2473 unsigned IDNS
= Decl::IDNS_Tag
;
2474 DeclarationName SearchName
= Name
;
2475 if (!SearchName
&& D
->getTypedefNameForAnonDecl()) {
2476 SearchName
= Importer
.Import(D
->getTypedefNameForAnonDecl()->getDeclName());
2477 IDNS
= Decl::IDNS_Ordinary
;
2478 } else if (Importer
.getToContext().getLangOpts().CPlusPlus
)
2479 IDNS
|= Decl::IDNS_Ordinary
;
2481 // We may already have a record of the same name; try to find and match it.
2482 RecordDecl
*AdoptDecl
= nullptr;
2483 if (!DC
->isFunctionOrMethod()) {
2484 SmallVector
<NamedDecl
*, 4> ConflictingDecls
;
2485 SmallVector
<NamedDecl
*, 2> FoundDecls
;
2486 DC
->getRedeclContext()->localUncachedLookup(Name
, FoundDecls
);
2487 for (unsigned I
= 0, N
= FoundDecls
.size(); I
!= N
; ++I
) {
2488 if (!FoundDecls
[I
]->isInIdentifierNamespace(IDNS
))
2491 Decl
*Found
= FoundDecls
[I
];
2492 if (TypedefNameDecl
*Typedef
= dyn_cast
<TypedefNameDecl
>(Found
)) {
2493 if (const TagType
*Tag
= Typedef
->getUnderlyingType()->getAs
<TagType
>())
2494 Found
= Tag
->getDecl();
2497 if (RecordDecl
*FoundRecord
= dyn_cast
<RecordDecl
>(Found
)) {
2498 if (D
->isAnonymousStructOrUnion() &&
2499 FoundRecord
->isAnonymousStructOrUnion()) {
2500 // If both anonymous structs/unions are in a record context, make sure
2501 // they occur in the same location in the context records.
2502 if (Optional
<unsigned> Index1
2503 = findAnonymousStructOrUnionIndex(D
)) {
2504 if (Optional
<unsigned> Index2
=
2505 findAnonymousStructOrUnionIndex(FoundRecord
)) {
2506 if (*Index1
!= *Index2
)
2512 if (RecordDecl
*FoundDef
= FoundRecord
->getDefinition()) {
2513 if ((SearchName
&& !D
->isCompleteDefinition())
2514 || (D
->isCompleteDefinition() &&
2515 D
->isAnonymousStructOrUnion()
2516 == FoundDef
->isAnonymousStructOrUnion() &&
2517 IsStructuralMatch(D
, FoundDef
))) {
2518 // The record types structurally match, or the "from" translation
2519 // unit only had a forward declaration anyway; call it the same
2521 // FIXME: For C++, we should also merge methods here.
2522 return Importer
.Imported(D
, FoundDef
);
2524 } else if (!D
->isCompleteDefinition()) {
2525 // We have a forward declaration of this type, so adopt that forward
2526 // declaration rather than building a new one.
2528 // If one or both can be completed from external storage then try one
2529 // last time to complete and compare them before doing this.
2531 if (FoundRecord
->hasExternalLexicalStorage() &&
2532 !FoundRecord
->isCompleteDefinition())
2533 FoundRecord
->getASTContext().getExternalSource()->CompleteType(FoundRecord
);
2534 if (D
->hasExternalLexicalStorage())
2535 D
->getASTContext().getExternalSource()->CompleteType(D
);
2537 if (FoundRecord
->isCompleteDefinition() &&
2538 D
->isCompleteDefinition() &&
2539 !IsStructuralMatch(D
, FoundRecord
))
2542 AdoptDecl
= FoundRecord
;
2544 } else if (!SearchName
) {
2549 ConflictingDecls
.push_back(FoundDecls
[I
]);
2552 if (!ConflictingDecls
.empty() && SearchName
) {
2553 Name
= Importer
.HandleNameConflict(Name
, DC
, IDNS
,
2554 ConflictingDecls
.data(),
2555 ConflictingDecls
.size());
2559 // Create the record declaration.
2560 RecordDecl
*D2
= AdoptDecl
;
2561 SourceLocation StartLoc
= Importer
.Import(D
->getLocStart());
2563 if (isa
<CXXRecordDecl
>(D
)) {
2564 CXXRecordDecl
*D2CXX
= CXXRecordDecl::Create(Importer
.getToContext(),
2567 Name
.getAsIdentifierInfo());
2569 D2
->setAccess(D
->getAccess());
2571 D2
= RecordDecl::Create(Importer
.getToContext(), D
->getTagKind(),
2572 DC
, StartLoc
, Loc
, Name
.getAsIdentifierInfo());
2575 D2
->setQualifierInfo(Importer
.Import(D
->getQualifierLoc()));
2576 D2
->setLexicalDeclContext(LexicalDC
);
2577 LexicalDC
->addDeclInternal(D2
);
2578 if (D
->isAnonymousStructOrUnion())
2579 D2
->setAnonymousStructOrUnion(true);
2582 Importer
.Imported(D
, D2
);
2584 if (D
->isCompleteDefinition() && ImportDefinition(D
, D2
, IDK_Default
))
2590 Decl
*ASTNodeImporter::VisitEnumConstantDecl(EnumConstantDecl
*D
) {
2591 // Import the major distinguishing characteristics of this enumerator.
2592 DeclContext
*DC
, *LexicalDC
;
2593 DeclarationName Name
;
2595 if (ImportDeclParts(D
, DC
, LexicalDC
, Name
, Loc
))
2598 QualType T
= Importer
.Import(D
->getType());
2602 // Determine whether there are any other declarations with the same name and
2603 // in the same context.
2604 if (!LexicalDC
->isFunctionOrMethod()) {
2605 SmallVector
<NamedDecl
*, 4> ConflictingDecls
;
2606 unsigned IDNS
= Decl::IDNS_Ordinary
;
2607 SmallVector
<NamedDecl
*, 2> FoundDecls
;
2608 DC
->getRedeclContext()->localUncachedLookup(Name
, FoundDecls
);
2609 for (unsigned I
= 0, N
= FoundDecls
.size(); I
!= N
; ++I
) {
2610 if (!FoundDecls
[I
]->isInIdentifierNamespace(IDNS
))
2613 if (EnumConstantDecl
*FoundEnumConstant
2614 = dyn_cast
<EnumConstantDecl
>(FoundDecls
[I
])) {
2615 if (IsStructuralMatch(D
, FoundEnumConstant
))
2616 return Importer
.Imported(D
, FoundEnumConstant
);
2619 ConflictingDecls
.push_back(FoundDecls
[I
]);
2622 if (!ConflictingDecls
.empty()) {
2623 Name
= Importer
.HandleNameConflict(Name
, DC
, IDNS
,
2624 ConflictingDecls
.data(),
2625 ConflictingDecls
.size());
2631 Expr
*Init
= Importer
.Import(D
->getInitExpr());
2632 if (D
->getInitExpr() && !Init
)
2635 EnumConstantDecl
*ToEnumerator
2636 = EnumConstantDecl::Create(Importer
.getToContext(), cast
<EnumDecl
>(DC
), Loc
,
2637 Name
.getAsIdentifierInfo(), T
,
2638 Init
, D
->getInitVal());
2639 ToEnumerator
->setAccess(D
->getAccess());
2640 ToEnumerator
->setLexicalDeclContext(LexicalDC
);
2641 Importer
.Imported(D
, ToEnumerator
);
2642 LexicalDC
->addDeclInternal(ToEnumerator
);
2643 return ToEnumerator
;
2646 Decl
*ASTNodeImporter::VisitFunctionDecl(FunctionDecl
*D
) {
2647 // Import the major distinguishing characteristics of this function.
2648 DeclContext
*DC
, *LexicalDC
;
2649 DeclarationName Name
;
2651 if (ImportDeclParts(D
, DC
, LexicalDC
, Name
, Loc
))
2654 // Try to find a function in our own ("to") context with the same name, same
2655 // type, and in the same context as the function we're importing.
2656 if (!LexicalDC
->isFunctionOrMethod()) {
2657 SmallVector
<NamedDecl
*, 4> ConflictingDecls
;
2658 unsigned IDNS
= Decl::IDNS_Ordinary
;
2659 SmallVector
<NamedDecl
*, 2> FoundDecls
;
2660 DC
->getRedeclContext()->localUncachedLookup(Name
, FoundDecls
);
2661 for (unsigned I
= 0, N
= FoundDecls
.size(); I
!= N
; ++I
) {
2662 if (!FoundDecls
[I
]->isInIdentifierNamespace(IDNS
))
2665 if (FunctionDecl
*FoundFunction
= dyn_cast
<FunctionDecl
>(FoundDecls
[I
])) {
2666 if (FoundFunction
->hasExternalFormalLinkage() &&
2667 D
->hasExternalFormalLinkage()) {
2668 if (Importer
.IsStructurallyEquivalent(D
->getType(),
2669 FoundFunction
->getType())) {
2670 // FIXME: Actually try to merge the body and other attributes.
2671 return Importer
.Imported(D
, FoundFunction
);
2674 // FIXME: Check for overloading more carefully, e.g., by boosting
2675 // Sema::IsOverload out to the AST library.
2677 // Function overloading is okay in C++.
2678 if (Importer
.getToContext().getLangOpts().CPlusPlus
)
2681 // Complain about inconsistent function types.
2682 Importer
.ToDiag(Loc
, diag::err_odr_function_type_inconsistent
)
2683 << Name
<< D
->getType() << FoundFunction
->getType();
2684 Importer
.ToDiag(FoundFunction
->getLocation(),
2685 diag::note_odr_value_here
)
2686 << FoundFunction
->getType();
2690 ConflictingDecls
.push_back(FoundDecls
[I
]);
2693 if (!ConflictingDecls
.empty()) {
2694 Name
= Importer
.HandleNameConflict(Name
, DC
, IDNS
,
2695 ConflictingDecls
.data(),
2696 ConflictingDecls
.size());
2702 DeclarationNameInfo
NameInfo(Name
, Loc
);
2703 // Import additional name location/type info.
2704 ImportDeclarationNameLoc(D
->getNameInfo(), NameInfo
);
2706 QualType FromTy
= D
->getType();
2707 bool usedDifferentExceptionSpec
= false;
2709 if (const FunctionProtoType
*
2710 FromFPT
= D
->getType()->getAs
<FunctionProtoType
>()) {
2711 FunctionProtoType::ExtProtoInfo FromEPI
= FromFPT
->getExtProtoInfo();
2712 // FunctionProtoType::ExtProtoInfo's ExceptionSpecDecl can point to the
2713 // FunctionDecl that we are importing the FunctionProtoType for.
2714 // To avoid an infinite recursion when importing, create the FunctionDecl
2715 // with a simplified function type and update it afterwards.
2716 if (FromEPI
.ExceptionSpec
.SourceDecl
||
2717 FromEPI
.ExceptionSpec
.SourceTemplate
||
2718 FromEPI
.ExceptionSpec
.NoexceptExpr
) {
2719 FunctionProtoType::ExtProtoInfo DefaultEPI
;
2720 FromTy
= Importer
.getFromContext().getFunctionType(
2721 FromFPT
->getReturnType(), FromFPT
->getParamTypes(), DefaultEPI
);
2722 usedDifferentExceptionSpec
= true;
2727 QualType T
= Importer
.Import(FromTy
);
2731 // Import the function parameters.
2732 SmallVector
<ParmVarDecl
*, 8> Parameters
;
2733 for (auto P
: D
->params()) {
2734 ParmVarDecl
*ToP
= cast_or_null
<ParmVarDecl
>(Importer
.Import(P
));
2738 Parameters
.push_back(ToP
);
2741 // Create the imported function.
2742 TypeSourceInfo
*TInfo
= Importer
.Import(D
->getTypeSourceInfo());
2743 FunctionDecl
*ToFunction
= nullptr;
2744 if (CXXConstructorDecl
*FromConstructor
= dyn_cast
<CXXConstructorDecl
>(D
)) {
2745 ToFunction
= CXXConstructorDecl::Create(Importer
.getToContext(),
2746 cast
<CXXRecordDecl
>(DC
),
2747 D
->getInnerLocStart(),
2749 FromConstructor
->isExplicit(),
2750 D
->isInlineSpecified(),
2753 } else if (isa
<CXXDestructorDecl
>(D
)) {
2754 ToFunction
= CXXDestructorDecl::Create(Importer
.getToContext(),
2755 cast
<CXXRecordDecl
>(DC
),
2756 D
->getInnerLocStart(),
2758 D
->isInlineSpecified(),
2760 } else if (CXXConversionDecl
*FromConversion
2761 = dyn_cast
<CXXConversionDecl
>(D
)) {
2762 ToFunction
= CXXConversionDecl::Create(Importer
.getToContext(),
2763 cast
<CXXRecordDecl
>(DC
),
2764 D
->getInnerLocStart(),
2766 D
->isInlineSpecified(),
2767 FromConversion
->isExplicit(),
2769 Importer
.Import(D
->getLocEnd()));
2770 } else if (CXXMethodDecl
*Method
= dyn_cast
<CXXMethodDecl
>(D
)) {
2771 ToFunction
= CXXMethodDecl::Create(Importer
.getToContext(),
2772 cast
<CXXRecordDecl
>(DC
),
2773 D
->getInnerLocStart(),
2775 Method
->getStorageClass(),
2776 Method
->isInlineSpecified(),
2778 Importer
.Import(D
->getLocEnd()));
2780 ToFunction
= FunctionDecl::Create(Importer
.getToContext(), DC
,
2781 D
->getInnerLocStart(),
2782 NameInfo
, T
, TInfo
, D
->getStorageClass(),
2783 D
->isInlineSpecified(),
2784 D
->hasWrittenPrototype(),
2788 // Import the qualifier, if any.
2789 ToFunction
->setQualifierInfo(Importer
.Import(D
->getQualifierLoc()));
2790 ToFunction
->setAccess(D
->getAccess());
2791 ToFunction
->setLexicalDeclContext(LexicalDC
);
2792 ToFunction
->setVirtualAsWritten(D
->isVirtualAsWritten());
2793 ToFunction
->setTrivial(D
->isTrivial());
2794 ToFunction
->setPure(D
->isPure());
2795 Importer
.Imported(D
, ToFunction
);
2797 // Set the parameters.
2798 for (unsigned I
= 0, N
= Parameters
.size(); I
!= N
; ++I
) {
2799 Parameters
[I
]->setOwningFunction(ToFunction
);
2800 ToFunction
->addDeclInternal(Parameters
[I
]);
2802 ToFunction
->setParams(Parameters
);
2804 if (usedDifferentExceptionSpec
) {
2805 // Update FunctionProtoType::ExtProtoInfo.
2806 QualType T
= Importer
.Import(D
->getType());
2809 ToFunction
->setType(T
);
2812 // FIXME: Other bits to merge?
2814 // Add this function to the lexical context.
2815 LexicalDC
->addDeclInternal(ToFunction
);
2820 Decl
*ASTNodeImporter::VisitCXXMethodDecl(CXXMethodDecl
*D
) {
2821 return VisitFunctionDecl(D
);
2824 Decl
*ASTNodeImporter::VisitCXXConstructorDecl(CXXConstructorDecl
*D
) {
2825 return VisitCXXMethodDecl(D
);
2828 Decl
*ASTNodeImporter::VisitCXXDestructorDecl(CXXDestructorDecl
*D
) {
2829 return VisitCXXMethodDecl(D
);
2832 Decl
*ASTNodeImporter::VisitCXXConversionDecl(CXXConversionDecl
*D
) {
2833 return VisitCXXMethodDecl(D
);
2836 static unsigned getFieldIndex(Decl
*F
) {
2837 RecordDecl
*Owner
= dyn_cast
<RecordDecl
>(F
->getDeclContext());
2842 for (const auto *D
: Owner
->noload_decls()) {
2846 if (isa
<FieldDecl
>(*D
) || isa
<IndirectFieldDecl
>(*D
))
2853 Decl
*ASTNodeImporter::VisitFieldDecl(FieldDecl
*D
) {
2854 // Import the major distinguishing characteristics of a variable.
2855 DeclContext
*DC
, *LexicalDC
;
2856 DeclarationName Name
;
2858 if (ImportDeclParts(D
, DC
, LexicalDC
, Name
, Loc
))
2861 // Determine whether we've already imported this field.
2862 SmallVector
<NamedDecl
*, 2> FoundDecls
;
2863 DC
->getRedeclContext()->localUncachedLookup(Name
, FoundDecls
);
2864 for (unsigned I
= 0, N
= FoundDecls
.size(); I
!= N
; ++I
) {
2865 if (FieldDecl
*FoundField
= dyn_cast
<FieldDecl
>(FoundDecls
[I
])) {
2866 // For anonymous fields, match up by index.
2867 if (!Name
&& getFieldIndex(D
) != getFieldIndex(FoundField
))
2870 if (Importer
.IsStructurallyEquivalent(D
->getType(),
2871 FoundField
->getType())) {
2872 Importer
.Imported(D
, FoundField
);
2876 Importer
.ToDiag(Loc
, diag::err_odr_field_type_inconsistent
)
2877 << Name
<< D
->getType() << FoundField
->getType();
2878 Importer
.ToDiag(FoundField
->getLocation(), diag::note_odr_value_here
)
2879 << FoundField
->getType();
2885 QualType T
= Importer
.Import(D
->getType());
2889 TypeSourceInfo
*TInfo
= Importer
.Import(D
->getTypeSourceInfo());
2890 Expr
*BitWidth
= Importer
.Import(D
->getBitWidth());
2891 if (!BitWidth
&& D
->getBitWidth())
2894 FieldDecl
*ToField
= FieldDecl::Create(Importer
.getToContext(), DC
,
2895 Importer
.Import(D
->getInnerLocStart()),
2896 Loc
, Name
.getAsIdentifierInfo(),
2897 T
, TInfo
, BitWidth
, D
->isMutable(),
2898 D
->getInClassInitStyle());
2899 ToField
->setAccess(D
->getAccess());
2900 ToField
->setLexicalDeclContext(LexicalDC
);
2901 if (ToField
->hasInClassInitializer())
2902 ToField
->setInClassInitializer(D
->getInClassInitializer());
2903 ToField
->setImplicit(D
->isImplicit());
2904 Importer
.Imported(D
, ToField
);
2905 LexicalDC
->addDeclInternal(ToField
);
2909 Decl
*ASTNodeImporter::VisitIndirectFieldDecl(IndirectFieldDecl
*D
) {
2910 // Import the major distinguishing characteristics of a variable.
2911 DeclContext
*DC
, *LexicalDC
;
2912 DeclarationName Name
;
2914 if (ImportDeclParts(D
, DC
, LexicalDC
, Name
, Loc
))
2917 // Determine whether we've already imported this field.
2918 SmallVector
<NamedDecl
*, 2> FoundDecls
;
2919 DC
->getRedeclContext()->localUncachedLookup(Name
, FoundDecls
);
2920 for (unsigned I
= 0, N
= FoundDecls
.size(); I
!= N
; ++I
) {
2921 if (IndirectFieldDecl
*FoundField
2922 = dyn_cast
<IndirectFieldDecl
>(FoundDecls
[I
])) {
2923 // For anonymous indirect fields, match up by index.
2924 if (!Name
&& getFieldIndex(D
) != getFieldIndex(FoundField
))
2927 if (Importer
.IsStructurallyEquivalent(D
->getType(),
2928 FoundField
->getType(),
2930 Importer
.Imported(D
, FoundField
);
2934 // If there are more anonymous fields to check, continue.
2935 if (!Name
&& I
< N
-1)
2938 Importer
.ToDiag(Loc
, diag::err_odr_field_type_inconsistent
)
2939 << Name
<< D
->getType() << FoundField
->getType();
2940 Importer
.ToDiag(FoundField
->getLocation(), diag::note_odr_value_here
)
2941 << FoundField
->getType();
2947 QualType T
= Importer
.Import(D
->getType());
2951 NamedDecl
**NamedChain
=
2952 new (Importer
.getToContext())NamedDecl
*[D
->getChainingSize()];
2955 for (auto *PI
: D
->chain()) {
2956 Decl
*D
= Importer
.Import(PI
);
2959 NamedChain
[i
++] = cast
<NamedDecl
>(D
);
2962 IndirectFieldDecl
*ToIndirectField
= IndirectFieldDecl::Create(
2963 Importer
.getToContext(), DC
, Loc
, Name
.getAsIdentifierInfo(), T
,
2964 NamedChain
, D
->getChainingSize());
2966 for (const auto *Attr
: D
->attrs())
2967 ToIndirectField
->addAttr(Attr
->clone(Importer
.getToContext()));
2969 ToIndirectField
->setAccess(D
->getAccess());
2970 ToIndirectField
->setLexicalDeclContext(LexicalDC
);
2971 Importer
.Imported(D
, ToIndirectField
);
2972 LexicalDC
->addDeclInternal(ToIndirectField
);
2973 return ToIndirectField
;
2976 Decl
*ASTNodeImporter::VisitObjCIvarDecl(ObjCIvarDecl
*D
) {
2977 // Import the major distinguishing characteristics of an ivar.
2978 DeclContext
*DC
, *LexicalDC
;
2979 DeclarationName Name
;
2981 if (ImportDeclParts(D
, DC
, LexicalDC
, Name
, Loc
))
2984 // Determine whether we've already imported this ivar
2985 SmallVector
<NamedDecl
*, 2> FoundDecls
;
2986 DC
->getRedeclContext()->localUncachedLookup(Name
, FoundDecls
);
2987 for (unsigned I
= 0, N
= FoundDecls
.size(); I
!= N
; ++I
) {
2988 if (ObjCIvarDecl
*FoundIvar
= dyn_cast
<ObjCIvarDecl
>(FoundDecls
[I
])) {
2989 if (Importer
.IsStructurallyEquivalent(D
->getType(),
2990 FoundIvar
->getType())) {
2991 Importer
.Imported(D
, FoundIvar
);
2995 Importer
.ToDiag(Loc
, diag::err_odr_ivar_type_inconsistent
)
2996 << Name
<< D
->getType() << FoundIvar
->getType();
2997 Importer
.ToDiag(FoundIvar
->getLocation(), diag::note_odr_value_here
)
2998 << FoundIvar
->getType();
3004 QualType T
= Importer
.Import(D
->getType());
3008 TypeSourceInfo
*TInfo
= Importer
.Import(D
->getTypeSourceInfo());
3009 Expr
*BitWidth
= Importer
.Import(D
->getBitWidth());
3010 if (!BitWidth
&& D
->getBitWidth())
3013 ObjCIvarDecl
*ToIvar
= ObjCIvarDecl::Create(Importer
.getToContext(),
3014 cast
<ObjCContainerDecl
>(DC
),
3015 Importer
.Import(D
->getInnerLocStart()),
3016 Loc
, Name
.getAsIdentifierInfo(),
3017 T
, TInfo
, D
->getAccessControl(),
3018 BitWidth
, D
->getSynthesize());
3019 ToIvar
->setLexicalDeclContext(LexicalDC
);
3020 Importer
.Imported(D
, ToIvar
);
3021 LexicalDC
->addDeclInternal(ToIvar
);
3026 Decl
*ASTNodeImporter::VisitVarDecl(VarDecl
*D
) {
3027 // Import the major distinguishing characteristics of a variable.
3028 DeclContext
*DC
, *LexicalDC
;
3029 DeclarationName Name
;
3031 if (ImportDeclParts(D
, DC
, LexicalDC
, Name
, Loc
))
3034 // Try to find a variable in our own ("to") context with the same name and
3035 // in the same context as the variable we're importing.
3036 if (D
->isFileVarDecl()) {
3037 VarDecl
*MergeWithVar
= nullptr;
3038 SmallVector
<NamedDecl
*, 4> ConflictingDecls
;
3039 unsigned IDNS
= Decl::IDNS_Ordinary
;
3040 SmallVector
<NamedDecl
*, 2> FoundDecls
;
3041 DC
->getRedeclContext()->localUncachedLookup(Name
, FoundDecls
);
3042 for (unsigned I
= 0, N
= FoundDecls
.size(); I
!= N
; ++I
) {
3043 if (!FoundDecls
[I
]->isInIdentifierNamespace(IDNS
))
3046 if (VarDecl
*FoundVar
= dyn_cast
<VarDecl
>(FoundDecls
[I
])) {
3047 // We have found a variable that we may need to merge with. Check it.
3048 if (FoundVar
->hasExternalFormalLinkage() &&
3049 D
->hasExternalFormalLinkage()) {
3050 if (Importer
.IsStructurallyEquivalent(D
->getType(),
3051 FoundVar
->getType())) {
3052 MergeWithVar
= FoundVar
;
3056 const ArrayType
*FoundArray
3057 = Importer
.getToContext().getAsArrayType(FoundVar
->getType());
3058 const ArrayType
*TArray
3059 = Importer
.getToContext().getAsArrayType(D
->getType());
3060 if (FoundArray
&& TArray
) {
3061 if (isa
<IncompleteArrayType
>(FoundArray
) &&
3062 isa
<ConstantArrayType
>(TArray
)) {
3064 QualType T
= Importer
.Import(D
->getType());
3068 FoundVar
->setType(T
);
3069 MergeWithVar
= FoundVar
;
3071 } else if (isa
<IncompleteArrayType
>(TArray
) &&
3072 isa
<ConstantArrayType
>(FoundArray
)) {
3073 MergeWithVar
= FoundVar
;
3078 Importer
.ToDiag(Loc
, diag::err_odr_variable_type_inconsistent
)
3079 << Name
<< D
->getType() << FoundVar
->getType();
3080 Importer
.ToDiag(FoundVar
->getLocation(), diag::note_odr_value_here
)
3081 << FoundVar
->getType();
3085 ConflictingDecls
.push_back(FoundDecls
[I
]);
3089 // An equivalent variable with external linkage has been found. Link
3090 // the two declarations, then merge them.
3091 Importer
.Imported(D
, MergeWithVar
);
3093 if (VarDecl
*DDef
= D
->getDefinition()) {
3094 if (VarDecl
*ExistingDef
= MergeWithVar
->getDefinition()) {
3095 Importer
.ToDiag(ExistingDef
->getLocation(),
3096 diag::err_odr_variable_multiple_def
)
3098 Importer
.FromDiag(DDef
->getLocation(), diag::note_odr_defined_here
);
3100 Expr
*Init
= Importer
.Import(DDef
->getInit());
3101 MergeWithVar
->setInit(Init
);
3102 if (DDef
->isInitKnownICE()) {
3103 EvaluatedStmt
*Eval
= MergeWithVar
->ensureEvaluatedStmt();
3104 Eval
->CheckedICE
= true;
3105 Eval
->IsICE
= DDef
->isInitICE();
3110 return MergeWithVar
;
3113 if (!ConflictingDecls
.empty()) {
3114 Name
= Importer
.HandleNameConflict(Name
, DC
, IDNS
,
3115 ConflictingDecls
.data(),
3116 ConflictingDecls
.size());
3123 QualType T
= Importer
.Import(D
->getType());
3127 // Create the imported variable.
3128 TypeSourceInfo
*TInfo
= Importer
.Import(D
->getTypeSourceInfo());
3129 VarDecl
*ToVar
= VarDecl::Create(Importer
.getToContext(), DC
,
3130 Importer
.Import(D
->getInnerLocStart()),
3131 Loc
, Name
.getAsIdentifierInfo(),
3133 D
->getStorageClass());
3134 ToVar
->setQualifierInfo(Importer
.Import(D
->getQualifierLoc()));
3135 ToVar
->setAccess(D
->getAccess());
3136 ToVar
->setLexicalDeclContext(LexicalDC
);
3137 Importer
.Imported(D
, ToVar
);
3138 LexicalDC
->addDeclInternal(ToVar
);
3140 // Merge the initializer.
3141 if (ImportDefinition(D
, ToVar
))
3147 Decl
*ASTNodeImporter::VisitImplicitParamDecl(ImplicitParamDecl
*D
) {
3148 // Parameters are created in the translation unit's context, then moved
3149 // into the function declaration's context afterward.
3150 DeclContext
*DC
= Importer
.getToContext().getTranslationUnitDecl();
3152 // Import the name of this declaration.
3153 DeclarationName Name
= Importer
.Import(D
->getDeclName());
3154 if (D
->getDeclName() && !Name
)
3157 // Import the location of this declaration.
3158 SourceLocation Loc
= Importer
.Import(D
->getLocation());
3160 // Import the parameter's type.
3161 QualType T
= Importer
.Import(D
->getType());
3165 // Create the imported parameter.
3166 ImplicitParamDecl
*ToParm
3167 = ImplicitParamDecl::Create(Importer
.getToContext(), DC
,
3168 Loc
, Name
.getAsIdentifierInfo(),
3170 return Importer
.Imported(D
, ToParm
);
3173 Decl
*ASTNodeImporter::VisitParmVarDecl(ParmVarDecl
*D
) {
3174 // Parameters are created in the translation unit's context, then moved
3175 // into the function declaration's context afterward.
3176 DeclContext
*DC
= Importer
.getToContext().getTranslationUnitDecl();
3178 // Import the name of this declaration.
3179 DeclarationName Name
= Importer
.Import(D
->getDeclName());
3180 if (D
->getDeclName() && !Name
)
3183 // Import the location of this declaration.
3184 SourceLocation Loc
= Importer
.Import(D
->getLocation());
3186 // Import the parameter's type.
3187 QualType T
= Importer
.Import(D
->getType());
3191 // Create the imported parameter.
3192 TypeSourceInfo
*TInfo
= Importer
.Import(D
->getTypeSourceInfo());
3193 ParmVarDecl
*ToParm
= ParmVarDecl::Create(Importer
.getToContext(), DC
,
3194 Importer
.Import(D
->getInnerLocStart()),
3195 Loc
, Name
.getAsIdentifierInfo(),
3196 T
, TInfo
, D
->getStorageClass(),
3197 /*FIXME: Default argument*/nullptr);
3198 ToParm
->setHasInheritedDefaultArg(D
->hasInheritedDefaultArg());
3199 return Importer
.Imported(D
, ToParm
);
3202 Decl
*ASTNodeImporter::VisitObjCMethodDecl(ObjCMethodDecl
*D
) {
3203 // Import the major distinguishing characteristics of a method.
3204 DeclContext
*DC
, *LexicalDC
;
3205 DeclarationName Name
;
3207 if (ImportDeclParts(D
, DC
, LexicalDC
, Name
, Loc
))
3210 SmallVector
<NamedDecl
*, 2> FoundDecls
;
3211 DC
->getRedeclContext()->localUncachedLookup(Name
, FoundDecls
);
3212 for (unsigned I
= 0, N
= FoundDecls
.size(); I
!= N
; ++I
) {
3213 if (ObjCMethodDecl
*FoundMethod
= dyn_cast
<ObjCMethodDecl
>(FoundDecls
[I
])) {
3214 if (FoundMethod
->isInstanceMethod() != D
->isInstanceMethod())
3217 // Check return types.
3218 if (!Importer
.IsStructurallyEquivalent(D
->getReturnType(),
3219 FoundMethod
->getReturnType())) {
3220 Importer
.ToDiag(Loc
, diag::err_odr_objc_method_result_type_inconsistent
)
3221 << D
->isInstanceMethod() << Name
<< D
->getReturnType()
3222 << FoundMethod
->getReturnType();
3223 Importer
.ToDiag(FoundMethod
->getLocation(),
3224 diag::note_odr_objc_method_here
)
3225 << D
->isInstanceMethod() << Name
;
3229 // Check the number of parameters.
3230 if (D
->param_size() != FoundMethod
->param_size()) {
3231 Importer
.ToDiag(Loc
, diag::err_odr_objc_method_num_params_inconsistent
)
3232 << D
->isInstanceMethod() << Name
3233 << D
->param_size() << FoundMethod
->param_size();
3234 Importer
.ToDiag(FoundMethod
->getLocation(),
3235 diag::note_odr_objc_method_here
)
3236 << D
->isInstanceMethod() << Name
;
3240 // Check parameter types.
3241 for (ObjCMethodDecl::param_iterator P
= D
->param_begin(),
3242 PEnd
= D
->param_end(), FoundP
= FoundMethod
->param_begin();
3243 P
!= PEnd
; ++P
, ++FoundP
) {
3244 if (!Importer
.IsStructurallyEquivalent((*P
)->getType(),
3245 (*FoundP
)->getType())) {
3246 Importer
.FromDiag((*P
)->getLocation(),
3247 diag::err_odr_objc_method_param_type_inconsistent
)
3248 << D
->isInstanceMethod() << Name
3249 << (*P
)->getType() << (*FoundP
)->getType();
3250 Importer
.ToDiag((*FoundP
)->getLocation(), diag::note_odr_value_here
)
3251 << (*FoundP
)->getType();
3256 // Check variadic/non-variadic.
3257 // Check the number of parameters.
3258 if (D
->isVariadic() != FoundMethod
->isVariadic()) {
3259 Importer
.ToDiag(Loc
, diag::err_odr_objc_method_variadic_inconsistent
)
3260 << D
->isInstanceMethod() << Name
;
3261 Importer
.ToDiag(FoundMethod
->getLocation(),
3262 diag::note_odr_objc_method_here
)
3263 << D
->isInstanceMethod() << Name
;
3267 // FIXME: Any other bits we need to merge?
3268 return Importer
.Imported(D
, FoundMethod
);
3272 // Import the result type.
3273 QualType ResultTy
= Importer
.Import(D
->getReturnType());
3274 if (ResultTy
.isNull())
3277 TypeSourceInfo
*ReturnTInfo
= Importer
.Import(D
->getReturnTypeSourceInfo());
3279 ObjCMethodDecl
*ToMethod
= ObjCMethodDecl::Create(
3280 Importer
.getToContext(), Loc
, Importer
.Import(D
->getLocEnd()),
3281 Name
.getObjCSelector(), ResultTy
, ReturnTInfo
, DC
, D
->isInstanceMethod(),
3282 D
->isVariadic(), D
->isPropertyAccessor(), D
->isImplicit(), D
->isDefined(),
3283 D
->getImplementationControl(), D
->hasRelatedResultType());
3285 // FIXME: When we decide to merge method definitions, we'll need to
3286 // deal with implicit parameters.
3288 // Import the parameters
3289 SmallVector
<ParmVarDecl
*, 5> ToParams
;
3290 for (auto *FromP
: D
->params()) {
3291 ParmVarDecl
*ToP
= cast_or_null
<ParmVarDecl
>(Importer
.Import(FromP
));
3295 ToParams
.push_back(ToP
);
3298 // Set the parameters.
3299 for (unsigned I
= 0, N
= ToParams
.size(); I
!= N
; ++I
) {
3300 ToParams
[I
]->setOwningFunction(ToMethod
);
3301 ToMethod
->addDeclInternal(ToParams
[I
]);
3303 SmallVector
<SourceLocation
, 12> SelLocs
;
3304 D
->getSelectorLocs(SelLocs
);
3305 ToMethod
->setMethodParams(Importer
.getToContext(), ToParams
, SelLocs
);
3307 ToMethod
->setLexicalDeclContext(LexicalDC
);
3308 Importer
.Imported(D
, ToMethod
);
3309 LexicalDC
->addDeclInternal(ToMethod
);
3313 Decl
*ASTNodeImporter::VisitObjCCategoryDecl(ObjCCategoryDecl
*D
) {
3314 // Import the major distinguishing characteristics of a category.
3315 DeclContext
*DC
, *LexicalDC
;
3316 DeclarationName Name
;
3318 if (ImportDeclParts(D
, DC
, LexicalDC
, Name
, Loc
))
3321 ObjCInterfaceDecl
*ToInterface
3322 = cast_or_null
<ObjCInterfaceDecl
>(Importer
.Import(D
->getClassInterface()));
3326 // Determine if we've already encountered this category.
3327 ObjCCategoryDecl
*MergeWithCategory
3328 = ToInterface
->FindCategoryDeclaration(Name
.getAsIdentifierInfo());
3329 ObjCCategoryDecl
*ToCategory
= MergeWithCategory
;
3331 ToCategory
= ObjCCategoryDecl::Create(Importer
.getToContext(), DC
,
3332 Importer
.Import(D
->getAtStartLoc()),
3334 Importer
.Import(D
->getCategoryNameLoc()),
3335 Name
.getAsIdentifierInfo(),
3337 Importer
.Import(D
->getIvarLBraceLoc()),
3338 Importer
.Import(D
->getIvarRBraceLoc()));
3339 ToCategory
->setLexicalDeclContext(LexicalDC
);
3340 LexicalDC
->addDeclInternal(ToCategory
);
3341 Importer
.Imported(D
, ToCategory
);
3344 SmallVector
<ObjCProtocolDecl
*, 4> Protocols
;
3345 SmallVector
<SourceLocation
, 4> ProtocolLocs
;
3346 ObjCCategoryDecl::protocol_loc_iterator FromProtoLoc
3347 = D
->protocol_loc_begin();
3348 for (ObjCCategoryDecl::protocol_iterator FromProto
= D
->protocol_begin(),
3349 FromProtoEnd
= D
->protocol_end();
3350 FromProto
!= FromProtoEnd
;
3351 ++FromProto
, ++FromProtoLoc
) {
3352 ObjCProtocolDecl
*ToProto
3353 = cast_or_null
<ObjCProtocolDecl
>(Importer
.Import(*FromProto
));
3356 Protocols
.push_back(ToProto
);
3357 ProtocolLocs
.push_back(Importer
.Import(*FromProtoLoc
));
3360 // FIXME: If we're merging, make sure that the protocol list is the same.
3361 ToCategory
->setProtocolList(Protocols
.data(), Protocols
.size(),
3362 ProtocolLocs
.data(), Importer
.getToContext());
3365 Importer
.Imported(D
, ToCategory
);
3368 // Import all of the members of this category.
3369 ImportDeclContext(D
);
3371 // If we have an implementation, import it as well.
3372 if (D
->getImplementation()) {
3373 ObjCCategoryImplDecl
*Impl
3374 = cast_or_null
<ObjCCategoryImplDecl
>(
3375 Importer
.Import(D
->getImplementation()));
3379 ToCategory
->setImplementation(Impl
);
3385 bool ASTNodeImporter::ImportDefinition(ObjCProtocolDecl
*From
,
3386 ObjCProtocolDecl
*To
,
3387 ImportDefinitionKind Kind
) {
3388 if (To
->getDefinition()) {
3389 if (shouldForceImportDeclContext(Kind
))
3390 ImportDeclContext(From
);
3394 // Start the protocol definition
3395 To
->startDefinition();
3398 SmallVector
<ObjCProtocolDecl
*, 4> Protocols
;
3399 SmallVector
<SourceLocation
, 4> ProtocolLocs
;
3400 ObjCProtocolDecl::protocol_loc_iterator
3401 FromProtoLoc
= From
->protocol_loc_begin();
3402 for (ObjCProtocolDecl::protocol_iterator FromProto
= From
->protocol_begin(),
3403 FromProtoEnd
= From
->protocol_end();
3404 FromProto
!= FromProtoEnd
;
3405 ++FromProto
, ++FromProtoLoc
) {
3406 ObjCProtocolDecl
*ToProto
3407 = cast_or_null
<ObjCProtocolDecl
>(Importer
.Import(*FromProto
));
3410 Protocols
.push_back(ToProto
);
3411 ProtocolLocs
.push_back(Importer
.Import(*FromProtoLoc
));
3414 // FIXME: If we're merging, make sure that the protocol list is the same.
3415 To
->setProtocolList(Protocols
.data(), Protocols
.size(),
3416 ProtocolLocs
.data(), Importer
.getToContext());
3418 if (shouldForceImportDeclContext(Kind
)) {
3419 // Import all of the members of this protocol.
3420 ImportDeclContext(From
, /*ForceImport=*/true);
3425 Decl
*ASTNodeImporter::VisitObjCProtocolDecl(ObjCProtocolDecl
*D
) {
3426 // If this protocol has a definition in the translation unit we're coming
3427 // from, but this particular declaration is not that definition, import the
3428 // definition and map to that.
3429 ObjCProtocolDecl
*Definition
= D
->getDefinition();
3430 if (Definition
&& Definition
!= D
) {
3431 Decl
*ImportedDef
= Importer
.Import(Definition
);
3435 return Importer
.Imported(D
, ImportedDef
);
3438 // Import the major distinguishing characteristics of a protocol.
3439 DeclContext
*DC
, *LexicalDC
;
3440 DeclarationName Name
;
3442 if (ImportDeclParts(D
, DC
, LexicalDC
, Name
, Loc
))
3445 ObjCProtocolDecl
*MergeWithProtocol
= nullptr;
3446 SmallVector
<NamedDecl
*, 2> FoundDecls
;
3447 DC
->getRedeclContext()->localUncachedLookup(Name
, FoundDecls
);
3448 for (unsigned I
= 0, N
= FoundDecls
.size(); I
!= N
; ++I
) {
3449 if (!FoundDecls
[I
]->isInIdentifierNamespace(Decl::IDNS_ObjCProtocol
))
3452 if ((MergeWithProtocol
= dyn_cast
<ObjCProtocolDecl
>(FoundDecls
[I
])))
3456 ObjCProtocolDecl
*ToProto
= MergeWithProtocol
;
3458 ToProto
= ObjCProtocolDecl::Create(Importer
.getToContext(), DC
,
3459 Name
.getAsIdentifierInfo(), Loc
,
3460 Importer
.Import(D
->getAtStartLoc()),
3461 /*PrevDecl=*/nullptr);
3462 ToProto
->setLexicalDeclContext(LexicalDC
);
3463 LexicalDC
->addDeclInternal(ToProto
);
3466 Importer
.Imported(D
, ToProto
);
3468 if (D
->isThisDeclarationADefinition() && ImportDefinition(D
, ToProto
))
3474 Decl
*ASTNodeImporter::VisitLinkageSpecDecl(LinkageSpecDecl
*D
) {
3475 DeclContext
*DC
= Importer
.ImportContext(D
->getDeclContext());
3476 DeclContext
*LexicalDC
= Importer
.ImportContext(D
->getLexicalDeclContext());
3478 SourceLocation ExternLoc
= Importer
.Import(D
->getExternLoc());
3479 SourceLocation LangLoc
= Importer
.Import(D
->getLocation());
3481 bool HasBraces
= D
->hasBraces();
3483 LinkageSpecDecl
*ToLinkageSpec
=
3484 LinkageSpecDecl::Create(Importer
.getToContext(),
3492 SourceLocation RBraceLoc
= Importer
.Import(D
->getRBraceLoc());
3493 ToLinkageSpec
->setRBraceLoc(RBraceLoc
);
3496 ToLinkageSpec
->setLexicalDeclContext(LexicalDC
);
3497 LexicalDC
->addDeclInternal(ToLinkageSpec
);
3499 Importer
.Imported(D
, ToLinkageSpec
);
3501 return ToLinkageSpec
;
3504 bool ASTNodeImporter::ImportDefinition(ObjCInterfaceDecl
*From
,
3505 ObjCInterfaceDecl
*To
,
3506 ImportDefinitionKind Kind
) {
3507 if (To
->getDefinition()) {
3508 // Check consistency of superclass.
3509 ObjCInterfaceDecl
*FromSuper
= From
->getSuperClass();
3511 FromSuper
= cast_or_null
<ObjCInterfaceDecl
>(Importer
.Import(FromSuper
));
3516 ObjCInterfaceDecl
*ToSuper
= To
->getSuperClass();
3517 if ((bool)FromSuper
!= (bool)ToSuper
||
3518 (FromSuper
&& !declaresSameEntity(FromSuper
, ToSuper
))) {
3519 Importer
.ToDiag(To
->getLocation(),
3520 diag::err_odr_objc_superclass_inconsistent
)
3521 << To
->getDeclName();
3523 Importer
.ToDiag(To
->getSuperClassLoc(), diag::note_odr_objc_superclass
)
3524 << To
->getSuperClass()->getDeclName();
3526 Importer
.ToDiag(To
->getLocation(),
3527 diag::note_odr_objc_missing_superclass
);
3528 if (From
->getSuperClass())
3529 Importer
.FromDiag(From
->getSuperClassLoc(),
3530 diag::note_odr_objc_superclass
)
3531 << From
->getSuperClass()->getDeclName();
3533 Importer
.FromDiag(From
->getLocation(),
3534 diag::note_odr_objc_missing_superclass
);
3537 if (shouldForceImportDeclContext(Kind
))
3538 ImportDeclContext(From
);
3542 // Start the definition.
3543 To
->startDefinition();
3545 // If this class has a superclass, import it.
3546 if (From
->getSuperClass()) {
3547 ObjCInterfaceDecl
*Super
= cast_or_null
<ObjCInterfaceDecl
>(
3548 Importer
.Import(From
->getSuperClass()));
3552 To
->setSuperClass(Super
);
3553 To
->setSuperClassLoc(Importer
.Import(From
->getSuperClassLoc()));
3557 SmallVector
<ObjCProtocolDecl
*, 4> Protocols
;
3558 SmallVector
<SourceLocation
, 4> ProtocolLocs
;
3559 ObjCInterfaceDecl::protocol_loc_iterator
3560 FromProtoLoc
= From
->protocol_loc_begin();
3562 for (ObjCInterfaceDecl::protocol_iterator FromProto
= From
->protocol_begin(),
3563 FromProtoEnd
= From
->protocol_end();
3564 FromProto
!= FromProtoEnd
;
3565 ++FromProto
, ++FromProtoLoc
) {
3566 ObjCProtocolDecl
*ToProto
3567 = cast_or_null
<ObjCProtocolDecl
>(Importer
.Import(*FromProto
));
3570 Protocols
.push_back(ToProto
);
3571 ProtocolLocs
.push_back(Importer
.Import(*FromProtoLoc
));
3574 // FIXME: If we're merging, make sure that the protocol list is the same.
3575 To
->setProtocolList(Protocols
.data(), Protocols
.size(),
3576 ProtocolLocs
.data(), Importer
.getToContext());
3578 // Import categories. When the categories themselves are imported, they'll
3579 // hook themselves into this interface.
3580 for (auto *Cat
: From
->known_categories())
3581 Importer
.Import(Cat
);
3583 // If we have an @implementation, import it as well.
3584 if (From
->getImplementation()) {
3585 ObjCImplementationDecl
*Impl
= cast_or_null
<ObjCImplementationDecl
>(
3586 Importer
.Import(From
->getImplementation()));
3590 To
->setImplementation(Impl
);
3593 if (shouldForceImportDeclContext(Kind
)) {
3594 // Import all of the members of this class.
3595 ImportDeclContext(From
, /*ForceImport=*/true);
3600 Decl
*ASTNodeImporter::VisitObjCInterfaceDecl(ObjCInterfaceDecl
*D
) {
3601 // If this class has a definition in the translation unit we're coming from,
3602 // but this particular declaration is not that definition, import the
3603 // definition and map to that.
3604 ObjCInterfaceDecl
*Definition
= D
->getDefinition();
3605 if (Definition
&& Definition
!= D
) {
3606 Decl
*ImportedDef
= Importer
.Import(Definition
);
3610 return Importer
.Imported(D
, ImportedDef
);
3613 // Import the major distinguishing characteristics of an @interface.
3614 DeclContext
*DC
, *LexicalDC
;
3615 DeclarationName Name
;
3617 if (ImportDeclParts(D
, DC
, LexicalDC
, Name
, Loc
))
3620 // Look for an existing interface with the same name.
3621 ObjCInterfaceDecl
*MergeWithIface
= nullptr;
3622 SmallVector
<NamedDecl
*, 2> FoundDecls
;
3623 DC
->getRedeclContext()->localUncachedLookup(Name
, FoundDecls
);
3624 for (unsigned I
= 0, N
= FoundDecls
.size(); I
!= N
; ++I
) {
3625 if (!FoundDecls
[I
]->isInIdentifierNamespace(Decl::IDNS_Ordinary
))
3628 if ((MergeWithIface
= dyn_cast
<ObjCInterfaceDecl
>(FoundDecls
[I
])))
3632 // Create an interface declaration, if one does not already exist.
3633 ObjCInterfaceDecl
*ToIface
= MergeWithIface
;
3635 ToIface
= ObjCInterfaceDecl::Create(Importer
.getToContext(), DC
,
3636 Importer
.Import(D
->getAtStartLoc()),
3637 Name
.getAsIdentifierInfo(),
3638 /*PrevDecl=*/nullptr, Loc
,
3639 D
->isImplicitInterfaceDecl());
3640 ToIface
->setLexicalDeclContext(LexicalDC
);
3641 LexicalDC
->addDeclInternal(ToIface
);
3643 Importer
.Imported(D
, ToIface
);
3645 if (D
->isThisDeclarationADefinition() && ImportDefinition(D
, ToIface
))
3651 Decl
*ASTNodeImporter::VisitObjCCategoryImplDecl(ObjCCategoryImplDecl
*D
) {
3652 ObjCCategoryDecl
*Category
= cast_or_null
<ObjCCategoryDecl
>(
3653 Importer
.Import(D
->getCategoryDecl()));
3657 ObjCCategoryImplDecl
*ToImpl
= Category
->getImplementation();
3659 DeclContext
*DC
= Importer
.ImportContext(D
->getDeclContext());
3663 SourceLocation CategoryNameLoc
= Importer
.Import(D
->getCategoryNameLoc());
3664 ToImpl
= ObjCCategoryImplDecl::Create(Importer
.getToContext(), DC
,
3665 Importer
.Import(D
->getIdentifier()),
3666 Category
->getClassInterface(),
3667 Importer
.Import(D
->getLocation()),
3668 Importer
.Import(D
->getAtStartLoc()),
3671 DeclContext
*LexicalDC
= DC
;
3672 if (D
->getDeclContext() != D
->getLexicalDeclContext()) {
3673 LexicalDC
= Importer
.ImportContext(D
->getLexicalDeclContext());
3677 ToImpl
->setLexicalDeclContext(LexicalDC
);
3680 LexicalDC
->addDeclInternal(ToImpl
);
3681 Category
->setImplementation(ToImpl
);
3684 Importer
.Imported(D
, ToImpl
);
3685 ImportDeclContext(D
);
3689 Decl
*ASTNodeImporter::VisitObjCImplementationDecl(ObjCImplementationDecl
*D
) {
3690 // Find the corresponding interface.
3691 ObjCInterfaceDecl
*Iface
= cast_or_null
<ObjCInterfaceDecl
>(
3692 Importer
.Import(D
->getClassInterface()));
3696 // Import the superclass, if any.
3697 ObjCInterfaceDecl
*Super
= nullptr;
3698 if (D
->getSuperClass()) {
3699 Super
= cast_or_null
<ObjCInterfaceDecl
>(
3700 Importer
.Import(D
->getSuperClass()));
3705 ObjCImplementationDecl
*Impl
= Iface
->getImplementation();
3707 // We haven't imported an implementation yet. Create a new @implementation
3709 Impl
= ObjCImplementationDecl::Create(Importer
.getToContext(),
3710 Importer
.ImportContext(D
->getDeclContext()),
3712 Importer
.Import(D
->getLocation()),
3713 Importer
.Import(D
->getAtStartLoc()),
3714 Importer
.Import(D
->getSuperClassLoc()),
3715 Importer
.Import(D
->getIvarLBraceLoc()),
3716 Importer
.Import(D
->getIvarRBraceLoc()));
3718 if (D
->getDeclContext() != D
->getLexicalDeclContext()) {
3719 DeclContext
*LexicalDC
3720 = Importer
.ImportContext(D
->getLexicalDeclContext());
3723 Impl
->setLexicalDeclContext(LexicalDC
);
3726 // Associate the implementation with the class it implements.
3727 Iface
->setImplementation(Impl
);
3728 Importer
.Imported(D
, Iface
->getImplementation());
3730 Importer
.Imported(D
, Iface
->getImplementation());
3732 // Verify that the existing @implementation has the same superclass.
3733 if ((Super
&& !Impl
->getSuperClass()) ||
3734 (!Super
&& Impl
->getSuperClass()) ||
3735 (Super
&& Impl
->getSuperClass() &&
3736 !declaresSameEntity(Super
->getCanonicalDecl(),
3737 Impl
->getSuperClass()))) {
3738 Importer
.ToDiag(Impl
->getLocation(),
3739 diag::err_odr_objc_superclass_inconsistent
)
3740 << Iface
->getDeclName();
3741 // FIXME: It would be nice to have the location of the superclass
3743 if (Impl
->getSuperClass())
3744 Importer
.ToDiag(Impl
->getLocation(),
3745 diag::note_odr_objc_superclass
)
3746 << Impl
->getSuperClass()->getDeclName();
3748 Importer
.ToDiag(Impl
->getLocation(),
3749 diag::note_odr_objc_missing_superclass
);
3750 if (D
->getSuperClass())
3751 Importer
.FromDiag(D
->getLocation(),
3752 diag::note_odr_objc_superclass
)
3753 << D
->getSuperClass()->getDeclName();
3755 Importer
.FromDiag(D
->getLocation(),
3756 diag::note_odr_objc_missing_superclass
);
3761 // Import all of the members of this @implementation.
3762 ImportDeclContext(D
);
3767 Decl
*ASTNodeImporter::VisitObjCPropertyDecl(ObjCPropertyDecl
*D
) {
3768 // Import the major distinguishing characteristics of an @property.
3769 DeclContext
*DC
, *LexicalDC
;
3770 DeclarationName Name
;
3772 if (ImportDeclParts(D
, DC
, LexicalDC
, Name
, Loc
))
3775 // Check whether we have already imported this property.
3776 SmallVector
<NamedDecl
*, 2> FoundDecls
;
3777 DC
->getRedeclContext()->localUncachedLookup(Name
, FoundDecls
);
3778 for (unsigned I
= 0, N
= FoundDecls
.size(); I
!= N
; ++I
) {
3779 if (ObjCPropertyDecl
*FoundProp
3780 = dyn_cast
<ObjCPropertyDecl
>(FoundDecls
[I
])) {
3781 // Check property types.
3782 if (!Importer
.IsStructurallyEquivalent(D
->getType(),
3783 FoundProp
->getType())) {
3784 Importer
.ToDiag(Loc
, diag::err_odr_objc_property_type_inconsistent
)
3785 << Name
<< D
->getType() << FoundProp
->getType();
3786 Importer
.ToDiag(FoundProp
->getLocation(), diag::note_odr_value_here
)
3787 << FoundProp
->getType();
3791 // FIXME: Check property attributes, getters, setters, etc.?
3793 // Consider these properties to be equivalent.
3794 Importer
.Imported(D
, FoundProp
);
3800 TypeSourceInfo
*T
= Importer
.Import(D
->getTypeSourceInfo());
3804 // Create the new property.
3805 ObjCPropertyDecl
*ToProperty
3806 = ObjCPropertyDecl::Create(Importer
.getToContext(), DC
, Loc
,
3807 Name
.getAsIdentifierInfo(),
3808 Importer
.Import(D
->getAtLoc()),
3809 Importer
.Import(D
->getLParenLoc()),
3811 D
->getPropertyImplementation());
3812 Importer
.Imported(D
, ToProperty
);
3813 ToProperty
->setLexicalDeclContext(LexicalDC
);
3814 LexicalDC
->addDeclInternal(ToProperty
);
3816 ToProperty
->setPropertyAttributes(D
->getPropertyAttributes());
3817 ToProperty
->setPropertyAttributesAsWritten(
3818 D
->getPropertyAttributesAsWritten());
3819 ToProperty
->setGetterName(Importer
.Import(D
->getGetterName()));
3820 ToProperty
->setSetterName(Importer
.Import(D
->getSetterName()));
3821 ToProperty
->setGetterMethodDecl(
3822 cast_or_null
<ObjCMethodDecl
>(Importer
.Import(D
->getGetterMethodDecl())));
3823 ToProperty
->setSetterMethodDecl(
3824 cast_or_null
<ObjCMethodDecl
>(Importer
.Import(D
->getSetterMethodDecl())));
3825 ToProperty
->setPropertyIvarDecl(
3826 cast_or_null
<ObjCIvarDecl
>(Importer
.Import(D
->getPropertyIvarDecl())));
3830 Decl
*ASTNodeImporter::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl
*D
) {
3831 ObjCPropertyDecl
*Property
= cast_or_null
<ObjCPropertyDecl
>(
3832 Importer
.Import(D
->getPropertyDecl()));
3836 DeclContext
*DC
= Importer
.ImportContext(D
->getDeclContext());
3840 // Import the lexical declaration context.
3841 DeclContext
*LexicalDC
= DC
;
3842 if (D
->getDeclContext() != D
->getLexicalDeclContext()) {
3843 LexicalDC
= Importer
.ImportContext(D
->getLexicalDeclContext());
3848 ObjCImplDecl
*InImpl
= dyn_cast
<ObjCImplDecl
>(LexicalDC
);
3852 // Import the ivar (for an @synthesize).
3853 ObjCIvarDecl
*Ivar
= nullptr;
3854 if (D
->getPropertyIvarDecl()) {
3855 Ivar
= cast_or_null
<ObjCIvarDecl
>(
3856 Importer
.Import(D
->getPropertyIvarDecl()));
3861 ObjCPropertyImplDecl
*ToImpl
3862 = InImpl
->FindPropertyImplDecl(Property
->getIdentifier());
3864 ToImpl
= ObjCPropertyImplDecl::Create(Importer
.getToContext(), DC
,
3865 Importer
.Import(D
->getLocStart()),
3866 Importer
.Import(D
->getLocation()),
3868 D
->getPropertyImplementation(),
3870 Importer
.Import(D
->getPropertyIvarDeclLoc()));
3871 ToImpl
->setLexicalDeclContext(LexicalDC
);
3872 Importer
.Imported(D
, ToImpl
);
3873 LexicalDC
->addDeclInternal(ToImpl
);
3875 // Check that we have the same kind of property implementation (@synthesize
3877 if (D
->getPropertyImplementation() != ToImpl
->getPropertyImplementation()) {
3878 Importer
.ToDiag(ToImpl
->getLocation(),
3879 diag::err_odr_objc_property_impl_kind_inconsistent
)
3880 << Property
->getDeclName()
3881 << (ToImpl
->getPropertyImplementation()
3882 == ObjCPropertyImplDecl::Dynamic
);
3883 Importer
.FromDiag(D
->getLocation(),
3884 diag::note_odr_objc_property_impl_kind
)
3885 << D
->getPropertyDecl()->getDeclName()
3886 << (D
->getPropertyImplementation() == ObjCPropertyImplDecl::Dynamic
);
3890 // For @synthesize, check that we have the same
3891 if (D
->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize
&&
3892 Ivar
!= ToImpl
->getPropertyIvarDecl()) {
3893 Importer
.ToDiag(ToImpl
->getPropertyIvarDeclLoc(),
3894 diag::err_odr_objc_synthesize_ivar_inconsistent
)
3895 << Property
->getDeclName()
3896 << ToImpl
->getPropertyIvarDecl()->getDeclName()
3897 << Ivar
->getDeclName();
3898 Importer
.FromDiag(D
->getPropertyIvarDeclLoc(),
3899 diag::note_odr_objc_synthesize_ivar_here
)
3900 << D
->getPropertyIvarDecl()->getDeclName();
3904 // Merge the existing implementation with the new implementation.
3905 Importer
.Imported(D
, ToImpl
);
3911 Decl
*ASTNodeImporter::VisitTemplateTypeParmDecl(TemplateTypeParmDecl
*D
) {
3912 // For template arguments, we adopt the translation unit as our declaration
3913 // context. This context will be fixed when the actual template declaration
3916 // FIXME: Import default argument.
3917 return TemplateTypeParmDecl::Create(Importer
.getToContext(),
3918 Importer
.getToContext().getTranslationUnitDecl(),
3919 Importer
.Import(D
->getLocStart()),
3920 Importer
.Import(D
->getLocation()),
3923 Importer
.Import(D
->getIdentifier()),
3924 D
->wasDeclaredWithTypename(),
3925 D
->isParameterPack());
3929 ASTNodeImporter::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl
*D
) {
3930 // Import the name of this declaration.
3931 DeclarationName Name
= Importer
.Import(D
->getDeclName());
3932 if (D
->getDeclName() && !Name
)
3935 // Import the location of this declaration.
3936 SourceLocation Loc
= Importer
.Import(D
->getLocation());
3938 // Import the type of this declaration.
3939 QualType T
= Importer
.Import(D
->getType());
3943 // Import type-source information.
3944 TypeSourceInfo
*TInfo
= Importer
.Import(D
->getTypeSourceInfo());
3945 if (D
->getTypeSourceInfo() && !TInfo
)
3948 // FIXME: Import default argument.
3950 return NonTypeTemplateParmDecl::Create(Importer
.getToContext(),
3951 Importer
.getToContext().getTranslationUnitDecl(),
3952 Importer
.Import(D
->getInnerLocStart()),
3953 Loc
, D
->getDepth(), D
->getPosition(),
3954 Name
.getAsIdentifierInfo(),
3955 T
, D
->isParameterPack(), TInfo
);
3959 ASTNodeImporter::VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl
*D
) {
3960 // Import the name of this declaration.
3961 DeclarationName Name
= Importer
.Import(D
->getDeclName());
3962 if (D
->getDeclName() && !Name
)
3965 // Import the location of this declaration.
3966 SourceLocation Loc
= Importer
.Import(D
->getLocation());
3968 // Import template parameters.
3969 TemplateParameterList
*TemplateParams
3970 = ImportTemplateParameterList(D
->getTemplateParameters());
3971 if (!TemplateParams
)
3974 // FIXME: Import default argument.
3976 return TemplateTemplateParmDecl::Create(Importer
.getToContext(),
3977 Importer
.getToContext().getTranslationUnitDecl(),
3978 Loc
, D
->getDepth(), D
->getPosition(),
3979 D
->isParameterPack(),
3980 Name
.getAsIdentifierInfo(),
3984 Decl
*ASTNodeImporter::VisitClassTemplateDecl(ClassTemplateDecl
*D
) {
3985 // If this record has a definition in the translation unit we're coming from,
3986 // but this particular declaration is not that definition, import the
3987 // definition and map to that.
3988 CXXRecordDecl
*Definition
3989 = cast_or_null
<CXXRecordDecl
>(D
->getTemplatedDecl()->getDefinition());
3990 if (Definition
&& Definition
!= D
->getTemplatedDecl()) {
3992 = Importer
.Import(Definition
->getDescribedClassTemplate());
3996 return Importer
.Imported(D
, ImportedDef
);
3999 // Import the major distinguishing characteristics of this class template.
4000 DeclContext
*DC
, *LexicalDC
;
4001 DeclarationName Name
;
4003 if (ImportDeclParts(D
, DC
, LexicalDC
, Name
, Loc
))
4006 // We may already have a template of the same name; try to find and match it.
4007 if (!DC
->isFunctionOrMethod()) {
4008 SmallVector
<NamedDecl
*, 4> ConflictingDecls
;
4009 SmallVector
<NamedDecl
*, 2> FoundDecls
;
4010 DC
->getRedeclContext()->localUncachedLookup(Name
, FoundDecls
);
4011 for (unsigned I
= 0, N
= FoundDecls
.size(); I
!= N
; ++I
) {
4012 if (!FoundDecls
[I
]->isInIdentifierNamespace(Decl::IDNS_Ordinary
))
4015 Decl
*Found
= FoundDecls
[I
];
4016 if (ClassTemplateDecl
*FoundTemplate
4017 = dyn_cast
<ClassTemplateDecl
>(Found
)) {
4018 if (IsStructuralMatch(D
, FoundTemplate
)) {
4019 // The class templates structurally match; call it the same template.
4020 // FIXME: We may be filling in a forward declaration here. Handle
4022 Importer
.Imported(D
->getTemplatedDecl(),
4023 FoundTemplate
->getTemplatedDecl());
4024 return Importer
.Imported(D
, FoundTemplate
);
4028 ConflictingDecls
.push_back(FoundDecls
[I
]);
4031 if (!ConflictingDecls
.empty()) {
4032 Name
= Importer
.HandleNameConflict(Name
, DC
, Decl::IDNS_Ordinary
,
4033 ConflictingDecls
.data(),
4034 ConflictingDecls
.size());
4041 CXXRecordDecl
*DTemplated
= D
->getTemplatedDecl();
4043 // Create the declaration that is being templated.
4044 SourceLocation StartLoc
= Importer
.Import(DTemplated
->getLocStart());
4045 SourceLocation IdLoc
= Importer
.Import(DTemplated
->getLocation());
4046 CXXRecordDecl
*D2Templated
= CXXRecordDecl::Create(Importer
.getToContext(),
4047 DTemplated
->getTagKind(),
4048 DC
, StartLoc
, IdLoc
,
4049 Name
.getAsIdentifierInfo());
4050 D2Templated
->setAccess(DTemplated
->getAccess());
4051 D2Templated
->setQualifierInfo(Importer
.Import(DTemplated
->getQualifierLoc()));
4052 D2Templated
->setLexicalDeclContext(LexicalDC
);
4054 // Create the class template declaration itself.
4055 TemplateParameterList
*TemplateParams
4056 = ImportTemplateParameterList(D
->getTemplateParameters());
4057 if (!TemplateParams
)
4060 ClassTemplateDecl
*D2
= ClassTemplateDecl::Create(Importer
.getToContext(), DC
,
4061 Loc
, Name
, TemplateParams
,
4063 /*PrevDecl=*/nullptr);
4064 D2Templated
->setDescribedClassTemplate(D2
);
4066 D2
->setAccess(D
->getAccess());
4067 D2
->setLexicalDeclContext(LexicalDC
);
4068 LexicalDC
->addDeclInternal(D2
);
4070 // Note the relationship between the class templates.
4071 Importer
.Imported(D
, D2
);
4072 Importer
.Imported(DTemplated
, D2Templated
);
4074 if (DTemplated
->isCompleteDefinition() &&
4075 !D2Templated
->isCompleteDefinition()) {
4076 // FIXME: Import definition!
4082 Decl
*ASTNodeImporter::VisitClassTemplateSpecializationDecl(
4083 ClassTemplateSpecializationDecl
*D
) {
4084 // If this record has a definition in the translation unit we're coming from,
4085 // but this particular declaration is not that definition, import the
4086 // definition and map to that.
4087 TagDecl
*Definition
= D
->getDefinition();
4088 if (Definition
&& Definition
!= D
) {
4089 Decl
*ImportedDef
= Importer
.Import(Definition
);
4093 return Importer
.Imported(D
, ImportedDef
);
4096 ClassTemplateDecl
*ClassTemplate
4097 = cast_or_null
<ClassTemplateDecl
>(Importer
.Import(
4098 D
->getSpecializedTemplate()));
4102 // Import the context of this declaration.
4103 DeclContext
*DC
= ClassTemplate
->getDeclContext();
4107 DeclContext
*LexicalDC
= DC
;
4108 if (D
->getDeclContext() != D
->getLexicalDeclContext()) {
4109 LexicalDC
= Importer
.ImportContext(D
->getLexicalDeclContext());
4114 // Import the location of this declaration.
4115 SourceLocation StartLoc
= Importer
.Import(D
->getLocStart());
4116 SourceLocation IdLoc
= Importer
.Import(D
->getLocation());
4118 // Import template arguments.
4119 SmallVector
<TemplateArgument
, 2> TemplateArgs
;
4120 if (ImportTemplateArguments(D
->getTemplateArgs().data(),
4121 D
->getTemplateArgs().size(),
4125 // Try to find an existing specialization with these template arguments.
4126 void *InsertPos
= nullptr;
4127 ClassTemplateSpecializationDecl
*D2
4128 = ClassTemplate
->findSpecialization(TemplateArgs
, InsertPos
);
4130 // We already have a class template specialization with these template
4133 // FIXME: Check for specialization vs. instantiation errors.
4135 if (RecordDecl
*FoundDef
= D2
->getDefinition()) {
4136 if (!D
->isCompleteDefinition() || IsStructuralMatch(D
, FoundDef
)) {
4137 // The record types structurally match, or the "from" translation
4138 // unit only had a forward declaration anyway; call it the same
4140 return Importer
.Imported(D
, FoundDef
);
4144 // Create a new specialization.
4145 D2
= ClassTemplateSpecializationDecl::Create(Importer
.getToContext(),
4146 D
->getTagKind(), DC
,
4149 TemplateArgs
.data(),
4150 TemplateArgs
.size(),
4151 /*PrevDecl=*/nullptr);
4152 D2
->setSpecializationKind(D
->getSpecializationKind());
4154 // Add this specialization to the class template.
4155 ClassTemplate
->AddSpecialization(D2
, InsertPos
);
4157 // Import the qualifier, if any.
4158 D2
->setQualifierInfo(Importer
.Import(D
->getQualifierLoc()));
4160 // Add the specialization to this context.
4161 D2
->setLexicalDeclContext(LexicalDC
);
4162 LexicalDC
->addDeclInternal(D2
);
4164 Importer
.Imported(D
, D2
);
4166 if (D
->isCompleteDefinition() && ImportDefinition(D
, D2
))
4172 Decl
*ASTNodeImporter::VisitVarTemplateDecl(VarTemplateDecl
*D
) {
4173 // If this variable has a definition in the translation unit we're coming
4175 // but this particular declaration is not that definition, import the
4176 // definition and map to that.
4177 VarDecl
*Definition
=
4178 cast_or_null
<VarDecl
>(D
->getTemplatedDecl()->getDefinition());
4179 if (Definition
&& Definition
!= D
->getTemplatedDecl()) {
4180 Decl
*ImportedDef
= Importer
.Import(Definition
->getDescribedVarTemplate());
4184 return Importer
.Imported(D
, ImportedDef
);
4187 // Import the major distinguishing characteristics of this variable template.
4188 DeclContext
*DC
, *LexicalDC
;
4189 DeclarationName Name
;
4191 if (ImportDeclParts(D
, DC
, LexicalDC
, Name
, Loc
))
4194 // We may already have a template of the same name; try to find and match it.
4195 assert(!DC
->isFunctionOrMethod() &&
4196 "Variable templates cannot be declared at function scope");
4197 SmallVector
<NamedDecl
*, 4> ConflictingDecls
;
4198 SmallVector
<NamedDecl
*, 2> FoundDecls
;
4199 DC
->getRedeclContext()->localUncachedLookup(Name
, FoundDecls
);
4200 for (unsigned I
= 0, N
= FoundDecls
.size(); I
!= N
; ++I
) {
4201 if (!FoundDecls
[I
]->isInIdentifierNamespace(Decl::IDNS_Ordinary
))
4204 Decl
*Found
= FoundDecls
[I
];
4205 if (VarTemplateDecl
*FoundTemplate
= dyn_cast
<VarTemplateDecl
>(Found
)) {
4206 if (IsStructuralMatch(D
, FoundTemplate
)) {
4207 // The variable templates structurally match; call it the same template.
4208 Importer
.Imported(D
->getTemplatedDecl(),
4209 FoundTemplate
->getTemplatedDecl());
4210 return Importer
.Imported(D
, FoundTemplate
);
4214 ConflictingDecls
.push_back(FoundDecls
[I
]);
4217 if (!ConflictingDecls
.empty()) {
4218 Name
= Importer
.HandleNameConflict(Name
, DC
, Decl::IDNS_Ordinary
,
4219 ConflictingDecls
.data(),
4220 ConflictingDecls
.size());
4226 VarDecl
*DTemplated
= D
->getTemplatedDecl();
4229 QualType T
= Importer
.Import(DTemplated
->getType());
4233 // Create the declaration that is being templated.
4234 SourceLocation StartLoc
= Importer
.Import(DTemplated
->getLocStart());
4235 SourceLocation IdLoc
= Importer
.Import(DTemplated
->getLocation());
4236 TypeSourceInfo
*TInfo
= Importer
.Import(DTemplated
->getTypeSourceInfo());
4237 VarDecl
*D2Templated
= VarDecl::Create(Importer
.getToContext(), DC
, StartLoc
,
4238 IdLoc
, Name
.getAsIdentifierInfo(), T
,
4239 TInfo
, DTemplated
->getStorageClass());
4240 D2Templated
->setAccess(DTemplated
->getAccess());
4241 D2Templated
->setQualifierInfo(Importer
.Import(DTemplated
->getQualifierLoc()));
4242 D2Templated
->setLexicalDeclContext(LexicalDC
);
4244 // Importer.Imported(DTemplated, D2Templated);
4245 // LexicalDC->addDeclInternal(D2Templated);
4247 // Merge the initializer.
4248 if (ImportDefinition(DTemplated
, D2Templated
))
4251 // Create the variable template declaration itself.
4252 TemplateParameterList
*TemplateParams
=
4253 ImportTemplateParameterList(D
->getTemplateParameters());
4254 if (!TemplateParams
)
4257 VarTemplateDecl
*D2
= VarTemplateDecl::Create(
4258 Importer
.getToContext(), DC
, Loc
, Name
, TemplateParams
, D2Templated
);
4259 D2Templated
->setDescribedVarTemplate(D2
);
4261 D2
->setAccess(D
->getAccess());
4262 D2
->setLexicalDeclContext(LexicalDC
);
4263 LexicalDC
->addDeclInternal(D2
);
4265 // Note the relationship between the variable templates.
4266 Importer
.Imported(D
, D2
);
4267 Importer
.Imported(DTemplated
, D2Templated
);
4269 if (DTemplated
->isThisDeclarationADefinition() &&
4270 !D2Templated
->isThisDeclarationADefinition()) {
4271 // FIXME: Import definition!
4277 Decl
*ASTNodeImporter::VisitVarTemplateSpecializationDecl(
4278 VarTemplateSpecializationDecl
*D
) {
4279 // If this record has a definition in the translation unit we're coming from,
4280 // but this particular declaration is not that definition, import the
4281 // definition and map to that.
4282 VarDecl
*Definition
= D
->getDefinition();
4283 if (Definition
&& Definition
!= D
) {
4284 Decl
*ImportedDef
= Importer
.Import(Definition
);
4288 return Importer
.Imported(D
, ImportedDef
);
4291 VarTemplateDecl
*VarTemplate
= cast_or_null
<VarTemplateDecl
>(
4292 Importer
.Import(D
->getSpecializedTemplate()));
4296 // Import the context of this declaration.
4297 DeclContext
*DC
= VarTemplate
->getDeclContext();
4301 DeclContext
*LexicalDC
= DC
;
4302 if (D
->getDeclContext() != D
->getLexicalDeclContext()) {
4303 LexicalDC
= Importer
.ImportContext(D
->getLexicalDeclContext());
4308 // Import the location of this declaration.
4309 SourceLocation StartLoc
= Importer
.Import(D
->getLocStart());
4310 SourceLocation IdLoc
= Importer
.Import(D
->getLocation());
4312 // Import template arguments.
4313 SmallVector
<TemplateArgument
, 2> TemplateArgs
;
4314 if (ImportTemplateArguments(D
->getTemplateArgs().data(),
4315 D
->getTemplateArgs().size(), TemplateArgs
))
4318 // Try to find an existing specialization with these template arguments.
4319 void *InsertPos
= nullptr;
4320 VarTemplateSpecializationDecl
*D2
= VarTemplate
->findSpecialization(
4321 TemplateArgs
, InsertPos
);
4323 // We already have a variable template specialization with these template
4326 // FIXME: Check for specialization vs. instantiation errors.
4328 if (VarDecl
*FoundDef
= D2
->getDefinition()) {
4329 if (!D
->isThisDeclarationADefinition() ||
4330 IsStructuralMatch(D
, FoundDef
)) {
4331 // The record types structurally match, or the "from" translation
4332 // unit only had a forward declaration anyway; call it the same
4334 return Importer
.Imported(D
, FoundDef
);
4340 QualType T
= Importer
.Import(D
->getType());
4343 TypeSourceInfo
*TInfo
= Importer
.Import(D
->getTypeSourceInfo());
4345 // Create a new specialization.
4346 D2
= VarTemplateSpecializationDecl::Create(
4347 Importer
.getToContext(), DC
, StartLoc
, IdLoc
, VarTemplate
, T
, TInfo
,
4348 D
->getStorageClass(), TemplateArgs
.data(), TemplateArgs
.size());
4349 D2
->setSpecializationKind(D
->getSpecializationKind());
4350 D2
->setTemplateArgsInfo(D
->getTemplateArgsInfo());
4352 // Add this specialization to the class template.
4353 VarTemplate
->AddSpecialization(D2
, InsertPos
);
4355 // Import the qualifier, if any.
4356 D2
->setQualifierInfo(Importer
.Import(D
->getQualifierLoc()));
4358 // Add the specialization to this context.
4359 D2
->setLexicalDeclContext(LexicalDC
);
4360 LexicalDC
->addDeclInternal(D2
);
4362 Importer
.Imported(D
, D2
);
4364 if (D
->isThisDeclarationADefinition() && ImportDefinition(D
, D2
))
4370 //----------------------------------------------------------------------------
4371 // Import Statements
4372 //----------------------------------------------------------------------------
4374 Stmt
*ASTNodeImporter::VisitStmt(Stmt
*S
) {
4375 Importer
.FromDiag(S
->getLocStart(), diag::err_unsupported_ast_node
)
4376 << S
->getStmtClassName();
4380 //----------------------------------------------------------------------------
4381 // Import Expressions
4382 //----------------------------------------------------------------------------
4383 Expr
*ASTNodeImporter::VisitExpr(Expr
*E
) {
4384 Importer
.FromDiag(E
->getLocStart(), diag::err_unsupported_ast_node
)
4385 << E
->getStmtClassName();
4389 Expr
*ASTNodeImporter::VisitDeclRefExpr(DeclRefExpr
*E
) {
4390 ValueDecl
*ToD
= cast_or_null
<ValueDecl
>(Importer
.Import(E
->getDecl()));
4394 NamedDecl
*FoundD
= nullptr;
4395 if (E
->getDecl() != E
->getFoundDecl()) {
4396 FoundD
= cast_or_null
<NamedDecl
>(Importer
.Import(E
->getFoundDecl()));
4401 QualType T
= Importer
.Import(E
->getType());
4405 DeclRefExpr
*DRE
= DeclRefExpr::Create(Importer
.getToContext(),
4406 Importer
.Import(E
->getQualifierLoc()),
4407 Importer
.Import(E
->getTemplateKeywordLoc()),
4409 E
->refersToEnclosingVariableOrCapture(),
4410 Importer
.Import(E
->getLocation()),
4411 T
, E
->getValueKind(),
4413 /*FIXME:TemplateArgs=*/nullptr);
4414 if (E
->hadMultipleCandidates())
4415 DRE
->setHadMultipleCandidates(true);
4419 Expr
*ASTNodeImporter::VisitIntegerLiteral(IntegerLiteral
*E
) {
4420 QualType T
= Importer
.Import(E
->getType());
4424 return IntegerLiteral::Create(Importer
.getToContext(),
4426 Importer
.Import(E
->getLocation()));
4429 Expr
*ASTNodeImporter::VisitCharacterLiteral(CharacterLiteral
*E
) {
4430 QualType T
= Importer
.Import(E
->getType());
4434 return new (Importer
.getToContext()) CharacterLiteral(E
->getValue(),
4436 Importer
.Import(E
->getLocation()));
4439 Expr
*ASTNodeImporter::VisitParenExpr(ParenExpr
*E
) {
4440 Expr
*SubExpr
= Importer
.Import(E
->getSubExpr());
4444 return new (Importer
.getToContext())
4445 ParenExpr(Importer
.Import(E
->getLParen()),
4446 Importer
.Import(E
->getRParen()),
4450 Expr
*ASTNodeImporter::VisitUnaryOperator(UnaryOperator
*E
) {
4451 QualType T
= Importer
.Import(E
->getType());
4455 Expr
*SubExpr
= Importer
.Import(E
->getSubExpr());
4459 return new (Importer
.getToContext()) UnaryOperator(SubExpr
, E
->getOpcode(),
4460 T
, E
->getValueKind(),
4462 Importer
.Import(E
->getOperatorLoc()));
4465 Expr
*ASTNodeImporter::VisitUnaryExprOrTypeTraitExpr(
4466 UnaryExprOrTypeTraitExpr
*E
) {
4467 QualType ResultType
= Importer
.Import(E
->getType());
4469 if (E
->isArgumentType()) {
4470 TypeSourceInfo
*TInfo
= Importer
.Import(E
->getArgumentTypeInfo());
4474 return new (Importer
.getToContext()) UnaryExprOrTypeTraitExpr(E
->getKind(),
4476 Importer
.Import(E
->getOperatorLoc()),
4477 Importer
.Import(E
->getRParenLoc()));
4480 Expr
*SubExpr
= Importer
.Import(E
->getArgumentExpr());
4484 return new (Importer
.getToContext()) UnaryExprOrTypeTraitExpr(E
->getKind(),
4485 SubExpr
, ResultType
,
4486 Importer
.Import(E
->getOperatorLoc()),
4487 Importer
.Import(E
->getRParenLoc()));
4490 Expr
*ASTNodeImporter::VisitBinaryOperator(BinaryOperator
*E
) {
4491 QualType T
= Importer
.Import(E
->getType());
4495 Expr
*LHS
= Importer
.Import(E
->getLHS());
4499 Expr
*RHS
= Importer
.Import(E
->getRHS());
4503 return new (Importer
.getToContext()) BinaryOperator(LHS
, RHS
, E
->getOpcode(),
4504 T
, E
->getValueKind(),
4506 Importer
.Import(E
->getOperatorLoc()),
4507 E
->isFPContractable());
4510 Expr
*ASTNodeImporter::VisitCompoundAssignOperator(CompoundAssignOperator
*E
) {
4511 QualType T
= Importer
.Import(E
->getType());
4515 QualType CompLHSType
= Importer
.Import(E
->getComputationLHSType());
4516 if (CompLHSType
.isNull())
4519 QualType CompResultType
= Importer
.Import(E
->getComputationResultType());
4520 if (CompResultType
.isNull())
4523 Expr
*LHS
= Importer
.Import(E
->getLHS());
4527 Expr
*RHS
= Importer
.Import(E
->getRHS());
4531 return new (Importer
.getToContext())
4532 CompoundAssignOperator(LHS
, RHS
, E
->getOpcode(),
4533 T
, E
->getValueKind(),
4535 CompLHSType
, CompResultType
,
4536 Importer
.Import(E
->getOperatorLoc()),
4537 E
->isFPContractable());
4540 static bool ImportCastPath(CastExpr
*E
, CXXCastPath
&Path
) {
4541 if (E
->path_empty()) return false;
4543 // TODO: import cast paths
4547 Expr
*ASTNodeImporter::VisitImplicitCastExpr(ImplicitCastExpr
*E
) {
4548 QualType T
= Importer
.Import(E
->getType());
4552 Expr
*SubExpr
= Importer
.Import(E
->getSubExpr());
4556 CXXCastPath BasePath
;
4557 if (ImportCastPath(E
, BasePath
))
4560 return ImplicitCastExpr::Create(Importer
.getToContext(), T
, E
->getCastKind(),
4561 SubExpr
, &BasePath
, E
->getValueKind());
4564 Expr
*ASTNodeImporter::VisitCStyleCastExpr(CStyleCastExpr
*E
) {
4565 QualType T
= Importer
.Import(E
->getType());
4569 Expr
*SubExpr
= Importer
.Import(E
->getSubExpr());
4573 TypeSourceInfo
*TInfo
= Importer
.Import(E
->getTypeInfoAsWritten());
4574 if (!TInfo
&& E
->getTypeInfoAsWritten())
4577 CXXCastPath BasePath
;
4578 if (ImportCastPath(E
, BasePath
))
4581 return CStyleCastExpr::Create(Importer
.getToContext(), T
,
4582 E
->getValueKind(), E
->getCastKind(),
4583 SubExpr
, &BasePath
, TInfo
,
4584 Importer
.Import(E
->getLParenLoc()),
4585 Importer
.Import(E
->getRParenLoc()));
4588 ASTImporter::ASTImporter(ASTContext
&ToContext
, FileManager
&ToFileManager
,
4589 ASTContext
&FromContext
, FileManager
&FromFileManager
,
4591 : ToContext(ToContext
), FromContext(FromContext
),
4592 ToFileManager(ToFileManager
), FromFileManager(FromFileManager
),
4593 Minimal(MinimalImport
), LastDiagFromFrom(false)
4595 ImportedDecls
[FromContext
.getTranslationUnitDecl()]
4596 = ToContext
.getTranslationUnitDecl();
4599 ASTImporter::~ASTImporter() { }
4601 QualType
ASTImporter::Import(QualType FromT
) {
4605 const Type
*fromTy
= FromT
.getTypePtr();
4607 // Check whether we've already imported this type.
4608 llvm::DenseMap
<const Type
*, const Type
*>::iterator Pos
4609 = ImportedTypes
.find(fromTy
);
4610 if (Pos
!= ImportedTypes
.end())
4611 return ToContext
.getQualifiedType(Pos
->second
, FromT
.getLocalQualifiers());
4614 ASTNodeImporter
Importer(*this);
4615 QualType ToT
= Importer
.Visit(fromTy
);
4619 // Record the imported type.
4620 ImportedTypes
[fromTy
] = ToT
.getTypePtr();
4622 return ToContext
.getQualifiedType(ToT
, FromT
.getLocalQualifiers());
4625 TypeSourceInfo
*ASTImporter::Import(TypeSourceInfo
*FromTSI
) {
4629 // FIXME: For now we just create a "trivial" type source info based
4630 // on the type and a single location. Implement a real version of this.
4631 QualType T
= Import(FromTSI
->getType());
4635 return ToContext
.getTrivialTypeSourceInfo(T
,
4636 FromTSI
->getTypeLoc().getLocStart());
4639 Decl
*ASTImporter::Import(Decl
*FromD
) {
4643 ASTNodeImporter
Importer(*this);
4645 // Check whether we've already imported this declaration.
4646 llvm::DenseMap
<Decl
*, Decl
*>::iterator Pos
= ImportedDecls
.find(FromD
);
4647 if (Pos
!= ImportedDecls
.end()) {
4648 Decl
*ToD
= Pos
->second
;
4649 Importer
.ImportDefinitionIfNeeded(FromD
, ToD
);
4654 Decl
*ToD
= Importer
.Visit(FromD
);
4658 // Record the imported declaration.
4659 ImportedDecls
[FromD
] = ToD
;
4661 if (TagDecl
*FromTag
= dyn_cast
<TagDecl
>(FromD
)) {
4662 // Keep track of anonymous tags that have an associated typedef.
4663 if (FromTag
->getTypedefNameForAnonDecl())
4664 AnonTagsWithPendingTypedefs
.push_back(FromTag
);
4665 } else if (TypedefNameDecl
*FromTypedef
= dyn_cast
<TypedefNameDecl
>(FromD
)) {
4666 // When we've finished transforming a typedef, see whether it was the
4667 // typedef for an anonymous tag.
4668 for (SmallVectorImpl
<TagDecl
*>::iterator
4669 FromTag
= AnonTagsWithPendingTypedefs
.begin(),
4670 FromTagEnd
= AnonTagsWithPendingTypedefs
.end();
4671 FromTag
!= FromTagEnd
; ++FromTag
) {
4672 if ((*FromTag
)->getTypedefNameForAnonDecl() == FromTypedef
) {
4673 if (TagDecl
*ToTag
= cast_or_null
<TagDecl
>(Import(*FromTag
))) {
4674 // We found the typedef for an anonymous tag; link them.
4675 ToTag
->setTypedefNameForAnonDecl(cast
<TypedefNameDecl
>(ToD
));
4676 AnonTagsWithPendingTypedefs
.erase(FromTag
);
4686 DeclContext
*ASTImporter::ImportContext(DeclContext
*FromDC
) {
4690 DeclContext
*ToDC
= cast_or_null
<DeclContext
>(Import(cast
<Decl
>(FromDC
)));
4694 // When we're using a record/enum/Objective-C class/protocol as a context, we
4695 // need it to have a definition.
4696 if (RecordDecl
*ToRecord
= dyn_cast
<RecordDecl
>(ToDC
)) {
4697 RecordDecl
*FromRecord
= cast
<RecordDecl
>(FromDC
);
4698 if (ToRecord
->isCompleteDefinition()) {
4700 } else if (FromRecord
->isCompleteDefinition()) {
4701 ASTNodeImporter(*this).ImportDefinition(FromRecord
, ToRecord
,
4702 ASTNodeImporter::IDK_Basic
);
4704 CompleteDecl(ToRecord
);
4706 } else if (EnumDecl
*ToEnum
= dyn_cast
<EnumDecl
>(ToDC
)) {
4707 EnumDecl
*FromEnum
= cast
<EnumDecl
>(FromDC
);
4708 if (ToEnum
->isCompleteDefinition()) {
4710 } else if (FromEnum
->isCompleteDefinition()) {
4711 ASTNodeImporter(*this).ImportDefinition(FromEnum
, ToEnum
,
4712 ASTNodeImporter::IDK_Basic
);
4714 CompleteDecl(ToEnum
);
4716 } else if (ObjCInterfaceDecl
*ToClass
= dyn_cast
<ObjCInterfaceDecl
>(ToDC
)) {
4717 ObjCInterfaceDecl
*FromClass
= cast
<ObjCInterfaceDecl
>(FromDC
);
4718 if (ToClass
->getDefinition()) {
4720 } else if (ObjCInterfaceDecl
*FromDef
= FromClass
->getDefinition()) {
4721 ASTNodeImporter(*this).ImportDefinition(FromDef
, ToClass
,
4722 ASTNodeImporter::IDK_Basic
);
4724 CompleteDecl(ToClass
);
4726 } else if (ObjCProtocolDecl
*ToProto
= dyn_cast
<ObjCProtocolDecl
>(ToDC
)) {
4727 ObjCProtocolDecl
*FromProto
= cast
<ObjCProtocolDecl
>(FromDC
);
4728 if (ToProto
->getDefinition()) {
4730 } else if (ObjCProtocolDecl
*FromDef
= FromProto
->getDefinition()) {
4731 ASTNodeImporter(*this).ImportDefinition(FromDef
, ToProto
,
4732 ASTNodeImporter::IDK_Basic
);
4734 CompleteDecl(ToProto
);
4741 Expr
*ASTImporter::Import(Expr
*FromE
) {
4745 return cast_or_null
<Expr
>(Import(cast
<Stmt
>(FromE
)));
4748 Stmt
*ASTImporter::Import(Stmt
*FromS
) {
4752 // Check whether we've already imported this declaration.
4753 llvm::DenseMap
<Stmt
*, Stmt
*>::iterator Pos
= ImportedStmts
.find(FromS
);
4754 if (Pos
!= ImportedStmts
.end())
4758 ASTNodeImporter
Importer(*this);
4759 Stmt
*ToS
= Importer
.Visit(FromS
);
4763 // Record the imported declaration.
4764 ImportedStmts
[FromS
] = ToS
;
4768 NestedNameSpecifier
*ASTImporter::Import(NestedNameSpecifier
*FromNNS
) {
4772 NestedNameSpecifier
*prefix
= Import(FromNNS
->getPrefix());
4774 switch (FromNNS
->getKind()) {
4775 case NestedNameSpecifier::Identifier
:
4776 if (IdentifierInfo
*II
= Import(FromNNS
->getAsIdentifier())) {
4777 return NestedNameSpecifier::Create(ToContext
, prefix
, II
);
4781 case NestedNameSpecifier::Namespace
:
4782 if (NamespaceDecl
*NS
=
4783 cast
<NamespaceDecl
>(Import(FromNNS
->getAsNamespace()))) {
4784 return NestedNameSpecifier::Create(ToContext
, prefix
, NS
);
4788 case NestedNameSpecifier::NamespaceAlias
:
4789 if (NamespaceAliasDecl
*NSAD
=
4790 cast
<NamespaceAliasDecl
>(Import(FromNNS
->getAsNamespaceAlias()))) {
4791 return NestedNameSpecifier::Create(ToContext
, prefix
, NSAD
);
4795 case NestedNameSpecifier::Global
:
4796 return NestedNameSpecifier::GlobalSpecifier(ToContext
);
4798 case NestedNameSpecifier::Super
:
4799 if (CXXRecordDecl
*RD
=
4800 cast
<CXXRecordDecl
>(Import(FromNNS
->getAsRecordDecl()))) {
4801 return NestedNameSpecifier::SuperSpecifier(ToContext
, RD
);
4805 case NestedNameSpecifier::TypeSpec
:
4806 case NestedNameSpecifier::TypeSpecWithTemplate
: {
4807 QualType T
= Import(QualType(FromNNS
->getAsType(), 0u));
4809 bool bTemplate
= FromNNS
->getKind() ==
4810 NestedNameSpecifier::TypeSpecWithTemplate
;
4811 return NestedNameSpecifier::Create(ToContext
, prefix
,
4812 bTemplate
, T
.getTypePtr());
4818 llvm_unreachable("Invalid nested name specifier kind");
4821 NestedNameSpecifierLoc
ASTImporter::Import(NestedNameSpecifierLoc FromNNS
) {
4822 // FIXME: Implement!
4823 return NestedNameSpecifierLoc();
4826 TemplateName
ASTImporter::Import(TemplateName From
) {
4827 switch (From
.getKind()) {
4828 case TemplateName::Template
:
4829 if (TemplateDecl
*ToTemplate
4830 = cast_or_null
<TemplateDecl
>(Import(From
.getAsTemplateDecl())))
4831 return TemplateName(ToTemplate
);
4833 return TemplateName();
4835 case TemplateName::OverloadedTemplate
: {
4836 OverloadedTemplateStorage
*FromStorage
= From
.getAsOverloadedTemplate();
4837 UnresolvedSet
<2> ToTemplates
;
4838 for (OverloadedTemplateStorage::iterator I
= FromStorage
->begin(),
4839 E
= FromStorage
->end();
4841 if (NamedDecl
*To
= cast_or_null
<NamedDecl
>(Import(*I
)))
4842 ToTemplates
.addDecl(To
);
4844 return TemplateName();
4846 return ToContext
.getOverloadedTemplateName(ToTemplates
.begin(),
4850 case TemplateName::QualifiedTemplate
: {
4851 QualifiedTemplateName
*QTN
= From
.getAsQualifiedTemplateName();
4852 NestedNameSpecifier
*Qualifier
= Import(QTN
->getQualifier());
4854 return TemplateName();
4856 if (TemplateDecl
*ToTemplate
4857 = cast_or_null
<TemplateDecl
>(Import(From
.getAsTemplateDecl())))
4858 return ToContext
.getQualifiedTemplateName(Qualifier
,
4859 QTN
->hasTemplateKeyword(),
4862 return TemplateName();
4865 case TemplateName::DependentTemplate
: {
4866 DependentTemplateName
*DTN
= From
.getAsDependentTemplateName();
4867 NestedNameSpecifier
*Qualifier
= Import(DTN
->getQualifier());
4869 return TemplateName();
4871 if (DTN
->isIdentifier()) {
4872 return ToContext
.getDependentTemplateName(Qualifier
,
4873 Import(DTN
->getIdentifier()));
4876 return ToContext
.getDependentTemplateName(Qualifier
, DTN
->getOperator());
4879 case TemplateName::SubstTemplateTemplateParm
: {
4880 SubstTemplateTemplateParmStorage
*subst
4881 = From
.getAsSubstTemplateTemplateParm();
4882 TemplateTemplateParmDecl
*param
4883 = cast_or_null
<TemplateTemplateParmDecl
>(Import(subst
->getParameter()));
4885 return TemplateName();
4887 TemplateName replacement
= Import(subst
->getReplacement());
4888 if (replacement
.isNull()) return TemplateName();
4890 return ToContext
.getSubstTemplateTemplateParm(param
, replacement
);
4893 case TemplateName::SubstTemplateTemplateParmPack
: {
4894 SubstTemplateTemplateParmPackStorage
*SubstPack
4895 = From
.getAsSubstTemplateTemplateParmPack();
4896 TemplateTemplateParmDecl
*Param
4897 = cast_or_null
<TemplateTemplateParmDecl
>(
4898 Import(SubstPack
->getParameterPack()));
4900 return TemplateName();
4902 ASTNodeImporter
Importer(*this);
4903 TemplateArgument ArgPack
4904 = Importer
.ImportTemplateArgument(SubstPack
->getArgumentPack());
4905 if (ArgPack
.isNull())
4906 return TemplateName();
4908 return ToContext
.getSubstTemplateTemplateParmPack(Param
, ArgPack
);
4912 llvm_unreachable("Invalid template name kind");
4915 SourceLocation
ASTImporter::Import(SourceLocation FromLoc
) {
4916 if (FromLoc
.isInvalid())
4917 return SourceLocation();
4919 SourceManager
&FromSM
= FromContext
.getSourceManager();
4921 // For now, map everything down to its spelling location, so that we
4922 // don't have to import macro expansions.
4923 // FIXME: Import macro expansions!
4924 FromLoc
= FromSM
.getSpellingLoc(FromLoc
);
4925 std::pair
<FileID
, unsigned> Decomposed
= FromSM
.getDecomposedLoc(FromLoc
);
4926 SourceManager
&ToSM
= ToContext
.getSourceManager();
4927 FileID ToFileID
= Import(Decomposed
.first
);
4928 if (ToFileID
.isInvalid())
4929 return SourceLocation();
4930 return ToSM
.getLocForStartOfFile(ToFileID
)
4931 .getLocWithOffset(Decomposed
.second
);
4934 SourceRange
ASTImporter::Import(SourceRange FromRange
) {
4935 return SourceRange(Import(FromRange
.getBegin()), Import(FromRange
.getEnd()));
4938 FileID
ASTImporter::Import(FileID FromID
) {
4939 llvm::DenseMap
<FileID
, FileID
>::iterator Pos
4940 = ImportedFileIDs
.find(FromID
);
4941 if (Pos
!= ImportedFileIDs
.end())
4944 SourceManager
&FromSM
= FromContext
.getSourceManager();
4945 SourceManager
&ToSM
= ToContext
.getSourceManager();
4946 const SrcMgr::SLocEntry
&FromSLoc
= FromSM
.getSLocEntry(FromID
);
4947 assert(FromSLoc
.isFile() && "Cannot handle macro expansions yet");
4949 // Include location of this file.
4950 SourceLocation ToIncludeLoc
= Import(FromSLoc
.getFile().getIncludeLoc());
4952 // Map the FileID for to the "to" source manager.
4954 const SrcMgr::ContentCache
*Cache
= FromSLoc
.getFile().getContentCache();
4955 if (Cache
->OrigEntry
) {
4956 // FIXME: We probably want to use getVirtualFile(), so we don't hit the
4958 // FIXME: We definitely want to re-use the existing MemoryBuffer, rather
4959 // than mmap the files several times.
4960 const FileEntry
*Entry
= ToFileManager
.getFile(Cache
->OrigEntry
->getName());
4963 ToID
= ToSM
.createFileID(Entry
, ToIncludeLoc
,
4964 FromSLoc
.getFile().getFileCharacteristic());
4966 // FIXME: We want to re-use the existing MemoryBuffer!
4967 const llvm::MemoryBuffer
*
4968 FromBuf
= Cache
->getBuffer(FromContext
.getDiagnostics(), FromSM
);
4969 std::unique_ptr
<llvm::MemoryBuffer
> ToBuf
4970 = llvm::MemoryBuffer::getMemBufferCopy(FromBuf
->getBuffer(),
4971 FromBuf
->getBufferIdentifier());
4972 ToID
= ToSM
.createFileID(std::move(ToBuf
),
4973 FromSLoc
.getFile().getFileCharacteristic());
4977 ImportedFileIDs
[FromID
] = ToID
;
4981 void ASTImporter::ImportDefinition(Decl
*From
) {
4982 Decl
*To
= Import(From
);
4986 if (DeclContext
*FromDC
= cast
<DeclContext
>(From
)) {
4987 ASTNodeImporter
Importer(*this);
4989 if (RecordDecl
*ToRecord
= dyn_cast
<RecordDecl
>(To
)) {
4990 if (!ToRecord
->getDefinition()) {
4991 Importer
.ImportDefinition(cast
<RecordDecl
>(FromDC
), ToRecord
,
4992 ASTNodeImporter::IDK_Everything
);
4997 if (EnumDecl
*ToEnum
= dyn_cast
<EnumDecl
>(To
)) {
4998 if (!ToEnum
->getDefinition()) {
4999 Importer
.ImportDefinition(cast
<EnumDecl
>(FromDC
), ToEnum
,
5000 ASTNodeImporter::IDK_Everything
);
5005 if (ObjCInterfaceDecl
*ToIFace
= dyn_cast
<ObjCInterfaceDecl
>(To
)) {
5006 if (!ToIFace
->getDefinition()) {
5007 Importer
.ImportDefinition(cast
<ObjCInterfaceDecl
>(FromDC
), ToIFace
,
5008 ASTNodeImporter::IDK_Everything
);
5013 if (ObjCProtocolDecl
*ToProto
= dyn_cast
<ObjCProtocolDecl
>(To
)) {
5014 if (!ToProto
->getDefinition()) {
5015 Importer
.ImportDefinition(cast
<ObjCProtocolDecl
>(FromDC
), ToProto
,
5016 ASTNodeImporter::IDK_Everything
);
5021 Importer
.ImportDeclContext(FromDC
, true);
5025 DeclarationName
ASTImporter::Import(DeclarationName FromName
) {
5027 return DeclarationName();
5029 switch (FromName
.getNameKind()) {
5030 case DeclarationName::Identifier
:
5031 return Import(FromName
.getAsIdentifierInfo());
5033 case DeclarationName::ObjCZeroArgSelector
:
5034 case DeclarationName::ObjCOneArgSelector
:
5035 case DeclarationName::ObjCMultiArgSelector
:
5036 return Import(FromName
.getObjCSelector());
5038 case DeclarationName::CXXConstructorName
: {
5039 QualType T
= Import(FromName
.getCXXNameType());
5041 return DeclarationName();
5043 return ToContext
.DeclarationNames
.getCXXConstructorName(
5044 ToContext
.getCanonicalType(T
));
5047 case DeclarationName::CXXDestructorName
: {
5048 QualType T
= Import(FromName
.getCXXNameType());
5050 return DeclarationName();
5052 return ToContext
.DeclarationNames
.getCXXDestructorName(
5053 ToContext
.getCanonicalType(T
));
5056 case DeclarationName::CXXConversionFunctionName
: {
5057 QualType T
= Import(FromName
.getCXXNameType());
5059 return DeclarationName();
5061 return ToContext
.DeclarationNames
.getCXXConversionFunctionName(
5062 ToContext
.getCanonicalType(T
));
5065 case DeclarationName::CXXOperatorName
:
5066 return ToContext
.DeclarationNames
.getCXXOperatorName(
5067 FromName
.getCXXOverloadedOperator());
5069 case DeclarationName::CXXLiteralOperatorName
:
5070 return ToContext
.DeclarationNames
.getCXXLiteralOperatorName(
5071 Import(FromName
.getCXXLiteralIdentifier()));
5073 case DeclarationName::CXXUsingDirective
:
5075 return DeclarationName::getUsingDirectiveName();
5078 llvm_unreachable("Invalid DeclarationName Kind!");
5081 IdentifierInfo
*ASTImporter::Import(const IdentifierInfo
*FromId
) {
5085 return &ToContext
.Idents
.get(FromId
->getName());
5088 Selector
ASTImporter::Import(Selector FromSel
) {
5089 if (FromSel
.isNull())
5092 SmallVector
<IdentifierInfo
*, 4> Idents
;
5093 Idents
.push_back(Import(FromSel
.getIdentifierInfoForSlot(0)));
5094 for (unsigned I
= 1, N
= FromSel
.getNumArgs(); I
< N
; ++I
)
5095 Idents
.push_back(Import(FromSel
.getIdentifierInfoForSlot(I
)));
5096 return ToContext
.Selectors
.getSelector(FromSel
.getNumArgs(), Idents
.data());
5099 DeclarationName
ASTImporter::HandleNameConflict(DeclarationName Name
,
5103 unsigned NumDecls
) {
5107 DiagnosticBuilder
ASTImporter::ToDiag(SourceLocation Loc
, unsigned DiagID
) {
5108 if (LastDiagFromFrom
)
5109 ToContext
.getDiagnostics().notePriorDiagnosticFrom(
5110 FromContext
.getDiagnostics());
5111 LastDiagFromFrom
= false;
5112 return ToContext
.getDiagnostics().Report(Loc
, DiagID
);
5115 DiagnosticBuilder
ASTImporter::FromDiag(SourceLocation Loc
, unsigned DiagID
) {
5116 if (!LastDiagFromFrom
)
5117 FromContext
.getDiagnostics().notePriorDiagnosticFrom(
5118 ToContext
.getDiagnostics());
5119 LastDiagFromFrom
= true;
5120 return FromContext
.getDiagnostics().Report(Loc
, DiagID
);
5123 void ASTImporter::CompleteDecl (Decl
*D
) {
5124 if (ObjCInterfaceDecl
*ID
= dyn_cast
<ObjCInterfaceDecl
>(D
)) {
5125 if (!ID
->getDefinition())
5126 ID
->startDefinition();
5128 else if (ObjCProtocolDecl
*PD
= dyn_cast
<ObjCProtocolDecl
>(D
)) {
5129 if (!PD
->getDefinition())
5130 PD
->startDefinition();
5132 else if (TagDecl
*TD
= dyn_cast
<TagDecl
>(D
)) {
5133 if (!TD
->getDefinition() && !TD
->isBeingDefined()) {
5134 TD
->startDefinition();
5135 TD
->setCompleteDefinition(true);
5139 assert (0 && "CompleteDecl called on a Decl that can't be completed");
5143 Decl
*ASTImporter::Imported(Decl
*From
, Decl
*To
) {
5144 ImportedDecls
[From
] = To
;
5148 bool ASTImporter::IsStructurallyEquivalent(QualType From
, QualType To
,
5150 llvm::DenseMap
<const Type
*, const Type
*>::iterator Pos
5151 = ImportedTypes
.find(From
.getTypePtr());
5152 if (Pos
!= ImportedTypes
.end() && ToContext
.hasSameType(Import(From
), To
))
5155 StructuralEquivalenceContext
Ctx(FromContext
, ToContext
, NonEquivalentDecls
,
5157 return Ctx
.IsStructurallyEquivalent(From
, To
);