-
Notifications
You must be signed in to change notification settings - Fork 12.9k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Auto merge of #95519 - oli-obk:tait_ub2, r=compiler-errors
Enforce well formedness for type alias impl trait's hidden type fixes #84657 This was not an issue with return-position-impl-trait because the generic bounds of the function are the same as those of the opaque type, and the hidden type must already be well formed within the function. With type-alias-impl-trait the hidden type could be defined in a function that has *more* lifetime bounds than the type alias. This is fine, but the hidden type must still be well formed without those additional bounds.
- Loading branch information
Showing
7 changed files
with
112 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
28 changes: 28 additions & 0 deletions
28
src/test/ui/type-alias-impl-trait/underconstrained_generic.rs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
#![feature(type_alias_impl_trait)] | ||
|
||
use std::marker::PhantomData; | ||
|
||
trait Trait { | ||
fn foo<T, U>(t: T) -> U; | ||
} | ||
|
||
trait ProofForConversion<X> { | ||
fn convert<T, U>(_: PhantomData<Self>, r: T) -> U; | ||
} | ||
|
||
impl<X: Trait> ProofForConversion<X> for () { | ||
fn convert<T, U>(_: PhantomData<Self>, r: T) -> U { | ||
X::foo(r) | ||
} | ||
} | ||
|
||
type Converter<T> = impl ProofForConversion<T>; | ||
//~^ ERROR the trait bound `T: Trait` is not satisfied | ||
|
||
fn _defining_use<T: Trait>() -> Converter<T> { | ||
() | ||
} | ||
|
||
|
||
fn main() { | ||
} |
19 changes: 19 additions & 0 deletions
19
src/test/ui/type-alias-impl-trait/underconstrained_generic.stderr
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
error[E0277]: the trait bound `T: Trait` is not satisfied | ||
--> $DIR/underconstrained_generic.rs:19:21 | ||
| | ||
LL | type Converter<T> = impl ProofForConversion<T>; | ||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Trait` is not implemented for `T` | ||
| | ||
note: required because of the requirements on the impl of `ProofForConversion<T>` for `()` | ||
--> $DIR/underconstrained_generic.rs:13:16 | ||
| | ||
LL | impl<X: Trait> ProofForConversion<X> for () { | ||
| ^^^^^^^^^^^^^^^^^^^^^ ^^ | ||
help: consider restricting type parameter `T` | ||
| | ||
LL | type Converter<T: Trait> = impl ProofForConversion<T>; | ||
| +++++++ | ||
|
||
error: aborting due to previous error | ||
|
||
For more information about this error, try `rustc --explain E0277`. |
34 changes: 34 additions & 0 deletions
34
src/test/ui/type-alias-impl-trait/underconstrained_lifetime.rs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
#![feature(type_alias_impl_trait)] | ||
|
||
use std::marker::PhantomData; | ||
|
||
trait ProofForConversion<'a, 'b> { | ||
fn convert<T: ?Sized>(_: PhantomData<Self>, r: &'a T) -> &'b T; | ||
} | ||
|
||
impl<'a, 'b> ProofForConversion<'a, 'b> for &'b &'a () { | ||
fn convert<T: ?Sized>(_: PhantomData<Self>, r: &'a T) -> &'b T { | ||
r | ||
} | ||
} | ||
|
||
type Converter<'a, 'b> = impl ProofForConversion<'a, 'b>; | ||
//~^ ERROR reference has a longer lifetime than the data it references | ||
|
||
// Even _defining_use with an explicit `'a: 'b` compiles fine, too. | ||
fn _defining_use<'a, 'b>(x: &'b &'a ()) -> Converter<'a, 'b> { | ||
x | ||
} | ||
|
||
fn extend_lifetime<'a, 'b, T: ?Sized>(x: &'a T) -> &'b T { | ||
Converter::<'a, 'b>::convert(PhantomData, x) | ||
} | ||
|
||
fn main() { | ||
let d; | ||
{ | ||
let x = "Hello World".to_string(); | ||
d = extend_lifetime(&x); | ||
} | ||
println!("{}", d); | ||
} |
20 changes: 20 additions & 0 deletions
20
src/test/ui/type-alias-impl-trait/underconstrained_lifetime.stderr
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
error[E0491]: in type `&'b &'a ()`, reference has a longer lifetime than the data it references | ||
--> $DIR/underconstrained_lifetime.rs:15:26 | ||
| | ||
LL | type Converter<'a, 'b> = impl ProofForConversion<'a, 'b>; | ||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ||
| | ||
note: the pointer is valid for the lifetime `'b` as defined here | ||
--> $DIR/underconstrained_lifetime.rs:15:20 | ||
| | ||
LL | type Converter<'a, 'b> = impl ProofForConversion<'a, 'b>; | ||
| ^^ | ||
note: but the referenced data is only valid for the lifetime `'a` as defined here | ||
--> $DIR/underconstrained_lifetime.rs:15:16 | ||
| | ||
LL | type Converter<'a, 'b> = impl ProofForConversion<'a, 'b>; | ||
| ^^ | ||
|
||
error: aborting due to previous error | ||
|
||
For more information about this error, try `rustc --explain E0491`. |