about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2021-07-22 05:02:50 +0000
committerbors <bors@rust-lang.org>2021-07-22 05:02:50 +0000
commit7db08eeb0057de86ea2bdbd4c3a085cb8516b653 (patch)
treee316a0d57d088d13f9fd22aba0556f3bd003c29d /src
parent8024983ea73e1d1c16720a424d39fd1c239eee68 (diff)
parent3dbe0cebd876572d7ff692041a825ed4b0a4316a (diff)
downloadrust-7db08eeb0057de86ea2bdbd4c3a085cb8516b653.tar.gz
rust-7db08eeb0057de86ea2bdbd4c3a085cb8516b653.zip
Auto merge of #87250 - robojumper:87199-sized-relaxation, r=nikomatsakis
Fix implicit Sized relaxation when attempting to relax other, unsupported trait

Fixes #87199.

Do note that this bug fix causes code like the `ref_arg::<[i32]>(&[5]);` line in the test case in combination with an affected function to no longer compile.
Diffstat (limited to 'src')
-rw-r--r--src/test/ui/issues/issue-87199.rs20
-rw-r--r--src/test/ui/issues/issue-87199.stderr36
2 files changed, 56 insertions, 0 deletions
diff --git a/src/test/ui/issues/issue-87199.rs b/src/test/ui/issues/issue-87199.rs
new file mode 100644
index 00000000000..a80a64a2f87
--- /dev/null
+++ b/src/test/ui/issues/issue-87199.rs
@@ -0,0 +1,20 @@
+// Regression test for issue #87199, where attempting to relax a bound
+// other than the only supported `?Sized` would still cause the compiler
+// to assume that the `Sized` bound was relaxed.
+
+// check-fail
+
+// Check that these function definitions only emit warnings, not errors
+fn arg<T: ?Send>(_: T) {}
+//~^ warning: default bound relaxed for a type parameter, but this does nothing
+fn ref_arg<T: ?Send>(_: &T) {}
+//~^ warning: default bound relaxed for a type parameter, but this does nothing
+fn ret() -> impl Iterator<Item = ()> + ?Send { std::iter::empty() }
+//~^ warning: default bound relaxed for a type parameter, but this does nothing
+
+// Check that there's no `?Sized` relaxation!
+fn main() {
+    ref_arg::<i32>(&5);
+    ref_arg::<[i32]>(&[5]);
+    //~^ the size for values of type `[i32]` cannot be known
+}
diff --git a/src/test/ui/issues/issue-87199.stderr b/src/test/ui/issues/issue-87199.stderr
new file mode 100644
index 00000000000..e3a8e82a09f
--- /dev/null
+++ b/src/test/ui/issues/issue-87199.stderr
@@ -0,0 +1,36 @@
+warning: default bound relaxed for a type parameter, but this does nothing because the given bound is not a default; only `?Sized` is supported
+  --> $DIR/issue-87199.rs:8:8
+   |
+LL | fn arg<T: ?Send>(_: T) {}
+   |        ^
+
+warning: default bound relaxed for a type parameter, but this does nothing because the given bound is not a default; only `?Sized` is supported
+  --> $DIR/issue-87199.rs:10:12
+   |
+LL | fn ref_arg<T: ?Send>(_: &T) {}
+   |            ^
+
+warning: default bound relaxed for a type parameter, but this does nothing because the given bound is not a default; only `?Sized` is supported
+  --> $DIR/issue-87199.rs:12:13
+   |
+LL | fn ret() -> impl Iterator<Item = ()> + ?Send { std::iter::empty() }
+   |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error[E0277]: the size for values of type `[i32]` cannot be known at compilation time
+  --> $DIR/issue-87199.rs:18:22
+   |
+LL | fn ref_arg<T: ?Send>(_: &T) {}
+   |            - required by this bound in `ref_arg`
+...
+LL |     ref_arg::<[i32]>(&[5]);
+   |                      ^^^^ doesn't have a size known at compile-time
+   |
+   = help: the trait `Sized` is not implemented for `[i32]`
+help: consider relaxing the implicit `Sized` restriction
+   |
+LL | fn ref_arg<T: ?Send + ?Sized>(_: &T) {}
+   |                     ^^^^^^^^
+
+error: aborting due to previous error; 3 warnings emitted
+
+For more information about this error, try `rustc --explain E0277`.