[Bug c++/86400] [8/9 regression] set<string>::set<char (*)[2]) constructor does not work with array argument
msebor at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Thu Jul 5 00:16:00 GMT 2018
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86400
Martin Sebor <msebor at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Keywords| |wrong-code
Status|NEW |ASSIGNED
Blocks| |83819
Assignee|unassigned at gcc dot gnu.org |msebor at gcc dot gnu.org
--- Comment #7 from Martin Sebor <msebor at gcc dot gnu.org> ---
Confirmed. The strlen pass sees:
static char root[1][2] = {"/"};
...
_1 = __builtin_strlen (&root);
but the code in maybe_set_strlen_range() assumes the argument has the correct
type (i.e., char*, not char[][2]) and uses TYPE_DOMAIN to determine the upper
bound of the array which returns the bound of the outer array in this case.
Using TYPE_SIZE instead avoids the problem:
Index: gcc/tree-ssa-strlen.c
===================================================================
--- gcc/tree-ssa-strlen.c (revision 262418)
+++ gcc/tree-ssa-strlen.c (working copy)
@@ -1156,22 +1156,17 @@ maybe_set_strlen_range (tree lhs, tree src, tree b
if (src_is_array && !array_at_struct_end_p (src))
{
tree type = TREE_TYPE (src);
- if (tree dom = TYPE_DOMAIN (type))
- {
- tree maxval = TYPE_MAX_VALUE (dom);
- if (maxval)
- max = wi::to_wide (maxval);
- else
- max = wi::zero (min.get_precision ());
+ if (tree size = TYPE_SIZE_UNIT (type))
+ if (size && TREE_CODE (size) == INTEGER_CST)
+ max = wi::to_wide (size);
- /* For strlen() the upper bound above is equal to
- the longest string that can be stored in the array
- (i.e., it accounts for the terminating nul. For
- strnlen() bump up the maximum by one since the array
- need not be nul-terminated. */
- if (bound)
- ++max;
- }
+ /* For strlen() the upper bound above is equal to
+ the longest string that can be stored in the array
+ (i.e., it accounts for the terminating nul. For
+ strnlen() bump up the maximum by one since the array
+ need not be nul-terminated. */
+ if (!bound && max != 0)
+ --max;
}
else
{
Referenced Bugs:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83819
[Bug 83819] [meta-bug] missing strlen optimizations
More information about the Gcc-bugs
mailing list