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 VisitBuiltinType(const BuiltinType *T); 43 QualType VisitComplexType(const ComplexType *T); 44 QualType VisitPointerType(const PointerType *T); 45 QualType VisitBlockPointerType(const BlockPointerType *T); 46 QualType VisitLValueReferenceType(const LValueReferenceType *T); 47 QualType VisitRValueReferenceType(const RValueReferenceType *T); 48 QualType VisitMemberPointerType(const MemberPointerType *T); 49 QualType VisitConstantArrayType(const ConstantArrayType *T); 50 QualType VisitIncompleteArrayType(const IncompleteArrayType *T); 51 QualType VisitVariableArrayType(const VariableArrayType *T); 52 // FIXME: DependentSizedArrayType 53 // FIXME: DependentSizedExtVectorType 54 QualType VisitVectorType(const VectorType *T); 55 QualType VisitExtVectorType(const ExtVectorType *T); 56 QualType VisitFunctionNoProtoType(const FunctionNoProtoType *T); 57 QualType VisitFunctionProtoType(const FunctionProtoType *T); 58 // FIXME: UnresolvedUsingType 59 QualType VisitParenType(const ParenType *T); 60 QualType VisitTypedefType(const TypedefType *T); 61 QualType VisitTypeOfExprType(const TypeOfExprType *T); 62 // FIXME: DependentTypeOfExprType 63 QualType VisitTypeOfType(const TypeOfType *T); 64 QualType VisitDecltypeType(const DecltypeType *T); 65 QualType VisitUnaryTransformType(const UnaryTransformType *T); 66 QualType VisitAutoType(const AutoType *T); 67 // FIXME: DependentDecltypeType 68 QualType VisitRecordType(const RecordType *T); 69 QualType VisitEnumType(const EnumType *T); 70 QualType VisitAttributedType(const AttributedType *T); 71 // FIXME: TemplateTypeParmType 72 // FIXME: SubstTemplateTypeParmType 73 QualType VisitTemplateSpecializationType(const TemplateSpecializationType *T); 74 QualType VisitElaboratedType(const ElaboratedType *T); 75 // FIXME: DependentNameType 76 // FIXME: DependentTemplateSpecializationType 77 QualType VisitObjCInterfaceType(const ObjCInterfaceType *T); 78 QualType VisitObjCObjectType(const ObjCObjectType *T); 79 QualType VisitObjCObjectPointerType(const ObjCObjectPointerType *T); 80 81 // Importing declarations 82 bool ImportDeclParts(NamedDecl *D, DeclContext *&DC, 83 DeclContext *&LexicalDC, DeclarationName &Name, 84 NamedDecl *&ToD, SourceLocation &Loc); 85 void ImportDefinitionIfNeeded(Decl *FromD, Decl *ToD = nullptr); 86 void ImportDeclarationNameLoc(const DeclarationNameInfo &From, 87 DeclarationNameInfo& To); 88 void ImportDeclContext(DeclContext *FromDC, bool ForceImport = false); 89 90 /// \brief What we should import from the definition. 91 enum ImportDefinitionKind { 92 /// \brief Import the default subset of the definition, which might be 93 /// nothing (if minimal import is set) or might be everything (if minimal 94 /// import is not set). 95 IDK_Default, 96 /// \brief Import everything. 97 IDK_Everything, 98 /// \brief Import only the bare bones needed to establish a valid 99 /// DeclContext. 100 IDK_Basic 101 }; 102 103 bool shouldForceImportDeclContext(ImportDefinitionKind IDK) { 104 return IDK == IDK_Everything || 105 (IDK == IDK_Default && !Importer.isMinimalImport()); 106 } 107 108 bool ImportDefinition(RecordDecl *From, RecordDecl *To, 109 ImportDefinitionKind Kind = IDK_Default); 110 bool ImportDefinition(VarDecl *From, VarDecl *To, 111 ImportDefinitionKind Kind = IDK_Default); 112 bool ImportDefinition(EnumDecl *From, EnumDecl *To, 113 ImportDefinitionKind Kind = IDK_Default); 114 bool ImportDefinition(ObjCInterfaceDecl *From, ObjCInterfaceDecl *To, 115 ImportDefinitionKind Kind = IDK_Default); 116 bool ImportDefinition(ObjCProtocolDecl *From, ObjCProtocolDecl *To, 117 ImportDefinitionKind Kind = IDK_Default); 118 TemplateParameterList *ImportTemplateParameterList( 119 TemplateParameterList *Params); 120 TemplateArgument ImportTemplateArgument(const TemplateArgument &From); 121 bool ImportTemplateArguments(const TemplateArgument *FromArgs, 122 unsigned NumFromArgs, 123 SmallVectorImpl<TemplateArgument> &ToArgs); 124 bool IsStructuralMatch(RecordDecl *FromRecord, RecordDecl *ToRecord, 125 bool Complain = true); 126 bool IsStructuralMatch(VarDecl *FromVar, VarDecl *ToVar, 127 bool Complain = true); 128 bool IsStructuralMatch(EnumDecl *FromEnum, EnumDecl *ToRecord); 129 bool IsStructuralMatch(EnumConstantDecl *FromEC, EnumConstantDecl *ToEC); 130 bool IsStructuralMatch(ClassTemplateDecl *From, ClassTemplateDecl *To); 131 bool IsStructuralMatch(VarTemplateDecl *From, VarTemplateDecl *To); 132 Decl *VisitDecl(Decl *D); 133 Decl *VisitAccessSpecDecl(AccessSpecDecl *D); 134 Decl *VisitTranslationUnitDecl(TranslationUnitDecl *D); 135 Decl *VisitNamespaceDecl(NamespaceDecl *D); 136 Decl *VisitTypedefNameDecl(TypedefNameDecl *D, bool IsAlias); 137 Decl *VisitTypedefDecl(TypedefDecl *D); 138 Decl *VisitTypeAliasDecl(TypeAliasDecl *D); 139 Decl *VisitEnumDecl(EnumDecl *D); 140 Decl *VisitRecordDecl(RecordDecl *D); 141 Decl *VisitEnumConstantDecl(EnumConstantDecl *D); 142 Decl *VisitFunctionDecl(FunctionDecl *D); 143 Decl *VisitCXXMethodDecl(CXXMethodDecl *D); 144 Decl *VisitCXXConstructorDecl(CXXConstructorDecl *D); 145 Decl *VisitCXXDestructorDecl(CXXDestructorDecl *D); 146 Decl *VisitCXXConversionDecl(CXXConversionDecl *D); 147 Decl *VisitFieldDecl(FieldDecl *D); 148 Decl *VisitIndirectFieldDecl(IndirectFieldDecl *D); 149 Decl *VisitObjCIvarDecl(ObjCIvarDecl *D); 150 Decl *VisitVarDecl(VarDecl *D); 151 Decl *VisitImplicitParamDecl(ImplicitParamDecl *D); 152 Decl *VisitParmVarDecl(ParmVarDecl *D); 153 Decl *VisitObjCMethodDecl(ObjCMethodDecl *D); 154 Decl *VisitObjCTypeParamDecl(ObjCTypeParamDecl *D); 155 Decl *VisitObjCCategoryDecl(ObjCCategoryDecl *D); 156 Decl *VisitObjCProtocolDecl(ObjCProtocolDecl *D); 157 Decl *VisitLinkageSpecDecl(LinkageSpecDecl *D); 158 159 ObjCTypeParamList *ImportObjCTypeParamList(ObjCTypeParamList *list); 160 Decl *VisitObjCInterfaceDecl(ObjCInterfaceDecl *D); 161 Decl *VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D); 162 Decl *VisitObjCImplementationDecl(ObjCImplementationDecl *D); 163 Decl *VisitObjCPropertyDecl(ObjCPropertyDecl *D); 164 Decl *VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D); 165 Decl *VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D); 166 Decl *VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D); 167 Decl *VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D); 168 Decl *VisitClassTemplateDecl(ClassTemplateDecl *D); 169 Decl *VisitClassTemplateSpecializationDecl( 170 ClassTemplateSpecializationDecl *D); 171 Decl *VisitVarTemplateDecl(VarTemplateDecl *D); 172 Decl *VisitVarTemplateSpecializationDecl(VarTemplateSpecializationDecl *D); 173 174 // Importing statements 175 DeclGroupRef ImportDeclGroup(DeclGroupRef DG); 176 177 Stmt *VisitStmt(Stmt *S); 178 Stmt *VisitDeclStmt(DeclStmt *S); 179 Stmt *VisitNullStmt(NullStmt *S); 180 Stmt *VisitCompoundStmt(CompoundStmt *S); 181 Stmt *VisitCaseStmt(CaseStmt *S); 182 Stmt *VisitDefaultStmt(DefaultStmt *S); 183 Stmt *VisitLabelStmt(LabelStmt *S); 184 Stmt *VisitAttributedStmt(AttributedStmt *S); 185 Stmt *VisitIfStmt(IfStmt *S); 186 Stmt *VisitSwitchStmt(SwitchStmt *S); 187 Stmt *VisitWhileStmt(WhileStmt *S); 188 Stmt *VisitDoStmt(DoStmt *S); 189 Stmt *VisitForStmt(ForStmt *S); 190 Stmt *VisitGotoStmt(GotoStmt *S); 191 Stmt *VisitIndirectGotoStmt(IndirectGotoStmt *S); 192 Stmt *VisitContinueStmt(ContinueStmt *S); 193 Stmt *VisitBreakStmt(BreakStmt *S); 194 Stmt *VisitReturnStmt(ReturnStmt *S); 195 // FIXME: GCCAsmStmt 196 // FIXME: MSAsmStmt 197 // FIXME: SEHExceptStmt 198 // FIXME: SEHFinallyStmt 199 // FIXME: SEHTryStmt 200 // FIXME: SEHLeaveStmt 201 // FIXME: CapturedStmt 202 Stmt *VisitCXXCatchStmt(CXXCatchStmt *S); 203 Stmt *VisitCXXTryStmt(CXXTryStmt *S); 204 Stmt *VisitCXXForRangeStmt(CXXForRangeStmt *S); 205 // FIXME: MSDependentExistsStmt 206 Stmt *VisitObjCForCollectionStmt(ObjCForCollectionStmt *S); 207 Stmt *VisitObjCAtCatchStmt(ObjCAtCatchStmt *S); 208 Stmt *VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S); 209 Stmt *VisitObjCAtTryStmt(ObjCAtTryStmt *S); 210 Stmt *VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *S); 211 Stmt *VisitObjCAtThrowStmt(ObjCAtThrowStmt *S); 212 Stmt *VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt *S); 213 214 // Importing expressions 215 Expr *VisitExpr(Expr *E); 216 Expr *VisitDeclRefExpr(DeclRefExpr *E); 217 Expr *VisitIntegerLiteral(IntegerLiteral *E); 218 Expr *VisitCharacterLiteral(CharacterLiteral *E); 219 Expr *VisitParenExpr(ParenExpr *E); 220 Expr *VisitUnaryOperator(UnaryOperator *E); 221 Expr *VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E); 222 Expr *VisitBinaryOperator(BinaryOperator *E); 223 Expr *VisitCompoundAssignOperator(CompoundAssignOperator *E); 224 Expr *VisitImplicitCastExpr(ImplicitCastExpr *E); 225 Expr *VisitCStyleCastExpr(CStyleCastExpr *E); 226 Expr *VisitCXXConstructExpr(CXXConstructExpr *E); 227 Expr *VisitMemberExpr(MemberExpr *E); 228 Expr *VisitCallExpr(CallExpr *E); 229 }; 230 } 231 using namespace clang; 232 233 //---------------------------------------------------------------------------- 234 // Structural Equivalence 235 //---------------------------------------------------------------------------- 236 237 namespace { 238 struct StructuralEquivalenceContext { 239 /// \brief AST contexts for which we are checking structural equivalence. 240 ASTContext &C1, &C2; 241 242 /// \brief The set of "tentative" equivalences between two canonical 243 /// declarations, mapping from a declaration in the first context to the 244 /// declaration in the second context that we believe to be equivalent. 245 llvm::DenseMap<Decl *, Decl *> TentativeEquivalences; 246 247 /// \brief Queue of declarations in the first context whose equivalence 248 /// with a declaration in the second context still needs to be verified. 249 std::deque<Decl *> DeclsToCheck; 250 251 /// \brief Declaration (from, to) pairs that are known not to be equivalent 252 /// (which we have already complained about). 253 llvm::DenseSet<std::pair<Decl *, Decl *> > &NonEquivalentDecls; 254 255 /// \brief Whether we're being strict about the spelling of types when 256 /// unifying two types. 257 bool StrictTypeSpelling; 258 259 /// \brief Whether to complain about failures. 260 bool Complain; 261 262 /// \brief \c true if the last diagnostic came from C2. 263 bool LastDiagFromC2; 264 265 StructuralEquivalenceContext(ASTContext &C1, ASTContext &C2, 266 llvm::DenseSet<std::pair<Decl *, Decl *> > &NonEquivalentDecls, 267 bool StrictTypeSpelling = false, 268 bool Complain = true) 269 : C1(C1), C2(C2), NonEquivalentDecls(NonEquivalentDecls), 270 StrictTypeSpelling(StrictTypeSpelling), Complain(Complain), 271 LastDiagFromC2(false) {} 272 273 /// \brief Determine whether the two declarations are structurally 274 /// equivalent. 275 bool IsStructurallyEquivalent(Decl *D1, Decl *D2); 276 277 /// \brief Determine whether the two types are structurally equivalent. 278 bool IsStructurallyEquivalent(QualType T1, QualType T2); 279 280 private: 281 /// \brief Finish checking all of the structural equivalences. 282 /// 283 /// \returns true if an error occurred, false otherwise. 284 bool Finish(); 285 286 public: 287 DiagnosticBuilder Diag1(SourceLocation Loc, unsigned DiagID) { 288 assert(Complain && "Not allowed to complain"); 289 if (LastDiagFromC2) 290 C1.getDiagnostics().notePriorDiagnosticFrom(C2.getDiagnostics()); 291 LastDiagFromC2 = false; 292 return C1.getDiagnostics().Report(Loc, DiagID); 293 } 294 295 DiagnosticBuilder Diag2(SourceLocation Loc, unsigned DiagID) { 296 assert(Complain && "Not allowed to complain"); 297 if (!LastDiagFromC2) 298 C2.getDiagnostics().notePriorDiagnosticFrom(C1.getDiagnostics()); 299 LastDiagFromC2 = true; 300 return C2.getDiagnostics().Report(Loc, DiagID); 301 } 302 }; 303 } 304 305 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 306 QualType T1, QualType T2); 307 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 308 Decl *D1, Decl *D2); 309 310 /// \brief Determine structural equivalence of two expressions. 311 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 312 Expr *E1, Expr *E2) { 313 if (!E1 || !E2) 314 return E1 == E2; 315 316 // FIXME: Actually perform a structural comparison! 317 return true; 318 } 319 320 /// \brief Determine whether two identifiers are equivalent. 321 static bool IsStructurallyEquivalent(const IdentifierInfo *Name1, 322 const IdentifierInfo *Name2) { 323 if (!Name1 || !Name2) 324 return Name1 == Name2; 325 326 return Name1->getName() == Name2->getName(); 327 } 328 329 /// \brief Determine whether two nested-name-specifiers are equivalent. 330 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 331 NestedNameSpecifier *NNS1, 332 NestedNameSpecifier *NNS2) { 333 // FIXME: Implement! 334 return true; 335 } 336 337 /// \brief Determine whether two template arguments are equivalent. 338 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 339 const TemplateArgument &Arg1, 340 const TemplateArgument &Arg2) { 341 if (Arg1.getKind() != Arg2.getKind()) 342 return false; 343 344 switch (Arg1.getKind()) { 345 case TemplateArgument::Null: 346 return true; 347 348 case TemplateArgument::Type: 349 return Context.IsStructurallyEquivalent(Arg1.getAsType(), Arg2.getAsType()); 350 351 case TemplateArgument::Integral: 352 if (!Context.IsStructurallyEquivalent(Arg1.getIntegralType(), 353 Arg2.getIntegralType())) 354 return false; 355 356 return llvm::APSInt::isSameValue(Arg1.getAsIntegral(), Arg2.getAsIntegral()); 357 358 case TemplateArgument::Declaration: 359 return Context.IsStructurallyEquivalent(Arg1.getAsDecl(), Arg2.getAsDecl()); 360 361 case TemplateArgument::NullPtr: 362 return true; // FIXME: Is this correct? 363 364 case TemplateArgument::Template: 365 return IsStructurallyEquivalent(Context, 366 Arg1.getAsTemplate(), 367 Arg2.getAsTemplate()); 368 369 case TemplateArgument::TemplateExpansion: 370 return IsStructurallyEquivalent(Context, 371 Arg1.getAsTemplateOrTemplatePattern(), 372 Arg2.getAsTemplateOrTemplatePattern()); 373 374 case TemplateArgument::Expression: 375 return IsStructurallyEquivalent(Context, 376 Arg1.getAsExpr(), Arg2.getAsExpr()); 377 378 case TemplateArgument::Pack: 379 if (Arg1.pack_size() != Arg2.pack_size()) 380 return false; 381 382 for (unsigned I = 0, N = Arg1.pack_size(); I != N; ++I) 383 if (!IsStructurallyEquivalent(Context, 384 Arg1.pack_begin()[I], 385 Arg2.pack_begin()[I])) 386 return false; 387 388 return true; 389 } 390 391 llvm_unreachable("Invalid template argument kind"); 392 } 393 394 /// \brief Determine structural equivalence for the common part of array 395 /// types. 396 static bool IsArrayStructurallyEquivalent(StructuralEquivalenceContext &Context, 397 const ArrayType *Array1, 398 const ArrayType *Array2) { 399 if (!IsStructurallyEquivalent(Context, 400 Array1->getElementType(), 401 Array2->getElementType())) 402 return false; 403 if (Array1->getSizeModifier() != Array2->getSizeModifier()) 404 return false; 405 if (Array1->getIndexTypeQualifiers() != Array2->getIndexTypeQualifiers()) 406 return false; 407 408 return true; 409 } 410 411 /// \brief Determine structural equivalence of two types. 412 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 413 QualType T1, QualType T2) { 414 if (T1.isNull() || T2.isNull()) 415 return T1.isNull() && T2.isNull(); 416 417 if (!Context.StrictTypeSpelling) { 418 // We aren't being strict about token-to-token equivalence of types, 419 // so map down to the canonical type. 420 T1 = Context.C1.getCanonicalType(T1); 421 T2 = Context.C2.getCanonicalType(T2); 422 } 423 424 if (T1.getQualifiers() != T2.getQualifiers()) 425 return false; 426 427 Type::TypeClass TC = T1->getTypeClass(); 428 429 if (T1->getTypeClass() != T2->getTypeClass()) { 430 // Compare function types with prototypes vs. without prototypes as if 431 // both did not have prototypes. 432 if (T1->getTypeClass() == Type::FunctionProto && 433 T2->getTypeClass() == Type::FunctionNoProto) 434 TC = Type::FunctionNoProto; 435 else if (T1->getTypeClass() == Type::FunctionNoProto && 436 T2->getTypeClass() == Type::FunctionProto) 437 TC = Type::FunctionNoProto; 438 else 439 return false; 440 } 441 442 switch (TC) { 443 case Type::Builtin: 444 // FIXME: Deal with Char_S/Char_U. 445 if (cast<BuiltinType>(T1)->getKind() != cast<BuiltinType>(T2)->getKind()) 446 return false; 447 break; 448 449 case Type::Complex: 450 if (!IsStructurallyEquivalent(Context, 451 cast<ComplexType>(T1)->getElementType(), 452 cast<ComplexType>(T2)->getElementType())) 453 return false; 454 break; 455 456 case Type::Adjusted: 457 case Type::Decayed: 458 if (!IsStructurallyEquivalent(Context, 459 cast<AdjustedType>(T1)->getOriginalType(), 460 cast<AdjustedType>(T2)->getOriginalType())) 461 return false; 462 break; 463 464 case Type::Pointer: 465 if (!IsStructurallyEquivalent(Context, 466 cast<PointerType>(T1)->getPointeeType(), 467 cast<PointerType>(T2)->getPointeeType())) 468 return false; 469 break; 470 471 case Type::BlockPointer: 472 if (!IsStructurallyEquivalent(Context, 473 cast<BlockPointerType>(T1)->getPointeeType(), 474 cast<BlockPointerType>(T2)->getPointeeType())) 475 return false; 476 break; 477 478 case Type::LValueReference: 479 case Type::RValueReference: { 480 const ReferenceType *Ref1 = cast<ReferenceType>(T1); 481 const ReferenceType *Ref2 = cast<ReferenceType>(T2); 482 if (Ref1->isSpelledAsLValue() != Ref2->isSpelledAsLValue()) 483 return false; 484 if (Ref1->isInnerRef() != Ref2->isInnerRef()) 485 return false; 486 if (!IsStructurallyEquivalent(Context, 487 Ref1->getPointeeTypeAsWritten(), 488 Ref2->getPointeeTypeAsWritten())) 489 return false; 490 break; 491 } 492 493 case Type::MemberPointer: { 494 const MemberPointerType *MemPtr1 = cast<MemberPointerType>(T1); 495 const MemberPointerType *MemPtr2 = cast<MemberPointerType>(T2); 496 if (!IsStructurallyEquivalent(Context, 497 MemPtr1->getPointeeType(), 498 MemPtr2->getPointeeType())) 499 return false; 500 if (!IsStructurallyEquivalent(Context, 501 QualType(MemPtr1->getClass(), 0), 502 QualType(MemPtr2->getClass(), 0))) 503 return false; 504 break; 505 } 506 507 case Type::ConstantArray: { 508 const ConstantArrayType *Array1 = cast<ConstantArrayType>(T1); 509 const ConstantArrayType *Array2 = cast<ConstantArrayType>(T2); 510 if (!llvm::APInt::isSameValue(Array1->getSize(), Array2->getSize())) 511 return false; 512 513 if (!IsArrayStructurallyEquivalent(Context, Array1, Array2)) 514 return false; 515 break; 516 } 517 518 case Type::IncompleteArray: 519 if (!IsArrayStructurallyEquivalent(Context, 520 cast<ArrayType>(T1), 521 cast<ArrayType>(T2))) 522 return false; 523 break; 524 525 case Type::VariableArray: { 526 const VariableArrayType *Array1 = cast<VariableArrayType>(T1); 527 const VariableArrayType *Array2 = cast<VariableArrayType>(T2); 528 if (!IsStructurallyEquivalent(Context, 529 Array1->getSizeExpr(), Array2->getSizeExpr())) 530 return false; 531 532 if (!IsArrayStructurallyEquivalent(Context, Array1, Array2)) 533 return false; 534 535 break; 536 } 537 538 case Type::DependentSizedArray: { 539 const DependentSizedArrayType *Array1 = cast<DependentSizedArrayType>(T1); 540 const DependentSizedArrayType *Array2 = cast<DependentSizedArrayType>(T2); 541 if (!IsStructurallyEquivalent(Context, 542 Array1->getSizeExpr(), Array2->getSizeExpr())) 543 return false; 544 545 if (!IsArrayStructurallyEquivalent(Context, Array1, Array2)) 546 return false; 547 548 break; 549 } 550 551 case Type::DependentSizedExtVector: { 552 const DependentSizedExtVectorType *Vec1 553 = cast<DependentSizedExtVectorType>(T1); 554 const DependentSizedExtVectorType *Vec2 555 = cast<DependentSizedExtVectorType>(T2); 556 if (!IsStructurallyEquivalent(Context, 557 Vec1->getSizeExpr(), Vec2->getSizeExpr())) 558 return false; 559 if (!IsStructurallyEquivalent(Context, 560 Vec1->getElementType(), 561 Vec2->getElementType())) 562 return false; 563 break; 564 } 565 566 case Type::Vector: 567 case Type::ExtVector: { 568 const VectorType *Vec1 = cast<VectorType>(T1); 569 const VectorType *Vec2 = cast<VectorType>(T2); 570 if (!IsStructurallyEquivalent(Context, 571 Vec1->getElementType(), 572 Vec2->getElementType())) 573 return false; 574 if (Vec1->getNumElements() != Vec2->getNumElements()) 575 return false; 576 if (Vec1->getVectorKind() != Vec2->getVectorKind()) 577 return false; 578 break; 579 } 580 581 case Type::FunctionProto: { 582 const FunctionProtoType *Proto1 = cast<FunctionProtoType>(T1); 583 const FunctionProtoType *Proto2 = cast<FunctionProtoType>(T2); 584 if (Proto1->getNumParams() != Proto2->getNumParams()) 585 return false; 586 for (unsigned I = 0, N = Proto1->getNumParams(); I != N; ++I) { 587 if (!IsStructurallyEquivalent(Context, Proto1->getParamType(I), 588 Proto2->getParamType(I))) 589 return false; 590 } 591 if (Proto1->isVariadic() != Proto2->isVariadic()) 592 return false; 593 if (Proto1->getExceptionSpecType() != Proto2->getExceptionSpecType()) 594 return false; 595 if (Proto1->getExceptionSpecType() == EST_Dynamic) { 596 if (Proto1->getNumExceptions() != Proto2->getNumExceptions()) 597 return false; 598 for (unsigned I = 0, N = Proto1->getNumExceptions(); I != N; ++I) { 599 if (!IsStructurallyEquivalent(Context, 600 Proto1->getExceptionType(I), 601 Proto2->getExceptionType(I))) 602 return false; 603 } 604 } else if (Proto1->getExceptionSpecType() == EST_ComputedNoexcept) { 605 if (!IsStructurallyEquivalent(Context, 606 Proto1->getNoexceptExpr(), 607 Proto2->getNoexceptExpr())) 608 return false; 609 } 610 if (Proto1->getTypeQuals() != Proto2->getTypeQuals()) 611 return false; 612 613 // Fall through to check the bits common with FunctionNoProtoType. 614 } 615 616 case Type::FunctionNoProto: { 617 const FunctionType *Function1 = cast<FunctionType>(T1); 618 const FunctionType *Function2 = cast<FunctionType>(T2); 619 if (!IsStructurallyEquivalent(Context, Function1->getReturnType(), 620 Function2->getReturnType())) 621 return false; 622 if (Function1->getExtInfo() != Function2->getExtInfo()) 623 return false; 624 break; 625 } 626 627 case Type::UnresolvedUsing: 628 if (!IsStructurallyEquivalent(Context, 629 cast<UnresolvedUsingType>(T1)->getDecl(), 630 cast<UnresolvedUsingType>(T2)->getDecl())) 631 return false; 632 633 break; 634 635 case Type::Attributed: 636 if (!IsStructurallyEquivalent(Context, 637 cast<AttributedType>(T1)->getModifiedType(), 638 cast<AttributedType>(T2)->getModifiedType())) 639 return false; 640 if (!IsStructurallyEquivalent(Context, 641 cast<AttributedType>(T1)->getEquivalentType(), 642 cast<AttributedType>(T2)->getEquivalentType())) 643 return false; 644 break; 645 646 case Type::Paren: 647 if (!IsStructurallyEquivalent(Context, 648 cast<ParenType>(T1)->getInnerType(), 649 cast<ParenType>(T2)->getInnerType())) 650 return false; 651 break; 652 653 case Type::Typedef: 654 if (!IsStructurallyEquivalent(Context, 655 cast<TypedefType>(T1)->getDecl(), 656 cast<TypedefType>(T2)->getDecl())) 657 return false; 658 break; 659 660 case Type::TypeOfExpr: 661 if (!IsStructurallyEquivalent(Context, 662 cast<TypeOfExprType>(T1)->getUnderlyingExpr(), 663 cast<TypeOfExprType>(T2)->getUnderlyingExpr())) 664 return false; 665 break; 666 667 case Type::TypeOf: 668 if (!IsStructurallyEquivalent(Context, 669 cast<TypeOfType>(T1)->getUnderlyingType(), 670 cast<TypeOfType>(T2)->getUnderlyingType())) 671 return false; 672 break; 673 674 case Type::UnaryTransform: 675 if (!IsStructurallyEquivalent(Context, 676 cast<UnaryTransformType>(T1)->getUnderlyingType(), 677 cast<UnaryTransformType>(T1)->getUnderlyingType())) 678 return false; 679 break; 680 681 case Type::Decltype: 682 if (!IsStructurallyEquivalent(Context, 683 cast<DecltypeType>(T1)->getUnderlyingExpr(), 684 cast<DecltypeType>(T2)->getUnderlyingExpr())) 685 return false; 686 break; 687 688 case Type::Auto: 689 if (!IsStructurallyEquivalent(Context, 690 cast<AutoType>(T1)->getDeducedType(), 691 cast<AutoType>(T2)->getDeducedType())) 692 return false; 693 break; 694 695 case Type::Record: 696 case Type::Enum: 697 if (!IsStructurallyEquivalent(Context, 698 cast<TagType>(T1)->getDecl(), 699 cast<TagType>(T2)->getDecl())) 700 return false; 701 break; 702 703 case Type::TemplateTypeParm: { 704 const TemplateTypeParmType *Parm1 = cast<TemplateTypeParmType>(T1); 705 const TemplateTypeParmType *Parm2 = cast<TemplateTypeParmType>(T2); 706 if (Parm1->getDepth() != Parm2->getDepth()) 707 return false; 708 if (Parm1->getIndex() != Parm2->getIndex()) 709 return false; 710 if (Parm1->isParameterPack() != Parm2->isParameterPack()) 711 return false; 712 713 // Names of template type parameters are never significant. 714 break; 715 } 716 717 case Type::SubstTemplateTypeParm: { 718 const SubstTemplateTypeParmType *Subst1 719 = cast<SubstTemplateTypeParmType>(T1); 720 const SubstTemplateTypeParmType *Subst2 721 = cast<SubstTemplateTypeParmType>(T2); 722 if (!IsStructurallyEquivalent(Context, 723 QualType(Subst1->getReplacedParameter(), 0), 724 QualType(Subst2->getReplacedParameter(), 0))) 725 return false; 726 if (!IsStructurallyEquivalent(Context, 727 Subst1->getReplacementType(), 728 Subst2->getReplacementType())) 729 return false; 730 break; 731 } 732 733 case Type::SubstTemplateTypeParmPack: { 734 const SubstTemplateTypeParmPackType *Subst1 735 = cast<SubstTemplateTypeParmPackType>(T1); 736 const SubstTemplateTypeParmPackType *Subst2 737 = cast<SubstTemplateTypeParmPackType>(T2); 738 if (!IsStructurallyEquivalent(Context, 739 QualType(Subst1->getReplacedParameter(), 0), 740 QualType(Subst2->getReplacedParameter(), 0))) 741 return false; 742 if (!IsStructurallyEquivalent(Context, 743 Subst1->getArgumentPack(), 744 Subst2->getArgumentPack())) 745 return false; 746 break; 747 } 748 case Type::TemplateSpecialization: { 749 const TemplateSpecializationType *Spec1 750 = cast<TemplateSpecializationType>(T1); 751 const TemplateSpecializationType *Spec2 752 = cast<TemplateSpecializationType>(T2); 753 if (!IsStructurallyEquivalent(Context, 754 Spec1->getTemplateName(), 755 Spec2->getTemplateName())) 756 return false; 757 if (Spec1->getNumArgs() != Spec2->getNumArgs()) 758 return false; 759 for (unsigned I = 0, N = Spec1->getNumArgs(); I != N; ++I) { 760 if (!IsStructurallyEquivalent(Context, 761 Spec1->getArg(I), Spec2->getArg(I))) 762 return false; 763 } 764 break; 765 } 766 767 case Type::Elaborated: { 768 const ElaboratedType *Elab1 = cast<ElaboratedType>(T1); 769 const ElaboratedType *Elab2 = cast<ElaboratedType>(T2); 770 // CHECKME: what if a keyword is ETK_None or ETK_typename ? 771 if (Elab1->getKeyword() != Elab2->getKeyword()) 772 return false; 773 if (!IsStructurallyEquivalent(Context, 774 Elab1->getQualifier(), 775 Elab2->getQualifier())) 776 return false; 777 if (!IsStructurallyEquivalent(Context, 778 Elab1->getNamedType(), 779 Elab2->getNamedType())) 780 return false; 781 break; 782 } 783 784 case Type::InjectedClassName: { 785 const InjectedClassNameType *Inj1 = cast<InjectedClassNameType>(T1); 786 const InjectedClassNameType *Inj2 = cast<InjectedClassNameType>(T2); 787 if (!IsStructurallyEquivalent(Context, 788 Inj1->getInjectedSpecializationType(), 789 Inj2->getInjectedSpecializationType())) 790 return false; 791 break; 792 } 793 794 case Type::DependentName: { 795 const DependentNameType *Typename1 = cast<DependentNameType>(T1); 796 const DependentNameType *Typename2 = cast<DependentNameType>(T2); 797 if (!IsStructurallyEquivalent(Context, 798 Typename1->getQualifier(), 799 Typename2->getQualifier())) 800 return false; 801 if (!IsStructurallyEquivalent(Typename1->getIdentifier(), 802 Typename2->getIdentifier())) 803 return false; 804 805 break; 806 } 807 808 case Type::DependentTemplateSpecialization: { 809 const DependentTemplateSpecializationType *Spec1 = 810 cast<DependentTemplateSpecializationType>(T1); 811 const DependentTemplateSpecializationType *Spec2 = 812 cast<DependentTemplateSpecializationType>(T2); 813 if (!IsStructurallyEquivalent(Context, 814 Spec1->getQualifier(), 815 Spec2->getQualifier())) 816 return false; 817 if (!IsStructurallyEquivalent(Spec1->getIdentifier(), 818 Spec2->getIdentifier())) 819 return false; 820 if (Spec1->getNumArgs() != Spec2->getNumArgs()) 821 return false; 822 for (unsigned I = 0, N = Spec1->getNumArgs(); I != N; ++I) { 823 if (!IsStructurallyEquivalent(Context, 824 Spec1->getArg(I), Spec2->getArg(I))) 825 return false; 826 } 827 break; 828 } 829 830 case Type::PackExpansion: 831 if (!IsStructurallyEquivalent(Context, 832 cast<PackExpansionType>(T1)->getPattern(), 833 cast<PackExpansionType>(T2)->getPattern())) 834 return false; 835 break; 836 837 case Type::ObjCInterface: { 838 const ObjCInterfaceType *Iface1 = cast<ObjCInterfaceType>(T1); 839 const ObjCInterfaceType *Iface2 = cast<ObjCInterfaceType>(T2); 840 if (!IsStructurallyEquivalent(Context, 841 Iface1->getDecl(), Iface2->getDecl())) 842 return false; 843 break; 844 } 845 846 case Type::ObjCObject: { 847 const ObjCObjectType *Obj1 = cast<ObjCObjectType>(T1); 848 const ObjCObjectType *Obj2 = cast<ObjCObjectType>(T2); 849 if (!IsStructurallyEquivalent(Context, 850 Obj1->getBaseType(), 851 Obj2->getBaseType())) 852 return false; 853 if (Obj1->getNumProtocols() != Obj2->getNumProtocols()) 854 return false; 855 for (unsigned I = 0, N = Obj1->getNumProtocols(); I != N; ++I) { 856 if (!IsStructurallyEquivalent(Context, 857 Obj1->getProtocol(I), 858 Obj2->getProtocol(I))) 859 return false; 860 } 861 break; 862 } 863 864 case Type::ObjCObjectPointer: { 865 const ObjCObjectPointerType *Ptr1 = cast<ObjCObjectPointerType>(T1); 866 const ObjCObjectPointerType *Ptr2 = cast<ObjCObjectPointerType>(T2); 867 if (!IsStructurallyEquivalent(Context, 868 Ptr1->getPointeeType(), 869 Ptr2->getPointeeType())) 870 return false; 871 break; 872 } 873 874 case Type::Atomic: { 875 if (!IsStructurallyEquivalent(Context, 876 cast<AtomicType>(T1)->getValueType(), 877 cast<AtomicType>(T2)->getValueType())) 878 return false; 879 break; 880 } 881 882 case Type::Pipe: { 883 if (!IsStructurallyEquivalent(Context, 884 cast<PipeType>(T1)->getElementType(), 885 cast<PipeType>(T2)->getElementType())) 886 return false; 887 break; 888 } 889 890 } // end switch 891 892 return true; 893 } 894 895 /// \brief Determine structural equivalence of two fields. 896 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 897 FieldDecl *Field1, FieldDecl *Field2) { 898 RecordDecl *Owner2 = cast<RecordDecl>(Field2->getDeclContext()); 899 900 // For anonymous structs/unions, match up the anonymous struct/union type 901 // declarations directly, so that we don't go off searching for anonymous 902 // types 903 if (Field1->isAnonymousStructOrUnion() && 904 Field2->isAnonymousStructOrUnion()) { 905 RecordDecl *D1 = Field1->getType()->castAs<RecordType>()->getDecl(); 906 RecordDecl *D2 = Field2->getType()->castAs<RecordType>()->getDecl(); 907 return IsStructurallyEquivalent(Context, D1, D2); 908 } 909 910 // Check for equivalent field names. 911 IdentifierInfo *Name1 = Field1->getIdentifier(); 912 IdentifierInfo *Name2 = Field2->getIdentifier(); 913 if (!::IsStructurallyEquivalent(Name1, Name2)) 914 return false; 915 916 if (!IsStructurallyEquivalent(Context, 917 Field1->getType(), Field2->getType())) { 918 if (Context.Complain) { 919 Context.Diag2(Owner2->getLocation(), diag::warn_odr_tag_type_inconsistent) 920 << Context.C2.getTypeDeclType(Owner2); 921 Context.Diag2(Field2->getLocation(), diag::note_odr_field) 922 << Field2->getDeclName() << Field2->getType(); 923 Context.Diag1(Field1->getLocation(), diag::note_odr_field) 924 << Field1->getDeclName() << Field1->getType(); 925 } 926 return false; 927 } 928 929 if (Field1->isBitField() != Field2->isBitField()) { 930 if (Context.Complain) { 931 Context.Diag2(Owner2->getLocation(), diag::warn_odr_tag_type_inconsistent) 932 << Context.C2.getTypeDeclType(Owner2); 933 if (Field1->isBitField()) { 934 Context.Diag1(Field1->getLocation(), diag::note_odr_bit_field) 935 << Field1->getDeclName() << Field1->getType() 936 << Field1->getBitWidthValue(Context.C1); 937 Context.Diag2(Field2->getLocation(), diag::note_odr_not_bit_field) 938 << Field2->getDeclName(); 939 } else { 940 Context.Diag2(Field2->getLocation(), diag::note_odr_bit_field) 941 << Field2->getDeclName() << Field2->getType() 942 << Field2->getBitWidthValue(Context.C2); 943 Context.Diag1(Field1->getLocation(), diag::note_odr_not_bit_field) 944 << Field1->getDeclName(); 945 } 946 } 947 return false; 948 } 949 950 if (Field1->isBitField()) { 951 // Make sure that the bit-fields are the same length. 952 unsigned Bits1 = Field1->getBitWidthValue(Context.C1); 953 unsigned Bits2 = Field2->getBitWidthValue(Context.C2); 954 955 if (Bits1 != Bits2) { 956 if (Context.Complain) { 957 Context.Diag2(Owner2->getLocation(), diag::warn_odr_tag_type_inconsistent) 958 << Context.C2.getTypeDeclType(Owner2); 959 Context.Diag2(Field2->getLocation(), diag::note_odr_bit_field) 960 << Field2->getDeclName() << Field2->getType() << Bits2; 961 Context.Diag1(Field1->getLocation(), diag::note_odr_bit_field) 962 << Field1->getDeclName() << Field1->getType() << Bits1; 963 } 964 return false; 965 } 966 } 967 968 return true; 969 } 970 971 /// \brief Find the index of the given anonymous struct/union within its 972 /// context. 973 /// 974 /// \returns Returns the index of this anonymous struct/union in its context, 975 /// including the next assigned index (if none of them match). Returns an 976 /// empty option if the context is not a record, i.e.. if the anonymous 977 /// struct/union is at namespace or block scope. 978 static Optional<unsigned> findAnonymousStructOrUnionIndex(RecordDecl *Anon) { 979 ASTContext &Context = Anon->getASTContext(); 980 QualType AnonTy = Context.getRecordType(Anon); 981 982 RecordDecl *Owner = dyn_cast<RecordDecl>(Anon->getDeclContext()); 983 if (!Owner) 984 return None; 985 986 unsigned Index = 0; 987 for (const auto *D : Owner->noload_decls()) { 988 const auto *F = dyn_cast<FieldDecl>(D); 989 if (!F || !F->isAnonymousStructOrUnion()) 990 continue; 991 992 if (Context.hasSameType(F->getType(), AnonTy)) 993 break; 994 995 ++Index; 996 } 997 998 return Index; 999 } 1000 1001 /// \brief Determine structural equivalence of two records. 1002 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 1003 RecordDecl *D1, RecordDecl *D2) { 1004 if (D1->isUnion() != D2->isUnion()) { 1005 if (Context.Complain) { 1006 Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent) 1007 << Context.C2.getTypeDeclType(D2); 1008 Context.Diag1(D1->getLocation(), diag::note_odr_tag_kind_here) 1009 << D1->getDeclName() << (unsigned)D1->getTagKind(); 1010 } 1011 return false; 1012 } 1013 1014 if (D1->isAnonymousStructOrUnion() && D2->isAnonymousStructOrUnion()) { 1015 // If both anonymous structs/unions are in a record context, make sure 1016 // they occur in the same location in the context records. 1017 if (Optional<unsigned> Index1 = findAnonymousStructOrUnionIndex(D1)) { 1018 if (Optional<unsigned> Index2 = findAnonymousStructOrUnionIndex(D2)) { 1019 if (*Index1 != *Index2) 1020 return false; 1021 } 1022 } 1023 } 1024 1025 // If both declarations are class template specializations, we know 1026 // the ODR applies, so check the template and template arguments. 1027 ClassTemplateSpecializationDecl *Spec1 1028 = dyn_cast<ClassTemplateSpecializationDecl>(D1); 1029 ClassTemplateSpecializationDecl *Spec2 1030 = dyn_cast<ClassTemplateSpecializationDecl>(D2); 1031 if (Spec1 && Spec2) { 1032 // Check that the specialized templates are the same. 1033 if (!IsStructurallyEquivalent(Context, Spec1->getSpecializedTemplate(), 1034 Spec2->getSpecializedTemplate())) 1035 return false; 1036 1037 // Check that the template arguments are the same. 1038 if (Spec1->getTemplateArgs().size() != Spec2->getTemplateArgs().size()) 1039 return false; 1040 1041 for (unsigned I = 0, N = Spec1->getTemplateArgs().size(); I != N; ++I) 1042 if (!IsStructurallyEquivalent(Context, 1043 Spec1->getTemplateArgs().get(I), 1044 Spec2->getTemplateArgs().get(I))) 1045 return false; 1046 } 1047 // If one is a class template specialization and the other is not, these 1048 // structures are different. 1049 else if (Spec1 || Spec2) 1050 return false; 1051 1052 // Compare the definitions of these two records. If either or both are 1053 // incomplete, we assume that they are equivalent. 1054 D1 = D1->getDefinition(); 1055 D2 = D2->getDefinition(); 1056 if (!D1 || !D2) 1057 return true; 1058 1059 if (CXXRecordDecl *D1CXX = dyn_cast<CXXRecordDecl>(D1)) { 1060 if (CXXRecordDecl *D2CXX = dyn_cast<CXXRecordDecl>(D2)) { 1061 if (D1CXX->getNumBases() != D2CXX->getNumBases()) { 1062 if (Context.Complain) { 1063 Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent) 1064 << Context.C2.getTypeDeclType(D2); 1065 Context.Diag2(D2->getLocation(), diag::note_odr_number_of_bases) 1066 << D2CXX->getNumBases(); 1067 Context.Diag1(D1->getLocation(), diag::note_odr_number_of_bases) 1068 << D1CXX->getNumBases(); 1069 } 1070 return false; 1071 } 1072 1073 // Check the base classes. 1074 for (CXXRecordDecl::base_class_iterator Base1 = D1CXX->bases_begin(), 1075 BaseEnd1 = D1CXX->bases_end(), 1076 Base2 = D2CXX->bases_begin(); 1077 Base1 != BaseEnd1; 1078 ++Base1, ++Base2) { 1079 if (!IsStructurallyEquivalent(Context, 1080 Base1->getType(), Base2->getType())) { 1081 if (Context.Complain) { 1082 Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent) 1083 << Context.C2.getTypeDeclType(D2); 1084 Context.Diag2(Base2->getLocStart(), diag::note_odr_base) 1085 << Base2->getType() 1086 << Base2->getSourceRange(); 1087 Context.Diag1(Base1->getLocStart(), diag::note_odr_base) 1088 << Base1->getType() 1089 << Base1->getSourceRange(); 1090 } 1091 return false; 1092 } 1093 1094 // Check virtual vs. non-virtual inheritance mismatch. 1095 if (Base1->isVirtual() != Base2->isVirtual()) { 1096 if (Context.Complain) { 1097 Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent) 1098 << Context.C2.getTypeDeclType(D2); 1099 Context.Diag2(Base2->getLocStart(), 1100 diag::note_odr_virtual_base) 1101 << Base2->isVirtual() << Base2->getSourceRange(); 1102 Context.Diag1(Base1->getLocStart(), diag::note_odr_base) 1103 << Base1->isVirtual() 1104 << Base1->getSourceRange(); 1105 } 1106 return false; 1107 } 1108 } 1109 } else if (D1CXX->getNumBases() > 0) { 1110 if (Context.Complain) { 1111 Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent) 1112 << Context.C2.getTypeDeclType(D2); 1113 const CXXBaseSpecifier *Base1 = D1CXX->bases_begin(); 1114 Context.Diag1(Base1->getLocStart(), diag::note_odr_base) 1115 << Base1->getType() 1116 << Base1->getSourceRange(); 1117 Context.Diag2(D2->getLocation(), diag::note_odr_missing_base); 1118 } 1119 return false; 1120 } 1121 } 1122 1123 // Check the fields for consistency. 1124 RecordDecl::field_iterator Field2 = D2->field_begin(), 1125 Field2End = D2->field_end(); 1126 for (RecordDecl::field_iterator Field1 = D1->field_begin(), 1127 Field1End = D1->field_end(); 1128 Field1 != Field1End; 1129 ++Field1, ++Field2) { 1130 if (Field2 == Field2End) { 1131 if (Context.Complain) { 1132 Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent) 1133 << Context.C2.getTypeDeclType(D2); 1134 Context.Diag1(Field1->getLocation(), diag::note_odr_field) 1135 << Field1->getDeclName() << Field1->getType(); 1136 Context.Diag2(D2->getLocation(), diag::note_odr_missing_field); 1137 } 1138 return false; 1139 } 1140 1141 if (!IsStructurallyEquivalent(Context, *Field1, *Field2)) 1142 return false; 1143 } 1144 1145 if (Field2 != Field2End) { 1146 if (Context.Complain) { 1147 Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent) 1148 << Context.C2.getTypeDeclType(D2); 1149 Context.Diag2(Field2->getLocation(), diag::note_odr_field) 1150 << Field2->getDeclName() << Field2->getType(); 1151 Context.Diag1(D1->getLocation(), diag::note_odr_missing_field); 1152 } 1153 return false; 1154 } 1155 1156 return true; 1157 } 1158 1159 /// \brief Determine structural equivalence of two enums. 1160 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 1161 EnumDecl *D1, EnumDecl *D2) { 1162 EnumDecl::enumerator_iterator EC2 = D2->enumerator_begin(), 1163 EC2End = D2->enumerator_end(); 1164 for (EnumDecl::enumerator_iterator EC1 = D1->enumerator_begin(), 1165 EC1End = D1->enumerator_end(); 1166 EC1 != EC1End; ++EC1, ++EC2) { 1167 if (EC2 == EC2End) { 1168 if (Context.Complain) { 1169 Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent) 1170 << Context.C2.getTypeDeclType(D2); 1171 Context.Diag1(EC1->getLocation(), diag::note_odr_enumerator) 1172 << EC1->getDeclName() 1173 << EC1->getInitVal().toString(10); 1174 Context.Diag2(D2->getLocation(), diag::note_odr_missing_enumerator); 1175 } 1176 return false; 1177 } 1178 1179 llvm::APSInt Val1 = EC1->getInitVal(); 1180 llvm::APSInt Val2 = EC2->getInitVal(); 1181 if (!llvm::APSInt::isSameValue(Val1, Val2) || 1182 !IsStructurallyEquivalent(EC1->getIdentifier(), EC2->getIdentifier())) { 1183 if (Context.Complain) { 1184 Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent) 1185 << Context.C2.getTypeDeclType(D2); 1186 Context.Diag2(EC2->getLocation(), diag::note_odr_enumerator) 1187 << EC2->getDeclName() 1188 << EC2->getInitVal().toString(10); 1189 Context.Diag1(EC1->getLocation(), diag::note_odr_enumerator) 1190 << EC1->getDeclName() 1191 << EC1->getInitVal().toString(10); 1192 } 1193 return false; 1194 } 1195 } 1196 1197 if (EC2 != EC2End) { 1198 if (Context.Complain) { 1199 Context.Diag2(D2->getLocation(), diag::warn_odr_tag_type_inconsistent) 1200 << Context.C2.getTypeDeclType(D2); 1201 Context.Diag2(EC2->getLocation(), diag::note_odr_enumerator) 1202 << EC2->getDeclName() 1203 << EC2->getInitVal().toString(10); 1204 Context.Diag1(D1->getLocation(), diag::note_odr_missing_enumerator); 1205 } 1206 return false; 1207 } 1208 1209 return true; 1210 } 1211 1212 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 1213 TemplateParameterList *Params1, 1214 TemplateParameterList *Params2) { 1215 if (Params1->size() != Params2->size()) { 1216 if (Context.Complain) { 1217 Context.Diag2(Params2->getTemplateLoc(), 1218 diag::err_odr_different_num_template_parameters) 1219 << Params1->size() << Params2->size(); 1220 Context.Diag1(Params1->getTemplateLoc(), 1221 diag::note_odr_template_parameter_list); 1222 } 1223 return false; 1224 } 1225 1226 for (unsigned I = 0, N = Params1->size(); I != N; ++I) { 1227 if (Params1->getParam(I)->getKind() != Params2->getParam(I)->getKind()) { 1228 if (Context.Complain) { 1229 Context.Diag2(Params2->getParam(I)->getLocation(), 1230 diag::err_odr_different_template_parameter_kind); 1231 Context.Diag1(Params1->getParam(I)->getLocation(), 1232 diag::note_odr_template_parameter_here); 1233 } 1234 return false; 1235 } 1236 1237 if (!Context.IsStructurallyEquivalent(Params1->getParam(I), 1238 Params2->getParam(I))) { 1239 1240 return false; 1241 } 1242 } 1243 1244 return true; 1245 } 1246 1247 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 1248 TemplateTypeParmDecl *D1, 1249 TemplateTypeParmDecl *D2) { 1250 if (D1->isParameterPack() != D2->isParameterPack()) { 1251 if (Context.Complain) { 1252 Context.Diag2(D2->getLocation(), diag::err_odr_parameter_pack_non_pack) 1253 << D2->isParameterPack(); 1254 Context.Diag1(D1->getLocation(), diag::note_odr_parameter_pack_non_pack) 1255 << D1->isParameterPack(); 1256 } 1257 return false; 1258 } 1259 1260 return true; 1261 } 1262 1263 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 1264 NonTypeTemplateParmDecl *D1, 1265 NonTypeTemplateParmDecl *D2) { 1266 if (D1->isParameterPack() != D2->isParameterPack()) { 1267 if (Context.Complain) { 1268 Context.Diag2(D2->getLocation(), diag::err_odr_parameter_pack_non_pack) 1269 << D2->isParameterPack(); 1270 Context.Diag1(D1->getLocation(), diag::note_odr_parameter_pack_non_pack) 1271 << D1->isParameterPack(); 1272 } 1273 return false; 1274 } 1275 1276 // Check types. 1277 if (!Context.IsStructurallyEquivalent(D1->getType(), D2->getType())) { 1278 if (Context.Complain) { 1279 Context.Diag2(D2->getLocation(), 1280 diag::err_odr_non_type_parameter_type_inconsistent) 1281 << D2->getType() << D1->getType(); 1282 Context.Diag1(D1->getLocation(), diag::note_odr_value_here) 1283 << D1->getType(); 1284 } 1285 return false; 1286 } 1287 1288 return true; 1289 } 1290 1291 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 1292 TemplateTemplateParmDecl *D1, 1293 TemplateTemplateParmDecl *D2) { 1294 if (D1->isParameterPack() != D2->isParameterPack()) { 1295 if (Context.Complain) { 1296 Context.Diag2(D2->getLocation(), diag::err_odr_parameter_pack_non_pack) 1297 << D2->isParameterPack(); 1298 Context.Diag1(D1->getLocation(), diag::note_odr_parameter_pack_non_pack) 1299 << D1->isParameterPack(); 1300 } 1301 return false; 1302 } 1303 1304 // Check template parameter lists. 1305 return IsStructurallyEquivalent(Context, D1->getTemplateParameters(), 1306 D2->getTemplateParameters()); 1307 } 1308 1309 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 1310 ClassTemplateDecl *D1, 1311 ClassTemplateDecl *D2) { 1312 // Check template parameters. 1313 if (!IsStructurallyEquivalent(Context, 1314 D1->getTemplateParameters(), 1315 D2->getTemplateParameters())) 1316 return false; 1317 1318 // Check the templated declaration. 1319 return Context.IsStructurallyEquivalent(D1->getTemplatedDecl(), 1320 D2->getTemplatedDecl()); 1321 } 1322 1323 /// \brief Determine structural equivalence of two declarations. 1324 static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, 1325 Decl *D1, Decl *D2) { 1326 // FIXME: Check for known structural equivalences via a callback of some sort. 1327 1328 // Check whether we already know that these two declarations are not 1329 // structurally equivalent. 1330 if (Context.NonEquivalentDecls.count(std::make_pair(D1->getCanonicalDecl(), 1331 D2->getCanonicalDecl()))) 1332 return false; 1333 1334 // Determine whether we've already produced a tentative equivalence for D1. 1335 Decl *&EquivToD1 = Context.TentativeEquivalences[D1->getCanonicalDecl()]; 1336 if (EquivToD1) 1337 return EquivToD1 == D2->getCanonicalDecl(); 1338 1339 // Produce a tentative equivalence D1 <-> D2, which will be checked later. 1340 EquivToD1 = D2->getCanonicalDecl(); 1341 Context.DeclsToCheck.push_back(D1->getCanonicalDecl()); 1342 return true; 1343 } 1344 1345 bool StructuralEquivalenceContext::IsStructurallyEquivalent(Decl *D1, 1346 Decl *D2) { 1347 if (!::IsStructurallyEquivalent(*this, D1, D2)) 1348 return false; 1349 1350 return !Finish(); 1351 } 1352 1353 bool StructuralEquivalenceContext::IsStructurallyEquivalent(QualType T1, 1354 QualType T2) { 1355 if (!::IsStructurallyEquivalent(*this, T1, T2)) 1356 return false; 1357 1358 return !Finish(); 1359 } 1360 1361 bool StructuralEquivalenceContext::Finish() { 1362 while (!DeclsToCheck.empty()) { 1363 // Check the next declaration. 1364 Decl *D1 = DeclsToCheck.front(); 1365 DeclsToCheck.pop_front(); 1366 1367 Decl *D2 = TentativeEquivalences[D1]; 1368 assert(D2 && "Unrecorded tentative equivalence?"); 1369 1370 bool Equivalent = true; 1371 1372 // FIXME: Switch on all declaration kinds. For now, we're just going to 1373 // check the obvious ones. 1374 if (RecordDecl *Record1 = dyn_cast<RecordDecl>(D1)) { 1375 if (RecordDecl *Record2 = dyn_cast<RecordDecl>(D2)) { 1376 // Check for equivalent structure names. 1377 IdentifierInfo *Name1 = Record1->getIdentifier(); 1378 if (!Name1 && Record1->getTypedefNameForAnonDecl()) 1379 Name1 = Record1->getTypedefNameForAnonDecl()->getIdentifier(); 1380 IdentifierInfo *Name2 = Record2->getIdentifier(); 1381 if (!Name2 && Record2->getTypedefNameForAnonDecl()) 1382 Name2 = Record2->getTypedefNameForAnonDecl()->getIdentifier(); 1383 if (!::IsStructurallyEquivalent(Name1, Name2) || 1384 !::IsStructurallyEquivalent(*this, Record1, Record2)) 1385 Equivalent = false; 1386 } else { 1387 // Record/non-record mismatch. 1388 Equivalent = false; 1389 } 1390 } else if (EnumDecl *Enum1 = dyn_cast<EnumDecl>(D1)) { 1391 if (EnumDecl *Enum2 = dyn_cast<EnumDecl>(D2)) { 1392 // Check for equivalent enum names. 1393 IdentifierInfo *Name1 = Enum1->getIdentifier(); 1394 if (!Name1 && Enum1->getTypedefNameForAnonDecl()) 1395 Name1 = Enum1->getTypedefNameForAnonDecl()->getIdentifier(); 1396 IdentifierInfo *Name2 = Enum2->getIdentifier(); 1397 if (!Name2 && Enum2->getTypedefNameForAnonDecl()) 1398 Name2 = Enum2->getTypedefNameForAnonDecl()->getIdentifier(); 1399 if (!::IsStructurallyEquivalent(Name1, Name2) || 1400 !::IsStructurallyEquivalent(*this, Enum1, Enum2)) 1401 Equivalent = false; 1402 } else { 1403 // Enum/non-enum mismatch 1404 Equivalent = false; 1405 } 1406 } else if (TypedefNameDecl *Typedef1 = dyn_cast<TypedefNameDecl>(D1)) { 1407 if (TypedefNameDecl *Typedef2 = dyn_cast<TypedefNameDecl>(D2)) { 1408 if (!::IsStructurallyEquivalent(Typedef1->getIdentifier(), 1409 Typedef2->getIdentifier()) || 1410 !::IsStructurallyEquivalent(*this, 1411 Typedef1->getUnderlyingType(), 1412 Typedef2->getUnderlyingType())) 1413 Equivalent = false; 1414 } else { 1415 // Typedef/non-typedef mismatch. 1416 Equivalent = false; 1417 } 1418 } else if (ClassTemplateDecl *ClassTemplate1 1419 = dyn_cast<ClassTemplateDecl>(D1)) { 1420 if (ClassTemplateDecl *ClassTemplate2 = dyn_cast<ClassTemplateDecl>(D2)) { 1421 if (!::IsStructurallyEquivalent(ClassTemplate1->getIdentifier(), 1422 ClassTemplate2->getIdentifier()) || 1423 !::IsStructurallyEquivalent(*this, ClassTemplate1, ClassTemplate2)) 1424 Equivalent = false; 1425 } else { 1426 // Class template/non-class-template mismatch. 1427 Equivalent = false; 1428 } 1429 } else if (TemplateTypeParmDecl *TTP1= dyn_cast<TemplateTypeParmDecl>(D1)) { 1430 if (TemplateTypeParmDecl *TTP2 = dyn_cast<TemplateTypeParmDecl>(D2)) { 1431 if (!::IsStructurallyEquivalent(*this, TTP1, TTP2)) 1432 Equivalent = false; 1433 } else { 1434 // Kind mismatch. 1435 Equivalent = false; 1436 } 1437 } else if (NonTypeTemplateParmDecl *NTTP1 1438 = dyn_cast<NonTypeTemplateParmDecl>(D1)) { 1439 if (NonTypeTemplateParmDecl *NTTP2 1440 = dyn_cast<NonTypeTemplateParmDecl>(D2)) { 1441 if (!::IsStructurallyEquivalent(*this, NTTP1, NTTP2)) 1442 Equivalent = false; 1443 } else { 1444 // Kind mismatch. 1445 Equivalent = false; 1446 } 1447 } else if (TemplateTemplateParmDecl *TTP1 1448 = dyn_cast<TemplateTemplateParmDecl>(D1)) { 1449 if (TemplateTemplateParmDecl *TTP2 1450 = dyn_cast<TemplateTemplateParmDecl>(D2)) { 1451 if (!::IsStructurallyEquivalent(*this, TTP1, TTP2)) 1452 Equivalent = false; 1453 } else { 1454 // Kind mismatch. 1455 Equivalent = false; 1456 } 1457 } 1458 1459 if (!Equivalent) { 1460 // Note that these two declarations are not equivalent (and we already 1461 // know about it). 1462 NonEquivalentDecls.insert(std::make_pair(D1->getCanonicalDecl(), 1463 D2->getCanonicalDecl())); 1464 return true; 1465 } 1466 // FIXME: Check other declaration kinds! 1467 } 1468 1469 return false; 1470 } 1471 1472 //---------------------------------------------------------------------------- 1473 // Import Types 1474 //---------------------------------------------------------------------------- 1475 1476 QualType ASTNodeImporter::VisitType(const Type *T) { 1477 Importer.FromDiag(SourceLocation(), diag::err_unsupported_ast_node) 1478 << T->getTypeClassName(); 1479 return QualType(); 1480 } 1481 1482 QualType ASTNodeImporter::VisitBuiltinType(const BuiltinType *T) { 1483 switch (T->getKind()) { 1484 #define SHARED_SINGLETON_TYPE(Expansion) 1485 #define BUILTIN_TYPE(Id, SingletonId) \ 1486 case BuiltinType::Id: return Importer.getToContext().SingletonId; 1487 #include "clang/AST/BuiltinTypes.def" 1488 1489 // FIXME: for Char16, Char32, and NullPtr, make sure that the "to" 1490 // context supports C++. 1491 1492 // FIXME: for ObjCId, ObjCClass, and ObjCSel, make sure that the "to" 1493 // context supports ObjC. 1494 1495 case BuiltinType::Char_U: 1496 // The context we're importing from has an unsigned 'char'. If we're 1497 // importing into a context with a signed 'char', translate to 1498 // 'unsigned char' instead. 1499 if (Importer.getToContext().getLangOpts().CharIsSigned) 1500 return Importer.getToContext().UnsignedCharTy; 1501 1502 return Importer.getToContext().CharTy; 1503 1504 case BuiltinType::Char_S: 1505 // The context we're importing from has an unsigned 'char'. If we're 1506 // importing into a context with a signed 'char', translate to 1507 // 'unsigned char' instead. 1508 if (!Importer.getToContext().getLangOpts().CharIsSigned) 1509 return Importer.getToContext().SignedCharTy; 1510 1511 return Importer.getToContext().CharTy; 1512 1513 case BuiltinType::WChar_S: 1514 case BuiltinType::WChar_U: 1515 // FIXME: If not in C++, shall we translate to the C equivalent of 1516 // wchar_t? 1517 return Importer.getToContext().WCharTy; 1518 } 1519 1520 llvm_unreachable("Invalid BuiltinType Kind!"); 1521 } 1522 1523 QualType ASTNodeImporter::VisitComplexType(const ComplexType *T) { 1524 QualType ToElementType = Importer.Import(T->getElementType()); 1525 if (ToElementType.isNull()) 1526 return QualType(); 1527 1528 return Importer.getToContext().getComplexType(ToElementType); 1529 } 1530 1531 QualType ASTNodeImporter::VisitPointerType(const PointerType *T) { 1532 QualType ToPointeeType = Importer.Import(T->getPointeeType()); 1533 if (ToPointeeType.isNull()) 1534 return QualType(); 1535 1536 return Importer.getToContext().getPointerType(ToPointeeType); 1537 } 1538 1539 QualType ASTNodeImporter::VisitBlockPointerType(const BlockPointerType *T) { 1540 // FIXME: Check for blocks support in "to" context. 1541 QualType ToPointeeType = Importer.Import(T->getPointeeType()); 1542 if (ToPointeeType.isNull()) 1543 return QualType(); 1544 1545 return Importer.getToContext().getBlockPointerType(ToPointeeType); 1546 } 1547 1548 QualType 1549 ASTNodeImporter::VisitLValueReferenceType(const LValueReferenceType *T) { 1550 // FIXME: Check for C++ support in "to" context. 1551 QualType ToPointeeType = Importer.Import(T->getPointeeTypeAsWritten()); 1552 if (ToPointeeType.isNull()) 1553 return QualType(); 1554 1555 return Importer.getToContext().getLValueReferenceType(ToPointeeType); 1556 } 1557 1558 QualType 1559 ASTNodeImporter::VisitRValueReferenceType(const RValueReferenceType *T) { 1560 // FIXME: Check for C++0x support in "to" context. 1561 QualType ToPointeeType = Importer.Import(T->getPointeeTypeAsWritten()); 1562 if (ToPointeeType.isNull()) 1563 return QualType(); 1564 1565 return Importer.getToContext().getRValueReferenceType(ToPointeeType); 1566 } 1567 1568 QualType ASTNodeImporter::VisitMemberPointerType(const MemberPointerType *T) { 1569 // FIXME: Check for C++ support in "to" context. 1570 QualType ToPointeeType = Importer.Import(T->getPointeeType()); 1571 if (ToPointeeType.isNull()) 1572 return QualType(); 1573 1574 QualType ClassType = Importer.Import(QualType(T->getClass(), 0)); 1575 return Importer.getToContext().getMemberPointerType(ToPointeeType, 1576 ClassType.getTypePtr()); 1577 } 1578 1579 QualType ASTNodeImporter::VisitConstantArrayType(const ConstantArrayType *T) { 1580 QualType ToElementType = Importer.Import(T->getElementType()); 1581 if (ToElementType.isNull()) 1582 return QualType(); 1583 1584 return Importer.getToContext().getConstantArrayType(ToElementType, 1585 T->getSize(), 1586 T->getSizeModifier(), 1587 T->getIndexTypeCVRQualifiers()); 1588 } 1589 1590 QualType 1591 ASTNodeImporter::VisitIncompleteArrayType(const IncompleteArrayType *T) { 1592 QualType ToElementType = Importer.Import(T->getElementType()); 1593 if (ToElementType.isNull()) 1594 return QualType(); 1595 1596 return Importer.getToContext().getIncompleteArrayType(ToElementType, 1597 T->getSizeModifier(), 1598 T->getIndexTypeCVRQualifiers()); 1599 } 1600 1601 QualType ASTNodeImporter::VisitVariableArrayType(const VariableArrayType *T) { 1602 QualType ToElementType = Importer.Import(T->getElementType()); 1603 if (ToElementType.isNull()) 1604 return QualType(); 1605 1606 Expr *Size = Importer.Import(T->getSizeExpr()); 1607 if (!Size) 1608 return QualType(); 1609 1610 SourceRange Brackets = Importer.Import(T->getBracketsRange()); 1611 return Importer.getToContext().getVariableArrayType(ToElementType, Size, 1612 T->getSizeModifier(), 1613 T->getIndexTypeCVRQualifiers(), 1614 Brackets); 1615 } 1616 1617 QualType ASTNodeImporter::VisitVectorType(const VectorType *T) { 1618 QualType ToElementType = Importer.Import(T->getElementType()); 1619 if (ToElementType.isNull()) 1620 return QualType(); 1621 1622 return Importer.getToContext().getVectorType(ToElementType, 1623 T->getNumElements(), 1624 T->getVectorKind()); 1625 } 1626 1627 QualType ASTNodeImporter::VisitExtVectorType(const ExtVectorType *T) { 1628 QualType ToElementType = Importer.Import(T->getElementType()); 1629 if (ToElementType.isNull()) 1630 return QualType(); 1631 1632 return Importer.getToContext().getExtVectorType(ToElementType, 1633 T->getNumElements()); 1634 } 1635 1636 QualType 1637 ASTNodeImporter::VisitFunctionNoProtoType(const FunctionNoProtoType *T) { 1638 // FIXME: What happens if we're importing a function without a prototype 1639 // into C++? Should we make it variadic? 1640 QualType ToResultType = Importer.Import(T->getReturnType()); 1641 if (ToResultType.isNull()) 1642 return QualType(); 1643 1644 return Importer.getToContext().getFunctionNoProtoType(ToResultType, 1645 T->getExtInfo()); 1646 } 1647 1648 QualType ASTNodeImporter::VisitFunctionProtoType(const FunctionProtoType *T) { 1649 QualType ToResultType = Importer.Import(T->getReturnType()); 1650 if (ToResultType.isNull()) 1651 return QualType(); 1652 1653 // Import argument types 1654 SmallVector<QualType, 4> ArgTypes; 1655 for (const auto &A : T->param_types()) { 1656 QualType ArgType = Importer.Import(A); 1657 if (ArgType.isNull()) 1658 return QualType(); 1659 ArgTypes.push_back(ArgType); 1660 } 1661 1662 // Import exception types 1663 SmallVector<QualType, 4> ExceptionTypes; 1664 for (const auto &E : T->exceptions()) { 1665 QualType ExceptionType = Importer.Import(E); 1666 if (ExceptionType.isNull()) 1667 return QualType(); 1668 ExceptionTypes.push_back(ExceptionType); 1669 } 1670 1671 FunctionProtoType::ExtProtoInfo FromEPI = T->getExtProtoInfo(); 1672 FunctionProtoType::ExtProtoInfo ToEPI; 1673 1674 ToEPI.ExtInfo = FromEPI.ExtInfo; 1675 ToEPI.Variadic = FromEPI.Variadic; 1676 ToEPI.HasTrailingReturn = FromEPI.HasTrailingReturn; 1677 ToEPI.TypeQuals = FromEPI.TypeQuals; 1678 ToEPI.RefQualifier = FromEPI.RefQualifier; 1679 ToEPI.ExceptionSpec.Type = FromEPI.ExceptionSpec.Type; 1680 ToEPI.ExceptionSpec.Exceptions = ExceptionTypes; 1681 ToEPI.ExceptionSpec.NoexceptExpr = 1682 Importer.Import(FromEPI.ExceptionSpec.NoexceptExpr); 1683 ToEPI.ExceptionSpec.SourceDecl = cast_or_null<FunctionDecl>( 1684 Importer.Import(FromEPI.ExceptionSpec.SourceDecl)); 1685 ToEPI.ExceptionSpec.SourceTemplate = cast_or_null<FunctionDecl>( 1686 Importer.Import(FromEPI.ExceptionSpec.SourceTemplate)); 1687 1688 return Importer.getToContext().getFunctionType(ToResultType, ArgTypes, ToEPI); 1689 } 1690 1691 QualType ASTNodeImporter::VisitParenType(const ParenType *T) { 1692 QualType ToInnerType = Importer.Import(T->getInnerType()); 1693 if (ToInnerType.isNull()) 1694 return QualType(); 1695 1696 return Importer.getToContext().getParenType(ToInnerType); 1697 } 1698 1699 QualType ASTNodeImporter::VisitTypedefType(const TypedefType *T) { 1700 TypedefNameDecl *ToDecl 1701 = dyn_cast_or_null<TypedefNameDecl>(Importer.Import(T->getDecl())); 1702 if (!ToDecl) 1703 return QualType(); 1704 1705 return Importer.getToContext().getTypeDeclType(ToDecl); 1706 } 1707 1708 QualType ASTNodeImporter::VisitTypeOfExprType(const TypeOfExprType *T) { 1709 Expr *ToExpr = Importer.Import(T->getUnderlyingExpr()); 1710 if (!ToExpr) 1711 return QualType(); 1712 1713 return Importer.getToContext().getTypeOfExprType(ToExpr); 1714 } 1715 1716 QualType ASTNodeImporter::VisitTypeOfType(const TypeOfType *T) { 1717 QualType ToUnderlyingType = Importer.Import(T->getUnderlyingType()); 1718 if (ToUnderlyingType.isNull()) 1719 return QualType(); 1720 1721 return Importer.getToContext().getTypeOfType(ToUnderlyingType); 1722 } 1723 1724 QualType ASTNodeImporter::VisitDecltypeType(const DecltypeType *T) { 1725 // FIXME: Make sure that the "to" context supports C++0x! 1726 Expr *ToExpr = Importer.Import(T->getUnderlyingExpr()); 1727 if (!ToExpr) 1728 return QualType(); 1729 1730 QualType UnderlyingType = Importer.Import(T->getUnderlyingType()); 1731 if (UnderlyingType.isNull()) 1732 return QualType(); 1733 1734 return Importer.getToContext().getDecltypeType(ToExpr, UnderlyingType); 1735 } 1736 1737 QualType ASTNodeImporter::VisitUnaryTransformType(const UnaryTransformType *T) { 1738 QualType ToBaseType = Importer.Import(T->getBaseType()); 1739 QualType ToUnderlyingType = Importer.Import(T->getUnderlyingType()); 1740 if (ToBaseType.isNull() || ToUnderlyingType.isNull()) 1741 return QualType(); 1742 1743 return Importer.getToContext().getUnaryTransformType(ToBaseType, 1744 ToUnderlyingType, 1745 T->getUTTKind()); 1746 } 1747 1748 QualType ASTNodeImporter::VisitAutoType(const AutoType *T) { 1749 // FIXME: Make sure that the "to" context supports C++11! 1750 QualType FromDeduced = T->getDeducedType(); 1751 QualType ToDeduced; 1752 if (!FromDeduced.isNull()) { 1753 ToDeduced = Importer.Import(FromDeduced); 1754 if (ToDeduced.isNull()) 1755 return QualType(); 1756 } 1757 1758 return Importer.getToContext().getAutoType(ToDeduced, T->getKeyword(), 1759 /*IsDependent*/false); 1760 } 1761 1762 QualType ASTNodeImporter::VisitRecordType(const RecordType *T) { 1763 RecordDecl *ToDecl 1764 = dyn_cast_or_null<RecordDecl>(Importer.Import(T->getDecl())); 1765 if (!ToDecl) 1766 return QualType(); 1767 1768 return Importer.getToContext().getTagDeclType(ToDecl); 1769 } 1770 1771 QualType ASTNodeImporter::VisitEnumType(const EnumType *T) { 1772 EnumDecl *ToDecl 1773 = dyn_cast_or_null<EnumDecl>(Importer.Import(T->getDecl())); 1774 if (!ToDecl) 1775 return QualType(); 1776 1777 return Importer.getToContext().getTagDeclType(ToDecl); 1778 } 1779 1780 QualType ASTNodeImporter::VisitAttributedType(const AttributedType *T) { 1781 QualType FromModifiedType = T->getModifiedType(); 1782 QualType FromEquivalentType = T->getEquivalentType(); 1783 QualType ToModifiedType; 1784 QualType ToEquivalentType; 1785 1786 if (!FromModifiedType.isNull()) { 1787 ToModifiedType = Importer.Import(FromModifiedType); 1788 if (ToModifiedType.isNull()) 1789 return QualType(); 1790 } 1791 if (!FromEquivalentType.isNull()) { 1792 ToEquivalentType = Importer.Import(FromEquivalentType); 1793 if (ToEquivalentType.isNull()) 1794 return QualType(); 1795 } 1796 1797 return Importer.getToContext().getAttributedType(T->getAttrKind(), 1798 ToModifiedType, ToEquivalentType); 1799 } 1800 1801 QualType ASTNodeImporter::VisitTemplateSpecializationType( 1802 const TemplateSpecializationType *T) { 1803 TemplateName ToTemplate = Importer.Import(T->getTemplateName()); 1804 if (ToTemplate.isNull()) 1805 return QualType(); 1806 1807 SmallVector<TemplateArgument, 2> ToTemplateArgs; 1808 if (ImportTemplateArguments(T->getArgs(), T->getNumArgs(), ToTemplateArgs)) 1809 return QualType(); 1810 1811 QualType ToCanonType; 1812 if (!QualType(T, 0).isCanonical()) { 1813 QualType FromCanonType 1814 = Importer.getFromContext().getCanonicalType(QualType(T, 0)); 1815 ToCanonType =Importer.Import(FromCanonType); 1816 if (ToCanonType.isNull()) 1817 return QualType(); 1818 } 1819 return Importer.getToContext().getTemplateSpecializationType(ToTemplate, 1820 ToTemplateArgs.data(), 1821 ToTemplateArgs.size(), 1822 ToCanonType); 1823 } 1824 1825 QualType ASTNodeImporter::VisitElaboratedType(const ElaboratedType *T) { 1826 NestedNameSpecifier *ToQualifier = nullptr; 1827 // Note: the qualifier in an ElaboratedType is optional. 1828 if (T->getQualifier()) { 1829 ToQualifier = Importer.Import(T->getQualifier()); 1830 if (!ToQualifier) 1831 return QualType(); 1832 } 1833 1834 QualType ToNamedType = Importer.Import(T->getNamedType()); 1835 if (ToNamedType.isNull()) 1836 return QualType(); 1837 1838 return Importer.getToContext().getElaboratedType(T->getKeyword(), 1839 ToQualifier, ToNamedType); 1840 } 1841 1842 QualType ASTNodeImporter::VisitObjCInterfaceType(const ObjCInterfaceType *T) { 1843 ObjCInterfaceDecl *Class 1844 = dyn_cast_or_null<ObjCInterfaceDecl>(Importer.Import(T->getDecl())); 1845 if (!Class) 1846 return QualType(); 1847 1848 return Importer.getToContext().getObjCInterfaceType(Class); 1849 } 1850 1851 QualType ASTNodeImporter::VisitObjCObjectType(const ObjCObjectType *T) { 1852 QualType ToBaseType = Importer.Import(T->getBaseType()); 1853 if (ToBaseType.isNull()) 1854 return QualType(); 1855 1856 SmallVector<QualType, 4> TypeArgs; 1857 for (auto TypeArg : T->getTypeArgsAsWritten()) { 1858 QualType ImportedTypeArg = Importer.Import(TypeArg); 1859 if (ImportedTypeArg.isNull()) 1860 return QualType(); 1861 1862 TypeArgs.push_back(ImportedTypeArg); 1863 } 1864 1865 SmallVector<ObjCProtocolDecl *, 4> Protocols; 1866 for (auto *P : T->quals()) { 1867 ObjCProtocolDecl *Protocol 1868 = dyn_cast_or_null<ObjCProtocolDecl>(Importer.Import(P)); 1869 if (!Protocol) 1870 return QualType(); 1871 Protocols.push_back(Protocol); 1872 } 1873 1874 return Importer.getToContext().getObjCObjectType(ToBaseType, TypeArgs, 1875 Protocols, 1876 T->isKindOfTypeAsWritten()); 1877 } 1878 1879 QualType 1880 ASTNodeImporter::VisitObjCObjectPointerType(const ObjCObjectPointerType *T) { 1881 QualType ToPointeeType = Importer.Import(T->getPointeeType()); 1882 if (ToPointeeType.isNull()) 1883 return QualType(); 1884 1885 return Importer.getToContext().getObjCObjectPointerType(ToPointeeType); 1886 } 1887 1888 //---------------------------------------------------------------------------- 1889 // Import Declarations 1890 //---------------------------------------------------------------------------- 1891 bool ASTNodeImporter::ImportDeclParts(NamedDecl *D, DeclContext *&DC, 1892 DeclContext *&LexicalDC, 1893 DeclarationName &Name, 1894 NamedDecl *&ToD, 1895 SourceLocation &Loc) { 1896 // Import the context of this declaration. 1897 DC = Importer.ImportContext(D->getDeclContext()); 1898 if (!DC) 1899 return true; 1900 1901 LexicalDC = DC; 1902 if (D->getDeclContext() != D->getLexicalDeclContext()) { 1903 LexicalDC = Importer.ImportContext(D->getLexicalDeclContext()); 1904 if (!LexicalDC) 1905 return true; 1906 } 1907 1908 // Import the name of this declaration. 1909 Name = Importer.Import(D->getDeclName()); 1910 if (D->getDeclName() && !Name) 1911 return true; 1912 1913 // Import the location of this declaration. 1914 Loc = Importer.Import(D->getLocation()); 1915 ToD = cast_or_null<NamedDecl>(Importer.GetAlreadyImportedOrNull(D)); 1916 return false; 1917 } 1918 1919 void ASTNodeImporter::ImportDefinitionIfNeeded(Decl *FromD, Decl *ToD) { 1920 if (!FromD) 1921 return; 1922 1923 if (!ToD) { 1924 ToD = Importer.Import(FromD); 1925 if (!ToD) 1926 return; 1927 } 1928 1929 if (RecordDecl *FromRecord = dyn_cast<RecordDecl>(FromD)) { 1930 if (RecordDecl *ToRecord = cast_or_null<RecordDecl>(ToD)) { 1931 if (FromRecord->getDefinition() && FromRecord->isCompleteDefinition() && !ToRecord->getDefinition()) { 1932 ImportDefinition(FromRecord, ToRecord); 1933 } 1934 } 1935 return; 1936 } 1937 1938 if (EnumDecl *FromEnum = dyn_cast<EnumDecl>(FromD)) { 1939 if (EnumDecl *ToEnum = cast_or_null<EnumDecl>(ToD)) { 1940 if (FromEnum->getDefinition() && !ToEnum->getDefinition()) { 1941 ImportDefinition(FromEnum, ToEnum); 1942 } 1943 } 1944 return; 1945 } 1946 } 1947 1948 void 1949 ASTNodeImporter::ImportDeclarationNameLoc(const DeclarationNameInfo &From, 1950 DeclarationNameInfo& To) { 1951 // NOTE: To.Name and To.Loc are already imported. 1952 // We only have to import To.LocInfo. 1953 switch (To.getName().getNameKind()) { 1954 case DeclarationName::Identifier: 1955 case DeclarationName::ObjCZeroArgSelector: 1956 case DeclarationName::ObjCOneArgSelector: 1957 case DeclarationName::ObjCMultiArgSelector: 1958 case DeclarationName::CXXUsingDirective: 1959 return; 1960 1961 case DeclarationName::CXXOperatorName: { 1962 SourceRange Range = From.getCXXOperatorNameRange(); 1963 To.setCXXOperatorNameRange(Importer.Import(Range)); 1964 return; 1965 } 1966 case DeclarationName::CXXLiteralOperatorName: { 1967 SourceLocation Loc = From.getCXXLiteralOperatorNameLoc(); 1968 To.setCXXLiteralOperatorNameLoc(Importer.Import(Loc)); 1969 return; 1970 } 1971 case DeclarationName::CXXConstructorName: 1972 case DeclarationName::CXXDestructorName: 1973 case DeclarationName::CXXConversionFunctionName: { 1974 TypeSourceInfo *FromTInfo = From.getNamedTypeInfo(); 1975 To.setNamedTypeInfo(Importer.Import(FromTInfo)); 1976 return; 1977 } 1978 } 1979 llvm_unreachable("Unknown name kind."); 1980 } 1981 1982 void ASTNodeImporter::ImportDeclContext(DeclContext *FromDC, bool ForceImport) { 1983 if (Importer.isMinimalImport() && !ForceImport) { 1984 Importer.ImportContext(FromDC); 1985 return; 1986 } 1987 1988 for (auto *From : FromDC->decls()) 1989 Importer.Import(From); 1990 } 1991 1992 bool ASTNodeImporter::ImportDefinition(RecordDecl *From, RecordDecl *To, 1993 ImportDefinitionKind Kind) { 1994 if (To->getDefinition() || To->isBeingDefined()) { 1995 if (Kind == IDK_Everything) 1996 ImportDeclContext(From, /*ForceImport=*/true); 1997 1998 return false; 1999 } 2000 2001 To->startDefinition(); 2002 2003 // Add base classes. 2004 if (CXXRecordDecl *ToCXX = dyn_cast<CXXRecordDecl>(To)) { 2005 CXXRecordDecl *FromCXX = cast<CXXRecordDecl>(From); 2006 2007 struct CXXRecordDecl::DefinitionData &ToData = ToCXX->data(); 2008 struct CXXRecordDecl::DefinitionData &FromData = FromCXX->data(); 2009 ToData.UserDeclaredConstructor = FromData.UserDeclaredConstructor; 2010 ToData.UserDeclaredSpecialMembers = FromData.UserDeclaredSpecialMembers; 2011 ToData.Aggregate = FromData.Aggregate; 2012 ToData.PlainOldData = FromData.PlainOldData; 2013 ToData.Empty = FromData.Empty; 2014 ToData.Polymorphic = FromData.Polymorphic; 2015 ToData.Abstract = FromData.Abstract; 2016 ToData.IsStandardLayout = FromData.IsStandardLayout; 2017 ToData.HasNoNonEmptyBases = FromData.HasNoNonEmptyBases; 2018 ToData.HasPrivateFields = FromData.HasPrivateFields; 2019 ToData.HasProtectedFields = FromData.HasProtectedFields; 2020 ToData.HasPublicFields = FromData.HasPublicFields; 2021 ToData.HasMutableFields = FromData.HasMutableFields; 2022 ToData.HasVariantMembers = FromData.HasVariantMembers; 2023 ToData.HasOnlyCMembers = FromData.HasOnlyCMembers; 2024 ToData.HasInClassInitializer = FromData.HasInClassInitializer; 2025 ToData.HasUninitializedReferenceMember 2026 = FromData.HasUninitializedReferenceMember; 2027 ToData.HasUninitializedFields = FromData.HasUninitializedFields; 2028 ToData.NeedOverloadResolutionForMoveConstructor 2029 = FromData.NeedOverloadResolutionForMoveConstructor; 2030 ToData.NeedOverloadResolutionForMoveAssignment 2031 = FromData.NeedOverloadResolutionForMoveAssignment; 2032 ToData.NeedOverloadResolutionForDestructor 2033 = FromData.NeedOverloadResolutionForDestructor; 2034 ToData.DefaultedMoveConstructorIsDeleted 2035 = FromData.DefaultedMoveConstructorIsDeleted; 2036 ToData.DefaultedMoveAssignmentIsDeleted 2037 = FromData.DefaultedMoveAssignmentIsDeleted; 2038 ToData.DefaultedDestructorIsDeleted = FromData.DefaultedDestructorIsDeleted; 2039 ToData.HasTrivialSpecialMembers = FromData.HasTrivialSpecialMembers; 2040 ToData.HasIrrelevantDestructor = FromData.HasIrrelevantDestructor; 2041 ToData.HasConstexprNonCopyMoveConstructor 2042 = FromData.HasConstexprNonCopyMoveConstructor; 2043 ToData.HasDefaultedDefaultConstructor 2044 = FromData.HasDefaultedDefaultConstructor; 2045 ToData.DefaultedDefaultConstructorIsConstexpr 2046 = FromData.DefaultedDefaultConstructorIsConstexpr; 2047 ToData.HasConstexprDefaultConstructor 2048 = FromData.HasConstexprDefaultConstructor; 2049 ToData.HasNonLiteralTypeFieldsOrBases 2050 = FromData.HasNonLiteralTypeFieldsOrBases; 2051 // ComputedVisibleConversions not imported. 2052 ToData.UserProvidedDefaultConstructor 2053 = FromData.UserProvidedDefaultConstructor; 2054 ToData.DeclaredSpecialMembers = FromData.DeclaredSpecialMembers; 2055 ToData.ImplicitCopyConstructorHasConstParam 2056 = FromData.ImplicitCopyConstructorHasConstParam; 2057 ToData.ImplicitCopyAssignmentHasConstParam 2058 = FromData.ImplicitCopyAssignmentHasConstParam; 2059 ToData.HasDeclaredCopyConstructorWithConstParam 2060 = FromData.HasDeclaredCopyConstructorWithConstParam; 2061 ToData.HasDeclaredCopyAssignmentWithConstParam 2062 = FromData.HasDeclaredCopyAssignmentWithConstParam; 2063 ToData.IsLambda = FromData.IsLambda; 2064 2065 SmallVector<CXXBaseSpecifier *, 4> Bases; 2066 for (const auto &Base1 : FromCXX->bases()) { 2067 QualType T = Importer.Import(Base1.getType()); 2068 if (T.isNull()) 2069 return true; 2070 2071 SourceLocation EllipsisLoc; 2072 if (Base1.isPackExpansion()) 2073 EllipsisLoc = Importer.Import(Base1.getEllipsisLoc()); 2074 2075 // Ensure that we have a definition for the base. 2076 ImportDefinitionIfNeeded(Base1.getType()->getAsCXXRecordDecl()); 2077 2078 Bases.push_back( 2079 new (Importer.getToContext()) 2080 CXXBaseSpecifier(Importer.Import(Base1.getSourceRange()), 2081 Base1.isVirtual(), 2082 Base1.isBaseOfClass(), 2083 Base1.getAccessSpecifierAsWritten(), 2084 Importer.Import(Base1.getTypeSourceInfo()), 2085 EllipsisLoc)); 2086 } 2087 if (!Bases.empty()) 2088 ToCXX->setBases(Bases.data(), Bases.size()); 2089 } 2090 2091 if (shouldForceImportDeclContext(Kind)) 2092 ImportDeclContext(From, /*ForceImport=*/true); 2093 2094 To->completeDefinition(); 2095 return false; 2096 } 2097 2098 bool ASTNodeImporter::ImportDefinition(VarDecl *From, VarDecl *To, 2099 ImportDefinitionKind Kind) { 2100 if (To->getAnyInitializer()) 2101 return false; 2102 2103 // FIXME: Can we really import any initializer? Alternatively, we could force 2104 // ourselves to import every declaration of a variable and then only use 2105 // getInit() here. 2106 To->setInit(Importer.Import(const_cast<Expr *>(From->getAnyInitializer()))); 2107 2108 // FIXME: Other bits to merge? 2109 2110 return false; 2111 } 2112 2113 bool ASTNodeImporter::ImportDefinition(EnumDecl *From, EnumDecl *To, 2114 ImportDefinitionKind Kind) { 2115 if (To->getDefinition() || To->isBeingDefined()) { 2116 if (Kind == IDK_Everything) 2117 ImportDeclContext(From, /*ForceImport=*/true); 2118 return false; 2119 } 2120 2121 To->startDefinition(); 2122 2123 QualType T = Importer.Import(Importer.getFromContext().getTypeDeclType(From)); 2124 if (T.isNull()) 2125 return true; 2126 2127 QualType ToPromotionType = Importer.Import(From->getPromotionType()); 2128 if (ToPromotionType.isNull()) 2129 return true; 2130 2131 if (shouldForceImportDeclContext(Kind)) 2132 ImportDeclContext(From, /*ForceImport=*/true); 2133 2134 // FIXME: we might need to merge the number of positive or negative bits 2135 // if the enumerator lists don't match. 2136 To->completeDefinition(T, ToPromotionType, 2137 From->getNumPositiveBits(), 2138 From->getNumNegativeBits()); 2139 return false; 2140 } 2141 2142 TemplateParameterList *ASTNodeImporter::ImportTemplateParameterList( 2143 TemplateParameterList *Params) { 2144 SmallVector<NamedDecl *, 4> ToParams; 2145 ToParams.reserve(Params->size()); 2146 for (TemplateParameterList::iterator P = Params->begin(), 2147 PEnd = Params->end(); 2148 P != PEnd; ++P) { 2149 Decl *To = Importer.Import(*P); 2150 if (!To) 2151 return nullptr; 2152 2153 ToParams.push_back(cast<NamedDecl>(To)); 2154 } 2155 2156 return TemplateParameterList::Create(Importer.getToContext(), 2157 Importer.Import(Params->getTemplateLoc()), 2158 Importer.Import(Params->getLAngleLoc()), 2159 ToParams, 2160 Importer.Import(Params->getRAngleLoc())); 2161 } 2162 2163 TemplateArgument 2164 ASTNodeImporter::ImportTemplateArgument(const TemplateArgument &From) { 2165 switch (From.getKind()) { 2166 case TemplateArgument::Null: 2167 return TemplateArgument(); 2168 2169 case TemplateArgument::Type: { 2170 QualType ToType = Importer.Import(From.getAsType()); 2171 if (ToType.isNull()) 2172 return TemplateArgument(); 2173 return TemplateArgument(ToType); 2174 } 2175 2176 case TemplateArgument::Integral: { 2177 QualType ToType = Importer.Import(From.getIntegralType()); 2178 if (ToType.isNull()) 2179 return TemplateArgument(); 2180 return TemplateArgument(From, ToType); 2181 } 2182 2183 case TemplateArgument::Declaration: { 2184 ValueDecl *To = cast_or_null<ValueDecl>(Importer.Import(From.getAsDecl())); 2185 QualType ToType = Importer.Import(From.getParamTypeForDecl()); 2186 if (!To || ToType.isNull()) 2187 return TemplateArgument(); 2188 return TemplateArgument(To, ToType); 2189 } 2190 2191 case TemplateArgument::NullPtr: { 2192 QualType ToType = Importer.Import(From.getNullPtrType()); 2193 if (ToType.isNull()) 2194 return TemplateArgument(); 2195 return TemplateArgument(ToType, /*isNullPtr*/true); 2196 } 2197 2198 case TemplateArgument::Template: { 2199 TemplateName ToTemplate = Importer.Import(From.getAsTemplate()); 2200 if (ToTemplate.isNull()) 2201 return TemplateArgument(); 2202 2203 return TemplateArgument(ToTemplate); 2204 } 2205 2206 case TemplateArgument::TemplateExpansion: { 2207 TemplateName ToTemplate 2208 = Importer.Import(From.getAsTemplateOrTemplatePattern()); 2209 if (ToTemplate.isNull()) 2210 return TemplateArgument(); 2211 2212 return TemplateArgument(ToTemplate, From.getNumTemplateExpansions()); 2213 } 2214 2215 case TemplateArgument::Expression: 2216 if (Expr *ToExpr = Importer.Import(From.getAsExpr())) 2217 return TemplateArgument(ToExpr); 2218 return TemplateArgument(); 2219 2220 case TemplateArgument::Pack: { 2221 SmallVector<TemplateArgument, 2> ToPack; 2222 ToPack.reserve(From.pack_size()); 2223 if (ImportTemplateArguments(From.pack_begin(), From.pack_size(), ToPack)) 2224 return TemplateArgument(); 2225 2226 return TemplateArgument( 2227 llvm::makeArrayRef(ToPack).copy(Importer.getToContext())); 2228 } 2229 } 2230 2231 llvm_unreachable("Invalid template argument kind"); 2232 } 2233 2234 bool ASTNodeImporter::ImportTemplateArguments(const TemplateArgument *FromArgs, 2235 unsigned NumFromArgs, 2236 SmallVectorImpl<TemplateArgument> &ToArgs) { 2237 for (unsigned I = 0; I != NumFromArgs; ++I) { 2238 TemplateArgument To = ImportTemplateArgument(FromArgs[I]); 2239 if (To.isNull() && !FromArgs[I].isNull()) 2240 return true; 2241 2242 ToArgs.push_back(To); 2243 } 2244 2245 return false; 2246 } 2247 2248 bool ASTNodeImporter::IsStructuralMatch(RecordDecl *FromRecord, 2249 RecordDecl *ToRecord, bool Complain) { 2250 // Eliminate a potential failure point where we attempt to re-import 2251 // something we're trying to import while completing ToRecord. 2252 Decl *ToOrigin = Importer.GetOriginalDecl(ToRecord); 2253 if (ToOrigin) { 2254 RecordDecl *ToOriginRecord = dyn_cast<RecordDecl>(ToOrigin); 2255 if (ToOriginRecord) 2256 ToRecord = ToOriginRecord; 2257 } 2258 2259 StructuralEquivalenceContext Ctx(Importer.getFromContext(), 2260 ToRecord->getASTContext(), 2261 Importer.getNonEquivalentDecls(), 2262 false, Complain); 2263 return Ctx.IsStructurallyEquivalent(FromRecord, ToRecord); 2264 } 2265 2266 bool ASTNodeImporter::IsStructuralMatch(VarDecl *FromVar, VarDecl *ToVar, 2267 bool Complain) { 2268 StructuralEquivalenceContext Ctx( 2269 Importer.getFromContext(), Importer.getToContext(), 2270 Importer.getNonEquivalentDecls(), false, Complain); 2271 return Ctx.IsStructurallyEquivalent(FromVar, ToVar); 2272 } 2273 2274 bool ASTNodeImporter::IsStructuralMatch(EnumDecl *FromEnum, EnumDecl *ToEnum) { 2275 StructuralEquivalenceContext Ctx(Importer.getFromContext(), 2276 Importer.getToContext(), 2277 Importer.getNonEquivalentDecls()); 2278 return Ctx.IsStructurallyEquivalent(FromEnum, ToEnum); 2279 } 2280 2281 bool ASTNodeImporter::IsStructuralMatch(EnumConstantDecl *FromEC, 2282 EnumConstantDecl *ToEC) 2283 { 2284 const llvm::APSInt &FromVal = FromEC->getInitVal(); 2285 const llvm::APSInt &ToVal = ToEC->getInitVal(); 2286 2287 return FromVal.isSigned() == ToVal.isSigned() && 2288 FromVal.getBitWidth() == ToVal.getBitWidth() && 2289 FromVal == ToVal; 2290 } 2291 2292 bool ASTNodeImporter::IsStructuralMatch(ClassTemplateDecl *From, 2293 ClassTemplateDecl *To) { 2294 StructuralEquivalenceContext Ctx(Importer.getFromContext(), 2295 Importer.getToContext(), 2296 Importer.getNonEquivalentDecls()); 2297 return Ctx.IsStructurallyEquivalent(From, To); 2298 } 2299 2300 bool ASTNodeImporter::IsStructuralMatch(VarTemplateDecl *From, 2301 VarTemplateDecl *To) { 2302 StructuralEquivalenceContext Ctx(Importer.getFromContext(), 2303 Importer.getToContext(), 2304 Importer.getNonEquivalentDecls()); 2305 return Ctx.IsStructurallyEquivalent(From, To); 2306 } 2307 2308 Decl *ASTNodeImporter::VisitDecl(Decl *D) { 2309 Importer.FromDiag(D->getLocation(), diag::err_unsupported_ast_node) 2310 << D->getDeclKindName(); 2311 return nullptr; 2312 } 2313 2314 Decl *ASTNodeImporter::VisitTranslationUnitDecl(TranslationUnitDecl *D) { 2315 TranslationUnitDecl *ToD = 2316 Importer.getToContext().getTranslationUnitDecl(); 2317 2318 Importer.Imported(D, ToD); 2319 2320 return ToD; 2321 } 2322 2323 Decl *ASTNodeImporter::VisitAccessSpecDecl(AccessSpecDecl *D) { 2324 2325 SourceLocation Loc = Importer.Import(D->getLocation()); 2326 SourceLocation ColonLoc = Importer.Import(D->getColonLoc()); 2327 2328 // Import the context of this declaration. 2329 DeclContext *DC = Importer.ImportContext(D->getDeclContext()); 2330 if (!DC) 2331 return nullptr; 2332 2333 AccessSpecDecl *accessSpecDecl 2334 = AccessSpecDecl::Create(Importer.getToContext(), D->getAccess(), 2335 DC, Loc, ColonLoc); 2336 2337 if (!accessSpecDecl) 2338 return nullptr; 2339 2340 // Lexical DeclContext and Semantic DeclContext 2341 // is always the same for the accessSpec. 2342 accessSpecDecl->setLexicalDeclContext(DC); 2343 DC->addDeclInternal(accessSpecDecl); 2344 2345 return accessSpecDecl; 2346 } 2347 2348 Decl *ASTNodeImporter::VisitNamespaceDecl(NamespaceDecl *D) { 2349 // Import the major distinguishing characteristics of this namespace. 2350 DeclContext *DC, *LexicalDC; 2351 DeclarationName Name; 2352 SourceLocation Loc; 2353 NamedDecl *ToD; 2354 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 2355 return nullptr; 2356 if (ToD) 2357 return ToD; 2358 2359 NamespaceDecl *MergeWithNamespace = nullptr; 2360 if (!Name) { 2361 // This is an anonymous namespace. Adopt an existing anonymous 2362 // namespace if we can. 2363 // FIXME: Not testable. 2364 if (TranslationUnitDecl *TU = dyn_cast<TranslationUnitDecl>(DC)) 2365 MergeWithNamespace = TU->getAnonymousNamespace(); 2366 else 2367 MergeWithNamespace = cast<NamespaceDecl>(DC)->getAnonymousNamespace(); 2368 } else { 2369 SmallVector<NamedDecl *, 4> ConflictingDecls; 2370 SmallVector<NamedDecl *, 2> FoundDecls; 2371 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 2372 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 2373 if (!FoundDecls[I]->isInIdentifierNamespace(Decl::IDNS_Namespace)) 2374 continue; 2375 2376 if (NamespaceDecl *FoundNS = dyn_cast<NamespaceDecl>(FoundDecls[I])) { 2377 MergeWithNamespace = FoundNS; 2378 ConflictingDecls.clear(); 2379 break; 2380 } 2381 2382 ConflictingDecls.push_back(FoundDecls[I]); 2383 } 2384 2385 if (!ConflictingDecls.empty()) { 2386 Name = Importer.HandleNameConflict(Name, DC, Decl::IDNS_Namespace, 2387 ConflictingDecls.data(), 2388 ConflictingDecls.size()); 2389 } 2390 } 2391 2392 // Create the "to" namespace, if needed. 2393 NamespaceDecl *ToNamespace = MergeWithNamespace; 2394 if (!ToNamespace) { 2395 ToNamespace = NamespaceDecl::Create(Importer.getToContext(), DC, 2396 D->isInline(), 2397 Importer.Import(D->getLocStart()), 2398 Loc, Name.getAsIdentifierInfo(), 2399 /*PrevDecl=*/nullptr); 2400 ToNamespace->setLexicalDeclContext(LexicalDC); 2401 LexicalDC->addDeclInternal(ToNamespace); 2402 2403 // If this is an anonymous namespace, register it as the anonymous 2404 // namespace within its context. 2405 if (!Name) { 2406 if (TranslationUnitDecl *TU = dyn_cast<TranslationUnitDecl>(DC)) 2407 TU->setAnonymousNamespace(ToNamespace); 2408 else 2409 cast<NamespaceDecl>(DC)->setAnonymousNamespace(ToNamespace); 2410 } 2411 } 2412 Importer.Imported(D, ToNamespace); 2413 2414 ImportDeclContext(D); 2415 2416 return ToNamespace; 2417 } 2418 2419 Decl *ASTNodeImporter::VisitTypedefNameDecl(TypedefNameDecl *D, bool IsAlias) { 2420 // Import the major distinguishing characteristics of this typedef. 2421 DeclContext *DC, *LexicalDC; 2422 DeclarationName Name; 2423 SourceLocation Loc; 2424 NamedDecl *ToD; 2425 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 2426 return nullptr; 2427 if (ToD) 2428 return ToD; 2429 2430 // If this typedef is not in block scope, determine whether we've 2431 // seen a typedef with the same name (that we can merge with) or any 2432 // other entity by that name (which name lookup could conflict with). 2433 if (!DC->isFunctionOrMethod()) { 2434 SmallVector<NamedDecl *, 4> ConflictingDecls; 2435 unsigned IDNS = Decl::IDNS_Ordinary; 2436 SmallVector<NamedDecl *, 2> FoundDecls; 2437 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 2438 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 2439 if (!FoundDecls[I]->isInIdentifierNamespace(IDNS)) 2440 continue; 2441 if (TypedefNameDecl *FoundTypedef = 2442 dyn_cast<TypedefNameDecl>(FoundDecls[I])) { 2443 if (Importer.IsStructurallyEquivalent(D->getUnderlyingType(), 2444 FoundTypedef->getUnderlyingType())) 2445 return Importer.Imported(D, FoundTypedef); 2446 } 2447 2448 ConflictingDecls.push_back(FoundDecls[I]); 2449 } 2450 2451 if (!ConflictingDecls.empty()) { 2452 Name = Importer.HandleNameConflict(Name, DC, IDNS, 2453 ConflictingDecls.data(), 2454 ConflictingDecls.size()); 2455 if (!Name) 2456 return nullptr; 2457 } 2458 } 2459 2460 // Import the underlying type of this typedef; 2461 QualType T = Importer.Import(D->getUnderlyingType()); 2462 if (T.isNull()) 2463 return nullptr; 2464 2465 // Create the new typedef node. 2466 TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo()); 2467 SourceLocation StartL = Importer.Import(D->getLocStart()); 2468 TypedefNameDecl *ToTypedef; 2469 if (IsAlias) 2470 ToTypedef = TypeAliasDecl::Create(Importer.getToContext(), DC, 2471 StartL, Loc, 2472 Name.getAsIdentifierInfo(), 2473 TInfo); 2474 else 2475 ToTypedef = TypedefDecl::Create(Importer.getToContext(), DC, 2476 StartL, Loc, 2477 Name.getAsIdentifierInfo(), 2478 TInfo); 2479 2480 ToTypedef->setAccess(D->getAccess()); 2481 ToTypedef->setLexicalDeclContext(LexicalDC); 2482 Importer.Imported(D, ToTypedef); 2483 LexicalDC->addDeclInternal(ToTypedef); 2484 2485 return ToTypedef; 2486 } 2487 2488 Decl *ASTNodeImporter::VisitTypedefDecl(TypedefDecl *D) { 2489 return VisitTypedefNameDecl(D, /*IsAlias=*/false); 2490 } 2491 2492 Decl *ASTNodeImporter::VisitTypeAliasDecl(TypeAliasDecl *D) { 2493 return VisitTypedefNameDecl(D, /*IsAlias=*/true); 2494 } 2495 2496 Decl *ASTNodeImporter::VisitEnumDecl(EnumDecl *D) { 2497 // Import the major distinguishing characteristics of this enum. 2498 DeclContext *DC, *LexicalDC; 2499 DeclarationName Name; 2500 SourceLocation Loc; 2501 NamedDecl *ToD; 2502 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 2503 return nullptr; 2504 if (ToD) 2505 return ToD; 2506 2507 // Figure out what enum name we're looking for. 2508 unsigned IDNS = Decl::IDNS_Tag; 2509 DeclarationName SearchName = Name; 2510 if (!SearchName && D->getTypedefNameForAnonDecl()) { 2511 SearchName = Importer.Import(D->getTypedefNameForAnonDecl()->getDeclName()); 2512 IDNS = Decl::IDNS_Ordinary; 2513 } else if (Importer.getToContext().getLangOpts().CPlusPlus) 2514 IDNS |= Decl::IDNS_Ordinary; 2515 2516 // We may already have an enum of the same name; try to find and match it. 2517 if (!DC->isFunctionOrMethod() && SearchName) { 2518 SmallVector<NamedDecl *, 4> ConflictingDecls; 2519 SmallVector<NamedDecl *, 2> FoundDecls; 2520 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 2521 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 2522 if (!FoundDecls[I]->isInIdentifierNamespace(IDNS)) 2523 continue; 2524 2525 Decl *Found = FoundDecls[I]; 2526 if (TypedefNameDecl *Typedef = dyn_cast<TypedefNameDecl>(Found)) { 2527 if (const TagType *Tag = Typedef->getUnderlyingType()->getAs<TagType>()) 2528 Found = Tag->getDecl(); 2529 } 2530 2531 if (EnumDecl *FoundEnum = dyn_cast<EnumDecl>(Found)) { 2532 if (IsStructuralMatch(D, FoundEnum)) 2533 return Importer.Imported(D, FoundEnum); 2534 } 2535 2536 ConflictingDecls.push_back(FoundDecls[I]); 2537 } 2538 2539 if (!ConflictingDecls.empty()) { 2540 Name = Importer.HandleNameConflict(Name, DC, IDNS, 2541 ConflictingDecls.data(), 2542 ConflictingDecls.size()); 2543 } 2544 } 2545 2546 // Create the enum declaration. 2547 EnumDecl *D2 = EnumDecl::Create(Importer.getToContext(), DC, 2548 Importer.Import(D->getLocStart()), 2549 Loc, Name.getAsIdentifierInfo(), nullptr, 2550 D->isScoped(), D->isScopedUsingClassTag(), 2551 D->isFixed()); 2552 // Import the qualifier, if any. 2553 D2->setQualifierInfo(Importer.Import(D->getQualifierLoc())); 2554 D2->setAccess(D->getAccess()); 2555 D2->setLexicalDeclContext(LexicalDC); 2556 Importer.Imported(D, D2); 2557 LexicalDC->addDeclInternal(D2); 2558 2559 // Import the integer type. 2560 QualType ToIntegerType = Importer.Import(D->getIntegerType()); 2561 if (ToIntegerType.isNull()) 2562 return nullptr; 2563 D2->setIntegerType(ToIntegerType); 2564 2565 // Import the definition 2566 if (D->isCompleteDefinition() && ImportDefinition(D, D2)) 2567 return nullptr; 2568 2569 return D2; 2570 } 2571 2572 Decl *ASTNodeImporter::VisitRecordDecl(RecordDecl *D) { 2573 // If this record has a definition in the translation unit we're coming from, 2574 // but this particular declaration is not that definition, import the 2575 // definition and map to that. 2576 TagDecl *Definition = D->getDefinition(); 2577 if (Definition && Definition != D) { 2578 Decl *ImportedDef = Importer.Import(Definition); 2579 if (!ImportedDef) 2580 return nullptr; 2581 2582 return Importer.Imported(D, ImportedDef); 2583 } 2584 2585 // Import the major distinguishing characteristics of this record. 2586 DeclContext *DC, *LexicalDC; 2587 DeclarationName Name; 2588 SourceLocation Loc; 2589 NamedDecl *ToD; 2590 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 2591 return nullptr; 2592 if (ToD) 2593 return ToD; 2594 2595 // Figure out what structure name we're looking for. 2596 unsigned IDNS = Decl::IDNS_Tag; 2597 DeclarationName SearchName = Name; 2598 if (!SearchName && D->getTypedefNameForAnonDecl()) { 2599 SearchName = Importer.Import(D->getTypedefNameForAnonDecl()->getDeclName()); 2600 IDNS = Decl::IDNS_Ordinary; 2601 } else if (Importer.getToContext().getLangOpts().CPlusPlus) 2602 IDNS |= Decl::IDNS_Ordinary; 2603 2604 // We may already have a record of the same name; try to find and match it. 2605 RecordDecl *AdoptDecl = nullptr; 2606 if (!DC->isFunctionOrMethod()) { 2607 SmallVector<NamedDecl *, 4> ConflictingDecls; 2608 SmallVector<NamedDecl *, 2> FoundDecls; 2609 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 2610 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 2611 if (!FoundDecls[I]->isInIdentifierNamespace(IDNS)) 2612 continue; 2613 2614 Decl *Found = FoundDecls[I]; 2615 if (TypedefNameDecl *Typedef = dyn_cast<TypedefNameDecl>(Found)) { 2616 if (const TagType *Tag = Typedef->getUnderlyingType()->getAs<TagType>()) 2617 Found = Tag->getDecl(); 2618 } 2619 2620 if (RecordDecl *FoundRecord = dyn_cast<RecordDecl>(Found)) { 2621 if (D->isAnonymousStructOrUnion() && 2622 FoundRecord->isAnonymousStructOrUnion()) { 2623 // If both anonymous structs/unions are in a record context, make sure 2624 // they occur in the same location in the context records. 2625 if (Optional<unsigned> Index1 2626 = findAnonymousStructOrUnionIndex(D)) { 2627 if (Optional<unsigned> Index2 = 2628 findAnonymousStructOrUnionIndex(FoundRecord)) { 2629 if (*Index1 != *Index2) 2630 continue; 2631 } 2632 } 2633 } 2634 2635 if (RecordDecl *FoundDef = FoundRecord->getDefinition()) { 2636 if ((SearchName && !D->isCompleteDefinition()) 2637 || (D->isCompleteDefinition() && 2638 D->isAnonymousStructOrUnion() 2639 == FoundDef->isAnonymousStructOrUnion() && 2640 IsStructuralMatch(D, FoundDef))) { 2641 // The record types structurally match, or the "from" translation 2642 // unit only had a forward declaration anyway; call it the same 2643 // function. 2644 // FIXME: For C++, we should also merge methods here. 2645 return Importer.Imported(D, FoundDef); 2646 } 2647 } else if (!D->isCompleteDefinition()) { 2648 // We have a forward declaration of this type, so adopt that forward 2649 // declaration rather than building a new one. 2650 2651 // If one or both can be completed from external storage then try one 2652 // last time to complete and compare them before doing this. 2653 2654 if (FoundRecord->hasExternalLexicalStorage() && 2655 !FoundRecord->isCompleteDefinition()) 2656 FoundRecord->getASTContext().getExternalSource()->CompleteType(FoundRecord); 2657 if (D->hasExternalLexicalStorage()) 2658 D->getASTContext().getExternalSource()->CompleteType(D); 2659 2660 if (FoundRecord->isCompleteDefinition() && 2661 D->isCompleteDefinition() && 2662 !IsStructuralMatch(D, FoundRecord)) 2663 continue; 2664 2665 AdoptDecl = FoundRecord; 2666 continue; 2667 } else if (!SearchName) { 2668 continue; 2669 } 2670 } 2671 2672 ConflictingDecls.push_back(FoundDecls[I]); 2673 } 2674 2675 if (!ConflictingDecls.empty() && SearchName) { 2676 Name = Importer.HandleNameConflict(Name, DC, IDNS, 2677 ConflictingDecls.data(), 2678 ConflictingDecls.size()); 2679 } 2680 } 2681 2682 // Create the record declaration. 2683 RecordDecl *D2 = AdoptDecl; 2684 SourceLocation StartLoc = Importer.Import(D->getLocStart()); 2685 if (!D2) { 2686 if (isa<CXXRecordDecl>(D)) { 2687 CXXRecordDecl *D2CXX = CXXRecordDecl::Create(Importer.getToContext(), 2688 D->getTagKind(), 2689 DC, StartLoc, Loc, 2690 Name.getAsIdentifierInfo()); 2691 D2 = D2CXX; 2692 D2->setAccess(D->getAccess()); 2693 } else { 2694 D2 = RecordDecl::Create(Importer.getToContext(), D->getTagKind(), 2695 DC, StartLoc, Loc, Name.getAsIdentifierInfo()); 2696 } 2697 2698 D2->setQualifierInfo(Importer.Import(D->getQualifierLoc())); 2699 D2->setLexicalDeclContext(LexicalDC); 2700 LexicalDC->addDeclInternal(D2); 2701 if (D->isAnonymousStructOrUnion()) 2702 D2->setAnonymousStructOrUnion(true); 2703 } 2704 2705 Importer.Imported(D, D2); 2706 2707 if (D->isCompleteDefinition() && ImportDefinition(D, D2, IDK_Default)) 2708 return nullptr; 2709 2710 return D2; 2711 } 2712 2713 Decl *ASTNodeImporter::VisitEnumConstantDecl(EnumConstantDecl *D) { 2714 // Import the major distinguishing characteristics of this enumerator. 2715 DeclContext *DC, *LexicalDC; 2716 DeclarationName Name; 2717 SourceLocation Loc; 2718 NamedDecl *ToD; 2719 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 2720 return nullptr; 2721 if (ToD) 2722 return ToD; 2723 2724 QualType T = Importer.Import(D->getType()); 2725 if (T.isNull()) 2726 return nullptr; 2727 2728 // Determine whether there are any other declarations with the same name and 2729 // in the same context. 2730 if (!LexicalDC->isFunctionOrMethod()) { 2731 SmallVector<NamedDecl *, 4> ConflictingDecls; 2732 unsigned IDNS = Decl::IDNS_Ordinary; 2733 SmallVector<NamedDecl *, 2> FoundDecls; 2734 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 2735 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 2736 if (!FoundDecls[I]->isInIdentifierNamespace(IDNS)) 2737 continue; 2738 2739 if (EnumConstantDecl *FoundEnumConstant 2740 = dyn_cast<EnumConstantDecl>(FoundDecls[I])) { 2741 if (IsStructuralMatch(D, FoundEnumConstant)) 2742 return Importer.Imported(D, FoundEnumConstant); 2743 } 2744 2745 ConflictingDecls.push_back(FoundDecls[I]); 2746 } 2747 2748 if (!ConflictingDecls.empty()) { 2749 Name = Importer.HandleNameConflict(Name, DC, IDNS, 2750 ConflictingDecls.data(), 2751 ConflictingDecls.size()); 2752 if (!Name) 2753 return nullptr; 2754 } 2755 } 2756 2757 Expr *Init = Importer.Import(D->getInitExpr()); 2758 if (D->getInitExpr() && !Init) 2759 return nullptr; 2760 2761 EnumConstantDecl *ToEnumerator 2762 = EnumConstantDecl::Create(Importer.getToContext(), cast<EnumDecl>(DC), Loc, 2763 Name.getAsIdentifierInfo(), T, 2764 Init, D->getInitVal()); 2765 ToEnumerator->setAccess(D->getAccess()); 2766 ToEnumerator->setLexicalDeclContext(LexicalDC); 2767 Importer.Imported(D, ToEnumerator); 2768 LexicalDC->addDeclInternal(ToEnumerator); 2769 return ToEnumerator; 2770 } 2771 2772 Decl *ASTNodeImporter::VisitFunctionDecl(FunctionDecl *D) { 2773 // Import the major distinguishing characteristics of this function. 2774 DeclContext *DC, *LexicalDC; 2775 DeclarationName Name; 2776 SourceLocation Loc; 2777 NamedDecl *ToD; 2778 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 2779 return nullptr; 2780 if (ToD) 2781 return ToD; 2782 2783 // Try to find a function in our own ("to") context with the same name, same 2784 // type, and in the same context as the function we're importing. 2785 if (!LexicalDC->isFunctionOrMethod()) { 2786 SmallVector<NamedDecl *, 4> ConflictingDecls; 2787 unsigned IDNS = Decl::IDNS_Ordinary; 2788 SmallVector<NamedDecl *, 2> FoundDecls; 2789 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 2790 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 2791 if (!FoundDecls[I]->isInIdentifierNamespace(IDNS)) 2792 continue; 2793 2794 if (FunctionDecl *FoundFunction = dyn_cast<FunctionDecl>(FoundDecls[I])) { 2795 if (FoundFunction->hasExternalFormalLinkage() && 2796 D->hasExternalFormalLinkage()) { 2797 if (Importer.IsStructurallyEquivalent(D->getType(), 2798 FoundFunction->getType())) { 2799 // FIXME: Actually try to merge the body and other attributes. 2800 return Importer.Imported(D, FoundFunction); 2801 } 2802 2803 // FIXME: Check for overloading more carefully, e.g., by boosting 2804 // Sema::IsOverload out to the AST library. 2805 2806 // Function overloading is okay in C++. 2807 if (Importer.getToContext().getLangOpts().CPlusPlus) 2808 continue; 2809 2810 // Complain about inconsistent function types. 2811 Importer.ToDiag(Loc, diag::err_odr_function_type_inconsistent) 2812 << Name << D->getType() << FoundFunction->getType(); 2813 Importer.ToDiag(FoundFunction->getLocation(), 2814 diag::note_odr_value_here) 2815 << FoundFunction->getType(); 2816 } 2817 } 2818 2819 ConflictingDecls.push_back(FoundDecls[I]); 2820 } 2821 2822 if (!ConflictingDecls.empty()) { 2823 Name = Importer.HandleNameConflict(Name, DC, IDNS, 2824 ConflictingDecls.data(), 2825 ConflictingDecls.size()); 2826 if (!Name) 2827 return nullptr; 2828 } 2829 } 2830 2831 DeclarationNameInfo NameInfo(Name, Loc); 2832 // Import additional name location/type info. 2833 ImportDeclarationNameLoc(D->getNameInfo(), NameInfo); 2834 2835 QualType FromTy = D->getType(); 2836 bool usedDifferentExceptionSpec = false; 2837 2838 if (const FunctionProtoType * 2839 FromFPT = D->getType()->getAs<FunctionProtoType>()) { 2840 FunctionProtoType::ExtProtoInfo FromEPI = FromFPT->getExtProtoInfo(); 2841 // FunctionProtoType::ExtProtoInfo's ExceptionSpecDecl can point to the 2842 // FunctionDecl that we are importing the FunctionProtoType for. 2843 // To avoid an infinite recursion when importing, create the FunctionDecl 2844 // with a simplified function type and update it afterwards. 2845 if (FromEPI.ExceptionSpec.SourceDecl || 2846 FromEPI.ExceptionSpec.SourceTemplate || 2847 FromEPI.ExceptionSpec.NoexceptExpr) { 2848 FunctionProtoType::ExtProtoInfo DefaultEPI; 2849 FromTy = Importer.getFromContext().getFunctionType( 2850 FromFPT->getReturnType(), FromFPT->getParamTypes(), DefaultEPI); 2851 usedDifferentExceptionSpec = true; 2852 } 2853 } 2854 2855 // Import the type. 2856 QualType T = Importer.Import(FromTy); 2857 if (T.isNull()) 2858 return nullptr; 2859 2860 // Import the function parameters. 2861 SmallVector<ParmVarDecl *, 8> Parameters; 2862 for (auto P : D->params()) { 2863 ParmVarDecl *ToP = cast_or_null<ParmVarDecl>(Importer.Import(P)); 2864 if (!ToP) 2865 return nullptr; 2866 2867 Parameters.push_back(ToP); 2868 } 2869 2870 // Create the imported function. 2871 TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo()); 2872 FunctionDecl *ToFunction = nullptr; 2873 SourceLocation InnerLocStart = Importer.Import(D->getInnerLocStart()); 2874 if (CXXConstructorDecl *FromConstructor = dyn_cast<CXXConstructorDecl>(D)) { 2875 ToFunction = CXXConstructorDecl::Create(Importer.getToContext(), 2876 cast<CXXRecordDecl>(DC), 2877 InnerLocStart, 2878 NameInfo, T, TInfo, 2879 FromConstructor->isExplicit(), 2880 D->isInlineSpecified(), 2881 D->isImplicit(), 2882 D->isConstexpr()); 2883 } else if (isa<CXXDestructorDecl>(D)) { 2884 ToFunction = CXXDestructorDecl::Create(Importer.getToContext(), 2885 cast<CXXRecordDecl>(DC), 2886 InnerLocStart, 2887 NameInfo, T, TInfo, 2888 D->isInlineSpecified(), 2889 D->isImplicit()); 2890 } else if (CXXConversionDecl *FromConversion 2891 = dyn_cast<CXXConversionDecl>(D)) { 2892 ToFunction = CXXConversionDecl::Create(Importer.getToContext(), 2893 cast<CXXRecordDecl>(DC), 2894 InnerLocStart, 2895 NameInfo, T, TInfo, 2896 D->isInlineSpecified(), 2897 FromConversion->isExplicit(), 2898 D->isConstexpr(), 2899 Importer.Import(D->getLocEnd())); 2900 } else if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(D)) { 2901 ToFunction = CXXMethodDecl::Create(Importer.getToContext(), 2902 cast<CXXRecordDecl>(DC), 2903 InnerLocStart, 2904 NameInfo, T, TInfo, 2905 Method->getStorageClass(), 2906 Method->isInlineSpecified(), 2907 D->isConstexpr(), 2908 Importer.Import(D->getLocEnd())); 2909 } else { 2910 ToFunction = FunctionDecl::Create(Importer.getToContext(), DC, 2911 InnerLocStart, 2912 NameInfo, T, TInfo, D->getStorageClass(), 2913 D->isInlineSpecified(), 2914 D->hasWrittenPrototype(), 2915 D->isConstexpr()); 2916 } 2917 2918 // Import the qualifier, if any. 2919 ToFunction->setQualifierInfo(Importer.Import(D->getQualifierLoc())); 2920 ToFunction->setAccess(D->getAccess()); 2921 ToFunction->setLexicalDeclContext(LexicalDC); 2922 ToFunction->setVirtualAsWritten(D->isVirtualAsWritten()); 2923 ToFunction->setTrivial(D->isTrivial()); 2924 ToFunction->setPure(D->isPure()); 2925 Importer.Imported(D, ToFunction); 2926 2927 // Set the parameters. 2928 for (unsigned I = 0, N = Parameters.size(); I != N; ++I) { 2929 Parameters[I]->setOwningFunction(ToFunction); 2930 ToFunction->addDeclInternal(Parameters[I]); 2931 } 2932 ToFunction->setParams(Parameters); 2933 2934 if (usedDifferentExceptionSpec) { 2935 // Update FunctionProtoType::ExtProtoInfo. 2936 QualType T = Importer.Import(D->getType()); 2937 if (T.isNull()) 2938 return nullptr; 2939 ToFunction->setType(T); 2940 } 2941 2942 // Import the body, if any. 2943 if (Stmt *FromBody = D->getBody()) { 2944 if (Stmt *ToBody = Importer.Import(FromBody)) { 2945 ToFunction->setBody(ToBody); 2946 } 2947 } 2948 2949 // FIXME: Other bits to merge? 2950 2951 // Add this function to the lexical context. 2952 LexicalDC->addDeclInternal(ToFunction); 2953 2954 return ToFunction; 2955 } 2956 2957 Decl *ASTNodeImporter::VisitCXXMethodDecl(CXXMethodDecl *D) { 2958 return VisitFunctionDecl(D); 2959 } 2960 2961 Decl *ASTNodeImporter::VisitCXXConstructorDecl(CXXConstructorDecl *D) { 2962 return VisitCXXMethodDecl(D); 2963 } 2964 2965 Decl *ASTNodeImporter::VisitCXXDestructorDecl(CXXDestructorDecl *D) { 2966 return VisitCXXMethodDecl(D); 2967 } 2968 2969 Decl *ASTNodeImporter::VisitCXXConversionDecl(CXXConversionDecl *D) { 2970 return VisitCXXMethodDecl(D); 2971 } 2972 2973 static unsigned getFieldIndex(Decl *F) { 2974 RecordDecl *Owner = dyn_cast<RecordDecl>(F->getDeclContext()); 2975 if (!Owner) 2976 return 0; 2977 2978 unsigned Index = 1; 2979 for (const auto *D : Owner->noload_decls()) { 2980 if (D == F) 2981 return Index; 2982 2983 if (isa<FieldDecl>(*D) || isa<IndirectFieldDecl>(*D)) 2984 ++Index; 2985 } 2986 2987 return Index; 2988 } 2989 2990 Decl *ASTNodeImporter::VisitFieldDecl(FieldDecl *D) { 2991 // Import the major distinguishing characteristics of a variable. 2992 DeclContext *DC, *LexicalDC; 2993 DeclarationName Name; 2994 SourceLocation Loc; 2995 NamedDecl *ToD; 2996 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 2997 return nullptr; 2998 if (ToD) 2999 return ToD; 3000 3001 // Determine whether we've already imported this field. 3002 SmallVector<NamedDecl *, 2> FoundDecls; 3003 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 3004 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 3005 if (FieldDecl *FoundField = dyn_cast<FieldDecl>(FoundDecls[I])) { 3006 // For anonymous fields, match up by index. 3007 if (!Name && getFieldIndex(D) != getFieldIndex(FoundField)) 3008 continue; 3009 3010 if (Importer.IsStructurallyEquivalent(D->getType(), 3011 FoundField->getType())) { 3012 Importer.Imported(D, FoundField); 3013 return FoundField; 3014 } 3015 3016 Importer.ToDiag(Loc, diag::err_odr_field_type_inconsistent) 3017 << Name << D->getType() << FoundField->getType(); 3018 Importer.ToDiag(FoundField->getLocation(), diag::note_odr_value_here) 3019 << FoundField->getType(); 3020 return nullptr; 3021 } 3022 } 3023 3024 // Import the type. 3025 QualType T = Importer.Import(D->getType()); 3026 if (T.isNull()) 3027 return nullptr; 3028 3029 TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo()); 3030 Expr *BitWidth = Importer.Import(D->getBitWidth()); 3031 if (!BitWidth && D->getBitWidth()) 3032 return nullptr; 3033 3034 FieldDecl *ToField = FieldDecl::Create(Importer.getToContext(), DC, 3035 Importer.Import(D->getInnerLocStart()), 3036 Loc, Name.getAsIdentifierInfo(), 3037 T, TInfo, BitWidth, D->isMutable(), 3038 D->getInClassInitStyle()); 3039 ToField->setAccess(D->getAccess()); 3040 ToField->setLexicalDeclContext(LexicalDC); 3041 if (Expr *FromInitializer = D->getInClassInitializer()) { 3042 Expr *ToInitializer = Importer.Import(FromInitializer); 3043 if (ToInitializer) 3044 ToField->setInClassInitializer(ToInitializer); 3045 else 3046 return nullptr; 3047 } 3048 ToField->setImplicit(D->isImplicit()); 3049 Importer.Imported(D, ToField); 3050 LexicalDC->addDeclInternal(ToField); 3051 return ToField; 3052 } 3053 3054 Decl *ASTNodeImporter::VisitIndirectFieldDecl(IndirectFieldDecl *D) { 3055 // Import the major distinguishing characteristics of a variable. 3056 DeclContext *DC, *LexicalDC; 3057 DeclarationName Name; 3058 SourceLocation Loc; 3059 NamedDecl *ToD; 3060 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 3061 return nullptr; 3062 if (ToD) 3063 return ToD; 3064 3065 // Determine whether we've already imported this field. 3066 SmallVector<NamedDecl *, 2> FoundDecls; 3067 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 3068 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 3069 if (IndirectFieldDecl *FoundField 3070 = dyn_cast<IndirectFieldDecl>(FoundDecls[I])) { 3071 // For anonymous indirect fields, match up by index. 3072 if (!Name && getFieldIndex(D) != getFieldIndex(FoundField)) 3073 continue; 3074 3075 if (Importer.IsStructurallyEquivalent(D->getType(), 3076 FoundField->getType(), 3077 !Name.isEmpty())) { 3078 Importer.Imported(D, FoundField); 3079 return FoundField; 3080 } 3081 3082 // If there are more anonymous fields to check, continue. 3083 if (!Name && I < N-1) 3084 continue; 3085 3086 Importer.ToDiag(Loc, diag::err_odr_field_type_inconsistent) 3087 << Name << D->getType() << FoundField->getType(); 3088 Importer.ToDiag(FoundField->getLocation(), diag::note_odr_value_here) 3089 << FoundField->getType(); 3090 return nullptr; 3091 } 3092 } 3093 3094 // Import the type. 3095 QualType T = Importer.Import(D->getType()); 3096 if (T.isNull()) 3097 return nullptr; 3098 3099 NamedDecl **NamedChain = 3100 new (Importer.getToContext())NamedDecl*[D->getChainingSize()]; 3101 3102 unsigned i = 0; 3103 for (auto *PI : D->chain()) { 3104 Decl *D = Importer.Import(PI); 3105 if (!D) 3106 return nullptr; 3107 NamedChain[i++] = cast<NamedDecl>(D); 3108 } 3109 3110 IndirectFieldDecl *ToIndirectField = IndirectFieldDecl::Create( 3111 Importer.getToContext(), DC, Loc, Name.getAsIdentifierInfo(), T, 3112 NamedChain, D->getChainingSize()); 3113 3114 for (const auto *Attr : D->attrs()) 3115 ToIndirectField->addAttr(Attr->clone(Importer.getToContext())); 3116 3117 ToIndirectField->setAccess(D->getAccess()); 3118 ToIndirectField->setLexicalDeclContext(LexicalDC); 3119 Importer.Imported(D, ToIndirectField); 3120 LexicalDC->addDeclInternal(ToIndirectField); 3121 return ToIndirectField; 3122 } 3123 3124 Decl *ASTNodeImporter::VisitObjCIvarDecl(ObjCIvarDecl *D) { 3125 // Import the major distinguishing characteristics of an ivar. 3126 DeclContext *DC, *LexicalDC; 3127 DeclarationName Name; 3128 SourceLocation Loc; 3129 NamedDecl *ToD; 3130 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 3131 return nullptr; 3132 if (ToD) 3133 return ToD; 3134 3135 // Determine whether we've already imported this ivar 3136 SmallVector<NamedDecl *, 2> FoundDecls; 3137 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 3138 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 3139 if (ObjCIvarDecl *FoundIvar = dyn_cast<ObjCIvarDecl>(FoundDecls[I])) { 3140 if (Importer.IsStructurallyEquivalent(D->getType(), 3141 FoundIvar->getType())) { 3142 Importer.Imported(D, FoundIvar); 3143 return FoundIvar; 3144 } 3145 3146 Importer.ToDiag(Loc, diag::err_odr_ivar_type_inconsistent) 3147 << Name << D->getType() << FoundIvar->getType(); 3148 Importer.ToDiag(FoundIvar->getLocation(), diag::note_odr_value_here) 3149 << FoundIvar->getType(); 3150 return nullptr; 3151 } 3152 } 3153 3154 // Import the type. 3155 QualType T = Importer.Import(D->getType()); 3156 if (T.isNull()) 3157 return nullptr; 3158 3159 TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo()); 3160 Expr *BitWidth = Importer.Import(D->getBitWidth()); 3161 if (!BitWidth && D->getBitWidth()) 3162 return nullptr; 3163 3164 ObjCIvarDecl *ToIvar = ObjCIvarDecl::Create(Importer.getToContext(), 3165 cast<ObjCContainerDecl>(DC), 3166 Importer.Import(D->getInnerLocStart()), 3167 Loc, Name.getAsIdentifierInfo(), 3168 T, TInfo, D->getAccessControl(), 3169 BitWidth, D->getSynthesize()); 3170 ToIvar->setLexicalDeclContext(LexicalDC); 3171 Importer.Imported(D, ToIvar); 3172 LexicalDC->addDeclInternal(ToIvar); 3173 return ToIvar; 3174 3175 } 3176 3177 Decl *ASTNodeImporter::VisitVarDecl(VarDecl *D) { 3178 // Import the major distinguishing characteristics of a variable. 3179 DeclContext *DC, *LexicalDC; 3180 DeclarationName Name; 3181 SourceLocation Loc; 3182 NamedDecl *ToD; 3183 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 3184 return nullptr; 3185 if (ToD) 3186 return ToD; 3187 3188 // Try to find a variable in our own ("to") context with the same name and 3189 // in the same context as the variable we're importing. 3190 if (D->isFileVarDecl()) { 3191 VarDecl *MergeWithVar = nullptr; 3192 SmallVector<NamedDecl *, 4> ConflictingDecls; 3193 unsigned IDNS = Decl::IDNS_Ordinary; 3194 SmallVector<NamedDecl *, 2> FoundDecls; 3195 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 3196 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 3197 if (!FoundDecls[I]->isInIdentifierNamespace(IDNS)) 3198 continue; 3199 3200 if (VarDecl *FoundVar = dyn_cast<VarDecl>(FoundDecls[I])) { 3201 // We have found a variable that we may need to merge with. Check it. 3202 if (FoundVar->hasExternalFormalLinkage() && 3203 D->hasExternalFormalLinkage()) { 3204 if (Importer.IsStructurallyEquivalent(D->getType(), 3205 FoundVar->getType())) { 3206 MergeWithVar = FoundVar; 3207 break; 3208 } 3209 3210 const ArrayType *FoundArray 3211 = Importer.getToContext().getAsArrayType(FoundVar->getType()); 3212 const ArrayType *TArray 3213 = Importer.getToContext().getAsArrayType(D->getType()); 3214 if (FoundArray && TArray) { 3215 if (isa<IncompleteArrayType>(FoundArray) && 3216 isa<ConstantArrayType>(TArray)) { 3217 // Import the type. 3218 QualType T = Importer.Import(D->getType()); 3219 if (T.isNull()) 3220 return nullptr; 3221 3222 FoundVar->setType(T); 3223 MergeWithVar = FoundVar; 3224 break; 3225 } else if (isa<IncompleteArrayType>(TArray) && 3226 isa<ConstantArrayType>(FoundArray)) { 3227 MergeWithVar = FoundVar; 3228 break; 3229 } 3230 } 3231 3232 Importer.ToDiag(Loc, diag::err_odr_variable_type_inconsistent) 3233 << Name << D->getType() << FoundVar->getType(); 3234 Importer.ToDiag(FoundVar->getLocation(), diag::note_odr_value_here) 3235 << FoundVar->getType(); 3236 } 3237 } 3238 3239 ConflictingDecls.push_back(FoundDecls[I]); 3240 } 3241 3242 if (MergeWithVar) { 3243 // An equivalent variable with external linkage has been found. Link 3244 // the two declarations, then merge them. 3245 Importer.Imported(D, MergeWithVar); 3246 3247 if (VarDecl *DDef = D->getDefinition()) { 3248 if (VarDecl *ExistingDef = MergeWithVar->getDefinition()) { 3249 Importer.ToDiag(ExistingDef->getLocation(), 3250 diag::err_odr_variable_multiple_def) 3251 << Name; 3252 Importer.FromDiag(DDef->getLocation(), diag::note_odr_defined_here); 3253 } else { 3254 Expr *Init = Importer.Import(DDef->getInit()); 3255 MergeWithVar->setInit(Init); 3256 if (DDef->isInitKnownICE()) { 3257 EvaluatedStmt *Eval = MergeWithVar->ensureEvaluatedStmt(); 3258 Eval->CheckedICE = true; 3259 Eval->IsICE = DDef->isInitICE(); 3260 } 3261 } 3262 } 3263 3264 return MergeWithVar; 3265 } 3266 3267 if (!ConflictingDecls.empty()) { 3268 Name = Importer.HandleNameConflict(Name, DC, IDNS, 3269 ConflictingDecls.data(), 3270 ConflictingDecls.size()); 3271 if (!Name) 3272 return nullptr; 3273 } 3274 } 3275 3276 // Import the type. 3277 QualType T = Importer.Import(D->getType()); 3278 if (T.isNull()) 3279 return nullptr; 3280 3281 // Create the imported variable. 3282 TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo()); 3283 VarDecl *ToVar = VarDecl::Create(Importer.getToContext(), DC, 3284 Importer.Import(D->getInnerLocStart()), 3285 Loc, Name.getAsIdentifierInfo(), 3286 T, TInfo, 3287 D->getStorageClass()); 3288 ToVar->setQualifierInfo(Importer.Import(D->getQualifierLoc())); 3289 ToVar->setAccess(D->getAccess()); 3290 ToVar->setLexicalDeclContext(LexicalDC); 3291 Importer.Imported(D, ToVar); 3292 LexicalDC->addDeclInternal(ToVar); 3293 3294 if (!D->isFileVarDecl() && 3295 D->isUsed()) 3296 ToVar->setIsUsed(); 3297 3298 // Merge the initializer. 3299 if (ImportDefinition(D, ToVar)) 3300 return nullptr; 3301 3302 return ToVar; 3303 } 3304 3305 Decl *ASTNodeImporter::VisitImplicitParamDecl(ImplicitParamDecl *D) { 3306 // Parameters are created in the translation unit's context, then moved 3307 // into the function declaration's context afterward. 3308 DeclContext *DC = Importer.getToContext().getTranslationUnitDecl(); 3309 3310 // Import the name of this declaration. 3311 DeclarationName Name = Importer.Import(D->getDeclName()); 3312 if (D->getDeclName() && !Name) 3313 return nullptr; 3314 3315 // Import the location of this declaration. 3316 SourceLocation Loc = Importer.Import(D->getLocation()); 3317 3318 // Import the parameter's type. 3319 QualType T = Importer.Import(D->getType()); 3320 if (T.isNull()) 3321 return nullptr; 3322 3323 // Create the imported parameter. 3324 ImplicitParamDecl *ToParm 3325 = ImplicitParamDecl::Create(Importer.getToContext(), DC, 3326 Loc, Name.getAsIdentifierInfo(), 3327 T); 3328 return Importer.Imported(D, ToParm); 3329 } 3330 3331 Decl *ASTNodeImporter::VisitParmVarDecl(ParmVarDecl *D) { 3332 // Parameters are created in the translation unit's context, then moved 3333 // into the function declaration's context afterward. 3334 DeclContext *DC = Importer.getToContext().getTranslationUnitDecl(); 3335 3336 // Import the name of this declaration. 3337 DeclarationName Name = Importer.Import(D->getDeclName()); 3338 if (D->getDeclName() && !Name) 3339 return nullptr; 3340 3341 // Import the location of this declaration. 3342 SourceLocation Loc = Importer.Import(D->getLocation()); 3343 3344 // Import the parameter's type. 3345 QualType T = Importer.Import(D->getType()); 3346 if (T.isNull()) 3347 return nullptr; 3348 3349 // Create the imported parameter. 3350 TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo()); 3351 ParmVarDecl *ToParm = ParmVarDecl::Create(Importer.getToContext(), DC, 3352 Importer.Import(D->getInnerLocStart()), 3353 Loc, Name.getAsIdentifierInfo(), 3354 T, TInfo, D->getStorageClass(), 3355 /*FIXME: Default argument*/nullptr); 3356 ToParm->setHasInheritedDefaultArg(D->hasInheritedDefaultArg()); 3357 3358 if (D->isUsed()) 3359 ToParm->setIsUsed(); 3360 3361 return Importer.Imported(D, ToParm); 3362 } 3363 3364 Decl *ASTNodeImporter::VisitObjCMethodDecl(ObjCMethodDecl *D) { 3365 // Import the major distinguishing characteristics of a method. 3366 DeclContext *DC, *LexicalDC; 3367 DeclarationName Name; 3368 SourceLocation Loc; 3369 NamedDecl *ToD; 3370 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 3371 return nullptr; 3372 if (ToD) 3373 return ToD; 3374 3375 SmallVector<NamedDecl *, 2> FoundDecls; 3376 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 3377 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 3378 if (ObjCMethodDecl *FoundMethod = dyn_cast<ObjCMethodDecl>(FoundDecls[I])) { 3379 if (FoundMethod->isInstanceMethod() != D->isInstanceMethod()) 3380 continue; 3381 3382 // Check return types. 3383 if (!Importer.IsStructurallyEquivalent(D->getReturnType(), 3384 FoundMethod->getReturnType())) { 3385 Importer.ToDiag(Loc, diag::err_odr_objc_method_result_type_inconsistent) 3386 << D->isInstanceMethod() << Name << D->getReturnType() 3387 << FoundMethod->getReturnType(); 3388 Importer.ToDiag(FoundMethod->getLocation(), 3389 diag::note_odr_objc_method_here) 3390 << D->isInstanceMethod() << Name; 3391 return nullptr; 3392 } 3393 3394 // Check the number of parameters. 3395 if (D->param_size() != FoundMethod->param_size()) { 3396 Importer.ToDiag(Loc, diag::err_odr_objc_method_num_params_inconsistent) 3397 << D->isInstanceMethod() << Name 3398 << D->param_size() << FoundMethod->param_size(); 3399 Importer.ToDiag(FoundMethod->getLocation(), 3400 diag::note_odr_objc_method_here) 3401 << D->isInstanceMethod() << Name; 3402 return nullptr; 3403 } 3404 3405 // Check parameter types. 3406 for (ObjCMethodDecl::param_iterator P = D->param_begin(), 3407 PEnd = D->param_end(), FoundP = FoundMethod->param_begin(); 3408 P != PEnd; ++P, ++FoundP) { 3409 if (!Importer.IsStructurallyEquivalent((*P)->getType(), 3410 (*FoundP)->getType())) { 3411 Importer.FromDiag((*P)->getLocation(), 3412 diag::err_odr_objc_method_param_type_inconsistent) 3413 << D->isInstanceMethod() << Name 3414 << (*P)->getType() << (*FoundP)->getType(); 3415 Importer.ToDiag((*FoundP)->getLocation(), diag::note_odr_value_here) 3416 << (*FoundP)->getType(); 3417 return nullptr; 3418 } 3419 } 3420 3421 // Check variadic/non-variadic. 3422 // Check the number of parameters. 3423 if (D->isVariadic() != FoundMethod->isVariadic()) { 3424 Importer.ToDiag(Loc, diag::err_odr_objc_method_variadic_inconsistent) 3425 << D->isInstanceMethod() << Name; 3426 Importer.ToDiag(FoundMethod->getLocation(), 3427 diag::note_odr_objc_method_here) 3428 << D->isInstanceMethod() << Name; 3429 return nullptr; 3430 } 3431 3432 // FIXME: Any other bits we need to merge? 3433 return Importer.Imported(D, FoundMethod); 3434 } 3435 } 3436 3437 // Import the result type. 3438 QualType ResultTy = Importer.Import(D->getReturnType()); 3439 if (ResultTy.isNull()) 3440 return nullptr; 3441 3442 TypeSourceInfo *ReturnTInfo = Importer.Import(D->getReturnTypeSourceInfo()); 3443 3444 ObjCMethodDecl *ToMethod = ObjCMethodDecl::Create( 3445 Importer.getToContext(), Loc, Importer.Import(D->getLocEnd()), 3446 Name.getObjCSelector(), ResultTy, ReturnTInfo, DC, D->isInstanceMethod(), 3447 D->isVariadic(), D->isPropertyAccessor(), D->isImplicit(), D->isDefined(), 3448 D->getImplementationControl(), D->hasRelatedResultType()); 3449 3450 // FIXME: When we decide to merge method definitions, we'll need to 3451 // deal with implicit parameters. 3452 3453 // Import the parameters 3454 SmallVector<ParmVarDecl *, 5> ToParams; 3455 for (auto *FromP : D->params()) { 3456 ParmVarDecl *ToP = cast_or_null<ParmVarDecl>(Importer.Import(FromP)); 3457 if (!ToP) 3458 return nullptr; 3459 3460 ToParams.push_back(ToP); 3461 } 3462 3463 // Set the parameters. 3464 for (unsigned I = 0, N = ToParams.size(); I != N; ++I) { 3465 ToParams[I]->setOwningFunction(ToMethod); 3466 ToMethod->addDeclInternal(ToParams[I]); 3467 } 3468 SmallVector<SourceLocation, 12> SelLocs; 3469 D->getSelectorLocs(SelLocs); 3470 ToMethod->setMethodParams(Importer.getToContext(), ToParams, SelLocs); 3471 3472 ToMethod->setLexicalDeclContext(LexicalDC); 3473 Importer.Imported(D, ToMethod); 3474 LexicalDC->addDeclInternal(ToMethod); 3475 return ToMethod; 3476 } 3477 3478 Decl *ASTNodeImporter::VisitObjCTypeParamDecl(ObjCTypeParamDecl *D) { 3479 // Import the major distinguishing characteristics of a category. 3480 DeclContext *DC, *LexicalDC; 3481 DeclarationName Name; 3482 SourceLocation Loc; 3483 NamedDecl *ToD; 3484 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 3485 return nullptr; 3486 if (ToD) 3487 return ToD; 3488 3489 TypeSourceInfo *BoundInfo = Importer.Import(D->getTypeSourceInfo()); 3490 if (!BoundInfo) 3491 return nullptr; 3492 3493 ObjCTypeParamDecl *Result = ObjCTypeParamDecl::Create( 3494 Importer.getToContext(), DC, 3495 D->getVariance(), 3496 Importer.Import(D->getVarianceLoc()), 3497 D->getIndex(), 3498 Importer.Import(D->getLocation()), 3499 Name.getAsIdentifierInfo(), 3500 Importer.Import(D->getColonLoc()), 3501 BoundInfo); 3502 Importer.Imported(D, Result); 3503 Result->setLexicalDeclContext(LexicalDC); 3504 return Result; 3505 } 3506 3507 Decl *ASTNodeImporter::VisitObjCCategoryDecl(ObjCCategoryDecl *D) { 3508 // Import the major distinguishing characteristics of a category. 3509 DeclContext *DC, *LexicalDC; 3510 DeclarationName Name; 3511 SourceLocation Loc; 3512 NamedDecl *ToD; 3513 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 3514 return nullptr; 3515 if (ToD) 3516 return ToD; 3517 3518 ObjCInterfaceDecl *ToInterface 3519 = cast_or_null<ObjCInterfaceDecl>(Importer.Import(D->getClassInterface())); 3520 if (!ToInterface) 3521 return nullptr; 3522 3523 // Determine if we've already encountered this category. 3524 ObjCCategoryDecl *MergeWithCategory 3525 = ToInterface->FindCategoryDeclaration(Name.getAsIdentifierInfo()); 3526 ObjCCategoryDecl *ToCategory = MergeWithCategory; 3527 if (!ToCategory) { 3528 ToCategory = ObjCCategoryDecl::Create(Importer.getToContext(), DC, 3529 Importer.Import(D->getAtStartLoc()), 3530 Loc, 3531 Importer.Import(D->getCategoryNameLoc()), 3532 Name.getAsIdentifierInfo(), 3533 ToInterface, 3534 /*TypeParamList=*/nullptr, 3535 Importer.Import(D->getIvarLBraceLoc()), 3536 Importer.Import(D->getIvarRBraceLoc())); 3537 ToCategory->setLexicalDeclContext(LexicalDC); 3538 LexicalDC->addDeclInternal(ToCategory); 3539 Importer.Imported(D, ToCategory); 3540 // Import the type parameter list after calling Imported, to avoid 3541 // loops when bringing in their DeclContext. 3542 ToCategory->setTypeParamList(ImportObjCTypeParamList( 3543 D->getTypeParamList())); 3544 3545 // Import protocols 3546 SmallVector<ObjCProtocolDecl *, 4> Protocols; 3547 SmallVector<SourceLocation, 4> ProtocolLocs; 3548 ObjCCategoryDecl::protocol_loc_iterator FromProtoLoc 3549 = D->protocol_loc_begin(); 3550 for (ObjCCategoryDecl::protocol_iterator FromProto = D->protocol_begin(), 3551 FromProtoEnd = D->protocol_end(); 3552 FromProto != FromProtoEnd; 3553 ++FromProto, ++FromProtoLoc) { 3554 ObjCProtocolDecl *ToProto 3555 = cast_or_null<ObjCProtocolDecl>(Importer.Import(*FromProto)); 3556 if (!ToProto) 3557 return nullptr; 3558 Protocols.push_back(ToProto); 3559 ProtocolLocs.push_back(Importer.Import(*FromProtoLoc)); 3560 } 3561 3562 // FIXME: If we're merging, make sure that the protocol list is the same. 3563 ToCategory->setProtocolList(Protocols.data(), Protocols.size(), 3564 ProtocolLocs.data(), Importer.getToContext()); 3565 3566 } else { 3567 Importer.Imported(D, ToCategory); 3568 } 3569 3570 // Import all of the members of this category. 3571 ImportDeclContext(D); 3572 3573 // If we have an implementation, import it as well. 3574 if (D->getImplementation()) { 3575 ObjCCategoryImplDecl *Impl 3576 = cast_or_null<ObjCCategoryImplDecl>( 3577 Importer.Import(D->getImplementation())); 3578 if (!Impl) 3579 return nullptr; 3580 3581 ToCategory->setImplementation(Impl); 3582 } 3583 3584 return ToCategory; 3585 } 3586 3587 bool ASTNodeImporter::ImportDefinition(ObjCProtocolDecl *From, 3588 ObjCProtocolDecl *To, 3589 ImportDefinitionKind Kind) { 3590 if (To->getDefinition()) { 3591 if (shouldForceImportDeclContext(Kind)) 3592 ImportDeclContext(From); 3593 return false; 3594 } 3595 3596 // Start the protocol definition 3597 To->startDefinition(); 3598 3599 // Import protocols 3600 SmallVector<ObjCProtocolDecl *, 4> Protocols; 3601 SmallVector<SourceLocation, 4> ProtocolLocs; 3602 ObjCProtocolDecl::protocol_loc_iterator 3603 FromProtoLoc = From->protocol_loc_begin(); 3604 for (ObjCProtocolDecl::protocol_iterator FromProto = From->protocol_begin(), 3605 FromProtoEnd = From->protocol_end(); 3606 FromProto != FromProtoEnd; 3607 ++FromProto, ++FromProtoLoc) { 3608 ObjCProtocolDecl *ToProto 3609 = cast_or_null<ObjCProtocolDecl>(Importer.Import(*FromProto)); 3610 if (!ToProto) 3611 return true; 3612 Protocols.push_back(ToProto); 3613 ProtocolLocs.push_back(Importer.Import(*FromProtoLoc)); 3614 } 3615 3616 // FIXME: If we're merging, make sure that the protocol list is the same. 3617 To->setProtocolList(Protocols.data(), Protocols.size(), 3618 ProtocolLocs.data(), Importer.getToContext()); 3619 3620 if (shouldForceImportDeclContext(Kind)) { 3621 // Import all of the members of this protocol. 3622 ImportDeclContext(From, /*ForceImport=*/true); 3623 } 3624 return false; 3625 } 3626 3627 Decl *ASTNodeImporter::VisitObjCProtocolDecl(ObjCProtocolDecl *D) { 3628 // If this protocol has a definition in the translation unit we're coming 3629 // from, but this particular declaration is not that definition, import the 3630 // definition and map to that. 3631 ObjCProtocolDecl *Definition = D->getDefinition(); 3632 if (Definition && Definition != D) { 3633 Decl *ImportedDef = Importer.Import(Definition); 3634 if (!ImportedDef) 3635 return nullptr; 3636 3637 return Importer.Imported(D, ImportedDef); 3638 } 3639 3640 // Import the major distinguishing characteristics of a protocol. 3641 DeclContext *DC, *LexicalDC; 3642 DeclarationName Name; 3643 SourceLocation Loc; 3644 NamedDecl *ToD; 3645 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 3646 return nullptr; 3647 if (ToD) 3648 return ToD; 3649 3650 ObjCProtocolDecl *MergeWithProtocol = nullptr; 3651 SmallVector<NamedDecl *, 2> FoundDecls; 3652 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 3653 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 3654 if (!FoundDecls[I]->isInIdentifierNamespace(Decl::IDNS_ObjCProtocol)) 3655 continue; 3656 3657 if ((MergeWithProtocol = dyn_cast<ObjCProtocolDecl>(FoundDecls[I]))) 3658 break; 3659 } 3660 3661 ObjCProtocolDecl *ToProto = MergeWithProtocol; 3662 if (!ToProto) { 3663 ToProto = ObjCProtocolDecl::Create(Importer.getToContext(), DC, 3664 Name.getAsIdentifierInfo(), Loc, 3665 Importer.Import(D->getAtStartLoc()), 3666 /*PrevDecl=*/nullptr); 3667 ToProto->setLexicalDeclContext(LexicalDC); 3668 LexicalDC->addDeclInternal(ToProto); 3669 } 3670 3671 Importer.Imported(D, ToProto); 3672 3673 if (D->isThisDeclarationADefinition() && ImportDefinition(D, ToProto)) 3674 return nullptr; 3675 3676 return ToProto; 3677 } 3678 3679 Decl *ASTNodeImporter::VisitLinkageSpecDecl(LinkageSpecDecl *D) { 3680 DeclContext *DC = Importer.ImportContext(D->getDeclContext()); 3681 DeclContext *LexicalDC = Importer.ImportContext(D->getLexicalDeclContext()); 3682 3683 SourceLocation ExternLoc = Importer.Import(D->getExternLoc()); 3684 SourceLocation LangLoc = Importer.Import(D->getLocation()); 3685 3686 bool HasBraces = D->hasBraces(); 3687 3688 LinkageSpecDecl *ToLinkageSpec = 3689 LinkageSpecDecl::Create(Importer.getToContext(), 3690 DC, 3691 ExternLoc, 3692 LangLoc, 3693 D->getLanguage(), 3694 HasBraces); 3695 3696 if (HasBraces) { 3697 SourceLocation RBraceLoc = Importer.Import(D->getRBraceLoc()); 3698 ToLinkageSpec->setRBraceLoc(RBraceLoc); 3699 } 3700 3701 ToLinkageSpec->setLexicalDeclContext(LexicalDC); 3702 LexicalDC->addDeclInternal(ToLinkageSpec); 3703 3704 Importer.Imported(D, ToLinkageSpec); 3705 3706 return ToLinkageSpec; 3707 } 3708 3709 bool ASTNodeImporter::ImportDefinition(ObjCInterfaceDecl *From, 3710 ObjCInterfaceDecl *To, 3711 ImportDefinitionKind Kind) { 3712 if (To->getDefinition()) { 3713 // Check consistency of superclass. 3714 ObjCInterfaceDecl *FromSuper = From->getSuperClass(); 3715 if (FromSuper) { 3716 FromSuper = cast_or_null<ObjCInterfaceDecl>(Importer.Import(FromSuper)); 3717 if (!FromSuper) 3718 return true; 3719 } 3720 3721 ObjCInterfaceDecl *ToSuper = To->getSuperClass(); 3722 if ((bool)FromSuper != (bool)ToSuper || 3723 (FromSuper && !declaresSameEntity(FromSuper, ToSuper))) { 3724 Importer.ToDiag(To->getLocation(), 3725 diag::err_odr_objc_superclass_inconsistent) 3726 << To->getDeclName(); 3727 if (ToSuper) 3728 Importer.ToDiag(To->getSuperClassLoc(), diag::note_odr_objc_superclass) 3729 << To->getSuperClass()->getDeclName(); 3730 else 3731 Importer.ToDiag(To->getLocation(), 3732 diag::note_odr_objc_missing_superclass); 3733 if (From->getSuperClass()) 3734 Importer.FromDiag(From->getSuperClassLoc(), 3735 diag::note_odr_objc_superclass) 3736 << From->getSuperClass()->getDeclName(); 3737 else 3738 Importer.FromDiag(From->getLocation(), 3739 diag::note_odr_objc_missing_superclass); 3740 } 3741 3742 if (shouldForceImportDeclContext(Kind)) 3743 ImportDeclContext(From); 3744 return false; 3745 } 3746 3747 // Start the definition. 3748 To->startDefinition(); 3749 3750 // If this class has a superclass, import it. 3751 if (From->getSuperClass()) { 3752 TypeSourceInfo *SuperTInfo = Importer.Import(From->getSuperClassTInfo()); 3753 if (!SuperTInfo) 3754 return true; 3755 3756 To->setSuperClass(SuperTInfo); 3757 } 3758 3759 // Import protocols 3760 SmallVector<ObjCProtocolDecl *, 4> Protocols; 3761 SmallVector<SourceLocation, 4> ProtocolLocs; 3762 ObjCInterfaceDecl::protocol_loc_iterator 3763 FromProtoLoc = From->protocol_loc_begin(); 3764 3765 for (ObjCInterfaceDecl::protocol_iterator FromProto = From->protocol_begin(), 3766 FromProtoEnd = From->protocol_end(); 3767 FromProto != FromProtoEnd; 3768 ++FromProto, ++FromProtoLoc) { 3769 ObjCProtocolDecl *ToProto 3770 = cast_or_null<ObjCProtocolDecl>(Importer.Import(*FromProto)); 3771 if (!ToProto) 3772 return true; 3773 Protocols.push_back(ToProto); 3774 ProtocolLocs.push_back(Importer.Import(*FromProtoLoc)); 3775 } 3776 3777 // FIXME: If we're merging, make sure that the protocol list is the same. 3778 To->setProtocolList(Protocols.data(), Protocols.size(), 3779 ProtocolLocs.data(), Importer.getToContext()); 3780 3781 // Import categories. When the categories themselves are imported, they'll 3782 // hook themselves into this interface. 3783 for (auto *Cat : From->known_categories()) 3784 Importer.Import(Cat); 3785 3786 // If we have an @implementation, import it as well. 3787 if (From->getImplementation()) { 3788 ObjCImplementationDecl *Impl = cast_or_null<ObjCImplementationDecl>( 3789 Importer.Import(From->getImplementation())); 3790 if (!Impl) 3791 return true; 3792 3793 To->setImplementation(Impl); 3794 } 3795 3796 if (shouldForceImportDeclContext(Kind)) { 3797 // Import all of the members of this class. 3798 ImportDeclContext(From, /*ForceImport=*/true); 3799 } 3800 return false; 3801 } 3802 3803 ObjCTypeParamList * 3804 ASTNodeImporter::ImportObjCTypeParamList(ObjCTypeParamList *list) { 3805 if (!list) 3806 return nullptr; 3807 3808 SmallVector<ObjCTypeParamDecl *, 4> toTypeParams; 3809 for (auto fromTypeParam : *list) { 3810 auto toTypeParam = cast_or_null<ObjCTypeParamDecl>( 3811 Importer.Import(fromTypeParam)); 3812 if (!toTypeParam) 3813 return nullptr; 3814 3815 toTypeParams.push_back(toTypeParam); 3816 } 3817 3818 return ObjCTypeParamList::create(Importer.getToContext(), 3819 Importer.Import(list->getLAngleLoc()), 3820 toTypeParams, 3821 Importer.Import(list->getRAngleLoc())); 3822 } 3823 3824 Decl *ASTNodeImporter::VisitObjCInterfaceDecl(ObjCInterfaceDecl *D) { 3825 // If this class has a definition in the translation unit we're coming from, 3826 // but this particular declaration is not that definition, import the 3827 // definition and map to that. 3828 ObjCInterfaceDecl *Definition = D->getDefinition(); 3829 if (Definition && Definition != D) { 3830 Decl *ImportedDef = Importer.Import(Definition); 3831 if (!ImportedDef) 3832 return nullptr; 3833 3834 return Importer.Imported(D, ImportedDef); 3835 } 3836 3837 // Import the major distinguishing characteristics of an @interface. 3838 DeclContext *DC, *LexicalDC; 3839 DeclarationName Name; 3840 SourceLocation Loc; 3841 NamedDecl *ToD; 3842 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 3843 return nullptr; 3844 if (ToD) 3845 return ToD; 3846 3847 // Look for an existing interface with the same name. 3848 ObjCInterfaceDecl *MergeWithIface = nullptr; 3849 SmallVector<NamedDecl *, 2> FoundDecls; 3850 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 3851 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 3852 if (!FoundDecls[I]->isInIdentifierNamespace(Decl::IDNS_Ordinary)) 3853 continue; 3854 3855 if ((MergeWithIface = dyn_cast<ObjCInterfaceDecl>(FoundDecls[I]))) 3856 break; 3857 } 3858 3859 // Create an interface declaration, if one does not already exist. 3860 ObjCInterfaceDecl *ToIface = MergeWithIface; 3861 if (!ToIface) { 3862 ToIface = ObjCInterfaceDecl::Create(Importer.getToContext(), DC, 3863 Importer.Import(D->getAtStartLoc()), 3864 Name.getAsIdentifierInfo(), 3865 /*TypeParamList=*/nullptr, 3866 /*PrevDecl=*/nullptr, Loc, 3867 D->isImplicitInterfaceDecl()); 3868 ToIface->setLexicalDeclContext(LexicalDC); 3869 LexicalDC->addDeclInternal(ToIface); 3870 } 3871 Importer.Imported(D, ToIface); 3872 // Import the type parameter list after calling Imported, to avoid 3873 // loops when bringing in their DeclContext. 3874 ToIface->setTypeParamList(ImportObjCTypeParamList( 3875 D->getTypeParamListAsWritten())); 3876 3877 if (D->isThisDeclarationADefinition() && ImportDefinition(D, ToIface)) 3878 return nullptr; 3879 3880 return ToIface; 3881 } 3882 3883 Decl *ASTNodeImporter::VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) { 3884 ObjCCategoryDecl *Category = cast_or_null<ObjCCategoryDecl>( 3885 Importer.Import(D->getCategoryDecl())); 3886 if (!Category) 3887 return nullptr; 3888 3889 ObjCCategoryImplDecl *ToImpl = Category->getImplementation(); 3890 if (!ToImpl) { 3891 DeclContext *DC = Importer.ImportContext(D->getDeclContext()); 3892 if (!DC) 3893 return nullptr; 3894 3895 SourceLocation CategoryNameLoc = Importer.Import(D->getCategoryNameLoc()); 3896 ToImpl = ObjCCategoryImplDecl::Create(Importer.getToContext(), DC, 3897 Importer.Import(D->getIdentifier()), 3898 Category->getClassInterface(), 3899 Importer.Import(D->getLocation()), 3900 Importer.Import(D->getAtStartLoc()), 3901 CategoryNameLoc); 3902 3903 DeclContext *LexicalDC = DC; 3904 if (D->getDeclContext() != D->getLexicalDeclContext()) { 3905 LexicalDC = Importer.ImportContext(D->getLexicalDeclContext()); 3906 if (!LexicalDC) 3907 return nullptr; 3908 3909 ToImpl->setLexicalDeclContext(LexicalDC); 3910 } 3911 3912 LexicalDC->addDeclInternal(ToImpl); 3913 Category->setImplementation(ToImpl); 3914 } 3915 3916 Importer.Imported(D, ToImpl); 3917 ImportDeclContext(D); 3918 return ToImpl; 3919 } 3920 3921 Decl *ASTNodeImporter::VisitObjCImplementationDecl(ObjCImplementationDecl *D) { 3922 // Find the corresponding interface. 3923 ObjCInterfaceDecl *Iface = cast_or_null<ObjCInterfaceDecl>( 3924 Importer.Import(D->getClassInterface())); 3925 if (!Iface) 3926 return nullptr; 3927 3928 // Import the superclass, if any. 3929 ObjCInterfaceDecl *Super = nullptr; 3930 if (D->getSuperClass()) { 3931 Super = cast_or_null<ObjCInterfaceDecl>( 3932 Importer.Import(D->getSuperClass())); 3933 if (!Super) 3934 return nullptr; 3935 } 3936 3937 ObjCImplementationDecl *Impl = Iface->getImplementation(); 3938 if (!Impl) { 3939 // We haven't imported an implementation yet. Create a new @implementation 3940 // now. 3941 Impl = ObjCImplementationDecl::Create(Importer.getToContext(), 3942 Importer.ImportContext(D->getDeclContext()), 3943 Iface, Super, 3944 Importer.Import(D->getLocation()), 3945 Importer.Import(D->getAtStartLoc()), 3946 Importer.Import(D->getSuperClassLoc()), 3947 Importer.Import(D->getIvarLBraceLoc()), 3948 Importer.Import(D->getIvarRBraceLoc())); 3949 3950 if (D->getDeclContext() != D->getLexicalDeclContext()) { 3951 DeclContext *LexicalDC 3952 = Importer.ImportContext(D->getLexicalDeclContext()); 3953 if (!LexicalDC) 3954 return nullptr; 3955 Impl->setLexicalDeclContext(LexicalDC); 3956 } 3957 3958 // Associate the implementation with the class it implements. 3959 Iface->setImplementation(Impl); 3960 Importer.Imported(D, Iface->getImplementation()); 3961 } else { 3962 Importer.Imported(D, Iface->getImplementation()); 3963 3964 // Verify that the existing @implementation has the same superclass. 3965 if ((Super && !Impl->getSuperClass()) || 3966 (!Super && Impl->getSuperClass()) || 3967 (Super && Impl->getSuperClass() && 3968 !declaresSameEntity(Super->getCanonicalDecl(), 3969 Impl->getSuperClass()))) { 3970 Importer.ToDiag(Impl->getLocation(), 3971 diag::err_odr_objc_superclass_inconsistent) 3972 << Iface->getDeclName(); 3973 // FIXME: It would be nice to have the location of the superclass 3974 // below. 3975 if (Impl->getSuperClass()) 3976 Importer.ToDiag(Impl->getLocation(), 3977 diag::note_odr_objc_superclass) 3978 << Impl->getSuperClass()->getDeclName(); 3979 else 3980 Importer.ToDiag(Impl->getLocation(), 3981 diag::note_odr_objc_missing_superclass); 3982 if (D->getSuperClass()) 3983 Importer.FromDiag(D->getLocation(), 3984 diag::note_odr_objc_superclass) 3985 << D->getSuperClass()->getDeclName(); 3986 else 3987 Importer.FromDiag(D->getLocation(), 3988 diag::note_odr_objc_missing_superclass); 3989 return nullptr; 3990 } 3991 } 3992 3993 // Import all of the members of this @implementation. 3994 ImportDeclContext(D); 3995 3996 return Impl; 3997 } 3998 3999 Decl *ASTNodeImporter::VisitObjCPropertyDecl(ObjCPropertyDecl *D) { 4000 // Import the major distinguishing characteristics of an @property. 4001 DeclContext *DC, *LexicalDC; 4002 DeclarationName Name; 4003 SourceLocation Loc; 4004 NamedDecl *ToD; 4005 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 4006 return nullptr; 4007 if (ToD) 4008 return ToD; 4009 4010 // Check whether we have already imported this property. 4011 SmallVector<NamedDecl *, 2> FoundDecls; 4012 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 4013 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 4014 if (ObjCPropertyDecl *FoundProp 4015 = dyn_cast<ObjCPropertyDecl>(FoundDecls[I])) { 4016 // Check property types. 4017 if (!Importer.IsStructurallyEquivalent(D->getType(), 4018 FoundProp->getType())) { 4019 Importer.ToDiag(Loc, diag::err_odr_objc_property_type_inconsistent) 4020 << Name << D->getType() << FoundProp->getType(); 4021 Importer.ToDiag(FoundProp->getLocation(), diag::note_odr_value_here) 4022 << FoundProp->getType(); 4023 return nullptr; 4024 } 4025 4026 // FIXME: Check property attributes, getters, setters, etc.? 4027 4028 // Consider these properties to be equivalent. 4029 Importer.Imported(D, FoundProp); 4030 return FoundProp; 4031 } 4032 } 4033 4034 // Import the type. 4035 TypeSourceInfo *TSI = Importer.Import(D->getTypeSourceInfo()); 4036 if (!TSI) 4037 return nullptr; 4038 4039 // Create the new property. 4040 ObjCPropertyDecl *ToProperty 4041 = ObjCPropertyDecl::Create(Importer.getToContext(), DC, Loc, 4042 Name.getAsIdentifierInfo(), 4043 Importer.Import(D->getAtLoc()), 4044 Importer.Import(D->getLParenLoc()), 4045 Importer.Import(D->getType()), 4046 TSI, 4047 D->getPropertyImplementation()); 4048 Importer.Imported(D, ToProperty); 4049 ToProperty->setLexicalDeclContext(LexicalDC); 4050 LexicalDC->addDeclInternal(ToProperty); 4051 4052 ToProperty->setPropertyAttributes(D->getPropertyAttributes()); 4053 ToProperty->setPropertyAttributesAsWritten( 4054 D->getPropertyAttributesAsWritten()); 4055 ToProperty->setGetterName(Importer.Import(D->getGetterName())); 4056 ToProperty->setSetterName(Importer.Import(D->getSetterName())); 4057 ToProperty->setGetterMethodDecl( 4058 cast_or_null<ObjCMethodDecl>(Importer.Import(D->getGetterMethodDecl()))); 4059 ToProperty->setSetterMethodDecl( 4060 cast_or_null<ObjCMethodDecl>(Importer.Import(D->getSetterMethodDecl()))); 4061 ToProperty->setPropertyIvarDecl( 4062 cast_or_null<ObjCIvarDecl>(Importer.Import(D->getPropertyIvarDecl()))); 4063 return ToProperty; 4064 } 4065 4066 Decl *ASTNodeImporter::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D) { 4067 ObjCPropertyDecl *Property = cast_or_null<ObjCPropertyDecl>( 4068 Importer.Import(D->getPropertyDecl())); 4069 if (!Property) 4070 return nullptr; 4071 4072 DeclContext *DC = Importer.ImportContext(D->getDeclContext()); 4073 if (!DC) 4074 return nullptr; 4075 4076 // Import the lexical declaration context. 4077 DeclContext *LexicalDC = DC; 4078 if (D->getDeclContext() != D->getLexicalDeclContext()) { 4079 LexicalDC = Importer.ImportContext(D->getLexicalDeclContext()); 4080 if (!LexicalDC) 4081 return nullptr; 4082 } 4083 4084 ObjCImplDecl *InImpl = dyn_cast<ObjCImplDecl>(LexicalDC); 4085 if (!InImpl) 4086 return nullptr; 4087 4088 // Import the ivar (for an @synthesize). 4089 ObjCIvarDecl *Ivar = nullptr; 4090 if (D->getPropertyIvarDecl()) { 4091 Ivar = cast_or_null<ObjCIvarDecl>( 4092 Importer.Import(D->getPropertyIvarDecl())); 4093 if (!Ivar) 4094 return nullptr; 4095 } 4096 4097 ObjCPropertyImplDecl *ToImpl 4098 = InImpl->FindPropertyImplDecl(Property->getIdentifier(), 4099 Property->getQueryKind()); 4100 if (!ToImpl) { 4101 ToImpl = ObjCPropertyImplDecl::Create(Importer.getToContext(), DC, 4102 Importer.Import(D->getLocStart()), 4103 Importer.Import(D->getLocation()), 4104 Property, 4105 D->getPropertyImplementation(), 4106 Ivar, 4107 Importer.Import(D->getPropertyIvarDeclLoc())); 4108 ToImpl->setLexicalDeclContext(LexicalDC); 4109 Importer.Imported(D, ToImpl); 4110 LexicalDC->addDeclInternal(ToImpl); 4111 } else { 4112 // Check that we have the same kind of property implementation (@synthesize 4113 // vs. @dynamic). 4114 if (D->getPropertyImplementation() != ToImpl->getPropertyImplementation()) { 4115 Importer.ToDiag(ToImpl->getLocation(), 4116 diag::err_odr_objc_property_impl_kind_inconsistent) 4117 << Property->getDeclName() 4118 << (ToImpl->getPropertyImplementation() 4119 == ObjCPropertyImplDecl::Dynamic); 4120 Importer.FromDiag(D->getLocation(), 4121 diag::note_odr_objc_property_impl_kind) 4122 << D->getPropertyDecl()->getDeclName() 4123 << (D->getPropertyImplementation() == ObjCPropertyImplDecl::Dynamic); 4124 return nullptr; 4125 } 4126 4127 // For @synthesize, check that we have the same 4128 if (D->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize && 4129 Ivar != ToImpl->getPropertyIvarDecl()) { 4130 Importer.ToDiag(ToImpl->getPropertyIvarDeclLoc(), 4131 diag::err_odr_objc_synthesize_ivar_inconsistent) 4132 << Property->getDeclName() 4133 << ToImpl->getPropertyIvarDecl()->getDeclName() 4134 << Ivar->getDeclName(); 4135 Importer.FromDiag(D->getPropertyIvarDeclLoc(), 4136 diag::note_odr_objc_synthesize_ivar_here) 4137 << D->getPropertyIvarDecl()->getDeclName(); 4138 return nullptr; 4139 } 4140 4141 // Merge the existing implementation with the new implementation. 4142 Importer.Imported(D, ToImpl); 4143 } 4144 4145 return ToImpl; 4146 } 4147 4148 Decl *ASTNodeImporter::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) { 4149 // For template arguments, we adopt the translation unit as our declaration 4150 // context. This context will be fixed when the actual template declaration 4151 // is created. 4152 4153 // FIXME: Import default argument. 4154 return TemplateTypeParmDecl::Create(Importer.getToContext(), 4155 Importer.getToContext().getTranslationUnitDecl(), 4156 Importer.Import(D->getLocStart()), 4157 Importer.Import(D->getLocation()), 4158 D->getDepth(), 4159 D->getIndex(), 4160 Importer.Import(D->getIdentifier()), 4161 D->wasDeclaredWithTypename(), 4162 D->isParameterPack()); 4163 } 4164 4165 Decl * 4166 ASTNodeImporter::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) { 4167 // Import the name of this declaration. 4168 DeclarationName Name = Importer.Import(D->getDeclName()); 4169 if (D->getDeclName() && !Name) 4170 return nullptr; 4171 4172 // Import the location of this declaration. 4173 SourceLocation Loc = Importer.Import(D->getLocation()); 4174 4175 // Import the type of this declaration. 4176 QualType T = Importer.Import(D->getType()); 4177 if (T.isNull()) 4178 return nullptr; 4179 4180 // Import type-source information. 4181 TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo()); 4182 if (D->getTypeSourceInfo() && !TInfo) 4183 return nullptr; 4184 4185 // FIXME: Import default argument. 4186 4187 return NonTypeTemplateParmDecl::Create(Importer.getToContext(), 4188 Importer.getToContext().getTranslationUnitDecl(), 4189 Importer.Import(D->getInnerLocStart()), 4190 Loc, D->getDepth(), D->getPosition(), 4191 Name.getAsIdentifierInfo(), 4192 T, D->isParameterPack(), TInfo); 4193 } 4194 4195 Decl * 4196 ASTNodeImporter::VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) { 4197 // Import the name of this declaration. 4198 DeclarationName Name = Importer.Import(D->getDeclName()); 4199 if (D->getDeclName() && !Name) 4200 return nullptr; 4201 4202 // Import the location of this declaration. 4203 SourceLocation Loc = Importer.Import(D->getLocation()); 4204 4205 // Import template parameters. 4206 TemplateParameterList *TemplateParams 4207 = ImportTemplateParameterList(D->getTemplateParameters()); 4208 if (!TemplateParams) 4209 return nullptr; 4210 4211 // FIXME: Import default argument. 4212 4213 return TemplateTemplateParmDecl::Create(Importer.getToContext(), 4214 Importer.getToContext().getTranslationUnitDecl(), 4215 Loc, D->getDepth(), D->getPosition(), 4216 D->isParameterPack(), 4217 Name.getAsIdentifierInfo(), 4218 TemplateParams); 4219 } 4220 4221 Decl *ASTNodeImporter::VisitClassTemplateDecl(ClassTemplateDecl *D) { 4222 // If this record has a definition in the translation unit we're coming from, 4223 // but this particular declaration is not that definition, import the 4224 // definition and map to that. 4225 CXXRecordDecl *Definition 4226 = cast_or_null<CXXRecordDecl>(D->getTemplatedDecl()->getDefinition()); 4227 if (Definition && Definition != D->getTemplatedDecl()) { 4228 Decl *ImportedDef 4229 = Importer.Import(Definition->getDescribedClassTemplate()); 4230 if (!ImportedDef) 4231 return nullptr; 4232 4233 return Importer.Imported(D, ImportedDef); 4234 } 4235 4236 // Import the major distinguishing characteristics of this class template. 4237 DeclContext *DC, *LexicalDC; 4238 DeclarationName Name; 4239 SourceLocation Loc; 4240 NamedDecl *ToD; 4241 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 4242 return nullptr; 4243 if (ToD) 4244 return ToD; 4245 4246 // We may already have a template of the same name; try to find and match it. 4247 if (!DC->isFunctionOrMethod()) { 4248 SmallVector<NamedDecl *, 4> ConflictingDecls; 4249 SmallVector<NamedDecl *, 2> FoundDecls; 4250 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 4251 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 4252 if (!FoundDecls[I]->isInIdentifierNamespace(Decl::IDNS_Ordinary)) 4253 continue; 4254 4255 Decl *Found = FoundDecls[I]; 4256 if (ClassTemplateDecl *FoundTemplate 4257 = dyn_cast<ClassTemplateDecl>(Found)) { 4258 if (IsStructuralMatch(D, FoundTemplate)) { 4259 // The class templates structurally match; call it the same template. 4260 // FIXME: We may be filling in a forward declaration here. Handle 4261 // this case! 4262 Importer.Imported(D->getTemplatedDecl(), 4263 FoundTemplate->getTemplatedDecl()); 4264 return Importer.Imported(D, FoundTemplate); 4265 } 4266 } 4267 4268 ConflictingDecls.push_back(FoundDecls[I]); 4269 } 4270 4271 if (!ConflictingDecls.empty()) { 4272 Name = Importer.HandleNameConflict(Name, DC, Decl::IDNS_Ordinary, 4273 ConflictingDecls.data(), 4274 ConflictingDecls.size()); 4275 } 4276 4277 if (!Name) 4278 return nullptr; 4279 } 4280 4281 CXXRecordDecl *DTemplated = D->getTemplatedDecl(); 4282 4283 // Create the declaration that is being templated. 4284 SourceLocation StartLoc = Importer.Import(DTemplated->getLocStart()); 4285 SourceLocation IdLoc = Importer.Import(DTemplated->getLocation()); 4286 CXXRecordDecl *D2Templated = CXXRecordDecl::Create(Importer.getToContext(), 4287 DTemplated->getTagKind(), 4288 DC, StartLoc, IdLoc, 4289 Name.getAsIdentifierInfo()); 4290 D2Templated->setAccess(DTemplated->getAccess()); 4291 D2Templated->setQualifierInfo(Importer.Import(DTemplated->getQualifierLoc())); 4292 D2Templated->setLexicalDeclContext(LexicalDC); 4293 4294 // Create the class template declaration itself. 4295 TemplateParameterList *TemplateParams 4296 = ImportTemplateParameterList(D->getTemplateParameters()); 4297 if (!TemplateParams) 4298 return nullptr; 4299 4300 ClassTemplateDecl *D2 = ClassTemplateDecl::Create(Importer.getToContext(), DC, 4301 Loc, Name, TemplateParams, 4302 D2Templated, 4303 /*PrevDecl=*/nullptr); 4304 D2Templated->setDescribedClassTemplate(D2); 4305 4306 D2->setAccess(D->getAccess()); 4307 D2->setLexicalDeclContext(LexicalDC); 4308 LexicalDC->addDeclInternal(D2); 4309 4310 // Note the relationship between the class templates. 4311 Importer.Imported(D, D2); 4312 Importer.Imported(DTemplated, D2Templated); 4313 4314 if (DTemplated->isCompleteDefinition() && 4315 !D2Templated->isCompleteDefinition()) { 4316 // FIXME: Import definition! 4317 } 4318 4319 return D2; 4320 } 4321 4322 Decl *ASTNodeImporter::VisitClassTemplateSpecializationDecl( 4323 ClassTemplateSpecializationDecl *D) { 4324 // If this record has a definition in the translation unit we're coming from, 4325 // but this particular declaration is not that definition, import the 4326 // definition and map to that. 4327 TagDecl *Definition = D->getDefinition(); 4328 if (Definition && Definition != D) { 4329 Decl *ImportedDef = Importer.Import(Definition); 4330 if (!ImportedDef) 4331 return nullptr; 4332 4333 return Importer.Imported(D, ImportedDef); 4334 } 4335 4336 ClassTemplateDecl *ClassTemplate 4337 = cast_or_null<ClassTemplateDecl>(Importer.Import( 4338 D->getSpecializedTemplate())); 4339 if (!ClassTemplate) 4340 return nullptr; 4341 4342 // Import the context of this declaration. 4343 DeclContext *DC = ClassTemplate->getDeclContext(); 4344 if (!DC) 4345 return nullptr; 4346 4347 DeclContext *LexicalDC = DC; 4348 if (D->getDeclContext() != D->getLexicalDeclContext()) { 4349 LexicalDC = Importer.ImportContext(D->getLexicalDeclContext()); 4350 if (!LexicalDC) 4351 return nullptr; 4352 } 4353 4354 // Import the location of this declaration. 4355 SourceLocation StartLoc = Importer.Import(D->getLocStart()); 4356 SourceLocation IdLoc = Importer.Import(D->getLocation()); 4357 4358 // Import template arguments. 4359 SmallVector<TemplateArgument, 2> TemplateArgs; 4360 if (ImportTemplateArguments(D->getTemplateArgs().data(), 4361 D->getTemplateArgs().size(), 4362 TemplateArgs)) 4363 return nullptr; 4364 4365 // Try to find an existing specialization with these template arguments. 4366 void *InsertPos = nullptr; 4367 ClassTemplateSpecializationDecl *D2 4368 = ClassTemplate->findSpecialization(TemplateArgs, InsertPos); 4369 if (D2) { 4370 // We already have a class template specialization with these template 4371 // arguments. 4372 4373 // FIXME: Check for specialization vs. instantiation errors. 4374 4375 if (RecordDecl *FoundDef = D2->getDefinition()) { 4376 if (!D->isCompleteDefinition() || IsStructuralMatch(D, FoundDef)) { 4377 // The record types structurally match, or the "from" translation 4378 // unit only had a forward declaration anyway; call it the same 4379 // function. 4380 return Importer.Imported(D, FoundDef); 4381 } 4382 } 4383 } else { 4384 // Create a new specialization. 4385 D2 = ClassTemplateSpecializationDecl::Create(Importer.getToContext(), 4386 D->getTagKind(), DC, 4387 StartLoc, IdLoc, 4388 ClassTemplate, 4389 TemplateArgs.data(), 4390 TemplateArgs.size(), 4391 /*PrevDecl=*/nullptr); 4392 D2->setSpecializationKind(D->getSpecializationKind()); 4393 4394 // Add this specialization to the class template. 4395 ClassTemplate->AddSpecialization(D2, InsertPos); 4396 4397 // Import the qualifier, if any. 4398 D2->setQualifierInfo(Importer.Import(D->getQualifierLoc())); 4399 4400 // Add the specialization to this context. 4401 D2->setLexicalDeclContext(LexicalDC); 4402 LexicalDC->addDeclInternal(D2); 4403 } 4404 Importer.Imported(D, D2); 4405 4406 if (D->isCompleteDefinition() && ImportDefinition(D, D2)) 4407 return nullptr; 4408 4409 return D2; 4410 } 4411 4412 Decl *ASTNodeImporter::VisitVarTemplateDecl(VarTemplateDecl *D) { 4413 // If this variable has a definition in the translation unit we're coming 4414 // from, 4415 // but this particular declaration is not that definition, import the 4416 // definition and map to that. 4417 VarDecl *Definition = 4418 cast_or_null<VarDecl>(D->getTemplatedDecl()->getDefinition()); 4419 if (Definition && Definition != D->getTemplatedDecl()) { 4420 Decl *ImportedDef = Importer.Import(Definition->getDescribedVarTemplate()); 4421 if (!ImportedDef) 4422 return nullptr; 4423 4424 return Importer.Imported(D, ImportedDef); 4425 } 4426 4427 // Import the major distinguishing characteristics of this variable template. 4428 DeclContext *DC, *LexicalDC; 4429 DeclarationName Name; 4430 SourceLocation Loc; 4431 NamedDecl *ToD; 4432 if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc)) 4433 return nullptr; 4434 if (ToD) 4435 return ToD; 4436 4437 // We may already have a template of the same name; try to find and match it. 4438 assert(!DC->isFunctionOrMethod() && 4439 "Variable templates cannot be declared at function scope"); 4440 SmallVector<NamedDecl *, 4> ConflictingDecls; 4441 SmallVector<NamedDecl *, 2> FoundDecls; 4442 DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls); 4443 for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) { 4444 if (!FoundDecls[I]->isInIdentifierNamespace(Decl::IDNS_Ordinary)) 4445 continue; 4446 4447 Decl *Found = FoundDecls[I]; 4448 if (VarTemplateDecl *FoundTemplate = dyn_cast<VarTemplateDecl>(Found)) { 4449 if (IsStructuralMatch(D, FoundTemplate)) { 4450 // The variable templates structurally match; call it the same template. 4451 Importer.Imported(D->getTemplatedDecl(), 4452 FoundTemplate->getTemplatedDecl()); 4453 return Importer.Imported(D, FoundTemplate); 4454 } 4455 } 4456 4457 ConflictingDecls.push_back(FoundDecls[I]); 4458 } 4459 4460 if (!ConflictingDecls.empty()) { 4461 Name = Importer.HandleNameConflict(Name, DC, Decl::IDNS_Ordinary, 4462 ConflictingDecls.data(), 4463 ConflictingDecls.size()); 4464 } 4465 4466 if (!Name) 4467 return nullptr; 4468 4469 VarDecl *DTemplated = D->getTemplatedDecl(); 4470 4471 // Import the type. 4472 QualType T = Importer.Import(DTemplated->getType()); 4473 if (T.isNull()) 4474 return nullptr; 4475 4476 // Create the declaration that is being templated. 4477 SourceLocation StartLoc = Importer.Import(DTemplated->getLocStart()); 4478 SourceLocation IdLoc = Importer.Import(DTemplated->getLocation()); 4479 TypeSourceInfo *TInfo = Importer.Import(DTemplated->getTypeSourceInfo()); 4480 VarDecl *D2Templated = VarDecl::Create(Importer.getToContext(), DC, StartLoc, 4481 IdLoc, Name.getAsIdentifierInfo(), T, 4482 TInfo, DTemplated->getStorageClass()); 4483 D2Templated->setAccess(DTemplated->getAccess()); 4484 D2Templated->setQualifierInfo(Importer.Import(DTemplated->getQualifierLoc())); 4485 D2Templated->setLexicalDeclContext(LexicalDC); 4486 4487 // Importer.Imported(DTemplated, D2Templated); 4488 // LexicalDC->addDeclInternal(D2Templated); 4489 4490 // Merge the initializer. 4491 if (ImportDefinition(DTemplated, D2Templated)) 4492 return nullptr; 4493 4494 // Create the variable template declaration itself. 4495 TemplateParameterList *TemplateParams = 4496 ImportTemplateParameterList(D->getTemplateParameters()); 4497 if (!TemplateParams) 4498 return nullptr; 4499 4500 VarTemplateDecl *D2 = VarTemplateDecl::Create( 4501 Importer.getToContext(), DC, Loc, Name, TemplateParams, D2Templated); 4502 D2Templated->setDescribedVarTemplate(D2); 4503 4504 D2->setAccess(D->getAccess()); 4505 D2->setLexicalDeclContext(LexicalDC); 4506 LexicalDC->addDeclInternal(D2); 4507 4508 // Note the relationship between the variable templates. 4509 Importer.Imported(D, D2); 4510 Importer.Imported(DTemplated, D2Templated); 4511 4512 if (DTemplated->isThisDeclarationADefinition() && 4513 !D2Templated->isThisDeclarationADefinition()) { 4514 // FIXME: Import definition! 4515 } 4516 4517 return D2; 4518 } 4519 4520 Decl *ASTNodeImporter::VisitVarTemplateSpecializationDecl( 4521 VarTemplateSpecializationDecl *D) { 4522 // If this record has a definition in the translation unit we're coming from, 4523 // but this particular declaration is not that definition, import the 4524 // definition and map to that. 4525 VarDecl *Definition = D->getDefinition(); 4526 if (Definition && Definition != D) { 4527 Decl *ImportedDef = Importer.Import(Definition); 4528 if (!ImportedDef) 4529 return nullptr; 4530 4531 return Importer.Imported(D, ImportedDef); 4532 } 4533 4534 VarTemplateDecl *VarTemplate = cast_or_null<VarTemplateDecl>( 4535 Importer.Import(D->getSpecializedTemplate())); 4536 if (!VarTemplate) 4537 return nullptr; 4538 4539 // Import the context of this declaration. 4540 DeclContext *DC = VarTemplate->getDeclContext(); 4541 if (!DC) 4542 return nullptr; 4543 4544 DeclContext *LexicalDC = DC; 4545 if (D->getDeclContext() != D->getLexicalDeclContext()) { 4546 LexicalDC = Importer.ImportContext(D->getLexicalDeclContext()); 4547 if (!LexicalDC) 4548 return nullptr; 4549 } 4550 4551 // Import the location of this declaration. 4552 SourceLocation StartLoc = Importer.Import(D->getLocStart()); 4553 SourceLocation IdLoc = Importer.Import(D->getLocation()); 4554 4555 // Import template arguments. 4556 SmallVector<TemplateArgument, 2> TemplateArgs; 4557 if (ImportTemplateArguments(D->getTemplateArgs().data(), 4558 D->getTemplateArgs().size(), TemplateArgs)) 4559 return nullptr; 4560 4561 // Try to find an existing specialization with these template arguments. 4562 void *InsertPos = nullptr; 4563 VarTemplateSpecializationDecl *D2 = VarTemplate->findSpecialization( 4564 TemplateArgs, InsertPos); 4565 if (D2) { 4566 // We already have a variable template specialization with these template 4567 // arguments. 4568 4569 // FIXME: Check for specialization vs. instantiation errors. 4570 4571 if (VarDecl *FoundDef = D2->getDefinition()) { 4572 if (!D->isThisDeclarationADefinition() || 4573 IsStructuralMatch(D, FoundDef)) { 4574 // The record types structurally match, or the "from" translation 4575 // unit only had a forward declaration anyway; call it the same 4576 // variable. 4577 return Importer.Imported(D, FoundDef); 4578 } 4579 } 4580 } else { 4581 4582 // Import the type. 4583 QualType T = Importer.Import(D->getType()); 4584 if (T.isNull()) 4585 return nullptr; 4586 TypeSourceInfo *TInfo = Importer.Import(D->getTypeSourceInfo()); 4587 4588 // Create a new specialization. 4589 D2 = VarTemplateSpecializationDecl::Create( 4590 Importer.getToContext(), DC, StartLoc, IdLoc, VarTemplate, T, TInfo, 4591 D->getStorageClass(), TemplateArgs.data(), TemplateArgs.size()); 4592 D2->setSpecializationKind(D->getSpecializationKind()); 4593 D2->setTemplateArgsInfo(D->getTemplateArgsInfo()); 4594 4595 // Add this specialization to the class template. 4596 VarTemplate->AddSpecialization(D2, InsertPos); 4597 4598 // Import the qualifier, if any. 4599 D2->setQualifierInfo(Importer.Import(D->getQualifierLoc())); 4600 4601 // Add the specialization to this context. 4602 D2->setLexicalDeclContext(LexicalDC); 4603 LexicalDC->addDeclInternal(D2); 4604 } 4605 Importer.Imported(D, D2); 4606 4607 if (D->isThisDeclarationADefinition() && ImportDefinition(D, D2)) 4608 return nullptr; 4609 4610 return D2; 4611 } 4612 4613 //---------------------------------------------------------------------------- 4614 // Import Statements 4615 //---------------------------------------------------------------------------- 4616 4617 DeclGroupRef ASTNodeImporter::ImportDeclGroup(DeclGroupRef DG) { 4618 if (DG.isNull()) 4619 return DeclGroupRef::Create(Importer.getToContext(), nullptr, 0); 4620 size_t NumDecls = DG.end() - DG.begin(); 4621 SmallVector<Decl *, 1> ToDecls(NumDecls); 4622 auto &_Importer = this->Importer; 4623 std::transform(DG.begin(), DG.end(), ToDecls.begin(), 4624 [&_Importer](Decl *D) -> Decl * { 4625 return _Importer.Import(D); 4626 }); 4627 return DeclGroupRef::Create(Importer.getToContext(), 4628 ToDecls.begin(), 4629 NumDecls); 4630 } 4631 4632 Stmt *ASTNodeImporter::VisitStmt(Stmt *S) { 4633 Importer.FromDiag(S->getLocStart(), diag::err_unsupported_ast_node) 4634 << S->getStmtClassName(); 4635 return nullptr; 4636 } 4637 4638 Stmt *ASTNodeImporter::VisitDeclStmt(DeclStmt *S) { 4639 DeclGroupRef ToDG = ImportDeclGroup(S->getDeclGroup()); 4640 for (Decl *ToD : ToDG) { 4641 if (!ToD) 4642 return nullptr; 4643 } 4644 SourceLocation ToStartLoc = Importer.Import(S->getStartLoc()); 4645 SourceLocation ToEndLoc = Importer.Import(S->getEndLoc()); 4646 return new (Importer.getToContext()) DeclStmt(ToDG, ToStartLoc, ToEndLoc); 4647 } 4648 4649 Stmt *ASTNodeImporter::VisitNullStmt(NullStmt *S) { 4650 SourceLocation ToSemiLoc = Importer.Import(S->getSemiLoc()); 4651 return new (Importer.getToContext()) NullStmt(ToSemiLoc, 4652 S->hasLeadingEmptyMacro()); 4653 } 4654 4655 Stmt *ASTNodeImporter::VisitCompoundStmt(CompoundStmt *S) { 4656 SmallVector<Stmt *, 4> ToStmts(S->size()); 4657 auto &_Importer = this->Importer; 4658 std::transform(S->body_begin(), S->body_end(), ToStmts.begin(), 4659 [&_Importer](Stmt *CS) -> Stmt * { 4660 return _Importer.Import(CS); 4661 }); 4662 for (Stmt *ToS : ToStmts) { 4663 if (!ToS) 4664 return nullptr; 4665 } 4666 SourceLocation ToLBraceLoc = Importer.Import(S->getLBracLoc()); 4667 SourceLocation ToRBraceLoc = Importer.Import(S->getRBracLoc()); 4668 return new (Importer.getToContext()) CompoundStmt(Importer.getToContext(), 4669 ToStmts, 4670 ToLBraceLoc, ToRBraceLoc); 4671 } 4672 4673 Stmt *ASTNodeImporter::VisitCaseStmt(CaseStmt *S) { 4674 Expr *ToLHS = Importer.Import(S->getLHS()); 4675 if (!ToLHS) 4676 return nullptr; 4677 Expr *ToRHS = Importer.Import(S->getRHS()); 4678 if (!ToRHS && S->getRHS()) 4679 return nullptr; 4680 SourceLocation ToCaseLoc = Importer.Import(S->getCaseLoc()); 4681 SourceLocation ToEllipsisLoc = Importer.Import(S->getEllipsisLoc()); 4682 SourceLocation ToColonLoc = Importer.Import(S->getColonLoc()); 4683 return new (Importer.getToContext()) CaseStmt(ToLHS, ToRHS, 4684 ToCaseLoc, ToEllipsisLoc, 4685 ToColonLoc); 4686 } 4687 4688 Stmt *ASTNodeImporter::VisitDefaultStmt(DefaultStmt *S) { 4689 SourceLocation ToDefaultLoc = Importer.Import(S->getDefaultLoc()); 4690 SourceLocation ToColonLoc = Importer.Import(S->getColonLoc()); 4691 Stmt *ToSubStmt = Importer.Import(S->getSubStmt()); 4692 if (!ToSubStmt && S->getSubStmt()) 4693 return nullptr; 4694 return new (Importer.getToContext()) DefaultStmt(ToDefaultLoc, ToColonLoc, 4695 ToSubStmt); 4696 } 4697 4698 Stmt *ASTNodeImporter::VisitLabelStmt(LabelStmt *S) { 4699 SourceLocation ToIdentLoc = Importer.Import(S->getIdentLoc()); 4700 LabelDecl *ToLabelDecl = 4701 cast_or_null<LabelDecl>(Importer.Import(S->getDecl())); 4702 if (!ToLabelDecl && S->getDecl()) 4703 return nullptr; 4704 Stmt *ToSubStmt = Importer.Import(S->getSubStmt()); 4705 if (!ToSubStmt && S->getSubStmt()) 4706 return nullptr; 4707 return new (Importer.getToContext()) LabelStmt(ToIdentLoc, ToLabelDecl, 4708 ToSubStmt); 4709 } 4710 4711 Stmt *ASTNodeImporter::VisitAttributedStmt(AttributedStmt *S) { 4712 SourceLocation ToAttrLoc = Importer.Import(S->getAttrLoc()); 4713 ArrayRef<const Attr*> FromAttrs(S->getAttrs()); 4714 SmallVector<const Attr *, 1> ToAttrs(FromAttrs.size()); 4715 ASTContext &_ToContext = Importer.getToContext(); 4716 std::transform(FromAttrs.begin(), FromAttrs.end(), ToAttrs.begin(), 4717 [&_ToContext](const Attr *A) -> const Attr * { 4718 return A->clone(_ToContext); 4719 }); 4720 for (const Attr *ToA : ToAttrs) { 4721 if (!ToA) 4722 return nullptr; 4723 } 4724 Stmt *ToSubStmt = Importer.Import(S->getSubStmt()); 4725 if (!ToSubStmt && S->getSubStmt()) 4726 return nullptr; 4727 return AttributedStmt::Create(Importer.getToContext(), ToAttrLoc, 4728 ToAttrs, ToSubStmt); 4729 } 4730 4731 Stmt *ASTNodeImporter::VisitIfStmt(IfStmt *S) { 4732 SourceLocation ToIfLoc = Importer.Import(S->getIfLoc()); 4733 VarDecl *ToConditionVariable = nullptr; 4734 if (VarDecl *FromConditionVariable = S->getConditionVariable()) { 4735 ToConditionVariable = 4736 dyn_cast_or_null<VarDecl>(Importer.Import(FromConditionVariable)); 4737 if (!ToConditionVariable) 4738 return nullptr; 4739 } 4740 Expr *ToCondition = Importer.Import(S->getCond()); 4741 if (!ToCondition && S->getCond()) 4742 return nullptr; 4743 Stmt *ToThenStmt = Importer.Import(S->getThen()); 4744 if (!ToThenStmt && S->getThen()) 4745 return nullptr; 4746 SourceLocation ToElseLoc = Importer.Import(S->getElseLoc()); 4747 Stmt *ToElseStmt = Importer.Import(S->getElse()); 4748 if (!ToElseStmt && S->getElse()) 4749 return nullptr; 4750 return new (Importer.getToContext()) IfStmt(Importer.getToContext(), 4751 ToIfLoc, ToConditionVariable, 4752 ToCondition, ToThenStmt, 4753 ToElseLoc, ToElseStmt); 4754 } 4755 4756 Stmt *ASTNodeImporter::VisitSwitchStmt(SwitchStmt *S) { 4757 VarDecl *ToConditionVariable = nullptr; 4758 if (VarDecl *FromConditionVariable = S->getConditionVariable()) { 4759 ToConditionVariable = 4760 dyn_cast_or_null<VarDecl>(Importer.Import(FromConditionVariable)); 4761 if (!ToConditionVariable) 4762 return nullptr; 4763 } 4764 Expr *ToCondition = Importer.Import(S->getCond()); 4765 if (!ToCondition && S->getCond()) 4766 return nullptr; 4767 SwitchStmt *ToStmt = new (Importer.getToContext()) SwitchStmt( 4768 Importer.getToContext(), ToConditionVariable, 4769 ToCondition); 4770 Stmt *ToBody = Importer.Import(S->getBody()); 4771 if (!ToBody && S->getBody()) 4772 return nullptr; 4773 ToStmt->setBody(ToBody); 4774 ToStmt->setSwitchLoc(Importer.Import(S->getSwitchLoc())); 4775 // Now we have to re-chain the cases. 4776 SwitchCase *LastChainedSwitchCase = nullptr; 4777 for (SwitchCase *SC = S->getSwitchCaseList(); SC != nullptr; 4778 SC = SC->getNextSwitchCase()) { 4779 SwitchCase *ToSC = dyn_cast_or_null<SwitchCase>(Importer.Import(SC)); 4780 if (!ToSC) 4781 return nullptr; 4782 if (LastChainedSwitchCase) 4783 LastChainedSwitchCase->setNextSwitchCase(ToSC); 4784 else 4785 ToStmt->setSwitchCaseList(ToSC); 4786 LastChainedSwitchCase = ToSC; 4787 } 4788 return ToStmt; 4789 } 4790 4791 Stmt *ASTNodeImporter::VisitWhileStmt(WhileStmt *S) { 4792 VarDecl *ToConditionVariable = nullptr; 4793 if (VarDecl *FromConditionVariable = S->getConditionVariable()) { 4794 ToConditionVariable = 4795 dyn_cast_or_null<VarDecl>(Importer.Import(FromConditionVariable)); 4796 if (!ToConditionVariable) 4797 return nullptr; 4798 } 4799 Expr *ToCondition = Importer.Import(S->getCond()); 4800 if (!ToCondition && S->getCond()) 4801 return nullptr; 4802 Stmt *ToBody = Importer.Import(S->getBody()); 4803 if (!ToBody && S->getBody()) 4804 return nullptr; 4805 SourceLocation ToWhileLoc = Importer.Import(S->getWhileLoc()); 4806 return new (Importer.getToContext()) WhileStmt(Importer.getToContext(), 4807 ToConditionVariable, 4808 ToCondition, ToBody, 4809 ToWhileLoc); 4810 } 4811 4812 Stmt *ASTNodeImporter::VisitDoStmt(DoStmt *S) { 4813 Stmt *ToBody = Importer.Import(S->getBody()); 4814 if (!ToBody && S->getBody()) 4815 return nullptr; 4816 Expr *ToCondition = Importer.Import(S->getCond()); 4817 if (!ToCondition && S->getCond()) 4818 return nullptr; 4819 SourceLocation ToDoLoc = Importer.Import(S->getDoLoc()); 4820 SourceLocation ToWhileLoc = Importer.Import(S->getWhileLoc()); 4821 SourceLocation ToRParenLoc = Importer.Import(S->getRParenLoc()); 4822 return new (Importer.getToContext()) DoStmt(ToBody, ToCondition, 4823 ToDoLoc, ToWhileLoc, 4824 ToRParenLoc); 4825 } 4826 4827 Stmt *ASTNodeImporter::VisitForStmt(ForStmt *S) { 4828 Stmt *ToInit = Importer.Import(S->getInit()); 4829 if (!ToInit && S->getInit()) 4830 return nullptr; 4831 Expr *ToCondition = Importer.Import(S->getCond()); 4832 if (!ToCondition && S->getCond()) 4833 return nullptr; 4834 VarDecl *ToConditionVariable = nullptr; 4835 if (VarDecl *FromConditionVariable = S->getConditionVariable()) { 4836 ToConditionVariable = 4837 dyn_cast_or_null<VarDecl>(Importer.Import(FromConditionVariable)); 4838 if (!ToConditionVariable) 4839 return nullptr; 4840 } 4841 Expr *ToInc = Importer.Import(S->getInc()); 4842 if (!ToInc && S->getInc()) 4843 return nullptr; 4844 Stmt *ToBody = Importer.Import(S->getBody()); 4845 if (!ToBody && S->getBody()) 4846 return nullptr; 4847 SourceLocation ToForLoc = Importer.Import(S->getForLoc()); 4848 SourceLocation ToLParenLoc = Importer.Import(S->getLParenLoc()); 4849 SourceLocation ToRParenLoc = Importer.Import(S->getRParenLoc()); 4850 return new (Importer.getToContext()) ForStmt(Importer.getToContext(), 4851 ToInit, ToCondition, 4852 ToConditionVariable, 4853 ToInc, ToBody, 4854 ToForLoc, ToLParenLoc, 4855 ToRParenLoc); 4856 } 4857 4858 Stmt *ASTNodeImporter::VisitGotoStmt(GotoStmt *S) { 4859 LabelDecl *ToLabel = nullptr; 4860 if (LabelDecl *FromLabel = S->getLabel()) { 4861 ToLabel = dyn_cast_or_null<LabelDecl>(Importer.Import(FromLabel)); 4862 if (!ToLabel) 4863 return nullptr; 4864 } 4865 SourceLocation ToGotoLoc = Importer.Import(S->getGotoLoc()); 4866 SourceLocation ToLabelLoc = Importer.Import(S->getLabelLoc()); 4867 return new (Importer.getToContext()) GotoStmt(ToLabel, 4868 ToGotoLoc, ToLabelLoc); 4869 } 4870 4871 Stmt *ASTNodeImporter::VisitIndirectGotoStmt(IndirectGotoStmt *S) { 4872 SourceLocation ToGotoLoc = Importer.Import(S->getGotoLoc()); 4873 SourceLocation ToStarLoc = Importer.Import(S->getStarLoc()); 4874 Expr *ToTarget = Importer.Import(S->getTarget()); 4875 if (!ToTarget && S->getTarget()) 4876 return nullptr; 4877 return new (Importer.getToContext()) IndirectGotoStmt(ToGotoLoc, ToStarLoc, 4878 ToTarget); 4879 } 4880 4881 Stmt *ASTNodeImporter::VisitContinueStmt(ContinueStmt *S) { 4882 SourceLocation ToContinueLoc = Importer.Import(S->getContinueLoc()); 4883 return new (Importer.getToContext()) ContinueStmt(ToContinueLoc); 4884 } 4885 4886 Stmt *ASTNodeImporter::VisitBreakStmt(BreakStmt *S) { 4887 SourceLocation ToBreakLoc = Importer.Import(S->getBreakLoc()); 4888 return new (Importer.getToContext()) BreakStmt(ToBreakLoc); 4889 } 4890 4891 Stmt *ASTNodeImporter::VisitReturnStmt(ReturnStmt *S) { 4892 SourceLocation ToRetLoc = Importer.Import(S->getReturnLoc()); 4893 Expr *ToRetExpr = Importer.Import(S->getRetValue()); 4894 if (!ToRetExpr && S->getRetValue()) 4895 return nullptr; 4896 VarDecl *NRVOCandidate = const_cast<VarDecl*>(S->getNRVOCandidate()); 4897 VarDecl *ToNRVOCandidate = cast_or_null<VarDecl>(Importer.Import(NRVOCandidate)); 4898 if (!ToNRVOCandidate && NRVOCandidate) 4899 return nullptr; 4900 return new (Importer.getToContext()) ReturnStmt(ToRetLoc, ToRetExpr, 4901 ToNRVOCandidate); 4902 } 4903 4904 Stmt *ASTNodeImporter::VisitCXXCatchStmt(CXXCatchStmt *S) { 4905 SourceLocation ToCatchLoc = Importer.Import(S->getCatchLoc()); 4906 VarDecl *ToExceptionDecl = nullptr; 4907 if (VarDecl *FromExceptionDecl = S->getExceptionDecl()) { 4908 ToExceptionDecl = 4909 dyn_cast_or_null<VarDecl>(Importer.Import(FromExceptionDecl)); 4910 if (!ToExceptionDecl) 4911 return nullptr; 4912 } 4913 Stmt *ToHandlerBlock = Importer.Import(S->getHandlerBlock()); 4914 if (!ToHandlerBlock && S->getHandlerBlock()) 4915 return nullptr; 4916 return new (Importer.getToContext()) CXXCatchStmt(ToCatchLoc, 4917 ToExceptionDecl, 4918 ToHandlerBlock); 4919 } 4920 4921 Stmt *ASTNodeImporter::VisitCXXTryStmt(CXXTryStmt *S) { 4922 SourceLocation ToTryLoc = Importer.Import(S->getTryLoc()); 4923 Stmt *ToTryBlock = Importer.Import(S->getTryBlock()); 4924 if (!ToTryBlock && S->getTryBlock()) 4925 return nullptr; 4926 SmallVector<Stmt *, 1> ToHandlers(S->getNumHandlers()); 4927 for (unsigned HI = 0, HE = S->getNumHandlers(); HI != HE; ++HI) { 4928 CXXCatchStmt *FromHandler = S->getHandler(HI); 4929 if (Stmt *ToHandler = Importer.Import(FromHandler)) 4930 ToHandlers[HI] = ToHandler; 4931 else 4932 return nullptr; 4933 } 4934 return CXXTryStmt::Create(Importer.getToContext(), ToTryLoc, ToTryBlock, 4935 ToHandlers); 4936 } 4937 4938 Stmt *ASTNodeImporter::VisitCXXForRangeStmt(CXXForRangeStmt *S) { 4939 DeclStmt *ToRange = 4940 dyn_cast_or_null<DeclStmt>(Importer.Import(S->getRangeStmt())); 4941 if (!ToRange && S->getRangeStmt()) 4942 return nullptr; 4943 DeclStmt *ToBegin = 4944 dyn_cast_or_null<DeclStmt>(Importer.Import(S->getBeginStmt())); 4945 if (!ToBegin && S->getBeginStmt()) 4946 return nullptr; 4947 DeclStmt *ToEnd = 4948 dyn_cast_or_null<DeclStmt>(Importer.Import(S->getEndStmt())); 4949 if (!ToEnd && S->getEndStmt()) 4950 return nullptr; 4951 Expr *ToCond = Importer.Import(S->getCond()); 4952 if (!ToCond && S->getCond()) 4953 return nullptr; 4954 Expr *ToInc = Importer.Import(S->getInc()); 4955 if (!ToInc && S->getInc()) 4956 return nullptr; 4957 DeclStmt *ToLoopVar = 4958 dyn_cast_or_null<DeclStmt>(Importer.Import(S->getLoopVarStmt())); 4959 if (!ToLoopVar && S->getLoopVarStmt()) 4960 return nullptr; 4961 Stmt *ToBody = Importer.Import(S->getBody()); 4962 if (!ToBody && S->getBody()) 4963 return nullptr; 4964 SourceLocation ToForLoc = Importer.Import(S->getForLoc()); 4965 SourceLocation ToCoawaitLoc = Importer.Import(S->getCoawaitLoc()); 4966 SourceLocation ToColonLoc = Importer.Import(S->getColonLoc()); 4967 SourceLocation ToRParenLoc = Importer.Import(S->getRParenLoc()); 4968 return new (Importer.getToContext()) CXXForRangeStmt(ToRange, ToBegin, ToEnd, 4969 ToCond, ToInc, 4970 ToLoopVar, ToBody, 4971 ToForLoc, ToCoawaitLoc, 4972 ToColonLoc, ToRParenLoc); 4973 } 4974 4975 Stmt *ASTNodeImporter::VisitObjCForCollectionStmt(ObjCForCollectionStmt *S) { 4976 Stmt *ToElem = Importer.Import(S->getElement()); 4977 if (!ToElem && S->getElement()) 4978 return nullptr; 4979 Expr *ToCollect = Importer.Import(S->getCollection()); 4980 if (!ToCollect && S->getCollection()) 4981 return nullptr; 4982 Stmt *ToBody = Importer.Import(S->getBody()); 4983 if (!ToBody && S->getBody()) 4984 return nullptr; 4985 SourceLocation ToForLoc = Importer.Import(S->getForLoc()); 4986 SourceLocation ToRParenLoc = Importer.Import(S->getRParenLoc()); 4987 return new (Importer.getToContext()) ObjCForCollectionStmt(ToElem, 4988 ToCollect, 4989 ToBody, ToForLoc, 4990 ToRParenLoc); 4991 } 4992 4993 Stmt *ASTNodeImporter::VisitObjCAtCatchStmt(ObjCAtCatchStmt *S) { 4994 SourceLocation ToAtCatchLoc = Importer.Import(S->getAtCatchLoc()); 4995 SourceLocation ToRParenLoc = Importer.Import(S->getRParenLoc()); 4996 VarDecl *ToExceptionDecl = nullptr; 4997 if (VarDecl *FromExceptionDecl = S->getCatchParamDecl()) { 4998 ToExceptionDecl = 4999 dyn_cast_or_null<VarDecl>(Importer.Import(FromExceptionDecl)); 5000 if (!ToExceptionDecl) 5001 return nullptr; 5002 } 5003 Stmt *ToBody = Importer.Import(S->getCatchBody()); 5004 if (!ToBody && S->getCatchBody()) 5005 return nullptr; 5006 return new (Importer.getToContext()) ObjCAtCatchStmt(ToAtCatchLoc, 5007 ToRParenLoc, 5008 ToExceptionDecl, 5009 ToBody); 5010 } 5011 5012 Stmt *ASTNodeImporter::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 5013 SourceLocation ToAtFinallyLoc = Importer.Import(S->getAtFinallyLoc()); 5014 Stmt *ToAtFinallyStmt = Importer.Import(S->getFinallyBody()); 5015 if (!ToAtFinallyStmt && S->getFinallyBody()) 5016 return nullptr; 5017 return new (Importer.getToContext()) ObjCAtFinallyStmt(ToAtFinallyLoc, 5018 ToAtFinallyStmt); 5019 } 5020 5021 Stmt *ASTNodeImporter::VisitObjCAtTryStmt(ObjCAtTryStmt *S) { 5022 SourceLocation ToAtTryLoc = Importer.Import(S->getAtTryLoc()); 5023 Stmt *ToAtTryStmt = Importer.Import(S->getTryBody()); 5024 if (!ToAtTryStmt && S->getTryBody()) 5025 return nullptr; 5026 SmallVector<Stmt *, 1> ToCatchStmts(S->getNumCatchStmts()); 5027 for (unsigned CI = 0, CE = S->getNumCatchStmts(); CI != CE; ++CI) { 5028 ObjCAtCatchStmt *FromCatchStmt = S->getCatchStmt(CI); 5029 if (Stmt *ToCatchStmt = Importer.Import(FromCatchStmt)) 5030 ToCatchStmts[CI] = ToCatchStmt; 5031 else 5032 return nullptr; 5033 } 5034 Stmt *ToAtFinallyStmt = Importer.Import(S->getFinallyStmt()); 5035 if (!ToAtFinallyStmt && S->getFinallyStmt()) 5036 return nullptr; 5037 return ObjCAtTryStmt::Create(Importer.getToContext(), 5038 ToAtTryLoc, ToAtTryStmt, 5039 ToCatchStmts.begin(), ToCatchStmts.size(), 5040 ToAtFinallyStmt); 5041 } 5042 5043 Stmt *ASTNodeImporter::VisitObjCAtSynchronizedStmt 5044 (ObjCAtSynchronizedStmt *S) { 5045 SourceLocation ToAtSynchronizedLoc = 5046 Importer.Import(S->getAtSynchronizedLoc()); 5047 Expr *ToSynchExpr = Importer.Import(S->getSynchExpr()); 5048 if (!ToSynchExpr && S->getSynchExpr()) 5049 return nullptr; 5050 Stmt *ToSynchBody = Importer.Import(S->getSynchBody()); 5051 if (!ToSynchBody && S->getSynchBody()) 5052 return nullptr; 5053 return new (Importer.getToContext()) ObjCAtSynchronizedStmt( 5054 ToAtSynchronizedLoc, ToSynchExpr, ToSynchBody); 5055 } 5056 5057 Stmt *ASTNodeImporter::VisitObjCAtThrowStmt(ObjCAtThrowStmt *S) { 5058 SourceLocation ToAtThrowLoc = Importer.Import(S->getThrowLoc()); 5059 Expr *ToThrow = Importer.Import(S->getThrowExpr()); 5060 if (!ToThrow && S->getThrowExpr()) 5061 return nullptr; 5062 return new (Importer.getToContext()) ObjCAtThrowStmt(ToAtThrowLoc, ToThrow); 5063 } 5064 5065 Stmt *ASTNodeImporter::VisitObjCAutoreleasePoolStmt 5066 (ObjCAutoreleasePoolStmt *S) { 5067 SourceLocation ToAtLoc = Importer.Import(S->getAtLoc()); 5068 Stmt *ToSubStmt = Importer.Import(S->getSubStmt()); 5069 if (!ToSubStmt && S->getSubStmt()) 5070 return nullptr; 5071 return new (Importer.getToContext()) ObjCAutoreleasePoolStmt(ToAtLoc, 5072 ToSubStmt); 5073 } 5074 5075 //---------------------------------------------------------------------------- 5076 // Import Expressions 5077 //---------------------------------------------------------------------------- 5078 Expr *ASTNodeImporter::VisitExpr(Expr *E) { 5079 Importer.FromDiag(E->getLocStart(), diag::err_unsupported_ast_node) 5080 << E->getStmtClassName(); 5081 return nullptr; 5082 } 5083 5084 Expr *ASTNodeImporter::VisitDeclRefExpr(DeclRefExpr *E) { 5085 ValueDecl *ToD = cast_or_null<ValueDecl>(Importer.Import(E->getDecl())); 5086 if (!ToD) 5087 return nullptr; 5088 5089 NamedDecl *FoundD = nullptr; 5090 if (E->getDecl() != E->getFoundDecl()) { 5091 FoundD = cast_or_null<NamedDecl>(Importer.Import(E->getFoundDecl())); 5092 if (!FoundD) 5093 return nullptr; 5094 } 5095 5096 QualType T = Importer.Import(E->getType()); 5097 if (T.isNull()) 5098 return nullptr; 5099 5100 DeclRefExpr *DRE = DeclRefExpr::Create(Importer.getToContext(), 5101 Importer.Import(E->getQualifierLoc()), 5102 Importer.Import(E->getTemplateKeywordLoc()), 5103 ToD, 5104 E->refersToEnclosingVariableOrCapture(), 5105 Importer.Import(E->getLocation()), 5106 T, E->getValueKind(), 5107 FoundD, 5108 /*FIXME:TemplateArgs=*/nullptr); 5109 if (E->hadMultipleCandidates()) 5110 DRE->setHadMultipleCandidates(true); 5111 return DRE; 5112 } 5113 5114 Expr *ASTNodeImporter::VisitIntegerLiteral(IntegerLiteral *E) { 5115 QualType T = Importer.Import(E->getType()); 5116 if (T.isNull()) 5117 return nullptr; 5118 5119 return IntegerLiteral::Create(Importer.getToContext(), 5120 E->getValue(), T, 5121 Importer.Import(E->getLocation())); 5122 } 5123 5124 Expr *ASTNodeImporter::VisitCharacterLiteral(CharacterLiteral *E) { 5125 QualType T = Importer.Import(E->getType()); 5126 if (T.isNull()) 5127 return nullptr; 5128 5129 return new (Importer.getToContext()) CharacterLiteral(E->getValue(), 5130 E->getKind(), T, 5131 Importer.Import(E->getLocation())); 5132 } 5133 5134 Expr *ASTNodeImporter::VisitParenExpr(ParenExpr *E) { 5135 Expr *SubExpr = Importer.Import(E->getSubExpr()); 5136 if (!SubExpr) 5137 return nullptr; 5138 5139 return new (Importer.getToContext()) 5140 ParenExpr(Importer.Import(E->getLParen()), 5141 Importer.Import(E->getRParen()), 5142 SubExpr); 5143 } 5144 5145 Expr *ASTNodeImporter::VisitUnaryOperator(UnaryOperator *E) { 5146 QualType T = Importer.Import(E->getType()); 5147 if (T.isNull()) 5148 return nullptr; 5149 5150 Expr *SubExpr = Importer.Import(E->getSubExpr()); 5151 if (!SubExpr) 5152 return nullptr; 5153 5154 return new (Importer.getToContext()) UnaryOperator(SubExpr, E->getOpcode(), 5155 T, E->getValueKind(), 5156 E->getObjectKind(), 5157 Importer.Import(E->getOperatorLoc())); 5158 } 5159 5160 Expr *ASTNodeImporter::VisitUnaryExprOrTypeTraitExpr( 5161 UnaryExprOrTypeTraitExpr *E) { 5162 QualType ResultType = Importer.Import(E->getType()); 5163 5164 if (E->isArgumentType()) { 5165 TypeSourceInfo *TInfo = Importer.Import(E->getArgumentTypeInfo()); 5166 if (!TInfo) 5167 return nullptr; 5168 5169 return new (Importer.getToContext()) UnaryExprOrTypeTraitExpr(E->getKind(), 5170 TInfo, ResultType, 5171 Importer.Import(E->getOperatorLoc()), 5172 Importer.Import(E->getRParenLoc())); 5173 } 5174 5175 Expr *SubExpr = Importer.Import(E->getArgumentExpr()); 5176 if (!SubExpr) 5177 return nullptr; 5178 5179 return new (Importer.getToContext()) UnaryExprOrTypeTraitExpr(E->getKind(), 5180 SubExpr, ResultType, 5181 Importer.Import(E->getOperatorLoc()), 5182 Importer.Import(E->getRParenLoc())); 5183 } 5184 5185 Expr *ASTNodeImporter::VisitBinaryOperator(BinaryOperator *E) { 5186 QualType T = Importer.Import(E->getType()); 5187 if (T.isNull()) 5188 return nullptr; 5189 5190 Expr *LHS = Importer.Import(E->getLHS()); 5191 if (!LHS) 5192 return nullptr; 5193 5194 Expr *RHS = Importer.Import(E->getRHS()); 5195 if (!RHS) 5196 return nullptr; 5197 5198 return new (Importer.getToContext()) BinaryOperator(LHS, RHS, E->getOpcode(), 5199 T, E->getValueKind(), 5200 E->getObjectKind(), 5201 Importer.Import(E->getOperatorLoc()), 5202 E->isFPContractable()); 5203 } 5204 5205 Expr *ASTNodeImporter::VisitCompoundAssignOperator(CompoundAssignOperator *E) { 5206 QualType T = Importer.Import(E->getType()); 5207 if (T.isNull()) 5208 return nullptr; 5209 5210 QualType CompLHSType = Importer.Import(E->getComputationLHSType()); 5211 if (CompLHSType.isNull()) 5212 return nullptr; 5213 5214 QualType CompResultType = Importer.Import(E->getComputationResultType()); 5215 if (CompResultType.isNull()) 5216 return nullptr; 5217 5218 Expr *LHS = Importer.Import(E->getLHS()); 5219 if (!LHS) 5220 return nullptr; 5221 5222 Expr *RHS = Importer.Import(E->getRHS()); 5223 if (!RHS) 5224 return nullptr; 5225 5226 return new (Importer.getToContext()) 5227 CompoundAssignOperator(LHS, RHS, E->getOpcode(), 5228 T, E->getValueKind(), 5229 E->getObjectKind(), 5230 CompLHSType, CompResultType, 5231 Importer.Import(E->getOperatorLoc()), 5232 E->isFPContractable()); 5233 } 5234 5235 static bool ImportCastPath(CastExpr *E, CXXCastPath &Path) { 5236 if (E->path_empty()) return false; 5237 5238 // TODO: import cast paths 5239 return true; 5240 } 5241 5242 Expr *ASTNodeImporter::VisitImplicitCastExpr(ImplicitCastExpr *E) { 5243 QualType T = Importer.Import(E->getType()); 5244 if (T.isNull()) 5245 return nullptr; 5246 5247 Expr *SubExpr = Importer.Import(E->getSubExpr()); 5248 if (!SubExpr) 5249 return nullptr; 5250 5251 CXXCastPath BasePath; 5252 if (ImportCastPath(E, BasePath)) 5253 return nullptr; 5254 5255 return ImplicitCastExpr::Create(Importer.getToContext(), T, E->getCastKind(), 5256 SubExpr, &BasePath, E->getValueKind()); 5257 } 5258 5259 Expr *ASTNodeImporter::VisitCStyleCastExpr(CStyleCastExpr *E) { 5260 QualType T = Importer.Import(E->getType()); 5261 if (T.isNull()) 5262 return nullptr; 5263 5264 Expr *SubExpr = Importer.Import(E->getSubExpr()); 5265 if (!SubExpr) 5266 return nullptr; 5267 5268 TypeSourceInfo *TInfo = Importer.Import(E->getTypeInfoAsWritten()); 5269 if (!TInfo && E->getTypeInfoAsWritten()) 5270 return nullptr; 5271 5272 CXXCastPath BasePath; 5273 if (ImportCastPath(E, BasePath)) 5274 return nullptr; 5275 5276 return CStyleCastExpr::Create(Importer.getToContext(), T, 5277 E->getValueKind(), E->getCastKind(), 5278 SubExpr, &BasePath, TInfo, 5279 Importer.Import(E->getLParenLoc()), 5280 Importer.Import(E->getRParenLoc())); 5281 } 5282 5283 Expr *ASTNodeImporter::VisitCXXConstructExpr(CXXConstructExpr *E) { 5284 QualType T = Importer.Import(E->getType()); 5285 if (T.isNull()) 5286 return nullptr; 5287 5288 CXXConstructorDecl *ToCCD = 5289 dyn_cast<CXXConstructorDecl>(Importer.Import(E->getConstructor())); 5290 if (!ToCCD && E->getConstructor()) 5291 return nullptr; 5292 5293 size_t NumArgs = E->getNumArgs(); 5294 SmallVector<Expr *, 1> ToArgs(NumArgs); 5295 ASTImporter &_Importer = Importer; 5296 std::transform(E->arg_begin(), E->arg_end(), ToArgs.begin(), 5297 [&_Importer](Expr *AE) -> Expr * { 5298 return _Importer.Import(AE); 5299 }); 5300 for (Expr *ToA : ToArgs) { 5301 if (!ToA) 5302 return nullptr; 5303 } 5304 5305 return CXXConstructExpr::Create(Importer.getToContext(), T, 5306 Importer.Import(E->getLocation()), 5307 ToCCD, E->isElidable(), 5308 ToArgs, E->hadMultipleCandidates(), 5309 E->isListInitialization(), 5310 E->isStdInitListInitialization(), 5311 E->requiresZeroInitialization(), 5312 E->getConstructionKind(), 5313 Importer.Import(E->getParenOrBraceRange())); 5314 } 5315 5316 Expr *ASTNodeImporter::VisitMemberExpr(MemberExpr *E) { 5317 QualType T = Importer.Import(E->getType()); 5318 if (T.isNull()) 5319 return nullptr; 5320 5321 Expr *ToBase = Importer.Import(E->getBase()); 5322 if (!ToBase && E->getBase()) 5323 return nullptr; 5324 5325 ValueDecl *ToMember = dyn_cast<ValueDecl>(Importer.Import(E->getMemberDecl())); 5326 if (!ToMember && E->getMemberDecl()) 5327 return nullptr; 5328 5329 DeclAccessPair ToFoundDecl = DeclAccessPair::make( 5330 dyn_cast<NamedDecl>(Importer.Import(E->getFoundDecl().getDecl())), 5331 E->getFoundDecl().getAccess()); 5332 5333 DeclarationNameInfo ToMemberNameInfo( 5334 Importer.Import(E->getMemberNameInfo().getName()), 5335 Importer.Import(E->getMemberNameInfo().getLoc())); 5336 5337 if (E->hasExplicitTemplateArgs()) { 5338 return nullptr; // FIXME: handle template arguments 5339 } 5340 5341 return MemberExpr::Create(Importer.getToContext(), ToBase, 5342 E->isArrow(), 5343 Importer.Import(E->getOperatorLoc()), 5344 Importer.Import(E->getQualifierLoc()), 5345 Importer.Import(E->getTemplateKeywordLoc()), 5346 ToMember, ToFoundDecl, ToMemberNameInfo, 5347 nullptr, T, E->getValueKind(), 5348 E->getObjectKind()); 5349 } 5350 5351 Expr *ASTNodeImporter::VisitCallExpr(CallExpr *E) { 5352 QualType T = Importer.Import(E->getType()); 5353 if (T.isNull()) 5354 return nullptr; 5355 5356 Expr *ToCallee = Importer.Import(E->getCallee()); 5357 if (!ToCallee && E->getCallee()) 5358 return nullptr; 5359 5360 unsigned NumArgs = E->getNumArgs(); 5361 5362 llvm::SmallVector<Expr *, 2> ToArgs(NumArgs); 5363 5364 for (unsigned ai = 0, ae = NumArgs; ai != ae; ++ai) { 5365 Expr *FromArg = E->getArg(ai); 5366 Expr *ToArg = Importer.Import(FromArg); 5367 if (!ToArg) 5368 return nullptr; 5369 ToArgs[ai] = ToArg; 5370 } 5371 5372 Expr **ToArgs_Copied = new (Importer.getToContext()) 5373 Expr*[NumArgs]; 5374 5375 for (unsigned ai = 0, ae = NumArgs; ai != ae; ++ai) 5376 ToArgs_Copied[ai] = ToArgs[ai]; 5377 5378 return new (Importer.getToContext()) 5379 CallExpr(Importer.getToContext(), ToCallee, 5380 llvm::makeArrayRef(ToArgs_Copied, NumArgs), T, E->getValueKind(), 5381 Importer.Import(E->getRParenLoc())); 5382 } 5383 5384 ASTImporter::ASTImporter(ASTContext &ToContext, FileManager &ToFileManager, 5385 ASTContext &FromContext, FileManager &FromFileManager, 5386 bool MinimalImport) 5387 : ToContext(ToContext), FromContext(FromContext), 5388 ToFileManager(ToFileManager), FromFileManager(FromFileManager), 5389 Minimal(MinimalImport), LastDiagFromFrom(false) 5390 { 5391 ImportedDecls[FromContext.getTranslationUnitDecl()] 5392 = ToContext.getTranslationUnitDecl(); 5393 } 5394 5395 ASTImporter::~ASTImporter() { } 5396 5397 QualType ASTImporter::Import(QualType FromT) { 5398 if (FromT.isNull()) 5399 return QualType(); 5400 5401 const Type *fromTy = FromT.getTypePtr(); 5402 5403 // Check whether we've already imported this type. 5404 llvm::DenseMap<const Type *, const Type *>::iterator Pos 5405 = ImportedTypes.find(fromTy); 5406 if (Pos != ImportedTypes.end()) 5407 return ToContext.getQualifiedType(Pos->second, FromT.getLocalQualifiers()); 5408 5409 // Import the type 5410 ASTNodeImporter Importer(*this); 5411 QualType ToT = Importer.Visit(fromTy); 5412 if (ToT.isNull()) 5413 return ToT; 5414 5415 // Record the imported type. 5416 ImportedTypes[fromTy] = ToT.getTypePtr(); 5417 5418 return ToContext.getQualifiedType(ToT, FromT.getLocalQualifiers()); 5419 } 5420 5421 TypeSourceInfo *ASTImporter::Import(TypeSourceInfo *FromTSI) { 5422 if (!FromTSI) 5423 return FromTSI; 5424 5425 // FIXME: For now we just create a "trivial" type source info based 5426 // on the type and a single location. Implement a real version of this. 5427 QualType T = Import(FromTSI->getType()); 5428 if (T.isNull()) 5429 return nullptr; 5430 5431 return ToContext.getTrivialTypeSourceInfo(T, 5432 Import(FromTSI->getTypeLoc().getLocStart())); 5433 } 5434 5435 Decl *ASTImporter::GetAlreadyImportedOrNull(Decl *FromD) { 5436 llvm::DenseMap<Decl *, Decl *>::iterator Pos = ImportedDecls.find(FromD); 5437 if (Pos != ImportedDecls.end()) { 5438 Decl *ToD = Pos->second; 5439 ASTNodeImporter(*this).ImportDefinitionIfNeeded(FromD, ToD); 5440 return ToD; 5441 } else { 5442 return nullptr; 5443 } 5444 } 5445 5446 Decl *ASTImporter::Import(Decl *FromD) { 5447 if (!FromD) 5448 return nullptr; 5449 5450 ASTNodeImporter Importer(*this); 5451 5452 // Check whether we've already imported this declaration. 5453 llvm::DenseMap<Decl *, Decl *>::iterator Pos = ImportedDecls.find(FromD); 5454 if (Pos != ImportedDecls.end()) { 5455 Decl *ToD = Pos->second; 5456 Importer.ImportDefinitionIfNeeded(FromD, ToD); 5457 return ToD; 5458 } 5459 5460 // Import the type 5461 Decl *ToD = Importer.Visit(FromD); 5462 if (!ToD) 5463 return nullptr; 5464 5465 // Record the imported declaration. 5466 ImportedDecls[FromD] = ToD; 5467 5468 if (TagDecl *FromTag = dyn_cast<TagDecl>(FromD)) { 5469 // Keep track of anonymous tags that have an associated typedef. 5470 if (FromTag->getTypedefNameForAnonDecl()) 5471 AnonTagsWithPendingTypedefs.push_back(FromTag); 5472 } else if (TypedefNameDecl *FromTypedef = dyn_cast<TypedefNameDecl>(FromD)) { 5473 // When we've finished transforming a typedef, see whether it was the 5474 // typedef for an anonymous tag. 5475 for (SmallVectorImpl<TagDecl *>::iterator 5476 FromTag = AnonTagsWithPendingTypedefs.begin(), 5477 FromTagEnd = AnonTagsWithPendingTypedefs.end(); 5478 FromTag != FromTagEnd; ++FromTag) { 5479 if ((*FromTag)->getTypedefNameForAnonDecl() == FromTypedef) { 5480 if (TagDecl *ToTag = cast_or_null<TagDecl>(Import(*FromTag))) { 5481 // We found the typedef for an anonymous tag; link them. 5482 ToTag->setTypedefNameForAnonDecl(cast<TypedefNameDecl>(ToD)); 5483 AnonTagsWithPendingTypedefs.erase(FromTag); 5484 break; 5485 } 5486 } 5487 } 5488 } 5489 5490 return ToD; 5491 } 5492 5493 DeclContext *ASTImporter::ImportContext(DeclContext *FromDC) { 5494 if (!FromDC) 5495 return FromDC; 5496 5497 DeclContext *ToDC = cast_or_null<DeclContext>(Import(cast<Decl>(FromDC))); 5498 if (!ToDC) 5499 return nullptr; 5500 5501 // When we're using a record/enum/Objective-C class/protocol as a context, we 5502 // need it to have a definition. 5503 if (RecordDecl *ToRecord = dyn_cast<RecordDecl>(ToDC)) { 5504 RecordDecl *FromRecord = cast<RecordDecl>(FromDC); 5505 if (ToRecord->isCompleteDefinition()) { 5506 // Do nothing. 5507 } else if (FromRecord->isCompleteDefinition()) { 5508 ASTNodeImporter(*this).ImportDefinition(FromRecord, ToRecord, 5509 ASTNodeImporter::IDK_Basic); 5510 } else { 5511 CompleteDecl(ToRecord); 5512 } 5513 } else if (EnumDecl *ToEnum = dyn_cast<EnumDecl>(ToDC)) { 5514 EnumDecl *FromEnum = cast<EnumDecl>(FromDC); 5515 if (ToEnum->isCompleteDefinition()) { 5516 // Do nothing. 5517 } else if (FromEnum->isCompleteDefinition()) { 5518 ASTNodeImporter(*this).ImportDefinition(FromEnum, ToEnum, 5519 ASTNodeImporter::IDK_Basic); 5520 } else { 5521 CompleteDecl(ToEnum); 5522 } 5523 } else if (ObjCInterfaceDecl *ToClass = dyn_cast<ObjCInterfaceDecl>(ToDC)) { 5524 ObjCInterfaceDecl *FromClass = cast<ObjCInterfaceDecl>(FromDC); 5525 if (ToClass->getDefinition()) { 5526 // Do nothing. 5527 } else if (ObjCInterfaceDecl *FromDef = FromClass->getDefinition()) { 5528 ASTNodeImporter(*this).ImportDefinition(FromDef, ToClass, 5529 ASTNodeImporter::IDK_Basic); 5530 } else { 5531 CompleteDecl(ToClass); 5532 } 5533 } else if (ObjCProtocolDecl *ToProto = dyn_cast<ObjCProtocolDecl>(ToDC)) { 5534 ObjCProtocolDecl *FromProto = cast<ObjCProtocolDecl>(FromDC); 5535 if (ToProto->getDefinition()) { 5536 // Do nothing. 5537 } else if (ObjCProtocolDecl *FromDef = FromProto->getDefinition()) { 5538 ASTNodeImporter(*this).ImportDefinition(FromDef, ToProto, 5539 ASTNodeImporter::IDK_Basic); 5540 } else { 5541 CompleteDecl(ToProto); 5542 } 5543 } 5544 5545 return ToDC; 5546 } 5547 5548 Expr *ASTImporter::Import(Expr *FromE) { 5549 if (!FromE) 5550 return nullptr; 5551 5552 return cast_or_null<Expr>(Import(cast<Stmt>(FromE))); 5553 } 5554 5555 Stmt *ASTImporter::Import(Stmt *FromS) { 5556 if (!FromS) 5557 return nullptr; 5558 5559 // Check whether we've already imported this declaration. 5560 llvm::DenseMap<Stmt *, Stmt *>::iterator Pos = ImportedStmts.find(FromS); 5561 if (Pos != ImportedStmts.end()) 5562 return Pos->second; 5563 5564 // Import the type 5565 ASTNodeImporter Importer(*this); 5566 Stmt *ToS = Importer.Visit(FromS); 5567 if (!ToS) 5568 return nullptr; 5569 5570 // Record the imported declaration. 5571 ImportedStmts[FromS] = ToS; 5572 return ToS; 5573 } 5574 5575 NestedNameSpecifier *ASTImporter::Import(NestedNameSpecifier *FromNNS) { 5576 if (!FromNNS) 5577 return nullptr; 5578 5579 NestedNameSpecifier *prefix = Import(FromNNS->getPrefix()); 5580 5581 switch (FromNNS->getKind()) { 5582 case NestedNameSpecifier::Identifier: 5583 if (IdentifierInfo *II = Import(FromNNS->getAsIdentifier())) { 5584 return NestedNameSpecifier::Create(ToContext, prefix, II); 5585 } 5586 return nullptr; 5587 5588 case NestedNameSpecifier::Namespace: 5589 if (NamespaceDecl *NS = 5590 cast<NamespaceDecl>(Import(FromNNS->getAsNamespace()))) { 5591 return NestedNameSpecifier::Create(ToContext, prefix, NS); 5592 } 5593 return nullptr; 5594 5595 case NestedNameSpecifier::NamespaceAlias: 5596 if (NamespaceAliasDecl *NSAD = 5597 cast<NamespaceAliasDecl>(Import(FromNNS->getAsNamespaceAlias()))) { 5598 return NestedNameSpecifier::Create(ToContext, prefix, NSAD); 5599 } 5600 return nullptr; 5601 5602 case NestedNameSpecifier::Global: 5603 return NestedNameSpecifier::GlobalSpecifier(ToContext); 5604 5605 case NestedNameSpecifier::Super: 5606 if (CXXRecordDecl *RD = 5607 cast<CXXRecordDecl>(Import(FromNNS->getAsRecordDecl()))) { 5608 return NestedNameSpecifier::SuperSpecifier(ToContext, RD); 5609 } 5610 return nullptr; 5611 5612 case NestedNameSpecifier::TypeSpec: 5613 case NestedNameSpecifier::TypeSpecWithTemplate: { 5614 QualType T = Import(QualType(FromNNS->getAsType(), 0u)); 5615 if (!T.isNull()) { 5616 bool bTemplate = FromNNS->getKind() == 5617 NestedNameSpecifier::TypeSpecWithTemplate; 5618 return NestedNameSpecifier::Create(ToContext, prefix, 5619 bTemplate, T.getTypePtr()); 5620 } 5621 } 5622 return nullptr; 5623 } 5624 5625 llvm_unreachable("Invalid nested name specifier kind"); 5626 } 5627 5628 NestedNameSpecifierLoc ASTImporter::Import(NestedNameSpecifierLoc FromNNS) { 5629 // FIXME: Implement! 5630 return NestedNameSpecifierLoc(); 5631 } 5632 5633 TemplateName ASTImporter::Import(TemplateName From) { 5634 switch (From.getKind()) { 5635 case TemplateName::Template: 5636 if (TemplateDecl *ToTemplate 5637 = cast_or_null<TemplateDecl>(Import(From.getAsTemplateDecl()))) 5638 return TemplateName(ToTemplate); 5639 5640 return TemplateName(); 5641 5642 case TemplateName::OverloadedTemplate: { 5643 OverloadedTemplateStorage *FromStorage = From.getAsOverloadedTemplate(); 5644 UnresolvedSet<2> ToTemplates; 5645 for (OverloadedTemplateStorage::iterator I = FromStorage->begin(), 5646 E = FromStorage->end(); 5647 I != E; ++I) { 5648 if (NamedDecl *To = cast_or_null<NamedDecl>(Import(*I))) 5649 ToTemplates.addDecl(To); 5650 else 5651 return TemplateName(); 5652 } 5653 return ToContext.getOverloadedTemplateName(ToTemplates.begin(), 5654 ToTemplates.end()); 5655 } 5656 5657 case TemplateName::QualifiedTemplate: { 5658 QualifiedTemplateName *QTN = From.getAsQualifiedTemplateName(); 5659 NestedNameSpecifier *Qualifier = Import(QTN->getQualifier()); 5660 if (!Qualifier) 5661 return TemplateName(); 5662 5663 if (TemplateDecl *ToTemplate 5664 = cast_or_null<TemplateDecl>(Import(From.getAsTemplateDecl()))) 5665 return ToContext.getQualifiedTemplateName(Qualifier, 5666 QTN->hasTemplateKeyword(), 5667 ToTemplate); 5668 5669 return TemplateName(); 5670 } 5671 5672 case TemplateName::DependentTemplate: { 5673 DependentTemplateName *DTN = From.getAsDependentTemplateName(); 5674 NestedNameSpecifier *Qualifier = Import(DTN->getQualifier()); 5675 if (!Qualifier) 5676 return TemplateName(); 5677 5678 if (DTN->isIdentifier()) { 5679 return ToContext.getDependentTemplateName(Qualifier, 5680 Import(DTN->getIdentifier())); 5681 } 5682 5683 return ToContext.getDependentTemplateName(Qualifier, DTN->getOperator()); 5684 } 5685 5686 case TemplateName::SubstTemplateTemplateParm: { 5687 SubstTemplateTemplateParmStorage *subst 5688 = From.getAsSubstTemplateTemplateParm(); 5689 TemplateTemplateParmDecl *param 5690 = cast_or_null<TemplateTemplateParmDecl>(Import(subst->getParameter())); 5691 if (!param) 5692 return TemplateName(); 5693 5694 TemplateName replacement = Import(subst->getReplacement()); 5695 if (replacement.isNull()) return TemplateName(); 5696 5697 return ToContext.getSubstTemplateTemplateParm(param, replacement); 5698 } 5699 5700 case TemplateName::SubstTemplateTemplateParmPack: { 5701 SubstTemplateTemplateParmPackStorage *SubstPack 5702 = From.getAsSubstTemplateTemplateParmPack(); 5703 TemplateTemplateParmDecl *Param 5704 = cast_or_null<TemplateTemplateParmDecl>( 5705 Import(SubstPack->getParameterPack())); 5706 if (!Param) 5707 return TemplateName(); 5708 5709 ASTNodeImporter Importer(*this); 5710 TemplateArgument ArgPack 5711 = Importer.ImportTemplateArgument(SubstPack->getArgumentPack()); 5712 if (ArgPack.isNull()) 5713 return TemplateName(); 5714 5715 return ToContext.getSubstTemplateTemplateParmPack(Param, ArgPack); 5716 } 5717 } 5718 5719 llvm_unreachable("Invalid template name kind"); 5720 } 5721 5722 SourceLocation ASTImporter::Import(SourceLocation FromLoc) { 5723 if (FromLoc.isInvalid()) 5724 return SourceLocation(); 5725 5726 SourceManager &FromSM = FromContext.getSourceManager(); 5727 5728 // For now, map everything down to its spelling location, so that we 5729 // don't have to import macro expansions. 5730 // FIXME: Import macro expansions! 5731 FromLoc = FromSM.getSpellingLoc(FromLoc); 5732 std::pair<FileID, unsigned> Decomposed = FromSM.getDecomposedLoc(FromLoc); 5733 SourceManager &ToSM = ToContext.getSourceManager(); 5734 FileID ToFileID = Import(Decomposed.first); 5735 if (ToFileID.isInvalid()) 5736 return SourceLocation(); 5737 SourceLocation ret = ToSM.getLocForStartOfFile(ToFileID) 5738 .getLocWithOffset(Decomposed.second); 5739 return ret; 5740 } 5741 5742 SourceRange ASTImporter::Import(SourceRange FromRange) { 5743 return SourceRange(Import(FromRange.getBegin()), Import(FromRange.getEnd())); 5744 } 5745 5746 FileID ASTImporter::Import(FileID FromID) { 5747 llvm::DenseMap<FileID, FileID>::iterator Pos 5748 = ImportedFileIDs.find(FromID); 5749 if (Pos != ImportedFileIDs.end()) 5750 return Pos->second; 5751 5752 SourceManager &FromSM = FromContext.getSourceManager(); 5753 SourceManager &ToSM = ToContext.getSourceManager(); 5754 const SrcMgr::SLocEntry &FromSLoc = FromSM.getSLocEntry(FromID); 5755 assert(FromSLoc.isFile() && "Cannot handle macro expansions yet"); 5756 5757 // Include location of this file. 5758 SourceLocation ToIncludeLoc = Import(FromSLoc.getFile().getIncludeLoc()); 5759 5760 // Map the FileID for to the "to" source manager. 5761 FileID ToID; 5762 const SrcMgr::ContentCache *Cache = FromSLoc.getFile().getContentCache(); 5763 if (Cache->OrigEntry && Cache->OrigEntry->getDir()) { 5764 // FIXME: We probably want to use getVirtualFile(), so we don't hit the 5765 // disk again 5766 // FIXME: We definitely want to re-use the existing MemoryBuffer, rather 5767 // than mmap the files several times. 5768 const FileEntry *Entry = ToFileManager.getFile(Cache->OrigEntry->getName()); 5769 if (!Entry) 5770 return FileID(); 5771 ToID = ToSM.createFileID(Entry, ToIncludeLoc, 5772 FromSLoc.getFile().getFileCharacteristic()); 5773 } else { 5774 // FIXME: We want to re-use the existing MemoryBuffer! 5775 const llvm::MemoryBuffer * 5776 FromBuf = Cache->getBuffer(FromContext.getDiagnostics(), FromSM); 5777 std::unique_ptr<llvm::MemoryBuffer> ToBuf 5778 = llvm::MemoryBuffer::getMemBufferCopy(FromBuf->getBuffer(), 5779 FromBuf->getBufferIdentifier()); 5780 ToID = ToSM.createFileID(std::move(ToBuf), 5781 FromSLoc.getFile().getFileCharacteristic()); 5782 } 5783 5784 5785 ImportedFileIDs[FromID] = ToID; 5786 return ToID; 5787 } 5788 5789 void ASTImporter::ImportDefinition(Decl *From) { 5790 Decl *To = Import(From); 5791 if (!To) 5792 return; 5793 5794 if (DeclContext *FromDC = cast<DeclContext>(From)) { 5795 ASTNodeImporter Importer(*this); 5796 5797 if (RecordDecl *ToRecord = dyn_cast<RecordDecl>(To)) { 5798 if (!ToRecord->getDefinition()) { 5799 Importer.ImportDefinition(cast<RecordDecl>(FromDC), ToRecord, 5800 ASTNodeImporter::IDK_Everything); 5801 return; 5802 } 5803 } 5804 5805 if (EnumDecl *ToEnum = dyn_cast<EnumDecl>(To)) { 5806 if (!ToEnum->getDefinition()) { 5807 Importer.ImportDefinition(cast<EnumDecl>(FromDC), ToEnum, 5808 ASTNodeImporter::IDK_Everything); 5809 return; 5810 } 5811 } 5812 5813 if (ObjCInterfaceDecl *ToIFace = dyn_cast<ObjCInterfaceDecl>(To)) { 5814 if (!ToIFace->getDefinition()) { 5815 Importer.ImportDefinition(cast<ObjCInterfaceDecl>(FromDC), ToIFace, 5816 ASTNodeImporter::IDK_Everything); 5817 return; 5818 } 5819 } 5820 5821 if (ObjCProtocolDecl *ToProto = dyn_cast<ObjCProtocolDecl>(To)) { 5822 if (!ToProto->getDefinition()) { 5823 Importer.ImportDefinition(cast<ObjCProtocolDecl>(FromDC), ToProto, 5824 ASTNodeImporter::IDK_Everything); 5825 return; 5826 } 5827 } 5828 5829 Importer.ImportDeclContext(FromDC, true); 5830 } 5831 } 5832 5833 DeclarationName ASTImporter::Import(DeclarationName FromName) { 5834 if (!FromName) 5835 return DeclarationName(); 5836 5837 switch (FromName.getNameKind()) { 5838 case DeclarationName::Identifier: 5839 return Import(FromName.getAsIdentifierInfo()); 5840 5841 case DeclarationName::ObjCZeroArgSelector: 5842 case DeclarationName::ObjCOneArgSelector: 5843 case DeclarationName::ObjCMultiArgSelector: 5844 return Import(FromName.getObjCSelector()); 5845 5846 case DeclarationName::CXXConstructorName: { 5847 QualType T = Import(FromName.getCXXNameType()); 5848 if (T.isNull()) 5849 return DeclarationName(); 5850 5851 return ToContext.DeclarationNames.getCXXConstructorName( 5852 ToContext.getCanonicalType(T)); 5853 } 5854 5855 case DeclarationName::CXXDestructorName: { 5856 QualType T = Import(FromName.getCXXNameType()); 5857 if (T.isNull()) 5858 return DeclarationName(); 5859 5860 return ToContext.DeclarationNames.getCXXDestructorName( 5861 ToContext.getCanonicalType(T)); 5862 } 5863 5864 case DeclarationName::CXXConversionFunctionName: { 5865 QualType T = Import(FromName.getCXXNameType()); 5866 if (T.isNull()) 5867 return DeclarationName(); 5868 5869 return ToContext.DeclarationNames.getCXXConversionFunctionName( 5870 ToContext.getCanonicalType(T)); 5871 } 5872 5873 case DeclarationName::CXXOperatorName: 5874 return ToContext.DeclarationNames.getCXXOperatorName( 5875 FromName.getCXXOverloadedOperator()); 5876 5877 case DeclarationName::CXXLiteralOperatorName: 5878 return ToContext.DeclarationNames.getCXXLiteralOperatorName( 5879 Import(FromName.getCXXLiteralIdentifier())); 5880 5881 case DeclarationName::CXXUsingDirective: 5882 // FIXME: STATICS! 5883 return DeclarationName::getUsingDirectiveName(); 5884 } 5885 5886 llvm_unreachable("Invalid DeclarationName Kind!"); 5887 } 5888 5889 IdentifierInfo *ASTImporter::Import(const IdentifierInfo *FromId) { 5890 if (!FromId) 5891 return nullptr; 5892 5893 return &ToContext.Idents.get(FromId->getName()); 5894 } 5895 5896 Selector ASTImporter::Import(Selector FromSel) { 5897 if (FromSel.isNull()) 5898 return Selector(); 5899 5900 SmallVector<IdentifierInfo *, 4> Idents; 5901 Idents.push_back(Import(FromSel.getIdentifierInfoForSlot(0))); 5902 for (unsigned I = 1, N = FromSel.getNumArgs(); I < N; ++I) 5903 Idents.push_back(Import(FromSel.getIdentifierInfoForSlot(I))); 5904 return ToContext.Selectors.getSelector(FromSel.getNumArgs(), Idents.data()); 5905 } 5906 5907 DeclarationName ASTImporter::HandleNameConflict(DeclarationName Name, 5908 DeclContext *DC, 5909 unsigned IDNS, 5910 NamedDecl **Decls, 5911 unsigned NumDecls) { 5912 return Name; 5913 } 5914 5915 DiagnosticBuilder ASTImporter::ToDiag(SourceLocation Loc, unsigned DiagID) { 5916 if (LastDiagFromFrom) 5917 ToContext.getDiagnostics().notePriorDiagnosticFrom( 5918 FromContext.getDiagnostics()); 5919 LastDiagFromFrom = false; 5920 return ToContext.getDiagnostics().Report(Loc, DiagID); 5921 } 5922 5923 DiagnosticBuilder ASTImporter::FromDiag(SourceLocation Loc, unsigned DiagID) { 5924 if (!LastDiagFromFrom) 5925 FromContext.getDiagnostics().notePriorDiagnosticFrom( 5926 ToContext.getDiagnostics()); 5927 LastDiagFromFrom = true; 5928 return FromContext.getDiagnostics().Report(Loc, DiagID); 5929 } 5930 5931 void ASTImporter::CompleteDecl (Decl *D) { 5932 if (ObjCInterfaceDecl *ID = dyn_cast<ObjCInterfaceDecl>(D)) { 5933 if (!ID->getDefinition()) 5934 ID->startDefinition(); 5935 } 5936 else if (ObjCProtocolDecl *PD = dyn_cast<ObjCProtocolDecl>(D)) { 5937 if (!PD->getDefinition()) 5938 PD->startDefinition(); 5939 } 5940 else if (TagDecl *TD = dyn_cast<TagDecl>(D)) { 5941 if (!TD->getDefinition() && !TD->isBeingDefined()) { 5942 TD->startDefinition(); 5943 TD->setCompleteDefinition(true); 5944 } 5945 } 5946 else { 5947 assert (0 && "CompleteDecl called on a Decl that can't be completed"); 5948 } 5949 } 5950 5951 Decl *ASTImporter::Imported(Decl *From, Decl *To) { 5952 ImportedDecls[From] = To; 5953 return To; 5954 } 5955 5956 bool ASTImporter::IsStructurallyEquivalent(QualType From, QualType To, 5957 bool Complain) { 5958 llvm::DenseMap<const Type *, const Type *>::iterator Pos 5959 = ImportedTypes.find(From.getTypePtr()); 5960 if (Pos != ImportedTypes.end() && ToContext.hasSameType(Import(From), To)) 5961 return true; 5962 5963 StructuralEquivalenceContext Ctx(FromContext, ToContext, NonEquivalentDecls, 5964 false, Complain); 5965 return Ctx.IsStructurallyEquivalent(From, To); 5966 } 5967