From bbf96787562334d3b4d51d91785ad66538b548c4 Mon Sep 17 00:00:00 2001 From: Fabian Sperber Date: Tue, 5 Sep 2023 22:35:30 +0200 Subject: [PATCH 1/3] Fix parsing #force_inline call expression with or_return --- core/odin/ast/ast.odin | 21 +++++++++++++++++++++ core/odin/parser/parser.odin | 2 +- 2 files changed, 22 insertions(+), 1 deletion(-) 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") From 16d797cb018524303459cd1cdb8489ed7c543756 Mon Sep 17 00:00:00 2001 From: Fabian Sperber Date: Tue, 5 Sep 2023 22:57:40 +0200 Subject: [PATCH 2/3] Add #const field flag --- core/odin/ast/ast.odin | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/odin/ast/ast.odin b/core/odin/ast/ast.odin index 1ac4a25b7..76ecda59c 100644 --- a/core/odin/ast/ast.odin +++ b/core/odin/ast/ast.odin @@ -585,6 +585,7 @@ Field_Flag :: enum { No_Alias, C_Vararg, Auto_Cast, + Const, Any_Int, Subtype, By_Ptr, @@ -604,6 +605,7 @@ field_flag_strings := [Field_Flag]string{ .No_Alias = "#no_alias", .C_Vararg = "#c_vararg", .Auto_Cast = "auto_cast", + .Const = "#const", .Any_Int = "#any_int", .Subtype = "#subtype", .By_Ptr = "#by_ptr", @@ -617,6 +619,7 @@ field_flag_strings := [Field_Flag]string{ field_hash_flag_strings := []struct{key: string, flag: Field_Flag}{ {"no_alias", .No_Alias}, {"c_vararg", .C_Vararg}, + {"const", .Const}, {"any_int", .Any_Int}, {"subtype", .Subtype}, {"by_ptr", .By_Ptr}, @@ -637,6 +640,7 @@ Field_Flags_Signature :: Field_Flags{ .Using, .No_Alias, .C_Vararg, + .Const, .Auto_Cast, .Any_Int, .By_Ptr, From 886d0de040a6ce06e5e1fb5391e140668f092ade Mon Sep 17 00:00:00 2001 From: Fabian Sperber Date: Tue, 5 Sep 2023 23:08:23 +0200 Subject: [PATCH 3/3] Remove auto_cast from field_flags - auto_cast is parsed as its own expression --- core/odin/ast/ast.odin | 3 --- core/odin/parser/parser.odin | 3 --- 2 files changed, 6 deletions(-) diff --git a/core/odin/ast/ast.odin b/core/odin/ast/ast.odin index 76ecda59c..b462a3107 100644 --- a/core/odin/ast/ast.odin +++ b/core/odin/ast/ast.odin @@ -584,7 +584,6 @@ Field_Flag :: enum { Using, No_Alias, C_Vararg, - Auto_Cast, Const, Any_Int, Subtype, @@ -604,7 +603,6 @@ field_flag_strings := [Field_Flag]string{ .Using = "using", .No_Alias = "#no_alias", .C_Vararg = "#c_vararg", - .Auto_Cast = "auto_cast", .Const = "#const", .Any_Int = "#any_int", .Subtype = "#subtype", @@ -641,7 +639,6 @@ Field_Flags_Signature :: Field_Flags{ .No_Alias, .C_Vararg, .Const, - .Auto_Cast, .Any_Int, .By_Ptr, .Default_Parameters, diff --git a/core/odin/parser/parser.odin b/core/odin/parser/parser.odin index e9deeea78..39280061f 100644 --- a/core/odin/parser/parser.odin +++ b/core/odin/parser/parser.odin @@ -1666,9 +1666,6 @@ is_token_field_prefix :: proc(p: ^Parser) -> ast.Field_Flag { case .Using: advance_token(p) return .Using - case .Auto_Cast: - advance_token(p) - return .Auto_Cast case .Hash: tok: tokenizer.Token advance_token(p)