- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/CandidateFinder.cpp
r0536c03 r361bf01 212 212 // mark type variable and specialization cost of forall clause 213 213 convCost.incVar( function->forall.size() ); 214 convCost.decSpec( function->assertions.size() ); 214 for ( const ast::TypeDecl * td : function->forall ) { 215 convCost.decSpec( td->assertions.size() ); 216 } 215 217 216 218 return convCost; … … 221 223 ast::AssertionSet & need 222 224 ) { 223 for ( auto &tyvar : type->forall ) {224 unifiableVars[ *tyvar ] = ast::TypeDecl::Data{ tyvar->base};225 }226 for ( auto & assn : type->assertions ) {227 need[ assn ].isUsed = true;225 for ( const ast::TypeDecl * tyvar : type->forall ) { 226 unifiableVars[ tyvar->name ] = ast::TypeDecl::Data{ tyvar }; 227 for ( const ast::DeclWithType * assn : tyvar->assertions ) { 228 need[ assn ].isUsed = true; 229 } 228 230 } 229 231 } … … 905 907 // xxx - is it possible that handleTupleAssignment and main finder both produce candidates? 906 908 // this means there exists ctor/assign functions with a tuple as first parameter. 907 ResolvMode mode = { 908 true, // adjust 909 !untypedExpr->func.as<ast::NameExpr>(), // prune if not calling by name 910 selfFinder.candidates.empty() // failfast if other options are not found 911 }; 912 funcFinder.find( untypedExpr->func, mode ); 909 funcFinder.find( untypedExpr->func, selfFinder.candidates.empty() ? ResolvMode::withAdjustment() : ResolvMode::withoutFailFast() ); 913 910 // short-circuit if no candidates 914 911 // if ( funcFinder.candidates.empty() ) return; … … 956 953 auto inst = dynamic_cast< const ast::TypeInstType * >( funcResult ) 957 954 ) { 958 if ( const ast::EqvClass * clz = func->env.lookup( *inst) ) {955 if ( const ast::EqvClass * clz = func->env.lookup( inst->name ) ) { 959 956 if ( auto function = clz->bound.as< ast::FunctionType >() ) { 960 957 CandidateRef newFunc{ new Candidate{ *func } }; … … 1080 1077 assert( toType ); 1081 1078 toType = resolveTypeof( toType, symtab ); 1082 //toType = SymTab::validateType( castExpr->location, toType, symtab );1079 toType = SymTab::validateType( castExpr->location, toType, symtab ); 1083 1080 toType = adjustExprType( toType, tenv, symtab ); 1084 1081 … … 1165 1162 1166 1163 if(auto insttype = dynamic_cast<const ast::TypeInstType*>(expr)) { 1167 auto td = cand->env.lookup( *insttype);1164 auto td = cand->env.lookup(insttype->name); 1168 1165 if(!td) { continue; } 1169 1166 expr = td->bound.get(); … … 1571 1568 // calculate target type 1572 1569 const ast::Type * toType = resolveTypeof( initAlt.type, symtab ); 1573 //toType = SymTab::validateType( initExpr->location, toType, symtab );1570 toType = SymTab::validateType( initExpr->location, toType, symtab ); 1574 1571 toType = adjustExprType( toType, tenv, symtab ); 1575 1572 // The call to find must occur inside this loop, otherwise polymorphic return
Note: See TracChangeset
for help on using the changeset viewer.