Skip to content

T: Drop bound not satisfied from Option::unwrap_or (et. al) when Drop anti-bound is present #92111

Closed
@chorman0773

Description

@chorman0773

Code

I tried this code:

pub trait NoDrop{}

impl<T: Drop> NoDrop for T{}

#[derive(Debug)]
pub struct DoesNotHaveDrop(i32);

impl NoDrop for DoesNotHaveDrop{}

fn main() {
    let x = Some(DoesNotHaveDrop(0));
    println!("{:?}",x.unwrap_or(DoesNotHaveDrop(0)))
}

I expected to see this happen: print DoesNotHaveDrop(0) (from Debug impl)

Instead, this happened: E0277, trait impl DoesNotHaveDrop: Drop not found

This was found by CI in the Ruffle Project: https://github.com/ruffle-rs/ruffle/runs/4576592287?check_suite_focus=true

The issue is caused by the effective anti-bound of Drop, introduced by the manual impl of the NoDrop trait, as well as the PR #91928 which introduced ~const Drop bounds for a number of functions in Option.

Version it worked on

It most recently worked on: rustc 1.59.0-nightly (7abab1e 2021-12-18)

Version with regression

rustc --version --verbose:

rustc 1.59.0-nightly (91a0600a5 2021-12-18)

@rustbot modify labels: +regression-from-stable-to-nightly -regression-untriaged

Metadata

Metadata

Assignees

Labels

C-bugCategory: This is a bug.regression-from-stable-to-nightlyPerformance or correctness regression from stable to nightly.

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions