Changeset ffd0ac2 for src/ResolvExpr


Ignore:
Timestamp:
Jan 30, 2018, 2:04:33 PM (8 years ago)
Author:
Thierry Delisle <tdelisle@…>
Branches:
ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
Children:
42be3c3
Parents:
2e9aed4 (diff), 5a73f0f (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

    r2e9aed4 rffd0ac2  
    15441544                AlternativeFinder firstFinder( indexer, env );
    15451545                firstFinder.findWithAdjustment( logicalExpr->get_arg1() );
     1546                if ( firstFinder.alternatives.empty() ) return;
     1547                AlternativeFinder secondFinder( indexer, env );
     1548                secondFinder.findWithAdjustment( logicalExpr->get_arg2() );
     1549                if ( secondFinder.alternatives.empty() ) return;
    15461550                for ( AltList::const_iterator first = firstFinder.alternatives.begin(); first != firstFinder.alternatives.end(); ++first ) {
    1547                         AlternativeFinder secondFinder( indexer, first->env );
    1548                         secondFinder.findWithAdjustment( logicalExpr->get_arg2() );
    15491551                        for ( AltList::const_iterator second = secondFinder.alternatives.begin(); second != secondFinder.alternatives.end(); ++second ) {
     1552                                TypeEnvironment compositeEnv;
     1553                                compositeEnv.simpleCombine( first->env );
     1554                                compositeEnv.simpleCombine( second->env );
     1555
    15501556                                LogicalExpr *newExpr = new LogicalExpr( first->expr->clone(), second->expr->clone(), logicalExpr->get_isAnd() );
    1551                                 alternatives.push_back( Alternative( newExpr, second->env, first->cost + second->cost ) );
     1557                                alternatives.push_back( Alternative( newExpr, compositeEnv, first->cost + second->cost ) );
    15521558                        }
    15531559                }
     
    15581564                AlternativeFinder firstFinder( indexer, env );
    15591565                firstFinder.findWithAdjustment( conditionalExpr->get_arg1() );
     1566                if ( firstFinder.alternatives.empty() ) return;
     1567                // find alternatives for true expression
     1568                AlternativeFinder secondFinder( indexer, env );
     1569                secondFinder.findWithAdjustment( conditionalExpr->get_arg2() );
     1570                if ( secondFinder.alternatives.empty() ) return;
     1571                // find alterantives for false expression
     1572                AlternativeFinder thirdFinder( indexer, env );
     1573                thirdFinder.findWithAdjustment( conditionalExpr->get_arg3() );
     1574                if ( thirdFinder.alternatives.empty() ) return;
    15601575                for ( AltList::const_iterator first = firstFinder.alternatives.begin(); first != firstFinder.alternatives.end(); ++first ) {
    1561                         // find alternatives for true expression
    1562                         AlternativeFinder secondFinder( indexer, first->env );
    1563                         secondFinder.findWithAdjustment( conditionalExpr->get_arg2() );
    15641576                        for ( AltList::const_iterator second = secondFinder.alternatives.begin(); second != secondFinder.alternatives.end(); ++second ) {
    1565                                 // find alterantives for false expression
    1566                                 AlternativeFinder thirdFinder( indexer, second->env );
    1567                                 thirdFinder.findWithAdjustment( conditionalExpr->get_arg3() );
    15681577                                for ( AltList::const_iterator third = thirdFinder.alternatives.begin(); third != thirdFinder.alternatives.end(); ++third ) {
     1578                                        TypeEnvironment compositeEnv;
     1579                                        compositeEnv.simpleCombine( first->env );
     1580                                        compositeEnv.simpleCombine( second->env );
     1581                                        compositeEnv.simpleCombine( third->env );
     1582
    15691583                                        // unify true and false types, then infer parameters to produce new alternatives
    15701584                                        OpenVarSet openVars;
    15711585                                        AssertionSet needAssertions, haveAssertions;
    1572                                         Alternative newAlt( 0, third->env, first->cost + second->cost + third->cost );
     1586                                        Alternative newAlt( 0, compositeEnv, first->cost + second->cost + third->cost );
    15731587                                        Type* commonType = nullptr;
    15741588                                        if ( unify( second->expr->get_result(), third->expr->get_result(), newAlt.env, needAssertions, haveAssertions, openVars, indexer, commonType ) ) {
     
    16011615                AlternativeFinder firstFinder( indexer, env );
    16021616                firstFinder.findWithAdjustment( rangeExpr->get_low() );
     1617                if ( firstFinder.alternatives.empty() ) return;
     1618                AlternativeFinder secondFinder( indexer, env );
     1619                secondFinder.findWithAdjustment( rangeExpr->get_high() );
     1620                if ( secondFinder.alternatives.empty() ) return;
    16031621                for ( AltList::const_iterator first = firstFinder.alternatives.begin(); first != firstFinder.alternatives.end(); ++first ) {
    1604                         AlternativeFinder secondFinder( indexer, first->env );
    1605                         secondFinder.findWithAdjustment( rangeExpr->get_high() );
    16061622                        for ( AltList::const_iterator second = secondFinder.alternatives.begin(); second != secondFinder.alternatives.end(); ++second ) {
     1623                                TypeEnvironment compositeEnv;
     1624                                compositeEnv.simpleCombine( first->env );
     1625                                compositeEnv.simpleCombine( second->env );
    16071626                                OpenVarSet openVars;
    16081627                                AssertionSet needAssertions, haveAssertions;
    1609                                 Alternative newAlt( 0, second->env, first->cost + second->cost );
     1628                                Alternative newAlt( 0, compositeEnv, first->cost + second->cost );
    16101629                                Type* commonType = nullptr;
    16111630                                if ( unify( first->expr->get_result(), second->expr->get_result(), newAlt.env, needAssertions, haveAssertions, openVars, indexer, commonType ) ) {
Note: See TracChangeset for help on using the changeset viewer.