about summary refs log tree commit diff
diff options
context:
space:
mode:
authorCatherine Flores <catherine.3.flores@gmail.com>2023-07-25 18:37:56 +0000
committerCatherine Flores <catherine.3.flores@gmail.com>2023-07-25 18:37:56 +0000
commitfaa73953c07530bc02c9a89e4d719beb3f4a376e (patch)
treeee2fa372fe64c445ef47977be9488ad0b9c5ce99
parent16481807f5b106a6dcc627075fbdcd14add9495d (diff)
downloadrust-faa73953c07530bc02c9a89e4d719beb3f4a376e.tar.gz
rust-faa73953c07530bc02c9a89e4d719beb3f4a376e.zip
Remove unnecessary `maybe_ternary_lo` field
-rw-r--r--compiler/rustc_parse/src/parser/diagnostics.rs10
-rw-r--r--compiler/rustc_parse/src/parser/mod.rs9
-rw-r--r--compiler/rustc_parse/src/parser/stmt.rs4
-rw-r--r--tests/ui/parser/ternary_operator.rs41
-rw-r--r--tests/ui/parser/ternary_operator.stderr28
5 files changed, 55 insertions, 37 deletions
diff --git a/compiler/rustc_parse/src/parser/diagnostics.rs b/compiler/rustc_parse/src/parser/diagnostics.rs
index 8f422d90175..ef5581e1efe 100644
--- a/compiler/rustc_parse/src/parser/diagnostics.rs
+++ b/compiler/rustc_parse/src/parser/diagnostics.rs
@@ -501,10 +501,8 @@ impl<'a> Parser<'a> {
         // Special-case "expected `;`" errors
         if expected.contains(&TokenType::Token(token::Semi)) {
             if self.prev_token.kind == token::Question {
-                self.maybe_ternary_lo = Some(self.prev_token.span.lo());
-                let result = self.maybe_recover_from_ternary_operator().map(|_| true);
-                self.maybe_ternary_lo = None;
-                return result;
+                self.maybe_recover_from_ternary_operator();
+                return Ok(true);
             }
 
             if self.token.span == DUMMY_SP || self.prev_token.span == DUMMY_SP {
@@ -1339,7 +1337,7 @@ impl<'a> Parser<'a> {
 
     /// Rust has no ternary operator (`cond ? then : else`). Parse it and try
     /// to recover from it if `then` and `else` are valid expressions.
-    pub(super) fn maybe_recover_from_ternary_operator(&mut self) -> PResult<'a, ()> {
+    pub(super) fn maybe_recover_from_ternary_operator(&mut self) {
         let snapshot = self.create_snapshot_for_diagnostic();
         let lo = self.prev_token.span.lo();
 
@@ -1368,8 +1366,6 @@ impl<'a> Parser<'a> {
         } else {
             self.restore_snapshot(snapshot);
         };
-
-        Ok(())
     }
 
     pub(super) fn maybe_recover_from_bad_type_plus(&mut self, ty: &Ty) -> PResult<'a, ()> {
diff --git a/compiler/rustc_parse/src/parser/mod.rs b/compiler/rustc_parse/src/parser/mod.rs
index 20515b36fa1..2e1a61e634e 100644
--- a/compiler/rustc_parse/src/parser/mod.rs
+++ b/compiler/rustc_parse/src/parser/mod.rs
@@ -37,7 +37,6 @@ use rustc_errors::{
 use rustc_session::parse::ParseSess;
 use rustc_span::source_map::{Span, DUMMY_SP};
 use rustc_span::symbol::{kw, sym, Ident, Symbol};
-use rustc_span::BytePos;
 use std::ops::Range;
 use std::{cmp, mem, slice};
 use thin_vec::ThinVec;
@@ -158,17 +157,12 @@ pub struct Parser<'a> {
     /// Whether the parser is allowed to do recovery.
     /// This is disabled when parsing macro arguments, see #103534
     pub recovery: Recovery,
-    /// The low part of a ternary operator (`cond ? then : else`).
-    /// FIXME(Centri3): This is currently only used so that type ascription is
-    /// not mentioned in the error. Once the error in `stmt.rs` is removed, this
-    /// can be removed.
-    maybe_ternary_lo: Option<BytePos>,
 }
 
 // This type is used a lot, e.g. it's cloned when matching many declarative macro rules with nonterminals. Make sure
 // it doesn't unintentionally get bigger.
 #[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))]
-rustc_data_structures::static_assert_size!(Parser<'_>, 280);
+rustc_data_structures::static_assert_size!(Parser<'_>, 272);
 
 /// Stores span information about a closure.
 #[derive(Clone)]
@@ -481,7 +475,6 @@ impl<'a> Parser<'a> {
             },
             current_closure: None,
             recovery: Recovery::Allowed,
-            maybe_ternary_lo: None,
         };
 
         // Make parser point to the first token.
diff --git a/compiler/rustc_parse/src/parser/stmt.rs b/compiler/rustc_parse/src/parser/stmt.rs
index 5a7f3aa53dc..9fcf51a04ec 100644
--- a/compiler/rustc_parse/src/parser/stmt.rs
+++ b/compiler/rustc_parse/src/parser/stmt.rs
@@ -576,9 +576,7 @@ impl<'a> Parser<'a> {
                                 Applicability::MaybeIncorrect,
                             );
                         }
-                        if self.sess.unstable_features.is_nightly_build()
-                            && self.maybe_ternary_lo.is_none()
-                        {
+                        if self.sess.unstable_features.is_nightly_build() {
                             // FIXME(Nilstrieb): Remove this again after a few months.
                             err.note("type ascription syntax has been removed, see issue #101728 <https://github.com/rust-lang/rust/issues/101728>");
                         }
diff --git a/tests/ui/parser/ternary_operator.rs b/tests/ui/parser/ternary_operator.rs
index c41a20f481f..23d537e77f7 100644
--- a/tests/ui/parser/ternary_operator.rs
+++ b/tests/ui/parser/ternary_operator.rs
@@ -1,4 +1,7 @@
-fn a() {
+// A good chunk of these errors aren't shown to the user, but are still
+// required in the test for it to pass.
+
+fn a() { //~ NOTE this function should return `Result` or `Option` to accept `?`
     let x = 5 > 2 ? true : false;
     //~^ ERROR Rust has no ternary operator
     //~| HELP use an `if-else` expression instead
@@ -6,9 +9,15 @@ fn a() {
     //~| HELP the trait `Try` is not implemented for `{integer}`
     //~| ERROR the `?` operator can only be used in a function that returns `Result` or `Option` (or another type that implements `FromResidual`) [E0277]
     //~| HELP the trait `FromResidual<_>` is not implemented for `()`
+    //~| NOTE in this expansion of desugaring of operator `?`
+    //~| NOTE the `?` operator cannot be applied to type `{integer}`
+    //~| NOTE in this expansion of desugaring of operator `?`
+    //~| NOTE in this expansion of desugaring of operator `?`
+    //~| NOTE cannot use the `?` operator in a function that returns `()`
+    //~| NOTE in this expansion of desugaring of operator `?`
 }
 
-fn b() {
+fn b() { //~ NOTE this function should return `Result` or `Option` to accept `?`
     let x = 5 > 2 ? { true } : { false };
     //~^ ERROR Rust has no ternary operator
     //~| HELP use an `if-else` expression instead
@@ -16,9 +25,15 @@ fn b() {
     //~| HELP the trait `Try` is not implemented for `{integer}`
     //~| ERROR the `?` operator can only be used in a function that returns `Result` or `Option` (or another type that implements `FromResidual`) [E0277]
     //~| HELP the trait `FromResidual<_>` is not implemented for `()`
+    //~| NOTE in this expansion of desugaring of operator `?`
+    //~| NOTE the `?` operator cannot be applied to type `{integer}`
+    //~| NOTE in this expansion of desugaring of operator `?`
+    //~| NOTE in this expansion of desugaring of operator `?`
+    //~| NOTE cannot use the `?` operator in a function that returns `()`
+    //~| NOTE in this expansion of desugaring of operator `?`
 }
 
-fn c() {
+fn c() { //~ NOTE this function should return `Result` or `Option` to accept `?`
     let x = 5 > 2 ? f32::MAX : f32::MIN;
     //~^ ERROR Rust has no ternary operator
     //~| HELP use an `if-else` expression instead
@@ -26,15 +41,29 @@ fn c() {
     //~| HELP the trait `Try` is not implemented for `{integer}`
     //~| ERROR the `?` operator can only be used in a function that returns `Result` or `Option` (or another type that implements `FromResidual`) [E0277]
     //~| HELP the trait `FromResidual<_>` is not implemented for `()`
+    //~| NOTE in this expansion of desugaring of operator `?`
+    //~| NOTE the `?` operator cannot be applied to type `{integer}`
+    //~| NOTE in this expansion of desugaring of operator `?`
+    //~| NOTE in this expansion of desugaring of operator `?`
+    //~| NOTE cannot use the `?` operator in a function that returns `()`
+    //~| NOTE in this expansion of desugaring of operator `?`
 }
 
-fn main() {
+fn main() { //~ NOTE this function should return `Result` or `Option` to accept `?`
     let x = 5 > 2 ? { let x = vec![]: Vec<u16>; x } : { false };
     //~^ ERROR Rust has no ternary operator
     //~| HELP use an `if-else` expression instead
-    //~| expected one of `.`, `;`, `?`, `else`, or an operator, found `:`
-        //~| ERROR the `?` operator can only be applied to values that implement `Try` [E0277]
+    //~| ERROR expected one of `.`, `;`, `?`, `else`, or an operator, found `:`
+    //~| NOTE expected one of `.`, `;`, `?`, `else`, or an operator
+    //~| ERROR the `?` operator can only be applied to values that implement `Try` [E0277]
     //~| HELP the trait `Try` is not implemented for `{integer}`
     //~| ERROR the `?` operator can only be used in a function that returns `Result` or `Option` (or another type that implements `FromResidual`) [E0277]
     //~| HELP the trait `FromResidual<_>` is not implemented for `()`
+    //~| NOTE type ascription syntax has been removed, see issue #101728 <https://github.com/rust-lang/rust/issues/101728>
+    //~| NOTE in this expansion of desugaring of operator `?`
+    //~| NOTE the `?` operator cannot be applied to type `{integer}`
+    //~| NOTE in this expansion of desugaring of operator `?`
+    //~| NOTE in this expansion of desugaring of operator `?`
+    //~| NOTE cannot use the `?` operator in a function that returns `()`
+    //~| NOTE in this expansion of desugaring of operator `?`
 }
diff --git a/tests/ui/parser/ternary_operator.stderr b/tests/ui/parser/ternary_operator.stderr
index bf08666c8a4..af9565bbead 100644
--- a/tests/ui/parser/ternary_operator.stderr
+++ b/tests/ui/parser/ternary_operator.stderr
@@ -1,5 +1,5 @@
 error: Rust has no ternary operator
-  --> $DIR/ternary_operator.rs:2:19
+  --> $DIR/ternary_operator.rs:5:19
    |
 LL |     let x = 5 > 2 ? true : false;
    |                   ^^^^^^^^^^^^^^^
@@ -7,7 +7,7 @@ LL |     let x = 5 > 2 ? true : false;
    = help: use an `if-else` expression instead
 
 error: Rust has no ternary operator
-  --> $DIR/ternary_operator.rs:12:19
+  --> $DIR/ternary_operator.rs:21:19
    |
 LL |     let x = 5 > 2 ? { true } : { false };
    |                   ^^^^^^^^^^^^^^^^^^^^^^^
@@ -15,7 +15,7 @@ LL |     let x = 5 > 2 ? { true } : { false };
    = help: use an `if-else` expression instead
 
 error: Rust has no ternary operator
-  --> $DIR/ternary_operator.rs:22:19
+  --> $DIR/ternary_operator.rs:37:19
    |
 LL |     let x = 5 > 2 ? f32::MAX : f32::MIN;
    |                   ^^^^^^^^^^^^^^^^^^^^^^
@@ -23,13 +23,15 @@ LL |     let x = 5 > 2 ? f32::MAX : f32::MIN;
    = help: use an `if-else` expression instead
 
 error: expected one of `.`, `;`, `?`, `else`, or an operator, found `:`
-  --> $DIR/ternary_operator.rs:32:37
+  --> $DIR/ternary_operator.rs:53:37
    |
 LL |     let x = 5 > 2 ? { let x = vec![]: Vec<u16>; x } : { false };
    |                                     ^ expected one of `.`, `;`, `?`, `else`, or an operator
+   |
+   = note: type ascription syntax has been removed, see issue #101728 <https://github.com/rust-lang/rust/issues/101728>
 
 error: Rust has no ternary operator
-  --> $DIR/ternary_operator.rs:32:19
+  --> $DIR/ternary_operator.rs:53:19
    |
 LL |     let x = 5 > 2 ? { let x = vec![]: Vec<u16>; x } : { false };
    |                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -37,7 +39,7 @@ LL |     let x = 5 > 2 ? { let x = vec![]: Vec<u16>; x } : { false };
    = help: use an `if-else` expression instead
 
 error[E0277]: the `?` operator can only be applied to values that implement `Try`
-  --> $DIR/ternary_operator.rs:2:17
+  --> $DIR/ternary_operator.rs:5:17
    |
 LL |     let x = 5 > 2 ? true : false;
    |                 ^^^ the `?` operator cannot be applied to type `{integer}`
@@ -45,7 +47,7 @@ LL |     let x = 5 > 2 ? true : false;
    = help: the trait `Try` is not implemented for `{integer}`
 
 error[E0277]: the `?` operator can only be used in a function that returns `Result` or `Option` (or another type that implements `FromResidual`)
-  --> $DIR/ternary_operator.rs:2:19
+  --> $DIR/ternary_operator.rs:5:19
    |
 LL | fn a() {
    | ------ this function should return `Result` or `Option` to accept `?`
@@ -55,7 +57,7 @@ LL |     let x = 5 > 2 ? true : false;
    = help: the trait `FromResidual<_>` is not implemented for `()`
 
 error[E0277]: the `?` operator can only be applied to values that implement `Try`
-  --> $DIR/ternary_operator.rs:12:17
+  --> $DIR/ternary_operator.rs:21:17
    |
 LL |     let x = 5 > 2 ? { true } : { false };
    |                 ^^^ the `?` operator cannot be applied to type `{integer}`
@@ -63,7 +65,7 @@ LL |     let x = 5 > 2 ? { true } : { false };
    = help: the trait `Try` is not implemented for `{integer}`
 
 error[E0277]: the `?` operator can only be used in a function that returns `Result` or `Option` (or another type that implements `FromResidual`)
-  --> $DIR/ternary_operator.rs:12:19
+  --> $DIR/ternary_operator.rs:21:19
    |
 LL | fn b() {
    | ------ this function should return `Result` or `Option` to accept `?`
@@ -73,7 +75,7 @@ LL |     let x = 5 > 2 ? { true } : { false };
    = help: the trait `FromResidual<_>` is not implemented for `()`
 
 error[E0277]: the `?` operator can only be applied to values that implement `Try`
-  --> $DIR/ternary_operator.rs:22:17
+  --> $DIR/ternary_operator.rs:37:17
    |
 LL |     let x = 5 > 2 ? f32::MAX : f32::MIN;
    |                 ^^^ the `?` operator cannot be applied to type `{integer}`
@@ -81,7 +83,7 @@ LL |     let x = 5 > 2 ? f32::MAX : f32::MIN;
    = help: the trait `Try` is not implemented for `{integer}`
 
 error[E0277]: the `?` operator can only be used in a function that returns `Result` or `Option` (or another type that implements `FromResidual`)
-  --> $DIR/ternary_operator.rs:22:19
+  --> $DIR/ternary_operator.rs:37:19
    |
 LL | fn c() {
    | ------ this function should return `Result` or `Option` to accept `?`
@@ -91,7 +93,7 @@ LL |     let x = 5 > 2 ? f32::MAX : f32::MIN;
    = help: the trait `FromResidual<_>` is not implemented for `()`
 
 error[E0277]: the `?` operator can only be applied to values that implement `Try`
-  --> $DIR/ternary_operator.rs:32:17
+  --> $DIR/ternary_operator.rs:53:17
    |
 LL |     let x = 5 > 2 ? { let x = vec![]: Vec<u16>; x } : { false };
    |                 ^^^ the `?` operator cannot be applied to type `{integer}`
@@ -99,7 +101,7 @@ LL |     let x = 5 > 2 ? { let x = vec![]: Vec<u16>; x } : { false };
    = help: the trait `Try` is not implemented for `{integer}`
 
 error[E0277]: the `?` operator can only be used in a function that returns `Result` or `Option` (or another type that implements `FromResidual`)
-  --> $DIR/ternary_operator.rs:32:19
+  --> $DIR/ternary_operator.rs:53:19
    |
 LL | fn main() {
    | --------- this function should return `Result` or `Option` to accept `?`