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