Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/ControlStruct/TranslateEnumRange.cpp

    r6d2b3dc r73d0e3f4  
    2222        auto typeExpr = stmt->range_over.strict_as<ast::TypeExpr>();
    2323        auto type = typeExpr->type;
     24        auto inits = stmt->inits;
     25        auto enumInst = type.strict_as<ast::EnumInstType>();
     26        auto enumDecl = enumInst->base;
    2427
    2528        auto objInit = stmt->inits.front();
     29        auto initLocation = objInit->location;
     30        auto rangeLocation = stmt->range_over->location;
    2631        assert( stmt->inits.size() == 1 );
    2732
     
    4247const ast::Stmt* addInit::postvisit( const ast::ForStmt * stmt ) {
    4348    if ( stmt->range_over ) {
     49        auto typeExpr = stmt->range_over.strict_as<ast::TypeExpr>();
     50        auto type = typeExpr->type;
    4451        auto inits = stmt->inits;
     52        auto enumInst = type.strict_as<ast::EnumInstType>();
     53        auto enumDecl = enumInst->base;
     54
    4555        auto init = stmt->inits.front();
    4656
     
    5060                if ( !objDecl->init ) {
    5161                    auto location = stmt->location;
     62                    // auto newInit = new ast::SingleInit( location, new ast::NameExpr( location, enumDecl->members.front()->name ) );
    5263                    ast::SingleInit * newInit = new ast::SingleInit( location,
    53                         stmt->is_inc?
    54                         ast::UntypedExpr::createCall( location, "lowerBound", {} ):
    55                         ast::UntypedExpr::createCall( location, "upperBound", {} ),
    56                         ast::ConstructFlag::MaybeConstruct
    57                     );
     64                        new ast::NameExpr( location,
     65                           stmt->is_inc? enumDecl->members.front()->name: enumDecl->members.back()->name ) );
    5866                    auto objDeclWithInit = ast::mutate_field( objDecl, &ast::ObjectDecl::init, newInit );
    5967                    auto declWithInit = ast::mutate_field( declStmt, &ast::DeclStmt::decl, objDeclWithInit );
     
    7280    auto initDecl = declStmt->decl.strict_as<ast::ObjectDecl>();
    7381    auto indexName = initDecl->name;
     82   
     83    auto typeExpr = stmt->range_over.strict_as<ast::TypeExpr>();
     84    auto enumInst = typeExpr->type.strict_as<ast::EnumInstType>();
     85    auto enumDecl = enumInst->base;
    7486
    7587    // Both inc and dec check if the current posn less than the number of enumerator
     
    7890    ast::UntypedExpr * condition = ast::UntypedExpr::createCall( location,
    7991        "?<=?",
    80         {   new ast::NameExpr( location, indexName ),
    81             ast::UntypedExpr::createCall( location, "upperBound", {} )  });
     92        {new ast::CastExpr(location,
     93            new ast::NameExpr( location, indexName ),
     94            new ast::BasicType( ast::BasicKind::UnsignedInt
     95        ),ast::GeneratedFlag::ExplicitCast),
     96        ast::ConstantExpr::from_ulong( location, enumDecl->members.size()-1 ) });
    8297    auto increment = ast::UntypedExpr::createCall( location,
    83         stmt->is_inc? "succ": "pred",
    84         { new ast::NameExpr( location, indexName ) });
     98        stmt->is_inc? "succ": "pred",{
     99        new ast::NameExpr( location, indexName )
     100    });
    85101    auto assig = ast::UntypedExpr::createAssign( location, new ast::NameExpr( location, indexName ), increment );
    86102    auto mut = ast::mutate_field( stmt, &ast::ForStmt::cond, condition );
     
    90106
    91107void translateEnumRange( ast::TranslationUnit & translationUnit ) {
     108    ast::Pass<addInitType>::run( translationUnit );
    92109    ast::Pass<addInit>::run( translationUnit );
    93110    ast::Pass<translateEnumRangeCore>::run( translationUnit );
Note: See TracChangeset for help on using the changeset viewer.