SizedBoxType,
/// Inline asm operand type must be `Sized`.
InlineAsmSized,
- /// `[T, ..n]` implies that `T` must be `Copy`.
- /// If the function in the array repeat expression is a `const fn`,
- /// display a help message suggesting to move the function call to a
- /// new `const` item while saying that `T` doesn't implement `Copy`.
- RepeatVec(bool),
+ /// `[expr; N]` requires `type_of(expr): Copy`.
+ RepeatElementCopy {
+ /// If element is a `const fn` we display a help message suggesting to move the
+ /// function call to a new `const` item while saying that `T` doesn't implement `Copy`.
+ is_const_fn: bool,
+ },
/// Types of fields (other than the last, except for packed structs) in a struct must be sized.
FieldSized {
BuiltinDerivedObligation(DerivedObligationCause<'tcx>),
- ImplDerivedObligation(DerivedObligationCause<'tcx>),
+ ImplDerivedObligation(Box<ImplDerivedObligationCause<'tcx>>),
DerivedObligation(DerivedObligationCause<'tcx>),
},
}
+#[derive(Clone, Debug, PartialEq, Eq, Hash, Lift)]
+pub struct ImplDerivedObligationCause<'tcx> {
+ pub derived: DerivedObligationCause<'tcx>,
+ pub impl_def_id: DefId,
+ pub span: Span,
+}
+
impl ObligationCauseCode<'_> {
// Return the base obligation, ignoring derived obligations.
pub fn peel_derives(&self) -> &Self {
let mut base_cause = self;
- while let BuiltinDerivedObligation(DerivedObligationCause { parent_code, .. })
- | ImplDerivedObligation(DerivedObligationCause { parent_code, .. })
- | DerivedObligation(DerivedObligationCause { parent_code, .. })
- | FunctionArgumentObligation { parent_code, .. } = base_cause
- {
- base_cause = &parent_code;
+ loop {
+ match base_cause {
+ BuiltinDerivedObligation(DerivedObligationCause { parent_code, .. })
+ | DerivedObligation(DerivedObligationCause { parent_code, .. })
+ | FunctionArgumentObligation { parent_code, .. } => {
+ base_cause = &parent_code;
+ }
+ ImplDerivedObligation(obligation_cause) => {
+ base_cause = &*obligation_cause.derived.parent_code;
+ }
+ _ => break,
+ }
}
base_cause
}
/// // Case A: ImplSource points at a specific impl. Only possible when
/// // type is concretely known. If the impl itself has bounded
/// // type parameters, ImplSource will carry resolutions for those as well:
-/// concrete.clone(); // ImpleSource(Impl_1, [ImplSource(Impl_2, [ImplSource(Impl_3)])])
+/// concrete.clone(); // ImplSource(Impl_1, [ImplSource(Impl_2, [ImplSource(Impl_3)])])
///
/// // Case A: ImplSource points at a specific impl. Only possible when
/// // type is concretely known. If the impl itself has bounded