- Timestamp:
- Sep 7, 2023, 10:05:33 AM (2 years ago)
- Branches:
- master
- Children:
- 0f8b1a7
- Parents:
- 79b05224 (diff), 416b443 (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
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
src/ControlStruct/MultiLevelExit.cpp
r79b05224 r154672d 10 10 // Created On : Mon Nov 1 13:48:00 2021 11 11 // Last Modified By : Andrew Beach 12 // Last Modified On : Mon Mar 28 9:42:00 202213 // Update Count : 3 412 // Last Modified On : Wed Sep 6 12:00:00 2023 13 // Update Count : 35 14 14 // 15 15 … … 18 18 #include "AST/Pass.hpp" 19 19 #include "AST/Stmt.hpp" 20 #include "Common/CodeLocationTools.hpp"21 20 #include "LabelGeneratorNew.hpp" 22 21 … … 26 25 27 26 namespace ControlStruct { 27 28 namespace { 29 28 30 class Entry { 29 31 public: … … 35 37 bool used = false; 36 38 Target( const Label & label ) : label( label ) {} 37 Target() : label( CodeLocation() ) {}39 Target() : label( CodeLocation(), "" ) {} 38 40 }; 39 41 Target firstTarget; … … 524 526 // if continue is used insert a continue label into the back of the body of the loop 525 527 if ( entry.isContUsed() ) { 526 CompoundStmt * new_body = new CompoundStmt( body->location );527 // {}528 new_body->kids.push_back( body );529 528 // { 530 529 // body 530 // ContinueLabel: ; 531 531 // } 532 new_body->kids.push_back( 533 labelledNullStmt( body->location, entry.useContExit() ) ); 534 // { 535 // body 536 // ContinueLabel: {} 537 // } 538 return new_body; 532 return new CompoundStmt( body->location, { 533 body, 534 labelledNullStmt( body->location, entry.useContExit() ), 535 } ); 539 536 } 540 537 … … 620 617 } 621 618 619 } // namespace 620 622 621 const CompoundStmt * multiLevelExitUpdate( 623 const CompoundStmt * stmt, 624 const LabelToStmt & labelTable ) { 622 const CompoundStmt * stmt, const LabelToStmt & labelTable ) { 625 623 // Must start in the body, so FunctionDecls can be a stopping point. 626 624 Pass<MultiLevelExitCore> visitor( labelTable ); 627 const CompoundStmt * ret = stmt->accept( visitor ); 628 // There are some unset code locations slipping in, possibly by Labels. 629 const Node * node = localFillCodeLocations( ret->location, ret ); 630 return strict_dynamic_cast<const CompoundStmt *>( node ); 631 } 625 return stmt->accept( visitor ); 626 } 627 632 628 } // namespace ControlStruct 633 629 -
src/ResolvExpr/ResolveTypeof.cc
r79b05224 r154672d 237 237 // The designator I want to replace 238 238 const ast::Expr * designator = des->designators.at(0); 239 239 // Stupid flag variable for development, to be removed 240 bool mutated = false; 240 241 if ( const ast::NameExpr * designatorName = dynamic_cast<const ast::NameExpr *>(designator) ) { 241 242 auto candidates = context.symtab.lookupId(designatorName->name); … … 244 245 if ( candidates.size() != 1 ) return mutDecl; 245 246 auto candidate = candidates.at(0); 246 if ( const ast::EnumInstType * enumInst = dynamic_cast<const ast::EnumInstType *>(candidate.id->get_type()) 247 if ( const ast::EnumInstType * enumInst = dynamic_cast<const ast::EnumInstType *>(candidate.id->get_type())) { 247 248 // determine that is an enumInst, swap it with its const value 248 249 assert( candidates.size() == 1 ); … … 250 251 // Need to iterate over all enum value to find the initializer to swap 251 252 for ( size_t m = 0; m < baseEnum->members.size(); ++m ) { 253 const ast::ObjectDecl * mem = baseEnum->members.at(m).as<const ast::ObjectDecl>(); 252 254 if ( baseEnum->members.at(m)->name == designatorName->name ) { 253 const ast::ObjectDecl * mem = baseEnum->members.at(m).as<const ast::ObjectDecl>();254 255 assert(mem); 255 const ast::ConstantExpr * enumAsInit = ast::ConstantExpr::from_int(newDesination->location, m); 256 newDesination->designators.push_back( enumAsInit ); 256 if ( mem->init ) { 257 const ast::SingleInit * memInit = mem->init.as<const ast::SingleInit>(); 258 ast::Expr * initValue = shallowCopy( memInit->value.get() ); 259 newDesination->designators.push_back( initValue ); 260 mutated = true; 261 } 262 break; 257 263 } 258 }259 if ( newDesination->designators.size() == 0 ) {260 SemanticError(des->location, "Resolution Error: Resolving array designation as Enum Instance value, but cannot find a desgination value");261 264 } 262 265 } else { … … 266 269 newDesination->designators.push_back( des->designators.at(0) ); 267 270 } 268 mutListInit = ast::mutate_field_index(mutListInit, &ast::ListInit::designations, k, newDesination); 271 if ( mutated ) { 272 mutListInit = ast::mutate_field_index(mutListInit, &ast::ListInit::designations, k, newDesination); 273 } 269 274 } 270 275 } -
src/ResolvExpr/Resolver.cc
r79b05224 r154672d 988 988 } 989 989 }; 990 991 struct ResolveDesignators_new final : public ast::WithShortCircuiting { 992 ResolveContext& context; 993 bool result = false; 994 995 ResolveDesignators_new( ResolveContext& _context ): context{_context} {}; 996 997 void previsit( const ast::Node * ) { 998 // short circuit if we already know there are designations 999 if ( result ) visit_children = false; 1000 } 1001 1002 void previsit( const ast::Designation * des ) { 1003 if ( result ) visit_children = false; 1004 else if ( ! des->designators.empty() ) { 1005 if ( (des->designators.size() == 1) ) { 1006 const ast::Expr * designator = des->designators.at(0); 1007 if ( const ast::NameExpr * designatorName = dynamic_cast<const ast::NameExpr *>(designator) ) { 1008 auto candidates = context.symtab.lookupId(designatorName->name); 1009 for ( auto candidate : candidates ) { 1010 if ( dynamic_cast<const ast::EnumInstType *>(candidate.id->get_type()) ) { 1011 result = true; 1012 break; 1013 } 1014 } 1015 } 1016 } 1017 visit_children = false; 1018 } 1019 } 1020 }; 990 1021 } // anonymous namespace 991 1022 /// Check if this expression is or includes a deleted expression … … 1507 1538 if ( InitTweak::tryConstruct( mutDecl ) && ( managedTypes.isManaged( mutDecl ) || ((! isInFunction() || mutDecl->storage.is_static ) && ! InitTweak::isConstExpr( mutDecl->init ) ) ) ) { 1508 1539 // constructed objects cannot be designated 1509 // if ( InitTweak::isDesignated( mutDecl->init ) ) SemanticError( mutDecl, "Cannot include designations in the initializer for a managed Object. If this is really what you want, then initialize with @=.\n" );1510 1540 if ( InitTweak::isDesignated( mutDecl->init ) ) { 1511 SemanticError( mutDecl, "Cannot include designations in the initializer for a managed Object. If this is really what you want, then initialize with @=.\n" ); 1541 ast::Pass<ResolveDesignators_new> res( context ); 1542 maybe_accept( mutDecl->init.get(), res ); 1543 if ( !res.core.result ) { 1544 SemanticError( mutDecl, "Cannot include designations in the initializer for a managed Object. If this is really what you want, then initialize with @=.\n" ); 1545 } 1512 1546 } 1513 1547 // constructed objects should not have initializers nested too deeply
Note:
See TracChangeset
for help on using the changeset viewer.