From 1935ba658c576f14397c2c7a26a6642cf08f26a6 Mon Sep 17 00:00:00 2001 From: Mazdak Farrokhzad Date: Sat, 21 Sep 2019 23:09:17 +0200 Subject: [PATCH] pre-expansion gate try_blocks --- src/libsyntax/feature_gate/check.rs | 4 +--- src/libsyntax/parse/parser/expr.rs | 4 +++- src/libsyntax/sess.rs | 2 ++ src/test/ui/feature-gates/feature-gate-try_blocks.rs | 7 +++++-- src/test/ui/feature-gates/feature-gate-try_blocks.stderr | 4 ++-- 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>, /// Spans collected for gating `exclusive_range_pattern`, e.g. `0..2`. pub exclusive_range_pattern: Lock>, + /// Spans collected for gating `try_blocks`, e.g. `try { a? + b? }`. + pub try_blocks: Lock>, } /// 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 { | _________________________________^