Skip to content

boxed_local doesn't work with the FnBox pattern. #916

Closed
@Stebalien

Description

@Stebalien

In my template library horrorshow, I have the following definition to allow RenderOnce::render_once to be called through a boxed RenderOnce.

pub trait RenderBox {
    /// Do not call. Called by RenderOnce impl on Box<RenderBox>
    #[doc(hidden)]
    fn render_box(self: Box<Self>, tmpl: &mut TemplateBuffer);

    /// Do not call. Called by RenderOnce impl on Box<RenderBox>
    #[doc(hidden)]
    fn size_hint_box(&self) -> usize;
}


impl<T> RenderBox for T where T: RenderOnce {
    fn render_box(self: Box<T>, tmpl: &mut TemplateBuffer) {
        (*self).render_once(tmpl);
    }

    fn size_hint_box(&self) -> usize {
        RenderOnce::size_hint(self)
    }
}

// Box<RenderBox>

impl<'b> RenderOnce for Box<RenderBox + 'b> {
    #[inline]
    fn render_once(self, tmpl: &mut TemplateBuffer) {
        RenderBox::render_box(self, tmpl);
    }

    #[inline]
    fn size_hint(&self) -> usize {
        RenderBox::size_hint_box(self)
    }
}

This is the same pattern as stdlib's FnBox/FnOnce. Unfortunately, clippy claims that this box is unnecessary:

src/render.rs:68:19: 68:23 warning: local variable doesn't need to be boxed here, #[warn(boxed_local)] on by default
src/render.rs:68     fn render_box(self: Box<T>, tmpl: &mut TemplateBuffer) {

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions