root/tests/usr.bin/xlint/lint1/op_colon.c
/*      $NetBSD: op_colon.c,v 1.8 2024/01/28 08:17:27 rillig Exp $      */
# 3 "op_colon.c"

/*
 * Test handling of the operator ':', as part of the '?:'.
 */

/* lint1-extra-flags: -p -X 351 */

struct canary {
        int member;
};

void
sink(struct canary);

void
test_merge_qualifiers(_Bool cond, int *p, const int *c, volatile int *v,
                      const volatile int *cv)
{
        /* expect+1: ... 'pointer to int' ... */
        sink(cond ? p : p);
        /* expect+1: ... 'pointer to const int' ... */
        sink(cond ? p : c);
        /* expect+1: ... 'pointer to volatile int' ... */
        sink(cond ? p : v);
        /* expect+1: ... 'pointer to const volatile int' ... */
        sink(cond ? p : cv);

        /* expect+1: ... 'pointer to const int' ... */
        sink(cond ? c : p);
        /* expect+1: ... 'pointer to const int' ... */
        sink(cond ? c : c);
        /* expect+1: ... 'pointer to const volatile int' ... */
        sink(cond ? c : v);
        /* expect+1: ... 'pointer to const volatile int' ... */
        sink(cond ? c : cv);

        /* expect+1: ... 'pointer to volatile int' ... */
        sink(cond ? v : p);
        /* expect+1: ... 'pointer to const volatile int' ... */
        sink(cond ? v : c);
        /* expect+1: ... 'pointer to volatile int' ... */
        sink(cond ? v : v);
        /* expect+1: ... 'pointer to const volatile int' ... */
        sink(cond ? v : cv);

        /* expect+1: ... 'pointer to const volatile int' ... */
        sink(cond ? cv : p);
        /* expect+1: ... 'pointer to const volatile int' ... */
        sink(cond ? cv : c);
        /* expect+1: ... 'pointer to const volatile int' ... */
        sink(cond ? cv : v);
        /* expect+1: ... 'pointer to const volatile int' ... */
        sink(cond ? cv : cv);
}

/* null pointer constant + other pointer */
void
c99_6_5_15_p6(_Bool cond, const volatile double *cv_dp)
{
        /* expect+1: ... 'pointer to const volatile double' ... */
        sink(cond ? cv_dp : (void *)0);
        /* expect+1: ... 'pointer to const volatile double' ... */
        sink(cond ? (void *)0 : cv_dp);
}

void
c99_6_5_15_p8(
    _Bool cond,
    const void *c_vp,
    void *vp,
    const int *c_ip,
    volatile int *v_ip,
    int *ip,
    const char *c_cp
)
{
        /* expect+1: ... 'pointer to const void' ... */
        sink(cond ? c_vp : c_ip);
        /* expect+1: ... 'pointer to const void' ... */
        sink(cond ? c_ip : c_vp);

        /* expect+1: ... 'pointer to volatile int' ... */
        sink(cond ? v_ip : 0);
        /* expect+1: ... 'pointer to volatile int' ... */
        sink(cond ? 0 : v_ip);

        /* expect+1: ... 'pointer to const volatile int' ... */
        sink(cond ? c_ip : v_ip);
        /* expect+1: ... 'pointer to const volatile int' ... */
        sink(cond ? v_ip : c_ip);

        /* expect+1: ... 'pointer to const void' ... */
        sink(cond ? vp : c_cp);
        /* expect+1: ... 'pointer to const void' ... */
        sink(cond ? c_cp : vp);

        /* expect+1: ... 'pointer to const int' ... */
        sink(cond ? ip : c_ip);
        /* expect+1: ... 'pointer to const int' ... */
        sink(cond ? c_ip : ip);

        /* expect+1: ... 'pointer to void' ... */
        sink(cond ? vp : ip);
        /* expect+1: ... 'pointer to void' ... */
        sink(cond ? ip : vp);
}