1
- // Test basic functionality of `if` and `match` in a const context.
1
+ // Test basic functionality of control flow in a const context.
2
2
3
3
// run-pass
4
4
5
5
#![ feature( const_panic) ]
6
6
#![ feature( const_if_match) ]
7
+ #![ feature( const_loop) ]
7
8
#![ feature( const_fn) ]
8
9
9
10
const X : u32 = 4 ;
@@ -30,15 +31,57 @@ const fn gcd(a: u32, b: u32) -> u32 {
30
31
gcd ( b, a % b)
31
32
}
32
33
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
+
33
75
fn 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 ) ;
36
81
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 ) ;
39
84
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 ) ) ;
44
87
}
0 commit comments