Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/SynTree/Expression.cc

    rb4f8808 r5d00425  
    1919#include <iostream>                  // for ostream, operator<<, basic_ostream
    2020#include <list>                      // for list, _List_iterator, list<>::co...
    21 #include <set>                       // for set
    2221
    2322#include "Common/utility.h"          // for maybeClone, cloneAll, deleteAll
     
    6564
    6665bool Expression::get_lvalue() const {
     66        assert( !result->get_lvalue() );
    6767        return false;
    6868}
     
    115115        assert( var->get_type() );
    116116        Type * type = var->get_type()->clone();
     117        type->set_lvalue( true );
    117118
    118119        // xxx - doesn't quite work yet - get different alternatives with the same cost
     
    124125        //      long long int value;
    125126        //      if ( decl->valueOf( var, value ) ) {
    126         //              type->set_lvalue( false ); // Would have to move to get_lvalue.
     127        //              type->set_lvalue( false );
    127128        //      }
    128129        // }
     
    139140
    140141bool 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();
    143143}
    144144
     
    277277
    278278bool 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();
    281280}
    282281
     
    361360}
    362361
    363 bool UntypedMemberExpr::get_lvalue() const {
    364         return aggregate->get_lvalue();
    365 }
    366 
    367362void UntypedMemberExpr::print( std::ostream & os, Indenter indent ) const {
    368363        os << "Untyped Member Expression, with field: " << std::endl << indent+1;
     
    383378        sub.apply( res );
    384379        result = res;
     380        result->set_lvalue( true );
    385381        result->get_qualifiers() |= aggregate->result->get_qualifiers();
    386382}
     
    396392
    397393bool MemberExpr::get_lvalue() const {
    398         // This is actually wrong by C, but it works with our current set-up.
     394        assert( result->get_lvalue() );
    399395        return true;
    400396}
     
    431427                        // if references are still allowed in the AST, dereference returns a reference
    432428                        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 );
    433432                }
    434433        }
     
    448447
    449448bool 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();
    454450}
    455451
     
    514510
    515511bool ConditionalExpr::get_lvalue() const {
    516         return false;
     512        return result->get_lvalue();
    517513}
    518514
     
    574570
    575571bool ConstructorExpr::get_lvalue() const {
    576         return false;
     572        return result->get_lvalue();
    577573}
    578574
     
    586582CompoundLiteralExpr::CompoundLiteralExpr( Type * type, Initializer * initializer ) : initializer( initializer ) {
    587583        assert( type && initializer );
     584        type->set_lvalue( true );
    588585        set_result( type );
    589586}
     
    596593
    597594bool CompoundLiteralExpr::get_lvalue() const {
     595        assert( result->get_lvalue() );
    598596        return true;
    599597}
     
    650648}
    651649bool StmtExpr::get_lvalue() const {
    652         return false;
     650        return result->get_lvalue();
    653651}
    654652void StmtExpr::print( std::ostream & os, Indenter indent ) const {
Note: See TracChangeset for help on using the changeset viewer.