@@ -158,12 +158,13 @@ pub fn expand_derive(cx: &mut ExtCtxt,
158158 traits. retain ( |titem| {
159159 let tword = titem. word ( ) . unwrap ( ) ;
160160 let tname = tword. name ( ) ;
161+ let legacy_name = Symbol :: intern ( & format ! ( "derive_{}" , tname) ) ;
161162
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 ( )
167168 } {
168169 return true ;
169170 }
@@ -175,11 +176,10 @@ pub fn expand_derive(cx: &mut ExtCtxt,
175176 feature_gate:: GateIssue :: Language ,
176177 feature_gate:: EXPLAIN_CUSTOM_DERIVE ) ;
177178 } 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) {
180180 cx. span_warn ( titem. span , feature_gate:: EXPLAIN_DEPR_CUSTOM_DERIVE ) ;
181181 }
182- let mitem = cx. meta_word ( titem. span , name ) ;
182+ let mitem = cx. meta_word ( titem. span , legacy_name ) ;
183183 new_attributes. push ( cx. attribute ( mitem. span , mitem) ) ;
184184 }
185185 false
@@ -222,7 +222,6 @@ pub fn expand_derive(cx: &mut ExtCtxt,
222222 if let Some ( ( i, titem) ) = macros_11_derive {
223223 let tname = ast:: Ident :: with_empty_ctxt ( titem. name ( ) . unwrap ( ) ) ;
224224 let path = ast:: Path :: from_ident ( titem. span , tname) ;
225- let ext = cx. resolver . resolve_macro ( cx. current_expansion . mark , & path, false ) . unwrap ( ) ;
226225
227226 traits. remove ( i) ;
228227 if traits. len ( ) > 0 {
@@ -248,11 +247,17 @@ pub fn expand_derive(cx: &mut ExtCtxt,
248247 ..mitem. span
249248 } ;
250249
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] ;
256261 }
257262
258263 // Ok, at this point we know that there are no old-style `#[derive_Foo]` nor
0 commit comments