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