Changes in / [2325b57:1b56a7f]


Ignore:
Location:
src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • src/GenPoly/Lvalue.cpp

    r2325b57 r1b56a7f  
    316316                        Warning::RvalueToReferenceConversion, toCString( expr->arg ) );
    317317
    318 
    319                 // allowing conversion in the rvalue to const ref case
    320                 // use the referenced-to type to create temp variables
    321                 ast::Type const * targetType = dstType;
    322                 for (int i = 0; i < diff; ++i) targetType = (strict_dynamic_cast<ast::ReferenceType const *>(targetType))->base;
    323 
    324318                static UniqueName tmpNamer( "__ref_tmp_" );
    325319                ast::ObjectDecl * tmp = new ast::ObjectDecl( expr->arg->location,
    326320                        tmpNamer.newName(),
    327                         // ast::deepCopy( expr->arg->result ),
    328                         ast::deepCopy (targetType),
     321                        ast::deepCopy( expr->arg->result ),
    329322                        new ast::SingleInit( expr->arg->location, expr->arg ) );
    330323                PRINT( std::cerr << "make tmp: " << tmp << std::endl; )
  • src/ResolvExpr/ConversionCost.cpp

    r2325b57 r1b56a7f  
    250250                        newSrc = new ast::BasicType( ast::BasicKind::UnsignedInt );
    251251                }
    252                 if (dstAsRef->base->is_const() ) {
    253                         auto cvtCost = conversionCost(newSrc, dstAsRef->base, srcIsLvalue, symtab, env) ;
    254                         if (cvtCost == Cost::zero) { // exact match, may use a lvalue src
    255                                 if ( srcIsLvalue ) {
    256                                         if ( src->qualifiers == dstAsRef->base->qualifiers ) {
    257                                                 return Cost::reference;
    258                                         } else if ( src->qualifiers < dstAsRef->base->qualifiers ) {
    259                                                 return Cost::safe;
    260                                         } else {
    261                                                 return Cost::unsafe;
    262                                         }
    263                                 }
    264                                 else {
    265                                         return Cost::reference;
    266                                 }
    267                         }
    268                         else { // not exact match, conversion is needed so lvalueness of src does not matter
    269                                 return cvtCost + Cost::reference;
    270                         }
    271                 }
    272252                if ( typesCompatibleIgnoreQualifiers( newSrc, dstAsRef->base, env ) ) {
    273253                        if ( srcIsLvalue ) {
     
    279259                                        return Cost::unsafe;
    280260                                }
    281                         } else { // rvalue-to-NC-ref conversion
     261                        } else if ( dstAsRef->base->is_const() ) {
     262                                return Cost::safe;
     263                        } else {
    282264                                return Cost::unsafe;
    283265                        }
Note: See TracChangeset for help on using the changeset viewer.