about summary refs log tree commit diff
path: root/tests/ui/codegen
diff options
context:
space:
mode:
authorSpencer <spencer3035@gmail.com>2025-04-15 21:06:27 -0600
committerSpencer <spencer3035@gmail.com>2025-04-19 01:10:26 -0600
commit3eaa4b93684f10765ce9b8004fac461008ae678a (patch)
tree869db542574e81570ccadd4b75e823f969319947 /tests/ui/codegen
parent38c560ae681d5c0d3fd615eaedc537a282fb1086 (diff)
downloadrust-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.rs54
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();
+}