Rollup merge of #94985 - dtolnay:constattr, r=pnkfelix
Parse inner attributes on inline const block According to https://github.com/rust-lang/rust/pull/84414#issuecomment-826150936, inner attributes are intended to be supported *"in all containers for statements (or some subset of statements)"*. This PR adds inner attribute parsing and pretty-printing for inline const blocks (https://github.com/rust-lang/rust/issues/76001), which contain statements just like an unsafe block or a loop body. ```rust let _ = const { #![allow(...)] let x = (); x }; ```
This commit is contained in:
commit
22d554657d
@ -959,7 +959,7 @@ pub fn print_assoc_constraint(&mut self, constraint: &ast::AssocConstraint) {
|
||||
self.word_space("=");
|
||||
match term {
|
||||
Term::Ty(ty) => self.print_type(ty),
|
||||
Term::Const(c) => self.print_expr_anon_const(c),
|
||||
Term::Const(c) => self.print_expr_anon_const(c, &[]),
|
||||
}
|
||||
}
|
||||
ast::AssocConstraintKind::Bound { bounds } => self.print_type_bounds(":", &*bounds),
|
||||
|
@ -88,10 +88,21 @@ fn print_expr_vec(&mut self, exprs: &[P<ast::Expr>]) {
|
||||
self.end();
|
||||
}
|
||||
|
||||
pub(super) fn print_expr_anon_const(&mut self, expr: &ast::AnonConst) {
|
||||
pub(super) fn print_expr_anon_const(
|
||||
&mut self,
|
||||
expr: &ast::AnonConst,
|
||||
attrs: &[ast::Attribute],
|
||||
) {
|
||||
self.ibox(INDENT_UNIT);
|
||||
self.word("const");
|
||||
self.print_expr(&expr.value);
|
||||
self.nbsp();
|
||||
if let ast::ExprKind::Block(block, None) = &expr.value.kind {
|
||||
self.cbox(0);
|
||||
self.ibox(0);
|
||||
self.print_block_with_attrs(block, attrs);
|
||||
} else {
|
||||
self.print_expr(&expr.value);
|
||||
}
|
||||
self.end();
|
||||
}
|
||||
|
||||
@ -275,7 +286,7 @@ pub(super) fn print_expr_outer_attr_style(&mut self, expr: &ast::Expr, is_inline
|
||||
self.print_expr_vec(exprs);
|
||||
}
|
||||
ast::ExprKind::ConstBlock(ref anon_const) => {
|
||||
self.print_expr_anon_const(anon_const);
|
||||
self.print_expr_anon_const(anon_const, attrs);
|
||||
}
|
||||
ast::ExprKind::Repeat(ref element, ref count) => {
|
||||
self.print_expr_repeat(element, count);
|
||||
|
@ -1125,13 +1125,13 @@ fn parse_const_block(&mut self, span: Span, pat: bool) -> PResult<'a, P<Expr>> {
|
||||
self.sess.gated_spans.gate(sym::inline_const, span);
|
||||
}
|
||||
self.eat_keyword(kw::Const);
|
||||
let blk = self.parse_block()?;
|
||||
let (attrs, blk) = self.parse_inner_attrs_and_block()?;
|
||||
let anon_const = AnonConst {
|
||||
id: DUMMY_NODE_ID,
|
||||
value: self.mk_expr(blk.span, ExprKind::Block(blk, None), AttrVec::new()),
|
||||
};
|
||||
let blk_span = anon_const.value.span;
|
||||
Ok(self.mk_expr(span.to(blk_span), ExprKind::ConstBlock(anon_const), AttrVec::new()))
|
||||
Ok(self.mk_expr(span.to(blk_span), ExprKind::ConstBlock(anon_const), AttrVec::from(attrs)))
|
||||
}
|
||||
|
||||
/// Parses mutability (`mut` or nothing).
|
||||
|
@ -1,6 +1,8 @@
|
||||
// pp-exact
|
||||
|
||||
#![feature(box_syntax)]
|
||||
#![feature(inline_const)]
|
||||
#![feature(inline_const_pat)]
|
||||
#![feature(rustc_attrs)]
|
||||
#![feature(stmt_expr_attributes)]
|
||||
|
||||
@ -16,6 +18,7 @@ fn _1() {
|
||||
|
||||
#[rustc_dummy]
|
||||
unsafe {
|
||||
#![rustc_dummy]
|
||||
// code
|
||||
}
|
||||
}
|
||||
@ -206,6 +209,12 @@ fn _11() {
|
||||
let _ = ();
|
||||
()
|
||||
};
|
||||
let const {
|
||||
#![rustc_dummy]
|
||||
} =
|
||||
#[rustc_dummy] const {
|
||||
#![rustc_dummy]
|
||||
};
|
||||
let mut x = 0;
|
||||
let _ = #[rustc_dummy] x = 15;
|
||||
let _ = #[rustc_dummy] x += 15;
|
||||
|
Loading…
Reference in New Issue
Block a user