Better diagnostics for env! where variable contains escape

This commit is contained in:
clubby789 2023-05-11 12:57:45 +01:00
parent 4d941cd981
commit 2555f3bbcf
4 changed files with 29 additions and 9 deletions

View File

@ -63,7 +63,8 @@ pub fn expand_env<'cx>(
Some(exprs) => exprs.into_iter(), Some(exprs) => exprs.into_iter(),
}; };
let Some((var, _style)) = expr_to_string(cx, exprs.next().unwrap(), "expected string literal") else { let var_expr = exprs.next().unwrap();
let Some((var, _)) = expr_to_string(cx, var_expr.clone(), "expected string literal") else {
return DummyResult::any(sp); return DummyResult::any(sp);
}; };
@ -71,7 +72,7 @@ pub fn expand_env<'cx>(
None => None, None => None,
Some(second) => match expr_to_string(cx, second, "expected string literal") { Some(second) => match expr_to_string(cx, second, "expected string literal") {
None => return DummyResult::any(sp), None => return DummyResult::any(sp),
Some((s, _style)) => Some(s), Some((s, _)) => Some(s),
}, },
}; };
@ -80,10 +81,15 @@ pub fn expand_env<'cx>(
cx.sess.parse_sess.env_depinfo.borrow_mut().insert((var, value)); cx.sess.parse_sess.env_depinfo.borrow_mut().insert((var, value));
let e = match value { let e = match value {
None => { None => {
// Use the string literal in the code in the diagnostic to avoid confusing diagnostics,
// e.g. when the literal contains escape sequences.
let ast::ExprKind::Lit(ast::token::Lit { kind: ast::token::LitKind::Str, symbol: original_var, ..}) = &var_expr.kind else {
unreachable!("`expr_to_string` ensures this is a string lit")
};
cx.emit_err(errors::EnvNotDefined { cx.emit_err(errors::EnvNotDefined {
span: sp, span: sp,
msg: custom_msg, msg: custom_msg,
var, var: *original_var,
help: custom_msg.is_none().then(|| help_for_missing_env_var(var.as_str())), help: custom_msg.is_none().then(|| help_for_missing_env_var(var.as_str())),
}); });
return DummyResult::any(sp); return DummyResult::any(sp);

View File

@ -0,0 +1,3 @@
fn main() {
env!("\t"); //~ERROR environment variable `\t` not defined at compile time
}

View File

@ -0,0 +1,11 @@
error: environment variable `\t` not defined at compile time
--> $DIR/extenv-escaped-var.rs:2:5
|
LL | env!("\t");
| ^^^^^^^^^^
|
= help: use `std::env::var("\t")` to read the variable at run time
= note: this error originates in the macro `env` (in Nightly builds, run with -Z macro-backtrace for more info)
error: aborting due to previous error

View File

@ -1,28 +1,28 @@
error: environment variable ` ` not defined at compile time error: environment variable `\t` not defined at compile time
--> $DIR/issue-110547.rs:4:5 --> $DIR/issue-110547.rs:4:5
| |
LL | env!{"\t"}; LL | env!{"\t"};
| ^^^^^^^^^^ | ^^^^^^^^^^
| |
= help: use `std::env::var(" ")` to read the variable at run time = help: use `std::env::var("\t")` to read the variable at run time
= note: this error originates in the macro `env` (in Nightly builds, run with -Z macro-backtrace for more info) = note: this error originates in the macro `env` (in Nightly builds, run with -Z macro-backtrace for more info)
error: environment variable ` ` not defined at compile time error: environment variable `\t` not defined at compile time
--> $DIR/issue-110547.rs:5:5 --> $DIR/issue-110547.rs:5:5
| |
LL | env!("\t"); LL | env!("\t");
| ^^^^^^^^^^ | ^^^^^^^^^^
| |
= help: use `std::env::var(" ")` to read the variable at run time = help: use `std::env::var("\t")` to read the variable at run time
= note: this error originates in the macro `env` (in Nightly builds, run with -Z macro-backtrace for more info) = note: this error originates in the macro `env` (in Nightly builds, run with -Z macro-backtrace for more info)
error: environment variable `` not defined at compile time error: environment variable `\u{2069}` not defined at compile time
--> $DIR/issue-110547.rs:6:5 --> $DIR/issue-110547.rs:6:5
| |
LL | env!("\u{2069}"); LL | env!("\u{2069}");
| ^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^
| |
= help: use `std::env::var("")` to read the variable at run time = help: use `std::env::var("\u{2069}")` to read the variable at run time
= note: this error originates in the macro `env` (in Nightly builds, run with -Z macro-backtrace for more info) = note: this error originates in the macro `env` (in Nightly builds, run with -Z macro-backtrace for more info)
error: aborting due to 3 previous errors error: aborting due to 3 previous errors