2020-01-11 07:15:24 -06:00
// Based on https://github.com/rust-lang/rust/blob/c5840f9d252c2f5cc16698dbf385a29c5de3ca07/src/test/ui/array-slice-vec/subslice-patterns-const-eval-match.rs
// Test that array subslice patterns are correctly handled in const evaluation.
// run-pass
#[ derive(PartialEq, Debug, Clone) ]
struct N ( u8 ) ;
#[ derive(PartialEq, Debug, Clone) ]
struct Z ;
macro_rules ! n {
( $( $e :expr ) , * $(, ) ? ) = > {
[ $( N ( $e ) ) , * ]
}
}
// This macro has an unused variable so that it can be repeated base on the
// number of times a repeated variable (`$e` in `z`) occurs.
macro_rules ! zed {
2023-03-18 09:27:50 -05:00
( $e :expr ) = > {
Z
} ;
2020-01-11 07:15:24 -06:00
}
macro_rules ! z {
( $( $e :expr ) , * $(, ) ? ) = > {
[ $( zed! ( $e ) ) , * ]
}
}
// Compare constant evaluation and runtime evaluation of a given expression.
macro_rules ! compare_evaluation {
( $e :expr , $t :ty $(, ) ? ) = > { {
const CONST_EVAL : $t = $e ;
2023-03-18 09:27:50 -05:00
const fn const_eval ( ) -> $t {
$e
}
2020-01-11 07:15:24 -06:00
static CONST_EVAL2 : $t = const_eval ( ) ;
let runtime_eval = $e ;
assert_eq! ( CONST_EVAL , runtime_eval ) ;
assert_eq! ( CONST_EVAL2 , runtime_eval ) ;
2023-03-18 09:27:50 -05:00
} } ;
2020-01-11 07:15:24 -06:00
}
// Repeat `$test`, substituting the given macro variables with the given
// identifiers.
//
// For example:
//
// repeat! {
// ($name); X; Y:
// struct $name;
// }
//
// Expands to:
//
// struct X; struct Y;
//
// This is used to repeat the tests using both the `N` and `Z`
// types.
macro_rules ! repeat {
( ( $( $dollar :tt $placeholder :ident ) * ) ; $( $( $values :ident ) , + ) ; * : $( $test :tt ) * ) = > {
macro_rules ! single {
( $( $dollar $placeholder :ident ) , * ) = > { $( $test ) * }
}
$( single! ( $( $values ) , + ) ; ) *
}
}
2023-03-18 09:27:50 -05:00
#[ rustfmt::skip ]
2020-01-11 07:15:24 -06:00
fn main ( ) {
repeat! {
( $arr $Ty ) ; n , N ; z , Z :
compare_evaluation! ( { let [ _ , x @ .. , _ ] = $arr ! ( 1 , 2 , 3 , 4 ) ; x } , [ $Ty ; 2 ] ) ;
compare_evaluation! ( { let [ _ , ref x @ .. , _ ] = $arr ! ( 1 , 2 , 3 , 4 ) ; x } , & 'static [ $Ty ; 2 ] ) ;
compare_evaluation! ( { let [ _ , x @ .. , _ ] = & $arr ! ( 1 , 2 , 3 , 4 ) ; x } , & 'static [ $Ty ; 2 ] ) ;
compare_evaluation! ( { let [ _ , _ , x @ .. , _ , _ ] = $arr ! ( 1 , 2 , 3 , 4 ) ; x } , [ $Ty ; 0 ] ) ;
compare_evaluation! (
{ let [ _ , _ , ref x @ .. , _ , _ ] = $arr ! ( 1 , 2 , 3 , 4 ) ; x } ,
& 'static [ $Ty ; 0 ] ,
) ;
compare_evaluation! (
{ let [ _ , _ , x @ .. , _ , _ ] = & $arr ! ( 1 , 2 , 3 , 4 ) ; x } ,
& 'static [ $Ty ; 0 ] ,
) ;
compare_evaluation! ( { let [ _ , .. , x ] = $arr ! ( 1 , 2 , 3 , 4 ) ; x } , $Ty ) ;
compare_evaluation! ( { let [ _ , .. , ref x ] = $arr ! ( 1 , 2 , 3 , 4 ) ; x } , & 'static $Ty ) ;
compare_evaluation! ( { let [ _ , _y @ .. , x ] = & $arr ! ( 1 , 2 , 3 , 4 ) ; x } , & 'static $Ty ) ;
}
compare_evaluation! ( { let [ _ , .. , N ( x ) ] = n! ( 1 , 2 , 3 , 4 ) ; x } , u8 ) ;
compare_evaluation! ( { let [ _ , .. , N ( ref x ) ] = n! ( 1 , 2 , 3 , 4 ) ; x } , & 'static u8 ) ;
compare_evaluation! ( { let [ _ , .. , N ( x ) ] = & n! ( 1 , 2 , 3 , 4 ) ; x } , & 'static u8 ) ;
compare_evaluation! ( { let [ N ( x ) , .. , _ ] = n! ( 1 , 2 , 3 , 4 ) ; x } , u8 ) ;
compare_evaluation! ( { let [ N ( ref x ) , .. , _ ] = n! ( 1 , 2 , 3 , 4 ) ; x } , & 'static u8 ) ;
compare_evaluation! ( { let [ N ( x ) , .. , _ ] = & n! ( 1 , 2 , 3 , 4 ) ; x } , & 'static u8 ) ;
}