summaryrefslogtreecommitdiff
path: root/internal/error.h
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2020-12-22 16:37:35 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2021-06-30 10:47:01 +0900
commit8118d435d000adec3023a0ff509baa11cc73fabb (patch)
tree6da87e4fddc90d6d27f00815f8dcbf4069c42c97 /internal/error.h
parentd1998d8767affe58be0bd09ec536dae9198a7fbd (diff)
downloadruby-8118d435d000adec3023a0ff509baa11cc73fabb.tar.gz
rb_warn_deprecated_to_remove_at [Feature #17432]
At compilation time with RUBY_DEBUG enabled, check if the removal version has been reached.
Diffstat (limited to 'internal/error.h')
-rw-r--r--internal/error.h45
1 files changed, 44 insertions, 1 deletions
diff --git a/internal/error.h b/internal/error.h
index 0dd629f052..16a2f38b68 100644
--- a/internal/error.h
+++ b/internal/error.h
@@ -49,7 +49,50 @@ NORETURN(void rb_async_bug_errno(const char *,int));
const char *rb_builtin_type_name(int t);
const char *rb_builtin_class_name(VALUE x);
PRINTF_ARGS(void rb_warn_deprecated(const char *fmt, const char *suggest, ...), 1, 3);
-PRINTF_ARGS(void rb_warn_deprecated_to_remove(const char *fmt, const char *removal, ...), 1, 3);
+PRINTF_ARGS(void rb_warn_deprecated_to_remove(const char *fmt, const char *suggest, ...), 1, 3);
+#if RUBY_DEBUG && (RBIMPL_HAS_ATTRIBUTE(diagnose_if) || defined(__OPTIMIZE__))
+# include "ruby/version.h"
+
+#define RUBY_VERSION_isdigit(c) ('0'<=(c)&&(c)<='9')
+// upto 99
+#define RUBY_VERSION__number_len(v, ofs) \
+ (!RUBY_VERSION_isdigit((v)[ofs]) ? \
+ 0 : !RUBY_VERSION_isdigit((v)[(ofs) + 1]) ? 1 : 2)
+#define RUBY_VERSION__to_number(v, ofs) \
+ (!RUBY_VERSION_isdigit((v)[ofs]) ? \
+ 0 : !RUBY_VERSION_isdigit((v)[(ofs) + 1]) ? \
+ ((v)[ofs]-'0') : \
+ (((v)[ofs]-'0')*10+(v)[(ofs)+1]-'0'))
+
+#define RUBY_VERSION_CODE_FROM_MAJOR_MINOR_STRING(v) \
+ (RUBY_VERSION__to_number(v, 0) * 10000 + \
+ ((v)[RUBY_VERSION__number_len(v, 0)] == '.' ? \
+ RUBY_VERSION__to_number(v, RUBY_VERSION__number_len(v, 0)+1) * 100 : 0))
+#define RUBY_VERSION_SINCE(v) (RUBY_API_VERSION_CODE >= RUBY_VERSION_CODE_FROM_MAJOR_MINOR_STRING(v))
+#define RUBY_VERSION_BEFORE(v) (RUBY_API_VERSION_CODE < RUBY_VERSION_CODE_FROM_MAJOR_MINOR_STRING(v))
+
+# if RBIMPL_HAS_ATTRIBUTE(diagnose_if)
+RBIMPL_ATTR_FORCEINLINE()
+static void
+rb_deprecated_method_to_be_removed(const char *removal)
+ RBIMPL_ATTR_DIAGNOSE_IF(RUBY_VERSION_SINCE(removal), "deprecated method to be removed", "error")
+{
+}
+# else
+RBIMPL_ATTR_ERROR(("deprecated"))
+void rb_deprecated_method_to_be_removed(const char *);
+# define rb_deprecated_method_to_be_removed(removal) \
+ (sizeof(char[1-2*RUBY_VERSION_SINCE(removal)])!=1 ? \
+ rb_deprecated_method_to_be_removed(removal) : \
+ RBIMPL_ASSERT_NOTHING)
+# endif
+# define rb_warn_deprecated_to_remove_at(removal, ...) \
+ (rb_deprecated_method_to_be_removed(removal), \
+ rb_warn_deprecated_to_remove(__VA_ARGS__))
+#else
+# define rb_warn_deprecated_to_remove_at(removal, ...) \
+ rb_warn_deprecated_to_remove(__VA_ARGS__)
+#endif
VALUE rb_syntax_error_append(VALUE, VALUE, int, int, rb_encoding*, const char*, va_list);
PRINTF_ARGS(void rb_enc_warn(rb_encoding *enc, const char *fmt, ...), 2, 3);
PRINTF_ARGS(void rb_sys_enc_warning(rb_encoding *enc, const char *fmt, ...), 2, 3);