Remove CheckConstTraitVisitor
Signed-off-by: Miguel Guarniz <mi9uel9@gmail.com>
This commit is contained in:
parent
a7d6408b05
commit
bd2b210c59
1 changed files with 54 additions and 68 deletions
|
@ -10,6 +10,7 @@
|
||||||
use rustc_attr as attr;
|
use rustc_attr as attr;
|
||||||
use rustc_errors::struct_span_err;
|
use rustc_errors::struct_span_err;
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
|
use rustc_hir::def::DefKind;
|
||||||
use rustc_hir::def_id::LocalDefId;
|
use rustc_hir::def_id::LocalDefId;
|
||||||
use rustc_hir::intravisit::{self, Visitor};
|
use rustc_hir::intravisit::{self, Visitor};
|
||||||
use rustc_middle::hir::nested_filter;
|
use rustc_middle::hir::nested_filter;
|
||||||
|
@ -58,38 +59,31 @@ 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().visit_item_likes_in_module(module_def_id, &mut vis.as_deep_visitor());
|
tcx.hir().visit_item_likes_in_module(module_def_id, &mut vis.as_deep_visitor());
|
||||||
tcx.hir().visit_item_likes_in_module(module_def_id, &mut CheckConstTraitVisitor::new(tcx));
|
for id in tcx.hir_module_items(module_def_id).items() {
|
||||||
|
check_item(tcx, id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn provide(providers: &mut Providers) {
|
pub(crate) fn provide(providers: &mut Providers) {
|
||||||
*providers = Providers { check_mod_const_bodies, ..*providers };
|
*providers = Providers { check_mod_const_bodies, ..*providers };
|
||||||
}
|
}
|
||||||
|
|
||||||
struct CheckConstTraitVisitor<'tcx> {
|
fn check_item<'tcx>(tcx: TyCtxt<'tcx>, id: hir::ItemId) {
|
||||||
tcx: TyCtxt<'tcx>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'tcx> CheckConstTraitVisitor<'tcx> {
|
|
||||||
fn new(tcx: TyCtxt<'tcx>) -> Self {
|
|
||||||
CheckConstTraitVisitor { tcx }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'tcx> hir::itemlikevisit::ItemLikeVisitor<'tcx> for CheckConstTraitVisitor<'tcx> {
|
|
||||||
/// check for const trait impls, and errors if the impl uses provided/default functions
|
|
||||||
/// of the trait being implemented; as those provided functions can be non-const.
|
|
||||||
fn visit_item<'hir>(&mut self, item: &'hir hir::Item<'hir>) {
|
|
||||||
let _: Option<_> = try {
|
let _: Option<_> = try {
|
||||||
|
if !matches!(tcx.hir().def_kind(id.def_id), DefKind::Impl) {
|
||||||
|
None?
|
||||||
|
}
|
||||||
|
|
||||||
|
let item = tcx.hir().item(id);
|
||||||
if let hir::ItemKind::Impl(ref imp) = item.kind && let hir::Constness::Const = imp.constness {
|
if let hir::ItemKind::Impl(ref imp) = item.kind && let hir::Constness::Const = imp.constness {
|
||||||
let trait_def_id = imp.of_trait.as_ref()?.trait_def_id()?;
|
let trait_def_id = imp.of_trait.as_ref()?.trait_def_id()?;
|
||||||
let ancestors = self
|
let ancestors = tcx
|
||||||
.tcx
|
|
||||||
.trait_def(trait_def_id)
|
.trait_def(trait_def_id)
|
||||||
.ancestors(self.tcx, item.def_id.to_def_id())
|
.ancestors(tcx, item.def_id.to_def_id())
|
||||||
.ok()?;
|
.ok()?;
|
||||||
let mut to_implement = Vec::new();
|
let mut to_implement = Vec::new();
|
||||||
|
|
||||||
for trait_item in self.tcx.associated_items(trait_def_id).in_definition_order()
|
for trait_item in tcx.associated_items(trait_def_id).in_definition_order()
|
||||||
{
|
{
|
||||||
if let ty::AssocItem {
|
if let ty::AssocItem {
|
||||||
kind: ty::AssocKind::Fn,
|
kind: ty::AssocKind::Fn,
|
||||||
|
@ -101,20 +95,19 @@ impl<'tcx> hir::itemlikevisit::ItemLikeVisitor<'tcx> for CheckConstTraitVisitor<
|
||||||
// we can ignore functions that do not have default bodies:
|
// we can ignore functions that do not have default bodies:
|
||||||
// if those are unimplemented it will be caught by typeck.
|
// if those are unimplemented it will be caught by typeck.
|
||||||
if !defaultness.has_value()
|
if !defaultness.has_value()
|
||||||
|| self
|
|| tcx
|
||||||
.tcx
|
|
||||||
.has_attr(trait_item_id, sym::default_method_body_is_const)
|
.has_attr(trait_item_id, sym::default_method_body_is_const)
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
let is_implemented = ancestors
|
let is_implemented = ancestors
|
||||||
.leaf_def(self.tcx, trait_item_id)
|
.leaf_def(tcx, trait_item_id)
|
||||||
.map(|node_item| !node_item.defining_node.is_from_trait())
|
.map(|node_item| !node_item.defining_node.is_from_trait())
|
||||||
.unwrap_or(false);
|
.unwrap_or(false);
|
||||||
|
|
||||||
if !is_implemented {
|
if !is_implemented {
|
||||||
to_implement.push(self.tcx.item_name(trait_item_id).to_string());
|
to_implement.push(tcx.item_name(trait_item_id).to_string());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -122,7 +115,7 @@ impl<'tcx> hir::itemlikevisit::ItemLikeVisitor<'tcx> for CheckConstTraitVisitor<
|
||||||
// all nonconst trait functions (not marked with #[default_method_body_is_const])
|
// all nonconst trait functions (not marked with #[default_method_body_is_const])
|
||||||
// must be implemented
|
// must be implemented
|
||||||
if !to_implement.is_empty() {
|
if !to_implement.is_empty() {
|
||||||
self.tcx
|
tcx
|
||||||
.sess
|
.sess
|
||||||
.struct_span_err(
|
.struct_span_err(
|
||||||
item.span,
|
item.span,
|
||||||
|
@ -133,13 +126,6 @@ impl<'tcx> hir::itemlikevisit::ItemLikeVisitor<'tcx> for CheckConstTraitVisitor<
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
|
||||||
|
|
||||||
fn visit_trait_item<'hir>(&mut self, _: &'hir hir::TraitItem<'hir>) {}
|
|
||||||
|
|
||||||
fn visit_impl_item<'hir>(&mut self, _: &'hir hir::ImplItem<'hir>) {}
|
|
||||||
|
|
||||||
fn visit_foreign_item<'hir>(&mut self, _: &'hir hir::ForeignItem<'hir>) {}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Copy, Clone)]
|
#[derive(Copy, Clone)]
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue