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