diff --git a/Lib/test/test_grammar.py b/Lib/test/test_grammar.py index 435227521e7..d4bcfda0172 100644 --- a/Lib/test/test_grammar.py +++ b/Lib/test/test_grammar.py @@ -572,6 +572,15 @@ hello world while 0: pass else: pass + # Issue1920: "while 0" is optimized away, + # ensure that the "else" clause is still present. + x = 0 + while 0: + x = 1 + else: + x = 2 + self.assertEquals(x, 2) + def testFor(self): # 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] for i in 1, 2, 3: pass diff --git a/Python/compile.c b/Python/compile.c index c77091ea25a..aee7bda9ae5 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -1598,8 +1598,11 @@ compiler_while(struct compiler *c, stmt_ty s) basicblock *loop, *orelse, *end, *anchor = NULL; int constant = expr_constant(s->v.While.test); - if (constant == 0) + if (constant == 0) { + if (s->v.While.orelse) + VISIT_SEQ(c, stmt, s->v.While.orelse); return 1; + } loop = compiler_new_block(c); end = compiler_new_block(c); if (constant == -1) {