Changes in / [6803ff1:f3b67b6]
- Files:
-
- 1 added
- 1 deleted
- 10 edited
-
libcfa/src/enum.cfa (modified) (1 diff)
-
libcfa/src/enum.hfa (modified) (2 diffs)
-
src/ControlStruct/TranslateEnumRange.cpp (modified) (1 diff)
-
src/ControlStruct/TranslateEnumRange.hpp (deleted)
-
src/ControlStruct/TrasnlateEnumRange.hpp (added)
-
src/Parser/parser.yy (modified) (29 diffs)
-
src/ResolvExpr/CandidateFinder.cpp (modified) (2 diffs)
-
src/Validate/ImplementEnumFunc.cpp (modified) (5 diffs)
-
src/main.cpp (modified) (2 diffs)
-
tests/enum_tests/enumInlineValue.cfa (modified) (2 diffs)
-
tests/enum_tests/position.cfa (modified) (1 diff)
-
tests/enum_tests/voidEnum.cfa (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/enum.cfa
r6803ff1 rf3b67b6 6 6 forall(ostype & | basic_ostream(ostype), E, V| CfaEnum(E, V)) 7 7 ostype & ?|?(ostype& os, E e) { 8 return os | type_name(e) | "." | label (e);8 return os | type_name(e) | "." | labelE(e); 9 9 } 10 10 11 11 forall(ostype & | basic_ostream(ostype), E| CfaEnum(E, quasi_void)) 12 12 ostype & ?|?(ostype& os, E e) { 13 return os | type_name(e) | "." | label (e);13 return os | type_name(e) | "." | labelE(e); 14 14 } 15 15 16 16 forall(ostype & | basic_ostream(ostype), E, V| CfaEnum(E, V)) { 17 int ?==?(E l, E r) { return pos n(l) == posn(r); }18 int ?<=?(E l, E r) { return pos n(l) <= posn(r); }19 int ?>=?(E l, E r) { return pos n(l) >= posn(r); }20 int ?<?(E l, E r) { return pos n(l) < posn(r); }21 int ?>?(E l, E r) { return pos n(l) > posn(r); }17 int ?==?(E l, E r) { return posE(l) == posE(r); } 18 int ?<=?(E l, E r) { return posE(l) <= posE(r); } 19 int ?>=?(E l, E r) { return posE(l) >= posE(r); } 20 int ?<?(E l, E r) { return posE(l) < posE(r); } 21 int ?>?(E l, E r) { return posE(l) > posE(r); } 22 22 } -
libcfa/src/enum.hfa
r6803ff1 rf3b67b6 17 17 // Design one 18 18 forall(E, V | Serial(E)) trait CfaEnum { 19 char * label(E e);20 unsigned int pos n(E e);21 V value (E e);22 char * type_name(E e);19 char* labelE(E e); 20 unsigned int posE(E e); 21 V valueE(E e); 22 char* type_name(E e); 23 23 }; 24 24 25 forall(ostype & | basic_ostream(ostype), E, V | CfaEnum(E, V))25 forall(ostype & | basic_ostream(ostype), E, V| CfaEnum(E, V)) 26 26 ostype & ?|?(ostype&, E); 27 27 … … 31 31 // Design two <- should go for this if we have change the cost model 32 32 // forall(E | Serial(E)) trait CfaEnum { 33 // char * label(E e);34 // unsigned int pos n(E e);33 // char* labelE(E e); 34 // unsigned int posE(E e); 35 35 // }; 36 36 37 37 // forall(E, V| CfaEnum(E)) trait TypedEnum { 38 // V value (E e);38 // V valueE(E e); 39 39 // }; 40 40 -
src/ControlStruct/TranslateEnumRange.cpp
r6803ff1 rf3b67b6 1 #include "Tra nslateEnumRange.hpp"1 #include "TrasnlateEnumRange.hpp" 2 2 3 3 #include "AST/Pass.hpp" -
src/Parser/parser.yy
r6803ff1 rf3b67b6 10 10 // Created On : Sat Sep 1 20:22:55 2001 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Jun 24 22:45:20202413 // Update Count : 66 8412 // Last Modified On : Thu Jun 20 21:34:49 2024 13 // Update Count : 6654 14 14 // 15 15 … … 223 223 #define NEW_ONE new ExpressionNode( build_constantInteger( yylloc, *new string( "1" ) ) ) 224 224 #define UPDOWN( compop, left, right ) (compop == OperKinds::LThan || compop == OperKinds::LEThan ? left : right) 225 #define MISSING_ANON_FIELD "illegal syntax, missing loop fields with an anonymous loop index is meaningless as loop index is unavailable in loop body." 226 #define MISSING_LOW "illegal syntax, missing low value for up-to range so index is uninitialized." 227 #define MISSING_HIGH "illegal syntax, missing high value for down-to range so index is uninitialized." 228 229 static ForCtrl * makeForCtrl( const CodeLocation & location, DeclarationNode * init, enum OperKinds compop, 230 ExpressionNode * comp, ExpressionNode * inc ) { 225 #define MISSING_ANON_FIELD "syntax error, missing loop fields with an anonymous loop index is meaningless as loop index is unavailable in loop body." 226 #define MISSING_LOW "syntax error, missing low value for up-to range so index is uninitialized." 227 #define MISSING_HIGH "syntax error, missing high value for down-to range so index is uninitialized." 228 229 static ForCtrl * makeForCtrl( 230 const CodeLocation & location, 231 DeclarationNode * init, 232 enum OperKinds compop, 233 ExpressionNode * comp, 234 ExpressionNode * inc ) { 231 235 // Wrap both comp/inc if they are non-null. 232 236 if ( comp ) comp = new ExpressionNode( build_binary_val( location, … … 245 249 ForCtrl * forCtrl( const CodeLocation & location, DeclarationNode * index, ExpressionNode * start, enum OperKinds compop, ExpressionNode * comp, ExpressionNode * inc ) { 246 250 if ( index->initializer ) { 247 SemanticError( yylloc, " illegal syntax, direct initialization disallowed. Use instead: type var; initialization ~ comparison ~ increment." );251 SemanticError( yylloc, "syntax error, direct initialization disallowed. Use instead: type var; initialization ~ comparison ~ increment." ); 248 252 } // if 249 253 if ( index->next ) { 250 SemanticError( yylloc, " illegal syntax, multiple loop indexes disallowed in for-loop declaration." );254 SemanticError( yylloc, "syntax error, multiple loop indexes disallowed in for-loop declaration." ); 251 255 } // if 252 256 DeclarationNode * initDecl = index->addInitializer( new InitializerNode( start ) ); … … 266 270 } // forCtrl 267 271 268 #define MISSING_LOOP_INDEX "illegal syntax, only a single identifier or declaration allowed in initialization, e.g., for ( i; ... ) or for ( int i; ... ). Expression disallowed."269 270 272 ForCtrl * forCtrl( const CodeLocation & location, ExpressionNode * type, ExpressionNode * index, ExpressionNode * start, enum OperKinds compop, ExpressionNode * comp, ExpressionNode * inc ) { 271 273 if ( auto identifier = dynamic_cast<ast::NameExpr *>(index->expr.get()) ) { 272 274 return forCtrl( location, type, new string( identifier->name ), start, compop, comp, inc ); 273 //} else if ( auto commaExpr = dynamic_cast<ast::CommaExpr *>( index->expr.get() ) ) {274 // if ( auto identifier = commaExpr->arg2.as<ast::NameExpr>() ) {275 //return forCtrl( location, type, new string( identifier->name ), start, compop, comp, inc );276 //} else {277 // SemanticError( yylloc, "illegal syntax, loop-index name missing. Expression disallowed." ); return nullptr;278 //} // if275 } else if ( auto commaExpr = dynamic_cast<ast::CommaExpr *>( index->expr.get() ) ) { 276 if ( auto identifier = commaExpr->arg1.as<ast::NameExpr>() ) { 277 return forCtrl( location, type, new string( identifier->name ), start, compop, comp, inc ); 278 } else { 279 SemanticError( yylloc, "syntax error, loop-index name missing. Expression disallowed." ); return nullptr; 280 } // if 279 281 } else { 280 SemanticError( yylloc, MISSING_LOOP_INDEX); return nullptr;282 SemanticError( yylloc, "syntax error, loop-index name missing. Expression disallowed." ); return nullptr; 281 283 } // if 282 284 } // forCtrl … … 284 286 ForCtrl * enumRangeCtrl( ExpressionNode * index_expr, ExpressionNode * range_over_expr ) { 285 287 if ( auto identifier = dynamic_cast<ast::NameExpr *>(index_expr->expr.get()) ) { 286 DeclarationNode * indexDecl = DeclarationNode::newName( new std::string(identifier->name) ); 288 DeclarationNode * indexDecl = 289 DeclarationNode::newName( new std::string(identifier->name) ); 287 290 assert( range_over_expr ); 288 return new ForCtrl( new StatementNode( indexDecl ), range_over_expr ); 289 // } else if (auto commaExpr = dynamic_cast<ast::CommaExpr *>( index_expr->expr.get() )) { 290 // if ( auto identifier = commaExpr->arg1.as<ast::NameExpr>() ) { 291 // assert( range_over_expr ); 292 // DeclarationNode * indexDecl = distAttr( 293 // DeclarationNode::newTypeof( range_over_expr, true ), 294 // DeclarationNode::newName( new std::string( identifier->name) ) ); 295 // return new ForCtrl( new StatementNode( indexDecl ), range_over_expr ); 296 // } else { 297 // SemanticError( yylloc, "illegal syntax, loop-index name missing. Comma expression disallowed." ); return nullptr; 298 // } // if 291 auto node = new StatementNode( indexDecl ); // <- this cause this error 292 return new ForCtrl( node, range_over_expr ); 293 } else if (auto commaExpr = dynamic_cast<ast::CommaExpr *>( index_expr->expr.get() )) { 294 if ( auto identifier = commaExpr->arg1.as<ast::NameExpr>() ) { 295 assert( range_over_expr ); 296 DeclarationNode * indexDecl = distAttr( 297 DeclarationNode::newTypeof( range_over_expr, true ), 298 DeclarationNode::newName( new std::string( identifier->name) ) ); 299 return new ForCtrl( new StatementNode( indexDecl ), range_over_expr ); 300 } else { 301 SemanticError( yylloc, "syntax error, loop-index name missing. Expression disallowed." ); return nullptr; 302 } // if 299 303 } else { 300 SemanticError( yylloc, MISSING_LOOP_INDEX ); return nullptr;304 assert( false ); 301 305 } // if 302 306 } // enumRangeCtrl 303 307 304 308 static void IdentifierBeforeIdentifier( string & identifier1, string & identifier2, const char * kind ) { 305 SemanticError( yylloc, " illegal syntax, adjacent identifiers \"%s\" and \"%s\" are not meaningful in an %s.\n"309 SemanticError( yylloc, "syntax error, adjacent identifiers \"%s\" and \"%s\" are not meaningful in an %s.\n" 306 310 "Possible cause is misspelled type name or missing generic parameter.", 307 311 identifier1.c_str(), identifier2.c_str(), kind ); … … 309 313 310 314 static void IdentifierBeforeType( string & identifier, const char * kind ) { 311 SemanticError( yylloc, " illegal syntax, identifier \"%s\" cannot appear before a %s.\n"315 SemanticError( yylloc, "syntax error, identifier \"%s\" cannot appear before a %s.\n" 312 316 "Possible cause is misspelled storage/CV qualifier, misspelled typename, or missing generic parameter.", 313 317 identifier.c_str(), kind ); … … 1283 1287 { assert( $1 ); $1->set_last( $2 ); $$ = $1; } 1284 1288 | statement_list_nodecl error // invalid syntax rule 1285 { SemanticError( yylloc, " illegal syntax, declarations only allowed at the start of the switch body,"1289 { SemanticError( yylloc, "syntax error, declarations only allowed at the start of the switch body," 1286 1290 " i.e., after the '{'." ); $$ = nullptr; } 1287 1291 ; … … 1344 1348 } 1345 1349 | CHOOSE '(' comma_expression ')' '{' error '}' // CFA, invalid syntax rule 1346 { SemanticError( yylloc, " illegal syntax, declarations can only appear before the list of case clauses." ); $$ = nullptr; }1350 { SemanticError( yylloc, "syntax error, declarations can only appear before the list of case clauses." ); $$ = nullptr; } 1347 1351 ; 1348 1352 … … 1376 1380 case_label: // CFA 1377 1381 CASE error // invalid syntax rule 1378 { SemanticError( yylloc, " illegal syntax, case list missing after case." ); $$ = nullptr; }1382 { SemanticError( yylloc, "syntax error, case list missing after case." ); $$ = nullptr; } 1379 1383 | CASE case_value_list ':' { $$ = $2; } 1380 1384 | CASE case_value_list error // invalid syntax rule 1381 { SemanticError( yylloc, " illegal syntax, colon missing after case list." ); $$ = nullptr; }1385 { SemanticError( yylloc, "syntax error, colon missing after case list." ); $$ = nullptr; } 1382 1386 | DEFAULT ':' { $$ = new ClauseNode( build_default( yylloc ) ); } 1383 1387 // A semantic check is required to ensure only one default clause per switch/choose statement. 1384 1388 | DEFAULT error // invalid syntax rule 1385 { SemanticError( yylloc, " illegal syntax, colon missing after default." ); $$ = nullptr; }1389 { SemanticError( yylloc, "syntax error, colon missing after default." ); $$ = nullptr; } 1386 1390 ; 1387 1391 … … 1472 1476 | comma_expression ';' comma_expression_opt ';' comma_expression_opt 1473 1477 { 1474 $$ = new ForCtrl( $1 ? new StatementNode( new ast::ExprStmt( yylloc, maybeMoveBuild( $1 ) ) ) : nullptr, $3, $5 ); 1478 StatementNode * init = $1 ? new StatementNode( new ast::ExprStmt( yylloc, maybeMoveBuild( $1 ) ) ) : nullptr; 1479 $$ = new ForCtrl( init, $3, $5 ); 1475 1480 } 1476 1481 | declaration comma_expression_opt ';' comma_expression_opt // C99, declaration has ';' … … 1537 1542 { 1538 1543 if ( $4 == OperKinds::GThan || $4 == OperKinds::GEThan ) { SemanticError( yylloc, MISSING_HIGH ); $$ = nullptr; } 1539 else if ( $4 == OperKinds::LEThan ) { SemanticError( yylloc, " illegal syntax, equality with missing high value is meaningless. Use \"~\"." ); $$ = nullptr; }1544 else if ( $4 == OperKinds::LEThan ) { SemanticError( yylloc, "syntax error, equality with missing high value is meaningless. Use \"~\"." ); $$ = nullptr; } 1540 1545 else $$ = forCtrl( yylloc, $3, $1, $3->clone(), $4, nullptr, NEW_ONE ); 1541 1546 } 1542 1547 | comma_expression ';' '@' updowneq '@' // CFA, invalid syntax rule 1543 { SemanticError( yylloc, " illegal syntax, missing low/high value for up/down-to range so index is uninitialized." ); $$ = nullptr; }1548 { SemanticError( yylloc, "syntax error, missing low/high value for up/down-to range so index is uninitialized." ); $$ = nullptr; } 1544 1549 1545 1550 | comma_expression ';' comma_expression updowneq comma_expression '~' comma_expression // CFA … … 1553 1558 { 1554 1559 if ( $4 == OperKinds::GThan || $4 == OperKinds::GEThan ) { SemanticError( yylloc, MISSING_HIGH ); $$ = nullptr; } 1555 else if ( $4 == OperKinds::LEThan ) { SemanticError( yylloc, " illegal syntax, equality with missing high value is meaningless. Use \"~\"." ); $$ = nullptr; }1560 else if ( $4 == OperKinds::LEThan ) { SemanticError( yylloc, "syntax error, equality with missing high value is meaningless. Use \"~\"." ); $$ = nullptr; } 1556 1561 else $$ = forCtrl( yylloc, $3, $1, $3->clone(), $4, nullptr, $7 ); 1557 1562 } … … 1566 1571 { 1567 1572 if ( $4 == OperKinds::GThan || $4 == OperKinds::GEThan ) { SemanticError( yylloc, MISSING_HIGH ); $$ = nullptr; } 1568 else if ( $4 == OperKinds::LEThan ) { SemanticError( yylloc, " illegal syntax, equality with missing high value is meaningless. Use \"~\"." ); $$ = nullptr; }1573 else if ( $4 == OperKinds::LEThan ) { SemanticError( yylloc, "syntax error, equality with missing high value is meaningless. Use \"~\"." ); $$ = nullptr; } 1569 1574 else $$ = forCtrl( yylloc, $3, $1, $3->clone(), $4, nullptr, nullptr ); 1570 1575 } 1571 1576 | comma_expression ';' '@' updowneq '@' '~' '@' // CFA 1572 { SemanticError( yylloc, " illegal syntax, missing low/high value for up/down-to range so index is uninitialized." ); $$ = nullptr; }1577 { SemanticError( yylloc, "syntax error, missing low/high value for up/down-to range so index is uninitialized." ); $$ = nullptr; } 1573 1578 1574 1579 | declaration comma_expression // CFA … … 1587 1592 { 1588 1593 if ( $3 == OperKinds::GThan || $3 == OperKinds::GEThan ) { SemanticError( yylloc, MISSING_HIGH ); $$ = nullptr; } 1589 else if ( $3 == OperKinds::LEThan ) { SemanticError( yylloc, " illegal syntax, equality with missing high value is meaningless. Use \"~\"." ); $$ = nullptr; }1594 else if ( $3 == OperKinds::LEThan ) { SemanticError( yylloc, "syntax error, equality with missing high value is meaningless. Use \"~\"." ); $$ = nullptr; } 1590 1595 else $$ = forCtrl( yylloc, $1, $2, $3, nullptr, NEW_ONE ); 1591 1596 } … … 1601 1606 { 1602 1607 if ( $3 == OperKinds::GThan || $3 == OperKinds::GEThan ) { SemanticError( yylloc, MISSING_HIGH ); $$ = nullptr; } 1603 else if ( $3 == OperKinds::LEThan ) { SemanticError( yylloc, " illegal syntax, equality with missing high value is meaningless. Use \"~\"." ); $$ = nullptr; }1608 else if ( $3 == OperKinds::LEThan ) { SemanticError( yylloc, "syntax error, equality with missing high value is meaningless. Use \"~\"." ); $$ = nullptr; } 1604 1609 else $$ = forCtrl( yylloc, $1, $2, $3, nullptr, $6 ); 1605 1610 } … … 1614 1619 { 1615 1620 if ( $3 == OperKinds::GThan || $3 == OperKinds::GEThan ) { SemanticError( yylloc, MISSING_HIGH ); $$ = nullptr; } 1616 else if ( $3 == OperKinds::LEThan ) { SemanticError( yylloc, " illegal syntax, equality with missing high value is meaningless. Use \"~\"." ); $$ = nullptr; }1621 else if ( $3 == OperKinds::LEThan ) { SemanticError( yylloc, "syntax error, equality with missing high value is meaningless. Use \"~\"." ); $$ = nullptr; } 1617 1622 else $$ = forCtrl( yylloc, $1, $2, $3, nullptr, nullptr ); 1618 1623 } 1619 1624 | declaration '@' updowneq '@' '~' '@' // CFA, invalid syntax rule 1620 { SemanticError( yylloc, " illegal syntax, missing low/high value for up/down-to range so index is uninitialized." ); $$ = nullptr; }1625 { SemanticError( yylloc, "syntax error, missing low/high value for up/down-to range so index is uninitialized." ); $$ = nullptr; } 1621 1626 1622 1627 | comma_expression ';' enum_key // CFA, enum type … … 1627 1632 { 1628 1633 if ( $3 == OperKinds::LEThan || $3 == OperKinds::GEThan ) { 1629 SemanticError( yylloc, " illegal syntax, all enumeration ranges are equal (all values). Remove \"=~\"." ); $$ = nullptr;1634 SemanticError( yylloc, "syntax error, all enumeration ranges are equal (all values). Remove \"=~\"." ); $$ = nullptr; 1630 1635 } 1631 1636 SemanticError( yylloc, "Type iterator is currently unimplemented." ); $$ = nullptr; … … 1732 1737 MUTEX '(' argument_expression_list_opt ')' statement 1733 1738 { 1734 if ( ! $3 ) { SemanticError( yylloc, " illegal syntax, mutex argument list cannot be empty." ); $$ = nullptr; }1739 if ( ! $3 ) { SemanticError( yylloc, "syntax error, mutex argument list cannot be empty." ); $$ = nullptr; } 1735 1740 $$ = new StatementNode( build_mutex( yylloc, $3, $5 ) ); 1736 1741 } … … 1780 1785 // "else" must be conditional after timeout or timeout is never triggered (i.e., it is meaningless) 1781 1786 | wor_waitfor_clause wor when_clause_opt timeout statement wor ELSE statement // invalid syntax rule 1782 { SemanticError( yylloc, " illegal syntax, else clause must be conditional after timeout or timeout never triggered." ); $$ = nullptr; }1787 { SemanticError( yylloc, "syntax error, else clause must be conditional after timeout or timeout never triggered." ); $$ = nullptr; } 1783 1788 | wor_waitfor_clause wor when_clause_opt timeout statement wor when_clause ELSE statement 1784 1789 { $$ = build_waitfor_else( yylloc, build_waitfor_timeout( yylloc, $1, $3, $4, maybe_build_compound( yylloc, $5 ) ), $7, maybe_build_compound( yylloc, $9 ) ); } … … 2172 2177 assert( $1->type ); 2173 2178 if ( $1->type->qualifiers.any() ) { // CV qualifiers ? 2174 SemanticError( yylloc, " illegal syntax, useless type qualifier(s) in empty declaration." ); $$ = nullptr;2179 SemanticError( yylloc, "syntax error, useless type qualifier(s) in empty declaration." ); $$ = nullptr; 2175 2180 } 2176 2181 // enums are never empty declarations because there must have at least one enumeration. 2177 2182 if ( $1->type->kind == TypeData::AggregateInst && $1->storageClasses.any() ) { // storage class ? 2178 SemanticError( yylloc, " illegal syntax, useless storage qualifier(s) in empty aggregate declaration." ); $$ = nullptr;2183 SemanticError( yylloc, "syntax error, useless storage qualifier(s) in empty aggregate declaration." ); $$ = nullptr; 2179 2184 } 2180 2185 } … … 2209 2214 | sue_declaration_specifier invalid_types // invalid syntax rule 2210 2215 { 2211 SemanticError( yylloc, " illegal syntax, expecting ';' at end of \"%s\" declaration.",2216 SemanticError( yylloc, "syntax error, expecting ';' at end of \"%s\" declaration.", 2212 2217 ast::AggregateDecl::aggrString( $1->type->aggregate.kind ) ); 2213 2218 $$ = nullptr; … … 2687 2692 | type_specifier field_declaring_list_opt '}' // invalid syntax rule 2688 2693 { 2689 SemanticError( yylloc, " illegal syntax, expecting ';' at end of previous declaration." );2694 SemanticError( yylloc, "syntax error, expecting ';' at end of previous declaration." ); 2690 2695 $$ = nullptr; 2691 2696 } … … 2783 2788 { 2784 2789 if ( $3 == EnumHiding::Hide ) { 2785 SemanticError( yylloc, " illegal syntax, hiding ('!') the enumerator names of an anonymous enumeration means the names are inaccessible." ); $$ = nullptr;2790 SemanticError( yylloc, "syntax error, hiding ('!') the enumerator names of an anonymous enumeration means the names are inaccessible." ); $$ = nullptr; 2786 2791 } // if 2787 2792 $$ = DeclarationNode::newEnum( nullptr, $5, true, false )->addQualifiers( $2 ); … … 2790 2795 { 2791 2796 if ( $2 && ($2->storageClasses.val != 0 || $2->type->qualifiers.any()) ) { 2792 SemanticError( yylloc, " illegal syntax, storage-class and CV qualifiers are not meaningful for enumeration constants, which are const." );2797 SemanticError( yylloc, "syntax error, storage-class and CV qualifiers are not meaningful for enumeration constants, which are const." ); 2793 2798 } 2794 2799 if ( $4 == EnumHiding::Hide ) { 2795 SemanticError( yylloc, " illegal syntax, hiding ('!') the enumerator names of an anonymous enumeration means the names are inaccessible." ); $$ = nullptr;2800 SemanticError( yylloc, "syntax error, hiding ('!') the enumerator names of an anonymous enumeration means the names are inaccessible." ); $$ = nullptr; 2796 2801 } // if 2797 2802 $$ = DeclarationNode::newEnum( nullptr, $6, true, true, $2 )->addQualifiers( $3 ); … … 2808 2813 { 2809 2814 if ( $2 && ($2->storageClasses.any() || $2->type->qualifiers.val != 0) ) { 2810 SemanticError( yylloc, " illegal syntax, storage-class and CV qualifiers are not meaningful for enumeration constants, which are const." );2815 SemanticError( yylloc, "syntax error, storage-class and CV qualifiers are not meaningful for enumeration constants, which are const." ); 2811 2816 } 2812 2817 typedefTable.makeTypedef( *$4, "enum_type 2" ); … … 3331 3336 { 3332 3337 if ( $1->type->qualifiers.any() ) { 3333 SemanticError( yylloc, " illegal syntax, CV qualifiers cannot be distributed; only storage-class and forall qualifiers." );3338 SemanticError( yylloc, "syntax error, CV qualifiers cannot be distributed; only storage-class and forall qualifiers." ); 3334 3339 } 3335 3340 if ( $1->type->forall ) forall = true; // remember generic type … … 3344 3349 { 3345 3350 if ( $1->type && $1->type->qualifiers.any() ) { 3346 SemanticError( yylloc, " illegal syntax, CV qualifiers cannot be distributed; only storage-class and forall qualifiers." );3351 SemanticError( yylloc, "syntax error, CV qualifiers cannot be distributed; only storage-class and forall qualifiers." ); 3347 3352 } 3348 3353 if ( $1->type && $1->type->forall ) forall = true; // remember generic type … … 3357 3362 { 3358 3363 if ( ($1->type && $1->type->qualifiers.any()) || ($2->type && $2->type->qualifiers.any()) ) { 3359 SemanticError( yylloc, " illegal syntax, CV qualifiers cannot be distributed; only storage-class and forall qualifiers." );3364 SemanticError( yylloc, "syntax error, CV qualifiers cannot be distributed; only storage-class and forall qualifiers." ); 3360 3365 } 3361 3366 if ( ($1->type && $1->type->forall) || ($2->type && $2->type->forall) ) forall = true; // remember generic type … … 3389 3394 $$ = $3; forall = false; 3390 3395 if ( $5 ) { 3391 SemanticError( yylloc, " illegal syntax, attributes cannot be associated with function body. Move attribute(s) before \"with\" clause." );3396 SemanticError( yylloc, "syntax error, attributes cannot be associated with function body. Move attribute(s) before \"with\" clause." ); 3392 3397 $$ = nullptr; 3393 3398 } // if -
src/ResolvExpr/CandidateFinder.cpp
r6803ff1 rf3b67b6 9 9 // Author : Aaron B. Moss 10 10 // Created On : Wed Jun 5 14:30:00 2019 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Sat Jun 22 08:07:26 202413 // Update Count : 411 // Last Modified By : Andrew Beach 12 // Last Modified On : Wed Mar 16 11:58:00 2022 13 // Update Count : 3 14 14 // 15 15 … … 909 909 auto location = expr->location; 910 910 auto callExpr = new ast::UntypedExpr( 911 location, new ast::NameExpr( location, "value " ), {expr}911 location, new ast::NameExpr( location, "valueE" ), {expr} 912 912 ); 913 913 finder.find( callExpr ); 914 914 CandidateList winners = findMinCost( finder.candidates ); 915 915 if (winners.size() != 1) { 916 SemanticError( callExpr, "Ambiguous expression in value ..." );916 SemanticError( callExpr, "Ambiguous expression in valueE..." ); 917 917 } 918 918 CandidateRef & choice = winners.front(); -
src/Validate/ImplementEnumFunc.cpp
r6803ff1 rf3b67b6 175 175 ast::FunctionDecl* EnumAttrFuncGenerator::genPosnProto() const { 176 176 return genProto( 177 "pos n",177 "posE", 178 178 {new ast::ObjectDecl(getLocation(), "_i", new ast::EnumInstType(decl))}, 179 179 {new ast::ObjectDecl(getLocation(), "_ret", … … 183 183 ast::FunctionDecl* EnumAttrFuncGenerator::genLabelProto() const { 184 184 return genProto( 185 "label ",185 "labelE", 186 186 {new ast::ObjectDecl(getLocation(), "_i", new ast::EnumInstType(decl))}, 187 187 {new ast::ObjectDecl( … … 193 193 if (decl->base) 194 194 return genProto( 195 "value ",195 "valueE", 196 196 {new ast::ObjectDecl(getLocation(), "_i", new ast::EnumInstType(decl))}, 197 197 {new ast::ObjectDecl(getLocation(), "_ret", … … 203 203 ast::FunctionDecl* EnumAttrFuncGenerator::genQuasiValueProto() const { 204 204 return genProto( 205 "value ",205 "valueE", 206 206 {new ast::ObjectDecl(getLocation(), "_i", new ast::EnumInstType(decl))}, 207 207 {new ast::ObjectDecl(getLocation(), "_ret", … … 254 254 auto param = params.front(); 255 255 ast::UntypedExpr* untyped = ast::UntypedExpr::createCall( 256 func->location, "pos n", { new ast::VariableExpr(func->location, param) });256 func->location, "posE", { new ast::VariableExpr(func->location, param) }); 257 257 func->stmts = new ast::CompoundStmt( 258 258 func->location, {new ast::ReturnStmt(func->location, untyped)} -
src/main.cpp
r6803ff1 rf3b67b6 10 10 // Created On : Fri May 15 23:12:02 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sun Jun 23 16:38:09 202413 // Update Count : 69 112 // Last Modified On : Wed Nov 1 21:12:58 2023 13 // Update Count : 690 14 14 // 15 15 … … 53 53 #include "ControlStruct/FixLabels.hpp" // for fixLabels 54 54 #include "ControlStruct/HoistControlDecls.hpp" // hoistControlDecls 55 #include "ControlStruct/Tra nslateEnumRange.hpp" // translateEnumRange55 #include "ControlStruct/TrasnlateEnumRange.hpp" // translateEnumRange 56 56 #include "GenPoly/Box.hpp" // for box 57 57 #include "GenPoly/InstantiateGeneric.hpp" // for instantiateGeneric -
tests/enum_tests/enumInlineValue.cfa
r6803ff1 rf3b67b6 38 38 // Note: variable name (cat in this case) cannot be overloaded with those declared in enum, 39 39 // Probably for the same reason as const overloading problem 40 // i.e. int identity_t(enum ACD a) would not work as the value (a) is ambigious currently40 // i.e. int identity_t(enum ACD a) would not work as the valueE(a) is ambigious currently 41 41 int identity_t(enum ACD cat) { 42 return value (cat);42 return valueE(cat); 43 43 } 44 44 … … 47 47 // Because Inline introduce ambiguity on symbols 48 48 sout | "Symbols (enumerator) should have the same values:" |nl; 49 sout | "Symbol a: (10) " | value (A.a) | "," | value(AB.a) | "," | value(ACD.a) | nl;50 sout | "Symbol b: (20) " | value (B.b) | "," | value(AB.b) | nl;51 sout | "Symbol ab: (30) " | value (AB.ab) | nl;52 sout | "Symbol c: (40) " | value (C.c) | "," | value(CD.c) | "," | value(ACD.c) | nl;53 sout | "Symbol d: (50) " | value (D.d) | "," | value(CD.d) | "," | value(ACD.d) | nl;54 sout | "Symbol cd: (60) " | value (CD.cd) | "," | value(ACD.cd) | nl;55 sout | "Symbol acd: (70) " | value (ACD.acd) | nl;49 sout | "Symbol a: (10) " | valueE(A.a) | "," | valueE(AB.a) | "," | valueE(ACD.a) | nl; 50 sout | "Symbol b: (20) " | valueE(B.b) | "," | valueE(AB.b) | nl; 51 sout | "Symbol ab: (30) " | valueE(AB.ab) | nl; 52 sout | "Symbol c: (40) " | valueE(C.c) | "," | valueE(CD.c) | "," | valueE(ACD.c) | nl; 53 sout | "Symbol d: (50) " | valueE(D.d) | "," | valueE(CD.d) | "," | valueE(ACD.d) | nl; 54 sout | "Symbol cd: (60) " | valueE(CD.cd) | "," | valueE(ACD.cd) | nl; 55 sout | "Symbol acd: (70) " | valueE(ACD.acd) | nl; 56 56 57 57 sout | "Casting/Upcasting:" | nl; 58 sout | "Symbol a: (10) " | value ((A)A.a) | "," | value((AB)A.a) | "," | value((ACD)A.a) | nl;59 sout | "Symbol b: (20) " | value ((B)B.b) | "," | value((AB)B.b) | nl;60 sout | "Symbol ab: (30) " | value ((AB)AB.ab) | nl;61 sout | "Symbol c: (40) " | value ((C)C.c) | "," | value((CD)C.c) | "," | value((ACD)C.c) | "," | value((CD)CD.c)| "," | value((ACD)CD.c) | nl;62 sout | "Symbol d: (50) " | value ((D)D.d) | "," | value((CD)D.d) | "," | value((ACD)D.d) | "," | value((ACD)CD.d) | nl;63 sout | "Symbol cd: (60) " | value ((CD)CD.cd) | "," | value((ACD)CD.cd) | nl;64 sout | "Symbol acd: (70) " | value ((ACD)ACD.acd) | nl;58 sout | "Symbol a: (10) " | valueE((A)A.a) | "," | valueE((AB)A.a) | "," | valueE((ACD)A.a) | nl; 59 sout | "Symbol b: (20) " | valueE((B)B.b) | "," | valueE((AB)B.b) | nl; 60 sout | "Symbol ab: (30) " | valueE((AB)AB.ab) | nl; 61 sout | "Symbol c: (40) " | valueE((C)C.c) | "," | valueE((CD)C.c) | "," | valueE((ACD)C.c) | "," | valueE((CD)CD.c)| "," | valueE((ACD)CD.c) | nl; 62 sout | "Symbol d: (50) " | valueE((D)D.d) | "," | valueE((CD)D.d) | "," | valueE((ACD)D.d) | "," | valueE((ACD)CD.d) | nl; 63 sout | "Symbol cd: (60) " | valueE((CD)CD.cd) | "," | valueE((ACD)CD.cd) | nl; 64 sout | "Symbol acd: (70) " | valueE((ACD)ACD.acd) | nl; 65 65 66 66 sout | "Function Call:" | nl; -
tests/enum_tests/position.cfa
r6803ff1 rf3b67b6 17 17 Colour c2 = fishy; 18 18 19 sout | "Compile Time: blue value: " | value (Colour.Blue) | ", position: " | posn(Colour.Blue) | ", label: " | label(Colour.Blue) | ", default return value: " | Colour.Blue;20 sout | "Runtime: fishy value: " | value (fishy) | ", position: " | posn(fishy) | ", label: " | label(fishy) | ", default return value: " | fishy;21 sout | "Runtime: C2 value: " | value (c2) | ", position: " | posn(c2) | ", label: " | label(c2) | ", default return value: " | c2;19 sout | "Compile Time: blue value: " | valueE(Colour.Blue) | ", position: " | posE(Colour.Blue) | ", label: " | labelE(Colour.Blue) | ", default return value: " | Colour.Blue; 20 sout | "Runtime: fishy value: " | valueE(fishy) | ", position: " | posE(fishy) | ", label: " | labelE(fishy) | ", default return value: " | fishy; 21 sout | "Runtime: C2 value: " | valueE(c2) | ", position: " | posE(c2) | ", label: " | labelE(c2) | ", default return value: " | c2; 22 22 Colour.Red; 23 23 char * ao = Colour.Red; -
tests/enum_tests/voidEnum.cfa
r6803ff1 rf3b67b6 28 28 sout | b; 29 29 30 sout | label(v_1); 31 sout | label(v_2); 30 sout | labelE(v_1); 31 sout | labelE(v_2); 32 32 33 }
Note:
See TracChangeset
for help on using the changeset viewer.