- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/ConversionCost.cc
r2463d0e r7e003011 57 57 } else if ( dynamic_cast< VoidType* >( dest ) ) { 58 58 return Cost( 0, 0, 1 ); 59 } else if ( ReferenceType * refType = dynamic_cast< ReferenceType * > ( dest ) ) {60 // std::cerr << "conversionCost: dest is reference" << std::endl;61 return convertToReferenceCost( src, refType, indexer, env );62 59 } else { 63 60 ConversionCost converter( dest, indexer, env ); … … 69 66 } // if 70 67 } // if 71 }72 73 Cost convertToReferenceCost( Type * src, ReferenceType * dest, const SymTab::Indexer & indexer, const TypeEnvironment & env ) {74 // std::cerr << "convert to reference cost..." << std::endl;75 if ( ReferenceType *srcAsRef = dynamic_cast< ReferenceType * >( src ) ) { // pointer-like conversions between references76 // std::cerr << "converting between references" << std::endl;77 if ( srcAsRef->get_base()->get_qualifiers() <= dest->get_base()->get_qualifiers() && typesCompatibleIgnoreQualifiers( srcAsRef->get_base(), dest->get_base(), indexer, env ) ) {78 return Cost( 0, 0, 1 );79 } else { // xxx - this discards reference qualifiers from consideration -- reducing qualifiers is a safe conversion; is this right?80 int assignResult = ptrsAssignable( srcAsRef->get_base(), dest->get_base(), env );81 if ( assignResult < 0 ) {82 return Cost( 0, 0, 1 );83 } else if ( assignResult > 0 ) {84 return Cost( 1, 0, 0 );85 } // if86 } // if87 } else if ( typesCompatibleIgnoreQualifiers( src, dest->get_base(), indexer, env ) ) {88 // std::cerr << "converting compatible base type" << std::endl;89 if ( src->get_lvalue() ) {90 // std::cerr << "lvalue to reference conversion" << std::endl;91 // lvalue-to-reference conversion: cv lvalue T => cv T &92 if ( src->get_qualifiers() == dest->get_base()->get_qualifiers() ) {93 return Cost( 0, 0, 1 ); // cost needs to be non-zero to add cast94 } if ( src->get_qualifiers() < dest->get_base()->get_qualifiers() ) {95 return Cost( 0, 0, 2 ); // cost needs to be higher than previous cast to differentiate adding qualifiers vs. keeping same96 } else {97 return Cost( 1, 0, 0 );98 }99 } else if ( dest->get_base()->get_const() ) {100 // std::cerr << "rvalue to const ref conversion" << std::endl;101 // rvalue-to-const-reference conversion: T => const T &102 return Cost( 0, 0, 1 );103 } else {104 // std::cerr << "rvalue to non-const reference conversion" << std::endl;105 // rvalue-to-reference conversion: T => T &106 return Cost( 1, 0, 0 );107 }108 } else {109 // std::cerr << "attempting to convert from incompatible base type -- fail" << std::endl;110 }111 return Cost::infinity;112 68 } 113 69 … … 217 173 if ( pointerType->get_base()->get_qualifiers() <= destAsPtr->get_base()->get_qualifiers() && typesCompatibleIgnoreQualifiers( pointerType->get_base(), destAsPtr->get_base(), indexer, env ) ) { 218 174 cost = Cost( 0, 0, 1 ); 219 } else { // xxx - this discards pointer qualifiers from consideration -- reducing qualifiers is a safe conversion; is this right?175 } else { 220 176 int assignResult = ptrsAssignable( pointerType->get_base(), destAsPtr->get_base(), env ); 221 177 if ( assignResult < 0 ) { … … 231 187 232 188 void ConversionCost::visit(__attribute((unused)) ArrayType *arrayType) {} 233 234 void ConversionCost::visit(ReferenceType *refType) {235 // Note: dest can never be a reference, since it would have been caught in an earlier check236 assert( ! dynamic_cast< ReferenceType * >( dest ) );237 // convert reference to rvalue: cv T1 & => T2238 // recursively compute conversion cost from T1 to T2.239 // cv can be safely dropped because of 'implicit dereference' behavior.240 refType->get_base()->accept( *this );241 }242 243 189 void ConversionCost::visit(__attribute((unused)) FunctionType *functionType) {} 244 190 … … 262 208 static Type::Qualifiers q; 263 209 static BasicType integer( q, BasicType::SignedInt ); 264 integer.accept( *this ); // safe if dest >= int210 integer.accept( *this ); 265 211 if ( cost < Cost( 1, 0, 0 ) ) { 266 212 cost.incSafe();
Note:
See TracChangeset
for help on using the changeset viewer.