Don't reject *multiple* relaxed bounds, reject *duplicate* ones.
Having multiple relaxed bounds like `?Sized + ?Iterator` is actually *fine*. We actually want to reject *duplicate* relaxed bounds like `?Sized + ?Sized` because these most certainly represent a user error. Note that this doesn't mean that we accept more code because a bound like `?Iterator` is still invalid as it's not relaxing a *default* trait and the only way to define / use more default bounds is under the experimental and internal feature `more_maybe_bounds` plus `lang_items` plus unstable flag `-Zexperimental-default-bounds` (historical context: for the longest time, bounds like `?Iterator` were actually allowed and lead to a hard warning). Ultimately, this simply *reframes* the diagnostic. The scope of `more_maybe_bounds` / `-Zexperimental-default-bounds` remains unchanged as well.
This commit is contained in:
@@ -1,15 +1,15 @@
|
||||
Having multiple relaxed default bounds is unsupported.
|
||||
Having duplicate relaxed default bounds is unsupported.
|
||||
|
||||
Erroneous code example:
|
||||
|
||||
```compile_fail,E0203
|
||||
struct Bad<T: ?Sized + ?Send>{
|
||||
inner: T
|
||||
struct Bad<T: ?Sized + ?Sized>{
|
||||
inner: T,
|
||||
}
|
||||
```
|
||||
|
||||
Here the type `T` cannot have a relaxed bound for multiple default traits
|
||||
(`Sized` and `Send`). This can be fixed by only using one relaxed bound.
|
||||
Here the type parameter `T` cannot have duplicate relaxed bounds for default
|
||||
trait `Sized`. This can be fixed by only using one relaxed bound:
|
||||
|
||||
```
|
||||
struct Good<T: ?Sized>{
|
||||
|
||||
Reference in New Issue
Block a user