Changes in src/CodeGen/CodeGenerator.cc [8bb86ce:9749d2fa]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/CodeGen/CodeGenerator.cc
r8bb86ce r9749d2fa 273 273 } 274 274 275 template<typename pass_type>276 inline void genEnumInitializer( PassVisitor<pass_type> * visitor, Type * baseType, std::ostream & output,277 Initializer * init, long long * cur_val, Options options) {278 auto baseTypeAsBasic = baseType ? dynamic_cast<BasicType *>( baseType ) : nullptr;279 if ( init ) { // If value has an explicit initiazatior280 output << " = ";281 output << "(" << genType(baseType, "", options) << ")";282 init->accept( *visitor );283 if ( baseTypeAsBasic && baseTypeAsBasic->isInteger() ) { // if it is an integral type and initilizer offered,284 // need to update the cur_val285 Expression* expr = ((SingleInit *)(init))->value;286 while ( auto temp = dynamic_cast<CastExpr *>(expr) ) { // unwrap introduced cast287 expr = temp->arg;288 }289 *cur_val = ((ConstantExpr *)expr)->constant.get_ival()+1;290 }291 } else if ( baseTypeAsBasic && baseTypeAsBasic->isInteger() ) { // integral implicitly init to cur_val + 1292 output << " = " << "(" << genType(baseType, "", options) << ")";293 output << (*cur_val)++;294 }295 }296 297 275 void CodeGenerator::postvisit( EnumDecl * enumDecl ) { 298 276 extension( enumDecl ); 299 277 std::list< Declaration* > &memb = enumDecl->get_members(); 300 278 if (enumDecl->base && ! memb.empty()) { 301 long long cur_val = 0; 279 unsigned long long last_val = -1; // if the first enum value has no explicit initializer, 280 // as other 302 281 for ( std::list< Declaration* >::iterator i = memb.begin(); i != memb.end(); i++) { 303 282 ObjectDecl * obj = dynamic_cast< ObjectDecl* >( *i ); … … 305 284 output << "static "; 306 285 output << genType(enumDecl->base, mangleName( obj ), options); 307 genEnumInitializer( visitor, enumDecl->base, output, obj->get_init(), &cur_val, options); 286 output << " = "; 287 output << "(" << genType(enumDecl->base, "", options) << ")"; 288 if ( (BasicType *)(enumDecl->base) && ((BasicType *)(enumDecl->base))->isWholeNumber() ) { 289 if ( obj->get_init() ) { 290 obj->get_init()->accept( *visitor ); 291 Expression* expr = ((SingleInit *)(obj->init))->value; 292 while ( auto temp = dynamic_cast<CastExpr *>(expr) ) { 293 expr = temp->arg; 294 } 295 last_val = ((ConstantExpr *)expr)->constant.get_ival(); 296 } else { 297 output << ++last_val; 298 } // if 299 } else { 300 if ( obj->get_init() ) { 301 obj->get_init()->accept( *visitor ); 302 } else { 303 // Should not reach here! 304 } 305 } 308 306 output << ";" << endl; 309 307 } // for
Note:
See TracChangeset
for help on using the changeset viewer.