summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--test/ruby/test_class.rb42
-rw-r--r--test/ruby/test_module.rb11
-rw-r--r--vm_method.c15
3 files changed, 67 insertions, 1 deletions
diff --git a/test/ruby/test_class.rb b/test/ruby/test_class.rb
index 6960ab5971..407b0aa4b8 100644
--- a/test/ruby/test_class.rb
+++ b/test/ruby/test_class.rb
@@ -131,6 +131,48 @@ class TestClass < Test::Unit::TestCase
[:module_function, :extend_object, :append_features, :prepend_features])
end
+ def test_visibility_inside_method
+ assert_warn(/calling private without arguments inside a method may not have the intended effect/, '[ruby-core:79751]') do
+ Class.new do
+ def self.foo
+ private
+ end
+ foo
+ end
+ end
+
+ assert_warn(/calling protected without arguments inside a method may not have the intended effect/, '[ruby-core:79751]') do
+ Class.new do
+ def self.foo
+ protected
+ end
+ foo
+ end
+ end
+
+ assert_warn(/calling public without arguments inside a method may not have the intended effect/, '[ruby-core:79751]') do
+ Class.new do
+ def self.foo
+ public
+ end
+ foo
+ end
+ end
+
+ assert_warn(/calling private without arguments inside a method may not have the intended effect/, '[ruby-core:79751]') do
+ Class.new do
+ class << self
+ alias priv private
+ end
+
+ def self.foo
+ priv
+ end
+ foo
+ end
+ end
+ end
+
def test_method_redefinition
feature2155 = '[ruby-dev:39400]'
diff --git a/test/ruby/test_module.rb b/test/ruby/test_module.rb
index 8b95ecedc4..79f7965623 100644
--- a/test/ruby/test_module.rb
+++ b/test/ruby/test_module.rb
@@ -1394,6 +1394,17 @@ class TestModule < Test::Unit::TestCase
assert_match(/: warning: previous definition of foo/, stderr)
end
+ def test_module_function_inside_method
+ assert_warn(/calling module_function without arguments inside a method may not have the intended effect/, '[ruby-core:79751]') do
+ Module.new do
+ def self.foo
+ module_function
+ end
+ foo
+ end
+ end
+ end
+
def test_protected_singleton_method
klass = Class.new
x = klass.new
diff --git a/vm_method.c b/vm_method.c
index 6465798d30..5ee1773fe2 100644
--- a/vm_method.c
+++ b/vm_method.c
@@ -1127,8 +1127,20 @@ rb_scope_visibility_set(rb_method_visibility_t visi)
}
static void
+scope_visibility_check(void)
+{
+ /* Check for public/protected/private/module_function called inside a method */
+ rb_control_frame_t *cfp = rb_current_execution_context()->cfp+1;
+ if (cfp && cfp->iseq && cfp->iseq->body->type == ISEQ_TYPE_METHOD) {
+ rb_warn("calling %s without arguments inside a method may not have the intended effect",
+ rb_id2name(rb_frame_this_func()));
+ }
+}
+
+static void
rb_scope_module_func_set(void)
{
+ scope_visibility_check();
vm_cref_set_visibility(METHOD_VISI_PRIVATE, TRUE);
}
@@ -1663,7 +1675,8 @@ static VALUE
set_visibility(int argc, const VALUE *argv, VALUE module, rb_method_visibility_t visi)
{
if (argc == 0) {
- rb_scope_visibility_set(visi);
+ scope_visibility_check();
+ rb_scope_visibility_set(visi);
}
else {
set_method_visibility(module, argc, argv, visi);