Changes in src/GenPoly/Lvalue.cc [a9b1b0c:a4d188f]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/GenPoly/Lvalue.cc
ra9b1b0c ra4d188f 45 45 Expression * mkDeref( Expression * arg ) { 46 46 if ( SymTab::dereferenceOperator ) { 47 // note: reference depth can be arbitrarily deep here, so peel off the outermost pointer/reference, not just pointer because they are effecitvely equivalent in this pass48 47 VariableExpr * deref = new VariableExpr( SymTab::dereferenceOperator ); 49 48 deref->result = new PointerType( Type::Qualifiers(), deref->result ); … … 198 197 PRINT( 199 198 std::cerr << "pair<0>: " << arg << std::endl; 200 std::cerr << " -- " << arg->result << std::endl;201 199 std::cerr << "pair<1>: " << formal << std::endl; 202 200 ) 203 201 if ( dynamic_cast<ReferenceType*>( formal ) ) { 204 PRINT( 205 std::cerr << "===formal is reference" << std::endl; 206 ) 207 // TODO: it's likely that the second condition should be ... && ! isIntrinsicReference( arg ), but this requires investigation. 208 if ( function->get_linkage() != LinkageSpec::Intrinsic && isIntrinsicReference( arg ) ) { 209 // if argument is dereference or array subscript, the result isn't REALLY a reference, but non-intrinsic functions expect a reference: take address 210 PRINT( 211 std::cerr << "===is intrinsic arg in non-intrinsic call - adding address" << std::endl; 212 ) 213 arg = new AddressExpr( arg ); 214 } else if ( function->get_linkage() == LinkageSpec::Intrinsic && arg->result->referenceDepth() != 0 ) { 215 // argument is a 'real' reference, but function expects a C lvalue: add a dereference to the reference-typed argument 216 PRINT( 217 std::cerr << "===is non-intrinsic arg in intrinsic call - adding deref to arg" << std::endl; 218 ) 202 if ( isIntrinsicReference( arg ) ) { // do not combine conditions, because that changes the meaning of the else if 203 if ( function->get_linkage() != LinkageSpec::Intrinsic ) { // intrinsic functions that turn pointers into references 204 // if argument is dereference or array subscript, the result isn't REALLY a reference, so it's not necessary to fix the argument 205 PRINT( 206 std::cerr << "===is intrinsic arg in non-intrinsic call - adding address" << std::endl; 207 ) 208 arg = new AddressExpr( arg ); 209 } 210 } else if ( function->get_linkage() == LinkageSpec::Intrinsic ) { 211 // std::cerr << "===adding deref to arg" << std::endl; 212 // if the parameter is a reference, add a dereference to the reference-typed argument. 219 213 Type * baseType = InitTweak::getPointerBase( arg->result ); 220 214 assertf( baseType, "parameter is reference, arg must be pointer or reference: %s", toString( arg->result ).c_str() ); … … 223 217 arg->set_result( ptrType ); 224 218 arg = mkDeref( arg ); 225 assertf( arg->result->referenceDepth() == 0, "Reference types should have been eliminated from intrinsic function calls, but weren't: %s", toCString( arg->result ) );226 219 } 227 220 }
Note: See TracChangeset
for help on using the changeset viewer.