about summary refs log tree commit diff
diff options
context:
space:
mode:
authorScott McMurray <scottmcm@users.noreply.github.com>2018-07-21 20:59:44 -0700
committerScott McMurray <scottmcm@users.noreply.github.com>2018-08-19 16:53:05 -0700
commit9e64ce179903e610197e1d201a53471e9feb69f2 (patch)
tree54c5857eb12273f67b7b92d03dff6cf3f5cfb4e2
parent1c906093f93ca55994bded24fa0f9c99b8d1a681 (diff)
downloadrust-9e64ce179903e610197e1d201a53471e9feb69f2.tar.gz
rust-9e64ce179903e610197e1d201a53471e9feb69f2.zip
Parse try blocks with the try keyword instead of do catch placeholder
-rw-r--r--src/librustc_mir/borrow_check/nll/mod.rs4
-rw-r--r--src/librustc_mir/lib.rs9
-rw-r--r--src/librustc_mir/util/pretty.rs4
-rw-r--r--src/librustc_typeck/check/mod.rs2
-rw-r--r--src/libsyntax/feature_gate.rs4
-rw-r--r--src/libsyntax/parse/parser.rs22
-rw-r--r--src/libsyntax/print/pprust.rs2
-rw-r--r--src/libsyntax_pos/hygiene.rs2
-rw-r--r--src/test/compile-fail/try-block-bad-lifetime.rs (renamed from src/test/ui/catch/catch-bad-lifetime.rs)12
-rw-r--r--src/test/compile-fail/try-block-bad-type.rs (renamed from src/test/ui/catch/catch-bad-type.rs)12
-rw-r--r--src/test/compile-fail/try-block-in-match.rs (renamed from src/test/ui/catch/catch-in-match.rs)4
-rw-r--r--src/test/compile-fail/try-block-in-while.rs (renamed from src/test/ui/catch/catch-in-while.rs)4
-rw-r--r--src/test/compile-fail/try-block-maybe-bad-lifetime.rs (renamed from src/test/ui/catch/catch-maybe-bad-lifetime.rs)10
-rw-r--r--src/test/compile-fail/try-block-opt-init.rs (renamed from src/test/ui/catch/catch-opt-init.rs)4
-rw-r--r--src/test/run-pass/issue-45124.rs4
-rw-r--r--src/test/run-pass/try-block.rs (renamed from src/test/run-pass/catch-expr.rs)20
-rw-r--r--src/test/ui/catch/catch-bad-lifetime.nll.stderr39
-rw-r--r--src/test/ui/catch/catch-bad-lifetime.stderr44
-rw-r--r--src/test/ui/catch/catch-bad-type.stderr52
-rw-r--r--src/test/ui/catch/catch-in-match.stderr8
-rw-r--r--src/test/ui/catch/catch-in-while.stderr8
-rw-r--r--src/test/ui/catch/catch-maybe-bad-lifetime.nll.stderr14
-rw-r--r--src/test/ui/catch/catch-maybe-bad-lifetime.stderr33
-rw-r--r--src/test/ui/catch/catch-opt-init.nll.stderr11
-rw-r--r--src/test/ui/catch/catch-opt-init.stderr9
-rw-r--r--src/test/ui/feature-gates/feature-gate-catch_expr.rs6
-rw-r--r--src/test/ui/feature-gates/feature-gate-catch_expr.stderr8
-rw-r--r--src/test/ui/try-block-in-edition2015.rs20
-rw-r--r--src/test/ui/try-block-in-edition2015.stderr18
-rw-r--r--src/test/ui/try-block-type-error.rs (renamed from src/test/ui/catch/catch-block-type-error.rs)6
-rw-r--r--src/test/ui/try-block-type-error.stderr (renamed from src/test/ui/catch/catch-block-type-error.stderr)4
31 files changed, 123 insertions, 276 deletions
diff --git a/src/librustc_mir/borrow_check/nll/mod.rs b/src/librustc_mir/borrow_check/nll/mod.rs
index f54d80d5f4f..40df78d6bfd 100644
--- a/src/librustc_mir/borrow_check/nll/mod.rs
+++ b/src/librustc_mir/borrow_check/nll/mod.rs
@@ -312,14 +312,14 @@ fn dump_mir_results<'a, 'gcx, 'tcx>(
     );
 
     // Also dump the inference graph constraints as a graphviz file.
