diff options
author | Marek Polacek <polacek@redhat.com> | 2018-03-02 09:48:41 +0000 |
---|---|---|
committer | Marek Polacek <mpolacek@gcc.gnu.org> | 2018-03-02 09:48:41 +0000 |
commit | 587b2f674c954f9e5fd8786c655d763c090a85de (patch) | |
tree | d050d053d16898f2fe3fc4f5ddd9911f8ae95b69 /gcc | |
parent | 70088b953b22eb6a9878d272e4e2a8add136ebc8 (diff) | |
download | gcc-587b2f674c954f9e5fd8786c655d763c090a85de.zip gcc-587b2f674c954f9e5fd8786c655d763c090a85de.tar.gz gcc-587b2f674c954f9e5fd8786c655d763c090a85de.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/cp-gimplify.c | 12 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/ubsan/shift-11.c | 13 |
4 files changed, 35 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 2d5363c..c74d3bc 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2018-03-02 Marek Polacek <polacek@redhat.com> + + 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 <msebor@redhat.com> PR c++/84294 diff --git a/gcc/cp/cp-gimplify.c b/gcc/cp/cp-gimplify.c index 55a9d27..0ddd435 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 e15927c..17369ce 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-03-02 Marek Polacek <polacek@redhat.com> + + PR c++/84590 + * c-c++-common/ubsan/shift-11.c: New test. + 2018-03-02 Richard Sandiford <richard.sandiford@linaro.org> * 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 0000000..03a72e2 --- /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" } */ +} |