Skip to content

Assign an AttrStyle to all HIR attributes #142759

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 2 commits into from
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 36 additions & 1 deletion compiler/rustc_hir/src/hir.rs
Original file line number Diff line number Diff line change
@@ -1350,7 +1350,42 @@ impl AttributeExt for Attribute {
match &self {
Attribute::Unparsed(u) => u.style,
Attribute::Parsed(AttributeKind::DocComment { style, .. }) => *style,
_ => panic!(),
// The following HIR attributes may originally have been parsed from
// an outer or inner AST attribute, or indeed both. For example, the
// two AST attributes on this function:
//
// #[rustc_allow_const_fn_unstable(const_eval_select)]
// const fn f() {
// #![rustc_allow_const_fn_unstable(const_precise_live_drops)]
// ...
// }
//
// will be parsed to a single HIR attribute containing both symbols.
//
// Regardless of where they came from, for the purpose of HIR, we
// consider all of these to be outer attributes and rustc_hir_pretty
// will render them as such.
//
// #[attr = AllowConstFnUnstable(["const_eval_select", "const_precise_live_drops"])]
// const fn f() {
// ...
// }
//
Attribute::Parsed(
AttributeKind::Align { .. }
| AttributeKind::AllowConstFnUnstable { .. }
| AttributeKind::AllowInternalUnstable { .. }
| AttributeKind::AsPtr { .. }
| AttributeKind::BodyStability { .. }
| AttributeKind::Confusables { .. }
| AttributeKind::ConstStability { .. }
| AttributeKind::ConstStabilityIndirect { .. }
| AttributeKind::Deprecation { .. }
| AttributeKind::Inline { .. }
| AttributeKind::MacroTransparency { .. }
| AttributeKind::Repr { .. }
| AttributeKind::Stability { .. },
) => AttrStyle::Outer,
Copy link
Contributor

@jdonszelmann jdonszelmann Jun 20, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I expect to, within a few weeks or so, convert all attributes to be parsed. As such, I'm not sure the changes in this pr are very useful as this function will likely be deleted soon since it would effectively always return Outer. Only tool attributes might retain the ability to have an AttrStyle, though I think it'd be acceptable to always print those as outer too.

}
}
}
4 changes: 4 additions & 0 deletions compiler/rustc_hir/src/intravisit.rs
Original file line number Diff line number Diff line change
@@ -113,6 +113,7 @@ pub trait HirTyCtxt<'hir> {
/// Retrieves the `Node` corresponding to `id`.
fn hir_node(&self, hir_id: HirId) -> Node<'hir>;
fn hir_body(&self, id: BodyId) -> &'hir Body<'hir>;
fn hir_body_owner(&self, id: BodyId) -> HirId;
fn hir_item(&self, id: ItemId) -> &'hir Item<'hir>;
fn hir_trait_item(&self, id: TraitItemId) -> &'hir TraitItem<'hir>;
fn hir_impl_item(&self, id: ImplItemId) -> &'hir ImplItem<'hir>;
@@ -127,6 +128,9 @@ impl<'hir> HirTyCtxt<'hir> for ! {
fn hir_body(&self, _: BodyId) -> &'hir Body<'hir> {
unreachable!();
}
fn hir_body_owner(&self, _: BodyId) -> HirId {
unreachable!();
}
fn hir_item(&self, _: ItemId) -> &'hir Item<'hir> {
unreachable!();
}
131 changes: 88 additions & 43 deletions compiler/rustc_hir_pretty/src/lib.rs
Original file line number Diff line number Diff line change
@@ -10,7 +10,7 @@ use std::vec;

use rustc_abi::ExternAbi;
use rustc_ast::util::parser::{self, ExprPrecedence, Fixity};
use rustc_ast::{AttrStyle, DUMMY_NODE_ID, DelimArgs};
use rustc_ast::{DUMMY_NODE_ID, DelimArgs};
use rustc_ast_pretty::pp::Breaks::{Consistent, Inconsistent};
use rustc_ast_pretty::pp::{self, BoxMarker, Breaks};
use rustc_ast_pretty::pprust::state::MacHeader;
@@ -62,7 +62,11 @@ impl PpAnn for &dyn rustc_hir::intravisit::HirTyCtxt<'_> {
Nested::TraitItem(id) => state.print_trait_item(self.hir_trait_item(id)),
Nested::ImplItem(id) => state.print_impl_item(self.hir_impl_item(id)),
Nested::ForeignItem(id) => state.print_foreign_item(self.hir_foreign_item(id)),
Nested::Body(id) => state.print_expr(self.hir_body(id).value),
Nested::Body(id) => {
let body = self.hir_body(id).value;
let owner_attrs = state.attrs(self.hir_body_owner(id));
state.print_expr_with_owner_inner_attrs(body, owner_attrs);
}
Nested::BodyParamPat(id, i) => state.print_pat(self.hir_body(id).params[i].pat),
}
}
@@ -87,26 +91,35 @@ impl<'a> State<'a> {
expr.precedence(&for_each_attr)
}

