Changeset cb43451 for src/ResolvExpr/ConversionCost.cc
- Timestamp:
- Jul 21, 2017, 9:51:17 AM (6 years ago)
- Branches:
- aaron-thesis, arm-eh, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
- Children:
- 53a8e68
- Parents:
- 17f22e78
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/ConversionCost.cc
r17f22e78 rcb43451 248 248 void ConversionCost::visit(PointerType *pointerType) { 249 249 if ( PointerType *destAsPtr = dynamic_cast< PointerType* >( dest ) ) { 250 if ( pointerType->get_base()->get_qualifiers() <= destAsPtr->get_base()->get_qualifiers() && typesCompatibleIgnoreQualifiers( pointerType->get_base(), destAsPtr->get_base(), indexer, env ) ) { 251 cost = Cost::safe; 252 } else { // xxx - this discards pointer qualifiers from consideration -- reducing qualifiers is a safe conversion; is this right? 250 // std::cerr << pointerType << " ===> " << destAsPtr; 251 Type::Qualifiers tq1 = pointerType->get_base()->get_qualifiers(); 252 Type::Qualifiers tq2 = destAsPtr->get_base()->get_qualifiers(); 253 if ( tq1 <= tq2 && typesCompatibleIgnoreQualifiers( pointerType->get_base(), destAsPtr->get_base(), indexer, env ) ) { 254 if ( tq1 == tq2 ) { 255 // types are the same 256 cost = Cost::zero; 257 } else { 258 // types are the same, except otherPointer has more qualifiers 259 // std::cerr << " :: compatible and good qualifiers" << std::endl; 260 cost = Cost::safe; 261 } 262 } else { // xxx - this discards qualifiers from consideration -- reducing qualifiers is a safe conversion; is this right? 253 263 int assignResult = ptrsAssignable( pointerType->get_base(), destAsPtr->get_base(), env ); 254 if ( assignResult < 0 ) { 264 // std::cerr << " :: " << assignResult << std::endl; 265 if ( assignResult < 0 && pointerType->get_base()->get_qualifiers() <= destAsPtr->get_qualifiers() ) { 255 266 cost = Cost::safe; 256 267 } else if ( assignResult > 0 ) { 257 268 cost = Cost::unsafe; 258 269 } // if 270 // assignResult == 0 means Cost::Infinity 259 271 } // if 260 272 } else if ( dynamic_cast< ZeroType* >( dest ) != nullptr || dynamic_cast< OneType* >( dest ) != nullptr ) { … … 272 284 // cv can be safely dropped because of 'implicit dereference' behavior. 273 285 refType->get_base()->accept( *this ); 274 cost.incReference(); 286 if ( refType->get_base()->get_qualifiers() == dest->get_qualifiers() ) { 287 cost.incReference(); // prefer exact qualifiers 288 } else if ( refType->get_base()->get_qualifiers() < dest->get_qualifiers() ) { 289 cost.incSafe(); // then gaining qualifiers 290 } else { 291 cost.incUnsafe(); // lose qualifiers as last resort 292 } 293 // std::cerr << refType << " ==> " << dest << " " << cost << std::endl; 275 294 } 276 295
Note: See TracChangeset
for help on using the changeset viewer.