Changes in src/SymTab/Validate.cc [9490621:a488783]
- File:
-
- 1 edited
-
src/SymTab/Validate.cc (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/SymTab/Validate.cc
r9490621 ra488783 194 194 }; 195 195 196 // These structs are the sub-sub-passes of ForallPointerDecay_old.197 198 struct TraitExpander_old final {199 void previsit( FunctionType * );200 void previsit( StructDecl * );201 void previsit( UnionDecl * );202 };203 204 struct AssertionFixer_old final {205 void previsit( FunctionType * );206 void previsit( StructDecl * );207 void previsit( UnionDecl * );208 };209 210 struct CheckOperatorTypes_old final {211 void previsit( ObjectDecl * );212 };213 214 struct FixUniqueIds_old final {215 void previsit( DeclarationWithType * );216 };217 218 196 struct ReturnChecker : public WithGuards { 219 197 /// Checks that return statements return nothing if their return type is void … … 408 386 409 387 void validate_D( std::list< Declaration * > & translationUnit ) { 388 PassVisitor<ForallPointerDecay_old> fpd; 410 389 { 411 390 Stats::Heap::newPass("validate-D"); … … 415 394 }); 416 395 Stats::Time::TimeBlock("Forall Pointer Decay", [&]() { 417 decayForallPointers( translationUnit); // must happen before autogenerateRoutines, after Concurrency::applyKeywords because uniqueIds must be set on declaration before resolution396 acceptAll( translationUnit, fpd ); // must happen before autogenerateRoutines, after Concurrency::applyKeywords because uniqueIds must be set on declaration before resolution 418 397 }); 419 398 Stats::Time::TimeBlock("Hoist Control Declarations", [&]() { … … 475 454 476 455 void decayForallPointers( std::list< Declaration * > & translationUnit ) { 477 PassVisitor<TraitExpander_old> te; 478 acceptAll( translationUnit, te ); 479 PassVisitor<AssertionFixer_old> af; 480 acceptAll( translationUnit, af ); 481 PassVisitor<CheckOperatorTypes_old> cot; 482 acceptAll( translationUnit, cot ); 483 PassVisitor<FixUniqueIds_old> fui; 484 acceptAll( translationUnit, fui ); 485 } 486 487 void decayForallPointersA( std::list< Declaration * > & translationUnit ) { 488 PassVisitor<TraitExpander_old> te; 489 acceptAll( translationUnit, te ); 490 } 491 void decayForallPointersB( std::list< Declaration * > & translationUnit ) { 492 PassVisitor<AssertionFixer_old> af; 493 acceptAll( translationUnit, af ); 494 } 495 void decayForallPointersC( std::list< Declaration * > & translationUnit ) { 496 PassVisitor<CheckOperatorTypes_old> cot; 497 acceptAll( translationUnit, cot ); 498 } 499 void decayForallPointersD( std::list< Declaration * > & translationUnit ) { 500 PassVisitor<FixUniqueIds_old> fui; 501 acceptAll( translationUnit, fui ); 456 PassVisitor<ForallPointerDecay_old> fpd; 457 acceptAll( translationUnit, fpd ); 502 458 } 503 459 … … 514 470 PassVisitor<EnumAndPointerDecay_old> epc; 515 471 PassVisitor<LinkReferenceToTypes_old> lrt( indexer ); 516 PassVisitor<TraitExpander_old> te; 517 PassVisitor<AssertionFixer_old> af; 518 PassVisitor<CheckOperatorTypes_old> cot; 519 PassVisitor<FixUniqueIds_old> fui; 472 PassVisitor<ForallPointerDecay_old> fpd; 520 473 type->accept( epc ); 521 474 type->accept( lrt ); 522 type->accept( te ); 523 type->accept( af ); 524 type->accept( cot ); 525 type->accept( fui ); 475 type->accept( fpd ); 526 476 } 527 477 … … 1022 972 } 1023 973 1024 /// Replace all traits in assertion lists with their assertions.1025 void expandTraits( std::list< TypeDecl * > & forall ) {1026 for ( TypeDecl * type : forall ) {1027 std::list< DeclarationWithType * > asserts;1028 asserts.splice( asserts.end(), type->assertions );1029 // expand trait instances into their members1030 for ( DeclarationWithType * assertion : asserts ) {1031 if ( TraitInstType * traitInst = dynamic_cast< TraitInstType * >( assertion->get_type() ) ) {1032 // expand trait instance into all of its members1033 expandAssertions( traitInst, back_inserter( type->assertions ) );1034 delete traitInst;1035 } else {1036 // pass other assertions through1037 type->assertions.push_back( assertion );1038 } // if1039 } // for1040 }1041 }1042 1043 /// Fix each function in the assertion list and check for invalid void type.1044 void fixAssertions(1045 std::list< TypeDecl * > & forall, BaseSyntaxNode * node ) {1046 for ( TypeDecl * type : forall ) {1047 for ( DeclarationWithType *& assertion : type->assertions ) {1048 bool isVoid = fixFunction( assertion );1049 if ( isVoid ) {1050 SemanticError( node, "invalid type void in assertion of function " );1051 } // if1052 } // for1053 }1054 }1055 1056 974 void ForallPointerDecay_old::previsit( ObjectDecl * object ) { 1057 975 // ensure that operator names only apply to functions or function pointers … … 1076 994 void ForallPointerDecay_old::previsit( UnionDecl * aggrDecl ) { 1077 995 forallFixer( aggrDecl->parameters, aggrDecl ); 1078 }1079 1080 void TraitExpander_old::previsit( FunctionType * ftype ) {1081 expandTraits( ftype->forall );1082 }1083 1084 void TraitExpander_old::previsit( StructDecl * aggrDecl ) {1085 expandTraits( aggrDecl->parameters );1086 }1087 1088 void TraitExpander_old::previsit( UnionDecl * aggrDecl ) {1089 expandTraits( aggrDecl->parameters );1090 }1091 1092 void AssertionFixer_old::previsit( FunctionType * ftype ) {1093 fixAssertions( ftype->forall, ftype );1094 }1095 1096 void AssertionFixer_old::previsit( StructDecl * aggrDecl ) {1097 fixAssertions( aggrDecl->parameters, aggrDecl );1098 }1099 1100 void AssertionFixer_old::previsit( UnionDecl * aggrDecl ) {1101 fixAssertions( aggrDecl->parameters, aggrDecl );1102 }1103 1104 void CheckOperatorTypes_old::previsit( ObjectDecl * object ) {1105 // ensure that operator names only apply to functions or function pointers1106 if ( CodeGen::isOperator( object->name ) && ! dynamic_cast< FunctionType * >( object->type->stripDeclarator() ) ) {1107 SemanticError( object->location, toCString( "operator ", object->name.c_str(), " is not a function or function pointer." ) );1108 }1109 }1110 1111 void FixUniqueIds_old::previsit( DeclarationWithType * decl ) {1112 decl->fixUniqueId();1113 996 } 1114 997
Note:
See TracChangeset
for help on using the changeset viewer.