diff options
| author | Matthias Krüger <matthias.krueger@famsik.de> | 2024-04-17 05:44:53 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-04-17 05:44:53 +0200 |
| commit | 90af17ddcbd39ff80ee4264e908eda2e2c57de98 (patch) | |
| tree | 7420aa12af8259bfdb38dd10429f547d9ee5a490 | |
| parent | 8229a34102540924347b8a0fd81cba895f623473 (diff) | |
| parent | 6288a721f5ea59a59b4304a7b70c92d7755e8aa8 (diff) | |
| download | rust-90af17ddcbd39ff80ee4264e908eda2e2c57de98.tar.gz rust-90af17ddcbd39ff80ee4264e908eda2e2c57de98.zip | |
Rollup merge of #123997 - compiler-errors:self-res, r=fmease
Delay span bug when `Self` kw resolves to `DefKind::{Mod,Trait}`
Catch the case where `kw::Self` is recovered in the parser and causes us to subsequently resolve `&self`'s implicit type to something that's not a type.
This check could be made more accurate, though I'm not sure how hard we have to try here.
Fixes #123988
| -rw-r--r-- | compiler/rustc_hir_analysis/src/hir_ty_lowering/mod.rs | 11 | ||||
| -rw-r--r-- | tests/ui/resolve/incorrect-self-res.rs | 17 | ||||
| -rw-r--r-- | tests/ui/resolve/incorrect-self-res.stderr | 30 |
3 files changed, 58 insertions, 0 deletions
diff --git a/compiler/rustc_hir_analysis/src/hir_ty_lowering/mod.rs b/compiler/rustc_hir_analysis/src/hir_ty_lowering/mod.rs index 0fe02856a62..0d5a295ca96 100644 --- a/compiler/rustc_hir_analysis/src/hir_ty_lowering/mod.rs +++ b/compiler/rustc_hir_analysis/src/hir_ty_lowering/mod.rs @@ -1866,6 +1866,17 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ { self.set_tainted_by_errors(e); Ty::new_error(self.tcx(), e) } + Res::Def(..) => { + assert_eq!( + path.segments.get(0).map(|seg| seg.ident.name), + Some(kw::SelfUpper), + "only expected incorrect resolution for `Self`" + ); + Ty::new_error( + self.tcx(), + self.tcx().dcx().span_delayed_bug(span, "incorrect resolution for `Self`"), + ) + } _ => span_bug!(span, "unexpected resolution: {:?}", path.res), } } diff --git a/tests/ui/resolve/incorrect-self-res.rs b/tests/ui/resolve/incorrect-self-res.rs new file mode 100644 index 00000000000..ca97e698994 --- /dev/null +++ b/tests/ui/resolve/incorrect-self-res.rs @@ -0,0 +1,17 @@ +fn module() { + fn test(&mut self) { + //~^ ERROR `self` parameter is only allowed in associated functions + } + mod Self {} + //~^ ERROR expected identifier, found keyword `Self` +} + +fn trait_() { + fn test(&mut self) { + //~^ ERROR `self` parameter is only allowed in associated functions + } + trait Self {} + //~^ ERROR expected identifier, found keyword `Self` +} + +fn main() {} diff --git a/tests/ui/resolve/incorrect-self-res.stderr b/tests/ui/resolve/incorrect-self-res.stderr new file mode 100644 index 00000000000..406bfb98011 --- /dev/null +++ b/tests/ui/resolve/incorrect-self-res.stderr @@ -0,0 +1,30 @@ +error: expected identifier, found keyword `Self` + --> $DIR/incorrect-self-res.rs:5:9 + | +LL | mod Self {} + | ^^^^ expected identifier, found keyword + +error: expected identifier, found keyword `Self` + --> $DIR/incorrect-self-res.rs:13:11 + | +LL | trait Self {} + | ^^^^ expected identifier, found keyword + +error: `self` parameter is only allowed in associated functions + --> $DIR/incorrect-self-res.rs:2:13 + | +LL | fn test(&mut self) { + | ^^^^^^^^^ not semantically valid as function parameter + | + = note: associated functions are those in `impl` or `trait` definitions + +error: `self` parameter is only allowed in associated functions + --> $DIR/incorrect-self-res.rs:10:13 + | +LL | fn test(&mut self) { + | ^^^^^^^^^ not semantically valid as function parameter + | + = note: associated functions are those in `impl` or `trait` definitions + +error: aborting due to 4 previous errors + |
