Changeset 64071c2 for src/ResolvExpr


Ignore:
Timestamp:
Jun 6, 2016, 2:16:00 PM (8 years ago)
Author:
Rob Schluntz <rschlunt@…>
Branches:
ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, ctor, deferred_resn, demangler, enum, forall-pointer-decay, gc_noraii, jacob/cs343-translation, jenkins-sandbox, master, memory, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
Children:
7baed7d
Parents:
321a2481
Message:

greatly simplify construction of qualified objects using cast expressions, which also reduces gcc warnings

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/ResolvExpr/Resolver.cc

    r321a2481 r64071c2  
    516516
    517517        void Resolver::visit( ImplicitCtorDtorStmt * impCtorDtorStmt ) {
    518                 // this code is fairly gross. If VariableExpr didn't have its own results list then this could be cleaned up a bit
    519                 // by remembering the ObjectDecl in the ImplicitCtorDtorStmt and changing the ObjectDecl's type temporarily, but currently
    520                 // VariableExprs have their own type list which is manipulated in AlternativeFinder (e.g. in inferRecursive).
    521 
    522                 // before resolving ctor/dtor, need to remove type qualifiers from the first argument (the object being constructed)
     518                // before resolving ctor/dtor, need to remove type qualifiers from the first argument (the object being constructed).
     519                // Do this through a cast expression to greatly simplify the code.
    523520                Expression * callExpr = InitTweak::getCtorDtorCall( impCtorDtorStmt );
    524521                assert( callExpr );
    525                 Expression * constructee = InitTweak::getCallArg( callExpr, 0 );
     522                Expression *& constructee = InitTweak::getCallArg( callExpr, 0 );
    526523                Type * type = 0;
     524
     525                // need to find the type of the first argument, which is unfortunately not uniform since array construction
     526                // includes an untyped '+' expression.
    527527                if ( UntypedExpr * plusExpr = dynamic_cast< UntypedExpr * >( constructee ) ) {
    528528                        // constructee is <array>+<index>
     
    531531                        assert( dynamic_cast< VariableExpr * >( arr ) );
    532532                        assert( arr && arr->get_results().size() == 1 );
    533                         type = InitTweak::getPointerBase( arr->get_results().front() );
    534                         assert( type );
     533                        type = arr->get_results().front()->clone();
    535534                } else {
    536535                        // otherwise, constructing a plain object, which means the object's address is being taken.
     
    539538                        assert( constructee->get_results().size() == 1 );
    540539                        AddressExpr * addrExpr = dynamic_cast< AddressExpr * > ( constructee );
    541                         assert( addrExpr );
    542                         VariableExpr * varExpr = dynamic_cast< VariableExpr * >( addrExpr->get_arg() );
    543                         assert( varExpr && varExpr->get_results().size() == 1 );
    544                         type = varExpr->get_results().front();
    545                 }
    546                 // remember qualifiers so they can be replaced
    547                 Type::Qualifiers qualifiers = type->get_qualifiers();
    548 
     540                        assert( addrExpr && addrExpr->get_results().size() == 1);
     541                        type = addrExpr->get_results().front()->clone();
     542                }
     543                // cast to T* with qualifiers removed.
    549544                // unfortunately, lvalue is considered a qualifier. For AddressExpr to resolve, its argument
    550545                // must have an lvalue qualified type, so remove all qualifiers except lvalue. If we ever
    551546                // remove lvalue as a qualifier, this can change to
    552547                //   type->get_qualifiers() = Type::Qualifiers();
    553                 type->get_qualifiers() -= Type::Qualifiers(true, true, true, false, true, true);
     548                Type * base = InitTweak::getPointerBase( type );
     549                assert( base );
     550                base->get_qualifiers() -= Type::Qualifiers(true, true, true, false, true, true);
     551                // if pointer has lvalue qualifier, cast won't appear in output
     552                type->set_isLvalue( false );
     553                constructee = new CastExpr( constructee, type );
    554554
    555555                // finally, resolve the ctor/dtor
    556556                impCtorDtorStmt->get_callStmt()->accept( *this );
    557 
    558                 // reset type qualifiers, but first need to figure out where everything is again
    559                 // because the expressions are often changed by the resolver.
    560                 callExpr = InitTweak::getCtorDtorCall( impCtorDtorStmt );
    561                 assert( callExpr );
    562                 constructee = InitTweak::getCallArg( callExpr, 0 );
    563                 if ( ApplicationExpr * plusExpr = dynamic_cast< ApplicationExpr * >( constructee ) ) {
    564                         // constructee is <array>+<index>
    565                         // get Variable <array>, then get the base type of the VariableExpr - this is the type that needs to be fixed
    566                         Expression * arr = InitTweak::getCallArg( plusExpr, 0 );
    567                         assert( dynamic_cast< VariableExpr * >( arr ) );
    568                         assert( arr && arr->get_results().size() == 1 );
    569                         type = InitTweak::getPointerBase( arr->get_results().front() );
    570                         assert( type );
    571                         type->get_qualifiers() = qualifiers;
    572                 } else {
    573                         // otherwise constructing a plain object
    574                         // replace qualifiers on AddressExpr and on inner VariableExpr
    575                         assert( constructee->get_results().size() == 1 );
    576                         AddressExpr * addrExpr = dynamic_cast< AddressExpr * > ( constructee );
    577                         assert( addrExpr );
    578                         type = InitTweak::getPointerBase( addrExpr->get_results().front() );
    579                         assert( type );
    580                         type->get_qualifiers() = qualifiers;
    581 
    582                         VariableExpr * varExpr = dynamic_cast< VariableExpr * >( addrExpr->get_arg() );
    583                         assert( varExpr && varExpr->get_results().size() == 1 );
    584                         type = varExpr->get_results().front();
    585                         type->get_qualifiers() = qualifiers;
    586                 }
    587557        }
    588558} // namespace ResolvExpr
Note: See TracChangeset for help on using the changeset viewer.