mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
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)
This commit is contained in:
parent
10df697d32
commit
6813a12339
@ -1779,9 +1779,6 @@ fn (mut c Checker) enum_decl(mut node ast.EnumDecl) {
|
|||||||
useen << uval
|
useen << uval
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ast.PrefixExpr {
|
|
||||||
dump(field.expr)
|
|
||||||
}
|
|
||||||
ast.InfixExpr {
|
ast.InfixExpr {
|
||||||
// Handle `enum Foo { x = 1 + 2 }`
|
// Handle `enum Foo { x = 1 + 2 }`
|
||||||
c.infix_expr(mut field.expr)
|
c.infix_expr(mut field.expr)
|
||||||
|
@ -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
|
12
vlib/v/slow_tests/inout/dump_expressions_with_literals.vv
Normal file
12
vlib/v/slow_tests/inout/dump_expressions_with_literals.vv
Normal file
@ -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)
|
||||||
|
}
|
@ -11,6 +11,7 @@ pub mut:
|
|||||||
table &ast.Table = unsafe { nil }
|
table &ast.Table = unsafe { nil }
|
||||||
mut:
|
mut:
|
||||||
is_assert bool
|
is_assert bool
|
||||||
|
inside_dump bool
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn new_transformer(pref_ &pref.Preferences) &Transformer {
|
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 {
|
pub fn (mut t Transformer) expr(mut node ast.Expr) ast.Expr {
|
||||||
|
if t.inside_dump {
|
||||||
|
return node
|
||||||
|
}
|
||||||
match mut node {
|
match mut node {
|
||||||
ast.AnonFn {
|
ast.AnonFn {
|
||||||
node.decl = t.stmt(mut node.decl) as ast.FnDecl
|
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 {
|
ast.DumpExpr {
|
||||||
|
old_inside_dump := t.inside_dump
|
||||||
|
t.inside_dump = true
|
||||||
node.expr = t.expr(mut node.expr)
|
node.expr = t.expr(mut node.expr)
|
||||||
|
t.inside_dump = old_inside_dump
|
||||||
}
|
}
|
||||||
ast.GoExpr {
|
ast.GoExpr {
|
||||||
node.call_expr = t.expr(mut node.call_expr) as ast.CallExpr
|
node.call_expr = t.expr(mut node.call_expr) as ast.CallExpr
|
||||||
|
Loading…
Reference in New Issue
Block a user