fn print_attrs_as_inner(&mut self, attrs: &[hir::Attribute]) {
self.print_either_attributes(attrs, ast::AttrStyle::Inner)
/// Print only the inner attributes.
fn print_inner_attrs(&mut self, attrs: &[hir::Attribute]) {
self.print_either_attributes(attrs, ast::AttrStyle::Inner);
}

fn print_attrs_as_outer(&mut self, attrs: &[hir::Attribute]) {
self.print_either_attributes(attrs, ast::AttrStyle::Outer)
/// Print only the outer attributes.
fn print_outer_attrs(&mut self, attrs: &[hir::Attribute]) {
self.print_either_attributes(attrs, ast::AttrStyle::Outer);
}

/// Print the subset of attributes in `attrs` which have the style `style`.
fn print_either_attributes(&mut self, attrs: &[hir::Attribute], style: ast::AttrStyle) {
if attrs.is_empty() {
return;
}
let mut did_print = false;

for attr in attrs {
self.print_attribute_inline(attr, style);
if attr.style() == style {
did_print = true;
self.print_attribute_with_style(attr, style);
}
}

if did_print {
self.hardbreak_if_not_bol();
}
self.hardbreak_if_not_bol();
}

fn print_attribute_inline(&mut self, attr: &hir::Attribute, style: AttrStyle) {
/// Print a single attribute as if it has style `style`, disregarding the
/// actual style of the attribute.
fn print_attribute_with_style(&mut self, attr: &hir::Attribute, style: ast::AttrStyle) {
match &attr {
hir::Attribute::Unparsed(unparsed) => {
self.maybe_print_comment(unparsed.span.lo());
@@ -118,14 +131,17 @@ impl<'a> State<'a> {
self.word("]");
self.hardbreak()
}
hir::Attribute::Parsed(AttributeKind::DocComment { style, kind, comment, .. }) => {
hir::Attribute::Parsed(AttributeKind::DocComment { kind, comment, .. }) => {
self.word(rustc_ast_pretty::pprust::state::doc_comment_to_string(
*kind, *style, *comment,
*kind, style, *comment,
));
self.hardbreak()
}
hir::Attribute::Parsed(pa) => {
self.word("#[attr = ");
match style {
ast::AttrStyle::Inner => self.word("#![attr = "),
ast::AttrStyle::Outer => self.word("#[attr = "),
}
pa.print_attribute(self);
self.word("]");
self.hardbreak()
@@ -281,10 +297,17 @@ pub fn print_crate<'a>(
ann,
};

// Print all attributes, regardless of actual style, as inner attributes
// since this is the crate root with nothing above it to print outer
// attributes.
for attr in s.attrs(hir::CRATE_HIR_ID) {
s.print_attribute_with_style(attr, ast::AttrStyle::Inner);
}

// When printing the AST, we sometimes need to inject `#[no_std]` here.
// Since you can't compile the HIR, it's not necessary.

s.print_mod(krate, (*attrs)(hir::CRATE_HIR_ID));
s.print_mod(krate);
s.print_remaining_comments();
s.s.eof()
}
@@ -299,7 +322,7 @@ where
}

pub fn attribute_to_string(ann: &dyn PpAnn, attr: &hir::Attribute) -> String {
to_string(ann, |s| s.print_attribute_inline(attr, AttrStyle::Outer))
to_string(ann, |s| s.print_attribute_with_style(attr, attr.style()))
}

pub fn ty_to_string(ann: &dyn PpAnn, ty: &hir::Ty<'_>) -> String {
@@ -361,8 +384,7 @@ impl<'a> State<'a> {
self.commasep_cmnt(b, exprs, |s, e| s.print_expr(e), |e| e.span);
}

fn print_mod(&mut self, _mod: &hir::Mod<'_>, attrs: &[hir::Attribute]) {
self.print_attrs_as_inner(attrs);
fn print_mod(&mut self, _mod: &hir::Mod<'_>) {
for &item_id in _mod.item_ids {
self.ann.nested(self, Nested::Item(item_id));
}
@@ -479,7 +501,7 @@ impl<'a> State<'a> {
fn print_foreign_item(&mut self, item: &hir::ForeignItem<'_>) {
self.hardbreak_if_not_bol();
self.maybe_print_comment(item.span.lo());
self.print_attrs_as_outer(self.attrs(item.hir_id()));
self.print_outer_attrs(self.attrs(item.hir_id()));
match item.kind {
hir::ForeignItemKind::Fn(sig, arg_idents, generics) => {
let (cb, ib) = self.head("");
@@ -565,7 +587,7 @@ impl<'a> State<'a> {
self.hardbreak_if_not_bol();
self.maybe_print_comment(item.span.lo());
let attrs = self.attrs(item.hir_id());
self.print_attrs_as_outer(attrs);
self.print_outer_attrs(attrs);
self.ann.pre(self, AnnNode::Item(item));
match item.kind {
hir::ItemKind::ExternCrate(orig_name, ident) => {
@@ -647,14 +669,15 @@ impl<'a> State<'a> {
self.print_ident(ident);
self.nbsp();
self.bopen(ib);
self.print_mod(mod_, attrs);
self.print_inner_attrs(attrs);
self.print_mod(mod_);
self.bclose(item.span, cb);
}
hir::ItemKind::ForeignMod { abi, items } => {
let (cb, ib) = self.head("extern");
self.word_nbsp(abi.to_string());
self.bopen(ib);
self.print_attrs_as_inner(self.attrs(item.hir_id()));
self.print_inner_attrs(attrs);
for item in items {
self.ann.nested(self, Nested::ForeignItem(item.id));
}
@@ -731,7 +754,7 @@ impl<'a> State<'a> {

self.space();
self.bopen(ib);
self.print_attrs_as_inner(attrs);
self.print_inner_attrs(attrs);
for impl_item in items {
self.ann.nested(self, Nested::ImplItem(impl_item.id));
}
@@ -822,7 +845,7 @@ impl<'a> State<'a> {
for v in variants {
self.space_if_not_bol();
self.maybe_print_comment(v.span.lo());
self.print_attrs_as_outer(self.attrs(v.hir_id));
self.print_outer_attrs(self.attrs(v.hir_id));
let ib = self.ibox(INDENT_UNIT);
self.print_variant(v);
self.word(",");
@@ -857,7 +880,7 @@ impl<'a> State<'a> {
self.popen();
self.commasep(Inconsistent, struct_def.fields(), |s, field| {
s.maybe_print_comment(field.span.lo());
s.print_attrs_as_outer(s.attrs(field.hir_id));
s.print_outer_attrs(s.attrs(field.hir_id));
s.print_type(field.ty);
});
self.pclose();
@@ -878,7 +901,7 @@ impl<'a> State<'a> {
for field in struct_def.fields() {
self.hardbreak_if_not_bol();
self.maybe_print_comment(field.span.lo());
self.print_attrs_as_outer(self.attrs(field.hir_id));
self.print_outer_attrs(self.attrs(field.hir_id));
self.print_ident(field.ident);
self.word_nbsp(":");
self.print_type(field.ty);
@@ -916,7 +939,7 @@ impl<'a> State<'a> {
self.ann.pre(self, AnnNode::SubItem(ti.hir_id()));
self.hardbreak_if_not_bol();
self.maybe_print_comment(ti.span.lo());
self.print_attrs_as_outer(self.attrs(ti.hir_id()));
self.print_outer_attrs(self.attrs(ti.hir_id()));
match ti.kind {
hir::TraitItemKind::Const(ty, default) => {
self.print_associated_const(ti.ident, ti.generics, ty, default);
@@ -944,7 +967,7 @@ impl<'a> State<'a> {
self.ann.pre(self, AnnNode::SubItem(ii.hir_id()));
self.hardbreak_if_not_bol();
self.maybe_print_comment(ii.span.lo());
self.print_attrs_as_outer(self.attrs(ii.hir_id()));
self.print_outer_attrs(self.attrs(ii.hir_id()));

match ii.kind {
hir::ImplItemKind::Const(ty, expr) => {
@@ -1028,27 +1051,39 @@ impl<'a> State<'a> {
}

fn print_block(&mut self, blk: &hir::Block<'_>, cb: BoxMarker, ib: BoxMarker) {
self.print_block_with_attrs(blk, &[], cb, ib)
self.print_block_with_owner_attrs(blk, &[], cb, ib);
}

fn print_block_unclosed(&mut self, blk: &hir::Block<'_>, ib: BoxMarker) {
self.print_block_maybe_unclosed(blk, &[], None, ib)
self.print_block_maybe_unclosed(blk, &[], &[], None, ib);
}

fn print_block_with_owner_attrs(
&mut self,
blk: &hir::Block<'_>,
owner_attrs: &[hir::Attribute],
cb: BoxMarker,
ib: BoxMarker,
) {
self.print_block_with_owner_and_expr_attrs(blk, owner_attrs, &[], cb, ib);
}

fn print_block_with_attrs(
fn print_block_with_owner_and_expr_attrs(
&mut self,
blk: &hir::Block<'_>,
attrs: &[hir::Attribute],
owner_attrs: &[hir::Attribute],
expr_attrs: &[hir::Attribute],
cb: BoxMarker,
ib: BoxMarker,
) {
self.print_block_maybe_unclosed(blk, attrs, Some(cb), ib)
self.print_block_maybe_unclosed(blk, owner_attrs, expr_attrs, Some(cb), ib);
}

fn print_block_maybe_unclosed(
&mut self,
blk: &hir::Block<'_>,
attrs: &[hir::Attribute],
owner_attrs: &[hir::Attribute],
expr_attrs: &[hir::Attribute],
cb: Option<BoxMarker>,
ib: BoxMarker,
) {
@@ -1060,7 +1095,8 @@ impl<'a> State<'a> {
self.ann.pre(self, AnnNode::Block(blk));
self.bopen(ib);

self.print_attrs_as_inner(attrs);
self.print_inner_attrs(owner_attrs);
self.print_inner_attrs(expr_attrs);

for st in blk.stmts {
self.print_stmt(st);
@@ -1251,7 +1287,7 @@ impl<'a> State<'a> {

fn print_expr_field(&mut self, field: &hir::ExprField<'_>) {
let cb = self.cbox(INDENT_UNIT);
self.print_attrs_as_outer(self.attrs(field.hir_id));
self.print_outer_attrs(self.attrs(field.hir_id));
if !field.is_shorthand {
self.print_ident(field.ident);
self.word_space(":");
@@ -1450,8 +1486,17 @@ impl<'a> State<'a> {
}

fn print_expr(&mut self, expr: &hir::Expr<'_>) {
self.print_expr_with_owner_inner_attrs(expr, &[]);
}

fn print_expr_with_owner_inner_attrs(
&mut self,
expr: &hir::Expr<'_>,
owner_attrs: &[hir::Attribute],
) {
self.maybe_print_comment(expr.span.lo());
self.print_attrs_as_outer(self.attrs(expr.hir_id));
let expr_attrs = self.attrs(expr.hir_id);
self.print_outer_attrs(expr_attrs);
let ib = self.ibox(INDENT_UNIT);
self.ann.pre(self, AnnNode::Expr(expr));
match expr.kind {
@@ -1587,7 +1632,7 @@ impl<'a> State<'a> {
let cb = self.cbox(0);
// head-box, will be closed by print-block after `{`
let ib = self.ibox(0);
self.print_block(blk, cb, ib);
self.print_block_with_owner_and_expr_attrs(blk, owner_attrs, expr_attrs, cb, ib);
}
hir::ExprKind::Assign(lhs, rhs, _) => {
self.print_expr_cond_paren(lhs, self.precedence(lhs) <= ExprPrecedence::Assign);
@@ -2076,7 +2121,7 @@ impl<'a> State<'a> {
self.space();
}
let cb = self.cbox(INDENT_UNIT);
self.print_attrs_as_outer(self.attrs(field.hir_id));
self.print_outer_attrs(self.attrs(field.hir_id));
if !field.is_shorthand {
self.print_ident(field.ident);
self.word_nbsp(":");
@@ -2086,7 +2131,7 @@ impl<'a> State<'a> {
}

fn print_param(&mut self, arg: &hir::Param<'_>) {
self.print_attrs_as_outer(self.attrs(arg.hir_id));
self.print_outer_attrs(self.attrs(arg.hir_id));
self.print_pat(arg.pat);
}

@@ -2121,7 +2166,7 @@ impl<'a> State<'a> {
let cb = self.cbox(INDENT_UNIT);
self.ann.pre(self, AnnNode::Arm(arm));
let ib = self.ibox(0);
self.print_attrs_as_outer(self.attrs(arm.hir_id));
self.print_outer_attrs(self.attrs(arm.hir_id));
self.print_pat(arm.pat);
self.space();
if let Some(ref g) = arm.guard {
@@ -2409,7 +2454,7 @@ impl<'a> State<'a> {
}

fn print_where_predicate(&mut self, predicate: &hir::WherePredicate<'_>) {
self.print_attrs_as_outer(self.attrs(predicate.hir_id));
self.print_outer_attrs(self.attrs(predicate.hir_id));
match *predicate.kind {
hir::WherePredicateKind::BoundPredicate(hir::WhereBoundPredicate {
bound_generic_params,
4 changes: 4 additions & 0 deletions compiler/rustc_middle/src/hir/map.rs
Original file line number Diff line number Diff line change
@@ -1095,6 +1095,10 @@ impl<'tcx> intravisit::HirTyCtxt<'tcx> for TyCtxt<'tcx> {
(*self).hir_body(id)
}

fn hir_body_owner(&self, id: BodyId) -> HirId {
(*self).hir_body_owner(id)
}

fn hir_item(&self, id: ItemId) -> &'tcx Item<'tcx> {
(*self).hir_item(id)
}
8 changes: 8 additions & 0 deletions tests/ui/deprecation/deprecated-expr-precedence.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
//@ check-fail
//@ compile-flags: --crate-type=lib

// Regression test for issue 142649
pub fn public() {
#[deprecated] 0
//~^ ERROR mismatched types
}
11 changes: 11 additions & 0 deletions tests/ui/deprecation/deprecated-expr-precedence.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
error[E0308]: mismatched types
--> $DIR/deprecated-expr-precedence.rs:6:19
|
LL | pub fn public() {
| - help: try adding a return type: `-> i32`
LL | #[deprecated] 0
| ^ expected `()`, found integer

error: aborting due to 1 previous error

For more information about this error, try `rustc --explain E0308`.
5 changes: 5 additions & 0 deletions tests/ui/unpretty/deprecated-attr.rs
Original file line number Diff line number Diff line change
@@ -16,3 +16,8 @@ pub struct SinceAndNote;

#[deprecated(note = "here's why this is deprecated", since = "1.2.3")]
pub struct FlippedOrder;

pub fn f() {
// Attribute is ignored here (with a warning), but still preserved in HIR
#[deprecated] 0
}
9 changes: 9 additions & 0 deletions tests/ui/unpretty/deprecated-attr.stdout
Original file line number Diff line number Diff line change
@@ -24,3 +24,12 @@ struct SinceAndNote;
#[attr = Deprecation {deprecation: Deprecation {since: NonStandard("1.2.3"),
note: "here's why this is deprecated"}}]
struct FlippedOrder;

fn f() {

// Attribute is ignored here (with a warning), but still preserved in HIR
#[attr = Deprecation {deprecation:
Deprecation {since:
Unspecified}}]
0
}
4 changes: 1 addition & 3 deletions tests/ui/unpretty/diagnostic-attr.stdout
Original file line number Diff line number Diff line change
@@ -12,6 +12,4 @@ extern crate std;
trait ImportantTrait<A> { }

#[diagnostic::do_not_recommend]
impl <T> ImportantTrait<T> for T where T: Clone
{#![diagnostic::do_not_recommend]
}
impl <T> ImportantTrait<T> for T where T: Clone { }
2 changes: 1 addition & 1 deletion tests/ui/unpretty/exhaustive-asm.hir.stdout
Original file line number Diff line number Diff line change
@@ -26,7 +26,7 @@ mod expressions {

mod items {
/// ItemKind::GlobalAsm
mod item_global_asm {/// ItemKind::GlobalAsm
mod item_global_asm {
global_asm! (".globl my_asm_func");
}
}
70 changes: 28 additions & 42 deletions tests/ui/unpretty/exhaustive.hir.stdout
Original file line number Diff line number Diff line change
@@ -50,13 +50,6 @@ mod prelude {
}
}

//! inner single-line doc comment
/*!
* inner multi-line doc comment
*/
#[doc = "inner doc attribute"]
#[allow(dead_code, unused_variables)]
#[no_std]
mod attributes {//! inner single-line doc comment
/*!
* inner multi-line doc comment
@@ -236,8 +229,8 @@ mod expressions {
'a: { }
#[allow()]
{ }
#[allow()]
{ }
{#![allow()]
}
}

/// ExprKind::Gen
@@ -411,25 +404,25 @@ mod expressions {
}
mod items {
/// ItemKind::ExternCrate
mod item_extern_crate {/// ItemKind::ExternCrate
mod item_extern_crate {
extern crate core;
extern crate self as unpretty;
extern crate core as _;
}
/// ItemKind::Use
mod item_use {/// ItemKind::Use
mod item_use {
use ::{};
use crate::expressions;
use crate::items::item_use;
use core::*;
}
/// ItemKind::Static
mod item_static {/// ItemKind::Static
mod item_static {
static A: () = { };
static mut B: () = { };
}
/// ItemKind::Const
mod item_const {/// ItemKind::Const
mod item_const {
const A: () = { };
trait TraitItems {
const
@@ -443,7 +436,7 @@ mod items {
}
}
/// ItemKind::Fn
mod item_fn {/// ItemKind::Fn
mod item_fn {
const unsafe extern "C" fn f() { }
async unsafe extern "C" fn g()
->
@@ -458,21 +451,19 @@ mod items {
}
}
/// ItemKind::Mod
mod item_mod {/// ItemKind::Mod
}
mod item_mod { }
/// ItemKind::ForeignMod
mod item_foreign_mod {/// ItemKind::ForeignMod
mod item_foreign_mod {
extern "Rust" { }
extern "C" { }
}
/// ItemKind::GlobalAsm: see exhaustive-asm.rs
/// ItemKind::TyAlias
mod item_ty_alias {/// ItemKind::GlobalAsm: see exhaustive-asm.rs
/// ItemKind::TyAlias
mod item_ty_alias {
type Type<'a> where T: 'a = T;
}
/// ItemKind::Enum
mod item_enum {/// ItemKind::Enum
mod item_enum {
enum Void { }
enum Empty {
Unit,
@@ -488,7 +479,7 @@ mod items {
}
}
/// ItemKind::Struct
mod item_struct {/// ItemKind::Struct
mod item_struct {
struct Unit;
struct Tuple();
struct Newtype(Unit);
@@ -499,44 +490,39 @@ mod items {
}
}
/// ItemKind::Union
mod item_union {/// ItemKind::Union
mod item_union {
union Generic<'a, T> where T: 'a {
t: T,
}
}
/// ItemKind::Trait
mod item_trait {/// ItemKind::Trait
mod item_trait {
auto unsafe trait Send { }
trait Trait<'a>: Sized where Self: 'a { }
}
/// ItemKind::TraitAlias
mod item_trait_alias {/// ItemKind::TraitAlias
mod item_trait_alias {
trait Trait<T> = Sized where for<'a> T: 'a;
}
/// ItemKind::Impl
mod item_impl {/// ItemKind::Impl
mod item_impl {
impl () { }
impl <T> () { }
impl Default for () { }
impl const <T> Default for () { }
}
/// ItemKind::MacCall
mod item_mac_call {/// ItemKind::MacCall
}
mod item_mac_call { }
/// ItemKind::MacroDef
mod item_macro_def {/// ItemKind::MacroDef
mod item_macro_def {
macro_rules! mac { () => {...}; }
macro stringify { () => {} }
}
/// ItemKind::Delegation
/*! FIXME: todo */
mod item_delegation {/// ItemKind::Delegation
/*! FIXME: todo */
mod item_delegation {/*! FIXME: todo */
}
/// ItemKind::DelegationMac
/*! FIXME: todo */
mod item_delegation_mac {/// ItemKind::DelegationMac
/*! FIXME: todo */
mod item_delegation_mac {/*! FIXME: todo */
}
}
mod patterns {
@@ -688,29 +674,29 @@ mod types {
/// TyKind::Paren
fn ty_paren() { let _: T; }
/// TyKind::Typeof
/*! unused for now */
fn ty_typeof() { }
fn ty_typeof() {/*! unused for now */
}
/// TyKind::Infer
fn ty_infer() { let _: _; }
/// TyKind::ImplicitSelf
/*! there is no syntax for this */
fn ty_implicit_self() { }
fn ty_implicit_self() {/*! there is no syntax for this */
}
/// TyKind::MacCall
#[expect(deprecated)]
fn ty_mac_call() { let _: T; let _: T; let _: T; }
/// TyKind::CVarArgs
/*! FIXME: todo */
fn ty_c_var_args() { }
fn ty_c_var_args() {/*! FIXME: todo */
}
/// TyKind::Pat
fn ty_pat() { let _: u32 is 1..=RangeMax; }
}
mod visibilities {
/// VisibilityKind::Public
mod visibility_public {/// VisibilityKind::Public
mod visibility_public {
struct Pub;
}
/// VisibilityKind::Restricted
mod visibility_restricted {/// VisibilityKind::Restricted
mod visibility_restricted {
struct PubCrate;
struct PubSelf;
struct PubSuper;