summaryrefslogtreecommitdiffstats
path: root/tests/ui/coroutine/issue-113279.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ui/coroutine/issue-113279.rs')
-rw-r--r--tests/ui/coroutine/issue-113279.rs27
1 files changed, 27 insertions, 0 deletions
diff --git a/tests/ui/coroutine/issue-113279.rs b/tests/ui/coroutine/issue-113279.rs
new file mode 100644
index 000000000..f251c924c
--- /dev/null
+++ b/tests/ui/coroutine/issue-113279.rs
@@ -0,0 +1,27 @@
+#![feature(coroutines)]
+
+// `foo` attempts to dereference `""`, which results in an error being reported. Later, the
+// coroutine transform for `foo` then produces a union which contains a `str` type - unions should
+// not contain unsized types, but this is okay because an error has been reported already.
+// When const propagation happens later in compilation, it attempts to compute the layout of the
+// coroutine (as part of checking whether something can be const propagated) and in turn attempts
+// to compute the layout of `str` in the context of a union - where this caused an ICE. This test
+// makes sure that doesn't happen again.
+
+fn foo() {
+ let _y = static || {
+ let x = &mut 0;
+ *{
+ yield;
+ x
+ } += match { *"" }.len() {
+ //~^ ERROR cannot move a value of type `str` [E0161]
+ //~^^ ERROR cannot move out of a shared reference [E0507]
+ _ => 0,
+ };
+ };
+}
+
+fn main() {
+ foo()
+}