Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/ResolvExpr/CandidateFinder.cpp

    r4ef08f7 ref9988b  
    10891089                }
    10901090
    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.__thrd
    1126                                 // Clone is purely for memory management
    1127                                 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 type
    1130                                 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 type
    1139                         finder.find( fallback.get(), ResolvMode::withoutPrune() );
    1140 
    1141                         pick_alternatives(finder.candidates, true);
    1142 
    1143                         // Whatever happens here, we have no more fallbacks
    1144                 }
    1145 
    11461091                void postvisit( const ast::UntypedMemberExpr * memberExpr ) {
    11471092                        CandidateFinder aggFinder{ symtab, tenv };
Note: See TracChangeset for help on using the changeset viewer.