Changeset 3bbd012 for src/SymTab
- Timestamp:
- Jul 31, 2018, 2:43:04 PM (6 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, no_list, persistent-indexer, pthread-emulation, qualifiedEnum
- Children:
- 642bc83
- Parents:
- d1e0979 (diff), 04e367c (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/SymTab/Validate.cc
rd1e0979 r3bbd012 61 61 #include "Parser/LinkageSpec.h" // for C 62 62 #include "ResolvExpr/typeops.h" // for typesCompatible 63 #include "ResolvExpr/Resolver.h" // for findSingleExpression 63 64 #include "SymTab/Autogen.h" // for SizeType 64 65 #include "SynTree/Attribute.h" // for noAttributes, Attribute … … 72 73 #include "SynTree/TypeSubstitution.h" // for TypeSubstitution 73 74 #include "SynTree/Visitor.h" // for Visitor 75 #include "Validate/HandleAttributes.h" // for handleAttributes 74 76 75 77 class CompoundStmt; … … 247 249 }; 248 250 249 struct ArrayLength {251 struct ArrayLength : public WithIndexer { 250 252 /// for array types without an explicit length, compute the length and store it so that it 251 253 /// is known to the rest of the phases. For example, … … 258 260 259 261 void previsit( ObjectDecl * objDecl ); 262 void previsit( ArrayType * arrayType ); 260 263 }; 261 264 … … 312 315 acceptAll( translationUnit, finder ); // xxx - remove this pass soon 313 316 mutateAll( translationUnit, labelAddrFixer ); 317 Validate::handleAttributes( translationUnit ); 314 318 } 315 319 … … 1232 1236 void ArrayLength::previsit( ObjectDecl * objDecl ) { 1233 1237 if ( ArrayType * at = dynamic_cast< ArrayType * >( objDecl->type ) ) { 1234 if ( at-> get_dimension()) return;1238 if ( at->dimension ) return; 1235 1239 if ( ListInit * init = dynamic_cast< ListInit * >( objDecl->init ) ) { 1236 at->set_dimension( new ConstantExpr( Constant::from_ulong( init->initializers.size() ) ) ); 1237 } 1240 at->dimension = new ConstantExpr( Constant::from_ulong( init->initializers.size() ) ); 1241 } 1242 } 1243 } 1244 1245 void ArrayLength::previsit( ArrayType * type ) { 1246 if ( type->dimension ) { 1247 // need to resolve array dimensions early so that constructor code can correctly determine 1248 // if a type is a VLA (and hence whether its elements need to be constructed) 1249 ResolvExpr::findSingleExpression( type->dimension, SymTab::SizeType->clone(), indexer ); 1250 1251 // must re-evaluate whether a type is a VLA, now that more information is available 1252 // (e.g. the dimension may have been an enumerator, which was unknown prior to this step) 1253 type->isVarLen = ! InitTweak::isConstExpr( type->dimension ); 1238 1254 } 1239 1255 }
Note: See TracChangeset
for help on using the changeset viewer.