]> git.lizzy.rs Git - rust.git/commitdiff
Teach variance checker about the lifetime bounds that appear in trait object types.
authorNiko Matsakis <niko@alum.mit.edu>
Mon, 27 Oct 2014 18:03:25 +0000 (14:03 -0400)
committerNiko Matsakis <niko@alum.mit.edu>
Fri, 31 Oct 2014 21:39:41 +0000 (17:39 -0400)
src/librustc/middle/typeck/variance.rs
src/test/compile-fail/variance-trait-object-bound.rs [new file with mode: 0644]
src/test/run-pass/issue-16668.rs

index 5e62a8e9451687a45e6aa583ee848da09b7acef3..9a90381854a6ce62050f33b74f8b9b91cd01fcf4 100644 (file)
@@ -778,7 +778,7 @@ fn add_constraints_from_ty(&mut self,
                     variance);
             }
 
-            ty::ty_trait(box ty::TyTrait { def_id, ref substs, .. }) => {
+            ty::ty_trait(box ty::TyTrait { def_id, ref substs, bounds }) => {
                 let trait_def = ty::lookup_trait_def(self.tcx(), def_id);
                 let generics = &trait_def.generics;
 
@@ -796,6 +796,10 @@ fn add_constraints_from_ty(&mut self,
                 assert!(generics.types.is_empty_in(subst::FnSpace));
                 assert!(generics.regions.is_empty_in(subst::FnSpace));
 
+                // The type `Foo<T+'a>` is contravariant w/r/t `'a`:
+                let contra = self.contravariant(variance);
+                self.add_constraints_from_region(bounds.region_bound, contra);
+
                 self.add_constraints_from_substs(
                     def_id,
                     generics.types.get_slice(subst::TypeSpace),
diff --git a/src/test/compile-fail/variance-trait-object-bound.rs b/src/test/compile-fail/variance-trait-object-bound.rs
new file mode 100644 (file)
index 0000000..c61f2ff
--- /dev/null
@@ -0,0 +1,26 @@
+// Copyright 2014 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.
+
+// Checks that regions which appear in a trait object type are
+// observed by the variance inference algorithm (and hence
+// `TOption` is contavariant w/r/t `'a` and not bivariant).
+//
+// Issue #18262.
+
+use std::mem;
+
+trait T { fn foo(); }
+
+#[rustc_variance]
+struct TOption<'a> { //~ ERROR regions=[[-];[];[]]
+    v: Option<Box<T + 'a>>,
+}
+
+fn main() { }
index b66fb4306d02993b01d7f413580592385cfbcea4..92f8030a0dc566c76c73739612842976182a199f 100644 (file)
@@ -17,7 +17,7 @@ struct Parser<'a, I, O> {
 }
 
 impl<'a, I, O: 'a> Parser<'a, I, O> {
-    fn compose<K: 'a>(mut self, mut rhs: Parser<O, K>) -> Parser<'a, I, K> {
+    fn compose<K: 'a>(mut self, mut rhs: Parser<'a, O, K>) -> Parser<'a, I, K> {
         Parser {
             parse: box move |&mut: x: I| {
                 match self.parse.call_mut((x,)) {