root/tests/usr.bin/xlint/lint1/msg_171.c
/*      $NetBSD: msg_171.c,v 1.9 2023/07/07 19:45:22 rillig Exp $       */
# 3 "msg_171.c"

// Test for message: cannot assign to '%s' from '%s' [171]

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

struct s {
        int member;
};

/*ARGSUSED*/
void
example(int i, void *vp, struct s *s)
{
        /* expect+1: error: cannot assign to 'int' from 'struct s' [171] */
        i = *s;
        /* expect+1: error: cannot assign to 'struct s' from 'int' [171] */
        *s = i;

        /* expect+1: error: cannot assign to 'pointer to void' from 'struct s' [171] */
        vp = *s;
        /* expect+1: error: cannot assign to 'struct s' from 'pointer to void' [171] */
        *s = vp;
}

/*
 * C99 6.5.2.5 says that a compound literal evaluates to an unnamed object
 * with automatic storage duration, like any normal named object.  It is an
 * lvalue, which means that it is possible to take the address of the object.
 * Seen in external/mpl/bind/dist/lib/dns/rbtdb.c, update_rrsetstats.
 *
 * Before init.c 1.111 from 2021-03-23, lint could not handle these nested
 * initializations (the outer one for the variable 'p', the inner one for the
 * compound literal) and wrongly complained about a type mismatch between
 * 'struct point' and 'pointer to struct point'.
 */
void
pointer_to_compound_literal(void)
{
        struct point {
                int x;
                int y;
        };
        struct point *p = &(struct point){
                12, 5,
        };

        /*
         * A sizeof expression is another way to create nested
         * initializations.
         */
        struct point p2 = {
                (int)sizeof(struct point){
                        (int)sizeof(struct point){
                                (int)sizeof(struct point){
                                        (int)sizeof(struct point){
                                                0,
                                                0,
                                        },
                                        0,
                                },
                                0,
                        },
                        0,
                },
                0,
        };
}