re PR c/89061 (GCC 9 introduces false positive in -Wjump-misses-init)
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
This commit is contained in:
parent
2ab6839bcc
commit
fe509359cf
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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*). */
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
Loading…
Reference in New Issue