Skip to content

Commit

Permalink
AST validation: Improve handling of inherent impls nested within func…
Browse files Browse the repository at this point in the history
…tions and anon consts
  • Loading branch information
fmease committed Mar 4, 2024
1 parent 5257aee commit 7d428db
Show file tree
Hide file tree
Showing 4 changed files with 102 additions and 27 deletions.
57 changes: 30 additions & 27 deletions compiler/rustc_ast_passes/src/ast_validation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -930,35 +930,38 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
only_trait: only_trait.then_some(()),
};

self.visibility_not_permitted(
&item.vis,
errors::VisibilityNotPermittedNote::IndividualImplItems,
);
if let &Unsafe::Yes(span) = unsafety {
self.dcx().emit_err(errors::InherentImplCannotUnsafe {
span: self_ty.span,
annotation_span: span,
annotation: "unsafe",
self_ty: self_ty.span,
});
}
if let &ImplPolarity::Negative(span) = polarity {
self.dcx().emit_err(error(span, "negative", false));
}
if let &Defaultness::Default(def_span) = defaultness {
self.dcx().emit_err(error(def_span, "`default`", true));
}
if let &Const::Yes(span) = constness {
self.dcx().emit_err(error(span, "`const`", true));
}
self.with_in_trait_impl(None, |this| {
this.visibility_not_permitted(
&item.vis,
errors::VisibilityNotPermittedNote::IndividualImplItems,
);
if let &Unsafe::Yes(span) = unsafety {
this.dcx().emit_err(errors::InherentImplCannotUnsafe {
span: self_ty.span,
annotation_span: span,
annotation: "unsafe",
self_ty: self_ty.span,
});
}
if let &ImplPolarity::Negative(span) = polarity {
this.dcx().emit_err(error(span, "negative", false));
}
if let &Defaultness::Default(def_span) = defaultness {
this.dcx().emit_err(error(def_span, "`default`", true));
}
if let &Const::Yes(span) = constness {
this.dcx().emit_err(error(span, "`const`", true));
}

self.visit_vis(&item.vis);
self.visit_ident(item.ident);
self.with_tilde_const(Some(DisallowTildeConstContext::Impl(item.span)), |this| {
this.visit_generics(generics)
this.visit_vis(&item.vis);
this.visit_ident(item.ident);
this.with_tilde_const(
Some(DisallowTildeConstContext::Impl(item.span)),
|this| this.visit_generics(generics),
);
this.visit_ty(self_ty);
walk_list!(this, visit_assoc_item, items, AssocCtxt::Impl);
});
self.visit_ty(self_ty);
walk_list!(self, visit_assoc_item, items, AssocCtxt::Impl);
walk_list!(self, visit_attribute, &item.attrs);
return; // Avoid visiting again.
}
Expand Down
35 changes: 35 additions & 0 deletions tests/ui/parser/impls-nested-within-anon-consts-semantic.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
// Regression test for issue #89342 and for part of #119924.
//@ check-pass

struct Expr<const N: u32>;

trait Trait0 {
fn required(_: Expr<{
struct Type;

impl Type {
// This visibility qualifier used to get rejected.
pub fn perform() {}
}

0
}>);
}

trait Trait1 {}

impl Trait1 for ()
where
[(); {
struct Type;

impl Type {
// This visibility qualifier used to get rejected.
pub const STORE: Self = Self;
}

0
}]:
{}

fn main() {}
15 changes: 15 additions & 0 deletions tests/ui/parser/impls-nested-within-fns-semantic-0.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
// Regression test for #121607 and for part of issue #119924.
//@ check-pass

trait Trait {
fn provided() {
pub struct Type;

impl Type {
// This visibility qualifier used to get rejected.
pub fn perform() {}
}
}
}

fn main() {}
22 changes: 22 additions & 0 deletions tests/ui/parser/impls-nested-within-fns-semantic-1.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
// Regression test for part of issue #119924.
//@ check-pass

#![feature(const_trait_impl, effects)]

#[const_trait]
trait Trait {
fn required();
}

impl const Trait for () {
fn required() {
pub struct Type;

impl Type {
// This visibility qualifier used to get rejected.
pub fn perform() {}
}
}
}

fn main() {}

0 comments on commit 7d428db

Please sign in to comment.