Ignore:
Timestamp:
Jul 17, 2017, 3:25:58 PM (4 years ago)
Author:
Rob Schluntz <rschlunt@…>
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:
795d450
Parents:
7ebaa56
Message:

Fix TupleAssignment? code for references

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Tuples/TupleAssignment.cc

    r7ebaa56 re6cee92  
    7777                if ( ! expr ) return false;
    7878                assert( expr->has_result() );
    79                 return dynamic_cast< TupleType * >( expr->get_result() );
     79                return dynamic_cast< TupleType * >( expr->get_result()->stripReferences() );
    8080        }
    8181
     
    8989        }
    9090
    91         bool pointsToTuple( Expression *expr ) {
     91        bool refToTuple( Expression *expr ) {
     92                assert( expr->get_result() );
    9293                // also check for function returning tuple of reference types
    9394                if ( CastExpr * castExpr = dynamic_cast< CastExpr * >( expr ) ) {
    94                         return pointsToTuple( castExpr->get_arg() );
    95                 } else if ( AddressExpr *addr = dynamic_cast< AddressExpr * >( expr) ) {
    96                         return isTuple( addr->get_arg() );
     95                        return refToTuple( castExpr->get_arg() );
     96                } else {
     97                        return isTuple( expr );
    9798                }
    9899                return false;
     
    122123                                        const ResolvExpr::Alternative & alt1 = ali->front();
    123124                                        auto begin = std::next(ali->begin(), 1), end = ali->end();
    124                                         if ( pointsToTuple(alt1.expr) ) {
     125                                        if ( refToTuple(alt1.expr) ) {
    125126                                                if ( isMultAssign( begin, end ) ) {
    126127                                                        matcher.reset( new MultipleAssignMatcher( *this, *ali ) );
     
    196197                        for ( ResolvExpr::Alternative & alt : lhs ) {
    197198                                Expression *& expr = alt.expr;
    198                                 Type * castType = expr->get_result()->clone();
    199                                 Type * type = InitTweak::getPointerBase( castType );
    200                                 assert( type );
     199                                Type * type = expr->get_result()->clone();
    201200                                type->get_qualifiers() -= Type::Qualifiers( Type::Const | Type::Volatile | Type::Restrict | Type::Atomic );
    202                                 type->set_lvalue( true ); // xxx - might not need this
    203                                 expr = new CastExpr( expr, castType );
     201                                expr = new CastExpr( expr, new ReferenceType( Type::Qualifiers(), type ) );
    204202                        }
    205203                }
     
    221219                assert( left );
    222220                std::list< Expression * > args;
    223                 args.push_back( new AddressExpr( UntypedExpr::createDeref( new VariableExpr( left ) ) ) );
     221                args.push_back( new VariableExpr( left ) );
    224222                // args.push_back( new AddressExpr( new VariableExpr( left ) ) );
    225223                if ( right ) args.push_back( new VariableExpr( right ) );
     
    241239                assert( expr->has_result() && ! expr->get_result()->isVoid() );
    242240                ObjectDecl * ret = new ObjectDecl( namer.newName(), Type::StorageClasses(), LinkageSpec::Cforall, nullptr, expr->get_result()->clone(), new SingleInit( expr->clone() ) );
    243                 ConstructorInit * ctorInit = InitTweak::genCtorInit( ret );
    244                 ret->set_init( ctorInit );
    245                 ResolvExpr::resolveCtorInit( ctorInit, spotter.currentFinder.get_indexer() ); // resolve ctor/dtors for the new object
    246                 EnvRemover rm; // remove environments from subexpressions of StmtExprs
    247                 ctorInit->accept( rm );
     241                // if expression type is a reference, don't need to construct anything, a simple initializer is sufficient.
     242                if ( ! dynamic_cast< ReferenceType * >( expr->get_result() ) ) {
     243                        ConstructorInit * ctorInit = InitTweak::genCtorInit( ret );
     244                        ret->set_init( ctorInit );
     245                        ResolvExpr::resolveCtorInit( ctorInit, spotter.currentFinder.get_indexer() ); // resolve ctor/dtors for the new object
     246                        EnvRemover rm; // remove environments from subexpressions of StmtExprs
     247                        ctorInit->accept( rm );
     248                }
    248249                return ret;
    249250        }
Note: See TracChangeset for help on using the changeset viewer.