Changes in src/ResolvExpr/Resolver.cc [2efe4b8:6f326b1]
- File:
-
- 1 edited
-
src/ResolvExpr/Resolver.cc (modified) (21 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/Resolver.cc
r2efe4b8 r6f326b1 22 22 #include "Alternative.h" // for Alternative, AltList 23 23 #include "AlternativeFinder.h" // for AlternativeFinder, resolveIn... 24 #include "Common/GC.h" // for new_generation, collect_young25 24 #include "Common/PassVisitor.h" // for PassVisitor 26 25 #include "Common/SemanticError.h" // for SemanticError … … 60 59 void previsit( TypeDecl *typeDecl ); 61 60 void previsit( EnumDecl * enumDecl ); 61 void previsit( StaticAssertDecl * assertDecl ); 62 62 63 63 void previsit( ArrayType * at ); … … 139 139 castExpr->arg = nullptr; 140 140 std::swap( expr->env, castExpr->env ); 141 delete castExpr; 141 142 } 142 143 } … … 147 148 void findUnfinishedKindExpression(Expression * untyped, Alternative & alt, const SymTab::Indexer & indexer, const std::string & kindStr, std::function<bool(const Alternative &)> pred, bool adjust = false, bool prune = true, bool failFast = true) { 148 149 assertf( untyped, "expected a non-null expression." ); 149 150 auto guard = new_generation(); // set up GC generation for this top-level expression151 152 150 TypeEnvironment env; 153 151 AlternativeFinder finder( indexer, env ); … … 177 175 findMinCost( candidates.begin(), candidates.end(), back_inserter( winners ) ); 178 176 if ( winners.size() == 0 ) { 179 SemanticError( untyped, toString( 180 "No reasonable alternatives for ", kindStr, (kindStr != "" ? " " : ""), 181 "expression: ") ); 177 SemanticError( untyped, toString( "No reasonable alternatives for ", kindStr, (kindStr != "" ? " " : ""), "expression: ") ); 182 178 } else if ( winners.size() != 1 ) { 183 179 std::ostringstream stream; 184 stream << "Cannot choose between " << winners.size() << " alternatives for " 185 << kindStr << (kindStr != "" ? " " : "") << "expression\n"; 180 stream << "Cannot choose between " << winners.size() << " alternatives for " << kindStr << (kindStr != "" ? " " : "") << "expression\n"; 186 181 untyped->print( stream ); 187 182 stream << " Alternatives are:\n"; 188 183 printAlts( winners, stream, 1 ); 189 190 184 SemanticError( untyped->location, stream.str() ); 191 185 } … … 194 188 Alternative & choice = winners.front(); 195 189 if ( findDeletedExpr( choice.expr ) ) { 196 trace( choice.expr ); 197 SemanticError( choice.expr, 198 "Unique best alternative includes deleted identifier in " ); 190 SemanticError( choice.expr, "Unique best alternative includes deleted identifier in " ); 199 191 } 200 192 alt = std::move( choice ); 201 trace( alt );202 193 } 203 194 … … 208 199 findUnfinishedKindExpression( untyped, choice, indexer, kindStr, pred, adjust, prune, failFast ); 209 200 finishExpr( choice.expr, choice.env, untyped->env ); 201 delete untyped; 210 202 untyped = choice.expr; 211 203 choice.expr = nullptr; … … 230 222 assertf( expr, "expected a non-null expression." ); 231 223 232 auto untyped = new CastExpr{ expr }; // cast to void224 static CastExpr untyped( nullptr ); // cast to void 233 225 234 226 // set up and resolve expression cast to void 227 untyped.arg = expr; 235 228 Alternative choice; 236 findUnfinishedKindExpression( untyped, choice, indexer, "", standardAlternativeFilter, true );229 findUnfinishedKindExpression( &untyped, choice, indexer, "", standardAlternativeFilter, true ); 237 230 CastExpr * castExpr = strict_dynamic_cast< CastExpr * >( choice.expr ); 238 231 env = std::move( choice.env ); 239 232 240 233 // clean up resolved expression 241 return castExpr->arg; 234 Expression * ret = castExpr->arg; 235 castExpr->arg = nullptr; 236 237 // unlink the arg so that it isn't deleted twice at the end of the program 238 untyped.arg = nullptr; 239 return ret; 242 240 } 243 241 … … 247 245 Expression * newExpr = resolveInVoidContext( untyped, indexer, env ); 248 246 finishExpr( newExpr, env, untyped->env ); 247 delete untyped; 249 248 untyped = newExpr; 250 249 } … … 365 364 } 366 365 366 void Resolver::previsit( StaticAssertDecl * assertDecl ) { 367 findIntegralExpression( assertDecl->condition, indexer ); 368 } 369 367 370 void Resolver::previsit( ExprStmt *exprStmt ) { 368 371 visit_children = false; … … 420 423 caseStmt->condition = castExpr->arg; 421 424 castExpr->arg = nullptr; 425 delete castExpr; 422 426 } 423 427 } … … 486 490 ss << "' in call to waitfor"; 487 491 SemanticError( stmt->location, ss.str() ); 492 } 493 494 if(clause.target.arguments.empty()) { 495 SemanticError( stmt->location, "Waitfor clause must have at least one mutex parameter"); 488 496 } 489 497 … … 536 544 OpenVarSet openVars; 537 545 AssertionSet resultNeed, resultHave; 538 TypeEnvironment resultEnv; 546 TypeEnvironment resultEnv( func.env ); 547 makeUnifiableVars( function, openVars, resultNeed ); 548 // add all type variables as open variables now so that those not used in the parameter 549 // list are still considered open. 550 resultEnv.add( function->forall ); 539 551 540 552 // Load type variables from arguemnts into one shared space … … 552 564 auto param_end = function->parameters.end(); 553 565 566 int n_mutex_arg = 0; 567 554 568 // For every arguments of its set, check if it matches one of the parameter 555 569 // The order is important … … 560 574 // We ran out of parameters but still have arguments 561 575 // this function doesn't match 562 SemanticError( function, "candidate function not viable: too many mutex arguments\n");576 SemanticError( function, toString("candidate function not viable: too many mutex arguments, expected ", n_mutex_arg, "\n" )); 563 577 } 564 578 579 n_mutex_arg++; 580 565 581 // Check if the argument matches the parameter type in the current scope 566 if( ! unify( (*param)->get_type(), arg.expr->get_result(), resultEnv, resultNeed, resultHave, openVars, this->indexer ) ) {582 if( ! unify( arg.expr->get_result(), (*param)->get_type(), resultEnv, resultNeed, resultHave, openVars, this->indexer ) ) { 567 583 // Type doesn't match 568 584 stringstream ss; 569 585 ss << "candidate function not viable: no known convertion from '"; 586 (*param)->get_type()->print( ss ); 587 ss << "' to '"; 570 588 arg.expr->get_result()->print( ss ); 571 ss << "' to'";572 (*param)->get_type()->print( ss);589 ss << "' with env '"; 590 resultEnv.print(ss); 573 591 ss << "'\n"; 574 592 SemanticError( function, ss.str() ); … … 584 602 // We ran out of arguments but still have parameters left 585 603 // this function doesn't match 586 SemanticError( function, "candidate function not viable: too few mutex arguments\n");604 SemanticError( function, toString("candidate function not viable: too few mutex arguments, expected ", n_mutex_arg, "\n" )); 587 605 } 588 606 … … 701 719 std::swap( initExpr->env, newExpr->env ); 702 720 std::swap( initExpr->inferParams, newExpr->inferParams ) ; 721 delete initExpr; 703 722 704 723 // get the actual object's type (may not exactly match what comes back from the resolver due to conversions) … … 718 737 ce->set_arg( nullptr ); 719 738 std::swap( ce->env, newExpr->env ); 739 delete ce; 720 740 } 721 741 } … … 768 788 // could not find valid constructor, or found an intrinsic constructor 769 789 // fall back on C-style initializer 770 ctorInit->set_ctor( nullptr ); 771 ctorInit->set_dtor( nullptr ); 790 delete ctorInit->get_ctor(); 791 ctorInit->set_ctor( NULL ); 792 delete ctorInit->get_dtor(); 793 ctorInit->set_dtor( NULL ); 772 794 maybeAccept( ctorInit->get_init(), *visitor ); 773 795 } … … 795 817 796 818 // found a constructor - can get rid of C-style initializer 819 delete ctorInit->init; 797 820 ctorInit->init = nullptr; 798 821 … … 801 824 // to clean up generated code. 802 825 if ( InitTweak::isIntrinsicSingleArgCallStmt( ctorInit->ctor ) ) { 826 delete ctorInit->ctor; 803 827 ctorInit->ctor = nullptr; 804 828 } 805 829 806 830 if ( InitTweak::isIntrinsicSingleArgCallStmt( ctorInit->dtor ) ) { 831 delete ctorInit->dtor; 807 832 ctorInit->dtor = nullptr; 808 833 }
Note:
See TracChangeset
for help on using the changeset viewer.