Skip to content

Commit eff0aa5

Browse files
committed
Handle safe safety keyword for fns (not yet ready, generated unsafe fns)
1 parent 2581bc6 commit eff0aa5

File tree

39 files changed

+91
-43
lines changed

39 files changed

+91
-43
lines changed

compiler/rustc_ast/src/ast.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2489,6 +2489,7 @@ pub enum Unsafe {
24892489
#[derive(HashStable_Generic)]
24902490
pub enum FnSafety {
24912491
Unsafe(Span),
2492+
Safe(Span),
24922493
Default,
24932494
}
24942495

compiler/rustc_ast/src/mut_visit.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -867,6 +867,7 @@ fn visit_unsafety<T: MutVisitor>(unsafety: &mut Unsafe, vis: &mut T) {
867867
fn visit_fn_safety<T: MutVisitor>(safety: &mut FnSafety, vis: &mut T) {
868868
match safety {
869869
FnSafety::Unsafe(span) => vis.visit_span(span),
870+
FnSafety::Safe(span) => vis.visit_span(span),
870871
FnSafety::Default => {}
871872
}
872873
}

compiler/rustc_ast/src/token.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,7 @@ pub fn ident_can_begin_expr(name: Symbol, span: Span, is_raw: IdentIsRaw) -> boo
210210
kw::Unsafe,
211211
kw::While,
212212
kw::Yield,
213+
kw::Safe,
213214
kw::Static,
214215
]
215216
.contains(&name)
@@ -563,6 +564,7 @@ impl Token {
563564
kw::Impl,
564565
kw::Unsafe,
565566
kw::Const,
567+
kw::Safe,
566568
kw::Static,
567569
kw::Union,
568570
kw::Macro,

compiler/rustc_ast_lowering/src/item.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1411,6 +1411,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
14111411
pub(super) fn lower_fn_safety(&mut self, u: FnSafety) -> hir::FnSafety {
14121412
match u {
14131413
FnSafety::Unsafe(_) => hir::FnSafety::Unsafe,
1414+
FnSafety::Safe(_) => hir::FnSafety::Safe,
14141415
FnSafety::Default => hir::FnSafety::Default,
14151416
}
14161417
}

compiler/rustc_ast_pretty/src/pprust/state.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1943,6 +1943,7 @@ impl<'a> State<'a> {
19431943
fn print_fn_safety(&mut self, s: ast::FnSafety) {
19441944
match s {
19451945
ast::FnSafety::Default => {}
1946+
ast::FnSafety::Safe(_) => self.word_nbsp("safe"),
19461947
ast::FnSafety::Unsafe(_) => self.word_nbsp("unsafe"),
19471948
}
19481949
}

compiler/rustc_hir/src/hir.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3208,13 +3208,15 @@ impl fmt::Display for Unsafety {
32083208
#[derive(Encodable, Decodable, HashStable_Generic)]
32093209
pub enum FnSafety {
32103210
Unsafe,
3211+
Safe,
32113212
Default,
32123213
}
32133214

32143215
impl FnSafety {
32153216
pub fn prefix_str(&self) -> &'static str {
32163217
match self {
32173218
Self::Unsafe => "unsafe ",
3219+
Self::Safe => "safe ",
32183220
Self::Default => "",
32193221
}
32203222
}
@@ -3224,6 +3226,7 @@ impl fmt::Display for FnSafety {
32243226
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
32253227
f.write_str(match *self {
32263228
Self::Unsafe => "unsafe",
3229+
Self::Safe => "safe",
32273230
Self::Default => "normal",
32283231
})
32293232
}

compiler/rustc_hir_pretty/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2290,6 +2290,7 @@ impl<'a> State<'a> {
22902290
fn print_fn_safety(&mut self, s: hir::FnSafety) {
22912291
match s {
22922292
hir::FnSafety::Default => {}
2293+
hir::FnSafety::Safe => self.word_nbsp("safe"),
22932294
hir::FnSafety::Unsafe => self.word_nbsp("unsafe"),
22942295
}
22952296
}

compiler/rustc_parse/src/parser/item.rs

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2376,9 +2376,9 @@ impl<'a> Parser<'a> {
23762376
// `pub` is added in case users got confused with the ordering like `async pub fn`,
23772377
// only if it wasn't preceded by `default` as `default pub` is invalid.
23782378
let quals: &[Symbol] = if check_pub {
2379-
&[kw::Pub, kw::Gen, kw::Const, kw::Async, kw::Unsafe, kw::Extern]
2379+
&[kw::Pub, kw::Gen, kw::Const, kw::Async, kw::Unsafe, kw::Safe, kw::Extern]
23802380
} else {
2381-
&[kw::Gen, kw::Const, kw::Async, kw::Unsafe, kw::Extern]
2381+
&[kw::Gen, kw::Const, kw::Async, kw::Unsafe, kw::Safe, kw::Extern]
23822382
};
23832383
self.check_keyword_case(kw::Fn, case) // Definitely an `fn`.
23842384
// `$qual fn` or `$qual $qual`:
@@ -2513,11 +2513,27 @@ impl<'a> Parser<'a> {
25132513
} else if self.check_keyword(kw::Unsafe) {
25142514
match safety {
25152515
FnSafety::Unsafe(sp) => Some(WrongKw::Duplicated(sp)),
2516+
FnSafety::Safe(sp) => {
2517+
recover_safety = FnSafety::Unsafe(self.token.span);
2518+
Some(WrongKw::Misplaced(sp))
2519+
}
25162520
FnSafety::Default => {
25172521
recover_safety = FnSafety::Unsafe(self.token.span);
25182522
Some(WrongKw::Misplaced(ext_start_sp))
25192523
}
25202524
}
2525+
} else if self.check_keyword(kw::Safe) {
2526+
match safety {
2527+
FnSafety::Safe(sp) => Some(WrongKw::Duplicated(sp)),
2528+
FnSafety::Unsafe(sp) => {
2529+
recover_safety = FnSafety::Safe(self.token.span);
2530+
Some(WrongKw::Misplaced(sp))
2531+
}
2532+
FnSafety::Default => {
2533+
recover_safety = FnSafety::Safe(self.token.span);
2534+
Some(WrongKw::Misplaced(ext_start_sp))
2535+
}
2536+
}
25212537
} else {
25222538
None
25232539
};

compiler/rustc_parse/src/parser/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1225,6 +1225,8 @@ impl<'a> Parser<'a> {
12251225
fn parse_fn_safety(&mut self, case: Case) -> FnSafety {
12261226
if self.eat_keyword_case(kw::Unsafe, case) {
12271227
FnSafety::Unsafe(self.prev_token.uninterpolated_span())
1228+
} else if self.eat_keyword_case(kw::Safe, case) {
1229+
FnSafety::Safe(self.prev_token.uninterpolated_span())
12281230
} else {
12291231
FnSafety::Default
12301232
}

compiler/rustc_smir/src/rustc_internal/internal.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -497,6 +497,7 @@ impl RustcInternal for FnSafety {
497497
fn internal<'tcx>(&self, _tables: &mut Tables<'_>, _tcx: TyCtxt<'tcx>) -> Self::T<'tcx> {
498498
match self {
499499
FnSafety::Unsafe => rustc_hir::FnSafety::Unsafe,
500+
FnSafety::Safe => rustc_hir::FnSafety::Safe,
500501
FnSafety::Default => rustc_hir::FnSafety::Default,
501502
}
502503
}

0 commit comments

Comments
 (0)