Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/CodeGen/CodeGenerator.cc

    r6180274 r3eb1653  
    274274        void CodeGenerator::postvisit( EnumDecl * enumDecl ) {
    275275                extension( enumDecl );
    276                 output << "enum ";
    277                 genAttributes( enumDecl->get_attributes() );
    278 
    279                 output << enumDecl->get_name();
    280 
    281276                std::list< Declaration* > &memb = enumDecl->get_members();
    282 
    283                 if ( ! memb.empty() ) {
    284                         output << " {" << endl;
    285 
    286                         ++indent;
     277                if (enumDecl->base && ! memb.empty() &&
     278                (dynamic_cast<BasicType *>(enumDecl->base)
     279                 && !(dynamic_cast<BasicType *>(enumDecl->base)->kind == BasicType::Kind::SignedInt))) {
     280                        ObjectDecl * last = nullptr;
    287281                        for ( std::list< Declaration* >::iterator i = memb.begin(); i != memb.end();  i++) {
    288282                                ObjectDecl * obj = dynamic_cast< ObjectDecl* >( *i );
    289283                                assert( obj );
    290                                 output << indent << mangleName( obj );
     284                                output << "static const ";
     285                                output << genType(enumDecl->base, "", options) << " ";
     286                                output << mangleName( obj ) << " ";
     287                                output << " = ";
     288                                output << "(" << genType(enumDecl->base, "", options) << ")";;
    291289                                if ( obj->get_init() ) {
    292                                         output << " = ";
    293290                                        obj->get_init()->accept( *visitor );
    294                                 } // if
    295                                 output << "," << endl;
     291                                } else {
     292                                        if (last == nullptr) {
     293                                                output << 0;
     294                                        } else {
     295                                                output << mangleName(last) << " + 1";
     296                                        }
     297                                } // if—
     298                                output << ";" << endl;
     299                                last = obj;
    296300                        } // for
    297 
     301                } else {
     302                        output << "enum ";
     303                        genAttributes( enumDecl->get_attributes() );
     304
     305                        output << enumDecl->get_name();
     306
     307                        if ( ! memb.empty() ) {
     308                                output << " {" << endl;
     309
     310                                ++indent;
     311                                for ( std::list< Declaration* >::iterator i = memb.begin(); i != memb.end();  i++) {
     312                                        ObjectDecl * obj = dynamic_cast< ObjectDecl* >( *i );
     313                                        assert( obj );
     314                                        output << indent << mangleName( obj );
     315                                        if ( obj->get_init() ) {
     316                                                output << " = ";
     317                                                obj->get_init()->accept( *visitor );
     318                                        } // if
     319                                        output << "," << endl;
     320                                } // for
    298321                        --indent;
    299 
    300322                        output << indent << "}";
     323                        } // if
    301324                } // if
    302325        }
     
    347370                                des->accept( *visitor );
    348371                        } else {
    349                                 // otherwise, it has to be a ConstantExpr or CastExpr, initializing array eleemnt
     372                                // otherwise, it has to be a ConstantExpr or CastExpr, initializing array element
    350373                                output << "[";
    351374                                des->accept( *visitor );
     
    661684                        output << opInfo->symbol;
    662685                } else {
     686                        // if (dynamic_cast<EnumInstType *>(variableExpr->get_var()->get_type())
     687                        // && dynamic_cast<EnumInstType *>(variableExpr->get_var()->get_type())->baseEnum->base) {
     688                        //      output << '(' <<genType(dynamic_cast<EnumInstType *>(variableExpr->get_var()->get_type())->baseEnum->base, "", options) << ')';
     689                        // }
    663690                        output << mangleName( variableExpr->get_var() );
    664691                } // if
Note: See TracChangeset for help on using the changeset viewer.