aboutsummaryrefslogtreecommitdiff
path: root/gcc/c/c-decl.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2019-01-30 08:49:58 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2019-01-30 08:49:58 +0100
commitfe509359cf5ff58edd84bb1f28323af6dc4dd4b4 (patch)
tree8b48e406dd9b023b4e99192f8c9d245457c2b4fe /gcc/c/c-decl.c
parent2ab6839bccb22a04c6df2000858c36d0ffa313ce (diff)
downloadgcc-fe509359cf5ff58edd84bb1f28323af6dc4dd4b4.zip
gcc-fe509359cf5ff58edd84bb1f28323af6dc4dd4b4.tar.gz
gcc-fe509359cf5ff58edd84bb1f28323af6dc4dd4b4.tar.bz2
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
Diffstat (limited to 'gcc/c/c-decl.c')
-rw-r--r--gcc/c/c-decl.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/gcc/c/c-decl.c b/gcc/c/c-decl.c
index 02a9323..5170e92 100644
--- a/gcc/c/c-decl.c
+++ b/gcc/c/c-decl.c
@@ -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)