Ignore:
Timestamp:
Nov 19, 2024, 5:02:03 PM (4 weeks ago)
Author:
Andrew Beach <ajbeach@…>
Branches:
master
Children:
d945be9
Parents:
29075d1
Message:

CastExpr? reorganization and clean-up in Lvalue. I kept these from a fix that is not working.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/GenPoly/Lvalue.cpp

    r29075d1 recf3812  
    315315                SemanticWarning( expr->arg->location,
    316316                        Warning::RvalueToReferenceConversion, toCString( expr->arg ) );
    317 
    318317
    319318                // allowing conversion in the rvalue to const ref case
     
    366365                        ret = new ast::AddressExpr( ret->location, ret );
    367366                }
    368                 if ( expr->arg->get_lvalue() &&
    369                                 !ResolvExpr::typesCompatible(
    370                                         srcType,
    371                                         strict_dynamic_cast<ast::ReferenceType const *>( dstType )->base ) ) {
     367                if ( !ResolvExpr::typesCompatible(
     368                                srcType,
     369                                strict_dynamic_cast<ast::ReferenceType const *>( dstType )->base ) ) {
    372370                        // Must keep cast if cast-to type is different from the actual type.
    373371                        return ast::mutate_field( expr, &ast::CastExpr::arg, ret );
     
    384382                }
    385383                // Must keep cast if types are different.
    386                 if ( !ResolvExpr::typesCompatibleIgnoreQualifiers(
     384                if ( !ResolvExpr::typesCompatible(
    387385                                dstType->stripReferences(),
    388386                                srcType->stripReferences() ) ) {
     
    397395        } else {
    398396                assert( 0 == diff );
    399                 // Remove useless generated casts.
    400                 if ( expr->isGenerated == ast::GeneratedFlag::GeneratedCast &&
    401                                 ResolvExpr::typesCompatible(
     397                // Must keep cast if types are different. (Or it is explicit.)
     398                if ( ast::ExplicitCast == expr->isGenerated ||
     399                                !ResolvExpr::typesCompatible(
    402400                                        expr->result,
    403401                                        expr->arg->result ) ) {
    404                         PRINT(
    405                                 std::cerr << "types are compatible, removing cast: " << expr << '\n';
    406                                 std::cerr << "-- " << expr->result << '\n';
    407                                 std::cerr << "-- " << expr->arg->result << std::endl;
    408                         )
    409                         auto argAsEnum = expr->arg.as<ast::EnumInstType>();
    410                         auto resultAsEnum = expr->result.as<ast::EnumInstType>();
    411                         if (argAsEnum && resultAsEnum) {
    412                                 if (argAsEnum->base->name != resultAsEnum->base->name) {
    413                                         return expr;
    414                                 }
    415                         }
    416                         return ast::mutate_field( expr->arg.get(),
    417                                         &ast::Expr::env, expr->env.get() );
    418                 }
    419                 return expr;
     402                        return expr;
     403                }
     404                PRINT(
     405                        std::cerr << "types are compatible, removing cast: " << expr << '\n';
     406                        std::cerr << "-- " << expr->result << '\n';
     407                        std::cerr << "-- " << expr->arg->result << std::endl;
     408                )
     409                return ast::mutate_field( expr->arg.get(),
     410                                &ast::Expr::env, expr->env.get() );
    420411        }
    421412}
Note: See TracChangeset for help on using the changeset viewer.