Changes in src/ResolvExpr/CurrentObject.cc [ba4a1d8:c6747a1]
- File:
-
- 1 edited
-
src/ResolvExpr/CurrentObject.cc (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/CurrentObject.cc
rba4a1d8 rc6747a1 38 38 39 39 namespace 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 40 56 template< typename AggrInst > 41 57 TypeSubstitution makeGenericSubstitution( AggrInst * inst ) { … … 62 78 virtual ~MemberIterator() {} 63 79 64 /// walks the current object using the given designators as a guide65 80 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 object68 81 virtual std::list<InitAlternative> operator*() const = 0; 69 70 /// true if the iterator is not currently at the end71 82 virtual operator bool() const = 0; 72 73 /// moves the iterator by one member in the current object74 83 virtual MemberIterator & bigStep() = 0; 75 76 /// moves the iterator by one member in the current subobject77 84 virtual MemberIterator & smallStep() = 0; 78 79 /// the type of the current object80 85 virtual Type * getType() = 0; 81 82 /// the type of the current subobject83 86 virtual Type * getNext() = 0; 84 87 85 /// printing for debug86 88 virtual void print( std::ostream & out, Indenter indent ) const = 0; 87 89 88 /// helper for operator*; aggregates must add designator to each init alternative, but89 /// adding designators in operator* creates duplicates.90 90 virtual std::list<InitAlternative> first() const = 0; // should be protected 91 91 }; … … 139 139 ArrayIterator( ArrayType * at ) : array( at ) { 140 140 PRINT( std::cerr << "Creating array iterator: " << at << std::endl; ) 141 base = at-> base;141 base = at->get_base(); 142 142 memberIter = createMemberIterator( base ); 143 if ( at->isVarLen ) SemanticError( at, "VLA initialization does not support @=: " ); 144 setSize( at->dimension ); 143 setSize( at->get_dimension() ); 145 144 } 146 145 … … 150 149 151 150 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 156 157 } 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 158 159 } 159 160 } … … 163 164 // need to permit integer-constant-expressions, including: integer constants, enumeration constants, character constants, sizeof expressions, _Alignof expressions, cast expressions 164 165 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 ); 170 167 } else if ( CastExpr * castExpr = dynamic_cast< CastExpr * >( expr ) ) { 171 168 setPosition( castExpr->get_arg() ); 172 169 } 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 179 172 } else if ( dynamic_cast< SizeofExpr * >( expr ) || dynamic_cast< AlignofExpr * >( expr ) ) { 180 173 index = 0; // xxx - get actual sizeof/alignof value? … … 357 350 } 358 351 } 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 360 354 // xxx - what about case of empty struct?? 361 355 // only add self if at the very beginning of the structure … … 391 385 return *this; 392 386 } 387 virtual std::list<InitAlternative> first() const { return std::list<InitAlternative>{}; } 393 388 }; 394 389 … … 444 439 return new UnionIterator( uit ); 445 440 } 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" ); 447 442 return new SimpleIterator( type ); 448 443 } … … 519 514 } // for 520 515 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 ); 522 517 } else if ( desigAlts.size() == 0 ) { 523 SemanticError( designation, "No reasonable alternatives for designation: ");518 throw SemanticError( "No reasonable alternatives for designation: ", designation ); 524 519 } 525 520 DesignatorChain & d = desigAlts.back();
Note:
See TracChangeset
for help on using the changeset viewer.