From 3ca596cd208845b11fe2fab948753ca9892c0c45 Mon Sep 17 00:00:00 2001 From: c42f Date: Mon, 28 Nov 2022 15:31:26 +1000 Subject: [PATCH] Make try without catch/finally an error --- src/parser.jl | 6 +++++- test/parser.jl | 3 ++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/parser.jl b/src/parser.jl index bc3877e7..e3c474b7 100644 --- a/src/parser.jl +++ b/src/parser.jl @@ -2213,7 +2213,7 @@ function parse_try(ps) bump(ps, TRIVIA_FLAG) parse_block(ps) if !has_catch - #v1.8: try else end ==> (try (block) false false (error (block)) false) + #v1.8: try else x finally y end ==> (try (block) false false (error (block x)) (block y)) emit(ps, else_mark, K"error", error="Expected `catch` before `else`") end #v1.7: try catch ; else end ==> (try (block) false (block) (error (block)) false) @@ -2241,6 +2241,10 @@ function parse_try(ps) emit_diagnostic(ps, m, position(ps), warning="`catch` after `finally` will execute out of order") end + if !has_catch && !has_finally + # try x end ==> (try (block x) false false false false (error-t)) + bump_invisible(ps, K"error", TRIVIA_FLAG, error="try without catch or finally") + end bump_closing_token(ps, K"end") emit(ps, mark, out_kind, flags) end diff --git a/test/parser.jl b/test/parser.jl index 82b3e144..69aa080a 100644 --- a/test/parser.jl +++ b/test/parser.jl @@ -558,11 +558,12 @@ tests = [ "try x finally y end" => "(try (block x) false false false (block y))" # v1.8 only ((v=v"1.8",), "try catch ; else end") => "(try (block) false (block) (block) false)" - ((v=v"1.8",), "try else end") => "(try (block) false false (error (block)) false)" + ((v=v"1.8",), "try else x finally y end") => "(try (block) false false (error (block x)) (block y))" ((v=v"1.7",), "try catch ; else end") => "(try (block) false (block) (error (block)) false)" # finally before catch :-( "try x finally y catch e z end" => "(try_finally_catch (block x) false false false (block y) e (block z))" => Expr(:try, Expr(:block, :x), :e, Expr(:block, :z), Expr(:block, :y)) + "try x end" => "(try (block x) false false false false (error-t))" ], JuliaSyntax.parse_imports => [ "import A as B: x" => "(import (: (error (as (. A) B)) (. x)))"