Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/ResolvExpr/CurrentObject.cc

    rba4a1d8 rc6747a1  
    3838
    3939namespace ResolvExpr {
     40        long long int getConstValue( ConstantExpr * constExpr ) {
     41                if ( BasicType * basicType = dynamic_cast< BasicType * >( constExpr->get_result() ) ) {
     42                        if ( basicType->isInteger() ) {
     43                                return constExpr->get_constant()->get_ival();
     44                        } else {
     45                                assertf( false, "Non-integer constant expression in getConstValue %s", toString( constExpr ).c_str() ); // xxx - might be semantic error
     46                        }
     47                } else if ( dynamic_cast< OneType * >( constExpr->get_result() ) ) {
     48                        return 1;
     49                } else if ( dynamic_cast< ZeroType * >( constExpr->get_result() ) ) {
     50                        return 0;
     51                } else {
     52                        assertf( false, "unhandled type on getConstValue %s", toString( constExpr->get_result() ).c_str() ); // xxx - might be semantic error
     53                }
     54        }
     55
    4056        template< typename AggrInst >
    4157        TypeSubstitution makeGenericSubstitution( AggrInst * inst ) {
     
    6278                virtual ~MemberIterator() {}
    6379
    64                 /// walks the current object using the given designators as a guide
    6580                virtual void setPosition( std::list< Expression * > & designators ) = 0;
    66 
    67                 /// retrieve the list of possible Type/Designaton pairs for the current position in the currect object
    6881                virtual std::list<InitAlternative> operator*() const = 0;
    69 
    70                 /// true if the iterator is not currently at the end
    7182                virtual operator bool() const = 0;
    72 
    73                 /// moves the iterator by one member in the current object
    7483                virtual MemberIterator & bigStep() = 0;
    75 
    76                 /// moves the iterator by one member in the current subobject
    7784                virtual MemberIterator & smallStep() = 0;
    78 
    79                 /// the type of the current object
    8085                virtual Type * getType() = 0;
    81 
    82                 /// the type of the current subobject
    8386                virtual Type * getNext() = 0;
    8487
    85                 /// printing for debug
    8688                virtual void print( std::ostream & out, Indenter indent ) const = 0;
    8789
    88                 /// helper for operator*; aggregates must add designator to each init alternative, but
    89                 /// adding designators in operator* creates duplicates.
    9090                virtual std::list<InitAlternative> first() const = 0; // should be protected
    9191        };
     
    139139                ArrayIterator( ArrayType * at ) : array( at ) {
    140140                        PRINT( std::cerr << "Creating array iterator: " << at << std::endl; )
    141                         base = at->base;
     141                        base = at->get_base();
    142142                        memberIter = createMemberIterator( base );
    143                         if ( at->isVarLen ) SemanticError( at, "VLA initialization does not support @=: " );
    144                         setSize( at->dimension );
     143                        setSize( at->get_dimension() );
    145144                }
    146145
     
    150149
    151150        private:
    152                 void setSize( Expression * expr ) { // replace this logic with an eval call
    153                         auto res = eval(expr);
    154                         if (res.second) {
    155                                 size = res.first;
     151                void setSize( Expression * expr ) {
     152                        if ( ConstantExpr * constExpr = dynamic_cast< ConstantExpr * >( expr ) ) {
     153                                size = getConstValue( constExpr );
     154                                PRINT( std::cerr << "array type with size: " << size << std::endl; )
     155                        }       else if ( CastExpr * castExpr = dynamic_cast< CastExpr * >( expr ) ) {
     156                                setSize( castExpr->get_arg() ); // xxx - need to perform the conversion specified by the cast
    156157                        } else {
    157                                 SemanticError( expr->location, toString("Array designator must be a constant expression: ", expr) );
     158                                assertf( false, "unhandled expression in setSize: %s", toString( expr ).c_str() ); // xxx - if not a constant expression, it's not simple to determine how long the array actually is, which is necessary for initialization to be done correctly -- fix this
    158159                        }
    159160                }
     
    163164                        // need to permit integer-constant-expressions, including: integer constants, enumeration constants, character constants, sizeof expressions, _Alignof expressions, cast expressions
    164165                        if ( ConstantExpr * constExpr = dynamic_cast< ConstantExpr * >( expr ) ) {
    165                                 try {
    166                                         index = constExpr->intValue();
    167                                 } catch( SemanticErrorException & ) {
    168                                         SemanticError( expr, "Constant expression of non-integral type in array designator: " );
    169                                 }
     166                                index = getConstValue( constExpr );
    170167                        } else if ( CastExpr * castExpr = dynamic_cast< CastExpr * >( expr ) ) {
    171168                                setPosition( castExpr->get_arg() );
    172169                        } else if ( VariableExpr * varExpr = dynamic_cast< VariableExpr * >( expr ) ) {
    173                                 EnumInstType * inst = dynamic_cast<EnumInstType *>( varExpr->get_result() );
    174                                 assertf( inst, "ArrayIterator given variable that isn't an enum constant : %s", toString( expr ).c_str() );
    175                                 long long int value;
    176                                 if ( inst->baseEnum->valueOf( varExpr->var, value ) ) {
    177                                         index = value;
    178                                 }
     170                                assertf( dynamic_cast<EnumInstType *> ( varExpr->get_result() ), "ArrayIterator given variable that isn't an enum constant : %s", toString( expr ).c_str() );
     171                                index = 0; // xxx - get actual value of enum constant
    179172                        } else if ( dynamic_cast< SizeofExpr * >( expr ) || dynamic_cast< AlignofExpr * >( expr ) ) {
    180173                                index = 0; // xxx - get actual sizeof/alignof value?
     
    357350                                }
    358351                        }
    359                         if ( atbegin ) {
     352                        // if ( curMember == std::next( decl->get_members().begin(), 1 ) ) { // xxx - this never triggers because curMember is incremented immediately on construction
     353                        if ( atbegin ) { // xxx - this never triggers because curMember is incremented immediately on construction
    360354                                // xxx - what about case of empty struct??
    361355                                // only add self if at the very beginning of the structure
     
    391385                        return *this;
    392386                }
     387                virtual std::list<InitAlternative> first() const { return std::list<InitAlternative>{}; }
    393388        };
    394389
     
    444439                                return new UnionIterator( uit );
    445440                        } else {
    446                                 assertf( dynamic_cast< EnumInstType * >( type ) || dynamic_cast< TypeInstType * >( type ), "Encountered unhandled ReferenceToType in createMemberIterator: %s", toString( type ).c_str() );
     441                                assertf( dynamic_cast< TypeInstType * >( type ), "some other reftotype" );
    447442                                return new SimpleIterator( type );
    448443                        }
     
    519514                } // for
    520515                if ( desigAlts.size() > 1 ) {
    521                         SemanticError( designation, toString("Too many alternatives (", desigAlts.size(), ") for designation: ") );
     516                        throw SemanticError( toString("Too many alternatives (", desigAlts.size(), ") for designation: "), designation );
    522517                } else if ( desigAlts.size() == 0 ) {
    523                         SemanticError( designation, "No reasonable alternatives for designation: " );
     518                        throw SemanticError( "No reasonable alternatives for designation: ", designation );
    524519                }
    525520                DesignatorChain & d = desigAlts.back();
Note: See TracChangeset for help on using the changeset viewer.