Changes in src/SynTree/Expression.cc [b4f8808:5d00425]
- File:
-
- 1 edited
-
src/SynTree/Expression.cc (modified) (16 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/SynTree/Expression.cc
rb4f8808 r5d00425 19 19 #include <iostream> // for ostream, operator<<, basic_ostream 20 20 #include <list> // for list, _List_iterator, list<>::co... 21 #include <set> // for set22 21 23 22 #include "Common/utility.h" // for maybeClone, cloneAll, deleteAll … … 65 64 66 65 bool Expression::get_lvalue() const { 66 assert( !result->get_lvalue() ); 67 67 return false; 68 68 } … … 115 115 assert( var->get_type() ); 116 116 Type * type = var->get_type()->clone(); 117 type->set_lvalue( true ); 117 118 118 119 // xxx - doesn't quite work yet - get different alternatives with the same cost … … 124 125 // long long int value; 125 126 // if ( decl->valueOf( var, value ) ) { 126 // type->set_lvalue( false ); // Would have to move to get_lvalue.127 // type->set_lvalue( false ); 127 128 // } 128 129 // } … … 139 140 140 141 bool VariableExpr::get_lvalue() const { 141 // It isn't always an lvalue, but it is never an rvalue. 142 return true; 142 return result->get_lvalue(); 143 143 } 144 144 … … 277 277 278 278 bool CastExpr::get_lvalue() const { 279 // This is actually wrong by C, but it works with our current set-up. 280 return arg->get_lvalue(); 279 return result->get_lvalue(); 281 280 } 282 281 … … 361 360 } 362 361 363 bool UntypedMemberExpr::get_lvalue() const {364 return aggregate->get_lvalue();365 }366 367 362 void UntypedMemberExpr::print( std::ostream & os, Indenter indent ) const { 368 363 os << "Untyped Member Expression, with field: " << std::endl << indent+1; … … 383 378 sub.apply( res ); 384 379 result = res; 380 result->set_lvalue( true ); 385 381 result->get_qualifiers() |= aggregate->result->get_qualifiers(); 386 382 } … … 396 392 397 393 bool MemberExpr::get_lvalue() const { 398 // This is actually wrong by C, but it works with our current set-up.394 assert( result->get_lvalue() ); 399 395 return true; 400 396 } … … 431 427 // if references are still allowed in the AST, dereference returns a reference 432 428 ret->set_result( new ReferenceType( Type::Qualifiers(), ret->get_result() ) ); 429 } else { 430 // references have been removed, in which case dereference returns an lvalue of the base type. 431 ret->result->set_lvalue( true ); 433 432 } 434 433 } … … 448 447 449 448 bool UntypedExpr::get_lvalue() const { 450 // from src/GenPoly/Lvalue.cc: isIntrinsicReference 451 static std::set<std::string> lvalueFunctions = { "*?", "?[?]" }; 452 std::string fname = InitTweak::getFunctionName( const_cast< UntypedExpr * >( this ) ); 453 return lvalueFunctions.count(fname); 449 return result->get_lvalue(); 454 450 } 455 451 … … 514 510 515 511 bool ConditionalExpr::get_lvalue() const { 516 return false;512 return result->get_lvalue(); 517 513 } 518 514 … … 574 570 575 571 bool ConstructorExpr::get_lvalue() const { 576 return false;572 return result->get_lvalue(); 577 573 } 578 574 … … 586 582 CompoundLiteralExpr::CompoundLiteralExpr( Type * type, Initializer * initializer ) : initializer( initializer ) { 587 583 assert( type && initializer ); 584 type->set_lvalue( true ); 588 585 set_result( type ); 589 586 } … … 596 593 597 594 bool CompoundLiteralExpr::get_lvalue() const { 595 assert( result->get_lvalue() ); 598 596 return true; 599 597 } … … 650 648 } 651 649 bool StmtExpr::get_lvalue() const { 652 return false;650 return result->get_lvalue(); 653 651 } 654 652 void StmtExpr::print( std::ostream & os, Indenter indent ) const {
Note:
See TracChangeset
for help on using the changeset viewer.