Ignore:
Timestamp:
Jun 2, 2015, 1:42:10 PM (7 years ago)
Author:
Rob Schluntz <rschlunt@…>
Branches:
aaron-thesis, arm-eh, cleanup-dtors, ctor, deferred_resn, demangler, enum, forall-pointer-decay, gc_noraii, jacob/cs343-translation, jenkins-sandbox, master, memory, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, resolv-new, string, with_gc
Children:
d939274
Parents:
2b6c1e0
Message:

fix MLE hack that puts a dangling break statement outside of a case statement in a switch

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/ControlStruct/MLEMutator.cc

    r2b6c1e0 rb2152e7a  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Rob Schluntz
    12 // Last Modified On : Wed May 27 16:19:32 2015
    13 // Update Count     : 44
     12// Last Modified On : Tue Jun 02 13:35:49 2015
     13// Update Count     : 91
    1414//
    1515
     
    154154                Label brkLabel = generator->newLabel();
    155155                enclosingSwitches.push_back( Entry(switchStmt, "", brkLabel) );
    156                 mutateAll( switchStmt->get_branches(), mutator ); {
     156                mutateAll( switchStmt->get_branches(), mutator );
     157                {
    157158                        // check if this is necessary (if there is a break to this point, otherwise do not generate
    158                         std::list<Label> temp; temp.push_back( brkLabel );
    159                         switchStmt->get_branches().push_back( new BranchStmt( temp, Label(""), BranchStmt::Break ) );
     159
     160                        // for the purposes of keeping switch statements uniform (i.e. all statements that are
     161                        // direct children of a switch should be CastStmts), append the exit label + break to the
     162                        // last case statement; create a default case if there are no cases
     163                        std::list< Statement * > &branches = switchStmt->get_branches();
     164                        if ( branches.empty() ) {
     165                                branches.push_back( CaseStmt::makeDefault() );
     166                        }
     167
     168                        if ( CaseStmt * c = dynamic_cast< CaseStmt * >( branches.back() ) ) {
     169                                std::list<Label> temp; temp.push_back( brkLabel );
     170                                c->get_statements().push_back( new BranchStmt( temp, Label(""), BranchStmt::Break ) );
     171                        } else assert(0);
    160172                }
    161173                assert ( enclosingSwitches.back() == switchStmt );
Note: See TracChangeset for help on using the changeset viewer.