Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Tuples/Explode.h

    r0b5d871 r03321e4  
    1616#pragma once
    1717
    18 #include "ResolvExpr/AlternativeFinder.h"
    19 #include "ResolvExpr/Resolver.h"
     18#include <iterator>                  // for back_inserter, back_insert_iterator
    2019
    21 #include "SynTree/Expression.h"
    22 #include "SynTree/Declaration.h"
    23 #include "SynTree/Type.h"
     20#include "ResolvExpr/Alternative.h"  // for Alternative, AltList
     21#include "SynTree/Expression.h"      // for Expression, UniqueExpr, AddressExpr
     22#include "SynTree/Type.h"            // for TupleType, Type
     23#include "Tuples.h"                  // for maybeImpure
    2424
    25 #include "Tuples.h"
     25namespace SymTab {
     26class Indexer;
     27}  // namespace SymTab
    2628
    2729namespace Tuples {
    28         Expression * distributeReference( Expression * );
     30        /// helper function used by explode to properly distribute
     31        /// '&' across a tuple expression
     32        Expression * distributeAddr( Expression * expr );
    2933
    3034        /// helper function used by explode
     
    3236        void explodeUnique( Expression * expr, const ResolvExpr::Alternative & alt, const SymTab::Indexer & indexer, OutputIterator out, bool isTupleAssign ) {
    3337                if ( isTupleAssign ) {
    34                         // tuple assignment needs CastExprs to be recursively exploded to easily get at all of the components
    35                         if ( CastExpr * castExpr = dynamic_cast< CastExpr * >( expr ) ) {
     38                        // tuple assignment needs AddressExprs to be recursively exploded to easily get at all of the components
     39                        if ( AddressExpr * addrExpr = dynamic_cast< AddressExpr * >( expr ) ) {
    3640                                ResolvExpr::AltList alts;
    37                                 explodeUnique( castExpr->get_arg(), alt, indexer, back_inserter( alts ), isTupleAssign );
     41                                explodeUnique( addrExpr->get_arg(), alt, indexer, back_inserter( alts ), isTupleAssign );
    3842                                for ( ResolvExpr::Alternative & alt : alts ) {
    39                                         // distribute reference cast over all components
    40                                         alt.expr = distributeReference( alt.expr );
     43                                        // distribute '&' over all components
     44                                        alt.expr = distributeAddr( alt.expr );
    4145                                        *out++ = alt;
    4246                                }
     
    4549                        }
    4650                }
    47                 Type * res = expr->get_result()->stripReferences();
     51                Type * res = expr->get_result();
    4852                if ( TupleType * tupleType = dynamic_cast< TupleType * > ( res ) ) {
    4953                        if ( TupleExpr * tupleExpr = dynamic_cast< TupleExpr * >( expr ) ) {
     
    5357                                }
    5458                        } else {
    55                                 // tuple type, but not tuple expr - recursively index into its components.
    56                                 // if expr type is reference, convert to value type
     59                                // tuple type, but not tuple expr - recursively index into its components
    5760                                Expression * arg = expr->clone();
    58                                 if ( Tuples::maybeImpureIgnoreUnique( arg ) ) {
     61                                if ( Tuples::maybeImpure( arg ) && ! dynamic_cast< UniqueExpr * >( arg ) ) {
    5962                                        // expressions which may contain side effects require a single unique instance of the expression.
    6063                                        arg = new UniqueExpr( arg );
    61                                 }
    62                                 // cast reference to value type to facilitate further explosion
    63                                 if ( dynamic_cast<ReferenceType *>( arg->get_result() ) ) {
    64                                         arg = new CastExpr( arg, tupleType->clone() );
    6564                                }
    6665                                for ( unsigned int i = 0; i < tupleType->size(); i++ ) {
Note: See TracChangeset for help on using the changeset viewer.