Changeset 4edf753 for src/ResolvExpr
- Timestamp:
- Mar 13, 2018, 2:17:10 PM (6 years ago)
- Branches:
- resolv-new
- Parents:
- 8573729
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/Resolver.cc
r8573729 r4edf753 19 19 #include <memory> // for allocator, allocator_traits<... 20 20 #include <tuple> // for get 21 #include <utility> // for move 21 22 #include <vector> 22 23 … … 629 630 } 630 631 632 assertf(func_candidates.size() == args_candidates.size(), 633 "Same number of function and argument candidates"); 634 635 // remove alternatives that include deleted expressions 636 unsigned into = 0; 637 for ( unsigned from = 0; from < func_candidates.size(); ++from ) { 638 // skip deleted expressions 639 if ( findDeletedExpr( func_candidates[from].expr ) 640 || std::any_of( args_candidates[from].begin(), args_candidates[from].end(), 641 []( const Alternative& a ) { return findDeletedExpr( a.expr ); } ) ) { 642 continue; 643 } 644 645 // overwrite deleted candidates 646 if ( into < from ) { 647 func_candidates[into] = std::move( func_candidates[from] ); 648 args_candidates[into] = std::move( args_candidates[from] ); 649 } 650 ++into; 651 } 652 bool includes_deleted = into < func_candidates.size(); 653 if ( includes_deleted ) { 654 func_candidates.resize( into ); 655 args_candidates.resize( into ); 656 } 657 631 658 // Make sure we got the right number of arguments 632 if( func_candidates.empty() ) { SemanticErrorException top( stmt->location, "No alternatives for function in call to waitfor" ); top.append( errors ); throw top; } 633 if( args_candidates.empty() ) { SemanticErrorException top( stmt->location, "No alternatives for arguments in call to waitfor" ); top.append( errors ); throw top; } 634 if( func_candidates.size() > 1 ) { SemanticErrorException top( stmt->location, "Ambiguous function in call to waitfor" ); top.append( errors ); throw top; } 635 if( args_candidates.size() > 1 ) { SemanticErrorException top( stmt->location, "Ambiguous arguments in call to waitfor" ); top.append( errors ); throw top; } 636 // TODO: need to use findDeletedExpr to ensure no deleted identifiers are used. 637 659 if( func_candidates.empty() ) { 660 SemanticErrorException top( stmt->location, includes_deleted ? 661 "No non-deleted alternatives for call to waitfor" : 662 "No alternatives for call to waitfor" ); 663 top.append( errors ); 664 throw top; 665 } 666 if( func_candidates.size() > 1 ) { 667 SemanticErrorException top( stmt->location, 668 "Ambiguous call to waitfor" ); 669 top.append( errors ); 670 throw top; 671 } 672 638 673 // Swap the results from the alternative with the unresolved values. 639 674 // Alternatives will handle deletion on destruction
Note: See TracChangeset
for help on using the changeset viewer.