diff --git a/executable_semantics/BUILD b/executable_semantics/BUILD index 05f4806210ae..8b6c24509c73 100644 --- a/executable_semantics/BUILD +++ b/executable_semantics/BUILD @@ -81,9 +81,7 @@ EXAMPLES = [ "fun6_fail_type", "funptr1", "if1", - # (Temporarily disabled pending - # https://github.com/carbon-language/carbon-lang/issues/311) - # "if2", + "if2", "if3", "match_int_default", "match_int", diff --git a/executable_semantics/interpreter/interpreter.cpp b/executable_semantics/interpreter/interpreter.cpp index 5aa6d30b9b55..5debb33e45aa 100644 --- a/executable_semantics/interpreter/interpreter.cpp +++ b/executable_semantics/interpreter/interpreter.cpp @@ -1177,12 +1177,14 @@ void HandleValue() { // -> { { then_stmt :: C, E, F } :: S, H} frame->todo.Pop(2); frame->todo.Push(MakeStmtAct(stmt->u.if_stmt.then_stmt)); - } else { + } else if (stmt->u.if_stmt.else_stmt) { // { {false :: if ([]) then_stmt else else_stmt :: C, E, F} :: // S, H} // -> { { else_stmt :: C, E, F } :: S, H} frame->todo.Pop(2); frame->todo.Push(MakeStmtAct(stmt->u.if_stmt.else_stmt)); + } else { + frame->todo.Pop(2); } break; case StatementKind::While: diff --git a/executable_semantics/testdata/if2.golden b/executable_semantics/testdata/if2.golden index 456b60a25954..301eed79accb 100644 --- a/executable_semantics/testdata/if2.golden +++ b/executable_semantics/testdata/if2.golden @@ -136,8 +136,26 @@ env: main: fun
, else <1>(false,) ---> { -stack: main{<-1> :: return 0;<-1>} :: top{} +stack: main{return 0;<-1>} :: top{} heap: fun
, env: main: fun
, } ---- step stmt ---> +--- step stmt return 0; ---> +{ +stack: main{0<-1> :: return 0;<0>} :: top{} +heap: fun
, +env: main: fun
, +} +--- step exp 0 ---> +{ +stack: main{0<-1> :: return 0;<0>} :: top{} +heap: fun
, +env: main: fun
, +} +--- handle value 0 with return 0;<1>(0,) ---> +{ +stack: top{0<-1>} +heap: fun
, +env: main: fun
, +} +result: 0