diff options
| author | Spencer <spencer3035@gmail.com> | 2025-04-15 21:06:27 -0600 |
|---|---|---|
| committer | Spencer <spencer3035@gmail.com> | 2025-04-19 01:10:26 -0600 |
| commit | 3eaa4b93684f10765ce9b8004fac461008ae678a (patch) | |
| tree | 869db542574e81570ccadd4b75e823f969319947 /tests/ui/codegen | |
| parent | 38c560ae681d5c0d3fd615eaedc537a282fb1086 (diff) | |
| download | rust-3eaa4b93684f10765ce9b8004fac461008ae678a.tar.gz rust-3eaa4b93684f10765ce9b8004fac461008ae678a.zip | |
Cleaned up 4 tests in `tests/ui/issues`
Diffstat (limited to 'tests/ui/codegen')
| -rw-r--r-- | tests/ui/codegen/ref-dyn-trait-in-structs-and-enums.rs | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/tests/ui/codegen/ref-dyn-trait-in-structs-and-enums.rs b/tests/ui/codegen/ref-dyn-trait-in-structs-and-enums.rs new file mode 100644 index 00000000000..04548817773 --- /dev/null +++ b/tests/ui/codegen/ref-dyn-trait-in-structs-and-enums.rs @@ -0,0 +1,54 @@ +//! Regression test for an LLVM assertion that used to be hit when: +//! +//! - There's a generic enum contained within a tuple struct +//! - When the tuple struct is parameterized by some lifetime `'a` +//! - The enum is concretized with its type argument being a reference to a trait object (of +//! lifetime `'a`) +//! +//! Issue: <https://github.com/rust-lang/rust/issues/9719> + +//@ build-pass + +// Dummy trait implemented for `isize` to use in the test cases +pub trait MyTrait { + fn dummy(&self) {} +} +impl MyTrait for isize {} + +// `&dyn MyTrait` contained in enum variant +pub struct EnumRefDynTrait<'a>(Enum<&'a (dyn MyTrait + 'a)>); +pub enum Enum<T> { + Variant(T), +} + +fn enum_dyn_trait() { + let x: isize = 42; + let y = EnumRefDynTrait(Enum::Variant(&x as &dyn MyTrait)); + let _ = y; +} + +// `&dyn MyTrait` contained behind `Option` in named field of struct +struct RefDynTraitNamed<'a> { + x: Option<&'a (dyn MyTrait + 'a)>, +} + +fn named_option_dyn_trait() { + let x: isize = 42; + let y = RefDynTraitNamed { x: Some(&x as &dyn MyTrait) }; + let _ = y; +} + +// `&dyn MyTrait` contained behind `Option` in unnamed field of struct +pub struct RefDynTraitUnnamed<'a>(Option<&'a (dyn MyTrait + 'a)>); + +fn unnamed_option_dyn_trait() { + let x: isize = 42; + let y = RefDynTraitUnnamed(Some(&x as &dyn MyTrait)); + let _ = y; +} + +pub fn main() { + enum_dyn_trait(); + named_option_dyn_trait(); + unnamed_option_dyn_trait(); +} |
