Ignore:
Timestamp:
Aug 31, 2023, 5:51:00 PM (9 months ago)
Author:
JiadaL <j82liang@…>
Branches:
master
Children:
2a301ff
Parents:
c84dd61
Message:

Array can use enum instance with explicit initializer as designator. More general case will be covered in later commit

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/ResolvExpr/CurrentObject.cc

    rc84dd61 r92355883  
    10451045                        PRINT( std::cerr << "____untyped: " << expr << std::endl; )
    10461046                        auto dit = desigAlts.begin();
    1047                         if ( auto nexpr = dynamic_cast< const NameExpr * >( expr ) ) {
    1048                                 for ( const Type * t : curTypes ) {
    1049                                         assert( dit != desigAlts.end() );
    1050 
    1051                                         DesignatorChain & d = *dit;
     1047
     1048                        for ( const Type * t : curTypes ) {
     1049                                assert( dit != desigAlts.end() );
     1050                                DesignatorChain & d = *dit;
     1051                                if ( auto nexpr = dynamic_cast< const NameExpr *>( expr ) ) {
    10521052                                        PRINT( std::cerr << "____actual: " << t << std::endl; )
    10531053                                        if ( auto refType = dynamic_cast< const BaseInstType * >( t ) ) {
     
    10621062                                                        }
    10631063                                                }
     1064                                        } else if ( auto at = dynamic_cast< const ArrayType * >( t ) ) {
     1065                                                auto nexpr = dynamic_cast< const NameExpr *>( expr );
     1066                                                auto res = eval( nexpr );
     1067                                                for ( const Decl * mem : refType->lookup( nexpr->name ) ) {
     1068                                                        if ( auto field = dynamic_cast< const ObjectDecl * >( mem ) ) {
     1069                                                                DesignatorChain d2 = d;
     1070                                                                d2.emplace_back( new VariableExpr{ expr->location, field } );
     1071                                                                newDesigAlts.emplace_back( std::move( d2 ) );
     1072                                                                // newTypes.emplace_back( field->type );
     1073                                                                newTypes.emplace_back( at->base );
     1074                                                        }
     1075                                                }
     1076
     1077                                                // d.emplace_back( expr );
     1078                                                // newDesigAlts.emplace_back( d );
     1079                                                // newTypes.emplace_back( at->base );
    10641080                                        }
    10651081
    10661082                                        ++dit;
    1067                                 }
    1068                         } else {
    1069                                 for ( const Type * t : curTypes ) {
    1070                                         assert( dit != desigAlts.end() );
    1071 
    1072                                         DesignatorChain & d = *dit;
     1083                                } else {
    10731084                                        if ( auto at = dynamic_cast< const ArrayType * >( t ) ) {
    10741085                                                PRINT( std::cerr << "____alt: " << at->get_base() << std::endl; )
Note: See TracChangeset for help on using the changeset viewer.