Changes in src/SynTree/AddressExpr.cc [906e24d:c5e3208]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/SynTree/AddressExpr.cc
r906e24d rc5e3208 18 18 #include "Common/utility.h" 19 19 20 // Address expressions are typed based on the following inference rules: 21 // E : lvalue T &..& (n references) 22 // &E : T *&..& (n references) 23 // 24 // E : T &..& (m references) 25 // &E : T *&..& (m-1 references) 26 // 27 // That is, lvalues becomes 28 29 namespace { 30 Type * addrType( Type * type ) { 31 if ( ReferenceType * refType = dynamic_cast< ReferenceType * >( type ) ) { 32 return new ReferenceType( refType->get_qualifiers(), addrType( refType->get_base() ) ); 33 } else { 34 return new PointerType( Type::Qualifiers(), type->clone() ); 35 } 36 } 37 } 38 20 39 AddressExpr::AddressExpr( Expression *arg, Expression *_aname ) : Expression( _aname ), arg( arg ) { 21 40 if ( arg->has_result() ) { 22 set_result( new PointerType( Type::Qualifiers(), arg->get_result()->clone() ) ); 41 if ( arg->get_result()->get_lvalue() ) { 42 // lvalue, retains all layers of reference and gains a pointer inside the references 43 set_result( addrType( arg->get_result() ) ); 44 } else { 45 // taking address of non-lvalue -- must be a reference, loses one layer of reference 46 ReferenceType * refType = safe_dynamic_cast< ReferenceType * >( arg->get_result() ); 47 set_result( addrType( refType->get_base() ) ); 48 } 49 // result of & is never an lvalue 50 get_result()->set_lvalue( false ); 23 51 } 24 52 }
Note: See TracChangeset
for help on using the changeset viewer.