Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/InitTweak/InitTweak.cc

    raedfd91 rcad355a  
    5757                        (objDecl->get_init() == NULL ||
    5858                                ( objDecl->get_init() != NULL && objDecl->get_init()->get_maybeConstructed() )) &&
    59                         ! isDesignated( objDecl->get_init() )
    60                         && objDecl->get_storageClass() != DeclarationNode::Extern;
     59                        ! isDesignated( objDecl->get_init() );
    6160        }
    6261
     
    8584                }
    8685        }
    87         namespace {
    88                 VariableExpr * getCalledFunction( ApplicationExpr * appExpr ) {
    89                         assert( appExpr );
    90                         return dynamic_cast< VariableExpr * >( appExpr->get_function() );
    91                 }
    92         }
    93 
    94         ApplicationExpr * isIntrinsicCallExpr( Expression * expr ) {
    95                 ApplicationExpr * appExpr = dynamic_cast< ApplicationExpr * >( expr );
    96                 if ( ! appExpr ) return NULL;
    97                 VariableExpr * function = getCalledFunction( appExpr );
    98                 assert( function );
    99                 // check for Intrinsic only - don't want to remove all overridable ctor/dtors because autogenerated ctor/dtor
    100                 // will call all member dtors, and some members may have a user defined dtor.
    101                 return function->get_var()->get_linkage() == LinkageSpec::Intrinsic ? appExpr : NULL;
    102         }
    10386
    10487        bool isInstrinsicSingleArgCallStmt( Statement * stmt ) {
    10588                Expression * callExpr = getCtorDtorCall( stmt );
    10689                if ( ! callExpr ) return false;
    107                 if ( ApplicationExpr * appExpr = isIntrinsicCallExpr( callExpr ) ) {
    108                         assert( ! appExpr->get_function()->get_results().empty() );
    109                         FunctionType *funcType = GenPoly::getFunctionType( appExpr->get_function()->get_results().front() );
    110                         assert( funcType );
    111                         return funcType->get_parameters().size() == 1;
    112                 }
    113                 return false;
     90                ApplicationExpr * appExpr = dynamic_cast< ApplicationExpr * >( callExpr );
     91                assert( appExpr );
     92                VariableExpr * function = dynamic_cast< VariableExpr * >( appExpr->get_function() );
     93                assert( function );
     94                // check for Intrinsic only - don't want to remove all overridable ctor/dtors because autogenerated ctor/dtor
     95                // will call all member dtors, and some members may have a user defined dtor.
     96                FunctionType * funcType = GenPoly::getFunctionType( function->get_var()->get_type() );
     97                assert( funcType );
     98                return function->get_var()->get_linkage() == LinkageSpec::Intrinsic && funcType->get_parameters().size() == 1;
    11499        }
    115100
     
    175160                else return NULL;
    176161        }
    177 
    178         class ConstExprChecker : public Visitor {
    179         public:
    180                 ConstExprChecker() : isConstExpr( true ) {}
    181 
    182                 virtual void visit( ApplicationExpr *applicationExpr ) { isConstExpr = false; }
    183                 virtual void visit( UntypedExpr *untypedExpr ) { isConstExpr = false; }
    184                 virtual void visit( NameExpr *nameExpr ) { isConstExpr = false; }
    185                 virtual void visit( CastExpr *castExpr ) { isConstExpr = false; }
    186                 virtual void visit( LabelAddressExpr *labAddressExpr ) { isConstExpr = false; }
    187                 virtual void visit( UntypedMemberExpr *memberExpr ) { isConstExpr = false; }
    188                 virtual void visit( MemberExpr *memberExpr ) { isConstExpr = false; }
    189                 virtual void visit( VariableExpr *variableExpr ) { isConstExpr = false; }
    190                 virtual void visit( ConstantExpr *constantExpr ) { /* bottom out */ }
    191                 // these might be okay?
    192                 // virtual void visit( SizeofExpr *sizeofExpr );
    193                 // virtual void visit( AlignofExpr *alignofExpr );
    194                 // virtual void visit( UntypedOffsetofExpr *offsetofExpr );
    195                 // virtual void visit( OffsetofExpr *offsetofExpr );
    196                 // virtual void visit( OffsetPackExpr *offsetPackExpr );
    197                 // virtual void visit( AttrExpr *attrExpr );
    198                 // virtual void visit( CommaExpr *commaExpr );
    199                 // virtual void visit( LogicalExpr *logicalExpr );
    200                 // virtual void visit( ConditionalExpr *conditionalExpr );
    201                 virtual void visit( TupleExpr *tupleExpr ) { isConstExpr = false; }
    202                 virtual void visit( SolvedTupleExpr *tupleExpr ) { isConstExpr = false; }
    203                 virtual void visit( TypeExpr *typeExpr ) { isConstExpr = false; }
    204                 virtual void visit( AsmExpr *asmExpr ) { isConstExpr = false; }
    205                 virtual void visit( UntypedValofExpr *valofExpr ) { isConstExpr = false; }
    206                 virtual void visit( CompoundLiteralExpr *compLitExpr ) { isConstExpr = false; }
    207 
    208                 bool isConstExpr;
    209         };
    210 
    211         bool isConstExpr( Expression * expr ) {
    212                 if ( expr ) {
    213                         ConstExprChecker checker;
    214                         expr->accept( checker );
    215                         return checker.isConstExpr;
    216                 }
    217                 return true;
    218         }
    219 
    220         bool isConstExpr( Initializer * init ) {
    221                 if ( init ) {
    222                         ConstExprChecker checker;
    223                         init->accept( checker );
    224                         return checker.isConstExpr;
    225                 } // if
    226                 // for all intents and purposes, no initializer means const expr
    227                 return true;
    228         }
    229 
    230162}
Note: See TracChangeset for help on using the changeset viewer.