1- // Test basic functionality of `if` and `match` in a const context.
1+ // Test basic functionality of control flow in a const context.
22
33// run-pass
44
55#![ feature( const_panic) ]
66#![ feature( const_if_match) ]
7+ #![ feature( const_loop) ]
78#![ feature( const_fn) ]
89
910const X : u32 = 4 ;
@@ -30,15 +31,57 @@ const fn gcd(a: u32, b: u32) -> u32 {
3031 gcd ( b, a % b)
3132}
3233
34+ const fn fib ( n : u64 ) -> u64 {
35+ if n == 0 {
36+ return 0 ;
37+ }
38+
39+ let mut fib = ( 0 , 1 ) ;
40+ let mut i = 1 ;
41+ while i < n {
42+ fib = ( fib. 1 , fib. 0 + fib. 1 ) ;
43+ i += 1 ;
44+ }
45+
46+ fib. 1
47+ }
48+
49+ const fn is_prime ( n : u64 ) -> bool {
50+ if n % 2 == 0 {
51+ return false ;
52+ }
53+
54+ let mut div = 3 ;
55+ loop {
56+ if n % div == 0 {
57+ return false ;
58+ }
59+
60+ if div * div > n {
61+ return true ;
62+ }
63+
64+ div += 2 ;
65+ }
66+ }
67+
68+ macro_rules! const_assert {
69+ ( $expr: expr) => {
70+ const _: ( ) = assert!( $expr) ;
71+ assert!( $expr) ;
72+ }
73+ }
74+
3375fn main ( ) {
34- const _: ( ) = assert ! ( abs_diff( 4 , 5 ) == abs_diff( 5 , 4 ) ) ;
35- assert_eq ! ( abs_diff( 4 , 5 ) , abs_diff( 5 , 4 ) ) ;
76+ const_assert ! ( abs_diff( 4 , 5 ) == abs_diff( 5 , 4 ) ) ;
77+ const_assert ! ( ABS_DIFF == abs_diff( 5 , 4 ) ) ;
78+
79+ const_assert ! ( gcd( 48 , 18 ) == 6 ) ;
80+ const_assert ! ( gcd( 18 , 48 ) == 6 ) ;
3681
37- const _ : ( ) = assert ! ( ABS_DIFF == abs_diff ( 5 , 4 ) ) ;
38- assert_eq ! ( ABS_DIFF , abs_diff ( 5 , 4 ) ) ;
82+ const_assert ! ( fib ( 2 ) == 1 ) ;
83+ const_assert ! ( fib ( 8 ) == 21 ) ;
3984
40- const _: ( ) = assert ! ( gcd( 48 , 18 ) == 6 ) ;
41- const _: ( ) = assert ! ( gcd( 18 , 48 ) == 6 ) ;
42- assert_eq ! ( gcd( 48 , 18 ) , 6 ) ;
43- assert_eq ! ( gcd( 18 , 48 ) , 6 ) ;
85+ const_assert ! ( is_prime( 113 ) ) ;
86+ const_assert ! ( !is_prime( 117 ) ) ;
4487}
0 commit comments