Module Name:    src
Committed By:   rillig
Date:           Mon Mar 22 15:05:00 UTC 2021

Modified Files:
        src/tests/usr.bin/xlint/lint1: msg_171.c msg_171.exp

Log Message:
lint: demonstrate bug in assignment of compound literal

Seen in external/mpl/bind/dist/lib/dns/rbtdb.c, update_rrsetstats.


To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/tests/usr.bin/xlint/lint1/msg_171.c
cvs rdiff -u -r1.3 -r1.4 src/tests/usr.bin/xlint/lint1/msg_171.exp

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/tests/usr.bin/xlint/lint1/msg_171.c
diff -u src/tests/usr.bin/xlint/lint1/msg_171.c:1.2 src/tests/usr.bin/xlint/lint1/msg_171.c:1.3
--- src/tests/usr.bin/xlint/lint1/msg_171.c:1.2	Sun Jan 24 16:12:45 2021
+++ src/tests/usr.bin/xlint/lint1/msg_171.c	Mon Mar 22 15:05:00 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: msg_171.c,v 1.2 2021/01/24 16:12:45 rillig Exp $	*/
+/*	$NetBSD: msg_171.c,v 1.3 2021/03/22 15:05:00 rillig Exp $	*/
 # 3 "msg_171.c"
 
 // Test for message: assignment type mismatch (%s != %s) [171]
@@ -17,3 +17,21 @@ example(int i, void *vp, struct s *s)
 	vp = *s;		/* expect: 171 */
 	*s = vp;		/* expect: 171 */
 }
+
+/*
+ * 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.
+ */
+void
+pointer_to_compound_literal(void)
+{
+	struct point {
+		int x;
+		int y;
+	};
+	struct point *p = &(struct point){
+	    12, 5,
+	};			/* expect: 171 *//*FIXME*/
+}

Index: src/tests/usr.bin/xlint/lint1/msg_171.exp
diff -u src/tests/usr.bin/xlint/lint1/msg_171.exp:1.3 src/tests/usr.bin/xlint/lint1/msg_171.exp:1.4
--- src/tests/usr.bin/xlint/lint1/msg_171.exp:1.3	Sun Mar 21 20:45:00 2021
+++ src/tests/usr.bin/xlint/lint1/msg_171.exp	Mon Mar 22 15:05:00 2021
@@ -2,3 +2,4 @@ msg_171.c(14): error: assignment type mi
 msg_171.c(15): error: assignment type mismatch (struct != int) [171]
 msg_171.c(17): error: assignment type mismatch (pointer != struct) [171]
 msg_171.c(18): error: assignment type mismatch (struct != pointer) [171]
+msg_171.c(36): error: assignment type mismatch (struct != pointer) [171]

Reply via email to