Ignore:
Timestamp:
Nov 20, 2017, 2:20:10 PM (4 years ago)
Author:
Aaron Moss <a3moss@…>
Branches:
aaron-thesis, arm-eh, cleanup-dtors, deferred_resn, demangler, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, resolv-new, with_gc
Children:
0872c42
Parents:
403b388 (diff), c0b23644 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge branch 'master' of plg.uwaterloo.ca:software/cfa/cfa-cc

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/ResolvExpr/AlternativeFinder.cc

    r403b388 ra94b829  
    779779                        return ! finalResults.empty();
    780780                }
    781                
     781
    782782                // iterate each current subresult
    783783                std::size_t genEnd = results.size();
     
    913913
    914914        template<typename OutputIterator>
    915         void AlternativeFinder::makeFunctionAlternatives( const Alternative &func, 
    916                         FunctionType *funcType, const std::vector< AlternativeFinder > &args, 
     915        void AlternativeFinder::makeFunctionAlternatives( const Alternative &func,
     916                        FunctionType *funcType, const std::vector< AlternativeFinder > &args,
    917917                        OutputIterator out ) {
    918918                OpenVarSet funcOpenVars;
     
    920920                TypeEnvironment funcEnv( func.env );
    921921                makeUnifiableVars( funcType, funcOpenVars, funcNeed );
    922                 // add all type variables as open variables now so that those not used in the parameter 
     922                // add all type variables as open variables now so that those not used in the parameter
    923923                // list are still considered open.
    924924                funcEnv.add( funcType->get_forall() );
    925                
     925
    926926                if ( targetType && ! targetType->isVoid() && ! funcType->get_returnVals().empty() ) {
    927927                        // attempt to narrow based on expected target type
    928928                        Type * returnType = funcType->get_returnVals().front()->get_type();
    929                         if ( ! unify( returnType, targetType, funcEnv, funcNeed, funcHave, funcOpenVars, 
     929                        if ( ! unify( returnType, targetType, funcEnv, funcNeed, funcHave, funcOpenVars,
    930930                                        indexer ) ) {
    931931                                // unification failed, don't pursue this function alternative
     
    10351035
    10361036                std::vector< AlternativeFinder > argAlternatives;
    1037                 findSubExprs( untypedExpr->begin_args(), untypedExpr->end_args(), 
     1037                findSubExprs( untypedExpr->begin_args(), untypedExpr->end_args(),
    10381038                        back_inserter( argAlternatives ) );
    10391039
     
    10651065                                                Alternative newFunc( *func );
    10661066                                                referenceToRvalueConversion( newFunc.expr );
    1067                                                 makeFunctionAlternatives( newFunc, function, argAlternatives, 
     1067                                                makeFunctionAlternatives( newFunc, function, argAlternatives,
    10681068                                                        std::back_inserter( candidates ) );
    10691069                                        }
     
    10741074                                                        Alternative newFunc( *func );
    10751075                                                        referenceToRvalueConversion( newFunc.expr );
    1076                                                         makeFunctionAlternatives( newFunc, function, argAlternatives, 
     1076                                                        makeFunctionAlternatives( newFunc, function, argAlternatives,
    10771077                                                                std::back_inserter( candidates ) );
    10781078                                                } // if
    10791079                                        } // if
    1080                                 }                       
     1080                                }
    10811081                        } catch ( SemanticError &e ) {
    10821082                                errors.append( e );
     
    10931093                                try {
    10941094                                        // check if type is a pointer to function
    1095                                         if ( PointerType* pointer = dynamic_cast<PointerType*>( 
     1095                                        if ( PointerType* pointer = dynamic_cast<PointerType*>(
    10961096                                                        funcOp->expr->get_result()->stripReferences() ) ) {
    1097                                                 if ( FunctionType* function = 
     1097                                                if ( FunctionType* function =
    10981098                                                                dynamic_cast<FunctionType*>( pointer->get_base() ) ) {
    10991099                                                        Alternative newFunc( *funcOp );
    11001100                                                        referenceToRvalueConversion( newFunc.expr );
    1101                                                         makeFunctionAlternatives( newFunc, function, argAlternatives, 
     1101                                                        makeFunctionAlternatives( newFunc, function, argAlternatives,
    11021102                                                                std::back_inserter( candidates ) );
    11031103                                                }
     
    11381138                candidates.splice( candidates.end(), alternatives );
    11391139
    1140                 findMinCost( candidates.begin(), candidates.end(), std::back_inserter( alternatives ) );
     1140                // use a new list so that alternatives are not examined by addAnonConversions twice.
     1141                AltList winners;
     1142                findMinCost( candidates.begin(), candidates.end(), std::back_inserter( winners ) );
    11411143
    11421144                // function may return struct or union value, in which case we need to add alternatives for implicit
    11431145                // conversions to each of the anonymous members, must happen after findMinCost since anon conversions
    11441146                // are never the cheapest expression
    1145                 for ( const Alternative & alt : alternatives ) {
     1147                for ( const Alternative & alt : winners ) {
    11461148                        addAnonConversions( alt );
    11471149                }
     1150                alternatives.splice( alternatives.begin(), winners );
    11481151
    11491152                if ( alternatives.empty() && targetType && ! targetType->isVoid() ) {
Note: See TracChangeset for help on using the changeset viewer.