about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorAhmed Charles <acharles@outlook.com>2015-01-24 09:53:05 -0800
committerFlavio Percoco <flaper87@gmail.com>2015-02-22 16:31:19 +0100
commit3ebdbac2651cd21f2efda8d3b381ed396d7bb725 (patch)
tree1ed52971404152d3d20f1a70f11823c5aa0e55e2 /src
parentdcc6ce2c772cb851ac35cbc2ddafcae9bf2fa9fd (diff)
downloadrust-3ebdbac2651cd21f2efda8d3b381ed396d7bb725.tar.gz
rust-3ebdbac2651cd21f2efda8d3b381ed396d7bb725.zip
Do not permit type parameters on builtin bounds.
Diffstat (limited to 'src')
-rw-r--r--src/librustc_typeck/astconv.rs10
-rw-r--r--src/librustc_typeck/diagnostics.rs3
-rw-r--r--src/test/compile-fail/typeck-builtin-bound-type-parameters.rs27
3 files changed, 37 insertions, 3 deletions
diff --git a/src/librustc_typeck/astconv.rs b/src/librustc_typeck/astconv.rs
index afdc414c163..bb27918075d 100644
--- a/src/librustc_typeck/astconv.rs
+++ b/src/librustc_typeck/astconv.rs
@@ -1847,8 +1847,14 @@ pub fn partition_bounds<'a>(tcx: &ty::ctxt,
                         if ty::try_add_builtin_trait(tcx,
                                                      trait_did,
                                                      &mut builtin_bounds) {
-                            // FIXME(#20302) -- we should check for things like Copy<T>
-                            continue; // success
+                            let segments = &b.trait_ref.path.segments;
+                            let parameters = &segments[segments.len() - 1].parameters;
+                            if parameters.is_empty() {
+                                continue; // success
+                            }
+                            span_err!(tcx.sess, b.trait_ref.path.span, E0316,
+                                      "builtin bounds do not require arguments, {} given",
+                                      parameters.types().len());
                         }
                     }
                     _ => {
diff --git a/src/librustc_typeck/diagnostics.rs b/src/librustc_typeck/diagnostics.rs
index 17cf92d39d8..82334eb253b 100644
--- a/src/librustc_typeck/diagnostics.rs
+++ b/src/librustc_typeck/diagnostics.rs
@@ -171,7 +171,8 @@ register_diagnostics! {
     E0247, // found module name used as a type
     E0248, // found value name used as a type
     E0249, // expected constant expr for array length
-    E0250  // expected constant expr for array length
+    E0250, // expected constant expr for array length
+    E0316  // wrong number of type arguments to a built-in trait
 }
 
 __build_diagnostic_array! { DIAGNOSTICS }
diff --git a/src/test/compile-fail/typeck-builtin-bound-type-parameters.rs b/src/test/compile-fail/typeck-builtin-bound-type-parameters.rs
new file mode 100644
index 00000000000..3914fb96a0d
--- /dev/null
+++ b/src/test/compile-fail/typeck-builtin-bound-type-parameters.rs
@@ -0,0 +1,27 @@
+// Copyright 2015 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.
+
+fn foo1<T:Copy<U>, U>(x: T) {}
+//~^ ERROR: builtin bounds do not require arguments, 1 given
+
+trait Trait: Copy<Send> {}
+//~^ ERROR: builtin bounds do not require arguments, 1 given
+
+struct MyStruct1<T: Copy<T>>;
+//~^ ERROR: builtin bounds do not require arguments, 1 given
+
+struct MyStruct2<'a, T: Copy<'a>>;
+//~^ ERROR: builtin bounds do not require arguments, 1 given
+
+fn foo2<'a, T:Copy<'a, U>, U>(x: T) {}
+//~^ ERROR: builtin bounds do not require arguments, 1 given
+
+fn main() {
+}