1 //===--- ASTImporter.cpp - Importing ASTs from other Contexts ---*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file defines the ASTImporter class which imports AST nodes from one 11 // context into another context. 12 // 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" 25 #include <deque> 26 27 namespace clang { 28 class ASTNodeImporter : public TypeVisitor<ASTNodeImporter, QualType>, 29 public DeclVisitor<ASTNodeImporter, Decl *>, 30 public StmtVisitor<ASTNodeImporter, Stmt *> { 31 ASTImporter &Importer; 32 33 public: 34 explicit ASTNodeImporter(ASTImporter &Importer) : Importer(Importer) { } 35 36 using TypeVisitor<ASTNodeImporter, QualType>::Visit; 37 using DeclVisitor<ASTNodeImporter, Decl *>::Visit; 38 using StmtVisitor<ASTNodeImporter, Stmt *>::Visit; 39 40 // Importing types 41 QualType VisitType(const Type *T); 42 QualType VisitAtomicType(const AtomicType *T); 43 QualType VisitBuiltinType(const BuiltinType *T); 44 QualType VisitDecayedType(const DecayedType *T); 45 QualType VisitComplexType(const ComplexType *T); 46 QualType VisitPointerType(const PointerType *T); 47 QualType VisitBlockPointerType(const BlockPointerType *T); 48 QualType VisitLValueReferenceType(const LValueReferenceType *T); 49 QualType VisitRValueReferenceType(const RValueReferenceType *T); 50 QualType VisitMemberPointerType(const MemberPointerType *T); 51 QualType VisitConstantArrayType(const ConstantArrayType *T); 52 QualType VisitIncompleteArrayType(const IncompleteArrayType *T); 53 QualType VisitVariableArrayType(const VariableArrayType *T); 54 // FIXME: DependentSizedArrayType 55 // FIXME: DependentSizedExtVectorType 56 QualType VisitVectorType(const VectorType *T); 57 QualType VisitExtVectorType(const ExtVectorType *T); 58 QualType VisitFunctionNoProtoType(const FunctionNoProtoType *T); 59 QualType VisitFunctionProtoType(const FunctionProtoType *T); 60 // FIXME: UnresolvedUsingType 61 QualType VisitParenType(const ParenType *T); 62 QualType VisitTypedefType(const TypedefType *T); 63 QualType VisitTypeOfExprType(const TypeOfExprType *T); 64 // FIXME: DependentTypeOfExprType 65 QualType VisitTypeOfType(const TypeOfType *T); 66 QualType VisitDecltypeType(const DecltypeType *T); 67 QualType VisitUnaryTransformType(const UnaryTransformType *T); 68 QualType VisitAutoType(const AutoType *T); 69 QualType VisitInjectedClassNameType(const InjectedClassNameType *T); 70 // FIXME: DependentDecltypeType 71 QualType VisitRecordType(const RecordType *T); 72 QualType VisitEnumType(const EnumType *T); 73 QualType VisitAttributedType(const AttributedType *T); 74 QualType VisitTemplateTypeParmType(const TemplateTypeParmType *T); 75 QualType VisitSubstTemplateTypeParmType(const SubstTemplateTypeParmType *T); 76 QualType VisitTemplateSpecializationType(const TemplateSpecializationType *T); 77 QualType VisitElaboratedType(const ElaboratedType *T); 78 // FIXME: DependentNameType 79 // FIXME: DependentTemplateSpecializationType 80 QualType VisitObjCInterfaceType(const ObjCInterfaceType *T); 81 QualType VisitObjCObjectType(const ObjCObjectType *T); 82 QualType VisitObjCObjectPointerType(const ObjCObjectPointerType *T); 83 84 // Importing declarations 85 bool ImportDeclParts(NamedDecl *D, DeclContext *&DC, 86 DeclContext *&LexicalDC, DeclarationName &Name, 87 NamedDecl *&ToD, SourceLocation &Loc); 88 void ImportDefinitionIfNeeded(Decl *FromD, Decl *ToD = nullptr); 89 void ImportDeclarationNameLoc(const DeclarationNameInfo &From, 90 DeclarationNameInfo& To); 91 void ImportDeclContext(DeclContext *FromDC, bool ForceImport = false); 92 93 bool ImportCastPath(CastExpr *E, CXXCastPath &Path); 94 95 typedef DesignatedInitExpr::Designator Designator; 96 Designator ImportDesignator(const Designator &D); 97 98 99 /// \brief What we should import from the definition. 100 enum ImportDefinitionKind { 101 /// \brief Import the default subset of the definition, which might be 102 /// nothing (if minimal import is set) or might be everything (if minimal 103 /// import is not set). 104 IDK_Default, 105 /// \brief Import everything. 106 IDK_Everything, 107 /// \brief Import only the bare bones needed to establish a valid 108 /// DeclContext. 109 IDK_Basic 110 }; 111 112 bool shouldForceImportDeclContext(ImportDefinitionKind IDK) { 113 return IDK == IDK_Everything || 114 (IDK == IDK_Default && !Importer.isMinimalImport()); 115 } 116 117 bool ImportDefinition(RecordDecl *From, RecordDecl *To, 118 ImportDefinitionKind Kind = IDK_Default); 119 bool ImportDefinition(VarDecl *From, VarDecl *To, 120 ImportDefinitionKind Kind = IDK_Default); 121 bool ImportDefinition(EnumDecl *From, EnumDecl *To, 122 ImportDefinitionKind Kind = IDK_Default); 123 bool ImportDefinition(ObjCInterfaceDecl *From, ObjCInterfaceDecl *To, 124 ImportDefinitionKind Kind = IDK_Default); 125 bool ImportDefinition(ObjCProtocolDecl *From, ObjCProtocolDecl *To, 126 ImportDefinitionKind Kind = IDK_Default); 127 TemplateParameterList *ImportTemplateParameterList( 128 TemplateParameterList *Params); 129 TemplateArgument ImportTemplateArgument(const TemplateArgument &From); 130 TemplateArgumentLoc ImportTemplateArgumentLoc( 131 const TemplateArgumentLoc &TALoc, bool &Error); 132 bool ImportTemplateArguments(const TemplateArgument *FromArgs, 133 unsigned NumFromArgs, 134 SmallVectorImpl<TemplateArgument> &ToArgs); 135 bool IsStructuralMatch(RecordDecl *FromRecord, RecordDecl *ToRecord, 136 bool Complain = true); 137 bool IsStructuralMatch(VarDecl *FromVar, VarDecl *ToVar, 138 bool Complain = true); 139 bool IsStructuralMatch(EnumDecl *FromEnum, EnumDecl *ToRecord); 140 bool IsStructuralMatch(EnumConstantDecl *FromEC, EnumConstantDecl *ToEC); 141 bool IsStructuralMatch(ClassTemplateDecl *From, ClassTemplateDecl *To); 142 bool IsStructuralMatch(VarTemplateDecl *From, VarTemplateDecl *To); 143 Decl *VisitDecl(Decl *D); 144 Decl *VisitAccessSpecDecl(AccessSpecDecl *D); 145 Decl *VisitStaticAssertDecl(StaticAssertDecl *D); 146 Decl *VisitTranslationUnitDecl(TranslationUnitDecl *D); 147 Decl *VisitNamespaceDecl(NamespaceDecl *D); 148 Decl *VisitTypedefNameDecl(TypedefNameDecl *D, bool IsAlias); 149 Decl *VisitTypedefDecl(TypedefDecl *D); 150 Decl *VisitTypeAliasDecl(TypeAliasDecl *D); 151 Decl *VisitLabelDecl(LabelDecl *D); 152 Decl *VisitEnumDecl(EnumDecl *D); 153 Decl *VisitRecordDecl(RecordDecl *D); 154 Decl *VisitEnumConstantDecl(EnumConstantDecl *D); 155 Decl *VisitFunctionDecl(FunctionDecl *D); 156 Decl *VisitCXXMethodDecl(CXXMethodDecl *D); 157 Decl *VisitCXXConstructorDecl(CXXConstructorDecl *D); 158 Decl *VisitCXXDestructorDecl(CXXDestructorDecl *D); 159 Decl *VisitCXXConversionDecl(CXXConversionDecl *D); 160 Decl *VisitFieldDecl(FieldDecl *D); 161 Decl *VisitIndirectFieldDecl(IndirectFieldDecl *D); 162 Decl *VisitFriendDecl(FriendDecl *D); 163 Decl *VisitObjCIvarDecl(ObjCIvarDecl *D); 164 Decl *VisitVarDecl(VarDecl *D); 165 Decl *VisitImplicitParamDecl(ImplicitParamDecl *D); 166 Decl *VisitParmVarDecl(ParmVarDecl *D); 167 Decl *VisitObjCMethodDecl(ObjCMethodDecl *D); 168 Decl *VisitObjCTypeParamDecl(ObjCTypeParamDecl *D); 169 Decl *VisitObjCCategoryDecl(ObjCCategoryDecl *D); 170 Decl *VisitObjCProtocolDecl(ObjCProtocolDecl *D); 171 Decl *VisitLinkageSpecDecl(LinkageSpecDecl *D); 172 173 ObjCTypeParamList *ImportObjCTypeParamList(ObjCTypeParamList *list); 174 Decl *VisitObjCInterfaceDecl(ObjCInterfaceDecl *D); 175 Decl *VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D); 176 Decl *VisitObjCImplementationDecl(ObjCImplementationDecl *D); 177 Decl *VisitObjCPropertyDecl(ObjCPropertyDecl *D); 178 Decl *VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D); 179 Decl *VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D); 180 Decl *VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D); 181 Decl *VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D); 182 Decl *VisitClassTemplateDecl(ClassTemplateDecl *D); 183 Decl *VisitClassTemplateSpecializationDecl( 184 ClassTemplateSpecializationDecl *D); 185 Decl *VisitVarTemplateDecl(VarTemplateDecl *D); 186 Decl *VisitVarTemplateSpecializationDecl(VarTemplateSpecializationDecl *D); 187 188 // Importing statements 189 DeclGroupRef ImportDeclGroup(DeclGroupRef DG); 190 191 Stmt *VisitStmt(Stmt *S); 192 Stmt *VisitGCCAsmStmt(GCCAsmStmt *S); 193 Stmt *VisitDeclStmt(DeclStmt *S); 194 Stmt *VisitNullStmt(NullStmt *S); 195 Stmt *VisitCompoundStmt(CompoundStmt *S); 196 Stmt *VisitCaseStmt(CaseStmt *S); 197 Stmt *VisitDefaultStmt(DefaultStmt *S); 198 Stmt *VisitLabelStmt(LabelStmt *S); 199 Stmt *VisitAttributedStmt(AttributedStmt *S); 200 Stmt *VisitIfStmt(IfStmt *S); 201 Stmt *VisitSwitchStmt(SwitchStmt *S); 202 Stmt *VisitWhileStmt(WhileStmt *S); 203 Stmt *VisitDoStmt(DoStmt *S); 204 Stmt *VisitForStmt(ForStmt *S); 205 Stmt *VisitGotoStmt(GotoStmt *S); 206 Stmt *VisitIndirectGotoStmt(IndirectGotoStmt *S); 207 Stmt *VisitContinueStmt(ContinueStmt *S); 208 Stmt *VisitBreakStmt(BreakStmt *S); 209 Stmt *VisitReturnStmt(ReturnStmt *S); 210 // FIXME: MSAsmStmt 211 // FIXME: SEHExceptStmt 212 // FIXME: SEHFinallyStmt 213 // FIXME: SEHTryStmt 214 // FIXME: SEHLeaveStmt 215 // FIXME: CapturedStmt 216 Stmt *VisitCXXCatchStmt(CXXCatchStmt *S); 217 Stmt *VisitCXXTryStmt(CXXTryStmt *S); 218 Stmt *VisitCXXForRangeStmt(CXXForRangeStmt *S); 219 // FIXME: MSDependentExistsStmt 220 Stmt *VisitObjCForCollectionStmt(ObjCForCollectionStmt *S); 221 Stmt *VisitObjCAtCatchStmt(ObjCAtCatchStmt *S); 222 Stmt *VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S); 223 Stmt *VisitObjCAtTryStmt(ObjCAtTryStmt *S); 224 Stmt *VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *S); 225 Stmt *VisitObjCAtThrowStmt(ObjCAtThrowStmt *S); 226 Stmt *VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt *S); 227 228 // Importing expressions 229 Expr *VisitExpr(Expr *E); 230 Expr *VisitVAArgExpr(VAArgExpr *E); 231 Expr *VisitGNUNullExpr(GNUNullExpr *E); 232 Expr *VisitPredefinedExpr(PredefinedExpr *E); 233 Expr *VisitDeclRefExpr(DeclRefExpr *E); 234 Expr *VisitImplicitValueInitExpr(ImplicitValueInitExpr *ILE); 235 Expr *VisitDesignatedInitExpr(DesignatedInitExpr *E); 236 Expr *VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E); 237 Expr *VisitIntegerLiteral(IntegerLiteral *E); 238 Expr *VisitFloatingLiteral(FloatingLiteral *E); 239 Expr *VisitCharacterLiteral(CharacterLiteral *E); 240 Expr *VisitStringLiteral(StringLiteral *E); 241 Expr *VisitCompoundLiteralExpr(CompoundLiteralExpr *E); 242 Expr *VisitAtomicExpr(AtomicExpr *E); 243 Expr *VisitAddrLabelExpr(AddrLabelExpr *E); 244 Expr *VisitParenExpr(ParenExpr *E); 245 Expr *VisitParenListExpr(ParenListExpr *E); 246 Expr *VisitStmtExpr(StmtExpr *E); 247 Expr *VisitUnaryOperator(UnaryOperator *E); 248 Expr *VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E); 249 Expr *VisitBinaryOperator(BinaryOperator *E); 250 Expr *VisitConditionalOperator(ConditionalOperator *E); 251 Expr *VisitBinaryConditionalOperator(BinaryConditionalOperator *E); 252 Expr *VisitOpaqueValueExpr(OpaqueValueExpr *E); 253 Expr *VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E); 254 Expr *VisitExpressionTraitExpr(ExpressionTraitExpr *E); 255 Expr *VisitArraySubscriptExpr(ArraySubscriptExpr *E); 256 Expr *VisitCompoundAssignOperator(CompoundAssignOperator *E); 257 Expr *VisitImplicitCastExpr(ImplicitCastExpr *E); 258 Expr *VisitExplicitCastExpr(ExplicitCastExpr *E); 259 Expr *VisitOffsetOfExpr(OffsetOfExpr *OE); 260 Expr *VisitCXXThrowExpr(CXXThrowExpr *E); 261 Expr *VisitCXXNoexceptExpr(CXXNoexceptExpr *E); 262 Expr *VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E); 263 Expr *VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E); 264 Expr *VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E); 265 Expr *VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *CE); 266 Expr *VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *E); 267 Expr *VisitCXXNewExpr(CXXNewExpr *CE); 268 Expr *VisitCXXDeleteExpr(CXXDeleteExpr *E); 269 Expr *VisitCXXConstructExpr(CXXConstructExpr *E); 270 Expr *VisitCXXMemberCallExpr(CXXMemberCallExpr *E); 271 Expr *VisitExprWithCleanups(ExprWithCleanups *EWC); 272 Expr *VisitCXXThisExpr(CXXThisExpr *E); 273 Expr *VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E); 274 Expr *VisitMemberExpr(MemberExpr *E); 275 Expr *VisitCallExpr(CallExpr *E); 276 Expr *VisitInitListExpr(InitListExpr *E); 277 Expr *VisitArrayInitLoopExpr(ArrayInitLoopExpr *E); 278 Expr *VisitArrayInitIndexExpr(ArrayInitIndexExpr *E); 279 Expr *VisitCXXDefaultInitExpr(CXXDefaultInitExpr *E); 280 Expr *VisitCXXNamedCastExpr(CXXNamedCastExpr *E); 281 Expr *VisitSubstNonTypeTemplateParmExpr(SubstNonTypeTemplateParmExpr *E); 282 283 284 template<typename IIter, typename OIter> 285 void ImportArray(IIter Ibegin, IIter Iend, OIter Obegin) { 286 typedef typename std::remove_reference<decltype(*Obegin)>::type ItemT; 287 ASTImporter &ImporterRef = Importer; 288 std::transform(Ibegin, Iend, Obegin, 289 [&ImporterRef](ItemT From) -> ItemT { 290 return ImporterRef.Import(From); 291 }); 292 } 293 294 template<typename IIter, typename OIter> 295 bool ImportArrayChecked(IIter Ibegin, IIter Iend, OIter Obegin) { 296 typedef typename std::remove_reference<decltype(**Obegin)>::type ItemT; 297 ASTImporter &ImporterRef = Importer; 298 bool Failed = false; 299 std::transform(Ibegin, Iend, Obegin, 300 [&ImporterRef, &Failed](ItemT *From) -> ItemT * { 301 ItemT *To = cast_or_null<ItemT>( 302 ImporterRef.Import(From)); 303 if (!To && From) 304 Failed = true; 305 return To; 306 }); 307 return Failed; 308 } 309 310 template<typename InContainerTy, typename OutContainerTy> 311 bool ImportContainerChecked(const InContainerTy &InContainer, 312 OutContainerTy &OutContainer) { 313 return ImportArrayChecked(InContainer.begin(), InContainer.end(), 314 OutContainer.begin()); 315 } 316 317 template<typename InContainerTy, typename OIter> 318 bool ImportArrayChecked(const InContainerTy &InContainer, OIter Obegin) { 319 return ImportArrayChecked(InContainer.begin(), InContainer.end(), Obegin); 320 } 321 }; 322 } 323 324 using namespace clang; 325 326 //---------------------------------------------------------------------------- 327 // Structural Equivalence 328 //---------------------------------------------------------------------------- 329 330 namespace { 331 struct StructuralEquivalenceContext { 332 /// \brief AST contexts for which we are checking structural equivalence. 333 ASTContext &C1, &C2; 334 335 /// \brief The set of "tentative" equivalences between two canonical 336 /// declarations, mapping from a declaration in the first context to the 337 /// declaration in the second context that we believe to be equivalent. 338 llvm::DenseMap<Decl *, Decl *> TentativeEquivalences; 339 340 /// \brief Queue of declarations in the first context whose equivalence 341 /// with a declaration in the second context still needs to be verified. 342 std::deque<Decl *> DeclsToCheck; 343 344 /// \brief Declaration (from, to) pairs that are known not to be equivalent 345 /// (which we have already complained about). 346 llvm::DenseSet<std::pair<Decl *, Decl *> > &NonEquivalentDecls; 347 348 /// \brief Whether we're being strict about the spelling of types when 349 /// unifying two types. 350 bool StrictTypeSpelling; 351 352 /// \brief Whether to complain about failures. 353 bool Complain; 354 355 /// \brief \c true if the last diagnostic came from C2. 356 bool LastDiagFromC2; 357 358 StructuralEquivalenceContext(ASTContext &C1, ASTContext &C2, 359 llvm::DenseSet<std::pair<Decl *, Decl *> > &NonEquivalentDecls, 360 bool StrictTypeSpelling = false, 361 bool Complain = true) 362 : C1(C1), C2(C2), NonEquivalentDecls(NonEquivalentDecls), 363 StrictTypeSpelling(StrictTypeSpelling), Complain(Complain), 364 LastDiagFromC2(false) {} 365 366 /// \brief Determine whether the two declarations are structurally 367 /// equivalent. 368 bool IsStructurallyEquivalent(Decl *D1, Decl *D2); 369 370 /// \brief Determine whether the two types are structurally equivalent. 371 bool IsStructurallyEquivalent(QualType T1, QualType T2); 372 373 private: 374 /// \brief Finish checking all of the structural equivalences. 375 /// 376 /// \returns true if an error occurred, false otherwise. 377 bool Finish(); 378 379 public: 380 DiagnosticBuilder Diag1(SourceLocation Loc, unsigned DiagID) { 381 assert(Complain && "Not allowed to complain"); 382 if (LastDiagFromC2) 383 C1.getDiagnostics().notePriorDiagnosticFrom(C2.getDiagnostics()); 384 LastDiagFromC2 = false; 385 return C1.getDiagnostics().Report(Loc, DiagID); 386 } 387 388 DiagnosticBuilder Diag2(SourceLocation Loc, unsigned DiagID) { 389 assert(Complain && "Not allowed to complain"); 390 if (!LastDiagFromC2) 391 C2.getDiagnostics().notePriorDiagnosticFrom(C1.getDiagnostics()); 392 LastDiagFromC2 = true; 393 return C2.getDiagnostics().Report(Loc, DiagID); 394 } 395 }; 396 } 397 398 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 399 QualType T1, QualType T2); 400 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 401 Decl *D1, Decl *D2); 402 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 403 const TemplateArgument &Arg1, 404 const TemplateArgument &Arg2); 405 406 /// \brief Determine structural equivalence of two expressions. 407 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 408 Expr *E1, Expr *E2) { 409 if (!E1 || !E2) 410 return E1 == E2; 411 412 // FIXME: Actually perform a structural comparison! 413 return true; 414 } 415 416 /// \brief Determine whether two identifiers are equivalent. 417 static bool IsStructurallyEquivalent(const IdentifierInfo *Name1, 418 const IdentifierInfo *Name2) { 419 if (!Name1 || !Name2) 420 return Name1 == Name2; 421 422 return Name1->getName() == Name2->getName(); 423 } 424 425 /// \brief Determine whether two nested-name-specifiers are equivalent. 426 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 427 NestedNameSpecifier *NNS1, 428 NestedNameSpecifier *NNS2) { 429 if (NNS1->getKind() != NNS2->getKind()) 430 return false; 431 432 NestedNameSpecifier *Prefix1 = NNS1->getPrefix(), 433 *Prefix2 = NNS2->getPrefix(); 434 if ((bool)Prefix1 != (bool)Prefix2) 435 return false; 436 437 if (Prefix1) 438 if (!IsStructurallyEquivalent(Context, Prefix1, Prefix2)) 439 return false; 440 441 switch (NNS1->getKind()) { 442 case NestedNameSpecifier::Identifier: 443 return IsStructurallyEquivalent(NNS1->getAsIdentifier(), 444 NNS2->getAsIdentifier()); 445 case NestedNameSpecifier::Namespace: 446 return IsStructurallyEquivalent(Context, NNS1->getAsNamespace(), 447 NNS2->getAsNamespace()); 448 case NestedNameSpecifier::NamespaceAlias: 449 return IsStructurallyEquivalent(Context, NNS1->getAsNamespaceAlias(), 450 NNS2->getAsNamespaceAlias()); 451 case NestedNameSpecifier::TypeSpec: 452 case NestedNameSpecifier::TypeSpecWithTemplate: 453 return IsStructurallyEquivalent(Context, QualType(NNS1->getAsType(), 0), 454 QualType(NNS2->getAsType(), 0)); 455 case NestedNameSpecifier::Global: 456 return true; 457 case NestedNameSpecifier::Super: 458 return IsStructurallyEquivalent(Context, NNS1->getAsRecordDecl(), 459 NNS2->getAsRecordDecl()); 460 } 461 return false; 462 } 463 464 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 465 const TemplateName &N1, 466 const TemplateName &N2) { 467 if (N1.getKind() != N2.getKind()) 468 return false; 469 switch (N1.getKind()) { 470 case TemplateName::Template: 471 return IsStructurallyEquivalent(Context, N1.getAsTemplateDecl(), 472 N2.getAsTemplateDecl()); 473 474 case TemplateName::OverloadedTemplate: { 475 OverloadedTemplateStorage *OS1 = N1.getAsOverloadedTemplate(), 476 *OS2 = N2.getAsOverloadedTemplate(); 477 OverloadedTemplateStorage::iterator I1 = OS1->begin(), I2 = OS2->begin(), 478 E1 = OS1->end(), E2 = OS2->end(); 479 for (; I1 != E1 && I2 != E2; ++I1, ++I2) 480 if (!IsStructurallyEquivalent(Context, *I1, *I2)) 481 return false; 482 return I1 == E1 && I2 == E2; 483 } 484 485 case TemplateName::QualifiedTemplate: { 486 QualifiedTemplateName *QN1 = N1.getAsQualifiedTemplateName(), 487 *QN2 = N2.getAsQualifiedTemplateName(); 488 return IsStructurallyEquivalent(Context, QN1->getDecl(), QN2->getDecl()) && 489 IsStructurallyEquivalent(Context, QN1->getQualifier(), 490 QN2->getQualifier()); 491 } 492 493 case TemplateName::DependentTemplate: { 494 DependentTemplateName *DN1 = N1.getAsDependentTemplateName(), 495 *DN2 = N2.getAsDependentTemplateName(); 496 if (!IsStructurallyEquivalent(Context, DN1->getQualifier(), 497 DN2->getQualifier())) 498 return false; 499 if (DN1->isIdentifier() && DN2->isIdentifier()) 500 return IsStructurallyEquivalent(DN1->getIdentifier(), 501 DN2->getIdentifier()); 502 else if (DN1->isOverloadedOperator() && DN2->isOverloadedOperator()) 503 return DN1->getOperator() == DN2->getOperator(); 504 return false; 505 } 506 507 case TemplateName::SubstTemplateTemplateParm: { 508 SubstTemplateTemplateParmStorage *TS1 = N1.getAsSubstTemplateTemplateParm(), 509 *TS2 = N2.getAsSubstTemplateTemplateParm(); 510 return IsStructurallyEquivalent(Context, TS1->getParameter(), 511 TS2->getParameter()) && 512 IsStructurallyEquivalent(Context, TS1->getReplacement(), 513 TS2->getReplacement()); 514 } 515 case TemplateName::SubstTemplateTemplateParmPack: { 516 SubstTemplateTemplateParmPackStorage 517 *P1 = N1.getAsSubstTemplateTemplateParmPack(), 518 *P2 = N2.getAsSubstTemplateTemplateParmPack(); 519 return IsStructurallyEquivalent(Context, P1->getArgumentPack(), 520 P2->getArgumentPack()) && 521 IsStructurallyEquivalent(Context, P1->getParameterPack(), 522 P2->getParameterPack()); 523 } 524 } 525 return false; 526 } 527 528 /// \brief Determine whether two template arguments are equivalent. 529 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 530 const TemplateArgument &Arg1, 531 const TemplateArgument &Arg2) { 532 if (Arg1.getKind() != Arg2.getKind()) 533 return false; 534 535 switch (Arg1.getKind()) { 536 case TemplateArgument::Null: 537 return true; 538 539 case TemplateArgument::Type: 540 return Context.IsStructurallyEquivalent(Arg1.getAsType(), Arg2.getAsType()); 541 542 case TemplateArgument::Integral: 543 if (!Context.IsStructurallyEquivalent(Arg1.getIntegralType(), 544 Arg2.getIntegralType())) 545 return false; 546 547 return llvm::APSInt::isSameValue(Arg1.getAsIntegral(), Arg2.getAsIntegral()); 548 549 case TemplateArgument::Declaration: 550 return Context.IsStructurallyEquivalent(Arg1.getAsDecl(), Arg2.getAsDecl()); 551 552 case TemplateArgument::NullPtr: 553 return true; // FIXME: Is this correct? 554 555 case TemplateArgument::Template: 556 return IsStructurallyEquivalent(Context, 557 Arg1.getAsTemplate(), 558 Arg2.getAsTemplate()); 559 560 case TemplateArgument::TemplateExpansion: 561 return IsStructurallyEquivalent(Context, 562 Arg1.getAsTemplateOrTemplatePattern(), 563 Arg2.getAsTemplateOrTemplatePattern()); 564 565 case TemplateArgument::Expression: 566 return IsStructurallyEquivalent(Context, 567 Arg1.getAsExpr(), Arg2.getAsExpr()); 568 569 case TemplateArgument::Pack: 570 if (Arg1.pack_size() != Arg2.pack_size()) 571 return false; 572 573 for (unsigned I = 0, N = Arg1.pack_size(); I != N; ++I) 574 if (!IsStructurallyEquivalent(Context, 575 Arg1.pack_begin()[I], 576 Arg2.pack_begin()[I])) 577 return false; 578 579 return true; 580 } 581 582 llvm_unreachable("Invalid template argument kind"); 583 } 584 585 /// \brief Determine structural equivalence for the common part of array 586 /// types. 587 static bool IsArrayStructurallyEquivalent(StructuralEquivalenceContext &Context, 588 const ArrayType *Array1, 589 const ArrayType *Array2) { 590 if (!IsStructurallyEquivalent(Context, 591 Array1->getElementType(), 592 Array2->getElementType())) 593 return false; 594 if (Array1->getSizeModifier() != Array2->getSizeModifier()) 595 return false; 596 if (Array1->getIndexTypeQualifiers() != Array2->getIndexTypeQualifiers()) 597 return false; 598 599 return true; 600 } 601 602 /// \brief Determine structural equivalence of two types. 603 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 604 QualType T1, QualType T2) { 605 if (T1.isNull() || T2.isNull()) 606 return T1.isNull() && T2.isNull(); 607 608 if (!Context.StrictTypeSpelling) { 609 // We aren't being strict about token-to-token equivalence of types, 610 // so map down to the canonical type. 611 T1 = Context.C1.getCanonicalType(T1); 612 T2 = Context.C2.getCanonicalType(T2); 613 } 614 615 if (T1.getQualifiers() != T2.getQualifiers()) 616 return false; 617 618 Type::TypeClass TC = T1->getTypeClass(); 619 620 if (T1->getTypeClass() != T2->getTypeClass()) { 621 // Compare function types with prototypes vs. without prototypes as if 622 // both did not have prototypes. 623 if (T1->getTypeClass() == Type::FunctionProto && 624 T2->getTypeClass() == Type::FunctionNoProto) 625 TC = Type::FunctionNoProto; 626 else if (T1->getTypeClass() == Type::FunctionNoProto && 627 T2->getTypeClass() == Type::FunctionProto) 628 TC = Type::FunctionNoProto; 629 else 630 return false; 631 } 632 633 switch (TC) { 634 case Type::Builtin: 635 // FIXME: Deal with Char_S/Char_U. 636 if (cast<BuiltinType>(T1)->getKind() != cast<BuiltinType>(T2)->getKind()) 637 return false; 638 break; 639 640 case Type::Complex: 641 if (!IsStructurallyEquivalent(Context, 642 cast<ComplexType>(T1)->getElementType(), 643 cast<ComplexType>(T2)->getElementType())) 644 return false; 645 break; 646 647 case Type::Adjusted: 648 case Type::Decayed: 649 if (!IsStructurallyEquivalent(Context, 650 cast<AdjustedType>(T1)->getOriginalType(), 651 cast<AdjustedType>(T2)->getOriginalType())) 652 return false; 653 break; 654 655 case Type::Pointer: 656 if (!IsStructurallyEquivalent(Context, 657 cast<PointerType>(T1)->getPointeeType(), 658 cast<PointerType>(T2)->getPointeeType())) 659 return false; 660 break; 661 662 case Type::BlockPointer: 663 if (!IsStructurallyEquivalent(Context, 664 cast<BlockPointerType>(T1)->getPointeeType(), 665 cast<BlockPointerType>(T2)->getPointeeType())) 666 return false; 667 break; 668 669 case Type::LValueReference: 670 case Type::RValueReference: { 671 const ReferenceType *Ref1 = cast<ReferenceType>(T1); 672 const ReferenceType *Ref2 = cast<ReferenceType>(T2); 673 if (Ref1->isSpelledAsLValue() != Ref2->isSpelledAsLValue()) 674 return false; 675 if (Ref1->isInnerRef() != Ref2->isInnerRef()) 676 return false; 677 if (!IsStructurallyEquivalent(Context, 678 Ref1->getPointeeTypeAsWritten(), 679 Ref2->getPointeeTypeAsWritten())) 680 return false; 681 break; 682 } 683 684 case Type::MemberPointer: { 685 const MemberPointerType *MemPtr1 = cast<MemberPointerType>(T1); 686 const MemberPointerType *MemPtr2 = cast<MemberPointerType>(T2); 687 if (!IsStructurallyEquivalent(Context, 688 MemPtr1->getPointeeType(), 689 MemPtr2->getPointeeType())) 690 return false; 691 if (!IsStructurallyEquivalent(Context, 692 QualType(MemPtr1->getClass(), 0), 693 QualType(MemPtr2->getClass(), 0))) 694 return false; 695 break; 696 } 697 698 case Type::ConstantArray: { 699 const ConstantArrayType *Array1 = cast<ConstantArrayType>(T1); 700 const ConstantArrayType *Array2 = cast<ConstantArrayType>(T2); 701 if (!llvm::APInt::isSameValue(Array1->getSize(), Array2->getSize())) 702 return false; 703 704 if (!IsArrayStructurallyEquivalent(Context, Array1, Array2)) 705 return false; 706 break; 707 } 708 709 case Type::IncompleteArray: 710 if (!IsArrayStructurallyEquivalent(Context, 711 cast<ArrayType>(T1), 712 cast<ArrayType>(T2))) 713 return false; 714 break; 715 716 case Type::VariableArray: { 717 const VariableArrayType *Array1 = cast<VariableArrayType>(T1); 718 const VariableArrayType *Array2 = cast<VariableArrayType>(T2); 719 if (!IsStructurallyEquivalent(Context, 720 Array1->getSizeExpr(), Array2->getSizeExpr())) 721 return false; 722 723 if (!IsArrayStructurallyEquivalent(Context, Array1, Array2)) 724 return false; 725 726 break; 727 } 728 729 case Type::DependentSizedArray: { 730 const DependentSizedArrayType *Array1 = cast<DependentSizedArrayType>(T1); 731 const DependentSizedArrayType *Array2 = cast<DependentSizedArrayType>(T2); 732 if (!IsStructurallyEquivalent(Context, 733 Array1->getSizeExpr(), Array2->getSizeExpr())) 734 return false; 735 736 if (!IsArrayStructurallyEquivalent(Context, Array1, Array2)) 737 return false; 738 739 break; 740 } 741 742 case Type::DependentSizedExtVector: { 743 const DependentSizedExtVectorType *Vec1 744 = cast<DependentSizedExtVectorType>(T1); 745 const DependentSizedExtVectorType *Vec2 746 = cast<DependentSizedExtVectorType>(T2); 747 if (!IsStructurallyEquivalent(Context, 748 Vec1->getSizeExpr(), Vec2->getSizeExpr())) 749 return false; 750 if (!IsStructurallyEquivalent(Context, 751 Vec1->getElementType(), 752 Vec2->getElementType())) 753 return false; 754 break; 755 } 756 757 case Type::Vector: 758 case Type::ExtVector: { 759 const VectorType *Vec1 = cast<VectorType>(T1); 760 const VectorType *Vec2 = cast<VectorType>(T2); 761 if (!IsStructurallyEquivalent(Context, 762 Vec1->getElementType(), 763 Vec2->getElementType())) 764 return false; 765 if (Vec1->getNumElements() != Vec2->getNumElements()) 766 return false; 767 if (Vec1->getVectorKind() != Vec2->getVectorKind()) 768 return false; 769 break; 770 } 771 772 case Type::FunctionProto: { 773 const FunctionProtoType *Proto1 = cast<FunctionProtoType>(T1); 774 const FunctionProtoType *Proto2 = cast<FunctionProtoType>(T2); 775 if (Proto1->getNumParams() != Proto2->getNumParams()) 776 return false; 777 for (unsigned I = 0, N = Proto1->getNumParams(); I != N; ++I) { 778 if (!IsStructurallyEquivalent(Context, Proto1->getParamType(I), 779 Proto2->getParamType(I))) 780 return false; 781 } 782 if (Proto1->isVariadic() != Proto2->isVariadic()) 783 return false; 784 if (Proto1->getExceptionSpecType() != Proto2->getExceptionSpecType()) 785 return false; 786 if (Proto1->getExceptionSpecType() == EST_Dynamic) { 787 if (Proto1->getNumExceptions() != Proto2->getNumExceptions()) 788 return false; 789 for (unsigned I = 0, N = Proto1->getNumExceptions(); I != N; ++I) { 790 if (!IsStructurallyEquivalent(Context, 791 Proto1->getExceptionType(I), 792 Proto2->getExceptionType(I))) 793 return false; 794 } 795 } else if (Proto1->getExceptionSpecType() == EST_ComputedNoexcept) { 796 if (!IsStructurallyEquivalent(Context, 797 Proto1->getNoexceptExpr(), 798 Proto2->getNoexceptExpr())) 799 return false; 800 } 801 if (Proto1->getTypeQuals() != Proto2->getTypeQuals()) 802 return false; 803 804 // Fall through to check the bits common with FunctionNoProtoType. 805 } 806 807 case Type::FunctionNoProto: { 808 const FunctionType *Function1 = cast<FunctionType>(T1); 809 const FunctionType *Function2 = cast<FunctionType>(T2); 810 if (!IsStructurallyEquivalent(Context, Function1->getReturnType(), 811 Function2->getReturnType())) 812 return false; 813 if (Function1->getExtInfo() != Function2->getExtInfo()) 814 return false; 815 break; 816 } 817 818 case Type::UnresolvedUsing: 819 if (!IsStructurallyEquivalent(Context, 820 cast<UnresolvedUsingType>(T1)->getDecl(), 821 cast<UnresolvedUsingType>(T2)->getDecl())) 822 return false; 823 824 break; 825 826 case Type::Attributed: 827 if (!IsStructurallyEquivalent(Context, 828 cast<AttributedType>(T1)->getModifiedType(), 829 cast<AttributedType>(T2)->getModifiedType())) 830 return false; 831 if (!IsStructurallyEquivalent(Context, 832 cast<AttributedType>(T1)->getEquivalentType(), 833 cast<AttributedType>(T2)->getEquivalentType())) 834 return false; 835 break; 836 837 case Type::Paren: 838 if (!IsStructurallyEquivalent(Context, 839 cast<ParenType>(T1)->getInnerType(), 840 cast<ParenType>(T2)->getInnerType())) 841 return false; 842 break; 843 844 case Type::Typedef: 845 if (!IsStructurallyEquivalent(Context, 846 cast<TypedefType>(T1)->getDecl(), 847 cast<TypedefType>(T2)->getDecl())) 848 return false; 849 break; 850 851 case Type::TypeOfExpr: 852 if (!IsStructurallyEquivalent(Context, 853 cast<TypeOfExprType>(T1)->getUnderlyingExpr(), 854 cast<TypeOfExprType>(T2)->getUnderlyingExpr())) 855 return false; 856 break; 857 858 case Type::TypeOf: 859 if (!IsStructurallyEquivalent(Context, 860 cast<TypeOfType>(T1)->getUnderlyingType(), 861 cast<TypeOfType>(T2)->getUnderlyingType())) 862 return false; 863 break; 864 865 case Type::UnaryTransform: 866 if (!IsStructurallyEquivalent(Context, 867 cast<UnaryTransformType>(T1)->getUnderlyingType(), 868 cast<UnaryTransformType>(T1)->getUnderlyingType())) 869 return false; 870 break; 871 872 case Type::Decltype: 873 if (!IsStructurallyEquivalent(Context, 874 cast<DecltypeType>(T1)->getUnderlyingExpr(), 875 cast<DecltypeType>(T2)->getUnderlyingExpr())) 876 return false; 877 break; 878 879 case Type::Auto: 880 if (!IsStructurallyEquivalent(Context, 881 cast<AutoType>(T1)->getDeducedType(), 882 cast<AutoType>(T2)->getDeducedType())) 883 return false; 884 break; 885 886 case Type::DeducedTemplateSpecialization: { 887 auto *DT1 = cast<DeducedTemplateSpecializationType>(T1); 888 auto *DT2 = cast<DeducedTemplateSpecializationType>(T2); 889 if (!IsStructurallyEquivalent(Context, 890 DT1->getTemplateName(), 891 DT2->getTemplateName())) 892 return false; 893 if (!IsStructurallyEquivalent(Context, 894 DT1->getDeducedType(), 895 DT2->getDeducedType())) 896 return false; 897 break; 898 } 899 900 case Type::Record: 901 case Type::Enum: 902 if (!IsStructurallyEquivalent(Context, 903 cast<TagType>(T1)->getDecl(), 904 cast<TagType>(T2)->getDecl())) 905 return false; 906 break; 907 908 case Type::TemplateTypeParm: { 909 const TemplateTypeParmType *Parm1 = cast<TemplateTypeParmType>(T1); 910 const TemplateTypeParmType *Parm2 = cast<TemplateTypeParmType>(T2); 911 if (Parm1->getDepth() != Parm2->getDepth()) 912 return false; 913 if (Parm1->getIndex() != Parm2->getIndex()) 914 return false; 915 if (Parm1->isParameterPack() != Parm2->isParameterPack()) 916 return false; 917 918 // Names of template type parameters are never significant. 919 break; 920 } 921 922 case Type::SubstTemplateTypeParm: { 923 const SubstTemplateTypeParmType *Subst1 924 = cast<SubstTemplateTypeParmType>(T1); 925 const SubstTemplateTypeParmType *Subst2 926 = cast<SubstTemplateTypeParmType>(T2); 927 if (!IsStructurallyEquivalent(Context, 928 QualType(Subst1->getReplacedParameter(), 0), 929 QualType(Subst2->getReplacedParameter(), 0))) 930 return false; 931 if (!IsStructurallyEquivalent(Context, 932 Subst1->getReplacementType(), 933 Subst2->getReplacementType())) 934 return false; 935 break; 936 } 937 938 case Type::SubstTemplateTypeParmPack: { 939 const SubstTemplateTypeParmPackType *Subst1 940 = cast<SubstTemplateTypeParmPackType>(T1); 941 const SubstTemplateTypeParmPackType *Subst2 942 = cast<SubstTemplateTypeParmPackType>(T2); 943 if (!IsStructurallyEquivalent(Context, 944 QualType(Subst1->getReplacedParameter(), 0), 945 QualType(Subst2->getReplacedParameter(), 0))) 946 return false; 947 if (!IsStructurallyEquivalent(Context, 948 Subst1->getArgumentPack(), 949 Subst2->getArgumentPack())) 950 return false; 951 break; 952 } 953 case Type::TemplateSpecialization: { 954 const TemplateSpecializationType *Spec1 955 = cast<TemplateSpecializationType>(T1); 956 const TemplateSpecializationType *Spec2 957 = cast<TemplateSpecializationType>(T2); 958 if (!IsStructurallyEquivalent(Context, 959 Spec1->getTemplateName(), 960 Spec2->getTemplateName())) 961 return false; 962 if (Spec1->getNumArgs() != Spec2->getNumArgs()) 963 return false; 964 for (unsigned I = 0, N = Spec1->getNumArgs(); I != N; ++I) { 965 if (!IsStructurallyEquivalent(Context, 966 Spec1->getArg(I), Spec2->getArg(I))) 967 return false; 968 } 969 break; 970 } 971 972 case Type::Elaborated: { 973 const ElaboratedType *Elab1 = cast<ElaboratedType>(T1); 974 const ElaboratedType *Elab2 = cast<ElaboratedType>(T2); 975 // CHECKME: what if a keyword is ETK_None or ETK_typename ? 976 if (Elab1->getKeyword() != Elab2->getKeyword()) 977 return false; 978 if (!IsStructurallyEquivalent(Context, 979 Elab1->getQualifier(), 980 Elab2->getQualifier())) 981 return false; 982 if (!IsStructurallyEquivalent(Context, 983 Elab1->getNamedType(), 984 Elab2->getNamedType())) 985 return false; 986 break; 987 } 988 989 case Type::InjectedClassName: { 990 const InjectedClassNameType *Inj1 = cast<InjectedClassNameType>(T1); 991 const InjectedClassNameType *Inj2 = cast<InjectedClassNameType>(T2); 992 if (!IsStructurallyEquivalent(Context, 993 Inj1->getInjectedSpecializationType(), 994 Inj2->getInjectedSpecializationType())) 995 return false; 996 break; 997 } 998 999 case Type::DependentName: { 1000 const DependentNameType *Typename1 = cast<DependentNameType>(T1); 1001 const DependentNameType *Typename2 = cast<DependentNameType>(T2); 1002 if (!IsStructurallyEquivalent(Context, 1003 Typename1->getQualifier(), 1004 Typename2->getQualifier())) 1005 return false; 1006 if (!IsStructurallyEquivalent(Typename1->getIdentifier(), 1007 Typename2->getIdentifier())) 1008 return false; 1009 1010 break; 1011 } 1012 1013 case Type::DependentTemplateSpecialization: { 1014 const DependentTemplateSpecializationType *Spec1 = 1015 cast<DependentTemplateSpecializationType>(T1); 1016 const DependentTemplateSpecializationType *Spec2 = 1017 cast<DependentTemplateSpecializationType>(T2); 1018 if (!IsStructurallyEquivalent(Context, 1019 Spec1->getQualifier(), 1020 Spec2->getQualifier())) 1021 return false; 1022 if (!IsStructurallyEquivalent(Spec1->getIdentifier(), 1023 Spec2->getIdentifier())) 1024 return false; 1025 if (Spec1->getNumArgs() != Spec2->getNumArgs()) 1026 return false; 1027 for (unsigned I = 0, N = Spec1->getNumArgs(); I != N; ++I) { 1028 if (!IsStructurallyEquivalent(Context, 1029 Spec1->getArg(I), Spec2->getArg(I))) 1030 return false; 1031 } 1032 break; 1033 } 1034 1035 case Type::PackExpansion: 1036 if (!IsStructurallyEquivalent(Context, 1037 cast<PackExpansionType>(T1)->getPattern(), 1038 cast<PackExpansionType>(T2)->getPattern())) 1039 return false; 1040 break; 1041 1042 case Type::ObjCInterface: { 1043 const ObjCInterfaceType *Iface1 = cast<ObjCInterfaceType>(T1); 1044 const ObjCInterfaceType *Iface2 = cast<ObjCInterfaceType>(T2); 1045 if (!IsStructurallyEquivalent(Context, 1046 Iface1->getDecl(), Iface2->getDecl())) 1047 return false; 1048 break; 1049 } 1050 1051 case Type::ObjCTypeParam: { 1052 const ObjCTypeParamType *Obj1 = cast<ObjCTypeParamType>(T1); 1053 const ObjCTypeParamType *Obj2 = cast<ObjCTypeParamType>(T2); 1054 if (!IsStructurallyEquivalent(Context, Obj1->getDecl(), 1055 Obj2->getDecl())) 1056 return false; 1057 1058 if (Obj1->getNumProtocols() != Obj2->getNumProtocols()) 1059 return false; 1060 for (unsigned I = 0, N = Obj1->getNumProtocols(); I != N; ++I) { 1061 if (!IsStructurallyEquivalent(Context, 1062 Obj1->getProtocol(I), 1063 Obj2->getProtocol(I))) 1064 return false; 1065 } 1066 break; 1067 } 1068 case Type::ObjCObject: { 1069 const ObjCObjectType *Obj1 = cast<ObjCObjectType>(T1); 1070 const ObjCObjectType *Obj2 = cast<ObjCObjectType>(T2); 1071 if (!IsStructurallyEquivalent(Context, 1072 Obj1->getBaseType(), 1073 Obj2->getBaseType())) 1074 return false; 1075 if (Obj1->getNumProtocols() != Obj2->getNumProtocols()) 1076 return false; 1077 for (unsigned I = 0, N = Obj1->getNumProtocols(); I != N; ++I) { 1078 if (!IsStructurallyEquivalent(Context, 1079 Obj1->getProtocol(I), 1080 Obj2->getProtocol(I))) 1081 return false; 1082 } 1083 break; 1084 } 1085 1086 case Type::ObjCObjectPointer: { 1087 const ObjCObjectPointerType *Ptr1 = cast<ObjCObjectPointerType>(T1); 1088 const ObjCObjectPointerType *Ptr2 = cast<ObjCObjectPointerType>(T2); 1089 if (!IsStructurallyEquivalent(Context, 1090 Ptr1->getPointeeType(), 1091 Ptr2->getPointeeType())) 1092 return false; 1093 break; 1094 } 1095 1096 case Type::Atomic: { 1097 if (!IsStructurallyEquivalent(Context, 1098 cast<AtomicType>(T1)->getValueType(), 1099 cast<AtomicType>(T2)->getValueType())) 1100 return false; 1101 break; 1102 } 1103 1104 case Type::Pipe: { 1105 if (!IsStructurallyEquivalent(Context, 1106 cast<PipeType>(T1)->getElementType(), 1107 cast<PipeType>(T2)->getElementType())) 1108 return false; 1109 break; 1110 } 1111 1112 } // end switch 1113 1114 return true; 1115 } 1116 1117 /// \brief Determine structural equivalence of two fields. 1118 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 1119 FieldDecl *Field1, FieldDecl *Field2) { 1120 RecordDecl *Owner2 = cast<RecordDecl>(Field2->getDeclContext()); 1121 1122 // For anonymous structs/unions, match up the anonymous struct/union type 1123 // declarations directly, so that we don't go off searching for anonymous 1124 // types 1125 if (Field1->isAnonymousStructOrUnion() && 1126 Field2->isAnonymousStructOrUnion()) { 1127 RecordDecl *D1 = Field1->getType()->castAs<RecordType>()->getDecl(); 1128 RecordDecl *D2 = Field2->getType()->castAs<RecordType>()->getDecl(); 1129 return IsStructurallyEquivalent(Context, D1, D2); 1130 } 1131 1132 // Check for equivalent field names. 1133 IdentifierInfo *Name1 = Field1->getIdentifier(); 1134 IdentifierInfo *Name2 = Field2->getIdentifier(); 1135 if (!::IsStructurallyEquivalent(Name1, Name2)) 1136 return false; 1137 1138 if (!IsStructurallyEquivalent(Context, 1139 Field1->getType(), Field2->getType())) { 1140 if (Context.Complain) { 1141 Context.Diag2(Owner2->getLocation(), diag::warn_odr_tag_type_inconsistent) 1142 << Context.C2.getTypeDeclType(Owner2); 1143 Context.Diag2(Field2->getLocation(), diag::note_odr_field) 1144 << Field2->getDeclName() << Field2->getType(); 1145 Context.Diag1(Field1->getLocation(), diag::note_odr_field) 1146 << Field1->getDeclName() << Field1->getType(); 1147 } 1148 return false; 1149 } 1150 1151 if (Field1->isBitField() != Field2->isBitField()) { 1152 if (Context.Complain) { 1153 Context.Diag2(Owner2->getLocation(), diag::warn_odr_tag_type_inconsistent) 1154 << Context.C2.getTypeDeclType(Owner2); 1155 if (Field1->isBitField()) { 1156 Context.Diag1(Field1->getLocation(), diag::note_odr_bit_field) 1157 << Field1->getDeclName() << Field1->getType() 1158 << Field1->getBitWidthValue(Context.C1); 1159 Context.Diag2(Field2->getLocation(), diag::note_odr_not_bit_field) 1160 << Field2->getDeclName(); 1161 } else { 1162 Context.Diag2(Field2->getLocation(), diag::note_odr_bit_field) 1163 << Field2->getDeclName() << Field2->getType() 1164 << Field2->getBitWidthValue(Context.C2); 1165 Context.Diag1(Field1->getLocation(), diag::note_odr_not_bit_field) 1166 << Field1->getDeclName(); 1167 } 1168 } 1169 return false; 1170 } 1171 1172 if (Field1->isBitField()) { 1173 // Make sure that the bit-fields are the same length. 1174 unsigned Bits1 = Field1->getBitWidthValue(Context.C1); 1175 unsigned Bits2 = Field2->getBitWidthValue(Context.C2); 1176 1177 if (Bits1 != Bits2) { 1178 if (Context.Complain) { 1179 Context.Diag2(Owner2->getLocation(), diag::warn_odr_tag_type_inconsistent) 1180 << Context.C2.getTypeDeclType(Owner2); 1181 Context.Diag2(Field2->getLocation(), diag::note_odr_bit_field) 1182 << Field2->getDeclName() << Field2->getType() << Bits2; 1183 Context.Diag1(Field1->getLocation(), diag::note_odr_bit_field) 1184 << Field1->getDeclName() << Field1->getType() << Bits1; 1185 } 1186 return false; 1187 } 1188 } 1189 1190 return true; 1191 } 1192 1193 /// \brief Find the index of the given anonymous struct/union within its 1194 /// context. 1195 /// 1196 /// \returns Returns the index of this anonymous struct/union in its context, 1197 /// including the next assigned index (if none of them match). Returns an 1198 /// empty option if the context is not a record, i.e.. if the anonymous 1199 /// struct/union is at namespace or block scope. 1200 static Optional<unsigned> findUntaggedStructOrUnionIndex(RecordDecl *Anon) { 1201 ASTContext &Context = Anon->getASTContext(); 1202 QualType AnonTy = Context.getRecordType(Anon); 1203 1204 RecordDecl *Owner = dyn_cast<RecordDecl>(Anon->getDeclContext()); 1205 if (!Owner) 1206 return None; 1207 1208 unsigned Index = 0; 1209 for (const auto *D : Owner->noload_decls()) { 1210 const auto *F = dyn_cast<FieldDecl>(D); 1211 if (!F) 1212 continue; 1213 1214 if (F->isAnonymousStructOrUnion()) { 1215 if (Context.hasSameType(F->getType(), AnonTy)) 1216 break; 1217 ++Index; 1218 continue; 1219 } 1220 1221 // If the field looks like this: 1222 // struct { ... } A; 1223 QualType FieldType = F->getType(); 1224 if (const auto *RecType = dyn_cast<RecordType>(FieldType)) { 1225 const RecordDecl *RecDecl = RecType->getDecl(); 1226 if (RecDecl->getDeclContext() == Owner && 1227 !RecDecl->getIdentifier()) { 1228 if (Context.hasSameType(FieldType, AnonTy)) 1229 break; 1230 ++Index; 1231 continue; 1232 } 1233 } 1234 } 1235 1236 return Index; 1237 } 1238 1239 /// \brief Determine structural equivalence of two records. 1240 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 1241 RecordDecl *D1, RecordDecl *D2) { 1242 if (D1->isUnion() != D2->isUnion()) { 1243 if (Context.Complain) { 1244 Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent) 1245 << Context.C2.getTypeDeclType(D2); 1246 Context.Diag1(D1->getLocation(), diag::note_odr_tag_kind_here) 1247 << D1->getDeclName() << (unsigned)D1->getTagKind(); 1248 } 1249 return false; 1250 } 1251 1252 if (D1->isAnonymousStructOrUnion() && D2->isAnonymousStructOrUnion()) { 1253 // If both anonymous structs/unions are in a record context, make sure 1254 // they occur in the same location in the context records. 1255 if (Optional<unsigned> Index1 = findUntaggedStructOrUnionIndex(D1)) { 1256 if (Optional<unsigned> Index2 = findUntaggedStructOrUnionIndex(D2)) { 1257 if (*Index1 != *Index2) 1258 return false; 1259 } 1260 } 1261 } 1262 1263 // If both declarations are class template specializations, we know 1264 // the ODR applies, so check the template and template arguments. 1265 ClassTemplateSpecializationDecl *Spec1 1266 = dyn_cast<ClassTemplateSpecializationDecl>(D1); 1267 ClassTemplateSpecializationDecl *Spec2 1268 = dyn_cast<ClassTemplateSpecializationDecl>(D2); 1269 if (Spec1 && Spec2) { 1270 // Check that the specialized templates are the same. 1271 if (!IsStructurallyEquivalent(Context, Spec1->getSpecializedTemplate(), 1272 Spec2->getSpecializedTemplate())) 1273 return false; 1274 1275 // Check that the template arguments are the same. 1276 if (Spec1->getTemplateArgs().size() != Spec2->getTemplateArgs().size()) 1277 return false; 1278 1279 for (unsigned I = 0, N = Spec1->getTemplateArgs().size(); I != N; ++I) 1280 if (!IsStructurallyEquivalent(Context, 1281 Spec1->getTemplateArgs().get(I), 1282 Spec2->getTemplateArgs().get(I))) 1283 return false; 1284 } 1285 // If one is a class template specialization and the other is not, these 1286 // structures are different. 1287 else if (Spec1 || Spec2) 1288 return false; 1289 1290 // Compare the definitions of these two records. If either or both are 1291 // incomplete, we assume that they are equivalent. 1292 D1 = D1->getDefinition(); 1293 D2 = D2->getDefinition(); 1294 if (!D1 || !D2) 1295 return true; 1296 1297 if (CXXRecordDecl *D1CXX = dyn_cast<CXXRecordDecl>(D1)) { 1298 if (CXXRecordDecl *D2CXX = dyn_cast<CXXRecordDecl>(D2)) { 1299 if (D1CXX->getNumBases() != D2CXX->getNumBases()) { 1300 if (Context.Complain) { 1301 Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent) 1302 << Context.C2.getTypeDeclType(D2); 1303 Context.Diag2(D2->getLocation(), diag::note_odr_number_of_bases) 1304 << D2CXX->getNumBases(); 1305 Context.Diag1(D1->getLocation(), diag::note_odr_number_of_bases) 1306 << D1CXX->getNumBases(); 1307 } 1308 return false; 1309 } 1310 1311 // Check the base classes. 1312 for (CXXRecordDecl::base_class_iterator Base1 = D1CXX->bases_begin(), 1313 BaseEnd1 = D1CXX->bases_end(), 1314 Base2 = D2CXX->bases_begin(); 1315 Base1 != BaseEnd1; 1316 ++Base1, ++Base2) { 1317 if (!IsStructurallyEquivalent(Context, 1318 Base1->getType(), Base2->getType())) { 1319 if (Context.Complain) { 1320 Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent) 1321 << Context.C2.getTypeDeclType(D2); 1322 Context.Diag2(Base2->getLocStart(), diag::note_odr_base) 1323 << Base2->getType() 1324 << Base2->getSourceRange(); 1325 Context.Diag1(Base1->getLocStart(), diag::note_odr_base) 1326 << Base1->getType() 1327 << Base1->getSourceRange(); 1328 } 1329 return false; 1330 } 1331 1332 // Check virtual vs. non-virtual inheritance mismatch. 1333 if (Base1->isVirtual() != Base2->isVirtual()) { 1334 if (Context.Complain) { 1335 Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent) 1336 << Context.C2.getTypeDeclType(D2); 1337 Context.Diag2(Base2->getLocStart(), 1338 diag::note_odr_virtual_base) 1339 << Base2->isVirtual() << Base2->getSourceRange(); 1340 Context.Diag1(Base1->getLocStart(), diag::note_odr_base) 1341 << Base1->isVirtual() 1342 << Base1->getSourceRange(); 1343 } 1344 return false; 1345 } 1346 } 1347 } else if (D1CXX->getNumBases() > 0) { 1348 if (Context.Complain) { 1349 Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent) 1350 << Context.C2.getTypeDeclType(D2); 1351 const CXXBaseSpecifier *Base1 = D1CXX->bases_begin(); 1352 Context.Diag1(Base1->getLocStart(), diag::note_odr_base) 1353 << Base1->getType() 1354 << Base1->getSourceRange(); 1355 Context.Diag2(D2->getLocation(), diag::note_odr_missing_base); 1356 } 1357 return false; 1358 } 1359 } 1360 1361 // Check the fields for consistency. 1362 RecordDecl::field_iterator Field2 = D2->field_begin(), 1363 Field2End = D2->field_end(); 1364 for (RecordDecl::field_iterator Field1 = D1->field_begin(), 1365 Field1End = D1->field_end(); 1366 Field1 != Field1End; 1367 ++Field1, ++Field2) { 1368 if (Field2 == Field2End) { 1369 if (Context.Complain) { 1370 Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent) 1371 << Context.C2.getTypeDeclType(D2); 1372 Context.Diag1(Field1->getLocation(), diag::note_odr_field) 1373 << Field1->getDeclName() << Field1->getType(); 1374 Context.Diag2(D2->getLocation(), diag::note_odr_missing_field); 1375 } 1376 return false; 1377 } 1378 1379 if (!IsStructurallyEquivalent(Context, *Field1, *Field2)) 1380 return false; 1381 } 1382 1383 if (Field2 != Field2End) { 1384 if (Context.Complain) { 1385 Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent) 1386 << Context.C2.getTypeDeclType(D2); 1387 Context.Diag2(Field2->getLocation(), diag::note_odr_field) 1388 << Field2->getDeclName() << Field2->getType(); 1389 Context.Diag1(D1->getLocation(), diag::note_odr_missing_field); 1390 } 1391 return false; 1392 } 1393 1394 return true; 1395 } 1396 1397 /// \brief Determine structural equivalence of two enums. 1398 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 1399 EnumDecl *D1, EnumDecl *D2) { 1400 EnumDecl::enumerator_iterator EC2 = D2->enumerator_begin(), 1401 EC2End = D2->enumerator_end(); 1402 for (EnumDecl::enumerator_iterator EC1 = D1->enumerator_begin(), 1403 EC1End = D1->enumerator_end(); 1404 EC1 != EC1End; ++EC1, ++EC2) { 1405 if (EC2 == EC2End) { 1406 if (Context.Complain) { 1407 Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent) 1408 << Context.C2.getTypeDeclType(D2); 1409 Context.Diag1(EC1->getLocation(), diag::note_odr_enumerator) 1410 << EC1->getDeclName() 1411 << EC1->getInitVal().toString(10); 1412 Context.Diag2(D2->getLocation(), diag::note_odr_missing_enumerator); 1413 } 1414 return false; 1415 } 1416 1417 llvm::APSInt Val1 = EC1->getInitVal(); 1418 llvm::APSInt Val2 = EC2->getInitVal(); 1419 if (!llvm::APSInt::isSameValue(Val1, Val2) || 1420 !IsStructurallyEquivalent(EC1->getIdentifier(), EC2->getIdentifier())) { 1421 if (Context.Complain) { 1422 Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent) 1423 << Context.C2.getTypeDeclType(D2); 1424 Context.Diag2(EC2->getLocation(), diag::note_odr_enumerator) 1425 << EC2->getDeclName() 1426 << EC2->getInitVal().toString(10); 1427 Context.Diag1(EC1->getLocation(), diag::note_odr_enumerator) 1428 << EC1->getDeclName() 1429 << EC1->getInitVal().toString(10); 1430 } 1431 return false; 1432 } 1433 } 1434 1435 if (EC2 != EC2End) { 1436 if (Context.Complain) { 1437 Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent) 1438 << Context.C2.getTypeDeclType(D2); 1439 Context.Diag2(EC2->getLocation(), diag::note_odr_enumerator) 1440 << EC2->getDeclName() 1441 << EC2->getInitVal().toString(10); 1442 Context.Diag1(D1->getLocation(), diag::note_odr_missing_enumerator); 1443 } 1444 return false; 1445 } 1446 1447 return true; 1448 } 1449 1450 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 1451 TemplateParameterList *Params1, 1452 TemplateParameterList *Params2) { 1453 if (Params1->size() != Params2->size()) { 1454 if (Context.Complain) { 1455 Context.Diag2(Params2->getTemplateLoc(), 1456 diag::err_odr_different_num_template_parameters) 1457 << Params1->size() << Params2->size(); 1458 Context.Diag1(Params1->getTemplateLoc(), 1459 diag::note_odr_template_parameter_list); 1460 } 1461 return false; 1462 } 1463 1464 for (unsigned I = 0, N = Params1->size(); I != N; ++I) { 1465 if (Params1->getParam(I)->getKind() != Params2->getParam(I)->getKind()) { 1466 if (Context.Complain) { 1467 Context.Diag2(Params2->getParam(I)->getLocation(), 1468 diag::err_odr_different_template_parameter_kind); 1469 Context.Diag1(Params1->getParam(I)->getLocation(), 1470 diag::note_odr_template_parameter_here); 1471 } 1472 return false; 1473 } 1474 1475 if (!Context.IsStructurallyEquivalent(Params1->getParam(I), 1476 Params2->getParam(I))) { 1477 1478 return false; 1479 } 1480 } 1481 1482 return true; 1483 } 1484 1485 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 1486 TemplateTypeParmDecl *D1, 1487 TemplateTypeParmDecl *D2) { 1488 if (D1->isParameterPack() != D2->isParameterPack()) { 1489 if (Context.Complain) { 1490 Context.Diag2(D2->getLocation(), diag::err_odr_parameter_pack_non_pack) 1491 << D2->isParameterPack(); 1492 Context.Diag1(D1->getLocation(), diag::note_odr_parameter_pack_non_pack) 1493 << D1->isParameterPack(); 1494 } 1495 return false; 1496 } 1497 1498 return true; 1499 } 1500 1501 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 1502 NonTypeTemplateParmDecl *D1, 1503 NonTypeTemplateParmDecl *D2) { 1504 if (D1->isParameterPack() != D2->isParameterPack()) { 1505 if (Context.Complain) { 1506 Context.Diag2(D2->getLocation(), diag::err_odr_parameter_pack_non_pack) 1507 << D2->isParameterPack(); 1508 Context.Diag1(D1->getLocation(), diag::note_odr_parameter_pack_non_pack) 1509 << D1->isParameterPack(); 1510 } 1511 return false; 1512 } 1513 1514 // Check types. 1515 if (!Context.IsStructurallyEquivalent(D1->getType(), D2->getType())) { 1516 if (Context.Complain) { 1517 Context.Diag2(D2->getLocation(), 1518 diag::err_odr_non_type_parameter_type_inconsistent) 1519 << D2->getType() << D1->getType(); 1520 Context.Diag1(D1->getLocation(), diag::note_odr_value_here) 1521 << D1->getType(); 1522 } 1523 return false; 1524 } 1525 1526 return true; 1527 } 1528 1529 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 1530 TemplateTemplateParmDecl *D1, 1531 TemplateTemplateParmDecl *D2) { 1532 if (D1->isParameterPack() != D2->isParameterPack()) { 1533 if (Context.Complain) { 1534 Context.Diag2(D2->getLocation(), diag::err_odr_parameter_pack_non_pack) 1535 << D2->isParameterPack(); 1536 Context.Diag1(D1->getLocation(), diag::note_odr_parameter_pack_non_pack) 1537 << D1->isParameterPack(); 1538 } 1539 return false; 1540 } 1541 1542 // Check template parameter lists. 1543 return IsStructurallyEquivalent(Context, D1->getTemplateParameters(), 1544 D2->getTemplateParameters()); 1545 } 1546 1547 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 1548 ClassTemplateDecl *D1, 1549 ClassTemplateDecl *D2) { 1550 // Check template parameters. 1551 if (!IsStructurallyEquivalent(Context, 1552 D1->getTemplateParameters(), 1553 D2->getTemplateParameters())) 1554 return false; 1555 1556 // Check the templated declaration. 1557 return Context.IsStructurallyEquivalent(D1->getTemplatedDecl(), 1558 D2->getTemplatedDecl()); 1559 } 1560 1561 /// \brief Determine structural equivalence of two declarations. 1562 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 1563 Decl *D1, Decl *D2) { 1564 // FIXME: Check for known structural equivalences via a callback of some sort. 1565 1566 // Check whether we already know that these two declarations are not 1567 // structurally equivalent. 1568 if (Context.NonEquivalentDecls.count(std::make_pair(D1->getCanonicalDecl(), 1569 D2->getCanonicalDecl()))) 1570 return false; 1571 1572 // Determine whether we've already produced a tentative equivalence for D1. 1573 Decl *&EquivToD1 = Context.TentativeEquivalences[D1->getCanonicalDecl()]; 1574 if (EquivToD1) 1575 return EquivToD1 == D2->getCanonicalDecl(); 1576 1577 // Produce a tentative equivalence D1 <-> D2, which will be checked later. 1578 EquivToD1 = D2->getCanonicalDecl(); 1579 Context.DeclsToCheck.push_back(D1->getCanonicalDecl()); 1580 return true; 1581 } 1582 1583 bool StructuralEquivalenceContext::IsStructurallyEquivalent(Decl *D1, 1584 Decl *D2) { 1585 if (!::IsStructurallyEquivalent(*this, D1, D2)) 1586 return false; 1587 1588 return !Finish(); 1589 } 1590 1591 bool StructuralEquivalenceContext::IsStructurallyEquivalent(QualType T1, 1592 QualType T2) { 1593 if (!::IsStructurallyEquivalent(*this, T1, T2)) 1594 return false; 1595 1596 return !Finish(); 1597 } 1598 1599 bool StructuralEquivalenceContext::Finish() { 1600 while (!DeclsToCheck.empty()) { 1601 // Check the next declaration. 1602 Decl *D1 = DeclsToCheck.front(); 1603 DeclsToCheck.pop_front(); 1604 1605 Decl *D2 = TentativeEquivalences[D1]; 1606 assert(D2 && "Unrecorded tentative equivalence?"); 1607 1608 bool Equivalent = true; 1609 1610 // FIXME: Switch on all declaration kinds. For now, we're just going to 1611 // check the obvious ones. 1612 if (RecordDecl *Record1 = dyn_cast<RecordDecl>(D1)) { 1613 if (RecordDecl *Record2 = dyn_cast<RecordDecl>(D2)) { 1614 // Check for equivalent structure names. 1615 IdentifierInfo *Name1 = Record1->getIdentifier(); 1616 if (!Name1 && Record1->getTypedefNameForAnonDecl()) 1617 Name1 = Record1->getTypedefNameForAnonDecl()->getIdentifier(); 1618 IdentifierInfo *Name2 = Record2->getIdentifier(); 1619 if (!Name2 && Record2->getTypedefNameForAnonDecl()) 1620 Name2 = Record2->getTypedefNameForAnonDecl()->getIdentifier(); 1621 if (!::IsStructurallyEquivalent(Name1, Name2) || 1622 !::IsStructurallyEquivalent(*this, Record1, Record2)) 1623 Equivalent = false; 1624 } else { 1625 // Record/non-record mismatch. 1626 Equivalent = false; 1627 } 1628 } else if (EnumDecl *Enum1 = dyn_cast<EnumDecl>(D1)) { 1629 if (EnumDecl *Enum2 = dyn_cast<EnumDecl>(D2)) { 1630 // Check for equivalent enum names. 1631 IdentifierInfo *Name1 = Enum1->getIdentifier(); 1632 if (!Name1 && Enum1->getTypedefNameForAnonDecl()) 1633 Name1 = Enum1->getTypedefNameForAnonDecl()->getIdentifier(); 1634 IdentifierInfo *Name2 = Enum2->getIdentifier(); 1635 if (!Name2 && Enum2->getTypedefNameForAnonDecl()) 1636 Name2 = Enum2->getTypedefNameForAnonDecl()->getIdentifier(); 1637 if (!::IsStructurallyEquivalent(Name1, Name2) || 1638 !::IsStructurallyEquivalent(*this, Enum1, Enum2)) 1639 Equivalent = false; 1640 } else { 1641 // Enum/non-enum mismatch 1642 Equivalent = false; 1643 } 1644 } else if (TypedefNameDecl *Typedef1 = dyn_cast<TypedefNameDecl>(D1)) { 1645 if (TypedefNameDecl *Typedef2 = dyn_cast<TypedefNameDecl>(D2)) { 1646 if (!::IsStructurallyEquivalent(Typedef1->getIdentifier(), 1647 Typedef2->getIdentifier()) || 1648 !::IsStructurallyEquivalent(*this, 1649 Typedef1->getUnderlyingType(), 1650 Typedef2->getUnderlyingType())) 1651 Equivalent = false; 1652 } else { 1653 // Typedef/non-typedef mismatch. 1654 Equivalent = false; 1655 } 1656 } else if (ClassTemplateDecl *ClassTemplate1 1657 = dyn_cast<ClassTemplateDecl>(D1)) { 1658 if (ClassTemplateDecl *ClassTemplate2 = dyn_cast<ClassTemplateDecl>(D2)) { 1659 if (!::IsStructurallyEquivalent(ClassTemplate1->getIdentifier(), 1660 ClassTemplate2->getIdentifier()) || 1661 !::IsStructurallyEquivalent(*this, ClassTemplate1, ClassTemplate2)) 1662 Equivalent = false; 1663 } else { 1664 // Class template/non-class-template mismatch. 1665 Equivalent = false; 1666 } 1667 } else if (TemplateTypeParmDecl *TTP1= dyn_cast<TemplateTypeParmDecl>(D1)) { 1668 if (TemplateTypeParmDecl *TTP2 = dyn_cast<TemplateTypeParmDecl>(D2)) { 1669 if (!::IsStructurallyEquivalent(*this, TTP1, TTP2)) 1670 Equivalent = false; 1671 } else { 1672 // Kind mismatch. 1673 Equivalent = false; 1674 } 1675 } else if (NonTypeTemplateParmDecl *NTTP1 1676 = dyn_cast<NonTypeTemplateParmDecl>(D1)) { 1677 if (NonTypeTemplateParmDecl *NTTP2 1678 = dyn_cast<NonTypeTemplateParmDecl>(D2)) { 1679 if (!::IsStructurallyEquivalent(*this, NTTP1, NTTP2)) 1680 Equivalent = false; 1681 } else { 1682 // Kind mismatch. 1683 Equivalent = false; 1684 } 1685 } else if (TemplateTemplateParmDecl *TTP1 1686 = dyn_cast<TemplateTemplateParmDecl>(D1)) { 1687 if (TemplateTemplateParmDecl *TTP2 1688 = dyn_cast<TemplateTemplateParmDecl>(D2)) { 1689 if (!::IsStructurallyEquivalent(*this, TTP1, TTP2)) 1690 Equivalent = false; 1691 } else { 1692 // Kind mismatch. 1693 Equivalent = false; 1694 } 1695 } 1696 1697 if (!Equivalent) { 1698 // Note that these two declarations are not equivalent (and we already 1699 // know about it). 1700 NonEquivalentDecls.insert(std::make_pair(D1->getCanonicalDecl(), 1701 D2->getCanonicalDecl())); 1702 return true; 1703 } 1704 // FIXME: Check other declaration kinds! 1705 } 1706 1707 return false; 1708 } 1709 1710 //---------------------------------------------------------------------------- 1711 // Import Types 1712 //---------------------------------------------------------------------------- 1713 1714 QualType ASTNodeImporter::VisitType(const Type *T) { 1715 Importer.FromDiag(SourceLocation(), diag::err_unsupported_ast_node) 1716 << T->getTypeClassName(); 1717 return QualType(); 1718 } 1719 1720 QualType ASTNodeImporter::VisitAtomicType(const AtomicType *T){ 1721 QualType UnderlyingType = Importer.Import(T->getValueType()); 1722 if(UnderlyingType.isNull()) 1723 return QualType(); 1724 1725 return Importer.getToContext().getAtomicType(UnderlyingType); 1726 } 1727 1728 QualType ASTNodeImporter::VisitBuiltinType(const BuiltinType *T) { 1729 switch (T->getKind()) { 1730 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \ 1731 case BuiltinType::Id: \ 1732 return Importer.getToContext().SingletonId; 1733 #include "clang/Basic/OpenCLImageTypes.def" 1734 #define SHARED_SINGLETON_TYPE(Expansion) 1735 #define BUILTIN_TYPE(Id, SingletonId) \ 1736 case BuiltinType::Id: return Importer.getToContext().SingletonId; 1737 #include "clang/AST/BuiltinTypes.def" 1738 1739 // FIXME: for Char16, Char32, and NullPtr, make sure that the "to" 1740 // context supports C++. 1741 1742 // FIXME: for ObjCId, ObjCClass, and ObjCSel, make sure that the "to" 1743 // context supports ObjC. 1744 1745 case BuiltinType::Char_U: 1746 // The context we're importing from has an unsigned 'char'. If we're 1747 // importing into a context with a signed 'char', translate to 1748 // 'unsigned char' instead. 1749 if (Importer.getToContext().getLangOpts().CharIsSigned) 1750 return Importer.getToContext().UnsignedCharTy; 1751 1752 return Importer.getToContext().CharTy; 1753 1754 case BuiltinType::Char_S: 1755 // The context we're importing from has an unsigned 'char'. If we're 1756 // importing into a context with a signed 'char', translate to 1757 // 'unsigned char' instead. 1758 if (!Importer.getToContext().getLangOpts().CharIsSigned) 1759 return Importer.getToContext().SignedCharTy; 1760 1761 return Importer.getToContext().CharTy; 1762 1763 case BuiltinType::WChar_S: 1764 case BuiltinType::WChar_U: 1765 // FIXME: If not in C++, shall we translate to the C equivalent of 1766 // wchar_t? 1767 return Importer.getToContext().WCharTy; 1768 } 1769 1770 llvm_unreachable("Invalid BuiltinType Kind!"); 1771 } 1772 1773 QualType ASTNodeImporter::VisitDecayedType(const DecayedType *T) { 1774 QualType OrigT = Importer.Import(T->getOriginalType()); 1775 if (OrigT.isNull()) 1776 return QualType(); 1777 1778 return Importer.getToContext().getDecayedType(OrigT); 1779 } 1780 1781 QualType ASTNodeImporter::VisitComplexType(const ComplexType *T) { 1782 QualType ToElementType = Importer.Import(T->getElementType()); 1783 if (ToElementType.isNull()) 1784 return QualType(); 1785 1786 return Importer.getToContext().getComplexType(ToElementType); 1787 } 1788 1789 QualType ASTNodeImporter::VisitPointerType(const PointerType *T) { 1790 QualType ToPointeeType = Importer.Import(T->getPointeeType()); 1791 if (ToPointeeType.isNull()) 1792 return QualType(); 1793 1794 return Importer.getToContext().getPointerType(ToPointeeType); 1795 } 1796 1797 QualType ASTNodeImporter::VisitBlockPointerType(const BlockPointerType *T) { 1798 // FIXME: Check for blocks support in "to" context. 1799 QualType ToPointeeType = Importer.Import(T->getPointeeType()); 1800 if (ToPointeeType.isNull()) 1801 return QualType(); 1802 1803 return Importer.getToContext().getBlockPointerType(ToPointeeType); 1804 } 1805 1806 QualType 1807 ASTNodeImporter::VisitLValueReferenceType(const LValueReferenceType *T) { 1808 // FIXME: Check for C++ support in "to" context. 1809 QualType ToPointeeType = Importer.Import(T->getPointeeTypeAsWritten()); 1810 if (ToPointeeType.isNull()) 1811 return QualType(); 1812 1813 return Importer.getToContext().getLValueReferenceType(ToPointeeType); 1814 } 1815 1816 QualType 1817 ASTNodeImporter::VisitRValueReferenceType(const RValueReferenceType *T) { 1818 // FIXME: Check for C++0x support in "to" context. 1819 QualType ToPointeeType = Importer.Import(T->getPointeeTypeAsWritten()); 1820 if (ToPointeeType.isNull()) 1821 return QualType(); 1822 1823 return Importer.getToContext().getRValueReferenceType(ToPointeeType); 1824 } 1825 1826 QualType ASTNodeImporter::VisitMemberPointerType(const MemberPointerType *T) { 1827 // FIXME: Check for C++ support in "to" context. 1828 QualType ToPointeeType = Importer.Import(T->getPointeeType()); 1829 if (ToPointeeType.isNull()) 1830 return QualType(); 1831 1832 QualType ClassType = Importer.Import(QualType(T->getClass(), 0)); 1833 return Importer.getToContext().getMemberPointerType(ToPointeeType, 1834 ClassType.getTypePtr()); 1835 } 1836 1837 QualType ASTNodeImporter::VisitConstantArrayType(const ConstantArrayType *T) { 1838 QualType ToElementType = Importer.Import(T->getElementType()); 1839 if (ToElementType.isNull()) 1840 return QualType(); 1841 1842 return Importer.getToContext().getConstantArrayType(ToElementType, 1843 T->getSize(), 1844 T->getSizeModifier(), 1845 T->getIndexTypeCVRQualifiers()); 1846 } 1847 1848 QualType 1849 ASTNodeImporter::VisitIncompleteArrayType(const IncompleteArrayType *T) { 1850 QualType ToElementType = Importer.Import(T->getElementType()); 1851 if (ToElementType.isNull()) 1852 return QualType(); 1853 1854 return Importer.getToContext().getIncompleteArrayType(ToElementType, 1855 T->getSizeModifier(), 1856 T->getIndexTypeCVRQualifiers()); 1857 } 1858 1859 QualType ASTNodeImporter::VisitVariableArrayType(const VariableArrayType *T) { 1860 QualType ToElementType = Importer.Import(T->getElementType()); 1861 if (ToElementType.isNull()) 1862 return QualType(); 1863 1864 Expr *Size = Importer.Import(T->getSizeExpr()); 1865 if (!Size) 1866 return QualType(); 1867 1868 SourceRange Brackets = Importer.Import(T->getBracketsRange()); 1869 return Importer.getToContext().getVariableArrayType(ToElementType, Size, 1870 T->getSizeModifier(), 1871 T->getIndexTypeCVRQualifiers(), 1872 Brackets); 1873 } 1874 1875 QualType ASTNodeImporter::VisitVectorType(const VectorType *T) { 1876 QualType ToElementType = Importer.Import(T->getElementType()); 1877 if (ToElementType.isNull()) 1878 return QualType(); 1879 1880 return Importer.getToContext().getVectorType(ToElementType, 1881 T->getNumElements(), 1882 T->getVectorKind()); 1883 } 1884 1885 QualType ASTNodeImporter::VisitExtVectorType(const ExtVectorType *T) { 1886 QualType ToElementType = Importer.Import(T->getElementType()); 1887 if (ToElementType.isNull()) 1888 return QualType(); 1889 1890 return Importer.getToContext().getExtVectorType(ToElementType, 1891 T->getNumElements()); 1892 } 1893 1894 QualType 1895 ASTNodeImporter::VisitFunctionNoProtoType(const FunctionNoProtoType *T) { 1896 // FIXME: What happens if we're importing a function without a prototype 1897 // into C++? Should we make it variadic? 1898 QualType ToResultType = Importer.Import(T->getReturnType()); 1899 if (ToResultType.isNull()) 1900 return QualType(); 1901 1902 return Importer.getToContext().getFunctionNoProtoType(ToResultType, 1903 T->getExtInfo()); 1904 } 1905 1906 QualType ASTNodeImporter::VisitFunctionProtoType(const FunctionProtoType *T) { 1907 QualType ToResultType = Importer.Import(T->getReturnType()); 1908 if (ToResultType.isNull()) 1909 return QualType(); 1910 1911 // Import argument types 1912 SmallVector<QualType, 4> ArgTypes; 1913 for (const auto &A : T->param_types()) { 1914 QualType ArgType = Importer.Import(A); 1915 if (ArgType.isNull()) 1916 return QualType(); 1917 ArgTypes.push_back(ArgType); 1918 } 1919 1920 // Import exception types 1921 SmallVector<QualType, 4> ExceptionTypes; 1922 for (const auto &E : T->exceptions()) { 1923 QualType ExceptionType = Importer.Import(E); 1924 if (ExceptionType.isNull()) 1925 return QualType(); 1926 ExceptionTypes.push_back(ExceptionType); 1927 } 1928 1929 FunctionProtoType::ExtProtoInfo FromEPI = T->getExtProtoInfo(); 1930 FunctionProtoType::ExtProtoInfo ToEPI; 1931 1932 ToEPI.ExtInfo = FromEPI.ExtInfo; 1933 ToEPI.Variadic = FromEPI.Variadic; 1934 ToEPI.HasTrailingReturn = FromEPI.HasTrailingReturn; 1935 ToEPI.TypeQuals = FromEPI.TypeQuals; 1936 ToEPI.RefQualifier = FromEPI.RefQualifier; 1937 ToEPI.ExceptionSpec.Type = FromEPI.ExceptionSpec.Type; 1938 ToEPI.ExceptionSpec.Exceptions = ExceptionTypes; 1939 ToEPI.ExceptionSpec.NoexceptExpr = 1940 Importer.Import(FromEPI.ExceptionSpec.NoexceptExpr); 1941 ToEPI.ExceptionSpec.SourceDecl = cast_or_null<FunctionDecl>( 1942 Importer.Import(FromEPI.ExceptionSpec.SourceDecl)); 1943 ToEPI.ExceptionSpec.SourceTemplate = cast_or_null<FunctionDecl>( 1944 Importer.Import(FromEPI.ExceptionSpec.SourceTemplate)); 1945 1946 return Importer.getToContext().getFunctionType(ToResultType, ArgTypes, ToEPI); 1947 } 1948 1949 QualType ASTNodeImporter::VisitParenType(const ParenType *T) { 1950 QualType ToInnerType = Importer.Import(T->getInnerType()); 1951 if (ToInnerType.isNull()) 1952 return QualType(); 1953 1954 return Importer.getToContext().getParenType(ToInnerType); 1955 } 1956 1957 QualType ASTNodeImporter::VisitTypedefType(const TypedefType *T) { 1958 TypedefNameDecl *ToDecl 1959 = dyn_cast_or_null<TypedefNameDecl>(Importer.Import(T->getDecl())); 1960 if (!ToDecl) 1961 return QualType(); 1962 1963 return Importer.getToContext().getTypeDeclType(ToDecl); 1964 } 1965 1966 QualType ASTNodeImporter::VisitTypeOfExprType(const TypeOfExprType *T) { 1967 Expr *ToExpr = Importer.Import(T->getUnderlyingExpr()); 1968 if (!ToExpr) 1969 return QualType(); 1970 1971 return Importer.getToContext().getTypeOfExprType(ToExpr); 1972 } 1973 1974 QualType ASTNodeImporter::VisitTypeOfType(const TypeOfType *T) { 1975 QualType ToUnderlyingType = Importer.Import(T->getUnderlyingType()); 1976 if (ToUnderlyingType.isNull()) 1977 return QualType(); 1978 1979 return Importer.getToContext().getTypeOfType(ToUnderlyingType); 1980 } 1981 1982 QualType ASTNodeImporter::VisitDecltypeType(const DecltypeType *T) { 1983 // FIXME: Make sure that the "to" context supports C++0x! 1984 Expr *ToExpr = Importer.Import(T->getUnderlyingExpr()); 1985 if (!ToExpr) 1986 return QualType(); 1987 1988 QualType UnderlyingType = Importer.Import(T->getUnderlyingType()); 1989 if (UnderlyingType.isNull()) 1990 return QualType(); 1991 1992 return Importer.getToContext().getDecltypeType(ToExpr, UnderlyingType); 1993 } 1994 1995 QualType ASTNodeImporter::VisitUnaryTransformType(const UnaryTransformType *T) { 1996 QualType ToBaseType = Importer.Import(T->getBaseType()); 1997 QualType ToUnderlyingType = Importer.Import(T->getUnderlyingType()); 1998 if (ToBaseType.isNull() || ToUnderlyingType.isNull()) 1999 return QualType(); 2000 2001 return Importer.getToContext().getUnaryTransformType(ToBaseType, 2002 ToUnderlyingType, 2003 T->getUTTKind()); 2004 } 2005 2006 QualType ASTNodeImporter::VisitAutoType(const AutoType *T) { 2007 // FIXME: Make sure that the "to" context supports C++11! 2008 QualType FromDeduced = T->getDeducedType(); 2009 QualType ToDeduced; 2010 if (!FromDeduced.isNull()) { 2011 ToDeduced = Importer.Import(FromDeduced); 2012 if (ToDeduced.isNull()) 2013 return QualType(); 2014 } 2015 2016 return Importer.getToContext().getAutoType(ToDeduced, T->getKeyword(), 2017 /*IsDependent*/false); 2018 } 2019 2020 QualType ASTNodeImporter::VisitInjectedClassNameType( 2021 const InjectedClassNameType *T) { 2022 CXXRecordDecl *D = cast_or_null<CXXRecordDecl>(Importer.Import(T->getDecl())); 2023 if (!D) 2024 return QualType(); 2025 2026 QualType InjType = Importer.Import(T->getInjectedSpecializationType()); 2027 if (InjType.isNull()) 2028 return QualType(); 2029 2030 // FIXME: ASTContext::getInjectedClassNameType is not suitable for AST reading 2031 // See comments in InjectedClassNameType definition for details 2032 // return Importer.getToContext().getInjectedClassNameType(D, InjType); 2033 enum { 2034 TypeAlignmentInBits = 4, 2035 TypeAlignment = 1 << TypeAlignmentInBits 2036 }; 2037 2038 return QualType(new (Importer.getToContext(), TypeAlignment) 2039 InjectedClassNameType(D, InjType), 0); 2040 } 2041 2042 QualType ASTNodeImporter::VisitRecordType(const RecordType *T) { 2043 RecordDecl *ToDecl 2044 = dyn_cast_or_null<RecordDecl>(Importer.Import(T->getDecl())); 2045 if (!ToDecl) 2046 return QualType(); 2047 2048 return Importer.getToContext().getTagDeclType(ToDecl); 2049 } 2050 2051 QualType ASTNodeImporter::VisitEnumType(const EnumType *T) { 2052 EnumDecl *ToDecl 2053 = dyn_cast_or_null<EnumDecl>(Importer.Import(T->getDecl())); 2054 if (!ToDecl) 2055 return QualType(); 2056 2057 return Importer.getToContext().getTagDeclType(ToDecl); 2058 } 2059 2060 QualType ASTNodeImporter::VisitAttributedType(const AttributedType *T) { 2061 QualType FromModifiedType = T->getModifiedType(); 2062 QualType FromEquivalentType = T->getEquivalentType(); 2063 QualType ToModifiedType; 2064 QualType ToEquivalentType; 2065 2066 if (!FromModifiedType.isNull()) { 2067 ToModifiedType = Importer.Import(FromModifiedType); 2068 if (ToModifiedType.isNull()) 2069 return QualType(); 2070 } 2071 if (!FromEquivalentType.isNull()) { 2072 ToEquivalentType = Importer.Import(FromEquivalentType); 2073 if (ToEquivalentType.isNull()) 2074 return QualType(); 2075 } 2076 2077 return Importer.getToContext().getAttributedType(T->getAttrKind(), 2078 ToModifiedType, ToEquivalentType); 2079 } 2080 2081 2082 QualType ASTNodeImporter::VisitTemplateTypeParmType( 2083 const TemplateTypeParmType *T) { 2084 TemplateTypeParmDecl *ParmDecl = 2085 cast_or_null<TemplateTypeParmDecl>(Importer.Import(T->getDecl())); 2086 if (!ParmDecl && T->getDecl()) 2087 return QualType(); 2088 2089 return Importer.getToContext().getTemplateTypeParmType( 2090 T->getDepth(), T->getIndex(), T->isParameterPack(), ParmDecl); 2091 } 2092 2093 QualType ASTNodeImporter::VisitSubstTemplateTypeParmType( 2094 const SubstTemplateTypeParmType *T) { 2095 const TemplateTypeParmType *Replaced = 2096 cast_or_null<TemplateTypeParmType>(Importer.Import( 2097 QualType(T->getReplacedParameter(), 0)).getTypePtr()); 2098 if (!Replaced) 2099 return QualType(); 2100 2101 QualType Replacement = Importer.Import(T->getReplacementType()); 2102 if (Replacement.isNull()) 2103 return QualType(); 2104 Replacement = Replacement.getCanonicalType(); 2105 2106 return Importer.getToContext().getSubstTemplateTypeParmType( 2107 Replaced, Replacement); 2108 } 2109 2110 QualType ASTNodeImporter::VisitTemplateSpecializationType( 2111 const TemplateSpecializationType *T) { 2112 TemplateName ToTemplate = Importer.Import(T->getTemplateName()); 2113 if (ToTemplate.isNull()) 2114 return QualType(); 2115 2116 SmallVector<TemplateArgument, 2> ToTemplateArgs; 2117 if (ImportTemplateArguments(T->getArgs(), T->getNumArgs(), ToTemplateArgs)) 2118 return QualType(); 2119 2120 QualType ToCanonType; 2121 if (!QualType(T, 0).isCanonical()) { 2122 QualType FromCanonType 2123 = Importer.getFromContext().getCanonicalType(QualType(T, 0)); 2124 ToCanonType =Importer.Import(FromCanonType); 2125 if (ToCanonType.isNull()) 2126 return QualType(); 2127 } 2128 return Importer.getToContext().getTemplateSpecializationType(ToTemplate, 2129 ToTemplateArgs, 2130 ToCanonType); 2131 } 2132 2133 QualType ASTNodeImporter::VisitElaboratedType(const ElaboratedType *T) { 2134 NestedNameSpecifier *ToQualifier = nullptr; 2135 // Note: the qualifier in an ElaboratedType is optional. 2136 if (T->getQualifier()) { 2137 ToQualifier = Importer.Import(T->getQualifier()); 2138 if (!ToQualifier) 2139 return QualType(); 2140 } 2141 2142 QualType ToNamedType = Importer.Import(T->getNamedType()); 2143 if (ToNamedType.isNull()) 2144 return QualType(); 2145 2146 return Importer.getToContext().getElaboratedType(T->getKeyword(), 2147 ToQualifier, ToNamedType); 2148 } 2149 2150 QualType ASTNodeImporter::VisitObjCInterfaceType(const ObjCInterfaceType *T) { 2151 ObjCInterfaceDecl *Class 2152 = dyn_cast_or_null<ObjCInterfaceDecl>(Importer.Import(T->getDecl())); 2153 if (!Class) 2154 return QualType(); 2155 2156 return Importer.getToContext().getObjCInterfaceType(Class); 2157 } 2158 2159 QualType ASTNodeImporter::VisitObjCObjectType(const ObjCObjectType *T) { 2160 QualType ToBaseType = Importer.Import(T->getBaseType()); 2161 if (ToBaseType.isNull()) 2162 return QualType(); 2163 2164 SmallVector<QualType, 4> TypeArgs; 2165 for (auto TypeArg : T->getTypeArgsAsWritten()) { 2166 QualType ImportedTypeArg = Importer.Import(TypeArg); 2167 if (ImportedTypeArg.isNull()) 2168 return QualType(); 2169 2170 TypeArgs.push_back(ImportedTypeArg); 2171 } 2172 2173 SmallVector<ObjCProtocolDecl *, 4> Protocols; 2174 for (auto *P : T->quals()) { 2175 ObjCProtocolDecl *Protocol 2176 = dyn_cast_or_null<ObjCProtocolDecl>(Importer.Import(P)); 2177 if (!Protocol) 2178 return QualType(); 2179 Protocols.push_back(Protocol); 2180 } 2181 2182 return Importer.getToContext().getObjCObjectType(ToBaseType, TypeArgs, 2183 Protocols, 2184 T->isKindOfTypeAsWritten()); 2185 } 2186 2187 QualType 2188 ASTNodeImporter::VisitObjCObjectPointerType(const ObjCObjectPointerType *T) { 2189 QualType ToPointeeType = Importer.Import(T->getPointeeType()); 2190 if (ToPointeeType.isNull()) 2191 return QualType(); 2192 2193 return Importer.getToContext().getObjCObjectPointerType(ToPointeeType); 2194 } 2195 2196 //---------------------------------------------------------------------------- 2197 // Import Declarations 2198 //---------------------------------------------------------------------------- 2199 bool ASTNodeImporter::ImportDeclParts(NamedDecl *D, DeclContext *&DC, 2200 DeclContext *&LexicalDC, 2201 DeclarationName &Name, 2202 NamedDecl *&ToD, 2203 SourceLocation &Loc) { 2204 // Import the context of this declaration. 2205 DC = Importer.ImportContext(D->getDeclContext()); 2206 if (!DC) 2207 return true; 2208 2209 LexicalDC = DC; 2210 if (D->getDeclContext() != D->getLexicalDeclContext()) { 2211 LexicalDC = Importer.ImportContext(D->getLexicalDeclContext()); 2212 if (!LexicalDC) 2213 return true; 2214 } 2215 2216 // Import the name of this declaration. 2217 Name = Importer.Import(D->getDeclName()); 2218 if (D->getDeclName() && !Name) 2219 return true; 2220 2221 // Import the location of this declaration. 2222 Loc = Importer.Import(D->getLocation()); 2223 ToD = cast_or_null<NamedDecl>(Importer.GetAlreadyImportedOrNull(D)); 2224 return false; 2225 } 2226 2227 void ASTNodeImporter::ImportDefinitionIfNeeded(Decl *FromD, Decl *ToD) { 2228 if (!FromD) 2229 return; 2230 2231 if (!ToD) { 2232 ToD = Importer.Import(FromD); 2233 if (!ToD) 2234 return; 2235 } 2236 2237 if (RecordDecl *FromRecord = dyn_cast<RecordDecl>(FromD)) { 2238 if (RecordDecl *ToRecord = cast_or_null<RecordDecl>(ToD)) { 2239 if (FromRecord->getDefinition() && FromRecord->isCompleteDefinition() && !ToRecord->getDefinition()) { 2240 ImportDefinition(FromRecord, ToRecord); 2241 } 2242 } 2243 return; 2244 } 2245 2246 if (EnumDecl *FromEnum = dyn_cast<EnumDecl>(FromD)) { 2247 if (EnumDecl *ToEnum = cast_or_null<EnumDecl>(ToD)) { 2248 if (FromEnum->getDefinition() && !ToEnum->getDefinition()) { 2249 ImportDefinition(FromEnum, ToEnum); 2250 } 2251 } 2252 return; 2253 } 2254 } 2255 2256 void 2257 ASTNodeImporter::ImportDeclarationNameLoc(const DeclarationNameInfo &From, 2258 DeclarationNameInfo& To) { 2259 // NOTE: To.Name and To.Loc are already imported. 2260 // We only have to import To.LocInfo. 2261 switch (To.getName().getNameKind()) { 2262 case DeclarationName::Identifier: 2263 case DeclarationName::ObjCZeroArgSelector: 2264 case DeclarationName::ObjCOneArgSelector: 2265 case DeclarationName::ObjCMultiArgSelector: 2266 case DeclarationName::CXXUsingDirective: 2267 case DeclarationName::CXXDeductionGuideName: 2268 return; 2269 2270 case DeclarationName::CXXOperatorName: { 2271 SourceRange Range = From.getCXXOperatorNameRange(); 2272 To.setCXXOperatorNameRange(Importer.Import(Range)); 2273 return; 2274 } 2275 case DeclarationName::CXXLiteralOperatorName: { 2276 SourceLocation Loc = From.getCXXLiteralOperatorNameLoc(); 2277 To.setCXXLiteralOperatorNameLoc(Importer.Import(Loc)); 2278 return; 2279 } 2280 case DeclarationName::CXXConstructorName: 2281 case DeclarationName::CXXDestructorName: 2282 case DeclarationName::CXXConversionFunctionName: { 2283 TypeSourceInfo *FromTInfo = From.getNamedTypeInfo(); 2284 To.setNamedTypeInfo(Importer.Import(FromTInfo)); 2285 return; 2286 } 2287 } 2288 llvm_unreachable("Unknown name kind."); 2289 } 2290 2291 void ASTNodeImporter::ImportDeclContext(DeclContext *FromDC, bool ForceImport) { 2292 if (Importer.isMinimalImport() && !ForceImport) { 2293 Importer.ImportContext(FromDC); 2294 return; 2295 } 2296 2297 for (auto *From : FromDC->decls()) 2298 Importer.Import(From); 2299 } 2300 2301 bool ASTNodeImporter::ImportDefinition(RecordDecl *From, RecordDecl *To, 2302 ImportDefinitionKind Kind) { 2303 if (To->getDefinition() || To->isBeingDefined()) { 2304 if (Kind == IDK_Everything) 2305 ImportDeclContext(From, /*ForceImport=*/true); 2306 2307 return false; 2308 } 2309 2310 To->startDefinition(); 2311 2312 // Add base classes. 2313 if (CXXRecordDecl *ToCXX = dyn_cast<CXXRecordDecl>(To)) { 2314 CXXRecordDecl *FromCXX = cast<CXXRecordDecl>(From); 2315 2316 struct CXXRecordDecl::DefinitionData &ToData = ToCXX->data(); 2317 struct CXXRecordDecl::DefinitionData &FromData = FromCXX->data(); 2318 ToData.UserDeclaredConstructor = FromData.UserDeclaredConstructor; 2319 ToData.UserDeclaredSpecialMembers = FromData.UserDeclaredSpecialMembers; 2320 ToData.Aggregate = FromData.Aggregate; 2321 ToData.PlainOldData = FromData.PlainOldData; 2322 ToData.Empty = FromData.Empty; 2323 ToData.Polymorphic = FromData.Polymorphic; 2324 ToData.Abstract = FromData.Abstract; 2325 ToData.IsStandardLayout = FromData.IsStandardLayout; 2326 ToData.HasNoNonEmptyBases = FromData.HasNoNonEmptyBases; 2327 ToData.HasPrivateFields = FromData.HasPrivateFields; 2328 ToData.HasProtectedFields = FromData.HasProtectedFields; 2329 ToData.HasPublicFields = FromData.HasPublicFields; 2330 ToData.HasMutableFields = FromData.HasMutableFields; 2331 ToData.HasVariantMembers = FromData.HasVariantMembers; 2332 ToData.HasOnlyCMembers = FromData.HasOnlyCMembers; 2333 ToData.HasInClassInitializer = FromData.HasInClassInitializer; 2334 ToData.HasUninitializedReferenceMember 2335 = FromData.HasUninitializedReferenceMember; 2336 ToData.HasUninitializedFields = FromData.HasUninitializedFields; 2337 ToData.HasInheritedConstructor = FromData.HasInheritedConstructor; 2338 ToData.HasInheritedAssignment = FromData.HasInheritedAssignment; 2339 ToData.NeedOverloadResolutionForMoveConstructor 2340 = FromData.NeedOverloadResolutionForMoveConstructor; 2341 ToData.NeedOverloadResolutionForMoveAssignment 2342 = FromData.NeedOverloadResolutionForMoveAssignment; 2343 ToData.NeedOverloadResolutionForDestructor 2344 = FromData.NeedOverloadResolutionForDestructor; 2345 ToData.DefaultedMoveConstructorIsDeleted 2346 = FromData.DefaultedMoveConstructorIsDeleted; 2347 ToData.DefaultedMoveAssignmentIsDeleted 2348 = FromData.DefaultedMoveAssignmentIsDeleted; 2349 ToData.DefaultedDestructorIsDeleted = FromData.DefaultedDestructorIsDeleted; 2350 ToData.HasTrivialSpecialMembers = FromData.HasTrivialSpecialMembers; 2351 ToData.HasIrrelevantDestructor = FromData.HasIrrelevantDestructor; 2352 ToData.HasConstexprNonCopyMoveConstructor 2353 = FromData.HasConstexprNonCopyMoveConstructor; 2354 ToData.HasDefaultedDefaultConstructor 2355 = FromData.HasDefaultedDefaultConstructor; 2356 ToData.DefaultedDefaultConstructorIsConstexpr 2357 = FromData.DefaultedDefaultConstructorIsConstexpr; 2358 ToData.HasConstexprDefaultConstructor 2359 = FromData.HasConstexprDefaultConstructor; 2360 ToData.HasNonLiteralTypeFieldsOrBases 2361 = FromData.HasNonLiteralTypeFieldsOrBases; 2362 // ComputedVisibleConversions not imported. 2363 ToData.UserProvidedDefaultConstructor 2364 = FromData.UserProvidedDefaultConstructor; 2365 ToData.DeclaredSpecialMembers = FromData.DeclaredSpecialMembers; 2366 ToData.ImplicitCopyConstructorCanHaveConstParamForVBase 2367 = FromData.ImplicitCopyConstructorCanHaveConstParamForVBase; 2368 ToData.ImplicitCopyConstructorCanHaveConstParamForNonVBase 2369 = FromData.ImplicitCopyConstructorCanHaveConstParamForNonVBase; 2370 ToData.ImplicitCopyAssignmentHasConstParam 2371 = FromData.ImplicitCopyAssignmentHasConstParam; 2372 ToData.HasDeclaredCopyConstructorWithConstParam 2373 = FromData.HasDeclaredCopyConstructorWithConstParam; 2374 ToData.HasDeclaredCopyAssignmentWithConstParam 2375 = FromData.HasDeclaredCopyAssignmentWithConstParam; 2376 ToData.IsLambda = FromData.IsLambda; 2377 2378 SmallVector<CXXBaseSpecifier *, 4> Bases; 2379 for (const auto &Base1 : FromCXX->bases()) { 2380 QualType T = Importer.Import(Base1.getType()); 2381 if (T.isNull()) 2382 return true; 2383 2384 SourceLocation EllipsisLoc; 2385 if (Base1.isPackExpansion()) 2386 EllipsisLoc = Importer.Import(Base1.getEllipsisLoc()); 2387 2388 // Ensure that we have a definition for the base. 2389 ImportDefinitionIfNeeded(Base1.getType()->getAsCXXRecordDecl()); 2390 2391 Bases.push_back( 2392 new (Importer.getToContext()) 2393 CXXBaseSpecifier(Importer.Import(Base1.getSourceRange()), 2394 Base1.isVirtual(), 2395 Base1.isBaseOfClass(), 2396 Base1.getAccessSpecifierAsWritten(), 2397 Importer.Import(Base1.getTypeSourceInfo()), 2398 EllipsisLoc)); 2399 } 2400 if (!Bases.empty()) 2401 ToCXX->setBases(Bases.data(), Bases.size()); 2402 } 2403 2404 if (shouldForceImportDeclContext(Kind)) 2405 ImportDeclContext(From, /*ForceImport=*/true); 2406 2407 To->completeDefinition(); 2408 return false; 2409 } 2410 2411 bool ASTNodeImporter::ImportDefinition(VarDecl *From, VarDecl *To, 2412 ImportDefinitionKind Kind) { 2413 if (To->getAnyInitializer()) 2414 return false; 2415 2416 // FIXME: Can we really import any initializer? Alternatively, we could force 2417 // ourselves to import every declaration of a variable and then only use 2418 // getInit() here. 2419 To->setInit(Importer.Import(const_cast<Expr *>(From->getAnyInitializer()))); 2420 2421 // FIXME: Other bits to merge? 2422 2423 return false; 2424 } 2425 2426 bool ASTNodeImporter::ImportDefinition(EnumDecl *From, EnumDecl *To, 2427 ImportDefinitionKind Kind) { 2428 if (To->getDefinition() || To->isBeingDefined()) { 2429 if (Kind == IDK_Everything) 2430 ImportDeclContext(From, /*ForceImport=*/true); 2431 return false; 2432 } 2433 2434 To->startDefinition(); 2435 2436 QualType T = Importer.Import(Importer.getFromContext().getTypeDeclType(From)); 2437 if (T.isNull()) 2438 return true; 2439 2440 QualType ToPromotionType = Importer.Import(From->getPromotionType()); 2441 if (ToPromotionType.isNull()) 2442 return true; 2443 2444 if (shouldForceImportDeclContext(Kind)) 2445 ImportDeclContext(From, /*ForceImport=*/true); 2446 2447 // FIXME: we might need to merge the number of positive or negative bits 2448 // if the enumerator lists don't match. 2449 To->completeDefinition(T, ToPromotionType, 2450 From->getNumPositiveBits(), 2451 From->getNumNegativeBits()); 2452 return false; 2453 } 2454 2455 TemplateParameterList *ASTNodeImporter::ImportTemplateParameterList( 2456 TemplateParameterList *Params) { 2457 SmallVector<NamedDecl *, 4> ToParams(Params->size()); 2458 if (ImportContainerChecked(*Params, ToParams)) 2459 return nullptr; 2460 2461 Expr *ToRequiresClause; 2462 if (Expr *const R = Params->getRequiresClause()) { 2463 ToRequiresClause = Importer.Import(R); 2464 if (!ToRequiresClause) 2465 return nullptr; 2466 } else { 2467 ToRequiresClause = nullptr; 2468 } 2469 2470 return TemplateParameterList::Create(Importer.getToContext(), 2471 Importer.Import(Params->getTemplateLoc()), 2472 Importer.Import(Params->getLAngleLoc()), 2473 ToParams, 2474 Importer.Import(Params->getRAngleLoc()), 2475 ToRequiresClause); 2476 } 2477 2478 TemplateArgument 2479 ASTNodeImporter::ImportTemplateArgument(const TemplateArgument &From) { 2480 switch (From.getKind()) { 2481 case TemplateArgument::Null: 2482 return TemplateArgument(); 2483 2484 case TemplateArgument::Type: { 2485 QualType ToType = Importer.Import(From.getAsType()); 2486 if (ToType.isNull()) 2487 return TemplateArgument(); 2488 return TemplateArgument(ToType); 2489 } 2490 2491 case TemplateArgument::Integral: { 2492 QualType ToType = Importer.Import(From.getIntegralType()); 2493 if (ToType.isNull()) 2494 return TemplateArgument(); 2495 return TemplateArgument(From, ToType); 2496 } 2497 2498 case TemplateArgument::Declaration: { 2499 ValueDecl *To = cast_or_null<ValueDecl>(Importer.Import(From.getAsDecl())); 2500 QualType ToType = Importer.Import(From.getParamTypeForDecl()); 2501 if (!To || ToType.isNull()) 2502 return TemplateArgument(); 2503 return TemplateArgument(To, ToType); 2504 } 2505 2506 case TemplateArgument::NullPtr: { 2507 QualType ToType = Importer.Import(From.getNullPtrType()); 2508 if (ToType.isNull()) 2509 return TemplateArgument(); 2510 return TemplateArgument(ToType, /*isNullPtr*/true); 2511 } 2512 2513 case TemplateArgument::Template: { 2514 TemplateName ToTemplate = Importer.Import(From.getAsTemplate()); 2515 if (ToTemplate.isNull()) 2516 return TemplateArgument(); 2517 2518 return TemplateArgument(ToTemplate); 2519 } 2520 2521 case TemplateArgument::TemplateExpansion: { 2522 TemplateName ToTemplate 2523 = Importer.Import(From.getAsTemplateOrTemplatePattern()); 2524 if (ToTemplate.isNull()) 2525 return TemplateArgument(); 2526 2527 return TemplateArgument(ToTemplate, From.getNumTemplateExpansions()); 2528 } 2529 2530 case TemplateArgument::Expression: 2531 if (Expr *ToExpr = Importer.Import(From.getAsExpr())) 2532 return TemplateArgument(ToExpr); 2533 return TemplateArgument(); 2534 2535 case TemplateArgument::Pack: { 2536 SmallVector<TemplateArgument, 2> ToPack; 2537 ToPack.reserve(From.pack_size()); 2538 if (ImportTemplateArguments(From.pack_begin(), From.pack_size(), ToPack)) 2539 return TemplateArgument(); 2540 2541 return TemplateArgument( 2542 llvm::makeArrayRef(ToPack).copy(Importer.getToContext())); 2543 } 2544 } 2545 2546 llvm_unreachable("Invalid template argument kind"); 2547 } 2548 2549 TemplateArgumentLoc ASTNodeImporter::ImportTemplateArgumentLoc( 2550 const TemplateArgumentLoc &TALoc, bool &Error) { 2551 Error = false; 2552 TemplateArgument Arg = ImportTemplateArgument(TALoc.getArgument()); 2553 TemplateArgumentLocInfo FromInfo = TALoc.getLocInfo(); 2554 TemplateArgumentLocInfo ToInfo; 2555 if (Arg.getKind() == TemplateArgument::Expression) { 2556 Expr *E = Importer.Import(FromInfo.getAsExpr()); 2557 ToInfo = TemplateArgumentLocInfo(E); 2558 if (!E) 2559 Error = true; 2560 } else if (Arg.getKind() == TemplateArgument::Type) { 2561 if (TypeSourceInfo *TSI = Importer.Import(FromInfo.getAsTypeSourceInfo())) 2562 ToInfo = TemplateArgumentLocInfo(TSI); 2563 else 2564 Error = true; 2565 } else { 2566 ToInfo = TemplateArgumentLocInfo( 2567 Importer.Import(FromInfo.getTemplateQualifierLoc()), 2568 Importer.Import(FromInfo.getTemplateNameLoc()), 2569 Importer.Import(FromInfo.getTemplateEllipsisLoc())); 2570 } 2571 return TemplateArgumentLoc(Arg, ToInfo); 2572 } 2573 2574 bool ASTNodeImporter::ImportTemplateArguments(const TemplateArgument *FromArgs, 2575 unsigned NumFromArgs, 2576 SmallVectorImpl<TemplateArgument> &ToArgs) { 2577 for (unsigned I = 0; I != NumFromArgs; ++I) { 2578 TemplateArgument To = ImportTemplateArgument(FromArgs[I]); 2579 if (To.isNull() && !FromArgs[I].isNull()) 2580 return true; 2581 2582 ToArgs.push_back(To); 2583 } 2584 2585 return false; 2586 } 2587 2588 bool ASTNodeImporter::IsStructuralMatch(RecordDecl *FromRecord, 2589 RecordDecl *ToRecord, bool Complain) { 2590 // Eliminate a potential failure point where we attempt to re-import 2591 // something we're trying to import while completing ToRecord. 2592 Decl *ToOrigin = Importer.GetOriginalDecl(ToRecord); 2593 if (ToOrigin) { 2594 RecordDecl *ToOriginRecord = dyn_cast<RecordDecl>(ToOrigin); 2595 if (ToOriginRecord) 2596 ToRecord = ToOriginRecord; 2597 } 2598 2599 StructuralEquivalenceContext Ctx(Importer.getFromContext(), 2600 ToRecord->getASTContext(), 2601 Importer.getNonEquivalentDecls(), 2602 false, Complain); 2603 return Ctx.IsStructurallyEquivalent(FromRecord, ToRecord); 2604 } 2605 2606 bool ASTNodeImporter::IsStructuralMatch(VarDecl *FromVar, VarDecl *ToVar, 2607 bool Complain) { 2608 StructuralEquivalenceContext Ctx( 2609 Importer.getFromContext(), Importer.getToContext(), 2610 Importer.getNonEquivalentDecls(), false, Complain); 2611 return Ctx.IsStructurallyEquivalent(FromVar, ToVar); 2612 } 2613 2614 bool ASTNodeImporter::IsStructuralMatch(EnumDecl *FromEnum, EnumDecl *ToEnum) { 2615 StructuralEquivalenceContext Ctx(Importer.getFromContext(), 2616 Importer.getToContext(), 2617 Importer.getNonEquivalentDecls()); 2618 return Ctx.IsStructurallyEquivalent(FromEnum, ToEnum); 2619 } 2620 2621 bool ASTNodeImporter::IsStructuralMatch(EnumConstantDecl *FromEC, 2622 EnumConstantDecl *ToEC) 2623 { 2624 const llvm::APSInt &FromVal = FromEC->getInitVal(); 2625 const llvm::APSInt &ToVal = ToEC->getInitVal(); 2626 2627 return FromVal.isSigned() == ToVal.isSigned() && 2628 FromVal.getBitWidth() == ToVal.getBitWidth() && 2629 FromVal == ToVal; 2630 } 2631 2632 bool ASTNodeImporter::IsStructuralMatch(ClassTemplateDecl *From, 2633 ClassTemplateDecl *To) { 2634 StructuralEquivalenceContext Ctx(Importer.getFromContext(), 2635 Importer.getToContext(), 2636 Importer.getNonEquivalentDecls()); 2637 return Ctx.IsStructurallyEquivalent(From, To); 2638 } 2639 2640 bool ASTNodeImporter::IsStructuralMatch(VarTemplateDecl *From, 2641 VarTemplateDecl *To) { 2642 StructuralEquivalenceContext Ctx(Importer.getFromContext(), 2643 Importer.getToContext(), 2644 Importer.getNonEquivalentDecls()); 2645 return Ctx.IsStructurallyEquivalent(From, To); 2646 } 2647 2648 Decl *ASTNodeImporter::VisitDecl(Decl *D) { 2649 Importer.FromDiag(D->getLocation(), diag::err_unsupported_ast_node) 2650 << D->getDeclKindName(); 2651 return nullptr; 2652 } 2653 2654 Decl *ASTNodeImporter::VisitTranslationUnitDecl(TranslationUnitDecl *D) { 2655 TranslationUnitDecl *ToD = 2656 Importer.getToContext().getTranslationUnitDecl(); 2657 2658 Importer.Imported(D, ToD); 2659 2660 return ToD; 2661 } 2662 2663 Decl *ASTNodeImporter::VisitAccessSpecDecl(AccessSpecDecl *D) { 2664 2665 SourceLocation Loc = Importer.Import(D->getLocation()); 2666 SourceLocation ColonLoc = Importer.Import(D->getColonLoc()); 2667 2668 // Import the context of this declaration. 2669 DeclContext *DC = Importer.ImportContext(D->getDeclContext()); 2670 if (!DC) 2671 return nullptr; 2672 2673 AccessSpecDecl *accessSpecDecl 2674 = AccessSpecDecl::Create(Importer.getToContext(), D->getAccess(), 2675 DC, Loc, ColonLoc); 2676 2677 if (!accessSpecDecl) 2678 return nullptr; 2679 2680 // Lexical DeclContext and Semantic DeclContext 2681 // is always the same for the accessSpec. 2682 accessSpecDecl->setLexicalDeclContext(DC); 2683 DC->addDeclInternal(accessSpecDecl); 2684 2685 return accessSpecDecl; 2686 } 2687 2688 Decl *ASTNodeImporter::VisitStaticAssertDecl(StaticAssertDecl *D) { 2689 DeclContext *DC = Importer.ImportContext(D->getDeclContext()); 2690 if (!DC) 2691 return nullptr; 2692 2693 DeclContext *LexicalDC = DC; 2694 2695 // Import the location of this declaration. 2696 SourceLocation Loc = Importer.Import(D->getLocation()); 2697 2698 Expr *AssertExpr = Importer.Import(D->getAssertExpr()); 2699 if (!AssertExpr) 2700 return nullptr; 2701 2702 StringLiteral *FromMsg = D->getMessage(); 2703 StringLiteral *ToMsg = cast_or_null<StringLiteral>(Importer.Import(FromMsg)); 2704 if (!ToMsg && FromMsg) 2705 return nullptr; 2706 2707 StaticAssertDecl *ToD = StaticAssertDecl::Create( 2708 Importer.getToContext(), DC, Loc, AssertExpr, ToMsg, 2709 Importer.Import(D->getRParenLoc()), D->isFailed()); 2710 2711 ToD->setLexicalDeclContext(LexicalDC); 2712 LexicalDC->addDeclInternal(ToD); 2713 Importer.Imported(D, ToD); 2714 return ToD; 2715 } 2716 2717 Decl *ASTNodeImporter::VisitNamespaceDecl(NamespaceDecl *D) { 2718 // Import the major distinguishing characteristics of this namespace. 2719 DeclContext *DC, *LexicalDC; 2720 DeclarationName Name; 2721 SourceLocation Loc; 2722 NamedDecl *ToD; 2723 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 2724 return nullptr; 2725 if (ToD) 2726 return ToD; 2727 2728 NamespaceDecl *MergeWithNamespace = nullptr; 2729 if (!Name) { 2730 // This is an anonymous namespace. Adopt an existing anonymous 2731 // namespace if we can. 2732 // FIXME: Not testable. 2733 if (TranslationUnitDecl *TU = dyn_cast<TranslationUnitDecl>(DC)) 2734 MergeWithNamespace = TU->getAnonymousNamespace(); 2735 else 2736 MergeWithNamespace = cast<NamespaceDecl>(DC)->getAnonymousNamespace(); 2737 } else { 2738 SmallVector<NamedDecl *, 4> ConflictingDecls; 2739 SmallVector<NamedDecl *, 2> FoundDecls; 2740 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 2741 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 2742 if (!FoundDecls[I]->isInIdentifierNamespace(Decl::IDNS_Namespace)) 2743 continue; 2744 2745 if (NamespaceDecl *FoundNS = dyn_cast<NamespaceDecl>(FoundDecls[I])) { 2746 MergeWithNamespace = FoundNS; 2747 ConflictingDecls.clear(); 2748 break; 2749 } 2750 2751 ConflictingDecls.push_back(FoundDecls[I]); 2752 } 2753 2754 if (!ConflictingDecls.empty()) { 2755 Name = Importer.HandleNameConflict(Name, DC, Decl::IDNS_Namespace, 2756 ConflictingDecls.data(), 2757 ConflictingDecls.size()); 2758 } 2759 } 2760 2761 // Create the "to" namespace, if needed. 2762 NamespaceDecl *ToNamespace = MergeWithNamespace; 2763 if (!ToNamespace) { 2764 ToNamespace = NamespaceDecl::Create(Importer.getToContext(), DC, 2765 D->isInline(), 2766 Importer.Import(D->getLocStart()), 2767 Loc, Name.getAsIdentifierInfo(), 2768 /*PrevDecl=*/nullptr); 2769 ToNamespace->setLexicalDeclContext(LexicalDC); 2770 LexicalDC->addDeclInternal(ToNamespace); 2771 2772 // If this is an anonymous namespace, register it as the anonymous 2773 // namespace within its context. 2774 if (!Name) { 2775 if (TranslationUnitDecl *TU = dyn_cast<TranslationUnitDecl>(DC)) 2776 TU->setAnonymousNamespace(ToNamespace); 2777 else 2778 cast<NamespaceDecl>(DC)->setAnonymousNamespace(ToNamespace); 2779 } 2780 } 2781 Importer.Imported(D, ToNamespace); 2782 2783 ImportDeclContext(D); 2784 2785 return ToNamespace; 2786 } 2787 2788 Decl *ASTNodeImporter::VisitTypedefNameDecl(TypedefNameDecl *D, bool IsAlias) { 2789 // Import the major distinguishing characteristics of this typedef. 2790 DeclContext *DC, *LexicalDC; 2791 DeclarationName Name; 2792 SourceLocation Loc; 2793 NamedDecl *ToD; 2794 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 2795 return nullptr; 2796 if (ToD) 2797 return ToD; 2798 2799 // If this typedef is not in block scope, determine whether we've 2800 // seen a typedef with the same name (that we can merge with) or any 2801 // other entity by that name (which name lookup could conflict with). 2802 if (!DC->isFunctionOrMethod()) { 2803 SmallVector<NamedDecl *, 4> ConflictingDecls; 2804 unsigned IDNS = Decl::IDNS_Ordinary; 2805 SmallVector<NamedDecl *, 2> FoundDecls; 2806 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 2807 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 2808 if (!FoundDecls[I]->isInIdentifierNamespace(IDNS)) 2809 continue; 2810 if (TypedefNameDecl *FoundTypedef = 2811 dyn_cast<TypedefNameDecl>(FoundDecls[I])) { 2812 if (Importer.IsStructurallyEquivalent(D->getUnderlyingType(), 2813 FoundTypedef->getUnderlyingType())) 2814 return Importer.Imported(D, FoundTypedef); 2815 } 2816 2817 ConflictingDecls.push_back(FoundDecls[I]); 2818 } 2819 2820 if (!ConflictingDecls.empty()) { 2821 Name = Importer.HandleNameConflict(Name, DC, IDNS, 2822 ConflictingDecls.data(), 2823 ConflictingDecls.size()); 2824 if (!Name) 2825 return nullptr; 2826 } 2827 } 2828 2829 // Import the underlying type of this typedef; 2830 QualType T = Importer.Import(D->getUnderlyingType()); 2831 if (T.isNull()) 2832 return nullptr; 2833 2834 // Create the new typedef node. 2835 TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo()); 2836 SourceLocation StartL = Importer.Import(D->getLocStart()); 2837 TypedefNameDecl *ToTypedef; 2838 if (IsAlias) 2839 ToTypedef = TypeAliasDecl::Create(Importer.getToContext(), DC, 2840 StartL, Loc, 2841 Name.getAsIdentifierInfo(), 2842 TInfo); 2843 else 2844 ToTypedef = TypedefDecl::Create(Importer.getToContext(), DC, 2845 StartL, Loc, 2846 Name.getAsIdentifierInfo(), 2847 TInfo); 2848 2849 ToTypedef->setAccess(D->getAccess()); 2850 ToTypedef->setLexicalDeclContext(LexicalDC); 2851 Importer.Imported(D, ToTypedef); 2852 LexicalDC->addDeclInternal(ToTypedef); 2853 2854 return ToTypedef; 2855 } 2856 2857 Decl *ASTNodeImporter::VisitTypedefDecl(TypedefDecl *D) { 2858 return VisitTypedefNameDecl(D, /*IsAlias=*/false); 2859 } 2860 2861 Decl *ASTNodeImporter::VisitTypeAliasDecl(TypeAliasDecl *D) { 2862 return VisitTypedefNameDecl(D, /*IsAlias=*/true); 2863 } 2864 2865 Decl *ASTNodeImporter::VisitLabelDecl(LabelDecl *D) { 2866 // Import the major distinguishing characteristics of this label. 2867 DeclContext *DC, *LexicalDC; 2868 DeclarationName Name; 2869 SourceLocation Loc; 2870 NamedDecl *ToD; 2871 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 2872 return nullptr; 2873 if (ToD) 2874 return ToD; 2875 2876 assert(LexicalDC->isFunctionOrMethod()); 2877 2878 LabelDecl *ToLabel = D->isGnuLocal() 2879 ? LabelDecl::Create(Importer.getToContext(), 2880 DC, Importer.Import(D->getLocation()), 2881 Name.getAsIdentifierInfo(), 2882 Importer.Import(D->getLocStart())) 2883 : LabelDecl::Create(Importer.getToContext(), 2884 DC, Importer.Import(D->getLocation()), 2885 Name.getAsIdentifierInfo()); 2886 Importer.Imported(D, ToLabel); 2887 2888 LabelStmt *Label = cast_or_null<LabelStmt>(Importer.Import(D->getStmt())); 2889 if (!Label) 2890 return nullptr; 2891 2892 ToLabel->setStmt(Label); 2893 ToLabel->setLexicalDeclContext(LexicalDC); 2894 LexicalDC->addDeclInternal(ToLabel); 2895 return ToLabel; 2896 } 2897 2898 Decl *ASTNodeImporter::VisitEnumDecl(EnumDecl *D) { 2899 // Import the major distinguishing characteristics of this enum. 2900 DeclContext *DC, *LexicalDC; 2901 DeclarationName Name; 2902 SourceLocation Loc; 2903 NamedDecl *ToD; 2904 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 2905 return nullptr; 2906 if (ToD) 2907 return ToD; 2908 2909 // Figure out what enum name we're looking for. 2910 unsigned IDNS = Decl::IDNS_Tag; 2911 DeclarationName SearchName = Name; 2912 if (!SearchName && D->getTypedefNameForAnonDecl()) { 2913 SearchName = Importer.Import(D->getTypedefNameForAnonDecl()->getDeclName()); 2914 IDNS = Decl::IDNS_Ordinary; 2915 } else if (Importer.getToContext().getLangOpts().CPlusPlus) 2916 IDNS |= Decl::IDNS_Ordinary; 2917 2918 // We may already have an enum of the same name; try to find and match it. 2919 if (!DC->isFunctionOrMethod() && SearchName) { 2920 SmallVector<NamedDecl *, 4> ConflictingDecls; 2921 SmallVector<NamedDecl *, 2> FoundDecls; 2922 DC->getRedeclContext()->localUncachedLookup(SearchName, FoundDecls); 2923 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 2924 if (!FoundDecls[I]->isInIdentifierNamespace(IDNS)) 2925 continue; 2926 2927 Decl *Found = FoundDecls[I]; 2928 if (TypedefNameDecl *Typedef = dyn_cast<TypedefNameDecl>(Found)) { 2929 if (const TagType *Tag = Typedef->getUnderlyingType()->getAs<TagType>()) 2930 Found = Tag->getDecl(); 2931 } 2932 2933 if (EnumDecl *FoundEnum = dyn_cast<EnumDecl>(Found)) { 2934 if (IsStructuralMatch(D, FoundEnum)) 2935 return Importer.Imported(D, FoundEnum); 2936 } 2937 2938 ConflictingDecls.push_back(FoundDecls[I]); 2939 } 2940 2941 if (!ConflictingDecls.empty()) { 2942 Name = Importer.HandleNameConflict(Name, DC, IDNS, 2943 ConflictingDecls.data(), 2944 ConflictingDecls.size()); 2945 } 2946 } 2947 2948 // Create the enum declaration. 2949 EnumDecl *D2 = EnumDecl::Create(Importer.getToContext(), DC, 2950 Importer.Import(D->getLocStart()), 2951 Loc, Name.getAsIdentifierInfo(), nullptr, 2952 D->isScoped(), D->isScopedUsingClassTag(), 2953 D->isFixed()); 2954 // Import the qualifier, if any. 2955 D2->setQualifierInfo(Importer.Import(D->getQualifierLoc())); 2956 D2->setAccess(D->getAccess()); 2957 D2->setLexicalDeclContext(LexicalDC); 2958 Importer.Imported(D, D2); 2959 LexicalDC->addDeclInternal(D2); 2960 2961 // Import the integer type. 2962 QualType ToIntegerType = Importer.Import(D->getIntegerType()); 2963 if (ToIntegerType.isNull()) 2964 return nullptr; 2965 D2->setIntegerType(ToIntegerType); 2966 2967 // Import the definition 2968 if (D->isCompleteDefinition() && ImportDefinition(D, D2)) 2969 return nullptr; 2970 2971 return D2; 2972 } 2973 2974 Decl *ASTNodeImporter::VisitRecordDecl(RecordDecl *D) { 2975 // If this record has a definition in the translation unit we're coming from, 2976 // but this particular declaration is not that definition, import the 2977 // definition and map to that. 2978 TagDecl *Definition = D->getDefinition(); 2979 if (Definition && Definition != D) { 2980 Decl *ImportedDef = Importer.Import(Definition); 2981 if (!ImportedDef) 2982 return nullptr; 2983 2984 return Importer.Imported(D, ImportedDef); 2985 } 2986 2987 // Import the major distinguishing characteristics of this record. 2988 DeclContext *DC, *LexicalDC; 2989 DeclarationName Name; 2990 SourceLocation Loc; 2991 NamedDecl *ToD; 2992 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 2993 return nullptr; 2994 if (ToD) 2995 return ToD; 2996 2997 // Figure out what structure name we're looking for. 2998 unsigned IDNS = Decl::IDNS_Tag; 2999 DeclarationName SearchName = Name; 3000 if (!SearchName && D->getTypedefNameForAnonDecl()) { 3001 SearchName = Importer.Import(D->getTypedefNameForAnonDecl()->getDeclName()); 3002 IDNS = Decl::IDNS_Ordinary; 3003 } else if (Importer.getToContext().getLangOpts().CPlusPlus) 3004 IDNS |= Decl::IDNS_Ordinary; 3005 3006 // We may already have a record of the same name; try to find and match it. 3007 RecordDecl *AdoptDecl = nullptr; 3008 if (!DC->isFunctionOrMethod()) { 3009 SmallVector<NamedDecl *, 4> ConflictingDecls; 3010 SmallVector<NamedDecl *, 2> FoundDecls; 3011 DC->getRedeclContext()->localUncachedLookup(SearchName, FoundDecls); 3012 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 3013 if (!FoundDecls[I]->isInIdentifierNamespace(IDNS)) 3014 continue; 3015 3016 Decl *Found = FoundDecls[I]; 3017 if (TypedefNameDecl *Typedef = dyn_cast<TypedefNameDecl>(Found)) { 3018 if (const TagType *Tag = Typedef->getUnderlyingType()->getAs<TagType>()) 3019 Found = Tag->getDecl(); 3020 } 3021 3022 if (RecordDecl *FoundRecord = dyn_cast<RecordDecl>(Found)) { 3023 if (D->isAnonymousStructOrUnion() && 3024 FoundRecord->isAnonymousStructOrUnion()) { 3025 // If both anonymous structs/unions are in a record context, make sure 3026 // they occur in the same location in the context records. 3027 if (Optional<unsigned> Index1 3028 = findUntaggedStructOrUnionIndex(D)) { 3029 if (Optional<unsigned> Index2 = 3030 findUntaggedStructOrUnionIndex(FoundRecord)) { 3031 if (*Index1 != *Index2) 3032 continue; 3033 } 3034 } 3035 } 3036 3037 if (RecordDecl *FoundDef = FoundRecord->getDefinition()) { 3038 if ((SearchName && !D->isCompleteDefinition()) 3039 || (D->isCompleteDefinition() && 3040 D->isAnonymousStructOrUnion() 3041 == FoundDef->isAnonymousStructOrUnion() && 3042 IsStructuralMatch(D, FoundDef))) { 3043 // The record types structurally match, or the "from" translation 3044 // unit only had a forward declaration anyway; call it the same 3045 // function. 3046 // FIXME: For C++, we should also merge methods here. 3047 return Importer.Imported(D, FoundDef); 3048 } 3049 } else if (!D->isCompleteDefinition()) { 3050 // We have a forward declaration of this type, so adopt that forward 3051 // declaration rather than building a new one. 3052 3053 // If one or both can be completed from external storage then try one 3054 // last time to complete and compare them before doing this. 3055 3056 if (FoundRecord->hasExternalLexicalStorage() && 3057 !FoundRecord->isCompleteDefinition()) 3058 FoundRecord->getASTContext().getExternalSource()->CompleteType(FoundRecord); 3059 if (D->hasExternalLexicalStorage()) 3060 D->getASTContext().getExternalSource()->CompleteType(D); 3061 3062 if (FoundRecord->isCompleteDefinition() && 3063 D->isCompleteDefinition() && 3064 !IsStructuralMatch(D, FoundRecord)) 3065 continue; 3066 3067 AdoptDecl = FoundRecord; 3068 continue; 3069 } else if (!SearchName) { 3070 continue; 3071 } 3072 } 3073 3074 ConflictingDecls.push_back(FoundDecls[I]); 3075 } 3076 3077 if (!ConflictingDecls.empty() && SearchName) { 3078 Name = Importer.HandleNameConflict(Name, DC, IDNS, 3079 ConflictingDecls.data(), 3080 ConflictingDecls.size()); 3081 } 3082 } 3083 3084 // Create the record declaration. 3085 RecordDecl *D2 = AdoptDecl; 3086 SourceLocation StartLoc = Importer.Import(D->getLocStart()); 3087 if (!D2) { 3088 CXXRecordDecl *D2CXX = nullptr; 3089 if (CXXRecordDecl *DCXX = llvm::dyn_cast<CXXRecordDecl>(D)) { 3090 if (DCXX->isLambda()) { 3091 TypeSourceInfo *TInfo = Importer.Import(DCXX->getLambdaTypeInfo()); 3092 D2CXX = CXXRecordDecl::CreateLambda(Importer.getToContext(), 3093 DC, TInfo, Loc, 3094 DCXX->isDependentLambda(), 3095 DCXX->isGenericLambda(), 3096 DCXX->getLambdaCaptureDefault()); 3097 Decl *CDecl = Importer.Import(DCXX->getLambdaContextDecl()); 3098 if (DCXX->getLambdaContextDecl() && !CDecl) 3099 return nullptr; 3100 D2CXX->setLambdaMangling(DCXX->getLambdaManglingNumber(), CDecl); 3101 } else if (DCXX->isInjectedClassName()) { 3102 // We have to be careful to do a similar dance to the one in 3103 // Sema::ActOnStartCXXMemberDeclarations 3104 CXXRecordDecl *const PrevDecl = nullptr; 3105 const bool DelayTypeCreation = true; 3106 D2CXX = CXXRecordDecl::Create( 3107 Importer.getToContext(), D->getTagKind(), DC, StartLoc, Loc, 3108 Name.getAsIdentifierInfo(), PrevDecl, DelayTypeCreation); 3109 Importer.getToContext().getTypeDeclType( 3110 D2CXX, llvm::dyn_cast<CXXRecordDecl>(DC)); 3111 } else { 3112 D2CXX = CXXRecordDecl::Create(Importer.getToContext(), 3113 D->getTagKind(), 3114 DC, StartLoc, Loc, 3115 Name.getAsIdentifierInfo()); 3116 } 3117 D2 = D2CXX; 3118 D2->setAccess(D->getAccess()); 3119 } else { 3120 D2 = RecordDecl::Create(Importer.getToContext(), D->getTagKind(), 3121 DC, StartLoc, Loc, Name.getAsIdentifierInfo()); 3122 } 3123 3124 D2->setQualifierInfo(Importer.Import(D->getQualifierLoc())); 3125 D2->setLexicalDeclContext(LexicalDC); 3126 LexicalDC->addDeclInternal(D2); 3127 if (D->isAnonymousStructOrUnion()) 3128 D2->setAnonymousStructOrUnion(true); 3129 } 3130 3131 Importer.Imported(D, D2); 3132 3133 if (D->isCompleteDefinition() && ImportDefinition(D, D2, IDK_Default)) 3134 return nullptr; 3135 3136 return D2; 3137 } 3138 3139 Decl *ASTNodeImporter::VisitEnumConstantDecl(EnumConstantDecl *D) { 3140 // Import the major distinguishing characteristics of this enumerator. 3141 DeclContext *DC, *LexicalDC; 3142 DeclarationName Name; 3143 SourceLocation Loc; 3144 NamedDecl *ToD; 3145 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 3146 return nullptr; 3147 if (ToD) 3148 return ToD; 3149 3150 QualType T = Importer.Import(D->getType()); 3151 if (T.isNull()) 3152 return nullptr; 3153 3154 // Determine whether there are any other declarations with the same name and 3155 // in the same context. 3156 if (!LexicalDC->isFunctionOrMethod()) { 3157 SmallVector<NamedDecl *, 4> ConflictingDecls; 3158 unsigned IDNS = Decl::IDNS_Ordinary; 3159 SmallVector<NamedDecl *, 2> FoundDecls; 3160 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 3161 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 3162 if (!FoundDecls[I]->isInIdentifierNamespace(IDNS)) 3163 continue; 3164 3165 if (EnumConstantDecl *FoundEnumConstant 3166 = dyn_cast<EnumConstantDecl>(FoundDecls[I])) { 3167 if (IsStructuralMatch(D, FoundEnumConstant)) 3168 return Importer.Imported(D, FoundEnumConstant); 3169 } 3170 3171 ConflictingDecls.push_back(FoundDecls[I]); 3172 } 3173 3174 if (!ConflictingDecls.empty()) { 3175 Name = Importer.HandleNameConflict(Name, DC, IDNS, 3176 ConflictingDecls.data(), 3177 ConflictingDecls.size()); 3178 if (!Name) 3179 return nullptr; 3180 } 3181 } 3182 3183 Expr *Init = Importer.Import(D->getInitExpr()); 3184 if (D->getInitExpr() && !Init) 3185 return nullptr; 3186 3187 EnumConstantDecl *ToEnumerator 3188 = EnumConstantDecl::Create(Importer.getToContext(), cast<EnumDecl>(DC), Loc, 3189 Name.getAsIdentifierInfo(), T, 3190 Init, D->getInitVal()); 3191 ToEnumerator->setAccess(D->getAccess()); 3192 ToEnumerator->setLexicalDeclContext(LexicalDC); 3193 Importer.Imported(D, ToEnumerator); 3194 LexicalDC->addDeclInternal(ToEnumerator); 3195 return ToEnumerator; 3196 } 3197 3198 Decl *ASTNodeImporter::VisitFunctionDecl(FunctionDecl *D) { 3199 // Import the major distinguishing characteristics of this function. 3200 DeclContext *DC, *LexicalDC; 3201 DeclarationName Name; 3202 SourceLocation Loc; 3203 NamedDecl *ToD; 3204 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 3205 return nullptr; 3206 if (ToD) 3207 return ToD; 3208 3209 // Try to find a function in our own ("to") context with the same name, same 3210 // type, and in the same context as the function we're importing. 3211 if (!LexicalDC->isFunctionOrMethod()) { 3212 SmallVector<NamedDecl *, 4> ConflictingDecls; 3213 unsigned IDNS = Decl::IDNS_Ordinary; 3214 SmallVector<NamedDecl *, 2> FoundDecls; 3215 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 3216 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 3217 if (!FoundDecls[I]->isInIdentifierNamespace(IDNS)) 3218 continue; 3219 3220 if (FunctionDecl *FoundFunction = dyn_cast<FunctionDecl>(FoundDecls[I])) { 3221 if (FoundFunction->hasExternalFormalLinkage() && 3222 D->hasExternalFormalLinkage()) { 3223 if (Importer.IsStructurallyEquivalent(D->getType(), 3224 FoundFunction->getType())) { 3225 // FIXME: Actually try to merge the body and other attributes. 3226 return Importer.Imported(D, FoundFunction); 3227 } 3228 3229 // FIXME: Check for overloading more carefully, e.g., by boosting 3230 // Sema::IsOverload out to the AST library. 3231 3232 // Function overloading is okay in C++. 3233 if (Importer.getToContext().getLangOpts().CPlusPlus) 3234 continue; 3235 3236 // Complain about inconsistent function types. 3237 Importer.ToDiag(Loc, diag::err_odr_function_type_inconsistent) 3238 << Name << D->getType() << FoundFunction->getType(); 3239 Importer.ToDiag(FoundFunction->getLocation(), 3240 diag::note_odr_value_here) 3241 << FoundFunction->getType(); 3242 } 3243 } 3244 3245 ConflictingDecls.push_back(FoundDecls[I]); 3246 } 3247 3248 if (!ConflictingDecls.empty()) { 3249 Name = Importer.HandleNameConflict(Name, DC, IDNS, 3250 ConflictingDecls.data(), 3251 ConflictingDecls.size()); 3252 if (!Name) 3253 return nullptr; 3254 } 3255 } 3256 3257 DeclarationNameInfo NameInfo(Name, Loc); 3258 // Import additional name location/type info. 3259 ImportDeclarationNameLoc(D->getNameInfo(), NameInfo); 3260 3261 QualType FromTy = D->getType(); 3262 bool usedDifferentExceptionSpec = false; 3263 3264 if (const FunctionProtoType * 3265 FromFPT = D->getType()->getAs<FunctionProtoType>()) { 3266 FunctionProtoType::ExtProtoInfo FromEPI = FromFPT->getExtProtoInfo(); 3267 // FunctionProtoType::ExtProtoInfo's ExceptionSpecDecl can point to the 3268 // FunctionDecl that we are importing the FunctionProtoType for. 3269 // To avoid an infinite recursion when importing, create the FunctionDecl 3270 // with a simplified function type and update it afterwards. 3271 if (FromEPI.ExceptionSpec.SourceDecl || 3272 FromEPI.ExceptionSpec.SourceTemplate || 3273 FromEPI.ExceptionSpec.NoexceptExpr) { 3274 FunctionProtoType::ExtProtoInfo DefaultEPI; 3275 FromTy = Importer.getFromContext().getFunctionType( 3276 FromFPT->getReturnType(), FromFPT->getParamTypes(), DefaultEPI); 3277 usedDifferentExceptionSpec = true; 3278 } 3279 } 3280 3281 // Import the type. 3282 QualType T = Importer.Import(FromTy); 3283 if (T.isNull()) 3284 return nullptr; 3285 3286 // Import the function parameters. 3287 SmallVector<ParmVarDecl *, 8> Parameters; 3288 for (auto P : D->parameters()) { 3289 ParmVarDecl *ToP = cast_or_null<ParmVarDecl>(Importer.Import(P)); 3290 if (!ToP) 3291 return nullptr; 3292 3293 Parameters.push_back(ToP); 3294 } 3295 3296 // Create the imported function. 3297 TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo()); 3298 FunctionDecl *ToFunction = nullptr; 3299 SourceLocation InnerLocStart = Importer.Import(D->getInnerLocStart()); 3300 if (CXXConstructorDecl *FromConstructor = dyn_cast<CXXConstructorDecl>(D)) { 3301 ToFunction = CXXConstructorDecl::Create(Importer.getToContext(), 3302 cast<CXXRecordDecl>(DC), 3303 InnerLocStart, 3304 NameInfo, T, TInfo, 3305 FromConstructor->isExplicit(), 3306 D->isInlineSpecified(), 3307 D->isImplicit(), 3308 D->isConstexpr()); 3309 if (unsigned NumInitializers = FromConstructor->getNumCtorInitializers()) { 3310 SmallVector<CXXCtorInitializer *, 4> CtorInitializers; 3311 for (CXXCtorInitializer *I : FromConstructor->inits()) { 3312 CXXCtorInitializer *ToI = 3313 cast_or_null<CXXCtorInitializer>(Importer.Import(I)); 3314 if (!ToI && I) 3315 return nullptr; 3316 CtorInitializers.push_back(ToI); 3317 } 3318 CXXCtorInitializer **Memory = 3319 new (Importer.getToContext()) CXXCtorInitializer *[NumInitializers]; 3320 std::copy(CtorInitializers.begin(), CtorInitializers.end(), Memory); 3321 CXXConstructorDecl *ToCtor = llvm::cast<CXXConstructorDecl>(ToFunction); 3322 ToCtor->setCtorInitializers(Memory); 3323 ToCtor->setNumCtorInitializers(NumInitializers); 3324 } 3325 } else if (isa<CXXDestructorDecl>(D)) { 3326 ToFunction = CXXDestructorDecl::Create(Importer.getToContext(), 3327 cast<CXXRecordDecl>(DC), 3328 InnerLocStart, 3329 NameInfo, T, TInfo, 3330 D->isInlineSpecified(), 3331 D->isImplicit()); 3332 } else if (CXXConversionDecl *FromConversion 3333 = dyn_cast<CXXConversionDecl>(D)) { 3334 ToFunction = CXXConversionDecl::Create(Importer.getToContext(), 3335 cast<CXXRecordDecl>(DC), 3336 InnerLocStart, 3337 NameInfo, T, TInfo, 3338 D->isInlineSpecified(), 3339 FromConversion->isExplicit(), 3340 D->isConstexpr(), 3341 Importer.Import(D->getLocEnd())); 3342 } else if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(D)) { 3343 ToFunction = CXXMethodDecl::Create(Importer.getToContext(), 3344 cast<CXXRecordDecl>(DC), 3345 InnerLocStart, 3346 NameInfo, T, TInfo, 3347 Method->getStorageClass(), 3348 Method->isInlineSpecified(), 3349 D->isConstexpr(), 3350 Importer.Import(D->getLocEnd())); 3351 } else { 3352 ToFunction = FunctionDecl::Create(Importer.getToContext(), DC, 3353 InnerLocStart, 3354 NameInfo, T, TInfo, D->getStorageClass(), 3355 D->isInlineSpecified(), 3356 D->hasWrittenPrototype(), 3357 D->isConstexpr()); 3358 } 3359 3360 // Import the qualifier, if any. 3361 ToFunction->setQualifierInfo(Importer.Import(D->getQualifierLoc())); 3362 ToFunction->setAccess(D->getAccess()); 3363 ToFunction->setLexicalDeclContext(LexicalDC); 3364 ToFunction->setVirtualAsWritten(D->isVirtualAsWritten()); 3365 ToFunction->setTrivial(D->isTrivial()); 3366 ToFunction->setPure(D->isPure()); 3367 Importer.Imported(D, ToFunction); 3368 3369 // Set the parameters. 3370 for (unsigned I = 0, N = Parameters.size(); I != N; ++I) { 3371 Parameters[I]->setOwningFunction(ToFunction); 3372 ToFunction->addDeclInternal(Parameters[I]); 3373 } 3374 ToFunction->setParams(Parameters); 3375 3376 if (usedDifferentExceptionSpec) { 3377 // Update FunctionProtoType::ExtProtoInfo. 3378 QualType T = Importer.Import(D->getType()); 3379 if (T.isNull()) 3380 return nullptr; 3381 ToFunction->setType(T); 3382 } 3383 3384 // Import the body, if any. 3385 if (Stmt *FromBody = D->getBody()) { 3386 if (Stmt *ToBody = Importer.Import(FromBody)) { 3387 ToFunction->setBody(ToBody); 3388 } 3389 } 3390 3391 // FIXME: Other bits to merge? 3392 3393 // Add this function to the lexical context. 3394 LexicalDC->addDeclInternal(ToFunction); 3395 3396 return ToFunction; 3397 } 3398 3399 Decl *ASTNodeImporter::VisitCXXMethodDecl(CXXMethodDecl *D) { 3400 return VisitFunctionDecl(D); 3401 } 3402 3403 Decl *ASTNodeImporter::VisitCXXConstructorDecl(CXXConstructorDecl *D) { 3404 return VisitCXXMethodDecl(D); 3405 } 3406 3407 Decl *ASTNodeImporter::VisitCXXDestructorDecl(CXXDestructorDecl *D) { 3408 return VisitCXXMethodDecl(D); 3409 } 3410 3411 Decl *ASTNodeImporter::VisitCXXConversionDecl(CXXConversionDecl *D) { 3412 return VisitCXXMethodDecl(D); 3413 } 3414 3415 static unsigned getFieldIndex(Decl *F) { 3416 RecordDecl *Owner = dyn_cast<RecordDecl>(F->getDeclContext()); 3417 if (!Owner) 3418 return 0; 3419 3420 unsigned Index = 1; 3421 for (const auto *D : Owner->noload_decls()) { 3422 if (D == F) 3423 return Index; 3424 3425 if (isa<FieldDecl>(*D) || isa<IndirectFieldDecl>(*D)) 3426 ++Index; 3427 } 3428 3429 return Index; 3430 } 3431 3432 Decl *ASTNodeImporter::VisitFieldDecl(FieldDecl *D) { 3433 // Import the major distinguishing characteristics of a variable. 3434 DeclContext *DC, *LexicalDC; 3435 DeclarationName Name; 3436 SourceLocation Loc; 3437 NamedDecl *ToD; 3438 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 3439 return nullptr; 3440 if (ToD) 3441 return ToD; 3442 3443 // Determine whether we've already imported this field. 3444 SmallVector<NamedDecl *, 2> FoundDecls; 3445 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 3446 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 3447 if (FieldDecl *FoundField = dyn_cast<FieldDecl>(FoundDecls[I])) { 3448 // For anonymous fields, match up by index. 3449 if (!Name && getFieldIndex(D) != getFieldIndex(FoundField)) 3450 continue; 3451 3452 if (Importer.IsStructurallyEquivalent(D->getType(), 3453 FoundField->getType())) { 3454 Importer.Imported(D, FoundField); 3455 return FoundField; 3456 } 3457 3458 Importer.ToDiag(Loc, diag::err_odr_field_type_inconsistent) 3459 << Name << D->getType() << FoundField->getType(); 3460 Importer.ToDiag(FoundField->getLocation(), diag::note_odr_value_here) 3461 << FoundField->getType(); 3462 return nullptr; 3463 } 3464 } 3465 3466 // Import the type. 3467 QualType T = Importer.Import(D->getType()); 3468 if (T.isNull()) 3469 return nullptr; 3470 3471 TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo()); 3472 Expr *BitWidth = Importer.Import(D->getBitWidth()); 3473 if (!BitWidth && D->getBitWidth()) 3474 return nullptr; 3475 3476 FieldDecl *ToField = FieldDecl::Create(Importer.getToContext(), DC, 3477 Importer.Import(D->getInnerLocStart()), 3478 Loc, Name.getAsIdentifierInfo(), 3479 T, TInfo, BitWidth, D->isMutable(), 3480 D->getInClassInitStyle()); 3481 ToField->setAccess(D->getAccess()); 3482 ToField->setLexicalDeclContext(LexicalDC); 3483 if (Expr *FromInitializer = D->getInClassInitializer()) { 3484 Expr *ToInitializer = Importer.Import(FromInitializer); 3485 if (ToInitializer) 3486 ToField->setInClassInitializer(ToInitializer); 3487 else 3488 return nullptr; 3489 } 3490 ToField->setImplicit(D->isImplicit()); 3491 Importer.Imported(D, ToField); 3492 LexicalDC->addDeclInternal(ToField); 3493 return ToField; 3494 } 3495 3496 Decl *ASTNodeImporter::VisitIndirectFieldDecl(IndirectFieldDecl *D) { 3497 // Import the major distinguishing characteristics of a variable. 3498 DeclContext *DC, *LexicalDC; 3499 DeclarationName Name; 3500 SourceLocation Loc; 3501 NamedDecl *ToD; 3502 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 3503 return nullptr; 3504 if (ToD) 3505 return ToD; 3506 3507 // Determine whether we've already imported this field. 3508 SmallVector<NamedDecl *, 2> FoundDecls; 3509 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 3510 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 3511 if (IndirectFieldDecl *FoundField 3512 = dyn_cast<IndirectFieldDecl>(FoundDecls[I])) { 3513 // For anonymous indirect fields, match up by index. 3514 if (!Name && getFieldIndex(D) != getFieldIndex(FoundField)) 3515 continue; 3516 3517 if (Importer.IsStructurallyEquivalent(D->getType(), 3518 FoundField->getType(), 3519 !Name.isEmpty())) { 3520 Importer.Imported(D, FoundField); 3521 return FoundField; 3522 } 3523 3524 // If there are more anonymous fields to check, continue. 3525 if (!Name && I < N-1) 3526 continue; 3527 3528 Importer.ToDiag(Loc, diag::err_odr_field_type_inconsistent) 3529 << Name << D->getType() << FoundField->getType(); 3530 Importer.ToDiag(FoundField->getLocation(), diag::note_odr_value_here) 3531 << FoundField->getType(); 3532 return nullptr; 3533 } 3534 } 3535 3536 // Import the type. 3537 QualType T = Importer.Import(D->getType()); 3538 if (T.isNull()) 3539 return nullptr; 3540 3541 NamedDecl **NamedChain = 3542 new (Importer.getToContext())NamedDecl*[D->getChainingSize()]; 3543 3544 unsigned i = 0; 3545 for (auto *PI : D->chain()) { 3546 Decl *D = Importer.Import(PI); 3547 if (!D) 3548 return nullptr; 3549 NamedChain[i++] = cast<NamedDecl>(D); 3550 } 3551 3552 IndirectFieldDecl *ToIndirectField = IndirectFieldDecl::Create( 3553 Importer.getToContext(), DC, Loc, Name.getAsIdentifierInfo(), T, 3554 {NamedChain, D->getChainingSize()}); 3555 3556 for (const auto *Attr : D->attrs()) 3557 ToIndirectField->addAttr(Attr->clone(Importer.getToContext())); 3558 3559 ToIndirectField->setAccess(D->getAccess()); 3560 ToIndirectField->setLexicalDeclContext(LexicalDC); 3561 Importer.Imported(D, ToIndirectField); 3562 LexicalDC->addDeclInternal(ToIndirectField); 3563 return ToIndirectField; 3564 } 3565 3566 Decl *ASTNodeImporter::VisitFriendDecl(FriendDecl *D) { 3567 // Import the major distinguishing characteristics of a declaration. 3568 DeclContext *DC = Importer.ImportContext(D->getDeclContext()); 3569 DeclContext *LexicalDC = D->getDeclContext() == D->getLexicalDeclContext() 3570 ? DC : Importer.ImportContext(D->getLexicalDeclContext()); 3571 if (!DC || !LexicalDC) 3572 return nullptr; 3573 3574 // Determine whether we've already imported this decl. 3575 // FriendDecl is not a NamedDecl so we cannot use localUncachedLookup. 3576 auto *RD = cast<CXXRecordDecl>(DC); 3577 FriendDecl *ImportedFriend = RD->getFirstFriend(); 3578 StructuralEquivalenceContext Context( 3579 Importer.getFromContext(), Importer.getToContext(), 3580 Importer.getNonEquivalentDecls(), false, false); 3581 3582 while (ImportedFriend) { 3583 if (D->getFriendDecl() && ImportedFriend->getFriendDecl()) { 3584 if (Context.IsStructurallyEquivalent(D->getFriendDecl(), 3585 ImportedFriend->getFriendDecl())) 3586 return Importer.Imported(D, ImportedFriend); 3587 3588 } else if (D->getFriendType() && ImportedFriend->getFriendType()) { 3589 if (Importer.IsStructurallyEquivalent( 3590 D->getFriendType()->getType(), 3591 ImportedFriend->getFriendType()->getType(), true)) 3592 return Importer.Imported(D, ImportedFriend); 3593 } 3594 ImportedFriend = ImportedFriend->getNextFriend(); 3595 } 3596 3597 // Not found. Create it. 3598 FriendDecl::FriendUnion ToFU; 3599 if (NamedDecl *FriendD = D->getFriendDecl()) 3600 ToFU = cast_or_null<NamedDecl>(Importer.Import(FriendD)); 3601 else 3602 ToFU = Importer.Import(D->getFriendType()); 3603 if (!ToFU) 3604 return nullptr; 3605 3606 SmallVector<TemplateParameterList *, 1> ToTPLists(D->NumTPLists); 3607 TemplateParameterList **FromTPLists = 3608 D->getTrailingObjects<TemplateParameterList *>(); 3609 for (unsigned I = 0; I < D->NumTPLists; I++) { 3610 TemplateParameterList *List = ImportTemplateParameterList(FromTPLists[I]); 3611 if (!List) 3612 return nullptr; 3613 ToTPLists[I] = List; 3614 } 3615 3616 FriendDecl *FrD = FriendDecl::Create(Importer.getToContext(), DC, 3617 Importer.Import(D->getLocation()), 3618 ToFU, Importer.Import(D->getFriendLoc()), 3619 ToTPLists); 3620 3621 Importer.Imported(D, FrD); 3622 RD->pushFriendDecl(FrD); 3623 3624 FrD->setAccess(D->getAccess()); 3625 FrD->setLexicalDeclContext(LexicalDC); 3626 LexicalDC->addDeclInternal(FrD); 3627 return FrD; 3628 } 3629 3630 Decl *ASTNodeImporter::VisitObjCIvarDecl(ObjCIvarDecl *D) { 3631 // Import the major distinguishing characteristics of an ivar. 3632 DeclContext *DC, *LexicalDC; 3633 DeclarationName Name; 3634 SourceLocation Loc; 3635 NamedDecl *ToD; 3636 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 3637 return nullptr; 3638 if (ToD) 3639 return ToD; 3640 3641 // Determine whether we've already imported this ivar 3642 SmallVector<NamedDecl *, 2> FoundDecls; 3643 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 3644 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 3645 if (ObjCIvarDecl *FoundIvar = dyn_cast<ObjCIvarDecl>(FoundDecls[I])) { 3646 if (Importer.IsStructurallyEquivalent(D->getType(), 3647 FoundIvar->getType())) { 3648 Importer.Imported(D, FoundIvar); 3649 return FoundIvar; 3650 } 3651 3652 Importer.ToDiag(Loc, diag::err_odr_ivar_type_inconsistent) 3653 << Name << D->getType() << FoundIvar->getType(); 3654 Importer.ToDiag(FoundIvar->getLocation(), diag::note_odr_value_here) 3655 << FoundIvar->getType(); 3656 return nullptr; 3657 } 3658 } 3659 3660 // Import the type. 3661 QualType T = Importer.Import(D->getType()); 3662 if (T.isNull()) 3663 return nullptr; 3664 3665 TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo()); 3666 Expr *BitWidth = Importer.Import(D->getBitWidth()); 3667 if (!BitWidth && D->getBitWidth()) 3668 return nullptr; 3669 3670 ObjCIvarDecl *ToIvar = ObjCIvarDecl::Create(Importer.getToContext(), 3671 cast<ObjCContainerDecl>(DC), 3672 Importer.Import(D->getInnerLocStart()), 3673 Loc, Name.getAsIdentifierInfo(), 3674 T, TInfo, D->getAccessControl(), 3675 BitWidth, D->getSynthesize()); 3676 ToIvar->setLexicalDeclContext(LexicalDC); 3677 Importer.Imported(D, ToIvar); 3678 LexicalDC->addDeclInternal(ToIvar); 3679 return ToIvar; 3680 3681 } 3682 3683 Decl *ASTNodeImporter::VisitVarDecl(VarDecl *D) { 3684 // Import the major distinguishing characteristics of a variable. 3685 DeclContext *DC, *LexicalDC; 3686 DeclarationName Name; 3687 SourceLocation Loc; 3688 NamedDecl *ToD; 3689 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 3690 return nullptr; 3691 if (ToD) 3692 return ToD; 3693 3694 // Try to find a variable in our own ("to") context with the same name and 3695 // in the same context as the variable we're importing. 3696 if (D->isFileVarDecl()) { 3697 VarDecl *MergeWithVar = nullptr; 3698 SmallVector<NamedDecl *, 4> ConflictingDecls; 3699 unsigned IDNS = Decl::IDNS_Ordinary; 3700 SmallVector<NamedDecl *, 2> FoundDecls; 3701 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 3702 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 3703 if (!FoundDecls[I]->isInIdentifierNamespace(IDNS)) 3704 continue; 3705 3706 if (VarDecl *FoundVar = dyn_cast<VarDecl>(FoundDecls[I])) { 3707 // We have found a variable that we may need to merge with. Check it. 3708 if (FoundVar->hasExternalFormalLinkage() && 3709 D->hasExternalFormalLinkage()) { 3710 if (Importer.IsStructurallyEquivalent(D->getType(), 3711 FoundVar->getType())) { 3712 MergeWithVar = FoundVar; 3713 break; 3714 } 3715 3716 const ArrayType *FoundArray 3717 = Importer.getToContext().getAsArrayType(FoundVar->getType()); 3718 const ArrayType *TArray 3719 = Importer.getToContext().getAsArrayType(D->getType()); 3720 if (FoundArray && TArray) { 3721 if (isa<IncompleteArrayType>(FoundArray) && 3722 isa<ConstantArrayType>(TArray)) { 3723 // Import the type. 3724 QualType T = Importer.Import(D->getType()); 3725 if (T.isNull()) 3726 return nullptr; 3727 3728 FoundVar->setType(T); 3729 MergeWithVar = FoundVar; 3730 break; 3731 } else if (isa<IncompleteArrayType>(TArray) && 3732 isa<ConstantArrayType>(FoundArray)) { 3733 MergeWithVar = FoundVar; 3734 break; 3735 } 3736 } 3737 3738 Importer.ToDiag(Loc, diag::err_odr_variable_type_inconsistent) 3739 << Name << D->getType() << FoundVar->getType(); 3740 Importer.ToDiag(FoundVar->getLocation(), diag::note_odr_value_here) 3741 << FoundVar->getType(); 3742 } 3743 } 3744 3745 ConflictingDecls.push_back(FoundDecls[I]); 3746 } 3747 3748 if (MergeWithVar) { 3749 // An equivalent variable with external linkage has been found. Link 3750 // the two declarations, then merge them. 3751 Importer.Imported(D, MergeWithVar); 3752 3753 if (VarDecl *DDef = D->getDefinition()) { 3754 if (VarDecl *ExistingDef = MergeWithVar->getDefinition()) { 3755 Importer.ToDiag(ExistingDef->getLocation(), 3756 diag::err_odr_variable_multiple_def) 3757 << Name; 3758 Importer.FromDiag(DDef->getLocation(), diag::note_odr_defined_here); 3759 } else { 3760 Expr *Init = Importer.Import(DDef->getInit()); 3761 MergeWithVar->setInit(Init); 3762 if (DDef->isInitKnownICE()) { 3763 EvaluatedStmt *Eval = MergeWithVar->ensureEvaluatedStmt(); 3764 Eval->CheckedICE = true; 3765 Eval->IsICE = DDef->isInitICE(); 3766 } 3767 } 3768 } 3769 3770 return MergeWithVar; 3771 } 3772 3773 if (!ConflictingDecls.empty()) { 3774 Name = Importer.HandleNameConflict(Name, DC, IDNS, 3775 ConflictingDecls.data(), 3776 ConflictingDecls.size()); 3777 if (!Name) 3778 return nullptr; 3779 } 3780 } 3781 3782 // Import the type. 3783 QualType T = Importer.Import(D->getType()); 3784 if (T.isNull()) 3785 return nullptr; 3786 3787 // Create the imported variable. 3788 TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo()); 3789 VarDecl *ToVar = VarDecl::Create(Importer.getToContext(), DC, 3790 Importer.Import(D->getInnerLocStart()), 3791 Loc, Name.getAsIdentifierInfo(), 3792 T, TInfo, 3793 D->getStorageClass()); 3794 ToVar->setQualifierInfo(Importer.Import(D->getQualifierLoc())); 3795 ToVar->setAccess(D->getAccess()); 3796 ToVar->setLexicalDeclContext(LexicalDC); 3797 Importer.Imported(D, ToVar); 3798 LexicalDC->addDeclInternal(ToVar); 3799 3800 if (!D->isFileVarDecl() && 3801 D->isUsed()) 3802 ToVar->setIsUsed(); 3803 3804 // Merge the initializer. 3805 if (ImportDefinition(D, ToVar)) 3806 return nullptr; 3807 3808 if (D->isConstexpr()) 3809 ToVar->setConstexpr(true); 3810 3811 return ToVar; 3812 } 3813 3814 Decl *ASTNodeImporter::VisitImplicitParamDecl(ImplicitParamDecl *D) { 3815 // Parameters are created in the translation unit's context, then moved 3816 // into the function declaration's context afterward. 3817 DeclContext *DC = Importer.getToContext().getTranslationUnitDecl(); 3818 3819 // Import the name of this declaration. 3820 DeclarationName Name = Importer.Import(D->getDeclName()); 3821 if (D->getDeclName() && !Name) 3822 return nullptr; 3823 3824 // Import the location of this declaration. 3825 SourceLocation Loc = Importer.Import(D->getLocation()); 3826 3827 // Import the parameter's type. 3828 QualType T = Importer.Import(D->getType()); 3829 if (T.isNull()) 3830 return nullptr; 3831 3832 // Create the imported parameter. 3833 ImplicitParamDecl *ToParm 3834 = ImplicitParamDecl::Create(Importer.getToContext(), DC, 3835 Loc, Name.getAsIdentifierInfo(), 3836 T); 3837 return Importer.Imported(D, ToParm); 3838 } 3839 3840 Decl *ASTNodeImporter::VisitParmVarDecl(ParmVarDecl *D) { 3841 // Parameters are created in the translation unit's context, then moved 3842 // into the function declaration's context afterward. 3843 DeclContext *DC = Importer.getToContext().getTranslationUnitDecl(); 3844 3845 // Import the name of this declaration. 3846 DeclarationName Name = Importer.Import(D->getDeclName()); 3847 if (D->getDeclName() && !Name) 3848 return nullptr; 3849 3850 // Import the location of this declaration. 3851 SourceLocation Loc = Importer.Import(D->getLocation()); 3852 3853 // Import the parameter's type. 3854 QualType T = Importer.Import(D->getType()); 3855 if (T.isNull()) 3856 return nullptr; 3857 3858 // Create the imported parameter. 3859 TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo()); 3860 ParmVarDecl *ToParm = ParmVarDecl::Create(Importer.getToContext(), DC, 3861 Importer.Import(D->getInnerLocStart()), 3862 Loc, Name.getAsIdentifierInfo(), 3863 T, TInfo, D->getStorageClass(), 3864 /*DefaultArg*/ nullptr); 3865 3866 // Set the default argument. 3867 ToParm->setHasInheritedDefaultArg(D->hasInheritedDefaultArg()); 3868 ToParm->setKNRPromoted(D->isKNRPromoted()); 3869 3870 Expr *ToDefArg = nullptr; 3871 Expr *FromDefArg = nullptr; 3872 if (D->hasUninstantiatedDefaultArg()) { 3873 FromDefArg = D->getUninstantiatedDefaultArg(); 3874 ToDefArg = Importer.Import(FromDefArg); 3875 ToParm->setUninstantiatedDefaultArg(ToDefArg); 3876 } else if (D->hasUnparsedDefaultArg()) { 3877 ToParm->setUnparsedDefaultArg(); 3878 } else if (D->hasDefaultArg()) { 3879 FromDefArg = D->getDefaultArg(); 3880 ToDefArg = Importer.Import(FromDefArg); 3881 ToParm->setDefaultArg(ToDefArg); 3882 } 3883 if (FromDefArg && !ToDefArg) 3884 return nullptr; 3885 3886 if (D->isUsed()) 3887 ToParm->setIsUsed(); 3888 3889 return Importer.Imported(D, ToParm); 3890 } 3891 3892 Decl *ASTNodeImporter::VisitObjCMethodDecl(ObjCMethodDecl *D) { 3893 // Import the major distinguishing characteristics of a method. 3894 DeclContext *DC, *LexicalDC; 3895 DeclarationName Name; 3896 SourceLocation Loc; 3897 NamedDecl *ToD; 3898 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 3899 return nullptr; 3900 if (ToD) 3901 return ToD; 3902 3903 SmallVector<NamedDecl *, 2> FoundDecls; 3904 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 3905 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 3906 if (ObjCMethodDecl *FoundMethod = dyn_cast<ObjCMethodDecl>(FoundDecls[I])) { 3907 if (FoundMethod->isInstanceMethod() != D->isInstanceMethod()) 3908 continue; 3909 3910 // Check return types. 3911 if (!Importer.IsStructurallyEquivalent(D->getReturnType(), 3912 FoundMethod->getReturnType())) { 3913 Importer.ToDiag(Loc, diag::err_odr_objc_method_result_type_inconsistent) 3914 << D->isInstanceMethod() << Name << D->getReturnType() 3915 << FoundMethod->getReturnType(); 3916 Importer.ToDiag(FoundMethod->getLocation(), 3917 diag::note_odr_objc_method_here) 3918 << D->isInstanceMethod() << Name; 3919 return nullptr; 3920 } 3921 3922 // Check the number of parameters. 3923 if (D->param_size() != FoundMethod->param_size()) { 3924 Importer.ToDiag(Loc, diag::err_odr_objc_method_num_params_inconsistent) 3925 << D->isInstanceMethod() << Name 3926 << D->param_size() << FoundMethod->param_size(); 3927 Importer.ToDiag(FoundMethod->getLocation(), 3928 diag::note_odr_objc_method_here) 3929 << D->isInstanceMethod() << Name; 3930 return nullptr; 3931 } 3932 3933 // Check parameter types. 3934 for (ObjCMethodDecl::param_iterator P = D->param_begin(), 3935 PEnd = D->param_end(), FoundP = FoundMethod->param_begin(); 3936 P != PEnd; ++P, ++FoundP) { 3937 if (!Importer.IsStructurallyEquivalent((*P)->getType(), 3938 (*FoundP)->getType())) { 3939 Importer.FromDiag((*P)->getLocation(), 3940 diag::err_odr_objc_method_param_type_inconsistent) 3941 << D->isInstanceMethod() << Name 3942 << (*P)->getType() << (*FoundP)->getType(); 3943 Importer.ToDiag((*FoundP)->getLocation(), diag::note_odr_value_here) 3944 << (*FoundP)->getType(); 3945 return nullptr; 3946 } 3947 } 3948 3949 // Check variadic/non-variadic. 3950 // Check the number of parameters. 3951 if (D->isVariadic() != FoundMethod->isVariadic()) { 3952 Importer.ToDiag(Loc, diag::err_odr_objc_method_variadic_inconsistent) 3953 << D->isInstanceMethod() << Name; 3954 Importer.ToDiag(FoundMethod->getLocation(), 3955 diag::note_odr_objc_method_here) 3956 << D->isInstanceMethod() << Name; 3957 return nullptr; 3958 } 3959 3960 // FIXME: Any other bits we need to merge? 3961 return Importer.Imported(D, FoundMethod); 3962 } 3963 } 3964 3965 // Import the result type. 3966 QualType ResultTy = Importer.Import(D->getReturnType()); 3967 if (ResultTy.isNull()) 3968 return nullptr; 3969 3970 TypeSourceInfo *ReturnTInfo = Importer.Import(D->getReturnTypeSourceInfo()); 3971 3972 ObjCMethodDecl *ToMethod = ObjCMethodDecl::Create( 3973 Importer.getToContext(), Loc, Importer.Import(D->getLocEnd()), 3974 Name.getObjCSelector(), ResultTy, ReturnTInfo, DC, D->isInstanceMethod(), 3975 D->isVariadic(), D->isPropertyAccessor(), D->isImplicit(), D->isDefined(), 3976 D->getImplementationControl(), D->hasRelatedResultType()); 3977 3978 // FIXME: When we decide to merge method definitions, we'll need to 3979 // deal with implicit parameters. 3980 3981 // Import the parameters 3982 SmallVector<ParmVarDecl *, 5> ToParams; 3983 for (auto *FromP : D->parameters()) { 3984 ParmVarDecl *ToP = cast_or_null<ParmVarDecl>(Importer.Import(FromP)); 3985 if (!ToP) 3986 return nullptr; 3987 3988 ToParams.push_back(ToP); 3989 } 3990 3991 // Set the parameters. 3992 for (unsigned I = 0, N = ToParams.size(); I != N; ++I) { 3993 ToParams[I]->setOwningFunction(ToMethod); 3994 ToMethod->addDeclInternal(ToParams[I]); 3995 } 3996 SmallVector<SourceLocation, 12> SelLocs; 3997 D->getSelectorLocs(SelLocs); 3998 ToMethod->setMethodParams(Importer.getToContext(), ToParams, SelLocs); 3999 4000 ToMethod->setLexicalDeclContext(LexicalDC); 4001 Importer.Imported(D, ToMethod); 4002 LexicalDC->addDeclInternal(ToMethod); 4003 return ToMethod; 4004 } 4005 4006 Decl *ASTNodeImporter::VisitObjCTypeParamDecl(ObjCTypeParamDecl *D) { 4007 // Import the major distinguishing characteristics of a category. 4008 DeclContext *DC, *LexicalDC; 4009 DeclarationName Name; 4010 SourceLocation Loc; 4011 NamedDecl *ToD; 4012 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 4013 return nullptr; 4014 if (ToD) 4015 return ToD; 4016 4017 TypeSourceInfo *BoundInfo = Importer.Import(D->getTypeSourceInfo()); 4018 if (!BoundInfo) 4019 return nullptr; 4020 4021 ObjCTypeParamDecl *Result = ObjCTypeParamDecl::Create( 4022 Importer.getToContext(), DC, 4023 D->getVariance(), 4024 Importer.Import(D->getVarianceLoc()), 4025 D->getIndex(), 4026 Importer.Import(D->getLocation()), 4027 Name.getAsIdentifierInfo(), 4028 Importer.Import(D->getColonLoc()), 4029 BoundInfo); 4030 Importer.Imported(D, Result); 4031 Result->setLexicalDeclContext(LexicalDC); 4032 return Result; 4033 } 4034 4035 Decl *ASTNodeImporter::VisitObjCCategoryDecl(ObjCCategoryDecl *D) { 4036 // Import the major distinguishing characteristics of a category. 4037 DeclContext *DC, *LexicalDC; 4038 DeclarationName Name; 4039 SourceLocation Loc; 4040 NamedDecl *ToD; 4041 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 4042 return nullptr; 4043 if (ToD) 4044 return ToD; 4045 4046 ObjCInterfaceDecl *ToInterface 4047 = cast_or_null<ObjCInterfaceDecl>(Importer.Import(D->getClassInterface())); 4048 if (!ToInterface) 4049 return nullptr; 4050 4051 // Determine if we've already encountered this category. 4052 ObjCCategoryDecl *MergeWithCategory 4053 = ToInterface->FindCategoryDeclaration(Name.getAsIdentifierInfo()); 4054 ObjCCategoryDecl *ToCategory = MergeWithCategory; 4055 if (!ToCategory) { 4056 ToCategory = ObjCCategoryDecl::Create(Importer.getToContext(), DC, 4057 Importer.Import(D->getAtStartLoc()), 4058 Loc, 4059 Importer.Import(D->getCategoryNameLoc()), 4060 Name.getAsIdentifierInfo(), 4061 ToInterface, 4062 /*TypeParamList=*/nullptr, 4063 Importer.Import(D->getIvarLBraceLoc()), 4064 Importer.Import(D->getIvarRBraceLoc())); 4065 ToCategory->setLexicalDeclContext(LexicalDC); 4066 LexicalDC->addDeclInternal(ToCategory); 4067 Importer.Imported(D, ToCategory); 4068 // Import the type parameter list after calling Imported, to avoid 4069 // loops when bringing in their DeclContext. 4070 ToCategory->setTypeParamList(ImportObjCTypeParamList( 4071 D->getTypeParamList())); 4072 4073 // Import protocols 4074 SmallVector<ObjCProtocolDecl *, 4> Protocols; 4075 SmallVector<SourceLocation, 4> ProtocolLocs; 4076 ObjCCategoryDecl::protocol_loc_iterator FromProtoLoc 4077 = D->protocol_loc_begin(); 4078 for (ObjCCategoryDecl::protocol_iterator FromProto = D->protocol_begin(), 4079 FromProtoEnd = D->protocol_end(); 4080 FromProto != FromProtoEnd; 4081 ++FromProto, ++FromProtoLoc) { 4082 ObjCProtocolDecl *ToProto 4083 = cast_or_null<ObjCProtocolDecl>(Importer.Import(*FromProto)); 4084 if (!ToProto) 4085 return nullptr; 4086 Protocols.push_back(ToProto); 4087 ProtocolLocs.push_back(Importer.Import(*FromProtoLoc)); 4088 } 4089 4090 // FIXME: If we're merging, make sure that the protocol list is the same. 4091 ToCategory->setProtocolList(Protocols.data(), Protocols.size(), 4092 ProtocolLocs.data(), Importer.getToContext()); 4093 4094 } else { 4095 Importer.Imported(D, ToCategory); 4096 } 4097 4098 // Import all of the members of this category. 4099 ImportDeclContext(D); 4100 4101 // If we have an implementation, import it as well. 4102 if (D->getImplementation()) { 4103 ObjCCategoryImplDecl *Impl 4104 = cast_or_null<ObjCCategoryImplDecl>( 4105 Importer.Import(D->getImplementation())); 4106 if (!Impl) 4107 return nullptr; 4108 4109 ToCategory->setImplementation(Impl); 4110 } 4111 4112 return ToCategory; 4113 } 4114 4115 bool ASTNodeImporter::ImportDefinition(ObjCProtocolDecl *From, 4116 ObjCProtocolDecl *To, 4117 ImportDefinitionKind Kind) { 4118 if (To->getDefinition()) { 4119 if (shouldForceImportDeclContext(Kind)) 4120 ImportDeclContext(From); 4121 return false; 4122 } 4123 4124 // Start the protocol definition 4125 To->startDefinition(); 4126 4127 // Import protocols 4128 SmallVector<ObjCProtocolDecl *, 4> Protocols; 4129 SmallVector<SourceLocation, 4> ProtocolLocs; 4130 ObjCProtocolDecl::protocol_loc_iterator 4131 FromProtoLoc = From->protocol_loc_begin(); 4132 for (ObjCProtocolDecl::protocol_iterator FromProto = From->protocol_begin(), 4133 FromProtoEnd = From->protocol_end(); 4134 FromProto != FromProtoEnd; 4135 ++FromProto, ++FromProtoLoc) { 4136 ObjCProtocolDecl *ToProto 4137 = cast_or_null<ObjCProtocolDecl>(Importer.Import(*FromProto)); 4138 if (!ToProto) 4139 return true; 4140 Protocols.push_back(ToProto); 4141 ProtocolLocs.push_back(Importer.Import(*FromProtoLoc)); 4142 } 4143 4144 // FIXME: If we're merging, make sure that the protocol list is the same. 4145 To->setProtocolList(Protocols.data(), Protocols.size(), 4146 ProtocolLocs.data(), Importer.getToContext()); 4147 4148 if (shouldForceImportDeclContext(Kind)) { 4149 // Import all of the members of this protocol. 4150 ImportDeclContext(From, /*ForceImport=*/true); 4151 } 4152 return false; 4153 } 4154 4155 Decl *ASTNodeImporter::VisitObjCProtocolDecl(ObjCProtocolDecl *D) { 4156 // If this protocol has a definition in the translation unit we're coming 4157 // from, but this particular declaration is not that definition, import the 4158 // definition and map to that. 4159 ObjCProtocolDecl *Definition = D->getDefinition(); 4160 if (Definition && Definition != D) { 4161 Decl *ImportedDef = Importer.Import(Definition); 4162 if (!ImportedDef) 4163 return nullptr; 4164 4165 return Importer.Imported(D, ImportedDef); 4166 } 4167 4168 // Import the major distinguishing characteristics of a protocol. 4169 DeclContext *DC, *LexicalDC; 4170 DeclarationName Name; 4171 SourceLocation Loc; 4172 NamedDecl *ToD; 4173 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 4174 return nullptr; 4175 if (ToD) 4176 return ToD; 4177 4178 ObjCProtocolDecl *MergeWithProtocol = nullptr; 4179 SmallVector<NamedDecl *, 2> FoundDecls; 4180 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 4181 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 4182 if (!FoundDecls[I]->isInIdentifierNamespace(Decl::IDNS_ObjCProtocol)) 4183 continue; 4184 4185 if ((MergeWithProtocol = dyn_cast<ObjCProtocolDecl>(FoundDecls[I]))) 4186 break; 4187 } 4188 4189 ObjCProtocolDecl *ToProto = MergeWithProtocol; 4190 if (!ToProto) { 4191 ToProto = ObjCProtocolDecl::Create(Importer.getToContext(), DC, 4192 Name.getAsIdentifierInfo(), Loc, 4193 Importer.Import(D->getAtStartLoc()), 4194 /*PrevDecl=*/nullptr); 4195 ToProto->setLexicalDeclContext(LexicalDC); 4196 LexicalDC->addDeclInternal(ToProto); 4197 } 4198 4199 Importer.Imported(D, ToProto); 4200 4201 if (D->isThisDeclarationADefinition() && ImportDefinition(D, ToProto)) 4202 return nullptr; 4203 4204 return ToProto; 4205 } 4206 4207 Decl *ASTNodeImporter::VisitLinkageSpecDecl(LinkageSpecDecl *D) { 4208 DeclContext *DC = Importer.ImportContext(D->getDeclContext()); 4209 DeclContext *LexicalDC = Importer.ImportContext(D->getLexicalDeclContext()); 4210 4211 SourceLocation ExternLoc = Importer.Import(D->getExternLoc()); 4212 SourceLocation LangLoc = Importer.Import(D->getLocation()); 4213 4214 bool HasBraces = D->hasBraces(); 4215 4216 LinkageSpecDecl *ToLinkageSpec = 4217 LinkageSpecDecl::Create(Importer.getToContext(), 4218 DC, 4219 ExternLoc, 4220 LangLoc, 4221 D->getLanguage(), 4222 HasBraces); 4223 4224 if (HasBraces) { 4225 SourceLocation RBraceLoc = Importer.Import(D->getRBraceLoc()); 4226 ToLinkageSpec->setRBraceLoc(RBraceLoc); 4227 } 4228 4229 ToLinkageSpec->setLexicalDeclContext(LexicalDC); 4230 LexicalDC->addDeclInternal(ToLinkageSpec); 4231 4232 Importer.Imported(D, ToLinkageSpec); 4233 4234 return ToLinkageSpec; 4235 } 4236 4237 bool ASTNodeImporter::ImportDefinition(ObjCInterfaceDecl *From, 4238 ObjCInterfaceDecl *To, 4239 ImportDefinitionKind Kind) { 4240 if (To->getDefinition()) { 4241 // Check consistency of superclass. 4242 ObjCInterfaceDecl *FromSuper = From->getSuperClass(); 4243 if (FromSuper) { 4244 FromSuper = cast_or_null<ObjCInterfaceDecl>(Importer.Import(FromSuper)); 4245 if (!FromSuper) 4246 return true; 4247 } 4248 4249 ObjCInterfaceDecl *ToSuper = To->getSuperClass(); 4250 if ((bool)FromSuper != (bool)ToSuper || 4251 (FromSuper && !declaresSameEntity(FromSuper, ToSuper))) { 4252 Importer.ToDiag(To->getLocation(), 4253 diag::err_odr_objc_superclass_inconsistent) 4254 << To->getDeclName(); 4255 if (ToSuper) 4256 Importer.ToDiag(To->getSuperClassLoc(), diag::note_odr_objc_superclass) 4257 << To->getSuperClass()->getDeclName(); 4258 else 4259 Importer.ToDiag(To->getLocation(), 4260 diag::note_odr_objc_missing_superclass); 4261 if (From->getSuperClass()) 4262 Importer.FromDiag(From->getSuperClassLoc(), 4263 diag::note_odr_objc_superclass) 4264 << From->getSuperClass()->getDeclName(); 4265 else 4266 Importer.FromDiag(From->getLocation(), 4267 diag::note_odr_objc_missing_superclass); 4268 } 4269 4270 if (shouldForceImportDeclContext(Kind)) 4271 ImportDeclContext(From); 4272 return false; 4273 } 4274 4275 // Start the definition. 4276 To->startDefinition(); 4277 4278 // If this class has a superclass, import it. 4279 if (From->getSuperClass()) { 4280 TypeSourceInfo *SuperTInfo = Importer.Import(From->getSuperClassTInfo()); 4281 if (!SuperTInfo) 4282 return true; 4283 4284 To->setSuperClass(SuperTInfo); 4285 } 4286 4287 // Import protocols 4288 SmallVector<ObjCProtocolDecl *, 4> Protocols; 4289 SmallVector<SourceLocation, 4> ProtocolLocs; 4290 ObjCInterfaceDecl::protocol_loc_iterator 4291 FromProtoLoc = From->protocol_loc_begin(); 4292 4293 for (ObjCInterfaceDecl::protocol_iterator FromProto = From->protocol_begin(), 4294 FromProtoEnd = From->protocol_end(); 4295 FromProto != FromProtoEnd; 4296 ++FromProto, ++FromProtoLoc) { 4297 ObjCProtocolDecl *ToProto 4298 = cast_or_null<ObjCProtocolDecl>(Importer.Import(*FromProto)); 4299 if (!ToProto) 4300 return true; 4301 Protocols.push_back(ToProto); 4302 ProtocolLocs.push_back(Importer.Import(*FromProtoLoc)); 4303 } 4304 4305 // FIXME: If we're merging, make sure that the protocol list is the same. 4306 To->setProtocolList(Protocols.data(), Protocols.size(), 4307 ProtocolLocs.data(), Importer.getToContext()); 4308 4309 // Import categories. When the categories themselves are imported, they'll 4310 // hook themselves into this interface. 4311 for (auto *Cat : From->known_categories()) 4312 Importer.Import(Cat); 4313 4314 // If we have an @implementation, import it as well. 4315 if (From->getImplementation()) { 4316 ObjCImplementationDecl *Impl = cast_or_null<ObjCImplementationDecl>( 4317 Importer.Import(From->getImplementation())); 4318 if (!Impl) 4319 return true; 4320 4321 To->setImplementation(Impl); 4322 } 4323 4324 if (shouldForceImportDeclContext(Kind)) { 4325 // Import all of the members of this class. 4326 ImportDeclContext(From, /*ForceImport=*/true); 4327 } 4328 return false; 4329 } 4330 4331 ObjCTypeParamList * 4332 ASTNodeImporter::ImportObjCTypeParamList(ObjCTypeParamList *list) { 4333 if (!list) 4334 return nullptr; 4335 4336 SmallVector<ObjCTypeParamDecl *, 4> toTypeParams; 4337 for (auto fromTypeParam : *list) { 4338 auto toTypeParam = cast_or_null<ObjCTypeParamDecl>( 4339 Importer.Import(fromTypeParam)); 4340 if (!toTypeParam) 4341 return nullptr; 4342 4343 toTypeParams.push_back(toTypeParam); 4344 } 4345 4346 return ObjCTypeParamList::create(Importer.getToContext(), 4347 Importer.Import(list->getLAngleLoc()), 4348 toTypeParams, 4349 Importer.Import(list->getRAngleLoc())); 4350 } 4351 4352 Decl *ASTNodeImporter::VisitObjCInterfaceDecl(ObjCInterfaceDecl *D) { 4353 // If this class has a definition in the translation unit we're coming from, 4354 // but this particular declaration is not that definition, import the 4355 // definition and map to that. 4356 ObjCInterfaceDecl *Definition = D->getDefinition(); 4357 if (Definition && Definition != D) { 4358 Decl *ImportedDef = Importer.Import(Definition); 4359 if (!ImportedDef) 4360 return nullptr; 4361 4362 return Importer.Imported(D, ImportedDef); 4363 } 4364 4365 // Import the major distinguishing characteristics of an @interface. 4366 DeclContext *DC, *LexicalDC; 4367 DeclarationName Name; 4368 SourceLocation Loc; 4369 NamedDecl *ToD; 4370 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 4371 return nullptr; 4372 if (ToD) 4373 return ToD; 4374 4375 // Look for an existing interface with the same name. 4376 ObjCInterfaceDecl *MergeWithIface = nullptr; 4377 SmallVector<NamedDecl *, 2> FoundDecls; 4378 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 4379 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 4380 if (!FoundDecls[I]->isInIdentifierNamespace(Decl::IDNS_Ordinary)) 4381 continue; 4382 4383 if ((MergeWithIface = dyn_cast<ObjCInterfaceDecl>(FoundDecls[I]))) 4384 break; 4385 } 4386 4387 // Create an interface declaration, if one does not already exist. 4388 ObjCInterfaceDecl *ToIface = MergeWithIface; 4389 if (!ToIface) { 4390 ToIface = ObjCInterfaceDecl::Create(Importer.getToContext(), DC, 4391 Importer.Import(D->getAtStartLoc()), 4392 Name.getAsIdentifierInfo(), 4393 /*TypeParamList=*/nullptr, 4394 /*PrevDecl=*/nullptr, Loc, 4395 D->isImplicitInterfaceDecl()); 4396 ToIface->setLexicalDeclContext(LexicalDC); 4397 LexicalDC->addDeclInternal(ToIface); 4398 } 4399 Importer.Imported(D, ToIface); 4400 // Import the type parameter list after calling Imported, to avoid 4401 // loops when bringing in their DeclContext. 4402 ToIface->setTypeParamList(ImportObjCTypeParamList( 4403 D->getTypeParamListAsWritten())); 4404 4405 if (D->isThisDeclarationADefinition() && ImportDefinition(D, ToIface)) 4406 return nullptr; 4407 4408 return ToIface; 4409 } 4410 4411 Decl *ASTNodeImporter::VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) { 4412 ObjCCategoryDecl *Category = cast_or_null<ObjCCategoryDecl>( 4413 Importer.Import(D->getCategoryDecl())); 4414 if (!Category) 4415 return nullptr; 4416 4417 ObjCCategoryImplDecl *ToImpl = Category->getImplementation(); 4418 if (!ToImpl) { 4419 DeclContext *DC = Importer.ImportContext(D->getDeclContext()); 4420 if (!DC) 4421 return nullptr; 4422 4423 SourceLocation CategoryNameLoc = Importer.Import(D->getCategoryNameLoc()); 4424 ToImpl = ObjCCategoryImplDecl::Create(Importer.getToContext(), DC, 4425 Importer.Import(D->getIdentifier()), 4426 Category->getClassInterface(), 4427 Importer.Import(D->getLocation()), 4428 Importer.Import(D->getAtStartLoc()), 4429 CategoryNameLoc); 4430 4431 DeclContext *LexicalDC = DC; 4432 if (D->getDeclContext() != D->getLexicalDeclContext()) { 4433 LexicalDC = Importer.ImportContext(D->getLexicalDeclContext()); 4434 if (!LexicalDC) 4435 return nullptr; 4436 4437 ToImpl->setLexicalDeclContext(LexicalDC); 4438 } 4439 4440 LexicalDC->addDeclInternal(ToImpl); 4441 Category->setImplementation(ToImpl); 4442 } 4443 4444 Importer.Imported(D, ToImpl); 4445 ImportDeclContext(D); 4446 return ToImpl; 4447 } 4448 4449 Decl *ASTNodeImporter::VisitObjCImplementationDecl(ObjCImplementationDecl *D) { 4450 // Find the corresponding interface. 4451 ObjCInterfaceDecl *Iface = cast_or_null<ObjCInterfaceDecl>( 4452 Importer.Import(D->getClassInterface())); 4453 if (!Iface) 4454 return nullptr; 4455 4456 // Import the superclass, if any. 4457 ObjCInterfaceDecl *Super = nullptr; 4458 if (D->getSuperClass()) { 4459 Super = cast_or_null<ObjCInterfaceDecl>( 4460 Importer.Import(D->getSuperClass())); 4461 if (!Super) 4462 return nullptr; 4463 } 4464 4465 ObjCImplementationDecl *Impl = Iface->getImplementation(); 4466 if (!Impl) { 4467 // We haven't imported an implementation yet. Create a new @implementation 4468 // now. 4469 Impl = ObjCImplementationDecl::Create(Importer.getToContext(), 4470 Importer.ImportContext(D->getDeclContext()), 4471 Iface, Super, 4472 Importer.Import(D->getLocation()), 4473 Importer.Import(D->getAtStartLoc()), 4474 Importer.Import(D->getSuperClassLoc()), 4475 Importer.Import(D->getIvarLBraceLoc()), 4476 Importer.Import(D->getIvarRBraceLoc())); 4477 4478 if (D->getDeclContext() != D->getLexicalDeclContext()) { 4479 DeclContext *LexicalDC 4480 = Importer.ImportContext(D->getLexicalDeclContext()); 4481 if (!LexicalDC) 4482 return nullptr; 4483 Impl->setLexicalDeclContext(LexicalDC); 4484 } 4485 4486 // Associate the implementation with the class it implements. 4487 Iface->setImplementation(Impl); 4488 Importer.Imported(D, Iface->getImplementation()); 4489 } else { 4490 Importer.Imported(D, Iface->getImplementation()); 4491 4492 // Verify that the existing @implementation has the same superclass. 4493 if ((Super && !Impl->getSuperClass()) || 4494 (!Super && Impl->getSuperClass()) || 4495 (Super && Impl->getSuperClass() && 4496 !declaresSameEntity(Super->getCanonicalDecl(), 4497 Impl->getSuperClass()))) { 4498 Importer.ToDiag(Impl->getLocation(), 4499 diag::err_odr_objc_superclass_inconsistent) 4500 << Iface->getDeclName(); 4501 // FIXME: It would be nice to have the location of the superclass 4502 // below. 4503 if (Impl->getSuperClass()) 4504 Importer.ToDiag(Impl->getLocation(), 4505 diag::note_odr_objc_superclass) 4506 << Impl->getSuperClass()->getDeclName(); 4507 else 4508 Importer.ToDiag(Impl->getLocation(), 4509 diag::note_odr_objc_missing_superclass); 4510 if (D->getSuperClass()) 4511 Importer.FromDiag(D->getLocation(), 4512 diag::note_odr_objc_superclass) 4513 << D->getSuperClass()->getDeclName(); 4514 else 4515 Importer.FromDiag(D->getLocation(), 4516 diag::note_odr_objc_missing_superclass); 4517 return nullptr; 4518 } 4519 } 4520 4521 // Import all of the members of this @implementation. 4522 ImportDeclContext(D); 4523 4524 return Impl; 4525 } 4526 4527 Decl *ASTNodeImporter::VisitObjCPropertyDecl(ObjCPropertyDecl *D) { 4528 // Import the major distinguishing characteristics of an @property. 4529 DeclContext *DC, *LexicalDC; 4530 DeclarationName Name; 4531 SourceLocation Loc; 4532 NamedDecl *ToD; 4533 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 4534 return nullptr; 4535 if (ToD) 4536 return ToD; 4537 4538 // Check whether we have already imported this property. 4539 SmallVector<NamedDecl *, 2> FoundDecls; 4540 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 4541 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 4542 if (ObjCPropertyDecl *FoundProp 4543 = dyn_cast<ObjCPropertyDecl>(FoundDecls[I])) { 4544 // Check property types. 4545 if (!Importer.IsStructurallyEquivalent(D->getType(), 4546 FoundProp->getType())) { 4547 Importer.ToDiag(Loc, diag::err_odr_objc_property_type_inconsistent) 4548 << Name << D->getType() << FoundProp->getType(); 4549 Importer.ToDiag(FoundProp->getLocation(), diag::note_odr_value_here) 4550 << FoundProp->getType(); 4551 return nullptr; 4552 } 4553 4554 // FIXME: Check property attributes, getters, setters, etc.? 4555 4556 // Consider these properties to be equivalent. 4557 Importer.Imported(D, FoundProp); 4558 return FoundProp; 4559 } 4560 } 4561 4562 // Import the type. 4563 TypeSourceInfo *TSI = Importer.Import(D->getTypeSourceInfo()); 4564 if (!TSI) 4565 return nullptr; 4566 4567 // Create the new property. 4568 ObjCPropertyDecl *ToProperty 4569 = ObjCPropertyDecl::Create(Importer.getToContext(), DC, Loc, 4570 Name.getAsIdentifierInfo(), 4571 Importer.Import(D->getAtLoc()), 4572 Importer.Import(D->getLParenLoc()), 4573 Importer.Import(D->getType()), 4574 TSI, 4575 D->getPropertyImplementation()); 4576 Importer.Imported(D, ToProperty); 4577 ToProperty->setLexicalDeclContext(LexicalDC); 4578 LexicalDC->addDeclInternal(ToProperty); 4579 4580 ToProperty->setPropertyAttributes(D->getPropertyAttributes()); 4581 ToProperty->setPropertyAttributesAsWritten( 4582 D->getPropertyAttributesAsWritten()); 4583 ToProperty->setGetterName(Importer.Import(D->getGetterName()), 4584 Importer.Import(D->getGetterNameLoc())); 4585 ToProperty->setSetterName(Importer.Import(D->getSetterName()), 4586 Importer.Import(D->getSetterNameLoc())); 4587 ToProperty->setGetterMethodDecl( 4588 cast_or_null<ObjCMethodDecl>(Importer.Import(D->getGetterMethodDecl()))); 4589 ToProperty->setSetterMethodDecl( 4590 cast_or_null<ObjCMethodDecl>(Importer.Import(D->getSetterMethodDecl()))); 4591 ToProperty->setPropertyIvarDecl( 4592 cast_or_null<ObjCIvarDecl>(Importer.Import(D->getPropertyIvarDecl()))); 4593 return ToProperty; 4594 } 4595 4596 Decl *ASTNodeImporter::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D) { 4597 ObjCPropertyDecl *Property = cast_or_null<ObjCPropertyDecl>( 4598 Importer.Import(D->getPropertyDecl())); 4599 if (!Property) 4600 return nullptr; 4601 4602 DeclContext *DC = Importer.ImportContext(D->getDeclContext()); 4603 if (!DC) 4604 return nullptr; 4605 4606 // Import the lexical declaration context. 4607 DeclContext *LexicalDC = DC; 4608 if (D->getDeclContext() != D->getLexicalDeclContext()) { 4609 LexicalDC = Importer.ImportContext(D->getLexicalDeclContext()); 4610 if (!LexicalDC) 4611 return nullptr; 4612 } 4613 4614 ObjCImplDecl *InImpl = dyn_cast<ObjCImplDecl>(LexicalDC); 4615 if (!InImpl) 4616 return nullptr; 4617 4618 // Import the ivar (for an @synthesize). 4619 ObjCIvarDecl *Ivar = nullptr; 4620 if (D->getPropertyIvarDecl()) { 4621 Ivar = cast_or_null<ObjCIvarDecl>( 4622 Importer.Import(D->getPropertyIvarDecl())); 4623 if (!Ivar) 4624 return nullptr; 4625 } 4626 4627 ObjCPropertyImplDecl *ToImpl 4628 = InImpl->FindPropertyImplDecl(Property->getIdentifier(), 4629 Property->getQueryKind()); 4630 if (!ToImpl) { 4631 ToImpl = ObjCPropertyImplDecl::Create(Importer.getToContext(), DC, 4632 Importer.Import(D->getLocStart()), 4633 Importer.Import(D->getLocation()), 4634 Property, 4635 D->getPropertyImplementation(), 4636 Ivar, 4637 Importer.Import(D->getPropertyIvarDeclLoc())); 4638 ToImpl->setLexicalDeclContext(LexicalDC); 4639 Importer.Imported(D, ToImpl); 4640 LexicalDC->addDeclInternal(ToImpl); 4641 } else { 4642 // Check that we have the same kind of property implementation (@synthesize 4643 // vs. @dynamic). 4644 if (D->getPropertyImplementation() != ToImpl->getPropertyImplementation()) { 4645 Importer.ToDiag(ToImpl->getLocation(), 4646 diag::err_odr_objc_property_impl_kind_inconsistent) 4647 << Property->getDeclName() 4648 << (ToImpl->getPropertyImplementation() 4649 == ObjCPropertyImplDecl::Dynamic); 4650 Importer.FromDiag(D->getLocation(), 4651 diag::note_odr_objc_property_impl_kind) 4652 << D->getPropertyDecl()->getDeclName() 4653 << (D->getPropertyImplementation() == ObjCPropertyImplDecl::Dynamic); 4654 return nullptr; 4655 } 4656 4657 // For @synthesize, check that we have the same 4658 if (D->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize && 4659 Ivar != ToImpl->getPropertyIvarDecl()) { 4660 Importer.ToDiag(ToImpl->getPropertyIvarDeclLoc(), 4661 diag::err_odr_objc_synthesize_ivar_inconsistent) 4662 << Property->getDeclName() 4663 << ToImpl->getPropertyIvarDecl()->getDeclName() 4664 << Ivar->getDeclName(); 4665 Importer.FromDiag(D->getPropertyIvarDeclLoc(), 4666 diag::note_odr_objc_synthesize_ivar_here) 4667 << D->getPropertyIvarDecl()->getDeclName(); 4668 return nullptr; 4669 } 4670 4671 // Merge the existing implementation with the new implementation. 4672 Importer.Imported(D, ToImpl); 4673 } 4674 4675 return ToImpl; 4676 } 4677 4678 Decl *ASTNodeImporter::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) { 4679 // For template arguments, we adopt the translation unit as our declaration 4680 // context. This context will be fixed when the actual template declaration 4681 // is created. 4682 4683 // FIXME: Import default argument. 4684 return TemplateTypeParmDecl::Create(Importer.getToContext(), 4685 Importer.getToContext().getTranslationUnitDecl(), 4686 Importer.Import(D->getLocStart()), 4687 Importer.Import(D->getLocation()), 4688 D->getDepth(), 4689 D->getIndex(), 4690 Importer.Import(D->getIdentifier()), 4691 D->wasDeclaredWithTypename(), 4692 D->isParameterPack()); 4693 } 4694 4695 Decl * 4696 ASTNodeImporter::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) { 4697 // Import the name of this declaration. 4698 DeclarationName Name = Importer.Import(D->getDeclName()); 4699 if (D->getDeclName() && !Name) 4700 return nullptr; 4701 4702 // Import the location of this declaration. 4703 SourceLocation Loc = Importer.Import(D->getLocation()); 4704 4705 // Import the type of this declaration. 4706 QualType T = Importer.Import(D->getType()); 4707 if (T.isNull()) 4708 return nullptr; 4709 4710 // Import type-source information. 4711 TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo()); 4712 if (D->getTypeSourceInfo() && !TInfo) 4713 return nullptr; 4714 4715 // FIXME: Import default argument. 4716 4717 return NonTypeTemplateParmDecl::Create(Importer.getToContext(), 4718 Importer.getToContext().getTranslationUnitDecl(), 4719 Importer.Import(D->getInnerLocStart()), 4720 Loc, D->getDepth(), D->getPosition(), 4721 Name.getAsIdentifierInfo(), 4722 T, D->isParameterPack(), TInfo); 4723 } 4724 4725 Decl * 4726 ASTNodeImporter::VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) { 4727 // Import the name of this declaration. 4728 DeclarationName Name = Importer.Import(D->getDeclName()); 4729 if (D->getDeclName() && !Name) 4730 return nullptr; 4731 4732 // Import the location of this declaration. 4733 SourceLocation Loc = Importer.Import(D->getLocation()); 4734 4735 // Import template parameters. 4736 TemplateParameterList *TemplateParams 4737 = ImportTemplateParameterList(D->getTemplateParameters()); 4738 if (!TemplateParams) 4739 return nullptr; 4740 4741 // FIXME: Import default argument. 4742 4743 return TemplateTemplateParmDecl::Create(Importer.getToContext(), 4744 Importer.getToContext().getTranslationUnitDecl(), 4745 Loc, D->getDepth(), D->getPosition(), 4746 D->isParameterPack(), 4747 Name.getAsIdentifierInfo(), 4748 TemplateParams); 4749 } 4750 4751 Decl *ASTNodeImporter::VisitClassTemplateDecl(ClassTemplateDecl *D) { 4752 // If this record has a definition in the translation unit we're coming from, 4753 // but this particular declaration is not that definition, import the 4754 // definition and map to that. 4755 CXXRecordDecl *Definition 4756 = cast_or_null<CXXRecordDecl>(D->getTemplatedDecl()->getDefinition()); 4757 if (Definition && Definition != D->getTemplatedDecl()) { 4758 Decl *ImportedDef 4759 = Importer.Import(Definition->getDescribedClassTemplate()); 4760 if (!ImportedDef) 4761 return nullptr; 4762 4763 return Importer.Imported(D, ImportedDef); 4764 } 4765 4766 // Import the major distinguishing characteristics of this class template. 4767 DeclContext *DC, *LexicalDC; 4768 DeclarationName Name; 4769 SourceLocation Loc; 4770 NamedDecl *ToD; 4771 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 4772 return nullptr; 4773 if (ToD) 4774 return ToD; 4775 4776 // We may already have a template of the same name; try to find and match it. 4777 if (!DC->isFunctionOrMethod()) { 4778 SmallVector<NamedDecl *, 4> ConflictingDecls; 4779 SmallVector<NamedDecl *, 2> FoundDecls; 4780 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 4781 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 4782 if (!FoundDecls[I]->isInIdentifierNamespace(Decl::IDNS_Ordinary)) 4783 continue; 4784 4785 Decl *Found = FoundDecls[I]; 4786 if (ClassTemplateDecl *FoundTemplate 4787 = dyn_cast<ClassTemplateDecl>(Found)) { 4788 if (IsStructuralMatch(D, FoundTemplate)) { 4789 // The class templates structurally match; call it the same template. 4790 // FIXME: We may be filling in a forward declaration here. Handle 4791 // this case! 4792 Importer.Imported(D->getTemplatedDecl(), 4793 FoundTemplate->getTemplatedDecl()); 4794 return Importer.Imported(D, FoundTemplate); 4795 } 4796 } 4797 4798 ConflictingDecls.push_back(FoundDecls[I]); 4799 } 4800 4801 if (!ConflictingDecls.empty()) { 4802 Name = Importer.HandleNameConflict(Name, DC, Decl::IDNS_Ordinary, 4803 ConflictingDecls.data(), 4804 ConflictingDecls.size()); 4805 } 4806 4807 if (!Name) 4808 return nullptr; 4809 } 4810 4811 CXXRecordDecl *DTemplated = D->getTemplatedDecl(); 4812 4813 // Create the declaration that is being templated. 4814 // Create the declaration that is being templated. 4815 CXXRecordDecl *D2Templated = cast_or_null<CXXRecordDecl>( 4816 Importer.Import(DTemplated)); 4817 if (!D2Templated) 4818 return nullptr; 4819 4820 // Resolve possible cyclic import. 4821 if (Decl *AlreadyImported = Importer.GetAlreadyImportedOrNull(D)) 4822 return AlreadyImported; 4823 4824 // Create the class template declaration itself. 4825 TemplateParameterList *TemplateParams 4826 = ImportTemplateParameterList(D->getTemplateParameters()); 4827 if (!TemplateParams) 4828 return nullptr; 4829 4830 ClassTemplateDecl *D2 = ClassTemplateDecl::Create(Importer.getToContext(), DC, 4831 Loc, Name, TemplateParams, 4832 D2Templated); 4833 D2Templated->setDescribedClassTemplate(D2); 4834 4835 D2->setAccess(D->getAccess()); 4836 D2->setLexicalDeclContext(LexicalDC); 4837 LexicalDC->addDeclInternal(D2); 4838 4839 // Note the relationship between the class templates. 4840 Importer.Imported(D, D2); 4841 Importer.Imported(DTemplated, D2Templated); 4842 4843 if (DTemplated->isCompleteDefinition() && 4844 !D2Templated->isCompleteDefinition()) { 4845 // FIXME: Import definition! 4846 } 4847 4848 return D2; 4849 } 4850 4851 Decl *ASTNodeImporter::VisitClassTemplateSpecializationDecl( 4852 ClassTemplateSpecializationDecl *D) { 4853 // If this record has a definition in the translation unit we're coming from, 4854 // but this particular declaration is not that definition, import the 4855 // definition and map to that. 4856 TagDecl *Definition = D->getDefinition(); 4857 if (Definition && Definition != D) { 4858 Decl *ImportedDef = Importer.Import(Definition); 4859 if (!ImportedDef) 4860 return nullptr; 4861 4862 return Importer.Imported(D, ImportedDef); 4863 } 4864 4865 ClassTemplateDecl *ClassTemplate 4866 = cast_or_null<ClassTemplateDecl>(Importer.Import( 4867 D->getSpecializedTemplate())); 4868 if (!ClassTemplate) 4869 return nullptr; 4870 4871 // Import the context of this declaration. 4872 DeclContext *DC = ClassTemplate->getDeclContext(); 4873 if (!DC) 4874 return nullptr; 4875 4876 DeclContext *LexicalDC = DC; 4877 if (D->getDeclContext() != D->getLexicalDeclContext()) { 4878 LexicalDC = Importer.ImportContext(D->getLexicalDeclContext()); 4879 if (!LexicalDC) 4880 return nullptr; 4881 } 4882 4883 // Import the location of this declaration. 4884 SourceLocation StartLoc = Importer.Import(D->getLocStart()); 4885 SourceLocation IdLoc = Importer.Import(D->getLocation()); 4886 4887 // Import template arguments. 4888 SmallVector<TemplateArgument, 2> TemplateArgs; 4889 if (ImportTemplateArguments(D->getTemplateArgs().data(), 4890 D->getTemplateArgs().size(), 4891 TemplateArgs)) 4892 return nullptr; 4893 4894 // Try to find an existing specialization with these template arguments. 4895 void *InsertPos = nullptr; 4896 ClassTemplateSpecializationDecl *D2 4897 = ClassTemplate->findSpecialization(TemplateArgs, InsertPos); 4898 if (D2) { 4899 // We already have a class template specialization with these template 4900 // arguments. 4901 4902 // FIXME: Check for specialization vs. instantiation errors. 4903 4904 if (RecordDecl *FoundDef = D2->getDefinition()) { 4905 if (!D->isCompleteDefinition() || IsStructuralMatch(D, FoundDef)) { 4906 // The record types structurally match, or the "from" translation 4907 // unit only had a forward declaration anyway; call it the same 4908 // function. 4909 return Importer.Imported(D, FoundDef); 4910 } 4911 } 4912 } else { 4913 // Create a new specialization. 4914 if (ClassTemplatePartialSpecializationDecl *PartialSpec = 4915 dyn_cast<ClassTemplatePartialSpecializationDecl>(D)) { 4916 4917 // Import TemplateArgumentListInfo 4918 TemplateArgumentListInfo ToTAInfo; 4919 auto &ASTTemplateArgs = *PartialSpec->getTemplateArgsAsWritten(); 4920 for (unsigned I = 0, E = ASTTemplateArgs.NumTemplateArgs; I < E; ++I) { 4921 bool Error = false; 4922 auto ToLoc = ImportTemplateArgumentLoc(ASTTemplateArgs[I], Error); 4923 if (Error) 4924 return nullptr; 4925 ToTAInfo.addArgument(ToLoc); 4926 } 4927 4928 QualType CanonInjType = Importer.Import( 4929 PartialSpec->getInjectedSpecializationType()); 4930 if (CanonInjType.isNull()) 4931 return nullptr; 4932 CanonInjType = CanonInjType.getCanonicalType(); 4933 4934 TemplateParameterList *ToTPList = ImportTemplateParameterList( 4935 PartialSpec->getTemplateParameters()); 4936 if (!ToTPList && PartialSpec->getTemplateParameters()) 4937 return nullptr; 4938 4939 D2 = ClassTemplatePartialSpecializationDecl::Create( 4940 Importer.getToContext(), D->getTagKind(), DC, StartLoc, IdLoc, 4941 ToTPList, ClassTemplate, 4942 llvm::makeArrayRef(TemplateArgs.data(), TemplateArgs.size()), 4943 ToTAInfo, CanonInjType, nullptr); 4944 4945 } else { 4946 D2 = ClassTemplateSpecializationDecl::Create(Importer.getToContext(), 4947 D->getTagKind(), DC, 4948 StartLoc, IdLoc, 4949 ClassTemplate, 4950 TemplateArgs, 4951 /*PrevDecl=*/nullptr); 4952 } 4953 4954 D2->setSpecializationKind(D->getSpecializationKind()); 4955 4956 // Add this specialization to the class template. 4957 ClassTemplate->AddSpecialization(D2, InsertPos); 4958 4959 // Import the qualifier, if any. 4960 D2->setQualifierInfo(Importer.Import(D->getQualifierLoc())); 4961 4962 Importer.Imported(D, D2); 4963 4964 if (auto *TSI = D->getTypeAsWritten()) { 4965 TypeSourceInfo *TInfo = Importer.Import(TSI); 4966 if (!TInfo) 4967 return nullptr; 4968 D2->setTypeAsWritten(TInfo); 4969 D2->setTemplateKeywordLoc(Importer.Import(D->getTemplateKeywordLoc())); 4970 D2->setExternLoc(Importer.Import(D->getExternLoc())); 4971 } 4972 4973 SourceLocation POI = Importer.Import(D->getPointOfInstantiation()); 4974 if (POI.isValid()) 4975 D2->setPointOfInstantiation(POI); 4976 else if (D->getPointOfInstantiation().isValid()) 4977 return nullptr; 4978 4979 D2->setTemplateSpecializationKind(D->getTemplateSpecializationKind()); 4980 4981 // Add the specialization to this context. 4982 D2->setLexicalDeclContext(LexicalDC); 4983 LexicalDC->addDeclInternal(D2); 4984 } 4985 Importer.Imported(D, D2); 4986 if (D->isCompleteDefinition() && ImportDefinition(D, D2)) 4987 return nullptr; 4988 4989 return D2; 4990 } 4991 4992 Decl *ASTNodeImporter::VisitVarTemplateDecl(VarTemplateDecl *D) { 4993 // If this variable has a definition in the translation unit we're coming 4994 // from, 4995 // but this particular declaration is not that definition, import the 4996 // definition and map to that. 4997 VarDecl *Definition = 4998 cast_or_null<VarDecl>(D->getTemplatedDecl()->getDefinition()); 4999 if (Definition && Definition != D->getTemplatedDecl()) { 5000 Decl *ImportedDef = Importer.Import(Definition->getDescribedVarTemplate()); 5001 if (!ImportedDef) 5002 return nullptr; 5003 5004 return Importer.Imported(D, ImportedDef); 5005 } 5006 5007 // Import the major distinguishing characteristics of this variable template. 5008 DeclContext *DC, *LexicalDC; 5009 DeclarationName Name; 5010 SourceLocation Loc; 5011 NamedDecl *ToD; 5012 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 5013 return nullptr; 5014 if (ToD) 5015 return ToD; 5016 5017 // We may already have a template of the same name; try to find and match it. 5018 assert(!DC->isFunctionOrMethod() && 5019 "Variable templates cannot be declared at function scope"); 5020 SmallVector<NamedDecl *, 4> ConflictingDecls; 5021 SmallVector<NamedDecl *, 2> FoundDecls; 5022 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 5023 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 5024 if (!FoundDecls[I]->isInIdentifierNamespace(Decl::IDNS_Ordinary)) 5025 continue; 5026 5027 Decl *Found = FoundDecls[I]; 5028 if (VarTemplateDecl *FoundTemplate = dyn_cast<VarTemplateDecl>(Found)) { 5029 if (IsStructuralMatch(D, FoundTemplate)) { 5030 // The variable templates structurally match; call it the same template. 5031 Importer.Imported(D->getTemplatedDecl(), 5032 FoundTemplate->getTemplatedDecl()); 5033 return Importer.Imported(D, FoundTemplate); 5034 } 5035 } 5036 5037 ConflictingDecls.push_back(FoundDecls[I]); 5038 } 5039 5040 if (!ConflictingDecls.empty()) { 5041 Name = Importer.HandleNameConflict(Name, DC, Decl::IDNS_Ordinary, 5042 ConflictingDecls.data(), 5043 ConflictingDecls.size()); 5044 } 5045 5046 if (!Name) 5047 return nullptr; 5048 5049 VarDecl *DTemplated = D->getTemplatedDecl(); 5050 5051 // Import the type. 5052 QualType T = Importer.Import(DTemplated->getType()); 5053 if (T.isNull()) 5054 return nullptr; 5055 5056 // Create the declaration that is being templated. 5057 SourceLocation StartLoc = Importer.Import(DTemplated->getLocStart()); 5058 SourceLocation IdLoc = Importer.Import(DTemplated->getLocation()); 5059 TypeSourceInfo *TInfo = Importer.Import(DTemplated->getTypeSourceInfo()); 5060 VarDecl *D2Templated = VarDecl::Create(Importer.getToContext(), DC, StartLoc, 5061 IdLoc, Name.getAsIdentifierInfo(), T, 5062 TInfo, DTemplated->getStorageClass()); 5063 D2Templated->setAccess(DTemplated->getAccess()); 5064 D2Templated->setQualifierInfo(Importer.Import(DTemplated->getQualifierLoc())); 5065 D2Templated->setLexicalDeclContext(LexicalDC); 5066 5067 // Importer.Imported(DTemplated, D2Templated); 5068 // LexicalDC->addDeclInternal(D2Templated); 5069 5070 // Merge the initializer. 5071 if (ImportDefinition(DTemplated, D2Templated)) 5072 return nullptr; 5073 5074 // Create the variable template declaration itself. 5075 TemplateParameterList *TemplateParams = 5076 ImportTemplateParameterList(D->getTemplateParameters()); 5077 if (!TemplateParams) 5078 return nullptr; 5079 5080 VarTemplateDecl *D2 = VarTemplateDecl::Create( 5081 Importer.getToContext(), DC, Loc, Name, TemplateParams, D2Templated); 5082 D2Templated->setDescribedVarTemplate(D2); 5083 5084 D2->setAccess(D->getAccess()); 5085 D2->setLexicalDeclContext(LexicalDC); 5086 LexicalDC->addDeclInternal(D2); 5087 5088 // Note the relationship between the variable templates. 5089 Importer.Imported(D, D2); 5090 Importer.Imported(DTemplated, D2Templated); 5091 5092 if (DTemplated->isThisDeclarationADefinition() && 5093 !D2Templated->isThisDeclarationADefinition()) { 5094 // FIXME: Import definition! 5095 } 5096 5097 return D2; 5098 } 5099 5100 Decl *ASTNodeImporter::VisitVarTemplateSpecializationDecl( 5101 VarTemplateSpecializationDecl *D) { 5102 // If this record has a definition in the translation unit we're coming from, 5103 // but this particular declaration is not that definition, import the 5104 // definition and map to that. 5105 VarDecl *Definition = D->getDefinition(); 5106 if (Definition && Definition != D) { 5107 Decl *ImportedDef = Importer.Import(Definition); 5108 if (!ImportedDef) 5109 return nullptr; 5110 5111 return Importer.Imported(D, ImportedDef); 5112 } 5113 5114 VarTemplateDecl *VarTemplate = cast_or_null<VarTemplateDecl>( 5115 Importer.Import(D->getSpecializedTemplate())); 5116 if (!VarTemplate) 5117 return nullptr; 5118 5119 // Import the context of this declaration. 5120 DeclContext *DC = VarTemplate->getDeclContext(); 5121 if (!DC) 5122 return nullptr; 5123 5124 DeclContext *LexicalDC = DC; 5125 if (D->getDeclContext() != D->getLexicalDeclContext()) { 5126 LexicalDC = Importer.ImportContext(D->getLexicalDeclContext()); 5127 if (!LexicalDC) 5128 return nullptr; 5129 } 5130 5131 // Import the location of this declaration. 5132 SourceLocation StartLoc = Importer.Import(D->getLocStart()); 5133 SourceLocation IdLoc = Importer.Import(D->getLocation()); 5134 5135 // Import template arguments. 5136 SmallVector<TemplateArgument, 2> TemplateArgs; 5137 if (ImportTemplateArguments(D->getTemplateArgs().data(), 5138 D->getTemplateArgs().size(), TemplateArgs)) 5139 return nullptr; 5140 5141 // Try to find an existing specialization with these template arguments. 5142 void *InsertPos = nullptr; 5143 VarTemplateSpecializationDecl *D2 = VarTemplate->findSpecialization( 5144 TemplateArgs, InsertPos); 5145 if (D2) { 5146 // We already have a variable template specialization with these template 5147 // arguments. 5148 5149 // FIXME: Check for specialization vs. instantiation errors. 5150 5151 if (VarDecl *FoundDef = D2->getDefinition()) { 5152 if (!D->isThisDeclarationADefinition() || 5153 IsStructuralMatch(D, FoundDef)) { 5154 // The record types structurally match, or the "from" translation 5155 // unit only had a forward declaration anyway; call it the same 5156 // variable. 5157 return Importer.Imported(D, FoundDef); 5158 } 5159 } 5160 } else { 5161 5162 // Import the type. 5163 QualType T = Importer.Import(D->getType()); 5164 if (T.isNull()) 5165 return nullptr; 5166 TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo()); 5167 5168 // Create a new specialization. 5169 D2 = VarTemplateSpecializationDecl::Create( 5170 Importer.getToContext(), DC, StartLoc, IdLoc, VarTemplate, T, TInfo, 5171 D->getStorageClass(), TemplateArgs); 5172 D2->setSpecializationKind(D->getSpecializationKind()); 5173 D2->setTemplateArgsInfo(D->getTemplateArgsInfo()); 5174 5175 // Add this specialization to the class template. 5176 VarTemplate->AddSpecialization(D2, InsertPos); 5177 5178 // Import the qualifier, if any. 5179 D2->setQualifierInfo(Importer.Import(D->getQualifierLoc())); 5180 5181 // Add the specialization to this context. 5182 D2->setLexicalDeclContext(LexicalDC); 5183 LexicalDC->addDeclInternal(D2); 5184 } 5185 Importer.Imported(D, D2); 5186 5187 if (D->isThisDeclarationADefinition() && ImportDefinition(D, D2)) 5188 return nullptr; 5189 5190 return D2; 5191 } 5192 5193 //---------------------------------------------------------------------------- 5194 // Import Statements 5195 //---------------------------------------------------------------------------- 5196 5197 DeclGroupRef ASTNodeImporter::ImportDeclGroup(DeclGroupRef DG) { 5198 if (DG.isNull()) 5199 return DeclGroupRef::Create(Importer.getToContext(), nullptr, 0); 5200 size_t NumDecls = DG.end() - DG.begin(); 5201 SmallVector<Decl *, 1> ToDecls(NumDecls); 5202 auto &_Importer = this->Importer; 5203 std::transform(DG.begin(), DG.end(), ToDecls.begin(), 5204 [&_Importer](Decl *D) -> Decl * { 5205 return _Importer.Import(D); 5206 }); 5207 return DeclGroupRef::Create(Importer.getToContext(), 5208 ToDecls.begin(), 5209 NumDecls); 5210 } 5211 5212 Stmt *ASTNodeImporter::VisitStmt(Stmt *S) { 5213 Importer.FromDiag(S->getLocStart(), diag::err_unsupported_ast_node) 5214 << S->getStmtClassName(); 5215 return nullptr; 5216 } 5217 5218 5219 Stmt *ASTNodeImporter::VisitGCCAsmStmt(GCCAsmStmt *S) { 5220 SmallVector<IdentifierInfo *, 4> Names; 5221 for (unsigned I = 0, E = S->getNumOutputs(); I != E; I++) { 5222 IdentifierInfo *ToII = Importer.Import(S->getOutputIdentifier(I)); 5223 // ToII is nullptr when no symbolic name is given for output operand 5224 // see ParseStmtAsm::ParseAsmOperandsOpt 5225 if (!ToII && S->getOutputIdentifier(I)) 5226 return nullptr; 5227 Names.push_back(ToII); 5228 } 5229 for (unsigned I = 0, E = S->getNumInputs(); I != E; I++) { 5230 IdentifierInfo *ToII = Importer.Import(S->getInputIdentifier(I)); 5231 // ToII is nullptr when no symbolic name is given for input operand 5232 // see ParseStmtAsm::ParseAsmOperandsOpt 5233 if (!ToII && S->getInputIdentifier(I)) 5234 return nullptr; 5235 Names.push_back(ToII); 5236 } 5237 5238 SmallVector<StringLiteral *, 4> Clobbers; 5239 for (unsigned I = 0, E = S->getNumClobbers(); I != E; I++) { 5240 StringLiteral *Clobber = cast_or_null<StringLiteral>( 5241 Importer.Import(S->getClobberStringLiteral(I))); 5242 if (!Clobber) 5243 return nullptr; 5244 Clobbers.push_back(Clobber); 5245 } 5246 5247 SmallVector<StringLiteral *, 4> Constraints; 5248 for (unsigned I = 0, E = S->getNumOutputs(); I != E; I++) { 5249 StringLiteral *Output = cast_or_null<StringLiteral>( 5250 Importer.Import(S->getOutputConstraintLiteral(I))); 5251 if (!Output) 5252 return nullptr; 5253 Constraints.push_back(Output); 5254 } 5255 5256 for (unsigned I = 0, E = S->getNumInputs(); I != E; I++) { 5257 StringLiteral *Input = cast_or_null<StringLiteral>( 5258 Importer.Import(S->getInputConstraintLiteral(I))); 5259 if (!Input) 5260 return nullptr; 5261 Constraints.push_back(Input); 5262 } 5263 5264 SmallVector<Expr *, 4> Exprs(S->getNumOutputs() + S->getNumInputs()); 5265 if (ImportContainerChecked(S->outputs(), Exprs)) 5266 return nullptr; 5267 5268 if (ImportArrayChecked(S->inputs(), Exprs.begin() + S->getNumOutputs())) 5269 return nullptr; 5270 5271 StringLiteral *AsmStr = cast_or_null<StringLiteral>( 5272 Importer.Import(S->getAsmString())); 5273 if (!AsmStr) 5274 return nullptr; 5275 5276 return new (Importer.getToContext()) GCCAsmStmt( 5277 Importer.getToContext(), 5278 Importer.Import(S->getAsmLoc()), 5279 S->isSimple(), 5280 S->isVolatile(), 5281 S->getNumOutputs(), 5282 S->getNumInputs(), 5283 Names.data(), 5284 Constraints.data(), 5285 Exprs.data(), 5286 AsmStr, 5287 S->getNumClobbers(), 5288 Clobbers.data(), 5289 Importer.Import(S->getRParenLoc())); 5290 } 5291 5292 Stmt *ASTNodeImporter::VisitDeclStmt(DeclStmt *S) { 5293 DeclGroupRef ToDG = ImportDeclGroup(S->getDeclGroup()); 5294 for (Decl *ToD : ToDG) { 5295 if (!ToD) 5296 return nullptr; 5297 } 5298 SourceLocation ToStartLoc = Importer.Import(S->getStartLoc()); 5299 SourceLocation ToEndLoc = Importer.Import(S->getEndLoc()); 5300 return new (Importer.getToContext()) DeclStmt(ToDG, ToStartLoc, ToEndLoc); 5301 } 5302 5303 Stmt *ASTNodeImporter::VisitNullStmt(NullStmt *S) { 5304 SourceLocation ToSemiLoc = Importer.Import(S->getSemiLoc()); 5305 return new (Importer.getToContext()) NullStmt(ToSemiLoc, 5306 S->hasLeadingEmptyMacro()); 5307 } 5308 5309 Stmt *ASTNodeImporter::VisitCompoundStmt(CompoundStmt *S) { 5310 llvm::SmallVector<Stmt *, 8> ToStmts(S->size()); 5311 5312 if (ImportContainerChecked(S->body(), ToStmts)) 5313 return nullptr; 5314 5315 SourceLocation ToLBraceLoc = Importer.Import(S->getLBracLoc()); 5316 SourceLocation ToRBraceLoc = Importer.Import(S->getRBracLoc()); 5317 return new (Importer.getToContext()) CompoundStmt(Importer.getToContext(), 5318 ToStmts, 5319 ToLBraceLoc, ToRBraceLoc); 5320 } 5321 5322 Stmt *ASTNodeImporter::VisitCaseStmt(CaseStmt *S) { 5323 Expr *ToLHS = Importer.Import(S->getLHS()); 5324 if (!ToLHS) 5325 return nullptr; 5326 Expr *ToRHS = Importer.Import(S->getRHS()); 5327 if (!ToRHS && S->getRHS()) 5328 return nullptr; 5329 SourceLocation ToCaseLoc = Importer.Import(S->getCaseLoc()); 5330 SourceLocation ToEllipsisLoc = Importer.Import(S->getEllipsisLoc()); 5331 SourceLocation ToColonLoc = Importer.Import(S->getColonLoc()); 5332 return new (Importer.getToContext()) CaseStmt(ToLHS, ToRHS, 5333 ToCaseLoc, ToEllipsisLoc, 5334 ToColonLoc); 5335 } 5336 5337 Stmt *ASTNodeImporter::VisitDefaultStmt(DefaultStmt *S) { 5338 SourceLocation ToDefaultLoc = Importer.Import(S->getDefaultLoc()); 5339 SourceLocation ToColonLoc = Importer.Import(S->getColonLoc()); 5340 Stmt *ToSubStmt = Importer.Import(S->getSubStmt()); 5341 if (!ToSubStmt && S->getSubStmt()) 5342 return nullptr; 5343 return new (Importer.getToContext()) DefaultStmt(ToDefaultLoc, ToColonLoc, 5344 ToSubStmt); 5345 } 5346 5347 Stmt *ASTNodeImporter::VisitLabelStmt(LabelStmt *S) { 5348 SourceLocation ToIdentLoc = Importer.Import(S->getIdentLoc()); 5349 LabelDecl *ToLabelDecl = 5350 cast_or_null<LabelDecl>(Importer.Import(S->getDecl())); 5351 if (!ToLabelDecl && S->getDecl()) 5352 return nullptr; 5353 Stmt *ToSubStmt = Importer.Import(S->getSubStmt()); 5354 if (!ToSubStmt && S->getSubStmt()) 5355 return nullptr; 5356 return new (Importer.getToContext()) LabelStmt(ToIdentLoc, ToLabelDecl, 5357 ToSubStmt); 5358 } 5359 5360 Stmt *ASTNodeImporter::VisitAttributedStmt(AttributedStmt *S) { 5361 SourceLocation ToAttrLoc = Importer.Import(S->getAttrLoc()); 5362 ArrayRef<const Attr*> FromAttrs(S->getAttrs()); 5363 SmallVector<const Attr *, 1> ToAttrs(FromAttrs.size()); 5364 ASTContext &_ToContext = Importer.getToContext(); 5365 std::transform(FromAttrs.begin(), FromAttrs.end(), ToAttrs.begin(), 5366 [&_ToContext](const Attr *A) -> const Attr * { 5367 return A->clone(_ToContext); 5368 }); 5369 for (const Attr *ToA : ToAttrs) { 5370 if (!ToA) 5371 return nullptr; 5372 } 5373 Stmt *ToSubStmt = Importer.Import(S->getSubStmt()); 5374 if (!ToSubStmt && S->getSubStmt()) 5375 return nullptr; 5376 return AttributedStmt::Create(Importer.getToContext(), ToAttrLoc, 5377 ToAttrs, ToSubStmt); 5378 } 5379 5380 Stmt *ASTNodeImporter::VisitIfStmt(IfStmt *S) { 5381 SourceLocation ToIfLoc = Importer.Import(S->getIfLoc()); 5382 Stmt *ToInit = Importer.Import(S->getInit()); 5383 if (!ToInit && S->getInit()) 5384 return nullptr; 5385 VarDecl *ToConditionVariable = nullptr; 5386 if (VarDecl *FromConditionVariable = S->getConditionVariable()) { 5387 ToConditionVariable = 5388 dyn_cast_or_null<VarDecl>(Importer.Import(FromConditionVariable)); 5389 if (!ToConditionVariable) 5390 return nullptr; 5391 } 5392 Expr *ToCondition = Importer.Import(S->getCond()); 5393 if (!ToCondition && S->getCond()) 5394 return nullptr; 5395 Stmt *ToThenStmt = Importer.Import(S->getThen()); 5396 if (!ToThenStmt && S->getThen()) 5397 return nullptr; 5398 SourceLocation ToElseLoc = Importer.Import(S->getElseLoc()); 5399 Stmt *ToElseStmt = Importer.Import(S->getElse()); 5400 if (!ToElseStmt && S->getElse()) 5401 return nullptr; 5402 return new (Importer.getToContext()) IfStmt(Importer.getToContext(), 5403 ToIfLoc, S->isConstexpr(), 5404 ToInit, 5405 ToConditionVariable, 5406 ToCondition, ToThenStmt, 5407 ToElseLoc, ToElseStmt); 5408 } 5409 5410 Stmt *ASTNodeImporter::VisitSwitchStmt(SwitchStmt *S) { 5411 Stmt *ToInit = Importer.Import(S->getInit()); 5412 if (!ToInit && S->getInit()) 5413 return nullptr; 5414 VarDecl *ToConditionVariable = nullptr; 5415 if (VarDecl *FromConditionVariable = S->getConditionVariable()) { 5416 ToConditionVariable = 5417 dyn_cast_or_null<VarDecl>(Importer.Import(FromConditionVariable)); 5418 if (!ToConditionVariable) 5419 return nullptr; 5420 } 5421 Expr *ToCondition = Importer.Import(S->getCond()); 5422 if (!ToCondition && S->getCond()) 5423 return nullptr; 5424 SwitchStmt *ToStmt = new (Importer.getToContext()) SwitchStmt( 5425 Importer.getToContext(), ToInit, 5426 ToConditionVariable, ToCondition); 5427 Stmt *ToBody = Importer.Import(S->getBody()); 5428 if (!ToBody && S->getBody()) 5429 return nullptr; 5430 ToStmt->setBody(ToBody); 5431 ToStmt->setSwitchLoc(Importer.Import(S->getSwitchLoc())); 5432 // Now we have to re-chain the cases. 5433 SwitchCase *LastChainedSwitchCase = nullptr; 5434 for (SwitchCase *SC = S->getSwitchCaseList(); SC != nullptr; 5435 SC = SC->getNextSwitchCase()) { 5436 SwitchCase *ToSC = dyn_cast_or_null<SwitchCase>(Importer.Import(SC)); 5437 if (!ToSC) 5438 return nullptr; 5439 if (LastChainedSwitchCase) 5440 LastChainedSwitchCase->setNextSwitchCase(ToSC); 5441 else 5442 ToStmt->setSwitchCaseList(ToSC); 5443 LastChainedSwitchCase = ToSC; 5444 } 5445 return ToStmt; 5446 } 5447 5448 Stmt *ASTNodeImporter::VisitWhileStmt(WhileStmt *S) { 5449 VarDecl *ToConditionVariable = nullptr; 5450 if (VarDecl *FromConditionVariable = S->getConditionVariable()) { 5451 ToConditionVariable = 5452 dyn_cast_or_null<VarDecl>(Importer.Import(FromConditionVariable)); 5453 if (!ToConditionVariable) 5454 return nullptr; 5455 } 5456 Expr *ToCondition = Importer.Import(S->getCond()); 5457 if (!ToCondition && S->getCond()) 5458 return nullptr; 5459 Stmt *ToBody = Importer.Import(S->getBody()); 5460 if (!ToBody && S->getBody()) 5461 return nullptr; 5462 SourceLocation ToWhileLoc = Importer.Import(S->getWhileLoc()); 5463 return new (Importer.getToContext()) WhileStmt(Importer.getToContext(), 5464 ToConditionVariable, 5465 ToCondition, ToBody, 5466 ToWhileLoc); 5467 } 5468 5469 Stmt *ASTNodeImporter::VisitDoStmt(DoStmt *S) { 5470 Stmt *ToBody = Importer.Import(S->getBody()); 5471 if (!ToBody && S->getBody()) 5472 return nullptr; 5473 Expr *ToCondition = Importer.Import(S->getCond()); 5474 if (!ToCondition && S->getCond()) 5475 return nullptr; 5476 SourceLocation ToDoLoc = Importer.Import(S->getDoLoc()); 5477 SourceLocation ToWhileLoc = Importer.Import(S->getWhileLoc()); 5478 SourceLocation ToRParenLoc = Importer.Import(S->getRParenLoc()); 5479 return new (Importer.getToContext()) DoStmt(ToBody, ToCondition, 5480 ToDoLoc, ToWhileLoc, 5481 ToRParenLoc); 5482 } 5483 5484 Stmt *ASTNodeImporter::VisitForStmt(ForStmt *S) { 5485 Stmt *ToInit = Importer.Import(S->getInit()); 5486 if (!ToInit && S->getInit()) 5487 return nullptr; 5488 Expr *ToCondition = Importer.Import(S->getCond()); 5489 if (!ToCondition && S->getCond()) 5490 return nullptr; 5491 VarDecl *ToConditionVariable = nullptr; 5492 if (VarDecl *FromConditionVariable = S->getConditionVariable()) { 5493 ToConditionVariable = 5494 dyn_cast_or_null<VarDecl>(Importer.Import(FromConditionVariable)); 5495 if (!ToConditionVariable) 5496 return nullptr; 5497 } 5498 Expr *ToInc = Importer.Import(S->getInc()); 5499 if (!ToInc && S->getInc()) 5500 return nullptr; 5501 Stmt *ToBody = Importer.Import(S->getBody()); 5502 if (!ToBody && S->getBody()) 5503 return nullptr; 5504 SourceLocation ToForLoc = Importer.Import(S->getForLoc()); 5505 SourceLocation ToLParenLoc = Importer.Import(S->getLParenLoc()); 5506 SourceLocation ToRParenLoc = Importer.Import(S->getRParenLoc()); 5507 return new (Importer.getToContext()) ForStmt(Importer.getToContext(), 5508 ToInit, ToCondition, 5509 ToConditionVariable, 5510 ToInc, ToBody, 5511 ToForLoc, ToLParenLoc, 5512 ToRParenLoc); 5513 } 5514 5515 Stmt *ASTNodeImporter::VisitGotoStmt(GotoStmt *S) { 5516 LabelDecl *ToLabel = nullptr; 5517 if (LabelDecl *FromLabel = S->getLabel()) { 5518 ToLabel = dyn_cast_or_null<LabelDecl>(Importer.Import(FromLabel)); 5519 if (!ToLabel) 5520 return nullptr; 5521 } 5522 SourceLocation ToGotoLoc = Importer.Import(S->getGotoLoc()); 5523 SourceLocation ToLabelLoc = Importer.Import(S->getLabelLoc()); 5524 return new (Importer.getToContext()) GotoStmt(ToLabel, 5525 ToGotoLoc, ToLabelLoc); 5526 } 5527 5528 Stmt *ASTNodeImporter::VisitIndirectGotoStmt(IndirectGotoStmt *S) { 5529 SourceLocation ToGotoLoc = Importer.Import(S->getGotoLoc()); 5530 SourceLocation ToStarLoc = Importer.Import(S->getStarLoc()); 5531 Expr *ToTarget = Importer.Import(S->getTarget()); 5532 if (!ToTarget && S->getTarget()) 5533 return nullptr; 5534 return new (Importer.getToContext()) IndirectGotoStmt(ToGotoLoc, ToStarLoc, 5535 ToTarget); 5536 } 5537 5538 Stmt *ASTNodeImporter::VisitContinueStmt(ContinueStmt *S) { 5539 SourceLocation ToContinueLoc = Importer.Import(S->getContinueLoc()); 5540 return new (Importer.getToContext()) ContinueStmt(ToContinueLoc); 5541 } 5542 5543 Stmt *ASTNodeImporter::VisitBreakStmt(BreakStmt *S) { 5544 SourceLocation ToBreakLoc = Importer.Import(S->getBreakLoc()); 5545 return new (Importer.getToContext()) BreakStmt(ToBreakLoc); 5546 } 5547 5548 Stmt *ASTNodeImporter::VisitReturnStmt(ReturnStmt *S) { 5549 SourceLocation ToRetLoc = Importer.Import(S->getReturnLoc()); 5550 Expr *ToRetExpr = Importer.Import(S->getRetValue()); 5551 if (!ToRetExpr && S->getRetValue()) 5552 return nullptr; 5553 VarDecl *NRVOCandidate = const_cast<VarDecl*>(S->getNRVOCandidate()); 5554 VarDecl *ToNRVOCandidate = cast_or_null<VarDecl>(Importer.Import(NRVOCandidate)); 5555 if (!ToNRVOCandidate && NRVOCandidate) 5556 return nullptr; 5557 return new (Importer.getToContext()) ReturnStmt(ToRetLoc, ToRetExpr, 5558 ToNRVOCandidate); 5559 } 5560 5561 Stmt *ASTNodeImporter::VisitCXXCatchStmt(CXXCatchStmt *S) { 5562 SourceLocation ToCatchLoc = Importer.Import(S->getCatchLoc()); 5563 VarDecl *ToExceptionDecl = nullptr; 5564 if (VarDecl *FromExceptionDecl = S->getExceptionDecl()) { 5565 ToExceptionDecl = 5566 dyn_cast_or_null<VarDecl>(Importer.Import(FromExceptionDecl)); 5567 if (!ToExceptionDecl) 5568 return nullptr; 5569 } 5570 Stmt *ToHandlerBlock = Importer.Import(S->getHandlerBlock()); 5571 if (!ToHandlerBlock && S->getHandlerBlock()) 5572 return nullptr; 5573 return new (Importer.getToContext()) CXXCatchStmt(ToCatchLoc, 5574 ToExceptionDecl, 5575 ToHandlerBlock); 5576 } 5577 5578 Stmt *ASTNodeImporter::VisitCXXTryStmt(CXXTryStmt *S) { 5579 SourceLocation ToTryLoc = Importer.Import(S->getTryLoc()); 5580 Stmt *ToTryBlock = Importer.Import(S->getTryBlock()); 5581 if (!ToTryBlock && S->getTryBlock()) 5582 return nullptr; 5583 SmallVector<Stmt *, 1> ToHandlers(S->getNumHandlers()); 5584 for (unsigned HI = 0, HE = S->getNumHandlers(); HI != HE; ++HI) { 5585 CXXCatchStmt *FromHandler = S->getHandler(HI); 5586 if (Stmt *ToHandler = Importer.Import(FromHandler)) 5587 ToHandlers[HI] = ToHandler; 5588 else 5589 return nullptr; 5590 } 5591 return CXXTryStmt::Create(Importer.getToContext(), ToTryLoc, ToTryBlock, 5592 ToHandlers); 5593 } 5594 5595 Stmt *ASTNodeImporter::VisitCXXForRangeStmt(CXXForRangeStmt *S) { 5596 DeclStmt *ToRange = 5597 dyn_cast_or_null<DeclStmt>(Importer.Import(S->getRangeStmt())); 5598 if (!ToRange && S->getRangeStmt()) 5599 return nullptr; 5600 DeclStmt *ToBegin = 5601 dyn_cast_or_null<DeclStmt>(Importer.Import(S->getBeginStmt())); 5602 if (!ToBegin && S->getBeginStmt()) 5603 return nullptr; 5604 DeclStmt *ToEnd = 5605 dyn_cast_or_null<DeclStmt>(Importer.Import(S->getEndStmt())); 5606 if (!ToEnd && S->getEndStmt()) 5607 return nullptr; 5608 Expr *ToCond = Importer.Import(S->getCond()); 5609 if (!ToCond && S->getCond()) 5610 return nullptr; 5611 Expr *ToInc = Importer.Import(S->getInc()); 5612 if (!ToInc && S->getInc()) 5613 return nullptr; 5614 DeclStmt *ToLoopVar = 5615 dyn_cast_or_null<DeclStmt>(Importer.Import(S->getLoopVarStmt())); 5616 if (!ToLoopVar && S->getLoopVarStmt()) 5617 return nullptr; 5618 Stmt *ToBody = Importer.Import(S->getBody()); 5619 if (!ToBody && S->getBody()) 5620 return nullptr; 5621 SourceLocation ToForLoc = Importer.Import(S->getForLoc()); 5622 SourceLocation ToCoawaitLoc = Importer.Import(S->getCoawaitLoc()); 5623 SourceLocation ToColonLoc = Importer.Import(S->getColonLoc()); 5624 SourceLocation ToRParenLoc = Importer.Import(S->getRParenLoc()); 5625 return new (Importer.getToContext()) CXXForRangeStmt(ToRange, ToBegin, ToEnd, 5626 ToCond, ToInc, 5627 ToLoopVar, ToBody, 5628 ToForLoc, ToCoawaitLoc, 5629 ToColonLoc, ToRParenLoc); 5630 } 5631 5632 Stmt *ASTNodeImporter::VisitObjCForCollectionStmt(ObjCForCollectionStmt *S) { 5633 Stmt *ToElem = Importer.Import(S->getElement()); 5634 if (!ToElem && S->getElement()) 5635 return nullptr; 5636 Expr *ToCollect = Importer.Import(S->getCollection()); 5637 if (!ToCollect && S->getCollection()) 5638 return nullptr; 5639 Stmt *ToBody = Importer.Import(S->getBody()); 5640 if (!ToBody && S->getBody()) 5641 return nullptr; 5642 SourceLocation ToForLoc = Importer.Import(S->getForLoc()); 5643 SourceLocation ToRParenLoc = Importer.Import(S->getRParenLoc()); 5644 return new (Importer.getToContext()) ObjCForCollectionStmt(ToElem, 5645 ToCollect, 5646 ToBody, ToForLoc, 5647 ToRParenLoc); 5648 } 5649 5650 Stmt *ASTNodeImporter::VisitObjCAtCatchStmt(ObjCAtCatchStmt *S) { 5651 SourceLocation ToAtCatchLoc = Importer.Import(S->getAtCatchLoc()); 5652 SourceLocation ToRParenLoc = Importer.Import(S->getRParenLoc()); 5653 VarDecl *ToExceptionDecl = nullptr; 5654 if (VarDecl *FromExceptionDecl = S->getCatchParamDecl()) { 5655 ToExceptionDecl = 5656 dyn_cast_or_null<VarDecl>(Importer.Import(FromExceptionDecl)); 5657 if (!ToExceptionDecl) 5658 return nullptr; 5659 } 5660 Stmt *ToBody = Importer.Import(S->getCatchBody()); 5661 if (!ToBody && S->getCatchBody()) 5662 return nullptr; 5663 return new (Importer.getToContext()) ObjCAtCatchStmt(ToAtCatchLoc, 5664 ToRParenLoc, 5665 ToExceptionDecl, 5666 ToBody); 5667 } 5668 5669 Stmt *ASTNodeImporter::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 5670 SourceLocation ToAtFinallyLoc = Importer.Import(S->getAtFinallyLoc()); 5671 Stmt *ToAtFinallyStmt = Importer.Import(S->getFinallyBody()); 5672 if (!ToAtFinallyStmt && S->getFinallyBody()) 5673 return nullptr; 5674 return new (Importer.getToContext()) ObjCAtFinallyStmt(ToAtFinallyLoc, 5675 ToAtFinallyStmt); 5676 } 5677 5678 Stmt *ASTNodeImporter::VisitObjCAtTryStmt(ObjCAtTryStmt *S) { 5679 SourceLocation ToAtTryLoc = Importer.Import(S->getAtTryLoc()); 5680 Stmt *ToAtTryStmt = Importer.Import(S->getTryBody()); 5681 if (!ToAtTryStmt && S->getTryBody()) 5682 return nullptr; 5683 SmallVector<Stmt *, 1> ToCatchStmts(S->getNumCatchStmts()); 5684 for (unsigned CI = 0, CE = S->getNumCatchStmts(); CI != CE; ++CI) { 5685 ObjCAtCatchStmt *FromCatchStmt = S->getCatchStmt(CI); 5686 if (Stmt *ToCatchStmt = Importer.Import(FromCatchStmt)) 5687 ToCatchStmts[CI] = ToCatchStmt; 5688 else 5689 return nullptr; 5690 } 5691 Stmt *ToAtFinallyStmt = Importer.Import(S->getFinallyStmt()); 5692 if (!ToAtFinallyStmt && S->getFinallyStmt()) 5693 return nullptr; 5694 return ObjCAtTryStmt::Create(Importer.getToContext(), 5695 ToAtTryLoc, ToAtTryStmt, 5696 ToCatchStmts.begin(), ToCatchStmts.size(), 5697 ToAtFinallyStmt); 5698 } 5699 5700 Stmt *ASTNodeImporter::VisitObjCAtSynchronizedStmt 5701 (ObjCAtSynchronizedStmt *S) { 5702 SourceLocation ToAtSynchronizedLoc = 5703 Importer.Import(S->getAtSynchronizedLoc()); 5704 Expr *ToSynchExpr = Importer.Import(S->getSynchExpr()); 5705 if (!ToSynchExpr && S->getSynchExpr()) 5706 return nullptr; 5707 Stmt *ToSynchBody = Importer.Import(S->getSynchBody()); 5708 if (!ToSynchBody && S->getSynchBody()) 5709 return nullptr; 5710 return new (Importer.getToContext()) ObjCAtSynchronizedStmt( 5711 ToAtSynchronizedLoc, ToSynchExpr, ToSynchBody); 5712 } 5713 5714 Stmt *ASTNodeImporter::VisitObjCAtThrowStmt(ObjCAtThrowStmt *S) { 5715 SourceLocation ToAtThrowLoc = Importer.Import(S->getThrowLoc()); 5716 Expr *ToThrow = Importer.Import(S->getThrowExpr()); 5717 if (!ToThrow && S->getThrowExpr()) 5718 return nullptr; 5719 return new (Importer.getToContext()) ObjCAtThrowStmt(ToAtThrowLoc, ToThrow); 5720 } 5721 5722 Stmt *ASTNodeImporter::VisitObjCAutoreleasePoolStmt 5723 (ObjCAutoreleasePoolStmt *S) { 5724 SourceLocation ToAtLoc = Importer.Import(S->getAtLoc()); 5725 Stmt *ToSubStmt = Importer.Import(S->getSubStmt()); 5726 if (!ToSubStmt && S->getSubStmt()) 5727 return nullptr; 5728 return new (Importer.getToContext()) ObjCAutoreleasePoolStmt(ToAtLoc, 5729 ToSubStmt); 5730 } 5731 5732 //---------------------------------------------------------------------------- 5733 // Import Expressions 5734 //---------------------------------------------------------------------------- 5735 Expr *ASTNodeImporter::VisitExpr(Expr *E) { 5736 Importer.FromDiag(E->getLocStart(), diag::err_unsupported_ast_node) 5737 << E->getStmtClassName(); 5738 return nullptr; 5739 } 5740 5741 Expr *ASTNodeImporter::VisitVAArgExpr(VAArgExpr *E) { 5742 QualType T = Importer.Import(E->getType()); 5743 if (T.isNull()) 5744 return nullptr; 5745 5746 Expr *SubExpr = Importer.Import(E->getSubExpr()); 5747 if (!SubExpr && E->getSubExpr()) 5748 return nullptr; 5749 5750 TypeSourceInfo *TInfo = Importer.Import(E->getWrittenTypeInfo()); 5751 if (!TInfo) 5752 return nullptr; 5753 5754 return new (Importer.getToContext()) VAArgExpr( 5755 Importer.Import(E->getBuiltinLoc()), SubExpr, TInfo, 5756 Importer.Import(E->getRParenLoc()), T, E->isMicrosoftABI()); 5757 } 5758 5759 5760 Expr *ASTNodeImporter::VisitGNUNullExpr(GNUNullExpr *E) { 5761 QualType T = Importer.Import(E->getType()); 5762 if (T.isNull()) 5763 return nullptr; 5764 5765 return new (Importer.getToContext()) GNUNullExpr( 5766 T, Importer.Import(E->getLocStart())); 5767 } 5768 5769 Expr *ASTNodeImporter::VisitPredefinedExpr(PredefinedExpr *E) { 5770 QualType T = Importer.Import(E->getType()); 5771 if (T.isNull()) 5772 return nullptr; 5773 5774 StringLiteral *SL = cast_or_null<StringLiteral>( 5775 Importer.Import(E->getFunctionName())); 5776 if (!SL && E->getFunctionName()) 5777 return nullptr; 5778 5779 return new (Importer.getToContext()) PredefinedExpr( 5780 Importer.Import(E->getLocStart()), T, E->getIdentType(), SL); 5781 } 5782 5783 Expr *ASTNodeImporter::VisitDeclRefExpr(DeclRefExpr *E) { 5784 ValueDecl *ToD = cast_or_null<ValueDecl>(Importer.Import(E->getDecl())); 5785 if (!ToD) 5786 return nullptr; 5787 5788 NamedDecl *FoundD = nullptr; 5789 if (E->getDecl() != E->getFoundDecl()) { 5790 FoundD = cast_or_null<NamedDecl>(Importer.Import(E->getFoundDecl())); 5791 if (!FoundD) 5792 return nullptr; 5793 } 5794 5795 QualType T = Importer.Import(E->getType()); 5796 if (T.isNull()) 5797 return nullptr; 5798 5799 5800 TemplateArgumentListInfo ToTAInfo; 5801 TemplateArgumentListInfo *ResInfo = nullptr; 5802 if (E->hasExplicitTemplateArgs()) { 5803 for (const auto &FromLoc : E->template_arguments()) { 5804 bool Error = false; 5805 TemplateArgumentLoc ToTALoc = ImportTemplateArgumentLoc(FromLoc, Error); 5806 if (Error) 5807 return nullptr; 5808 ToTAInfo.addArgument(ToTALoc); 5809 } 5810 ResInfo = &ToTAInfo; 5811 } 5812 5813 DeclRefExpr *DRE = DeclRefExpr::Create(Importer.getToContext(), 5814 Importer.Import(E->getQualifierLoc()), 5815 Importer.Import(E->getTemplateKeywordLoc()), 5816 ToD, 5817 E->refersToEnclosingVariableOrCapture(), 5818 Importer.Import(E->getLocation()), 5819 T, E->getValueKind(), 5820 FoundD, ResInfo); 5821 if (E->hadMultipleCandidates()) 5822 DRE->setHadMultipleCandidates(true); 5823 return DRE; 5824 } 5825 5826 Expr *ASTNodeImporter::VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) { 5827 QualType T = Importer.Import(E->getType()); 5828 if (T.isNull()) 5829 return nullptr; 5830 5831 return new (Importer.getToContext()) ImplicitValueInitExpr(T); 5832 } 5833 5834 ASTNodeImporter::Designator 5835 ASTNodeImporter::ImportDesignator(const Designator &D) { 5836 if (D.isFieldDesignator()) { 5837 IdentifierInfo *ToFieldName = Importer.Import(D.getFieldName()); 5838 // Caller checks for import error 5839 return Designator(ToFieldName, Importer.Import(D.getDotLoc()), 5840 Importer.Import(D.getFieldLoc())); 5841 } 5842 if (D.isArrayDesignator()) 5843 return Designator(D.getFirstExprIndex(), 5844 Importer.Import(D.getLBracketLoc()), 5845 Importer.Import(D.getRBracketLoc())); 5846 5847 assert(D.isArrayRangeDesignator()); 5848 return Designator(D.getFirstExprIndex(), 5849 Importer.Import(D.getLBracketLoc()), 5850 Importer.Import(D.getEllipsisLoc()), 5851 Importer.Import(D.getRBracketLoc())); 5852 } 5853 5854 5855 Expr *ASTNodeImporter::VisitDesignatedInitExpr(DesignatedInitExpr *DIE) { 5856 Expr *Init = cast_or_null<Expr>(Importer.Import(DIE->getInit())); 5857 if (!Init) 5858 return nullptr; 5859 5860 SmallVector<Expr *, 4> IndexExprs(DIE->getNumSubExprs() - 1); 5861 // List elements from the second, the first is Init itself 5862 for (unsigned I = 1, E = DIE->getNumSubExprs(); I < E; I++) { 5863 if (Expr *Arg = cast_or_null<Expr>(Importer.Import(DIE->getSubExpr(I)))) 5864 IndexExprs[I - 1] = Arg; 5865 else 5866 return nullptr; 5867 } 5868 5869 SmallVector<Designator, 4> Designators(DIE->size()); 5870 llvm::transform(DIE->designators(), Designators.begin(), 5871 [this](const Designator &D) -> Designator { 5872 return ImportDesignator(D); 5873 }); 5874 5875 for (const Designator &D : DIE->designators()) 5876 if (D.isFieldDesignator() && !D.getFieldName()) 5877 return nullptr; 5878 5879 return DesignatedInitExpr::Create( 5880 Importer.getToContext(), Designators, 5881 IndexExprs, Importer.Import(DIE->getEqualOrColonLoc()), 5882 DIE->usesGNUSyntax(), Init); 5883 } 5884 5885 Expr *ASTNodeImporter::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) { 5886 QualType T = Importer.Import(E->getType()); 5887 if (T.isNull()) 5888 return nullptr; 5889 5890 return new (Importer.getToContext()) 5891 CXXNullPtrLiteralExpr(T, Importer.Import(E->getLocation())); 5892 } 5893 5894 Expr *ASTNodeImporter::VisitIntegerLiteral(IntegerLiteral *E) { 5895 QualType T = Importer.Import(E->getType()); 5896 if (T.isNull()) 5897 return nullptr; 5898 5899 return IntegerLiteral::Create(Importer.getToContext(), 5900 E->getValue(), T, 5901 Importer.Import(E->getLocation())); 5902 } 5903 5904 Expr *ASTNodeImporter::VisitFloatingLiteral(FloatingLiteral *E) { 5905 QualType T = Importer.Import(E->getType()); 5906 if (T.isNull()) 5907 return nullptr; 5908 5909 return FloatingLiteral::Create(Importer.getToContext(), 5910 E->getValue(), E->isExact(), T, 5911 Importer.Import(E->getLocation())); 5912 } 5913 5914 Expr *ASTNodeImporter::VisitCharacterLiteral(CharacterLiteral *E) { 5915 QualType T = Importer.Import(E->getType()); 5916 if (T.isNull()) 5917 return nullptr; 5918 5919 return new (Importer.getToContext()) CharacterLiteral(E->getValue(), 5920 E->getKind(), T, 5921 Importer.Import(E->getLocation())); 5922 } 5923 5924 Expr *ASTNodeImporter::VisitStringLiteral(StringLiteral *E) { 5925 QualType T = Importer.Import(E->getType()); 5926 if (T.isNull()) 5927 return nullptr; 5928 5929 SmallVector<SourceLocation, 4> Locations(E->getNumConcatenated()); 5930 ImportArray(E->tokloc_begin(), E->tokloc_end(), Locations.begin()); 5931 5932 return StringLiteral::Create(Importer.getToContext(), E->getBytes(), 5933 E->getKind(), E->isPascal(), T, 5934 Locations.data(), Locations.size()); 5935 } 5936 5937 Expr *ASTNodeImporter::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) { 5938 QualType T = Importer.Import(E->getType()); 5939 if (T.isNull()) 5940 return nullptr; 5941 5942 TypeSourceInfo *TInfo = Importer.Import(E->getTypeSourceInfo()); 5943 if (!TInfo) 5944 return nullptr; 5945 5946 Expr *Init = Importer.Import(E->getInitializer()); 5947 if (!Init) 5948 return nullptr; 5949 5950 return new (Importer.getToContext()) CompoundLiteralExpr( 5951 Importer.Import(E->getLParenLoc()), TInfo, T, E->getValueKind(), 5952 Init, E->isFileScope()); 5953 } 5954 5955 Expr *ASTNodeImporter::VisitAtomicExpr(AtomicExpr *E) { 5956 QualType T = Importer.Import(E->getType()); 5957 if (T.isNull()) 5958 return nullptr; 5959 5960 SmallVector<Expr *, 6> Exprs(E->getNumSubExprs()); 5961 if (ImportArrayChecked( 5962 E->getSubExprs(), E->getSubExprs() + E->getNumSubExprs(), 5963 Exprs.begin())) 5964 return nullptr; 5965 5966 return new (Importer.getToContext()) AtomicExpr( 5967 Importer.Import(E->getBuiltinLoc()), Exprs, T, E->getOp(), 5968 Importer.Import(E->getRParenLoc())); 5969 } 5970 5971 Expr *ASTNodeImporter::VisitAddrLabelExpr(AddrLabelExpr *E) { 5972 QualType T = Importer.Import(E->getType()); 5973 if (T.isNull()) 5974 return nullptr; 5975 5976 LabelDecl *ToLabel = cast_or_null<LabelDecl>(Importer.Import(E->getLabel())); 5977 if (!ToLabel) 5978 return nullptr; 5979 5980 return new (Importer.getToContext()) AddrLabelExpr( 5981 Importer.Import(E->getAmpAmpLoc()), Importer.Import(E->getLabelLoc()), 5982 ToLabel, T); 5983 } 5984 5985 Expr *ASTNodeImporter::VisitParenExpr(ParenExpr *E) { 5986 Expr *SubExpr = Importer.Import(E->getSubExpr()); 5987 if (!SubExpr) 5988 return nullptr; 5989 5990 return new (Importer.getToContext()) 5991 ParenExpr(Importer.Import(E->getLParen()), 5992 Importer.Import(E->getRParen()), 5993 SubExpr); 5994 } 5995 5996 Expr *ASTNodeImporter::VisitParenListExpr(ParenListExpr *E) { 5997 SmallVector<Expr *, 4> Exprs(E->getNumExprs()); 5998 if (ImportContainerChecked(E->exprs(), Exprs)) 5999 return nullptr; 6000 6001 return new (Importer.getToContext()) ParenListExpr( 6002 Importer.getToContext(), Importer.Import(E->getLParenLoc()), 6003 Exprs, Importer.Import(E->getLParenLoc())); 6004 } 6005 6006 Expr *ASTNodeImporter::VisitStmtExpr(StmtExpr *E) { 6007 QualType T = Importer.Import(E->getType()); 6008 if (T.isNull()) 6009 return nullptr; 6010 6011 CompoundStmt *ToSubStmt = cast_or_null<CompoundStmt>( 6012 Importer.Import(E->getSubStmt())); 6013 if (!ToSubStmt && E->getSubStmt()) 6014 return nullptr; 6015 6016 return new (Importer.getToContext()) StmtExpr(ToSubStmt, T, 6017 Importer.Import(E->getLParenLoc()), Importer.Import(E->getRParenLoc())); 6018 } 6019 6020 Expr *ASTNodeImporter::VisitUnaryOperator(UnaryOperator *E) { 6021 QualType T = Importer.Import(E->getType()); 6022 if (T.isNull()) 6023 return nullptr; 6024 6025 Expr *SubExpr = Importer.Import(E->getSubExpr()); 6026 if (!SubExpr) 6027 return nullptr; 6028 6029 return new (Importer.getToContext()) UnaryOperator(SubExpr, E->getOpcode(), 6030 T, E->getValueKind(), 6031 E->getObjectKind(), 6032 Importer.Import(E->getOperatorLoc())); 6033 } 6034 6035 Expr *ASTNodeImporter::VisitUnaryExprOrTypeTraitExpr( 6036 UnaryExprOrTypeTraitExpr *E) { 6037 QualType ResultType = Importer.Import(E->getType()); 6038 6039 if (E->isArgumentType()) { 6040 TypeSourceInfo *TInfo = Importer.Import(E->getArgumentTypeInfo()); 6041 if (!TInfo) 6042 return nullptr; 6043 6044 return new (Importer.getToContext()) UnaryExprOrTypeTraitExpr(E->getKind(), 6045 TInfo, ResultType, 6046 Importer.Import(E->getOperatorLoc()), 6047 Importer.Import(E->getRParenLoc())); 6048 } 6049 6050 Expr *SubExpr = Importer.Import(E->getArgumentExpr()); 6051 if (!SubExpr) 6052 return nullptr; 6053 6054 return new (Importer.getToContext()) UnaryExprOrTypeTraitExpr(E->getKind(), 6055 SubExpr, ResultType, 6056 Importer.Import(E->getOperatorLoc()), 6057 Importer.Import(E->getRParenLoc())); 6058 } 6059 6060 Expr *ASTNodeImporter::VisitBinaryOperator(BinaryOperator *E) { 6061 QualType T = Importer.Import(E->getType()); 6062 if (T.isNull()) 6063 return nullptr; 6064 6065 Expr *LHS = Importer.Import(E->getLHS()); 6066 if (!LHS) 6067 return nullptr; 6068 6069 Expr *RHS = Importer.Import(E->getRHS()); 6070 if (!RHS) 6071 return nullptr; 6072 6073 return new (Importer.getToContext()) BinaryOperator(LHS, RHS, E->getOpcode(), 6074 T, E->getValueKind(), 6075 E->getObjectKind(), 6076 Importer.Import(E->getOperatorLoc()), 6077 E->getFPFeatures()); 6078 } 6079 6080 Expr *ASTNodeImporter::VisitConditionalOperator(ConditionalOperator *E) { 6081 QualType T = Importer.Import(E->getType()); 6082 if (T.isNull()) 6083 return nullptr; 6084 6085 Expr *ToLHS = Importer.Import(E->getLHS()); 6086 if (!ToLHS) 6087 return nullptr; 6088 6089 Expr *ToRHS = Importer.Import(E->getRHS()); 6090 if (!ToRHS) 6091 return nullptr; 6092 6093 Expr *ToCond = Importer.Import(E->getCond()); 6094 if (!ToCond) 6095 return nullptr; 6096 6097 return new (Importer.getToContext()) ConditionalOperator( 6098 ToCond, Importer.Import(E->getQuestionLoc()), 6099 ToLHS, Importer.Import(E->getColonLoc()), 6100 ToRHS, T, E->getValueKind(), E->getObjectKind()); 6101 } 6102 6103 Expr *ASTNodeImporter::VisitBinaryConditionalOperator( 6104 BinaryConditionalOperator *E) { 6105 QualType T = Importer.Import(E->getType()); 6106 if (T.isNull()) 6107 return nullptr; 6108 6109 Expr *Common = Importer.Import(E->getCommon()); 6110 if (!Common) 6111 return nullptr; 6112 6113 Expr *Cond = Importer.Import(E->getCond()); 6114 if (!Cond) 6115 return nullptr; 6116 6117 OpaqueValueExpr *OpaqueValue = cast_or_null<OpaqueValueExpr>( 6118 Importer.Import(E->getOpaqueValue())); 6119 if (!OpaqueValue) 6120 return nullptr; 6121 6122 Expr *TrueExpr = Importer.Import(E->getTrueExpr()); 6123 if (!TrueExpr) 6124 return nullptr; 6125 6126 Expr *FalseExpr = Importer.Import(E->getFalseExpr()); 6127 if (!FalseExpr) 6128 return nullptr; 6129 6130 return new (Importer.getToContext()) BinaryConditionalOperator( 6131 Common, OpaqueValue, Cond, TrueExpr, FalseExpr, 6132 Importer.Import(E->getQuestionLoc()), Importer.Import(E->getColonLoc()), 6133 T, E->getValueKind(), E->getObjectKind()); 6134 } 6135 6136 Expr *ASTNodeImporter::VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E) { 6137 QualType T = Importer.Import(E->getType()); 6138 if (T.isNull()) 6139 return nullptr; 6140 6141 TypeSourceInfo *ToQueried = Importer.Import(E->getQueriedTypeSourceInfo()); 6142 if (!ToQueried) 6143 return nullptr; 6144 6145 Expr *Dim = Importer.Import(E->getDimensionExpression()); 6146 if (!Dim && E->getDimensionExpression()) 6147 return nullptr; 6148 6149 return new (Importer.getToContext()) ArrayTypeTraitExpr( 6150 Importer.Import(E->getLocStart()), E->getTrait(), ToQueried, 6151 E->getValue(), Dim, Importer.Import(E->getLocEnd()), T); 6152 } 6153 6154 Expr *ASTNodeImporter::VisitExpressionTraitExpr(ExpressionTraitExpr *E) { 6155 QualType T = Importer.Import(E->getType()); 6156 if (T.isNull()) 6157 return nullptr; 6158 6159 Expr *ToQueried = Importer.Import(E->getQueriedExpression()); 6160 if (!ToQueried) 6161 return nullptr; 6162 6163 return new (Importer.getToContext()) ExpressionTraitExpr( 6164 Importer.Import(E->getLocStart()), E->getTrait(), ToQueried, 6165 E->getValue(), Importer.Import(E->getLocEnd()), T); 6166 } 6167 6168 Expr *ASTNodeImporter::VisitOpaqueValueExpr(OpaqueValueExpr *E) { 6169 QualType T = Importer.Import(E->getType()); 6170 if (T.isNull()) 6171 return nullptr; 6172 6173 Expr *SourceExpr = Importer.Import(E->getSourceExpr()); 6174 if (!SourceExpr && E->getSourceExpr()) 6175 return nullptr; 6176 6177 return new (Importer.getToContext()) OpaqueValueExpr( 6178 Importer.Import(E->getLocation()), T, E->getValueKind(), 6179 E->getObjectKind(), SourceExpr); 6180 } 6181 6182 Expr *ASTNodeImporter::VisitArraySubscriptExpr(ArraySubscriptExpr *E) { 6183 QualType T = Importer.Import(E->getType()); 6184 if (T.isNull()) 6185 return nullptr; 6186 6187 Expr *ToLHS = Importer.Import(E->getLHS()); 6188 if (!ToLHS) 6189 return nullptr; 6190 6191 Expr *ToRHS = Importer.Import(E->getRHS()); 6192 if (!ToRHS) 6193 return nullptr; 6194 6195 return new (Importer.getToContext()) ArraySubscriptExpr( 6196 ToLHS, ToRHS, T, E->getValueKind(), E->getObjectKind(), 6197 Importer.Import(E->getRBracketLoc())); 6198 } 6199 6200 Expr *ASTNodeImporter::VisitCompoundAssignOperator(CompoundAssignOperator *E) { 6201 QualType T = Importer.Import(E->getType()); 6202 if (T.isNull()) 6203 return nullptr; 6204 6205 QualType CompLHSType = Importer.Import(E->getComputationLHSType()); 6206 if (CompLHSType.isNull()) 6207 return nullptr; 6208 6209 QualType CompResultType = Importer.Import(E->getComputationResultType()); 6210 if (CompResultType.isNull()) 6211 return nullptr; 6212 6213 Expr *LHS = Importer.Import(E->getLHS()); 6214 if (!LHS) 6215 return nullptr; 6216 6217 Expr *RHS = Importer.Import(E->getRHS()); 6218 if (!RHS) 6219 return nullptr; 6220 6221 return new (Importer.getToContext()) 6222 CompoundAssignOperator(LHS, RHS, E->getOpcode(), 6223 T, E->getValueKind(), 6224 E->getObjectKind(), 6225 CompLHSType, CompResultType, 6226 Importer.Import(E->getOperatorLoc()), 6227 E->getFPFeatures()); 6228 } 6229 6230 bool ASTNodeImporter::ImportCastPath(CastExpr *CE, CXXCastPath &Path) { 6231 for (auto I = CE->path_begin(), E = CE->path_end(); I != E; ++I) { 6232 if (CXXBaseSpecifier *Spec = Importer.Import(*I)) 6233 Path.push_back(Spec); 6234 else 6235 return true; 6236 } 6237 return false; 6238 } 6239 6240 Expr *ASTNodeImporter::VisitImplicitCastExpr(ImplicitCastExpr *E) { 6241 QualType T = Importer.Import(E->getType()); 6242 if (T.isNull()) 6243 return nullptr; 6244 6245 Expr *SubExpr = Importer.Import(E->getSubExpr()); 6246 if (!SubExpr) 6247 return nullptr; 6248 6249 CXXCastPath BasePath; 6250 if (ImportCastPath(E, BasePath)) 6251 return nullptr; 6252 6253 return ImplicitCastExpr::Create(Importer.getToContext(), T, E->getCastKind(), 6254 SubExpr, &BasePath, E->getValueKind()); 6255 } 6256 6257 Expr *ASTNodeImporter::VisitExplicitCastExpr(ExplicitCastExpr *E) { 6258 QualType T = Importer.Import(E->getType()); 6259 if (T.isNull()) 6260 return nullptr; 6261 6262 Expr *SubExpr = Importer.Import(E->getSubExpr()); 6263 if (!SubExpr) 6264 return nullptr; 6265 6266 TypeSourceInfo *TInfo = Importer.Import(E->getTypeInfoAsWritten()); 6267 if (!TInfo && E->getTypeInfoAsWritten()) 6268 return nullptr; 6269 6270 CXXCastPath BasePath; 6271 if (ImportCastPath(E, BasePath)) 6272 return nullptr; 6273 6274 switch (E->getStmtClass()) { 6275 case Stmt::CStyleCastExprClass: { 6276 CStyleCastExpr *CCE = cast<CStyleCastExpr>(E); 6277 return CStyleCastExpr::Create(Importer.getToContext(), T, 6278 E->getValueKind(), E->getCastKind(), 6279 SubExpr, &BasePath, TInfo, 6280 Importer.Import(CCE->getLParenLoc()), 6281 Importer.Import(CCE->getRParenLoc())); 6282 } 6283 6284 case Stmt::CXXFunctionalCastExprClass: { 6285 CXXFunctionalCastExpr *FCE = cast<CXXFunctionalCastExpr>(E); 6286 return CXXFunctionalCastExpr::Create(Importer.getToContext(), T, 6287 E->getValueKind(), TInfo, 6288 E->getCastKind(), SubExpr, &BasePath, 6289 Importer.Import(FCE->getLParenLoc()), 6290 Importer.Import(FCE->getRParenLoc())); 6291 } 6292 6293 case Stmt::ObjCBridgedCastExprClass: { 6294 ObjCBridgedCastExpr *OCE = cast<ObjCBridgedCastExpr>(E); 6295 return new (Importer.getToContext()) ObjCBridgedCastExpr( 6296 Importer.Import(OCE->getLParenLoc()), OCE->getBridgeKind(), 6297 E->getCastKind(), Importer.Import(OCE->getBridgeKeywordLoc()), 6298 TInfo, SubExpr); 6299 } 6300 default: 6301 break; // just fall through 6302 } 6303 6304 CXXNamedCastExpr *Named = cast<CXXNamedCastExpr>(E); 6305 SourceLocation ExprLoc = Importer.Import(Named->getOperatorLoc()), 6306 RParenLoc = Importer.Import(Named->getRParenLoc()); 6307 SourceRange Brackets = Importer.Import(Named->getAngleBrackets()); 6308 6309 switch (E->getStmtClass()) { 6310 case Stmt::CXXStaticCastExprClass: 6311 return CXXStaticCastExpr::Create(Importer.getToContext(), T, 6312 E->getValueKind(), E->getCastKind(), 6313 SubExpr, &BasePath, TInfo, 6314 ExprLoc, RParenLoc, Brackets); 6315 6316 case Stmt::CXXDynamicCastExprClass: 6317 return CXXDynamicCastExpr::Create(Importer.getToContext(), T, 6318 E->getValueKind(), E->getCastKind(), 6319 SubExpr, &BasePath, TInfo, 6320 ExprLoc, RParenLoc, Brackets); 6321 6322 case Stmt::CXXReinterpretCastExprClass: 6323 return CXXReinterpretCastExpr::Create(Importer.getToContext(), T, 6324 E->getValueKind(), E->getCastKind(), 6325 SubExpr, &BasePath, TInfo, 6326 ExprLoc, RParenLoc, Brackets); 6327 6328 case Stmt::CXXConstCastExprClass: 6329 return CXXConstCastExpr::Create(Importer.getToContext(), T, 6330 E->getValueKind(), SubExpr, TInfo, ExprLoc, 6331 RParenLoc, Brackets); 6332 default: 6333 llvm_unreachable("Cast expression of unsupported type!"); 6334 return nullptr; 6335 } 6336 } 6337 6338 Expr *ASTNodeImporter::VisitOffsetOfExpr(OffsetOfExpr *OE) { 6339 QualType T = Importer.Import(OE->getType()); 6340 if (T.isNull()) 6341 return nullptr; 6342 6343 SmallVector<OffsetOfNode, 4> Nodes; 6344 for (int I = 0, E = OE->getNumComponents(); I < E; ++I) { 6345 const OffsetOfNode &Node = OE->getComponent(I); 6346 6347 switch (Node.getKind()) { 6348 case OffsetOfNode::Array: 6349 Nodes.push_back(OffsetOfNode(Importer.Import(Node.getLocStart()), 6350 Node.getArrayExprIndex(), 6351 Importer.Import(Node.getLocEnd()))); 6352 break; 6353 6354 case OffsetOfNode::Base: { 6355 CXXBaseSpecifier *BS = Importer.Import(Node.getBase()); 6356 if (!BS && Node.getBase()) 6357 return nullptr; 6358 Nodes.push_back(OffsetOfNode(BS)); 6359 break; 6360 } 6361 case OffsetOfNode::Field: { 6362 FieldDecl *FD = cast_or_null<FieldDecl>(Importer.Import(Node.getField())); 6363 if (!FD) 6364 return nullptr; 6365 Nodes.push_back(OffsetOfNode(Importer.Import(Node.getLocStart()), FD, 6366 Importer.Import(Node.getLocEnd()))); 6367 break; 6368 } 6369 case OffsetOfNode::Identifier: { 6370 IdentifierInfo *ToII = Importer.Import(Node.getFieldName()); 6371 if (!ToII) 6372 return nullptr; 6373 Nodes.push_back(OffsetOfNode(Importer.Import(Node.getLocStart()), ToII, 6374 Importer.Import(Node.getLocEnd()))); 6375 break; 6376 } 6377 } 6378 } 6379 6380 SmallVector<Expr *, 4> Exprs(OE->getNumExpressions()); 6381 for (int I = 0, E = OE->getNumExpressions(); I < E; ++I) { 6382 Expr *ToIndexExpr = Importer.Import(OE->getIndexExpr(I)); 6383 if (!ToIndexExpr) 6384 return nullptr; 6385 Exprs[I] = ToIndexExpr; 6386 } 6387 6388 TypeSourceInfo *TInfo = Importer.Import(OE->getTypeSourceInfo()); 6389 if (!TInfo && OE->getTypeSourceInfo()) 6390 return nullptr; 6391 6392 return OffsetOfExpr::Create(Importer.getToContext(), T, 6393 Importer.Import(OE->getOperatorLoc()), 6394 TInfo, Nodes, Exprs, 6395 Importer.Import(OE->getRParenLoc())); 6396 } 6397 6398 Expr *ASTNodeImporter::VisitCXXNoexceptExpr(CXXNoexceptExpr *E) { 6399 QualType T = Importer.Import(E->getType()); 6400 if (T.isNull()) 6401 return nullptr; 6402 6403 Expr *Operand = Importer.Import(E->getOperand()); 6404 if (!Operand) 6405 return nullptr; 6406 6407 CanThrowResult CanThrow; 6408 if (E->isValueDependent()) 6409 CanThrow = CT_Dependent; 6410 else 6411 CanThrow = E->getValue() ? CT_Can : CT_Cannot; 6412 6413 return new (Importer.getToContext()) CXXNoexceptExpr( 6414 T, Operand, CanThrow, 6415 Importer.Import(E->getLocStart()), Importer.Import(E->getLocEnd())); 6416 } 6417 6418 Expr *ASTNodeImporter::VisitCXXThrowExpr(CXXThrowExpr *E) { 6419 QualType T = Importer.Import(E->getType()); 6420 if (T.isNull()) 6421 return nullptr; 6422 6423 Expr *SubExpr = Importer.Import(E->getSubExpr()); 6424 if (!SubExpr && E->getSubExpr()) 6425 return nullptr; 6426 6427 return new (Importer.getToContext()) CXXThrowExpr( 6428 SubExpr, T, Importer.Import(E->getThrowLoc()), 6429 E->isThrownVariableInScope()); 6430 } 6431 6432 Expr *ASTNodeImporter::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 6433 ParmVarDecl *Param = cast_or_null<ParmVarDecl>( 6434 Importer.Import(E->getParam())); 6435 if (!Param) 6436 return nullptr; 6437 6438 return CXXDefaultArgExpr::Create( 6439 Importer.getToContext(), Importer.Import(E->getUsedLocation()), Param); 6440 } 6441 6442 Expr *ASTNodeImporter::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E) { 6443 QualType T = Importer.Import(E->getType()); 6444 if (T.isNull()) 6445 return nullptr; 6446 6447 TypeSourceInfo *TypeInfo = Importer.Import(E->getTypeSourceInfo()); 6448 if (!TypeInfo) 6449 return nullptr; 6450 6451 return new (Importer.getToContext()) CXXScalarValueInitExpr( 6452 T, TypeInfo, Importer.Import(E->getRParenLoc())); 6453 } 6454 6455 Expr *ASTNodeImporter::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 6456 Expr *SubExpr = Importer.Import(E->getSubExpr()); 6457 if (!SubExpr) 6458 return nullptr; 6459 6460 auto *Dtor = cast_or_null<CXXDestructorDecl>( 6461 Importer.Import(const_cast<CXXDestructorDecl *>( 6462 E->getTemporary()->getDestructor()))); 6463 if (!Dtor) 6464 return nullptr; 6465 6466 ASTContext &ToCtx = Importer.getToContext(); 6467 CXXTemporary *Temp = CXXTemporary::Create(ToCtx, Dtor); 6468 return CXXBindTemporaryExpr::Create(ToCtx, Temp, SubExpr); 6469 } 6470 6471 Expr *ASTNodeImporter::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *CE) { 6472 QualType T = Importer.Import(CE->getType()); 6473 if (T.isNull()) 6474 return nullptr; 6475 6476 SmallVector<Expr *, 8> Args(CE->getNumArgs()); 6477 if (ImportContainerChecked(CE->arguments(), Args)) 6478 return nullptr; 6479 6480 auto *Ctor = cast_or_null<CXXConstructorDecl>( 6481 Importer.Import(CE->getConstructor())); 6482 if (!Ctor) 6483 return nullptr; 6484 6485 return CXXTemporaryObjectExpr::Create( 6486 Importer.getToContext(), T, 6487 Importer.Import(CE->getLocStart()), 6488 Ctor, 6489 CE->isElidable(), 6490 Args, 6491 CE->hadMultipleCandidates(), 6492 CE->isListInitialization(), 6493 CE->isStdInitListInitialization(), 6494 CE->requiresZeroInitialization(), 6495 CE->getConstructionKind(), 6496 Importer.Import(CE->getParenOrBraceRange())); 6497 } 6498 6499 Expr * 6500 ASTNodeImporter::VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *E) { 6501 QualType T = Importer.Import(E->getType()); 6502 if (T.isNull()) 6503 return nullptr; 6504 6505 Expr *TempE = Importer.Import(E->GetTemporaryExpr()); 6506 if (!TempE) 6507 return nullptr; 6508 6509 ValueDecl *ExtendedBy = cast_or_null<ValueDecl>( 6510 Importer.Import(const_cast<ValueDecl *>(E->getExtendingDecl()))); 6511 if (!ExtendedBy && E->getExtendingDecl()) 6512 return nullptr; 6513 6514 auto *ToMTE = new (Importer.getToContext()) MaterializeTemporaryExpr( 6515 T, TempE, E->isBoundToLvalueReference()); 6516 6517 // FIXME: Should ManglingNumber get numbers associated with 'to' context? 6518 ToMTE->setExtendingDecl(ExtendedBy, E->getManglingNumber()); 6519 return ToMTE; 6520 } 6521 6522 Expr *ASTNodeImporter::VisitCXXNewExpr(CXXNewExpr *CE) { 6523 QualType T = Importer.Import(CE->getType()); 6524 if (T.isNull()) 6525 return nullptr; 6526 6527 SmallVector<Expr *, 4> PlacementArgs(CE->getNumPlacementArgs()); 6528 if (ImportContainerChecked(CE->placement_arguments(), PlacementArgs)) 6529 return nullptr; 6530 6531 FunctionDecl *OperatorNewDecl = cast_or_null<FunctionDecl>( 6532 Importer.Import(CE->getOperatorNew())); 6533 if (!OperatorNewDecl && CE->getOperatorNew()) 6534 return nullptr; 6535 6536 FunctionDecl *OperatorDeleteDecl = cast_or_null<FunctionDecl>( 6537 Importer.Import(CE->getOperatorDelete())); 6538 if (!OperatorDeleteDecl && CE->getOperatorDelete()) 6539 return nullptr; 6540 6541 Expr *ToInit = Importer.Import(CE->getInitializer()); 6542 if (!ToInit && CE->getInitializer()) 6543 return nullptr; 6544 6545 TypeSourceInfo *TInfo = Importer.Import(CE->getAllocatedTypeSourceInfo()); 6546 if (!TInfo) 6547 return nullptr; 6548 6549 Expr *ToArrSize = Importer.Import(CE->getArraySize()); 6550 if (!ToArrSize && CE->getArraySize()) 6551 return nullptr; 6552 6553 return new (Importer.getToContext()) CXXNewExpr( 6554 Importer.getToContext(), 6555 CE->isGlobalNew(), 6556 OperatorNewDecl, OperatorDeleteDecl, 6557 CE->passAlignment(), 6558 CE->doesUsualArrayDeleteWantSize(), 6559 PlacementArgs, 6560 Importer.Import(CE->getTypeIdParens()), 6561 ToArrSize, CE->getInitializationStyle(), ToInit, T, TInfo, 6562 Importer.Import(CE->getSourceRange()), 6563 Importer.Import(CE->getDirectInitRange())); 6564 } 6565 6566 Expr *ASTNodeImporter::VisitCXXDeleteExpr(CXXDeleteExpr *E) { 6567 QualType T = Importer.Import(E->getType()); 6568 if (T.isNull()) 6569 return nullptr; 6570 6571 FunctionDecl *OperatorDeleteDecl = cast_or_null<FunctionDecl>( 6572 Importer.Import(E->getOperatorDelete())); 6573 if (!OperatorDeleteDecl && E->getOperatorDelete()) 6574 return nullptr; 6575 6576 Expr *ToArg = Importer.Import(E->getArgument()); 6577 if (!ToArg && E->getArgument()) 6578 return nullptr; 6579 6580 return new (Importer.getToContext()) CXXDeleteExpr( 6581 T, E->isGlobalDelete(), 6582 E->isArrayForm(), 6583 E->isArrayFormAsWritten(), 6584 E->doesUsualArrayDeleteWantSize(), 6585 OperatorDeleteDecl, 6586 ToArg, 6587 Importer.Import(E->getLocStart())); 6588 } 6589 6590 Expr *ASTNodeImporter::VisitCXXConstructExpr(CXXConstructExpr *E) { 6591 QualType T = Importer.Import(E->getType()); 6592 if (T.isNull()) 6593 return nullptr; 6594 6595 CXXConstructorDecl *ToCCD = 6596 dyn_cast_or_null<CXXConstructorDecl>(Importer.Import(E->getConstructor())); 6597 if (!ToCCD) 6598 return nullptr; 6599 6600 SmallVector<Expr *, 6> ToArgs(E->getNumArgs()); 6601 if (ImportContainerChecked(E->arguments(), ToArgs)) 6602 return nullptr; 6603 6604 return CXXConstructExpr::Create(Importer.getToContext(), T, 6605 Importer.Import(E->getLocation()), 6606 ToCCD, E->isElidable(), 6607 ToArgs, E->hadMultipleCandidates(), 6608 E->isListInitialization(), 6609 E->isStdInitListInitialization(), 6610 E->requiresZeroInitialization(), 6611 E->getConstructionKind(), 6612 Importer.Import(E->getParenOrBraceRange())); 6613 } 6614 6615 Expr *ASTNodeImporter::VisitExprWithCleanups(ExprWithCleanups *EWC) { 6616 Expr *SubExpr = Importer.Import(EWC->getSubExpr()); 6617 if (!SubExpr && EWC->getSubExpr()) 6618 return nullptr; 6619 6620 SmallVector<ExprWithCleanups::CleanupObject, 8> Objs(EWC->getNumObjects()); 6621 for (unsigned I = 0, E = EWC->getNumObjects(); I < E; I++) 6622 if (ExprWithCleanups::CleanupObject Obj = 6623 cast_or_null<BlockDecl>(Importer.Import(EWC->getObject(I)))) 6624 Objs[I] = Obj; 6625 else 6626 return nullptr; 6627 6628 return ExprWithCleanups::Create(Importer.getToContext(), 6629 SubExpr, EWC->cleanupsHaveSideEffects(), 6630 Objs); 6631 } 6632 6633 Expr *ASTNodeImporter::VisitCXXMemberCallExpr(CXXMemberCallExpr *E) { 6634 QualType T = Importer.Import(E->getType()); 6635 if (T.isNull()) 6636 return nullptr; 6637 6638 Expr *ToFn = Importer.Import(E->getCallee()); 6639 if (!ToFn) 6640 return nullptr; 6641 6642 SmallVector<Expr *, 4> ToArgs(E->getNumArgs()); 6643 if (ImportContainerChecked(E->arguments(), ToArgs)) 6644 return nullptr; 6645 6646 return new (Importer.getToContext()) CXXMemberCallExpr( 6647 Importer.getToContext(), ToFn, ToArgs, T, E->getValueKind(), 6648 Importer.Import(E->getRParenLoc())); 6649 } 6650 6651 Expr *ASTNodeImporter::VisitCXXThisExpr(CXXThisExpr *E) { 6652 QualType T = Importer.Import(E->getType()); 6653 if (T.isNull()) 6654 return nullptr; 6655 6656 return new (Importer.getToContext()) 6657 CXXThisExpr(Importer.Import(E->getLocation()), T, E->isImplicit()); 6658 } 6659 6660 Expr *ASTNodeImporter::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 6661 QualType T = Importer.Import(E->getType()); 6662 if (T.isNull()) 6663 return nullptr; 6664 6665 return new (Importer.getToContext()) 6666 CXXBoolLiteralExpr(E->getValue(), T, Importer.Import(E->getLocation())); 6667 } 6668 6669 6670 Expr *ASTNodeImporter::VisitMemberExpr(MemberExpr *E) { 6671 QualType T = Importer.Import(E->getType()); 6672 if (T.isNull()) 6673 return nullptr; 6674 6675 Expr *ToBase = Importer.Import(E->getBase()); 6676 if (!ToBase && E->getBase()) 6677 return nullptr; 6678 6679 ValueDecl *ToMember = dyn_cast<ValueDecl>(Importer.Import(E->getMemberDecl())); 6680 if (!ToMember && E->getMemberDecl()) 6681 return nullptr; 6682 6683 DeclAccessPair ToFoundDecl = DeclAccessPair::make( 6684 dyn_cast<NamedDecl>(Importer.Import(E->getFoundDecl().getDecl())), 6685 E->getFoundDecl().getAccess()); 6686 6687 DeclarationNameInfo ToMemberNameInfo( 6688 Importer.Import(E->getMemberNameInfo().getName()), 6689 Importer.Import(E->getMemberNameInfo().getLoc())); 6690 6691 if (E->hasExplicitTemplateArgs()) { 6692 return nullptr; // FIXME: handle template arguments 6693 } 6694 6695 return MemberExpr::Create(Importer.getToContext(), ToBase, 6696 E->isArrow(), 6697 Importer.Import(E->getOperatorLoc()), 6698 Importer.Import(E->getQualifierLoc()), 6699 Importer.Import(E->getTemplateKeywordLoc()), 6700 ToMember, ToFoundDecl, ToMemberNameInfo, 6701 nullptr, T, E->getValueKind(), 6702 E->getObjectKind()); 6703 } 6704 6705 Expr *ASTNodeImporter::VisitCallExpr(CallExpr *E) { 6706 QualType T = Importer.Import(E->getType()); 6707 if (T.isNull()) 6708 return nullptr; 6709 6710 Expr *ToCallee = Importer.Import(E->getCallee()); 6711 if (!ToCallee && E->getCallee()) 6712 return nullptr; 6713 6714 unsigned NumArgs = E->getNumArgs(); 6715 6716 llvm::SmallVector<Expr *, 2> ToArgs(NumArgs); 6717 6718 for (unsigned ai = 0, ae = NumArgs; ai != ae; ++ai) { 6719 Expr *FromArg = E->getArg(ai); 6720 Expr *ToArg = Importer.Import(FromArg); 6721 if (!ToArg) 6722 return nullptr; 6723 ToArgs[ai] = ToArg; 6724 } 6725 6726 Expr **ToArgs_Copied = new (Importer.getToContext()) 6727 Expr*[NumArgs]; 6728 6729 for (unsigned ai = 0, ae = NumArgs; ai != ae; ++ai) 6730 ToArgs_Copied[ai] = ToArgs[ai]; 6731 6732 return new (Importer.getToContext()) 6733 CallExpr(Importer.getToContext(), ToCallee, 6734 llvm::makeArrayRef(ToArgs_Copied, NumArgs), T, E->getValueKind(), 6735 Importer.Import(E->getRParenLoc())); 6736 } 6737 6738 Expr *ASTNodeImporter::VisitInitListExpr(InitListExpr *ILE) { 6739 QualType T = Importer.Import(ILE->getType()); 6740 if (T.isNull()) 6741 return nullptr; 6742 6743 llvm::SmallVector<Expr *, 4> Exprs(ILE->getNumInits()); 6744 if (ImportContainerChecked(ILE->inits(), Exprs)) 6745 return nullptr; 6746 6747 ASTContext &ToCtx = Importer.getToContext(); 6748 InitListExpr *To = new (ToCtx) InitListExpr( 6749 ToCtx, Importer.Import(ILE->getLBraceLoc()), 6750 Exprs, Importer.Import(ILE->getLBraceLoc())); 6751 To->setType(T); 6752 6753 if (ILE->hasArrayFiller()) { 6754 Expr *Filler = Importer.Import(ILE->getArrayFiller()); 6755 if (!Filler) 6756 return nullptr; 6757 To->setArrayFiller(Filler); 6758 } 6759 6760 if (FieldDecl *FromFD = ILE->getInitializedFieldInUnion()) { 6761 FieldDecl *ToFD = cast_or_null<FieldDecl>(Importer.Import(FromFD)); 6762 if (!ToFD) 6763 return nullptr; 6764 To->setInitializedFieldInUnion(ToFD); 6765 } 6766 6767 if (InitListExpr *SyntForm = ILE->getSyntacticForm()) { 6768 InitListExpr *ToSyntForm = cast_or_null<InitListExpr>( 6769 Importer.Import(SyntForm)); 6770 if (!ToSyntForm) 6771 return nullptr; 6772 To->setSyntacticForm(ToSyntForm); 6773 } 6774 6775 To->sawArrayRangeDesignator(ILE->hadArrayRangeDesignator()); 6776 To->setValueDependent(ILE->isValueDependent()); 6777 To->setInstantiationDependent(ILE->isInstantiationDependent()); 6778 6779 return To; 6780 } 6781 6782 Expr *ASTNodeImporter::VisitArrayInitLoopExpr(ArrayInitLoopExpr *E) { 6783 QualType ToType = Importer.Import(E->getType()); 6784 if (ToType.isNull()) 6785 return nullptr; 6786 6787 Expr *ToCommon = Importer.Import(E->getCommonExpr()); 6788 if (!ToCommon && E->getCommonExpr()) 6789 return nullptr; 6790 6791 Expr *ToSubExpr = Importer.Import(E->getSubExpr()); 6792 if (!ToSubExpr && E->getSubExpr()) 6793 return nullptr; 6794 6795 return new (Importer.getToContext()) 6796 ArrayInitLoopExpr(ToType, ToCommon, ToSubExpr); 6797 } 6798 6799 Expr *ASTNodeImporter::VisitArrayInitIndexExpr(ArrayInitIndexExpr *E) { 6800 QualType ToType = Importer.Import(E->getType()); 6801 if (ToType.isNull()) 6802 return nullptr; 6803 return new (Importer.getToContext()) ArrayInitIndexExpr(ToType); 6804 } 6805 6806 Expr *ASTNodeImporter::VisitCXXDefaultInitExpr(CXXDefaultInitExpr *DIE) { 6807 FieldDecl *ToField = llvm::dyn_cast_or_null<FieldDecl>( 6808 Importer.Import(DIE->getField())); 6809 if (!ToField && DIE->getField()) 6810 return nullptr; 6811 6812 return CXXDefaultInitExpr::Create( 6813 Importer.getToContext(), Importer.Import(DIE->getLocStart()), ToField); 6814 } 6815 6816 Expr *ASTNodeImporter::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) { 6817 QualType ToType = Importer.Import(E->getType()); 6818 if (ToType.isNull() && !E->getType().isNull()) 6819 return nullptr; 6820 ExprValueKind VK = E->getValueKind(); 6821 CastKind CK = E->getCastKind(); 6822 Expr *ToOp = Importer.Import(E->getSubExpr()); 6823 if (!ToOp && E->getSubExpr()) 6824 return nullptr; 6825 CXXCastPath BasePath; 6826 if (ImportCastPath(E, BasePath)) 6827 return nullptr; 6828 TypeSourceInfo *ToWritten = Importer.Import(E->getTypeInfoAsWritten()); 6829 SourceLocation ToOperatorLoc = Importer.Import(E->getOperatorLoc()); 6830 SourceLocation ToRParenLoc = Importer.Import(E->getRParenLoc()); 6831 SourceRange ToAngleBrackets = Importer.Import(E->getAngleBrackets()); 6832 6833 if (isa<CXXStaticCastExpr>(E)) { 6834 return CXXStaticCastExpr::Create( 6835 Importer.getToContext(), ToType, VK, CK, ToOp, &BasePath, 6836 ToWritten, ToOperatorLoc, ToRParenLoc, ToAngleBrackets); 6837 } else if (isa<CXXDynamicCastExpr>(E)) { 6838 return CXXDynamicCastExpr::Create( 6839 Importer.getToContext(), ToType, VK, CK, ToOp, &BasePath, 6840 ToWritten, ToOperatorLoc, ToRParenLoc, ToAngleBrackets); 6841 } else if (isa<CXXReinterpretCastExpr>(E)) { 6842 return CXXReinterpretCastExpr::Create( 6843 Importer.getToContext(), ToType, VK, CK, ToOp, &BasePath, 6844 ToWritten, ToOperatorLoc, ToRParenLoc, ToAngleBrackets); 6845 } else { 6846 return nullptr; 6847 } 6848 } 6849 6850 6851 Expr *ASTNodeImporter::VisitSubstNonTypeTemplateParmExpr( 6852 SubstNonTypeTemplateParmExpr *E) { 6853 QualType T = Importer.Import(E->getType()); 6854 if (T.isNull()) 6855 return nullptr; 6856 6857 NonTypeTemplateParmDecl *Param = cast_or_null<NonTypeTemplateParmDecl>( 6858 Importer.Import(E->getParameter())); 6859 if (!Param) 6860 return nullptr; 6861 6862 Expr *Replacement = Importer.Import(E->getReplacement()); 6863 if (!Replacement) 6864 return nullptr; 6865 6866 return new (Importer.getToContext()) SubstNonTypeTemplateParmExpr( 6867 T, E->getValueKind(), Importer.Import(E->getExprLoc()), Param, 6868 Replacement); 6869 } 6870 6871 ASTImporter::ASTImporter(ASTContext &ToContext, FileManager &ToFileManager, 6872 ASTContext &FromContext, FileManager &FromFileManager, 6873 bool MinimalImport) 6874 : ToContext(ToContext), FromContext(FromContext), 6875 ToFileManager(ToFileManager), FromFileManager(FromFileManager), 6876 Minimal(MinimalImport), LastDiagFromFrom(false) 6877 { 6878 ImportedDecls[FromContext.getTranslationUnitDecl()] 6879 = ToContext.getTranslationUnitDecl(); 6880 } 6881 6882 ASTImporter::~ASTImporter() { } 6883 6884 QualType ASTImporter::Import(QualType FromT) { 6885 if (FromT.isNull()) 6886 return QualType(); 6887 6888 const Type *fromTy = FromT.getTypePtr(); 6889 6890 // Check whether we've already imported this type. 6891 llvm::DenseMap<const Type *, const Type *>::iterator Pos 6892 = ImportedTypes.find(fromTy); 6893 if (Pos != ImportedTypes.end()) 6894 return ToContext.getQualifiedType(Pos->second, FromT.getLocalQualifiers()); 6895 6896 // Import the type 6897 ASTNodeImporter Importer(*this); 6898 QualType ToT = Importer.Visit(fromTy); 6899 if (ToT.isNull()) 6900 return ToT; 6901 6902 // Record the imported type. 6903 ImportedTypes[fromTy] = ToT.getTypePtr(); 6904 6905 return ToContext.getQualifiedType(ToT, FromT.getLocalQualifiers()); 6906 } 6907 6908 TypeSourceInfo *ASTImporter::Import(TypeSourceInfo *FromTSI) { 6909 if (!FromTSI) 6910 return FromTSI; 6911 6912 // FIXME: For now we just create a "trivial" type source info based 6913 // on the type and a single location. Implement a real version of this. 6914 QualType T = Import(FromTSI->getType()); 6915 if (T.isNull()) 6916 return nullptr; 6917 6918 return ToContext.getTrivialTypeSourceInfo(T, 6919 Import(FromTSI->getTypeLoc().getLocStart())); 6920 } 6921 6922 Decl *ASTImporter::GetAlreadyImportedOrNull(Decl *FromD) { 6923 llvm::DenseMap<Decl *, Decl *>::iterator Pos = ImportedDecls.find(FromD); 6924 if (Pos != ImportedDecls.end()) { 6925 Decl *ToD = Pos->second; 6926 ASTNodeImporter(*this).ImportDefinitionIfNeeded(FromD, ToD); 6927 return ToD; 6928 } else { 6929 return nullptr; 6930 } 6931 } 6932 6933 Decl *ASTImporter::Import(Decl *FromD) { 6934 if (!FromD) 6935 return nullptr; 6936 6937 ASTNodeImporter Importer(*this); 6938 6939 // Check whether we've already imported this declaration. 6940 llvm::DenseMap<Decl *, Decl *>::iterator Pos = ImportedDecls.find(FromD); 6941 if (Pos != ImportedDecls.end()) { 6942 Decl *ToD = Pos->second; 6943 Importer.ImportDefinitionIfNeeded(FromD, ToD); 6944 return ToD; 6945 } 6946 6947 // Import the type 6948 Decl *ToD = Importer.Visit(FromD); 6949 if (!ToD) 6950 return nullptr; 6951 6952 // Record the imported declaration. 6953 ImportedDecls[FromD] = ToD; 6954 6955 if (TagDecl *FromTag = dyn_cast<TagDecl>(FromD)) { 6956 // Keep track of anonymous tags that have an associated typedef. 6957 if (FromTag->getTypedefNameForAnonDecl()) 6958 AnonTagsWithPendingTypedefs.push_back(FromTag); 6959 } else if (TypedefNameDecl *FromTypedef = dyn_cast<TypedefNameDecl>(FromD)) { 6960 // When we've finished transforming a typedef, see whether it was the 6961 // typedef for an anonymous tag. 6962 for (SmallVectorImpl<TagDecl *>::iterator 6963 FromTag = AnonTagsWithPendingTypedefs.begin(), 6964 FromTagEnd = AnonTagsWithPendingTypedefs.end(); 6965 FromTag != FromTagEnd; ++FromTag) { 6966 if ((*FromTag)->getTypedefNameForAnonDecl() == FromTypedef) { 6967 if (TagDecl *ToTag = cast_or_null<TagDecl>(Import(*FromTag))) { 6968 // We found the typedef for an anonymous tag; link them. 6969 ToTag->setTypedefNameForAnonDecl(cast<TypedefNameDecl>(ToD)); 6970 AnonTagsWithPendingTypedefs.erase(FromTag); 6971 break; 6972 } 6973 } 6974 } 6975 } 6976 6977 return ToD; 6978 } 6979 6980 DeclContext *ASTImporter::ImportContext(DeclContext *FromDC) { 6981 if (!FromDC) 6982 return FromDC; 6983 6984 DeclContext *ToDC = cast_or_null<DeclContext>(Import(cast<Decl>(FromDC))); 6985 if (!ToDC) 6986 return nullptr; 6987 6988 // When we're using a record/enum/Objective-C class/protocol as a context, we 6989 // need it to have a definition. 6990 if (RecordDecl *ToRecord = dyn_cast<RecordDecl>(ToDC)) { 6991 RecordDecl *FromRecord = cast<RecordDecl>(FromDC); 6992 if (ToRecord->isCompleteDefinition()) { 6993 // Do nothing. 6994 } else if (FromRecord->isCompleteDefinition()) { 6995 ASTNodeImporter(*this).ImportDefinition(FromRecord, ToRecord, 6996 ASTNodeImporter::IDK_Basic); 6997 } else { 6998 CompleteDecl(ToRecord); 6999 } 7000 } else if (EnumDecl *ToEnum = dyn_cast<EnumDecl>(ToDC)) { 7001 EnumDecl *FromEnum = cast<EnumDecl>(FromDC); 7002 if (ToEnum->isCompleteDefinition()) { 7003 // Do nothing. 7004 } else if (FromEnum->isCompleteDefinition()) { 7005 ASTNodeImporter(*this).ImportDefinition(FromEnum, ToEnum, 7006 ASTNodeImporter::IDK_Basic); 7007 } else { 7008 CompleteDecl(ToEnum); 7009 } 7010 } else if (ObjCInterfaceDecl *ToClass = dyn_cast<ObjCInterfaceDecl>(ToDC)) { 7011 ObjCInterfaceDecl *FromClass = cast<ObjCInterfaceDecl>(FromDC); 7012 if (ToClass->getDefinition()) { 7013 // Do nothing. 7014 } else if (ObjCInterfaceDecl *FromDef = FromClass->getDefinition()) { 7015 ASTNodeImporter(*this).ImportDefinition(FromDef, ToClass, 7016 ASTNodeImporter::IDK_Basic); 7017 } else { 7018 CompleteDecl(ToClass); 7019 } 7020 } else if (ObjCProtocolDecl *ToProto = dyn_cast<ObjCProtocolDecl>(ToDC)) { 7021 ObjCProtocolDecl *FromProto = cast<ObjCProtocolDecl>(FromDC); 7022 if (ToProto->getDefinition()) { 7023 // Do nothing. 7024 } else if (ObjCProtocolDecl *FromDef = FromProto->getDefinition()) { 7025 ASTNodeImporter(*this).ImportDefinition(FromDef, ToProto, 7026 ASTNodeImporter::IDK_Basic); 7027 } else { 7028 CompleteDecl(ToProto); 7029 } 7030 } 7031 7032 return ToDC; 7033 } 7034 7035 Expr *ASTImporter::Import(Expr *FromE) { 7036 if (!FromE) 7037 return nullptr; 7038 7039 return cast_or_null<Expr>(Import(cast<Stmt>(FromE))); 7040 } 7041 7042 Stmt *ASTImporter::Import(Stmt *FromS) { 7043 if (!FromS) 7044 return nullptr; 7045 7046 // Check whether we've already imported this declaration. 7047 llvm::DenseMap<Stmt *, Stmt *>::iterator Pos = ImportedStmts.find(FromS); 7048 if (Pos != ImportedStmts.end()) 7049 return Pos->second; 7050 7051 // Import the type 7052 ASTNodeImporter Importer(*this); 7053 Stmt *ToS = Importer.Visit(FromS); 7054 if (!ToS) 7055 return nullptr; 7056 7057 // Record the imported declaration. 7058 ImportedStmts[FromS] = ToS; 7059 return ToS; 7060 } 7061 7062 NestedNameSpecifier *ASTImporter::Import(NestedNameSpecifier *FromNNS) { 7063 if (!FromNNS) 7064 return nullptr; 7065 7066 NestedNameSpecifier *prefix = Import(FromNNS->getPrefix()); 7067 7068 switch (FromNNS->getKind()) { 7069 case NestedNameSpecifier::Identifier: 7070 if (IdentifierInfo *II = Import(FromNNS->getAsIdentifier())) { 7071 return NestedNameSpecifier::Create(ToContext, prefix, II); 7072 } 7073 return nullptr; 7074 7075 case NestedNameSpecifier::Namespace: 7076 if (NamespaceDecl *NS = 7077 cast_or_null<NamespaceDecl>(Import(FromNNS->getAsNamespace()))) { 7078 return NestedNameSpecifier::Create(ToContext, prefix, NS); 7079 } 7080 return nullptr; 7081 7082 case NestedNameSpecifier::NamespaceAlias: 7083 if (NamespaceAliasDecl *NSAD = 7084 cast_or_null<NamespaceAliasDecl>(Import(FromNNS->getAsNamespaceAlias()))) { 7085 return NestedNameSpecifier::Create(ToContext, prefix, NSAD); 7086 } 7087 return nullptr; 7088 7089 case NestedNameSpecifier::Global: 7090 return NestedNameSpecifier::GlobalSpecifier(ToContext); 7091 7092 case NestedNameSpecifier::Super: 7093 if (CXXRecordDecl *RD = 7094 cast_or_null<CXXRecordDecl>(Import(FromNNS->getAsRecordDecl()))) { 7095 return NestedNameSpecifier::SuperSpecifier(ToContext, RD); 7096 } 7097 return nullptr; 7098 7099 case NestedNameSpecifier::TypeSpec: 7100 case NestedNameSpecifier::TypeSpecWithTemplate: { 7101 QualType T = Import(QualType(FromNNS->getAsType(), 0u)); 7102 if (!T.isNull()) { 7103 bool bTemplate = FromNNS->getKind() == 7104 NestedNameSpecifier::TypeSpecWithTemplate; 7105 return NestedNameSpecifier::Create(ToContext, prefix, 7106 bTemplate, T.getTypePtr()); 7107 } 7108 } 7109 return nullptr; 7110 } 7111 7112 llvm_unreachable("Invalid nested name specifier kind"); 7113 } 7114 7115 NestedNameSpecifierLoc ASTImporter::Import(NestedNameSpecifierLoc FromNNS) { 7116 // Copied from NestedNameSpecifier mostly. 7117 SmallVector<NestedNameSpecifierLoc , 8> NestedNames; 7118 NestedNameSpecifierLoc NNS = FromNNS; 7119 7120 // Push each of the nested-name-specifiers's onto a stack for 7121 // serialization in reverse order. 7122 while (NNS) { 7123 NestedNames.push_back(NNS); 7124 NNS = NNS.getPrefix(); 7125 } 7126 7127 NestedNameSpecifierLocBuilder Builder; 7128 7129 while (!NestedNames.empty()) { 7130 NNS = NestedNames.pop_back_val(); 7131 NestedNameSpecifier *Spec = Import(NNS.getNestedNameSpecifier()); 7132 if (!Spec) 7133 return NestedNameSpecifierLoc(); 7134 7135 NestedNameSpecifier::SpecifierKind Kind = Spec->getKind(); 7136 switch (Kind) { 7137 case NestedNameSpecifier::Identifier: 7138 Builder.Extend(getToContext(), 7139 Spec->getAsIdentifier(), 7140 Import(NNS.getLocalBeginLoc()), 7141 Import(NNS.getLocalEndLoc())); 7142 break; 7143 7144 case NestedNameSpecifier::Namespace: 7145 Builder.Extend(getToContext(), 7146 Spec->getAsNamespace(), 7147 Import(NNS.getLocalBeginLoc()), 7148 Import(NNS.getLocalEndLoc())); 7149 break; 7150 7151 case NestedNameSpecifier::NamespaceAlias: 7152 Builder.Extend(getToContext(), 7153 Spec->getAsNamespaceAlias(), 7154 Import(NNS.getLocalBeginLoc()), 7155 Import(NNS.getLocalEndLoc())); 7156 break; 7157 7158 case NestedNameSpecifier::TypeSpec: 7159 case NestedNameSpecifier::TypeSpecWithTemplate: { 7160 TypeSourceInfo *TSI = getToContext().getTrivialTypeSourceInfo( 7161 QualType(Spec->getAsType(), 0)); 7162 Builder.Extend(getToContext(), 7163 Import(NNS.getLocalBeginLoc()), 7164 TSI->getTypeLoc(), 7165 Import(NNS.getLocalEndLoc())); 7166 break; 7167 } 7168 7169 case NestedNameSpecifier::Global: 7170 Builder.MakeGlobal(getToContext(), Import(NNS.getLocalBeginLoc())); 7171 break; 7172 7173 case NestedNameSpecifier::Super: { 7174 SourceRange ToRange = Import(NNS.getSourceRange()); 7175 Builder.MakeSuper(getToContext(), 7176 Spec->getAsRecordDecl(), 7177 ToRange.getBegin(), 7178 ToRange.getEnd()); 7179 } 7180 } 7181 } 7182 7183 return Builder.getWithLocInContext(getToContext()); 7184 } 7185 7186 TemplateName ASTImporter::Import(TemplateName From) { 7187 switch (From.getKind()) { 7188 case TemplateName::Template: 7189 if (TemplateDecl *ToTemplate 7190 = cast_or_null<TemplateDecl>(Import(From.getAsTemplateDecl()))) 7191 return TemplateName(ToTemplate); 7192 7193 return TemplateName(); 7194 7195 case TemplateName::OverloadedTemplate: { 7196 OverloadedTemplateStorage *FromStorage = From.getAsOverloadedTemplate(); 7197 UnresolvedSet<2> ToTemplates; 7198 for (OverloadedTemplateStorage::iterator I = FromStorage->begin(), 7199 E = FromStorage->end(); 7200 I != E; ++I) { 7201 if (NamedDecl *To = cast_or_null<NamedDecl>(Import(*I))) 7202 ToTemplates.addDecl(To); 7203 else 7204 return TemplateName(); 7205 } 7206 return ToContext.getOverloadedTemplateName(ToTemplates.begin(), 7207 ToTemplates.end()); 7208 } 7209 7210 case TemplateName::QualifiedTemplate: { 7211 QualifiedTemplateName *QTN = From.getAsQualifiedTemplateName(); 7212 NestedNameSpecifier *Qualifier = Import(QTN->getQualifier()); 7213 if (!Qualifier) 7214 return TemplateName(); 7215 7216 if (TemplateDecl *ToTemplate 7217 = cast_or_null<TemplateDecl>(Import(From.getAsTemplateDecl()))) 7218 return ToContext.getQualifiedTemplateName(Qualifier, 7219 QTN->hasTemplateKeyword(), 7220 ToTemplate); 7221 7222 return TemplateName(); 7223 } 7224 7225 case TemplateName::DependentTemplate: { 7226 DependentTemplateName *DTN = From.getAsDependentTemplateName(); 7227 NestedNameSpecifier *Qualifier = Import(DTN->getQualifier()); 7228 if (!Qualifier) 7229 return TemplateName(); 7230 7231 if (DTN->isIdentifier()) { 7232 return ToContext.getDependentTemplateName(Qualifier, 7233 Import(DTN->getIdentifier())); 7234 } 7235 7236 return ToContext.getDependentTemplateName(Qualifier, DTN->getOperator()); 7237 } 7238 7239 case TemplateName::SubstTemplateTemplateParm: { 7240 SubstTemplateTemplateParmStorage *subst 7241 = From.getAsSubstTemplateTemplateParm(); 7242 TemplateTemplateParmDecl *param 7243 = cast_or_null<TemplateTemplateParmDecl>(Import(subst->getParameter())); 7244 if (!param) 7245 return TemplateName(); 7246 7247 TemplateName replacement = Import(subst->getReplacement()); 7248 if (replacement.isNull()) return TemplateName(); 7249 7250 return ToContext.getSubstTemplateTemplateParm(param, replacement); 7251 } 7252 7253 case TemplateName::SubstTemplateTemplateParmPack: { 7254 SubstTemplateTemplateParmPackStorage *SubstPack 7255 = From.getAsSubstTemplateTemplateParmPack(); 7256 TemplateTemplateParmDecl *Param 7257 = cast_or_null<TemplateTemplateParmDecl>( 7258 Import(SubstPack->getParameterPack())); 7259 if (!Param) 7260 return TemplateName(); 7261 7262 ASTNodeImporter Importer(*this); 7263 TemplateArgument ArgPack 7264 = Importer.ImportTemplateArgument(SubstPack->getArgumentPack()); 7265 if (ArgPack.isNull()) 7266 return TemplateName(); 7267 7268 return ToContext.getSubstTemplateTemplateParmPack(Param, ArgPack); 7269 } 7270 } 7271 7272 llvm_unreachable("Invalid template name kind"); 7273 } 7274 7275 SourceLocation ASTImporter::Import(SourceLocation FromLoc) { 7276 if (FromLoc.isInvalid()) 7277 return SourceLocation(); 7278 7279 SourceManager &FromSM = FromContext.getSourceManager(); 7280 7281 // For now, map everything down to its file location, so that we 7282 // don't have to import macro expansions. 7283 // FIXME: Import macro expansions! 7284 FromLoc = FromSM.getFileLoc(FromLoc); 7285 std::pair<FileID, unsigned> Decomposed = FromSM.getDecomposedLoc(FromLoc); 7286 SourceManager &ToSM = ToContext.getSourceManager(); 7287 FileID ToFileID = Import(Decomposed.first); 7288 if (ToFileID.isInvalid()) 7289 return SourceLocation(); 7290 SourceLocation ret = ToSM.getLocForStartOfFile(ToFileID) 7291 .getLocWithOffset(Decomposed.second); 7292 return ret; 7293 } 7294 7295 SourceRange ASTImporter::Import(SourceRange FromRange) { 7296 return SourceRange(Import(FromRange.getBegin()), Import(FromRange.getEnd())); 7297 } 7298 7299 FileID ASTImporter::Import(FileID FromID) { 7300 llvm::DenseMap<FileID, FileID>::iterator Pos 7301 = ImportedFileIDs.find(FromID); 7302 if (Pos != ImportedFileIDs.end()) 7303 return Pos->second; 7304 7305 SourceManager &FromSM = FromContext.getSourceManager(); 7306 SourceManager &ToSM = ToContext.getSourceManager(); 7307 const SrcMgr::SLocEntry &FromSLoc = FromSM.getSLocEntry(FromID); 7308 assert(FromSLoc.isFile() && "Cannot handle macro expansions yet"); 7309 7310 // Include location of this file. 7311 SourceLocation ToIncludeLoc = Import(FromSLoc.getFile().getIncludeLoc()); 7312 7313 // Map the FileID for to the "to" source manager. 7314 FileID ToID; 7315 const SrcMgr::ContentCache *Cache = FromSLoc.getFile().getContentCache(); 7316 if (Cache->OrigEntry && Cache->OrigEntry->getDir()) { 7317 // FIXME: We probably want to use getVirtualFile(), so we don't hit the 7318 // disk again 7319 // FIXME: We definitely want to re-use the existing MemoryBuffer, rather 7320 // than mmap the files several times. 7321 const FileEntry *Entry = ToFileManager.getFile(Cache->OrigEntry->getName()); 7322 if (!Entry) 7323 return FileID(); 7324 ToID = ToSM.createFileID(Entry, ToIncludeLoc, 7325 FromSLoc.getFile().getFileCharacteristic()); 7326 } else { 7327 // FIXME: We want to re-use the existing MemoryBuffer! 7328 const llvm::MemoryBuffer * 7329 FromBuf = Cache->getBuffer(FromContext.getDiagnostics(), FromSM); 7330 std::unique_ptr<llvm::MemoryBuffer> ToBuf 7331 = llvm::MemoryBuffer::getMemBufferCopy(FromBuf->getBuffer(), 7332 FromBuf->getBufferIdentifier()); 7333 ToID = ToSM.createFileID(std::move(ToBuf), 7334 FromSLoc.getFile().getFileCharacteristic()); 7335 } 7336 7337 7338 ImportedFileIDs[FromID] = ToID; 7339 return ToID; 7340 } 7341 7342 CXXCtorInitializer *ASTImporter::Import(CXXCtorInitializer *From) { 7343 Expr *ToExpr = Import(From->getInit()); 7344 if (!ToExpr && From->getInit()) 7345 return nullptr; 7346 7347 if (From->isBaseInitializer()) { 7348 TypeSourceInfo *ToTInfo = Import(From->getTypeSourceInfo()); 7349 if (!ToTInfo && From->getTypeSourceInfo()) 7350 return nullptr; 7351 7352 return new (ToContext) CXXCtorInitializer( 7353 ToContext, ToTInfo, From->isBaseVirtual(), Import(From->getLParenLoc()), 7354 ToExpr, Import(From->getRParenLoc()), 7355 From->isPackExpansion() ? Import(From->getEllipsisLoc()) 7356 : SourceLocation()); 7357 } else if (From->isMemberInitializer()) { 7358 FieldDecl *ToField = 7359 llvm::cast_or_null<FieldDecl>(Import(From->getMember())); 7360 if (!ToField && From->getMember()) 7361 return nullptr; 7362 7363 return new (ToContext) CXXCtorInitializer( 7364 ToContext, ToField, Import(From->getMemberLocation()), 7365 Import(From->getLParenLoc()), ToExpr, Import(From->getRParenLoc())); 7366 } else if (From->isIndirectMemberInitializer()) { 7367 IndirectFieldDecl *ToIField = llvm::cast_or_null<IndirectFieldDecl>( 7368 Import(From->getIndirectMember())); 7369 if (!ToIField && From->getIndirectMember()) 7370 return nullptr; 7371 7372 return new (ToContext) CXXCtorInitializer( 7373 ToContext, ToIField, Import(From->getMemberLocation()), 7374 Import(From->getLParenLoc()), ToExpr, Import(From->getRParenLoc())); 7375 } else if (From->isDelegatingInitializer()) { 7376 TypeSourceInfo *ToTInfo = Import(From->getTypeSourceInfo()); 7377 if (!ToTInfo && From->getTypeSourceInfo()) 7378 return nullptr; 7379 7380 return new (ToContext) 7381 CXXCtorInitializer(ToContext, ToTInfo, Import(From->getLParenLoc()), 7382 ToExpr, Import(From->getRParenLoc())); 7383 } else { 7384 return nullptr; 7385 } 7386 } 7387 7388 7389 CXXBaseSpecifier *ASTImporter::Import(const CXXBaseSpecifier *BaseSpec) { 7390 auto Pos = ImportedCXXBaseSpecifiers.find(BaseSpec); 7391 if (Pos != ImportedCXXBaseSpecifiers.end()) 7392 return Pos->second; 7393 7394 CXXBaseSpecifier *Imported = new (ToContext) CXXBaseSpecifier( 7395 Import(BaseSpec->getSourceRange()), 7396 BaseSpec->isVirtual(), BaseSpec->isBaseOfClass(), 7397 BaseSpec->getAccessSpecifierAsWritten(), 7398 Import(BaseSpec->getTypeSourceInfo()), 7399 Import(BaseSpec->getEllipsisLoc())); 7400 ImportedCXXBaseSpecifiers[BaseSpec] = Imported; 7401 return Imported; 7402 } 7403 7404 void ASTImporter::ImportDefinition(Decl *From) { 7405 Decl *To = Import(From); 7406 if (!To) 7407 return; 7408 7409 if (DeclContext *FromDC = cast<DeclContext>(From)) { 7410 ASTNodeImporter Importer(*this); 7411 7412 if (RecordDecl *ToRecord = dyn_cast<RecordDecl>(To)) { 7413 if (!ToRecord->getDefinition()) { 7414 Importer.ImportDefinition(cast<RecordDecl>(FromDC), ToRecord, 7415 ASTNodeImporter::IDK_Everything); 7416 return; 7417 } 7418 } 7419 7420 if (EnumDecl *ToEnum = dyn_cast<EnumDecl>(To)) { 7421 if (!ToEnum->getDefinition()) { 7422 Importer.ImportDefinition(cast<EnumDecl>(FromDC), ToEnum, 7423 ASTNodeImporter::IDK_Everything); 7424 return; 7425 } 7426 } 7427 7428 if (ObjCInterfaceDecl *ToIFace = dyn_cast<ObjCInterfaceDecl>(To)) { 7429 if (!ToIFace->getDefinition()) { 7430 Importer.ImportDefinition(cast<ObjCInterfaceDecl>(FromDC), ToIFace, 7431 ASTNodeImporter::IDK_Everything); 7432 return; 7433 } 7434 } 7435 7436 if (ObjCProtocolDecl *ToProto = dyn_cast<ObjCProtocolDecl>(To)) { 7437 if (!ToProto->getDefinition()) { 7438 Importer.ImportDefinition(cast<ObjCProtocolDecl>(FromDC), ToProto, 7439 ASTNodeImporter::IDK_Everything); 7440 return; 7441 } 7442 } 7443 7444 Importer.ImportDeclContext(FromDC, true); 7445 } 7446 } 7447 7448 DeclarationName ASTImporter::Import(DeclarationName FromName) { 7449 if (!FromName) 7450 return DeclarationName(); 7451 7452 switch (FromName.getNameKind()) { 7453 case DeclarationName::Identifier: 7454 return Import(FromName.getAsIdentifierInfo()); 7455 7456 case DeclarationName::ObjCZeroArgSelector: 7457 case DeclarationName::ObjCOneArgSelector: 7458 case DeclarationName::ObjCMultiArgSelector: 7459 return Import(FromName.getObjCSelector()); 7460 7461 case DeclarationName::CXXConstructorName: { 7462 QualType T = Import(FromName.getCXXNameType()); 7463 if (T.isNull()) 7464 return DeclarationName(); 7465 7466 return ToContext.DeclarationNames.getCXXConstructorName( 7467 ToContext.getCanonicalType(T)); 7468 } 7469 7470 case DeclarationName::CXXDestructorName: { 7471 QualType T = Import(FromName.getCXXNameType()); 7472 if (T.isNull()) 7473 return DeclarationName(); 7474 7475 return ToContext.DeclarationNames.getCXXDestructorName( 7476 ToContext.getCanonicalType(T)); 7477 } 7478 7479 case DeclarationName::CXXDeductionGuideName: { 7480 TemplateDecl *Template = cast_or_null<TemplateDecl>( 7481 Import(FromName.getCXXDeductionGuideTemplate())); 7482 if (!Template) 7483 return DeclarationName(); 7484 return ToContext.DeclarationNames.getCXXDeductionGuideName(Template); 7485 } 7486 7487 case DeclarationName::CXXConversionFunctionName: { 7488 QualType T = Import(FromName.getCXXNameType()); 7489 if (T.isNull()) 7490 return DeclarationName(); 7491 7492 return ToContext.DeclarationNames.getCXXConversionFunctionName( 7493 ToContext.getCanonicalType(T)); 7494 } 7495 7496 case DeclarationName::CXXOperatorName: 7497 return ToContext.DeclarationNames.getCXXOperatorName( 7498 FromName.getCXXOverloadedOperator()); 7499 7500 case DeclarationName::CXXLiteralOperatorName: 7501 return ToContext.DeclarationNames.getCXXLiteralOperatorName( 7502 Import(FromName.getCXXLiteralIdentifier())); 7503 7504 case DeclarationName::CXXUsingDirective: 7505 // FIXME: STATICS! 7506 return DeclarationName::getUsingDirectiveName(); 7507 } 7508 7509 llvm_unreachable("Invalid DeclarationName Kind!"); 7510 } 7511 7512 IdentifierInfo *ASTImporter::Import(const IdentifierInfo *FromId) { 7513 if (!FromId) 7514 return nullptr; 7515 7516 IdentifierInfo *ToId = &ToContext.Idents.get(FromId->getName()); 7517 7518 if (!ToId->getBuiltinID() && FromId->getBuiltinID()) 7519 ToId->setBuiltinID(FromId->getBuiltinID()); 7520 7521 return ToId; 7522 } 7523 7524 Selector ASTImporter::Import(Selector FromSel) { 7525 if (FromSel.isNull()) 7526 return Selector(); 7527 7528 SmallVector<IdentifierInfo *, 4> Idents; 7529 Idents.push_back(Import(FromSel.getIdentifierInfoForSlot(0))); 7530 for (unsigned I = 1, N = FromSel.getNumArgs(); I < N; ++I) 7531 Idents.push_back(Import(FromSel.getIdentifierInfoForSlot(I))); 7532 return ToContext.Selectors.getSelector(FromSel.getNumArgs(), Idents.data()); 7533 } 7534 7535 DeclarationName ASTImporter::HandleNameConflict(DeclarationName Name, 7536 DeclContext *DC, 7537 unsigned IDNS, 7538 NamedDecl **Decls, 7539 unsigned NumDecls) { 7540 return Name; 7541 } 7542 7543 DiagnosticBuilder ASTImporter::ToDiag(SourceLocation Loc, unsigned DiagID) { 7544 if (LastDiagFromFrom) 7545 ToContext.getDiagnostics().notePriorDiagnosticFrom( 7546 FromContext.getDiagnostics()); 7547 LastDiagFromFrom = false; 7548 return ToContext.getDiagnostics().Report(Loc, DiagID); 7549 } 7550 7551 DiagnosticBuilder ASTImporter::FromDiag(SourceLocation Loc, unsigned DiagID) { 7552 if (!LastDiagFromFrom) 7553 FromContext.getDiagnostics().notePriorDiagnosticFrom( 7554 ToContext.getDiagnostics()); 7555 LastDiagFromFrom = true; 7556 return FromContext.getDiagnostics().Report(Loc, DiagID); 7557 } 7558 7559 void ASTImporter::CompleteDecl (Decl *D) { 7560 if (ObjCInterfaceDecl *ID = dyn_cast<ObjCInterfaceDecl>(D)) { 7561 if (!ID->getDefinition()) 7562 ID->startDefinition(); 7563 } 7564 else if (ObjCProtocolDecl *PD = dyn_cast<ObjCProtocolDecl>(D)) { 7565 if (!PD->getDefinition()) 7566 PD->startDefinition(); 7567 } 7568 else if (TagDecl *TD = dyn_cast<TagDecl>(D)) { 7569 if (!TD->getDefinition() && !TD->isBeingDefined()) { 7570 TD->startDefinition(); 7571 TD->setCompleteDefinition(true); 7572 } 7573 } 7574 else { 7575 assert (0 && "CompleteDecl called on a Decl that can't be completed"); 7576 } 7577 } 7578 7579 Decl *ASTImporter::Imported(Decl *From, Decl *To) { 7580 if (From->hasAttrs()) { 7581 for (Attr *FromAttr : From->getAttrs()) 7582 To->addAttr(FromAttr->clone(To->getASTContext())); 7583 } 7584 if (From->isUsed()) { 7585 To->setIsUsed(); 7586 } 7587 if (From->isImplicit()) { 7588 To->setImplicit(); 7589 } 7590 ImportedDecls[From] = To; 7591 return To; 7592 } 7593 7594 bool ASTImporter::IsStructurallyEquivalent(QualType From, QualType To, 7595 bool Complain) { 7596 llvm::DenseMap<const Type *, const Type *>::iterator Pos 7597 = ImportedTypes.find(From.getTypePtr()); 7598 if (Pos != ImportedTypes.end() && ToContext.hasSameType(Import(From), To)) 7599 return true; 7600 7601 StructuralEquivalenceContext Ctx(FromContext, ToContext, NonEquivalentDecls, 7602 false, Complain); 7603 return Ctx.IsStructurallyEquivalent(From, To); 7604 } 7605