// Tests the Collatz conjecture with an incorrect base case (0 instead of 1).
// The value of `n` will loop indefinitely (4 - 2 - 1 - 4).
let _ = [(); {
- //~^ WARNING Constant evaluating a complex constant, this might take some time
let mut n = 113383; // #20 in https://oeis.org/A006884
while n != 0 {
//~^ ERROR `while` is not allowed in a `const`
error[E0658]: `while` is not allowed in a `const`
- --> $DIR/infinite_loop.rs:7:9
+ --> $DIR/infinite_loop.rs:6:9
|
LL | / while n != 0 {
LL | |
= help: add `#![feature(const_if_match)]` to the crate attributes to enable
error[E0658]: `if` is not allowed in a `const`
- --> $DIR/infinite_loop.rs:9:17
+ --> $DIR/infinite_loop.rs:8:17
|
LL | n = if n % 2 == 0 { n/2 } else { 3*n + 1 };
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
= note: see issue #49146 <https://github.com/rust-lang/rust/issues/49146> for more information
= help: add `#![feature(const_if_match)]` to the crate attributes to enable
-warning: Constant evaluating a complex constant, this might take some time
- --> $DIR/infinite_loop.rs:4:18
- |
-LL | let _ = [(); {
- | __________________^
-LL | |
-LL | | let mut n = 113383; // #20 in https://oeis.org/A006884
-LL | | while n != 0 {
-... |
-LL | | n
-LL | | }];
- | |_____^
-
error[E0080]: evaluation of constant value failed
- --> $DIR/infinite_loop.rs:9:20
+ --> $DIR/infinite_loop.rs:8:20
|
LL | n = if n % 2 == 0 { n/2 } else { 3*n + 1 };
- | ^^^^^^^^^^ duplicate interpreter state observed here, const evaluation will never terminate
+ | ^^^^^^^^^^ exceeded interpreter time limit
error: aborting due to 3 previous errors
fn main() {
let _ = [(); {
- //~^ WARNING Constant evaluating a complex constant, this might take some time
let mut x = &0;
let mut n = 0;
while n < 5 {
error[E0658]: `while` is not allowed in a `const`
- --> $DIR/issue-52475.rs:6:9
+ --> $DIR/issue-52475.rs:5:9
|
LL | / while n < 5 {
LL | |
= help: add `#![feature(const_loop)]` to the crate attributes to enable
= help: add `#![feature(const_if_match)]` to the crate attributes to enable
-warning: Constant evaluating a complex constant, this might take some time
- --> $DIR/issue-52475.rs:2:18
- |
-LL | let _ = [(); {
- | __________________^
-LL | |
-LL | | let mut x = &0;
-LL | | let mut n = 0;
-... |
-LL | | 0
-LL | | }];
- | |_____^
-
error[E0080]: evaluation of constant value failed
- --> $DIR/issue-52475.rs:8:17
+ --> $DIR/issue-52475.rs:7:17
|
LL | n = (n + 1) % 5;
- | ^^^^^^^^^^^ duplicate interpreter state observed here, const evaluation will never terminate
+ | ^^^^^^^^^^^ exceeded interpreter time limit
error: aborting due to 2 previous errors
// check-pass
+
#![feature(const_eval_limit)]
-#![const_eval_limit="1000"]
+#![feature(const_loop, const_if_match)]
-const CONSTANT: usize = limit();
+// This needs to be higher than the number of loop iterations since each pass through the loop may
+// hit more than one terminator.
+#![const_eval_limit="4000"]
-fn main() {
- assert_eq!(CONSTANT, 1764);
-}
+const X: usize = {
+ let mut x = 0;
+ while x != 1000 {
+ x += 1;
+ }
-const fn limit() -> usize {
- let x = 42;
+ x
+};
- x * 42
+fn main() {
+ assert_eq!(X, 1000);
}
-// ignore-tidy-linelength
-// only-x86_64
-// check-pass
-// NOTE: We always compile this test with -Copt-level=0 because higher opt-levels
-// optimize away the const function
-// compile-flags:-Copt-level=0
#![feature(const_eval_limit)]
-#![const_eval_limit="2"]
+#![feature(const_loop, const_if_match)]
-const CONSTANT: usize = limit();
-//~^ WARNING Constant evaluating a complex constant, this might take some time
+#![const_eval_limit="500"]
-fn main() {
- assert_eq!(CONSTANT, 1764);
-}
+const X: usize = {
+ let mut x = 0;
+ while x != 1000 {
+ //~^ ERROR any use of this value will cause an error
+ x += 1;
+ }
-const fn limit() -> usize { //~ WARNING Constant evaluating a complex constant, this might take some time
- let x = 42;
+ x
+};
- x * 42
+fn main() {
+ assert_eq!(X, 1000);
}
-warning: Constant evaluating a complex constant, this might take some time
- --> $DIR/const_eval_limit_reached.rs:17:1
+error: any use of this value will cause an error
+ --> $DIR/const_eval_limit_reached.rs:8:11
|
-LL | / const fn limit() -> usize {
-LL | | let x = 42;
+LL | / const X: usize = {
+LL | | let mut x = 0;
+LL | | while x != 1000 {
+ | | ^^^^^^^^^ exceeded interpreter time limit
LL | |
-LL | | x * 42
-LL | | }
- | |_^
-
-warning: Constant evaluating a complex constant, this might take some time
- --> $DIR/const_eval_limit_reached.rs:10:1
+... |
+LL | | x
+LL | | };
+ | |__-
|
-LL | const CONSTANT: usize = limit();
- | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ = note: `#[deny(const_err)]` on by default
+
+error: aborting due to previous error