sandbox/bugs/diagonalize_list.c

    qcc crashes when using the diagonalize macro with a list of scalars

    The following macro:

    macro testdiag (scalar a, double expr)
    {
        foreach() {
            double _d;
            diagonalize(a)
                _d = expr;
            a[] *= _d ;
        }
    }

    can be called with success with, e.g.:

    testdiag (u, u[1] + u[-1] - 2.*u[]);

    However, writing:

    macro testdiag_list (scalar * list, double * expr)
    {
        foreach() {
            for (int i = 0; i < list_len (list); i++) {
                scalar a = list[i];
                double _d;
    the argument of diagonalize() must be a simple identifier
                diagonalize(a) // comment this line to avoid qcc segfault
                    _d = expr[i];
                a[] *= _d ;
            }
        }
    }

    results in qcc segfaulting when called with:

    scalar * list_scalars = {u};
    testdiag_list (list_scalars, (double[]){u[1] + u[-1] - 2.*u[]});
    int main()
    {
        init_grid (16);
        periodic (right);
        scalar u[];
    
        foreach()
            u[] = 1.;
    
        scalar * list_scalars = {u};
    
        testdiag (u, u[1] + u[-1] - 2.*u[]);
        testdiag_list (list_scalars, (double[]){u[1] + u[-1] - 2.*u[]});
    }