AST validation doesn't correctly deal with impls nested within associated functions #119924
Open
Description
opened on Jan 13, 2024
The following programs get wrongfully rejected since my PR #119505 (nightly-2024-01-04):
pub struct S;
trait Trait {
fn provided() {
impl S {
pub fn perform() {} //~ ERROR visibility qualifiers are not permitted here
}
}
}
pub struct S;
struct Expr<const N: u32>;
trait Trait {
fn required(_: Expr<{
impl S {
pub fn perform() {} //~ ERROR visibility qualifiers are not permitted here
}
0
}>);
}
The following program was incorrectly rejected even before my PR #119505 (nightly-2024-01-04):
#![feature(const_trait_impl, effects)]
pub struct S;
#[const_trait]
trait Trait {
fn required();
}
impl const Trait for () {
fn required() {
impl S {
pub fn perform() {} //~ ERROR visibility qualifiers are not permitted here
}
}
}
The following programs lead to an ICE even before my PR (e.g., in nightly-2023-12-31):
#![feature(const_trait_impl, effects)]
pub struct S;
#[const_trait]
trait Trait {
fn provided() {
impl S {
fn perform<T: ~const Trait>() {} // should've gotten rejected during AST validation
//~^ ICE no host param id for call in const yet no errors reported
}
}
}
#![feature(const_trait_impl, effects)]
pub struct S;
struct Expr<const N: u32>;
#[const_trait]
trait Trait {
fn required(_: Expr<{
impl S {
fn perform<T: ~const Trait>() {} // should've gotten rejected during AST validation
//~^ ICE no host param id for call in const yet no errors reported
}
0
}>);
}
#![feature(const_trait_impl, effects)]
struct S;
#[const_trait]
trait Trait<const N: u32> {}
const fn f<T: Trait<{
struct I<U: ~const Trait<0>>(U); // should've gotten rejected during AST validation
//~^ ICE no host param id for call in const yet no errors reported
0
}>>() {}
There are many more issues and probably many more ways to reproduce this, e.g. we don't visit attributes on associated functions under certain circumstances (I couldn't find a reproducer yet in which you can observe the bug).
Activity