From b70be5bc7953007c333db510b5784c7a051a9b27 Mon Sep 17 00:00:00 2001 From: Pramod Bisht Date: Tue, 14 Aug 2018 19:05:27 +0000 Subject: Adddressed #51602 --- src/libsyntax/parse/parser.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'src/libsyntax') diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index 0e45cacaf38..8e11104b3f6 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -4719,7 +4719,12 @@ impl<'a> Parser<'a> { if !self.eat(&token::OpenDelim(token::Brace)) { let sp = self.span; let tok = self.this_token_to_string(); + let mut do_not_suggest_help = false; let mut e = self.span_fatal(sp, &format!("expected `{{`, found `{}`", tok)); + if self.token.is_keyword(keywords::In) || self.token == token::Colon { + do_not_suggest_help = true; + e.span_label(sp, "expected `{`"); + } // Check to see if the user has written something like // @@ -4729,7 +4734,8 @@ impl<'a> Parser<'a> { // Which is valid in other languages, but not Rust. match self.parse_stmt_without_recovery(false) { Ok(Some(stmt)) => { - if self.look_ahead(1, |t| t == &token::OpenDelim(token::Brace)) { + if self.look_ahead(1, |t| t == &token::OpenDelim(token::Brace)) + || do_not_suggest_help { // if the next token is an open brace (e.g., `if a b {`), the place- // inside-a-block suggestion would be more likely wrong than right return Err(e); -- cgit 1.4.1-3-g733a5 From d305f68cb9c0d93a30f65af0cd33acd90e3f2532 Mon Sep 17 00:00:00 2001 From: varkor Date: Wed, 15 Aug 2018 02:02:52 +0100 Subject: Warn when `generic_associated_types` feature gate is enabled --- src/libsyntax/feature_gate.rs | 15 +++++++++++++++ .../gat-incomplete-warning.rs | 16 ++++++++++++++++ .../gat-incomplete-warning.stderr | 6 ++++++ 3 files changed, 37 insertions(+) create mode 100644 src/test/ui/rfc1598-generic-associated-types/gat-incomplete-warning.rs create mode 100644 src/test/ui/rfc1598-generic-associated-types/gat-incomplete-warning.stderr (limited to 'src/libsyntax') diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs index 56e69b9df9e..98fbbe4bdef 100644 --- a/src/libsyntax/feature_gate.rs +++ b/src/libsyntax/feature_gate.rs @@ -1920,6 +1920,11 @@ pub fn get_features(span_handler: &Handler, krate_attrs: &[ast::Attribute], err.emit(); } + // Some features are known to be incomplete and using them is likely to have + // unanticipated results, such as compiler crashes. We warn the user about these + // to alert them. + let incomplete_features = ["generic_associated_types"]; + let mut features = Features::new(); let mut edition_enabled_features = FxHashMap(); @@ -1955,6 +1960,16 @@ pub fn get_features(span_handler: &Handler, krate_attrs: &[ast::Attribute], continue }; + if incomplete_features.iter().any(|f| *f == name.as_str()) { + span_handler.struct_span_warn( + mi.span, + &format!( + "the feature `{}` is incomplete and may cause the compiler to crash", + name + ) + ).emit(); + } + if let Some(edition) = ALL_EDITIONS.iter().find(|e| name == e.feature_name()) { if *edition <= crate_edition { continue diff --git a/src/test/ui/rfc1598-generic-associated-types/gat-incomplete-warning.rs b/src/test/ui/rfc1598-generic-associated-types/gat-incomplete-warning.rs new file mode 100644 index 00000000000..7f48408b369 --- /dev/null +++ b/src/test/ui/rfc1598-generic-associated-types/gat-incomplete-warning.rs @@ -0,0 +1,16 @@ +// Copyright 2018 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// run-pass + +#![feature(generic_associated_types)] +//~^ WARNING the feature `generic_associated_types` is incomplete + +fn main() {} diff --git a/src/test/ui/rfc1598-generic-associated-types/gat-incomplete-warning.stderr b/src/test/ui/rfc1598-generic-associated-types/gat-incomplete-warning.stderr new file mode 100644 index 00000000000..67682dcb8fb --- /dev/null +++ b/src/test/ui/rfc1598-generic-associated-types/gat-incomplete-warning.stderr @@ -0,0 +1,6 @@ +warning: the feature `generic_associated_types` is incomplete and may cause the compiler to crash + --> $DIR/gat-incomplete-warning.rs:13:12 + | +LL | #![feature(generic_associated_types)] + | ^^^^^^^^^^^^^^^^^^^^^^^^ + -- cgit 1.4.1-3-g733a5 From 2a74d7924a138b720e054fa6ea9610b5ba56d061 Mon Sep 17 00:00:00 2001 From: Esteban Küber Date: Tue, 14 Aug 2018 18:04:20 -0700 Subject: Tweak unclosed delimiter parser error --- src/libsyntax/parse/lexer/tokentrees.rs | 6 ++++-- src/test/parse-fail/issue-10636-1.rs | 15 --------------- src/test/ui/issue-10636-1.rs | 19 +++++++++++++++++++ src/test/ui/issue-10636-1.stderr | 11 +++++++++++ src/test/ui/parser-recovery-2.stderr | 11 ++++------- src/test/ui/resolve/token-error-correct-2.stderr | 11 ++++------- src/test/ui/resolve/token-error-correct-3.stderr | 11 ++++------- src/test/ui/resolve/token-error-correct.stderr | 22 ++++++++-------------- src/test/ui/token/issue-10636-2.stderr | 11 ++++------- 9 files changed, 58 insertions(+), 59 deletions(-) delete mode 100644 src/test/parse-fail/issue-10636-1.rs create mode 100644 src/test/ui/issue-10636-1.rs create mode 100644 src/test/ui/issue-10636-1.stderr (limited to 'src/libsyntax') diff --git a/src/libsyntax/parse/lexer/tokentrees.rs b/src/libsyntax/parse/lexer/tokentrees.rs index 36c220fa0d9..c578108a3fc 100644 --- a/src/libsyntax/parse/lexer/tokentrees.rs +++ b/src/libsyntax/parse/lexer/tokentrees.rs @@ -79,11 +79,12 @@ impl<'a> StringReader<'a> { let token_str = token_to_string(&self.token); let msg = format!("incorrect close delimiter: `{}`", token_str); let mut err = self.sess.span_diagnostic.struct_span_err(self.span, &msg); + err.span_label(self.span, "incorrect close delimiter"); // This is a conservative error: only report the last unclosed delimiter. // The previous unclosed delimiters could actually be closed! The parser // just hasn't gotten to them yet. if let Some(&(_, sp)) = self.open_braces.last() { - err.span_note(sp, "unclosed delimiter"); + err.span_label(sp, "unclosed delimiter"); }; err.emit(); @@ -118,7 +119,8 @@ impl<'a> StringReader<'a> { // matching opening delimiter). let token_str = token_to_string(&self.token); let msg = format!("unexpected close delimiter: `{}`", token_str); - let err = self.sess.span_diagnostic.struct_span_err(self.span, &msg); + let mut err = self.sess.span_diagnostic.struct_span_err(self.span, &msg); + err.span_label(self.span, "unexpected close delimiter"); Err(err) }, _ => { diff --git a/src/test/parse-fail/issue-10636-1.rs b/src/test/parse-fail/issue-10636-1.rs deleted file mode 100644 index 398fe8c5b8c..00000000000 --- a/src/test/parse-fail/issue-10636-1.rs +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2013 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 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -// compile-flags: -Z parse-only - -struct Obj { //~ NOTE: unclosed delimiter - member: usize -) //~ ERROR: incorrect close delimiter diff --git a/src/test/ui/issue-10636-1.rs b/src/test/ui/issue-10636-1.rs new file mode 100644 index 00000000000..fdd50773593 --- /dev/null +++ b/src/test/ui/issue-10636-1.rs @@ -0,0 +1,19 @@ +// Copyright 2013 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// compile-flags: -Z parse-only + +struct Obj { //~ NOTE: unclosed delimiter + member: usize +) +//~^ ERROR incorrect close delimiter +//~| NOTE incorrect close delimiter + +fn main() {} diff --git a/src/test/ui/issue-10636-1.stderr b/src/test/ui/issue-10636-1.stderr new file mode 100644 index 00000000000..af80e259fbd --- /dev/null +++ b/src/test/ui/issue-10636-1.stderr @@ -0,0 +1,11 @@ +error: incorrect close delimiter: `)` + --> $DIR/issue-10636-1.rs:15:1 + | +LL | struct Obj { //~ NOTE: unclosed delimiter + | - unclosed delimiter +LL | member: usize +LL | ) + | ^ incorrect close delimiter + +error: aborting due to previous error + diff --git a/src/test/ui/parser-recovery-2.stderr b/src/test/ui/parser-recovery-2.stderr index 7b520607352..1025dad3af7 100644 --- a/src/test/ui/parser-recovery-2.stderr +++ b/src/test/ui/parser-recovery-2.stderr @@ -1,14 +1,11 @@ error: incorrect close delimiter: `)` --> $DIR/parser-recovery-2.rs:18:5 | -LL | ) //~ ERROR incorrect close delimiter: `)` - | ^ - | -note: unclosed delimiter - --> $DIR/parser-recovery-2.rs:16:14 - | LL | fn bar() { - | ^ + | - unclosed delimiter +LL | let x = foo(); //~ ERROR cannot find function `foo` in this scope +LL | ) //~ ERROR incorrect close delimiter: `)` + | ^ incorrect close delimiter error: unexpected token: `;` --> $DIR/parser-recovery-2.rs:22:15 diff --git a/src/test/ui/resolve/token-error-correct-2.stderr b/src/test/ui/resolve/token-error-correct-2.stderr index 7abc1ba4781..fcd4b4888b0 100644 --- a/src/test/ui/resolve/token-error-correct-2.stderr +++ b/src/test/ui/resolve/token-error-correct-2.stderr @@ -1,14 +1,11 @@ error: incorrect close delimiter: `)` --> $DIR/token-error-correct-2.rs:16:5 | -LL | ) //~ ERROR: incorrect close delimiter: `)` - | ^ - | -note: unclosed delimiter - --> $DIR/token-error-correct-2.rs:14:12 - | LL | if foo { - | ^ + | - unclosed delimiter +LL | //~^ ERROR: cannot find value `foo` +LL | ) //~ ERROR: incorrect close delimiter: `)` + | ^ incorrect close delimiter error[E0425]: cannot find value `foo` in this scope --> $DIR/token-error-correct-2.rs:14:8 diff --git a/src/test/ui/resolve/token-error-correct-3.stderr b/src/test/ui/resolve/token-error-correct-3.stderr index 24186d94acc..a546c2704d9 100644 --- a/src/test/ui/resolve/token-error-correct-3.stderr +++ b/src/test/ui/resolve/token-error-correct-3.stderr @@ -1,14 +1,11 @@ error: incorrect close delimiter: `}` --> $DIR/token-error-correct-3.rs:30:9 | -LL | } else { //~ ERROR: incorrect close delimiter: `}` - | ^ - | -note: unclosed delimiter - --> $DIR/token-error-correct-3.rs:24:21 - | LL | callback(path.as_ref(); //~ ERROR expected one of - | ^ + | - unclosed delimiter +... +LL | } else { //~ ERROR: incorrect close delimiter: `}` + | ^ incorrect close delimiter error: expected one of `)`, `,`, `.`, `?`, or an operator, found `;` --> $DIR/token-error-correct-3.rs:24:35 diff --git a/src/test/ui/resolve/token-error-correct.stderr b/src/test/ui/resolve/token-error-correct.stderr index c6d32c6726e..bae57dd77c8 100644 --- a/src/test/ui/resolve/token-error-correct.stderr +++ b/src/test/ui/resolve/token-error-correct.stderr @@ -1,26 +1,20 @@ error: incorrect close delimiter: `}` --> $DIR/token-error-correct.rs:16:1 | -LL | } - | ^ - | -note: unclosed delimiter - --> $DIR/token-error-correct.rs:14:12 - | LL | foo(bar(; - | ^ + | - unclosed delimiter +LL | //~^ ERROR: expected expression, found `;` +LL | } + | ^ incorrect close delimiter error: incorrect close delimiter: `}` --> $DIR/token-error-correct.rs:16:1 | -LL | } - | ^ - | -note: unclosed delimiter - --> $DIR/token-error-correct.rs:14:8 - | LL | foo(bar(; - | ^ + | - unclosed delimiter +LL | //~^ ERROR: expected expression, found `;` +LL | } + | ^ incorrect close delimiter error: expected expression, found `;` --> $DIR/token-error-correct.rs:14:13 diff --git a/src/test/ui/token/issue-10636-2.stderr b/src/test/ui/token/issue-10636-2.stderr index 6c0053f2f85..634191bb5ef 100644 --- a/src/test/ui/token/issue-10636-2.stderr +++ b/src/test/ui/token/issue-10636-2.stderr @@ -1,14 +1,11 @@ error: incorrect close delimiter: `}` --> $DIR/issue-10636-2.rs:18:1 | -LL | } //~ ERROR: incorrect close delimiter - | ^ - | -note: unclosed delimiter - --> $DIR/issue-10636-2.rs:15:15 - | LL | option.map(|some| 42; - | ^ + | - unclosed delimiter +... +LL | } //~ ERROR: incorrect close delimiter + | ^ incorrect close delimiter error: expected one of `)`, `,`, `.`, `?`, or an operator, found `;` --> $DIR/issue-10636-2.rs:15:25 -- cgit 1.4.1-3-g733a5 From 1b5e29ae6f5f330c01cfe47c3fab5a75e5ddbfa2 Mon Sep 17 00:00:00 2001 From: Esteban Küber Date: Wed, 15 Aug 2018 14:26:03 -0700 Subject: Do not emit "incorrect close delimiter" twice in the same place --- src/libsyntax/parse/lexer/mod.rs | 2 ++ src/libsyntax/parse/lexer/tokentrees.rs | 28 ++++++++++++++++---------- src/test/ui/resolve/token-error-correct.rs | 1 - src/test/ui/resolve/token-error-correct.stderr | 11 +--------- 4 files changed, 20 insertions(+), 22 deletions(-) (limited to 'src/libsyntax') diff --git a/src/libsyntax/parse/lexer/mod.rs b/src/libsyntax/parse/lexer/mod.rs index f9b9e95ead1..ffa6f65dc02 100644 --- a/src/libsyntax/parse/lexer/mod.rs +++ b/src/libsyntax/parse/lexer/mod.rs @@ -67,6 +67,7 @@ pub struct StringReader<'a> { span_src_raw: Span, open_braces: Vec<(token::DelimToken, Span)>, crate override_span: Option, + last_unclosed_found_span: Option, } impl<'a> StringReader<'a> { @@ -195,6 +196,7 @@ impl<'a> StringReader<'a> { span_src_raw: syntax_pos::DUMMY_SP, open_braces: Vec::new(), override_span, + last_unclosed_found_span: None, } } diff --git a/src/libsyntax/parse/lexer/tokentrees.rs b/src/libsyntax/parse/lexer/tokentrees.rs index c578108a3fc..af8ac3895c2 100644 --- a/src/libsyntax/parse/lexer/tokentrees.rs +++ b/src/libsyntax/parse/lexer/tokentrees.rs @@ -77,17 +77,23 @@ impl<'a> StringReader<'a> { // Incorrect delimiter. token::CloseDelim(other) => { let token_str = token_to_string(&self.token); - let msg = format!("incorrect close delimiter: `{}`", token_str); - let mut err = self.sess.span_diagnostic.struct_span_err(self.span, &msg); - err.span_label(self.span, "incorrect close delimiter"); - // This is a conservative error: only report the last unclosed delimiter. - // The previous unclosed delimiters could actually be closed! The parser - // just hasn't gotten to them yet. - if let Some(&(_, sp)) = self.open_braces.last() { - err.span_label(sp, "unclosed delimiter"); - }; - err.emit(); - + if self.last_unclosed_found_span != Some(self.span) { + // do not complain about the same unclosed delimiter multiple times + self.last_unclosed_found_span = Some(self.span); + let msg = format!("incorrect close delimiter: `{}`", token_str); + let mut err = self.sess.span_diagnostic.struct_span_err( + self.span, + &msg, + ); + err.span_label(self.span, "incorrect close delimiter"); + // This is a conservative error: only report the last unclosed + // delimiter. The previous unclosed delimiters could actually be + // closed! The parser just hasn't gotten to them yet. + if let Some(&(_, sp)) = self.open_braces.last() { + err.span_label(sp, "unclosed delimiter"); + }; + err.emit(); + } self.open_braces.pop().unwrap(); // If the incorrect delimiter matches an earlier opening diff --git a/src/test/ui/resolve/token-error-correct.rs b/src/test/ui/resolve/token-error-correct.rs index c88f823839d..39c664e270c 100644 --- a/src/test/ui/resolve/token-error-correct.rs +++ b/src/test/ui/resolve/token-error-correct.rs @@ -15,4 +15,3 @@ fn main() { //~^ ERROR: expected expression, found `;` } //~^ ERROR: incorrect close delimiter: `}` -//~| ERROR: incorrect close delimiter: `}` diff --git a/src/test/ui/resolve/token-error-correct.stderr b/src/test/ui/resolve/token-error-correct.stderr index bae57dd77c8..1e246b6f085 100644 --- a/src/test/ui/resolve/token-error-correct.stderr +++ b/src/test/ui/resolve/token-error-correct.stderr @@ -7,20 +7,11 @@ LL | //~^ ERROR: expected expression, found `;` LL | } | ^ incorrect close delimiter -error: incorrect close delimiter: `}` - --> $DIR/token-error-correct.rs:16:1 - | -LL | foo(bar(; - | - unclosed delimiter -LL | //~^ ERROR: expected expression, found `;` -LL | } - | ^ incorrect close delimiter - error: expected expression, found `;` --> $DIR/token-error-correct.rs:14:13 | LL | foo(bar(; | ^ expected expression -error: aborting due to 3 previous errors +error: aborting due to 2 previous errors -- cgit 1.4.1-3-g733a5