Changeset 32b8144
- Timestamp:
- Feb 17, 2017, 2:20:25 PM (8 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, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
- Children:
- 11f95ee
- Parents:
- e6512c8
- Location:
- src
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/AlternativeFinder.cc
re6512c8 r32b8144 1044 1044 1045 1045 void AlternativeFinder::visit( ConditionalExpr *conditionalExpr ) { 1046 // find alternatives for condition 1046 1047 AlternativeFinder firstFinder( indexer, env ); 1047 1048 firstFinder.findWithAdjustment( conditionalExpr->get_arg1() ); 1048 1049 for ( AltList::const_iterator first = firstFinder.alternatives.begin(); first != firstFinder.alternatives.end(); ++first ) { 1050 // find alternatives for true expression 1049 1051 AlternativeFinder secondFinder( indexer, first->env ); 1050 1052 secondFinder.findWithAdjustment( conditionalExpr->get_arg2() ); 1051 1053 for ( AltList::const_iterator second = secondFinder.alternatives.begin(); second != secondFinder.alternatives.end(); ++second ) { 1054 // find alterantives for false expression 1052 1055 AlternativeFinder thirdFinder( indexer, second->env ); 1053 1056 thirdFinder.findWithAdjustment( conditionalExpr->get_arg3() ); 1054 1057 for ( AltList::const_iterator third = thirdFinder.alternatives.begin(); third != thirdFinder.alternatives.end(); ++third ) { 1058 // unify true and false types, then infer parameters to produce new alternatives 1055 1059 OpenVarSet openVars; 1056 1060 AssertionSet needAssertions, haveAssertions; … … 1079 1083 } 1080 1084 1085 void AlternativeFinder::visit( RangeExpr * rangeExpr ) { 1086 // resolve low and high, accept alternatives whose low and high types unify 1087 AlternativeFinder firstFinder( indexer, env ); 1088 firstFinder.findWithAdjustment( rangeExpr->get_low() ); 1089 for ( AltList::const_iterator first = firstFinder.alternatives.begin(); first != firstFinder.alternatives.end(); ++first ) { 1090 AlternativeFinder secondFinder( indexer, first->env ); 1091 secondFinder.findWithAdjustment( rangeExpr->get_high() ); 1092 for ( AltList::const_iterator second = secondFinder.alternatives.begin(); second != secondFinder.alternatives.end(); ++second ) { 1093 OpenVarSet openVars; 1094 AssertionSet needAssertions, haveAssertions; 1095 Alternative newAlt( 0, second->env, first->cost + second->cost ); 1096 Type* commonType = nullptr; 1097 if ( unify( first->expr->get_result(), second->expr->get_result(), newAlt.env, needAssertions, haveAssertions, openVars, indexer, commonType ) ) { 1098 RangeExpr *newExpr = new RangeExpr( first->expr->clone(), second->expr->clone() ); 1099 newExpr->set_result( commonType ? commonType : first->expr->get_result()->clone() ); 1100 newAlt.expr = newExpr; 1101 inferParameters( needAssertions, haveAssertions, newAlt, openVars, back_inserter( alternatives ) ); 1102 } // if 1103 } // for 1104 } // for 1105 } 1106 1081 1107 void AlternativeFinder::visit( UntypedTupleExpr *tupleExpr ) { 1082 1108 std::list< AlternativeFinder > subExprAlternatives; -
src/ResolvExpr/Resolver.cc
re6512c8 r32b8144 302 302 } 303 303 304 template< typename SwitchClass >305 void handleSwitchStmt( SwitchClass *switchStmt, SymTab::Indexer &visitor ) {304 void Resolver::visit( SwitchStmt *switchStmt ) { 305 ValueGuard< Type * > oldInitContext( initContext ); 306 306 Expression *newExpr; 307 newExpr = findIntegralExpression( switchStmt->get_condition(), visitor);307 newExpr = findIntegralExpression( switchStmt->get_condition(), *this ); 308 308 delete switchStmt->get_condition(); 309 309 switchStmt->set_condition( newExpr ); 310 310 311 visitor.Visitor::visit( switchStmt ); 312 } 313 314 void Resolver::visit( SwitchStmt *switchStmt ) { 315 handleSwitchStmt( switchStmt, *this ); 311 initContext = newExpr->get_result(); 312 Parent::visit( switchStmt ); 316 313 } 317 314 318 315 void Resolver::visit( CaseStmt *caseStmt ) { 316 if ( caseStmt->get_condition() ) { 317 assert( initContext ); 318 CastExpr * castExpr = new CastExpr( caseStmt->get_condition(), initContext->clone() ); 319 Expression * newExpr = findSingleExpression( castExpr, *this ); 320 castExpr = safe_dynamic_cast< CastExpr * >( newExpr ); 321 caseStmt->set_condition( castExpr->get_arg() ); 322 castExpr->set_arg( nullptr ); 323 delete castExpr; 324 } 319 325 Parent::visit( caseStmt ); 320 326 } -
src/tests/dtor-early-exit.c
re6512c8 r32b8144 1 // 1 // 2 2 // Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo 3 3 // 4 4 // The contents of this file are covered under the licence agreement in the 5 5 // file "LICENCE" distributed with Cforall. 6 // 7 // dtor-early-exit.c -- 8 // 6 // 7 // dtor-early-exit.c -- 8 // 9 9 // Author : Rob Schluntz 10 10 // Created On : Wed Aug 17 08:26:25 2016 … … 12 12 // Last Modified On : Wed Aug 17 08:29:37 2016 13 13 // Update Count : 2 14 // 14 // 15 15 16 16 #include <fstream> … … 213 213 // S_G-S_L = {} 214 214 } 215 #ifdef ERR2 215 216 // S_G = {} 216 #ifdef ERR2217 217 if (i == 5) goto L2; // this is an error in g++ because it skips initialization of y, x 218 218 // S_L-S_G = { y, x } => non-empty, so error
Note: See TracChangeset
for help on using the changeset viewer.