Changeset c0bf94e


Ignore:
Timestamp:
Apr 17, 2018, 4:24:05 PM (7 years ago)
Author:
Rob Schluntz <rschlunt@…>
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, with_gc
Children:
27aca84
Parents:
a3323db1
Message:

Add isGenerated flag to CastExpr? to differentiate casts in source from compiler-generated casts

Location:
src
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • src/Parser/ExpressionNode.cc

    ra3323db1 rc0bf94e  
    211211        if ( Unsigned && size < 2 ) {                                           // hh or h, less than int ?
    212212                // int i = -1uh => 65535 not -1, so cast is necessary for unsigned, which unfortunately eliminates warnings for large values.
    213                 ret = new CastExpr( ret, new BasicType( Type::Qualifiers(), kind[Unsigned][size] ) );
     213                ret = new CastExpr( ret, new BasicType( Type::Qualifiers(), kind[Unsigned][size] ), false );
    214214        } else if ( lnth != -1 ) {                                                      // explicit length ?
    215215                if ( lnth == 5 ) {                                                              // int128 ?
    216216                        size = 5;
    217                         ret = new CastExpr( ret, new BasicType( Type::Qualifiers(), kind[Unsigned][size] ) );
     217                        ret = new CastExpr( ret, new BasicType( Type::Qualifiers(), kind[Unsigned][size] ), false );
    218218                } else {
    219                         ret = new CastExpr( ret, new TypeInstType( Type::Qualifiers(), lnthsInt[Unsigned][lnth], false ) );
     219                        ret = new CastExpr( ret, new TypeInstType( Type::Qualifiers(), lnthsInt[Unsigned][lnth], false ), false );
    220220                } // if
    221221        } // if
     
    285285        Expression * ret = new ConstantExpr( Constant( new BasicType( noQualifiers, kind[complx][size] ), str, v ) );
    286286        if ( lnth != -1 ) {                                                                     // explicit length ?
    287                 ret = new CastExpr( ret, new BasicType( Type::Qualifiers(), kind[complx][size] ) );
     287                ret = new CastExpr( ret, new BasicType( Type::Qualifiers(), kind[complx][size] ), false );
    288288        } // if
    289289
     
    408408        if ( dynamic_cast< VoidType * >( targetType ) ) {
    409409                delete targetType;
    410                 return new CastExpr( maybeMoveBuild< Expression >(expr_node) );
     410                return new CastExpr( maybeMoveBuild< Expression >(expr_node), false );
    411411        } else {
    412                 return new CastExpr( maybeMoveBuild< Expression >(expr_node), targetType );
     412                return new CastExpr( maybeMoveBuild< Expression >(expr_node), targetType, false );
    413413        } // if
    414414} // build_cast
  • src/ResolvExpr/AlternativeFinder.cc

    ra3323db1 rc0bf94e  
    12471247        }
    12481248
    1249         Expression * restructureCast( Expression * argExpr, Type * toType ) {
     1249        Expression * restructureCast( Expression * argExpr, Type * toType, bool isGenerated ) {
    12501250                if ( argExpr->get_result()->size() > 1 && ! toType->isVoid() && ! dynamic_cast<ReferenceType *>( toType ) ) {
    12511251                        // Argument expression is a tuple and the target type is not void and not a reference type.
     
    12621262                                // cast each component
    12631263                                TupleIndexExpr * idx = new TupleIndexExpr( argExpr->clone(), i );
    1264                                 componentExprs.push_back( restructureCast( idx, toType->getComponent( i ) ) );
     1264                                componentExprs.push_back( restructureCast( idx, toType->getComponent( i ), isGenerated ) );
    12651265                        }
    12661266                        delete argExpr;
     
    12701270                } else {
    12711271                        // handle normally
    1272                         return new CastExpr( argExpr, toType->clone() );
     1272                        CastExpr * ret = new CastExpr( argExpr, toType->clone() );
     1273                        ret->isGenerated = isGenerated;
     1274                        return ret;
    12731275                }
    12741276        }
     
    13141316                                // count one safe conversion for each value that is thrown away
    13151317                                thisCost.incSafe( discardedValues );
    1316                                 Alternative newAlt( restructureCast( alt.expr->clone(), toType ), alt.env,
     1318                                Alternative newAlt( restructureCast( alt.expr->clone(), toType, castExpr->isGenerated ), alt.env,
    13171319                                        alt.cost, thisCost );
    13181320                                inferParameters( needAssertions, haveAssertions, newAlt, openVars,
     
    17301732                                        // count one safe conversion for each value that is thrown away
    17311733                                        thisCost.incSafe( discardedValues );
    1732                                         Alternative newAlt( new InitExpr( restructureCast( alt.expr->clone(), toType ), initAlt.designation->clone() ), newEnv, alt.cost, thisCost );
     1734                                        Alternative newAlt( new InitExpr( restructureCast( alt.expr->clone(), toType, true ), initAlt.designation->clone() ), newEnv, alt.cost, thisCost );
    17331735                                        inferParameters( needAssertions, haveAssertions, newAlt, openVars, back_inserter( candidates ) );
    17341736                                }
  • src/SynTree/Expression.cc

    ra3323db1 rc0bf94e  
    271271}
    272272
    273 CastExpr::CastExpr( Expression *arg_, Type *toType ) : Expression(), arg(arg_) {
     273CastExpr::CastExpr( Expression *arg, Type *toType, bool isGenerated ) : Expression(), arg(arg), isGenerated( isGenerated ) {
    274274        set_result(toType);
    275275}
    276276
    277 CastExpr::CastExpr( Expression *arg_ ) : Expression(), arg(arg_) {
     277CastExpr::CastExpr( Expression *arg, bool isGenerated ) : Expression(), arg(arg), isGenerated( isGenerated ) {
    278278        set_result( new VoidType( Type::Qualifiers() ) );
    279279}
    280280
    281 CastExpr::CastExpr( const CastExpr &other ) : Expression( other ), arg( maybeClone( other.arg ) ) {
     281CastExpr::CastExpr( const CastExpr &other ) : Expression( other ), arg( maybeClone( other.arg ) ), isGenerated( other.isGenerated ) {
    282282}
    283283
  • src/SynTree/Expression.h

    ra3323db1 rc0bf94e  
    188188  public:
    189189        Expression * arg;
    190 
    191         CastExpr( Expression * arg );
    192         CastExpr( Expression * arg, Type * toType );
     190        bool isGenerated = true; // whether this cast appeared in the source program
     191
     192        CastExpr( Expression * arg, bool isGenerated = true );
     193        CastExpr( Expression * arg, Type * toType, bool isGenerated = true );
    193194        CastExpr( const CastExpr & other );
    194195        virtual ~CastExpr();
Note: See TracChangeset for help on using the changeset viewer.