From: Marek Polacek Date: Fri, 2 Mar 2018 09:48:41 +0000 (+0000) Subject: re PR c++/84590 (-fsanitize=undefined internal compiler error: tree check: expected... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=587b2f674c954f9e5fd8786c655d763c090a85de;p=gcc.git re PR c++/84590 (-fsanitize=undefined internal compiler error: tree check: expected constructor, have target_expr in split_nonconstant_init_1, at cp/typeck2.c:629) PR c++/84590 * cp-gimplify.c (cp_fully_fold): Unwrap TARGET_EXPR or a CONSTRUCTOR wrapped in VIEW_CONVERT_EXPR. * c-c++-common/ubsan/shift-11.c: New test. From-SVN: r258132 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 2d5363c4ddc..c74d3bc3e7a 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2018-03-02 Marek Polacek + + PR c++/84590 + * cp-gimplify.c (cp_fully_fold): Unwrap TARGET_EXPR or a CONSTRUCTOR + wrapped in VIEW_CONVERT_EXPR. + 2018-03-01 Martin Sebor PR c++/84294 diff --git a/gcc/cp/cp-gimplify.c b/gcc/cp/cp-gimplify.c index 55a9d278dbe..0ddd435454c 100644 --- a/gcc/cp/cp-gimplify.c +++ b/gcc/cp/cp-gimplify.c @@ -2037,7 +2037,17 @@ cp_fully_fold (tree x) /* FIXME cp_fold ought to be a superset of maybe_constant_value so we don't have to call both. */ if (cxx_dialect >= cxx11) - x = maybe_constant_value (x); + { + x = maybe_constant_value (x); + /* Sometimes we are given a CONSTRUCTOR but the call above wraps it into + a TARGET_EXPR; undo that here. */ + if (TREE_CODE (x) == TARGET_EXPR) + x = TARGET_EXPR_INITIAL (x); + else if (TREE_CODE (x) == VIEW_CONVERT_EXPR + && TREE_CODE (TREE_OPERAND (x, 0)) == CONSTRUCTOR + && TREE_TYPE (TREE_OPERAND (x, 0)) == TREE_TYPE (x)) + x = TREE_OPERAND (x, 0); + } return cp_fold_rvalue (x); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e15927ca90e..17369ce0ebd 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-03-02 Marek Polacek + + PR c++/84590 + * c-c++-common/ubsan/shift-11.c: New test. + 2018-03-02 Richard Sandiford * gcc.dg/vect/vect-alias-check-13.c: New test. diff --git a/gcc/testsuite/c-c++-common/ubsan/shift-11.c b/gcc/testsuite/c-c++-common/ubsan/shift-11.c new file mode 100644 index 00000000000..03a72e217a2 --- /dev/null +++ b/gcc/testsuite/c-c++-common/ubsan/shift-11.c @@ -0,0 +1,13 @@ +/* PR c++/84590 */ +/* { dg-do compile } */ +/* { dg-options "-fsanitize=shift" } */ + +struct S { + int b; +}; + +void +fn (void) +{ + struct S c1 = { 1 << -1 }; /* { dg-warning "left shift" } */ +}