authorbors <bors@rust-lang.org> 2025-05-09 23:48:54 UTC
committerbors <bors@rust-lang.org> 2025-05-09 23:48:54 UTC
logfd9fad6dbcc1bae3cba2a8634339ffa620a49f28
tree0c8238f7f690ead0038f7a3a5cc0920956ef336c
parentdcecb99176edf2eec51613730937d21cdd5c8f6e
parent505e78a29c6a267dae875c3055ad09d6329962af

Auto merge of #140869 - matthiaskrgr:rollup-r5k19w6, r=matthiaskrgr

Rollup of 7 pull requests Successful merges: - #139863 (rustdoc: Replace unstable flag `--doctest-compilation-args` with a simpler one: `--doctest-build-arg`) - #140815 (also export metrics from librustdoc) - #140819 (Add regression test for 125877) - #140843 (Fix `broken-pipe-no-ice` run-make test for rpath-less builds) - #140848 (Improved error message for top-level or-patterns) - #140852 (Update the edition guide for let chains) - #140864 (Last minute relnotes fix) r? `@ghost` `@rustbot` modify labels: rollup

29 files changed, 217 insertions(+), 189 deletions(-)

RELEASES.md+76-76
......@@ -45,83 +45,83 @@ Libraries
4545Stabilized APIs
4646---------------
4747
48- [`Vec::extract_if`](https://doc.rust-lang.org/nightly/std/vec/struct.Vec.html#method.extract_if)
49- [`vec::ExtractIf`](https://doc.rust-lang.org/nightly/std/vec/struct.ExtractIf.html)
50- [`LinkedList::extract_if`](https://doc.rust-lang.org/nightly/std/collections/struct.LinkedList.html#method.extract_if)
51- [`linked_list::ExtractIf`](https://doc.rust-lang.org/nightly/std/collections/linked_list/struct.ExtractIf.html)
52- [`<[T]>::split_off`](https://doc.rust-lang.org/nightly/std/primitive.slice.html#method.split_off)
53- [`<[T]>::split_off_mut`](https://doc.rust-lang.org/nightly/std/primitive.slice.html#method.split_off_mut)
54- [`<[T]>::split_off_first`](https://doc.rust-lang.org/nightly/std/primitive.slice.html#method.split_off_first)
55- [`<[T]>::split_off_first_mut`](https://doc.rust-lang.org/nightly/std/primitive.slice.html#method.split_off_first_mut)
56- [`<[T]>::split_off_last`](https://doc.rust-lang.org/nightly/std/primitive.slice.html#method.split_off_last)
57- [`<[T]>::split_off_last_mut`](https://doc.rust-lang.org/nightly/std/primitive.slice.html#method.split_off_last_mut)
48- [`Vec::extract_if`](https://doc.rust-lang.org/stable/std/vec/struct.Vec.html#method.extract_if)
49- [`vec::ExtractIf`](https://doc.rust-lang.org/stable/std/vec/struct.ExtractIf.html)
50- [`LinkedList::extract_if`](https://doc.rust-lang.org/stable/std/collections/struct.LinkedList.html#method.extract_if)
51- [`linked_list::ExtractIf`](https://doc.rust-lang.org/stable/std/collections/linked_list/struct.ExtractIf.html)
52- [`<[T]>::split_off`](https://doc.rust-lang.org/stable/std/primitive.slice.html#method.split_off)
53- [`<[T]>::split_off_mut`](https://doc.rust-lang.org/stable/std/primitive.slice.html#method.split_off_mut)
54- [`<[T]>::split_off_first`](https://doc.rust-lang.org/stable/std/primitive.slice.html#method.split_off_first)
55- [`<[T]>::split_off_first_mut`](https://doc.rust-lang.org/stable/std/primitive.slice.html#method.split_off_first_mut)
56- [`<[T]>::split_off_last`](https://doc.rust-lang.org/stable/std/primitive.slice.html#method.split_off_last)
57- [`<[T]>::split_off_last_mut`](https://doc.rust-lang.org/stable/std/primitive.slice.html#method.split_off_last_mut)
5858- [`String::extend_from_within`](https://doc.rust-lang.org/stable/alloc/string/struct.String.html#method.extend_from_within)
59- [`os_str::Display`](https://doc.rust-lang.org/nightly/std/ffi/os_str/struct.Display.html)
60- [`OsString::display`](https://doc.rust-lang.org/nightly/std/ffi/struct.OsString.html#method.display)
61- [`OsStr::display`](https://doc.rust-lang.org/nightly/std/ffi/struct.OsStr.html#method.display)
62- [`io::pipe`](https://doc.rust-lang.org/nightly/std/io/fn.pipe.html)
63- [`io::PipeReader`](https://doc.rust-lang.org/nightly/std/io/struct.PipeReader.html)
64- [`io::PipeWriter`](https://doc.rust-lang.org/nightly/std/io/struct.PipeWriter.html)
65- [`impl From<PipeReader> for OwnedHandle`](https://doc.rust-lang.org/nightly/std/os/windows/io/struct.OwnedHandle.html#impl-From%3CPipeReader%3E-for-OwnedHandle)
66- [`impl From<PipeWriter> for OwnedHandle`](https://doc.rust-lang.org/nightly/std/os/windows/io/struct.OwnedHandle.html#impl-From%3CPipeWriter%3E-for-OwnedHandle)
67- [`impl From<PipeReader> for Stdio`](https://doc.rust-lang.org/nightly/std/process/struct.Stdio.html)
68- [`impl From<PipeWriter> for Stdio`](https://doc.rust-lang.org/nightly/std/process/struct.Stdio.html#impl-From%3CPipeWriter%3E-for-Stdio)
69- [`impl From<PipeReader> for OwnedFd`](https://doc.rust-lang.org/nightly/std/os/fd/struct.OwnedFd.html#impl-From%3CPipeReader%3E-for-OwnedFd)
70- [`impl From<PipeWriter> for OwnedFd`](https://doc.rust-lang.org/nightly/std/os/fd/struct.OwnedFd.html#impl-From%3CPipeWriter%3E-for-OwnedFd)
71- [`Box<MaybeUninit<T>>::write`](https://doc.rust-lang.org/nightly/std/boxed/struct.Box.html#method.write)
72- [`impl TryFrom<Vec<u8>> for String`](https://doc.rust-lang.org/nightly/std/string/struct.String.html#impl-TryFrom%3CVec%3Cu8%3E%3E-for-String)
73
74These APIs are now stable in const contexts:
75
76- [`<*const T>::offset_from_unsigned`](https://doc.rust-lang.org/nightly/std/primitive.pointer.html#method.offset_from_unsigned)
77- [`<*const T>::byte_offset_from_unsigned`](https://doc.rust-lang.org/nightly/std/primitive.pointer.html#method.byte_offset_from_unsigned)
78- [`<*mut T>::offset_from_unsigned`](https://doc.rust-lang.org/nightly/std/primitive.pointer.html#method.offset_from_unsigned-1)
79- [`<*mut T>::byte_offset_from_unsigned`](https://doc.rust-lang.org/nightly/std/primitive.pointer.html#method.byte_offset_from_unsigned-1)
80- [`NonNull::offset_from_unsigned`](https://doc.rust-lang.org/nightly/std/ptr/struct.NonNull.html#method.offset_from_unsigned)
81- [`NonNull::byte_offset_from_unsigned`](https://doc.rust-lang.org/nightly/std/ptr/struct.NonNull.html#method.byte_offset_from_unsigned)
82- [`<uN>::cast_signed`](https://doc.rust-lang.org/nightly/std/primitive.usize.html#method.cast_signed)
83- [`NonZero::<uN>::cast_signed`](https://doc.rust-lang.org/nightly/std/num/struct.NonZero.html#method.cast_signed-5).
84- [`<iN>::cast_signed`](https://doc.rust-lang.org/nightly/std/primitive.isize.html#method.cast_signed).
85- [`NonZero::<iN>::cast_unsigned`](https://doc.rust-lang.org/nightly/std/num/struct.NonZero.html#method.cast_unsigned-5).
86- [`<uN>::is_multiple_of`](https://doc.rust-lang.org/nightly/std/primitive.usize.html#method.is_multiple_of)
87- [`<uN>::unbounded_shl`](https://doc.rust-lang.org/nightly/std/primitive.usize.html#method.unbounded_shl)
88- [`<uN>::unbounded_shr`](https://doc.rust-lang.org/nightly/std/primitive.usize.html#method.unbounded_shr)
89- [`<iN>::unbounded_shl`](https://doc.rust-lang.org/nightly/std/primitive.isize.html#method.unbounded_shl)
90- [`<iN>::unbounded_shr`](https://doc.rust-lang.org/nightly/std/primitive.isize.html#method.unbounded_shr)
91- [`<str>::from_utf8`](https://doc.rust-lang.org/nightly/std/primitive.str.html#method.from_utf8)
92- [`<str>::from_utf8_mut`](https://doc.rust-lang.org/nightly/std/primitive.str.html#method.from_utf8_mut)
93- [`<str>::from_utf8_unchecked`](https://doc.rust-lang.org/nightly/std/primitive.str.html#method.from_utf8_unchecked)
94- [`<str>::from_utf8_unchecked_mut`](https://doc.rust-lang.org/nightly/std/primitive.str.html#method.from_utf8_unchecked_mut)
95- [`core::str::from_utf8_mut`](https://doc.rust-lang.org/nightly/std/str/fn.from_utf8_mut.html)
96- [`<[T]>::copy_from_slice`](https://doc.rust-lang.org/nightly/std/primitive.slice.html#method.copy_from_slice)
97- [`SocketAddr::set_ip`](https://doc.rust-lang.org/nightly/std/net/enum.SocketAddr.html#method.set_ip)
98- [`SocketAddr::set_port`](https://doc.rust-lang.org/nightly/std/net/enum.SocketAddr.html#method.set_port),
99- [`SocketAddrV4::set_ip`](https://doc.rust-lang.org/nightly/std/net/struct.SocketAddrV4.html#method.set_ip)
100- [`SocketAddrV4::set_port`](https://doc.rust-lang.org/nightly/std/net/struct.SocketAddrV4.html#method.set_port),
101- [`SocketAddrV6::set_ip`](https://doc.rust-lang.org/nightly/std/net/struct.SocketAddrV6.html#method.set_ip)
102- [`SocketAddrV6::set_port`](https://doc.rust-lang.org/nightly/std/net/struct.SocketAddrV6.html#method.set_port)
103- [`SocketAddrV6::set_flowinfo`](https://doc.rust-lang.org/nightly/std/net/struct.SocketAddrV6.html#method.set_flowinfo)
104- [`SocketAddrV6::set_scope_id`](https://doc.rust-lang.org/nightly/std/net/struct.SocketAddrV6.html#method.set_scope_id)
105- [`char::is_digit`](https://doc.rust-lang.org/nightly/std/primitive.char.html#method.is_digit)
106- [`char::is_whitespace`](https://doc.rust-lang.org/nightly/std/primitive.char.html#method.is_whitespace)
107- [`<iN>::midpoint`](https://doc.rust-lang.org/std/primitive.isize.html#method.midpoint)
108- [`<[[T; N]]>::as_flattened`](https://doc.rust-lang.org/nightly/std/primitive.slice.html#method.as_flattened)
109- [`<[[T; N]]>::as_flattened_mut`](https://doc.rust-lang.org/nightly/std/primitive.slice.html#method.as_flattened_mut)
110- [`String::into_bytes`](https://doc.rust-lang.org/nightly/std/string/struct.String.html#method.into_bytes)
111- [`String::as_str`](https://doc.rust-lang.org/nightly/std/string/struct.String.html#method.as_str)
112- [`String::capacity`](https://doc.rust-lang.org/nightly/std/string/struct.String.html#method.capacity)
113- [`String::as_bytes`](https://doc.rust-lang.org/nightly/std/string/struct.String.html#method.as_bytes)
114- [`String::len`](https://doc.rust-lang.org/nightly/std/string/struct.String.html#method.len)
115- [`String::is_empty`](https://doc.rust-lang.org/nightly/std/string/struct.String.html#method.is_empty)
116- [`String::as_mut_str`](https://doc.rust-lang.org/nightly/std/string/struct.String.html#method.as_mut_str)
117- [`String::as_mut_vec`](https://doc.rust-lang.org/nightly/std/string/struct.String.html#method.as_mut_vec)
118- [`Vec::as_ptr`](https://doc.rust-lang.org/nightly/std/vec/struct.Vec.html#method.as_ptr)
119- [`Vec::as_slice`](https://doc.rust-lang.org/nightly/std/vec/struct.Vec.html#method.as_slice)
120- [`Vec::capacity`](https://doc.rust-lang.org/nightly/std/vec/struct.Vec.html#method.capacity)
121- [`Vec::len`](https://doc.rust-lang.org/nightly/std/vec/struct.Vec.html#method.len)
122- [`Vec::is_empty`](https://doc.rust-lang.org/nightly/std/vec/struct.Vec.html#method.is_empty)
123- [`Vec::as_mut_slice`](https://doc.rust-lang.org/nightly/std/vec/struct.Vec.html#method.as_mut_slice)
124- [`Vec::as_mut_ptr`](https://doc.rust-lang.org/nightly/std/vec/struct.Vec.html#method.as_mut_ptr)
59- [`os_str::Display`](https://doc.rust-lang.org/stable/std/ffi/os_str/struct.Display.html)
60- [`OsString::display`](https://doc.rust-lang.org/stable/std/ffi/struct.OsString.html#method.display)
61- [`OsStr::display`](https://doc.rust-lang.org/stable/std/ffi/struct.OsStr.html#method.display)
62- [`io::pipe`](https://doc.rust-lang.org/stable/std/io/fn.pipe.html)
63- [`io::PipeReader`](https://doc.rust-lang.org/stable/std/io/struct.PipeReader.html)
64- [`io::PipeWriter`](https://doc.rust-lang.org/stable/std/io/struct.PipeWriter.html)
65- [`impl From<PipeReader> for OwnedHandle`](https://doc.rust-lang.org/stable/std/os/windows/io/struct.OwnedHandle.html#impl-From%3CPipeReader%3E-for-OwnedHandle)
66- [`impl From<PipeWriter> for OwnedHandle`](https://doc.rust-lang.org/stable/std/os/windows/io/struct.OwnedHandle.html#impl-From%3CPipeWriter%3E-for-OwnedHandle)
67- [`impl From<PipeReader> for Stdio`](https://doc.rust-lang.org/stable/std/process/struct.Stdio.html)
68- [`impl From<PipeWriter> for Stdio`](https://doc.rust-lang.org/stable/std/process/struct.Stdio.html#impl-From%3CPipeWriter%3E-for-Stdio)
69- [`impl From<PipeReader> for OwnedFd`](https://doc.rust-lang.org/stable/std/os/fd/struct.OwnedFd.html#impl-From%3CPipeReader%3E-for-OwnedFd)
70- [`impl From<PipeWriter> for OwnedFd`](https://doc.rust-lang.org/stable/std/os/fd/struct.OwnedFd.html#impl-From%3CPipeWriter%3E-for-OwnedFd)
71- [`Box<MaybeUninit<T>>::write`](https://doc.rust-lang.org/stable/std/boxed/struct.Box.html#method.write)
72- [`impl TryFrom<Vec<u8>> for String`](https://doc.rust-lang.org/stable/std/string/struct.String.html#impl-TryFrom%3CVec%3Cu8%3E%3E-for-String)
73- [`<*const T>::offset_from_unsigned`](https://doc.rust-lang.org/stable/std/primitive.pointer.html#method.offset_from_unsigned)
74- [`<*const T>::byte_offset_from_unsigned`](https://doc.rust-lang.org/stable/std/primitive.pointer.html#method.byte_offset_from_unsigned)
75- [`<*mut T>::offset_from_unsigned`](https://doc.rust-lang.org/stable/std/primitive.pointer.html#method.offset_from_unsigned-1)
76- [`<*mut T>::byte_offset_from_unsigned`](https://doc.rust-lang.org/stable/std/primitive.pointer.html#method.byte_offset_from_unsigned-1)
77- [`NonNull::offset_from_unsigned`](https://doc.rust-lang.org/stable/std/ptr/struct.NonNull.html#method.offset_from_unsigned)
78- [`NonNull::byte_offset_from_unsigned`](https://doc.rust-lang.org/stable/std/ptr/struct.NonNull.html#method.byte_offset_from_unsigned)
79- [`<uN>::cast_signed`](https://doc.rust-lang.org/stable/std/primitive.usize.html#method.cast_signed)
80- [`NonZero::<uN>::cast_signed`](https://doc.rust-lang.org/stable/std/num/struct.NonZero.html#method.cast_signed-5).
81- [`<iN>::cast_unsigned`](https://doc.rust-lang.org/stable/std/primitive.isize.html#method.cast_unsigned).
82- [`NonZero::<iN>::cast_unsigned`](https://doc.rust-lang.org/stable/std/num/struct.NonZero.html#method.cast_unsigned-5).
83- [`<uN>::is_multiple_of`](https://doc.rust-lang.org/stable/std/primitive.usize.html#method.is_multiple_of)
84- [`<uN>::unbounded_shl`](https://doc.rust-lang.org/stable/std/primitive.usize.html#method.unbounded_shl)
85- [`<uN>::unbounded_shr`](https://doc.rust-lang.org/stable/std/primitive.usize.html#method.unbounded_shr)
86- [`<iN>::unbounded_shl`](https://doc.rust-lang.org/stable/std/primitive.isize.html#method.unbounded_shl)
87- [`<iN>::unbounded_shr`](https://doc.rust-lang.org/stable/std/primitive.isize.html#method.unbounded_shr)
88- [`<iN>::midpoint`](https://doc.rust-lang.org/stable/std/primitive.isize.html#method.midpoint)
89- [`<str>::from_utf8`](https://doc.rust-lang.org/stable/std/primitive.str.html#method.from_utf8)
90- [`<str>::from_utf8_mut`](https://doc.rust-lang.org/stable/std/primitive.str.html#method.from_utf8_mut)
91- [`<str>::from_utf8_unchecked`](https://doc.rust-lang.org/stable/std/primitive.str.html#method.from_utf8_unchecked)
92- [`<str>::from_utf8_unchecked_mut`](https://doc.rust-lang.org/stable/std/primitive.str.html#method.from_utf8_unchecked_mut)
93
94These previously stable APIs are now stable in const contexts:
95
96- [`core::str::from_utf8_mut`](https://doc.rust-lang.org/stable/std/str/fn.from_utf8_mut.html)
97- [`<[T]>::copy_from_slice`](https://doc.rust-lang.org/stable/std/primitive.slice.html#method.copy_from_slice)
98- [`SocketAddr::set_ip`](https://doc.rust-lang.org/stable/std/net/enum.SocketAddr.html#method.set_ip)
99- [`SocketAddr::set_port`](https://doc.rust-lang.org/stable/std/net/enum.SocketAddr.html#method.set_port),
100- [`SocketAddrV4::set_ip`](https://doc.rust-lang.org/stable/std/net/struct.SocketAddrV4.html#method.set_ip)
101- [`SocketAddrV4::set_port`](https://doc.rust-lang.org/stable/std/net/struct.SocketAddrV4.html#method.set_port),
102- [`SocketAddrV6::set_ip`](https://doc.rust-lang.org/stable/std/net/struct.SocketAddrV6.html#method.set_ip)
103- [`SocketAddrV6::set_port`](https://doc.rust-lang.org/stable/std/net/struct.SocketAddrV6.html#method.set_port)
104- [`SocketAddrV6::set_flowinfo`](https://doc.rust-lang.org/stable/std/net/struct.SocketAddrV6.html#method.set_flowinfo)
105- [`SocketAddrV6::set_scope_id`](https://doc.rust-lang.org/stable/std/net/struct.SocketAddrV6.html#method.set_scope_id)
106- [`char::is_digit`](https://doc.rust-lang.org/stable/std/primitive.char.html#method.is_digit)
107- [`char::is_whitespace`](https://doc.rust-lang.org/stable/std/primitive.char.html#method.is_whitespace)
108- [`<[[T; N]]>::as_flattened`](https://doc.rust-lang.org/stable/std/primitive.slice.html#method.as_flattened)
109- [`<[[T; N]]>::as_flattened_mut`](https://doc.rust-lang.org/stable/std/primitive.slice.html#method.as_flattened_mut)
110- [`String::into_bytes`](https://doc.rust-lang.org/stable/std/string/struct.String.html#method.into_bytes)
111- [`String::as_str`](https://doc.rust-lang.org/stable/std/string/struct.String.html#method.as_str)
112- [`String::capacity`](https://doc.rust-lang.org/stable/std/string/struct.String.html#method.capacity)
113- [`String::as_bytes`](https://doc.rust-lang.org/stable/std/string/struct.String.html#method.as_bytes)
114- [`String::len`](https://doc.rust-lang.org/stable/std/string/struct.String.html#method.len)
115- [`String::is_empty`](https://doc.rust-lang.org/stable/std/string/struct.String.html#method.is_empty)
116- [`String::as_mut_str`](https://doc.rust-lang.org/stable/std/string/struct.String.html#method.as_mut_str)
117- [`String::as_mut_vec`](https://doc.rust-lang.org/stable/std/string/struct.String.html#method.as_mut_vec)
118- [`Vec::as_ptr`](https://doc.rust-lang.org/stable/std/vec/struct.Vec.html#method.as_ptr)
119- [`Vec::as_slice`](https://doc.rust-lang.org/stable/std/vec/struct.Vec.html#method.as_slice)
120- [`Vec::capacity`](https://doc.rust-lang.org/stable/std/vec/struct.Vec.html#method.capacity)
121- [`Vec::len`](https://doc.rust-lang.org/stable/std/vec/struct.Vec.html#method.len)
122- [`Vec::is_empty`](https://doc.rust-lang.org/stable/std/vec/struct.Vec.html#method.is_empty)
123- [`Vec::as_mut_slice`](https://doc.rust-lang.org/stable/std/vec/struct.Vec.html#method.as_mut_slice)
124- [`Vec::as_mut_ptr`](https://doc.rust-lang.org/stable/std/vec/struct.Vec.html#method.as_mut_ptr)
125125
126126<a id="1.87.0-Cargo"></a>
127127
compiler/rustc_parse/messages.ftl+2-2
......@@ -690,8 +690,8 @@ parse_nul_in_c_str = null characters in C string literals are not supported
690690
691691parse_or_in_let_chain = `||` operators are not supported in let chain conditions
692692
693parse_or_pattern_not_allowed_in_fn_parameters = top-level or-patterns are not allowed in function parameters
694parse_or_pattern_not_allowed_in_let_binding = top-level or-patterns are not allowed in `let` bindings
693parse_or_pattern_not_allowed_in_fn_parameters = function parameters require top-level or-patterns in parentheses
694parse_or_pattern_not_allowed_in_let_binding = `let` bindings require top-level or-patterns in parentheses
695695parse_out_of_range_hex_escape = out of range hex escape
696696 .label = must be a character in the range [\x00-\x7f]
697697
src/doc/edition-guide+1-1
......@@ -1 +1 @@
1Subproject commit 467f45637b73ec6aa70fb36bc3054bb50b8967ea
1Subproject commit 1b1bb49babd65c732468cfa515b0c009bd1d26bc
src/librustdoc/config.rs+3-3
......@@ -174,7 +174,7 @@ pub(crate) struct Options {
174174 pub(crate) expanded_args: Vec<String>,
175175
176176 /// Arguments to be used when compiling doctests.
177 pub(crate) doctest_compilation_args: Vec<String>,
177 pub(crate) doctest_build_args: Vec<String>,
178178}
179179
180180impl fmt::Debug for Options {
......@@ -802,7 +802,7 @@ impl Options {
802802 let scrape_examples_options = ScrapeExamplesOptions::new(matches, dcx);
803803 let with_examples = matches.opt_strs("with-examples");
804804 let call_locations = crate::scrape_examples::load_call_locations(with_examples, dcx);
805 let doctest_compilation_args = matches.opt_strs("doctest-compilation-args");
805 let doctest_build_args = matches.opt_strs("doctest-build-arg");
806806
807807 let unstable_features =
808808 rustc_feature::UnstableFeatures::from_environment(crate_name.as_deref());
......@@ -851,7 +851,7 @@ impl Options {
851851 scrape_examples_options,
852852 unstable_features,
853853 expanded_args: args,
854 doctest_compilation_args,
854 doctest_build_args,
855855 };
856856 let render_options = RenderOptions {
857857 output,
src/librustdoc/doctest.rs+1-43
......@@ -51,46 +51,6 @@ pub(crate) struct GlobalTestOptions {
5151 pub(crate) args_file: PathBuf,
5252}
5353
54/// Function used to split command line arguments just like a shell would.
55fn split_args(args: &str) -> Vec<String> {
56 let mut out = Vec::new();
57 let mut iter = args.chars();
58 let mut current = String::new();
59
60 while let Some(c) = iter.next() {
61 if c == '\\' {
62 if let Some(c) = iter.next() {
63 // If it's escaped, even a quote or a whitespace will be ignored.
64 current.push(c);
65 }
66 } else if c == '"' || c == '\'' {
67 while let Some(new_c) = iter.next() {
68 if new_c == c {
69 break;
70 } else if new_c == '\\' {
71 if let Some(c) = iter.next() {
72 // If it's escaped, even a quote will be ignored.
73 current.push(c);
74 }
75 } else {
76 current.push(new_c);
77 }
78 }
79 } else if " \n\t\r".contains(c) {
80 if !current.is_empty() {
81 out.push(current.clone());
82 current.clear();
83 }
84 } else {
85 current.push(c);
86 }
87 }
88 if !current.is_empty() {
89 out.push(current);
90 }
91 out
92}
93
9454pub(crate) fn generate_args_file(file_path: &Path, options: &RustdocOptions) -> Result<(), String> {
9555 let mut file = File::create(file_path)
9656 .map_err(|error| format!("failed to create args file: {error:?}"))?;
......@@ -119,9 +79,7 @@ pub(crate) fn generate_args_file(file_path: &Path, options: &RustdocOptions) ->
11979 content.push(format!("-Z{unstable_option_str}"));
12080 }
12181
122 for compilation_args in &options.doctest_compilation_args {
123 content.extend(split_args(compilation_args));
124 }
82 content.extend(options.doctest_build_args.clone());
12583
12684 let content = content.join("\n");
12785
src/librustdoc/doctest/tests.rs-22
......@@ -381,28 +381,6 @@ fn main() {
381381 assert_eq!((output, len), (expected, 1));
382382}
383383
384#[test]
385fn check_split_args() {
386 fn compare(input: &str, expected: &[&str]) {
387 let output = super::split_args(input);
388 let expected = expected.iter().map(|s| s.to_string()).collect::<Vec<_>>();
389 assert_eq!(expected, output, "test failed for {input:?}");
390 }
391
392 compare("'a' \"b\"c", &["a", "bc"]);
393 compare("'a' \"b \"c d", &["a", "b c", "d"]);
394 compare("'a' \"b\\\"c\"", &["a", "b\"c"]);
395 compare("'a\"'", &["a\""]);
396 compare("\"a'\"", &["a'"]);
397 compare("\\ a", &[" a"]);
398 compare("\\\\", &["\\"]);
399 compare("a'", &["a"]);
400 compare("a ", &["a"]);
401 compare("a b", &["a", "b"]);
402 compare("a\n\t \rb", &["a", "b"]);
403 compare("a\n\t1 \rb", &["a", "1", "b"]);
404}
405
406384#[test]
407385fn comment_in_attrs() {
408386 // If there is an inline code comment after attributes, we need to ensure that
src/librustdoc/lib.rs+22-3
......@@ -73,9 +73,11 @@ extern crate tikv_jemalloc_sys as jemalloc_sys;
7373
7474use std::env::{self, VarError};
7575use std::io::{self, IsTerminal};
76use std::path::Path;
7677use std::process;
7778
7879use rustc_errors::DiagCtxtHandle;
80use rustc_hir::def_id::LOCAL_CRATE;
7981use rustc_interface::interface;
8082use rustc_middle::ty::TyCtxt;
8183use rustc_session::config::{ErrorOutputType, RustcOptGroup, make_crate_type_option};
......@@ -654,9 +656,9 @@ fn opts() -> Vec<RustcOptGroup> {
654656 Unstable,
655657 Multi,
656658 "",
657 "doctest-compilation-args",
658 "",
659 "add arguments to be used when compiling doctests",
659 "doctest-build-arg",
660 "One argument (of possibly many) to be used when compiling doctests",
661 "ARG",
660662 ),
661663 opt(
662664 Unstable,
......@@ -904,6 +906,10 @@ fn main_args(early_dcx: &mut EarlyDiagCtxt, at_args: &[String]) {
904906 rustc_interface::passes::write_dep_info(tcx);
905907 }
906908
909 if let Some(metrics_dir) = &sess.opts.unstable_opts.metrics_dir {
910 dump_feature_usage_metrics(tcx, metrics_dir);
911 }
912
907913 if run_check {
908914 // Since we're in "check" mode, no need to generate anything beyond this point.
909915 return;
......@@ -923,3 +929,16 @@ fn main_args(early_dcx: &mut EarlyDiagCtxt, at_args: &[String]) {
923929 })
924930 })
925931}
932
933fn dump_feature_usage_metrics(tcxt: TyCtxt<'_>, metrics_dir: &Path) {
934 let hash = tcxt.crate_hash(LOCAL_CRATE);
935 let crate_name = tcxt.crate_name(LOCAL_CRATE);
936 let metrics_file_name = format!("unstable_feature_usage_metrics-{crate_name}-{hash}.json");
937 let metrics_path = metrics_dir.join(metrics_file_name);
938 if let Err(error) = tcxt.features().dump_feature_usage_metrics(metrics_path) {
939 // FIXME(yaahc): once metrics can be enabled by default we will want "failure to emit
940 // default metrics" to only produce a warning when metrics are enabled by default and emit
941 // an error only when the user manually enables metrics
942 tcxt.dcx().err(format!("cannot emit feature usage metrics: {error}"));
943 }
944}
src/tools/run-make-support/src/command.rs+6
......@@ -63,6 +63,12 @@ impl Command {
6363 }
6464 }
6565
66 // Internal-only.
67 pub(crate) fn into_raw_command(mut self) -> std::process::Command {
68 self.drop_bomb.defuse();
69 self.cmd
70 }
71
6672 /// Specify a stdin input buffer. This is a convenience helper,
6773 pub fn stdin_buf<I: AsRef<[u8]>>(&mut self, input: I) -> &mut Self {
6874 self.stdin_buf = Some(input.as_ref().to_vec().into_boxed_slice());
src/tools/run-make-support/src/external_deps/rustdoc.rs+2-2
......@@ -5,7 +5,7 @@ use crate::command::Command;
55use crate::env::env_var;
66use crate::util::set_host_compiler_dylib_path;
77
8/// Construct a new `rustdoc` invocation.
8/// Construct a new `rustdoc` invocation. This will configure the host compiler runtime libs.
99#[track_caller]
1010pub fn rustdoc() -> Rustdoc {
1111 Rustdoc::new()
......@@ -28,7 +28,7 @@ fn setup_common() -> Command {
2828}
2929
3030impl Rustdoc {
31 /// Construct a bare `rustdoc` invocation.
31 /// Construct a bare `rustdoc` invocation. This will configure the host compiler runtime libs.
3232 #[track_caller]
3333 pub fn new() -> Self {
3434 let cmd = setup_common();
src/tools/run-make-support/src/macros.rs+12
......@@ -28,6 +28,18 @@
2828macro_rules! impl_common_helpers {
2929 ($wrapper: ident) => {
3030 impl $wrapper {
31 /// In very rare circumstances, you may need a e.g. `bare_rustc()` or `bare_rustdoc()`
32 /// with host runtime libs configured, but want the underlying raw
33 /// [`std::process::Command`] (e.g. for manipulating pipes or whatever). This function
34 /// will consume the command wrapper and extract the underlying
35 /// [`std::process::Command`].
36 ///
37 /// Caution: this will mean that you can no longer use the convenience methods on the
38 /// command wrapper. Use as a last resort.
39 pub fn into_raw_command(self) -> ::std::process::Command {
40 self.cmd.into_raw_command()
41 }
42
3143 /// Specify an environment variable.
3244 pub fn env<K, V>(&mut self, key: K, value: V) -> &mut Self
3345 where
tests/run-make/broken-pipe-no-ice/rmake.rs+5-3
......@@ -14,7 +14,7 @@
1414use std::io::Read;
1515use std::process::{Command, Stdio};
1616
17use run_make_support::env_var;
17use run_make_support::{bare_rustc, rustdoc};
1818
1919#[derive(Debug, PartialEq)]
2020enum Binary {
......@@ -67,11 +67,13 @@ fn check_broken_pipe_handled_gracefully(bin: Binary, mut cmd: Command) {
6767}
6868
6969fn main() {
70 let mut rustc = Command::new(env_var("RUSTC"));
70 let mut rustc = bare_rustc();
7171 rustc.arg("--print=sysroot");
72 let rustc = rustc.into_raw_command();
7273 check_broken_pipe_handled_gracefully(Binary::Rustc, rustc);
7374
74 let mut rustdoc = Command::new(env_var("RUSTDOC"));
75 let mut rustdoc = rustdoc();
7576 rustdoc.arg("--version");
77 let rustdoc = rustdoc.into_raw_command();
7678 check_broken_pipe_handled_gracefully(Binary::Rustdoc, rustdoc);
7779}
tests/run-make/rustdoc-default-output/output-default.stdout+3-2
......@@ -188,8 +188,9 @@ Options:
188188 from provided path. Only use with --merge=finalize
189189 --html-no-source
190190 Disable HTML source code pages generation
191 --doctest-compilation-args add arguments to be used when compiling doctests
192
191 --doctest-build-arg ARG
192 One argument (of possibly many) to be used when
193 compiling doctests
193194 --disable-minification
194195 disable the minification of CSS/JS files
195196 (perma-unstable, do not use with cached files)
tests/rustdoc-ui/doctest/rustflags-multiple-args.rs+3-4
......@@ -1,9 +1,8 @@
1// This test checks that the test behave when `--doctest-compilation-args` is passed
2// multiple times.
1// This test checks that the test behave when `--doctest-build-arg` is passed multiple times.
32
43//@ check-pass
5//@ compile-flags: --test -Zunstable-options --doctest-compilation-args=--cfg=testcase_must_be_present
6//@ compile-flags: --doctest-compilation-args=--cfg=another
4//@ compile-flags: --test -Zunstable-options --doctest-build-arg=--cfg=testcase_must_be_present
5//@ compile-flags: --doctest-build-arg=--cfg=another
76//@ normalize-stdout: "tests/rustdoc-ui/doctest" -> "$$DIR"
87//@ normalize-stdout: "finished in \d+\.\d+s" -> "finished in $$TIME"
98
tests/rustdoc-ui/doctest/rustflags-multiple-args.stdout+1-1
......@@ -1,6 +1,6 @@
11
22running 1 test
3test $DIR/rustflags-multiple-args.rs - Bar (line 10) ... ok
3test $DIR/rustflags-multiple-args.rs - Bar (line 9) ... ok
44
55test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in $TIME
66
tests/rustdoc-ui/doctest/rustflags.rs+1-1
......@@ -1,5 +1,5 @@
11//@ check-pass
2//@ compile-flags: --test -Zunstable-options --doctest-compilation-args=--cfg=testcase_must_be_present
2//@ compile-flags: --test -Zunstable-options --doctest-build-arg=--cfg=testcase_must_be_present
33//@ normalize-stdout: "tests/rustdoc-ui/doctest" -> "$$DIR"
44//@ normalize-stdout: "finished in \d+\.\d+s" -> "finished in $$TIME"
55
tests/ui/or-patterns/fn-param-wrap-parens.fixed+1-1
......@@ -10,4 +10,4 @@ enum E { A, B }
1010use E::*;
1111
1212#[cfg(false)]
13fn fun1((A | B): E) {} //~ ERROR top-level or-patterns are not allowed
13fn fun1((A | B): E) {} //~ ERROR function parameters require top-level or-patterns in parentheses
tests/ui/or-patterns/fn-param-wrap-parens.rs+1-1
......@@ -10,4 +10,4 @@ enum E { A, B }
1010use E::*;
1111
1212#[cfg(false)]
13fn fun1(A | B: E) {} //~ ERROR top-level or-patterns are not allowed
13fn fun1(A | B: E) {} //~ ERROR function parameters require top-level or-patterns in parentheses
tests/ui/or-patterns/fn-param-wrap-parens.stderr+1-1
......@@ -1,4 +1,4 @@
1error: top-level or-patterns are not allowed in function parameters
1error: function parameters require top-level or-patterns in parentheses
22 --> $DIR/fn-param-wrap-parens.rs:13:9
33 |
44LL | fn fun1(A | B: E) {}
tests/ui/or-patterns/nested-undelimited-precedence.rs+5-5
......@@ -17,7 +17,7 @@ fn foo() {
1717 let b @ (A | B): E = A;
1818
1919 let b @ A | B: E = A; //~ERROR `b` is not bound in all patterns
20 //~^ ERROR top-level or-patterns are not allowed
20 //~^ ERROR `let` bindings require top-level or-patterns in parentheses
2121}
2222
2323enum F {
......@@ -32,13 +32,13 @@ fn bar() {
3232 let (A(x) | B(x)): F = A(3);
3333
3434 let &A(_) | B(_): F = A(3); //~ERROR mismatched types
35 //~^ ERROR top-level or-patterns are not allowed
35 //~^ ERROR `let` bindings require top-level or-patterns in parentheses
3636 let &&A(_) | B(_): F = A(3); //~ERROR mismatched types
37 //~^ ERROR top-level or-patterns are not allowed
37 //~^ ERROR `let` bindings require top-level or-patterns in parentheses
3838 let &mut A(_) | B(_): F = A(3); //~ERROR mismatched types
39 //~^ ERROR top-level or-patterns are not allowed
39 //~^ ERROR `let` bindings require top-level or-patterns in parentheses
4040 let &&mut A(_) | B(_): F = A(3); //~ERROR mismatched types
41 //~^ ERROR top-level or-patterns are not allowed
41 //~^ ERROR `let` bindings require top-level or-patterns in parentheses
4242}
4343
4444fn main() {}
tests/ui/or-patterns/nested-undelimited-precedence.stderr+5-5
......@@ -1,4 +1,4 @@
1error: top-level or-patterns are not allowed in `let` bindings
1error: `let` bindings require top-level or-patterns in parentheses
22 --> $DIR/nested-undelimited-precedence.rs:19:9
33 |
44LL | let b @ A | B: E = A;
......@@ -9,7 +9,7 @@ help: wrap the pattern in parentheses
99LL | let (b @ A | B): E = A;
1010 | + +
1111
12error: top-level or-patterns are not allowed in `let` bindings
12error: `let` bindings require top-level or-patterns in parentheses
1313 --> $DIR/nested-undelimited-precedence.rs:34:9
1414 |
1515LL | let &A(_) | B(_): F = A(3);
......@@ -20,7 +20,7 @@ help: wrap the pattern in parentheses
2020LL | let (&A(_) | B(_)): F = A(3);
2121 | + +
2222
23error: top-level or-patterns are not allowed in `let` bindings
23error: `let` bindings require top-level or-patterns in parentheses
2424 --> $DIR/nested-undelimited-precedence.rs:36:9
2525 |
2626LL | let &&A(_) | B(_): F = A(3);
......@@ -31,7 +31,7 @@ help: wrap the pattern in parentheses
3131LL | let (&&A(_) | B(_)): F = A(3);
3232 | + +
3333
34error: top-level or-patterns are not allowed in `let` bindings
34error: `let` bindings require top-level or-patterns in parentheses
3535 --> $DIR/nested-undelimited-precedence.rs:38:9
3636 |
3737LL | let &mut A(_) | B(_): F = A(3);
......@@ -42,7 +42,7 @@ help: wrap the pattern in parentheses
4242LL | let (&mut A(_) | B(_)): F = A(3);
4343 | + +
4444
45error: top-level or-patterns are not allowed in `let` bindings
45error: `let` bindings require top-level or-patterns in parentheses
4646 --> $DIR/nested-undelimited-precedence.rs:40:9
4747 |
4848LL | let &&mut A(_) | B(_): F = A(3);
tests/ui/or-patterns/or-patterns-syntactic-fail.rs+4-4
......@@ -16,18 +16,18 @@ fn no_top_level_or_patterns() {
1616fn no_top_level_or_patterns_2() {
1717 // ...and for now neither do we allow or-patterns at the top level of functions.
1818 fn fun1(A | B: E) {}
19 //~^ ERROR top-level or-patterns are not allowed
19 //~^ ERROR function parameters require top-level or-patterns in parentheses
2020
2121 fn fun2(| A | B: E) {}
22 //~^ ERROR top-level or-patterns are not allowed
22 //~^ ERROR function parameters require top-level or-patterns in parentheses
2323
2424 // We don't allow top-level or-patterns before type annotation in let-statements because we
2525 // want to reserve this syntactic space for possible future type ascription.
2626 let A | B: E = A;
27 //~^ ERROR top-level or-patterns are not allowed
27 //~^ ERROR `let` bindings require top-level or-patterns in parentheses
2828
2929 let | A | B: E = A;
30 //~^ ERROR top-level or-patterns are not allowed
30 //~^ ERROR `let` bindings require top-level or-patterns in parentheses
3131
3232 let (A | B): E = A; // ok -- wrapped in parens
3333}
tests/ui/or-patterns/or-patterns-syntactic-fail.stderr+4-4
......@@ -11,7 +11,7 @@ help: you might have meant to open the body of the closure
1111LL | let _ = |A | { B: E| ();
1212 | +
1313
14error: top-level or-patterns are not allowed in function parameters
14error: function parameters require top-level or-patterns in parentheses
1515 --> $DIR/or-patterns-syntactic-fail.rs:18:13
1616 |
1717LL | fn fun1(A | B: E) {}
......@@ -22,7 +22,7 @@ help: wrap the pattern in parentheses
2222LL | fn fun1((A | B): E) {}
2323 | + +
2424
25error: top-level or-patterns are not allowed in function parameters
25error: function parameters require top-level or-patterns in parentheses
2626 --> $DIR/or-patterns-syntactic-fail.rs:21:13
2727 |
2828LL | fn fun2(| A | B: E) {}
......@@ -33,7 +33,7 @@ help: wrap the pattern in parentheses
3333LL | fn fun2((| A | B): E) {}
3434 | + +
3535
36error: top-level or-patterns are not allowed in `let` bindings
36error: `let` bindings require top-level or-patterns in parentheses
3737 --> $DIR/or-patterns-syntactic-fail.rs:26:9
3838 |
3939LL | let A | B: E = A;
......@@ -44,7 +44,7 @@ help: wrap the pattern in parentheses
4444LL | let (A | B): E = A;
4545 | + +
4646
47error: top-level or-patterns are not allowed in `let` bindings
47error: `let` bindings require top-level or-patterns in parentheses
4848 --> $DIR/or-patterns-syntactic-fail.rs:29:9
4949 |
5050LL | let | A | B: E = A;
tests/ui/or-patterns/remove-leading-vert.fixed+1-1
......@@ -8,7 +8,7 @@ fn main() {}
88
99#[cfg(false)]
1010fn leading() {
11 fn fun1( A: E) {} //~ ERROR top-level or-patterns are not allowed
11 fn fun1( A: E) {} //~ ERROR function parameters require top-level or-patterns in parentheses
1212 fn fun2( A: E) {} //~ ERROR unexpected `||` before function parameter
1313 let ( | A): E;
1414 let ( | A): (E); //~ ERROR unexpected token `||` in pattern
tests/ui/or-patterns/remove-leading-vert.rs+1-1
......@@ -8,7 +8,7 @@ fn main() {}
88
99#[cfg(false)]
1010fn leading() {
11 fn fun1( | A: E) {} //~ ERROR top-level or-patterns are not allowed
11 fn fun1( | A: E) {} //~ ERROR function parameters require top-level or-patterns in parentheses
1212 fn fun2( || A: E) {} //~ ERROR unexpected `||` before function parameter
1313 let ( | A): E;
1414 let ( || A): (E); //~ ERROR unexpected token `||` in pattern
tests/ui/or-patterns/remove-leading-vert.stderr+1-1
......@@ -1,4 +1,4 @@
1error: top-level or-patterns are not allowed in function parameters
1error: function parameters require top-level or-patterns in parentheses
22 --> $DIR/remove-leading-vert.rs:11:14
33 |
44LL | fn fun1( | A: E) {}
tests/ui/rfcs/rfc-0000-never_patterns/parse.rs+1-1
......@@ -65,7 +65,7 @@ fn parse(x: Void) {
6565 let res: Result<bool, Void> = Ok(false);
6666 let Ok(_) = res;
6767 let Ok(_) | Err(!) = &res; // Disallowed; see #82048.
68 //~^ ERROR top-level or-patterns are not allowed in `let` bindings
68 //~^ ERROR `let` bindings require top-level or-patterns in parentheses
6969 let (Ok(_) | Err(!)) = &res;
7070 let (Ok(_) | Err(&!)) = res.as_ref();
7171
tests/ui/rfcs/rfc-0000-never_patterns/parse.stderr+1-1
......@@ -26,7 +26,7 @@ error: expected one of `,`, `=>`, `if`, `|`, or `}`, found `<=`
2626LL | Some(!) <=
2727 | ^^ expected one of `,`, `=>`, `if`, `|`, or `}`
2828
29error: top-level or-patterns are not allowed in `let` bindings
29error: `let` bindings require top-level or-patterns in parentheses
3030 --> $DIR/parse.rs:67:9
3131 |
3232LL | let Ok(_) | Err(!) = &res; // Disallowed; see #82048.
tests/ui/traits/const-traits/const-trait-impl-parameter-mismatch.rs created+32
......@@ -0,0 +1,32 @@
1// This test demonstrates an ICE that may occur when we try to resolve the instance
2// of a impl that has different generics than the trait it's implementing. This ensures
3// we first check that the args are compatible before resolving the body, just like
4// we do in projection before substituting a GAT.
5//
6// Regression test for issue #125877.
7
8//@ compile-flags: -Znext-solver
9
10#![feature(const_trait_impl, effects)]
11//~^ ERROR feature has been removed
12
13#[const_trait]
14trait Main {
15 fn compute<T: ~const Aux>() -> u32;
16}
17
18impl const Main for () {
19 fn compute<'x>() -> u32 {
20 //~^ ERROR associated function `compute` has 0 type parameters but its trait declaration has 1 type parameter
21 0
22 }
23}
24
25#[const_trait]
26trait Aux {}
27
28impl const Aux for () {}
29
30fn main() {
31 const _: u32 = <()>::compute::<()>();
32}
tests/ui/traits/const-traits/const-trait-impl-parameter-mismatch.stderr created+21
......@@ -0,0 +1,21 @@
1error[E0557]: feature has been removed
2 --> $DIR/const-trait-impl-parameter-mismatch.rs:10:30
3 |
4LL | #![feature(const_trait_impl, effects)]
5 | ^^^^^^^ feature has been removed
6 |
7 = note: removed, redundant with `#![feature(const_trait_impl)]`
8
9error[E0049]: associated function `compute` has 0 type parameters but its trait declaration has 1 type parameter
10 --> $DIR/const-trait-impl-parameter-mismatch.rs:19:16
11 |
12LL | fn compute<T: ~const Aux>() -> u32;
13 | - expected 1 type parameter
14...
15LL | fn compute<'x>() -> u32 {
16 | ^^ found 0 type parameters
17
18error: aborting due to 2 previous errors
19
20Some errors have detailed explanations: E0049, E0557.
21For more information about an error, try `rustc --explain E0049`.