Changes in src/GenPoly/Lvalue.cc [1a4bef3:e3e16bc]
- File:
-
- 1 edited
-
src/GenPoly/Lvalue.cc (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/GenPoly/Lvalue.cc
r1a4bef3 re3e16bc 47 47 if ( SymTab::dereferenceOperator ) { 48 48 VariableExpr * deref = new VariableExpr( SymTab::dereferenceOperator ); 49 deref-> result = new PointerType( Type::Qualifiers(), deref->result);50 Type * base = InitTweak::getPointerBase( arg-> result);51 assertf( base, "expected pointer type in dereference (type was %s)", toString( arg-> result).c_str() );49 deref->set_result( new PointerType( Type::Qualifiers(), deref->get_result() ) ); 50 Type * base = InitTweak::getPointerBase( arg->get_result() ); 51 assertf( base, "expected pointer type in dereference (type was %s)", toString( arg->get_result() ).c_str() ); 52 52 ApplicationExpr * ret = new ApplicationExpr( deref, { arg } ); 53 delete ret-> result;54 ret-> result = base->clone();55 ret-> result->set_lvalue( true );53 delete ret->get_result(); 54 ret->set_result( base->clone() ); 55 ret->get_result()->set_lvalue( true ); 56 56 return ret; 57 57 } else { … … 308 308 int diff = depth1-depth2; 309 309 if ( diff == 0 ) { 310 // conversion between references of the same depth311 310 assertf( depth1 == depth2, "non-intrinsic reference with cast of reference to reference not yet supported: %d %d %s", depth1, depth2, toString( castExpr ).c_str() ); 312 311 PRINT( std::cerr << castExpr << std::endl; ) 313 312 return castExpr; 314 313 } else if ( diff < 0 ) { 315 // conversion from reference to reference with less depth (e.g. int && -> int &): add dereferences 316 Expression * ret = castExpr->arg; 314 Expression * ret = castExpr->get_arg(); 317 315 for ( int i = 0; i < diff; ++i ) { 318 316 ret = mkDeref( ret ); 319 317 } 320 ret->env = castExpr->env; 321 delete ret->result; 322 ret->result = castExpr->result; 323 ret->result->set_lvalue( true ); // ensure result is lvalue 324 castExpr->env = nullptr; 325 castExpr->arg = nullptr; 326 castExpr->result = nullptr; 318 ret->set_env( castExpr->get_env() ); 319 delete ret->get_result(); 320 ret->set_result( castExpr->get_result() ); 321 castExpr->set_env( nullptr ); 322 castExpr->set_arg( nullptr ); 323 castExpr->set_result( nullptr ); 327 324 delete castExpr; 328 325 return ret; 329 326 } else if ( diff > 0 ) { 330 // conversion from reference to reference with more depth (e.g. int & -> int &&): add address-of 331 Expression * ret = castExpr->arg; 327 Expression * ret = castExpr->get_arg(); 332 328 for ( int i = 0; i < diff; ++i ) { 333 329 ret = new AddressExpr( ret ); 334 330 } 335 ret-> env = castExpr->env;336 delete ret-> result;337 ret-> result = castExpr->result;338 castExpr-> env = nullptr;339 castExpr-> arg = nullptr;340 castExpr-> result = nullptr;331 ret->set_env( castExpr->get_env() ); 332 delete ret->get_result(); 333 ret->set_result( castExpr->get_result() ); 334 castExpr->set_env( nullptr ); 335 castExpr->set_arg( nullptr ); 336 castExpr->set_result( nullptr ); 341 337 delete castExpr; 342 338 return ret; … … 346 342 PRINT( std::cerr << castExpr << std::endl; ) 347 343 return castExpr; 348 } else if ( castExpr-> arg->result->get_lvalue() ) {344 } else if ( castExpr->get_arg()->get_result()->get_lvalue() ) { 349 345 // conversion from lvalue to reference 350 346 // xxx - keep cast, but turn into pointer cast?? … … 352 348 PRINT( 353 349 std::cerr << "convert lvalue to reference -- &" << std::endl; 354 std::cerr << castExpr-> arg<< std::endl;350 std::cerr << castExpr->get_arg() << std::endl; 355 351 ) 356 AddressExpr * ret = new AddressExpr( castExpr-> arg);357 if ( refType-> base->get_qualifiers() != castExpr->arg->result->get_qualifiers() ) {352 AddressExpr * ret = new AddressExpr( castExpr->get_arg() ); 353 if ( refType->get_base()->get_qualifiers() != castExpr->get_arg()->get_result()->get_qualifiers() ) { 358 354 // must keep cast if cast-to type is different from the actual type 359 castExpr-> arg = ret;355 castExpr->set_arg( ret ); 360 356 return castExpr; 361 357 } 362 ret-> env = castExpr->env;363 delete ret-> result;364 ret-> result = castExpr->result;365 castExpr-> env = nullptr;366 castExpr-> arg = nullptr;367 castExpr-> result = nullptr;358 ret->set_env( castExpr->get_env() ); 359 delete ret->get_result(); 360 ret->set_result( castExpr->get_result() ); 361 castExpr->set_env( nullptr ); 362 castExpr->set_arg( nullptr ); 363 castExpr->set_result( nullptr ); 368 364 delete castExpr; 369 365 return ret; … … 372 368 } 373 369 assertf( false, "Only conversions to reference from lvalue are currently supported: %s", toString( castExpr ).c_str() ); 374 } else if ( ReferenceType * refType = dynamic_cast< ReferenceType * >( castExpr-> arg->result) ) {370 } else if ( ReferenceType * refType = dynamic_cast< ReferenceType * >( castExpr->get_arg()->get_result() ) ) { 375 371 (void)refType; 376 372 // conversion from reference to rvalue … … 379 375 std::cerr << "was = " << castExpr << std::endl; 380 376 ) 381 Expression * ret = castExpr-> arg;382 TypeSubstitution * env = castExpr-> env;377 Expression * ret = castExpr->get_arg(); 378 TypeSubstitution * env = castExpr->get_env(); 383 379 castExpr->set_env( nullptr ); 384 380 if ( ! isIntrinsicReference( ret ) ) { … … 386 382 ret = mkDeref( ret ); 387 383 } 388 if ( ResolvExpr::typesCompatibleIgnoreQualifiers( castExpr-> result, castExpr->arg->result->stripReferences(), SymTab::Indexer() ) ) {384 if ( ResolvExpr::typesCompatibleIgnoreQualifiers( castExpr->get_result(), castExpr->get_arg()->get_result()->stripReferences(), SymTab::Indexer() ) ) { 389 385 // can remove cast if types are compatible, changing expression type to value type 390 ret->result = castExpr->result->clone(); 391 ret->result->set_lvalue( true ); // ensure result is lvalue 392 castExpr->arg = nullptr; 386 ret->set_result( castExpr->get_result()->clone() ); 387 castExpr->set_arg( nullptr ); 393 388 delete castExpr; 394 389 } else { 395 390 // must keep cast if types are different 396 castExpr-> arg = ret;391 castExpr->set_arg( ret ); 397 392 ret = castExpr; 398 393 }
Note:
See TracChangeset
for help on using the changeset viewer.