about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMazdak Farrokhzad <twingoow@gmail.com>2019-09-21 23:09:17 +0200
committerMazdak Farrokhzad <twingoow@gmail.com>2019-10-24 00:32:03 +0200
commit1935ba658c576f14397c2c7a26a6642cf08f26a6 (patch)
tree973785017a0e9e98a93ca1335720c0e9f9570d24
parent665a876e307933c6480a6c55a3e38e88937aff2c (diff)
downloadrust-1935ba658c576f14397c2c7a26a6642cf08f26a6.tar.gz
rust-1935ba658c576f14397c2c7a26a6642cf08f26a6.zip
pre-expansion gate try_blocks
-rw-r--r--src/libsyntax/feature_gate/check.rs4
-rw-r--r--src/libsyntax/parse/parser/expr.rs4
-rw-r--r--src/libsyntax/sess.rs2
-rw-r--r--src/test/ui/feature-gates/feature-gate-try_blocks.rs7
-rw-r--r--src/test/ui/feature-gates/feature-gate-try_blocks.stderr4
5 files changed, 13 insertions, 8 deletions
diff --git a/src/libsyntax/feature_gate/check.rs b/src/libsyntax/feature_gate/check.rs
index 0b4289b139f..31fae7863fb 100644
--- a/src/libsyntax/feature_gate/check.rs
+++ b/src/libsyntax/feature_gate/check.rs
@@ -495,9 +495,6 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> {
                                        "type ascription is experimental");
                 }
             }
-            ast::ExprKind::TryBlock(_) => {
-                gate_feature_post!(&self, try_blocks, e.span, "`try` expression is experimental");
-            }
             ast::ExprKind::Block(_, opt_label) => {
                 if let Some(label) = opt_label {
                     gate_feature_post!(&self, label_break_value, label.ident.span,
@@ -811,6 +808,7 @@ pub fn check_crate(krate: &ast::Crate,
     gate_all!(decl_macro, "`macro` is experimental");
     gate_all!(box_patterns, "box pattern syntax is experimental");
     gate_all!(exclusive_range_pattern, "exclusive range pattern syntax is experimental");
+    gate_all!(try_blocks, "`try` blocks are unstable");
 
     visit::walk_crate(&mut visitor, krate);
 }
diff --git a/src/libsyntax/parse/parser/expr.rs b/src/libsyntax/parse/parser/expr.rs
index 67a530ec683..2e34422b918 100644
--- a/src/libsyntax/parse/parser/expr.rs
+++ b/src/libsyntax/parse/parser/expr.rs
@@ -1646,7 +1646,9 @@ impl<'a> Parser<'a> {
             error.emit();
             Err(error)
         } else {
-            Ok(self.mk_expr(span_lo.to(body.span), ExprKind::TryBlock(body), attrs))
+            let span = span_lo.to(body.span);
+            self.sess.gated_spans.try_blocks.borrow_mut().push(span);
+            Ok(self.mk_expr(span, ExprKind::TryBlock(body), attrs))
         }
     }
 
diff --git a/src/libsyntax/sess.rs b/src/libsyntax/sess.rs
index 09331924c60..3582d897272 100644
--- a/src/libsyntax/sess.rs
+++ b/src/libsyntax/sess.rs
@@ -44,6 +44,8 @@ crate struct GatedSpans {
     pub box_patterns: Lock<Vec<Span>>,
     /// Spans collected for gating `exclusive_range_pattern`, e.g. `0..2`.
     pub exclusive_range_pattern: Lock<Vec<Span>>,
+    /// Spans collected for gating `try_blocks`, e.g. `try { a? + b? }`.
+    pub try_blocks: Lock<Vec<Span>>,
 }
 
 /// Info about a parsing session.
diff --git a/src/test/ui/feature-gates/feature-gate-try_blocks.rs b/src/test/ui/feature-gates/feature-gate-try_blocks.rs
index 06cadd82c07..b451ba84a15 100644
--- a/src/test/ui/feature-gates/feature-gate-try_blocks.rs
+++ b/src/test/ui/feature-gates/feature-gate-try_blocks.rs
@@ -1,9 +1,12 @@
 // compile-flags: --edition 2018
 
-pub fn main() {
-    let try_result: Option<_> = try { //~ ERROR `try` expression is experimental
+#[cfg(FALSE)]
+fn foo() {
+    let try_result: Option<_> = try { //~ ERROR `try` blocks are unstable
         let x = 5;
         x
     };
     assert_eq!(try_result, Some(5));
 }
+
+fn main() {}
diff --git a/src/test/ui/feature-gates/feature-gate-try_blocks.stderr b/src/test/ui/feature-gates/feature-gate-try_blocks.stderr
index 565f3610a2e..44a7d9b9043 100644
--- a/src/test/ui/feature-gates/feature-gate-try_blocks.stderr
+++ b/src/test/ui/feature-gates/feature-gate-try_blocks.stderr
@@ -1,5 +1,5 @@
-error[E0658]: `try` expression is experimental
-  --> $DIR/feature-gate-try_blocks.rs:4:33
+error[E0658]: `try` blocks are unstable
+  --> $DIR/feature-gate-try_blocks.rs:5:33
    |
 LL |       let try_result: Option<_> = try {
    |  _________________________________^