diff --git a/core/odin/ast/ast.odin b/core/odin/ast/ast.odin index f2c3e029b..1ac4a25b7 100644 --- a/core/odin/ast/ast.odin +++ b/core/odin/ast/ast.odin @@ -553,6 +553,27 @@ unparen_expr :: proc(expr: ^Expr) -> (val: ^Expr) { return } +strip_or_return_expr :: proc(expr: ^Expr) -> (val: ^Expr) { + val = expr + if expr == nil { + return + } + for { + inner: ^Expr + #partial switch e in val.derived { + case ^Or_Return_Expr: + inner = e.expr + case ^Paren_Expr: + inner = e.expr + } + if inner == nil { + break + } + val = inner + } + return +} + Field_Flags :: distinct bit_set[Field_Flag] Field_Flag :: enum { diff --git a/core/odin/parser/parser.odin b/core/odin/parser/parser.odin index da6530911..e9deeea78 100644 --- a/core/odin/parser/parser.odin +++ b/core/odin/parser/parser.odin @@ -2153,7 +2153,7 @@ parse_inlining_operand :: proc(p: ^Parser, lhs: bool, tok: tokenizer.Token) -> ^ } } - #partial switch e in ast.unparen_expr(expr).derived_expr { + #partial switch e in ast.strip_or_return_expr(expr).derived_expr { case ^ast.Proc_Lit: if e.inlining != .None && e.inlining != pi { error(p, expr.pos, "both 'inline' and 'no_inline' cannot be applied to a procedure literal")