summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDylan DPC <99973273+Dylan-DPC@users.noreply.github.com>2023-05-17 19:11:54 +0530
committerGitHub <noreply@github.com>2023-05-17 19:11:54 +0530
commitff364b0082502dc967f1a08d39e0f338a68fe277 (patch)
tree10205fa3dd3a4fd678ffd2f13061eb779f548ded
parent828caa80a942e9e923b75e4806da93c6e85f9752 (diff)
parent33ec632381cb0732dd7db3836116e5e273ab908b (diff)
downloadrust-ff364b0082502dc967f1a08d39e0f338a68fe277.tar.gz
Rollup merge of #111557 - cjgillot:revert-111020, r=petrochenkov
Revert "Validate resolution for SelfCtor too." This reverts commit 83453408a0ce91b9e3d3ae6e7f117b1fd28b487d. 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`
-rw-r--r--compiler/rustc_resolve/src/diagnostics.rs2
-rw-r--r--compiler/rustc_resolve/src/ident.rs5
-rw-r--r--tests/ui/self/self-ctor-inner-const.rs17
-rw-r--r--tests/ui/self/self-ctor-inner-const.stderr33
-rw-r--r--tests/ui/self/self-ctor-nongeneric.rs15
5 files changed, 17 insertions, 55 deletions
diff --git a/compiler/rustc_resolve/src/diagnostics.rs b/compiler/rustc_resolve/src/diagnostics.rs
index 6675b8ed59b..59eda9db97f 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::SelfCtor(_) => {
+ Res::SelfTyParam { .. } => {
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 755acdd81fe..f065c4ddd2e 100644
--- a/compiler/rustc_resolve/src/ident.rs
+++ b/compiler/rustc_resolve/src/ident.rs
@@ -1174,10 +1174,7 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
return Res::Err;
}
}
- Res::Def(DefKind::TyParam, _)
- | Res::SelfTyParam { .. }
- | Res::SelfTyAlias { .. }
- | Res::SelfCtor(_) => {
+ Res::Def(DefKind::TyParam, _) | Res::SelfTyParam { .. } | Res::SelfTyAlias { .. } => {
for rib in ribs {
let has_generic_params: HasGenericParams = match rib.kind {
RibKind::Normal
diff --git a/tests/ui/self/self-ctor-inner-const.rs b/tests/ui/self/self-ctor-inner-const.rs
deleted file mode 100644
index b015397a5bc..00000000000
--- a/tests/ui/self/self-ctor-inner-const.rs
+++ /dev/null
@@ -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() {}
diff --git a/tests/ui/self/self-ctor-inner-const.stderr b/tests/ui/self/self-ctor-inner-const.stderr
deleted file mode 100644
index 7287c64c659..00000000000
--- a/tests/ui/self/self-ctor-inner-const.stderr
+++ /dev/null
@@ -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`.
diff --git a/tests/ui/self/self-ctor-nongeneric.rs b/tests/ui/self/self-ctor-nongeneric.rs
new file mode 100644
index 00000000000..0ae7f8da4b4
--- /dev/null
+++ b/tests/ui/self/self-ctor-nongeneric.rs
@@ -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() {}