re PR c/89061 (GCC 9 introduces false positive in -Wjump-misses-init)
authorJakub Jelinek <jakub@redhat.com>
Wed, 30 Jan 2019 07:49:58 +0000 (08:49 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 30 Jan 2019 07:49:58 +0000 (08:49 +0100)
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.

* gcc.dg/pr89061.c: New test.

From-SVN: r268381

gcc/c/ChangeLog
gcc/c/c-decl.c
gcc/c/c-tree.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr89061.c [new file with mode: 0644]

index dcb3f2136d996220f872dd74ce92d0c7e7f2c90e..b215758c86c08be6626e2727b134ecfb6bd160f6 100644 (file)
@@ -1,3 +1,11 @@
+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
index 02a93231130f059b001571f7fbc74c75149a3868..5170e92b0ca283796d75fff36191c161a9457a9f 100644 (file)
@@ -659,6 +659,14 @@ decl_jump_unsafe (tree decl)
   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))
@@ -5486,6 +5494,7 @@ build_compound_literal (location_t loc, tree type, tree init, bool non_const,
   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)
index 0070f0d7daafc9d59810ca0747e1d863e86f69de..b69ef3377fde6a74f566c8e95c7d0662ed9ebaf5 100644 (file)
@@ -96,6 +96,10 @@ along with GCC; see the file COPYING3.  If not see
    #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*).  */
index b7566db4a3c4b14f260486ad14e59863a2ffc3c8..d60389f4c4f1092419fe6d2e2ae7d28576a5a989 100644 (file)
@@ -1,3 +1,8 @@
+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
diff --git a/gcc/testsuite/gcc.dg/pr89061.c b/gcc/testsuite/gcc.dg/pr89061.c
new file mode 100644 (file)
index 0000000..6b5d913
--- /dev/null
@@ -0,0 +1,27 @@
+/* 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;
+}