Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/GenPoly/Lvalue.cc

    r1a4bef3 re3e16bc  
    4747                        if ( SymTab::dereferenceOperator ) {
    4848                                VariableExpr * deref = new VariableExpr( SymTab::dereferenceOperator );
    49                                 deref->result = new PointerType( Type::Qualifiers(), deref->result );
    50                                 Type * base = InitTweak::getPointerBase( arg->result );
    51                                 assertf( base, "expected pointer type in dereference (type was %s)", toString( arg->result ).c_str() );
     49                                deref->set_result( new PointerType( Type::Qualifiers(), deref->get_result() ) );
     50                                Type * base = InitTweak::getPointerBase( arg->get_result() );
     51                                assertf( base, "expected pointer type in dereference (type was %s)", toString( arg->get_result() ).c_str() );
    5252                                ApplicationExpr * ret = new ApplicationExpr( deref, { arg } );
    53                                 delete ret->result;
    54                                 ret->result = base->clone();
    55                                 ret->result->set_lvalue( true );
     53                                delete ret->get_result();
     54                                ret->set_result( base->clone() );
     55                                ret->get_result()->set_lvalue( true );
    5656                                return ret;
    5757                        } else {
     
    308308                                        int diff = depth1-depth2;
    309309                                        if ( diff == 0 ) {
    310                                                 // conversion between references of the same depth
    311310                                                assertf( depth1 == depth2, "non-intrinsic reference with cast of reference to reference not yet supported: %d %d %s", depth1, depth2, toString( castExpr ).c_str() );
    312311                                                PRINT( std::cerr << castExpr << std::endl; )
    313312                                                return castExpr;
    314313                                        } else if ( diff < 0 ) {
    315                                                 // conversion from reference to reference with less depth (e.g. int && -> int &): add dereferences
    316                                                 Expression * ret = castExpr->arg;
     314                                                Expression * ret = castExpr->get_arg();
    317315                                                for ( int i = 0; i < diff; ++i ) {
    318316                                                        ret = mkDeref( ret );
    319317                                                }
    320                                                 ret->env = castExpr->env;
    321                                                 delete ret->result;
    322                                                 ret->result = castExpr->result;
    323                                                 ret->result->set_lvalue( true ); // ensure result is lvalue
    324                                                 castExpr->env = nullptr;
    325                                                 castExpr->arg = nullptr;
    326                                                 castExpr->result = nullptr;
     318                                                ret->set_env( castExpr->get_env() );
     319                                                delete ret->get_result();
     320                                                ret->set_result( castExpr->get_result() );
     321                                                castExpr->set_env( nullptr );
     322                                                castExpr->set_arg( nullptr );
     323                                                castExpr->set_result( nullptr );
    327324                                                delete castExpr;
    328325                                                return ret;
    329326                                        } else if ( diff > 0 ) {
    330                                                 // conversion from reference to reference with more depth (e.g. int & -> int &&): add address-of
    331                                                 Expression * ret = castExpr->arg;
     327                                                Expression * ret = castExpr->get_arg();
    332328                                                for ( int i = 0; i < diff; ++i ) {
    333329                                                        ret = new AddressExpr( ret );
    334330                                                }
    335                                                 ret->env = castExpr->env;
    336                                                 delete ret->result;
    337                                                 ret->result = castExpr->result;
    338                                                 castExpr->env = nullptr;
    339                                                 castExpr->arg = nullptr;
    340                                                 castExpr->result = nullptr;
     331                                                ret->set_env( castExpr->get_env() );
     332                                                delete ret->get_result();
     333                                                ret->set_result( castExpr->get_result() );
     334                                                castExpr->set_env( nullptr );
     335                                                castExpr->set_arg( nullptr );
     336                                                castExpr->set_result( nullptr );
    341337                                                delete castExpr;
    342338                                                return ret;
     
    346342                                        PRINT( std::cerr << castExpr << std::endl; )
    347343                                        return castExpr;
    348                                 } else if ( castExpr->arg->result->get_lvalue() ) {
     344                                } else if ( castExpr->get_arg()->get_result()->get_lvalue() ) {
    349345                                        // conversion from lvalue to reference
    350346                                        // xxx - keep cast, but turn into pointer cast??
     
    352348                                        PRINT(
    353349                                                std::cerr << "convert lvalue to reference -- &" << std::endl;
    354                                                 std::cerr << castExpr->arg << std::endl;
     350                                                std::cerr << castExpr->get_arg() << std::endl;
    355351                                        )
    356                                         AddressExpr * ret = new AddressExpr( castExpr->arg );
    357                                         if ( refType->base->get_qualifiers() != castExpr->arg->result->get_qualifiers() ) {
     352                                        AddressExpr * ret = new AddressExpr( castExpr->get_arg() );
     353                                        if ( refType->get_base()->get_qualifiers() != castExpr->get_arg()->get_result()->get_qualifiers() ) {
    358354                                                // must keep cast if cast-to type is different from the actual type
    359                                                 castExpr->arg = ret;
     355                                                castExpr->set_arg( ret );
    360356                                                return castExpr;
    361357                                        }
    362                                         ret->env = castExpr->env;
    363                                         delete ret->result;
    364                                         ret->result = castExpr->result;
    365                                         castExpr->env = nullptr;
    366                                         castExpr->arg = nullptr;
    367                                         castExpr->result = nullptr;
     358                                        ret->set_env( castExpr->get_env() );
     359                                        delete ret->get_result();
     360                                        ret->set_result( castExpr->get_result() );
     361                                        castExpr->set_env( nullptr );
     362                                        castExpr->set_arg( nullptr );
     363                                        castExpr->set_result( nullptr );
    368364                                        delete castExpr;
    369365                                        return ret;
     
    372368                                }
    373369                                assertf( false, "Only conversions to reference from lvalue are currently supported: %s", toString( castExpr ).c_str() );
    374                         } else if ( ReferenceType * refType = dynamic_cast< ReferenceType * >( castExpr->arg->result ) ) {
     370                        } else if ( ReferenceType * refType = dynamic_cast< ReferenceType * >( castExpr->get_arg()->get_result() ) ) {
    375371                                (void)refType;
    376372                                // conversion from reference to rvalue
     
    379375                                        std::cerr << "was = " << castExpr << std::endl;
    380376                                )
    381                                 Expression * ret = castExpr->arg;
    382                                 TypeSubstitution * env = castExpr->env;
     377                                Expression * ret = castExpr->get_arg();
     378                                TypeSubstitution * env = castExpr->get_env();
    383379                                castExpr->set_env( nullptr );
    384380                                if ( ! isIntrinsicReference( ret ) ) {
     
    386382                                        ret = mkDeref( ret );
    387383                                }
    388                                 if ( ResolvExpr::typesCompatibleIgnoreQualifiers( castExpr->result, castExpr->arg->result->stripReferences(), SymTab::Indexer() ) ) {
     384                                if ( ResolvExpr::typesCompatibleIgnoreQualifiers( castExpr->get_result(), castExpr->get_arg()->get_result()->stripReferences(), SymTab::Indexer() ) ) {
    389385                                        // can remove cast if types are compatible, changing expression type to value type
    390                                         ret->result = castExpr->result->clone();
    391                                         ret->result->set_lvalue( true );  // ensure result is lvalue
    392                                         castExpr->arg = nullptr;
     386                                        ret->set_result( castExpr->get_result()->clone() );
     387                                        castExpr->set_arg( nullptr );
    393388                                        delete castExpr;
    394389                                } else {
    395390                                        // must keep cast if types are different
    396                                         castExpr->arg = ret;
     391                                        castExpr->set_arg( ret );
    397392                                        ret = castExpr;
    398393                                }
Note: See TracChangeset for help on using the changeset viewer.