Rollup merge of #72740 - estebank:recursive-indirection, r=matthewjasper
On recursive ADT, provide indirection structured suggestion
This commit is contained in:
commit
d97e8ca335
|
@ -296,6 +296,29 @@ impl Diagnostic {
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn multipart_suggestions(
|
||||||
|
&mut self,
|
||||||
|
msg: &str,
|
||||||
|
suggestions: Vec<Vec<(Span, String)>>,
|
||||||
|
applicability: Applicability,
|
||||||
|
) -> &mut Self {
|
||||||
|
self.suggestions.push(CodeSuggestion {
|
||||||
|
substitutions: suggestions
|
||||||
|
.into_iter()
|
||||||
|
.map(|suggestion| Substitution {
|
||||||
|
parts: suggestion
|
||||||
|
.into_iter()
|
||||||
|
.map(|(span, snippet)| SubstitutionPart { snippet, span })
|
||||||
|
.collect(),
|
||||||
|
})
|
||||||
|
.collect(),
|
||||||
|
msg: msg.to_owned(),
|
||||||
|
style: SuggestionStyle::ShowCode,
|
||||||
|
applicability,
|
||||||
|
});
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
/// Prints out a message with for a multipart suggestion without showing the suggested code.
|
/// Prints out a message with for a multipart suggestion without showing the suggested code.
|
||||||
///
|
///
|
||||||
/// This is intended to be used for suggestions that are obvious in what the changes need to
|
/// This is intended to be used for suggestions that are obvious in what the changes need to
|
||||||
|
|
|
@ -260,6 +260,19 @@ impl<'a> DiagnosticBuilder<'a> {
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn multipart_suggestions(
|
||||||
|
&mut self,
|
||||||
|
msg: &str,
|
||||||
|
suggestions: Vec<Vec<(Span, String)>>,
|
||||||
|
applicability: Applicability,
|
||||||
|
) -> &mut Self {
|
||||||
|
if !self.0.allow_suggestions {
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
self.0.diagnostic.multipart_suggestions(msg, suggestions, applicability);
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
pub fn tool_only_multipart_suggestion(
|
pub fn tool_only_multipart_suggestion(
|
||||||
&mut self,
|
&mut self,
|
||||||
msg: &str,
|
msg: &str,
|
||||||
|
|
|
@ -878,7 +878,15 @@ impl<'tcx> ty::TyS<'tcx> {
|
||||||
// Find non representable fields with their spans
|
// Find non representable fields with their spans
|
||||||
fold_repr(def.all_fields().map(|field| {
|
fold_repr(def.all_fields().map(|field| {
|
||||||
let ty = field.ty(tcx, substs);
|
let ty = field.ty(tcx, substs);
|
||||||
let span = tcx.hir().span_if_local(field.did).unwrap_or(sp);
|
let span = match field
|
||||||
|
.did
|
||||||
|
.as_local()
|
||||||
|
.map(|id| tcx.hir().as_local_hir_id(id))
|
||||||
|
.and_then(|id| tcx.hir().find(id))
|
||||||
|
{
|
||||||
|
Some(hir::Node::Field(field)) => field.ty.span,
|
||||||
|
_ => sp,
|
||||||
|
};
|
||||||
match is_type_structurally_recursive(
|
match is_type_structurally_recursive(
|
||||||
tcx,
|
tcx,
|
||||||
span,
|
span,
|
||||||
|
|
|
@ -1747,24 +1747,41 @@ impl<'a, 'tcx> InferCtxtPrivExt<'tcx> for InferCtxt<'a, 'tcx> {
|
||||||
pub fn recursive_type_with_infinite_size_error(
|
pub fn recursive_type_with_infinite_size_error(
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
type_def_id: DefId,
|
type_def_id: DefId,
|
||||||
) -> DiagnosticBuilder<'tcx> {
|
spans: Vec<Span>,
|
||||||
|
) {
|
||||||
assert!(type_def_id.is_local());
|
assert!(type_def_id.is_local());
|
||||||
let span = tcx.hir().span_if_local(type_def_id).unwrap();
|
let span = tcx.hir().span_if_local(type_def_id).unwrap();
|
||||||
let span = tcx.sess.source_map().guess_head_span(span);
|
let span = tcx.sess.source_map().guess_head_span(span);
|
||||||
let mut err = struct_span_err!(
|
let path = tcx.def_path_str(type_def_id);
|
||||||
tcx.sess,
|
let mut err =
|
||||||
span,
|
struct_span_err!(tcx.sess, span, E0072, "recursive type `{}` has infinite size", path);
|
||||||
E0072,
|
|
||||||
"recursive type `{}` has infinite size",
|
|
||||||
tcx.def_path_str(type_def_id)
|
|
||||||
);
|
|
||||||
err.span_label(span, "recursive type has infinite size");
|
err.span_label(span, "recursive type has infinite size");
|
||||||
err.help(&format!(
|
for &span in &spans {
|
||||||
"insert indirection (e.g., a `Box`, `Rc`, or `&`) \
|
err.span_label(span, "recursive without indirection");
|
||||||
at some point to make `{}` representable",
|
}
|
||||||
tcx.def_path_str(type_def_id)
|
let msg = format!(
|
||||||
));
|
"insert some indirection (e.g., a `Box`, `Rc`, or `&`) to make `{}` representable",
|
||||||
err
|
path,
|
||||||
|
);
|
||||||
|
if spans.len() <= 4 {
|
||||||
|
err.multipart_suggestion(
|
||||||
|
&msg,
|
||||||
|
spans
|
||||||
|
.iter()
|
||||||
|
.flat_map(|&span| {
|
||||||
|
vec![
|
||||||
|
(span.shrink_to_lo(), "Box<".to_string()),
|
||||||
|
(span.shrink_to_hi(), ">".to_string()),
|
||||||
|
]
|
||||||
|
.into_iter()
|
||||||
|
})
|
||||||
|
.collect(),
|
||||||
|
Applicability::HasPlaceholders,
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
err.help(&msg);
|
||||||
|
}
|
||||||
|
err.emit();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Summarizes information
|
/// Summarizes information
|
||||||
|
|
|
@ -2387,11 +2387,7 @@ fn check_representable(tcx: TyCtxt<'_>, sp: Span, item_def_id: LocalDefId) -> bo
|
||||||
// caught by case 1.
|
// caught by case 1.
|
||||||
match rty.is_representable(tcx, sp) {
|
match rty.is_representable(tcx, sp) {
|
||||||
Representability::SelfRecursive(spans) => {
|
Representability::SelfRecursive(spans) => {
|
||||||
let mut err = recursive_type_with_infinite_size_error(tcx, item_def_id.to_def_id());
|
recursive_type_with_infinite_size_error(tcx, item_def_id.to_def_id(), spans);
|
||||||
for span in spans {
|
|
||||||
err.span_label(span, "recursive without indirection");
|
|
||||||
}
|
|
||||||
err.emit();
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
Representability::Representable | Representability::ContainsRecursive => (),
|
Representability::Representable | Representability::ContainsRecursive => (),
|
||||||
|
|
|
@ -6,7 +6,10 @@ LL | enum MList { Cons(isize, MList), Nil }
|
||||||
| |
|
| |
|
||||||
| recursive type has infinite size
|
| recursive type has infinite size
|
||||||
|
|
|
|
||||||
= help: insert indirection (e.g., a `Box`, `Rc`, or `&`) at some point to make `MList` representable
|
help: insert some indirection (e.g., a `Box`, `Rc`, or `&`) to make `MList` representable
|
||||||
|
|
|
||||||
|
LL | enum MList { Cons(isize, Box<MList>), Nil }
|
||||||
|
| ^^^^ ^
|
||||||
|
|
||||||
error[E0391]: cycle detected when computing drop-check constraints for `MList`
|
error[E0391]: cycle detected when computing drop-check constraints for `MList`
|
||||||
--> $DIR/infinite-tag-type-recursion.rs:1:1
|
--> $DIR/infinite-tag-type-recursion.rs:1:1
|
||||||
|
|
|
@ -2,11 +2,14 @@ error[E0072]: recursive type `Foo` has infinite size
|
||||||
--> $DIR/issue-17431-1.rs:1:1
|
--> $DIR/issue-17431-1.rs:1:1
|
||||||
|
|
|
|
||||||
LL | struct Foo { foo: Option<Option<Foo>> }
|
LL | struct Foo { foo: Option<Option<Foo>> }
|
||||||
| ^^^^^^^^^^ ------------------------ recursive without indirection
|
| ^^^^^^^^^^ ------------------- recursive without indirection
|
||||||
| |
|
| |
|
||||||
| recursive type has infinite size
|
| recursive type has infinite size
|
||||||
|
|
|
|
||||||
= help: insert indirection (e.g., a `Box`, `Rc`, or `&`) at some point to make `Foo` representable
|
help: insert some indirection (e.g., a `Box`, `Rc`, or `&`) to make `Foo` representable
|
||||||
|
|
|
||||||
|
LL | struct Foo { foo: Box<Option<Option<Foo>>> }
|
||||||
|
| ^^^^ ^
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
|
|
@ -2,21 +2,27 @@ error[E0072]: recursive type `Baz` has infinite size
|
||||||
--> $DIR/issue-17431-2.rs:1:1
|
--> $DIR/issue-17431-2.rs:1:1
|
||||||
|
|
|
|
||||||
LL | struct Baz { q: Option<Foo> }
|
LL | struct Baz { q: Option<Foo> }
|
||||||
| ^^^^^^^^^^ -------------- recursive without indirection
|
| ^^^^^^^^^^ ----------- recursive without indirection
|
||||||
| |
|
| |
|
||||||
| recursive type has infinite size
|
| recursive type has infinite size
|
||||||
|
|
|
|
||||||
= help: insert indirection (e.g., a `Box`, `Rc`, or `&`) at some point to make `Baz` representable
|
help: insert some indirection (e.g., a `Box`, `Rc`, or `&`) to make `Baz` representable
|
||||||
|
|
|
||||||
|
LL | struct Baz { q: Box<Option<Foo>> }
|
||||||
|
| ^^^^ ^
|
||||||
|
|
||||||
error[E0072]: recursive type `Foo` has infinite size
|
error[E0072]: recursive type `Foo` has infinite size
|
||||||
--> $DIR/issue-17431-2.rs:4:1
|
--> $DIR/issue-17431-2.rs:4:1
|
||||||
|
|
|
|
||||||
LL | struct Foo { q: Option<Baz> }
|
LL | struct Foo { q: Option<Baz> }
|
||||||
| ^^^^^^^^^^ -------------- recursive without indirection
|
| ^^^^^^^^^^ ----------- recursive without indirection
|
||||||
| |
|
| |
|
||||||
| recursive type has infinite size
|
| recursive type has infinite size
|
||||||
|
|
|
|
||||||
= help: insert indirection (e.g., a `Box`, `Rc`, or `&`) at some point to make `Foo` representable
|
help: insert some indirection (e.g., a `Box`, `Rc`, or `&`) to make `Foo` representable
|
||||||
|
|
|
||||||
|
LL | struct Foo { q: Box<Option<Baz>> }
|
||||||
|
| ^^^^ ^
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
|
|
@ -2,11 +2,14 @@ error[E0072]: recursive type `Foo` has infinite size
|
||||||
--> $DIR/issue-17431-3.rs:3:1
|
--> $DIR/issue-17431-3.rs:3:1
|
||||||
|
|
|
|
||||||
LL | struct Foo { foo: Mutex<Option<Foo>> }
|
LL | struct Foo { foo: Mutex<Option<Foo>> }
|
||||||
| ^^^^^^^^^^ ----------------------- recursive without indirection
|
| ^^^^^^^^^^ ------------------ recursive without indirection
|
||||||
| |
|
| |
|
||||||
| recursive type has infinite size
|
| recursive type has infinite size
|
||||||
|
|
|
|
||||||
= help: insert indirection (e.g., a `Box`, `Rc`, or `&`) at some point to make `Foo` representable
|
help: insert some indirection (e.g., a `Box`, `Rc`, or `&`) to make `Foo` representable
|
||||||
|
|
|
||||||
|
LL | struct Foo { foo: Box<Mutex<Option<Foo>>> }
|
||||||
|
| ^^^^ ^
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
|
|
@ -2,11 +2,14 @@ error[E0072]: recursive type `Foo` has infinite size
|
||||||
--> $DIR/issue-17431-4.rs:3:1
|
--> $DIR/issue-17431-4.rs:3:1
|
||||||
|
|
|
|
||||||
LL | struct Foo<T> { foo: Option<Option<Foo<T>>>, marker: marker::PhantomData<T> }
|
LL | struct Foo<T> { foo: Option<Option<Foo<T>>>, marker: marker::PhantomData<T> }
|
||||||
| ^^^^^^^^^^^^^ --------------------------- recursive without indirection
|
| ^^^^^^^^^^^^^ ---------------------- recursive without indirection
|
||||||
| |
|
| |
|
||||||
| recursive type has infinite size
|
| recursive type has infinite size
|
||||||
|
|
|
|
||||||
= help: insert indirection (e.g., a `Box`, `Rc`, or `&`) at some point to make `Foo` representable
|
help: insert some indirection (e.g., a `Box`, `Rc`, or `&`) to make `Foo` representable
|
||||||
|
|
|
||||||
|
LL | struct Foo<T> { foo: Box<Option<Option<Foo<T>>>>, marker: marker::PhantomData<T> }
|
||||||
|
| ^^^^ ^
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
|
|
@ -2,11 +2,14 @@ error[E0072]: recursive type `Bar` has infinite size
|
||||||
--> $DIR/issue-17431-5.rs:5:1
|
--> $DIR/issue-17431-5.rs:5:1
|
||||||
|
|
|
|
||||||
LL | struct Bar<T> { x: Bar<Foo> , marker: marker::PhantomData<T> }
|
LL | struct Bar<T> { x: Bar<Foo> , marker: marker::PhantomData<T> }
|
||||||
| ^^^^^^^^^^^^^ ----------- recursive without indirection
|
| ^^^^^^^^^^^^^ -------- recursive without indirection
|
||||||
| |
|
| |
|
||||||
| recursive type has infinite size
|
| recursive type has infinite size
|
||||||
|
|
|
|
||||||
= help: insert indirection (e.g., a `Box`, `Rc`, or `&`) at some point to make `Bar` representable
|
help: insert some indirection (e.g., a `Box`, `Rc`, or `&`) to make `Bar` representable
|
||||||
|
|
|
||||||
|
LL | struct Bar<T> { x: Box<Bar<Foo>> , marker: marker::PhantomData<T> }
|
||||||
|
| ^^^^ ^
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,10 @@ LL | enum Foo { X(Mutex<Option<Foo>>) }
|
||||||
| |
|
| |
|
||||||
| recursive type has infinite size
|
| recursive type has infinite size
|
||||||
|
|
|
|
||||||
= help: insert indirection (e.g., a `Box`, `Rc`, or `&`) at some point to make `Foo` representable
|
help: insert some indirection (e.g., a `Box`, `Rc`, or `&`) to make `Foo` representable
|
||||||
|
|
|
||||||
|
LL | enum Foo { X(Box<Mutex<Option<Foo>>>) }
|
||||||
|
| ^^^^ ^
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,10 @@ LL | enum Foo { Voo(Option<Option<Foo>>) }
|
||||||
| |
|
| |
|
||||||
| recursive type has infinite size
|
| recursive type has infinite size
|
||||||
|
|
|
|
||||||
= help: insert indirection (e.g., a `Box`, `Rc`, or `&`) at some point to make `Foo` representable
|
help: insert some indirection (e.g., a `Box`, `Rc`, or `&`) to make `Foo` representable
|
||||||
|
|
|
||||||
|
LL | enum Foo { Voo(Box<Option<Option<Foo>>>) }
|
||||||
|
| ^^^^ ^
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,10 @@ LL | pub struct Pong(SendPacket<Ping>);
|
||||||
| | recursive without indirection
|
| | recursive without indirection
|
||||||
| recursive type has infinite size
|
| recursive type has infinite size
|
||||||
|
|
|
|
||||||
= help: insert indirection (e.g., a `Box`, `Rc`, or `&`) at some point to make `pingpong::Pong` representable
|
help: insert some indirection (e.g., a `Box`, `Rc`, or `&`) to make `pingpong::Pong` representable
|
||||||
|
|
|
||||||
|
LL | pub struct Pong(Box<SendPacket<Ping>>);
|
||||||
|
| ^^^^ ^
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,10 @@ LL | enum Bar {
|
||||||
LL | BarSome(Bar)
|
LL | BarSome(Bar)
|
||||||
| --- recursive without indirection
|
| --- recursive without indirection
|
||||||
|
|
|
|
||||||
= help: insert indirection (e.g., a `Box`, `Rc`, or `&`) at some point to make `Bar` representable
|
help: insert some indirection (e.g., a `Box`, `Rc`, or `&`) to make `Bar` representable
|
||||||
|
|
|
||||||
|
LL | BarSome(Box<Bar>)
|
||||||
|
| ^^^^ ^
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
|
|
@ -2,11 +2,14 @@ error[E0072]: recursive type `Bar` has infinite size
|
||||||
--> $DIR/issue-3008-2.rs:2:1
|
--> $DIR/issue-3008-2.rs:2:1
|
||||||
|
|
|
|
||||||
LL | struct Bar { x: Bar }
|
LL | struct Bar { x: Bar }
|
||||||
| ^^^^^^^^^^ ------ recursive without indirection
|
| ^^^^^^^^^^ --- recursive without indirection
|
||||||
| |
|
| |
|
||||||
| recursive type has infinite size
|
| recursive type has infinite size
|
||||||
|
|
|
|
||||||
= help: insert indirection (e.g., a `Box`, `Rc`, or `&`) at some point to make `Bar` representable
|
help: insert some indirection (e.g., a `Box`, `Rc`, or `&`) to make `Bar` representable
|
||||||
|
|
|
||||||
|
LL | struct Bar { x: Box<Bar> }
|
||||||
|
| ^^^^ ^
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,10 @@ LL | enum E2<T> { V2(E2<E1>, marker::PhantomData<T>), }
|
||||||
| |
|
| |
|
||||||
| recursive type has infinite size
|
| recursive type has infinite size
|
||||||
|
|
|
|
||||||
= help: insert indirection (e.g., a `Box`, `Rc`, or `&`) at some point to make `E2` representable
|
help: insert some indirection (e.g., a `Box`, `Rc`, or `&`) to make `E2` representable
|
||||||
|
|
|
||||||
|
LL | enum E2<T> { V2(Box<E2<E1>>, marker::PhantomData<T>), }
|
||||||
|
| ^^^^ ^
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,10 @@ LL | Plus(Expr, Expr),
|
||||||
| |
|
| |
|
||||||
| recursive without indirection
|
| recursive without indirection
|
||||||
|
|
|
|
||||||
= help: insert indirection (e.g., a `Box`, `Rc`, or `&`) at some point to make `Expr` representable
|
help: insert some indirection (e.g., a `Box`, `Rc`, or `&`) to make `Expr` representable
|
||||||
|
|
|
||||||
|
LL | Plus(Box<Expr>, Box<Expr>),
|
||||||
|
| ^^^^ ^ ^^^^ ^
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
|
|
@ -5,9 +5,12 @@ LL | struct S {
|
||||||
| ^^^^^^^^ recursive type has infinite size
|
| ^^^^^^^^ recursive type has infinite size
|
||||||
LL |
|
LL |
|
||||||
LL | element: Option<S>
|
LL | element: Option<S>
|
||||||
| ------------------ recursive without indirection
|
| --------- recursive without indirection
|
||||||
|
|
|
|
||||||
= help: insert indirection (e.g., a `Box`, `Rc`, or `&`) at some point to make `S` representable
|
help: insert some indirection (e.g., a `Box`, `Rc`, or `&`) to make `S` representable
|
||||||
|
|
|
||||||
|
LL | element: Box<Option<S>>
|
||||||
|
| ^^^^ ^
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,10 @@ LL | Class(ClassTypeSignature),
|
||||||
LL | Array(TypeSignature),
|
LL | Array(TypeSignature),
|
||||||
| ------------- recursive without indirection
|
| ------------- recursive without indirection
|
||||||
|
|
|
|
||||||
= help: insert indirection (e.g., a `Box`, `Rc`, or `&`) at some point to make `ObjectType` representable
|
help: insert some indirection (e.g., a `Box`, `Rc`, or `&`) to make `ObjectType` representable
|
||||||
|
|
|
||||||
|
LL | Array(Box<TypeSignature>),
|
||||||
|
| ^^^^ ^
|
||||||
|
|
||||||
error[E0072]: recursive type `TypeSignature` has infinite size
|
error[E0072]: recursive type `TypeSignature` has infinite size
|
||||||
--> $DIR/issue-57271.rs:19:1
|
--> $DIR/issue-57271.rs:19:1
|
||||||
|
@ -18,7 +21,10 @@ LL | Base(BaseType),
|
||||||
LL | Object(ObjectType),
|
LL | Object(ObjectType),
|
||||||
| ---------- recursive without indirection
|
| ---------- recursive without indirection
|
||||||
|
|
|
|
||||||
= help: insert indirection (e.g., a `Box`, `Rc`, or `&`) at some point to make `TypeSignature` representable
|
help: insert some indirection (e.g., a `Box`, `Rc`, or `&`) to make `TypeSignature` representable
|
||||||
|
|
|
||||||
|
LL | Object(Box<ObjectType>),
|
||||||
|
| ^^^^ ^
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,10 @@ LL | pub enum ElemDerived {
|
||||||
LL | A(ElemDerived)
|
LL | A(ElemDerived)
|
||||||
| ----------- recursive without indirection
|
| ----------- recursive without indirection
|
||||||
|
|
|
|
||||||
= help: insert indirection (e.g., a `Box`, `Rc`, or `&`) at some point to make `ElemDerived` representable
|
help: insert some indirection (e.g., a `Box`, `Rc`, or `&`) to make `ElemDerived` representable
|
||||||
|
|
|
||||||
|
LL | A(Box<ElemDerived>)
|
||||||
|
| ^^^^ ^
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,10 @@ LL | enum List<T> { Cons(T, List<T>), Nil }
|
||||||
| |
|
| |
|
||||||
| recursive type has infinite size
|
| recursive type has infinite size
|
||||||
|
|
|
|
||||||
= help: insert indirection (e.g., a `Box`, `Rc`, or `&`) at some point to make `List` representable
|
help: insert some indirection (e.g., a `Box`, `Rc`, or `&`) to make `List` representable
|
||||||
|
|
|
||||||
|
LL | enum List<T> { Cons(T, Box<List<T>>), Nil }
|
||||||
|
| ^^^^ ^
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
|
|
@ -2,21 +2,27 @@ error[E0072]: recursive type `Baz` has infinite size
|
||||||
--> $DIR/sized-cycle-note.rs:9:1
|
--> $DIR/sized-cycle-note.rs:9:1
|
||||||
|
|
|
|
||||||
LL | struct Baz { q: Option<Foo> }
|
LL | struct Baz { q: Option<Foo> }
|
||||||
| ^^^^^^^^^^ -------------- recursive without indirection
|
| ^^^^^^^^^^ ----------- recursive without indirection
|
||||||
| |
|
| |
|
||||||
| recursive type has infinite size
|
| recursive type has infinite size
|
||||||
|
|
|
|
||||||
= help: insert indirection (e.g., a `Box`, `Rc`, or `&`) at some point to make `Baz` representable
|
help: insert some indirection (e.g., a `Box`, `Rc`, or `&`) to make `Baz` representable
|
||||||
|
|
|
||||||
|
LL | struct Baz { q: Box<Option<Foo>> }
|
||||||
|
| ^^^^ ^
|
||||||
|
|
||||||
error[E0072]: recursive type `Foo` has infinite size
|
error[E0072]: recursive type `Foo` has infinite size
|
||||||
--> $DIR/sized-cycle-note.rs:11:1
|
--> $DIR/sized-cycle-note.rs:11:1
|
||||||
|
|
|
|
||||||
LL | struct Foo { q: Option<Baz> }
|
LL | struct Foo { q: Option<Baz> }
|
||||||
| ^^^^^^^^^^ -------------- recursive without indirection
|
| ^^^^^^^^^^ ----------- recursive without indirection
|
||||||
| |
|
| |
|
||||||
| recursive type has infinite size
|
| recursive type has infinite size
|
||||||
|
|
|
|
||||||
= help: insert indirection (e.g., a `Box`, `Rc`, or `&`) at some point to make `Foo` representable
|
help: insert some indirection (e.g., a `Box`, `Rc`, or `&`) to make `Foo` representable
|
||||||
|
|
|
||||||
|
LL | struct Foo { q: Box<Option<Baz>> }
|
||||||
|
| ^^^^ ^
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
|
|
@ -5,9 +5,12 @@ LL | struct ListNode {
|
||||||
| ^^^^^^^^^^^^^^^ recursive type has infinite size
|
| ^^^^^^^^^^^^^^^ recursive type has infinite size
|
||||||
LL | head: u8,
|
LL | head: u8,
|
||||||
LL | tail: Option<ListNode>,
|
LL | tail: Option<ListNode>,
|
||||||
| ---------------------- recursive without indirection
|
| ---------------- recursive without indirection
|
||||||
|
|
|
|
||||||
= help: insert indirection (e.g., a `Box`, `Rc`, or `&`) at some point to make `ListNode` representable
|
help: insert some indirection (e.g., a `Box`, `Rc`, or `&`) to make `ListNode` representable
|
||||||
|
|
|
||||||
|
LL | tail: Box<Option<ListNode>>,
|
||||||
|
| ^^^^ ^
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
|
|
@ -6,11 +6,14 @@ LL | | ListNode
|
||||||
LL | | {
|
LL | | {
|
||||||
LL | | head: u8,
|
LL | | head: u8,
|
||||||
LL | | tail: Option<ListNode>,
|
LL | | tail: Option<ListNode>,
|
||||||
| | ---------------------- recursive without indirection
|
| | ---------------- recursive without indirection
|
||||||
LL | | }
|
LL | | }
|
||||||
| |_^ recursive type has infinite size
|
| |_^ recursive type has infinite size
|
||||||
|
|
|
|
||||||
= help: insert indirection (e.g., a `Box`, `Rc`, or `&`) at some point to make `ListNode` representable
|
help: insert some indirection (e.g., a `Box`, `Rc`, or `&`) to make `ListNode` representable
|
||||||
|
|
|
||||||
|
LL | tail: Box<Option<ListNode>>,
|
||||||
|
| ^^^^ ^
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
|
|
@ -4,9 +4,12 @@ error[E0072]: recursive type `Foo` has infinite size
|
||||||
LL | struct Foo<'a> {
|
LL | struct Foo<'a> {
|
||||||
| ^^^^^^^^^^^^^^ recursive type has infinite size
|
| ^^^^^^^^^^^^^^ recursive type has infinite size
|
||||||
LL | bar: Bar<'a>,
|
LL | bar: Bar<'a>,
|
||||||
| ------------ recursive without indirection
|
| ------- recursive without indirection
|
||||||
|
|
|
|
||||||
= help: insert indirection (e.g., a `Box`, `Rc`, or `&`) at some point to make `Foo` representable
|
help: insert some indirection (e.g., a `Box`, `Rc`, or `&`) to make `Foo` representable
|
||||||
|
|
|
||||||
|
LL | bar: Box<Bar<'a>>,
|
||||||
|
| ^^^^ ^
|
||||||
|
|
||||||
error[E0072]: recursive type `Bar` has infinite size
|
error[E0072]: recursive type `Bar` has infinite size
|
||||||
--> $DIR/recursive-type-field.rs:8:1
|
--> $DIR/recursive-type-field.rs:8:1
|
||||||
|
@ -14,18 +17,18 @@ error[E0072]: recursive type `Bar` has infinite size
|
||||||
LL | struct Bar<'a> {
|
LL | struct Bar<'a> {
|
||||||
| ^^^^^^^^^^^^^^ recursive type has infinite size
|
| ^^^^^^^^^^^^^^ recursive type has infinite size
|
||||||
LL | y: (Foo<'a>, Foo<'a>),
|
LL | y: (Foo<'a>, Foo<'a>),
|
||||||
| --------------------- recursive without indirection
|
| ------------------ recursive without indirection
|
||||||
LL | z: Option<Bar<'a>>,
|
LL | z: Option<Bar<'a>>,
|
||||||
| ------------------ recursive without indirection
|
| --------------- recursive without indirection
|
||||||
...
|
...
|
||||||
LL | d: [Bar<'a>; 1],
|
LL | d: [Bar<'a>; 1],
|
||||||
| --------------- recursive without indirection
|
| ------------ recursive without indirection
|
||||||
LL | e: Foo<'a>,
|
LL | e: Foo<'a>,
|
||||||
| ---------- recursive without indirection
|
| ------- recursive without indirection
|
||||||
LL | x: Bar<'a>,
|
LL | x: Bar<'a>,
|
||||||
| ---------- recursive without indirection
|
| ------- recursive without indirection
|
||||||
|
|
|
|
||||||
= help: insert indirection (e.g., a `Box`, `Rc`, or `&`) at some point to make `Bar` representable
|
= help: insert some indirection (e.g., a `Box`, `Rc`, or `&`) to make `Bar` representable
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
|
|
@ -5,9 +5,12 @@ LL | struct T1 {
|
||||||
| ^^^^^^^^^ recursive type has infinite size
|
| ^^^^^^^^^ recursive type has infinite size
|
||||||
LL | foo: isize,
|
LL | foo: isize,
|
||||||
LL | foolish: T1
|
LL | foolish: T1
|
||||||
| ----------- recursive without indirection
|
| -- recursive without indirection
|
||||||
|
|
|
|
||||||
= help: insert indirection (e.g., a `Box`, `Rc`, or `&`) at some point to make `T1` representable
|
help: insert some indirection (e.g., a `Box`, `Rc`, or `&`) to make `T1` representable
|
||||||
|
|
|
||||||
|
LL | foolish: Box<T1>
|
||||||
|
| ^^^^ ^
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
|
|
@ -5,9 +5,12 @@ LL | union U {
|
||||||
| ^^^^^^^ recursive type has infinite size
|
| ^^^^^^^ recursive type has infinite size
|
||||||
LL | a: u8,
|
LL | a: u8,
|
||||||
LL | b: U,
|
LL | b: U,
|
||||||
| ---- recursive without indirection
|
| - recursive without indirection
|
||||||
|
|
|
|
||||||
= help: insert indirection (e.g., a `Box`, `Rc`, or `&`) at some point to make `U` representable
|
help: insert some indirection (e.g., a `Box`, `Rc`, or `&`) to make `U` representable
|
||||||
|
|
|
||||||
|
LL | b: Box<U>,
|
||||||
|
| ^^^^ ^
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue