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
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")
}
}
+ 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");
--- /dev/null
+// 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
+}