Changes in src/Tuples/TupleAssignment.cc [753bf60:82f3226]
- File:
-
- 1 edited
-
src/Tuples/TupleAssignment.cc (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Tuples/TupleAssignment.cc
r753bf60 r82f3226 154 154 lhsAlt.expr = new CastExpr( lhsAlt.expr, 155 155 new ReferenceType( Type::Qualifiers(), 156 lhsAlt.expr-> result->clone() ) );156 lhsAlt.expr->get_result()->clone() ) ); 157 157 } 158 158 … … 231 231 232 232 ResolvExpr::AlternativeFinder finder{ currentFinder.get_indexer(), 233 matcher->compositeEnv }; 234 233 currentFinder.get_environ() }; 235 234 try { 236 235 finder.findWithAdjustment(*i); … … 273 272 // args.push_back( new AddressExpr( new VariableExpr( left ) ) ); 274 273 if ( right ) args.push_back( new VariableExpr( right ) ); 275 if ( left->type->referenceDepth() > 1 && CodeGen::isConstructor( fname ) ) { 276 args.front() = new AddressExpr( args.front() ); 277 if ( right ) args.back() = new AddressExpr( args.back() ); 278 return new UntypedExpr( new NameExpr( "?=?" ), args ); 279 } else { 280 return new UntypedExpr( new NameExpr( fname ), args ); 281 } 282 } 283 284 // removes environments from subexpressions within statement exprs, which could throw off later passes like those in Box which rely on PolyMutator, and adds the bindings to the compositeEnv 274 return new UntypedExpr( new NameExpr( fname ), args ); 275 } 276 277 // removes environments from subexpressions within statement exprs, which could throw off later passes like those in Box which rely on PolyMutator. 285 278 // xxx - maybe this should happen in alternative finder for every StmtExpr? 279 // xxx - it's possible that these environments could contain some useful information. Maybe the right thing to do is aggregate the environments and pass the aggregate back to be added into the compositeEnv 286 280 struct EnvRemover { 287 281 void previsit( ExprStmt * stmt ) { 288 assert( compositeEnv ); 289 if ( stmt->expr->env ) { 290 compositeEnv->add( *stmt->expr->env ); 291 delete stmt->expr->env; 292 stmt->expr->env = nullptr; 293 } 294 } 295 296 ResolvExpr::TypeEnvironment * compositeEnv = nullptr; 282 delete stmt->expr->env; 283 stmt->expr->env = nullptr; 284 } 297 285 }; 298 286 299 287 ObjectDecl * TupleAssignSpotter::Matcher::newObject( UniqueName & namer, Expression * expr ) { 300 288 assert( expr->result && ! expr->get_result()->isVoid() ); 301 ObjectDecl * ret = new ObjectDecl( namer.newName(), Type::StorageClasses(), LinkageSpec::Cforall, nullptr, expr-> result->clone(), new SingleInit( expr->clone() ) );289 ObjectDecl * ret = new ObjectDecl( namer.newName(), Type::StorageClasses(), LinkageSpec::Cforall, nullptr, expr->get_result()->clone(), new SingleInit( expr->clone() ) ); 302 290 // if expression type is a reference, don't need to construct anything, a simple initializer is sufficient. 303 if ( ! dynamic_cast< ReferenceType * >( expr-> result) ) {291 if ( ! dynamic_cast< ReferenceType * >( expr->get_result() ) ) { 304 292 ConstructorInit * ctorInit = InitTweak::genCtorInit( ret ); 305 ret-> init = ctorInit;293 ret->set_init( ctorInit ); 306 294 ResolvExpr::resolveCtorInit( ctorInit, spotter.currentFinder.get_indexer() ); // resolve ctor/dtors for the new object 307 295 PassVisitor<EnvRemover> rm; // remove environments from subexpressions of StmtExprs 308 rm.pass.compositeEnv = &compositeEnv;309 296 ctorInit->accept( rm ); 310 297 } … … 319 306 assert( (! lhs.empty() && rhs.size() <= 1) || (lhs.empty() && rhs.empty()) ); 320 307 321 // xxx - may need to split this up into multiple declarations, because potential conversion to references322 // probably should not reference local variable - see MultipleAssignMatcher::match323 308 ObjectDecl * rtmp = rhs.size() == 1 ? newObject( rhsNamer, rhs.front().expr ) : nullptr; 324 309 for ( ResolvExpr::Alternative & lhsAlt : lhs ) { … … 339 324 std::list< ObjectDecl * > ltmp; 340 325 std::list< ObjectDecl * > rtmp; 341 for ( auto p : group_iterate( lhs, rhs ) ) { 342 ResolvExpr::Alternative & lhsAlt = std::get<0>(p); 343 ResolvExpr::Alternative & rhsAlt = std::get<1>(p); 344 // convert RHS to LHS type minus one reference -- important for the case where LHS is && and RHS is lvalue, etc. 345 ReferenceType * lhsType = strict_dynamic_cast<ReferenceType *>( lhsAlt.expr->result ); 346 rhsAlt.expr = new CastExpr( rhsAlt.expr, lhsType->base->clone() ); 347 ObjectDecl * lobj = newObject( lhsNamer, lhsAlt.expr ); 348 ObjectDecl * robj = newObject( rhsNamer, rhsAlt.expr ); 349 out.push_back( createFunc(spotter.fname, lobj, robj) ); 350 ltmp.push_back( lobj ); 351 rtmp.push_back( robj ); 352 353 // resolve the cast expression so that rhsAlt return type is bound by the cast type as needed, and transfer the resulting environment 354 ResolvExpr::AlternativeFinder finder{ spotter.currentFinder.get_indexer(), compositeEnv }; 355 finder.findWithAdjustment( rhsAlt.expr ); 356 assert( finder.get_alternatives().size() == 1 ); 357 compositeEnv = std::move( finder.get_alternatives().front().env ); 358 } 326 std::transform( lhs.begin(), lhs.end(), back_inserter( ltmp ), [&]( ResolvExpr::Alternative & alt ){ 327 return newObject( lhsNamer, alt.expr ); 328 }); 329 std::transform( rhs.begin(), rhs.end(), back_inserter( rtmp ), [&]( ResolvExpr::Alternative & alt ){ 330 return newObject( rhsNamer, alt.expr ); 331 }); 332 zipWith( ltmp.begin(), ltmp.end(), rtmp.begin(), rtmp.end(), back_inserter(out), [&](ObjectDecl * obj1, ObjectDecl * obj2 ) { return createFunc(spotter.fname, obj1, obj2); } ); 359 333 tmpDecls.splice( tmpDecls.end(), ltmp ); 360 334 tmpDecls.splice( tmpDecls.end(), rtmp );
Note:
See TracChangeset
for help on using the changeset viewer.