aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoryui-knk <spiketeika@gmail.com>2023-10-20 21:30:18 +0900
committerYuichiro Kaneko <spiketeika@gmail.com>2023-10-31 17:49:12 +0900
commit51149f335e4aea3465bd52a98f85351455bf320e (patch)
treeb3eaf51570be281b7acbf0b2df6a5b058c91dfd1
parenteff59e93df1102d990a61965d906a28d55abc14a (diff)
downloadruby-51149f335e4aea3465bd52a98f85351455bf320e.tar.gz
Keep unused literal nodes
For static analysis, it’s better to keep unused literal nodes. If simply change `block_append` to fall through, both "unused literal ignored" and "possibly useless use of a literal in void context" warnings are shown for the same line. But it’s verbose then remove "unused literal ignored" warning. This kind of optimization is already implemented on compile.c. `compile_block` calls `iseq_compile_each0` with `popped = 1` when NODE_BLOCK has next.
-rw-r--r--parse.y8
-rw-r--r--test/ruby/test_parse.rb9
-rw-r--r--test/ruby/test_pattern_matching.rb2
3 files changed, 5 insertions, 14 deletions
diff --git a/parse.y b/parse.y
index 1eaaf9442f..caddbcc178 100644
--- a/parse.y
+++ b/parse.y
@@ -12291,14 +12291,6 @@ block_append(struct parser_params *p, NODE *head, NODE *tail)
if (h == 0) return tail;
switch (nd_type(h)) {
- case NODE_LIT:
- case NODE_STR:
- case NODE_SELF:
- case NODE_TRUE:
- case NODE_FALSE:
- case NODE_NIL:
- parser_warning(p, h, "unused literal ignored");
- return tail;
default:
h = end = NEW_BLOCK(head, &head->nd_loc);
RNODE_BLOCK(end)->nd_end = end;
diff --git a/test/ruby/test_parse.rb b/test/ruby/test_parse.rb
index cc65f3b849..dcc04a441c 100644
--- a/test/ruby/test_parse.rb
+++ b/test/ruby/test_parse.rb
@@ -876,7 +876,6 @@ x = __ENCODING__
def test_void_expr_stmts_value
x = 1
useless_use = /useless use/
- unused = /unused/
assert_nil assert_warning(useless_use) {eval("x; nil")}
assert_nil assert_warning(useless_use) {eval("1+1; nil")}
assert_nil assert_warning('') {eval("1.+(1); nil")}
@@ -884,10 +883,10 @@ x = __ENCODING__
assert_nil assert_warning(useless_use) {eval("::TestParse; nil")}
assert_nil assert_warning(useless_use) {eval("x..x; nil")}
assert_nil assert_warning(useless_use) {eval("x...x; nil")}
- assert_nil assert_warning(unused) {eval("self; nil")}
- assert_nil assert_warning(unused) {eval("nil; nil")}
- assert_nil assert_warning(unused) {eval("true; nil")}
- assert_nil assert_warning(unused) {eval("false; nil")}
+ assert_nil assert_warning(useless_use) {eval("self; nil")}
+ assert_nil assert_warning(useless_use) {eval("nil; nil")}
+ assert_nil assert_warning(useless_use) {eval("true; nil")}
+ assert_nil assert_warning(useless_use) {eval("false; nil")}
assert_nil assert_warning(useless_use) {eval("defined?(1); nil")}
assert_equal 1, x
diff --git a/test/ruby/test_pattern_matching.rb b/test/ruby/test_pattern_matching.rb
index b761909913..8e2806581c 100644
--- a/test/ruby/test_pattern_matching.rb
+++ b/test/ruby/test_pattern_matching.rb
@@ -1161,7 +1161,7 @@ END
end
end
- bug18890 = assert_warning(/(?:.*:[47]: warning: unused literal ignored\n){2}/) do
+ bug18890 = assert_warning(/(?:.*:[47]: warning: possibly useless use of a literal in void context\n){2}/) do
eval("#{<<~';;;'}")
proc do |i|
case i