Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/ResolvExpr/AlternativeFinder.cc

    r4b0f997 r64ac636  
    1010// Created On       : Sat May 16 23:52:08 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Mar 17 09:14:17 2017
    13 // Update Count     : 30
     12// Last Modified On : Mon Jul  4 17:02:51 2016
     13// Update Count     : 29
    1414//
    1515
     
    211211        }
    212212
    213         void AlternativeFinder::addAnonConversions( const Alternative & alt ) {
    214                 // adds anonymous member interpretations whenever an aggregate value type is seen.
    215                 Expression * expr = alt.expr->clone();
    216                 std::unique_ptr< Expression > manager( expr ); // RAII for expr
    217                 alt.env.apply( expr->get_result() );
    218                 if ( StructInstType *structInst = dynamic_cast< StructInstType* >( expr->get_result() ) ) {
    219                         NameExpr nameExpr( "" );
    220                         addAggMembers( structInst, expr, alt.cost+Cost( 0, 0, 1 ), alt.env, &nameExpr );
    221                 } else if ( UnionInstType *unionInst = dynamic_cast< UnionInstType* >( expr->get_result() ) ) {
    222                         NameExpr nameExpr( "" );
    223                         addAggMembers( unionInst, expr, alt.cost+Cost( 0, 0, 1 ), alt.env, &nameExpr );
    224                 } // if
    225         }
     213        // std::unordered_map< Expression *, UniqueExpr * > ;
    226214
    227215        template< typename StructOrUnionType >
     
    232220                std::list< Declaration* > members;
    233221                aggInst->lookup( name, members );
    234 
    235222                for ( std::list< Declaration* >::const_iterator i = members.begin(); i != members.end(); ++i ) {
    236223                        if ( DeclarationWithType *dwt = dynamic_cast< DeclarationWithType* >( *i ) ) {
    237224                                alternatives.push_back( Alternative( new MemberExpr( dwt, expr->clone() ), env, newCost ) );
    238225                                renameTypes( alternatives.back().expr );
    239                                 addAnonConversions( alternatives.back() ); // add anonymous member interpretations whenever an aggregate value type is seen as a member expression.
    240226                        } else {
    241227                                assert( false );
     
    744730                if ( candidates.empty() && ! errors.isEmpty() ) { throw errors; }
    745731
    746                 // compute conversionsion costs
    747732                for ( AltList::iterator withFunc = candidates.begin(); withFunc != candidates.end(); ++withFunc ) {
    748733                        Cost cvtCost = computeConversionCost( *withFunc, indexer );
     
    766751                        } // if
    767752                } // for
    768                 // function may return struct or union value, in which case we need to add alternatives for implicit conversions to each of the anonymous members
    769                 for ( const Alternative & alt : alternatives ) {
    770                         addAnonConversions( alt );
    771                 }
    772 
    773753                candidates.clear();
    774754                candidates.splice( candidates.end(), alternatives );
     
    792772        bool isLvalue( Expression *expr ) {
    793773                // xxx - recurse into tuples?
    794                 return expr->has_result() && expr->get_result()->get_lvalue();
     774                return expr->has_result() && expr->get_result()->get_isLvalue();
    795775        }
    796776
     
    905885                        )
    906886                        renameTypes( alternatives.back().expr );
    907                         addAnonConversions( alternatives.back() ); // add anonymous member interpretations whenever an aggregate value type is seen as a name expression.
     887                        if ( StructInstType *structInst = dynamic_cast< StructInstType* >( (*i)->get_type() ) ) {
     888                                NameExpr nameExpr( "" );
     889                                addAggMembers( structInst, &newExpr, Cost( 0, 0, 1 ), env, &nameExpr );
     890                        } else if ( UnionInstType *unionInst = dynamic_cast< UnionInstType* >( (*i)->get_type() ) ) {
     891                                NameExpr nameExpr( "" );
     892                                addAggMembers( unionInst, &newExpr, Cost( 0, 0, 1 ), env, &nameExpr );
     893                        } // if
    908894                } // for
    909895        }
Note: See TracChangeset for help on using the changeset viewer.