- File:
-
- 1 edited
-
src/ResolvExpr/ConversionCost.cc (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/ConversionCost.cc
recd4923 rb0837e4 92 92 93 93 Cost convertToReferenceCost( Type * src, Type * dest, int diff, const SymTab::Indexer & indexer, const TypeEnvironment & env, PtrsFunction func ) { 94 PRINT( std::cerr << "convert to reference cost... diff " << diff << " " << src << " / " << dest <<std::endl; )94 PRINT( std::cerr << "convert to reference cost... diff " << diff << std::endl; ) 95 95 if ( diff > 0 ) { 96 96 // TODO: document this … … 108 108 if ( srcAsRef && destAsRef ) { // pointer-like conversions between references 109 109 PRINT( std::cerr << "converting between references" << std::endl; ) 110 Type::Qualifiers tq1 = srcAsRef->get_base()->get_qualifiers(); 111 Type::Qualifiers tq2 = destAsRef->get_base()->get_qualifiers(); 112 if ( tq1 <= tq2 && typesCompatibleIgnoreQualifiers( srcAsRef->get_base(), destAsRef->get_base(), indexer, env ) ) { 113 PRINT( std::cerr << " :: compatible and good qualifiers" << std::endl; ) 114 if ( tq1 == tq2 ) { 115 // types are the same 116 return Cost::zero; 117 } else { 118 // types are the same, except otherPointer has more qualifiers 119 return Cost::safe; 120 } 110 if ( srcAsRef->get_base()->get_qualifiers() <= destAsRef->get_base()->get_qualifiers() && typesCompatibleIgnoreQualifiers( srcAsRef->get_base(), destAsRef->get_base(), indexer, env ) ) { 111 return Cost::safe; 121 112 } else { // xxx - this discards reference qualifiers from consideration -- reducing qualifiers is a safe conversion; is this right? 122 113 int assignResult = func( srcAsRef->get_base(), destAsRef->get_base(), env, indexer ); … … 257 248 }; 258 249 259 void ConversionCost::visit( VoidType *) {250 void ConversionCost::visit( __attribute((unused)) VoidType *voidType ) { 260 251 cost = Cost::infinity; 261 252 } … … 280 271 void ConversionCost::visit( PointerType * pointerType ) { 281 272 if ( PointerType *destAsPtr = dynamic_cast< PointerType* >( dest ) ) { 282 PRINT( std::cerr << pointerType << " ===> " << destAsPtr << std::endl; )273 PRINT( std::cerr << pointerType << " ===> " << destAsPtr; ) 283 274 Type::Qualifiers tq1 = pointerType->get_base()->get_qualifiers(); 284 275 Type::Qualifiers tq2 = destAsPtr->get_base()->get_qualifiers(); 285 276 if ( tq1 <= tq2 && typesCompatibleIgnoreQualifiers( pointerType->get_base(), destAsPtr->get_base(), indexer, env ) ) { 286 PRINT( std::cerr << " :: compatible and good qualifiers" << std::endl; )287 277 if ( tq1 == tq2 ) { 288 278 // types are the same … … 290 280 } else { 291 281 // types are the same, except otherPointer has more qualifiers 282 PRINT( std::cerr << " :: compatible and good qualifiers" << std::endl; ) 292 283 cost = Cost::safe; 293 284 } 294 } else { 285 } else { // xxx - this discards qualifiers from consideration -- reducing qualifiers is a safe conversion; is this right? 295 286 int assignResult = ptrsAssignable( pointerType->base, destAsPtr->base, env ); 296 287 PRINT( std::cerr << " :: " << assignResult << std::endl; ) 297 if ( assignResult > 0 && tq1 <= tq2 ) { 298 // xxx - want the case where qualifiers are added to be more expensive than the case where qualifiers are the same. Is 1 safe vs. 2 safe correct? 299 if ( tq1 == tq2 ) { 300 cost = Cost::safe; 301 } else if ( tq1 < tq2 ) { 302 cost = Cost::safe+Cost::safe; 303 } 288 if ( assignResult > 0 && pointerType->get_base()->get_qualifiers() <= destAsPtr->get_qualifiers() ) { 289 cost = Cost::safe; 304 290 } else if ( assignResult < 0 ) { 305 291 cost = Cost::unsafe;
Note:
See TracChangeset
for help on using the changeset viewer.