70 lines
1.6 KiB
C
70 lines
1.6 KiB
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,
|
|
};
|
|
}
|