From 83453408a0ce91b9e3d3ae6e7f117b1fd28b487d Mon Sep 17 00:00:00 2001 From: Camille GILLOT Date: Sun, 30 Apr 2023 16:05:09 +0000 Subject: [PATCH] Validate resolution for SelfCtor too. --- compiler/rustc_resolve/src/diagnostics.rs | 2 +- compiler/rustc_resolve/src/ident.rs | 5 +++- tests/ui/self/self-ctor-inner-const.rs | 17 +++++++++++ tests/ui/self/self-ctor-inner-const.stderr | 33 ++++++++++++++++++++++ 4 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 tests/ui/self/self-ctor-inner-const.rs create mode 100644 tests/ui/self/self-ctor-inner-const.stderr diff --git a/compiler/rustc_resolve/src/diagnostics.rs b/compiler/rustc_resolve/src/diagnostics.rs index 4b7048eac04..ed8c3b60c1f 100644 --- a/compiler/rustc_resolve/src/diagnostics.rs +++ b/compiler/rustc_resolve/src/diagnostics.rs @@ -550,7 +550,7 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> { let sm = self.tcx.sess.source_map(); let def_id = match outer_res { - Res::SelfTyParam { .. } => { + Res::SelfTyParam { .. } | Res::SelfCtor(_) => { err.span_label(span, "can't use `Self` here"); return err; } diff --git a/compiler/rustc_resolve/src/ident.rs b/compiler/rustc_resolve/src/ident.rs index 5a56d7b99a9..72a71599236 100644 --- a/compiler/rustc_resolve/src/ident.rs +++ b/compiler/rustc_resolve/src/ident.rs @@ -1171,7 +1171,10 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> { return Res::Err; } } - Res::Def(DefKind::TyParam, _) | Res::SelfTyParam { .. } | Res::SelfTyAlias { .. } => { + Res::Def(DefKind::TyParam, _) + | Res::SelfTyParam { .. } + | Res::SelfTyAlias { .. } + | Res::SelfCtor(_) => { for rib in ribs { let has_generic_params: HasGenericParams = match rib.kind { NormalRibKind diff --git a/tests/ui/self/self-ctor-inner-const.rs b/tests/ui/self/self-ctor-inner-const.rs new file mode 100644 index 00000000000..b015397a5bc --- /dev/null +++ b/tests/ui/self/self-ctor-inner-const.rs @@ -0,0 +1,17 @@ +// Verify that we ban usage of `Self` as constructor from inner items. + +struct S0(T); + +impl S0 { + fn foo() { + const C: S0 = Self(0); + //~^ ERROR can't use generic parameters from outer function + fn bar() -> Self { + //~^ ERROR can't use generic parameters from outer function + Self(0) + //~^ ERROR can't use generic parameters from outer function + } + } +} + +fn main() {} diff --git a/tests/ui/self/self-ctor-inner-const.stderr b/tests/ui/self/self-ctor-inner-const.stderr new file mode 100644 index 00000000000..7287c64c659 --- /dev/null +++ b/tests/ui/self/self-ctor-inner-const.stderr @@ -0,0 +1,33 @@ +error[E0401]: can't use generic parameters from outer function + --> $DIR/self-ctor-inner-const.rs:7:27 + | +LL | const C: S0 = Self(0); + | ^^^^ + | | + | use of generic parameter from outer function + | can't use `Self` here + +error[E0401]: can't use generic parameters from outer function + --> $DIR/self-ctor-inner-const.rs:9:21 + | +LL | impl S0 { + | ---- `Self` type implicitly declared here, by this `impl` +... +LL | fn bar() -> Self { + | ^^^^ + | | + | use of generic parameter from outer function + | use a type here instead + +error[E0401]: can't use generic parameters from outer function + --> $DIR/self-ctor-inner-const.rs:11:13 + | +LL | Self(0) + | ^^^^ + | | + | use of generic parameter from outer function + | can't use `Self` here + +error: aborting due to 3 previous errors + +For more information about this error, try `rustc --explain E0401`.