about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMatthias Krüger <matthias.krueger@famsik.de>2024-02-23 09:42:13 +0100
committerGitHub <noreply@github.com>2024-02-23 09:42:13 +0100
commit52805b0cb4521be0af3213345d76dfa9a1c8589b (patch)
tree7529d0ce5034537da2c971f4c143e367e36690b2
parent5de3a4ce0e4f4105c663fafef34c1b370fd402a4 (diff)
parent21bb1a435907294e50a95359fedcf5ebd5de1959 (diff)
downloadrust-52805b0cb4521be0af3213345d76dfa9a1c8589b.tar.gz
rust-52805b0cb4521be0af3213345d76dfa9a1c8589b.zip
Rollup merge of #121482 - nnethercote:fix-121455, r=oli-obk
Allow for a missing `adt_def` in `NamePrivacyVisitor`.

This was caused by 72b172bdf6 in #121206. That commit removed an early return from `analysis` when there are stashed errors. As a result, it's possible to reach privacy analysis when there are stashed errors, which means more code paths can be reached. One such code path was handled in that commit, where a `span_bug` was changed to a `span_delayed_bug`.

This commit handles another such code path uncovered by fuzzing, in much the same way.

Fixes #121455.

r? `@oli-obk`
-rw-r--r--compiler/rustc_privacy/src/lib.rs5
-rw-r--r--tests/ui/privacy/unreachable-issue-121455.rs6
-rw-r--r--tests/ui/privacy/unreachable-issue-121455.stderr9
3 files changed, 19 insertions, 1 deletions
diff --git a/compiler/rustc_privacy/src/lib.rs b/compiler/rustc_privacy/src/lib.rs
index 9d8a9f5fce3..1c6bd887128 100644
--- a/compiler/rustc_privacy/src/lib.rs
+++ b/compiler/rustc_privacy/src/lib.rs
@@ -988,7 +988,10 @@ impl<'tcx> Visitor<'tcx> for NamePrivacyVisitor<'tcx> {
     fn visit_expr(&mut self, expr: &'tcx hir::Expr<'tcx>) {
         if let hir::ExprKind::Struct(qpath, fields, ref base) = expr.kind {
             let res = self.typeck_results().qpath_res(qpath, expr.hir_id);
-            let adt = self.typeck_results().expr_ty(expr).ty_adt_def().unwrap();
+            let Some(adt) = self.typeck_results().expr_ty(expr).ty_adt_def() else {
+                self.tcx.dcx().span_delayed_bug(expr.span, "no adt_def for expression");
+                return;
+            };
             let variant = adt.variant_of_res(res);
             if let Some(base) = *base {
                 // If the expression uses FRU we need to make sure all the unmentioned fields
diff --git a/tests/ui/privacy/unreachable-issue-121455.rs b/tests/ui/privacy/unreachable-issue-121455.rs
new file mode 100644
index 00000000000..5da30d6ed63
--- /dev/null
+++ b/tests/ui/privacy/unreachable-issue-121455.rs
@@ -0,0 +1,6 @@
+fn test(s: &Self::Id) {
+//~^ ERROR failed to resolve: `Self` is only available in impls, traits, and type definitions
+    match &s[0..3] {}
+}
+
+fn main() {}
diff --git a/tests/ui/privacy/unreachable-issue-121455.stderr b/tests/ui/privacy/unreachable-issue-121455.stderr
new file mode 100644
index 00000000000..864e950a98e
--- /dev/null
+++ b/tests/ui/privacy/unreachable-issue-121455.stderr
@@ -0,0 +1,9 @@
+error[E0433]: failed to resolve: `Self` is only available in impls, traits, and type definitions
+  --> $DIR/unreachable-issue-121455.rs:1:13
+   |
+LL | fn test(s: &Self::Id) {
+   |             ^^^^ `Self` is only available in impls, traits, and type definitions
+
+error: aborting due to 1 previous error
+
+For more information about this error, try `rustc --explain E0433`.