about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMichael Goulet <michael@errs.io>2024-08-19 10:57:03 -0400
committerMichael Goulet <michael@errs.io>2024-08-19 17:24:27 -0400
commit78d0e08504a30e5ff8b8e0ba88126af95a16a398 (patch)
tree653290b7241764de830a052c935100b43da8c9b5
parentc6f81a452e291dd4ff5bcbc6ecb9cd6f2271f164 (diff)
downloadrust-78d0e08504a30e5ff8b8e0ba88126af95a16a398.tar.gz
rust-78d0e08504a30e5ff8b8e0ba88126af95a16a398.zip
Don't consider RibKind::Module's bindings when checking generics shadowing
-rw-r--r--compiler/rustc_resolve/src/late.rs6
-rw-r--r--tests/ui/resolve/local-shadows-inner-generic.rs8
2 files changed, 11 insertions, 3 deletions
diff --git a/compiler/rustc_resolve/src/late.rs b/compiler/rustc_resolve/src/late.rs
index 4a70fc0f308..40fdb01a72c 100644
--- a/compiler/rustc_resolve/src/late.rs
+++ b/compiler/rustc_resolve/src/late.rs
@@ -2677,14 +2677,14 @@ impl<'a: 'ast, 'b, 'ast, 'tcx> LateResolutionVisitor<'a, 'b, 'ast, 'tcx> {
             // We also can't shadow bindings from associated parent items.
             for ns in [ValueNS, TypeNS] {
                 for parent_rib in self.ribs[ns].iter().rev() {
-                    seen_bindings
-                        .extend(parent_rib.bindings.keys().map(|ident| (*ident, ident.span)));
-
                     // Break at mod level, to account for nested items which are
                     // allowed to shadow generic param names.
                     if matches!(parent_rib.kind, RibKind::Module(..)) {
                         break;
                     }
+
+                    seen_bindings
+                        .extend(parent_rib.bindings.keys().map(|ident| (*ident, ident.span)));
                 }
             }
 
diff --git a/tests/ui/resolve/local-shadows-inner-generic.rs b/tests/ui/resolve/local-shadows-inner-generic.rs
new file mode 100644
index 00000000000..d9145b9fe2c
--- /dev/null
+++ b/tests/ui/resolve/local-shadows-inner-generic.rs
@@ -0,0 +1,8 @@
+//@ check-pass
+
+#![allow(non_camel_case_types)]
+
+pub fn main() {
+    let a = 1;
+    struct Foo<a> { field: a, };
+}