@@ -158,12 +158,13 @@ pub fn expand_derive(cx: &mut ExtCtxt,
158
158
traits. retain ( |titem| {
159
159
let tword = titem. word ( ) . unwrap ( ) ;
160
160
let tname = tword. name ( ) ;
161
+ let legacy_name = Symbol :: intern ( & format ! ( "derive_{}" , tname) ) ;
161
162
162
- if is_builtin_trait ( tname ) || {
163
- let derive_mode = ast :: Path :: from_ident ( titem . span , ast :: Ident :: with_empty_ctxt ( tname) ) ;
164
- cx . resolver . resolve_macro ( cx . current_expansion . mark , & derive_mode, false ) . map ( |ext| {
165
- if let SyntaxExtension :: CustomDerive ( _ ) = * ext { true } else { false }
166
- } ) . unwrap_or ( false )
163
+ // Skip macros that are builtin derives, and don't resolve as legacy derives.
164
+ if is_builtin_trait ( tname) || ! {
165
+ let derive_mode = ast :: Path :: from_ident ( titem . span ,
166
+ ast :: Ident :: with_empty_ctxt ( legacy_name ) ) ;
167
+ cx . resolver . resolve_macro ( cx . current_expansion . mark , & derive_mode , false ) . is_ok ( )
167
168
} {
168
169
return true ;
169
170
}
@@ -175,11 +176,10 @@ pub fn expand_derive(cx: &mut ExtCtxt,
175
176
feature_gate:: GateIssue :: Language ,
176
177
feature_gate:: EXPLAIN_CUSTOM_DERIVE ) ;
177
178
} else {
178
- let name = Symbol :: intern ( & format ! ( "derive_{}" , tname) ) ;
179
- if !cx. resolver . is_whitelisted_legacy_custom_derive ( name) {
179
+ if !cx. resolver . is_whitelisted_legacy_custom_derive ( legacy_name) {
180
180
cx. span_warn ( titem. span , feature_gate:: EXPLAIN_DEPR_CUSTOM_DERIVE ) ;
181
181
}
182
- let mitem = cx. meta_word ( titem. span , name ) ;
182
+ let mitem = cx. meta_word ( titem. span , legacy_name ) ;
183
183
new_attributes. push ( cx. attribute ( mitem. span , mitem) ) ;
184
184
}
185
185
false
@@ -222,7 +222,6 @@ pub fn expand_derive(cx: &mut ExtCtxt,
222
222
if let Some ( ( i, titem) ) = macros_11_derive {
223
223
let tname = ast:: Ident :: with_empty_ctxt ( titem. name ( ) . unwrap ( ) ) ;
224
224
let path = ast:: Path :: from_ident ( titem. span , tname) ;
225
- let ext = cx. resolver . resolve_macro ( cx. current_expansion . mark , & path, false ) . unwrap ( ) ;
226
225
227
226
traits. remove ( i) ;
228
227
if traits. len ( ) > 0 {
@@ -248,11 +247,17 @@ pub fn expand_derive(cx: &mut ExtCtxt,
248
247
..mitem. span
249
248
} ;
250
249
251
- if let SyntaxExtension :: CustomDerive ( ref ext) = * ext {
252
- return ext. expand ( cx, span, & mitem, item) ;
253
- } else {
254
- unreachable ! ( )
255
- }
250
+ match cx. resolver . resolve_macro ( cx. current_expansion . mark , & path, false ) {
251
+ Ok ( ext) => match * ext {
252
+ SyntaxExtension :: CustomDerive ( ref ext) =>
253
+ return ext. expand ( cx, span, & mitem, item) ,
254
+ _ => { } ,
255
+ } ,
256
+ _ => { } ,
257
+ } ;
258
+
259
+ cx. span_err ( span, & format ! ( "cannot find derive macro `{}` in this scope" , tname) ) ;
260
+ return vec ! [ item] ;
256
261
}
257
262
258
263
// Ok, at this point we know that there are no old-style `#[derive_Foo]` nor
0 commit comments