URI:
       cc1: Fix padding in initializers - scc - simple c99 compiler
  HTML git clone git://git.simple-cc.org/scc
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
   DIR README
   DIR LICENSE
       ---
   DIR commit cdd599b1db41f2983c446c0fdefb799afbb511eb
   DIR parent 42441dfa818cce4c67092948f8113fd1afef41ab
  HTML Author: Roberto E. Vargas Caballero <k0ga@shike2.net>
       Date:   Mon,  2 Feb 2026 12:37:24 +0100
       
       cc1: Fix padding in initializers
       
       The alignment calculation was wrong and it generated static struct and arrays
       with data misplaced.
       
       Diffstat:
         M src/cmd/scc-cc/cc1/code.c           |      17 +++++++++--------
         A tests/cc/execute/0238-align.c       |      20 ++++++++++++++++++++
         M tests/cc/execute/scc-tests.lst      |       3 ++-
       
       3 files changed, 31 insertions(+), 9 deletions(-)
       ---
   DIR diff --git a/src/cmd/scc-cc/cc1/code.c b/src/cmd/scc-cc/cc1/code.c
       @@ -353,18 +353,19 @@ zeronode(Type *tp)
                return simplify(convert(constnode(zero), tp, 0));
        }
        
       -static int
       +static void
        emitpadding(Type *tp, unsigned long long *addr)
        {
       -        int i;
       -        unsigned long long n;
       +        int i, align;
       +        unsigned long long a, n;
        
       -        n = *addr & tp->align-1;
       -        for (i = 0; i < n; i++)
       -                emitexp(OEXPR, zeronode(chartype));
       -        *addr += n;
       +        align = tp->align - 1;
       +        a = *addr;
       +        n = a+align & ~align;
        
       -        return n;
       +        for ( ; a != n; ++a)
       +                emitexp(OEXPR, zeronode(chartype));
       +        *addr = n;
        }
        
        static void
   DIR diff --git a/tests/cc/execute/0238-align.c b/tests/cc/execute/0238-align.c
       @@ -0,0 +1,20 @@
       +struct a {
       +        char c;
       +        int i;
       +};
       +
       +int
       +main(void)
       +{
       +        struct a s[2] = {
       +                {.c = 64, .i = 3},
       +                {.c = 64, .i = 6}
       +        };
       +
       +        if (s[0].i != 3)
       +                return 1;
       +        if (s[1].i != 6)
       +                return 2;
       +
       +        return 0;
       +}
   DIR diff --git a/tests/cc/execute/scc-tests.lst b/tests/cc/execute/scc-tests.lst
       @@ -208,7 +208,7 @@
        0215-ret_struct.c
        0216-initialize.c [TODO]
        0217-lchar.c
       -0218-initialize.c [TODO]
       +0218-initialize.c
        0219-abbrev.c
        0220-comma.c
        0221-ifdef.c
       @@ -228,3 +228,4 @@
        0235-comment.c
        0236-sizeof.c
        0237-down.c
       +0238-align.c