Changeset 90a8125 for src/ControlStruct
- Timestamp:
- Jun 3, 2022, 3:10:01 PM (3 years ago)
- Branches:
- ADT, ast-experimental, master, pthread-emulation, qualifiedEnum
- Children:
- 7affcda
- Parents:
- bf0263c (diff), fc134a48 (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. - Location:
- src/ControlStruct
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
src/ControlStruct/ExceptDecl.cc
rbf0263c r90a8125 9 9 // Author : Henry Xue 10 10 // Created On : Tue Jul 20 04:10:50 2021 11 // Last Modified By : Henry Xue12 // Last Modified On : Tue Aug 03 10:42:26 202113 // Update Count : 411 // Last Modified By : Andrew Beach 12 // Last Modified On : Wed May 25 16:43:00 2022 13 // Update Count : 5 14 14 // 15 15 … … 39 39 } 40 40 41 TypeInstType * makeExceptInstType(42 const std::string & exceptionName, 43 const std::list< Expression *> & parameters 44 ) { 45 TypeInstType * exceptInstType = new TypeInstType(41 StructInstType * makeExceptInstType( 42 const std::string & exceptionName, 43 const std::list< Expression *> & parameters 44 ) { 45 StructInstType * exceptInstType = new StructInstType( 46 46 noQualifiers, 47 exceptionName, 48 false 47 exceptionName 49 48 ); 50 49 cloneAll( parameters, exceptInstType->parameters ); … … 151 150 nullptr, 152 151 new PointerType( noQualifiers, 153 new TypeInstType( Type::Const, "__cfavir_type_info", false) ),152 new StructInstType( Type::Const, "__cfavir_type_info" ) ), 154 153 nullptr 155 154 ) ); … … 257 256 const std::string & exceptionName, 258 257 const std::list< TypeDecl *> & forallClause, 259 const std::list< Expression *> & parameters, 258 const std::list< Expression *> & parameters, 260 259 const std::list< Declaration *> & members 261 260 ) { … … 302 301 ObjectDecl * ehmExternVtable( 303 302 const std::string & exceptionName, 304 const std::list< Expression *> & parameters, 303 const std::list< Expression *> & parameters, 305 304 const std::string & tableName 306 305 ) { … … 457 456 } 458 457 458 class VTableCore : public WithDeclsToAdd { 459 public: 460 // Remove any remaining vtable type nodes in the tree. 461 Type * postmutate( VTableType * vtableType ); 462 }; 463 464 Type * VTableCore::postmutate( VTableType * vtableType ) { 465 auto inst = strict_dynamic_cast<ReferenceToType *>( vtableType->base ); 466 467 std::string vtableName = Virtual::vtableTypeName( inst->name ); 468 StructInstType * newType = new StructInstType( noQualifiers, vtableName ); 469 cloneAll( inst->parameters, newType->parameters ); 470 471 delete vtableType; 472 return newType; 473 } 474 459 475 void translateExcept( std::list< Declaration *> & translationUnit ) { 460 476 PassVisitor<ExceptDeclCore> translator; 461 477 mutateAll( translationUnit, translator ); 462 } 463 464 } 478 PassVisitor<VTableCore> typeTranslator; 479 mutateAll( translationUnit, typeTranslator ); 480 } 481 482 } -
src/ControlStruct/MultiLevelExit.cpp
rbf0263c r90a8125 18 18 #include "AST/Pass.hpp" 19 19 #include "AST/Stmt.hpp" 20 #include "Common/CodeLocationTools.hpp" 20 21 #include "LabelGeneratorNew.hpp" 21 22 … … 228 229 // Labels on different stmts require different approaches to access 229 230 switch ( stmt->kind ) { 230 231 case BranchStmt::Goto: 231 232 return stmt; 232 233 234 235 236 237 238 239 240 233 case BranchStmt::Continue: 234 case BranchStmt::Break: { 235 bool isContinue = stmt->kind == BranchStmt::Continue; 236 // Handle unlabeled break and continue. 237 if ( stmt->target.empty() ) { 238 if ( isContinue ) { 239 targetEntry = findEnclosingControlStructure( isContinueTarget ); 240 } else { 241 if ( enclosing_control_structures.empty() ) { 241 242 SemanticError( stmt->location, 242 243 "'break' outside a loop, 'switch', or labelled block" ); 243 244 245 246 247 248 249 250 244 } 245 targetEntry = findEnclosingControlStructure( isBreakTarget ); 246 } 247 // Handle labeled break and continue. 248 } else { 249 // Lookup label in table to find attached control structure. 250 targetEntry = findEnclosingControlStructure( 251 [ targetStmt = target_table.at(stmt->target) ](auto entry){ 251 252 return entry.stmt == targetStmt; 252 253 254 255 256 253 } ); 254 } 255 // Ensure that selected target is valid. 256 if ( targetEntry == enclosing_control_structures.rend() || ( isContinue && ! isContinueTarget( *targetEntry ) ) ) { 257 SemanticError( stmt->location, toString( (isContinue ? "'continue'" : "'break'"), 257 258 " target must be an enclosing ", (isContinue ? "loop: " : "control structure: "), 258 259 stmt->originalTarget ) ); 259 260 261 262 263 264 265 266 267 268 269 270 271 272 260 } 261 break; 262 } 263 // handle fallthrough in case/switch stmts 264 case BranchStmt::FallThrough: { 265 targetEntry = findEnclosingControlStructure( isFallthroughTarget ); 266 // Check that target is valid. 267 if ( targetEntry == enclosing_control_structures.rend() ) { 268 SemanticError( stmt->location, "'fallthrough' must be enclosed in a 'switch' or 'choose'" ); 269 } 270 if ( ! stmt->target.empty() ) { 271 // Labelled fallthrough: target must be a valid fallthough label. 272 if ( ! fallthrough_labels.count( stmt->target ) ) { 273 SemanticError( stmt->location, toString( "'fallthrough' target must be a later case statement: ", 273 274 stmt->originalTarget ) ); 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 275 } 276 return new BranchStmt( stmt->location, BranchStmt::Goto, stmt->originalTarget ); 277 } 278 break; 279 } 280 case BranchStmt::FallThroughDefault: { 281 targetEntry = findEnclosingControlStructure( isFallthroughDefaultTarget ); 282 283 // Check if in switch or choose statement. 284 if ( targetEntry == enclosing_control_structures.rend() ) { 285 SemanticError( stmt->location, "'fallthrough' must be enclosed in a 'switch' or 'choose'" ); 286 } 287 288 // Check if switch or choose has default clause. 289 auto switchStmt = strict_dynamic_cast< const SwitchStmt * >( targetEntry->stmt ); 290 bool foundDefault = false; 291 for ( auto caseStmt : switchStmt->cases ) { 292 if ( caseStmt->isDefault() ) { 293 foundDefault = true; 294 break; 295 } 296 } 297 if ( ! foundDefault ) { 298 SemanticError( stmt->location, "'fallthrough default' must be enclosed in a 'switch' or 'choose'" 299 "control structure with a 'default' clause" ); 300 } 301 break; 302 } 303 default: 303 304 assert( false ); 304 305 } … … 307 308 Label exitLabel( CodeLocation(), "" ); 308 309 switch ( stmt->kind ) { 309 310 case BranchStmt::Break: 310 311 assert( ! targetEntry->useBreakExit().empty() ); 311 312 exitLabel = targetEntry->useBreakExit(); 312 313 break; 313 314 case BranchStmt::Continue: 314 315 assert( ! targetEntry->useContExit().empty() ); 315 316 exitLabel = targetEntry->useContExit(); 316 317 break; 317 318 case BranchStmt::FallThrough: 318 319 assert( ! targetEntry->useFallExit().empty() ); 319 320 exitLabel = targetEntry->useFallExit(); 320 321 break; 321 322 case BranchStmt::FallThroughDefault: 322 323 assert( ! targetEntry->useFallDefaultExit().empty() ); 323 324 exitLabel = targetEntry->useFallDefaultExit(); … … 327 328 } 328 329 break; 329 330 default: 330 331 assert(0); 331 332 } … … 588 589 } 589 590 591 ptr<Stmt> else_stmt = nullptr; 592 Stmt * loop_kid = nullptr; 593 // check if loop node and if so add else clause if it exists 594 const WhileDoStmt * whilePtr = dynamic_cast<const WhileDoStmt *>(kid.get()); 595 if ( whilePtr && whilePtr->else_) { 596 else_stmt = whilePtr->else_; 597 WhileDoStmt * mutate_ptr = mutate(whilePtr); 598 mutate_ptr->else_ = nullptr; 599 loop_kid = mutate_ptr; 600 } 601 const ForStmt * forPtr = dynamic_cast<const ForStmt *>(kid.get()); 602 if ( forPtr && forPtr->else_) { 603 else_stmt = forPtr->else_; 604 ForStmt * mutate_ptr = mutate(forPtr); 605 mutate_ptr->else_ = nullptr; 606 loop_kid = mutate_ptr; 607 } 608 590 609 try { 591 ret.push_back( kid->accept( *visitor ) ); 610 if (else_stmt) ret.push_back( loop_kid->accept( *visitor ) ); 611 else ret.push_back( kid->accept( *visitor ) ); 592 612 } catch ( SemanticErrorException & e ) { 593 613 errors.append( e ); 594 614 } 595 615 596 // check if loop node and if so add else clause if it exists 597 const WhileDoStmt * whilePtr = dynamic_cast<const WhileDoStmt *>(kid.get()); 598 if ( whilePtr && whilePtr->else_) ret.push_back(whilePtr->else_); 599 const ForStmt * forPtr = dynamic_cast<const ForStmt *>(kid.get()); 600 if ( forPtr && forPtr->else_) ret.push_back(forPtr->else_); 616 if (else_stmt) ret.push_back(else_stmt); 601 617 602 618 if ( ! break_label.empty() ) { … … 618 634 Pass<MultiLevelExitCore> visitor( labelTable ); 619 635 const CompoundStmt * ret = stmt->accept( visitor ); 620 return ret; 636 // There are some unset code locations slipping in, possibly by Labels. 637 const Node * node = localFillCodeLocations( ret->location, ret ); 638 return strict_dynamic_cast<const CompoundStmt *>( node ); 621 639 } 622 640 } // namespace ControlStruct -
src/ControlStruct/module.mk
rbf0263c r90a8125 10 10 ## Author : Richard C. Bilson 11 11 ## Created On : Mon Jun 1 17:49:17 2015 12 ## Last Modified By : Peter A. Buhr13 ## Last Modified On : Sat Jan 29 12:04:19202214 ## Update Count : 712 ## Last Modified By : Andrew Beach 13 ## Last Modified On : Tue May 17 14:30:00 2022 14 ## Update Count : 8 15 15 ############################################################################### 16 16 17 SRC _CONTROLSTRUCT= \17 SRC += \ 18 18 ControlStruct/ExceptDecl.cc \ 19 19 ControlStruct/ExceptDecl.h \ 20 ControlStruct/ExceptTranslateNew.cpp \ 21 ControlStruct/ExceptTranslate.cc \ 22 ControlStruct/ExceptTranslate.h \ 20 23 ControlStruct/FixLabels.cpp \ 21 24 ControlStruct/FixLabels.hpp \ … … 37 40 ControlStruct/Mutate.h 38 41 39 SRC += $(SRC_CONTROLSTRUCT) \40 ControlStruct/ExceptTranslateNew.cpp \41 ControlStruct/ExceptTranslate.cc \42 ControlStruct/ExceptTranslate.h43 44 SRCDEMANGLE += $(SRC_CONTROLSTRUCT)45
Note:
See TracChangeset
for help on using the changeset viewer.