aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2019-12-17 14:52:15 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2019-12-19 09:52:16 +0900
commit9bf9de3d9d2f67bc401151fb94abf75b5eff5913 (patch)
tree94d1c981d7e604834c3ee9a5072f24a8fd199e63
parent76035e5bb6a5b44621fd1c11a0553780474d1c01 (diff)
downloadruby-9bf9de3d9d2f67bc401151fb94abf75b5eff5913.tar.gz
Made the warning for deprecated constants follow the category flag
-rw-r--r--error.c22
-rw-r--r--internal.h7
-rw-r--r--test/ruby/test_module.rb5
-rw-r--r--variable.c3
4 files changed, 28 insertions, 9 deletions
diff --git a/error.c b/error.c
index 9da36ae2e3..4cb17df292 100644
--- a/error.c
+++ b/error.c
@@ -129,32 +129,38 @@ rb_syntax_error_append(VALUE exc, VALUE file, int line, int column,
}
static unsigned int warning_disabled_categories;
-#define RB_WARN_CATEGORY_DEPRECATED 1
static unsigned int
rb_warning_category_mask(VALUE category)
{
- unsigned int mask = 0;
+ return 1U << rb_warning_category_from_name(category);
+}
+
+rb_warning_category_t
+rb_warning_category_from_name(VALUE category)
+{
+ rb_warning_category_t cat = RB_WARN_CATEGORY_NONE;
Check_Type(category, T_SYMBOL);
if (category == ID2SYM(rb_intern("deprecated"))) {
- mask = RB_WARN_CATEGORY_DEPRECATED;
+ cat = RB_WARN_CATEGORY_DEPRECATED;
}
else {
rb_raise(rb_eArgError, "unknown category: %"PRIsVALUE, category);
}
- return mask;
+ return cat;
}
-static int
-rb_warning_category_enabled_p(VALUE category)
+MJIT_FUNC_EXPORTED bool
+rb_warning_category_enabled_p(rb_warning_category_t category)
{
- return !(warning_disabled_categories & rb_warning_category_mask(category));
+ return !(warning_disabled_categories & (1U << category));
}
static VALUE
rb_warning_s_aref(VALUE mod, VALUE category)
{
- if (rb_warning_category_enabled_p(category))
+ rb_warning_category_t cat = rb_warning_category_from_name(category);
+ if (rb_warning_category_enabled_p(cat))
return Qtrue;
return Qfalse;
}
diff --git a/internal.h b/internal.h
index c35e3bdb6f..fc2ff0eaff 100644
--- a/internal.h
+++ b/internal.h
@@ -1554,6 +1554,13 @@ PRINTF_ARGS(void rb_sys_enc_warning(rb_encoding *enc, const char *fmt, ...), 2,
PRINTF_ARGS(void rb_syserr_enc_warning(int err, rb_encoding *enc, const char *fmt, ...), 3, 4);
#endif
+typedef enum {
+ RB_WARN_CATEGORY_NONE,
+ RB_WARN_CATEGORY_DEPRECATED,
+} rb_warning_category_t;
+rb_warning_category_t rb_warning_category_from_name(VALUE category);
+bool rb_warning_category_enabled_p(rb_warning_category_t category);
+
#define rb_raise_cstr(etype, mesg) \
rb_exc_raise(rb_exc_new_str(etype, rb_str_new_cstr(mesg)))
#define rb_raise_static(etype, mesg) \
diff --git a/test/ruby/test_module.rb b/test/ruby/test_module.rb
index 3ddfcd9c4f..2e7e5804d0 100644
--- a/test/ruby/test_module.rb
+++ b/test/ruby/test_module.rb
@@ -28,10 +28,13 @@ class TestModule < Test::Unit::TestCase
def setup
@verbose = $VERBOSE
$VERBOSE = nil
+ @deprecated = Warning[:deprecated]
+ Warning[:deprecated] = true
end
def teardown
$VERBOSE = @verbose
+ Warning[:deprecated] = @deprecated
end
def test_LT_0
@@ -1580,6 +1583,8 @@ class TestModule < Test::Unit::TestCase
assert_warn(/#{c}::FOO is deprecated/) {Class.new(c)::FOO}
bug12382 = '[ruby-core:75505] [Bug #12382]'
assert_warn(/deprecated/, bug12382) {c.class_eval "FOO"}
+ Warning[:deprecated] = false
+ assert_warn('') {c::FOO}
end
NIL = nil
diff --git a/variable.c b/variable.c
index 74c4472910..4d5c9a6f54 100644
--- a/variable.c
+++ b/variable.c
@@ -2302,7 +2302,8 @@ rb_autoload_at_p(VALUE mod, ID id, int recur)
MJIT_FUNC_EXPORTED void
rb_const_warn_if_deprecated(const rb_const_entry_t *ce, VALUE klass, ID id)
{
- if (RB_CONST_DEPRECATED_P(ce)) {
+ if (RB_CONST_DEPRECATED_P(ce) &&
+ rb_warning_category_enabled_p(RB_WARN_CATEGORY_DEPRECATED)) {
if (klass == rb_cObject) {
rb_warn("constant ::%"PRIsVALUE" is deprecated", QUOTE_ID(id));
}