]> git.lizzy.rs Git - rust.git/commitdiff
Prohibit parenthesized params in more types.
authorMasaki Hara <ackie.h.gmai@gmail.com>
Tue, 9 May 2017 13:32:29 +0000 (22:32 +0900)
committerMasaki Hara <ackie.h.gmai@gmail.com>
Tue, 9 May 2017 13:32:29 +0000 (22:32 +0900)
src/librustc_typeck/astconv.rs
src/test/compile-fail/issue-32995.rs [new file with mode: 0644]

index adcb3d682ca238b7541a3ad584155562c6f80463..93411493b178f41864d714416a265c520fd551dd 100644 (file)
@@ -161,10 +161,7 @@ pub fn ast_path_substs_for_ty(&self,
         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 @@ fn qpath_to_ty(&self,
 
     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 @@ pub fn prohibit_type_params(&self, segments: &[hir::PathSegment]) {
         }
     }
 
+    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 (file)
index 0000000..2fb22e6
--- /dev/null
@@ -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
+}