Changes in src/CodeGen/CodeGenerator.cc [62423350:daf1af8]
- File:
-
- 1 edited
-
src/CodeGen/CodeGenerator.cc (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/CodeGen/CodeGenerator.cc
r62423350 rdaf1af8 288 288 } 289 289 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; 292 292 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 member293 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 296 296 output << "."; 297 des->accept( *this );297 (*iter)->accept( *this ); 298 298 } else { 299 // otherwise, it has to be a ConstantExpr or CastExpr, initializing array eleemnt299 // if not a simple name, it has to be a constant expression, i.e. an array designator 300 300 output << "["; 301 des->accept( *this );301 (*iter)->accept( *this ); 302 302 output << "]"; 303 303 } // if … … 307 307 308 308 void CodeGenerator::visit( SingleInit * init ) { 309 printDesignators( init->get_designators() ); 309 310 init->get_value()->accept( *this ); 310 311 } 311 312 312 313 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() ); 318 315 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() ); 327 317 output << " }"; 328 assertf( initBegin == initEnd && desigBegin == desigEnd, "Initializers and designators not the same length. %s", toString( init ).c_str() );329 318 } 330 319 … … 727 716 728 717 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 ); 734 720 } 735 721
Note:
See TracChangeset
for help on using the changeset viewer.