File tree 7 files changed +145
-0
lines changed
src/test/ui/never-fallback
7 files changed +145
-0
lines changed Original file line number Diff line number Diff line change
1
+ // check-pass
2
+ // Verifies that our fallback-UB check doesn't trigger
3
+ // on correct code
4
+ #![ feature( never_type) ]
5
+ #![ feature( never_type_fallback) ]
6
+
7
+ fn foo ( e : !) -> Box < dyn std:: error:: Error > {
8
+ Box :: < _ > :: new ( e)
9
+ }
10
+
11
+ fn main ( ) { }
Original file line number Diff line number Diff line change
1
+ // check-pass
2
+ // Tests that we correctly infer types to !
3
+ #![ feature( never_type) ]
4
+ #![ feature( never_type_fallback) ]
5
+
6
+ struct E ;
7
+ impl From < !> for E {
8
+ fn from ( x : !) -> E { x }
9
+ }
10
+ fn foo ( never : !) {
11
+ <E as From < _ > >:: from ( never) ;
12
+ }
13
+
14
+ fn main ( ) { }
Original file line number Diff line number Diff line change
1
+ // check-pass
2
+ use std:: convert:: { TryFrom , Infallible } ;
3
+
4
+ struct E ;
5
+
6
+ impl From < Infallible > for E {
7
+ fn from ( _: Infallible ) -> E {
8
+ E
9
+ }
10
+ }
11
+
12
+ fn foo ( ) -> Result < ( ) , E > {
13
+ u32:: try_from ( 1u32 ) ?;
14
+ Ok ( ( ) )
15
+ }
16
+
17
+ fn main ( ) { }
Original file line number Diff line number Diff line change
1
+ #![ feature( never_type) ]
2
+ #![ feature( never_type_fallback) ]
3
+
4
+ fn get_type < T > ( _: T ) -> & ' static str {
5
+ std:: any:: type_name :: < T > ( )
6
+ }
7
+
8
+ fn unconstrained_return < T > ( ) -> Result < T , String > {
9
+ Err ( "Hi" . to_string ( ) )
10
+ }
11
+
12
+ fn foo ( ) {
13
+ let a = || {
14
+ match unconstrained_return :: < _ > ( ) { //~ ERROR Fallback to `!` may introduce undefined behavior
15
+ Ok ( x) => x, // `x` has type `_`, which is unconstrained
16
+ Err ( s) => panic ! ( s) , // … except for unifying with the type of `panic!()`
17
+ // so that both `match` arms have the same type.
18
+ // Therefore `_` resolves to `!` and we "return" an `Ok(!)` value.
19
+ }
20
+ } ;
21
+
22
+ let cast: & dyn FnOnce ( ) -> _ = & a;
23
+ println ! ( "Return type: {:?}" , get_type( cast) ) ;
24
+ }
25
+
26
+ fn main ( ) {
27
+ foo ( )
28
+ }
Original file line number Diff line number Diff line change
1
+ error: Fallback to `!` may introduce undefined behavior
2
+ --> $DIR/obj.rs:14:15
3
+ |
4
+ LL | match unconstrained_return::<_>() {
5
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^
6
+ |
7
+ note: the type here was inferred to `!`
8
+ --> $DIR/obj.rs:14:38
9
+ |
10
+ LL | match unconstrained_return::<_>() {
11
+ | ^
12
+ note: ... due to this expression evaluating to `!`
13
+ --> $DIR/obj.rs:16:23
14
+ |
15
+ LL | Err(s) => panic!(s), // … except for unifying with the type of `panic!()`
16
+ | ^^^^^^^^^
17
+ = note: If you want the `!` type to be used here, add explicit type annotations
18
+ = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info)
19
+
20
+ error: aborting due to previous error
21
+
Original file line number Diff line number Diff line change
1
+ #![ feature( never_type) ]
2
+ #![ feature( never_type_fallback) ]
3
+
4
+ fn get_type < T > ( _: T ) -> & ' static str {
5
+ std:: any:: type_name :: < T > ( )
6
+ }
7
+
8
+ fn unconstrained_return < T > ( ) -> Result < T , String > {
9
+ Err ( "Hi" . to_string ( ) )
10
+ }
11
+
12
+ fn foo ( ) {
13
+ let a = || {
14
+ match unconstrained_return ( ) { //~ ERROR Fallback to `!` may introduce undefined behavior
15
+ Ok ( x) => x, // `x` has type `_`, which is unconstrained
16
+ Err ( s) => panic ! ( s) , // … except for unifying with the type of `panic!()`
17
+ // so that both `match` arms have the same type.
18
+ // Therefore `_` resolves to `!` and we "return" an `Ok(!)` value.
19
+ }
20
+ } ;
21
+
22
+ let cast: & dyn FnOnce ( ) -> _ = & a;
23
+ println ! ( "Return type: {:?}" , get_type( cast) ) ;
24
+ }
25
+
26
+ fn main ( ) {
27
+ foo ( )
28
+ }
Original file line number Diff line number Diff line change
1
+ error: Fallback to `!` may introduce undefined behavior
2
+ --> $DIR/obj_implicit.rs:14:15
3
+ |
4
+ LL | match unconstrained_return() {
5
+ | ^^^^^^^^^^^^^^^^^^^^^^
6
+ |
7
+ note: the type parameter T here was inferred to `!`
8
+ --> $DIR/obj_implicit.rs:14:15
9
+ |
10
+ LL | match unconstrained_return() {
11
+ | ^^^^^^^^^^^^^^^^^^^^
12
+ note: (type parameter defined here)
13
+ --> $DIR/obj_implicit.rs:8:25
14
+ |
15
+ LL | fn unconstrained_return<T>() -> Result<T, String> {
16
+ | ^
17
+ note: ... due to this expression evaluating to `!`
18
+ --> $DIR/obj_implicit.rs:16:23
19
+ |
20
+ LL | Err(s) => panic!(s), // … except for unifying with the type of `panic!()`
21
+ | ^^^^^^^^^
22
+ = note: If you want the `!` type to be used here, add explicit type annotations
23
+ = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info)
24
+
25
+ error: aborting due to previous error
26
+
You can’t perform that action at this time.
0 commit comments