Changeset 1048b31 for src/SymTab
- Timestamp:
- May 2, 2016, 3:28:16 PM (10 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, ctor, deferred_resn, demangler, enum, forall-pointer-decay, gc_noraii, jacob/cs343-translation, jenkins-sandbox, master, memory, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, stuck-waitfor-destruct, with_gc
- Children:
- 1b7ea43
- Parents:
- 1f6e009 (diff), e945826 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - Location:
- src/SymTab
- Files:
-
- 4 edited
-
AddVisit.h (modified) (3 diffs)
-
Indexer.cc (modified) (26 diffs)
-
Indexer.h (modified) (2 diffs)
-
Validate.cc (modified) (18 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/SymTab/AddVisit.h
r1f6e009 r1048b31 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sun May 17 16:14:32 2015 11 // Last Modified By : Rob Schluntz12 // Last Modified On : T ue Jul 14 12:26:17 201513 // Update Count : 411 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Apr 7 14:42:21 2016 13 // Update Count : 5 14 14 // 15 15 … … 27 27 28 28 template< typename Visitor > 29 inline void addVisitStatement( Statement *stmt, Visitor &visitor ) {30 maybeAccept( stmt, visitor );31 /// if ( ! declsToAdd.empty() ) {32 /// CompoundStmt *compound = new CompoundStmt( noLabels );33 /// compound->get_kids().push_back( stmt );34 /// addDecls( declsToAdd, compound->get_kids(), compound->get_kids().end() );35 /// }36 }37 38 template< typename Visitor >39 29 inline void addVisit(CompoundStmt *compoundStmt, Visitor &visitor) { 40 30 addVisitStatementList( compoundStmt->get_kids(), visitor ); 41 }42 43 template< typename Visitor >44 inline void addVisit(IfStmt *ifStmt, Visitor &visitor) {45 addVisitStatement( ifStmt->get_thenPart(), visitor );46 addVisitStatement( ifStmt->get_elsePart(), visitor );47 maybeAccept( ifStmt->get_condition(), visitor );48 }49 50 template< typename Visitor >51 inline void addVisit(WhileStmt *whileStmt, Visitor &visitor) {52 addVisitStatement( whileStmt->get_body(), visitor );53 maybeAccept( whileStmt->get_condition(), visitor );54 }55 56 template< typename Visitor >57 inline void addVisit(ForStmt *forStmt, Visitor &visitor) {58 addVisitStatement( forStmt->get_body(), visitor );59 acceptAll( forStmt->get_initialization(), visitor );60 maybeAccept( forStmt->get_condition(), visitor );61 maybeAccept( forStmt->get_increment(), visitor );62 31 } 63 32 … … 74 43 } 75 44 76 template< typename Visitor > 77 inline void addVisit(CaseStmt *caseStmt, Visitor &visitor) { 78 addVisitStatementList( caseStmt->get_statements(), visitor ); 79 maybeAccept( caseStmt->get_condition(), visitor ); 80 } 81 82 template< typename Visitor > 83 inline void addVisit(CatchStmt *cathStmt, Visitor &visitor) { 84 addVisitStatement( cathStmt->get_body(), visitor ); 85 maybeAccept( cathStmt->get_decl(), visitor ); 86 } 45 // template< typename Visitor > 46 // inline void addVisit(CaseStmt *caseStmt, Visitor &visitor) { 47 // addVisitStatementList( caseStmt->get_statements(), visitor ); 48 // maybeAccept( caseStmt->get_condition(), visitor ); 49 // } 87 50 } // namespace SymTab 88 51 -
src/SymTab/Indexer.cc
r1f6e009 r1048b31 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // Indexer.cc -- 7 // Indexer.cc -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sun May 17 21:37:33 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Wed Mar 2 17:31:29201611 // Last Modified By : Rob Schluntz 12 // Last Modified On : Fri Apr 22 15:25:43 2016 13 13 // Update Count : 11 14 14 // … … 59 59 } 60 60 } 61 61 62 62 template< typename Decl > 63 63 void dump( const std::unordered_map< std::string, Decl* > &table, std::ostream &os ) { … … 66 66 } // for 67 67 } 68 68 69 69 struct Indexer::Impl { 70 70 Impl( unsigned long _scope ) : refCount(1), scope( _scope ), size( 0 ), base(), … … 76 76 unsigned long size; ///< Number of elements stored in this table 77 77 const Indexer base; ///< Base indexer this extends 78 78 79 79 IdTable idTable; ///< Identifier namespace 80 80 TypeTable typeTable; ///< Type namespace … … 213 213 void Indexer::visit( StructDecl *aggregateDecl ) { 214 214 // make up a forward declaration and add it before processing the members 215 StructDecl fwdDecl( aggregateDecl->get_name() ); 215 // needs to be on the heap because addStruct saves the pointer 216 StructDecl &fwdDecl = *new StructDecl( aggregateDecl->get_name() ); 216 217 cloneAll( aggregateDecl->get_parameters(), fwdDecl.get_parameters() ); 217 218 debugPrint( "Adding fwd decl for struct " << fwdDecl.get_name() << std::endl ); 218 219 addStruct( &fwdDecl ); 219 220 220 221 enterScope(); 221 222 acceptAll( aggregateDecl->get_parameters(), *this ); 222 223 acceptAll( aggregateDecl->get_members(), *this ); 223 224 leaveScope(); 224 225 225 226 debugPrint( "Adding struct " << aggregateDecl->get_name() << std::endl ); 226 227 // this addition replaces the forward declaration … … 234 235 debugPrint( "Adding fwd decl for union " << fwdDecl.get_name() << std::endl ); 235 236 addUnion( &fwdDecl ); 236 237 237 238 enterScope(); 238 239 acceptAll( aggregateDecl->get_parameters(), *this ); 239 240 acceptAll( aggregateDecl->get_members(), *this ); 240 241 leaveScope(); 241 242 242 243 debugPrint( "Adding union " << aggregateDecl->get_name() << std::endl ); 243 244 addUnion( aggregateDecl ); … … 256 257 acceptAll( aggregateDecl->get_members(), *this ); 257 258 leaveScope(); 258 259 259 260 debugPrint( "Adding context " << aggregateDecl->get_name() << std::endl ); 260 261 addTrait( aggregateDecl ); … … 344 345 maybeAccept( offsetofExpr->get_type(), *this ); 345 346 maybeAccept( offsetofExpr->get_member(), *this ); 347 } 348 349 void Indexer::visit( OffsetPackExpr *offsetPackExpr ) { 350 acceptAllNewScope( offsetPackExpr->get_results(), *this ); 351 maybeAccept( offsetPackExpr->get_type(), *this ); 346 352 } 347 353 … … 433 439 } 434 440 435 441 436 442 437 443 void Indexer::lookupId( const std::string &id, std::list< DeclarationWithType* > &out ) const { 438 444 std::unordered_set< std::string > foundMangleNames; 439 445 440 446 Indexer::Impl *searchTables = tables; 441 447 while ( searchTables ) { … … 447 453 // mark the mangled name as found, skipping this insertion if a declaration for that name has already been found 448 454 if ( foundMangleNames.insert( decl->first ).second == false ) continue; 449 455 450 456 out.push_back( decl->second ); 451 457 } 452 458 } 453 459 454 460 // get declarations from base indexers 455 461 searchTables = searchTables->base.tables; … … 506 512 } 507 513 508 bool Indexer::hasIncompatibleCDecl( const std::string &id, const std::string &mangleName ) const {514 bool Indexer::hasIncompatibleCDecl( const std::string &id, const std::string &mangleName, unsigned long scope ) const { 509 515 if ( ! tables ) return false; 516 if ( tables->scope < scope ) return false; 510 517 511 518 IdTable::const_iterator decls = tables->idTable.find( id ); … … 513 520 const MangleTable &mangleTable = decls->second; 514 521 for ( MangleTable::const_iterator decl = mangleTable.begin(); decl != mangleTable.end(); ++decl ) { 515 // check for C decls with the same name, skipping 522 // check for C decls with the same name, skipping 516 523 // those with a compatible type (by mangleName) 517 524 if ( decl->second->get_linkage() == LinkageSpec::C && decl->first != mangleName ) return true; … … 519 526 } 520 527 521 return tables->base.hasIncompatibleCDecl( id, mangleName );522 } 523 528 return tables->base.hasIncompatibleCDecl( id, mangleName, scope ); 529 } 530 524 531 NamedTypeDecl *Indexer::lookupTypeAtScope( const std::string &id, unsigned long scope ) const { 525 532 if ( ! tables ) return 0; … … 529 536 return ret != tables->typeTable.end() ? ret->second : tables->base.lookupTypeAtScope( id, scope ); 530 537 } 531 538 532 539 StructDecl *Indexer::lookupStructAtScope( const std::string &id, unsigned long scope ) const { 533 540 if ( ! tables ) return 0; … … 537 544 return ret != tables->structTable.end() ? ret->second : tables->base.lookupStructAtScope( id, scope ); 538 545 } 539 546 540 547 EnumDecl *Indexer::lookupEnumAtScope( const std::string &id, unsigned long scope ) const { 541 548 if ( ! tables ) return 0; … … 545 552 return ret != tables->enumTable.end() ? ret->second : tables->base.lookupEnumAtScope( id, scope ); 546 553 } 547 554 548 555 UnionDecl *Indexer::lookupUnionAtScope( const std::string &id, unsigned long scope ) const { 549 556 if ( ! tables ) return 0; … … 553 560 return ret != tables->unionTable.end() ? ret->second : tables->base.lookupUnionAtScope( id, scope ); 554 561 } 555 562 556 563 TraitDecl *Indexer::lookupTraitAtScope( const std::string &id, unsigned long scope ) const { 557 564 if ( ! tables ) return 0; … … 596 603 return true; 597 604 } 598 605 599 606 void Indexer::addId( DeclarationWithType *decl ) { 600 607 makeWritable(); … … 612 619 DeclarationWithType *existing = lookupIdAtScope( name, mangleName, scope ); 613 620 if ( ! existing || ! addedIdConflicts( existing, decl ) ) { 614 // this ensures that no two declarations with the same unmangled name both have C linkage615 if ( decl->get_linkage() == LinkageSpec::C && hasIncompatibleCDecl( name, mangleName ) ) {621 // this ensures that no two declarations with the same unmangled name at the same scope both have C linkage 622 if ( decl->get_linkage() == LinkageSpec::C && hasIncompatibleCDecl( name, mangleName, scope ) ) { 616 623 throw SemanticError( "invalid overload of C function ", decl ); 617 } // NOTE this is broken in Richard's original code in such a way that it never triggers (it 618 // doesn't check decls that have the same manglename, and all C-linkage decls are defined to 624 } // NOTE this is broken in Richard's original code in such a way that it never triggers (it 625 // doesn't check decls that have the same manglename, and all C-linkage decls are defined to 619 626 // have their name as their manglename, hence the error can never trigger). 620 // The code here is closer to correct, but name mangling would have to be completely 627 // The code here is closer to correct, but name mangling would have to be completely 621 628 // isomorphic to C type-compatibility, which it may not be. 622 629 623 630 tables->idTable[ name ][ mangleName ] = decl; 624 631 ++tables->size; … … 635 642 } 636 643 } 637 644 638 645 void Indexer::addType( NamedTypeDecl *decl ) { 639 646 makeWritable(); … … 666 673 addStruct( new StructDecl( id ) ); 667 674 } 668 675 669 676 void Indexer::addStruct( StructDecl *decl ) { 670 677 makeWritable(); … … 684 691 } 685 692 } 686 693 687 694 void Indexer::addEnum( EnumDecl *decl ) { 688 695 makeWritable(); … … 706 713 addUnion( new UnionDecl( id ) ); 707 714 } 708 715 709 716 void Indexer::addUnion( UnionDecl *decl ) { 710 717 makeWritable(); … … 724 731 } 725 732 } 726 733 727 734 void Indexer::addTrait( TraitDecl *decl ) { 728 735 makeWritable(); … … 745 752 void Indexer::enterScope() { 746 753 ++scope; 747 754 748 755 if ( doDebug ) { 749 756 std::cout << "--- Entering scope " << scope << std::endl; … … 778 785 using std::cerr; 779 786 780 cerr << "===idTable===" << std::endl; 781 if ( tables ) dump( tables->idTable, os ); 782 cerr << "===typeTable===" << std::endl; 783 if ( tables ) dump( tables->typeTable, os ); 784 cerr << "===structTable===" << std::endl; 785 if ( tables ) dump( tables->structTable, os ); 786 cerr << "===enumTable===" << std::endl; 787 if ( tables ) dump( tables->enumTable, os ); 788 cerr << "===unionTable===" << std::endl; 789 if ( tables ) dump( tables->unionTable, os ); 790 cerr << "===contextTable===" << std::endl; 791 if ( tables ) dump( tables->traitTable, os ); 787 if ( tables ) { 788 os << "--- scope " << tables->scope << " ---" << std::endl; 789 790 os << "===idTable===" << std::endl; 791 dump( tables->idTable, os ); 792 os << "===typeTable===" << std::endl; 793 dump( tables->typeTable, os ); 794 os << "===structTable===" << std::endl; 795 dump( tables->structTable, os ); 796 os << "===enumTable===" << std::endl; 797 dump( tables->enumTable, os ); 798 os << "===unionTable===" << std::endl; 799 dump( tables->unionTable, os ); 800 os << "===contextTable===" << std::endl; 801 dump( tables->traitTable, os ); 802 803 tables->base.print( os, indent ); 804 } else { 805 os << "--- end ---" << std::endl; 806 } 807 792 808 } 793 809 } // namespace SymTab -
src/SymTab/Indexer.h
r1f6e009 r1048b31 59 59 virtual void visit( UntypedOffsetofExpr *offsetofExpr ); 60 60 virtual void visit( OffsetofExpr *offsetofExpr ); 61 virtual void visit( OffsetPackExpr *offsetPackExpr ); 61 62 virtual void visit( AttrExpr *attrExpr ); 62 63 virtual void visit( LogicalExpr *logicalExpr ); … … 98 99 DeclarationWithType *lookupIdAtScope( const std::string &id, const std::string &mangleName, unsigned long scope ) const; 99 100 /// returns true if there exists a declaration with C linkage and the given name with a different mangled name 100 bool hasIncompatibleCDecl( const std::string &id, const std::string &mangleName ) const;101 bool hasIncompatibleCDecl( const std::string &id, const std::string &mangleName, unsigned long scope ) const; 101 102 // equivalents to lookup functions that only look at tables at scope `scope` (which should be >= tables->scope) 102 103 NamedTypeDecl *lookupTypeAtScope( const std::string &id, unsigned long scope ) const; -
src/SymTab/Validate.cc
r1f6e009 r1048b31 10 10 // Created On : Sun May 17 21:50:04 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Mar 2 17:31:39201613 // Update Count : 2 2612 // Last Modified On : Wed Apr 13 16:39:30 2016 13 // Update Count : 251 14 14 // 15 15 … … 40 40 #include <list> 41 41 #include <iterator> 42 #include "Common/utility.h" 43 #include "Common/UniqueName.h" 42 44 #include "Validate.h" 43 45 #include "SynTree/Visitor.h" 44 46 #include "SynTree/Mutator.h" 45 47 #include "SynTree/Type.h" 48 #include "SynTree/Expression.h" 46 49 #include "SynTree/Statement.h" 47 50 #include "SynTree/TypeSubstitution.h" … … 49 52 #include "FixFunction.h" 50 53 // #include "ImplementationType.h" 51 #include "Common/utility.h" 52 #include "Common/UniqueName.h" 54 #include "GenPoly/DeclMutator.h" 53 55 #include "AddVisit.h" 54 56 #include "MakeLibCfa.h" … … 70 72 71 73 virtual void visit( CompoundStmt *compoundStmt ); 72 virtual void visit( IfStmt *ifStmt );73 virtual void visit( WhileStmt *whileStmt );74 virtual void visit( ForStmt *forStmt );75 74 virtual void visit( SwitchStmt *switchStmt ); 76 75 virtual void visit( ChooseStmt *chooseStmt ); 77 virtual void visit( CaseStmt *caseStmt ); 78 virtual void visit( CatchStmt *catchStmt ); 76 // virtual void visit( CaseStmt *caseStmt ); 79 77 private: 80 78 HoistStruct(); … … 144 142 145 143 virtual void visit( CompoundStmt *compoundStmt ); 146 virtual void visit( IfStmt *ifStmt );147 virtual void visit( WhileStmt *whileStmt );148 virtual void visit( ForStmt *forStmt );149 144 virtual void visit( SwitchStmt *switchStmt ); 150 145 virtual void visit( ChooseStmt *chooseStmt ); 151 virtual void visit( CaseStmt *caseStmt ); 152 virtual void visit( CatchStmt *catchStmt ); 146 // virtual void visit( CaseStmt *caseStmt ); 153 147 154 148 AutogenerateRoutines() : functionNesting( 0 ) {} … … 166 160 /// and return something if the return type is non-void. 167 161 static void checkFunctionReturns( std::list< Declaration * > & translationUnit ); 168 169 162 private: 170 163 virtual void visit( FunctionDecl * functionDecl ); … … 197 190 AggDecl *handleAggregate( AggDecl * aggDecl ); 198 191 192 template<typename AggDecl> 193 void addImplicitTypedef( AggDecl * aggDecl ); 194 199 195 typedef std::map< std::string, std::pair< TypedefDecl *, int > > TypedefMap; 200 196 TypedefMap typedefNames; … … 202 198 }; 203 199 200 class CompoundLiteral : public GenPoly::DeclMutator { 201 DeclarationNode::StorageClass storageclass = DeclarationNode::NoStorageClass; 202 203 virtual DeclarationWithType * mutate( ObjectDecl *objectDecl ); 204 virtual Expression *mutate( CompoundLiteralExpr *compLitExpr ); 205 }; 206 204 207 void validate( std::list< Declaration * > &translationUnit, bool doDebug ) { 205 208 Pass1 pass1; 206 209 Pass2 pass2( doDebug, 0 ); 207 210 Pass3 pass3( 0 ); 211 CompoundLiteral compoundliteral; 212 208 213 EliminateTypedef::eliminateTypedef( translationUnit ); 209 214 HoistStruct::hoistStruct( translationUnit ); … … 211 216 acceptAll( translationUnit, pass2 ); 212 217 ReturnChecker::checkFunctionReturns( translationUnit ); 218 mutateAll( translationUnit, compoundliteral ); 213 219 AutogenerateRoutines::autogenerateRoutines( translationUnit ); 214 220 acceptAll( translationUnit, pass3 ); … … 292 298 } 293 299 294 void HoistStruct::visit( IfStmt *ifStmt ) {295 addVisit( ifStmt, *this );296 }297 298 void HoistStruct::visit( WhileStmt *whileStmt ) {299 addVisit( whileStmt, *this );300 }301 302 void HoistStruct::visit( ForStmt *forStmt ) {303 addVisit( forStmt, *this );304 }305 306 300 void HoistStruct::visit( SwitchStmt *switchStmt ) { 307 301 addVisit( switchStmt, *this ); … … 312 306 } 313 307 314 void HoistStruct::visit( CaseStmt *caseStmt ) { 315 addVisit( caseStmt, *this ); 316 } 317 318 void HoistStruct::visit( CatchStmt *cathStmt ) { 319 addVisit( cathStmt, *this ); 320 } 308 // void HoistStruct::visit( CaseStmt *caseStmt ) { 309 // addVisit( caseStmt, *this ); 310 // } 321 311 322 312 void Pass1::visit( EnumDecl *enumDecl ) { … … 874 864 } 875 865 876 void AutogenerateRoutines::visit( IfStmt *ifStmt ) {877 visitStatement( ifStmt );878 }879 880 void AutogenerateRoutines::visit( WhileStmt *whileStmt ) {881 visitStatement( whileStmt );882 }883 884 void AutogenerateRoutines::visit( ForStmt *forStmt ) {885 visitStatement( forStmt );886 }887 888 866 void AutogenerateRoutines::visit( SwitchStmt *switchStmt ) { 889 867 visitStatement( switchStmt ); … … 894 872 } 895 873 896 void AutogenerateRoutines::visit( CaseStmt *caseStmt ) { 897 visitStatement( caseStmt ); 898 } 899 900 void AutogenerateRoutines::visit( CatchStmt *cathStmt ) { 901 visitStatement( cathStmt ); 902 } 874 // void AutogenerateRoutines::visit( CaseStmt *caseStmt ) { 875 // visitStatement( caseStmt ); 876 // } 903 877 904 878 void ReturnChecker::checkFunctionReturns( std::list< Declaration * > & translationUnit ) { … … 947 921 } 948 922 rtt->get_parameters().clear(); 949 cloneAll(typeInst->get_parameters(), rtt->get_parameters()); 923 cloneAll( typeInst->get_parameters(), rtt->get_parameters() ); 924 mutateAll( rtt->get_parameters(), *this ); // recursively fix typedefs on parameters 950 925 } // if 951 926 delete typeInst; … … 1043 1018 } 1044 1019 1045 // there may be typedefs nested within aggregates 1046 // in order for everything to work properly, these 1047 // should be removed as well 1020 // there may be typedefs nested within aggregates in order for everything to work properly, these should be removed 1021 // as well 1048 1022 template<typename AggDecl> 1049 1023 AggDecl *EliminateTypedef::handleAggregate( AggDecl * aggDecl ) { … … 1059 1033 return aggDecl; 1060 1034 } 1061 1035 1036 template<typename AggDecl> 1037 void EliminateTypedef::addImplicitTypedef( AggDecl * aggDecl ) { 1038 if ( typedefNames.count( aggDecl->get_name() ) == 0 ) { 1039 Type *type; 1040 if ( StructDecl * newDeclStructDecl = dynamic_cast< StructDecl * >( aggDecl ) ) { 1041 type = new StructInstType( Type::Qualifiers(), newDeclStructDecl->get_name() ); 1042 } else if ( UnionDecl * newDeclUnionDecl = dynamic_cast< UnionDecl * >( aggDecl ) ) { 1043 type = new UnionInstType( Type::Qualifiers(), newDeclUnionDecl->get_name() ); 1044 } else if ( EnumDecl * newDeclEnumDecl = dynamic_cast< EnumDecl * >( aggDecl ) ) { 1045 type = new EnumInstType( Type::Qualifiers(), newDeclEnumDecl->get_name() ); 1046 } // if 1047 TypedefDecl * tyDecl = new TypedefDecl( aggDecl->get_name(), DeclarationNode::NoStorageClass, type ); 1048 typedefNames[ aggDecl->get_name() ] = std::make_pair( tyDecl, scopeLevel ); 1049 } // if 1050 } 1062 1051 Declaration *EliminateTypedef::mutate( StructDecl * structDecl ) { 1052 addImplicitTypedef( structDecl ); 1063 1053 Mutator::mutate( structDecl ); 1064 1054 return handleAggregate( structDecl ); … … 1066 1056 1067 1057 Declaration *EliminateTypedef::mutate( UnionDecl * unionDecl ) { 1058 addImplicitTypedef( unionDecl ); 1068 1059 Mutator::mutate( unionDecl ); 1069 1060 return handleAggregate( unionDecl ); … … 1071 1062 1072 1063 Declaration *EliminateTypedef::mutate( EnumDecl * enumDecl ) { 1064 addImplicitTypedef( enumDecl ); 1073 1065 Mutator::mutate( enumDecl ); 1074 1066 return handleAggregate( enumDecl ); 1075 1067 } 1076 1068 1077 Declaration *EliminateTypedef::mutate( TraitDecl * contextDecl ) {1069 Declaration *EliminateTypedef::mutate( TraitDecl * contextDecl ) { 1078 1070 Mutator::mutate( contextDecl ); 1079 1071 return handleAggregate( contextDecl ); 1080 1072 } 1081 1073 1074 DeclarationWithType * CompoundLiteral::mutate( ObjectDecl *objectDecl ) { 1075 storageclass = objectDecl->get_storageClass(); 1076 DeclarationWithType * temp = Mutator::mutate( objectDecl ); 1077 storageclass = DeclarationNode::NoStorageClass; 1078 return temp; 1079 } 1080 1081 Expression *CompoundLiteral::mutate( CompoundLiteralExpr *compLitExpr ) { 1082 // transform [storage_class] ... (struct S){ 3, ... }; 1083 // into [storage_class] struct S temp = { 3, ... }; 1084 static UniqueName indexName( "_compLit" ); 1085 1086 ObjectDecl *tempvar = new ObjectDecl( indexName.newName(), storageclass, LinkageSpec::C, 0, compLitExpr->get_type(), compLitExpr->get_initializer() ); 1087 compLitExpr->set_type( 0 ); 1088 compLitExpr->set_initializer( 0 ); 1089 delete compLitExpr; 1090 DeclarationWithType * newtempvar = mutate( tempvar ); 1091 addDeclaration( newtempvar ); // add modified temporary to current block 1092 return new VariableExpr( newtempvar ); 1093 } 1082 1094 } // namespace SymTab 1083 1095
Note:
See TracChangeset
for help on using the changeset viewer.