On Sat, 28 Mar 2026, Martin Uecker wrote:

> 
> Bootstrapped and regression tested on x86_64.

LGTM, but please give Joseph the chance to chime in.

Richard.

> 
>     We get a checking error in verify_type, because I did not copy
>     TYPE_REVERSE_STORAGE_ORDER over from the original when reconstructing
>     derived types during the contruction of canonical types.
>     
>             PR c/124635
>     
>     gcc/c/ChangeLog:
>             * c-typeck.cc (c_reconstruct_complex_type): Copy
>             TYPE_REVERSE_STORAGE_ORDER.
>     
>     gcc/testsuite/ChangeLog:
>             * gcc.dg/pr124635.c: New test.
> 
> diff --git a/gcc/c/c-typeck.cc b/gcc/c/c-typeck.cc
> index 4452bb32728..043e49794ca 100644
> --- a/gcc/c/c-typeck.cc
> +++ b/gcc/c/c-typeck.cc
> @@ -548,8 +548,14 @@ c_reconstruct_complex_type (tree type, tree bottom)
>      }
>    else if (TREE_CODE (type) == ARRAY_TYPE)
>      {
> +      bool rso = TYPE_REVERSE_STORAGE_ORDER (type);
>        inner = c_reconstruct_complex_type (TREE_TYPE (type), bottom);
>        outer = c_build_array_type (inner, TYPE_DOMAIN (type));
> +      if (rso)
> +     {
> +       outer = build_distinct_type_copy (outer);
> +       TYPE_REVERSE_STORAGE_ORDER (outer) = 1;
> +     }
>  
>        gcc_checking_assert (C_TYPE_VARIABLE_SIZE (type)
>                          == C_TYPE_VARIABLE_SIZE (outer));
> diff --git a/gcc/testsuite/gcc.dg/pr124635.c b/gcc/testsuite/gcc.dg/pr124635.c
> new file mode 100644
> index 00000000000..59883ba2365
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/pr124635.c
> @@ -0,0 +1,10 @@
> +/* { dg-do compile } */
> +/* { dg-options "-std=c23 -g" } */
> +
> +#pragma scalar_storage_order big-endian
> +
> +struct S {
> +  struct S *s[1];
> +  char c;
> +};
> +
> 

-- 
Richard Biener <[email protected]>
SUSE Software Solutions Germany GmbH,
Frankenstrasse 146, 90461 Nuernberg, Germany;
GF: Jochen Jaser, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)

Reply via email to