diff --git a/array.c b/array.c index f92b2925f88..91ddc5c60b9 100644 --- a/array.c +++ b/array.c @@ -6916,7 +6916,7 @@ rb_ary_flatten_bang(int argc, VALUE *argv, VALUE ary) } } - if (!(mod = ARY_EMBED_P(result) && result != child)) rb_ary_freeze(result); + if (result != child && !(mod = ARY_EMBED_P(result))) rb_ary_freeze(result); rb_ary_replace(ary, result); if (mod) ARY_SET_EMBED_LEN(result, 0); diff --git a/test/ruby/test_array.rb b/test/ruby/test_array.rb index 773fb1bd8c0..ecd99a8559a 100644 --- a/test/ruby/test_array.rb +++ b/test/ruby/test_array.rb @@ -1018,6 +1018,12 @@ class TestArray < Test::Unit::TestCase assert_equal(@cls[1, 2, 3, 4, 5, 6], a5) end + def test_flatten_bang_does_not_freeze_nested_array + child = [] + [child].flatten! + assert_not_predicate(child, :frozen?) + end + def test_flatten_empty! assert_nil(@cls[].flatten!) assert_equal(@cls[],