66use rustc_ast:: token:: { self , LitKind } ;
77use rustc_ast:: tokenstream:: TokenStream ;
88use rustc_ast:: { AstDeref , ExprKind , GenericArg , Mutability } ;
9- use rustc_expand:: base:: { expr_to_string, get_exprs_from_tts, get_single_str_from_tts } ;
9+ use rustc_expand:: base:: { expr_to_string, get_exprs_from_tts, get_single_expr_from_tts } ;
1010use rustc_expand:: base:: { DummyResult , ExpandResult , ExtCtxt , MacEager , MacroExpanderResult } ;
1111use rustc_span:: symbol:: { kw, sym, Ident , Symbol } ;
1212use rustc_span:: Span ;
@@ -31,19 +31,28 @@ pub fn expand_option_env<'cx>(
3131 sp : Span ,
3232 tts : TokenStream ,
3333) -> MacroExpanderResult < ' cx > {
34- let ExpandResult :: Ready ( mac) = get_single_str_from_tts ( cx, sp, tts, "option_env!" ) else {
34+ let ExpandResult :: Ready ( mac_expr) = get_single_expr_from_tts ( cx, sp, tts, "option_env!" ) else {
35+ return ExpandResult :: Retry ( ( ) ) ;
36+ } ;
37+ let var_expr = match mac_expr {
38+ Ok ( var_expr) => var_expr,
39+ Err ( guar) => return ExpandResult :: Ready ( DummyResult :: any ( sp, guar) ) ,
40+ } ;
41+ let ExpandResult :: Ready ( mac) =
42+ expr_to_string ( cx, var_expr. clone ( ) , "argument must be a string literal" )
43+ else {
3544 return ExpandResult :: Retry ( ( ) ) ;
3645 } ;
3746 let var = match mac {
38- Ok ( var) => var,
47+ Ok ( ( var, _ ) ) => var,
3948 Err ( guar) => return ExpandResult :: Ready ( DummyResult :: any ( sp, guar) ) ,
4049 } ;
4150
4251 let sp = cx. with_def_site_ctxt ( sp) ;
43- let value = lookup_env ( cx, var) . ok ( ) ;
44- cx. sess . psess . env_depinfo . borrow_mut ( ) . insert ( ( var, value) ) ;
52+ let value = lookup_env ( cx, var) ;
53+ cx. sess . psess . env_depinfo . borrow_mut ( ) . insert ( ( var, value. as_ref ( ) . ok ( ) . copied ( ) ) ) ;
4554 let e = match value {
46- None => {
55+ Err ( VarError :: NotPresent ) => {
4756 let lt = cx. lifetime ( sp, Ident :: new ( kw:: StaticLifetime , sp) ) ;
4857 cx. expr_path ( cx. path_all (
4958 sp,
@@ -57,7 +66,18 @@ pub fn expand_option_env<'cx>(
5766 ) ) ] ,
5867 ) )
5968 }
60- Some ( value) => cx. expr_call_global (
69+ Err ( VarError :: NotUnicode ( _) ) => {
70+ let ExprKind :: Lit ( token:: Lit {
71+ kind : LitKind :: Str | LitKind :: StrRaw ( ..) , symbol, ..
72+ } ) = & var_expr. kind
73+ else {
74+ unreachable ! ( "`expr_to_string` ensures this is a string lit" )
75+ } ;
76+
77+ let guar = cx. dcx ( ) . emit_err ( errors:: EnvNotUnicode { span : sp, var : * symbol } ) ;
78+ return ExpandResult :: Ready ( DummyResult :: any ( sp, guar) ) ;
79+ }
80+ Ok ( value) => cx. expr_call_global (
6181 sp,
6282 cx. std_path ( & [ sym:: option, sym:: Option , sym:: Some ] ) ,
6383 thin_vec ! [ cx. expr_str( sp, value) ] ,
0 commit comments