about summary refs log tree commit diff
path: root/src/test/run-pass
diff options
context:
space:
mode:
authorPatrick Walton <pcwalton@mimiga.net>2014-07-01 21:59:16 -0700
committerPatrick Walton <pcwalton@mimiga.net>2014-07-01 21:59:16 -0700
commite56dbad9f7c3691bcb12edfaeda5cb3b660496de (patch)
tree116a2eb5d8ce0e99afa426534fae651741092260 /src/test/run-pass
parent380657557cb3793d39dfc0d2321fc946cb3496f5 (diff)
downloadrust-e56dbad9f7c3691bcb12edfaeda5cb3b660496de.tar.gz
rust-e56dbad9f7c3691bcb12edfaeda5cb3b660496de.zip
librustc: Properly compare implementation method type parameter bounds
with the corresponding trait parameter bounds.

This is a version of the patch in PR #12611 by Florian Hahn, modified to
address Niko's feedback.

It does not address the issue of duplicate type parameter bounds, nor
does it address the issue of implementation-defined methods that contain
*fewer* bounds than the trait, because Niko's review indicates that this
should not be necessary (and indeed I believe it is not). A test has
been added to ensure that this works.

This will break code like:

    trait Foo {
        fn bar<T:Baz>();
    }

    impl Foo for Boo {
        fn bar<T:Baz + Quux>() { ... }
        //             ^~~~ ERROR
    }

This will be rejected because the implementation requires *more* bounds
than the trait. It can be fixed by either adding the missing bound to
the trait:

    trait Foo {
        fn bar<T:Baz + Quux>();
        //             ^~~~
    }

    impl Foo for Boo {
        fn bar<T:Baz + Quux>() { ... }  // OK
    }

Or by removing the bound from the impl:

    trait Foo {
        fn bar<T:Baz>();
    }

    impl Foo for Boo {
        fn bar<T:Baz>() { ... }  // OK
        //       ^ remove Quux
    }

This patch imports the relevant tests from #2687, as well as the test
case in #5886, which is fixed as well by this patch.

Closes #2687.
Closes #5886.

[breaking-change]
Diffstat (limited to 'src/test/run-pass')
-rw-r--r--src/test/run-pass/trait-bounds-impl-comparison-duplicates.rs25
1 files changed, 25 insertions, 0 deletions
diff --git a/src/test/run-pass/trait-bounds-impl-comparison-duplicates.rs b/src/test/run-pass/trait-bounds-impl-comparison-duplicates.rs
new file mode 100644
index 00000000000..55ad22dd0bf
--- /dev/null
+++ b/src/test/run-pass/trait-bounds-impl-comparison-duplicates.rs
@@ -0,0 +1,25 @@
+// 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.
+
+// Tests that type parameter bounds on an implementation need not match the
+// trait exactly, as long as the implementation doesn't demand *more* bounds
+// than the trait.
+
+trait A {
+    fn foo<T: Eq + Ord>(&self);
+}
+
+impl A for int {
+    fn foo<T: Ord + Ord>(&self) {}
+}
+
+fn main() {}
+
+