Skip to content

Commit

Permalink
Add test of thread_local containing multiline const block
Browse files Browse the repository at this point in the history
Before making thread_local accept statements inside the const block,
this test would fail to compile as follows:

    error: no rules expected the token `let`
       --> library/std/tests/thread.rs:26:13
        |
    26  |             let value = 1;
        |             ^^^ no rules expected this token in macro call
        |
    note: while trying to match meta-variable `$init:expr`
       --> library/std/src/thread/local.rs:189:69
        |
    189 |     ($(#[$attr:meta])* $vis:vis static $name:ident: $t:ty = const { $init:expr }; $($rest:tt)*) => (
        |                                                                     ^^^^^^^^^^
  • Loading branch information
dtolnay committed Jan 21, 2024
1 parent f52b88e commit c43344e
Showing 1 changed file with 22 additions and 0 deletions.
22 changes: 22 additions & 0 deletions library/std/tests/thread.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
use std::cell::{Cell, RefCell};
use std::sync::{Arc, Mutex};
use std::thread;
use std::time::Duration;
Expand All @@ -14,3 +15,24 @@ fn sleep() {
thread::sleep(Duration::from_millis(100));
assert_eq!(*finished.lock().unwrap(), false);
}

#[test]
fn thread_local_containing_const_statements() {
// This exercises the `const $init:block` cases of the thread_local macro.
// Despite overlapping with expression syntax, the `const { ... }` is not
// parsed as `$init:expr`.
thread_local! {
static CELL: Cell<u32> = const {
let value = 1;
Cell::new(value)
};

static REFCELL: RefCell<u32> = const {
let value = 1;
RefCell::new(value)
};
}

assert_eq!(CELL.get(), 1);
assert_eq!(REFCELL.take(), 1);
}

0 comments on commit c43344e

Please sign in to comment.