Changes in src/SymTab/Validate.cc [25fcb84:a12c81f3]
- File:
-
- 1 edited
-
src/SymTab/Validate.cc (modified) (34 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/SymTab/Validate.cc
r25fcb84 ra12c81f3 77 77 class SwitchStmt; 78 78 79 #define debugPrint( x ) if ( doDebug ) { std::cout << x; }79 #define debugPrint( x ) if ( doDebug ) x 80 80 81 81 namespace SymTab { 82 /// hoists declarations that are difficult to hoist while parsing 83 struct HoistTypeDecls final : public WithDeclsToAdd { 84 void previsit( SizeofExpr * ); 85 void previsit( AlignofExpr * ); 86 void previsit( UntypedOffsetofExpr * ); 87 void handleType( Type * ); 88 }; 89 90 struct FixQualifiedTypes final : public WithIndexer { 91 Type * postmutate( QualifiedType * ); 92 }; 93 82 94 struct HoistStruct final : public WithDeclsToAdd, public WithGuards { 83 95 /// Flattens nested struct types 84 96 static void hoistStruct( std::list< Declaration * > &translationUnit ); 85 97 86 void previsit( EnumInstType * enumInstType );87 void previsit( StructInstType * structInstType );88 void previsit( UnionInstType * unionInstType );89 98 void previsit( StructDecl * aggregateDecl ); 90 99 void previsit( UnionDecl * aggregateDecl ); 91 100 void previsit( StaticAssertDecl * assertDecl ); 101 void previsit( StructInstType * type ); 102 void previsit( UnionInstType * type ); 103 void previsit( EnumInstType * type ); 92 104 93 105 private: … … 112 124 113 125 /// Associates forward declarations of aggregates with their definitions 114 struct LinkReferenceToTypes final : public WithIndexer, public WithGuards {126 struct LinkReferenceToTypes final : public WithIndexer, public WithGuards, public WithVisitorRef<LinkReferenceToTypes>, public WithShortCircuiting { 115 127 LinkReferenceToTypes( const Indexer *indexer ); 116 128 void postvisit( TypeInstType *typeInst ); … … 120 132 void postvisit( UnionInstType *unionInst ); 121 133 void postvisit( TraitInstType *traitInst ); 134 void previsit( QualifiedType * qualType ); 135 void postvisit( QualifiedType * qualType ); 122 136 123 137 void postvisit( EnumDecl *enumDecl ); … … 165 179 }; 166 180 167 struct EliminateTypedef final : public WithVisitorRef<EliminateTypedef>, public WithGuards{168 EliminateTypedef() : scopeLevel( 0 ) {}181 struct ReplaceTypedef final : public WithVisitorRef<ReplaceTypedef>, public WithGuards, public WithShortCircuiting, public WithDeclsToAdd { 182 ReplaceTypedef() : scopeLevel( 0 ) {} 169 183 /// Replaces typedefs by forward declarations 170 static void eliminateTypedef( std::list< Declaration * > &translationUnit ); 171 184 static void replaceTypedef( std::list< Declaration * > &translationUnit ); 185 186 void premutate( QualifiedType * ); 187 Type * postmutate( QualifiedType * qualType ); 172 188 Type * postmutate( TypeInstType * aggregateUseType ); 173 189 Declaration * postmutate( TypedefDecl * typeDecl ); … … 180 196 181 197 void premutate( CompoundStmt * compoundStmt ); 182 CompoundStmt * postmutate( CompoundStmt * compoundStmt );183 198 184 199 void premutate( StructDecl * structDecl ); 185 Declaration * postmutate( StructDecl * structDecl );186 200 void premutate( UnionDecl * unionDecl ); 187 Declaration * postmutate( UnionDecl * unionDecl );188 201 void premutate( EnumDecl * enumDecl ); 189 Declaration * postmutate( EnumDecl * enumDecl );190 Declaration * postmutate( TraitDecl * contextDecl );191 202 192 203 void premutate( FunctionType * ftype ); … … 194 205 private: 195 206 template<typename AggDecl> 196 AggDecl *handleAggregate( AggDecl * aggDecl );197 198 template<typename AggDecl>199 207 void addImplicitTypedef( AggDecl * aggDecl ); 208 template< typename AggDecl > 209 void handleAggregate( AggDecl * aggr ); 200 210 201 211 typedef std::unique_ptr<TypedefDecl> TypedefDeclPtr; 202 212 typedef ScopedMap< std::string, std::pair< TypedefDeclPtr, int > > TypedefMap; 203 typedef std::map< std::string, TypeDecl * > TypeDeclMap; 213 typedef std::map< std::string, TypeDecl * > TypeDeclMap; // xxx - convert to ScopedMap 204 214 TypedefMap typedefNames; 205 215 TypeDeclMap typedeclNames; 206 216 int scopeLevel; 207 217 bool inFunctionType = false; 218 }; 219 220 struct EliminateTypedef { 221 /// removes TypedefDecls from the AST 222 static void eliminateTypedef( std::list< Declaration * > &translationUnit ); 223 224 template<typename AggDecl> 225 void handleAggregate( AggDecl *aggregateDecl ); 226 227 void previsit( StructDecl * aggregateDecl ); 228 void previsit( UnionDecl * aggregateDecl ); 229 void previsit( CompoundStmt * compoundStmt ); 208 230 }; 209 231 … … 263 285 PassVisitor<FindSpecialDeclarations> finder; 264 286 PassVisitor<LabelAddressFixer> labelAddrFixer; 265 266 EliminateTypedef::eliminateTypedef( translationUnit ); 267 HoistStruct::hoistStruct( translationUnit ); // must happen after EliminateTypedef, so that aggregate typedefs occur in the correct order 287 PassVisitor<HoistTypeDecls> hoistDecls; 288 PassVisitor<FixQualifiedTypes> fixQual; 289 290 acceptAll( translationUnit, hoistDecls ); 291 ReplaceTypedef::replaceTypedef( translationUnit ); 268 292 ReturnTypeFixer::fix( translationUnit ); // must happen before autogen 269 293 acceptAll( translationUnit, epc ); // must happen before VerifyCtorDtorAssign, because void return objects should not exist; before LinkReferenceToTypes because it is an indexer and needs correct types for mangling 270 294 acceptAll( translationUnit, lrt ); // must happen before autogen, because sized flag needs to propagate to generated functions 295 mutateAll( translationUnit, fixQual ); // must happen after LinkReferenceToTypes, because aggregate members are accessed 296 HoistStruct::hoistStruct( translationUnit ); // must happen after EliminateTypedef, so that aggregate typedefs occur in the correct order 297 EliminateTypedef::eliminateTypedef( translationUnit ); // 271 298 acceptAll( translationUnit, genericParams ); // check as early as possible - can't happen before LinkReferenceToTypes 272 299 VerifyCtorDtorAssign::verify( translationUnit ); // must happen before autogen, because autogen examines existing ctor/dtors … … 294 321 } 295 322 323 324 void HoistTypeDecls::handleType( Type * type ) { 325 // some type declarations are buried in expressions and not easy to hoist during parsing; hoist them here 326 AggregateDecl * aggr = nullptr; 327 if ( StructInstType * inst = dynamic_cast< StructInstType * >( type ) ) { 328 aggr = inst->baseStruct; 329 } else if ( UnionInstType * inst = dynamic_cast< UnionInstType * >( type ) ) { 330 aggr = inst->baseUnion; 331 } else if ( EnumInstType * inst = dynamic_cast< EnumInstType * >( type ) ) { 332 aggr = inst->baseEnum; 333 } 334 if ( aggr && aggr->body ) { 335 declsToAddBefore.push_front( aggr ); 336 } 337 } 338 339 void HoistTypeDecls::previsit( SizeofExpr * expr ) { 340 handleType( expr->type ); 341 } 342 343 void HoistTypeDecls::previsit( AlignofExpr * expr ) { 344 handleType( expr->type ); 345 } 346 347 void HoistTypeDecls::previsit( UntypedOffsetofExpr * expr ) { 348 handleType( expr->type ); 349 } 350 351 352 Type * FixQualifiedTypes::postmutate( QualifiedType * qualType ) { 353 // TODO: change asserts to SemanticErrors as necessary 354 Type * parent = qualType->parent; 355 Type * child = qualType->child; 356 if ( dynamic_cast< GlobalScopeType * >( qualType->parent ) ) { 357 // .T => lookup T at global scope 358 if ( StructInstType * inst = dynamic_cast< StructInstType * >( child ) ) { 359 auto aggr = indexer.globalLookupStruct( inst->name ); 360 return new StructInstType( qualType->get_qualifiers(), aggr ); 361 } else if ( UnionInstType * inst = dynamic_cast< UnionInstType * >( child ) ) { 362 auto aggr = indexer.globalLookupUnion( inst->name ); 363 return new UnionInstType( qualType->get_qualifiers(), aggr ); 364 } else if ( EnumInstType * inst = dynamic_cast< EnumInstType * >( child ) ) { 365 auto aggr = indexer.globalLookupEnum( inst->name ); 366 return new EnumInstType( qualType->get_qualifiers(), aggr ); 367 } else if ( TypeInstType * inst = dynamic_cast< TypeInstType * >( child ) ) { 368 auto td = indexer.globalLookupType( inst->name ); 369 assertf( td, "did not find type at global scope with name: %s", inst->name.c_str() ); 370 auto base = td->base; 371 if ( base ) return td->base->clone(); 372 assert( false ); 373 } else { 374 // .T => T is not a SUE type name 375 assert( false ); 376 } 377 } else { 378 // S.T => S must be an aggregate type, find the declaration for T in S. 379 AggregateDecl * aggr = nullptr; 380 if ( StructInstType * inst = dynamic_cast< StructInstType * >( parent ) ) { 381 aggr = inst->baseStruct; 382 } else if ( UnionInstType * inst = dynamic_cast< UnionInstType * > ( parent ) ) { 383 aggr = inst->baseUnion; 384 } else { 385 assert( false ); 386 } 387 assert( aggr ); // TODO: need to handle forward declarations 388 for ( Declaration * member : aggr->members ) { 389 if ( StructInstType * inst = dynamic_cast< StructInstType * >( child ) ) { 390 if ( StructDecl * aggr = dynamic_cast< StructDecl * >( member ) ) { 391 if ( aggr->name == inst->name ) { 392 return new StructInstType( qualType->get_qualifiers(), aggr ); 393 } 394 } 395 } else if ( UnionInstType * inst = dynamic_cast< UnionInstType * >( child ) ) { 396 if ( UnionDecl * aggr = dynamic_cast< UnionDecl * > ( member ) ) { 397 if ( aggr->name == inst->name ) { 398 return new UnionInstType( qualType->get_qualifiers(), aggr ); 399 } 400 } 401 } else if ( EnumInstType * inst = dynamic_cast< EnumInstType * >( child ) ) { 402 if ( EnumDecl * aggr = dynamic_cast< EnumDecl * > ( member ) ) { 403 if ( aggr->name == inst->name ) { 404 return new EnumInstType( qualType->get_qualifiers(), aggr ); 405 } 406 } 407 } else if ( TypeInstType * inst = dynamic_cast< TypeInstType * >( child ) ) { 408 // struct typedefs are being replaced by forward decls too early; move it to hoist struct 409 if ( NamedTypeDecl * aggr = dynamic_cast< NamedTypeDecl * > ( member ) ) { 410 if ( aggr->name == inst->name ) { 411 if ( aggr->base ) return aggr->base->clone(); 412 assert( false ); 413 } 414 } 415 } else { 416 // S.T - S is not an aggregate => error 417 assertf( false, "unhandled qualified child type: %s", toCString(qualType) ); 418 } 419 } 420 // failed to find a satisfying definition of type 421 assertf( false, "failed to find a satisfying definition of %s in %s", toCString(child), toCString(parent) ); 422 } 423 424 // ... may want to link canonical SUE definition to each forward decl so that it becomes easier to lookup? 425 } 426 427 296 428 void HoistStruct::hoistStruct( std::list< Declaration * > &translationUnit ) { 297 429 PassVisitor<HoistStruct> hoister; … … 303 435 } 304 436 437 namespace { 438 void qualifiedName( AggregateDecl * aggr, std::ostringstream & ss ) { 439 if ( aggr->parent ) qualifiedName( aggr->parent, ss ); 440 ss << "__" << aggr->name; 441 } 442 443 // mangle nested type names using entire parent chain 444 std::string qualifiedName( AggregateDecl * aggr ) { 445 std::ostringstream ss; 446 qualifiedName( aggr, ss ); 447 return ss.str(); 448 } 449 } 450 305 451 template< typename AggDecl > 306 452 void HoistStruct::handleAggregate( AggDecl *aggregateDecl ) { 307 453 if ( parentAggr ) { 454 aggregateDecl->parent = parentAggr; 455 aggregateDecl->name = qualifiedName( aggregateDecl ); 308 456 // Add elements in stack order corresponding to nesting structure. 309 457 declsToAddBefore.push_front( aggregateDecl ); … … 316 464 } 317 465 318 void HoistStruct::previsit( EnumInstType * inst ) {319 if ( inst->baseEnum && inst->baseEnum->body ) {320 declsToAddBefore.push_front( inst->baseEnum );321 }322 }323 324 void HoistStruct::previsit( StructInstType * inst ) {325 if ( inst->baseStruct && inst->baseStruct->body ) {326 declsToAddBefore.push_front( inst->baseStruct );327 }328 }329 330 void HoistStruct::previsit( UnionInstType * inst ) {331 if ( inst->baseUnion && inst->baseUnion->body ) {332 declsToAddBefore.push_front( inst->baseUnion );333 }334 }335 336 466 void HoistStruct::previsit( StaticAssertDecl * assertDecl ) { 337 467 if ( parentAggr ) { … … 348 478 } 349 479 480 void HoistStruct::previsit( StructInstType * type ) { 481 // need to reset type name after expanding to qualified name 482 assert( type->baseStruct ); 483 type->name = type->baseStruct->name; 484 } 485 486 void HoistStruct::previsit( UnionInstType * type ) { 487 assert( type->baseUnion ); 488 type->name = type->baseUnion->name; 489 } 490 491 void HoistStruct::previsit( EnumInstType * type ) { 492 assert( type->baseEnum ); 493 type->name = type->baseEnum->name; 494 } 495 496 497 bool isTypedef( Declaration *decl ) { 498 return dynamic_cast< TypedefDecl * >( decl ); 499 } 500 501 void EliminateTypedef::eliminateTypedef( std::list< Declaration * > &translationUnit ) { 502 PassVisitor<EliminateTypedef> eliminator; 503 acceptAll( translationUnit, eliminator ); 504 filter( translationUnit, isTypedef, true ); 505 } 506 507 template< typename AggDecl > 508 void EliminateTypedef::handleAggregate( AggDecl *aggregateDecl ) { 509 filter( aggregateDecl->members, isTypedef, true ); 510 } 511 512 void EliminateTypedef::previsit( StructDecl * aggregateDecl ) { 513 handleAggregate( aggregateDecl ); 514 } 515 516 void EliminateTypedef::previsit( UnionDecl * aggregateDecl ) { 517 handleAggregate( aggregateDecl ); 518 } 519 520 void EliminateTypedef::previsit( CompoundStmt * compoundStmt ) { 521 // remove and delete decl stmts 522 filter( compoundStmt->kids, [](Statement * stmt) { 523 if ( DeclStmt *declStmt = dynamic_cast< DeclStmt * >( stmt ) ) { 524 if ( dynamic_cast< TypedefDecl * >( declStmt->decl ) ) { 525 return true; 526 } // if 527 } // if 528 return false; 529 }, true); 530 } 531 350 532 void EnumAndPointerDecay::previsit( EnumDecl *enumDecl ) { 351 533 // Set the type of each member of the enumeration to be EnumConstant 352 for ( std::list< Declaration * >::iterator i = enumDecl-> get_members().begin(); i != enumDecl->get_members().end(); ++i ) {534 for ( std::list< Declaration * >::iterator i = enumDecl->members.begin(); i != enumDecl->members.end(); ++i ) { 353 535 ObjectDecl * obj = dynamic_cast< ObjectDecl * >( *i ); 354 536 assert( obj ); 355 obj->set_type( new EnumInstType( Type::Qualifiers( Type::Const ), enumDecl-> get_name()) );537 obj->set_type( new EnumInstType( Type::Qualifiers( Type::Const ), enumDecl->name ) ); 356 538 } // for 357 539 } … … 395 577 396 578 void LinkReferenceToTypes::postvisit( EnumInstType *enumInst ) { 397 EnumDecl *st = local_indexer->lookupEnum( enumInst-> get_name());579 EnumDecl *st = local_indexer->lookupEnum( enumInst->name ); 398 580 // it's not a semantic error if the enum is not found, just an implicit forward declaration 399 581 if ( st ) { 400 //assert( ! enumInst->get_baseEnum() || enumInst->get_baseEnum()->get_members().empty() || ! st->get_members().empty() ); 401 enumInst->set_baseEnum( st ); 402 } // if 403 if ( ! st || st->get_members().empty() ) { 582 enumInst->baseEnum = st; 583 } // if 584 if ( ! st || ! st->body ) { 404 585 // use of forward declaration 405 forwardEnums[ enumInst-> get_name()].push_back( enumInst );586 forwardEnums[ enumInst->name ].push_back( enumInst ); 406 587 } // if 407 588 } … … 416 597 417 598 void LinkReferenceToTypes::postvisit( StructInstType *structInst ) { 418 StructDecl *st = local_indexer->lookupStruct( structInst-> get_name());599 StructDecl *st = local_indexer->lookupStruct( structInst->name ); 419 600 // it's not a semantic error if the struct is not found, just an implicit forward declaration 420 601 if ( st ) { 421 //assert( ! structInst->get_baseStruct() || structInst->get_baseStruct()->get_members().empty() || ! st->get_members().empty() ); 422 structInst->set_baseStruct( st ); 423 } // if 424 if ( ! st || st->get_members().empty() ) { 602 structInst->baseStruct = st; 603 } // if 604 if ( ! st || ! st->body ) { 425 605 // use of forward declaration 426 forwardStructs[ structInst-> get_name()].push_back( structInst );606 forwardStructs[ structInst->name ].push_back( structInst ); 427 607 } // if 428 608 checkGenericParameters( structInst ); … … 430 610 431 611 void LinkReferenceToTypes::postvisit( UnionInstType *unionInst ) { 432 UnionDecl *un = local_indexer->lookupUnion( unionInst-> get_name());612 UnionDecl *un = local_indexer->lookupUnion( unionInst->name ); 433 613 // it's not a semantic error if the union is not found, just an implicit forward declaration 434 614 if ( un ) { 435 unionInst-> set_baseUnion( un );436 } // if 437 if ( ! un || un->get_members().empty()) {615 unionInst->baseUnion = un; 616 } // if 617 if ( ! un || ! un->body ) { 438 618 // use of forward declaration 439 forwardUnions[ unionInst-> get_name()].push_back( unionInst );619 forwardUnions[ unionInst->name ].push_back( unionInst ); 440 620 } // if 441 621 checkGenericParameters( unionInst ); 622 } 623 624 void LinkReferenceToTypes::previsit( QualifiedType * ) { 625 visit_children = false; 626 } 627 628 void LinkReferenceToTypes::postvisit( QualifiedType * qualType ) { 629 // linking only makes sense for the 'oldest ancestor' of the qualified type 630 qualType->parent->accept( *visitor ); 442 631 } 443 632 … … 450 639 DeclarationWithType * dwt2 = dynamic_cast<DeclarationWithType *>( d2 ); 451 640 if ( dwt1 && dwt2 ) { 452 if ( dwt1-> get_name() == dwt2->get_name()&& ResolvExpr::typesCompatible( dwt1->get_type(), dwt2->get_type(), SymTab::Indexer() ) ) {641 if ( dwt1->name == dwt2->name && ResolvExpr::typesCompatible( dwt1->get_type(), dwt2->get_type(), SymTab::Indexer() ) ) { 453 642 // std::cerr << "=========== equal:" << std::endl; 454 643 // std::cerr << "d1: " << d1 << std::endl; … … 475 664 template< typename Iterator > 476 665 void expandAssertions( TraitInstType * inst, Iterator out ) { 477 assertf( inst->baseTrait, "Trait instance not linked to base trait: %s", to String( inst ).c_str() );666 assertf( inst->baseTrait, "Trait instance not linked to base trait: %s", toCString( inst ) ); 478 667 std::list< DeclarationWithType * > asserts; 479 668 for ( Declaration * decl : inst->baseTrait->members ) { … … 512 701 SemanticError( traitInst->location, "use of undeclared trait " + traitInst->name ); 513 702 } // if 514 if ( traitDecl-> get_parameters().size() != traitInst->get_parameters().size() ) {703 if ( traitDecl->parameters.size() != traitInst->parameters.size() ) { 515 704 SemanticError( traitInst, "incorrect number of trait parameters: " ); 516 705 } // if … … 518 707 519 708 // need to carry over the 'sized' status of each decl in the instance 520 for ( auto p : group_iterate( traitDecl-> get_parameters(), traitInst->get_parameters()) ) {709 for ( auto p : group_iterate( traitDecl->parameters, traitInst->parameters ) ) { 521 710 TypeExpr * expr = dynamic_cast< TypeExpr * >( std::get<1>(p) ); 522 711 if ( ! expr ) { … … 525 714 if ( TypeInstType * inst = dynamic_cast< TypeInstType * >( expr->get_type() ) ) { 526 715 TypeDecl * formalDecl = std::get<0>(p); 527 TypeDecl * instDecl = inst-> get_baseType();716 TypeDecl * instDecl = inst->baseType; 528 717 if ( formalDecl->get_sized() ) instDecl->set_sized( true ); 529 718 } … … 534 723 void LinkReferenceToTypes::postvisit( EnumDecl *enumDecl ) { 535 724 // visit enum members first so that the types of self-referencing members are updated properly 536 if ( ! enumDecl->get_members().empty()) {537 ForwardEnumsType::iterator fwds = forwardEnums.find( enumDecl-> get_name());725 if ( enumDecl->body ) { 726 ForwardEnumsType::iterator fwds = forwardEnums.find( enumDecl->name ); 538 727 if ( fwds != forwardEnums.end() ) { 539 728 for ( std::list< EnumInstType * >::iterator inst = fwds->second.begin(); inst != fwds->second.end(); ++inst ) { 540 (*inst )->set_baseEnum( enumDecl );729 (*inst)->baseEnum = enumDecl; 541 730 } // for 542 731 forwardEnums.erase( fwds ); … … 574 763 // visit struct members first so that the types of self-referencing members are updated properly 575 764 // xxx - need to ensure that type parameters match up between forward declarations and definition (most importantly, number of type parameters and their defaults) 576 if ( ! structDecl->get_members().empty()) {577 ForwardStructsType::iterator fwds = forwardStructs.find( structDecl-> get_name());765 if ( structDecl->body ) { 766 ForwardStructsType::iterator fwds = forwardStructs.find( structDecl->name ); 578 767 if ( fwds != forwardStructs.end() ) { 579 768 for ( std::list< StructInstType * >::iterator inst = fwds->second.begin(); inst != fwds->second.end(); ++inst ) { 580 (*inst )->set_baseStruct( structDecl );769 (*inst)->baseStruct = structDecl; 581 770 } // for 582 771 forwardStructs.erase( fwds ); … … 586 775 587 776 void LinkReferenceToTypes::postvisit( UnionDecl *unionDecl ) { 588 if ( ! unionDecl->get_members().empty()) {589 ForwardUnionsType::iterator fwds = forwardUnions.find( unionDecl-> get_name());777 if ( unionDecl->body ) { 778 ForwardUnionsType::iterator fwds = forwardUnions.find( unionDecl->name ); 590 779 if ( fwds != forwardUnions.end() ) { 591 780 for ( std::list< UnionInstType * >::iterator inst = fwds->second.begin(); inst != fwds->second.end(); ++inst ) { 592 (*inst )->set_baseUnion( unionDecl );781 (*inst)->baseUnion = unionDecl; 593 782 } // for 594 783 forwardUnions.erase( fwds ); … … 600 789 // ensure generic parameter instances are renamed like the base type 601 790 if ( inGeneric && typeInst->baseType ) typeInst->name = typeInst->baseType->name; 602 if ( NamedTypeDecl *namedTypeDecl = local_indexer->lookupType( typeInst-> get_name()) ) {791 if ( NamedTypeDecl *namedTypeDecl = local_indexer->lookupType( typeInst->name ) ) { 603 792 if ( TypeDecl *typeDecl = dynamic_cast< TypeDecl * >( namedTypeDecl ) ) { 604 793 typeInst->set_isFtype( typeDecl->get_kind() == TypeDecl::Ftype ); … … 679 868 680 869 681 bool isTypedef( Declaration *decl ) { 682 return dynamic_cast< TypedefDecl * >( decl ); 683 } 684 685 void EliminateTypedef::eliminateTypedef( std::list< Declaration * > &translationUnit ) { 686 PassVisitor<EliminateTypedef> eliminator; 870 void ReplaceTypedef::replaceTypedef( std::list< Declaration * > &translationUnit ) { 871 PassVisitor<ReplaceTypedef> eliminator; 687 872 mutateAll( translationUnit, eliminator ); 688 873 if ( eliminator.pass.typedefNames.count( "size_t" ) ) { 689 874 // grab and remember declaration of size_t 690 SizeType = eliminator.pass.typedefNames["size_t"].first-> get_base()->clone();875 SizeType = eliminator.pass.typedefNames["size_t"].first->base->clone(); 691 876 } else { 692 877 // xxx - missing global typedef for size_t - default to long unsigned int, even though that may be wrong … … 694 879 SizeType = new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ); 695 880 } 696 filter( translationUnit, isTypedef, true ); 697 } 698 699 Type * EliminateTypedef::postmutate( TypeInstType * typeInst ) { 881 } 882 883 void ReplaceTypedef::premutate( QualifiedType * ) { 884 visit_children = false; 885 } 886 887 Type * ReplaceTypedef::postmutate( QualifiedType * qualType ) { 888 // replacing typedefs only makes sense for the 'oldest ancestor' of the qualified type 889 qualType->parent = qualType->parent->acceptMutator( *visitor ); 890 return qualType; 891 } 892 893 Type * ReplaceTypedef::postmutate( TypeInstType * typeInst ) { 700 894 // instances of typedef types will come here. If it is an instance 701 895 // of a typdef type, link the instance to its actual type. 702 TypedefMap::const_iterator def = typedefNames.find( typeInst-> get_name());896 TypedefMap::const_iterator def = typedefNames.find( typeInst->name ); 703 897 if ( def != typedefNames.end() ) { 704 898 Type *ret = def->second.first->base->clone(); … … 717 911 SemanticError( typeInst->location, "Cannot apply type parameters to base type of " + typeInst->name ); 718 912 } 719 rtt-> get_parameters().clear();913 rtt->parameters.clear(); 720 914 cloneAll( typeInst->parameters, rtt->parameters ); 721 915 mutateAll( rtt->parameters, *visitor ); // recursively fix typedefs on parameters … … 724 918 return ret; 725 919 } else { 726 TypeDeclMap::const_iterator base = typedeclNames.find( typeInst-> get_name());920 TypeDeclMap::const_iterator base = typedeclNames.find( typeInst->name ); 727 921 assertf( base != typedeclNames.end(), "Cannot find typedecl name %s", typeInst->name.c_str() ); 728 922 typeInst->set_baseType( base->second ); … … 745 939 } 746 940 747 Declaration * EliminateTypedef::postmutate( TypedefDecl * tyDecl ) {748 if ( typedefNames.count( tyDecl-> get_name() ) == 1 && typedefNames[ tyDecl->get_name()].second == scopeLevel ) {941 Declaration * ReplaceTypedef::postmutate( TypedefDecl * tyDecl ) { 942 if ( typedefNames.count( tyDecl->name ) == 1 && typedefNames[ tyDecl->name ].second == scopeLevel ) { 749 943 // typedef to the same name from the same scope 750 944 // must be from the same type 751 945 752 Type * t1 = tyDecl-> get_base();753 Type * t2 = typedefNames[ tyDecl-> get_name() ].first->get_base();946 Type * t1 = tyDecl->base; 947 Type * t2 = typedefNames[ tyDecl->name ].first->base; 754 948 if ( ! ResolvExpr::typesCompatible( t1, t2, Indexer() ) ) { 755 949 SemanticError( tyDecl->location, "Cannot redefine typedef: " + tyDecl->name ); … … 763 957 } 764 958 } else { 765 typedefNames[ tyDecl-> get_name()] = std::make_pair( TypedefDeclPtr( tyDecl ), scopeLevel );959 typedefNames[ tyDecl->name ] = std::make_pair( TypedefDeclPtr( tyDecl ), scopeLevel ); 766 960 } // if 767 961 … … 775 969 // Note, qualifiers on the typedef are superfluous for the forward declaration. 776 970 777 Type *designatorType = tyDecl-> get_base()->stripDeclarator();971 Type *designatorType = tyDecl->base->stripDeclarator(); 778 972 if ( StructInstType *aggDecl = dynamic_cast< StructInstType * >( designatorType ) ) { 779 return new StructDecl( aggDecl->get_name(), DeclarationNode::Struct, noAttributes, tyDecl->get_linkage() );973 declsToAddBefore.push_back( new StructDecl( aggDecl->name, DeclarationNode::Struct, noAttributes, tyDecl->linkage ) ); 780 974 } else if ( UnionInstType *aggDecl = dynamic_cast< UnionInstType * >( designatorType ) ) { 781 return new UnionDecl( aggDecl->get_name(), noAttributes, tyDecl->get_linkage() );975 declsToAddBefore.push_back( new UnionDecl( aggDecl->name, noAttributes, tyDecl->linkage ) ); 782 976 } else if ( EnumInstType *enumDecl = dynamic_cast< EnumInstType * >( designatorType ) ) { 783 return new EnumDecl( enumDecl->get_name(), noAttributes, tyDecl->get_linkage() ); 784 } else { 785 return tyDecl->clone(); 786 } // if 787 } 788 789 void EliminateTypedef::premutate( TypeDecl * typeDecl ) { 790 TypedefMap::iterator i = typedefNames.find( typeDecl->get_name() ); 977 declsToAddBefore.push_back( new EnumDecl( enumDecl->name, noAttributes, tyDecl->linkage ) ); 978 } // if 979 return tyDecl->clone(); 980 } 981 982 void ReplaceTypedef::premutate( TypeDecl * typeDecl ) { 983 TypedefMap::iterator i = typedefNames.find( typeDecl->name ); 791 984 if ( i != typedefNames.end() ) { 792 985 typedefNames.erase( i ) ; 793 986 } // if 794 987 795 typedeclNames[ typeDecl-> get_name()] = typeDecl;796 } 797 798 void EliminateTypedef::premutate( FunctionDecl * ) {988 typedeclNames[ typeDecl->name ] = typeDecl; 989 } 990 991 void ReplaceTypedef::premutate( FunctionDecl * ) { 799 992 GuardScope( typedefNames ); 800 993 } 801 994 802 void EliminateTypedef::premutate( ObjectDecl * ) {995 void ReplaceTypedef::premutate( ObjectDecl * ) { 803 996 GuardScope( typedefNames ); 804 997 } 805 998 806 DeclarationWithType * EliminateTypedef::postmutate( ObjectDecl * objDecl ) {807 if ( FunctionType *funtype = dynamic_cast<FunctionType *>( objDecl-> get_type()) ) { // function type?999 DeclarationWithType * ReplaceTypedef::postmutate( ObjectDecl * objDecl ) { 1000 if ( FunctionType *funtype = dynamic_cast<FunctionType *>( objDecl->type ) ) { // function type? 808 1001 // replace the current object declaration with a function declaration 809 FunctionDecl * newDecl = new FunctionDecl( objDecl-> get_name(), objDecl->get_storageClasses(), objDecl->get_linkage(), funtype, 0, objDecl->get_attributes(), objDecl->get_funcSpec() );810 objDecl-> get_attributes().clear();1002 FunctionDecl * newDecl = new FunctionDecl( objDecl->name, objDecl->get_storageClasses(), objDecl->linkage, funtype, 0, objDecl->attributes, objDecl->get_funcSpec() ); 1003 objDecl->attributes.clear(); 811 1004 objDecl->set_type( nullptr ); 812 1005 delete objDecl; … … 816 1009 } 817 1010 818 void EliminateTypedef::premutate( CastExpr * ) {1011 void ReplaceTypedef::premutate( CastExpr * ) { 819 1012 GuardScope( typedefNames ); 820 1013 } 821 1014 822 void EliminateTypedef::premutate( CompoundStmt * ) {1015 void ReplaceTypedef::premutate( CompoundStmt * ) { 823 1016 GuardScope( typedefNames ); 824 1017 scopeLevel += 1; … … 826 1019 } 827 1020 828 CompoundStmt *EliminateTypedef::postmutate( CompoundStmt * compoundStmt ) {829 // remove and delete decl stmts830 filter( compoundStmt->kids, [](Statement * stmt) {831 if ( DeclStmt *declStmt = dynamic_cast< DeclStmt * >( stmt ) ) {832 if ( dynamic_cast< TypedefDecl * >( declStmt->get_decl() ) ) {833 return true;834 } // if835 } // if836 return false;837 }, true);838 return compoundStmt;839 }840 841 // there may be typedefs nested within aggregates. in order for everything to work properly, these should be removed842 // as well843 1021 template<typename AggDecl> 844 AggDecl *EliminateTypedef::handleAggregate( AggDecl * aggDecl ) { 845 filter( aggDecl->members, isTypedef, true ); 846 return aggDecl; 847 } 848 849 template<typename AggDecl> 850 void EliminateTypedef::addImplicitTypedef( AggDecl * aggDecl ) { 1022 void ReplaceTypedef::addImplicitTypedef( AggDecl * aggDecl ) { 851 1023 if ( typedefNames.count( aggDecl->get_name() ) == 0 ) { 852 1024 Type *type = nullptr; … … 860 1032 TypedefDeclPtr tyDecl( new TypedefDecl( aggDecl->get_name(), aggDecl->location, Type::StorageClasses(), type, aggDecl->get_linkage() ) ); 861 1033 typedefNames[ aggDecl->get_name() ] = std::make_pair( std::move( tyDecl ), scopeLevel ); 862 } // if 863 } 864 865 void EliminateTypedef::premutate( StructDecl * structDecl ) { 1034 // add the implicit typedef to the AST 1035 declsToAddBefore.push_back( new TypedefDecl( aggDecl->get_name(), aggDecl->location, Type::StorageClasses(), type->clone(), aggDecl->get_linkage() ) ); 1036 } // if 1037 } 1038 1039 template< typename AggDecl > 1040 void ReplaceTypedef::handleAggregate( AggDecl * aggr ) { 1041 SemanticErrorException errors; 1042 1043 ValueGuard< std::list<Declaration * > > oldBeforeDecls( declsToAddBefore ); 1044 ValueGuard< std::list<Declaration * > > oldAfterDecls ( declsToAddAfter ); 1045 declsToAddBefore.clear(); 1046 declsToAddAfter.clear(); 1047 1048 GuardScope( typedefNames ); 1049 mutateAll( aggr->parameters, *visitor ); 1050 1051 // unroll mutateAll for aggr->members so that implicit typedefs for nested types are added to the aggregate body. 1052 for ( std::list< Declaration * >::iterator i = aggr->members.begin(); i != aggr->members.end(); ++i ) { 1053 if ( !declsToAddAfter.empty() ) { aggr->members.splice( i, declsToAddAfter ); } 1054 1055 try { 1056 *i = maybeMutate( *i, *visitor ); 1057 } catch ( SemanticErrorException &e ) { 1058 errors.append( e ); 1059 } 1060 1061 if ( !declsToAddBefore.empty() ) { aggr->members.splice( i, declsToAddBefore ); } 1062 } 1063 1064 if ( !declsToAddAfter.empty() ) { aggr->members.splice( aggr->members.end(), declsToAddAfter ); } 1065 if ( !errors.isEmpty() ) { throw errors; } 1066 } 1067 1068 void ReplaceTypedef::premutate( StructDecl * structDecl ) { 1069 visit_children = false; 866 1070 addImplicitTypedef( structDecl ); 867 } 868 869 870 Declaration *EliminateTypedef::postmutate( StructDecl * structDecl ) { 871 return handleAggregate( structDecl ); 872 } 873 874 void EliminateTypedef::premutate( UnionDecl * unionDecl ) { 1071 handleAggregate( structDecl ); 1072 } 1073 1074 void ReplaceTypedef::premutate( UnionDecl * unionDecl ) { 1075 visit_children = false; 875 1076 addImplicitTypedef( unionDecl ); 876 } 877 878 Declaration *EliminateTypedef::postmutate( UnionDecl * unionDecl ) { 879 return handleAggregate( unionDecl ); 880 } 881 882 void EliminateTypedef::premutate( EnumDecl * enumDecl ) { 1077 handleAggregate( unionDecl ); 1078 } 1079 1080 void ReplaceTypedef::premutate( EnumDecl * enumDecl ) { 883 1081 addImplicitTypedef( enumDecl ); 884 1082 } 885 1083 886 Declaration *EliminateTypedef::postmutate( EnumDecl * enumDecl ) { 887 return handleAggregate( enumDecl ); 888 } 889 890 Declaration *EliminateTypedef::postmutate( TraitDecl * traitDecl ) { 891 return handleAggregate( traitDecl ); 892 } 893 894 void EliminateTypedef::premutate( FunctionType * ) { 1084 void ReplaceTypedef::premutate( FunctionType * ) { 895 1085 GuardValue( inFunctionType ); 896 1086 inFunctionType = true; … … 1024 1214 1025 1215 void ArrayLength::previsit( ObjectDecl * objDecl ) { 1026 if ( ArrayType * at = dynamic_cast< ArrayType * >( objDecl-> get_type()) ) {1216 if ( ArrayType * at = dynamic_cast< ArrayType * >( objDecl->type ) ) { 1027 1217 if ( at->get_dimension() ) return; 1028 if ( ListInit * init = dynamic_cast< ListInit * >( objDecl-> get_init()) ) {1029 at->set_dimension( new ConstantExpr( Constant::from_ulong( init-> get_initializers().size() ) ) );1218 if ( ListInit * init = dynamic_cast< ListInit * >( objDecl->init ) ) { 1219 at->set_dimension( new ConstantExpr( Constant::from_ulong( init->initializers.size() ) ) ); 1030 1220 } 1031 1221 }
Note:
See TracChangeset
for help on using the changeset viewer.