diff options
author | Martin Sebor <msebor@redhat.com> | 2021-03-09 15:02:35 -0700 |
---|---|---|
committer | Martin Sebor <msebor@redhat.com> | 2021-03-13 13:45:51 -0700 |
commit | 77643ac4bbd0ff758edc182a12cb622b74a3c38a (patch) | |
tree | 5599d7c7c49641b4f9d14b598a1dacfdf606e8c6 | |
parent | 7987beec679898cfa75839551d55ae5234a216bd (diff) | |
download | gcc-77643ac4bbd0ff758edc182a12cb622b74a3c38a.zip gcc-77643ac4bbd0ff758edc182a12cb622b74a3c38a.tar.gz gcc-77643ac4bbd0ff758edc182a12cb622b74a3c38a.tar.bz2 |
PR tree-optimization/99489 - ICE calling strncat after strcat
gcc/ChangeLog:
PR tree-optimization/99489
* builtins.c (gimple_call_alloc_size): Fail gracefully when argument
is not a call statement.
gcc/testsuite/ChangeLog:
PR tree-optimization/99489
* gcc.dg/Wstringop-truncation-9.c: New test.
-rw-r--r-- | gcc/builtins.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/Wstringop-truncation-9.c | 41 |
2 files changed, 42 insertions, 1 deletions
diff --git a/gcc/builtins.c b/gcc/builtins.c index 41e336c..196dda3 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -4924,7 +4924,7 @@ tree gimple_call_alloc_size (gimple *stmt, wide_int rng1[2] /* = NULL */, range_query * /* = NULL */) { - if (!stmt) + if (!stmt || !is_gimple_call (stmt)) return NULL_TREE; tree allocfntype; diff --git a/gcc/testsuite/gcc.dg/Wstringop-truncation-9.c b/gcc/testsuite/gcc.dg/Wstringop-truncation-9.c new file mode 100644 index 0000000..6361480 --- /dev/null +++ b/gcc/testsuite/gcc.dg/Wstringop-truncation-9.c @@ -0,0 +1,41 @@ +/* PR tree-optimization/99489 - ICE calling strncat after strncat + { dg-do compile } + { dg-options "-O2 -Wall" } */ + +// Important -- see pr82429. +char *stpcpy (char *, const char *); + +void fchar (char *d, char c, char *s) +{ + __builtin_strcat (d, s); + __builtin_strncat (d, &c, 1); +} + +void fcstchar (char *d, char *s) +{ + __builtin_strcat (d, s); + + const char c = 'x'; + __builtin_strncat (d, &c, 1); // { dg-warning "-Wstringop-truncation" } +} + +void fstr (char *d, char *s) +{ + __builtin_strcat (d, s); + __builtin_strncat (d, s, 1); +} + +void farr (char *d, char *s) +{ + __builtin_strcat (d, s); + + char a[] = "x"; + __builtin_strncat (d, a, 1); // { dg-warning "-Wstringop-truncation" } +} + +void flit (char *d, char *s) +{ + __builtin_strcat (d, s); + __builtin_strncat (d, "x", 1); // { dg-warning "-Wstringop-truncation" "pr?????" { xfail *-*-*} } + // { dg-warning "-Wstringop-overflow" "actual" { target *-*-*} .-1 } +} |