Changes in src/SymTab/Validate.cc [fbd7ad6:fbcde64]
- File:
-
- 1 edited
-
src/SymTab/Validate.cc (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/SymTab/Validate.cc
rfbd7ad6 rfbcde64 208 208 }; 209 209 210 class ArrayLength : public Visitor {211 public:212 /// for array types without an explicit length, compute the length and store it so that it213 /// is known to the rest of the phases. For example,214 /// int x[] = { 1, 2, 3 };215 /// int y[][2] = { { 1, 2, 3 }, { 1, 2, 3 } };216 /// here x and y are known at compile-time to have length 3, so change this into217 /// int x[3] = { 1, 2, 3 };218 /// int y[3][2] = { { 1, 2, 3 }, { 1, 2, 3 } };219 static void computeLength( std::list< Declaration * > & translationUnit );220 221 virtual void visit( ObjectDecl * objDecl );222 };223 224 210 class CompoundLiteral final : public GenPoly::DeclMutator { 225 211 Type::StorageClasses storageClasses; … … 249 235 acceptAll( translationUnit, pass3 ); 250 236 VerifyCtorDtorAssign::verify( translationUnit ); 251 ArrayLength::computeLength( translationUnit );252 237 } 253 238 … … 884 869 } 885 870 } 886 887 void ArrayLength::computeLength( std::list< Declaration * > & translationUnit ) {888 ArrayLength len;889 acceptAll( translationUnit, len );890 }891 892 void ArrayLength::visit( ObjectDecl * objDecl ) {893 if ( ArrayType * at = dynamic_cast< ArrayType * >( objDecl->get_type() ) ) {894 if ( at->get_dimension() != nullptr ) return;895 if ( ListInit * init = dynamic_cast< ListInit * >( objDecl->get_init() ) ) {896 at->set_dimension( new ConstantExpr( Constant::from_ulong( init->get_initializers().size() ) ) );897 }898 }899 }900 871 } // namespace SymTab 901 872
Note:
See TracChangeset
for help on using the changeset viewer.