summaryrefslogtreecommitdiffstats
path: root/tests/ui/issues/issue-23261.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ui/issues/issue-23261.rs')
-rw-r--r--tests/ui/issues/issue-23261.rs61
1 files changed, 61 insertions, 0 deletions
diff --git a/tests/ui/issues/issue-23261.rs b/tests/ui/issues/issue-23261.rs
new file mode 100644
index 000000000..e21f86351
--- /dev/null
+++ b/tests/ui/issues/issue-23261.rs
@@ -0,0 +1,61 @@
+// run-pass
+// Matching on a DST struct should not trigger an LLVM assertion.
+
+struct Foo<T: ?Sized> {
+ a: i32,
+ inner: T
+}
+
+trait Get {
+ fn get(&self) -> i32;
+}
+
+impl Get for i32 {
+ fn get(&self) -> i32 {
+ *self
+ }
+}
+
+fn check_val(val: &Foo<[u8]>) {
+ match *val {
+ Foo { a, .. } => {
+ assert_eq!(a, 32);
+ }
+ }
+}
+
+fn check_dst_val(val: &Foo<[u8]>) {
+ match *val {
+ Foo { ref inner, .. } => {
+ assert_eq!(inner, [1, 2, 3]);
+ }
+ }
+}
+
+fn check_both(val: &Foo<[u8]>) {
+ match *val {
+ Foo { a, ref inner } => {
+ assert_eq!(a, 32);
+ assert_eq!(inner, [1, 2, 3]);
+ }
+ }
+}
+
+fn check_trait_obj(val: &Foo<dyn Get>) {
+ match *val {
+ Foo { a, ref inner } => {
+ assert_eq!(a, 32);
+ assert_eq!(inner.get(), 32);
+ }
+ }
+}
+
+fn main() {
+ let foo: &Foo<[u8]> = &Foo { a: 32, inner: [1, 2, 3] };
+ check_val(foo);
+ check_dst_val(foo);
+ check_both(foo);
+
+ let foo: &Foo<dyn Get> = &Foo { a: 32, inner: 32 };
+ check_trait_obj(foo);
+}