Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/InitTweak/InitTweak.cc

    rcad355a raedfd91  
    5757                        (objDecl->get_init() == NULL ||
    5858                                ( objDecl->get_init() != NULL && objDecl->get_init()->get_maybeConstructed() )) &&
    59                         ! isDesignated( objDecl->get_init() );
     59                        ! isDesignated( objDecl->get_init() )
     60                        && objDecl->get_storageClass() != DeclarationNode::Extern;
    6061        }
    6162
     
    8485                }
    8586        }
     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        }
    86103
    87104        bool isInstrinsicSingleArgCallStmt( Statement * stmt ) {
    88105                Expression * callExpr = getCtorDtorCall( stmt );
    89106                if ( ! callExpr ) 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;
     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;
    99114        }
    100115
     
    160175                else return NULL;
    161176        }
     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
    162230}
Note: See TracChangeset for help on using the changeset viewer.