I used this patch to calculate the pointer without taking address of indexed
dev_roles array and it worked fine for me.
> Index: grub-2.04/grub-core/disk/mdraid1x_linux.c
> ===================================================================
> --- grub-2.04.orig/grub-core/disk/mdraid1x_linux.c
> +++ grub-2.04/grub-core/disk/mdraid1x_linux.c
> @@ -178,7 +178,7 @@ grub_mdraid_detect (grub_disk_t disk,
> return NULL;
>
> if (grub_disk_read (disk, sector,
> - (char *) &sb.dev_roles[grub_le_to_cpu32 (sb.dev_number)]
> + (char *) (sb.dev_roles + grub_le_to_cpu32 (sb.dev_number))
> - (char *) &sb,
> sizeof (role), &role))
> return NULL;
And after I encountered more errors from gcc-10 ...