Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/CodeGen/CodeGenerator.cc

    rdaf1af8 r62423350  
    288288        }
    289289
    290         void CodeGenerator::printDesignators( std::list< Expression * > & designators ) {
    291                 typedef std::list< Expression * > DesignatorList;
     290        void CodeGenerator::visit( Designation * designation ) {
     291                std::list< Expression * > designators = designation->get_designators();
    292292                if ( designators.size() == 0 ) return;
    293                 for ( DesignatorList::iterator iter = designators.begin(); iter != designators.end(); ++iter ) {
    294                         if ( dynamic_cast< NameExpr * >( *iter ) ) {
    295                                 // if expression is a name, then initializing aggregate member
     293                for ( Expression * des : designators ) {
     294                        if ( dynamic_cast< NameExpr * >( des ) || dynamic_cast< VariableExpr * >( des ) ) {
     295                                // if expression is a NameExpr or VariableExpr, then initializing aggregate member
    296296                                output << ".";
    297                                 (*iter)->accept( *this );
     297                                des->accept( *this );
    298298                        } else {
    299                                 // if not a simple name, it has to be a constant expression, i.e. an array designator
     299                                // otherwise, it has to be a ConstantExpr or CastExpr, initializing array eleemnt
    300300                                output << "[";
    301                                 (*iter)->accept( *this );
     301                                des->accept( *this );
    302302                                output << "]";
    303303                        } // if
     
    307307
    308308        void CodeGenerator::visit( SingleInit * init ) {
    309                 printDesignators( init->get_designators() );
    310309                init->get_value()->accept( *this );
    311310        }
    312311
    313312        void CodeGenerator::visit( ListInit * init ) {
    314                 printDesignators( init->get_designators() );
     313                auto initBegin = init->begin();
     314                auto initEnd = init->end();
     315                auto desigBegin = init->get_designations().begin();
     316                auto desigEnd = init->get_designations().end();
     317
    315318                output << "{ ";
    316                 genCommaList( init->begin(), init->end() );
     319                for ( ; initBegin != initEnd && desigBegin != desigEnd; ) {
     320                        (*desigBegin)->accept( *this );
     321                        (*initBegin)->accept( *this );
     322                        ++initBegin, ++desigBegin;
     323                        if ( initBegin != initEnd ) {
     324                                output << ", ";
     325                        }
     326                }
    317327                output << " }";
     328                assertf( initBegin == initEnd && desigBegin == desigEnd, "Initializers and designators not the same length. %s", toString( init ).c_str() );
    318329        }
    319330
     
    716727
    717728        void CodeGenerator::visit( TypeExpr * typeExpr ) {
    718                 assertf( ! genC, "TypeExpr should not reach code generation." );
    719                 output<< genType( typeExpr->get_type(), "", pretty, genC );
     729                // if ( genC ) std::cerr << "typeexpr still exists: " << typeExpr << std::endl;
     730                // assertf( ! genC, "TypeExpr should not reach code generation." );
     731                if ( ! genC ) {
     732                        output<< genType( typeExpr->get_type(), "", pretty, genC );
     733                }
    720734        }
    721735
Note: See TracChangeset for help on using the changeset viewer.