- File:
-
- 1 edited
-
src/ResolvExpr/CandidateFinder.cpp (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/CandidateFinder.cpp
r4ef08f7 ref9988b 1089 1089 } 1090 1090 1091 void postvisit( const ast::KeywordCastExpr * castExpr ) {1092 const auto & loc = castExpr->location;1093 assertf( castExpr->result, "Cast target should have been set in Validate." );1094 auto ref = castExpr->result.strict_as<ast::ReferenceType>();1095 auto inst = ref->base.strict_as<ast::StructInstType>();1096 auto target = inst->base.get();1097 1098 CandidateFinder finder{ symtab, tenv };1099 1100 auto pick_alternatives = [target, this](CandidateList & found, bool expect_ref) {1101 for(auto & cand : found) {1102 const ast::Type * expr = cand->expr->result.get();1103 if(expect_ref) {1104 auto res = dynamic_cast<const ast::ReferenceType*>(expr);1105 if(!res) { continue; }1106 expr = res->base.get();1107 }1108 1109 if(auto insttype = dynamic_cast<const ast::TypeInstType*>(expr)) {1110 auto td = cand->env.lookup(insttype->name);1111 if(!td) { continue; }1112 expr = td->bound.get();1113 }1114 1115 if(auto base = dynamic_cast<const ast::StructInstType*>(expr)) {1116 if(base->base == target) {1117 candidates.push_back( std::move(cand) );1118 reason.code = NoReason;1119 }1120 }1121 }1122 };1123 1124 try {1125 // Attempt 1 : turn (thread&)X into ($thread&)X.__thrd1126 // Clone is purely for memory management1127 std::unique_ptr<const ast::Expr> tech1 { new ast::UntypedMemberExpr(loc, new ast::NameExpr(loc, castExpr->concrete_target.field), castExpr->arg) };1128 1129 // don't prune here, since it's guaranteed all alternatives will have the same type1130 finder.find( tech1.get(), ResolvMode::withoutPrune() );1131 pick_alternatives(finder.candidates, false);1132 1133 return;1134 } catch(SemanticErrorException & ) {}1135 1136 // Fallback : turn (thread&)X into ($thread&)get_thread(X)1137 std::unique_ptr<const ast::Expr> fallback { ast::UntypedExpr::createDeref(loc, new ast::UntypedExpr(loc, new ast::NameExpr(loc, castExpr->concrete_target.getter), { castExpr->arg })) };1138 // don't prune here, since it's guaranteed all alternatives will have the same type1139 finder.find( fallback.get(), ResolvMode::withoutPrune() );1140 1141 pick_alternatives(finder.candidates, true);1142 1143 // Whatever happens here, we have no more fallbacks1144 }1145 1146 1091 void postvisit( const ast::UntypedMemberExpr * memberExpr ) { 1147 1092 CandidateFinder aggFinder{ symtab, tenv };
Note:
See TracChangeset
for help on using the changeset viewer.