Reword comments and rename HIR visiting methods.

This commit is contained in:
Camille GILLOT 2022-07-03 15:28:57 +02:00
parent c461f7a16e
commit 111df9e6ed
18 changed files with 113 additions and 105 deletions

View file

@ -19,7 +19,7 @@
//! - Example: Examine each expression to look for its type and do some check or other. //! - Example: Examine each expression to look for its type and do some check or other.
//! - How: Implement `intravisit::Visitor` and override the `NestedFilter` type to //! - How: Implement `intravisit::Visitor` and override the `NestedFilter` type to
//! `nested_filter::OnlyBodies` (and implement `nested_visit_map`), and use //! `nested_filter::OnlyBodies` (and implement `nested_visit_map`), and use
//! `tcx.hir().deep_visit_all_item_likes(&mut visitor)`. Within your //! `tcx.hir().visit_all_item_likes_in_crate(&mut visitor)`. Within your
//! `intravisit::Visitor` impl, implement methods like `visit_expr()` (don't forget to invoke //! `intravisit::Visitor` impl, implement methods like `visit_expr()` (don't forget to invoke
//! `intravisit::walk_expr()` to keep walking the subparts). //! `intravisit::walk_expr()` to keep walking the subparts).
//! - Pro: Visitor methods for any kind of HIR node, not just item-like things. //! - Pro: Visitor methods for any kind of HIR node, not just item-like things.
@ -190,7 +190,7 @@ use nested_filter::NestedFilter;
/// (this is why the module is called `intravisit`, to distinguish it /// (this is why the module is called `intravisit`, to distinguish it
/// from the AST's `visit` module, which acts differently). If you /// from the AST's `visit` module, which acts differently). If you
/// simply want to visit all items in the crate in some order, you /// simply want to visit all items in the crate in some order, you
/// should call `Crate::visit_all_items`. Otherwise, see the comment /// should call `tcx.hir().visit_all_item_likes_in_crate`. Otherwise, see the comment
/// on `visit_nested_item` for details on how to visit nested items. /// on `visit_nested_item` for details on how to visit nested items.
/// ///
/// If you want to ensure that your code handles every variant /// If you want to ensure that your code handles every variant

View file

@ -75,7 +75,7 @@ pub fn assert_dep_graph(tcx: TyCtxt<'_>) {
let mut visitor = let mut visitor =
IfThisChanged { tcx, if_this_changed: vec![], then_this_would_need: vec![] }; IfThisChanged { tcx, if_this_changed: vec![], then_this_would_need: vec![] };
visitor.process_attrs(hir::CRATE_HIR_ID); visitor.process_attrs(hir::CRATE_HIR_ID);
tcx.hir().deep_visit_all_item_likes(&mut visitor); tcx.hir().visit_all_item_likes_in_crate(&mut visitor);
(visitor.if_this_changed, visitor.then_this_would_need) (visitor.if_this_changed, visitor.then_this_would_need)
}; };

View file

