From dc81472679fa54002b6cabaedc1dfa5146453a3d Mon Sep 17 00:00:00 2001 From: "Felix S. Klock II" Date: Tue, 28 Apr 2015 17:47:16 +0200 Subject: [PATCH] Fix #24895. [breaking-change] What does this break? Basically, code that implements `Drop` and is using `T:Copy` for one of its type parameters and is relying on the Drop Check rule not applying to it. Here is an example: ```rust #![allow(dead_code,unused_variables,unused_assignments)] struct D(T); impl Drop for D { fn drop(&mut self) { } } trait UserT { fn c(&self) { } } impl UserT for T { } struct E(T); impl Drop for E { fn drop(&mut self) { } } // This one will start breaking. fn foo() { let (d2, d1); d1 = D(34); d2 = D(&d1); } #[cfg(this_one_does_and_should_always_break)] fn bar() { let (e2, e1); e1 = E(34); e2 = E(&e1); } fn main() { foo(); } ``` --- src/librustc_typeck/check/dropck.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/librustc_typeck/check/dropck.rs b/src/librustc_typeck/check/dropck.rs index 2f7e0073e175..008ba1c6bf83 100644 --- a/src/librustc_typeck/check/dropck.rs +++ b/src/librustc_typeck/check/dropck.rs @@ -464,9 +464,9 @@ fn iterate_over_potentially_unsafe_regions_in_type<'a, 'tcx>( ty::Predicate::Trait(ty::Binder(ref t_pred)) => { let def_id = t_pred.trait_ref.def_id; match rcx.tcx().lang_items.to_builtin_kind(def_id) { + // Issue 24895: deliberately do not include `BoundCopy` here. Some(ty::BoundSend) | Some(ty::BoundSized) | - Some(ty::BoundCopy) | Some(ty::BoundSync) => false, _ => true, }