How to make `#define isvector(a)` based on `__builtin_convertvector` a `constexpr` to be used by `static_assert` in C language
12:43 16 Apr 2026

How to use __builtin_convertvector as a constexpr in static_assert?

Are there any alternatives for isvector in C preprocessor language?

#define isarray(a) __builtin_choose_expr(__builtin_types_compatible_p(typeof((a)[0]) [], typeof((a))), true, false)
#undef  countof
#define countof(a) sizeof((a))/sizeof(typeof((a)[0]))

#define vec_ext(T,N) typeof(T __attribute__((vector_size(sizeof(T) * bitceil(N)))))
#define vec(T,N) alignas((N == bitceil(N) ? N : 1) * alignof(T)) typeof(T[N])

/* TODO: make this a constexpr to be used in static_assert */
#define rc_vec(src,n) (*(vec(typeof((src)[0]),n)*)src)
#define rc_vec_ext(src,n) (*(vec_ext(typeof((src)[0]),n)*)src)
#define isvector(a)                                                                                    \
({                                                                                                     \
        vec_ext(float,bitceil(countof(a))) dst =                                                       \
        __builtin_convertvector(*(vec_ext(typeof((a)[0]),bitceil(countof(a)))*)&(a)[0],                \
        vec_ext(float,bitceil(countof(a)))); !isarray(a) && true;                                      \
})
arrays c vector simd static-assert