From 6813a1233938027d79aeeff8290ae358c4a6835f Mon Sep 17 00:00:00 2001 From: Delyan Angelov Date: Tue, 8 Aug 2023 18:25:55 +0300 Subject: [PATCH] transformer: keep the symbolic expressions inside dump(expr) from being optimised out, even when they could be, when composed of literals known at comptime (#19086) --- vlib/v/checker/checker.v | 3 --- .../inout/dump_expressions_with_literals.out | 7 +++++++ .../inout/dump_expressions_with_literals.vv | 12 ++++++++++++ vlib/v/transformer/transformer.v | 9 ++++++++- 4 files changed, 27 insertions(+), 4 deletions(-) create mode 100644 vlib/v/slow_tests/inout/dump_expressions_with_literals.out create mode 100644 vlib/v/slow_tests/inout/dump_expressions_with_literals.vv diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index e681d1370..994c9986b 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -1779,9 +1779,6 @@ fn (mut c Checker) enum_decl(mut node ast.EnumDecl) { useen << uval } } - ast.PrefixExpr { - dump(field.expr) - } ast.InfixExpr { // Handle `enum Foo { x = 1 + 2 }` c.infix_expr(mut field.expr) diff --git a/vlib/v/slow_tests/inout/dump_expressions_with_literals.out b/vlib/v/slow_tests/inout/dump_expressions_with_literals.out new file mode 100644 index 000000000..db768bc6e --- /dev/null +++ b/vlib/v/slow_tests/inout/dump_expressions_with_literals.out @@ -0,0 +1,7 @@ +[vlib/v/slow_tests/inout/dump_expressions_with_literals.vv:5] 2 + 2: 4 +[vlib/v/slow_tests/inout/dump_expressions_with_literals.vv:6] 2 * 3 + 50 / 5: 16 +[vlib/v/slow_tests/inout/dump_expressions_with_literals.vv:7] 3.14 + 0.1: 3.24 +[vlib/v/slow_tests/inout/dump_expressions_with_literals.vv:8] 'abc' + 'a': abca +[vlib/v/slow_tests/inout/dump_expressions_with_literals.vv:9] 'a' + 'b' + 'c': abc +[vlib/v/slow_tests/inout/dump_expressions_with_literals.vv:10] true || (false && true): true +[vlib/v/slow_tests/inout/dump_expressions_with_literals.vv:11] 2 == 4: false diff --git a/vlib/v/slow_tests/inout/dump_expressions_with_literals.vv b/vlib/v/slow_tests/inout/dump_expressions_with_literals.vv new file mode 100644 index 000000000..a5aeb0966 --- /dev/null +++ b/vlib/v/slow_tests/inout/dump_expressions_with_literals.vv @@ -0,0 +1,12 @@ +// Note: dump expressions should not get optimised out by the transformer stage, +// even though they could normally, when they are composed of literals, i.e. +// the value of the expression is known at compile time. +fn main() { + dump(2 + 2) + dump(2 * 3 + 50 / 5) + dump(3.14 + 0.1) + dump('abc' + 'a') + dump('a' + 'b' + 'c') + dump(true || (false && true)) + dump(2 == 4) +} diff --git a/vlib/v/transformer/transformer.v b/vlib/v/transformer/transformer.v index c2369139a..741c6b0e0 100644 --- a/vlib/v/transformer/transformer.v +++ b/vlib/v/transformer/transformer.v @@ -10,7 +10,8 @@ pub mut: index &IndexState table &ast.Table = unsafe { nil } mut: - is_assert bool + is_assert bool + inside_dump bool } pub fn new_transformer(pref_ &pref.Preferences) &Transformer { @@ -513,6 +514,9 @@ pub fn (mut t Transformer) interface_decl(mut node ast.InterfaceDecl) ast.Stmt { } pub fn (mut t Transformer) expr(mut node ast.Expr) ast.Expr { + if t.inside_dump { + return node + } match mut node { ast.AnonFn { node.decl = t.stmt(mut node.decl) as ast.FnDecl @@ -563,7 +567,10 @@ pub fn (mut t Transformer) expr(mut node ast.Expr) ast.Expr { } } ast.DumpExpr { + old_inside_dump := t.inside_dump + t.inside_dump = true node.expr = t.expr(mut node.expr) + t.inside_dump = old_inside_dump } ast.GoExpr { node.call_expr = t.expr(mut node.call_expr) as ast.CallExpr -- 2.39.5