diff options
| author | Vadim Petrochenkov <vadim.petrochenkov@gmail.com> | 2017-07-29 04:47:12 +0300 |
|---|---|---|
| committer | Vadim Petrochenkov <vadim.petrochenkov@gmail.com> | 2017-08-11 02:06:27 +0300 |
| commit | 7d21f21f71b9b4a8a0662a223c20db7a789f5637 (patch) | |
| tree | 1bec81f1d13749cf2b3b31e877715fdfef5da2cc /src | |
| parent | 13d94d5fa8129a34f5c77a1bcd76983f5aed2434 (diff) | |
| download | rust-7d21f21f71b9b4a8a0662a223c20db7a789f5637.tar.gz rust-7d21f21f71b9b4a8a0662a223c20db7a789f5637.zip | |
syntax: Relax path grammar
Diffstat (limited to 'src')
| -rw-r--r-- | src/libsyntax/parse/parser.rs | 15 | ||||
| -rw-r--r-- | src/test/compile-fail/issue-32995.rs | 8 | ||||
| -rw-r--r-- | src/test/compile-fail/issue-36116.rs | 15 | ||||
| -rw-r--r-- | src/test/compile-fail/unboxed-closure-sugar-used-on-struct-3.rs (renamed from src/test/parse-fail/unboxed-closure-sugar-used-on-struct-3.rs) | 12 | ||||
| -rw-r--r-- | src/test/parse-fail/type-parameters-in-field-exprs.rs | 2 |
5 files changed, 20 insertions, 32 deletions
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index 7bf4c6799b3..9e36adf3d35 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -84,7 +84,7 @@ pub enum PathStyle { Expr, /// In other contexts, notably in types, no ambiguity exists and paths can be written /// without the disambiguator, e.g. `x<y>` - unambiguously a path. - /// Paths with disambiguators are rejected for now, but may be allowed in the future. + /// Paths with disambiguators are still accepted, `x::<Y>` - unambiguously a path too. Type, /// A path with generic arguments disallowed, e.g. `foo::bar::Baz`, used in imports, /// visibilities or attributes. @@ -1835,18 +1835,7 @@ impl<'a> Parser<'a> { && self.look_ahead(1, |t| is_args_start(t)) { // Generic arguments are found - `<`, `(`, `::<` or `::(`. let lo = self.span; - if self.eat(&token::ModSep) { - // These errors are not strictly necessary and may be removed in the future. - if style == PathStyle::Type { - let mut err = self.diagnostic().struct_span_err(self.prev_span, - "unnecessary path disambiguator"); - err.span_label(self.prev_span, "try removing `::`"); - err.emit(); - } else if self.token == token::OpenDelim(token::Paren) { - self.diagnostic().span_err(self.prev_span, - "`::` is not supported before parenthesized generic arguments") - } - } + self.eat(&token::ModSep); let parameters = if self.eat_lt() { // `<'a, T, A = U>` diff --git a/src/test/compile-fail/issue-32995.rs b/src/test/compile-fail/issue-32995.rs index 4b7f82943ba..ffbd0c0c22a 100644 --- a/src/test/compile-fail/issue-32995.rs +++ b/src/test/compile-fail/issue-32995.rs @@ -19,15 +19,11 @@ fn main() { //~^ ERROR parenthesized parameters may only be used with a trait //~| WARN previously accepted - macro_rules! pathexpr { - ($p:path) => { $p } - } - - let p = pathexpr!(::std::str()::from_utf8)(b"foo").unwrap(); + let p = ::std::str::()::from_utf8(b"foo").unwrap(); //~^ ERROR parenthesized parameters may only be used with a trait //~| WARN previously accepted - let p = pathexpr!(::std::str::from_utf8())(b"foo").unwrap(); + let p = ::std::str::from_utf8::()(b"foo").unwrap(); //~^ ERROR parenthesized parameters may only be used with a trait //~| WARN previously accepted diff --git a/src/test/compile-fail/issue-36116.rs b/src/test/compile-fail/issue-36116.rs index 737955b2ff3..18a6e430b84 100644 --- a/src/test/compile-fail/issue-36116.rs +++ b/src/test/compile-fail/issue-36116.rs @@ -8,16 +8,19 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. +// Unnecessary path disambiguator is ok + +#![feature(rustc_attrs)] +#![allow(unused)] + struct Foo<T> { _a: T, } -fn main() { +fn f() { let f = Some(Foo { _a: 42 }).map(|a| a as Foo::<i32>); - //~^ ERROR unnecessary path disambiguator - //~| NOTE try removing `::` - let g: Foo::<i32> = Foo { _a: 42 }; - //~^ ERROR unnecessary path disambiguator - //~| NOTE try removing `::` } + +#[rustc_error] +fn main() {} //~ ERROR compilation successful diff --git a/src/test/parse-fail/unboxed-closure-sugar-used-on-struct-3.rs b/src/test/compile-fail/unboxed-closure-sugar-used-on-struct-3.rs index 548a5078a74..42fffe546c2 100644 --- a/src/test/parse-fail/unboxed-closure-sugar-used-on-struct-3.rs +++ b/src/test/compile-fail/unboxed-closure-sugar-used-on-struct-3.rs @@ -8,9 +8,7 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// compile-flags: -Z parse-only - -// Test that parentheses form doesn't work in expression paths. +// Test that parentheses form parses in expression paths. struct Bar<A,R> { f: A, r: R @@ -21,10 +19,10 @@ impl<A,B> Bar<A,B> { } fn bar() { - let b = Box::Bar::<isize,usize>::new(); // OK + let b = Bar::<isize, usize>::new(); // OK - let b = Box::Bar::()::new(); - //~^ ERROR `::` is not supported before parenthesized generic arguments + let b = Bar::(isize, usize)::new(); // OK too (for the parser) + //~^ ERROR parenthesized parameters may only be used with a trait } -fn main() { } +fn main() {} diff --git a/src/test/parse-fail/type-parameters-in-field-exprs.rs b/src/test/parse-fail/type-parameters-in-field-exprs.rs index 95c307c5670..cb018ff1bfa 100644 --- a/src/test/parse-fail/type-parameters-in-field-exprs.rs +++ b/src/test/parse-fail/type-parameters-in-field-exprs.rs @@ -24,4 +24,6 @@ fn main() { //~^ ERROR field expressions may not have generic arguments f.x::<>; //~^ ERROR field expressions may not have generic arguments + f.x::(); + //~^ ERROR field expressions may not have generic arguments } |
