From fc1674a22dd0e87986f76c72f45ff14cff801327 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Fri, 3 Jan 2025 20:44:35 -0300 Subject: [PATCH 1/3] opt --- vlib/v/ast/ast.v | 2 ++ vlib/v/checker/infix.v | 6 ++++++ vlib/v/gen/c/infix.v | 4 ++-- vlib/v/type_resolver/comptime_resolver.v | 7 ++----- 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/vlib/v/ast/ast.v b/vlib/v/ast/ast.v index 483f75578a3bdf..237e835031d982 100644 --- a/vlib/v/ast/ast.v +++ b/vlib/v/ast/ast.v @@ -1134,8 +1134,10 @@ pub mut: ct_left_value_evaled bool ct_left_value ComptTimeConstValue = empty_comptime_const_value + left_ct_expr bool // true when left is comptime/generic expr ct_right_value_evaled bool ct_right_value ComptTimeConstValue = empty_comptime_const_value + right_ct_expr bool // true when right is comptime/generic expr before_op_comments []Comment after_op_comments []Comment diff --git a/vlib/v/checker/infix.v b/vlib/v/checker/infix.v index 1495fd72493150..585736bbf945e4 100644 --- a/vlib/v/checker/infix.v +++ b/vlib/v/checker/infix.v @@ -318,6 +318,12 @@ fn (mut c Checker) infix_expr(mut node ast.InfixExpr) ast.Type { return ast.bool_type } .plus, .minus, .mul, .div, .mod, .xor, .amp, .pipe { + if !node.left_ct_expr && !node.left.is_literal() { + node.left_ct_expr = c.comptime.is_comptime(node.left) + } + if !node.right_ct_expr && !node.right.is_literal() { + node.right_ct_expr = c.comptime.is_comptime(node.right) + } // binary operators that expect matching types unwrapped_left_type := c.unwrap_generic(left_type) left_sym = c.table.sym(unwrapped_left_type) diff --git a/vlib/v/gen/c/infix.v b/vlib/v/gen/c/infix.v index ad68ab8db72351..36c447abc8dc64 100644 --- a/vlib/v/gen/c/infix.v +++ b/vlib/v/gen/c/infix.v @@ -1188,9 +1188,9 @@ fn (mut g Gen) gen_plain_infix_expr(node ast.InfixExpr) { && node.op in [.plus, .minus, .mul, .div, .mod] && !(g.pref.translated || g.file.is_translated) if needs_cast { - typ_str := if !node.left.is_literal() && g.comptime.is_comptime(node.left) { + typ_str := if node.left_ct_expr { g.styp(g.type_resolver.get_type_or_default(node.left, node.promoted_type)) - } else if !node.right.is_literal() && g.comptime.is_comptime(node.right) { + } else if node.right_ct_expr { g.styp(g.type_resolver.get_type_or_default(node.right, node.promoted_type)) } else { g.styp(node.promoted_type) diff --git a/vlib/v/type_resolver/comptime_resolver.v b/vlib/v/type_resolver/comptime_resolver.v index c7cf6b0236df60..101a9d463e2227 100644 --- a/vlib/v/type_resolver/comptime_resolver.v +++ b/vlib/v/type_resolver/comptime_resolver.v @@ -50,11 +50,8 @@ pub fn (t &ResolverInfo) is_comptime(node ast.Expr) bool { return node.expr is ast.Ident && node.expr.ct_expr } ast.InfixExpr { - if node.op in [.plus, .minus, .mul, .div, .mod] { - t.is_comptime(node.left) || t.is_comptime(node.right) - } else { - false - } + return node.op in [.plus, .minus, .mul, .div, .mod] + && (node.left_ct_expr || node.right_ct_expr) } ast.ParExpr { return t.is_comptime(node.expr) From cd4ed4b0ac139612396b2d47c602b85895d463a0 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Fri, 3 Jan 2025 20:46:43 -0300 Subject: [PATCH 2/3] opt --- vlib/v/type_resolver/comptime_resolver.v | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/vlib/v/type_resolver/comptime_resolver.v b/vlib/v/type_resolver/comptime_resolver.v index 101a9d463e2227..d09e9a60af89fa 100644 --- a/vlib/v/type_resolver/comptime_resolver.v +++ b/vlib/v/type_resolver/comptime_resolver.v @@ -50,8 +50,7 @@ pub fn (t &ResolverInfo) is_comptime(node ast.Expr) bool { return node.expr is ast.Ident && node.expr.ct_expr } ast.InfixExpr { - return node.op in [.plus, .minus, .mul, .div, .mod] - && (node.left_ct_expr || node.right_ct_expr) + return node.left_ct_expr || node.right_ct_expr } ast.ParExpr { return t.is_comptime(node.expr) From 388d63ff1c9c9b8da2a19a2ee1e49380a22a635e Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Fri, 3 Jan 2025 22:58:27 -0300 Subject: [PATCH 3/3] fix --- vlib/v/checker/infix.v | 13 +++++++------ vlib/v/type_resolver/type_resolver.v | 4 ++++ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/vlib/v/checker/infix.v b/vlib/v/checker/infix.v index 585736bbf945e4..eb8abd60616e96 100644 --- a/vlib/v/checker/infix.v +++ b/vlib/v/checker/infix.v @@ -18,6 +18,13 @@ fn (mut c Checker) infix_expr(mut node ast.InfixExpr) ast.Type { c.expected_type = chan_info.elem_type } + if !node.left_ct_expr && !node.left.is_literal() { + node.left_ct_expr = c.comptime.is_comptime(node.left) + } + if !node.right_ct_expr && !node.right.is_literal() { + node.right_ct_expr = c.comptime.is_comptime(node.right) + } + // `if n is ast.Ident && n.is_mut { ... }` if !c.inside_sql && node.op == .and { mut left_node := node.left @@ -318,12 +325,6 @@ fn (mut c Checker) infix_expr(mut node ast.InfixExpr) ast.Type { return ast.bool_type } .plus, .minus, .mul, .div, .mod, .xor, .amp, .pipe { - if !node.left_ct_expr && !node.left.is_literal() { - node.left_ct_expr = c.comptime.is_comptime(node.left) - } - if !node.right_ct_expr && !node.right.is_literal() { - node.right_ct_expr = c.comptime.is_comptime(node.right) - } // binary operators that expect matching types unwrapped_left_type := c.unwrap_generic(left_type) left_sym = c.table.sym(unwrapped_left_type) diff --git a/vlib/v/type_resolver/type_resolver.v b/vlib/v/type_resolver/type_resolver.v index 0bdeb8b48d4bbf..484d28583c808b 100644 --- a/vlib/v/type_resolver/type_resolver.v +++ b/vlib/v/type_resolver/type_resolver.v @@ -130,6 +130,10 @@ pub fn (mut t TypeResolver) get_type_or_default(node ast.Expr, default_typ ast.T } } } + ast.ComptimeSelector { + // val.$(field.name) + return t.get_comptime_selector_type(node, ast.void_type) + } ast.CastExpr { if node.typ.has_flag(.generic) { return t.resolver.unwrap_generic(node.typ)