+2019-01-30 Jakub Jelinek <jakub@redhat.com>
+
+ PR c/89061
+ * c-tree.h (C_DECL_COMPOUND_LITERAL_P): Define.
+ * c-decl.c (decl_jump_unsafe): Return false for
+ C_DECL_COMPOUND_LITERAL_P decls.
+ (build_compound_literal): Set C_DECL_COMPOUND_LITERAL_P.
+
2019-01-29 Jakub Jelinek <jakub@redhat.com>
PR c/89045
if (error_operand_p (decl))
return false;
+ /* Don't warn for compound literals. If a goto statement crosses
+ their initialization, it should cross also all the places where
+ the complit is used or where the complit address might be saved
+ into some variable, so code after the label to which goto jumps
+ should not be able to refer to the compound literal. */
+ if (VAR_P (decl) && C_DECL_COMPOUND_LITERAL_P (decl))
+ return false;
+
/* Always warn about crossing variably modified types. */
if ((VAR_P (decl) || TREE_CODE (decl) == TYPE_DECL)
&& variably_modified_type_p (TREE_TYPE (decl), NULL_TREE))
DECL_READ_P (decl) = 1;
DECL_ARTIFICIAL (decl) = 1;
DECL_IGNORED_P (decl) = 1;
+ C_DECL_COMPOUND_LITERAL_P (decl) = 1;
TREE_TYPE (decl) = type;
c_apply_type_quals_to_decl (TYPE_QUALS (strip_array_types (type)), decl);
if (alignas_align)
#pragma omp threadprivate. */
#define C_DECL_THREADPRIVATE_P(DECL) DECL_LANG_FLAG_3 (VAR_DECL_CHECK (DECL))
+/* Set on VAR_DECLs for compound literals. */
+#define C_DECL_COMPOUND_LITERAL_P(DECL) \
+ DECL_LANG_FLAG_5 (VAR_DECL_CHECK (DECL))
+
/* Nonzero for a decl which either doesn't exist or isn't a prototype.
N.B. Could be simplified if all built-in decls had complete prototypes
(but this is presently difficult because some of them need FILE*). */
+2019-01-30 Jakub Jelinek <jakub@redhat.com>
+
+ PR c/89061
+ * gcc.dg/pr89061.c: New test.
+
2019-01-29 Martin Sebor <msebor@redhat.com>
PR c/88956
--- /dev/null
+/* PR c/89061 */
+/* { dg-do compile } */
+/* { dg-options "-Wjump-misses-init" } */
+
+struct S { int s; };
+
+int
+foo (int x)
+{
+ struct S s = { 0 };
+ if ((s.s = x) == 0)
+ goto cleanup; /* { dg-bogus "jump skips variable initialization" } */
+ s = (struct S) { .s = 42 };
+ cleanup:
+ return s.s;
+}
+
+int
+bar (int x)
+{
+ struct S *s = &(struct S) { 0 };
+ if ((s->s = x) == 0)
+ goto cleanup; /* { dg-bogus "jump skips variable initialization" } */
+ s = &(struct S) { .s = 42 };
+ cleanup:
+ return s->s;
+}