From 0ac7d33475cf436b60166ca55b524377a759e138 Mon Sep 17 00:00:00 2001 From: Oli Scherer Date: Tue, 2 Apr 2024 16:20:04 +0000 Subject: [PATCH] Add regression test (cherry picked from commit 769ab55558488d1ff786fa13e8ba1fb071a9791b) --- .../generic_struct_field_projection.rs | 35 +++++++++++++++++++ .../generic_struct_field_projection.stderr | 8 +++++ 2 files changed, 43 insertions(+) create mode 100644 tests/ui/privacy/generic_struct_field_projection.rs create mode 100644 tests/ui/privacy/generic_struct_field_projection.stderr diff --git a/tests/ui/privacy/generic_struct_field_projection.rs b/tests/ui/privacy/generic_struct_field_projection.rs new file mode 100644 index 00000000000..1931b9bf5c9 --- /dev/null +++ b/tests/ui/privacy/generic_struct_field_projection.rs @@ -0,0 +1,35 @@ +//! To determine all the types that need to be private when looking at `Struct`, we +//! invoke `predicates_of` to also look at types in `where` bounds. +//! Unfortunately this also computes the inferred outlives bounds, which means for +//! every field we check that if it is of type `&'a T` then `T: 'a` and if it is of +//! struct type, we check that the struct satisfies its lifetime parameters by looking +//! at its inferred outlives bounds. This means we end up with a `::Assoc: 'a` +//! in the outlives bounds of `Struct`. While this is trivially provable, privacy +//! only sees `Foo` and `Trait` and determins that `Foo` is private and then errors. + +mod baz { + struct Foo; + + pub trait Trait { + type Assoc; + } + + impl Trait for Foo { + type Assoc = (); + } + + pub struct Bar<'a, T: Trait> { + source: &'a T::Assoc, + //~^ ERROR: type `Foo` is private + } + + pub struct Baz<'a> { + mode: Bar<'a, Foo>, + } +} + +pub struct Struct<'a> { + lexer: baz::Baz<'a>, +} + +fn main() {} diff --git a/tests/ui/privacy/generic_struct_field_projection.stderr b/tests/ui/privacy/generic_struct_field_projection.stderr new file mode 100644 index 00000000000..c51b573d76d --- /dev/null +++ b/tests/ui/privacy/generic_struct_field_projection.stderr @@ -0,0 +1,8 @@ +error: type `Foo` is private + --> $DIR/generic_struct_field_projection.rs:22:9 + | +LL | source: &'a T::Assoc, + | ^^^^^^^^^^^^^^^^^^^^ private type + +error: aborting due to 1 previous error +