Skip to content

Commit e4bfc54

Browse files
committed
Port rustc_reservation_impl to the new attribute parser
1 parent 0a13b43 commit e4bfc54

8 files changed

Lines changed: 47 additions & 12 deletions

File tree

compiler/rustc_attr_parsing/src/attributes/rustc_internal.rs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -490,6 +490,7 @@ impl<S: Stage> CombineAttributeParser<S> for RustcMirParser {
490490
.collect()
491491
}
492492
}
493+
493494
pub(crate) struct RustcNonConstTraitMethodParser;
494495

495496
impl<S: Stage> NoArgsAttributeParser<S> for RustcNonConstTraitMethodParser {
@@ -721,3 +722,33 @@ impl<S: Stage> CombineAttributeParser<S> for RustcThenThisWouldNeedParser {
721722
Some(ident)
722723
}
723724
}
725+
726+
pub(crate) struct RustcReservationImplParser;
727+
728+
impl<S: Stage> SingleAttributeParser<S> for RustcReservationImplParser {
729+
const PATH: &[Symbol] = &[sym::rustc_reservation_impl];
730+
const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepOutermost;
731+
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Error;
732+
const ALLOWED_TARGETS: AllowedTargets =
733+
AllowedTargets::AllowList(&[Allow(Target::Impl { of_trait: true })]);
734+
735+
const TEMPLATE: AttributeTemplate = template!(Word, NameValueStr: "reservation message");
736+
737+
fn convert(cx: &mut AcceptContext<'_, '_, S>, args: &ArgParser) -> Option<AttributeKind> {
738+
match args {
739+
ArgParser::NoArgs => Some(AttributeKind::RustcReservationImpl(cx.attr_span, None)),
740+
ArgParser::List(list) => {
741+
cx.expected_name_value(list.span, None);
742+
None
743+
}
744+
ArgParser::NameValue(nv) => {
745+
let Some(value_str) = nv.value_as_str() else {
746+
cx.expected_string_literal(nv.value_span, Some(nv.value_as_lit()));
747+
return None;
748+
};
749+
750+
Some(AttributeKind::RustcReservationImpl(cx.attr_span, Some(value_str)))
751+
}
752+
}
753+
}
754+
}

compiler/rustc_attr_parsing/src/context.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,7 @@ attribute_parsers!(
201201
Single<RustcLintOptDenyFieldAccessParser>,
202202
Single<RustcMustImplementOneOfParser>,
203203
Single<RustcObjectLifetimeDefaultParser>,
204+
Single<RustcReservationImplParser>,
204205
Single<RustcScalableVectorParser>,
205206
Single<RustcSimdMonomorphizeLaneLimitParser>,
206207
Single<SanitizeParser>,

compiler/rustc_hir/src/attrs/data_structures.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1181,6 +1181,9 @@ pub enum AttributeKind {
11811181
/// Represents `#[rustc_reallocator]`
11821182
RustcReallocator,
11831183

1184+
/// Represents `#[rustc_reservation_impl]`
1185+
RustcReservationImpl(Span, Option<Symbol>),
1186+
11841187
/// Represents `#[rustc_scalable_vector(N)]`
11851188
RustcScalableVector {
11861189
/// The base multiple of lanes that are in a scalable vector, if provided. `element_count`

compiler/rustc_hir/src/attrs/encode_cross_crate.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@ impl AttributeKind {
141141
RustcPreserveUbChecks => No,
142142
RustcPubTransparent(..) => Yes,
143143
RustcReallocator => No,
144+
RustcReservationImpl(..) => Yes,
144145
RustcScalableVector { .. } => Yes,
145146
RustcShouldNotBeCalledOnConstItems(..) => Yes,
146147
RustcSimdMonomorphizeLaneLimit(..) => Yes, // Affects layout computation, which needs to work cross-crate

compiler/rustc_hir_analysis/src/collect.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1274,7 +1274,8 @@ fn impl_trait_header(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::ImplTraitHeader
12741274
.of_trait
12751275
.unwrap_or_else(|| panic!("expected impl trait, found inherent impl on {def_id:?}"));
12761276
let selfty = tcx.type_of(def_id).instantiate_identity();
1277-
let is_rustc_reservation = tcx.has_attr(def_id, sym::rustc_reservation_impl);
1277+
let is_rustc_reservation =
1278+
find_attr!(tcx.get_all_attrs(def_id), AttributeKind::RustcReservationImpl(..));
12781279

12791280
check_impl_constness(tcx, impl_.constness, &of_trait.trait_ref);
12801281

compiler/rustc_passes/src/check_attr.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,7 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
332332
| AttributeKind::RustcPassIndirectlyInNonRusticAbis(..)
333333
| AttributeKind::RustcPreserveUbChecks
334334
| AttributeKind::RustcReallocator
335+
| AttributeKind::RustcReservationImpl(..)
335336
| AttributeKind::RustcScalableVector { .. }
336337
| AttributeKind::RustcShouldNotBeCalledOnConstItems(..)
337338
| AttributeKind::RustcSimdMonomorphizeLaneLimit(..)
@@ -387,7 +388,6 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
387388
| sym::rustc_trivial_field_reads
388389
| sym::rustc_on_unimplemented
389390
| sym::rustc_do_not_const_check
390-
| sym::rustc_reservation_impl
391391
| sym::rustc_doc_primitive
392392
| sym::rustc_conversion_suggestion
393393
| sym::rustc_deprecated_safe_2024

compiler/rustc_trait_selection/src/traits/coherence.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,10 @@ use std::fmt::Debug;
88

99
use rustc_data_structures::fx::{FxHashSet, FxIndexSet};
1010
use rustc_errors::{Diag, EmissionGuarantee};
11+
use rustc_hir::attrs::AttributeKind;
1112
use rustc_hir::def::DefKind;
1213
use rustc_hir::def_id::{CRATE_DEF_ID, DefId};
14+
use rustc_hir::find_attr;
1315
use rustc_infer::infer::{DefineOpaqueTypes, InferCtxt, TyCtxtInferExt};
1416
use rustc_infer::traits::PredicateObligations;
1517
use rustc_macros::{TypeFoldable, TypeVisitable};
@@ -23,7 +25,7 @@ use rustc_middle::ty::{
2325
};
2426
pub use rustc_next_trait_solver::coherence::*;
2527
use rustc_next_trait_solver::solve::SolverDelegateEvalExt;
26-
use rustc_span::{DUMMY_SP, Span, sym};
28+
use rustc_span::{DUMMY_SP, Span};
2729
use tracing::{debug, instrument, warn};
2830

2931
use super::ObligationCtxt;
@@ -758,10 +760,7 @@ impl<'a, 'tcx> ProofTreeVisitor<'tcx> for AmbiguityCausesVisitor<'a, 'tcx> {
758760
} = cand.kind()
759761
&& let ty::ImplPolarity::Reservation = infcx.tcx.impl_polarity(def_id)
760762
{
761-
let message = infcx
762-
.tcx
763-
.get_attr(def_id, sym::rustc_reservation_impl)
764-
.and_then(|a| a.value_str());
763+
let message = find_attr!(infcx.tcx.get_all_attrs(def_id), AttributeKind::RustcReservationImpl(_, Some(message)) => *message);
765764
if let Some(message) = message {
766765
self.causes.insert(IntercrateAmbiguityCause::ReservationImpl { message });
767766
}

compiler/rustc_trait_selection/src/traits/select/mod.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@ use rustc_data_structures::assert_matches;
1212
use rustc_data_structures::fx::{FxIndexMap, FxIndexSet};
1313
use rustc_data_structures::stack::ensure_sufficient_stack;
1414
use rustc_errors::{Diag, EmissionGuarantee};
15-
use rustc_hir as hir;
16-
use rustc_hir::LangItem;
15+
use rustc_hir::attrs::AttributeKind;
1716
use rustc_hir::def_id::DefId;
17+
use rustc_hir::{self as hir, LangItem, find_attr};
1818
use rustc_infer::infer::BoundRegionConversionTime::{self, HigherRankedType};
1919
use rustc_infer::infer::DefineOpaqueTypes;
2020
use rustc_infer::infer::at::ToTrace;
@@ -33,7 +33,7 @@ use rustc_middle::ty::{
3333
may_use_unstable_feature,
3434
};
3535
use rustc_next_trait_solver::solve::AliasBoundKind;
36-
use rustc_span::{Symbol, sym};
36+
use rustc_span::Symbol;
3737
use tracing::{debug, instrument, trace};
3838

3939
use self::EvaluationResult::*;
@@ -1445,8 +1445,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
14451445
&& let ty::ImplPolarity::Reservation = tcx.impl_polarity(def_id)
14461446
{
14471447
if let Some(intercrate_ambiguity_clauses) = &mut self.intercrate_ambiguity_causes {
1448-
let message =
1449-
tcx.get_attr(def_id, sym::rustc_reservation_impl).and_then(|a| a.value_str());
1448+
let message = find_attr!(tcx.get_all_attrs(def_id), AttributeKind::RustcReservationImpl(_, Some(message)) => *message);
14501449
if let Some(message) = message {
14511450
debug!(
14521451
"filter_reservation_impls: \

0 commit comments

Comments
 (0)