diff options
author | Jakub Jelinek <jakub@redhat.com> | 2007-09-18 00:05:40 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2007-09-18 00:05:40 +0200 |
commit | abc2dd3c9eb9058cc9c9babab700ba68dfda1881 (patch) | |
tree | d66ae6d516b7dcb5059047dc0517249ce4476555 /gcc | |
parent | 93a85f02f1a82d47efba7f10ea4a12ea2502ba18 (diff) | |
download | gcc-abc2dd3c9eb9058cc9c9babab700ba68dfda1881.zip gcc-abc2dd3c9eb9058cc9c9babab700ba68dfda1881.tar.gz gcc-abc2dd3c9eb9058cc9c9babab700ba68dfda1881.tar.bz2 |
re PR middle-end/33423 (internal compiler error: in expand_expr_real_1, at expr.c:8670)
PR middle-end/33423
* builtins.c (expand_builtin_memory_chk): Handle COMPOUND_EXPRs
returned by build_call_expr.
* gcc.c-torture/compile/20070915-1.c: New test.
From-SVN: r128554
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/builtins.c | 14 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/compile/20070915-1.c | 20 |
4 files changed, 45 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2d4575a..7bbe988 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2007-09-18 Jakub Jelinek <jakub@redhat.com> + + PR middle-end/33423 + * builtins.c (expand_builtin_memory_chk): Handle COMPOUND_EXPRs + returned by build_call_expr. + 2007-09-17 Eric Botcazou <ebotcazou@adacore.com> * tree-sra.c (maybe_lookup_element_for_expr) <COMPONENT_REF>: Return diff --git a/gcc/builtins.c b/gcc/builtins.c index 50d4b62..bb43ab6 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -11558,6 +11558,13 @@ expand_builtin_memory_chk (tree exp, rtx target, enum machine_mode mode, return NULL_RTX; fn = build_call_expr (fn, 3, dest, src, len); + STRIP_TYPE_NOPS (fn); + while (TREE_CODE (fn) == COMPOUND_EXPR) + { + expand_expr (TREE_OPERAND (fn, 0), const0_rtx, VOIDmode, + EXPAND_NORMAL); + fn = TREE_OPERAND (fn, 1); + } if (TREE_CODE (fn) == CALL_EXPR) CALL_EXPR_TAILCALL (fn) = CALL_EXPR_TAILCALL (exp); return expand_expr (fn, target, mode, EXPAND_NORMAL); @@ -11606,6 +11613,13 @@ expand_builtin_memory_chk (tree exp, rtx target, enum machine_mode mode, if (!fn) return NULL_RTX; fn = build_call_expr (fn, 4, dest, src, len, size); + STRIP_TYPE_NOPS (fn); + while (TREE_CODE (fn) == COMPOUND_EXPR) + { + expand_expr (TREE_OPERAND (fn, 0), const0_rtx, VOIDmode, + EXPAND_NORMAL); + fn = TREE_OPERAND (fn, 1); + } if (TREE_CODE (fn) == CALL_EXPR) CALL_EXPR_TAILCALL (fn) = CALL_EXPR_TAILCALL (exp); return expand_expr (fn, target, mode, EXPAND_NORMAL); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ae89416..a110de35 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-09-18 Jakub Jelinek <jakub@redhat.com> + + PR middle-end/33423 + * gcc.c-torture/compile/20070915-1.c: New test. + 2007-09-17 Tobias Burnus <burnus@net-b.de> PR fortran/33106 diff --git a/gcc/testsuite/gcc.c-torture/compile/20070915-1.c b/gcc/testsuite/gcc.c-torture/compile/20070915-1.c new file mode 100644 index 0000000..1cd64e5 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/20070915-1.c @@ -0,0 +1,20 @@ +/* PR middle-end/33423 */ + +static struct +{ + char buf[15]; +} u2; + +void +test6 (void) +{ + int len; + char *p; + + for (len = 0; len < 2; len++) + { + p = __builtin___memset_chk (u2.buf, '\0', len, 15); + if (p != u2.buf) + return; + } +} |