- Timestamp:
- Aug 14, 2024, 11:55:20 AM (15 months ago)
- Branches:
- master
- Children:
- 960665c
- Parents:
- 26d40a1 (diff), 2870cb6 (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. - Location:
- src
- Files:
-
- 2 added
- 8 edited
-
AST/Expr.hpp (modified) (8 diffs)
-
CodeGen/CodeGenerator.cpp (modified) (1 diff)
-
Common/CodeLocation.hpp (modified) (3 diffs)
-
Common/Symbol.cpp (added)
-
Common/Symbol.hpp (added)
-
Common/module.mk (modified) (1 diff)
-
GenPoly/Lvalue.cpp (modified) (3 diffs)
-
InitTweak/FixInit.cpp (modified) (1 diff)
-
Parser/parser.yy (modified) (8 diffs)
-
ResolvExpr/CandidateFinder.cpp (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/AST/Expr.hpp
r26d40a1 rd1f5054 11 11 // Last Modified By : Peter A. Buhr 12 12 // Created On : Fri May 10 10:30:00 2019 13 // Update Count : 713 // Update Count : 8 14 14 // 15 15 … … 86 86 87 87 /// initializes from other InferUnion 88 void init_from( const InferUnion & o ) {88 void init_from( const InferUnion & o ) { 89 89 if (o.data.resnSlots) { 90 90 data.resnSlots = new ResnSlots(*o.data.resnSlots); … … 96 96 97 97 /// initializes from other InferUnion (move semantics) 98 void init_from( InferUnion && o ) {98 void init_from( InferUnion && o ) { 99 99 data.resnSlots = o.data.resnSlots; 100 100 data.inferParams = o.data.inferParams; … … 104 104 105 105 InferUnion() : mode(Empty), data() {} 106 InferUnion( const InferUnion & o ) : mode( o.mode ), data() { init_from( o ); }107 InferUnion( InferUnion && o ) : mode( o.mode ), data() { init_from( std::move(o) ); }108 InferUnion & operator= ( const InferUnion& ) = delete;109 InferUnion & operator= ( InferUnion&& ) = delete;106 InferUnion( const InferUnion & o ) : mode( o.mode ), data() { init_from( o ); } 107 InferUnion( InferUnion && o ) : mode( o.mode ), data() { init_from( std::move(o) ); } 108 InferUnion & operator= ( const InferUnion & ) = delete; 109 InferUnion & operator= ( InferUnion && ) = delete; 110 110 111 111 bool hasSlots() const { return data.resnSlots; } 112 112 bool hasParams() const { return data.inferParams; } 113 113 114 ResnSlots & resnSlots() {114 ResnSlots & resnSlots() { 115 115 if (!data.resnSlots) { 116 116 data.resnSlots = new ResnSlots(); … … 119 119 } 120 120 121 const ResnSlots & resnSlots() const {121 const ResnSlots & resnSlots() const { 122 122 if (data.resnSlots) { 123 123 return *data.resnSlots; … … 127 127 } 128 128 129 InferredParams & inferParams() {129 InferredParams & inferParams() { 130 130 if (!data.inferParams) { 131 131 data.inferParams = new InferredParams(); … … 134 134 } 135 135 136 const InferredParams & inferParams() const {136 const InferredParams & inferParams() const { 137 137 if (data.inferParams) { 138 138 return *data.inferParams; … … 669 669 ptr<ApplicationExpr> callExpr; 670 670 671 ImplicitCopyCtorExpr( const CodeLocation & loc, const ApplicationExpr * call )671 ImplicitCopyCtorExpr( const CodeLocation & loc, const ApplicationExpr * call ) 672 672 : Expr( loc, call->result ), callExpr(call) { assert( call ); assert(call->result); } 673 673 -
src/CodeGen/CodeGenerator.cpp
r26d40a1 rd1f5054 79 79 currentLocation.first_line += 2; 80 80 } else { 81 output << "\n# " << to.first_line << " \"" << to.filename 81 output << "\n# " << to.first_line << " \"" << to.filename.c_str() 82 82 << "\"\n" << indent; 83 83 currentLocation = to; -
src/Common/CodeLocation.hpp
r26d40a1 rd1f5054 17 17 18 18 #include <iostream> 19 #include <string>19 #include "Symbol.hpp" 20 20 21 21 struct CodeLocation { 22 22 int first_line = -1, first_column = -1, last_line = -1, last_column = -1; 23 std::stringfilename = "";23 Symbol filename = ""; 24 24 25 25 /// Create a new unset CodeLocation. … … 46 46 47 47 bool startsBefore( CodeLocation const & other ) const { 48 if( filename < other.filename) return true;49 if( filename > other.filename) return false;48 if( filename.str() < other.filename.str() ) return true; 49 if( filename.str() > other.filename.str() ) return false; 50 50 51 51 if( first_line < other.first_line ) return true; … … 72 72 inline std::ostream & operator<<( std::ostream & out, const CodeLocation & location ) { 73 73 // Column number ":1" allows IDEs to parse the error message and position the cursor in the source text. 74 return location.isSet() ? out << location.filename << ":" << location.first_line << ":1 " : out;74 return location.isSet() ? out << location.filename.str() << ":" << location.first_line << ":1 " : out; 75 75 } -
src/Common/module.mk
r26d40a1 rd1f5054 48 48 Common/Stats/Time.cpp \ 49 49 Common/Stats/Time.hpp \ 50 Common/Symbol.cpp \ 51 Common/Symbol.hpp \ 50 52 Common/ToString.hpp \ 51 53 Common/UniqueName.cpp \ -
src/GenPoly/Lvalue.cpp
r26d40a1 rd1f5054 10 10 // Created On : Thu Sep 15 14:08:00 2022 11 11 // Last Modified By : Andrew Beach 12 // Last Modified On : Wed Oct 6 9:59:00 202213 // Update Count : 012 // Last Modified On : Mon Aug 12 18:07:00 2024 13 // Update Count : 1 14 14 // 15 15 … … 119 119 /// Replace all reference types with pointer types. 120 120 struct ReferenceTypeElimination final { 121 ast::SizeofExpr const * previsit( ast::SizeofExpr const * expr ); 122 ast::AlignofExpr const * previsit( ast::AlignofExpr const * expr ); 121 123 ast::Type const * postvisit( ast::ReferenceType const * type ); 122 124 }; … … 603 605 } 604 606 607 ast::SizeofExpr const * ReferenceTypeElimination::previsit( 608 ast::SizeofExpr const * expr ) { 609 if ( expr->expr ) return expr; 610 return ast::mutate_field( expr, &ast::SizeofExpr::type, 611 expr->type->stripReferences() ); 612 } 613 614 ast::AlignofExpr const * ReferenceTypeElimination::previsit( 615 ast::AlignofExpr const * expr ) { 616 if ( expr->expr ) return expr; 617 return ast::mutate_field( expr, &ast::AlignofExpr::type, 618 expr->type->stripReferences() ); 619 } 620 605 621 ast::Type const * ReferenceTypeElimination::postvisit( 606 622 ast::ReferenceType const * type ) { -
src/InitTweak/FixInit.cpp
r26d40a1 rd1f5054 731 731 try { 732 732 mutLast->expr = makeCtorDtor( "?{}", ret, mutLast->expr ); 733 } catch (...) {733 } catch (...) { 734 734 std::cerr << "*CFA internal error: "; 735 735 std::cerr << "can't resolve implicit constructor"; 736 std::cerr << " at " << stmtExpr->location.filename ;736 std::cerr << " at " << stmtExpr->location.filename.c_str(); 737 737 std::cerr << ":" << stmtExpr->location.first_line << std::endl; 738 738 -
src/Parser/parser.yy
r26d40a1 rd1f5054 10 10 // Created On : Sat Sep 1 20:22:55 2001 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Jul 26 14:09:30202413 // Update Count : 67 3312 // Last Modified On : Tue Aug 13 11:25:16 2024 13 // Update Count : 6740 14 14 // 15 15 … … 952 952 } 953 953 | COUNTOF unary_expression 954 { $$ = new ExpressionNode( new ast::CountExpr( yylloc, maybeMoveBuild( $2 ) ) ); }954 { $$ = new ExpressionNode( new ast::CountExpr( yylloc, maybeMoveBuild( $2 ) ) ); } 955 955 | COUNTOF '(' type_no_function ')' 956 956 { $$ = new ExpressionNode( new ast::CountExpr( yylloc, maybeMoveBuildType( $3 ) ) ); } … … 1626 1626 enum_key: 1627 1627 type_name 1628 { typedefTable.makeTypedef( *$1->symbolic.name, "enum_type_nobody 1" ); 1629 $$ = DeclarationNode::newEnum( $1->symbolic.name, nullptr, false, false ); } 1628 { 1629 typedefTable.makeTypedef( *$1->symbolic.name, "enum_type_nobody 1" ); 1630 $$ = DeclarationNode::newEnum( $1->symbolic.name, nullptr, false, false ); 1631 } 1630 1632 | ENUM identifier 1631 { typedefTable.makeTypedef( *$2, "enum_type_nobody 2" ); 1632 $$ = DeclarationNode::newEnum( $2, nullptr, false, false ); } 1633 { 1634 typedefTable.makeTypedef( *$2, "enum_type_nobody 2" ); 1635 $$ = DeclarationNode::newEnum( $2, nullptr, false, false ); 1636 } 1633 1637 | ENUM type_name 1634 { typedefTable.makeTypedef( *$2->symbolic.name, "enum_type_nobody 3" ); 1635 $$ = DeclarationNode::newEnum( $2->symbolic.name, nullptr, false, false ); } 1638 { 1639 typedefTable.makeTypedef( *$2->symbolic.name, "enum_type_nobody 3" ); 1640 $$ = DeclarationNode::newEnum( $2->symbolic.name, nullptr, false, false ); 1641 } 1636 1642 ; 1637 1643 … … 1849 1855 1850 1856 handler_clause: 1851 handler_key '(' push exception_declaration pophandler_predicate_opt ')' compound_statement1852 { $$ = new ClauseNode( build_catch( yylloc, $1, $ 4, $6, $8) ); }1853 | handler_clause handler_key '(' push exception_declaration pophandler_predicate_opt ')' compound_statement1854 { $$ = $1->set_last( new ClauseNode( build_catch( yylloc, $2, $ 5, $7, $9) ) ); }1857 handler_key '(' exception_declaration handler_predicate_opt ')' compound_statement 1858 { $$ = new ClauseNode( build_catch( yylloc, $1, $3, $4, $6 ) ); } 1859 | handler_clause handler_key '(' exception_declaration handler_predicate_opt ')' compound_statement 1860 { $$ = $1->set_last( new ClauseNode( build_catch( yylloc, $2, $4, $5, $7 ) ) ); } 1855 1861 ; 1856 1862 … … 2850 2856 2851 2857 enumerator_list: 2852 visible_hide_opt identifier_or_type_name enumerator_value_opt 2858 // empty 2859 { SemanticError( yylloc, "enumeration must have a minimum of one enumerator, empty enumerator list is meaningless." ); $$ = nullptr; } 2860 | visible_hide_opt identifier_or_type_name enumerator_value_opt 2853 2861 { $$ = DeclarationNode::newEnumValueGeneric( $2, $3 ); } 2854 2862 | INLINE type_name … … 3155 3163 '|' identifier_or_type_name '(' type_list ')' 3156 3164 { $$ = DeclarationNode::newTraitUse( $2, $4 ); } 3157 | '|' '{' push trait_declaration_list pop'}'3158 { $$ = $ 4; }3165 | '|' '{' trait_declaration_list '}' 3166 { $$ = $3; } 3159 3167 // | '|' '(' push type_parameter_list pop ')' '{' push trait_declaration_list pop '}' '(' type_list ')' 3160 3168 // { SemanticError( yylloc, "Generic data-type assertion is currently unimplemented." ); $$ = nullptr; } … … 3208 3216 | forall TRAIT identifier_or_type_name '{' '}' // alternate 3209 3217 { $$ = DeclarationNode::newTrait( $3, $1, nullptr ); } 3210 | TRAIT identifier_or_type_name '(' type_parameter_list ')' '{' push trait_declaration_list pop'}'3218 | TRAIT identifier_or_type_name '(' type_parameter_list ')' '{' trait_declaration_list '}' 3211 3219 { 3212 3220 SemanticWarning( yylloc, Warning::DeprecTraitSyntax ); 3213 $$ = DeclarationNode::newTrait( $2, $4, $ 8);3214 } 3215 | forall TRAIT identifier_or_type_name '{' push trait_declaration_list pop'}' // alternate3216 { $$ = DeclarationNode::newTrait( $3, $1, $ 6); }3221 $$ = DeclarationNode::newTrait( $2, $4, $7 ); 3222 } 3223 | forall TRAIT identifier_or_type_name '{' trait_declaration_list '}' // alternate 3224 { $$ = DeclarationNode::newTrait( $3, $1, $5 ); } 3217 3225 ; 3218 3226 3219 3227 trait_declaration_list: // CFA 3220 3228 trait_declaration 3221 | trait_declaration_list pop pushtrait_declaration3222 { $$ = $1->set_last( $ 4); }3229 | trait_declaration_list trait_declaration 3230 { $$ = $1->set_last( $2 ); } 3223 3231 ; 3224 3232 … … 3231 3239 cfa_variable_specifier 3232 3240 | cfa_function_specifier 3233 | cfa_trait_declaring_list pop ',' pushidentifier_or_type_name3234 { $$ = $1->set_last( $1->cloneType( $ 5) ); }3241 | cfa_trait_declaring_list ',' identifier_or_type_name 3242 { $$ = $1->set_last( $1->cloneType( $3 ) ); } 3235 3243 ; 3236 3244 3237 3245 trait_declaring_list: // CFA 3238 type_specifier declarator 3246 // Cannot declare an aggregate or enumeration in a trait. 3247 type_specifier_nobody declarator 3239 3248 { $$ = $2->addType( $1 ); } 3240 | trait_declaring_list pop ',' push declarator 3241 { $$ = $1->set_last( $1->cloneBaseType( $5 ) ); } 3249 | trait_declaring_list ',' declarator 3250 { $$ = $1->set_last( $1->cloneBaseType( $3 ) ); } 3251 | error 3252 { SemanticError( yylloc, "Possible cause is declaring an aggregate or enumeration type in a trait." ); $$ = nullptr; } 3242 3253 ; 3243 3254 -
src/ResolvExpr/CandidateFinder.cpp
r26d40a1 rd1f5054 1281 1281 // count one safe conversion for each value that is thrown away 1282 1282 thisCost.incSafe( discardedValues ); 1283 1284 // See Aaron Moss, page 47; this reasoning does not hold since implicit conversions 1285 // can create the same resolution issue. The C intrinsic interpretations are pruned 1286 // immediately for the lowest cost option regardless of result type. Related code in 1287 // postvisit (UntypedExpr). 1288 // Cast expression costs are updated now to use the general rules. 1289 /* 1283 1290 // select first on argument cost, then conversion cost 1284 1291 if ( cand->cost < minExprCost || ( cand->cost == minExprCost && thisCost < minCastCost ) ) { … … 1289 1296 // ambigious case, still output candidates to print in error message 1290 1297 if ( cand->cost == minExprCost && thisCost == minCastCost ) { 1298 */ 1299 cand->cost += thisCost; 1300 if (cand->cost < minExprCost) { 1301 minExprCost = cand->cost; 1302 matches.clear(); 1303 } 1304 if (cand->cost == minExprCost) { 1291 1305 CandidateRef newCand = std::make_shared<Candidate>( 1292 1306 restructureCast( cand->expr, toType, castExpr->isGenerated ), 1293 copy( cand->env ), std::move( open ), std::move( need ), cand->cost + thisCost);1307 copy( cand->env ), std::move( open ), std::move( need ), cand->cost); 1294 1308 // currently assertions are always resolved immediately so this should have no effect. 1295 1309 // if this somehow changes in the future (e.g. delayed by indeterminate return type)
Note:
See TracChangeset
for help on using the changeset viewer.