From b970aadc0c52ae0485d56e9eb67c219c8f6d7f13 Mon Sep 17 00:00:00 2001 From: Stefan Behnel Date: Wed, 3 Sep 2008 13:24:52 +0200 Subject: [PATCH] fixed error detection on misplaced default except: clause --- Cython/Compiler/Nodes.py | 21 ++++++++++----------- tests/errors/e_exceptclause.pyx | 16 ++++++++++++++++ 2 files changed, 26 insertions(+), 11 deletions(-) create mode 100644 tests/errors/e_exceptclause.pyx diff --git a/Cython/Compiler/Nodes.py b/Cython/Compiler/Nodes.py index 2738fd66..94c852e3 100644 --- a/Cython/Compiler/Nodes.py +++ b/Cython/Compiler/Nodes.py @@ -3538,11 +3538,16 @@ class TryExceptStatNode(StatNode): self.gil_check(env) def analyse_expressions(self, env): - self.body.analyse_expressions(env) self.cleanup_list = env.free_temp_entries[:] + default_clause_seen = 0 for except_clause in self.except_clauses: except_clause.analyse_expressions(env) + if default_clause_seen: + error(except_clause.pos, "default 'except:' must be last") + if not except_clause.pattern: + default_clause_seen = 1 + self.has_default_clause = default_clause_seen if self.else_clause: self.else_clause.analyse_expressions(env) self.gil_check(env) @@ -3579,19 +3584,13 @@ class TryExceptStatNode(StatNode): code.put_goto(try_end_label) code.put_label(our_error_label) code.put_var_xdecrefs_clear(self.cleanup_list) - default_clause_seen = 0 for except_clause in self.except_clauses: - if not except_clause.pattern: - default_clause_seen = 1 - else: - if default_clause_seen: - error(except_clause.pos, "Default except clause not last") except_clause.generate_handling_code(code, except_end_label) - if not default_clause_seen: - code.put_goto(code.error_label) - if code.label_used(except_error_label): - code.put_label(except_error_label) + error_label_used = code.label_used(except_error_label) + if error_label_used or not self.has_default_clause: + if error_label_used: + code.put_label(except_error_label) for var in Naming.exc_save_vars: code.put_xdecref(var, py_object_type) code.put_goto(old_error_label) diff --git a/tests/errors/e_exceptclause.pyx b/tests/errors/e_exceptclause.pyx new file mode 100644 index 00000000..e6acf946 --- /dev/null +++ b/tests/errors/e_exceptclause.pyx @@ -0,0 +1,16 @@ + +try: + raise KeyError +except KeyError: + pass +except: + pass +except: + pass +except AttributeError: + pass + +_ERRORS = u""" + 8:0: default 'except:' must be last +10:0: default 'except:' must be last +""" -- 2.26.2