Auto merge of #128835 - matthiaskrgr:rollup-apzlbxy, r=matthiaskrgr

Rollup of 7 pull requests

Successful merges:

 - #128306 (Update NonNull::align_offset quarantees)
 - #128612 (Make `validate_mir` ensure the final MIR for all bodies)
 - #128648 (Add regression test)
 - #128749 (Mark `{f32,f64}::{next_up,next_down,midpoint}` inline)
 - #128795 (Update E0517 message to reflect RFC 2195.)
 - #128825 (rm `declared_features` field in resolver)
 - #128826 (Only suggest `#[allow]` for `--warn` and `--deny` lint level flags)

r? `@ghost`
`@rustbot` modify labels: rollup
This commit is contained in:
bors 2024-08-08 19:24:26 +00:00
commit 3e9bd8b566
20 changed files with 80 additions and 29 deletions

View File

@ -25,14 +25,17 @@ impl Foo {
These attributes do not work on typedefs, since typedefs are just aliases. These attributes do not work on typedefs, since typedefs are just aliases.
Representations like `#[repr(u8)]`, `#[repr(i64)]` are for selecting the Representations like `#[repr(u8)]`, `#[repr(i64)]` are for selecting the
discriminant size for enums with no data fields on any of the variants, e.g. discriminant size for enums. For enums with no data fields on any of the
`enum Color {Red, Blue, Green}`, effectively setting the size of the enum to variants, e.g. `enum Color {Red, Blue, Green}`, this effectively sets the size
the size of the provided type. Such an enum can be cast to a value of the same of the enum to the size of the provided type. Such an enum can be cast to a
type as well. In short, `#[repr(u8)]` makes the enum behave like an integer value of the same type as well. In short, `#[repr(u8)]` makes a field-less enum
with a constrained set of allowed values. behave like an integer with a constrained set of allowed values.
Only field-less enums can be cast to numerical primitives, so this attribute For a description of how `#[repr(C)]` and representations like `#[repr(u8)]`
will not apply to structs. affect the layout of enums with data fields, see [RFC 2195][rfc2195].
Only field-less enums can be cast to numerical primitives. Representations like
`#[repr(u8)]` will not apply to structs.
`#[repr(packed)]` reduces padding to make the struct size smaller. The `#[repr(packed)]` reduces padding to make the struct size smaller. The
representation of enums isn't strictly defined in Rust, and this attribute representation of enums isn't strictly defined in Rust, and this attribute
@ -42,3 +45,5 @@ won't work on enums.
types (i.e., `u8`, `i32`, etc) a representation that permits vectorization via types (i.e., `u8`, `i32`, etc) a representation that permits vectorization via
SIMD. This doesn't make much sense for enums since they don't consist of a SIMD. This doesn't make much sense for enums since they don't consist of a
single list of data. single list of data.
[rfc2195]: https://github.com/rust-lang/rfcs/blob/master/text/2195-really-tagged-unions.md

View File

@ -818,6 +818,13 @@ fn run_required_analyses(tcx: TyCtxt<'_>) {
}); });
sess.time("layout_testing", || layout_test::test_layout(tcx)); sess.time("layout_testing", || layout_test::test_layout(tcx));
sess.time("abi_testing", || abi_test::test_abi(tcx)); sess.time("abi_testing", || abi_test::test_abi(tcx));
if tcx.sess.opts.unstable_opts.validate_mir {
sess.time("ensuring_optimized_MIR_is_computable", || {
tcx.hir().par_body_owners(|def_id| {
tcx.instance_mir(ty::InstanceKind::Item(def_id.into()));
});
});
}
} }
/// Runs the type-checking, region checking and other miscellaneous analysis /// Runs the type-checking, region checking and other miscellaneous analysis

View File

