Skip to content

Commit e7e7c36

Browse files
committed
Add unreachable attribute to Err branch
1 parent c07aa33 commit e7e7c36

File tree

2 files changed

+37
-16
lines changed

2 files changed

+37
-16
lines changed

src/librustc/hir/lowering.rs

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1854,28 +1854,29 @@ impl<'a> LoweringContext<'a> {
18541854
P(self.expr_call(e.span, path, hir_vec![sub_expr]))
18551855
};
18561856

1857+
// #[allow(unreachable_code)]
1858+
let attr = {
1859+
// allow(unreachable_code)
1860+
let allow = {
1861+
let allow_ident = self.str_to_ident("allow");
1862+
let uc_ident = self.str_to_ident("unreachable_code");
1863+
let uc_meta_item = attr::mk_spanned_word_item(e.span, uc_ident);
1864+
let uc_nested = NestedMetaItemKind::MetaItem(uc_meta_item);
1865+
let uc_spanned = respan(e.span, uc_nested);
1866+
attr::mk_spanned_list_item(e.span, allow_ident, vec![uc_spanned])
1867+
};
1868+
attr::mk_spanned_attr_outer(e.span, attr::mk_attr_id(), allow)
1869+
};
1870+
let attrs = vec![attr];
1871+
18571872
// Ok(val) => { #[allow(unreachable_code)] val }
18581873
let ok_arm = {
18591874
let val_ident = self.str_to_ident("val");
18601875
let val_pat = self.pat_ident(e.span, val_ident);
1861-
// #[allow(unreachable_code)]
1862-
let val_attr = {
1863-
// allow(unreachable_code)
1864-
let allow = {
1865-
let allow_ident = self.str_to_ident("allow");
1866-
let uc_ident = self.str_to_ident("unreachable_code");
1867-
let uc_meta_item = attr::mk_spanned_word_item(e.span, uc_ident);
1868-
let uc_nested = NestedMetaItemKind::MetaItem(uc_meta_item);
1869-
let uc_spanned = respan(e.span, uc_nested);
1870-
attr::mk_spanned_list_item(e.span, allow_ident, vec![uc_spanned])
1871-
};
1872-
attr::mk_spanned_attr_outer(e.span, attr::mk_attr_id(), allow)
1873-
};
1874-
let attrs = From::from(vec![val_attr]);
18751876
let val_expr = P(self.expr_ident_with_attrs(e.span,
18761877
val_ident,
18771878
val_pat.id,
1878-
attrs));
1879+
From::from(attrs.clone())));
18791880
let ok_pat = self.pat_ok(e.span, val_pat);
18801881

18811882
self.arm(hir_vec![ok_pat], val_expr)
@@ -1901,7 +1902,7 @@ impl<'a> LoweringContext<'a> {
19011902

19021903
let ret_expr = P(self.expr(e.span,
19031904
hir::Expr_::ExprRet(Some(from_err_expr)),
1904-
ThinVec::new()));
1905+
From::from(attrs)));
19051906

19061907
let err_pat = self.pat_err(e.span, err_local);
19071908
self.arm(hir_vec![err_pat], ret_expr)

src/test/compile-fail/unreachable-try-pattern.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,14 @@
1212
#![deny(unreachable_code)]
1313
#![deny(unreachable_patterns)]
1414

15+
enum Void {}
16+
17+
impl From<Void> for i32 {
18+
fn from(v: Void) -> i32 {
19+
match v {}
20+
}
21+
}
22+
1523
fn bar(x: Result<!, i32>) -> Result<u32, i32> {
1624
x?
1725
}
@@ -23,8 +31,20 @@ fn foo(x: Result<!, i32>) -> Result<u32, i32> {
2331
Ok(y)
2432
}
2533

34+
fn qux(x: Result<u32, Void>) -> Result<u32, i32> {
35+
Ok(x?)
36+
}
37+
38+
fn vom(x: Result<u32, Void>) -> Result<u32, i32> {
39+
let y = (match x { Ok(n) => Ok(n), Err(e) => Err(e) })?;
40+
//~^ ERROR unreachable pattern
41+
Ok(y)
42+
}
43+
2644
fn main() {
2745
let _ = bar(Err(123));
2846
let _ = foo(Err(123));
47+
let _ = qux(Ok(123));
48+
let _ = vom(Ok(123));
2949
}
3050

0 commit comments

Comments
 (0)