@@ -106,7 +106,10 @@ pub fn parse_meta(psess: &ParseSess, attr: &mut Attribute) -> Result<MetaItem, E
106
106
. map_err ( |d| d. emit ( ) ) ?;
107
107
MetaItemKind :: List ( nmis)
108
108
}
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) ) => {
110
113
let res = match expr. kind {
111
114
ast:: ExprKind :: Lit ( token_lit) => {
112
115
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
140
143
Err ( psess. dcx ( ) . span_err ( expr. span , msg) )
141
144
}
142
145
} ;
143
- MetaItemKind :: NameValue ( match res {
146
+ let lit = match res {
144
147
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 )
155
158
}
156
159
AttrArgs :: Eq ( _, AttrArgsEq :: Hir ( lit) ) => MetaItemKind :: NameValue ( lit. clone ( ) ) ,
157
160
} ,
0 commit comments