-    let _: io::Result<()> = do catch {
+    let _: io::Result<()> = try_block! {
         let mut file =
             pretty::create_dump_file(infcx.tcx, "regioncx.all.dot", None, "nll", &0, source)?;
         regioncx.dump_graphviz_raw_constraints(&mut file)?;
     };
 
     // Also dump the inference graph constraints as a graphviz file.
-    let _: io::Result<()> = do catch {
+    let _: io::Result<()> = try_block! {
         let mut file =
             pretty::create_dump_file(infcx.tcx, "regioncx.scc.dot", None, "nll", &0, source)?;
         regioncx.dump_graphviz_scc_constraints(&mut file)?;
diff --git a/src/librustc_mir/lib.rs b/src/librustc_mir/lib.rs
index bda80ff562c..3858aae3d5c 100644
--- a/src/librustc_mir/lib.rs
+++ b/src/librustc_mir/lib.rs
@@ -21,7 +21,6 @@ Rust MIR: a lowered representation of Rust. Also: an experiment!
 #![feature(slice_sort_by_cached_key)]
 #![feature(box_patterns)]
 #![feature(box_syntax)]
-#![feature(catch_expr)]
 #![feature(crate_visibility_modifier)]
 #![feature(const_fn)]
 #![feature(core_intrinsics)]
@@ -61,6 +60,14 @@ extern crate rustc_apfloat;
 extern crate byteorder;
 extern crate core;
 
+// Once we can use edition 2018 in the compiler,
+// replace this with real try blocks.
+macro_rules! try_block {
+    ($($inside:tt)*) => (
+        (||{ ::std::ops::Try::from_ok({ $($inside)* }) })()
+    )
+}
+
 mod diagnostics;
 
 mod borrow_check;
diff --git a/src/librustc_mir/util/pretty.rs b/src/librustc_mir/util/pretty.rs
index 01ad85cf668..465dad35ae3 100644
--- a/src/librustc_mir/util/pretty.rs
+++ b/src/librustc_mir/util/pretty.rs
@@ -140,7 +140,7 @@ fn dump_matched_mir_node<'a, 'gcx, 'tcx, F>(
 ) where
     F: FnMut(PassWhere, &mut dyn Write) -> io::Result<()>,
 {
-    let _: io::Result<()> = do catch {
+    let _: io::Result<()> = try_block! {
         let mut file = create_dump_file(tcx, "mir", pass_num, pass_name, disambiguator, source)?;
         writeln!(file, "// MIR for `{}`", node_path)?;
         writeln!(file, "// source = {:?}", source)?;
@@ -156,7 +156,7 @@ fn dump_matched_mir_node<'a, 'gcx, 'tcx, F>(
     };
 
     if tcx.sess.opts.debugging_opts.dump_mir_graphviz {
-        let _: io::Result<()> = do catch {
+        let _: io::Result<()> = try_block! {
             let mut file =
                 create_dump_file(tcx, "dot", pass_num, pass_name, disambiguator, source)?;
             write_mir_fn_graphviz(tcx, source.def_id, mir, &mut file)?;
diff --git a/src/librustc_typeck/check/mod.rs b/src/librustc_typeck/check/mod.rs
index 27b427f7f89..89537634ad9 100644
--- a/src/librustc_typeck/check/mod.rs
+++ b/src/librustc_typeck/check/mod.rs
@@ -4461,7 +4461,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
         // In some cases, blocks have just one exit, but other blocks
         // can be targeted by multiple breaks. This can happen both
         // with labeled blocks as well as when we desugar
-        // a `do catch { ... }` expression.
+        // a `try { ... }` expression.
         //
         // Example 1:
         //
diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs
index 32769130940..f796c0e2e53 100644
--- a/src/libsyntax/feature_gate.rs
+++ b/src/libsyntax/feature_gate.rs
@@ -330,7 +330,7 @@ declare_features! (
     // `extern "x86-interrupt" fn()`
     (active, abi_x86_interrupt, "1.17.0", Some(40180), None),
 
-    // Allows the `catch {...}` expression
+    // Allows the `try {...}` expression
     (active, catch_expr, "1.17.0", Some(31436), None),
 
     // Used to preserve symbols (see llvm.used)
@@ -1735,7 +1735,7 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> {
                                   "yield syntax is experimental");
             }
             ast::ExprKind::TryBlock(_) => {
-                gate_feature_post!(&self, catch_expr, e.span, "`catch` expression is experimental");
+                gate_feature_post!(&self, catch_expr, e.span, "`try` expression is experimental");
             }
             ast::ExprKind::IfLet(ref pats, ..) | ast::ExprKind::WhileLet(ref pats, ..) => {
                 if pats.len() > 1 {
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs
index fdb9f80b7c6..2b0cfd14a3d 100644
--- a/src/libsyntax/parse/parser.rs
+++ b/src/libsyntax/parse/parser.rs
@@ -2386,11 +2386,10 @@ impl<'a> Parser<'a> {
                         BlockCheckMode::Unsafe(ast::UserProvided),
                         attrs);
                 }
-                if self.is_catch_expr() {
+                if self.is_try_block() {
                     let lo = self.span;
-                    assert!(self.eat_keyword(keywords::Do));
-                    assert!(self.eat_keyword(keywords::Catch));
-                    return self.parse_catch_expr(lo, attrs);
+                    assert!(self.eat_keyword(keywords::Try));
+                    return self.parse_try_block(lo, attrs);
                 }
                 if self.eat_keyword(keywords::Return) {
                     if self.token.can_begin_expr() {
@@ -3452,8 +3451,8 @@ impl<'a> Parser<'a> {
             ExprKind::Async(capture_clause, ast::DUMMY_NODE_ID, body), attrs))
     }
 
-    /// Parse a `do catch {...}` expression (`do catch` token already eaten)
-    fn parse_catch_expr(&mut self, span_lo: Span, mut attrs: ThinVec<Attribute>)
+    /// Parse a `try {...}` expression (`try` token already eaten)
+    fn parse_try_block(&mut self, span_lo: Span, mut attrs: ThinVec<Attribute>)
         -> PResult<'a, P<Expr>>
     {
         let (iattrs, body) = self.parse_inner_attrs_and_block()?;
@@ -4407,12 +4406,13 @@ impl<'a> Parser<'a> {
         )
     }
 
-    fn is_catch_expr(&mut self) -> bool {
-        self.token.is_keyword(keywords::Do) &&
-        self.look_ahead(1, |t| t.is_keyword(keywords::Catch)) &&
-        self.look_ahead(2, |t| *t == token::OpenDelim(token::Brace)) &&
+    fn is_try_block(&mut self) -> bool {
+        self.token.is_keyword(keywords::Try) &&
+        self.look_ahead(1, |t| *t == token::OpenDelim(token::Brace)) &&
 
-        // prevent `while catch {} {}`, `if catch {} {} else {}`, etc.
+        self.span.edition() >= Edition::Edition2018 &&
+
+        // prevent `while try {} {}`, `if try {} {} else {}`, etc.
         !self.restrictions.contains(Restrictions::NO_STRUCT_LITERAL)
     }
 
diff --git a/src/libsyntax/print/pprust.rs b/src/libsyntax/print/pprust.rs
index f8d01fee950..14e7b08172b 100644
--- a/src/libsyntax/print/pprust.rs
+++ b/src/libsyntax/print/pprust.rs
@@ -2380,7 +2380,7 @@ impl<'a> State<'a> {
                 self.s.word("?")?
             }
             ast::ExprKind::TryBlock(ref blk) => {
-                self.head("do catch")?;
+                self.head("try")?;
                 self.s.space()?;
                 self.print_block_with_attrs(blk, attrs)?
             }
diff --git a/src/libsyntax_pos/hygiene.rs b/src/libsyntax_pos/hygiene.rs
index 56901917450..364c640debb 100644
--- a/src/libsyntax_pos/hygiene.rs
+++ b/src/libsyntax_pos/hygiene.rs
@@ -609,7 +609,7 @@ impl CompilerDesugaringKind {
         Symbol::intern(match self {
             CompilerDesugaringKind::Async => "async",
             CompilerDesugaringKind::QuestionMark => "?",
-            CompilerDesugaringKind::TryBlock => "do catch",
+            CompilerDesugaringKind::TryBlock => "try block",
             CompilerDesugaringKind::ExistentialReturnType => "existential type",
             CompilerDesugaringKind::ForLoop => "for loop",
         })
diff --git a/src/test/ui/catch/catch-bad-lifetime.rs b/src/test/compile-fail/try-block-bad-lifetime.rs
index f332ffd4494..8dfd8545af7 100644
--- a/src/test/ui/catch/catch-bad-lifetime.rs
+++ b/src/test/compile-fail/try-block-bad-lifetime.rs
@@ -8,14 +8,16 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
+// compile-flags: --edition 2018
+
 #![feature(catch_expr)]
 
-// This test checks that borrows made and returned inside catch blocks are properly constrained
+// This test checks that borrows made and returned inside try blocks are properly constrained
 pub fn main() {
     {
-        // Test that borrows returned from a catch block must be valid for the lifetime of the
+        // Test that borrows returned from a try block must be valid for the lifetime of the
         // result variable
-        let _result: Result<(), &str> = do catch {
+        let _result: Result<(), &str> = try {
             let my_string = String::from("");
             let my_str: & str = & my_string;
             //~^ ERROR `my_string` does not live long enough
@@ -25,10 +27,10 @@ pub fn main() {
     }
 
     {
-        // Test that borrows returned from catch blocks freeze their referent
+        // Test that borrows returned from try blocks freeze their referent
         let mut i = 5;
         let k = &mut i;
-        let mut j: Result<(), &mut i32> = do catch {
+        let mut j: Result<(), &mut i32> = try {
             Err(k) ?;
             i = 10; //~ ERROR cannot assign to `i` because it is borrowed
         };
diff --git a/src/test/ui/catch/catch-bad-type.rs b/src/test/compile-fail/try-block-bad-type.rs
index b369847699b..9e555df8535 100644
--- a/src/test/ui/catch/catch-bad-type.rs
+++ b/src/test/compile-fail/try-block-bad-type.rs
@@ -8,21 +8,23 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
+// compile-flags: --edition 2018
+
 #![feature(catch_expr)]
 
 pub fn main() {
-    let res: Result<u32, i32> = do catch {
+    let res: Result<u32, i32> = try {
         Err("")?; //~ ERROR the trait bound `i32: std::convert::From<&str>` is not satisfied
         5
     };
 
-    let res: Result<i32, i32> = do catch {
+    let res: Result<i32, i32> = try {
         "" //~ ERROR type mismatch
     };
 
-    let res: Result<i32, i32> = do catch { }; //~ ERROR type mismatch
+    let res: Result<i32, i32> = try { }; //~ ERROR type mismatch
 
-    let res: () = do catch { }; //~ the trait bound `(): std::ops::Try` is not satisfied
+    let res: () = try { }; //~ the trait bound `(): std::ops::Try` is not satisfied
 
-    let res: i32 = do catch { 5 }; //~ ERROR the trait bound `i32: std::ops::Try` is not satisfied
+    let res: i32 = try { 5 }; //~ ERROR the trait bound `i32: std::ops::Try` is not satisfied
 }
diff --git a/src/test/ui/catch/catch-in-match.rs b/src/test/compile-fail/try-block-in-match.rs
index 9f9968e8124..490b00a6f43 100644
--- a/src/test/ui/catch/catch-in-match.rs
+++ b/src/test/compile-fail/try-block-in-match.rs
@@ -8,8 +8,10 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
+// compile-flags: --edition 2018
+
 #![feature(catch_expr)]
 
 fn main() {
-    match do catch { false } { _ => {} } //~ ERROR expected expression, found reserved keyword `do`
+    match try { false } { _ => {} } //~ ERROR expected expression, found keyword `try`
 }
diff --git a/src/test/ui/catch/catch-in-while.rs b/src/test/compile-fail/try-block-in-while.rs
index cb8613ee60b..a949e778f38 100644
--- a/src/test/ui/catch/catch-in-while.rs
+++ b/src/test/compile-fail/try-block-in-while.rs
@@ -8,8 +8,10 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
+// compile-flags: --edition 2018
+
 #![feature(catch_expr)]
 
 fn main() {
-    while do catch { false } {} //~ ERROR expected expression, found reserved keyword `do`
+    while try { false } {} //~ ERROR expected expression, found keyword `try`
 }
diff --git a/src/test/ui/catch/catch-maybe-bad-lifetime.rs b/src/test/compile-fail/try-block-maybe-bad-lifetime.rs
index faefb5ef18a..db37a397c16 100644
--- a/src/test/ui/catch/catch-maybe-bad-lifetime.rs
+++ b/src/test/compile-fail/try-block-maybe-bad-lifetime.rs
@@ -8,14 +8,16 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
+// compile-flags: --edition 2018
+
 #![feature(catch_expr)]
 
-// This test checks that borrows made and returned inside catch blocks are properly constrained
+// This test checks that borrows made and returned inside try blocks are properly constrained
 pub fn main() {
     {
         // Test that a borrow which *might* be returned still freezes its referent
         let mut i = 222;
-        let x: Result<&i32, ()> = do catch {
+        let x: Result<&i32, ()> = try {
             Err(())?;
             &i
         };
@@ -26,7 +28,7 @@ pub fn main() {
 
     {
         let x = String::new();
-        let _y: Result<(), ()> = do catch {
+        let _y: Result<(), ()> = try {
             Err(())?;
             ::std::mem::drop(x);
         };
@@ -38,7 +40,7 @@ pub fn main() {
         // its referent
         let mut i = 222;
         let j;
-        let x: Result<(), ()> = do catch {
+        let x: Result<(), ()> = try {
             Err(())?;
             j = &i;
         };
diff --git a/src/test/ui/catch/catch-opt-init.rs b/src/test/compile-fail/try-block-opt-init.rs
index 0c41102e3be..14544c6ea0c 100644
--- a/src/test/ui/catch/catch-opt-init.rs
+++ b/src/test/compile-fail/try-block-opt-init.rs
@@ -8,13 +8,15 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
+// compile-flags: --edition 2018
+
 #![feature(catch_expr)]
 
 fn use_val<T: Sized>(_x: T) {}
 
 pub fn main() {
     let cfg_res;
-    let _: Result<(), ()> = do catch {
+    let _: Result<(), ()> = try {
         Err(())?;
         cfg_res = 5;
         Ok::<(), ()>(())?;
diff --git a/src/test/run-pass/issue-45124.rs b/src/test/run-pass/issue-45124.rs
index c65823e460b..5f47cc8d7d5 100644
--- a/src/test/run-pass/issue-45124.rs
+++ b/src/test/run-pass/issue-45124.rs
@@ -8,12 +8,14 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
+// compile-flags: --edition 2018
+
 #![feature(catch_expr)]
 
 fn main() {
     let mut a = 0;
     let () = {
-        let _: Result<(), ()> = do catch {
+        let _: Result<(), ()> = try {
             let _ = Err(())?;
             return
         };
diff --git a/src/test/run-pass/catch-expr.rs b/src/test/run-pass/try-block.rs
index c23bca7f49e..f2b017e94f0 100644
--- a/src/test/run-pass/catch-expr.rs
+++ b/src/test/run-pass/try-block.rs
@@ -8,12 +8,14 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
+// compile-flags: --edition 2018
+
 #![feature(catch_expr)]
 
 struct catch {}
 
 pub fn main() {
-    let catch_result: Option<_> = do catch {
+    let catch_result: Option<_> = try {
         let x = 5;
         x
     };
@@ -30,20 +32,20 @@ pub fn main() {
         _ => {}
     };
 
-    let catch_err: Result<_, i32> = do catch {
+    let catch_err: Result<_, i32> = try {
         Err(22)?;
         1
     };
     assert_eq!(catch_err, Err(22));
 
-    let catch_okay: Result<i32, i32> = do catch {
+    let catch_okay: Result<i32, i32> = try {
         if false { Err(25)?; }
         Ok::<(), i32>(())?;
         28
     };
     assert_eq!(catch_okay, Ok(28));
 
-    let catch_from_loop: Result<i32, i32> = do catch {
+    let catch_from_loop: Result<i32, i32> = try {
         for i in 0..10 {
             if i < 5 { Ok::<i32, i32>(i)?; } else { Err(i)?; }
         }
@@ -52,28 +54,28 @@ pub fn main() {
     assert_eq!(catch_from_loop, Err(5));
 
     let cfg_init;
-    let _res: Result<(), ()> = do catch {
+    let _res: Result<(), ()> = try {
         cfg_init = 5;
     };
     assert_eq!(cfg_init, 5);
 
     let cfg_init_2;
-    let _res: Result<(), ()> = do catch {
+    let _res: Result<(), ()> = try {
         cfg_init_2 = 6;
         Err(())?;
     };
     assert_eq!(cfg_init_2, 6);
 
     let my_string = "test".to_string();
-    let res: Result<&str, ()> = do catch {
+    let res: Result<&str, ()> = try {
         // Unfortunately, deref doesn't fire here (#49356)
         &my_string[..]
     };
     assert_eq!(res, Ok("test"));
 
-    let my_opt: Option<_> = do catch { () };
+    let my_opt: Option<_> = try { () };
     assert_eq!(my_opt, Some(()));
 
-    let my_opt: Option<_> = do catch { };
+    let my_opt: Option<_> = try { };
     assert_eq!(my_opt, Some(()));
 }
diff --git a/src/test/ui/catch/catch-bad-lifetime.nll.stderr b/src/test/ui/catch/catch-bad-lifetime.nll.stderr
deleted file mode 100644
index dd1595f9315..00000000000
--- a/src/test/ui/catch/catch-bad-lifetime.nll.stderr
+++ /dev/null
@@ -1,39 +0,0 @@
-error[E0506]: cannot assign to `i` because it is borrowed
-  --> $DIR/catch-bad-lifetime.rs:33:13
-   |
-LL |         let k = &mut i;
-   |                 ------ borrow of `i` occurs here
-...
-LL |             i = 10; //~ ERROR cannot assign to `i` because it is borrowed
-   |             ^^^^^^ assignment to borrowed `i` occurs here
-LL |         };
-LL |         ::std::mem::drop(k); //~ ERROR use of moved value: `k`
-   |                          - borrow later used here
-
-error[E0382]: use of moved value: `k`
-  --> $DIR/catch-bad-lifetime.rs:35:26
-   |
-LL |             Err(k) ?;
-   |                 - value moved here
-...
-LL |         ::std::mem::drop(k); //~ ERROR use of moved value: `k`
-   |                          ^ value used here after move
-   |
-   = note: move occurs because `k` has type `&mut i32`, which does not implement the `Copy` trait
-
-error[E0506]: cannot assign to `i` because it is borrowed
-  --> $DIR/catch-bad-lifetime.rs:36:9
-   |
-LL |         let k = &mut i;
-   |                 ------ borrow of `i` occurs here
-...
-LL |         i = 40; //~ ERROR cannot assign to `i` because it is borrowed
-   |         ^^^^^^ assignment to borrowed `i` occurs here
-LL | 
-LL |         let i_ptr = if let Err(i_ptr) = j { i_ptr } else { panic ! ("") };
-   |                                         - borrow later used here
-
-error: aborting due to 3 previous errors
-
-Some errors occurred: E0382, E0506.
-For more information about an error, try `rustc --explain E0382`.
diff --git a/src/test/ui/catch/catch-bad-lifetime.stderr b/src/test/ui/catch/catch-bad-lifetime.stderr
deleted file mode 100644
index 2ea54d1fb24..00000000000
--- a/src/test/ui/catch/catch-bad-lifetime.stderr
+++ /dev/null
@@ -1,44 +0,0 @@
-error[E0597]: `my_string` does not live long enough
-  --> $DIR/catch-bad-lifetime.rs:20:35
-   |
-LL |             let my_str: & str = & my_string;
-   |                                   ^^^^^^^^^ borrowed value does not live long enough
-...
-LL |         };
-   |         - `my_string` dropped here while still borrowed
-LL |     }
-   |     - borrowed value needs to live until here
-
-error[E0506]: cannot assign to `i` because it is borrowed
-  --> $DIR/catch-bad-lifetime.rs:33:13
-   |
-LL |         let k = &mut i;
-   |                      - borrow of `i` occurs here
-...
-LL |             i = 10; //~ ERROR cannot assign to `i` because it is borrowed
-   |             ^^^^^^ assignment to borrowed `i` occurs here
-
-error[E0382]: use of moved value: `k`
-  --> $DIR/catch-bad-lifetime.rs:35:26
-   |
-LL |             Err(k) ?;
-   |                 - value moved here
-...
-LL |         ::std::mem::drop(k); //~ ERROR use of moved value: `k`
-   |                          ^ value used here after move
-   |
-   = note: move occurs because `k` has type `&mut i32`, which does not implement the `Copy` trait
-
-error[E0506]: cannot assign to `i` because it is borrowed
-  --> $DIR/catch-bad-lifetime.rs:36:9
-   |
-LL |         let k = &mut i;
-   |                      - borrow of `i` occurs here
-...
-LL |         i = 40; //~ ERROR cannot assign to `i` because it is borrowed
-   |         ^^^^^^ assignment to borrowed `i` occurs here
-
-error: aborting due to 4 previous errors
-
-Some errors occurred: E0382, E0506, E0597.
-For more information about an error, try `rustc --explain E0382`.
diff --git a/src/test/ui/catch/catch-bad-type.stderr b/src/test/ui/catch/catch-bad-type.stderr
deleted file mode 100644
index 2ab5b3e3176..00000000000
--- a/src/test/ui/catch/catch-bad-type.stderr
+++ /dev/null
@@ -1,52 +0,0 @@
-error[E0277]: the trait bound `i32: std::convert::From<&str>` is not satisfied
-  --> $DIR/catch-bad-type.rs:15:9
-   |
-LL |         Err("")?; //~ ERROR the trait bound `i32: std::convert::From<&str>` is not satisfied
-   |         ^^^^^^^^ the trait `std::convert::From<&str>` is not implemented for `i32`
-   |
-   = help: the following implementations were found:
-             <i32 as std::convert::From<bool>>
-             <i32 as std::convert::From<i16>>
-             <i32 as std::convert::From<i8>>
-             <i32 as std::convert::From<u16>>
-             <i32 as std::convert::From<u8>>
-   = note: required by `std::convert::From::from`
-
-error[E0271]: type mismatch resolving `<std::result::Result<i32, i32> as std::ops::Try>::Ok == &str`
-  --> $DIR/catch-bad-type.rs:20:9
-   |
-LL |         "" //~ ERROR type mismatch
-   |         ^^ expected i32, found &str
-   |
-   = note: expected type `i32`
-              found type `&str`
-
-error[E0271]: type mismatch resolving `<std::result::Result<i32, i32> as std::ops::Try>::Ok == ()`
-  --> $DIR/catch-bad-type.rs:23:44
-   |
-LL |     let res: Result<i32, i32> = do catch { }; //~ ERROR type mismatch
-   |                                            ^ expected i32, found ()
-   |
-   = note: expected type `i32`
-              found type `()`
-
-error[E0277]: the trait bound `(): std::ops::Try` is not satisfied
-  --> $DIR/catch-bad-type.rs:25:28
-   |
-LL |     let res: () = do catch { }; //~ the trait bound `(): std::ops::Try` is not satisfied
-   |                            ^^^ the trait `std::ops::Try` is not implemented for `()`
-   |
-   = note: required by `std::ops::Try::from_ok`
-
-error[E0277]: the trait bound `i32: std::ops::Try` is not satisfied
-  --> $DIR/catch-bad-type.rs:27:29
-   |
-LL |     let res: i32 = do catch { 5 }; //~ ERROR the trait bound `i32: std::ops::Try` is not satisfied
-   |                             ^^^^^ the trait `std::ops::Try` is not implemented for `i32`
-   |
-   = note: required by `std::ops::Try::from_ok`
-
-error: aborting due to 5 previous errors
-
-Some errors occurred: E0271, E0277.
-For more information about an error, try `rustc --explain E0271`.
diff --git a/src/test/ui/catch/catch-in-match.stderr b/src/test/ui/catch/catch-in-match.stderr
deleted file mode 100644
index 1542989cc35..00000000000
--- a/src/test/ui/catch/catch-in-match.stderr
+++ /dev/null
@@ -1,8 +0,0 @@
-error: expected expression, found reserved keyword `do`
-  --> $DIR/catch-in-match.rs:14:11
-   |
-LL |     match do catch { false } { _ => {} } //~ ERROR expected expression, found reserved keyword `do`
-   |           ^^ expected expression
-
-error: aborting due to previous error
-
diff --git a/src/test/ui/catch/catch-in-while.stderr b/src/test/ui/catch/catch-in-while.stderr
deleted file mode 100644
index 9316bbcd4bc..00000000000
--- a/src/test/ui/catch/catch-in-while.stderr
+++ /dev/null
@@ -1,8 +0,0 @@
-error: expected expression, found reserved keyword `do`
-  --> $DIR/catch-in-while.rs:14:11
-   |
-LL |     while do catch { false } {} //~ ERROR expected expression, found reserved keyword `do`
-   |           ^^ expected expression
-
-error: aborting due to previous error
-
diff --git a/src/test/ui/catch/catch-maybe-bad-lifetime.nll.stderr b/src/test/ui/catch/catch-maybe-bad-lifetime.nll.stderr
deleted file mode 100644
index 157793160ce..00000000000
--- a/src/test/ui/catch/catch-maybe-bad-lifetime.nll.stderr
+++ /dev/null
@@ -1,14 +0,0 @@
-error[E0382]: borrow of moved value: `x`
-  --> $DIR/catch-maybe-bad-lifetime.rs:33:24
-   |
-LL |             ::std::mem::drop(x);
-   |                              - value moved here
-LL |         };
-LL |         println!("{}", x); //~ ERROR use of moved value: `x`
-   |                        ^ value borrowed here after move
-   |
-   = note: move occurs because `x` has type `std::string::String`, which does not implement the `Copy` trait
-
-error: aborting due to previous error
-
-For more information about this error, try `rustc --explain E0382`.
diff --git a/src/test/ui/catch/catch-maybe-bad-lifetime.stderr b/src/test/ui/catch/catch-maybe-bad-lifetime.stderr
deleted file mode 100644
index 21fe1049f43..00000000000
--- a/src/test/ui/catch/catch-maybe-bad-lifetime.stderr
+++ /dev/null
@@ -1,33 +0,0 @@
-error[E0506]: cannot assign to `i` because it is borrowed
-  --> $DIR/catch-maybe-bad-lifetime.rs:23:9
-   |
-LL |             &i
-   |              - borrow of `i` occurs here
-...
-LL |         i = 0; //~ ERROR cannot assign to `i` because it is borrowed
-   |         ^^^^^ assignment to borrowed `i` occurs here
-
-error[E0382]: use of moved value: `x`
-  --> $DIR/catch-maybe-bad-lifetime.rs:33:24
-   |
-LL |             ::std::mem::drop(x);
-   |                              - value moved here
-LL |         };
-LL |         println!("{}", x); //~ ERROR use of moved value: `x`
-   |                        ^ value used here after move
-   |
-   = note: move occurs because `x` has type `std::string::String`, which does not implement the `Copy` trait
-
-error[E0506]: cannot assign to `i` because it is borrowed
-  --> $DIR/catch-maybe-bad-lifetime.rs:45:9
-   |
-LL |             j = &i;
-   |                  - borrow of `i` occurs here
-LL |         };
-LL |         i = 0; //~ ERROR cannot assign to `i` because it is borrowed
-   |         ^^^^^ assignment to borrowed `i` occurs here
-
-error: aborting due to 3 previous errors
-
-Some errors occurred: E0382, E0506.
-For more information about an error, try `rustc --explain E0382`.
diff --git a/src/test/ui/catch/catch-opt-init.nll.stderr b/src/test/ui/catch/catch-opt-init.nll.stderr
deleted file mode 100644
index ea8c8ebdcb7..00000000000
--- a/src/test/ui/catch/catch-opt-init.nll.stderr
+++ /dev/null
@@ -1,11 +0,0 @@
-error[E0381]: borrow of possibly uninitialized variable: `cfg_res`
-  --> $DIR/catch-opt-init.rs:23:5
-   |
-LL |     assert_eq!(cfg_res, 5); //~ ERROR use of possibly uninitialized variable
-   |     ^^^^^^^^^^^^^^^^^^^^^^^ use of possibly uninitialized `cfg_res`
-   |
-   = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info)
-
-error: aborting due to previous error
-
-For more information about this error, try `rustc --explain E0381`.
diff --git a/src/test/ui/catch/catch-opt-init.stderr b/src/test/ui/catch/catch-opt-init.stderr
deleted file mode 100644
index 6a14ba17f9e..00000000000
--- a/src/test/ui/catch/catch-opt-init.stderr
+++ /dev/null
@@ -1,9 +0,0 @@
-error[E0381]: use of possibly uninitialized variable: `cfg_res`
-  --> $DIR/catch-opt-init.rs:23:16
-   |
-LL |     assert_eq!(cfg_res, 5); //~ ERROR use of possibly uninitialized variable
-   |                ^^^^^^^ use of possibly uninitialized `cfg_res`
-
-error: aborting due to previous error
-
-For more information about this error, try `rustc --explain E0381`.
diff --git a/src/test/ui/feature-gates/feature-gate-catch_expr.rs b/src/test/ui/feature-gates/feature-gate-catch_expr.rs
index 5568a5cf0aa..6536280c71f 100644
--- a/src/test/ui/feature-gates/feature-gate-catch_expr.rs
+++ b/src/test/ui/feature-gates/feature-gate-catch_expr.rs
@@ -8,10 +8,12 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
+// compile-flags: --edition 2018
+
 pub fn main() {
-    let catch_result = do catch { //~ ERROR `catch` expression is experimental
+    let try_result: Option<_> = try { //~ ERROR `try` expression is experimental
         let x = 5;
         x
     };
-    assert_eq!(catch_result, 5);
+    assert_eq!(try_result, Some(5));
 }
diff --git a/src/test/ui/feature-gates/feature-gate-catch_expr.stderr b/src/test/ui/feature-gates/feature-gate-catch_expr.stderr
index 4ab71460c0d..4842215d51a 100644
--- a/src/test/ui/feature-gates/feature-gate-catch_expr.stderr
+++ b/src/test/ui/feature-gates/feature-gate-catch_expr.stderr
@@ -1,8 +1,8 @@
-error[E0658]: `catch` expression is experimental (see issue #31436)
-  --> $DIR/feature-gate-catch_expr.rs:12:24
+error[E0658]: `try` expression is experimental (see issue #31436)
+  --> $DIR/feature-gate-catch_expr.rs:14:33
    |
-LL |       let catch_result = do catch { //~ ERROR `catch` expression is experimental
-   |  ________________________^
+LL |       let try_result: Option<_> = try { //~ ERROR `try` expression is experimental
+   |  _________________________________^
 LL | |         let x = 5;
 LL | |         x
 LL | |     };
diff --git a/src/test/ui/try-block-in-edition2015.rs b/src/test/ui/try-block-in-edition2015.rs
new file mode 100644
index 00000000000..64485bb8318
--- /dev/null
+++ b/src/test/ui/try-block-in-edition2015.rs
@@ -0,0 +1,20 @@
+// 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 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+// compile-flags: --edition 2015
+
+pub fn main() {
+    let try_result: Option<_> = try {
+    //~^ ERROR expected struct, variant or union type, found macro `try`
+        let x = 5; //~ ERROR expected identifier, found keyword
+        x
+    };
+    assert_eq!(try_result, Some(5));
+}
diff --git a/src/test/ui/try-block-in-edition2015.stderr b/src/test/ui/try-block-in-edition2015.stderr
new file mode 100644
index 00000000000..7e6d515e111
--- /dev/null
+++ b/src/test/ui/try-block-in-edition2015.stderr
@@ -0,0 +1,18 @@
+error: expected identifier, found keyword `let`
+  --> $DIR/try-block-in-edition2015.rs:16:9
+   |
+LL |     let try_result: Option<_> = try {
+   |                                 --- while parsing this struct
+LL |     //~^ ERROR expected struct, variant or union type, found macro `try`
+LL |         let x = 5; //~ ERROR expected identifier, found keyword
+   |         ^^^ expected identifier, found keyword
+
+error[E0574]: expected struct, variant or union type, found macro `try`
+  --> $DIR/try-block-in-edition2015.rs:14:33
+   |
+LL |     let try_result: Option<_> = try {
+   |                                 ^^^ did you mean `try!(...)`?
+
+error: aborting due to 2 previous errors
+
+For more information about this error, try `rustc --explain E0574`.
diff --git a/src/test/ui/catch/catch-block-type-error.rs b/src/test/ui/try-block-type-error.rs
index 10130ef1e5d..58b35e46302 100644
--- a/src/test/ui/catch/catch-block-type-error.rs
+++ b/src/test/ui/try-block-type-error.rs
@@ -8,18 +8,20 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
+// compile-flags: --edition 2018
+
 #![feature(catch_expr)]
 
 fn foo() -> Option<()> { Some(()) }
 
 fn main() {
-    let _: Option<f32> = do catch {
+    let _: Option<f32> = try {
         foo()?;
         42
         //~^ ERROR type mismatch
     };
 
-    let _: Option<i32> = do catch {
+    let _: Option<i32> = try {
         foo()?;
     };
     //~^ ERROR type mismatch
diff --git a/src/test/ui/catch/catch-block-type-error.stderr b/src/test/ui/try-block-type-error.stderr
index 288168c6992..3b67e92ec61 100644
--- a/src/test/ui/catch/catch-block-type-error.stderr
+++ b/src/test/ui/try-block-type-error.stderr
@@ -1,5 +1,5 @@
 error[E0271]: type mismatch resolving `<std::option::Option<f32> as std::ops::Try>::Ok == {integer}`
-  --> $DIR/catch-block-type-error.rs:18:9
+  --> $DIR/try-block-type-error.rs:20:9
    |
 LL |         42
    |         ^^
@@ -11,7 +11,7 @@ LL |         42
               found type `{integer}`
 
 error[E0271]: type mismatch resolving `<std::option::Option<i32> as std::ops::Try>::Ok == ()`
-  --> $DIR/catch-block-type-error.rs:24:5
+  --> $DIR/try-block-type-error.rs:26:5
    |
 LL |     };
    |     ^ expected i32, found ()