Skip to content

Commit 48fbcb6

Browse files
authored
Unrolled build for rust-lang#135245
Rollup merge of rust-lang#135245 - Enselic:no-set-env, r=davidtwco rustc_feature: Avoid unsafe `std::env::set_var()` in `UnstableFeatures` tests Avoid unsafe `std::env::set_var()` by allowing tests to inject `std::env::var("RUSTC_BOOTSTRAP")` with a `env_var_rustc_bootstrap` parameter. Part of rust-lang#130672 Discussed at rust-lang#129636 (comment) (CC `@compiler-errors` `@bjorn3)`
2 parents 2ae9916 + 54ce831 commit 48fbcb6

File tree

2 files changed

+21
-7
lines changed

2 files changed

+21
-7
lines changed

compiler/rustc_feature/src/lib.rs

+11-1
Original file line numberDiff line numberDiff line change
@@ -68,14 +68,24 @@ impl UnstableFeatures {
6868
/// If `krate` is [`Some`], then setting `RUSTC_BOOTSTRAP=krate` will enable the nightly
6969
/// features. Otherwise, only `RUSTC_BOOTSTRAP=1` will work.
7070
pub fn from_environment(krate: Option<&str>) -> Self {
71+
Self::from_environment_value(krate, std::env::var("RUSTC_BOOTSTRAP"))
72+
}
73+
74+
/// Avoid unsafe `std::env::set_var()` by allowing tests to inject
75+
/// `std::env::var("RUSTC_BOOTSTRAP")` with the `env_var_rustc_bootstrap`
76+
/// arg.
77+
fn from_environment_value(
78+
krate: Option<&str>,
79+
env_var_rustc_bootstrap: Result<String, std::env::VarError>,
80+
) -> Self {
7181
// `true` if this is a feature-staged build, i.e., on the beta or stable channel.
7282
let disable_unstable_features =
7383
option_env!("CFG_DISABLE_UNSTABLE_FEATURES").is_some_and(|s| s != "0");
7484
// Returns whether `krate` should be counted as unstable
7585
let is_unstable_crate =
7686
|var: &str| krate.is_some_and(|name| var.split(',').any(|new_krate| new_krate == name));
7787

78-
let bootstrap = std::env::var("RUSTC_BOOTSTRAP").ok();
88+
let bootstrap = env_var_rustc_bootstrap.ok();
7989
if let Some(val) = bootstrap.as_deref() {
8090
match val {
8191
val if val == "1" || is_unstable_crate(val) => return UnstableFeatures::Cheat,

compiler/rustc_feature/src/tests.rs

+10-6
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@ use super::UnstableFeatures;
22

33
#[test]
44
fn rustc_bootstrap_parsing() {
5-
let is_bootstrap = |env, krate| {
6-
std::env::set_var("RUSTC_BOOTSTRAP", env);
7-
matches!(UnstableFeatures::from_environment(krate), UnstableFeatures::Cheat)
5+
let is_bootstrap = |env: &str, krate: Option<&str>| {
6+
matches!(
7+
UnstableFeatures::from_environment_value(krate, Ok(env.to_string())),
8+
UnstableFeatures::Cheat
9+
)
810
};
911
assert!(is_bootstrap("1", None));
1012
assert!(is_bootstrap("1", Some("x")));
@@ -22,9 +24,11 @@ fn rustc_bootstrap_parsing() {
2224
assert!(!is_bootstrap("0", None));
2325

2426
// `RUSTC_BOOTSTRAP=-1` is force-stable, no unstable features allowed.
25-
let is_force_stable = |krate| {
26-
std::env::set_var("RUSTC_BOOTSTRAP", "-1");
27-
matches!(UnstableFeatures::from_environment(krate), UnstableFeatures::Disallow)
27+
let is_force_stable = |krate: Option<&str>| {
28+
matches!(
29+
UnstableFeatures::from_environment_value(krate, Ok("-1".to_string())),
30+
UnstableFeatures::Disallow
31+
)
2832
};
2933
assert!(is_force_stable(None));
3034
// Does not support specifying any crate.

0 commit comments

Comments
 (0)