Rollup merge of #111557 - cjgillot:revert-111020, r=petrochenkov
Revert "Validate resolution for SelfCtor too."
This reverts commit 83453408a0
.
That PR introduced a breaking change.
Fixes https://github.com/rust-lang/rust/issues/111541
Reopens https://github.com/rust-lang/rust/issues/89868
r? `@petrochenkov`
This commit is contained in:
commit
ff364b0082
5 changed files with 17 additions and 55 deletions
|
@ -550,7 +550,7 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
|
||||||
|
|
||||||
let sm = self.tcx.sess.source_map();
|
let sm = self.tcx.sess.source_map();
|
||||||
let def_id = match outer_res {
|
let def_id = match outer_res {
|
||||||
Res::SelfTyParam { .. } | Res::SelfCtor(_) => {
|
Res::SelfTyParam { .. } => {
|
||||||
err.span_label(span, "can't use `Self` here");
|
err.span_label(span, "can't use `Self` here");
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1174,10 +1174,7 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
|
||||||
return Res::Err;
|
return Res::Err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Res::Def(DefKind::TyParam, _)
|
Res::Def(DefKind::TyParam, _) | Res::SelfTyParam { .. } | Res::SelfTyAlias { .. } => {
|
||||||
| Res::SelfTyParam { .. }
|
|
||||||
| Res::SelfTyAlias { .. }
|
|
||||||
| Res::SelfCtor(_) => {
|
|
||||||
for rib in ribs {
|
for rib in ribs {
|
||||||
let has_generic_params: HasGenericParams = match rib.kind {
|
let has_generic_params: HasGenericParams = match rib.kind {
|
||||||
RibKind::Normal
|
RibKind::Normal
|
||||||
|
|
|
@ -1,17 +0,0 @@
|
||||||
// Verify that we ban usage of `Self` as constructor from inner items.
|
|
||||||
|
|
||||||
struct S0<T>(T);
|
|
||||||
|
|
||||||
impl<T> S0<T> {
|
|
||||||
fn foo() {
|
|
||||||
const C: S0<u8> = 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() {}
|
|
|
@ -1,33 +0,0 @@
|
||||||
error[E0401]: can't use generic parameters from outer function
|
|
||||||
--> $DIR/self-ctor-inner-const.rs:7:27
|
|
||||||
|
|
|
||||||
LL | const C: S0<u8> = 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<T> S0<T> {
|
|
||||||
| ---- `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`.
|
|
15
tests/ui/self/self-ctor-nongeneric.rs
Normal file
15
tests/ui/self/self-ctor-nongeneric.rs
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
// `Self` as a constructor is currently allowed when the outer item is not generic.
|
||||||
|
// check-pass
|
||||||
|
|
||||||
|
struct S0(usize);
|
||||||
|
|
||||||
|
impl S0 {
|
||||||
|
fn foo() {
|
||||||
|
const C: S0 = Self(0);
|
||||||
|
fn bar() -> S0 {
|
||||||
|
Self(0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
Loading…
Add table
Reference in a new issue