]> git.lizzy.rs Git - rust.git/commitdiff
traits with self-containing supertraits are not object safe
authorAriel Ben-Yehuda <arielb1@mail.tau.ac.il>
Sun, 25 Dec 2016 17:38:45 +0000 (19:38 +0200)
committerAriel Ben-Yehuda <ariel.byd@gmail.com>
Tue, 10 Jan 2017 22:02:16 +0000 (00:02 +0200)
This should be the last time I fix this function.

Fixes #38404.

src/librustc/traits/object_safety.rs
src/test/compile-fail/issue-38404.rs [new file with mode: 0644]

index 0d5c9b98941dc086a78eee65d3cd55e87c597589..df87d624e3a6635144ff210a21da2f36432b1eea 100644 (file)
@@ -81,8 +81,10 @@ pub fn astconv_object_safety_violations(self, trait_def_id: DefId)
     {
         let mut violations = vec![];
 
-        if self.supertraits_reference_self(trait_def_id) {
-            violations.push(ObjectSafetyViolation::SupertraitSelf);
+        for def_id in traits::supertrait_def_ids(self, trait_def_id) {
+            if self.supertraits_reference_self(def_id) {
+                violations.push(ObjectSafetyViolation::SupertraitSelf);
+            }
         }
 
         debug!("astconv_object_safety_violations(trait_def_id={:?}) = {:?}",
diff --git a/src/test/compile-fail/issue-38404.rs b/src/test/compile-fail/issue-38404.rs
new file mode 100644 (file)
index 0000000..a2b0d0a
--- /dev/null
@@ -0,0 +1,16 @@
+// Copyright 2016 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.
+
+trait A<T>: std::ops::Add<Self> + Sized {}
+trait B<T>: A<T> {}
+trait C<T>: A<B<T, Output=usize>> {}
+//~^ ERROR the trait `B` cannot be made into an object
+
+fn main() {}