about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorMasaki Hara <ackie.h.gmai@gmail.com>2017-05-09 22:32:29 +0900
committerMasaki Hara <ackie.h.gmai@gmail.com>2017-05-09 22:32:29 +0900
commit63ecd6aa0f2c8a6807528d8bdf5eb30211b3fcd4 (patch)
tree9267b459cdcc2195ff46b2c45444fb50c1315740 /src
parentbedd7da3d28d69520f33ac6a585df87ef1373a26 (diff)
downloadrust-63ecd6aa0f2c8a6807528d8bdf5eb30211b3fcd4.tar.gz
rust-63ecd6aa0f2c8a6807528d8bdf5eb30211b3fcd4.zip
Prohibit parenthesized params in more types.
Diffstat (limited to 'src')
-rw-r--r--src/librustc_typeck/astconv.rs18
-rw-r--r--src/test/compile-fail/issue-32995.rs25
2 files changed, 39 insertions, 4 deletions
diff --git a/src/librustc_typeck/astconv.rs b/src/librustc_typeck/astconv.rs
index adcb3d682ca..93411493b17 100644
--- a/src/librustc_typeck/astconv.rs
+++ b/src/librustc_typeck/astconv.rs
@@ -161,10 +161,7 @@ impl<'o, 'gcx: 'tcx, 'tcx> AstConv<'gcx, 'tcx>+'o {
         match item_segment.parameters {
             hir::AngleBracketedParameters(_) => {}
             hir::ParenthesizedParameters(..) => {
-                struct_span_err!(tcx.sess, span, E0214,
-                          "parenthesized parameters may only be used with a trait")
-                    .span_label(span, "only traits may use parentheses")
-                    .emit();
+                self.prohibit_parenthesized_params(item_segment);
 
                 return Substs::for_item(tcx, def_id, |_, _| {
                     tcx.types.re_static
@@ -948,6 +945,10 @@ impl<'o, 'gcx: 'tcx, 'tcx> AstConv<'gcx, 'tcx>+'o {
 
     pub fn prohibit_type_params(&self, segments: &[hir::PathSegment]) {
         for segment in segments {
+            if let hir::ParenthesizedParameters(_) = segment.parameters {
+                self.prohibit_parenthesized_params(segment);
+                break;
+            }
             for typ in segment.parameters.types() {
                 struct_span_err!(self.tcx().sess, typ.span, E0109,
                                  "type parameters are not allowed on this type")
@@ -970,6 +971,15 @@ impl<'o, 'gcx: 'tcx, 'tcx> AstConv<'gcx, 'tcx>+'o {
         }
     }
 
+    pub fn prohibit_parenthesized_params(&self, segment: &hir::PathSegment) {
+        if let hir::ParenthesizedParameters(ref data) = segment.parameters {
+            struct_span_err!(self.tcx().sess, data.span, E0214,
+                      "parenthesized parameters may only be used with a trait")
+                .span_label(data.span, "only traits may use parentheses")
+                .emit();
+        }
+    }
+
     pub fn prohibit_projection(&self, span: Span) {
         let mut err = struct_span_err!(self.tcx().sess, span, E0229,
                                        "associated type bindings are not allowed here");
diff --git a/src/test/compile-fail/issue-32995.rs b/src/test/compile-fail/issue-32995.rs
new file mode 100644
index 00000000000..2fb22e68beb
--- /dev/null
+++ b/src/test/compile-fail/issue-32995.rs
@@ -0,0 +1,25 @@
+// 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.
+
+fn main() {
+    let s: String() = String::from("foo");
+    //~^ ERROR parenthesized parameters may only be used with a trait
+
+    let x: usize() = 1;
+    //~^ ERROR parenthesized parameters may only be used with a trait
+
+    let b: ::std::boxed()::Box<_> = Box::new(1);
+    //~^ ERROR parenthesized parameters may only be used with a trait
+}
+
+fn foo<X:Default>() {
+    let d : X() = Default::default();
+    //~^ ERROR parenthesized parameters may only be used with a trait
+}