@ -419,7 +419,7 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
return; return;
} }
self.tcx.hir().deep_visit_all_item_likes(self); self.tcx.hir().visit_all_item_likes_in_crate(self);
} }
fn encode_def_path_table(&mut self) { fn encode_def_path_table(&mut self) {

View file

@ -568,7 +568,7 @@ impl<'hir> Map<'hir> {
} }
} }
/// Walks the contents of a crate. See also `Crate::visit_all_items`. /// Walks the contents of the local crate. See also `visit_all_item_likes_in_crate`.
pub fn walk_toplevel_module(self, visitor: &mut impl Visitor<'hir>) { pub fn walk_toplevel_module(self, visitor: &mut impl Visitor<'hir>) {
let (top_mod, span, hir_id) = self.get_module(CRATE_DEF_ID); let (top_mod, span, hir_id) = self.get_module(CRATE_DEF_ID);
visitor.visit_mod(top_mod, span, hir_id); visitor.visit_mod(top_mod, span, hir_id);
@ -588,53 +588,61 @@ impl<'hir> Map<'hir> {
} }
} }
/// Visits all items in the crate in some deterministic (but /// Visits all item-likes in the crate in some deterministic (but unspecified) order. If you
/// unspecified) order. If you need to process every item, /// need to process every item-like, and don't care about visiting nested items in a particular
/// and care about nesting -- usually because your algorithm /// order then this method is the best choice. If you do care about this nesting, you should
/// follows lexical scoping rules -- then this method is the best choice. /// use the `tcx.hir().walk_toplevel_module`.
/// If you don't care about nesting, you should use the `tcx.hir_crate_items()` query ///
/// or `items()` instead. /// Note that this function will access HIR for all the item-likes in the crate. If you only
/// need to access some of them, it is usually better to manually loop on the iterators
/// provided by `tcx.hir_crate_items(())`.
/// ///
/// Please see the notes in `intravisit.rs` for more information. /// Please see the notes in `intravisit.rs` for more information.
pub fn deep_visit_all_item_likes<V>(self, visitor: &mut V) pub fn visit_all_item_likes_in_crate<V>(self, visitor: &mut V)
where where
V: Visitor<'hir>, V: Visitor<'hir>,
{ {
let krate = self.krate(); let krate = self.tcx.hir_crate_items(());
for owner in krate.owners.iter().filter_map(|i| i.as_owner()) {
match owner.node() { for id in krate.items() {
OwnerNode::Item(item) => visitor.visit_item(item), visitor.visit_item(self.item(id));
OwnerNode::ForeignItem(item) => visitor.visit_foreign_item(item), }
OwnerNode::ImplItem(item) => visitor.visit_impl_item(item),
OwnerNode::TraitItem(item) => visitor.visit_trait_item(item), for id in krate.trait_items() {
OwnerNode::Crate(_) => {} visitor.visit_trait_item(self.trait_item(id));
} }
for id in krate.impl_items() {
visitor.visit_impl_item(self.impl_item(id));
}
for id in krate.foreign_items() {
visitor.visit_foreign_item(self.foreign_item(id));
} }
} }
/// If you don't care about nesting, you should use the /// This method is the equivalent of `visit_all_item_likes_in_crate` but restricted to
/// `tcx.hir_module_items()` query or `module_items()` instead. /// item-likes in a single module.
/// Please see notes in `deep_visit_all_item_likes`. pub fn visit_item_likes_in_module<V>(self, module: LocalDefId, visitor: &mut V)
pub fn deep_visit_item_likes_in_module<V>(self, module: LocalDefId, visitor: &mut V)
where where
V: Visitor<'hir>, V: Visitor<'hir>,
{ {
let module = self.tcx.hir_module_items(module); let module = self.tcx.hir_module_items(module);
for id in module.items.iter() { for id in module.items() {
visitor.visit_item(self.item(*id)); visitor.visit_item(self.item(id));
} }
for id in module.trait_items.iter() { for id in module.trait_items() {
visitor.visit_trait_item(self.trait_item(*id)); visitor.visit_trait_item(self.trait_item(id));
} }
for id in module.impl_items.iter() { for id in module.impl_items() {
visitor.visit_impl_item(self.impl_item(*id)); visitor.visit_impl_item(self.impl_item(id));
} }
for id in module.foreign_items.iter() { for id in module.foreign_items() {
visitor.visit_foreign_item(self.foreign_item(*id)); visitor.visit_foreign_item(self.foreign_item(id));
} }
} }

View file

@ -8,7 +8,7 @@ use rustc_hir::intravisit::nested_filter::NestedFilter;
/// constant arguments of types, e.g. in `let _: [(); /* HERE */];`. /// constant arguments of types, e.g. in `let _: [(); /* HERE */];`.
/// ///
/// **This is the most common choice.** A very common pattern is /// **This is the most common choice.** A very common pattern is
/// to use `deep_visit_all_item_likes()` as an outer loop, /// to use `visit_all_item_likes_in_crate()` as an outer loop,
/// and to have the visitor that visits the contents of each item /// and to have the visitor that visits the contents of each item
/// using this setting. /// using this setting.
pub struct OnlyBodies(()); pub struct OnlyBodies(());

View file

@ -173,7 +173,7 @@ fn mir_keys(tcx: TyCtxt<'_>, (): ()) -> FxIndexSet<LocalDefId> {
intravisit::walk_struct_def(self, v) intravisit::walk_struct_def(self, v)
} }
} }
tcx.hir().deep_visit_all_item_likes(&mut GatherCtors { tcx, set: &mut set }); tcx.hir().visit_all_item_likes_in_crate(&mut GatherCtors { tcx, set: &mut set });
set set
} }

View file

