Changeset a61ad31


Ignore:
Timestamp:
Jul 12, 2017, 4:53:25 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, resolv-new, with_gc
Children:
49148d5
Parents:
084fecc
Message:

Resolve member expression with reference type aggregates

Location:
src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • src/InitTweak/InitTweak.cc

    r084fecc ra61ad31  
    380380                template<typename CallExpr>
    381381                Expression *& callArg( CallExpr * callExpr, unsigned int pos ) {
    382                         if ( pos >= callExpr->get_args().size() ) assertf( false, "asking for argument that doesn't exist. Return NULL/throw exception?" );
     382                        if ( pos >= callExpr->get_args().size() ) assertf( false, "getCallArg for argument that doesn't exist: (%u); %s.", pos, toString( callExpr ).c_str() );
    383383                        for ( Expression *& arg : callExpr->get_args() ) {
    384384                                if ( pos == 0 ) return arg;
  • src/ResolvExpr/AlternativeFinder.cc

    r084fecc ra61ad31  
    305305                                std::cerr << std::endl << " to ";
    306306                                formalType->print( std::cerr, 8 );
     307                                std::cerr << std::endl << "environment is: ";
     308                                alt.env.print( std::cerr, 8 );
     309                                std::cerr << std::endl;
    307310                        )
    308311                        Cost newCost = conversionCost( actualType, formalType, indexer, alt.env );
     
    400403                        Expression * actual = actualIt->expr;
    401404                        Type * actualType = actual->get_result();
     405
    402406                        PRINT(
    403407                                std::cerr << "formal type is ";
     
    643647                        makeExprList( instantiatedActuals, appExpr->get_args() );
    644648                        PRINT(
     649                                std::cerr << "instantiate function success: " << appExpr << std::endl;
    645650                                std::cerr << "need assertions:" << std::endl;
    646651                                printAssertionSet( resultNeed, std::cerr, 8 );
     
    753758                                PointerType *pointer = safe_dynamic_cast< PointerType* >( appExpr->get_function()->get_result() );
    754759                                FunctionType *function = safe_dynamic_cast< FunctionType* >( pointer->get_base() );
    755                                 std::cerr << "Case +++++++++++++" << std::endl;
     760                                std::cerr << "Case +++++++++++++ " << appExpr->get_function() << std::endl;
    756761                                std::cerr << "formals are:" << std::endl;
    757762                                printAll( function->get_parameters(), std::cerr, 8 );
     
    796801        bool isLvalue( Expression *expr ) {
    797802                // xxx - recurse into tuples?
    798                 return expr->has_result() && expr->get_result()->get_lvalue();
     803                return expr->has_result() && ( expr->get_result()->get_lvalue() || dynamic_cast< ReferenceType * >( expr->get_result() ) );
    799804        }
    800805
     
    882887                funcFinder.findWithAdjustment( memberExpr->get_aggregate() );
    883888                for ( AltList::const_iterator agg = funcFinder.alternatives.begin(); agg != funcFinder.alternatives.end(); ++agg ) {
    884                         if ( StructInstType *structInst = dynamic_cast< StructInstType* >( agg->expr->get_result() ) ) {
    885                                 addAggMembers( structInst, agg->expr, agg->cost, agg->env, memberExpr->get_member() );
    886                         } else if ( UnionInstType *unionInst = dynamic_cast< UnionInstType* >( agg->expr->get_result() ) ) {
    887                                 addAggMembers( unionInst, agg->expr, agg->cost, agg->env, memberExpr->get_member() );
    888                         } else if ( TupleType * tupleType = dynamic_cast< TupleType * >( agg->expr->get_result() ) ) {
    889                                 addTupleMembers( tupleType, agg->expr, agg->cost, agg->env, memberExpr->get_member() );
     889                        // it's okay for the aggregate expression to have reference type -- cast it to the base type to treat the aggregate as the referenced value
     890                        std::unique_ptr<Expression> aggrExpr( agg->expr->clone() );
     891                        Type * aggrType = aggrExpr->get_result();
     892                        if ( dynamic_cast< ReferenceType * >( aggrType ) ) {
     893                                aggrType = aggrType->stripReferences();
     894                                aggrExpr.reset( new CastExpr( aggrExpr.release(), aggrType->clone() ) );
     895                        }
     896
     897                        // find member of the given type
     898                        if ( StructInstType *structInst = dynamic_cast< StructInstType* >( aggrExpr->get_result() ) ) {
     899                                addAggMembers( structInst, aggrExpr.get(), agg->cost, agg->env, memberExpr->get_member() );
     900                        } else if ( UnionInstType *unionInst = dynamic_cast< UnionInstType* >( aggrExpr->get_result() ) ) {
     901                                addAggMembers( unionInst, aggrExpr.get(), agg->cost, agg->env, memberExpr->get_member() );
     902                        } else if ( TupleType * tupleType = dynamic_cast< TupleType * >( aggrExpr->get_result() ) ) {
     903                                addTupleMembers( tupleType, aggrExpr.get(), agg->cost, agg->env, memberExpr->get_member() );
    890904                        } // if
    891905                } // for
Note: See TracChangeset for help on using the changeset viewer.