mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 14:55:26 +00:00
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:
commit
3e9bd8b566
@ -25,14 +25,17 @@ impl Foo {
|
||||
These attributes do not work on typedefs, since typedefs are just aliases.
|
||||
|
||||
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.
|
||||
`enum Color {Red, Blue, Green}`, effectively setting the size of the enum to
|
||||
the size of the provided type. Such an enum can be cast to a value of the same
|
||||
type as well. In short, `#[repr(u8)]` makes the enum behave like an integer
|
||||
with a constrained set of allowed values.
|
||||
discriminant size for enums. For enums with no data fields on any of the
|
||||
variants, e.g. `enum Color {Red, Blue, Green}`, this effectively sets the size
|
||||
of the enum to the size of the provided type. Such an enum can be cast to a
|
||||
value of the same type as well. In short, `#[repr(u8)]` makes a field-less enum
|
||||
behave like an integer with a constrained set of allowed values.
|
||||
|
||||
Only field-less enums can be cast to numerical primitives, so this attribute
|
||||
will not apply to structs.
|
||||
For a description of how `#[repr(C)]` and representations like `#[repr(u8)]`
|
||||
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
|
||||
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
|
||||
SIMD. This doesn't make much sense for enums since they don't consist of a
|
||||
single list of data.
|
||||
|
||||
[rfc2195]: https://github.com/rust-lang/rfcs/blob/master/text/2195-really-tagged-unions.md
|
||||
|
@ -818,6 +818,13 @@ fn run_required_analyses(tcx: TyCtxt<'_>) {
|
||||
});
|
||||
sess.time("layout_testing", || layout_test::test_layout(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
|
||||
|
@ -228,9 +228,11 @@ pub fn explain_lint_level_source(
|
||||
err.note_once(format!(
|
||||
"`{flag} {hyphen_case_lint_name}` implied by `{flag} {hyphen_case_flag_val}`"
|
||||
));
|
||||
err.help_once(format!(
|
||||
"to override `{flag} {hyphen_case_flag_val}` add `#[allow({name})]`"
|
||||
));
|
||||
if matches!(orig_level, Level::Warn | Level::Deny) {
|
||||
err.help_once(format!(
|
||||
"to override `{flag} {hyphen_case_flag_val}` add `#[allow({name})]`"
|
||||
));
|
||||
}
|
||||
}
|
||||
}
|
||||
LintLevelSource::Node { name: lint_attr_name, span, reason, .. } => {
|
||||
|
@ -1129,9 +1129,6 @@ pub struct Resolver<'a, 'tcx> {
|
||||
/// Also includes of list of each fields visibility
|
||||
struct_constructors: LocalDefIdMap<(Res, ty::Visibility<DefId>, Vec<ty::Visibility<DefId>>)>,
|
||||
|
||||
/// Features declared for this crate.
|
||||
declared_features: FxHashSet<Symbol>,
|
||||
|
||||
lint_buffer: LintBuffer,
|
||||
|
||||
next_node_id: NodeId,
|
||||
@ -1402,7 +1399,6 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
|
||||
|
||||
let registered_tools = tcx.registered_tools(());
|
||||
|
||||
let features = tcx.features();
|
||||
let pub_vis = ty::Visibility::<DefId>::Public;
|
||||
let edition = tcx.sess.edition();
|
||||
|
||||
@ -1506,7 +1502,6 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
|
||||
multi_segment_macro_resolutions: Default::default(),
|
||||
builtin_attrs: Default::default(),
|
||||
containers_deriving_copy: Default::default(),
|
||||
declared_features: features.declared_features.clone(),
|
||||
lint_buffer: LintBuffer::default(),
|
||||
next_node_id: CRATE_NODE_ID,
|
||||
node_id_to_def_id,
|
||||
|
@ -1001,7 +1001,8 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
|
||||
let feature = stability.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));
|
||||
if !is_allowed(feature) && !allowed_by_implication {
|
||||
|
@ -797,6 +797,7 @@ impl f32 {
|
||||
/// [`INFINITY`]: Self::INFINITY
|
||||
/// [`MIN`]: Self::MIN
|
||||
/// [`MAX`]: Self::MAX
|
||||
#[inline]
|
||||
#[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 {
|
||||
@ -845,6 +846,7 @@ impl f32 {
|
||||
/// [`INFINITY`]: Self::INFINITY
|
||||
/// [`MIN`]: Self::MIN
|
||||
/// [`MAX`]: Self::MAX
|
||||
#[inline]
|
||||
#[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 {
|
||||
@ -1042,6 +1044,7 @@ impl f32 {
|
||||
/// assert_eq!(1f32.midpoint(4.0), 2.5);
|
||||
/// assert_eq!((-5.5f32).midpoint(8.0), 1.25);
|
||||
/// ```
|
||||
#[inline]
|
||||
#[unstable(feature = "num_midpoint", issue = "110840")]
|
||||
pub fn midpoint(self, other: f32) -> f32 {
|
||||
cfg_if! {
|
||||
|
@ -805,6 +805,7 @@ impl f64 {
|
||||
/// [`INFINITY`]: Self::INFINITY
|
||||
/// [`MIN`]: Self::MIN
|
||||
/// [`MAX`]: Self::MAX
|
||||
#[inline]
|
||||
#[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 {
|
||||
@ -853,6 +854,7 @@ impl f64 {
|
||||
/// [`INFINITY`]: Self::INFINITY
|
||||
/// [`MIN`]: Self::MIN
|
||||
/// [`MAX`]: Self::MAX
|
||||
#[inline]
|
||||
#[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 {
|
||||
@ -1051,6 +1053,7 @@ impl f64 {
|
||||
/// assert_eq!(1f64.midpoint(4.0), 2.5);
|
||||
/// assert_eq!((-5.5f64).midpoint(8.0), 1.25);
|
||||
/// ```
|
||||
#[inline]
|
||||
#[unstable(feature = "num_midpoint", issue = "110840")]
|
||||
pub fn midpoint(self, other: f64) -> f64 {
|
||||
const LO: f64 = f64::MIN_POSITIVE * 2.;
|
||||
|
@ -1169,9 +1169,7 @@ impl<T: ?Sized> NonNull<T> {
|
||||
/// `align`.
|
||||
///
|
||||
/// If it is not possible to align the pointer, the implementation returns
|
||||
/// `usize::MAX`. It is permissible for the implementation to *always*
|
||||
/// return `usize::MAX`. Only your algorithm's performance can depend
|
||||
/// on getting a usable offset here, not its correctness.
|
||||
/// `usize::MAX`.
|
||||
///
|
||||
/// 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
|
||||
/// 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
|
||||
///
|
||||
/// The function panics if `align` is not a power-of-two.
|
||||
|
@ -1,5 +1,5 @@
|
||||
//@ 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
|
||||
|
||||
#![feature(specialization)]
|
||||
|
@ -1,4 +1,4 @@
|
||||
//@ compile-flags: -Zpolymorphize=on -Zinline-mir=yes
|
||||
//@ compile-flags: -Zvalidate-mir -Zinline-mir=yes
|
||||
//@ known-bug: #122909
|
||||
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
//@ 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)]
|
||||
type Two<'a, 'b> = impl std::fmt::Debug;
|
||||
|
16
tests/ui/inline-const/using-late-bound-from-closure.rs
Normal file
16
tests/ui/inline-const/using-late-bound-from-closure.rs
Normal 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() {}
|
19
tests/ui/inline-const/using-late-bound-from-closure.stderr
Normal file
19
tests/ui/inline-const/using-late-bound-from-closure.stderr
Normal 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`.
|
@ -5,7 +5,6 @@ LL | let _InappropriateCamelCasing = true;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ help: convert the identifier to snake case: `_inappropriate_camel_casing`
|
||||
|
|
||||
= 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
|
||||
|
||||
|
@ -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!
|
||||
= 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`
|
||||
= help: to override `--force-warn rust-2021-compatibility` add `#[allow(ellipsis_inclusive_range_patterns)]`
|
||||
|
||||
warning: 1 warning emitted
|
||||
|
||||
|
@ -5,7 +5,6 @@ LL | pub fn FUNCTION() {}
|
||||
| ^^^^^^^^ help: convert the identifier to snake case: `function`
|
||||
|
|
||||
= 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
|
||||
|
||||
|
@ -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!
|
||||
= 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`
|
||||
= help: to override `--force-warn rust-2018-idioms` add `#[allow(bare_trait_objects)]`
|
||||
help: if this is an object-safe trait, use `dyn`
|
||||
|
|
||||
LL | pub fn function(_x: Box<dyn SomeTrait>) {}
|
||||
|
@ -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!
|
||||
= 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`
|
||||
= help: to override `--force-warn rust-2018-idioms` add `#[allow(bare_trait_objects)]`
|
||||
help: if this is an object-safe trait, use `dyn`
|
||||
|
|
||||
LL | pub fn function(_x: Box<dyn SomeTrait>) {}
|
||||
|
@ -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!
|
||||
= 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`
|
||||
= help: to override `--force-warn rust-2018-idioms` add `#[allow(bare_trait_objects)]`
|
||||
help: if this is an object-safe trait, use `dyn`
|
||||
|
|
||||
LL | pub fn function(_x: Box<dyn SomeTrait>) {}
|
||||
|
@ -5,7 +5,6 @@ LL | let x = 1;
|
||||
| ^ help: if this is intentional, prefix it with an underscore: `_x`
|
||||
|
|
||||
= note: `-F unused-variables` implied by `-F unused`
|
||||
= help: to override `-F unused` add `#[allow(unused_variables)]`
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user