Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/InitTweak/InitTweak.cc

    rcad355a r6cf27a07  
    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
     
    160161                else return NULL;
    161162        }
     163
     164        class ConstExprChecker : public Visitor {
     165        public:
     166                ConstExprChecker() : isConstExpr( true ) {}
     167
     168                virtual void visit( ApplicationExpr *applicationExpr ) { isConstExpr = false; }
     169                virtual void visit( UntypedExpr *untypedExpr ) { isConstExpr = false; }
     170                virtual void visit( NameExpr *nameExpr ) { isConstExpr = false; }
     171                virtual void visit( CastExpr *castExpr ) { isConstExpr = false; }
     172                virtual void visit( LabelAddressExpr *labAddressExpr ) { isConstExpr = false; }
     173                virtual void visit( UntypedMemberExpr *memberExpr ) { isConstExpr = false; }
     174                virtual void visit( MemberExpr *memberExpr ) { isConstExpr = false; }
     175                virtual void visit( VariableExpr *variableExpr ) { isConstExpr = false; }
     176                virtual void visit( ConstantExpr *constantExpr ) { /* bottom out */ }
     177                // these might be okay?
     178                // virtual void visit( SizeofExpr *sizeofExpr );
     179                // virtual void visit( AlignofExpr *alignofExpr );
     180                // virtual void visit( UntypedOffsetofExpr *offsetofExpr );
     181                // virtual void visit( OffsetofExpr *offsetofExpr );
     182                // virtual void visit( OffsetPackExpr *offsetPackExpr );
     183                // virtual void visit( AttrExpr *attrExpr );
     184                // virtual void visit( CommaExpr *commaExpr );
     185                // virtual void visit( LogicalExpr *logicalExpr );
     186                // virtual void visit( ConditionalExpr *conditionalExpr );
     187                virtual void visit( TupleExpr *tupleExpr ) { isConstExpr = false; }
     188                virtual void visit( SolvedTupleExpr *tupleExpr ) { isConstExpr = false; }
     189                virtual void visit( TypeExpr *typeExpr ) { isConstExpr = false; }
     190                virtual void visit( AsmExpr *asmExpr ) { isConstExpr = false; }
     191                virtual void visit( UntypedValofExpr *valofExpr ) { isConstExpr = false; }
     192                virtual void visit( CompoundLiteralExpr *compLitExpr ) { isConstExpr = false; }
     193
     194                bool isConstExpr;
     195        };
     196
     197        bool isConstExpr( Expression * expr ) {
     198                if ( expr ) {
     199                        ConstExprChecker checker;
     200                        expr->accept( checker );
     201                        return checker.isConstExpr;
     202                }
     203                return true;
     204        }
     205
     206        bool isConstExpr( Initializer * init ) {
     207                if ( init ) {
     208                        ConstExprChecker checker;
     209                        init->accept( checker );
     210                        return checker.isConstExpr;
     211                } // if
     212                // for all intents and purposes, no initializer means const expr
     213                return true;
     214        }
     215
    162216}
Note: See TracChangeset for help on using the changeset viewer.