@ -228,9 +228,11 @@ pub fn explain_lint_level_source(
err.note_once(format!( err.note_once(format!(
"`{flag} {hyphen_case_lint_name}` implied by `{flag} {hyphen_case_flag_val}`" "`{flag} {hyphen_case_lint_name}` implied by `{flag} {hyphen_case_flag_val}`"
)); ));
err.help_once(format!( if matches!(orig_level, Level::Warn | Level::Deny) {
"to override `{flag} {hyphen_case_flag_val}` add `#[allow({name})]`" err.help_once(format!(
)); "to override `{flag} {hyphen_case_flag_val}` add `#[allow({name})]`"
));
}
} }
} }
LintLevelSource::Node { name: lint_attr_name, span, reason, .. } => { LintLevelSource::Node { name: lint_attr_name, span, reason, .. } => {

View File

@ -1129,9 +1129,6 @@ pub struct Resolver<'a, 'tcx> {
/// Also includes of list of each fields visibility /// Also includes of list of each fields visibility
struct_constructors: LocalDefIdMap<(Res, ty::Visibility<DefId>, Vec<ty::Visibility<DefId>>)>, struct_constructors: LocalDefIdMap<(Res, ty::Visibility<DefId>, Vec<ty::Visibility<DefId>>)>,
/// Features declared for this crate.
declared_features: FxHashSet<Symbol>,
lint_buffer: LintBuffer, lint_buffer: LintBuffer,
next_node_id: NodeId, next_node_id: NodeId,
@ -1402,7 +1399,6 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
let registered_tools = tcx.registered_tools(()); let registered_tools = tcx.registered_tools(());
let features = tcx.features();
let pub_vis = ty::Visibility::<DefId>::Public; let pub_vis = ty::Visibility::<DefId>::Public;
let edition = tcx.sess.edition(); let edition = tcx.sess.edition();
@ -1506,7 +1502,6 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
multi_segment_macro_resolutions: Default::default(), multi_segment_macro_resolutions: Default::default(),
builtin_attrs: Default::default(), builtin_attrs: Default::default(),
containers_deriving_copy: Default::default(), containers_deriving_copy: Default::default(),
declared_features: features.declared_features.clone(),
lint_buffer: LintBuffer::default(), lint_buffer: LintBuffer::default(),
next_node_id: CRATE_NODE_ID, next_node_id: CRATE_NODE_ID,
node_id_to_def_id, node_id_to_def_id,

View File

@ -1001,7 +1001,8 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
let feature = stability.feature; let feature = stability.feature;
let is_allowed = |feature| { let is_allowed = |feature| {
self.declared_features.contains(&feature) || span.allows_unstable(feature) self.tcx.features().declared_features.contains(&feature)
|| span.allows_unstable(feature)
}; };
let allowed_by_implication = implied_by.is_some_and(|feature| is_allowed(feature)); let allowed_by_implication = implied_by.is_some_and(|feature| is_allowed(feature));
if !is_allowed(feature) && !allowed_by_implication { if !is_allowed(feature) && !allowed_by_implication {

View File

@ -797,6 +797,7 @@ impl f32 {
/// [`INFINITY`]: Self::INFINITY /// [`INFINITY`]: Self::INFINITY
/// [`MIN`]: Self::MIN /// [`MIN`]: Self::MIN
/// [`MAX`]: Self::MAX /// [`MAX`]: Self::MAX
#[inline]
#[unstable(feature = "float_next_up_down", issue = "91399")] #[unstable(feature = "float_next_up_down", issue = "91399")]
#[rustc_const_unstable(feature = "float_next_up_down", issue = "91399")] #[rustc_const_unstable(feature = "float_next_up_down", issue = "91399")]
pub const fn next_up(self) -> Self { pub const fn next_up(self) -> Self {
@ -845,6 +846,7 @@ impl f32 {
/// [`INFINITY`]: Self::INFINITY /// [`INFINITY`]: Self::INFINITY
/// [`MIN`]: Self::MIN /// [`MIN`]: Self::MIN
/// [`MAX`]: Self::MAX /// [`MAX`]: Self::MAX
#[inline]
#[unstable(feature = "float_next_up_down", issue = "91399")] #[unstable(feature = "float_next_up_down", issue = "91399")]
#[rustc_const_unstable(feature = "float_next_up_down", issue = "91399")] #[rustc_const_unstable(feature = "float_next_up_down", issue = "91399")]
pub const fn next_down(self) -> Self { pub const fn next_down(self) -> Self {
@ -1042,6 +1044,7 @@ impl f32 {
/// assert_eq!(1f32.midpoint(4.0), 2.5); /// assert_eq!(1f32.midpoint(4.0), 2.5);
/// assert_eq!((-5.5f32).midpoint(8.0), 1.25); /// assert_eq!((-5.5f32).midpoint(8.0), 1.25);
/// ``` /// ```
#[inline]
#[unstable(feature = "num_midpoint", issue = "110840")] #[unstable(feature = "num_midpoint", issue = "110840")]
pub fn midpoint(self, other: f32) -> f32 { pub fn midpoint(self, other: f32) -> f32 {
cfg_if! { cfg_if! {

View File

@ -805,6 +805,7 @@ impl f64 {
/// [`INFINITY`]: Self::INFINITY /// [`INFINITY`]: Self::INFINITY
/// [`MIN`]: Self::MIN /// [`MIN`]: Self::MIN
/// [`MAX`]: Self::MAX /// [`MAX`]: Self::MAX
#[inline]
#[unstable(feature = "float_next_up_down", issue = "91399")] #[unstable(feature = "float_next_up_down", issue = "91399")]
#[rustc_const_unstable(feature = "float_next_up_down", issue = "91399")] #[rustc_const_unstable(feature = "float_next_up_down", issue = "91399")]
pub const fn next_up(self) -> Self { pub const fn next_up(self) -> Self {
@ -853,6 +854,7 @@ impl f64 {
/// [`INFINITY`]: Self::INFINITY /// [`INFINITY`]: Self::INFINITY
/// [`MIN`]: Self::MIN /// [`MIN`]: Self::MIN
/// [`MAX`]: Self::MAX /// [`MAX`]: Self::MAX
#[inline]
#[unstable(feature = "float_next_up_down", issue = "91399")] #[unstable(feature = "float_next_up_down", issue = "91399")]
#[rustc_const_unstable(feature = "float_next_up_down", issue = "91399")] #[rustc_const_unstable(feature = "float_next_up_down", issue = "91399")]
pub const fn next_down(self) -> Self { pub const fn next_down(self) -> Self {
@ -1051,6 +1053,7 @@ impl f64 {
/// assert_eq!(1f64.midpoint(4.0), 2.5); /// assert_eq!(1f64.midpoint(4.0), 2.5);
/// assert_eq!((-5.5f64).midpoint(8.0), 1.25); /// assert_eq!((-5.5f64).midpoint(8.0), 1.25);
/// ``` /// ```
#[inline]
#[unstable(feature = "num_midpoint", issue = "110840")] #[unstable(feature = "num_midpoint", issue = "110840")]
pub fn midpoint(self, other: f64) -> f64 { pub fn midpoint(self, other: f64) -> f64 {
const LO: f64 = f64::MIN_POSITIVE * 2.; const LO: f64 = f64::MIN_POSITIVE * 2.;

View File

@ -1169,9 +1169,7 @@ impl<T: ?Sized> NonNull<T> {
/// `align`. /// `align`.
/// ///
/// If it is not possible to align the pointer, the implementation returns /// If it is not possible to align the pointer, the implementation returns
/// `usize::MAX`. It is permissible for the implementation to *always* /// `usize::MAX`.
/// return `usize::MAX`. Only your algorithm's performance can depend
/// on getting a usable offset here, not its correctness.
/// ///
/// The offset is expressed in number of `T` elements, and not bytes. /// The offset is expressed in number of `T` elements, and not bytes.
/// ///
@ -1179,6 +1177,15 @@ impl<T: ?Sized> NonNull<T> {
/// beyond the allocation that the pointer points into. It is up to the caller to ensure that /// beyond the allocation that the pointer points into. It is up to the caller to ensure that
/// the returned offset is correct in all terms other than alignment. /// the returned offset is correct in all terms other than alignment.
/// ///
/// When this is called during compile-time evaluation (which is unstable), the implementation
/// may return `usize::MAX` in cases where that can never happen at runtime. This is because the
/// actual alignment of pointers is not known yet during compile-time, so an offset with
/// guaranteed alignment can sometimes not be computed. For example, a buffer declared as `[u8;
/// N]` might be allocated at an odd or an even address, but at compile-time this is not yet
/// known, so the execution has to be correct for either choice. It is therefore impossible to
/// find an offset that is guaranteed to be 2-aligned. (This behavior is subject to change, as usual
/// for unstable APIs.)
///
/// # Panics /// # Panics
/// ///
/// The function panics if `align` is not a power-of-two. /// The function panics if `align` is not a power-of-two.

View File

@ -1,5 +1,5 @@
//@ known-bug: #121127 //@ known-bug: #121127
//@ compile-flags: -Zpolymorphize=on -Zinline-mir=yes -C debuginfo=2 //@ compile-flags: -Zvalidate-mir -Zinline-mir=yes -C debuginfo=2
// Note that as of PR#123949 this only crashes with debuginfo enabled // Note that as of PR#123949 this only crashes with debuginfo enabled
#![feature(specialization)] #![feature(specialization)]

View File

@ -1,4 +1,4 @@
//@ compile-flags: -Zpolymorphize=on -Zinline-mir=yes //@ compile-flags: -Zvalidate-mir -Zinline-mir=yes
//@ known-bug: #122909 //@ known-bug: #122909

View File

@ -1,5 +1,5 @@
//@ known-bug: rust-lang/rust#126896 //@ known-bug: rust-lang/rust#126896
//@ compile-flags: -Zpolymorphize=on -Zinline-mir=yes //@ compile-flags: -Zvalidate-mir -Zinline-mir=yes
#![feature(type_alias_impl_trait)] #![feature(type_alias_impl_trait)]
type Two<'a, 'b> = impl std::fmt::Debug; type Two<'a, 'b> = impl std::fmt::Debug;

View File

@ -0,0 +1,16 @@
// Test for ICE: cannot convert ReLateParam to a region vid
// https://github.com/rust-lang/rust/issues/125873
#![feature(closure_lifetime_binder)]
fn foo() {
let a = for<'a> |b: &'a ()| -> &'a () {
const {
let awd = ();
let _: &'a () = &awd;
//~^ `awd` does not live long enough
};
b
};
}
fn main() {}

View File

@ -0,0 +1,19 @@
error[E0597]: `awd` does not live long enough
--> $DIR/using-late-bound-from-closure.rs:9:29
|
LL | let a = for<'a> |b: &'a ()| -> &'a () {
| -- lifetime `'a` defined here
LL | const {
LL | let awd = ();
| --- binding `awd` declared here
LL | let _: &'a () = &awd;
| ------ ^^^^ borrowed value does not live long enough
| |
| type annotation requires that `awd` is borrowed for `'a`
LL |
LL | };
| - `awd` dropped here while still borrowed
error: aborting due to 1 previous error
For more information about this error, try `rustc --explain E0597`.

View File

@ -5,7 +5,6 @@ LL | let _InappropriateCamelCasing = true;
| ^^^^^^^^^^^^^^^^^^^^^^^^^ help: convert the identifier to snake case: `_inappropriate_camel_casing` | ^^^^^^^^^^^^^^^^^^^^^^^^^ help: convert the identifier to snake case: `_inappropriate_camel_casing`
| |
= note: `-F non-snake-case` implied by `-F bad-style` = note: `-F non-snake-case` implied by `-F bad-style`
= help: to override `-F bad-style` add `#[allow(non_snake_case)]`
error: aborting due to 1 previous error error: aborting due to 1 previous error

View File

@ -7,7 +7,6 @@ LL | 0...100 => true,
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021! = warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html> = note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>
= note: `--force-warn ellipsis-inclusive-range-patterns` implied by `--force-warn rust-2021-compatibility` = note: `--force-warn ellipsis-inclusive-range-patterns` implied by `--force-warn rust-2021-compatibility`
= help: to override `--force-warn rust-2021-compatibility` add `#[allow(ellipsis_inclusive_range_patterns)]`
warning: 1 warning emitted warning: 1 warning emitted

View File

@ -5,7 +5,6 @@ LL | pub fn FUNCTION() {}
| ^^^^^^^^ help: convert the identifier to snake case: `function` | ^^^^^^^^ help: convert the identifier to snake case: `function`
| |
= note: `--force-warn non-snake-case` implied by `--force-warn nonstandard-style` = note: `--force-warn non-snake-case` implied by `--force-warn nonstandard-style`
= help: to override `--force-warn nonstandard-style` add `#[allow(non_snake_case)]`
warning: 1 warning emitted warning: 1 warning emitted

View File

@ -7,7 +7,6 @@ LL | pub fn function(_x: Box<SomeTrait>) {}
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021! = warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html> = note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>
= note: `--force-warn bare-trait-objects` implied by `--force-warn rust-2018-idioms` = note: `--force-warn bare-trait-objects` implied by `--force-warn rust-2018-idioms`
= help: to override `--force-warn rust-2018-idioms` add `#[allow(bare_trait_objects)]`
help: if this is an object-safe trait, use `dyn` help: if this is an object-safe trait, use `dyn`
| |
LL | pub fn function(_x: Box<dyn SomeTrait>) {} LL | pub fn function(_x: Box<dyn SomeTrait>) {}

View File

@ -7,7 +7,6 @@ LL | pub fn function(_x: Box<SomeTrait>) {}
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021! = warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html> = note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>
= note: `--force-warn bare-trait-objects` implied by `--force-warn rust-2018-idioms` = note: `--force-warn bare-trait-objects` implied by `--force-warn rust-2018-idioms`
= help: to override `--force-warn rust-2018-idioms` add `#[allow(bare_trait_objects)]`
help: if this is an object-safe trait, use `dyn` help: if this is an object-safe trait, use `dyn`
| |
LL | pub fn function(_x: Box<dyn SomeTrait>) {} LL | pub fn function(_x: Box<dyn SomeTrait>) {}

View File

@ -7,7 +7,6 @@ LL | pub fn function(_x: Box<SomeTrait>) {}
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021! = warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html> = note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>
= note: `--force-warn bare-trait-objects` implied by `--force-warn rust-2018-idioms` = note: `--force-warn bare-trait-objects` implied by `--force-warn rust-2018-idioms`
= help: to override `--force-warn rust-2018-idioms` add `#[allow(bare_trait_objects)]`
help: if this is an object-safe trait, use `dyn` help: if this is an object-safe trait, use `dyn`
| |
LL | pub fn function(_x: Box<dyn SomeTrait>) {} LL | pub fn function(_x: Box<dyn SomeTrait>) {}

View File

@ -5,7 +5,6 @@ LL | let x = 1;
| ^ help: if this is intentional, prefix it with an underscore: `_x` | ^ help: if this is intentional, prefix it with an underscore: `_x`
| |
= note: `-F unused-variables` implied by `-F unused` = note: `-F unused-variables` implied by `-F unused`
= help: to override `-F unused` add `#[allow(unused_variables)]`
error: aborting due to 1 previous error error: aborting due to 1 previous error