Changeset 00f89a6


Ignore:
Timestamp:
Nov 12, 2024, 10:18:13 PM (9 days ago)
Author:
Fangren Yu <f37yu@…>
Branches:
master
Children:
2325b57
Parents:
47174c4
Message:

attempt to fix const reference conversion

Location:
src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • src/GenPoly/Lvalue.cpp

    r47174c4 r00f89a6  
    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
    318324                static UniqueName tmpNamer( "__ref_tmp_" );
    319325                ast::ObjectDecl * tmp = new ast::ObjectDecl( expr->arg->location,
    320326                        tmpNamer.newName(),
    321                         ast::deepCopy( expr->arg->result ),
     327                        // ast::deepCopy( expr->arg->result ),
     328                        ast::deepCopy (targetType),
    322329                        new ast::SingleInit( expr->arg->location, expr->arg ) );
    323330                PRINT( std::cerr << "make tmp: " << tmp << std::endl; )
  • src/ResolvExpr/ConversionCost.cpp

    r47174c4 r00f89a6  
    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                }
    252272                if ( typesCompatibleIgnoreQualifiers( newSrc, dstAsRef->base, env ) ) {
    253273                        if ( srcIsLvalue ) {
     
    259279                                        return Cost::unsafe;
    260280                                }
    261                         } else if ( dstAsRef->base->is_const() ) {
    262                                 return Cost::safe;
    263                         } else {
     281                        } else { // rvalue-to-NC-ref conversion
    264282                                return Cost::unsafe;
    265283                        }
Note: See TracChangeset for help on using the changeset viewer.