Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/ResolvExpr/AlternativeFinder.cc

    rb6d6e97 r33a25f9  
    144144                        expr->get_result()->accept( global_renamer );
    145145                }
     146
     147                void referenceToRvalueConversion( Expression *& expr ) {
     148                        if ( dynamic_cast< ReferenceType * >( expr->get_result() ) ) {
     149                                // cast away reference from expr
     150                                expr = new CastExpr( expr, expr->get_result()->stripReferences()->clone() );
     151                        }
     152                }
    146153        } // namespace
    147 
    148         void referenceToRvalueConversion( Expression *& expr ) {
    149                 if ( dynamic_cast< ReferenceType * >( expr->get_result() ) ) {
    150                         // cast away reference from expr
    151                         expr = new CastExpr( expr, expr->get_result()->stripReferences()->clone() );
    152                 }
    153         }
    154154
    155155        template< typename InputIterator, typename OutputIterator >
     
    174174        }
    175175
    176         void AlternativeFinder::find( Expression *expr, bool adjust, bool prune, bool failFast ) {
     176        void AlternativeFinder::find( Expression *expr, bool adjust, bool prune ) {
    177177                expr->accept( *this );
    178                 if ( failFast && alternatives.empty() ) {
     178                if ( alternatives.empty() ) {
    179179                        throw SemanticError( "No reasonable alternatives for expression ", expr );
    180180                }
     
    191191                        AltList::iterator oldBegin = alternatives.begin();
    192192                        pruneAlternatives( alternatives.begin(), alternatives.end(), front_inserter( alternatives ) );
    193                         if ( failFast && alternatives.begin() == oldBegin ) {
     193                        if ( alternatives.begin() == oldBegin ) {
    194194                                std::ostringstream stream;
    195195                                AltList winners;
     
    214214        }
    215215
    216         void AlternativeFinder::findWithAdjustment( Expression *expr ) {
    217                 find( expr, true );
    218         }
    219 
    220         void AlternativeFinder::findWithoutPrune( Expression * expr ) {
    221                 find( expr, true, false );
    222         }
    223 
    224         void AlternativeFinder::maybeFind( Expression * expr ) {
    225                 find( expr, true, true, false );
     216        void AlternativeFinder::findWithAdjustment( Expression *expr, bool prune ) {
     217                find( expr, true, prune );
    226218        }
    227219
     
    722714
    723715                // find function operators
    724                 static NameExpr *opExpr = new NameExpr( "?()" );
    725716                AlternativeFinder funcOpFinder( indexer, env );
    726                 // it's ok if there aren't any defined function ops
    727                 funcOpFinder.maybeFind( opExpr);
     717                NameExpr *opExpr = new NameExpr( "?()" );
     718                try {
     719                        funcOpFinder.findWithAdjustment( opExpr );
     720                } catch( SemanticError &e ) {
     721                        // it's ok if there aren't any defined function ops
     722                }
    728723                PRINT(
    729724                        std::cerr << "known function ops:" << std::endl;
     
    933928                AlternativeFinder finder( indexer, env );
    934929                // don't prune here, since it's guaranteed all alternatives will have the same type
    935                 finder.findWithoutPrune( castExpr->get_arg() );
     930                // (giving the alternatives different types is half of the point of ConstructorExpr nodes)
     931                finder.findWithAdjustment( castExpr->get_arg(), false );
    936932                for ( Alternative & alt : finder.alternatives ) {
    937933                        alternatives.push_back( Alternative(
     
    12301226                // don't prune here, since it's guaranteed all alternatives will have the same type
    12311227                // (giving the alternatives different types is half of the point of ConstructorExpr nodes)
    1232                 finder.findWithoutPrune( ctorExpr->get_callExpr() );
     1228                finder.findWithAdjustment( ctorExpr->get_callExpr(), false );
    12331229                for ( Alternative & alt : finder.alternatives ) {
    12341230                        alternatives.push_back( Alternative( new ConstructorExpr( alt.expr->clone() ), alt.env, alt.cost ) );
Note: See TracChangeset for help on using the changeset viewer.