Auto merge of #92915 - matthiaskrgr:rollup-pxxk8jp, r=matthiaskrgr
Rollup of 9 pull requests Successful merges: - #92191 (Prefer projection candidates instead of param_env candidates for Sized predicates) - #92382 (Extend const_convert to rest of blanket core::convert impls) - #92625 (Add `#[track_caller]` to `mirbug`) - #92684 (Export `tcp::IntoIncoming`) - #92743 (Use pre-interned symbols in a couple of places) - #92838 (Clean up some links in RELEASES) - #92868 (librustdoc: Address some clippy lints) - #92875 (Make `opt_const_param_of` work in the presence of `GenericArg::Infer`) - #92891 (Add myself to .mailmap) Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
69d25fc582
1
.mailmap
1
.mailmap
@ -129,6 +129,7 @@ Jakub Adam Wieczorek <jakub.adam.wieczorek@gmail.com> <jakub.bukaj@yahoo.com>
|
||||
Jakub Adam Wieczorek <jakub.adam.wieczorek@gmail.com> <jakub@jakub.cc>
|
||||
Jakub Adam Wieczorek <jakub.adam.wieczorek@gmail.com> <jakubw@jakubw.net>
|
||||
James Deng <cnjamesdeng@gmail.com> <cnJamesDeng@gmail.com>
|
||||
James Hinshelwood <jameshinshelwood1@gmail.com> <james.hinshelwood@bigpayme.com>
|
||||
James Miller <bladeon@gmail.com> <james@aatch.net>
|
||||
James Perry <james.austin.perry@gmail.com>
|
||||
Jason Fager <jfager@gmail.com>
|
||||
|
142
RELEASES.md
142
RELEASES.md
@ -95,19 +95,14 @@ and related tools.
|
||||
[87467]: https://github.com/rust-lang/rust/pull/87467/
|
||||
[87704]: https://github.com/rust-lang/rust/pull/87704/
|
||||
[88041]: https://github.com/rust-lang/rust/pull/88041/
|
||||
[88300]: https://github.com/rust-lang/rust/pull/88300/
|
||||
[88447]: https://github.com/rust-lang/rust/pull/88447/
|
||||
[88601]: https://github.com/rust-lang/rust/pull/88601/
|
||||
[88624]: https://github.com/rust-lang/rust/pull/88624/
|
||||
[89062]: https://github.com/rust-lang/rust/pull/89062/
|
||||
[89174]: https://github.com/rust-lang/rust/pull/89174/
|
||||
[89542]: https://github.com/rust-lang/rust/pull/89542/
|
||||
[89551]: https://github.com/rust-lang/rust/pull/89551/
|
||||
[89558]: https://github.com/rust-lang/rust/pull/89558/
|
||||
[89580]: https://github.com/rust-lang/rust/pull/89580/
|
||||
[89652]: https://github.com/rust-lang/rust/pull/89652/
|
||||
[89677]: https://github.com/rust-lang/rust/pull/89677/
|
||||
[89951]: https://github.com/rust-lang/rust/pull/89951/
|
||||
[90041]: https://github.com/rust-lang/rust/pull/90041/
|
||||
[90058]: https://github.com/rust-lang/rust/pull/90058/
|
||||
[90104]: https://github.com/rust-lang/rust/pull/90104/
|
||||
@ -123,11 +118,9 @@ and related tools.
|
||||
[90733]: https://github.com/rust-lang/rust/pull/90733/
|
||||
[90833]: https://github.com/rust-lang/rust/pull/90833/
|
||||
[90846]: https://github.com/rust-lang/rust/pull/90846/
|
||||
[90896]: https://github.com/rust-lang/rust/pull/90896/
|
||||
[91026]: https://github.com/rust-lang/rust/pull/91026/
|
||||
[91207]: https://github.com/rust-lang/rust/pull/91207/
|
||||
[91255]: https://github.com/rust-lang/rust/pull/91255/
|
||||
[91301]: https://github.com/rust-lang/rust/pull/91301/
|
||||
[cargo/10082]: https://github.com/rust-lang/cargo/pull/10082/
|
||||
[cargo/10107]: https://github.com/rust-lang/cargo/pull/10107/
|
||||
[`Metadata::is_symlink`]: https://doc.rust-lang.org/stable/std/fs/struct.Metadata.html#method.is_symlink
|
||||
@ -137,28 +130,7 @@ and related tools.
|
||||
[`Result::unwrap_unchecked`]: https://doc.rust-lang.org/stable/std/result/enum.Result.html#method.unwrap_unchecked
|
||||
[`Result::unwrap_err_unchecked`]: https://doc.rust-lang.org/stable/std/result/enum.Result.html#method.unwrap_err_unchecked
|
||||
[`File::options`]: https://doc.rust-lang.org/stable/std/fs/struct.File.html#method.options
|
||||
[`unix::process::ExitStatusExt::core_dumped`]: https://doc.rust-lang.org/stable/std/os/unix/process/trait.ExitStatusExt.html#tymethod.core_dumped
|
||||
[`unix::process::ExitStatusExt::stopped_signal`]: https://doc.rust-lang.org/stable/std/os/unix/process/trait.ExitStatusExt.html#tymethod.stopped_signal
|
||||
[`unix::process::ExitStatusExt::continued`]: https://doc.rust-lang.org/stable/std/os/unix/process/trait.ExitStatusExt.html#tymethod.continued
|
||||
[`unix::process::ExitStatusExt::into_raw`]: https://doc.rust-lang.org/stable/std/os/unix/process/trait.ExitStatusExt.html#tymethod.into_raw
|
||||
[`Duration::new`]: https://doc.rust-lang.org/stable/std/time/struct.Duration.html#method.new
|
||||
[`Duration::checked_add`]: https://doc.rust-lang.org/stable/std/time/struct.Duration.html#method.checked_add
|
||||
[`Duration::saturating_add`]: https://doc.rust-lang.org/stable/std/time/struct.Duration.html#method.saturating_add
|
||||
[`Duration::checked_sub`]: https://doc.rust-lang.org/stable/std/time/struct.Duration.html#method.checked_sub
|
||||
[`Duration::saturating_sub`]: https://doc.rust-lang.org/stable/std/time/struct.Duration.html#method.saturating_sub
|
||||
[`Duration::checked_mul`]: https://doc.rust-lang.org/stable/std/time/struct.Duration.html#method.checked_mul
|
||||
[`Duration::saturating_mul`]: https://doc.rust-lang.org/stable/std/time/struct.Duration.html#method.saturating_mul
|
||||
[`Duration::checked_div`]: https://doc.rust-lang.org/stable/std/time/struct.Duration.html#method.checked_div
|
||||
[`Duration::as_secs_f64`]: https://doc.rust-lang.org/stable/std/time/struct.Duration.html#method.as_secs_f64
|
||||
[`Duration::as_secs_f32`]: https://doc.rust-lang.org/stable/std/time/struct.Duration.html#method.as_secs_f32
|
||||
[`Duration::from_secs_f64`]: https://doc.rust-lang.org/stable/std/time/struct.Duration.html#method.from_secs_f64
|
||||
[`Duration::from_secs_f32`]: https://doc.rust-lang.org/stable/std/time/struct.Duration.html#method.from_secs_f32
|
||||
[`Duration::mul_f64`]: https://doc.rust-lang.org/stable/std/time/struct.Duration.html#method.mul_f64
|
||||
[`Duration::mul_f32`]: https://doc.rust-lang.org/stable/std/time/struct.Duration.html#method.mul_f32
|
||||
[`Duration::div_f64`]: https://doc.rust-lang.org/stable/std/time/struct.Duration.html#method.div_f64
|
||||
[`Duration::div_f32`]: https://doc.rust-lang.org/stable/std/time/struct.Duration.html#method.div_f32
|
||||
[`Duration::div_duration_f64`]: https://doc.rust-lang.org/stable/std/time/struct.Duration.html#method.div_duration_f64
|
||||
[`Duration::div_duration_f32`]: https://doc.rust-lang.org/stable/std/time/struct.Duration.html#method.div_duration_f32
|
||||
|
||||
Version 1.57.0 (2021-12-02)
|
||||
==========================
|
||||
@ -240,7 +212,6 @@ and related tools.
|
||||
[86191]: https://github.com/rust-lang/rust/pull/86191/
|
||||
[87220]: https://github.com/rust-lang/rust/pull/87220/
|
||||
[87260]: https://github.com/rust-lang/rust/pull/87260/
|
||||
[88243]: https://github.com/rust-lang/rust/pull/88243/
|
||||
[88321]: https://github.com/rust-lang/rust/pull/88321/
|
||||
[88529]: https://github.com/rust-lang/rust/pull/88529/
|
||||
[88690]: https://github.com/rust-lang/rust/pull/88690/
|
||||
@ -396,8 +367,6 @@ and related tools.
|
||||
as well as rustdoc.
|
||||
|
||||
[`std::os::unix::fs::chroot`]: https://doc.rust-lang.org/stable/std/os/unix/fs/fn.chroot.html
|
||||
[`Iterator::intersperse`]: https://doc.rust-lang.org/stable/std/iter/trait.Iterator.html#method.intersperse
|
||||
[`Iterator::intersperse_with`]: https://doc.rust-lang.org/stable/std/iter/trait.Iterator.html#method.intersperse
|
||||
[`UnsafeCell::raw_get`]: https://doc.rust-lang.org/stable/std/cell/struct.UnsafeCell.html#method.raw_get
|
||||
[`BufWriter::into_parts`]: https://doc.rust-lang.org/stable/std/io/struct.BufWriter.html#method.into_parts
|
||||
[`core::panic::{UnwindSafe, RefUnwindSafe, AssertUnwindSafe}`]: https://github.com/rust-lang/rust/pull/84662
|
||||
@ -419,12 +388,7 @@ and related tools.
|
||||
[rust#86183]: https://github.com/rust-lang/rust/pull/86183
|
||||
[rust#87385]: https://github.com/rust-lang/rust/pull/87385
|
||||
[rust#88100]: https://github.com/rust-lang/rust/pull/88100
|
||||
[rust#86860]: https://github.com/rust-lang/rust/pull/86860
|
||||
[rust#84039]: https://github.com/rust-lang/rust/pull/84039
|
||||
[rust#86492]: https://github.com/rust-lang/rust/pull/86492
|
||||
[rust#88363]: https://github.com/rust-lang/rust/pull/88363
|
||||
[rust#85305]: https://github.com/rust-lang/rust/pull/85305
|
||||
[rust#87832]: https://github.com/rust-lang/rust/pull/87832
|
||||
[rust#88069]: https://github.com/rust-lang/rust/pull/88069
|
||||
[rust#87472]: https://github.com/rust-lang/rust/pull/87472
|
||||
[rust#87699]: https://github.com/rust-lang/rust/pull/87699
|
||||
@ -435,31 +399,12 @@ and related tools.
|
||||
[rust#87580]: https://github.com/rust-lang/rust/pull/87580
|
||||
[rust#83342]: https://github.com/rust-lang/rust/pull/83342
|
||||
[rust#83093]: https://github.com/rust-lang/rust/pull/83093
|
||||
[rust#88177]: https://github.com/rust-lang/rust/pull/88177
|
||||
[rust#88548]: https://github.com/rust-lang/rust/pull/88548
|
||||
[rust#88551]: https://github.com/rust-lang/rust/pull/88551
|
||||
[rust#88299]: https://github.com/rust-lang/rust/pull/88299
|
||||
[rust#88220]: https://github.com/rust-lang/rust/pull/88220
|
||||
[rust#85835]: https://github.com/rust-lang/rust/pull/85835
|
||||
[rust#86879]: https://github.com/rust-lang/rust/pull/86879
|
||||
[rust#86744]: https://github.com/rust-lang/rust/pull/86744
|
||||
[rust#84662]: https://github.com/rust-lang/rust/pull/84662
|
||||
[rust#86593]: https://github.com/rust-lang/rust/pull/86593
|
||||
[rust#81050]: https://github.com/rust-lang/rust/pull/81050
|
||||
[rust#81363]: https://github.com/rust-lang/rust/pull/81363
|
||||
[rust#84111]: https://github.com/rust-lang/rust/pull/84111
|
||||
[rust#85769]: https://github.com/rust-lang/rust/pull/85769#issuecomment-854363720
|
||||
[rust#88490]: https://github.com/rust-lang/rust/pull/88490
|
||||
[rust#88269]: https://github.com/rust-lang/rust/pull/88269
|
||||
[rust#84176]: https://github.com/rust-lang/rust/pull/84176
|
||||
[rust#88399]: https://github.com/rust-lang/rust/pull/88399
|
||||
[rust#88227]: https://github.com/rust-lang/rust/pull/88227
|
||||
[rust#88200]: https://github.com/rust-lang/rust/pull/88200
|
||||
[rust#82776]: https://github.com/rust-lang/rust/pull/82776
|
||||
[rust#88077]: https://github.com/rust-lang/rust/pull/88077
|
||||
[rust#87728]: https://github.com/rust-lang/rust/pull/87728
|
||||
[rust#87050]: https://github.com/rust-lang/rust/pull/87050
|
||||
[rust#87619]: https://github.com/rust-lang/rust/pull/87619
|
||||
[rust#81825]: https://github.com/rust-lang/rust/pull/81825#issuecomment-808406918
|
||||
[rust#88019]: https://github.com/rust-lang/rust/pull/88019
|
||||
[rust#87666]: https://github.com/rust-lang/rust/pull/87666
|
||||
@ -565,20 +510,14 @@ Compatibility Notes
|
||||
[86294]: https://github.com/rust-lang/rust/pull/86294
|
||||
[86858]: https://github.com/rust-lang/rust/pull/86858
|
||||
[86761]: https://github.com/rust-lang/rust/pull/86761
|
||||
[85769]: https://github.com/rust-lang/rust/pull/85769
|
||||
[85746]: https://github.com/rust-lang/rust/pull/85746
|
||||
[85305]: https://github.com/rust-lang/rust/pull/85305
|
||||
[85270]: https://github.com/rust-lang/rust/pull/85270
|
||||
[84111]: https://github.com/rust-lang/rust/pull/84111
|
||||
[83918]: https://github.com/rust-lang/rust/pull/83918
|
||||
[79965]: https://github.com/rust-lang/rust/pull/79965
|
||||
[87370]: https://github.com/rust-lang/rust/pull/87370
|
||||
[87298]: https://github.com/rust-lang/rust/pull/87298
|
||||
[cargo/9663]: https://github.com/rust-lang/cargo/pull/9663
|
||||
[cargo/9675]: https://github.com/rust-lang/cargo/pull/9675
|
||||
[cargo/9550]: https://github.com/rust-lang/cargo/pull/9550
|
||||
[cargo/9680]: https://github.com/rust-lang/cargo/pull/9680
|
||||
[cargo/9663]: https://github.com/rust-lang/cargo/pull/9663
|
||||
[`array::map`]: https://doc.rust-lang.org/stable/std/primitive.array.html#method.map
|
||||
[`Bound::cloned`]: https://doc.rust-lang.org/stable/std/ops/enum.Bound.html#method.cloned
|
||||
[`Drain::as_str`]: https://doc.rust-lang.org/stable/std/string/struct.Drain.html#method.as_str
|
||||
@ -587,7 +526,6 @@ Compatibility Notes
|
||||
[`MaybeUninit::assume_init_mut`]: https://doc.rust-lang.org/stable/std/mem/union.MaybeUninit.html#method.assume_init_mut
|
||||
[`MaybeUninit::assume_init_ref`]: https://doc.rust-lang.org/stable/std/mem/union.MaybeUninit.html#method.assume_init_ref
|
||||
[`MaybeUninit::write`]: https://doc.rust-lang.org/stable/std/mem/union.MaybeUninit.html#method.write
|
||||
[`Seek::rewind`]: https://doc.rust-lang.org/stable/std/io/trait.Seek.html#method.rewind
|
||||
[`ops::ControlFlow`]: https://doc.rust-lang.org/stable/std/ops/enum.ControlFlow.html
|
||||
[`str::from_utf8_unchecked`]: https://doc.rust-lang.org/stable/std/str/fn.from_utf8_unchecked.html
|
||||
[`x86::_bittest`]: https://doc.rust-lang.org/stable/core/arch/x86/fn._bittest.html
|
||||
@ -691,7 +629,6 @@ Compatibility Notes
|
||||
[85574]: https://github.com/rust-lang/rust/issues/85574
|
||||
[86831]: https://github.com/rust-lang/rust/issues/86831
|
||||
[86063]: https://github.com/rust-lang/rust/issues/86063
|
||||
[86831]: https://github.com/rust-lang/rust/issues/86831
|
||||
[79608]: https://github.com/rust-lang/rust/pull/79608
|
||||
[84988]: https://github.com/rust-lang/rust/pull/84988
|
||||
[84701]: https://github.com/rust-lang/rust/pull/84701
|
||||
@ -893,7 +830,6 @@ related tools.
|
||||
[`Ordering::is_le`]: https://doc.rust-lang.org/std/cmp/enum.Ordering.html#method.is_le
|
||||
[`Ordering::is_lt`]: https://doc.rust-lang.org/std/cmp/enum.Ordering.html#method.is_lt
|
||||
[`Ordering::is_ne`]: https://doc.rust-lang.org/std/cmp/enum.Ordering.html#method.is_ne
|
||||
[`OsStr::eq_ignore_ascii_case`]: https://doc.rust-lang.org/std/ffi/struct.OsStr.html#method.eq_ignore_ascii_case
|
||||
[`OsStr::is_ascii`]: https://doc.rust-lang.org/std/ffi/struct.OsStr.html#method.is_ascii
|
||||
[`OsStr::make_ascii_lowercase`]: https://doc.rust-lang.org/std/ffi/struct.OsStr.html#method.make_ascii_lowercase
|
||||
[`OsStr::make_ascii_uppercase`]: https://doc.rust-lang.org/std/ffi/struct.OsStr.html#method.make_ascii_uppercase
|
||||
@ -1224,7 +1160,6 @@ Internal Only
|
||||
[80053]: https://github.com/rust-lang/rust/pull/80053
|
||||
[79502]: https://github.com/rust-lang/rust/pull/79502
|
||||
[75180]: https://github.com/rust-lang/rust/pull/75180
|
||||
[79135]: https://github.com/rust-lang/rust/pull/79135
|
||||
[81521]: https://github.com/rust-lang/rust/pull/81521
|
||||
[80968]: https://github.com/rust-lang/rust/pull/80968
|
||||
[80959]: https://github.com/rust-lang/rust/pull/80959
|
||||
@ -1538,7 +1473,6 @@ related tools.
|
||||
[`slice::select_nth_unstable`]: https://doc.rust-lang.org/nightly/std/primitive.slice.html#method.select_nth_unstable
|
||||
[`slice::select_nth_unstable_by`]: https://doc.rust-lang.org/nightly/std/primitive.slice.html#method.select_nth_unstable_by
|
||||
[`slice::select_nth_unstable_by_key`]: https://doc.rust-lang.org/nightly/std/primitive.slice.html#method.select_nth_unstable_by_key
|
||||
[`hint::spin_loop`]: https://doc.rust-lang.org/stable/std/hint/fn.spin_loop.html
|
||||
[`Poll::is_ready`]: https://doc.rust-lang.org/stable/std/task/enum.Poll.html#method.is_ready
|
||||
[`Poll::is_pending`]: https://doc.rust-lang.org/stable/std/task/enum.Poll.html#method.is_pending
|
||||
[rustdoc-ws-post]: https://blog.guillaume-gomez.fr/articles/2020-11-11+New+doc+comment+handling+in+rustdoc
|
||||
@ -1785,8 +1719,6 @@ Internal Only
|
||||
[74869]: https://github.com/rust-lang/rust/pull/74869/
|
||||
[73858]: https://github.com/rust-lang/rust/pull/73858/
|
||||
[75716]: https://github.com/rust-lang/rust/pull/75716/
|
||||
[75908]: https://github.com/rust-lang/rust/pull/75908/
|
||||
[75516]: https://github.com/rust-lang/rust/pull/75516/
|
||||
[75560]: https://github.com/rust-lang/rust/pull/75560/
|
||||
[75568]: https://github.com/rust-lang/rust/pull/75568/
|
||||
[75366]: https://github.com/rust-lang/rust/pull/75366/
|
||||
@ -1801,7 +1733,6 @@ Internal Only
|
||||
[73583]: https://github.com/rust-lang/rust/pull/73583/
|
||||
[73084]: https://github.com/rust-lang/rust/pull/73084/
|
||||
[73197]: https://github.com/rust-lang/rust/pull/73197/
|
||||
[72488]: https://github.com/rust-lang/rust/pull/72488/
|
||||
[cargo/8456]: https://github.com/rust-lang/cargo/pull/8456/
|
||||
[cargo/8478]: https://github.com/rust-lang/cargo/pull/8478/
|
||||
[cargo/8485]: https://github.com/rust-lang/cargo/pull/8485/
|
||||
@ -1812,7 +1743,6 @@ Internal Only
|
||||
[`RangeInclusive::is_empty`]: https://doc.rust-lang.org/nightly/std/ops/struct.RangeInclusive.html#method.is_empty
|
||||
[`Result::as_deref_mut`]: https://doc.rust-lang.org/nightly/std/result/enum.Result.html#method.as_deref_mut
|
||||
[`Result::as_deref`]: https://doc.rust-lang.org/nightly/std/result/enum.Result.html#method.as_deref
|
||||
[`TypeId::of`]: https://doc.rust-lang.org/nightly/std/any/struct.TypeId.html#method.of
|
||||
[`Vec::leak`]: https://doc.rust-lang.org/nightly/std/vec/struct.Vec.html#method.leak
|
||||
[`f32::TAU`]: https://doc.rust-lang.org/nightly/std/f32/consts/constant.TAU.html
|
||||
[`f64::TAU`]: https://doc.rust-lang.org/nightly/std/f64/consts/constant.TAU.html
|
||||
@ -2796,7 +2726,6 @@ Compatibility Notes
|
||||
[63803]: https://github.com/rust-lang/rust/pull/63803/
|
||||
[cargo/7450]: https://github.com/rust-lang/cargo/pull/7450/
|
||||
[cargo/7507]: https://github.com/rust-lang/cargo/pull/7507/
|
||||
[cargo/7525]: https://github.com/rust-lang/cargo/pull/7525/
|
||||
[cargo/7333]: https://github.com/rust-lang/cargo/pull/7333/
|
||||
[(rfc 2008)]: https://rust-lang.github.io/rfcs/2008-non-exhaustive.html
|
||||
[`f32::to_be_bytes`]: https://doc.rust-lang.org/std/primitive.f32.html#method.to_be_bytes
|
||||
@ -2929,13 +2858,6 @@ Compatibility Notes
|
||||
[63786]: https://github.com/rust-lang/rust/pull/63786/
|
||||
[63827]: https://github.com/rust-lang/rust/pull/63827/
|
||||
[63834]: https://github.com/rust-lang/rust/pull/63834/
|
||||
[63927]: https://github.com/rust-lang/rust/pull/63927/
|
||||
[63933]: https://github.com/rust-lang/rust/pull/63933/
|
||||
[63934]: https://github.com/rust-lang/rust/pull/63934/
|
||||
[63938]: https://github.com/rust-lang/rust/pull/63938/
|
||||
[63940]: https://github.com/rust-lang/rust/pull/63940/
|
||||
[63941]: https://github.com/rust-lang/rust/pull/63941/
|
||||
[63945]: https://github.com/rust-lang/rust/pull/63945/
|
||||
[64010]: https://github.com/rust-lang/rust/pull/64010/
|
||||
[64028]: https://github.com/rust-lang/rust/pull/64028/
|
||||
[64334]: https://github.com/rust-lang/rust/pull/64334/
|
||||
@ -3164,7 +3086,6 @@ Compatibility Notes
|
||||
[`Cell<slice>::as_slice_of_cells`]: https://doc.rust-lang.org/std/cell/struct.Cell.html#method.as_slice_of_cells
|
||||
[`DoubleEndedIterator::nth_back`]: https://doc.rust-lang.org/std/iter/trait.DoubleEndedIterator.html#method.nth_back
|
||||
[`Option::xor`]: https://doc.rust-lang.org/std/option/enum.Option.html#method.xor
|
||||
[`RefCell::try_borrow_unguarded`]: https://doc.rust-lang.org/std/cell/struct.RefCell.html#method.try_borrow_unguarded
|
||||
[`Wrapping::reverse_bits`]: https://doc.rust-lang.org/std/num/struct.Wrapping.html#method.reverse_bits
|
||||
[`i128::reverse_bits`]: https://doc.rust-lang.org/std/primitive.i128.html#method.reverse_bits
|
||||
[`i16::reverse_bits`]: https://doc.rust-lang.org/std/primitive.i16.html#method.reverse_bits
|
||||
@ -3663,7 +3584,6 @@ Compatibility Notes
|
||||
- [Libtest no longer creates a new thread for each test when
|
||||
`--test-threads=1`. It also runs the tests in deterministic order][56243]
|
||||
|
||||
[55982]: https://github.com/rust-lang/rust/pull/55982/
|
||||
[56243]: https://github.com/rust-lang/rust/pull/56243
|
||||
[56303]: https://github.com/rust-lang/rust/pull/56303/
|
||||
[56351]: https://github.com/rust-lang/rust/pull/56351/
|
||||
@ -4063,7 +3983,6 @@ Cargo
|
||||
|
||||
[52813]: https://github.com/rust-lang/rust/pull/52813/
|
||||
[53218]: https://github.com/rust-lang/rust/pull/53218/
|
||||
[53555]: https://github.com/rust-lang/rust/issues/53555/
|
||||
[54057]: https://github.com/rust-lang/rust/pull/54057/
|
||||
[54240]: https://github.com/rust-lang/rust/pull/54240/
|
||||
[54430]: https://github.com/rust-lang/rust/pull/54430/
|
||||
@ -4185,7 +4104,6 @@ Misc
|
||||
[53044]: https://github.com/rust-lang/rust/pull/53044/
|
||||
[53165]: https://github.com/rust-lang/rust/pull/53165/
|
||||
[53611]: https://github.com/rust-lang/rust/pull/53611/
|
||||
[53213]: https://github.com/rust-lang/rust/pull/53213/
|
||||
[53236]: https://github.com/rust-lang/rust/pull/53236/
|
||||
[53272]: https://github.com/rust-lang/rust/pull/53272/
|
||||
[53370]: https://github.com/rust-lang/rust/pull/53370/
|
||||
@ -4193,7 +4111,6 @@ Misc
|
||||
[53774]: https://github.com/rust-lang/rust/pull/53774/
|
||||
[53822]: https://github.com/rust-lang/rust/pull/53822/
|
||||
[54057]: https://github.com/rust-lang/rust/pull/54057/
|
||||
[54146]: https://github.com/rust-lang/rust/pull/54146/
|
||||
[54404]: https://github.com/rust-lang/rust/pull/54404/
|
||||
[cargo/5877]: https://github.com/rust-lang/cargo/pull/5877/
|
||||
[cargo/5878]: https://github.com/rust-lang/cargo/pull/5878/
|
||||
@ -4301,12 +4218,10 @@ Compatibility Notes
|
||||
[52330]: https://github.com/rust-lang/rust/pull/52330/
|
||||
[52354]: https://github.com/rust-lang/rust/pull/52354/
|
||||
[52402]: https://github.com/rust-lang/rust/pull/52402/
|
||||
[52103]: https://github.com/rust-lang/rust/pull/52103/
|
||||
[52197]: https://github.com/rust-lang/rust/pull/52197/
|
||||
[51807]: https://github.com/rust-lang/rust/pull/51807/
|
||||
[51899]: https://github.com/rust-lang/rust/pull/51899/
|
||||
[51912]: https://github.com/rust-lang/rust/pull/51912/
|
||||
[51511]: https://github.com/rust-lang/rust/pull/51511/
|
||||
[51619]: https://github.com/rust-lang/rust/pull/51619/
|
||||
[51656]: https://github.com/rust-lang/rust/pull/51656/
|
||||
[51178]: https://github.com/rust-lang/rust/pull/51178/
|
||||
@ -4446,7 +4361,6 @@ Compatibility Notes
|
||||
[50855]: https://github.com/rust-lang/rust/pull/50855/
|
||||
[51050]: https://github.com/rust-lang/rust/pull/51050/
|
||||
[51196]: https://github.com/rust-lang/rust/pull/51196/
|
||||
[51200]: https://github.com/rust-lang/rust/pull/51200/
|
||||
[51241]: https://github.com/rust-lang/rust/pull/51241/
|
||||
[51276]: https://github.com/rust-lang/rust/pull/51276/
|
||||
[51298]: https://github.com/rust-lang/rust/pull/51298/
|
||||
@ -4627,15 +4541,12 @@ Compatibility Notes
|
||||
[49664]: https://github.com/rust-lang/rust/pull/49664/
|
||||
[49699]: https://github.com/rust-lang/rust/pull/49699/
|
||||
[49707]: https://github.com/rust-lang/rust/pull/49707/
|
||||
[49719]: https://github.com/rust-lang/rust/pull/49719/
|
||||
[49896]: https://github.com/rust-lang/rust/pull/49896/
|
||||
[49968]: https://github.com/rust-lang/rust/pull/49968/
|
||||
[50163]: https://github.com/rust-lang/rust/pull/50163
|
||||
[50177]: https://github.com/rust-lang/rust/pull/50177/
|
||||
[50378]: https://github.com/rust-lang/rust/pull/50378/
|
||||
[50398]: https://github.com/rust-lang/rust/pull/50398/
|
||||
[50423]: https://github.com/rust-lang/rust/pull/50423/
|
||||
[cargo/5203]: https://github.com/rust-lang/cargo/pull/5203/
|
||||
[cargo/5335]: https://github.com/rust-lang/cargo/pull/5335/
|
||||
[cargo/5359]: https://github.com/rust-lang/cargo/pull/5359/
|
||||
[cargo/5360]: https://github.com/rust-lang/cargo/pull/5360/
|
||||
@ -4837,7 +4748,6 @@ Compatibility Notes
|
||||
[47813]: https://github.com/rust-lang/rust/pull/47813
|
||||
[48056]: https://github.com/rust-lang/rust/pull/48056
|
||||
[48125]: https://github.com/rust-lang/rust/pull/48125
|
||||
[48166]: https://github.com/rust-lang/rust/pull/48166
|
||||
[48235]: https://github.com/rust-lang/rust/pull/48235
|
||||
[48274]: https://github.com/rust-lang/rust/pull/48274
|
||||
[48281]: https://github.com/rust-lang/rust/pull/48281
|
||||
@ -4854,10 +4764,7 @@ Compatibility Notes
|
||||
[48978]: https://github.com/rust-lang/rust/pull/48978
|
||||
[49101]: https://github.com/rust-lang/rust/pull/49101
|
||||
[49109]: https://github.com/rust-lang/rust/pull/49109
|
||||
[49121]: https://github.com/rust-lang/rust/pull/49121
|
||||
[49162]: https://github.com/rust-lang/rust/pull/49162
|
||||
[49184]: https://github.com/rust-lang/rust/pull/49184
|
||||
[49234]: https://github.com/rust-lang/rust/pull/49234
|
||||
[49255]: https://github.com/rust-lang/rust/pull/49255
|
||||
[49299]: https://github.com/rust-lang/rust/pull/49299
|
||||
[49305]: https://github.com/rust-lang/rust/pull/49305
|
||||
@ -5104,7 +5011,6 @@ Compatibility Notes
|
||||
[44884]: https://github.com/rust-lang/rust/pull/44884
|
||||
[45198]: https://github.com/rust-lang/rust/pull/45198
|
||||
[45506]: https://github.com/rust-lang/rust/pull/45506
|
||||
[45904]: https://github.com/rust-lang/rust/pull/45904
|
||||
[45990]: https://github.com/rust-lang/rust/pull/45990
|
||||
[46012]: https://github.com/rust-lang/rust/pull/46012
|
||||
[46077]: https://github.com/rust-lang/rust/pull/46077
|
||||
@ -5116,7 +5022,6 @@ Compatibility Notes
|
||||
[46671]: https://github.com/rust-lang/rust/pull/46671
|
||||
[46713]: https://github.com/rust-lang/rust/pull/46713
|
||||
[46735]: https://github.com/rust-lang/rust/pull/46735
|
||||
[46749]: https://github.com/rust-lang/rust/pull/46749
|
||||
[46760]: https://github.com/rust-lang/rust/pull/46760
|
||||
[46798]: https://github.com/rust-lang/rust/pull/46798
|
||||
[46828]: https://github.com/rust-lang/rust/pull/46828
|
||||
@ -5287,7 +5192,6 @@ Compatibility Notes
|
||||
|
||||
|
||||
[42526]: https://github.com/rust-lang/rust/pull/42526
|
||||
[43017]: https://github.com/rust-lang/rust/pull/43017
|
||||
[43716]: https://github.com/rust-lang/rust/pull/43716
|
||||
[43949]: https://github.com/rust-lang/rust/pull/43949
|
||||
[44015]: https://github.com/rust-lang/rust/pull/44015
|
||||
@ -5517,8 +5421,6 @@ Cargo
|
||||
- [Added `--no-fail-fast` flag to cargo to run all benchmarks regardless of
|
||||
failure.][cargo/4248]
|
||||
- [Changed the convention around which file is the crate root.][cargo/4259]
|
||||
- [The `include`/`exclude` property in `Cargo.toml` now accepts gitignore paths
|
||||
instead of glob patterns][cargo/4270]. Glob patterns are now deprecated.
|
||||
|
||||
Compatibility Notes
|
||||
-------------------
|
||||
@ -5561,7 +5463,6 @@ Compatibility Notes
|
||||
[cargo/4229]: https://github.com/rust-lang/cargo/pull/4229
|
||||
[cargo/4248]: https://github.com/rust-lang/cargo/pull/4248
|
||||
[cargo/4259]: https://github.com/rust-lang/cargo/pull/4259
|
||||
[cargo/4270]: https://github.com/rust-lang/cargo/pull/4270
|
||||
[`CStr::into_c_string`]: https://doc.rust-lang.org/std/ffi/struct.CStr.html#method.into_c_string
|
||||
[`CString::as_c_str`]: https://doc.rust-lang.org/std/ffi/struct.CString.html#method.as_c_str
|
||||
[`CString::into_boxed_c_str`]: https://doc.rust-lang.org/std/ffi/struct.CString.html#method.into_boxed_c_str
|
||||
@ -5854,7 +5755,6 @@ Misc
|
||||
----
|
||||
|
||||
- [rustdoc can now use pulldown-cmark with the `--enable-commonmark` flag][40338]
|
||||
- [Added rust-windbg script for better debugging on Windows][39983]
|
||||
- [Rust now uses the official cross compiler for NetBSD][40612]
|
||||
- [rustdoc now accepts `#` at the start of files][40828]
|
||||
- [Fixed jemalloc support for musl][41168]
|
||||
@ -5889,7 +5789,6 @@ Compatibility Notes
|
||||
[38165]: https://github.com/rust-lang/rust/pull/38165
|
||||
[39799]: https://github.com/rust-lang/rust/pull/39799
|
||||
[39891]: https://github.com/rust-lang/rust/pull/39891
|
||||
[39983]: https://github.com/rust-lang/rust/pull/39983
|
||||
[40043]: https://github.com/rust-lang/rust/pull/40043
|
||||
[40241]: https://github.com/rust-lang/rust/pull/40241
|
||||
[40338]: https://github.com/rust-lang/rust/pull/40338
|
||||
@ -6185,7 +6084,6 @@ Compatibility Notes
|
||||
[cargo/3691]: https://github.com/rust-lang/cargo/pull/3691
|
||||
[cargo/3699]: https://github.com/rust-lang/cargo/pull/3699
|
||||
[cargo/3731]: https://github.com/rust-lang/cargo/pull/3731
|
||||
[mdbook]: https://crates.io/crates/mdbook
|
||||
[ubook]: https://doc.rust-lang.org/unstable-book/
|
||||
|
||||
|
||||
@ -6256,7 +6154,7 @@ Libraries
|
||||
* [Ctrl-Z returns from `Stdin.read()` when reading from the console on
|
||||
Windows][38274]
|
||||
* [std: Fix partial writes in `LineWriter`][38062]
|
||||
* [std: Clamp max read/write sizes on Unix][38062]
|
||||
* [std: Clamp max read/write sizes on Unix][38622]
|
||||
* [Use more specific panic message for `&str` slicing errors][38066]
|
||||
* [`TcpListener::set_only_v6` is deprecated][38304]. This
|
||||
functionality cannot be achieved in std currently.
|
||||
@ -6322,7 +6220,7 @@ Compatibility Notes
|
||||
[38006]: https://github.com/rust-lang/rust/pull/38006
|
||||
[38051]: https://github.com/rust-lang/rust/pull/38051
|
||||
[38062]: https://github.com/rust-lang/rust/pull/38062
|
||||
[38062]: https://github.com/rust-lang/rust/pull/38622
|
||||
[38622]: https://github.com/rust-lang/rust/pull/38622
|
||||
[38066]: https://github.com/rust-lang/rust/pull/38066
|
||||
[38069]: https://github.com/rust-lang/rust/pull/38069
|
||||
[38131]: https://github.com/rust-lang/rust/pull/38131
|
||||
@ -6330,7 +6228,6 @@ Compatibility Notes
|
||||
[38274]: https://github.com/rust-lang/rust/pull/38274
|
||||
[38304]: https://github.com/rust-lang/rust/pull/38304
|
||||
[38313]: https://github.com/rust-lang/rust/pull/38313
|
||||
[38314]: https://github.com/rust-lang/rust/pull/38314
|
||||
[38327]: https://github.com/rust-lang/rust/pull/38327
|
||||
[38401]: https://github.com/rust-lang/rust/pull/38401
|
||||
[38413]: https://github.com/rust-lang/rust/pull/38413
|
||||
@ -6380,7 +6277,6 @@ Compatibility Notes
|
||||
[cargo/3546]: https://github.com/rust-lang/cargo/pull/3546
|
||||
[cargo/3557]: https://github.com/rust-lang/cargo/pull/3557
|
||||
[cargo/3604]: https://github.com/rust-lang/cargo/pull/3604
|
||||
[RFC 1623]: https://github.com/rust-lang/rfcs/blob/master/text/1623-static.md
|
||||
|
||||
|
||||
Version 1.15.1 (2017-02-09)
|
||||
@ -6595,7 +6491,6 @@ Compatibility Notes
|
||||
[38192]: https://github.com/rust-lang/rust/pull/38192
|
||||
[38279]: https://github.com/rust-lang/rust/pull/38279
|
||||
[38835]: https://github.com/rust-lang/rust/pull/38835
|
||||
[RFC 1492]: https://github.com/rust-lang/rfcs/blob/master/text/1492-dotdot-in-patterns.md
|
||||
[RFC 1506]: https://github.com/rust-lang/rfcs/blob/master/text/1506-adt-kinds.md
|
||||
[RFC 1560]: https://github.com/rust-lang/rfcs/blob/master/text/1560-name-resolution.md
|
||||
[RFC 1681]: https://github.com/rust-lang/rfcs/blob/master/text/1681-macros-1.1.md
|
||||
@ -6784,7 +6679,6 @@ Compatibility Notes
|
||||
[1.14wasm]: https://users.rust-lang.org/t/compiling-to-the-web-with-rust-and-emscripten/7627
|
||||
[36430]: https://github.com/rust-lang/rust/pull/36430
|
||||
[36595]: https://github.com/rust-lang/rust/pull/36595
|
||||
[36595]: https://github.com/rust-lang/rust/pull/36595
|
||||
[36692]: https://github.com/rust-lang/rust/pull/36692
|
||||
[36767]: https://github.com/rust-lang/rust/pull/36767
|
||||
[36794]: https://github.com/rust-lang/rust/pull/36794
|
||||
@ -7012,7 +6906,6 @@ Compatibility Notes
|
||||
[34623]: https://github.com/rust-lang/rust/pull/34623
|
||||
[34923]: https://github.com/rust-lang/rust/pull/34923
|
||||
[34942]: https://github.com/rust-lang/rust/pull/34942
|
||||
[34982]: https://github.com/rust-lang/rust/pull/34982
|
||||
[35021]: https://github.com/rust-lang/rust/pull/35021
|
||||
[35048]: https://github.com/rust-lang/rust/pull/35048
|
||||
[35074]: https://github.com/rust-lang/rust/pull/35074
|
||||
@ -7069,7 +6962,6 @@ Compatibility Notes
|
||||
[36586]: https://github.com/rust-lang/rust/pull/36586
|
||||
[36592]: https://github.com/rust-lang/rust/pull/36592
|
||||
[36631]: https://github.com/rust-lang/rust/pull/36631
|
||||
[36639]: https://github.com/rust-lang/rust/pull/36639
|
||||
[36721]: https://github.com/rust-lang/rust/pull/36721
|
||||
[36727]: https://github.com/rust-lang/rust/pull/36727
|
||||
[36730]: https://github.com/rust-lang/rust/pull/36730
|
||||
@ -7101,7 +6993,6 @@ Compatibility Notes
|
||||
[cargo/3205]: https://github.com/rust-lang/cargo/pull/3205
|
||||
[cargo/3241]: https://github.com/rust-lang/cargo/pull/3241
|
||||
[cargo/3242]: https://github.com/rust-lang/cargo/pull/3242
|
||||
[rustup]: https://www.rustup.rs
|
||||
[`checked_abs`]: https://doc.rust-lang.org/std/primitive.i32.html#method.checked_abs
|
||||
[`wrapping_abs`]: https://doc.rust-lang.org/std/primitive.i32.html#method.wrapping_abs
|
||||
[`overflowing_abs`]: https://doc.rust-lang.org/std/primitive.i32.html#method.overflowing_abs
|
||||
@ -8019,7 +7910,7 @@ Cargo
|
||||
targets can be specified together. [RFC 1361].
|
||||
* [The environment variables `CARGO_TARGET_ROOT`, `RUSTC`, and
|
||||
`RUSTDOC` take precedence over the `build.target-dir`,
|
||||
`build.rustc`, and `build.rustdoc` configuration values][1.8cv].
|
||||
`build.rustc`, and `build.rustdoc` configuration values][1.8cfv].
|
||||
* [The child process tree is killed on Windows when Cargo is
|
||||
killed][1.8ck].
|
||||
* [The `build.target` configuration value sets the target platform,
|
||||
@ -8069,7 +7960,7 @@ Compatibility Notes
|
||||
[1.8ck]: https://github.com/rust-lang/cargo/pull/2370
|
||||
[1.8ct]: https://github.com/rust-lang/cargo/pull/2335
|
||||
[1.8cu]: https://github.com/rust-lang/rust/pull/31390
|
||||
[1.8cv]: https://github.com/rust-lang/cargo/issues/2365
|
||||
[1.8cfv]: https://github.com/rust-lang/cargo/issues/2365
|
||||
[1.8cv]: https://github.com/rust-lang/rust/pull/30998
|
||||
[1.8h]: https://github.com/rust-lang/rust/pull/31460
|
||||
[1.8l]: https://github.com/rust-lang/rust/pull/31668
|
||||
@ -8992,13 +8883,13 @@ Misc
|
||||
* The compiler gained many new extended error descriptions, which can
|
||||
be accessed with the `--explain` flag.
|
||||
* The `dropck` pass, which checks that destructors can't access
|
||||
destroyed values, [has been rewritten][dropck]. This fixes some
|
||||
destroyed values, [has been rewritten][27261]. This fixes some
|
||||
soundness holes, and as such will cause some previously-compiling
|
||||
code to no longer build.
|
||||
* `rustc` now uses [LLVM to write archive files where possible][ar].
|
||||
Eventually this will eliminate the compiler's dependency on the ar
|
||||
utility.
|
||||
* Rust has [preliminary support for i686 FreeBSD][fb] (it has long
|
||||
* Rust has [preliminary support for i686 FreeBSD][26959] (it has long
|
||||
supported FreeBSD on x86_64).
|
||||
* The [`unused_mut`][lum], [`unconditional_recursion`][lur],
|
||||
[`improper_ctypes`][lic], and [`negate_unsigned`][lnu] lints are
|
||||
@ -9037,7 +8928,7 @@ Misc
|
||||
[ar]: https://github.com/rust-lang/rust/pull/26926
|
||||
[b14]: https://static.rust-lang.org/dist/rust-beta-x86_64-pc-windows-msvc.msi
|
||||
[dms]: https://github.com/rust-lang/rust/pull/26241
|
||||
[dropck]: https://github.com/rust-lang/rust/pull/27261
|
||||
[27261]: https://github.com/rust-lang/rust/pull/27261
|
||||
[dropckrfc]: https://github.com/rust-lang/rfcs/blob/master/text/0769-sound-generic-drop.md
|
||||
[ds]: https://github.com/rust-lang/rust/pull/26818
|
||||
[dst1]: http://doc.rust-lang.org/nightly/std/mem/fn.size_of_val.html
|
||||
@ -9045,9 +8936,8 @@ Misc
|
||||
[dst3]: https://github.com/rust-lang/rust/pull/27351
|
||||
[e]: https://github.com/rust-lang/rust/pull/24793
|
||||
[f]: https://github.com/rust-lang/rust/pull/26588
|
||||
[fb]: https://github.com/rust-lang/rust/pull/26959
|
||||
[26959]: https://github.com/rust-lang/rust/pull/26959
|
||||
[fl]: https://github.com/rust-lang/rust-installer/pull/41
|
||||
[hs]: http://doc.rust-lang.org/nightly/std/hash/trait.Hash.html#method.hash_slice
|
||||
[ie]: http://doc.rust-lang.org/nightly/std/io/struct.Error.html
|
||||
[iec]: http://doc.rust-lang.org/nightly/std/io/struct.Error.html#method.cause
|
||||
[iegm]: http://doc.rust-lang.org/nightly/std/io/struct.Error.html#method.get_mut
|
||||
@ -9318,7 +9208,7 @@ Misc
|
||||
to rustc.
|
||||
* [Android executables are always position independent][pie].
|
||||
* [The `drop_with_repr_extern` lint warns about mixing `repr(C)`
|
||||
with `Drop`][drop].
|
||||
with `Drop`][24935].
|
||||
|
||||
[`str::split_whitespace`]: https://doc.rust-lang.org/nightly/std/primitive.str.html#method.split_whitespace
|
||||
[`FromRawFd`]: https://doc.rust-lang.org/nightly/std/os/unix/io/trait.FromRawFd.html
|
||||
@ -9348,7 +9238,7 @@ Misc
|
||||
[`BinaryHeap`]: https://doc.rust-lang.org/nightly/std/collections/struct.BinaryHeap.html
|
||||
[ll]: https://github.com/rust-lang/rust/pull/26022
|
||||
[`split_off`]: https://doc.rust-lang.org/nightly/collections/linked_list/struct.LinkedList.html#method.split_off
|
||||
[drop]: https://github.com/rust-lang/rust/pull/24935
|
||||
[24935]: https://github.com/rust-lang/rust/pull/24935
|
||||
|
||||
Version 1.0.0 (2015-05-15)
|
||||
========================
|
||||
@ -9401,7 +9291,7 @@ Language
|
||||
property: generic code cannot behave differently for different type
|
||||
arguments except in minor ways.
|
||||
* The `unsafe_destructor` feature is now deprecated in favor of the
|
||||
[new `dropck`][dropck]. This change is a major reduction in unsafe
|
||||
[new `dropck`][rfc769]. This change is a major reduction in unsafe
|
||||
code.
|
||||
|
||||
Libraries
|
||||
@ -9409,7 +9299,7 @@ Libraries
|
||||
|
||||
* The `thread_local` module [has been renamed to `std::thread`][th].
|
||||
* The methods of `IteratorExt` [have been moved to the `Iterator`
|
||||
trait itself][ie].
|
||||
trait itself][23300].
|
||||
* Several traits that implement Rust's conventions for type
|
||||
conversions, `AsMut`, `AsRef`, `From`, and `Into` have been
|
||||
[centralized in the `std::convert` module][con].
|
||||
@ -9428,7 +9318,7 @@ Libraries
|
||||
* [In method resolution, object methods are resolved before inherent
|
||||
methods][meth].
|
||||
* [`String::from_str` has been deprecated in favor of the `From` impl,
|
||||
`String::from`][sf].
|
||||
`String::from`][24517].
|
||||
* [`io::Error` implements `Sync`][ios].
|
||||
* [The `words` method on `&str` has been replaced with
|
||||
`split_whitespace`][sw], to avoid answering the tricky question, 'what is
|
||||
@ -9476,7 +9366,7 @@ Misc
|
||||
[con]: https://github.com/rust-lang/rust/pull/23875
|
||||
[cr]: https://github.com/rust-lang/rust/pull/23419
|
||||
[fe]: https://github.com/rust-lang/rust/pull/23879
|
||||
[ie]: https://github.com/rust-lang/rust/pull/23300
|
||||
[23300]: https://github.com/rust-lang/rust/pull/23300
|
||||
[inv]: https://github.com/rust-lang/rust/pull/23938
|
||||
[ios]: https://github.com/rust-lang/rust/pull/24133
|
||||
[lex]: https://github.com/rust-lang/rfcs/blob/master/text/0879-small-base-lexing.md
|
||||
@ -9484,7 +9374,7 @@ Misc
|
||||
[meth]: https://github.com/rust-lang/rust/pull/24056
|
||||
[pat]: https://github.com/rust-lang/rfcs/blob/master/text/0528-string-patterns.md
|
||||
[po]: https://github.com/rust-lang/rust/pull/24270
|
||||
[sf]: https://github.com/rust-lang/rust/pull/24517
|
||||
[24517]: https://github.com/rust-lang/rust/pull/24517
|
||||
[slp]: https://github.com/rust-lang/rust/pull/23949
|
||||
[spl]: https://github.com/rust-lang/rfcs/blob/master/text/0979-align-splitn-with-other-languages.md
|
||||
[sw]: https://github.com/rust-lang/rfcs/blob/master/text/1054-str-words.md
|
||||
@ -9502,7 +9392,7 @@ Misc
|
||||
[conversion]: https://github.com/rust-lang/rfcs/pull/529
|
||||
[num-traits]: https://github.com/rust-lang/rust/pull/23549
|
||||
[index-value]: https://github.com/rust-lang/rust/pull/23601
|
||||
[dropck]: https://github.com/rust-lang/rfcs/pull/769
|
||||
[rfc769]: https://github.com/rust-lang/rfcs/pull/769
|
||||
[ci-compare]: https://gist.github.com/brson/a30a77836fbec057cbee
|
||||
[fn-inherit]: https://github.com/rust-lang/rust/pull/23282
|
||||
[fn-blanket]: https://github.com/rust-lang/rust/pull/23895
|
||||
|
@ -11,7 +11,7 @@
|
||||
use rustc_hir::definitions::DefPathData;
|
||||
use rustc_span::hygiene::ExpnId;
|
||||
use rustc_span::source_map::{respan, DesugaringKind, Span, Spanned};
|
||||
use rustc_span::symbol::{sym, Ident, Symbol};
|
||||
use rustc_span::symbol::{sym, Ident};
|
||||
use rustc_span::DUMMY_SP;
|
||||
|
||||
impl<'hir> LoweringContext<'_, 'hir> {
|
||||
@ -1204,11 +1204,13 @@ fn lower_expr_range(
|
||||
};
|
||||
|
||||
let fields = self.arena.alloc_from_iter(
|
||||
e1.iter().map(|e| ("start", e)).chain(e2.iter().map(|e| ("end", e))).map(|(s, e)| {
|
||||
let expr = self.lower_expr(&e);
|
||||
let ident = Ident::new(Symbol::intern(s), self.lower_span(e.span));
|
||||
self.expr_field(ident, expr, e.span)
|
||||
}),
|
||||
e1.iter().map(|e| (sym::start, e)).chain(e2.iter().map(|e| (sym::end, e))).map(
|
||||
|(s, e)| {
|
||||
let expr = self.lower_expr(&e);
|
||||
let ident = Ident::new(s, self.lower_span(e.span));
|
||||
self.expr_field(ident, expr, e.span)
|
||||
},
|
||||
),
|
||||
);
|
||||
|
||||
hir::ExprKind::Struct(
|
||||
|
@ -312,6 +312,7 @@ fn translate_outlives_facts(typeck: &mut TypeChecker<'_, '_>) {
|
||||
}
|
||||
}
|
||||
|
||||
#[track_caller]
|
||||
fn mirbug(tcx: TyCtxt<'_>, span: Span, msg: &str) {
|
||||
// We sometimes see MIR failures (notably predicate failures) due to
|
||||
// the fact that we check rvalue sized predicates here. So use `delay_span_bug`
|
||||
|
@ -293,10 +293,6 @@ pub fn id(&self) -> HirId {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn is_const(&self) -> bool {
|
||||
matches!(self, GenericArg::Const(_))
|
||||
}
|
||||
|
||||
pub fn is_synthetic(&self) -> bool {
|
||||
matches!(self, GenericArg::Lifetime(lifetime) if lifetime.name.ident() == Ident::empty())
|
||||
}
|
||||
@ -318,6 +314,13 @@ pub fn to_ord(&self) -> ast::ParamKindOrd {
|
||||
GenericArg::Infer(_) => ast::ParamKindOrd::Infer,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn is_ty_or_const(&self) -> bool {
|
||||
match self {
|
||||
GenericArg::Lifetime(_) => false,
|
||||
GenericArg::Type(_) | GenericArg::Const(_) | GenericArg::Infer(_) => true,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, HashStable_Generic)]
|
||||
|
@ -12,7 +12,7 @@
|
||||
use rustc_middle::ty::subst::{GenericArg, GenericArgKind};
|
||||
use rustc_middle::ty::{self, Const, DefIdTree, InferConst, Ty, TyCtxt, TypeFoldable, TypeFolder};
|
||||
use rustc_span::symbol::kw;
|
||||
use rustc_span::Span;
|
||||
use rustc_span::{sym, Span};
|
||||
use std::borrow::Cow;
|
||||
|
||||
struct FindHirNodeVisitor<'a, 'tcx> {
|
||||
@ -1003,9 +1003,9 @@ fn fold_ty(&mut self, t: Ty<'tcx>) -> Ty<'tcx> {
|
||||
| ty::Opaque(..)
|
||||
| ty::Projection(_)
|
||||
| ty::Never => t.super_fold_with(self),
|
||||
ty::Array(ty, c) => self
|
||||
.tcx()
|
||||
.mk_ty(ty::Array(self.fold_ty(ty), self.replace_infers(c, 0, Symbol::intern("N")))),
|
||||
ty::Array(ty, c) => {
|
||||
self.tcx().mk_ty(ty::Array(self.fold_ty(ty), self.replace_infers(c, 0, sym::N)))
|
||||
}
|
||||
// We don't want to hide type params that haven't been resolved yet.
|
||||
// This would be the type that will be written out with the type param
|
||||
// name in the output.
|
||||
|
@ -152,7 +152,7 @@ fn elaborate(&mut self, obligation: &PredicateObligation<'tcx>) {
|
||||
obligation.cause.clone(),
|
||||
)
|
||||
});
|
||||
debug!("super_predicates: data={:?}", data);
|
||||
debug!(?data, ?obligations, "super_predicates");
|
||||
|
||||
// Only keep those bounds that we haven't already seen.
|
||||
// This is necessary to prevent infinite recursion in some
|
||||
|
@ -31,6 +31,13 @@ pub fn to_ord(&self) -> ast::ParamKindOrd {
|
||||
GenericParamDefKind::Const { .. } => ast::ParamKindOrd::Const,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn is_ty_or_const(&self) -> bool {
|
||||
match self {
|
||||
GenericParamDefKind::Lifetime => false,
|
||||
GenericParamDefKind::Type { .. } | GenericParamDefKind::Const { .. } => true,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, TyEncodable, TyDecodable, HashStable)]
|
||||
|
@ -188,6 +188,11 @@ fn generic_args_to_print(
|
||||
own_params.start = 1;
|
||||
}
|
||||
|
||||
// If we're in verbose mode, then print default-equal args too
|
||||
if self.tcx().sess.verbose() {
|
||||
return &substs[own_params];
|
||||
}
|
||||
|
||||
// Don't print args that are the defaults of their respective parameters.
|
||||
own_params.end -= generics
|
||||
.params
|
||||
|
@ -1784,10 +1784,11 @@ fn path_generic_args(
|
||||
self = print_prefix(self)?;
|
||||
|
||||
// Don't print `'_` if there's no unerased regions.
|
||||
let print_regions = args.iter().any(|arg| match arg.unpack() {
|
||||
GenericArgKind::Lifetime(r) => *r != ty::ReErased,
|
||||
_ => false,
|
||||
});
|
||||
let print_regions = self.tcx.sess.verbose()
|
||||
|| args.iter().any(|arg| match arg.unpack() {
|
||||
GenericArgKind::Lifetime(r) => *r != ty::ReErased,
|
||||
_ => false,
|
||||
});
|
||||
let args = args.iter().cloned().filter(|arg| match arg.unpack() {
|
||||
GenericArgKind::Lifetime(_) => print_regions,
|
||||
_ => true,
|
||||
|
@ -208,6 +208,7 @@
|
||||
LinkedList,
|
||||
LintPass,
|
||||
Mutex,
|
||||
N,
|
||||
None,
|
||||
Ok,
|
||||
Option,
|
||||
@ -327,6 +328,7 @@
|
||||
array,
|
||||
arrays,
|
||||
as_ptr,
|
||||
as_ref,
|
||||
as_str,
|
||||
asm,
|
||||
asm_const,
|
||||
@ -593,6 +595,7 @@
|
||||
enable,
|
||||
enclosing_scope,
|
||||
encode,
|
||||
end,
|
||||
env,
|
||||
eq,
|
||||
ermsb_target_feature,
|
||||
|
@ -1225,6 +1225,10 @@ fn assemble_candidates_from_object_ty<'cx, 'tcx>(
|
||||
);
|
||||
}
|
||||
|
||||
#[tracing::instrument(
|
||||
level = "debug",
|
||||
skip(selcx, candidate_set, ctor, env_predicates, potentially_unnormalized_candidates)
|
||||
)]
|
||||
fn assemble_candidates_from_predicates<'cx, 'tcx>(
|
||||
selcx: &mut SelectionContext<'cx, 'tcx>,
|
||||
obligation: &ProjectionTyObligation<'tcx>,
|
||||
@ -1233,8 +1237,6 @@ fn assemble_candidates_from_predicates<'cx, 'tcx>(
|
||||
env_predicates: impl Iterator<Item = ty::Predicate<'tcx>>,
|
||||
potentially_unnormalized_candidates: bool,
|
||||
) {
|
||||
debug!(?obligation, "assemble_candidates_from_predicates");
|
||||
|
||||
let infcx = selcx.infcx();
|
||||
for predicate in env_predicates {
|
||||
debug!(?predicate);
|
||||
@ -1270,13 +1272,12 @@ fn assemble_candidates_from_predicates<'cx, 'tcx>(
|
||||
}
|
||||
}
|
||||
|
||||
#[tracing::instrument(level = "debug", skip(selcx, obligation, candidate_set))]
|
||||
fn assemble_candidates_from_impls<'cx, 'tcx>(
|
||||
selcx: &mut SelectionContext<'cx, 'tcx>,
|
||||
obligation: &ProjectionTyObligation<'tcx>,
|
||||
candidate_set: &mut ProjectionTyCandidateSet<'tcx>,
|
||||
) {
|
||||
debug!("assemble_candidates_from_impls");
|
||||
|
||||
// If we are resolving `<T as TraitRef<...>>::Item == Type`,
|
||||
// start out by selecting the predicate `T as TraitRef<...>`:
|
||||
let poly_trait_ref = ty::Binder::dummy(obligation.predicate.trait_ref(selcx.tcx()));
|
||||
|
@ -173,6 +173,9 @@ fn candidate_from_obligation_no_cache<'o>(
|
||||
|
||||
let needs_infer = stack.obligation.predicate.has_infer_types_or_consts();
|
||||
|
||||
let sized_predicate = self.tcx().lang_items().sized_trait()
|
||||
== Some(stack.obligation.predicate.skip_binder().def_id());
|
||||
|
||||
// If there are STILL multiple candidates, we can further
|
||||
// reduce the list by dropping duplicates -- including
|
||||
// resolving specializations.
|
||||
@ -181,6 +184,7 @@ fn candidate_from_obligation_no_cache<'o>(
|
||||
while i < candidates.len() {
|
||||
let is_dup = (0..candidates.len()).filter(|&j| i != j).any(|j| {
|
||||
self.candidate_should_be_dropped_in_favor_of(
|
||||
sized_predicate,
|
||||
&candidates[i],
|
||||
&candidates[j],
|
||||
needs_infer,
|
||||
@ -338,13 +342,12 @@ pub(super) fn assemble_candidates<'o>(
|
||||
Ok(candidates)
|
||||
}
|
||||
|
||||
#[tracing::instrument(level = "debug", skip(self, candidates))]
|
||||
fn assemble_candidates_from_projected_tys(
|
||||
&mut self,
|
||||
obligation: &TraitObligation<'tcx>,
|
||||
candidates: &mut SelectionCandidateSet<'tcx>,
|
||||
) {
|
||||
debug!(?obligation, "assemble_candidates_from_projected_tys");
|
||||
|
||||
// Before we go into the whole placeholder thing, just
|
||||
// quickly check if the self-type is a projection at all.
|
||||
match obligation.predicate.skip_binder().trait_ref.self_ty().kind() {
|
||||
@ -369,12 +372,13 @@ fn assemble_candidates_from_projected_tys(
|
||||
/// supplied to find out whether it is listed among them.
|
||||
///
|
||||
/// Never affects the inference environment.
|
||||
#[tracing::instrument(level = "debug", skip(self, stack, candidates))]
|
||||
fn assemble_candidates_from_caller_bounds<'o>(
|
||||
&mut self,
|
||||
stack: &TraitObligationStack<'o, 'tcx>,
|
||||
candidates: &mut SelectionCandidateSet<'tcx>,
|
||||
) -> Result<(), SelectionError<'tcx>> {
|
||||
debug!(?stack.obligation, "assemble_candidates_from_caller_bounds");
|
||||
debug!(?stack.obligation);
|
||||
|
||||
let all_bounds = stack
|
||||
.obligation
|
||||
@ -876,6 +880,7 @@ fn assemble_candidates_for_unsizing(
|
||||
};
|
||||
}
|
||||
|
||||
#[tracing::instrument(level = "debug", skip(self, obligation, candidates))]
|
||||
fn assemble_candidates_for_trait_alias(
|
||||
&mut self,
|
||||
obligation: &TraitObligation<'tcx>,
|
||||
@ -883,7 +888,7 @@ fn assemble_candidates_for_trait_alias(
|
||||
) {
|
||||
// Okay to skip binder here because the tests we do below do not involve bound regions.
|
||||
let self_ty = obligation.self_ty().skip_binder();
|
||||
debug!(?self_ty, "assemble_candidates_for_trait_alias");
|
||||
debug!(?self_ty);
|
||||
|
||||
let def_id = obligation.predicate.def_id();
|
||||
|
||||
@ -894,6 +899,7 @@ fn assemble_candidates_for_trait_alias(
|
||||
|
||||
/// Assembles the trait which are built-in to the language itself:
|
||||
/// `Copy`, `Clone` and `Sized`.
|
||||
#[tracing::instrument(level = "debug", skip(self, candidates))]
|
||||
fn assemble_builtin_bound_candidates(
|
||||
&mut self,
|
||||
conditions: BuiltinImplConditions<'tcx>,
|
||||
@ -901,14 +907,12 @@ fn assemble_builtin_bound_candidates(
|
||||
) {
|
||||
match conditions {
|
||||
BuiltinImplConditions::Where(nested) => {
|
||||
debug!(?nested, "builtin_bound");
|
||||
candidates
|
||||
.vec
|
||||
.push(BuiltinCandidate { has_nested: !nested.skip_binder().is_empty() });
|
||||
}
|
||||
BuiltinImplConditions::None => {}
|
||||
BuiltinImplConditions::Ambiguous => {
|
||||
debug!("assemble_builtin_bound_candidates: ambiguous builtin");
|
||||
candidates.ambiguous = true;
|
||||
}
|
||||
}
|
||||
|
@ -201,6 +201,7 @@ struct EvaluatedCandidate<'tcx> {
|
||||
}
|
||||
|
||||
/// When does the builtin impl for `T: Trait` apply?
|
||||
#[derive(Debug)]
|
||||
enum BuiltinImplConditions<'tcx> {
|
||||
/// The impl is conditional on `T1, T2, ...: Trait`.
|
||||
Where(ty::Binder<'tcx, Vec<Ty<'tcx>>>),
|
||||
@ -344,7 +345,7 @@ pub fn select(
|
||||
}
|
||||
Err(e) => Err(e),
|
||||
Ok(candidate) => {
|
||||
debug!(?candidate);
|
||||
debug!(?candidate, "confirmed");
|
||||
Ok(Some(candidate))
|
||||
}
|
||||
}
|
||||
@ -1523,6 +1524,7 @@ pub(super) fn match_projection_projections(
|
||||
/// See the comment for "SelectionCandidate" for more details.
|
||||
fn candidate_should_be_dropped_in_favor_of(
|
||||
&mut self,
|
||||
sized_predicate: bool,
|
||||
victim: &EvaluatedCandidate<'tcx>,
|
||||
other: &EvaluatedCandidate<'tcx>,
|
||||
needs_infer: bool,
|
||||
@ -1594,6 +1596,16 @@ fn candidate_should_be_dropped_in_favor_of(
|
||||
// Drop otherwise equivalent non-const fn pointer candidates
|
||||
(FnPointerCandidate { .. }, FnPointerCandidate { is_const: false }) => true,
|
||||
|
||||
// If obligation is a sized predicate or the where-clause bound is
|
||||
// global, prefer the projection or object candidate. See issue
|
||||
// #50825 and #89352.
|
||||
(ObjectCandidate(_) | ProjectionCandidate(_), ParamCandidate(ref cand)) => {
|
||||
sized_predicate || is_global(cand)
|
||||
}
|
||||
(ParamCandidate(ref cand), ObjectCandidate(_) | ProjectionCandidate(_)) => {
|
||||
!(sized_predicate || is_global(cand))
|
||||
}
|
||||
|
||||
// Global bounds from the where clause should be ignored
|
||||
// here (see issue #50825). Otherwise, we have a where
|
||||
// clause so don't go around looking for impls.
|
||||
@ -1609,15 +1621,8 @@ fn candidate_should_be_dropped_in_favor_of(
|
||||
| BuiltinUnsizeCandidate
|
||||
| TraitUpcastingUnsizeCandidate(_)
|
||||
| BuiltinCandidate { .. }
|
||||
| TraitAliasCandidate(..)
|
||||
| ObjectCandidate(_)
|
||||
| ProjectionCandidate(_),
|
||||
| TraitAliasCandidate(..),
|
||||
) => !is_global(cand),
|
||||
(ObjectCandidate(_) | ProjectionCandidate(_), ParamCandidate(ref cand)) => {
|
||||
// Prefer these to a global where-clause bound
|
||||
// (see issue #50825).
|
||||
is_global(cand)
|
||||
}
|
||||
(
|
||||
ImplCandidate(_)
|
||||
| ClosureCandidate
|
||||
|
@ -288,7 +288,7 @@ pub fn ast_path_substs_for_ty(
|
||||
/// Given the type/lifetime/const arguments provided to some path (along with
|
||||
/// an implicit `Self`, if this is a trait reference), returns the complete
|
||||
/// set of substitutions. This may involve applying defaulted type parameters.
|
||||
/// Also returns back constraints on associated types.
|
||||
/// Constraints on associated typess are created from `create_assoc_bindings_for_generic_args`.
|
||||
///
|
||||
/// Example:
|
||||
///
|
||||
@ -302,7 +302,7 @@ pub fn ast_path_substs_for_ty(
|
||||
/// which will have been resolved to a `def_id`
|
||||
/// 3. The `generic_args` contains info on the `<...>` contents. The `usize` type
|
||||
/// parameters are returned in the `SubstsRef`, the associated type bindings like
|
||||
/// `Output = u32` are returned in the `Vec<ConvertedBinding...>` result.
|
||||
/// `Output = u32` are returned from `create_assoc_bindings_for_generic_args`.
|
||||
///
|
||||
/// Note that the type listing given here is *exactly* what the user provided.
|
||||
///
|
||||
|
@ -359,6 +359,8 @@ pub(super) fn lookup_method_in_trait(
|
||||
let (obligation, substs) =
|
||||
self.obligation_for_method(span, trait_def_id, self_ty, opt_input_types);
|
||||
|
||||
debug!(?obligation);
|
||||
|
||||
// Now we want to know if this can be matched
|
||||
if !self.predicate_may_hold(&obligation) {
|
||||
debug!("--> Cannot match obligation");
|
||||
|
@ -15,7 +15,7 @@
|
||||
use rustc_middle::ty::{self, DefIdTree, ToPredicate, Ty, TyCtxt, TypeFoldable};
|
||||
use rustc_span::lev_distance;
|
||||
use rustc_span::symbol::{kw, sym, Ident};
|
||||
use rustc_span::{source_map, FileName, MultiSpan, Span, Symbol};
|
||||
use rustc_span::{source_map, FileName, MultiSpan, Span};
|
||||
use rustc_trait_selection::traits::query::evaluate_obligation::InferCtxtExt;
|
||||
use rustc_trait_selection::traits::{
|
||||
FulfillmentError, Obligation, ObligationCause, ObligationCauseCode,
|
||||
@ -1524,8 +1524,7 @@ fn suggest_traits_to_import(
|
||||
// Explicitly ignore the `Pin::as_ref()` method as `Pin` does not
|
||||
// implement the `AsRef` trait.
|
||||
let skip = skippable.contains(&did)
|
||||
|| (("Pin::new" == *pre)
|
||||
&& (Symbol::intern("as_ref") == item_name.name));
|
||||
|| (("Pin::new" == *pre) && (sym::as_ref == item_name.name));
|
||||
// Make sure the method is defined for the *actual* receiver: we don't
|
||||
// want to treat `Box<Self>` as a receiver if it only works because of
|
||||
// an autoderef to `&self`
|
||||
|
@ -18,6 +18,7 @@
|
||||
/// Computes the relevant generic parameter for a potential generic const argument.
|
||||
///
|
||||
/// This should be called using the query `tcx.opt_const_param_of`.
|
||||
#[instrument(level = "debug", skip(tcx))]
|
||||
pub(super) fn opt_const_param_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> Option<DefId> {
|
||||
// FIXME(generic_arg_infer): allow for returning DefIds of inference of
|
||||
// GenericArg::Infer below. This may require a change where GenericArg::Infer has some flag
|
||||
@ -25,71 +26,69 @@ pub(super) fn opt_const_param_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> Option<
|
||||
use hir::*;
|
||||
let hir_id = tcx.hir().local_def_id_to_hir_id(def_id);
|
||||
|
||||
if let Node::AnonConst(_) = tcx.hir().get(hir_id) {
|
||||
let parent_node_id = tcx.hir().get_parent_node(hir_id);
|
||||
let parent_node = tcx.hir().get(parent_node_id);
|
||||
match tcx.hir().get(hir_id) {
|
||||
Node::AnonConst(_) => (),
|
||||
_ => return None,
|
||||
};
|
||||
|
||||
match parent_node {
|
||||
// This match arm is for when the def_id appears in a GAT whose
|
||||
// path can't be resolved without typechecking e.g.
|
||||
//
|
||||
// trait Foo {
|
||||
// type Assoc<const N: usize>;
|
||||
// fn foo() -> Self::Assoc<3>;
|
||||
// }
|
||||
//
|
||||
// In the above code we would call this query with the def_id of 3 and
|
||||
// the parent_node we match on would be the hir node for Self::Assoc<3>
|
||||
//
|
||||
// `Self::Assoc<3>` cant be resolved without typchecking here as we
|
||||
// didnt write <Self as Foo>::Assoc<3>. If we did then another match
|
||||
// arm would handle this.
|
||||
//
|
||||
// I believe this match arm is only needed for GAT but I am not 100% sure - BoxyUwU
|
||||
Node::Ty(hir_ty @ Ty { kind: TyKind::Path(QPath::TypeRelative(_, segment)), .. }) => {
|
||||
// Find the Item containing the associated type so we can create an ItemCtxt.
|
||||
// Using the ItemCtxt convert the HIR for the unresolved assoc type into a
|
||||
// ty which is a fully resolved projection.
|
||||
// For the code example above, this would mean converting Self::Assoc<3>
|
||||
// into a ty::Projection(<Self as Foo>::Assoc<3>)
|
||||
let item_hir_id = tcx
|
||||
.hir()
|
||||
.parent_iter(hir_id)
|
||||
.filter(|(_, node)| matches!(node, Node::Item(_)))
|
||||
.map(|(id, _)| id)
|
||||
.next()
|
||||
.unwrap();
|
||||
let item_did = tcx.hir().local_def_id(item_hir_id).to_def_id();
|
||||
let item_ctxt = &ItemCtxt::new(tcx, item_did) as &dyn crate::astconv::AstConv<'_>;
|
||||
let ty = item_ctxt.ast_ty_to_ty(hir_ty);
|
||||
let parent_node_id = tcx.hir().get_parent_node(hir_id);
|
||||
let parent_node = tcx.hir().get(parent_node_id);
|
||||
|
||||
// Iterate through the generics of the projection to find the one that corresponds to
|
||||
// the def_id that this query was called with. We filter to only const args here as a
|
||||
// precaution for if it's ever allowed to elide lifetimes in GAT's. It currently isn't
|
||||
// but it can't hurt to be safe ^^
|
||||
if let ty::Projection(projection) = ty.kind() {
|
||||
let generics = tcx.generics_of(projection.item_def_id);
|
||||
let (generics, arg_idx) = match parent_node {
|
||||
// This match arm is for when the def_id appears in a GAT whose
|
||||
// path can't be resolved without typechecking e.g.
|
||||
//
|
||||
// trait Foo {
|
||||
// type Assoc<const N: usize>;
|
||||
// fn foo() -> Self::Assoc<3>;
|
||||
// }
|
||||
//
|
||||
// In the above code we would call this query with the def_id of 3 and
|
||||
// the parent_node we match on would be the hir node for Self::Assoc<3>
|
||||
//
|
||||
// `Self::Assoc<3>` cant be resolved without typchecking here as we
|
||||
// didnt write <Self as Foo>::Assoc<3>. If we did then another match
|
||||
// arm would handle this.
|
||||
//
|
||||
// I believe this match arm is only needed for GAT but I am not 100% sure - BoxyUwU
|
||||
Node::Ty(hir_ty @ Ty { kind: TyKind::Path(QPath::TypeRelative(_, segment)), .. }) => {
|
||||
// Find the Item containing the associated type so we can create an ItemCtxt.
|
||||
// Using the ItemCtxt convert the HIR for the unresolved assoc type into a
|
||||
// ty which is a fully resolved projection.
|
||||
// For the code example above, this would mean converting Self::Assoc<3>
|
||||
// into a ty::Projection(<Self as Foo>::Assoc<3>)
|
||||
let item_hir_id = tcx
|
||||
.hir()
|
||||
.parent_iter(hir_id)
|
||||
.filter(|(_, node)| matches!(node, Node::Item(_)))
|
||||
.map(|(id, _)| id)
|
||||
.next()
|
||||
.unwrap();
|
||||
let item_did = tcx.hir().local_def_id(item_hir_id).to_def_id();
|
||||
let item_ctxt = &ItemCtxt::new(tcx, item_did) as &dyn crate::astconv::AstConv<'_>;
|
||||
let ty = item_ctxt.ast_ty_to_ty(hir_ty);
|
||||
|
||||
let arg_index = segment
|
||||
.args
|
||||
.and_then(|args| {
|
||||
args.args
|
||||
.iter()
|
||||
.filter(|arg| arg.is_const())
|
||||
.position(|arg| arg.id() == hir_id)
|
||||
})
|
||||
.unwrap_or_else(|| {
|
||||
bug!("no arg matching AnonConst in segment");
|
||||
});
|
||||
// Iterate through the generics of the projection to find the one that corresponds to
|
||||
// the def_id that this query was called with. We filter to only const args here as a
|
||||
// precaution for if it's ever allowed to elide lifetimes in GAT's. It currently isn't
|
||||
// but it can't hurt to be safe ^^
|
||||
if let ty::Projection(projection) = ty.kind() {
|
||||
let generics = tcx.generics_of(projection.item_def_id);
|
||||
|
||||
return generics
|
||||
.params
|
||||
.iter()
|
||||
.filter(|param| matches!(param.kind, ty::GenericParamDefKind::Const { .. }))
|
||||
.nth(arg_index)
|
||||
.map(|param| param.def_id);
|
||||
}
|
||||
let arg_index = segment
|
||||
.args
|
||||
.and_then(|args| {
|
||||
args.args
|
||||
.iter()
|
||||
.filter(|arg| arg.is_ty_or_const())
|
||||
.position(|arg| arg.id() == hir_id)
|
||||
})
|
||||
.unwrap_or_else(|| {
|
||||
bug!("no arg matching AnonConst in segment");
|
||||
});
|
||||
|
||||
(generics, arg_index)
|
||||
} else {
|
||||
// I dont think it's possible to reach this but I'm not 100% sure - BoxyUwU
|
||||
tcx.sess.delay_span_bug(
|
||||
tcx.def_span(def_id),
|
||||
@ -97,159 +96,158 @@ pub(super) fn opt_const_param_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> Option<
|
||||
);
|
||||
return None;
|
||||
}
|
||||
Node::Expr(&Expr {
|
||||
kind:
|
||||
ExprKind::MethodCall(segment, ..) | ExprKind::Path(QPath::TypeRelative(_, segment)),
|
||||
..
|
||||
}) => {
|
||||
let body_owner = tcx.hir().local_def_id(tcx.hir().enclosing_body_owner(hir_id));
|
||||
let tables = tcx.typeck(body_owner);
|
||||
// This may fail in case the method/path does not actually exist.
|
||||
// As there is no relevant param for `def_id`, we simply return
|
||||
// `None` here.
|
||||
let type_dependent_def = tables.type_dependent_def_id(parent_node_id)?;
|
||||
let idx = segment
|
||||
.args
|
||||
.and_then(|args| {
|
||||
args.args
|
||||
.iter()
|
||||
.filter(|arg| arg.is_const())
|
||||
.position(|arg| arg.id() == hir_id)
|
||||
})
|
||||
.unwrap_or_else(|| {
|
||||
bug!("no arg matching AnonConst in segment");
|
||||
});
|
||||
}
|
||||
Node::Expr(&Expr {
|
||||
kind:
|
||||
ExprKind::MethodCall(segment, ..) | ExprKind::Path(QPath::TypeRelative(_, segment)),
|
||||
..
|
||||
}) => {
|
||||
let body_owner = tcx.hir().local_def_id(tcx.hir().enclosing_body_owner(hir_id));
|
||||
let tables = tcx.typeck(body_owner);
|
||||
// This may fail in case the method/path does not actually exist.
|
||||
// As there is no relevant param for `def_id`, we simply return
|
||||
// `None` here.
|
||||
let type_dependent_def = tables.type_dependent_def_id(parent_node_id)?;
|
||||
let idx = segment
|
||||
.args
|
||||
.and_then(|args| {
|
||||
args.args
|
||||
.iter()
|
||||
.filter(|arg| arg.is_ty_or_const())
|
||||
.position(|arg| arg.id() == hir_id)
|
||||
})
|
||||
.unwrap_or_else(|| {
|
||||
bug!("no arg matching AnonConst in segment");
|
||||
});
|
||||
|
||||
tcx.generics_of(type_dependent_def)
|
||||
.params
|
||||
.iter()
|
||||
.filter(|param| matches!(param.kind, ty::GenericParamDefKind::Const { .. }))
|
||||
.nth(idx)
|
||||
.map(|param| param.def_id)
|
||||
}
|
||||
(tcx.generics_of(type_dependent_def), idx)
|
||||
}
|
||||
|
||||
Node::Ty(&Ty { kind: TyKind::Path(_), .. })
|
||||
| Node::Expr(&Expr { kind: ExprKind::Path(_) | ExprKind::Struct(..), .. })
|
||||
| Node::TraitRef(..)
|
||||
| Node::Pat(_) => {
|
||||
let path = match parent_node {
|
||||
Node::Ty(&Ty { kind: TyKind::Path(QPath::Resolved(_, path)), .. })
|
||||
| Node::TraitRef(&TraitRef { path, .. }) => &*path,
|
||||
Node::Expr(&Expr {
|
||||
kind:
|
||||
ExprKind::Path(QPath::Resolved(_, path))
|
||||
| ExprKind::Struct(&QPath::Resolved(_, path), ..),
|
||||
..
|
||||
}) => {
|
||||
let body_owner =
|
||||
tcx.hir().local_def_id(tcx.hir().enclosing_body_owner(hir_id));
|
||||
let _tables = tcx.typeck(body_owner);
|
||||
&*path
|
||||
}
|
||||
Node::Pat(pat) => {
|
||||
if let Some(path) = get_path_containing_arg_in_pat(pat, hir_id) {
|
||||
path
|
||||
} else {
|
||||
tcx.sess.delay_span_bug(
|
||||
tcx.def_span(def_id),
|
||||
&format!(
|
||||
"unable to find const parent for {} in pat {:?}",
|
||||
hir_id, pat
|
||||
),
|
||||
);
|
||||
return None;
|
||||
}
|
||||
}
|
||||
_ => {
|
||||
Node::Ty(&Ty { kind: TyKind::Path(_), .. })
|
||||
| Node::Expr(&Expr { kind: ExprKind::Path(_) | ExprKind::Struct(..), .. })
|
||||
| Node::TraitRef(..)
|
||||
| Node::Pat(_) => {
|
||||
let path = match parent_node {
|
||||
Node::Ty(&Ty { kind: TyKind::Path(QPath::Resolved(_, path)), .. })
|
||||
| Node::TraitRef(&TraitRef { path, .. }) => &*path,
|
||||
Node::Expr(&Expr {
|
||||
kind:
|
||||
ExprKind::Path(QPath::Resolved(_, path))
|
||||
| ExprKind::Struct(&QPath::Resolved(_, path), ..),
|
||||
..
|
||||
}) => {
|
||||
let body_owner = tcx.hir().local_def_id(tcx.hir().enclosing_body_owner(hir_id));
|
||||
let _tables = tcx.typeck(body_owner);
|
||||
&*path
|
||||
}
|
||||
Node::Pat(pat) => {
|
||||
if let Some(path) = get_path_containing_arg_in_pat(pat, hir_id) {
|
||||
path
|
||||
} else {
|
||||
tcx.sess.delay_span_bug(
|
||||
tcx.def_span(def_id),
|
||||
&format!("unexpected const parent path {:?}", parent_node),
|
||||
&format!("unable to find const parent for {} in pat {:?}", hir_id, pat),
|
||||
);
|
||||
return None;
|
||||
}
|
||||
};
|
||||
}
|
||||
_ => {
|
||||
tcx.sess.delay_span_bug(
|
||||
tcx.def_span(def_id),
|
||||
&format!("unexpected const parent path {:?}", parent_node),
|
||||
);
|
||||
return None;
|
||||
}
|
||||
};
|
||||
|
||||
// We've encountered an `AnonConst` in some path, so we need to
|
||||
// figure out which generic parameter it corresponds to and return
|
||||
// the relevant type.
|
||||
let filtered = path
|
||||
.segments
|
||||
.iter()
|
||||
.filter_map(|seg| seg.args.map(|args| (args.args, seg)))
|
||||
.find_map(|(args, seg)| {
|
||||
args.iter()
|
||||
.filter(|arg| arg.is_const())
|
||||
.position(|arg| arg.id() == hir_id)
|
||||
.map(|index| (index, seg))
|
||||
});
|
||||
let (arg_index, segment) = match filtered {
|
||||
None => {
|
||||
tcx.sess.delay_span_bug(
|
||||
tcx.def_span(def_id),
|
||||
"no arg matching AnonConst in path",
|
||||
);
|
||||
return None;
|
||||
}
|
||||
Some(inner) => inner,
|
||||
};
|
||||
// We've encountered an `AnonConst` in some path, so we need to
|
||||
// figure out which generic parameter it corresponds to and return
|
||||
// the relevant type.
|
||||
let filtered = path
|
||||
.segments
|
||||
.iter()
|
||||
.filter_map(|seg| seg.args.map(|args| (args.args, seg)))
|
||||
.find_map(|(args, seg)| {
|
||||
args.iter()
|
||||
.filter(|arg| arg.is_ty_or_const())
|
||||
.position(|arg| arg.id() == hir_id)
|
||||
.map(|index| (index, seg))
|
||||
});
|
||||
let (arg_index, segment) = match filtered {
|
||||
None => {
|
||||
tcx.sess
|
||||
.delay_span_bug(tcx.def_span(def_id), "no arg matching AnonConst in path");
|
||||
return None;
|
||||
}
|
||||
Some(inner) => inner,
|
||||
};
|
||||
|
||||
// Try to use the segment resolution if it is valid, otherwise we
|
||||
// default to the path resolution.
|
||||
let res = segment.res.filter(|&r| r != Res::Err).unwrap_or(path.res);
|
||||
use def::CtorOf;
|
||||
let generics = match res {
|
||||
Res::Def(DefKind::Ctor(CtorOf::Variant, _), def_id) => tcx.generics_of(
|
||||
tcx.parent(def_id).and_then(|def_id| tcx.parent(def_id)).unwrap(),
|
||||
),
|
||||
Res::Def(DefKind::Variant | DefKind::Ctor(CtorOf::Struct, _), def_id) => {
|
||||
tcx.generics_of(tcx.parent(def_id).unwrap())
|
||||
}
|
||||
// Other `DefKind`s don't have generics and would ICE when calling
|
||||
// `generics_of`.
|
||||
Res::Def(
|
||||
DefKind::Struct
|
||||
| DefKind::Union
|
||||
| DefKind::Enum
|
||||
| DefKind::Trait
|
||||
| DefKind::OpaqueTy
|
||||
| DefKind::TyAlias
|
||||
| DefKind::ForeignTy
|
||||
| DefKind::TraitAlias
|
||||
| DefKind::AssocTy
|
||||
| DefKind::Fn
|
||||
| DefKind::AssocFn
|
||||
| DefKind::AssocConst
|
||||
| DefKind::Impl,
|
||||
def_id,
|
||||
) => tcx.generics_of(def_id),
|
||||
Res::Err => {
|
||||
tcx.sess.delay_span_bug(tcx.def_span(def_id), "anon const with Res::Err");
|
||||
return None;
|
||||
}
|
||||
_ => {
|
||||
// If the user tries to specify generics on a type that does not take them,
|
||||
// e.g. `usize<T>`, we may hit this branch, in which case we treat it as if
|
||||
// no arguments have been passed. An error should already have been emitted.
|
||||
tcx.sess.delay_span_bug(
|
||||
tcx.def_span(def_id),
|
||||
&format!("unexpected anon const res {:?} in path: {:?}", res, path),
|
||||
);
|
||||
return None;
|
||||
}
|
||||
};
|
||||
// Try to use the segment resolution if it is valid, otherwise we
|
||||
// default to the path resolution.
|
||||
let res = segment.res.filter(|&r| r != Res::Err).unwrap_or(path.res);
|
||||
use def::CtorOf;
|
||||
let generics = match res {
|
||||
Res::Def(DefKind::Ctor(CtorOf::Variant, _), def_id) => tcx
|
||||
.generics_of(tcx.parent(def_id).and_then(|def_id| tcx.parent(def_id)).unwrap()),
|
||||
Res::Def(DefKind::Variant | DefKind::Ctor(CtorOf::Struct, _), def_id) => {
|
||||
tcx.generics_of(tcx.parent(def_id).unwrap())
|
||||
}
|
||||
// Other `DefKind`s don't have generics and would ICE when calling
|
||||
// `generics_of`.
|
||||
Res::Def(
|
||||
DefKind::Struct
|
||||
| DefKind::Union
|
||||
| DefKind::Enum
|
||||
| DefKind::Trait
|
||||
| DefKind::OpaqueTy
|
||||
| DefKind::TyAlias
|
||||
| DefKind::ForeignTy
|
||||
| DefKind::TraitAlias
|
||||
| DefKind::AssocTy
|
||||
| DefKind::Fn
|
||||
| DefKind::AssocFn
|
||||
| DefKind::AssocConst
|
||||
| DefKind::Impl,
|
||||
def_id,
|
||||
) => tcx.generics_of(def_id),
|
||||
Res::Err => {
|
||||
tcx.sess.delay_span_bug(tcx.def_span(def_id), "anon const with Res::Err");
|
||||
return None;
|
||||
}
|
||||
_ => {
|
||||
// If the user tries to specify generics on a type that does not take them,
|
||||
// e.g. `usize<T>`, we may hit this branch, in which case we treat it as if
|
||||
// no arguments have been passed. An error should already have been emitted.
|
||||
tcx.sess.delay_span_bug(
|
||||
tcx.def_span(def_id),
|
||||
&format!("unexpected anon const res {:?} in path: {:?}", res, path),
|
||||
);
|
||||
return None;
|
||||
}
|
||||
};
|
||||
|
||||
generics
|
||||
.params
|
||||
.iter()
|
||||
.filter(|param| matches!(param.kind, ty::GenericParamDefKind::Const { .. }))
|
||||
.nth(arg_index)
|
||||
.map(|param| param.def_id)
|
||||
(generics, arg_index)
|
||||
}
|
||||
_ => return None,
|
||||
};
|
||||
|
||||
debug!(?parent_node);
|
||||
debug!(?generics, ?arg_idx);
|
||||
generics
|
||||
.params
|
||||
.iter()
|
||||
.filter(|param| param.kind.is_ty_or_const())
|
||||
.nth(match generics.has_self && generics.parent.is_none() {
|
||||
true => arg_idx + 1,
|
||||
false => arg_idx,
|
||||
})
|
||||
.and_then(|param| match param.kind {
|
||||
ty::GenericParamDefKind::Const { .. } => {
|
||||
debug!(?param);
|
||||
Some(param.def_id)
|
||||
}
|
||||
_ => None,
|
||||
}
|
||||
} else {
|
||||
None
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
fn get_path_containing_arg_in_pat<'hir>(
|
||||
|
@ -481,9 +481,10 @@ pub trait TryFrom<T>: Sized {
|
||||
|
||||
// As lifts over &
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
impl<T: ?Sized, U: ?Sized> AsRef<U> for &T
|
||||
#[rustc_const_unstable(feature = "const_convert", issue = "88674")]
|
||||
impl<T: ?Sized, U: ?Sized> const AsRef<U> for &T
|
||||
where
|
||||
T: AsRef<U>,
|
||||
T: ~const AsRef<U>,
|
||||
{
|
||||
fn as_ref(&self) -> &U {
|
||||
<T as AsRef<U>>::as_ref(*self)
|
||||
@ -492,9 +493,10 @@ fn as_ref(&self) -> &U {
|
||||
|
||||
// As lifts over &mut
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
impl<T: ?Sized, U: ?Sized> AsRef<U> for &mut T
|
||||
#[rustc_const_unstable(feature = "const_convert", issue = "88674")]
|
||||
impl<T: ?Sized, U: ?Sized> const AsRef<U> for &mut T
|
||||
where
|
||||
T: AsRef<U>,
|
||||
T: ~const AsRef<U>,
|
||||
{
|
||||
fn as_ref(&self) -> &U {
|
||||
<T as AsRef<U>>::as_ref(*self)
|
||||
@ -511,9 +513,10 @@ fn as_ref(&self) -> &U {
|
||||
|
||||
// AsMut lifts over &mut
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
impl<T: ?Sized, U: ?Sized> AsMut<U> for &mut T
|
||||
#[rustc_const_unstable(feature = "const_convert", issue = "88674")]
|
||||
impl<T: ?Sized, U: ?Sized> const AsMut<U> for &mut T
|
||||
where
|
||||
T: AsMut<U>,
|
||||
T: ~const AsMut<U>,
|
||||
{
|
||||
fn as_mut(&mut self) -> &mut U {
|
||||
(*self).as_mut()
|
||||
@ -567,9 +570,10 @@ fn from(t: !) -> T {
|
||||
|
||||
// TryFrom implies TryInto
|
||||
#[stable(feature = "try_from", since = "1.34.0")]
|
||||
impl<T, U> TryInto<U> for T
|
||||
#[rustc_const_unstable(feature = "const_convert", issue = "88674")]
|
||||
impl<T, U> const TryInto<U> for T
|
||||
where
|
||||
U: TryFrom<T>,
|
||||
U: ~const TryFrom<T>,
|
||||
{
|
||||
type Error = U::Error;
|
||||
|
||||
@ -581,9 +585,10 @@ fn try_into(self) -> Result<U, U::Error> {
|
||||
// Infallible conversions are semantically equivalent to fallible conversions
|
||||
// with an uninhabited error type.
|
||||
#[stable(feature = "try_from", since = "1.34.0")]
|
||||
impl<T, U> TryFrom<U> for T
|
||||
#[rustc_const_unstable(feature = "const_convert", issue = "88674")]
|
||||
impl<T, U> const TryFrom<U> for T
|
||||
where
|
||||
U: Into<T>,
|
||||
U: ~const Into<T>,
|
||||
{
|
||||
type Error = Infallible;
|
||||
|
||||
|
@ -25,6 +25,8 @@
|
||||
pub use self::ip::{IpAddr, Ipv4Addr, Ipv6Addr, Ipv6MulticastScope};
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
pub use self::parser::AddrParseError;
|
||||
#[unstable(feature = "tcplistener_into_incoming", issue = "88339")]
|
||||
pub use self::tcp::IntoIncoming;
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
pub use self::tcp::{Incoming, TcpListener, TcpStream};
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
|
@ -1191,11 +1191,9 @@ fn render_deref_methods(
|
||||
}
|
||||
}
|
||||
render_assoc_items_inner(w, cx, container_item, did, what, derefs);
|
||||
} else {
|
||||
if let Some(prim) = target.primitive_type() {
|
||||
if let Some(&did) = cache.primitive_locations.get(&prim) {
|
||||
render_assoc_items_inner(w, cx, container_item, did, what, derefs);
|
||||
}
|
||||
} else if let Some(prim) = target.primitive_type() {
|
||||
if let Some(&did) = cache.primitive_locations.get(&prim) {
|
||||
render_assoc_items_inner(w, cx, container_item, did, what, derefs);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -129,12 +129,12 @@ pub(super) fn print_item(cx: &Context<'_>, item: &clean::Item, buf: &mut Buffer,
|
||||
};
|
||||
|
||||
let item_vars = ItemVars {
|
||||
page: page,
|
||||
page,
|
||||
static_root_path: page.get_static_root_path(),
|
||||
typ: typ,
|
||||
typ,
|
||||
name: item.name.as_ref().unwrap().as_str(),
|
||||
item_type: &item.type_().to_string(),
|
||||
path_components: path_components,
|
||||
path_components,
|
||||
stability_since_raw: &stability_since_raw,
|
||||
src_href: src_href.as_deref(),
|
||||
};
|
||||
|
@ -18,6 +18,7 @@
|
||||
#![feature(iter_intersperse)]
|
||||
#![recursion_limit = "256"]
|
||||
#![warn(rustc::internal)]
|
||||
#![allow(clippy::collapsible_if, clippy::collapsible_else_if)]
|
||||
|
||||
#[macro_use]
|
||||
extern crate tracing;
|
||||
|
@ -43,11 +43,10 @@ fn fold_item(&mut self, i: Item) -> Option<Item> {
|
||||
| clean::TraitAliasItem(..)
|
||||
| clean::MacroItem(..)
|
||||
| clean::ForeignTypeItem => {
|
||||
if i.def_id.is_local() {
|
||||
if !self.access_levels.is_exported(i.def_id.expect_def_id()) {
|
||||
debug!("Stripper: stripping {:?} {:?}", i.type_(), i.name);
|
||||
return None;
|
||||
}
|
||||
if i.def_id.is_local() && !self.access_levels.is_exported(i.def_id.expect_def_id())
|
||||
{
|
||||
debug!("Stripper: stripping {:?} {:?}", i.type_(), i.name);
|
||||
return None;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -25,7 +25,7 @@ fn foo<'z>() where &'z (): Sized {
|
||||
let x: () = <i8 as Foo<'static, 'static, u32>>::bar::<'static, char>;
|
||||
//[verbose]~^ ERROR mismatched types
|
||||
//[verbose]~| expected unit type `()`
|
||||
//[verbose]~| found fn item `fn() {<i8 as Foo<ReStatic, ReStatic>>::bar::<ReStatic, char>}`
|
||||
//[verbose]~| found fn item `fn() {<i8 as Foo<ReStatic, ReStatic, u32>>::bar::<ReStatic, char>}`
|
||||
//[normal]~^^^^ ERROR mismatched types
|
||||
//[normal]~| expected unit type `()`
|
||||
//[normal]~| found fn item `fn() {<i8 as Foo<'static, 'static>>::bar::<'static, char>}`
|
||||
|
@ -20,7 +20,7 @@ error[E0308]: mismatched types
|
||||
--> $DIR/substs-ppaux.rs:25:17
|
||||
|
|
||||
LL | fn bar<'a, T>() where T: 'a {}
|
||||
| --------------------------- fn() {<i8 as Foo<ReStatic, ReStatic>>::bar::<ReStatic, char>} defined here
|
||||
| --------------------------- fn() {<i8 as Foo<ReStatic, ReStatic, u32>>::bar::<ReStatic, char>} defined here
|
||||
...
|
||||
LL | let x: () = <i8 as Foo<'static, 'static, u32>>::bar::<'static, char>;
|
||||
| -- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `()`, found fn item
|
||||
@ -28,7 +28,7 @@ LL | let x: () = <i8 as Foo<'static, 'static, u32>>::bar::<'static, char>;
|
||||
| expected due to this
|
||||
|
|
||||
= note: expected unit type `()`
|
||||
found fn item `fn() {<i8 as Foo<ReStatic, ReStatic>>::bar::<ReStatic, char>}`
|
||||
found fn item `fn() {<i8 as Foo<ReStatic, ReStatic, u32>>::bar::<ReStatic, char>}`
|
||||
help: use parentheses to call this function
|
||||
|
|
||||
LL | let x: () = <i8 as Foo<'static, 'static, u32>>::bar::<'static, char>();
|
||||
|
@ -0,0 +1,12 @@
|
||||
// check-pass
|
||||
#![feature(generic_arg_infer)]
|
||||
|
||||
struct Foo<const N: bool, const M: u8>;
|
||||
struct Bar<const N: u8, const M: u32>;
|
||||
|
||||
fn main() {
|
||||
let _: Foo<true, _> = Foo::<_, 1>;
|
||||
let _: Foo<_, 1> = Foo::<true, _>;
|
||||
let _: Bar<1, _> = Bar::<_, 300>;
|
||||
let _: Bar<_, 300> = Bar::<1, _>;
|
||||
}
|
@ -4,13 +4,6 @@ error[E0770]: the type of const parameters must not depend on other generic para
|
||||
LL | fn foo<const N: usize, const A: [u8; N]>() {}
|
||||
| ^ the type must not depend on the parameter `N`
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/issue-62878.rs:10:15
|
||||
|
|
||||
LL | foo::<_, {[1]}>();
|
||||
| ^^^ expected `usize`, found array `[{integer}; 1]`
|
||||
error: aborting due to previous error
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0308, E0770.
|
||||
For more information about an error, try `rustc --explain E0308`.
|
||||
For more information about this error, try `rustc --explain E0770`.
|
||||
|
@ -7,6 +7,5 @@
|
||||
//[min]~| ERROR `[u8; _]` is forbidden as the type of a const generic parameter
|
||||
|
||||
fn main() {
|
||||
foo::<_, {[1]}>();
|
||||
//[full]~^ ERROR mismatched types
|
||||
foo::<_, { [1] }>();
|
||||
}
|
||||
|
32
src/test/ui/generic-associated-types/issue-89352.rs
Normal file
32
src/test/ui/generic-associated-types/issue-89352.rs
Normal file
@ -0,0 +1,32 @@
|
||||
// check-pass
|
||||
|
||||
#![feature(generic_associated_types)]
|
||||
|
||||
use std::marker::PhantomData;
|
||||
|
||||
pub trait GenAssoc<T> {
|
||||
type Iter<'at>;
|
||||
fn iter(&self) -> Self::Iter<'_>;
|
||||
fn reborrow<'longt: 'shortt, 'shortt>(iter: Self::Iter<'longt>) -> Self::Iter<'shortt>;
|
||||
}
|
||||
|
||||
pub struct Wrapper<'a, T: 'a, A: GenAssoc<T>> {
|
||||
a: A::Iter<'a>,
|
||||
_p: PhantomData<T>,
|
||||
}
|
||||
|
||||
impl<'ai, T: 'ai, A: GenAssoc<T>> GenAssoc<T> for Wrapper<'ai, T, A>
|
||||
where
|
||||
A::Iter<'ai>: Clone,
|
||||
{
|
||||
type Iter<'b> = ();
|
||||
fn iter<'s>(&'s self) -> Self::Iter<'s> {
|
||||
let a = A::reborrow::<'ai, 's>(self.a.clone());
|
||||
}
|
||||
|
||||
fn reborrow<'long: 'short, 'short>(iter: Self::Iter<'long>) -> Self::Iter<'short> {
|
||||
()
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {}
|
@ -6,7 +6,7 @@ LL | with_signature(x, |mut y| Box::new(y.next()))
|
||||
|
|
||||
= note: defining type: no_region::<'_#1r, T>::{closure#0} with closure substs [
|
||||
i32,
|
||||
extern "rust-call" fn((std::boxed::Box<T>,)) -> std::boxed::Box<(dyn Anything + '_#2r)>,
|
||||
extern "rust-call" fn((std::boxed::Box<T, std::alloc::Global>,)) -> std::boxed::Box<(dyn Anything + '_#2r), std::alloc::Global>,
|
||||
(),
|
||||
]
|
||||
= note: number of external vids: 3
|
||||
@ -42,7 +42,7 @@ LL | with_signature(x, |mut y| Box::new(y.next()))
|
||||
|
|
||||
= note: defining type: correct_region::<'_#1r, T>::{closure#0} with closure substs [
|
||||
i32,
|
||||
extern "rust-call" fn((std::boxed::Box<T>,)) -> std::boxed::Box<(dyn Anything + '_#2r)>,
|
||||
extern "rust-call" fn((std::boxed::Box<T, std::alloc::Global>,)) -> std::boxed::Box<(dyn Anything + '_#2r), std::alloc::Global>,
|
||||
(),
|
||||
]
|
||||
= note: number of external vids: 3
|
||||
@ -69,7 +69,7 @@ LL | with_signature(x, |mut y| Box::new(y.next()))
|
||||
|
|
||||
= note: defining type: wrong_region::<'_#1r, '_#2r, T>::{closure#0} with closure substs [
|
||||
i32,
|
||||
extern "rust-call" fn((std::boxed::Box<T>,)) -> std::boxed::Box<(dyn Anything + '_#3r)>,
|
||||
extern "rust-call" fn((std::boxed::Box<T, std::alloc::Global>,)) -> std::boxed::Box<(dyn Anything + '_#3r), std::alloc::Global>,
|
||||
(),
|
||||
]
|
||||
= note: number of external vids: 4
|
||||
@ -105,7 +105,7 @@ LL | with_signature(x, |mut y| Box::new(y.next()))
|
||||
|
|
||||
= note: defining type: outlives_region::<'_#1r, '_#2r, T>::{closure#0} with closure substs [
|
||||
i32,
|
||||
extern "rust-call" fn((std::boxed::Box<T>,)) -> std::boxed::Box<(dyn Anything + '_#3r)>,
|
||||
extern "rust-call" fn((std::boxed::Box<T, std::alloc::Global>,)) -> std::boxed::Box<(dyn Anything + '_#3r), std::alloc::Global>,
|
||||
(),
|
||||
]
|
||||
= note: number of external vids: 4
|
||||
|
@ -6,7 +6,7 @@ LL | with_signature(x, |y| y)
|
||||
|
|
||||
= note: defining type: no_region::<'_#1r, T>::{closure#0} with closure substs [
|
||||
i32,
|
||||
extern "rust-call" fn((std::boxed::Box<T>,)) -> std::boxed::Box<(dyn std::fmt::Debug + '_#2r)>,
|
||||
extern "rust-call" fn((std::boxed::Box<T, std::alloc::Global>,)) -> std::boxed::Box<(dyn std::fmt::Debug + '_#2r), std::alloc::Global>,
|
||||
(),
|
||||
]
|
||||
= note: number of external vids: 3
|
||||
|
Loading…
Reference in New Issue
Block a user