@ -2428,7 +2428,7 @@ fn check_non_exported_macro_for_invalid_attrs(tcx: TyCtxt<'_>, item: &Item<'_>)
fn check_mod_attrs(tcx: TyCtxt<'_>, module_def_id: LocalDefId) { fn check_mod_attrs(tcx: TyCtxt<'_>, module_def_id: LocalDefId) {
let check_attr_visitor = &mut CheckAttrVisitor { tcx }; let check_attr_visitor = &mut CheckAttrVisitor { tcx };
tcx.hir().deep_visit_item_likes_in_module(module_def_id, check_attr_visitor); tcx.hir().visit_item_likes_in_module(module_def_id, check_attr_visitor);
if module_def_id.is_top_level_module() { if module_def_id.is_top_level_module() {
check_attr_visitor.check_attributes(CRATE_HIR_ID, DUMMY_SP, Target::Mod, None); check_attr_visitor.check_attributes(CRATE_HIR_ID, DUMMY_SP, Target::Mod, None);
check_invalid_crate_level_attr(tcx, tcx.hir().krate_attrs()); check_invalid_crate_level_attr(tcx, tcx.hir().krate_attrs());

View file

@ -56,7 +56,7 @@ impl NonConstExpr {
fn check_mod_const_bodies(tcx: TyCtxt<'_>, module_def_id: LocalDefId) { fn check_mod_const_bodies(tcx: TyCtxt<'_>, module_def_id: LocalDefId) {
let mut vis = CheckConstVisitor::new(tcx); let mut vis = CheckConstVisitor::new(tcx);
tcx.hir().deep_visit_item_likes_in_module(module_def_id, &mut vis); tcx.hir().visit_item_likes_in_module(module_def_id, &mut vis);
} }
pub(crate) fn provide(providers: &mut Providers) { pub(crate) fn provide(providers: &mut Providers) {

View file

@ -28,7 +28,7 @@ pub fn check_crate(tcx: TyCtxt<'_>) {
errors: &errors, errors: &errors,
}; };
tcx.hir().deep_visit_item_likes_in_module(module_id, &mut v); tcx.hir().visit_item_likes_in_module(module_id, &mut v);
}); });
let errors = errors.into_inner(); let errors = errors.into_inner();

View file

