Changes in src/AST/SymbolTable.cpp [d859a30:bb7422a]
- File:
-
- 1 edited
-
src/AST/SymbolTable.cpp (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/AST/SymbolTable.cpp
rd859a30 rbb7422a 260 260 void SymbolTable::addId( const DeclWithType * decl, const Expr * baseExpr ) { 261 261 // default handling of conflicts is to raise an error 262 addId Common( decl, OnConflict::error(), baseExpr, decl->isDeleted ? decl : nullptr );262 addId( decl, OnConflict::error(), baseExpr, decl->isDeleted ? decl : nullptr ); 263 263 } 264 264 265 265 void SymbolTable::addDeletedId( const DeclWithType * decl, const Decl * deleter ) { 266 266 // default handling of conflicts is to raise an error 267 addId Common( decl, OnConflict::error(), nullptr, deleter );267 addId( decl, OnConflict::error(), nullptr, deleter ); 268 268 } 269 269 … … 677 677 } 678 678 679 void SymbolTable::addId Common(680 const DeclWithType * decl, SymbolTable::OnConflict handleConflicts, 681 const Expr * baseExpr, constDecl * deleter ) {679 void SymbolTable::addId( 680 const DeclWithType * decl, SymbolTable::OnConflict handleConflicts, const Expr * baseExpr, 681 const Decl * deleter ) { 682 682 SpecialFunctionKind kind = getSpecialFunctionKind(decl->name); 683 683 if (kind == NUMBER_OF_KINDS) { // not a special decl 684 addId ToTable(decl, decl->name, idTable, handleConflicts, baseExpr, deleter);684 addId(decl, decl->name, idTable, handleConflicts, baseExpr, deleter); 685 685 } 686 686 else { … … 695 695 assertf(false, "special decl with non-function type"); 696 696 } 697 addIdToTable(decl, key, specialFunctionTable[kind], handleConflicts, baseExpr, deleter); 698 } 699 } 700 701 void SymbolTable::addIdToTable( 702 const DeclWithType * decl, const std::string & lookupKey, 703 IdTable::Ptr & table, SymbolTable::OnConflict handleConflicts, 704 const Expr * baseExpr, const Decl * deleter ) { 697 addId(decl, key, specialFunctionTable[kind], handleConflicts, baseExpr, deleter); 698 } 699 } 700 701 void SymbolTable::addId( 702 const DeclWithType * decl, const std::string & lookupKey, IdTable::Ptr & table, SymbolTable::OnConflict handleConflicts, const Expr * baseExpr, 703 const Decl * deleter ) { 705 704 ++*stats().add_calls; 706 705 const std::string &name = decl->name; … … 779 778 void SymbolTable::addMembers( 780 779 const AggregateDecl * aggr, const Expr * expr, SymbolTable::OnConflict handleConflicts ) { 781 for ( const ptr<Decl> &decl : aggr->members ) {782 auto dwt = decl.as<DeclWithType>();783 if ( nullptr == dwt ) continue;784 addIdCommon( dwt, handleConflicts, expr );785 // Inline through unnamed struct/union members.786 if ( "" != dwt->name ) continue;787 const Type * t = dwt->get_type()->stripReferences();788 if ( auto rty = dynamic_cast<const BaseInstType *>( t ) ) {789 if ( ! dynamic_cast<const StructInstType *>(rty)790 && ! dynamic_cast<const UnionInstType *>(rty) ) continue;791 ResolvExpr::Cost cost = ResolvExpr::Cost::zero;792 ast::ptr<ast::TypeSubstitution> tmp = expr->env;793 expr = mutate_field(expr, &Expr::env, nullptr);794 const Expr * base = ResolvExpr::referenceToRvalueConversion( expr, cost ); 795 base = mutate_field(base, &Expr::env, tmp);796 797 addMembers(798 rty->aggr(), new MemberExpr{ base->location, dwt, base }, handleConflicts );780 for ( const Decl * decl : aggr->members ) { 781 if ( auto dwt = dynamic_cast< const DeclWithType * >( decl ) ) { 782 addId( dwt, handleConflicts, expr ); 783 if ( dwt->name == "" ) { 784 const Type * t = dwt->get_type()->stripReferences(); 785 if ( auto rty = dynamic_cast<const BaseInstType *>( t ) ) { 786 if ( ! dynamic_cast<const StructInstType *>(rty) 787 && ! dynamic_cast<const UnionInstType *>(rty) ) continue; 788 ResolvExpr::Cost cost = ResolvExpr::Cost::zero; 789 ast::ptr<ast::TypeSubstitution> tmp = expr->env; 790 expr = mutate_field(expr, &Expr::env, nullptr); 791 const Expr * base = ResolvExpr::referenceToRvalueConversion( expr, cost ); 792 base = mutate_field(base, &Expr::env, tmp); 793 794 addMembers( 795 rty->aggr(), new MemberExpr{ base->location, dwt, base }, handleConflicts ); 796 } 797 } 799 798 } 800 799 }
Note:
See TracChangeset
for help on using the changeset viewer.