Rollup merge of #114450 - chenyukang:yukang-fix-114435, r=compiler-errors

Fix ICE failed to get layout for ReferencesError

Fixes #114435

r? `@compiler-errors`
This commit is contained in:
Matthias Krüger 2023-08-04 21:31:57 +02:00 committed by GitHub
commit a0fd747e38
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 55 additions and 3 deletions

View file

@ -477,7 +477,7 @@ impl<'tcx> LayoutOfHelpers<'tcx> for RevealAllLayoutCx<'tcx> {
#[inline] #[inline]
fn handle_layout_err(&self, err: LayoutError<'tcx>, span: Span, ty: Ty<'tcx>) -> ! { fn handle_layout_err(&self, err: LayoutError<'tcx>, span: Span, ty: Ty<'tcx>) -> ! {
if let layout::LayoutError::SizeOverflow(_) = err { if let LayoutError::SizeOverflow(_) | LayoutError::ReferencesError(_) = err {
self.0.sess.span_fatal(span, err.to_string()) self.0.sess.span_fatal(span, err.to_string())
} else { } else {
span_bug!(span, "failed to get layout for `{}`: {}", ty, err) span_bug!(span, "failed to get layout for `{}`: {}", ty, err)

View file

@ -476,7 +476,7 @@ impl<'gcc, 'tcx> LayoutOfHelpers<'tcx> for CodegenCx<'gcc, 'tcx> {
#[inline] #[inline]
fn handle_layout_err(&self, err: LayoutError<'tcx>, span: Span, ty: Ty<'tcx>) -> ! { fn handle_layout_err(&self, err: LayoutError<'tcx>, span: Span, ty: Ty<'tcx>) -> ! {
if let LayoutError::SizeOverflow(_) = err { if let LayoutError::SizeOverflow(_) | LayoutError::ReferencesError(_) = err {
self.sess().emit_fatal(respan(span, err.into_diagnostic())) self.sess().emit_fatal(respan(span, err.into_diagnostic()))
} else { } else {
span_bug!(span, "failed to get layout for `{}`: {}", ty, err) span_bug!(span, "failed to get layout for `{}`: {}", ty, err)

View file

@ -985,7 +985,7 @@ impl<'tcx> LayoutOfHelpers<'tcx> for CodegenCx<'_, 'tcx> {
#[inline] #[inline]
fn handle_layout_err(&self, err: LayoutError<'tcx>, span: Span, ty: Ty<'tcx>) -> ! { fn handle_layout_err(&self, err: LayoutError<'tcx>, span: Span, ty: Ty<'tcx>) -> ! {
if let LayoutError::SizeOverflow(_) = err { if let LayoutError::SizeOverflow(_) | LayoutError::ReferencesError(_) = err {
self.sess().emit_fatal(Spanned { span, node: err.into_diagnostic() }) self.sess().emit_fatal(Spanned { span, node: err.into_diagnostic() })
} else { } else {
span_bug!(span, "failed to get layout for `{ty}`: {err:?}") span_bug!(span, "failed to get layout for `{ty}`: {err:?}")

View file

@ -0,0 +1,44 @@
// build-fail
// compile-flags: --crate-type lib -Cdebuginfo=2
// error-pattern: the type has an unknown layout
#![recursion_limit = "10"]
macro_rules! link {
($outer:ident, $inner:ident) => {
struct $outer($inner);
impl $outer {
fn new() -> $outer {
$outer($inner::new())
}
}
impl std::ops::Deref for $outer {
type Target = $inner;
fn deref(&self) -> &$inner {
&self.0
}
}
};
}
struct Bottom;
impl Bottom {
fn new() -> Bottom {
Bottom
}
}
link!(A, B);
link!(B, C);
link!(C, D);
link!(D, E);
link!(E, F);
link!(F, G);
link!(G, H);
link!(H, I);
link!(I, J);
link!(J, K);
link!(K, Bottom);
fn main() { }

View file

@ -0,0 +1,8 @@
error: reached the recursion limit finding the struct tail for `Bottom`
|
= help: consider increasing the recursion limit by adding a `#![recursion_limit = "20"]`
error: the type has an unknown layout
error: aborting due to 2 previous errors