mirror of
https://github.com/rust-lang/rust.git
synced 2025-04-17 06:26:55 +00:00
Make rustc_deny_explicit_impl only local as well
This commit is contained in:
parent
657d3f43a9
commit
91e5c3f2e5
@ -705,7 +705,7 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[
|
||||
"#[rustc_allow_incoherent_impl] has to be added to all impl items of an incoherent inherent impl."
|
||||
),
|
||||
rustc_attr!(
|
||||
rustc_deny_explicit_impl, AttributeType::Normal, template!(Word), ErrorFollowing, @only_local: false,
|
||||
rustc_deny_explicit_impl, AttributeType::Normal, template!(Word), ErrorFollowing, @only_local: true,
|
||||
"#[rustc_deny_explicit_impl] enforces that a trait can have no user-provided impls"
|
||||
),
|
||||
rustc_attr!(
|
||||
|
@ -10,7 +10,6 @@ use rustc_errors::{error_code, struct_span_err};
|
||||
use rustc_hir::def_id::{DefId, LocalDefId};
|
||||
use rustc_middle::query::Providers;
|
||||
use rustc_middle::ty::{self, TyCtxt, TypeVisitableExt};
|
||||
use rustc_span::sym;
|
||||
use rustc_trait_selection::traits;
|
||||
|
||||
mod builtin;
|
||||
@ -44,7 +43,7 @@ fn enforce_trait_manually_implementable(
|
||||
let impl_header_span = tcx.def_span(impl_def_id);
|
||||
|
||||
// Disallow *all* explicit impls of traits marked `#[rustc_deny_explicit_impl]`
|
||||
if tcx.has_attr(trait_def_id, sym::rustc_deny_explicit_impl) {
|
||||
if tcx.trait_def(trait_def_id).deny_explicit_impl {
|
||||
let trait_name = tcx.item_name(trait_def_id);
|
||||
let mut err = struct_span_err!(
|
||||
tcx.sess,
|
||||
|
@ -986,6 +986,7 @@ fn trait_def(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::TraitDef {
|
||||
no_dups.then_some(list)
|
||||
});
|
||||
let do_not_implement_via_object = tcx.has_attr(def_id, sym::rustc_do_not_implement_via_object);
|
||||
let deny_explicit_impl = tcx.has_attr(def_id, sym::rustc_deny_explicit_impl);
|
||||
|
||||
ty::TraitDef {
|
||||
def_id: def_id.to_def_id(),
|
||||
@ -997,7 +998,8 @@ fn trait_def(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::TraitDef {
|
||||
skip_array_during_method_dispatch,
|
||||
specialization_kind,
|
||||
must_implement_one_of,
|
||||
do_not_implement_via_object,
|
||||
implement_via_object,
|
||||
deny_explicit_impl,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -57,6 +57,9 @@ pub struct TraitDef {
|
||||
/// denied. This only applies to built-in trait, and is marked via
|
||||
/// `#[rustc_do_not_implement_via_object]`.
|
||||
pub do_not_implement_via_object: bool,
|
||||
|
||||
/// Whether a trait is fully built-in, and any implementation is disallowed.
|
||||
pub deny_explicit_impl: bool,
|
||||
}
|
||||
|
||||
/// Whether this trait is treated specially by the standard library
|
||||
|
Loading…
Reference in New Issue
Block a user