Port rustc_strict_coherence to the new attribute parser
This commit is contained in:
parent
286fbe5d84
commit
2dda303229
7 changed files with 29 additions and 15 deletions
|
|
@ -845,3 +845,18 @@ impl<S: Stage> NoArgsAttributeParser<S> for RustcIntrinsicConstStableIndirectPar
|
|||
const ALLOWED_TARGETS: AllowedTargets = AllowedTargets::AllowList(&[Allow(Target::Fn)]);
|
||||
const CREATE: fn(Span) -> AttributeKind = |_| AttributeKind::RustcIntrinsicConstStableIndirect;
|
||||
}
|
||||
|
||||
pub(crate) struct RustcStrictCoherenceParser;
|
||||
|
||||
impl<S: Stage> NoArgsAttributeParser<S> for RustcStrictCoherenceParser {
|
||||
const PATH: &[Symbol] = &[sym::rustc_strict_coherence];
|
||||
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Error;
|
||||
const ALLOWED_TARGETS: AllowedTargets = AllowedTargets::AllowList(&[
|
||||
Allow(Target::Trait),
|
||||
Allow(Target::Struct),
|
||||
Allow(Target::Enum),
|
||||
Allow(Target::Union),
|
||||
Allow(Target::ForeignTy),
|
||||
]);
|
||||
const CREATE: fn(Span) -> AttributeKind = AttributeKind::RustcStrictCoherence;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -286,6 +286,7 @@ attribute_parsers!(
|
|||
Single<WithoutArgs<RustcReallocatorParser>>,
|
||||
Single<WithoutArgs<RustcRegionsParser>>,
|
||||
Single<WithoutArgs<RustcShouldNotBeCalledOnConstItems>>,
|
||||
Single<WithoutArgs<RustcStrictCoherenceParser>>,
|
||||
Single<WithoutArgs<RustcVarianceOfOpaquesParser>>,
|
||||
Single<WithoutArgs<RustcVarianceParser>>,
|
||||
Single<WithoutArgs<SpecializationTraitParser>>,
|
||||
|
|
|
|||
|
|
@ -1230,6 +1230,9 @@ pub enum AttributeKind {
|
|||
/// Represents `#[rustc_std_internal_symbol]`.
|
||||
RustcStdInternalSymbol(Span),
|
||||
|
||||
/// Represents `#[rustc_strict_coherence]`.
|
||||
RustcStrictCoherence(Span),
|
||||
|
||||
/// Represents `#[rustc_symbol_name]`
|
||||
RustcSymbolName(Span),
|
||||
|
||||
|
|
@ -1266,6 +1269,7 @@ pub enum AttributeKind {
|
|||
/// Span of the attribute.
|
||||
span: Span,
|
||||
},
|
||||
|
||||
/// Represents `#[target_feature(enable = "...")]` and
|
||||
/// `#[unsafe(force_target_feature(enable = "...")]`.
|
||||
TargetFeature { features: ThinVec<(Symbol, Span)>, attr_span: Span, was_forced: bool },
|
||||
|
|
|
|||
|
|
@ -153,6 +153,7 @@ impl AttributeKind {
|
|||
RustcSkipDuringMethodDispatch { .. } => No,
|
||||
RustcSpecializationTrait(..) => No,
|
||||
RustcStdInternalSymbol(..) => No,
|
||||
RustcStrictCoherence(..) => Yes,
|
||||
RustcSymbolName(..) => Yes,
|
||||
RustcThenThisWouldNeed(..) => No,
|
||||
RustcUnsafeSpecializationMarker(..) => No,
|
||||
|
|
|
|||
|
|
@ -93,7 +93,7 @@ pub(crate) struct StrictCoherenceNeedsNegativeCoherence {
|
|||
#[primary_span]
|
||||
pub span: Span,
|
||||
#[label("due to this attribute")]
|
||||
pub attr_span: Option<Span>,
|
||||
pub attr_span: Span,
|
||||
}
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
|
|
|
|||
|
|
@ -1,8 +1,9 @@
|
|||
use rustc_data_structures::fx::FxIndexMap;
|
||||
use rustc_errors::ErrorGuaranteed;
|
||||
use rustc_hir::attrs::AttributeKind;
|
||||
use rustc_hir::def_id::{DefId, DefIdMap};
|
||||
use rustc_hir::find_attr;
|
||||
use rustc_macros::{HashStable, TyDecodable, TyEncodable};
|
||||
use rustc_span::sym;
|
||||
|
||||
use crate::error::StrictCoherenceNeedsNegativeCoherence;
|
||||
use crate::ty::fast_reject::SimplifiedType;
|
||||
|
|
@ -61,23 +62,15 @@ pub enum OverlapMode {
|
|||
impl OverlapMode {
|
||||
pub fn get(tcx: TyCtxt<'_>, trait_id: DefId) -> OverlapMode {
|
||||
let with_negative_coherence = tcx.features().with_negative_coherence();
|
||||
let strict_coherence = tcx.has_attr(trait_id, sym::rustc_strict_coherence);
|
||||
let strict_coherence = find_attr!(tcx.get_all_attrs(trait_id), AttributeKind::RustcStrictCoherence(span) => *span);
|
||||
|
||||
if with_negative_coherence {
|
||||
if strict_coherence { OverlapMode::Strict } else { OverlapMode::WithNegative }
|
||||
if strict_coherence.is_some() { OverlapMode::Strict } else { OverlapMode::WithNegative }
|
||||
} else {
|
||||
if strict_coherence {
|
||||
let attr_span = trait_id
|
||||
.as_local()
|
||||
.into_iter()
|
||||
.flat_map(|local_def_id| {
|
||||
tcx.hir_attrs(tcx.local_def_id_to_hir_id(local_def_id))
|
||||
})
|
||||
.find(|attr| attr.has_name(sym::rustc_strict_coherence))
|
||||
.map(|attr| attr.span());
|
||||
if let Some(span) = strict_coherence {
|
||||
tcx.dcx().emit_err(StrictCoherenceNeedsNegativeCoherence {
|
||||
span: tcx.def_span(trait_id),
|
||||
attr_span,
|
||||
attr_span: span,
|
||||
});
|
||||
}
|
||||
OverlapMode::Stable
|
||||
|
|
|
|||
|
|
@ -344,6 +344,7 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
|
|||
| AttributeKind::RustcSkipDuringMethodDispatch { .. }
|
||||
| AttributeKind::RustcSpecializationTrait(..)
|
||||
| AttributeKind::RustcStdInternalSymbol (..)
|
||||
| AttributeKind::RustcStrictCoherence(..)
|
||||
| AttributeKind::RustcSymbolName(..)
|
||||
| AttributeKind::RustcThenThisWouldNeed(..)
|
||||
| AttributeKind::RustcUnsafeSpecializationMarker(..)
|
||||
|
|
@ -402,7 +403,6 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
|
|||
| sym::rustc_never_type_options
|
||||
| sym::rustc_autodiff
|
||||
| sym::rustc_capture_analysis
|
||||
| sym::rustc_strict_coherence
|
||||
| sym::rustc_mir
|
||||
| sym::rustc_outlives
|
||||
| sym::rustc_evaluate_where_clauses
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue