Changes in src/Tuples/TupleAssignment.cc [5fb6830:f5854507]
- File:
-
- 1 edited
-
src/Tuples/TupleAssignment.cc (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Tuples/TupleAssignment.cc
r5fb6830 rf5854507 14 14 // 15 15 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 24 23 #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 35 48 36 49 namespace Tuples { … … 77 90 bool isTuple( Expression *expr ) { 78 91 if ( ! expr ) return false; 79 assert( expr-> has_result());92 assert( expr->result ); 80 93 return dynamic_cast< TupleType * >( expr->get_result()->stripReferences() ); 81 94 } … … 112 125 if ( NameExpr *op = dynamic_cast< NameExpr * >(expr->get_function()) ) { 113 126 if ( CodeGen::isCtorDtorAssign( op->get_name() ) ) { 114 fname = op->get_name(); 127 fname = op->get_name(); 128 PRINT( std::cerr << "TupleAssignment: " << fname << std::endl; ) 115 129 for ( std::list<ResolvExpr::AltList>::const_iterator ali = possibilities.begin(); ali != possibilities.end(); ++ali ) { 116 130 if ( ali->size() == 0 ) continue; // AlternativeFinder will natrually handle this case, if it's legal … … 124 138 const ResolvExpr::Alternative & alt1 = ali->front(); 125 139 auto begin = std::next(ali->begin(), 1), end = ali->end(); 140 PRINT( std::cerr << "alt1 is " << alt1.expr << std::endl; ) 126 141 if ( refToTuple(alt1.expr) ) { 142 PRINT( std::cerr << "and is reference to tuple" << std::endl; ) 127 143 if ( isMultAssign( begin, end ) ) { 144 PRINT( std::cerr << "possible multiple assignment" << std::endl; ) 128 145 matcher.reset( new MultipleAssignMatcher( *this, *ali ) ); 129 146 } else { 130 147 // mass assignment 148 PRINT( std::cerr << "possible mass assignment" << std::endl; ) 131 149 matcher.reset( new MassAssignMatcher( *this, *ali ) ); 132 150 } … … 152 170 // now resolve new assignments 153 171 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 154 177 ResolvExpr::AlternativeFinder finder( currentFinder.get_indexer(), currentFinder.get_environ() ); 155 178 try { … … 231 254 232 255 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() ); 234 257 ObjectDecl * ret = new ObjectDecl( namer.newName(), Type::StorageClasses(), LinkageSpec::Cforall, nullptr, expr->get_result()->clone(), new SingleInit( expr->clone() ) ); 235 258 // if expression type is a reference, don't need to construct anything, a simple initializer is sufficient. … … 241 264 ctorInit->accept( rm ); 242 265 } 266 PRINT( std::cerr << "new object: " << ret << std::endl; ) 243 267 return ret; 244 268 }
Note:
See TracChangeset
for help on using the changeset viewer.