@@ -106,7 +106,10 @@ pub fn parse_meta(psess: &ParseSess, attr: &mut Attribute) -> Result<MetaItem, E
106106 . map_err ( |d| d. emit ( ) ) ?;
107107 MetaItemKind :: List ( nmis)
108108 }
109- AttrArgs :: Eq ( _, AttrArgsEq :: Ast ( expr) ) => {
109+ // This is an inert key-value attribute - it will never be visible to macros
110+ // after it gets lowered to the `Hir` variant. Therefore, we can extract literals to handle
111+ // nonterminals in `#[doc]` (e.g. `#[doc = $e]`).
112+ AttrArgs :: Eq ( span, AttrArgsEq :: Ast ( expr) ) => {
110113 let res = match expr. kind {
111114 ast:: ExprKind :: Lit ( token_lit) => {
112115 let res = ast:: MetaItemLit :: from_token_lit ( token_lit, expr. span ) ;
@@ -140,18 +143,18 @@ pub fn parse_meta(psess: &ParseSess, attr: &mut Attribute) -> Result<MetaItem, E
140143 Err ( psess. dcx ( ) . span_err ( expr. span , msg) )
141144 }
142145 } ;
143- MetaItemKind :: NameValue ( match res {
146+ let lit = match res {
144147 Ok ( lit) => lit,
145- Err ( guar) => {
146- expr . kind = ast :: ExprKind :: Err ( guar ) ;
147- ast :: MetaItemLit {
148- symbol : Symbol :: intern ( "" ) ,
149- suffix : None ,
150- kind : ast :: LitKind :: Err ( guar ) ,
151- span : expr . span ,
152- }
153- }
154- } )
148+ Err ( guar) => ast :: MetaItemLit {
149+ symbol : Symbol :: intern ( "" ) ,
150+ suffix : None ,
151+ kind : ast :: LitKind :: Err ( guar ) ,
152+ span : expr . span ,
153+ } ,
154+ } ;
155+
156+ item . args = AttrArgs :: Eq ( * span , AttrArgsEq :: Hir ( lit . clone ( ) ) ) ;
157+ MetaItemKind :: NameValue ( lit )
155158 }
156159 AttrArgs :: Eq ( _, AttrArgsEq :: Hir ( lit) ) => MetaItemKind :: NameValue ( lit. clone ( ) ) ,
157160 } ,
0 commit comments