Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/ResolvExpr/ConversionCost.cc

    recd4923 rb0837e4  
    9292
    9393        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; )
    9595                if ( diff > 0 ) {
    9696                        // TODO: document this
     
    108108                        if ( srcAsRef && destAsRef ) { // pointer-like conversions between references
    109109                                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;
    121112                                } else {  // xxx - this discards reference qualifiers from consideration -- reducing qualifiers is a safe conversion; is this right?
    122113                                        int assignResult = func( srcAsRef->get_base(), destAsRef->get_base(), env, indexer );
     
    257248        };
    258249
    259         void ConversionCost::visit( VoidType * ) {
     250        void ConversionCost::visit( __attribute((unused)) VoidType *voidType ) {
    260251                cost = Cost::infinity;
    261252        }
     
    280271        void ConversionCost::visit( PointerType * pointerType ) {
    281272                if ( PointerType *destAsPtr = dynamic_cast< PointerType* >( dest ) ) {
    282                         PRINT( std::cerr << pointerType << " ===> " << destAsPtr << std::endl; )
     273                        PRINT( std::cerr << pointerType << " ===> " << destAsPtr; )
    283274                        Type::Qualifiers tq1 = pointerType->get_base()->get_qualifiers();
    284275                        Type::Qualifiers tq2 = destAsPtr->get_base()->get_qualifiers();
    285276                        if ( tq1 <= tq2 && typesCompatibleIgnoreQualifiers( pointerType->get_base(), destAsPtr->get_base(), indexer, env ) ) {
    286                                 PRINT( std::cerr << " :: compatible and good qualifiers" << std::endl; )
    287277                                if ( tq1 == tq2 ) {
    288278                                        // types are the same
     
    290280                                } else {
    291281                                        // types are the same, except otherPointer has more qualifiers
     282                                        PRINT( std::cerr << " :: compatible and good qualifiers" << std::endl; )
    292283                                        cost = Cost::safe;
    293284                                }
    294                         } else {
     285                        } else {  // xxx - this discards qualifiers from consideration -- reducing qualifiers is a safe conversion; is this right?
    295286                                int assignResult = ptrsAssignable( pointerType->base, destAsPtr->base, env );
    296287                                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;
    304290                                } else if ( assignResult < 0 ) {
    305291                                        cost = Cost::unsafe;
Note: See TracChangeset for help on using the changeset viewer.