/* Test composite type of VLA and fixed-size array: should be the fixed-size type. Bug 22192. */ /* Origin: Joseph Myers */ /* { dg-do compile } */ /* { dg-options "-std=iso9899:1999 -pedantic-errors" } */ /* Test that the given expression (of pointer-to-array type) points to the right sort of array. */ #define TEST_FIXED_SIZE(a) do { static int x[sizeof(*(a))]; (void)x; } while (0) #define TEST_VLA(a) do { (void)sizeof(*(a)); (void)(1 ? (a) : (__typeof__(**(a)) (*)[1])0); (void)(1 ? (a) : (__typeof__(**(a)) (*)[2])0); } while (0) #define TEST_INCOMPLETE(a) do { __typeof__(*(a)) x = { 0 }; (void)x; (void)(1 ? a : (__typeof__(**(a)) (*)[1])0); (void)(1 ? a : (__typeof__(**(a)) (*)[2])0); } while (0) #define TEST_COMP_FIX(a, b) TEST_FIXED_SIZE(i ? a : b) #define TEST_COMP_VLA(a, b) TEST_VLA(i ? a : b) #define TEST_COMP_INC(a, b) TEST_INCOMPLETE(i ? a : b) void foo (int i, int j) { typedef int I; int (*pf)[2]; int (*pv)[i]; int (*pi)[]; I (*pfI)[2]; I (*pvI)[i]; I (*piI)[]; TEST_COMP_FIX(pf, pf); TEST_COMP_FIX(pf, pv); TEST_COMP_FIX(pf, pi); TEST_COMP_FIX(pf, pfI); TEST_COMP_FIX(pf, pvI); TEST_COMP_FIX(pf, piI); TEST_COMP_FIX(pv, pf); TEST_COMP_VLA(pv, pv); TEST_COMP_VLA(pv, pi); TEST_COMP_FIX(pv, pfI); TEST_COMP_VLA(pv, pvI); TEST_COMP_VLA(pv, piI); TEST_COMP_FIX(pi, pf); TEST_COMP_VLA(pi, pv); TEST_COMP_INC(pi, pi); TEST_COMP_FIX(pi, pfI); TEST_COMP_VLA(pi, pvI); TEST_COMP_INC(pi, piI); TEST_COMP_FIX(pfI, pf); TEST_COMP_FIX(pfI, pv); TEST_COMP_FIX(pfI, pi); TEST_COMP_FIX(pfI, pfI); TEST_COMP_FIX(pfI, pvI); TEST_COMP_FIX(pfI, piI); TEST_COMP_FIX(pvI, pf); TEST_COMP_VLA(pvI, pv); TEST_COMP_VLA(pvI, pi); TEST_COMP_FIX(pvI, pfI); TEST_COMP_VLA(pvI, pvI); TEST_COMP_VLA(pvI, piI); TEST_COMP_FIX(piI, pf); TEST_COMP_VLA(piI, pv); TEST_COMP_INC(piI, pi); TEST_COMP_FIX(piI, pfI); TEST_COMP_VLA(piI, pvI); TEST_COMP_INC(piI, piI); typedef int (*Ti)[i]; typedef int (*Tj)[j]; Ti (*qf)[2]; Ti (*qv)[i]; Ti (*qi)[]; Tj (*rf)[2]; Tj (*rv)[j]; Tj (*ri)[]; TEST_COMP_FIX(qf, qf); TEST_COMP_FIX(qf, qv); TEST_COMP_FIX(qf, qi); TEST_COMP_FIX(qf, rf); TEST_COMP_FIX(qf, rv); TEST_COMP_FIX(qf, ri); TEST_COMP_FIX(qv, qf); TEST_COMP_VLA(qv, qv); TEST_COMP_VLA(qv, qi); TEST_COMP_FIX(qv, rf); TEST_COMP_VLA(qv, rv); TEST_COMP_VLA(qv, ri); TEST_COMP_FIX(qi, qf); TEST_COMP_VLA(qi, qv); TEST_COMP_INC(qi, qi); TEST_COMP_FIX(qi, rf); TEST_COMP_VLA(qi, rv); TEST_COMP_INC(qi, ri); TEST_COMP_FIX(rf, qf); TEST_COMP_FIX(rf, qv); TEST_COMP_FIX(rf, qi); TEST_COMP_FIX(rf, rf); TEST_COMP_FIX(rf, rv); TEST_COMP_FIX(rf, ri); TEST_COMP_FIX(rv, qf); TEST_COMP_VLA(rv, qv); TEST_COMP_VLA(rv, qi); TEST_COMP_FIX(rv, rf); TEST_COMP_VLA(rv, rv); TEST_COMP_VLA(rv, ri); TEST_COMP_FIX(ri, qf); TEST_COMP_VLA(ri, qv); TEST_COMP_INC(ri, qi); TEST_COMP_FIX(ri, rf); TEST_COMP_VLA(ri, rv); TEST_COMP_INC(ri, ri); }