Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/CodeGen/CodeGenerator.cc

    r62423350 rdaf1af8  
    288288        }
    289289
    290         void CodeGenerator::visit( Designation * designation ) {
    291                 std::list< Expression * > designators = designation->get_designators();
     290        void CodeGenerator::printDesignators( std::list< Expression * > & designators ) {
     291                typedef std::list< Expression * > DesignatorList;
    292292                if ( designators.size() == 0 ) return;
    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
     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
    296296                                output << ".";
    297                                 des->accept( *this );
     297                                (*iter)->accept( *this );
    298298                        } else {
    299                                 // otherwise, it has to be a ConstantExpr or CastExpr, initializing array eleemnt
     299                                // if not a simple name, it has to be a constant expression, i.e. an array designator
    300300                                output << "[";
    301                                 des->accept( *this );
     301                                (*iter)->accept( *this );
    302302                                output << "]";
    303303                        } // if
     
    307307
    308308        void CodeGenerator::visit( SingleInit * init ) {
     309                printDesignators( init->get_designators() );
    309310                init->get_value()->accept( *this );
    310311        }
    311312
    312313        void CodeGenerator::visit( ListInit * init ) {
    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 
     314                printDesignators( init->get_designators() );
    318315                output << "{ ";
    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                 }
     316                genCommaList( init->begin(), init->end() );
    327317                output << " }";
    328                 assertf( initBegin == initEnd && desigBegin == desigEnd, "Initializers and designators not the same length. %s", toString( init ).c_str() );
    329318        }
    330319
     
    727716
    728717        void CodeGenerator::visit( TypeExpr * typeExpr ) {
    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                 }
     718                assertf( ! genC, "TypeExpr should not reach code generation." );
     719                output<< genType( typeExpr->get_type(), "", pretty, genC );
    734720        }
    735721
Note: See TracChangeset for help on using the changeset viewer.