Prohibit parenthesized params in more types.

This commit is contained in:
Masaki Hara 2017-05-09 22:32:29 +09:00
parent bedd7da3d2
commit 63ecd6aa0f
No known key found for this signature in database
GPG key ID: 7CA7A85E049A82E8
2 changed files with 39 additions and 4 deletions

View file

@ -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");

View file

@ -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
}