@ -140,7 +140,7 @@ fn live_node_kind_to_string(lnk: LiveNodeKind, tcx: TyCtxt<'_>) -> String {
} }
fn check_mod_liveness(tcx: TyCtxt<'_>, module_def_id: LocalDefId) { fn check_mod_liveness(tcx: TyCtxt<'_>, module_def_id: LocalDefId) {
tcx.hir().deep_visit_item_likes_in_module(module_def_id, &mut IrMaps::new(tcx)); tcx.hir().visit_item_likes_in_module(module_def_id, &mut IrMaps::new(tcx));
} }
pub fn provide(providers: &mut Providers) { pub fn provide(providers: &mut Providers) {

View file

@ -31,7 +31,7 @@ struct CheckLoopVisitor<'a, 'hir> {
} }
fn check_mod_loops(tcx: TyCtxt<'_>, module_def_id: LocalDefId) { fn check_mod_loops(tcx: TyCtxt<'_>, module_def_id: LocalDefId) {
tcx.hir().deep_visit_item_likes_in_module( tcx.hir().visit_item_likes_in_module(
module_def_id, module_def_id,
&mut CheckLoopVisitor { sess: &tcx.sess, hir_map: tcx.hir(), cx: Normal }, &mut CheckLoopVisitor { sess: &tcx.sess, hir_map: tcx.hir(), cx: Normal },
); );

View file

@ -14,7 +14,7 @@ use rustc_span::Span;
use rustc_target::spec::abi::Abi; use rustc_target::spec::abi::Abi;
fn check_mod_naked_functions(tcx: TyCtxt<'_>, module_def_id: LocalDefId) { fn check_mod_naked_functions(tcx: TyCtxt<'_>, module_def_id: LocalDefId) {
tcx.hir().deep_visit_item_likes_in_module(module_def_id, &mut CheckNakedFunctions { tcx }); tcx.hir().visit_item_likes_in_module(module_def_id, &mut CheckNakedFunctions { tcx });
} }
pub(crate) fn provide(providers: &mut Providers) { pub(crate) fn provide(providers: &mut Providers) {

View file

@ -660,7 +660,7 @@ fn stability_index(tcx: TyCtxt<'_>, (): ()) -> Index {
/// Cross-references the feature names of unstable APIs with enabled /// Cross-references the feature names of unstable APIs with enabled
/// features and possibly prints errors. /// features and possibly prints errors.
fn check_mod_unstable_api_usage(tcx: TyCtxt<'_>, module_def_id: LocalDefId) { fn check_mod_unstable_api_usage(tcx: TyCtxt<'_>, module_def_id: LocalDefId) {
tcx.hir().deep_visit_item_likes_in_module(module_def_id, &mut Checker { tcx }); tcx.hir().visit_item_likes_in_module(module_def_id, &mut Checker { tcx });
} }
pub(crate) fn provide(providers: &mut Providers) { pub(crate) fn provide(providers: &mut Providers) {
@ -890,7 +890,7 @@ pub fn check_unused_or_stable_features(tcx: TyCtxt<'_>) {
let mut missing = MissingStabilityAnnotations { tcx, access_levels }; let mut missing = MissingStabilityAnnotations { tcx, access_levels };
missing.check_missing_stability(CRATE_DEF_ID, tcx.hir().span(CRATE_HIR_ID)); missing.check_missing_stability(CRATE_DEF_ID, tcx.hir().span(CRATE_HIR_ID));
tcx.hir().walk_toplevel_module(&mut missing); tcx.hir().walk_toplevel_module(&mut missing);
tcx.hir().deep_visit_all_item_likes(&mut missing); tcx.hir().visit_all_item_likes_in_crate(&mut missing);
} }
let declared_lang_features = &tcx.features().declared_lang_features; let declared_lang_features = &tcx.features().declared_lang_features;

View file

@ -59,7 +59,7 @@ struct OnlySelfBounds(bool);
// Main entry point // Main entry point
fn collect_mod_item_types(tcx: TyCtxt<'_>, module_def_id: LocalDefId) { fn collect_mod_item_types(tcx: TyCtxt<'_>, module_def_id: LocalDefId) {
tcx.hir().deep_visit_item_likes_in_module(module_def_id, &mut CollectItemTypesVisitor { tcx }); tcx.hir().visit_item_likes_in_module(module_def_id, &mut CollectItemTypesVisitor { tcx });
} }
pub fn provide(providers: &mut Providers) { pub fn provide(providers: &mut Providers) {

View file

@ -303,7 +303,7 @@ pub(crate) fn run(
// Run call-finder on all items // Run call-finder on all items
let mut calls = FxHashMap::default(); let mut calls = FxHashMap::default();
let mut finder = FindCalls { calls: &mut calls, tcx, map: tcx.hir(), cx, target_crates }; let mut finder = FindCalls { calls: &mut calls, tcx, map: tcx.hir(), cx, target_crates };
tcx.hir().deep_visit_all_item_likes(&mut finder); tcx.hir().visit_all_item_likes_in_crate(&mut finder);
// Sort call locations within a given file in document order // Sort call locations within a given file in document order
for fn_calls in calls.values_mut() { for fn_calls in calls.values_mut() {

View file

@ -16,12 +16,6 @@ error: no path from `WillChange` to `trait_def`
LL | #[rustc_then_this_would_need(trait_def)] LL | #[rustc_then_this_would_need(trait_def)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: OK
--> $DIR/dep-graph-struct-signature.rs:32:9
|
LL | #[rustc_then_this_would_need(fn_sig)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: OK error: OK
--> $DIR/dep-graph-struct-signature.rs:36:5 --> $DIR/dep-graph-struct-signature.rs:36:5
| |
@ -52,36 +46,12 @@ error: OK
LL | #[rustc_then_this_would_need(type_of)] LL | #[rustc_then_this_would_need(type_of)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: OK
--> $DIR/dep-graph-struct-signature.rs:48:9
|
LL | #[rustc_then_this_would_need(fn_sig)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: OK
--> $DIR/dep-graph-struct-signature.rs:49:9
|
LL | #[rustc_then_this_would_need(typeck)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: OK error: OK
--> $DIR/dep-graph-struct-signature.rs:53:5 --> $DIR/dep-graph-struct-signature.rs:53:5
| |
LL | #[rustc_then_this_would_need(type_of)] LL | #[rustc_then_this_would_need(type_of)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: OK
--> $DIR/dep-graph-struct-signature.rs:55:9
|
LL | #[rustc_then_this_would_need(fn_sig)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: OK
--> $DIR/dep-graph-struct-signature.rs:56:9
|
LL | #[rustc_then_this_would_need(typeck)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: OK error: OK
--> $DIR/dep-graph-struct-signature.rs:61:9 --> $DIR/dep-graph-struct-signature.rs:61:9
| |
@ -106,12 +76,6 @@ error: no path from `WillChange` to `type_of`
LL | #[rustc_then_this_would_need(type_of)] LL | #[rustc_then_this_would_need(type_of)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: no path from `WillChange` to `fn_sig`
--> $DIR/dep-graph-struct-signature.rs:77:9
|
LL | #[rustc_then_this_would_need(fn_sig)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: no path from `WillChange` to `fn_sig` error: no path from `WillChange` to `fn_sig`
--> $DIR/dep-graph-struct-signature.rs:81:5 --> $DIR/dep-graph-struct-signature.rs:81:5
| |
@ -130,5 +94,41 @@ error: no path from `WillChange` to `typeck`
LL | #[rustc_then_this_would_need(typeck)] LL | #[rustc_then_this_would_need(typeck)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: OK
--> $DIR/dep-graph-struct-signature.rs:32:9
|
LL | #[rustc_then_this_would_need(fn_sig)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: no path from `WillChange` to `fn_sig`
--> $DIR/dep-graph-struct-signature.rs:77:9
|
LL | #[rustc_then_this_would_need(fn_sig)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: OK
--> $DIR/dep-graph-struct-signature.rs:48:9
|
LL | #[rustc_then_this_would_need(fn_sig)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: OK
--> $DIR/dep-graph-struct-signature.rs:49:9
|
LL | #[rustc_then_this_would_need(typeck)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: OK
--> $DIR/dep-graph-struct-signature.rs:55:9
|
LL | #[rustc_then_this_would_need(fn_sig)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: OK
--> $DIR/dep-graph-struct-signature.rs:56:9
|
LL | #[rustc_then_this_would_need(typeck)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: aborting due to 22 previous errors error: aborting due to 22 previous errors

View file

@ -28,30 +28,12 @@ error: no path from `TypeAlias` to `type_of`
LL | #[rustc_then_this_would_need(type_of)] LL | #[rustc_then_this_would_need(type_of)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: OK
--> $DIR/dep-graph-type-alias.rs:36:5
|
LL | #[rustc_then_this_would_need(fn_sig)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: no path from `TypeAlias` to `type_of` error: no path from `TypeAlias` to `type_of`
--> $DIR/dep-graph-type-alias.rs:42:1 --> $DIR/dep-graph-type-alias.rs:42:1
| |
LL | #[rustc_then_this_would_need(type_of)] LL | #[rustc_then_this_would_need(type_of)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: OK
--> $DIR/dep-graph-type-alias.rs:44:5
|
LL | #[rustc_then_this_would_need(fn_sig)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: OK
--> $DIR/dep-graph-type-alias.rs:45:5
|
LL | #[rustc_then_this_would_need(typeck)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: OK error: OK
--> $DIR/dep-graph-type-alias.rs:49:1 --> $DIR/dep-graph-type-alias.rs:49:1
| |
@ -70,5 +52,23 @@ error: OK
LL | #[rustc_then_this_would_need(typeck)] LL | #[rustc_then_this_would_need(typeck)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: OK
--> $DIR/dep-graph-type-alias.rs:36:5
|
LL | #[rustc_then_this_would_need(fn_sig)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: OK
--> $DIR/dep-graph-type-alias.rs:44:5
|
LL | #[rustc_then_this_would_need(fn_sig)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: OK
--> $DIR/dep-graph-type-alias.rs:45:5
|
LL | #[rustc_then_this_would_need(typeck)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: aborting due to 12 previous errors error: aborting due to 12 previous errors

View file

@ -4,12 +4,6 @@ error: function has missing const stability attribute
LL | pub const fn foo() {} LL | pub const fn foo() {}
| ^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^
error: associated function has missing const stability attribute
--> $DIR/missing-const-stability.rs:15:5
|
LL | pub const fn foo() {}
| ^^^^^^^^^^^^^^^^^^^^^
error: implementation has missing const stability attribute error: implementation has missing const stability attribute
--> $DIR/missing-const-stability.rs:27:1 --> $DIR/missing-const-stability.rs:27:1
| |
@ -19,5 +13,11 @@ LL | | fn fun() {}
LL | | } LL | | }
| |_^ | |_^
error: associated function has missing const stability attribute
--> $DIR/missing-const-stability.rs:15:5
|
LL | pub const fn foo() {}
| ^^^^^^^^^^^^^^^^^^^^^
error: aborting due to 3 previous errors error: aborting due to 3 previous errors