Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Tuples/TupleAssignment.cc

    r5fb6830 rf5854507  
    1414//
    1515
    16 #include "ResolvExpr/AlternativeFinder.h"
    17 #include "ResolvExpr/Alternative.h"
    18 #include "ResolvExpr/typeops.h"
    19 #include "SynTree/Expression.h"
    20 #include "SynTree/Initializer.h"
    21 #include "Tuples.h"
    22 #include "Explode.h"
    23 #include "Common/SemanticError.h"
     16#include <algorithm>                       // for transform
     17#include <cassert>                         // for assert
     18#include <iterator>                        // for back_insert_iterator, back...
     19#include <list>                            // for _List_const_iterator, _Lis...
     20#include <memory>                          // for unique_ptr, allocator_trai...
     21#include <string>                          // for string
     22
    2423#include "CodeGen/OperatorTable.h"
    25 #include "InitTweak/InitTweak.h"
    26 #include "InitTweak/GenInit.h"
    27 
    28 #include <functional>
    29 #include <algorithm>
    30 #include <iterator>
    31 #include <iostream>
    32 #include <cassert>
    33 #include <set>
    34 #include <unordered_set>
     24#include "Common/UniqueName.h"             // for UniqueName
     25#include "Common/utility.h"                // for zipWith
     26#include "Explode.h"                       // for explode
     27#include "InitTweak/GenInit.h"             // for genCtorInit
     28#include "InitTweak/InitTweak.h"           // for getPointerBase, isAssignment
     29#include "Parser/LinkageSpec.h"            // for Cforall
     30#include "ResolvExpr/Alternative.h"        // for AltList, Alternative
     31#include "ResolvExpr/AlternativeFinder.h"  // for AlternativeFinder, simpleC...
     32#include "ResolvExpr/Cost.h"               // for Cost
     33#include "ResolvExpr/Resolver.h"           // for resolveCtorInit
     34#include "ResolvExpr/TypeEnvironment.h"    // for TypeEnvironment
     35#include "SynTree/Declaration.h"           // for ObjectDecl
     36#include "SynTree/Expression.h"            // for Expression, CastExpr, Name...
     37#include "SynTree/Initializer.h"           // for ConstructorInit, SingleInit
     38#include "SynTree/Statement.h"             // for ExprStmt
     39#include "SynTree/Type.h"                  // for Type, Type::Qualifiers
     40#include "SynTree/TypeSubstitution.h"      // for TypeSubstitution
     41#include "SynTree/Visitor.h"               // for Visitor
     42
     43#if 0
     44#define PRINT(x) x
     45#else
     46#define PRINT(x)
     47#endif
    3548
    3649namespace Tuples {
     
    7790        bool isTuple( Expression *expr ) {
    7891                if ( ! expr ) return false;
    79                 assert( expr->has_result() );
     92                assert( expr->result );
    8093                return dynamic_cast< TupleType * >( expr->get_result()->stripReferences() );
    8194        }
     
    112125                if (  NameExpr *op = dynamic_cast< NameExpr * >(expr->get_function()) ) {
    113126                        if ( CodeGen::isCtorDtorAssign( op->get_name() ) ) {
    114                                 fname = op->get_name();
     127                               fname = op->get_name();
     128                                PRINT( std::cerr << "TupleAssignment: " << fname << std::endl; )
    115129                                for ( std::list<ResolvExpr::AltList>::const_iterator ali = possibilities.begin(); ali != possibilities.end(); ++ali ) {
    116130                                        if ( ali->size() == 0 ) continue; // AlternativeFinder will natrually handle this case, if it's legal
     
    124138                                        const ResolvExpr::Alternative & alt1 = ali->front();
    125139                                        auto begin = std::next(ali->begin(), 1), end = ali->end();
     140                                        PRINT( std::cerr << "alt1 is " << alt1.expr << std::endl; )
    126141                                        if ( refToTuple(alt1.expr) ) {
     142                                                PRINT( std::cerr << "and is reference to tuple" << std::endl; )
    127143                                                if ( isMultAssign( begin, end ) ) {
     144                                                        PRINT( std::cerr << "possible multiple assignment" << std::endl; )
    128145                                                        matcher.reset( new MultipleAssignMatcher( *this, *ali ) );
    129146                                                } else {
    130147                                                        // mass assignment
     148                                                        PRINT( std::cerr << "possible mass assignment" << std::endl; )
    131149                                                        matcher.reset( new MassAssignMatcher( *this,  *ali ) );
    132150                                                }
     
    152170                // now resolve new assignments
    153171                for ( std::list< Expression * >::iterator i = new_assigns.begin(); i != new_assigns.end(); ++i ) {
     172                        PRINT(
     173                                std::cerr << "== resolving tuple assign ==" << std::endl;
     174                                std::cerr << *i << std::endl;
     175                        )
     176
    154177                        ResolvExpr::AlternativeFinder finder( currentFinder.get_indexer(), currentFinder.get_environ() );
    155178                        try {
     
    231254
    232255        ObjectDecl * TupleAssignSpotter::Matcher::newObject( UniqueName & namer, Expression * expr ) {
    233                 assert( expr->has_result() && ! expr->get_result()->isVoid() );
     256                assert( expr->result && ! expr->get_result()->isVoid() );
    234257                ObjectDecl * ret = new ObjectDecl( namer.newName(), Type::StorageClasses(), LinkageSpec::Cforall, nullptr, expr->get_result()->clone(), new SingleInit( expr->clone() ) );
    235258                // if expression type is a reference, don't need to construct anything, a simple initializer is sufficient.
     
    241264                        ctorInit->accept( rm );
    242265                }
     266                PRINT( std::cerr << "new object: " << ret << std::endl; )
    243267                return ret;
    244268        }
Note: See TracChangeset for help on using the changeset viewer.