mirror of
https://github.com/rust-lang/rust.git
synced 2026-04-26 13:01:27 +03:00
Make layout_of cycles fatal errors
This commit is contained in:
@@ -1134,11 +1134,7 @@ fn handle_fn_abi_err(
|
|||||||
fn_abi_request: FnAbiRequest<'tcx>,
|
fn_abi_request: FnAbiRequest<'tcx>,
|
||||||
) -> ! {
|
) -> ! {
|
||||||
match err {
|
match err {
|
||||||
FnAbiError::Layout(
|
FnAbiError::Layout(LayoutError::SizeOverflow(_) | LayoutError::InvalidSimd { .. }) => {
|
||||||
LayoutError::SizeOverflow(_)
|
|
||||||
| LayoutError::Cycle(_)
|
|
||||||
| LayoutError::InvalidSimd { .. },
|
|
||||||
) => {
|
|
||||||
self.tcx.dcx().emit_fatal(Spanned { span, node: err });
|
self.tcx.dcx().emit_fatal(Spanned { span, node: err });
|
||||||
}
|
}
|
||||||
_ => match fn_abi_request {
|
_ => match fn_abi_request {
|
||||||
|
|||||||
@@ -107,8 +107,7 @@ fn handle_layout_err(
|
|||||||
| LayoutError::SizeOverflow(_)
|
| LayoutError::SizeOverflow(_)
|
||||||
| LayoutError::InvalidSimd { .. }
|
| LayoutError::InvalidSimd { .. }
|
||||||
| LayoutError::TooGeneric(_)
|
| LayoutError::TooGeneric(_)
|
||||||
| LayoutError::ReferencesError(_)
|
| LayoutError::ReferencesError(_) => {}
|
||||||
| LayoutError::Cycle(_) => {}
|
|
||||||
}
|
}
|
||||||
err_inval!(Layout(err))
|
err_inval!(Layout(err))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -194,8 +194,7 @@ fn should_emit_layout_error<'tcx>(abi: ExternAbi, layout_err: &'tcx LayoutError<
|
|||||||
| SizeOverflow(..)
|
| SizeOverflow(..)
|
||||||
| InvalidSimd { .. }
|
| InvalidSimd { .. }
|
||||||
| NormalizationFailure(..)
|
| NormalizationFailure(..)
|
||||||
| ReferencesError(..)
|
| ReferencesError(..) => {
|
||||||
| Cycle(..) => {
|
|
||||||
false // not our job to report these
|
false // not our job to report these
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -260,8 +260,6 @@ pub enum LayoutError<'tcx> {
|
|||||||
NormalizationFailure(Ty<'tcx>, NormalizationError<'tcx>),
|
NormalizationFailure(Ty<'tcx>, NormalizationError<'tcx>),
|
||||||
/// A non-layout error is reported elsewhere.
|
/// A non-layout error is reported elsewhere.
|
||||||
ReferencesError(ErrorGuaranteed),
|
ReferencesError(ErrorGuaranteed),
|
||||||
/// A type has cyclic layout, i.e. the type contains itself without indirection.
|
|
||||||
Cycle(ErrorGuaranteed),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> fmt::Display for LayoutError<'tcx> {
|
impl<'tcx> fmt::Display for LayoutError<'tcx> {
|
||||||
@@ -286,7 +284,6 @@ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|||||||
t,
|
t,
|
||||||
e.get_type_for_failure()
|
e.get_type_for_failure()
|
||||||
),
|
),
|
||||||
LayoutError::Cycle(_) => write!(f, "a cycle occurred during layout computation"),
|
|
||||||
LayoutError::ReferencesError(_) => write!(f, "the type has an unknown layout"),
|
LayoutError::ReferencesError(_) => write!(f, "the type has an unknown layout"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -358,8 +355,7 @@ pub fn compute(
|
|||||||
Err(err @ LayoutError::TooGeneric(_)) => err,
|
Err(err @ LayoutError::TooGeneric(_)) => err,
|
||||||
// We can't extract SizeSkeleton info from other layout errors
|
// We can't extract SizeSkeleton info from other layout errors
|
||||||
Err(
|
Err(
|
||||||
e @ LayoutError::Cycle(_)
|
e @ LayoutError::Unknown(_)
|
||||||
| e @ LayoutError::Unknown(_)
|
|
||||||
| e @ LayoutError::SizeOverflow(_)
|
| e @ LayoutError::SizeOverflow(_)
|
||||||
| e @ LayoutError::InvalidSimd { .. }
|
| e @ LayoutError::InvalidSimd { .. }
|
||||||
| e @ LayoutError::NormalizationFailure(..)
|
| e @ LayoutError::NormalizationFailure(..)
|
||||||
|
|||||||
@@ -12,7 +12,6 @@
|
|||||||
use rustc_middle::queries::{QueryVTables, TaggedQueryKey};
|
use rustc_middle::queries::{QueryVTables, TaggedQueryKey};
|
||||||
use rustc_middle::query::Cycle;
|
use rustc_middle::query::Cycle;
|
||||||
use rustc_middle::query::erase::erase_val;
|
use rustc_middle::query::erase::erase_val;
|
||||||
use rustc_middle::ty::layout::LayoutError;
|
|
||||||
use rustc_middle::ty::{self, Ty, TyCtxt};
|
use rustc_middle::ty::{self, Ty, TyCtxt};
|
||||||
use rustc_span::def_id::{DefId, LocalDefId};
|
use rustc_span::def_id::{DefId, LocalDefId};
|
||||||
use rustc_span::{ErrorGuaranteed, Span};
|
use rustc_span::{ErrorGuaranteed, Span};
|
||||||
@@ -203,8 +202,7 @@ fn layout_of<'tcx>(tcx: TyCtxt<'tcx>, cycle: Cycle<'tcx>) -> &'tcx ty::layout::L
|
|||||||
|| create_cycle_error(tcx, &cycle),
|
|| create_cycle_error(tcx, &cycle),
|
||||||
);
|
);
|
||||||
|
|
||||||
let guar = diag.emit();
|
diag.emit().raise_fatal()
|
||||||
tcx.arena.alloc(LayoutError::Cycle(guar))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// item_and_field_ids should form a cycle where each field contains the
|
// item_and_field_ids should form a cycle where each field contains the
|
||||||
|
|||||||
@@ -282,7 +282,6 @@ fn from(err: &LayoutError<'tcx>) -> Self {
|
|||||||
| LayoutError::InvalidSimd { .. }
|
| LayoutError::InvalidSimd { .. }
|
||||||
| LayoutError::NormalizationFailure(..) => Self::UnknownLayout,
|
| LayoutError::NormalizationFailure(..) => Self::UnknownLayout,
|
||||||
LayoutError::SizeOverflow(..) => Self::SizeOverflow,
|
LayoutError::SizeOverflow(..) => Self::SizeOverflow,
|
||||||
LayoutError::Cycle(err) => Self::TypeError(*err),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -60,11 +60,6 @@
|
|||||||
<strong>Note:</strong> Encountered an error during type layout; {#+ #}
|
<strong>Note:</strong> Encountered an error during type layout; {#+ #}
|
||||||
the type failed to be normalized. {# #}
|
the type failed to be normalized. {# #}
|
||||||
</p>
|
</p>
|
||||||
{% when Err(LayoutError::Cycle(_)) %}
|
|
||||||
<p> {# #}
|
|
||||||
<strong>Note:</strong> Encountered an error during type layout; {#+ #}
|
|
||||||
the type's layout depended on the type's layout itself. {# #}
|
|
||||||
</p>
|
|
||||||
{% when Err(LayoutError::InvalidSimd {..}) %}
|
{% when Err(LayoutError::InvalidSimd {..}) %}
|
||||||
<p> {# #}
|
<p> {# #}
|
||||||
<strong>Note:</strong> Encountered an error during type layout; {#+ #}
|
<strong>Note:</strong> Encountered an error during type layout; {#+ #}
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
//@ build-fail
|
//@ build-fail
|
||||||
//~^ ERROR: cycle detected when computing layout of
|
//~^ ERROR: cycle detected when computing layout of
|
||||||
//~? ERROR: a cycle occurred during layout computation
|
|
||||||
|
|
||||||
// Issue #111176 -- ensure that we do not emit ICE on layout cycles
|
// Issue #111176 -- ensure that we do not emit ICE on layout cycles
|
||||||
|
|
||||||
|
|||||||
@@ -6,18 +6,6 @@ note: cycle used when const-evaluating + checking `core::mem::SizedTypePropertie
|
|||||||
--> $SRC_DIR/core/src/mem/mod.rs:LL:COL
|
--> $SRC_DIR/core/src/mem/mod.rs:LL:COL
|
||||||
= note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information
|
= note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information
|
||||||
|
|
||||||
error[E0080]: a cycle occurred during layout computation
|
error: aborting due to 1 previous error
|
||||||
--> $SRC_DIR/core/src/mem/mod.rs:LL:COL
|
|
||||||
|
|
|
||||||
= note: evaluation of `<S<S<()>> as std::mem::SizedTypeProperties>::SIZE` failed here
|
|
||||||
|
|
||||||
note: the above error was encountered while instantiating `fn std::mem::size_of::<S<S<()>>>`
|
For more information about this error, try `rustc --explain E0391`.
|
||||||
--> $DIR/layout-cycle.rs:26:5
|
|
||||||
|
|
|
||||||
LL | mem::size_of::<S<T>>()
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
|
||||||
|
|
||||||
Some errors have detailed explanations: E0080, E0391.
|
|
||||||
For more information about an error, try `rustc --explain E0080`.
|
|
||||||
|
|||||||
@@ -5,12 +5,6 @@ error[E0391]: cycle detected when computing layout of `Wrapper<()>`
|
|||||||
= note: cycle used when computing layout of `core::option::Option<Wrapper<()>>`
|
= note: cycle used when computing layout of `core::option::Option<Wrapper<()>>`
|
||||||
= note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information
|
= note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information
|
||||||
|
|
||||||
note: the above error was encountered while instantiating `fn abi::<()>`
|
|
||||||
--> $DIR/post-mono-layout-cycle.rs:19:5
|
|
||||||
|
|
|
||||||
LL | abi::<T>(None);
|
|
||||||
| ^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0391`.
|
For more information about this error, try `rustc --explain E0391`.
|
||||||
|
|||||||
@@ -1,21 +0,0 @@
|
|||||||
error[E0391]: cycle detected when computing layout of `Foo`
|
|
||||||
|
|
|
||||||
= note: ...which requires computing layout of `<&'static Foo as core::ops::deref::Deref>::Target`...
|
|
||||||
= note: ...which again requires computing layout of `Foo`, completing the cycle
|
|
||||||
note: cycle used when const-evaluating + checking `_`
|
|
||||||
--> $DIR/stack-overflow-trait-infer-98842.rs:14:1
|
|
||||||
|
|
|
||||||
LL | const _: *const Foo = 0 as _;
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^
|
|
||||||
= note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information
|
|
||||||
|
|
||||||
error[E0080]: a cycle occurred during layout computation
|
|
||||||
--> $DIR/stack-overflow-trait-infer-98842.rs:14:1
|
|
||||||
|
|
|
||||||
LL | const _: *const Foo = 0 as _;
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^ evaluation of `_` failed here
|
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
|
||||||
|
|
||||||
Some errors have detailed explanations: E0080, E0391.
|
|
||||||
For more information about an error, try `rustc --explain E0080`.
|
|
||||||
@@ -2,8 +2,7 @@
|
|||||||
// issue: rust-lang/rust#98842
|
// issue: rust-lang/rust#98842
|
||||||
//@ check-fail
|
//@ check-fail
|
||||||
//@ edition:2021
|
//@ edition:2021
|
||||||
//@ stderr-per-bitwidth
|
//~^^^^ ERROR cycle detected when computing layout of `Foo`
|
||||||
//~^^^^^ ERROR cycle detected when computing layout of `Foo`
|
|
||||||
|
|
||||||
// If the inner `Foo` is named through an associated type,
|
// If the inner `Foo` is named through an associated type,
|
||||||
// the "infinite size" error does not occur.
|
// the "infinite size" error does not occur.
|
||||||
@@ -12,6 +11,5 @@
|
|||||||
// and it will infinitely recurse somewhere trying to figure out the
|
// and it will infinitely recurse somewhere trying to figure out the
|
||||||
// size of this pointer (is my guess):
|
// size of this pointer (is my guess):
|
||||||
const _: *const Foo = 0 as _;
|
const _: *const Foo = 0 as _;
|
||||||
//~^ ERROR a cycle occurred during layout computation
|
|
||||||
|
|
||||||
pub fn main() {}
|
pub fn main() {}
|
||||||
|
|||||||
+3
-10
@@ -3,19 +3,12 @@ error[E0391]: cycle detected when computing layout of `Foo`
|
|||||||
= note: ...which requires computing layout of `<&'static Foo as core::ops::deref::Deref>::Target`...
|
= note: ...which requires computing layout of `<&'static Foo as core::ops::deref::Deref>::Target`...
|
||||||
= note: ...which again requires computing layout of `Foo`, completing the cycle
|
= note: ...which again requires computing layout of `Foo`, completing the cycle
|
||||||
note: cycle used when const-evaluating + checking `_`
|
note: cycle used when const-evaluating + checking `_`
|
||||||
--> $DIR/stack-overflow-trait-infer-98842.rs:14:1
|
--> $DIR/stack-overflow-trait-infer-98842.rs:13:1
|
||||||
|
|
|
|
||||||
LL | const _: *const Foo = 0 as _;
|
LL | const _: *const Foo = 0 as _;
|
||||||
| ^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^
|
||||||
= note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information
|
= note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information
|
||||||
|
|
||||||
error[E0080]: a cycle occurred during layout computation
|
error: aborting due to 1 previous error
|
||||||
--> $DIR/stack-overflow-trait-infer-98842.rs:14:1
|
|
||||||
|
|
|
||||||
LL | const _: *const Foo = 0 as _;
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^ evaluation of `_` failed here
|
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
For more information about this error, try `rustc --explain E0391`.
|
||||||
|
|
||||||
Some errors have detailed explanations: E0080, E0391.
|
|
||||||
For more information about an error, try `rustc --explain E0080`.
|
|
||||||
Reference in New Issue
Block a user