Changeset d97c3a4


Ignore:
Timestamp:
Jan 11, 2019, 2:16:53 PM (3 years ago)
Author:
Aaron Moss <a3moss@…>
Branches:
aaron-thesis, arm-eh, cleanup-dtors, deferred_resn, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, no_list, persistent-indexer
Children:
52ffa30
Parents:
e99e43f
Message:

Fix new cost model by boosting precedence of safe costs

Files:
5 edited

Legend:

Unmodified
Added
Removed
  • src/ResolvExpr/AlternativeFinder.cc

    re99e43f rd97c3a4  
    12291229                                Alternative newAlt{
    12301230                                        restructureCast( alt.expr->clone(), toType, castExpr->isGenerated ),
    1231                                         alt.env, openVars, needAssertions, alt.cost, thisCost };
     1231                                        alt.env, openVars, needAssertions, alt.cost + thisCost, thisCost };
    12321232                                inferParameters( newAlt, back_inserter( candidates ) );
    12331233                        } // if
  • src/ResolvExpr/ConversionCost.cc

    re99e43f rd97c3a4  
    2929namespace ResolvExpr {
    3030        const Cost Cost::zero =      Cost{  0,  0,  0,  0,  0,  0 };
    31         const Cost Cost::infinity =  Cost{ -1, -1, -1,  1, -1, -1 };
     31        const Cost Cost::infinity =  Cost{ -1, -1, -1, -1,  1, -1 };
    3232        const Cost Cost::unsafe =    Cost{  1,  0,  0,  0,  0,  0 };
    3333        const Cost Cost::poly =      Cost{  0,  1,  0,  0,  0,  0 };
    34         const Cost Cost::var =       Cost{  0,  0,  1,  0,  0,  0 };
    35         const Cost Cost::spec =      Cost{  0,  0,  0, -1,  0,  0 };
    36         const Cost Cost::safe =      Cost{  0,  0,  0,  0,  1,  0 };
     34        const Cost Cost::safe =      Cost{  0,  0,  1,  0,  0,  0 };
     35        const Cost Cost::var =       Cost{  0,  0,  0,  1,  0,  0 };
     36        const Cost Cost::spec =      Cost{  0,  0,  0,  0, -1,  0 };
    3737        const Cost Cost::reference = Cost{  0,  0,  0,  0,  0,  1 };
    3838
  • src/ResolvExpr/Cost.h

    re99e43f rd97c3a4  
    2121        class Cost {
    2222          private:
    23                 Cost( int unsafeCost, int polyCost, int varCost, int specCost, int safeCost,
    24                       int referenceCost );
     23                Cost( int unsafeCost, int polyCost, int safeCost, int varCost, int specCost,
     24                        int referenceCost );
    2525
    2626          public:
    2727                Cost & incUnsafe( int inc = 1 );
    2828                Cost & incPoly( int inc = 1 );
     29                Cost & incSafe( int inc = 1 );
    2930                Cost & incVar( int inc = 1 );
    3031                Cost & decSpec( int inc = 1 );
    31                 Cost & incSafe( int inc = 1 );
    3232                Cost & incReference( int inc = 1 );
    3333
    3434                int get_unsafeCost() const { return unsafeCost; }
    3535                int get_polyCost() const { return polyCost; }
     36                int get_safeCost() const { return safeCost; }
    3637                int get_varCost() const { return varCost; }
    3738                int get_specCost() const { return specCost; }
    38                 int get_safeCost() const { return safeCost; }
    3939                int get_referenceCost() const { return referenceCost; }
    4040
     
    5454                static const Cost unsafe;
    5555                static const Cost poly;
     56                static const Cost safe;
    5657                static const Cost var;
    5758                static const Cost spec;
    58                 static const Cost safe;
    5959                static const Cost reference;
    6060
     
    6262                int unsafeCost;     ///< Unsafe (narrowing) conversions
    6363                int polyCost;       ///< Count of parameters and return values bound to some poly type
     64                int safeCost;       ///< Safe (widening) conversions
    6465                int varCost;        ///< Count of polymorphic type variables
    6566                int specCost;       ///< Polymorphic type specializations (type assertions), negative cost
    66                 int safeCost;       ///< Safe (widening) conversions
    6767                int referenceCost;  ///< reference conversions
    6868        };
    6969
    70         inline Cost::Cost( int unsafeCost, int polyCost, int varCost, int specCost, int safeCost,
     70        inline Cost::Cost( int unsafeCost, int polyCost, int safeCost, int varCost, int specCost,
    7171                        int referenceCost )
    72                 : unsafeCost( unsafeCost ), polyCost( polyCost ), varCost( varCost ), specCost( specCost ),
    73                   safeCost( safeCost ), referenceCost( referenceCost ) {}
     72                : unsafeCost( unsafeCost ), polyCost( polyCost ), safeCost( safeCost ), varCost( varCost ),
     73                  specCost( specCost ), referenceCost( referenceCost ) {}
    7474
    7575        inline Cost & Cost::incUnsafe( int inc ) {
     
    8585        }
    8686
     87        inline Cost & Cost::incSafe( int inc ) {
     88                if ( *this == infinity ) return *this;
     89                safeCost += inc;
     90                return *this;
     91        }
     92
    8793        inline Cost & Cost::incVar( int inc ) {
    8894                if ( *this == infinity ) return *this;
     
    94100                if ( *this == infinity ) return *this;
    95101                specCost -= dec;
    96                 return *this;
    97         }
    98 
    99         inline Cost & Cost::incSafe( int inc ) {
    100                 if ( *this == infinity ) return *this;
    101                 safeCost += inc;
    102102                return *this;
    103103        }
     
    112112                if ( *this == infinity || other == infinity ) return infinity;
    113113                return Cost{
    114                         unsafeCost + other.unsafeCost, polyCost + other.polyCost,
     114                        unsafeCost + other.unsafeCost, polyCost + other.polyCost, safeCost + other.safeCost,
    115115                        varCost + other.varCost, specCost + other.specCost,
    116                         safeCost + other.safeCost, referenceCost + other.referenceCost };
     116                        referenceCost + other.referenceCost };
    117117        }
    118118
     
    120120                if ( *this == infinity || other == infinity ) return infinity;
    121121                return Cost{
    122                         unsafeCost - other.unsafeCost, polyCost - other.polyCost,
     122                        unsafeCost - other.unsafeCost, polyCost - other.polyCost, safeCost - other.safeCost,
    123123                        varCost - other.varCost, specCost - other.specCost,
    124                         safeCost - other.safeCost, referenceCost - other.referenceCost };
     124                        referenceCost - other.referenceCost };
    125125        }
    126126
     
    133133                unsafeCost += other.unsafeCost;
    134134                polyCost += other.polyCost;
     135                safeCost += other.safeCost;
    135136                varCost += other.varCost;
    136137                specCost += other.specCost;
    137                 safeCost += other.safeCost;
    138138                referenceCost += other.referenceCost;
    139139                return *this;
     
    152152                } else if ( polyCost < other.polyCost ) {
    153153                        return true;
     154                } else if ( safeCost > other.safeCost ) {
     155                        return false;
     156                } else if ( safeCost < other.safeCost ) {
     157                        return true;
    154158                } else if ( varCost > other.varCost ) {
    155159                        return false;
     
    159163                        return false;
    160164                } else if ( specCost > other.specCost ) {
    161                         return true;
    162                 } else if ( safeCost > other.safeCost ) {
    163                         return false;
    164                 } else if ( safeCost < other.safeCost ) {
    165165                        return true;
    166166                } else if ( referenceCost > other.referenceCost ) {
     
    179179                int c = unsafeCost - other.unsafeCost; if ( c ) return c;
    180180                c = polyCost - other.polyCost; if ( c ) return c;
     181                c = safeCost - other.safeCost; if ( c ) return c;
    181182                c = varCost - other.varCost; if ( c ) return c;
    182183                c = specCost - other.specCost; if ( c ) return c;
    183                 c = safeCost - other.safeCost; if ( c ) return c;
    184184                return referenceCost - other.referenceCost;
    185185        }
     
    188188                return unsafeCost == other.unsafeCost
    189189                        && polyCost == other.polyCost
     190                        && safeCost == other.safeCost
    190191                        && varCost == other.varCost
    191192                        && specCost == other.specCost
    192                         && safeCost == other.safeCost
    193193                        && referenceCost == other.referenceCost;
    194194        }
     
    200200        inline std::ostream &operator<<( std::ostream &os, const Cost &cost ) {
    201201                return os << "( " << cost.unsafeCost << ", " << cost.polyCost << ", "
    202                           << cost.varCost << ", " << cost.specCost << ", "
    203                           << cost.safeCost << ", " << cost.referenceCost << " )";
     202                          << cost.safeCost << ", " << cost.varCost << ", " << cost.specCost << ", "
     203                          << cost.referenceCost << " )";
    204204        }
    205205} // namespace ResolvExpr
  • tests/.expect/completeTypeError.txt

    re99e43f rd97c3a4  
    4545
    4646Alternatives with failing assertions are:
    47 Cost ( 0, 1, 1, -5, 0, 0 ): Application of
     47Cost ( 0, 1, 0, 1, -5, 0 ): Application of
    4848     Variable Expression: baz: forall
    4949       T: sized object type
     
    5353           reference to instance of type T (not function type)
    5454           instance of type T (not function type)
    55          ... returning 
     55         ... returning
    5656           _retval__operator_assign: instance of type T (not function type)
    57            ... with attributes: 
     57           ... with attributes:
    5858             Attribute with name: unused
    5959
     
    6262         ... with parameters
    6363           reference to instance of type T (not function type)
    64          ... returning nothing 
     64         ... returning nothing
    6565
    6666         ?{}: pointer to function
     
    6868           reference to instance of type T (not function type)
    6969           instance of type T (not function type)
    70          ... returning nothing 
     70         ... returning nothing
    7171
    7272         ^?{}: pointer to function
    7373         ... with parameters
    7474           reference to instance of type T (not function type)
    75          ... returning nothing 
     75         ... returning nothing
    7676
    7777
     
    7979     ... with parameters
    8080       pointer to instance of type T (not function type)
    81      ... returning nothing 
     81     ... returning nothing
    8282
    8383   ... to arguments
     
    8787   void
    8888 )
    89  Environment: ( _73_0_T ) -> instance of type T (not function type)  (no widening)
     89 Environment:( _73_0_T ) -> instance of type T (not function type)  (no widening)
    9090
    9191
  • tests/.expect/nested-types-ERR2.txt

    re99e43f rd97c3a4  
    22nested-types.cfa:74:1 error: Qualified type requires an aggregate on the left, but has: signed int
    33nested-types.cfa:75:1 error: Undefined type in qualified type: Qualified Type:
    4   instance of struct S with body 1 
     4  instance of struct S with body 1
    55  instance of type Z (not function type)
    66
Note: See TracChangeset for help on using the changeset viewer.