Changeset 73d0e3f4
- Timestamp:
- Jun 29, 2024, 5:22:36 PM (3 months ago)
- Branches:
- master
- Children:
- 011c29e
- Parents:
- 115ac1ce
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/enum.cfa
r115ac1ce r73d0e3f4 23 23 int ?>?(E l, E r) { return posn(l) > posn(r); } 24 24 int ?>=?(E l, E r) { return posn(l) >= posn(r); } 25 26 E ++?(E& l) { 27 l = succ(l); 28 return l; 29 } 30 31 E ?++(E& l) { 32 E ret = l; 33 l = succ(l); 34 return ret; 35 } 36 37 E --?(E& l) { 38 l = pred(l); 39 return l; 40 } 41 42 E ?--(E& l) { 43 E ret = l; 44 l = pred(l); 45 return ret; 46 } 25 47 } -
libcfa/src/enum.hfa
r115ac1ce r73d0e3f4 49 49 int ?>?(E, E); 50 50 int ?>=?(E, E); 51 52 int ++?(E&); 53 int ?++(E&); 54 int --?(E&); 55 int ?--(E&); 51 56 } -
src/ControlStruct/TranslateEnumRange.cpp
r115ac1ce r73d0e3f4 27 27 28 28 auto objInit = stmt->inits.front(); 29 30 29 auto initLocation = objInit->location; 31 30 auto rangeLocation = stmt->range_over->location; … … 61 60 if ( !objDecl->init ) { 62 61 auto location = stmt->location; 63 ast::SingleInit * newInit;64 newInit = new ast::SingleInit( location,62 // auto newInit = new ast::SingleInit( location, new ast::NameExpr( location, enumDecl->members.front()->name ) ); 63 ast::SingleInit * newInit = new ast::SingleInit( location, 65 64 new ast::NameExpr( location, 66 stmt->is_inc? enumDecl->members.front()->name: enumDecl->members.back()->name ) );65 stmt->is_inc? enumDecl->members.front()->name: enumDecl->members.back()->name ) ); 67 66 auto objDeclWithInit = ast::mutate_field( objDecl, &ast::ObjectDecl::init, newInit ); 68 67 auto declWithInit = ast::mutate_field( declStmt, &ast::DeclStmt::decl, objDeclWithInit ); … … 85 84 auto enumInst = typeExpr->type.strict_as<ast::EnumInstType>(); 86 85 auto enumDecl = enumInst->base; 87 86 88 87 // Both inc and dec check if the current posn less than the number of enumerator 89 88 // for dec, it keeps call pred until it passes 0 (the first enumerator) and underflow, … … 93 92 {new ast::CastExpr(location, 94 93 new ast::NameExpr( location, indexName ), 95 new ast::BasicType( ast::BasicKind::UnsignedInt ),96 94 new ast::BasicType( ast::BasicKind::UnsignedInt 95 ),ast::GeneratedFlag::ExplicitCast), 97 96 ast::ConstantExpr::from_ulong( location, enumDecl->members.size()-1 ) }); 98 99 97 auto increment = ast::UntypedExpr::createCall( location, 100 stmt->is_inc? " ?++": "?--",101 { new ast::NameExpr( location, indexName ) });102 98 stmt->is_inc? "succ": "pred",{ 99 new ast::NameExpr( location, indexName ) 100 }); 103 101 auto assig = ast::UntypedExpr::createAssign( location, new ast::NameExpr( location, indexName ), increment ); 104 102 auto mut = ast::mutate_field( stmt, &ast::ForStmt::cond, condition );
Note: See TracChangeset
for help on using the changeset viewer.