summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-10-27 15:49:09 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-10-27 15:49:09 +0000
commite672994d146eeb85fc3670cbd97b484f6101d373 (patch)
treef487f8442544a9ea907830bebba14f9460dae3ea
parent1fe5783104b248be54f21d147722ca2ebc7d149a (diff)
parse.y: warn static content assign in cond
* parse.y (assign_in_cond): warn for static content object asignments in conditional statements. [ruby-dev:43083] [Feature #4299] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37344 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog5
-rw-r--r--parse.y40
-rw-r--r--test/ruby/test_rubyoptions.rb27
3 files changed, 54 insertions, 18 deletions
diff --git a/ChangeLog b/ChangeLog
index 435434c063..9b4d5a29ae 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Sun Oct 28 00:49:06 2012 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (assign_in_cond): warn for static content object asignments
+ in conditional statements. [ruby-dev:43083] [Feature #4299]
+
Sat Oct 27 23:33:41 2012 Benoit Daloze <eregontp@gmail.com>
* gc.c (gc_profile_result, gc_profile_report): use internal structures
diff --git a/parse.y b/parse.y
index ac3ec3aca3..5f3617556b 100644
--- a/parse.y
+++ b/parse.y
@@ -8936,6 +8936,30 @@ reduce_nodes_gen(struct parser_params *parser, NODE **body)
}
static int
+is_static_content(NODE *node)
+{
+ if (!node) return 1;
+ switch (nd_type(node)) {
+ case NODE_HASH:
+ if (!(node = node->nd_head)) break;
+ case NODE_ARRAY:
+ do {
+ if (!is_static_content(node->nd_head)) return 0;
+ } while ((node = node->nd_next) != 0);
+ case NODE_LIT:
+ case NODE_STR:
+ case NODE_NIL:
+ case NODE_TRUE:
+ case NODE_FALSE:
+ case NODE_ZARRAY:
+ break;
+ default:
+ return 0;
+ }
+ return 1;
+}
+
+static int
assign_in_cond(struct parser_params *parser, NODE *node)
{
switch (nd_type(node)) {
@@ -8955,23 +8979,9 @@ assign_in_cond(struct parser_params *parser, NODE *node)
}
if (!node->nd_value) return 1;
- switch (nd_type(node->nd_value)) {
- case NODE_LIT:
- case NODE_STR:
- case NODE_NIL:
- case NODE_TRUE:
- case NODE_FALSE:
+ if (is_static_content(node->nd_value)) {
/* reports always */
parser_warn(node->nd_value, "found = in conditional, should be ==");
- return 1;
-
- case NODE_DSTR:
- case NODE_XSTR:
- case NODE_DXSTR:
- case NODE_EVSTR:
- case NODE_DREGX:
- default:
- break;
}
return 1;
}
diff --git a/test/ruby/test_rubyoptions.rb b/test/ruby/test_rubyoptions.rb
index c39a45afe8..47baa691c9 100644
--- a/test/ruby/test_rubyoptions.rb
+++ b/test/ruby/test_rubyoptions.rb
@@ -331,12 +331,33 @@ class TestRubyOptions < Test::Unit::TestCase
t.puts " end"
t.puts "end"
t.close
- err = ["#{t.path}:1: warning: found = in conditional, should be ==",
- "#{t.path}:4: warning: found = in conditional, should be =="]
- err = /\A(#{Regexp.quote(t.path)}):1(: warning: found = in conditional, should be ==)\n\1:4\2\Z/
+ warning = ' warning: found = in conditional, should be =='
+ err = ["#{t.path}:1:#{warning}",
+ "#{t.path}:4:#{warning}",
+ ]
bug2136 = '[ruby-dev:39363]'
assert_in_out_err(["-w", t.path], "", [], err, bug2136)
assert_in_out_err(["-wr", t.path, "-e", ""], "", [], err, bug2136)
+
+ t.open
+ t.truncate(0)
+ t.puts "if a = ''; end"
+ t.puts "if a = []; end"
+ t.puts "if a = [1]; end"
+ t.puts "if a = [a]; end"
+ t.puts "if a = {}; end"
+ t.puts "if a = {1=>2}; end"
+ t.puts "if a = {3=>a}; end"
+ t.close
+ err = ["#{t.path}:1:#{warning}",
+ "#{t.path}:2:#{warning}",
+ "#{t.path}:3:#{warning}",
+ "#{t.path}:5:#{warning}",
+ "#{t.path}:6:#{warning}",
+ ]
+ feature4299 = '[ruby-dev:43083]'
+ assert_in_out_err(["-w", t.path], "", [], err, feature4299)
+ assert_in_out_err(["-wr", t.path, "-e", ""], "", [], err, feature4299)
ensure
t.close(true) if t
end