diff --git a/NEWS.md b/NEWS.md
index 1ac45e2da77769..004e151df07bd9 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -130,7 +130,7 @@ releases.
* 0.1.12 to [v0.1.13][repl_type_completor-v0.1.13], [v0.1.14][repl_type_completor-v0.1.14], [v0.1.15][repl_type_completor-v0.1.15]
* pstore 0.2.1
* 0.2.0 to [v0.2.1][pstore-v0.2.1]
-* rdoc 7.2.0
+* rdoc 8.0.0
* 7.0.3 to [v7.0.4][rdoc-v7.0.4], [v7.1.0][rdoc-v7.1.0], [v7.2.0][rdoc-v7.2.0]
* win32ole 1.9.3
* 1.9.2 to [v1.9.3][win32ole-v1.9.3]
diff --git a/common.mk b/common.mk
index 3c32e9fb70b693..45666a5570506c 100644
--- a/common.mk
+++ b/common.mk
@@ -1649,7 +1649,30 @@ yes-test-bundled-gems-spec: yes-test-all-precheck $(PREPARE_BUNDLED_GEMS)
no-test-bundled-gems-spec:
-test-syntax-suggest:
+test-syntax-suggest-precheck: $(TEST_RUNNABLE)-test-syntax-suggest-precheck
+no-test-syntax-suggest-precheck:
+yes-test-syntax-suggest-precheck: main
+
+test-syntax-suggest-prepare: $(TEST_RUNNABLE)-test-syntax-suggest-prepare
+no-test-syntax-suggest-prepare: no-test-syntax-suggest-precheck
+yes-test-syntax-suggest-prepare: yes-test-syntax-suggest-precheck
+ $(ACTIONS_GROUP)
+ $(XRUBY) -C "$(srcdir)" bin/gem install --no-document \
+ --install-dir .bundle --conservative "rspec:~> 3"
+ $(ACTIONS_ENDGROUP)
+
+RSPECOPTS =
+SYNTAX_SUGGEST_SPECS =
+PREPARE_SYNTAX_SUGGEST = $(TEST_RUNNABLE)-test-syntax-suggest-prepare
+test-syntax-suggest: $(TEST_RUNNABLE)-test-syntax-suggest
+yes-test-syntax-suggest: $(PREPARE_SYNTAX_SUGGEST)
+ $(ACTIONS_GROUP)
+ $(XRUBY) -C $(srcdir) -Ispec/syntax_suggest$(PATH_SEPARATOR)spec/lib .bundle/bin/rspec \
+ --require rspec/expectations \
+ --require spec_helper --require formatter_overrides --require spec_coverage \
+ $(RSPECOPTS) spec/syntax_suggest/$(SYNTAX_SUGGEST_SPECS)
+ $(ACTIONS_ENDGROUP)
+no-test-syntax-suggest:
check: $(DOT_WAIT) $(PREPARE_SYNTAX_SUGGEST) test-syntax-suggest
diff --git a/ext/json/parser/parser.c b/ext/json/parser/parser.c
index 4d9fa25baa5f93..a6154c83ec52de 100644
--- a/ext/json/parser/parser.c
+++ b/ext/json/parser/parser.c
@@ -1133,6 +1133,13 @@ static inline VALUE json_decode_float(JSON_ParserConfig *config, uint64_t mantis
}
if (RB_UNLIKELY(mantissa_digits > 18 || mantissa_digits + exponent < -307)) {
+ // If the value is so small that it definitely underflows to 0.0, return early
+ // to avoid triggering a "Float out of range" warning from rb_cstr_to_dbl.
+ // When mantissa_digits + exponent < -324, value < 10^(-324) < DBL_TRUE_MIN/2,
+ // so it rounds to 0 in IEEE 754 round-to-nearest.
+ if (RB_UNLIKELY(mantissa_digits + exponent < -324)) {
+ return rb_float_new(negative ? -0.0 : 0.0);
+ }
return json_decode_large_float(start, end - start);
}
diff --git a/gems/bundled_gems b/gems/bundled_gems
index d67684d6e5d672..d9a6273a043d9b 100644
--- a/gems/bundled_gems
+++ b/gems/bundled_gems
@@ -37,7 +37,7 @@ ostruct 0.6.3 https://github.com/ruby/ostruct
pstore 0.2.1 https://github.com/ruby/pstore
benchmark 0.5.0 https://github.com/ruby/benchmark
logger 1.7.0 https://github.com/ruby/logger
-rdoc 7.2.0 https://github.com/ruby/rdoc a8df5c5d03b63cf05425bf676644688ac673a329
+rdoc 8.0.0 https://github.com/ruby/rdoc
win32ole 1.9.3 https://github.com/ruby/win32ole
irb 1.18.0 https://github.com/ruby/irb
reline 0.6.3 https://github.com/ruby/reline
diff --git a/set.c b/set.c
index b6ca30331332ff..84841ed4e30f47 100644
--- a/set.c
+++ b/set.c
@@ -750,14 +750,16 @@ set_i_add(VALUE set, VALUE item)
/*
* call-seq:
- * add?(obj) -> self or nil
+ * add?(object) -> self or nil
*
- * Adds the given object to the set and returns self. If the object is
- * already in the set, returns nil.
+ * Like #add, but returns +nil+ if +object+ is already in +self+:
*
- * Set[1, 2].add?(3) #=> Set[1, 2, 3]
- * Set[1, 2].add?([3, 4]) #=> Set[1, 2, [3, 4]]
- * Set[1, 2].add?(2) #=> nil
+ * set = Set[0, 1, 2]
+ * set.add?(:foo) # => Set[0, 1, 2, :foo]
+ * set.add?(0..9) # => Set[0, 1, 2, :foo, 0..9]
+ * set.add?(2) # => nil
+ *
+ * Related: see {Methods for Assigning}[rdoc-ref:Set@Methods+for+Assigning].
*/
static VALUE
set_i_add_p(VALUE set, VALUE item)
@@ -875,21 +877,23 @@ set_classify_i(st_data_t key, st_data_t tmp)
/*
* call-seq:
- * classify { |o| ... } -> hash
+ * classify {|element| ... } -> hash
* classify -> enumerator
*
- * Classifies the set by the return value of the given block and
- * returns a hash of {value => set of elements} pairs. The block is
- * called once for each element of the set, passing the element as
- * parameter.
+ * With a block given, calls the block with each element of +self+;
+ * returns a hash whose keys are the block's return values.
+ * The value for each key is a set containing the elements
+ * for which the block returned that key.
*
- * files = Set.new(Dir.glob("*.rb"))
- * hash = files.classify { |f| File.mtime(f).year }
- * hash #=> {2000 => Set["a.rb", "b.rb"],
- * # 2001 => Set["c.rb", "d.rb", "e.rb"],
- * # 2002 => Set["f.rb"]}
+ * This example classifies elements by their classes:
*
- * Returns an enumerator if no block is given.
+ * set = Set[*(5..7), *%w[foo bar]] # => Set[5, 6, 7, "foo", "bar"]
+ * set.classify {|element| element.class }
+ * # => {Integer => Set[5, 6, 7], String => Set["foo", "bar"]}
+ *
+ * With no block given, returns an Enumerator.
+ *
+ * Related: see {Methods for Converting}[rdoc-ref:Set@Methods+for+Converting].
*/
static VALUE
set_i_classify(VALUE set)
@@ -1313,14 +1317,26 @@ set_xor_i(st_data_t key, st_data_t data)
/*
* call-seq:
- * set ^ enum -> new_set
+ * self ^ enumerable -> new_set
*
- * Returns a new set containing elements exclusive between the set and the
- * given enumerable object. (set ^ enum) is equivalent to
- * ((set | enum) - (set & enum)).
+ * Returns a new \Set object containing
+ * the {exclusive OR}[https://en.wikipedia.org/wiki/Exclusive_or]
+ * of +self+ and the given +enumerable+;
+ * that is, containing each element that is in either +self+ or +enumerable+,
+ * but not in both:
+ *
+ * set = Set[0, 1, 2]
+ * set ^ Set[1, 2, 3] # => Set[0, 3]
+ * set ^ Set[2, 1] # => Set[0]
+ * set ^ Set[2, *('a'..'c')] # => Set[0, 1, "a", "b", "c"]
+ * set ^ Set[2, 1, 0] # => Set[]
*
- * Set[1, 2] ^ Set[2, 3] #=> Set[3, 1]
- * Set[1, 'b', 'c'] ^ ['b', 'd'] #=> Set["d", 1, "c"]
+ * For \Set +set+ and \Enumerable +enumerable+, these expressions are equivalent:
+ *
+ * set ^ enumerable
+ * ((set | enumerable) - (set & enumerable))
+ *
+ * Related: see {Methods for Set Operations}[rdoc-ref:Set@Methods+for+Set+Operations].
*/
static VALUE
set_i_xor(VALUE set, VALUE other)
diff --git a/template/Makefile.in b/template/Makefile.in
index 7ce612e8e9c704..18f54c6f7d9c99 100644
--- a/template/Makefile.in
+++ b/template/Makefile.in
@@ -733,30 +733,5 @@ yes-test-leaked-globals: yes-test-leaked-globals-precheck
$(COMMONOBJS) $(LIBRUBY_FOR_LEAKED_GLOBALS:yes=$(LIBRUBY_SO))
$(ACTIONS_ENDGROUP)
-test-syntax-suggest-precheck: $(TEST_RUNNABLE)-test-syntax-suggest-precheck
-no-test-syntax-suggest-precheck:
-yes-test-syntax-suggest-precheck: main
-
-test-syntax-suggest-prepare: $(TEST_RUNNABLE)-test-syntax-suggest-prepare
-no-test-syntax-suggest-prepare: no-test-syntax-suggest-precheck
-yes-test-syntax-suggest-prepare: yes-test-syntax-suggest-precheck
- $(ACTIONS_GROUP)
- $(XRUBY) -C "$(srcdir)" bin/gem install --no-document \
- --install-dir .bundle --conservative "rspec:~> 3"
- $(ACTIONS_ENDGROUP)
-
-RSPECOPTS =
-SYNTAX_SUGGEST_SPECS =
-PREPARE_SYNTAX_SUGGEST = $(TEST_RUNNABLE)-test-syntax-suggest-prepare
-test-syntax-suggest: $(TEST_RUNNABLE)-test-syntax-suggest
-yes-test-syntax-suggest: $(PREPARE_SYNTAX_SUGGEST)
- $(ACTIONS_GROUP)
- $(XRUBY) -C $(srcdir) -Ispec/syntax_suggest:spec/lib .bundle/bin/rspec \
- --require rspec/expectations \
- --require spec_helper --require formatter_overrides --require spec_coverage \
- $(RSPECOPTS) spec/syntax_suggest/$(SYNTAX_SUGGEST_SPECS)
- $(ACTIONS_ENDGROUP)
-no-test-syntax-suggest:
-
yesterday:
$(GIT_IN_SRC) reset --hard `TZ=UTC-9 $(GIT_LOG_FORMAT)%H -1 --before=00:00`