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