about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorkennytm <kennytm@gmail.com>2018-01-03 16:57:55 +0800
committerGitHub <noreply@github.com>2018-01-03 16:57:55 +0800
commitf7932ef1d5059058fa8b01b7df26b628f613d5ee (patch)
treed1fed2f105c1c866b9062669f644f6c575e4c332 /src
parent0f4ebf9f0a3196420e25cf1558b49ea3f38643c4 (diff)
parent31a4cba01077b3f27622e1b42878407c65964d71 (diff)
downloadrust-f7932ef1d5059058fa8b01b7df26b628f613d5ee.tar.gz
rust-f7932ef1d5059058fa8b01b7df26b628f613d5ee.zip
Rollup merge of #47104 - matthewjasper:dont-panic-on-generic-drop, r=estebank
Delay panic from incoherent drop implementation

Closes #41974
Diffstat (limited to 'src')
-rw-r--r--src/librustc_typeck/check/dropck.rs10
-rw-r--r--src/test/compile-fail/issue-41974.rs24
2 files changed, 30 insertions, 4 deletions
diff --git a/src/librustc_typeck/check/dropck.rs b/src/librustc_typeck/check/dropck.rs
index 55700c452e5..4aed688027f 100644
--- a/src/librustc_typeck/check/dropck.rs
+++ b/src/librustc_typeck/check/dropck.rs
@@ -59,11 +59,13 @@ pub fn check_drop_impl<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
         }
         _ => {
             // 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);
-            span_bug!(span,
-                      "should have been rejected by coherence check: {}",
-                      dtor_self_type);
+            tcx.sess.delay_span_bug(span,
+                            &format!("should have been rejected by coherence check: {}",
+                            dtor_self_type));
+            Err(ErrorReported)
         }
     }
 }
diff --git a/src/test/compile-fail/issue-41974.rs b/src/test/compile-fail/issue-41974.rs
new file mode 100644
index 00000000000..5c9077783c7
--- /dev/null
+++ b/src/test/compile-fail/issue-41974.rs
@@ -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() {}