forked from rust-lang/rust
-
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmissing_const_for_thread_local.fixed
75 lines (64 loc) · 2.42 KB
/
missing_const_for_thread_local.fixed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#![warn(clippy::missing_const_for_thread_local)]
use std::cell::{Cell, RefCell};
fn main() {
// lint and suggest const
thread_local! {
static BUF_1: RefCell<String> = const { RefCell::new(String::new()) };
}
//~^^ ERROR: initializer for `thread_local` value can be made `const`
// don't lint
thread_local! {
static BUF_2: RefCell<String> = const { RefCell::new(String::new()) };
}
thread_local! {
static SIMPLE:i32 = const { 1 };
}
//~^^ ERROR: initializer for `thread_local` value can be made `const`
// lint and suggest const for all non const items
thread_local! {
static BUF_3_CAN_BE_MADE_CONST: RefCell<String> = const { RefCell::new(String::new()) };
static CONST_MIXED_WITH:i32 = const { 1 };
static BUF_4_CAN_BE_MADE_CONST: RefCell<String> = const { RefCell::new(String::new()) };
}
//~^^^^ ERROR: initializer for `thread_local` value can be made `const`
//~^^^ ERROR: initializer for `thread_local` value can be made `const`
thread_local! {
static PEEL_ME: i32 = const { 1 };
//~^ ERROR: initializer for `thread_local` value can be made `const`
static PEEL_ME_MANY: i32 = const { { let x = 1; x * x } };
//~^ ERROR: initializer for `thread_local` value can be made `const`
}
}
fn issue_12637() {
/// The set methods on LocalKey<Cell<T>> and LocalKey<RefCell<T>> are
/// guaranteed to bypass the thread_local's initialization expression.
/// See rust-lang/rust#92122. Thus, = panic!() is a useful idiom for
/// forcing the use of set on each thread before it accesses the thread local in any other
/// manner.
thread_local! {
static STATE_12637_PANIC: Cell<usize> = panic!();
}
STATE_12637_PANIC.set(9);
println!("{}", STATE_12637_PANIC.get());
thread_local! {
static STATE_12637_TODO: Cell<usize> = todo!();
}
STATE_12637_TODO.set(9);
println!("{}", STATE_12637_TODO.get());
thread_local! {
static STATE_12637_UNIMPLEMENTED: Cell<usize> = unimplemented!();
}
STATE_12637_UNIMPLEMENTED.set(9);
println!("{}", STATE_12637_UNIMPLEMENTED.get());
thread_local! {
static STATE_12637_UNREACHABLE: Cell<usize> = unreachable!();
}
STATE_12637_UNREACHABLE.set(9);
println!("{}", STATE_12637_UNREACHABLE.get());
}
#[clippy::msrv = "1.58"]
fn f() {
thread_local! {
static TLS: i32 = 1;
}
}