Ignore:
Timestamp:
Oct 13, 2016, 11:19:23 AM (8 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:
7756647
Parents:
65660bd
Message:

consider tuples managed if a tuple constructor is declared, combine environments in tuple assignment

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/ResolvExpr/AlternativeFinder.cc

    r65660bd rac9ca96  
    138138                }
    139139
    140                 template< typename InputIterator >
    141                 void simpleCombineEnvironments( InputIterator begin, InputIterator end, TypeEnvironment &result ) {
    142                         while ( begin != end ) {
    143                                 result.simpleCombine( (*begin++).env );
    144                         }
    145                 }
    146 
    147140                void renameTypes( Expression *expr ) {
    148141                        expr->get_result()->accept( global_renamer );
     
    216209        template< typename StructOrUnionType >
    217210        void AlternativeFinder::addAggMembers( StructOrUnionType *aggInst, Expression *expr, const Cost &newCost, const TypeEnvironment & env, Expression * member ) {
    218 
    219                 // // member must be either a tuple expression or a name expr
    220                 // if ( NameExpr * nameExpr = dynamic_cast< NameExpr * >( memberExpr->get_member() ) ) {
    221                 //  addAggMembers( structInst, agg->expr, agg->cost, nameExpr->get_name() );
    222                 // } else {
    223                 //  TupleExpr * tupleExpr = safe_dynamic_cast< TupleExpr * >( memberExpr->get_member() );
    224                 //  // xxx - ...
    225                 //  assert( false );
    226                 // }
    227                 // if ( TupleExpr * tupleExpr = dynamic_cast< TupleExpr * >( memberExpr->get_member() ) ) {
    228 
    229                 // }
    230                 NameExpr * nameExpr = safe_dynamic_cast< NameExpr * >( member );
    231                 const std::string & name = nameExpr->get_name();
    232                 std::list< Declaration* > members;
    233                 aggInst->lookup( name, members );
    234                 for ( std::list< Declaration* >::const_iterator i = members.begin(); i != members.end(); ++i ) {
    235                         if ( DeclarationWithType *dwt = dynamic_cast< DeclarationWithType* >( *i ) ) {
    236                                 alternatives.push_back( Alternative( new MemberExpr( dwt, expr->clone() ), env, newCost ) );
    237                                 renameTypes( alternatives.back().expr );
    238                         } else {
    239                                 assert( false );
    240                         }
     211                // member must be either a tuple expression or a name expr
     212                if ( NameExpr * nameExpr = dynamic_cast< NameExpr * >( member ) ) {
     213                        const std::string & name = nameExpr->get_name();
     214                        std::list< Declaration* > members;
     215                        aggInst->lookup( name, members );
     216                        for ( std::list< Declaration* >::const_iterator i = members.begin(); i != members.end(); ++i ) {
     217                                if ( DeclarationWithType *dwt = dynamic_cast< DeclarationWithType* >( *i ) ) {
     218                                        alternatives.push_back( Alternative( new MemberExpr( dwt, expr->clone() ), env, newCost ) );
     219                                        renameTypes( alternatives.back().expr );
     220                                } else {
     221                                        assert( false );
     222                                }
     223                        }
     224                } else if ( TupleExpr * tupleExpr = dynamic_cast< TupleExpr * >( member ) ) {
     225                        assert( false );
     226                } else {
     227                        // xxx - temporary
     228                        std::cerr << member << std::endl;
     229                        assertf( false, "reached unexpected case of addAggMembers" );
    241230                }
    242231        }
Note: See TracChangeset for help on using the changeset viewer.