overflow errors: change source to a concrete enum

This commit is contained in:
lcnr 2024-01-15 15:06:25 +01:00
parent f392a870e9
commit f7cdff825c
15 changed files with 126 additions and 91 deletions

View File

@ -1,4 +1,4 @@
use crate::traits::error_reporting::TypeErrCtxtExt; use crate::traits::error_reporting::{OverflowCause, TypeErrCtxtExt};
use crate::traits::query::evaluate_obligation::InferCtxtExt; use crate::traits::query::evaluate_obligation::InferCtxtExt;
use crate::traits::{BoundVarReplacer, PlaceholderReplacer}; use crate::traits::{BoundVarReplacer, PlaceholderReplacer};
use rustc_data_structures::stack::ensure_sufficient_stack; use rustc_data_structures::stack::ensure_sufficient_stack;
@ -60,8 +60,12 @@ impl<'tcx> NormalizationFolder<'_, 'tcx> {
let tcx = infcx.tcx; let tcx = infcx.tcx;
let recursion_limit = tcx.recursion_limit(); let recursion_limit = tcx.recursion_limit();
if !recursion_limit.value_within_limit(self.depth) { if !recursion_limit.value_within_limit(self.depth) {
let ty::Alias(_, data) = *alias_ty.kind() else {
unreachable!();
};
self.at.infcx.err_ctxt().report_overflow_error( self.at.infcx.err_ctxt().report_overflow_error(
&alias_ty, OverflowCause::DeeplyNormalize(data),
self.at.cause.span, self.at.cause.span,
true, true,
|_| {}, |_| {},
@ -109,7 +113,7 @@ impl<'tcx> NormalizationFolder<'_, 'tcx> {
let recursion_limit = tcx.recursion_limit(); let recursion_limit = tcx.recursion_limit();
if !recursion_limit.value_within_limit(self.depth) { if !recursion_limit.value_within_limit(self.depth) {
self.at.infcx.err_ctxt().report_overflow_error( self.at.infcx.err_ctxt().report_overflow_error(
&ty::Const::new_unevaluated(tcx, uv, ty), OverflowCause::DeeplyNormalize(ty::AliasTy::new(tcx, uv.def, uv.args)),
self.at.cause.span, self.at.cause.span,
true, true,
|_| {}, |_| {},

View File

@ -57,6 +57,11 @@ use super::{
pub use rustc_infer::traits::error_reporting::*; pub use rustc_infer::traits::error_reporting::*;
pub enum OverflowCause<'tcx> {
DeeplyNormalize(ty::AliasTy<'tcx>),
TraitSolver(ty::Predicate<'tcx>),
}
#[extension(pub trait TypeErrCtxtExt<'tcx>)] #[extension(pub trait TypeErrCtxtExt<'tcx>)]
impl<'tcx> TypeErrCtxt<'_, 'tcx> { impl<'tcx> TypeErrCtxt<'_, 'tcx> {
fn report_fulfillment_errors( fn report_fulfillment_errors(
@ -184,49 +189,65 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
/// whose result could not be truly determined and thus we can't say /// whose result could not be truly determined and thus we can't say
/// if the program type checks or not -- and they are unusual /// if the program type checks or not -- and they are unusual
/// occurrences in any case. /// occurrences in any case.
fn report_overflow_error<T>( fn report_overflow_error(
&self, &self,
predicate: &T, cause: OverflowCause<'tcx>,
span: Span, span: Span,
suggest_increasing_limit: bool, suggest_increasing_limit: bool,
mutate: impl FnOnce(&mut DiagnosticBuilder<'_>), mutate: impl FnOnce(&mut DiagnosticBuilder<'_>),
) -> ! ) -> ! {
where let mut err = self.build_overflow_error(cause, span, suggest_increasing_limit);
T: fmt::Display + TypeFoldable<TyCtxt<'tcx>> + Print<'tcx, FmtPrinter<'tcx, 'tcx>>,
{
let mut err = self.build_overflow_error(predicate, span, suggest_increasing_limit);
mutate(&mut err); mutate(&mut err);
err.emit(); err.emit();
FatalError.raise(); FatalError.raise();
} }
fn build_overflow_error<T>( fn build_overflow_error(
&self, &self,
predicate: &T, cause: OverflowCause<'tcx>,
span: Span, span: Span,
suggest_increasing_limit: bool, suggest_increasing_limit: bool,
) -> DiagnosticBuilder<'tcx> ) -> DiagnosticBuilder<'tcx> {
where fn with_short_path<'tcx, T>(tcx: TyCtxt<'tcx>, value: T) -> String
T: fmt::Display + TypeFoldable<TyCtxt<'tcx>> + Print<'tcx, FmtPrinter<'tcx, 'tcx>>, where
{ T: fmt::Display + Print<'tcx, FmtPrinter<'tcx, 'tcx>>,
let predicate = self.resolve_vars_if_possible(predicate.clone()); {
let mut pred_str = predicate.to_string(); let s = value.to_string();
if s.len() > 50 {
if pred_str.len() > 50 { // We don't need to save the type to a file, we will be talking about this type already
// We don't need to save the type to a file, we will be talking about this type already // in a separate note when we explain the obligation, so it will be available that way.
// in a separate note when we explain the obligation, so it will be available that way. let mut cx: FmtPrinter<'_, '_> =
let mut cx: FmtPrinter<'_, '_> = FmtPrinter::new_with_limit(tcx, Namespace::TypeNS, rustc_session::Limit(6));
FmtPrinter::new_with_limit(self.tcx, Namespace::TypeNS, rustc_session::Limit(6)); value.print(&mut cx).unwrap();
predicate.print(&mut cx).unwrap(); cx.into_buffer()
pred_str = cx.into_buffer(); } else {
s
}
} }
let mut err = struct_span_code_err!(
self.dcx(), let mut err = match cause {
span, OverflowCause::DeeplyNormalize(alias_ty) => {
E0275, let alias_ty = self.resolve_vars_if_possible(alias_ty);
"overflow evaluating the requirement `{}`", let kind = alias_ty.opt_kind(self.tcx).map_or("alias", |k| k.descr());
pred_str, let alias_str = with_short_path(self.tcx, alias_ty);
); struct_span_code_err!(
self.dcx(),
span,
E0275,
"overflow normalizing the {kind} `{alias_str}`",
)
}
OverflowCause::TraitSolver(predicate) => {
let predicate = self.resolve_vars_if_possible(predicate);
let pred_str = with_short_path(self.tcx, predicate);
struct_span_code_err!(
self.dcx(),
span,
E0275,
"overflow evaluating the requirement `{pred_str}`",
)
}
};
if suggest_increasing_limit { if suggest_increasing_limit {
self.suggest_new_overflow_limit(&mut err); self.suggest_new_overflow_limit(&mut err);
@ -252,7 +273,7 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
let predicate = obligation.predicate.clone().to_predicate(self.tcx); let predicate = obligation.predicate.clone().to_predicate(self.tcx);
let predicate = self.resolve_vars_if_possible(predicate); let predicate = self.resolve_vars_if_possible(predicate);
self.report_overflow_error( self.report_overflow_error(
&predicate, OverflowCause::TraitSolver(predicate),
obligation.cause.span, obligation.cause.span,
suggest_increasing_limit, suggest_increasing_limit,
|err| { |err| {
@ -303,7 +324,11 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
fn report_overflow_no_abort(&self, obligation: PredicateObligation<'tcx>) -> ErrorGuaranteed { fn report_overflow_no_abort(&self, obligation: PredicateObligation<'tcx>) -> ErrorGuaranteed {
let obligation = self.resolve_vars_if_possible(obligation); let obligation = self.resolve_vars_if_possible(obligation);
let mut err = self.build_overflow_error(&obligation.predicate, obligation.cause.span, true); let mut err = self.build_overflow_error(
OverflowCause::TraitSolver(obligation.predicate),
obligation.cause.span,
true,
);
self.note_obligation_cause(&mut err, &obligation); self.note_obligation_cause(&mut err, &obligation);
self.point_at_returns_when_relevant(&mut err, &obligation); self.point_at_returns_when_relevant(&mut err, &obligation);
err.emit() err.emit()

View File

@ -450,12 +450,7 @@ impl<'a, 'tcx> ObligationProcessor for FulfillProcessor<'a, 'tcx> {
.recursion_limit() .recursion_limit()
.value_within_limit(obligation.recursion_depth) => .value_within_limit(obligation.recursion_depth) =>
{ {
self.selcx.infcx.err_ctxt().report_overflow_error( self.selcx.infcx.err_ctxt().report_overflow_obligation(&obligation, false);
&obligation.predicate,
obligation.cause.span,
false,
|_| {},
);
} }
ty::PredicateKind::Clause(ty::ClauseKind::WellFormed(arg)) => { ty::PredicateKind::Clause(ty::ClauseKind::WellFormed(arg)) => {

View File

@ -1,4 +1,8 @@
//! Deeply normalize types using the old trait solver. //! Deeply normalize types using the old trait solver.
use super::error_reporting::OverflowCause;
use super::error_reporting::TypeErrCtxtExt;
use super::SelectionContext;
use super::{project, with_replaced_escaping_bound_vars, BoundVarReplacer, PlaceholderReplacer};
use rustc_data_structures::stack::ensure_sufficient_stack; use rustc_data_structures::stack::ensure_sufficient_stack;
use rustc_infer::infer::at::At; use rustc_infer::infer::at::At;
use rustc_infer::infer::InferOk; use rustc_infer::infer::InferOk;
@ -8,10 +12,6 @@ use rustc_middle::traits::{ObligationCause, ObligationCauseCode, Reveal};
use rustc_middle::ty::{self, Ty, TyCtxt, TypeFolder}; use rustc_middle::ty::{self, Ty, TyCtxt, TypeFolder};
use rustc_middle::ty::{TypeFoldable, TypeSuperFoldable, TypeVisitable, TypeVisitableExt}; use rustc_middle::ty::{TypeFoldable, TypeSuperFoldable, TypeVisitable, TypeVisitableExt};
use super::error_reporting::TypeErrCtxtExt;
use super::SelectionContext;
use super::{project, with_replaced_escaping_bound_vars, BoundVarReplacer, PlaceholderReplacer};
#[extension(pub trait NormalizeExt<'tcx>)] #[extension(pub trait NormalizeExt<'tcx>)]
impl<'tcx> At<'_, 'tcx> { impl<'tcx> At<'_, 'tcx> {
/// Normalize a value using the `AssocTypeNormalizer`. /// Normalize a value using the `AssocTypeNormalizer`.
@ -173,7 +173,7 @@ impl<'a, 'b, 'tcx> TypeFolder<TyCtxt<'tcx>> for AssocTypeNormalizer<'a, 'b, 'tcx
} }
let (kind, data) = match *ty.kind() { let (kind, data) = match *ty.kind() {
ty::Alias(kind, alias_ty) => (kind, alias_ty), ty::Alias(kind, data) => (kind, data),
_ => return ty.super_fold_with(self), _ => return ty.super_fold_with(self),
}; };
@ -210,7 +210,7 @@ impl<'a, 'b, 'tcx> TypeFolder<TyCtxt<'tcx>> for AssocTypeNormalizer<'a, 'b, 'tcx
let recursion_limit = self.interner().recursion_limit(); let recursion_limit = self.interner().recursion_limit();
if !recursion_limit.value_within_limit(self.depth) { if !recursion_limit.value_within_limit(self.depth) {
self.selcx.infcx.err_ctxt().report_overflow_error( self.selcx.infcx.err_ctxt().report_overflow_error(
&ty, OverflowCause::DeeplyNormalize(data),
self.cause.span, self.cause.span,
true, true,
|_| {}, |_| {},
@ -306,7 +306,7 @@ impl<'a, 'b, 'tcx> TypeFolder<TyCtxt<'tcx>> for AssocTypeNormalizer<'a, 'b, 'tcx
let recursion_limit = self.interner().recursion_limit(); let recursion_limit = self.interner().recursion_limit();
if !recursion_limit.value_within_limit(self.depth) { if !recursion_limit.value_within_limit(self.depth) {
self.selcx.infcx.err_ctxt().report_overflow_error( self.selcx.infcx.err_ctxt().report_overflow_error(
&ty, OverflowCause::DeeplyNormalize(data),
self.cause.span, self.cause.span,
false, false,
|diag| { |diag| {

View File

@ -5,6 +5,7 @@
use crate::infer::at::At; use crate::infer::at::At;
use crate::infer::canonical::OriginalQueryValues; use crate::infer::canonical::OriginalQueryValues;
use crate::infer::{InferCtxt, InferOk}; use crate::infer::{InferCtxt, InferOk};
use crate::traits::error_reporting::OverflowCause;
use crate::traits::error_reporting::TypeErrCtxtExt; use crate::traits::error_reporting::TypeErrCtxtExt;
use crate::traits::normalize::needs_normalization; use crate::traits::normalize::needs_normalization;
use crate::traits::{BoundVarReplacer, PlaceholderReplacer}; use crate::traits::{BoundVarReplacer, PlaceholderReplacer};
@ -228,7 +229,11 @@ impl<'cx, 'tcx> FallibleTypeFolder<TyCtxt<'tcx>> for QueryNormalizer<'cx, 'tcx>
let guar = self let guar = self
.infcx .infcx
.err_ctxt() .err_ctxt()
.build_overflow_error(&ty, self.cause.span, true) .build_overflow_error(
OverflowCause::DeeplyNormalize(data),
self.cause.span,
true,
)
.delay_as_bug(); .delay_as_bug();
return Ok(Ty::new_error(self.interner(), guar)); return Ok(Ty::new_error(self.interner(), guar));
} }

View File

@ -105,6 +105,17 @@ pub enum AliasKind {
Weak, Weak,
} }
impl AliasKind {
pub fn descr(self) -> &'static str {
match self {
AliasKind::Projection => "associated type",
AliasKind::Inherent => "inherent associated type",
AliasKind::Opaque => "opaque type",
AliasKind::Weak => "type alias",
}
}
}
/// Defines the kinds of types used by the type system. /// Defines the kinds of types used by the type system.
/// ///
/// Types written by the user start out as `hir::TyKind` and get /// Types written by the user start out as `hir::TyKind` and get

View File

@ -4,7 +4,6 @@ fn _alias_check() {
WrongImpl::foo(0i32); WrongImpl::foo(0i32);
//~^ ERROR the trait bound `RawImpl<_>: Raw<_>` is not satisfied //~^ ERROR the trait bound `RawImpl<_>: Raw<_>` is not satisfied
//~| ERROR the trait bound `RawImpl<_>: Raw<_>` is not satisfied //~| ERROR the trait bound `RawImpl<_>: Raw<_>` is not satisfied
//~| ERROR the trait bound `RawImpl<_>: Raw<_>` is not satisfied
WrongImpl::<()>::foo(0i32); WrongImpl::<()>::foo(0i32);
//~^ ERROR the trait bound `RawImpl<()>: Raw<()>` is not satisfied //~^ ERROR the trait bound `RawImpl<()>: Raw<()>` is not satisfied
//~| ERROR trait bounds were not satisfied //~| ERROR trait bounds were not satisfied

View File

@ -2,11 +2,11 @@ error[E0277]: the trait bound `RawImpl<_>: Raw<_>` is not satisfied
--> $DIR/issue-62742.rs:4:5 --> $DIR/issue-62742.rs:4:5
| |
LL | WrongImpl::foo(0i32); LL | WrongImpl::foo(0i32);
| ^^^^^^^^^^^^^^ the trait `Raw<_>` is not implemented for `RawImpl<_>` | ^^^^^^^^^^^^^^^^^^^^ the trait `Raw<_>` is not implemented for `RawImpl<_>`
| |
= help: the trait `Raw<[_]>` is implemented for `RawImpl<_>` = help: the trait `Raw<[_]>` is implemented for `RawImpl<_>`
note: required by a bound in `SafeImpl::<T, A>::foo` note: required by a bound in `SafeImpl::<T, A>::foo`
--> $DIR/issue-62742.rs:30:20 --> $DIR/issue-62742.rs:29:20
| |
LL | impl<T: ?Sized, A: Raw<T>> SafeImpl<T, A> { LL | impl<T: ?Sized, A: Raw<T>> SafeImpl<T, A> {
| ^^^^^^ required by this bound in `SafeImpl::<T, A>::foo` | ^^^^^^ required by this bound in `SafeImpl::<T, A>::foo`
@ -21,21 +21,13 @@ LL | WrongImpl::foo(0i32);
| |
= help: the trait `Raw<[_]>` is implemented for `RawImpl<_>` = help: the trait `Raw<[_]>` is implemented for `RawImpl<_>`
note: required by a bound in `SafeImpl` note: required by a bound in `SafeImpl`
--> $DIR/issue-62742.rs:28:35 --> $DIR/issue-62742.rs:27:35
| |
LL | pub struct SafeImpl<T: ?Sized, A: Raw<T>>(PhantomData<(A, T)>); LL | pub struct SafeImpl<T: ?Sized, A: Raw<T>>(PhantomData<(A, T)>);
| ^^^^^^ required by this bound in `SafeImpl` | ^^^^^^ required by this bound in `SafeImpl`
error[E0277]: the trait bound `RawImpl<_>: Raw<_>` is not satisfied
--> $DIR/issue-62742.rs:4:5
|
LL | WrongImpl::foo(0i32);
| ^^^^^^^^^^^^^^^^^^^^ the trait `Raw<_>` is not implemented for `RawImpl<_>`
|
= help: the trait `Raw<[_]>` is implemented for `RawImpl<_>`
error[E0599]: the function or associated item `foo` exists for struct `SafeImpl<(), RawImpl<()>>`, but its trait bounds were not satisfied error[E0599]: the function or associated item `foo` exists for struct `SafeImpl<(), RawImpl<()>>`, but its trait bounds were not satisfied
--> $DIR/issue-62742.rs:8:22 --> $DIR/issue-62742.rs:7:22
| |
LL | WrongImpl::<()>::foo(0i32); LL | WrongImpl::<()>::foo(0i32);
| ^^^ function or associated item cannot be called on `SafeImpl<(), RawImpl<()>>` due to unsatisfied trait bounds | ^^^ function or associated item cannot be called on `SafeImpl<(), RawImpl<()>>` due to unsatisfied trait bounds
@ -47,20 +39,20 @@ LL | pub struct SafeImpl<T: ?Sized, A: Raw<T>>(PhantomData<(A, T)>);
| ----------------------------------------- function or associated item `foo` not found for this struct | ----------------------------------------- function or associated item `foo` not found for this struct
| |
note: trait bound `RawImpl<()>: Raw<()>` was not satisfied note: trait bound `RawImpl<()>: Raw<()>` was not satisfied
--> $DIR/issue-62742.rs:30:20 --> $DIR/issue-62742.rs:29:20
| |
LL | impl<T: ?Sized, A: Raw<T>> SafeImpl<T, A> { LL | impl<T: ?Sized, A: Raw<T>> SafeImpl<T, A> {
| ^^^^^^ -------------- | ^^^^^^ --------------
| | | |
| unsatisfied trait bound introduced here | unsatisfied trait bound introduced here
note: the trait `Raw` must be implemented note: the trait `Raw` must be implemented
--> $DIR/issue-62742.rs:14:1 --> $DIR/issue-62742.rs:13:1
| |
LL | pub trait Raw<T: ?Sized> { LL | pub trait Raw<T: ?Sized> {
| ^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^
error[E0277]: the trait bound `RawImpl<()>: Raw<()>` is not satisfied error[E0277]: the trait bound `RawImpl<()>: Raw<()>` is not satisfied
--> $DIR/issue-62742.rs:8:5 --> $DIR/issue-62742.rs:7:5
| |
LL | WrongImpl::<()>::foo(0i32); LL | WrongImpl::<()>::foo(0i32);
| ^^^^^^^^^^^^^^^ the trait `Raw<()>` is not implemented for `RawImpl<()>` | ^^^^^^^^^^^^^^^ the trait `Raw<()>` is not implemented for `RawImpl<()>`
@ -68,12 +60,12 @@ LL | WrongImpl::<()>::foo(0i32);
= help: the trait `Raw<[()]>` is implemented for `RawImpl<()>` = help: the trait `Raw<[()]>` is implemented for `RawImpl<()>`
= help: for that trait implementation, expected `[()]`, found `()` = help: for that trait implementation, expected `[()]`, found `()`
note: required by a bound in `SafeImpl` note: required by a bound in `SafeImpl`
--> $DIR/issue-62742.rs:28:35 --> $DIR/issue-62742.rs:27:35
| |
LL | pub struct SafeImpl<T: ?Sized, A: Raw<T>>(PhantomData<(A, T)>); LL | pub struct SafeImpl<T: ?Sized, A: Raw<T>>(PhantomData<(A, T)>);
| ^^^^^^ required by this bound in `SafeImpl` | ^^^^^^ required by this bound in `SafeImpl`
error: aborting due to 5 previous errors error: aborting due to 4 previous errors
Some errors have detailed explanations: E0277, E0599. Some errors have detailed explanations: E0277, E0599.
For more information about an error, try `rustc --explain E0277`. For more information about an error, try `rustc --explain E0277`.

View File

@ -1,4 +1,4 @@
error[E0275]: overflow evaluating the requirement `X2` error[E0275]: overflow normalizing the type alias `X2`
--> $DIR/infinite-type-alias-mutual-recursion.rs:6:11 --> $DIR/infinite-type-alias-mutual-recursion.rs:6:11
| |
LL | type X1 = X2; LL | type X1 = X2;
@ -6,7 +6,7 @@ LL | type X1 = X2;
| |
= note: in case this is a recursive type alias, consider using a struct, enum, or union instead = note: in case this is a recursive type alias, consider using a struct, enum, or union instead
error[E0275]: overflow evaluating the requirement `X3` error[E0275]: overflow normalizing the type alias `X3`
--> $DIR/infinite-type-alias-mutual-recursion.rs:9:11 --> $DIR/infinite-type-alias-mutual-recursion.rs:9:11
| |
LL | type X2 = X3; LL | type X2 = X3;
@ -14,7 +14,7 @@ LL | type X2 = X3;
| |
= note: in case this is a recursive type alias, consider using a struct, enum, or union instead = note: in case this is a recursive type alias, consider using a struct, enum, or union instead
error[E0275]: overflow evaluating the requirement `X1` error[E0275]: overflow normalizing the type alias `X1`
--> $DIR/infinite-type-alias-mutual-recursion.rs:11:11 --> $DIR/infinite-type-alias-mutual-recursion.rs:11:11
| |
LL | type X3 = X1; LL | type X3 = X1;

View File

@ -5,10 +5,10 @@
type X1 = X2; type X1 = X2;
//[gated]~^ ERROR cycle detected when expanding type alias `X1` //[gated]~^ ERROR cycle detected when expanding type alias `X1`
//[feature]~^^ ERROR: overflow evaluating the requirement `X2` //[feature]~^^ ERROR: overflow normalizing the type alias `X2`
type X2 = X3; type X2 = X3;
//[feature]~^ ERROR: overflow evaluating the requirement `X3` //[feature]~^ ERROR: overflow normalizing the type alias `X3`
type X3 = X1; type X3 = X1;
//[feature]~^ ERROR: overflow evaluating the requirement `X1` //[feature]~^ ERROR: overflow normalizing the type alias `X1`
fn main() {} fn main() {}

View File

@ -1,4 +1,4 @@
error[E0275]: overflow evaluating the requirement `X` error[E0275]: overflow normalizing the type alias `X`
--> $DIR/infinite-vec-type-recursion.rs:6:10 --> $DIR/infinite-vec-type-recursion.rs:6:10
| |
LL | type X = Vec<X>; LL | type X = Vec<X>;

View File

@ -5,7 +5,7 @@
type X = Vec<X>; type X = Vec<X>;
//[gated]~^ ERROR cycle detected //[gated]~^ ERROR cycle detected
//[feature]~^^ ERROR: overflow evaluating the requirement `X` //[feature]~^^ ERROR: overflow normalizing the type alias `X`
#[rustfmt::skip] #[rustfmt::skip]
fn main() { let b: X = Vec::new(); } fn main() { let b: X = Vec::new(); }

View File

@ -1,4 +1,4 @@
error[E0275]: overflow evaluating the requirement `Loop` error[E0275]: overflow normalizing the type alias `Loop`
--> $DIR/inherent-impls-overflow.rs:7:13 --> $DIR/inherent-impls-overflow.rs:7:13
| |
LL | type Loop = Loop; LL | type Loop = Loop;
@ -6,7 +6,7 @@ LL | type Loop = Loop;
| |
= note: in case this is a recursive type alias, consider using a struct, enum, or union instead = note: in case this is a recursive type alias, consider using a struct, enum, or union instead
error[E0275]: overflow evaluating the requirement `Loop` error[E0275]: overflow normalizing the type alias `Loop`
--> $DIR/inherent-impls-overflow.rs:9:1 --> $DIR/inherent-impls-overflow.rs:9:1
| |
LL | impl Loop {} LL | impl Loop {}
@ -14,24 +14,24 @@ LL | impl Loop {}
| |
= note: in case this is a recursive type alias, consider using a struct, enum, or union instead = note: in case this is a recursive type alias, consider using a struct, enum, or union instead
error[E0275]: overflow evaluating the requirement `Poly0<((((((...,),),),),),)>` error[E0275]: overflow normalizing the type alias `Poly0<(((((((...,),),),),),),)>`
--> $DIR/inherent-impls-overflow.rs:11:17 --> $DIR/inherent-impls-overflow.rs:13:17
| |
LL | type Poly0<T> = Poly1<(T,)>; LL | type Poly0<T> = Poly1<(T,)>;
| ^^^^^^^^^^^ | ^^^^^^^^^^^
| |
= note: in case this is a recursive type alias, consider using a struct, enum, or union instead = note: in case this is a recursive type alias, consider using a struct, enum, or union instead
error[E0275]: overflow evaluating the requirement `Poly1<((((((...,),),),),),)>` error[E0275]: overflow normalizing the type alias `Poly1<(((((((...,),),),),),),)>`
--> $DIR/inherent-impls-overflow.rs:14:17 --> $DIR/inherent-impls-overflow.rs:16:17
| |
LL | type Poly1<T> = Poly0<(T,)>; LL | type Poly1<T> = Poly0<(T,)>;
| ^^^^^^^^^^^ | ^^^^^^^^^^^
| |
= note: in case this is a recursive type alias, consider using a struct, enum, or union instead = note: in case this is a recursive type alias, consider using a struct, enum, or union instead
error[E0275]: overflow evaluating the requirement `Poly1<((((((...,),),),),),)>` error[E0275]: overflow normalizing the type alias `Poly1<(((((((...,),),),),),),)>`
--> $DIR/inherent-impls-overflow.rs:18:1 --> $DIR/inherent-impls-overflow.rs:20:1
| |
LL | impl Poly0<()> {} LL | impl Poly0<()> {}
| ^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^

View File

@ -7,7 +7,7 @@ LL | impl Loop {}
= help: consider increasing the recursion limit by adding a `#![recursion_limit = "256"]` attribute to your crate (`inherent_impls_overflow`) = help: consider increasing the recursion limit by adding a `#![recursion_limit = "256"]` attribute to your crate (`inherent_impls_overflow`)
error[E0392]: type parameter `T` is never used error[E0392]: type parameter `T` is never used
--> $DIR/inherent-impls-overflow.rs:11:12 --> $DIR/inherent-impls-overflow.rs:13:12
| |
LL | type Poly0<T> = Poly1<(T,)>; LL | type Poly0<T> = Poly1<(T,)>;
| ^ unused type parameter | ^ unused type parameter
@ -16,7 +16,7 @@ LL | type Poly0<T> = Poly1<(T,)>;
= help: if you intended `T` to be a const parameter, use `const T: /* Type */` instead = help: if you intended `T` to be a const parameter, use `const T: /* Type */` instead
error[E0392]: type parameter `T` is never used error[E0392]: type parameter `T` is never used
--> $DIR/inherent-impls-overflow.rs:14:12 --> $DIR/inherent-impls-overflow.rs:16:12
| |
LL | type Poly1<T> = Poly0<(T,)>; LL | type Poly1<T> = Poly0<(T,)>;
| ^ unused type parameter | ^ unused type parameter
@ -25,7 +25,7 @@ LL | type Poly1<T> = Poly0<(T,)>;
= help: if you intended `T` to be a const parameter, use `const T: /* Type */` instead = help: if you intended `T` to be a const parameter, use `const T: /* Type */` instead
error[E0275]: overflow evaluating the requirement `Poly0<()> == _` error[E0275]: overflow evaluating the requirement `Poly0<()> == _`
--> $DIR/inherent-impls-overflow.rs:18:6 --> $DIR/inherent-impls-overflow.rs:20:6
| |
LL | impl Poly0<()> {} LL | impl Poly0<()> {}
| ^^^^^^^^^ | ^^^^^^^^^

View File

@ -4,17 +4,21 @@
#![feature(lazy_type_alias)] #![feature(lazy_type_alias)]
#![allow(incomplete_features)] #![allow(incomplete_features)]
type Loop = Loop; //[classic]~ ERROR overflow evaluating the requirement type Loop = Loop; //[classic]~ ERROR overflow normalizing the type alias `Loop`
impl Loop {} //~ ERROR overflow evaluating the requirement impl Loop {}
//[classic]~^ ERROR overflow normalizing the type alias `Loop`
//[next]~^^ ERROR overflow evaluating the requirement `Loop == _`
type Poly0<T> = Poly1<(T,)>; type Poly0<T> = Poly1<(T,)>;
//[classic]~^ ERROR overflow evaluating the requirement //[classic]~^ ERROR overflow normalizing the type alias `Poly0<(((((((...,),),),),),),)>`
//[next]~^^ ERROR type parameter `T` is never used //[next]~^^ ERROR type parameter `T` is never used
type Poly1<T> = Poly0<(T,)>; type Poly1<T> = Poly0<(T,)>;
//[classic]~^ ERROR overflow evaluating the requirement //[classic]~^ ERROR overflow normalizing the type alias `Poly1<(((((((...,),),),),),),)>`
//[next]~^^ ERROR type parameter `T` is never used //[next]~^^ ERROR type parameter `T` is never used
impl Poly0<()> {} //~ ERROR overflow evaluating the requirement impl Poly0<()> {}
//[classic]~^ ERROR overflow normalizing the type alias `Poly1<(((((((...,),),),),),),)>`
//[next]~^^ ERROR overflow evaluating the requirement `Poly0<()> == _`
fn main() {} fn main() {}