Parse try blocks with the try keyword instead of do catch placeholder

This commit is contained in:
Scott McMurray 2018-07-21 20:59:44 -07:00
parent 1c906093f9
commit 9e64ce1799
31 changed files with 123 additions and 276 deletions

View File

@ -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)?;

View File

@ -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;

View File

@ -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)?;

View File

@ -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:
//

View File

@ -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 {

View File

@ -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)
}

View File

@ -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)?
}

View File

@ -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",
})

View File

@ -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
};

View File

@ -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
}

View File

@ -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`
}

View File

@ -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`
}

View File

@ -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;
};

View File

@ -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::<(), ()>(())?;

View File

@ -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
};

View File

@ -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(()));
}

View File

@ -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`.

View File

@ -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`.

View File

@ -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`.

View File

@ -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

View File

@ -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

View File

@ -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`.

View File

@ -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`.

View File

@ -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`.

View File

@ -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`.

View File

@ -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));
}

View File

@ -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 | | };

View File

@ -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));
}

View File

@ -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`.

View File

@ -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

View File

@ -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 ()