Changeset 2c04369 for src/GenPoly


Ignore:
Timestamp:
May 28, 2019, 12:04:43 PM (6 years ago)
Author:
Andrew Beach <ajbeach@…>
Branches:
ADT, arm-eh, ast-experimental, cleanup-dtors, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, pthread-emulation, qualifiedEnum
Children:
0d70e0d
Parents:
a7d50b6
Message:

Fixed some problems in convert. One of which was better solved by removing the FindSpecialDeclarations hack.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/GenPoly/Lvalue.cc

    ra7d50b6 r2c04369  
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Mar 17 09:11:18 2017
    13 // Update Count     : 5
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Tue May 28 11:07:00 2019
     13// Update Count     : 6
    1414//
    1515
     
    4242namespace GenPoly {
    4343        namespace {
    44                 // TODO: fold this into the general createDeref function??
    45                 Expression * mkDeref( Expression * arg ) {
    46                         if ( SymTab::dereferenceOperator ) {
    47                                 // note: reference depth can be arbitrarily deep here, so peel off the outermost pointer/reference, not just pointer because they are effecitvely equivalent in this pass
    48                                 VariableExpr * deref = new VariableExpr( SymTab::dereferenceOperator );
    49                                 deref->result = new PointerType( Type::Qualifiers(), deref->result );
    50                                 Type * base = InitTweak::getPointerBase( arg->result );
    51                                 assertf( base, "expected pointer type in dereference (type was %s)", toString( arg->result ).c_str() );
    52                                 ApplicationExpr * ret = new ApplicationExpr( deref, { arg } );
    53                                 delete ret->result;
    54                                 ret->result = base->clone();
    55                                 ret->result->set_lvalue( true );
    56                                 return ret;
    57                         } else {
    58                                 return UntypedExpr::createDeref( arg );
    59                         }
    60                 }
    61 
    62                 struct ReferenceConversions final : public WithStmtsToAdd {
     44                /// Local helper for pass visitors that need to add reference operations.
     45                struct WithDerefOp {
     46                        FunctionDecl * dereferenceOperator = nullptr;
     47
     48                        // TODO: fold this into the general createDeref function??
     49                        Expression * mkDeref( Expression * arg ) {
     50                                if ( dereferenceOperator ) {
     51                                        // note: reference depth can be arbitrarily deep here, so peel off the
     52                                        // outermost pointer/reference, not just pointer because they are effecitvely
     53                                        // equivalent in this pass
     54                                        VariableExpr * deref = new VariableExpr( dereferenceOperator );
     55                                        deref->result = new PointerType( Type::Qualifiers(), deref->result );
     56                                        Type * base = InitTweak::getPointerBase( arg->result );
     57                                        assertf( base, "expected pointer type in dereference (type was %s)",
     58                                                toString( arg->result ).c_str() );
     59                                        ApplicationExpr * ret = new ApplicationExpr( deref, { arg } );
     60                                        delete ret->result;
     61                                        ret->result = base->clone();
     62                                        ret->result->set_lvalue( true );
     63                                        return ret;
     64                                } else {
     65                                        return UntypedExpr::createDeref( arg );
     66                                }
     67                        }
     68
     69                        void previsit( FunctionDecl * funcDecl ) {
     70                                if ( dereferenceOperator ) return;
     71                                if ( funcDecl->get_name() != "*?" ) return;
     72                                if ( funcDecl->get_linkage() == LinkageSpec::Intrinsic ) return;
     73                                FunctionType * ftype = funcDecl->get_functionType();
     74                                if ( ftype->get_parameters().size() != 1 ) return;
     75                                DeclarationWithType * arg0 = ftype->get_parameters().front();
     76                                if ( arg0->get_type()->get_qualifiers() == Type::Qualifiers() ) return;
     77                                dereferenceOperator = funcDecl;
     78                        }
     79                };
     80
     81                struct ReferenceConversions final : public WithStmtsToAdd, public WithDerefOp {
    6382                        Expression * postmutate( CastExpr * castExpr );
    6483                        Expression * postmutate( AddressExpr * addrExpr );
     
    6685
    6786                /// Intrinsic functions that take reference parameters don't REALLY take reference parameters -- their reference arguments must always be implicitly dereferenced.
    68                 struct FixIntrinsicArgs final {
     87                struct FixIntrinsicArgs final : public WithDerefOp {
    6988                        Expression * postmutate( ApplicationExpr * appExpr );
    7089                };
     
    98117                };
    99118
    100                 struct AddrRef final : public WithGuards, public WithVisitorRef<AddrRef>, public WithShortCircuiting {
     119                struct AddrRef final : public WithGuards, public WithVisitorRef<AddrRef>,
     120                                public WithShortCircuiting, public WithDerefOp {
    101121                        void premutate( AddressExpr * addrExpr );
    102122                        Expression * postmutate( AddressExpr * addrExpr );
Note: See TracChangeset for help on using the changeset viewer.