about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEsteban Küber <esteban@kuber.com.ar>2021-01-29 11:47:47 -0800
committerEsteban Küber <esteban@kuber.com.ar>2021-02-03 08:52:57 -0800
commitede0a71b9ebc9d8c87a06dbd95ca41ef7a4f93e4 (patch)
tree3bc3ba685de954507a34943f6f275cba674925a1
parentb81f5811f96fe750ab28c15219d1b0dba6b1dc90 (diff)
downloadrust-ede0a71b9ebc9d8c87a06dbd95ca41ef7a4f93e4.tar.gz
rust-ede0a71b9ebc9d8c87a06dbd95ca41ef7a4f93e4.zip
Remove incorrect `delay_span_bug`
The following code is supposed to compile

```rust
use std::ops::BitOr;

pub trait IntWrapper {
    type InternalStorage;
}

impl<T> BitOr for dyn IntWrapper<InternalStorage = T>
where
    Self: Sized,
    T: BitOr + BitOr<Output = T>,
{
    type Output = Self;
    fn bitor(self, _other: Self) -> Self {
        todo!()
    }
}
```

Before this change it would ICE. In #70998 the removed logic was added
to provide better suggestions, and the `delay_span_bug` guard was added
to  protect against a potential logic error when returning traits. As it
happens, there are cases, like the one above, where traits can indeed be
returned, so valid code was being rejected.

Fix #80207.
-rw-r--r--compiler/rustc_typeck/src/check/check.rs1
-rw-r--r--src/test/ui/typeck/issue-80207-unsized-return.rs20
2 files changed, 20 insertions, 1 deletions
diff --git a/compiler/rustc_typeck/src/check/check.rs b/compiler/rustc_typeck/src/check/check.rs
index 47361092a5c..9c8b09823e5 100644
--- a/compiler/rustc_typeck/src/check/check.rs
+++ b/compiler/rustc_typeck/src/check/check.rs
@@ -192,7 +192,6 @@ pub(super) fn check_fn<'a, 'tcx>(
         // possible cases.
         fcx.check_expr(&body.value);
         fcx.require_type_is_sized(declared_ret_ty, decl.output.span(), traits::SizedReturnType);
-        tcx.sess.delay_span_bug(decl.output.span(), "`!Sized` return type");
     } else {
         fcx.require_type_is_sized(declared_ret_ty, decl.output.span(), traits::SizedReturnType);
         fcx.check_return_expr(&body.value);
diff --git a/src/test/ui/typeck/issue-80207-unsized-return.rs b/src/test/ui/typeck/issue-80207-unsized-return.rs
new file mode 100644
index 00000000000..75430da1482
--- /dev/null
+++ b/src/test/ui/typeck/issue-80207-unsized-return.rs
@@ -0,0 +1,20 @@
+// check-pass
+
+trait Foo {
+    fn do_stuff() -> Self;
+}
+
+trait Bar {
+    type Output;
+}
+
+impl<T> Foo for dyn Bar<Output = T>
+where
+    Self: Sized,
+{
+    fn do_stuff() -> Self {
+        todo!()
+    }
+}
+
+fn main() {}