- File:
-
- 1 edited
-
src/ResolvExpr/SatisfyAssertions.cpp (modified) (14 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/SatisfyAssertions.cpp
r3e5dd913 r5b9a0ae 69 69 /// Reference to a single deferred item 70 70 struct DeferRef { 71 const ast:: VariableExpr * expr;71 const ast::DeclWithType * decl; 72 72 const ast::AssertionSetValue & info; 73 73 const AssnCandidate & match; … … 77 77 /// Acts like an indexed list of DeferRef 78 78 struct DeferItem { 79 const ast:: VariableExpr * expr;79 const ast::DeclWithType * decl; 80 80 const ast::AssertionSetValue & info; 81 81 AssnCandidateList matches; 82 82 83 83 DeferItem( 84 const ast:: VariableExpr* d, const ast::AssertionSetValue & i, AssnCandidateList && ms )85 : expr( d ), info( i ), matches( std::move( ms ) ) {}84 const ast::DeclWithType * d, const ast::AssertionSetValue & i, AssnCandidateList && ms ) 85 : decl( d ), info( i ), matches( std::move( ms ) ) {} 86 86 87 87 bool empty() const { return matches.empty(); } … … 89 89 AssnCandidateList::size_type size() const { return matches.size(); } 90 90 91 DeferRef operator[] ( unsigned i ) const { return { expr, info, matches[i] }; }91 DeferRef operator[] ( unsigned i ) const { return { decl, info, matches[i] }; } 92 92 }; 93 93 … … 138 138 void addToSymbolTable( const ast::AssertionSet & have, ast::SymbolTable & symtab ) { 139 139 for ( auto & i : have ) { 140 if ( i.second.isUsed ) { symtab.addId( i.first ->var); }140 if ( i.second.isUsed ) { symtab.addId( i.first ); } 141 141 } 142 142 } … … 144 144 /// Binds a single assertion, updating satisfaction state 145 145 void bindAssertion( 146 const ast:: VariableExpr * expr, const ast::AssertionSetValue & info, CandidateRef & cand,146 const ast::DeclWithType * decl, const ast::AssertionSetValue & info, CandidateRef & cand, 147 147 AssnCandidate & match, InferCache & inferred 148 148 ) { … … 156 156 157 157 // place newly-inferred assertion in proper location in cache 158 inferred[ info.resnSlot ][ expr->var->uniqueId ] = ast::ParamEntry{159 candidate->uniqueId, candidate, match.adjType, expr->result, varExpr };158 inferred[ info.resnSlot ][ decl->uniqueId ] = ast::ParamEntry{ 159 candidate->uniqueId, candidate, match.adjType, decl->get_type(), varExpr }; 160 160 } 161 161 … … 169 169 170 170 std::vector<ast::SymbolTable::IdData> candidates; 171 auto kind = ast::SymbolTable::getSpecialFunctionKind(assn.first-> var->name);171 auto kind = ast::SymbolTable::getSpecialFunctionKind(assn.first->name); 172 172 if (kind != ast::SymbolTable::SpecialFunctionKind::NUMBER_OF_KINDS) { 173 173 // prefilter special decls by argument type, if already known 174 ast::ptr<ast::Type> thisArgType = assn.first->result.strict_as<ast::PointerType>()->base174 ast::ptr<ast::Type> thisArgType = strict_dynamic_cast<const ast::PointerType *>(assn.first->get_type())->base 175 175 .strict_as<ast::FunctionType>()->params[0] 176 176 .strict_as<ast::ReferenceType>()->base; … … 184 184 } 185 185 else { 186 candidates = sat.symtab.lookupId(assn.first-> var->name);186 candidates = sat.symtab.lookupId(assn.first->name); 187 187 } 188 188 for ( const ast::SymbolTable::IdData & cdata : candidates ) { … … 200 200 ast::TypeEnvironment newEnv{ sat.cand->env }; 201 201 ast::OpenVarSet newOpen{ sat.cand->open }; 202 ast::ptr< ast::Type > toType = assn.first-> result;202 ast::ptr< ast::Type > toType = assn.first->get_type(); 203 203 ast::ptr< ast::Type > adjType = 204 204 renameTyVars( adjustExprType( candidate->get_type(), newEnv, sat.symtab ) ); … … 337 337 // compute conversion cost from satisfying decl to assertion 338 338 cost += computeConversionCost( 339 assn.match.adjType, assn. expr->result, false, symtab, env );339 assn.match.adjType, assn.decl->get_type(), false, symtab, env ); 340 340 341 341 // mark vars+specialization on function-type assertions … … 350 350 cost.incVar( func->forall.size() ); 351 351 352 cost.decSpec( func->assertions.size() ); 352 for ( const ast::TypeDecl * td : func->forall ) { 353 cost.decSpec( td->assertions.size() ); 354 } 353 355 } 354 356 } … … 449 451 ss << (tabs-1) << "Too many non-unique satisfying assignments for assertions:\n"; 450 452 for ( const auto & d : sat.deferred ) { 451 ast::print( ss, d. expr, tabs );453 ast::print( ss, d.decl, tabs ); 452 454 } 453 455 … … 467 469 ss << (tabs-1) << "No mutually-compatible satisfaction for assertions:\n"; 468 470 for ( const auto& d : sat.deferred ) { 469 ast::print( ss, d. expr, tabs );471 ast::print( ss, d.decl, tabs ); 470 472 } 471 473 … … 499 501 nextNewNeed.insert( match.need.begin(), match.need.end() ); 500 502 501 bindAssertion( r. expr, r.info, nextCand, match, nextInferred );503 bindAssertion( r.decl, r.info, nextCand, match, nextInferred ); 502 504 } 503 505
Note:
See TracChangeset
for help on using the changeset viewer.