From 846bb760756a3bf1ab12d56d8909e104f16e6940 Mon Sep 17 00:00:00 2001 From: Takashi Kokubun Date: Wed, 8 Oct 2025 16:45:24 -0700 Subject: [PATCH] merge revision(s) bbf1130f918ca26e33aba4711ccf99a8083517ea, 43dbb9a93f4de3f1170d7d18641c30e81cc08365, 2bb6fe3854e2a4854bb89bfce4eaaea9d848fd1b, 7c9dd0ecff61153b96473c6c51d5582e809da489: [Backport #21629] [PATCH] Add `RBIMPL_ATTR_NONSTRING_ARRAY()` macro for GCC 15 [PATCH] [Bug #21629] Enable `nonstring` attribute on clang 21 [PATCH] [Bug #21629] Initialize `struct RString` [PATCH] [Bug #21629] Initialize `struct RArray` --- enc/trans/iso2022.trans | 2 +- include/ruby/internal/attr/nonstring.h | 8 ++++++++ symbol.c | 2 +- version.h | 2 +- vm_insnhelper.c | 4 ++-- 5 files changed, 13 insertions(+), 5 deletions(-) diff --git a/enc/trans/iso2022.trans b/enc/trans/iso2022.trans index b0c635d574..bc42bbc19c 100644 --- a/enc/trans/iso2022.trans +++ b/enc/trans/iso2022.trans @@ -437,7 +437,7 @@ rb_cp50221_encoder = { /* JIS0201 to JIS0208 conversion table */ enum {tbl0208_num = 0xDF - 0xA1 + 1}; -RBIMPL_ATTR_NONSTRING() static const char tbl0208[tbl0208_num][2] = { +RBIMPL_ATTR_NONSTRING_ARRAY() static const char tbl0208[tbl0208_num][2] = { "\x21\x23", "\x21\x56", "\x21\x57", "\x21\x22", "\x21\x26", "\x25\x72", "\x25\x21", "\x25\x23", "\x25\x25", "\x25\x27", "\x25\x29", "\x25\x63", diff --git a/include/ruby/internal/attr/nonstring.h b/include/ruby/internal/attr/nonstring.h index de26e926d4..5ad6ef2a86 100644 --- a/include/ruby/internal/attr/nonstring.h +++ b/include/ruby/internal/attr/nonstring.h @@ -25,8 +25,16 @@ /** Wraps (or simulates) `__attribute__((nonstring))` */ #if RBIMPL_HAS_ATTRIBUTE(nonstring) # define RBIMPL_ATTR_NONSTRING() __attribute__((nonstring)) +# if RBIMPL_COMPILER_SINCE(GCC, 15, 0, 0) +# define RBIMPL_ATTR_NONSTRING_ARRAY() RBIMPL_ATTR_NONSTRING() +# elif RBIMPL_COMPILER_SINCE(Clang, 21, 0, 0) +# define RBIMPL_ATTR_NONSTRING_ARRAY() RBIMPL_ATTR_NONSTRING() +# else +# define RBIMPL_ATTR_NONSTRING_ARRAY() /* void */ +# endif #else # define RBIMPL_ATTR_NONSTRING() /* void */ +# define RBIMPL_ATTR_NONSTRING_ARRAY() /* void */ #endif #endif /* RBIMPL_ATTR_NONSTRING_H */ diff --git a/symbol.c b/symbol.c index 0878928a04..1b6a297aeb 100644 --- a/symbol.c +++ b/symbol.c @@ -156,7 +156,7 @@ rb_id_attrset(ID id) /* make new symbol and ID */ if (!(str = lookup_id_str(id))) { - RBIMPL_ATTR_NONSTRING() static const char id_types[][8] = { + RBIMPL_ATTR_NONSTRING_ARRAY() static const char id_types[][8] = { "local", "instance", "invalid", diff --git a/version.h b/version.h index 6f52a40f77..b65f5c1a70 100644 --- a/version.h +++ b/version.h @@ -11,7 +11,7 @@ # define RUBY_VERSION_MINOR RUBY_API_VERSION_MINOR #define RUBY_VERSION_TEENY 7 #define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR -#define RUBY_PATCHLEVEL 58 +#define RUBY_PATCHLEVEL 59 #include "ruby/version.h" #include "ruby/internal/abi.h" diff --git a/vm_insnhelper.c b/vm_insnhelper.c index ac08a00600..e056b7889c 100644 --- a/vm_insnhelper.c +++ b/vm_insnhelper.c @@ -6259,7 +6259,7 @@ static VALUE vm_opt_newarray_include_p(rb_execution_context_t *ec, rb_num_t num, const VALUE *ptr, VALUE target) { if (BASIC_OP_UNREDEFINED_P(BOP_INCLUDE_P, ARRAY_REDEFINED_OP_FLAG)) { - struct RArray fake_ary; + struct RArray fake_ary = {RBASIC_INIT}; VALUE ary = rb_setup_fake_ary(&fake_ary, ptr, num); return rb_ary_includes(ary, target); } @@ -6279,7 +6279,7 @@ static VALUE vm_opt_newarray_pack_buffer(rb_execution_context_t *ec, rb_num_t num, const VALUE *ptr, VALUE fmt, VALUE buffer) { if (BASIC_OP_UNREDEFINED_P(BOP_PACK, ARRAY_REDEFINED_OP_FLAG)) { - struct RArray fake_ary; + struct RArray fake_ary = {RBASIC_INIT}; VALUE ary = rb_setup_fake_ary(&fake_ary, ptr, num); return rb_ec_pack_ary(ec, ary, fmt, (UNDEF_P(buffer) ? Qnil : buffer)); }