@@ -15,7 +15,7 @@ use rustc_span::symbol::{Ident, Symbol, kw, sym};
1515use thin_vec:: thin_vec;
1616
1717use crate :: errors;
18- use crate :: util:: { expr_to_string, get_exprs_from_tts, get_single_str_from_tts } ;
18+ use crate :: util:: { expr_to_string, get_exprs_from_tts, get_single_expr_from_tts } ;
1919
2020fn lookup_env < ' cx > ( cx : & ' cx ExtCtxt < ' _ > , var : Symbol ) -> Result < Symbol , VarError > {
2121 let var = var. as_str ( ) ;
@@ -32,19 +32,28 @@ pub(crate) fn expand_option_env<'cx>(
3232 sp : Span ,
3333 tts : TokenStream ,
3434) -> MacroExpanderResult < ' cx > {
35- let ExpandResult :: Ready ( mac) = get_single_str_from_tts ( cx, sp, tts, "option_env!" ) else {
35+ let ExpandResult :: Ready ( mac_expr) = get_single_expr_from_tts ( cx, sp, tts, "option_env!" ) else {
36+ return ExpandResult :: Retry ( ( ) ) ;
37+ } ;
38+ let var_expr = match mac_expr {
39+ Ok ( var_expr) => var_expr,
40+ Err ( guar) => return ExpandResult :: Ready ( DummyResult :: any ( sp, guar) ) ,
41+ } ;
42+ let ExpandResult :: Ready ( mac) =
43+ expr_to_string ( cx, var_expr. clone ( ) , "argument must be a string literal" )
44+ else {
3645 return ExpandResult :: Retry ( ( ) ) ;
3746 } ;
3847 let var = match mac {
39- Ok ( var) => var,
48+ Ok ( ( var, _ ) ) => var,
4049 Err ( guar) => return ExpandResult :: Ready ( DummyResult :: any ( sp, guar) ) ,
4150 } ;
4251
4352 let sp = cx. with_def_site_ctxt ( sp) ;
44- let value = lookup_env ( cx, var) . ok ( ) ;
45- cx. sess . psess . env_depinfo . borrow_mut ( ) . insert ( ( var, value) ) ;
53+ let value = lookup_env ( cx, var) ;
54+ cx. sess . psess . env_depinfo . borrow_mut ( ) . insert ( ( var, value. as_ref ( ) . ok ( ) . copied ( ) ) ) ;
4655 let e = match value {
47- None => {
56+ Err ( VarError :: NotPresent ) => {
4857 let lt = cx. lifetime ( sp, Ident :: new ( kw:: StaticLifetime , sp) ) ;
4958 cx. expr_path ( cx. path_all (
5059 sp,
@@ -58,7 +67,18 @@ pub(crate) fn expand_option_env<'cx>(
5867 ) ) ] ,
5968 ) )
6069 }
61- Some ( value) => {
70+ Err ( VarError :: NotUnicode ( _) ) => {
71+ let ExprKind :: Lit ( token:: Lit {
72+ kind : LitKind :: Str | LitKind :: StrRaw ( ..) , symbol, ..
73+ } ) = & var_expr. kind
74+ else {
75+ unreachable ! ( "`expr_to_string` ensures this is a string lit" )
76+ } ;
77+
78+ let guar = cx. dcx ( ) . emit_err ( errors:: EnvNotUnicode { span : sp, var : * symbol } ) ;
79+ return ExpandResult :: Ready ( DummyResult :: any ( sp, guar) ) ;
80+ }
81+ Ok ( value) => {
6282 cx. expr_call_global ( sp, cx. std_path ( & [ sym:: option, sym:: Option , sym:: Some ] ) , thin_vec ! [
6383 cx. expr_str( sp, value)
6484 ] )
0 commit comments