diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/builtins.c | 25 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr98721-1.c | 14 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr98721-2.c | 8 |
3 files changed, 36 insertions, 11 deletions
diff --git a/gcc/builtins.c b/gcc/builtins.c index c1115a3..0aed008 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -4414,8 +4414,8 @@ access_ref::inform_access (access_mode mode) const MAXREF on which the result is based. */ const offset_int orng[] = { - offrng[0] - maxref.offrng[0], - wi::smax (offrng[1] - maxref.offrng[1], offrng[0]), + offrng[0] - maxref.offrng[0], + wi::smax (offrng[1] - maxref.offrng[1], offrng[0]), }; /* Add the final PHI's offset to that of each of the arguments @@ -4493,12 +4493,15 @@ access_ref::inform_access (access_mode mode) const /* Strip the SSA_NAME suffix from the variable name and recreate an identifier with the VLA's original name. */ ref = gimple_call_lhs (stmt); - ref = SSA_NAME_IDENTIFIER (ref); - const char *id = IDENTIFIER_POINTER (ref); - size_t len = strcspn (id, ".$"); - if (!len) - len = strlen (id); - ref = get_identifier_with_length (id, len); + if (SSA_NAME_IDENTIFIER (ref)) + { + ref = SSA_NAME_IDENTIFIER (ref); + const char *id = IDENTIFIER_POINTER (ref); + size_t len = strcspn (id, ".$"); + if (!len) + len = strlen (id); + ref = get_identifier_with_length (id, len); + } } else { @@ -4557,13 +4560,13 @@ access_ref::inform_access (access_mode mode) const return; } - if (DECL_P (ref)) + if (allocfn == NULL_TREE) { if (*offstr) - inform (loc, "at offset %s into source object %qD of size %s", + inform (loc, "at offset %s into source object %qE of size %s", offstr, ref, sizestr); else - inform (loc, "source object %qD of size %s", ref, sizestr); + inform (loc, "source object %qE of size %s", ref, sizestr); return; } diff --git a/gcc/testsuite/gcc.dg/pr98721-1.c b/gcc/testsuite/gcc.dg/pr98721-1.c new file mode 100644 index 0000000..868b071 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr98721-1.c @@ -0,0 +1,14 @@ +/* PR tree-optimization/98721 */ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +int +foo (int n) +{ + if (n <= 0) + { + char vla[n]; /* { dg-message "source object 'vla' of size 0" } */ + return __builtin_strlen (vla); /* { dg-warning "'__builtin_strlen' reading 1 or more bytes from a region of size 0" } */ + } + return -1; +} diff --git a/gcc/testsuite/gcc.dg/pr98721-2.c b/gcc/testsuite/gcc.dg/pr98721-2.c new file mode 100644 index 0000000..c8ca542 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr98721-2.c @@ -0,0 +1,8 @@ +/* PR tree-optimization/98721 */ +/* { dg-do compile } */ + +int +foo (void) +{ + return __builtin_strlen (__builtin_alloca_with_align (0, 16)); /* { dg-warning "'__builtin_strlen' reading 1 or more bytes from a region of size 0" } */ +} /* { dg-message "source object '<unknown>' of size 0" "" { target *-*-* } .-1 } */ |