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