Rollup merge of #47104 - matthewjasper:dont-panic-on-generic-drop, r=estebank

Delay panic from incoherent drop implementation

Closes #41974
This commit is contained in:
kennytm 2018-01-03 16:57:55 +08:00 committed by GitHub
commit f7932ef1d5
2 changed files with 30 additions and 4 deletions

View file

@ -59,11 +59,13 @@ pub fn check_drop_impl<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
} }
_ => { _ => {
// Destructors only work on nominal types. This was // Destructors only work on nominal types. This was
// already checked by coherence, so we can panic here. // already checked by coherence, but compilation may
// not have been terminated.
let span = tcx.def_span(drop_impl_did); let span = tcx.def_span(drop_impl_did);
span_bug!(span, tcx.sess.delay_span_bug(span,
"should have been rejected by coherence check: {}", &format!("should have been rejected by coherence check: {}",
dtor_self_type); dtor_self_type));
Err(ErrorReported)
} }
} }
} }

View file

@ -0,0 +1,24 @@
// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
#[derive(Copy, Clone)]
struct Flags;
trait A {
}
impl<T> Drop for T where T: A { //~ ERROR E0119
//~^ ERROR E0120
//~| ERROR E0210
fn drop(&mut self) {
}
}
fn main() {}