Changeset 6d2b3dc for src/ControlStruct
- Timestamp:
- Jul 3, 2024, 5:32:06 PM (5 months ago)
- Branches:
- master
- Children:
- 39cf5cc
- Parents:
- 597f284
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/ControlStruct/TranslateEnumRange.cpp
r597f284 r6d2b3dc 22 22 auto typeExpr = stmt->range_over.strict_as<ast::TypeExpr>(); 23 23 auto type = typeExpr->type; 24 auto inits = stmt->inits;25 auto enumInst = type.strict_as<ast::EnumInstType>();26 auto enumDecl = enumInst->base;27 24 28 25 auto objInit = stmt->inits.front(); 29 auto initLocation = objInit->location;30 auto rangeLocation = stmt->range_over->location;31 26 assert( stmt->inits.size() == 1 ); 32 27 … … 47 42 const ast::Stmt* addInit::postvisit( const ast::ForStmt * stmt ) { 48 43 if ( stmt->range_over ) { 49 auto typeExpr = stmt->range_over.strict_as<ast::TypeExpr>();50 auto type = typeExpr->type;51 44 auto inits = stmt->inits; 52 auto enumInst = type.strict_as<ast::EnumInstType>();53 auto enumDecl = enumInst->base;54 55 45 auto init = stmt->inits.front(); 56 46 … … 60 50 if ( !objDecl->init ) { 61 51 auto location = stmt->location; 62 // auto newInit = new ast::SingleInit( location, new ast::NameExpr( location, enumDecl->members.front()->name ) );63 52 ast::SingleInit * newInit = new ast::SingleInit( location, 64 new ast::NameExpr( location, 65 stmt->is_inc? enumDecl->members.front()->name: enumDecl->members.back()->name ) ); 53 stmt->is_inc? 54 ast::UntypedExpr::createCall( location, "lowerBound", {} ): 55 ast::UntypedExpr::createCall( location, "upperBound", {} ), 56 ast::ConstructFlag::MaybeConstruct 57 ); 66 58 auto objDeclWithInit = ast::mutate_field( objDecl, &ast::ObjectDecl::init, newInit ); 67 59 auto declWithInit = ast::mutate_field( declStmt, &ast::DeclStmt::decl, objDeclWithInit ); … … 80 72 auto initDecl = declStmt->decl.strict_as<ast::ObjectDecl>(); 81 73 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;86 74 87 75 // Both inc and dec check if the current posn less than the number of enumerator … … 90 78 ast::UntypedExpr * condition = ast::UntypedExpr::createCall( location, 91 79 "?<=?", 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 ) }); 80 { new ast::NameExpr( location, indexName ), 81 ast::UntypedExpr::createCall( location, "upperBound", {} ) }); 97 82 auto increment = ast::UntypedExpr::createCall( location, 98 stmt->is_inc? "succ": "pred",{ 99 new ast::NameExpr( location, indexName ) 100 }); 83 stmt->is_inc? "succ": "pred", 84 { new ast::NameExpr( location, indexName ) }); 101 85 auto assig = ast::UntypedExpr::createAssign( location, new ast::NameExpr( location, indexName ), increment ); 102 86 auto mut = ast::mutate_field( stmt, &ast::ForStmt::cond, condition ); … … 106 90 107 91 void translateEnumRange( ast::TranslationUnit & translationUnit ) { 108 ast::Pass<addInitType>::run( translationUnit );109 92 ast::Pass<addInit>::run( translationUnit ); 110 93 ast::Pass<translateEnumRangeCore>::run( translationUnit );
Note: See TracChangeset
for help on using the changeset viewer.