Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/AST/SymbolTable.cpp

    rd859a30 rbb7422a  
    260260void SymbolTable::addId( const DeclWithType * decl, const Expr * baseExpr ) {
    261261        // default handling of conflicts is to raise an error
    262         addIdCommon( decl, OnConflict::error(), baseExpr, decl->isDeleted ? decl : nullptr );
     262        addId( decl, OnConflict::error(), baseExpr, decl->isDeleted ? decl : nullptr );
    263263}
    264264
    265265void SymbolTable::addDeletedId( const DeclWithType * decl, const Decl * deleter ) {
    266266        // default handling of conflicts is to raise an error
    267         addIdCommon( decl, OnConflict::error(), nullptr, deleter );
     267        addId( decl, OnConflict::error(), nullptr, deleter );
    268268}
    269269
     
    677677}
    678678
    679 void SymbolTable::addIdCommon(
    680                 const DeclWithType * decl, SymbolTable::OnConflict handleConflicts,
    681                 const Expr * baseExpr, const Decl * deleter ) {
     679void SymbolTable::addId(
     680                const DeclWithType * decl, SymbolTable::OnConflict handleConflicts, const Expr * baseExpr,
     681                const Decl * deleter ) {
    682682        SpecialFunctionKind kind = getSpecialFunctionKind(decl->name);
    683683        if (kind == NUMBER_OF_KINDS) { // not a special decl
    684                 addIdToTable(decl, decl->name, idTable, handleConflicts, baseExpr, deleter);
     684                addId(decl, decl->name, idTable, handleConflicts, baseExpr, deleter);
    685685        }
    686686        else {
     
    695695                        assertf(false, "special decl with non-function type");
    696696                }
    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
     701void SymbolTable::addId(
     702                const DeclWithType * decl, const std::string & lookupKey, IdTable::Ptr & table, SymbolTable::OnConflict handleConflicts, const Expr * baseExpr,
     703                const Decl * deleter ) {
    705704        ++*stats().add_calls;
    706705        const std::string &name = decl->name;
     
    779778void SymbolTable::addMembers(
    780779                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                        }
    799798                }
    800799        }
Note: See TracChangeset for help on using the changeset viewer.