@@ -376,7 +376,7 @@ impl<'a> ResolverExpand for Resolver<'a> {
376
376
has_derive_copy : false ,
377
377
} ) ;
378
378
let parent_scope = self . invocation_parent_scopes [ & expn_id] ;
379
- for ( path, opt_ext) in & mut entry. resolutions {
379
+ for ( i , ( path, opt_ext) ) in entry. resolutions . iter_mut ( ) . enumerate ( ) {
380
380
if opt_ext. is_none ( ) {
381
381
* opt_ext = Some (
382
382
match self . resolve_macro_path (
@@ -391,7 +391,9 @@ impl<'a> ResolverExpand for Resolver<'a> {
391
391
let last_seg = path. segments . last ( ) . unwrap ( ) ;
392
392
let span = last_seg. ident . span . normalize_to_macros_2_0 ( ) ;
393
393
entry. helper_attrs . extend (
394
- ext. helper_attrs . iter ( ) . map ( |name| Ident :: new ( * name, span) ) ,
394
+ ext. helper_attrs
395
+ . iter ( )
396
+ . map ( |name| ( i, Ident :: new ( * name, span) ) ) ,
395
397
) ;
396
398
}
397
399
entry. has_derive_copy |= ext. builtin_name == Some ( sym:: Copy ) ;
@@ -407,9 +409,10 @@ impl<'a> ResolverExpand for Resolver<'a> {
407
409
) ;
408
410
}
409
411
}
410
- // If we get to here, then `derive_data` for the given `expn_id` will only be accessed by
411
- // `take_derive_resolutions` later, so we can steal `helper_attrs` instead of cloning them.
412
- self . helper_attrs . insert ( expn_id, mem:: take ( & mut entry. helper_attrs ) ) ;
412
+ // Sort helpers in a stable way independent from the derive resolution order.
413
+ entry. helper_attrs . sort_by_key ( |( i, _) | * i) ;
414
+ self . helper_attrs
415
+ . insert ( expn_id, entry. helper_attrs . iter ( ) . map ( |( _, ident) | * ident) . collect ( ) ) ;
413
416
// Mark this derive as having `Copy` either if it has `Copy` itself or if its parent derive
414
417
// has `Copy`, to support cases like `#[derive(Clone, Copy)] #[derive(Debug)]`.
415
418
if entry. has_derive_copy || self . has_derive_copy ( parent_scope. expansion ) {
0 commit comments