Changeset 455a7d5 for src/SymTab/Validate.cc
- Timestamp:
- Aug 9, 2018, 6:35:02 PM (7 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:
- ea5b7d6
- Parents:
- fb975a50 (diff), 0c827019 (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
-
src/SymTab/Validate.cc (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/SymTab/Validate.cc
rfb975a50 r455a7d5 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 … … 734 738 forwardEnums.erase( fwds ); 735 739 } // if 740 741 for ( Declaration * member : enumDecl->members ) { 742 ObjectDecl * field = strict_dynamic_cast<ObjectDecl *>( member ); 743 if ( field->init ) { 744 // need to resolve enumerator initializers early so that other passes that determine if an expression is constexpr have the appropriate information. 745 SingleInit * init = strict_dynamic_cast<SingleInit *>( field->init ); 746 ResolvExpr::findSingleExpression( init->value, new BasicType( Type::Qualifiers(), BasicType::SignedInt ), indexer ); 747 } 748 } 736 749 } // if 737 750 } … … 1232 1245 void ArrayLength::previsit( ObjectDecl * objDecl ) { 1233 1246 if ( ArrayType * at = dynamic_cast< ArrayType * >( objDecl->type ) ) { 1234 if ( at-> get_dimension()) return;1247 if ( at->dimension ) return; 1235 1248 if ( ListInit * init = dynamic_cast< ListInit * >( objDecl->init ) ) { 1236 at->set_dimension( new ConstantExpr( Constant::from_ulong( init->initializers.size() ) ) ); 1237 } 1249 at->dimension = new ConstantExpr( Constant::from_ulong( init->initializers.size() ) ); 1250 } 1251 } 1252 } 1253 1254 void ArrayLength::previsit( ArrayType * type ) { 1255 if ( type->dimension ) { 1256 // need to resolve array dimensions early so that constructor code can correctly determine 1257 // if a type is a VLA (and hence whether its elements need to be constructed) 1258 ResolvExpr::findSingleExpression( type->dimension, SymTab::SizeType->clone(), indexer ); 1259 1260 // must re-evaluate whether a type is a VLA, now that more information is available 1261 // (e.g. the dimension may have been an enumerator, which was unknown prior to this step) 1262 type->isVarLen = ! InitTweak::isConstExpr( type->dimension ); 1238 1263 } 1239 1264 }
Note:
See TracChangeset
for help on using the changeset viewer.