This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Fix strpbrk (x, "") folding (PR c/84953)
- From: Richard Biener <rguenther at suse dot de>
- To: Jakub Jelinek <jakub at redhat dot com>,Jeff Law <law at redhat dot com>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Tue, 20 Mar 2018 07:39:53 +0100
- Subject: Re: [PATCH] Fix strpbrk (x, "") folding (PR c/84953)
- References: <20180320063246.GW8577@tucnak>
On March 20, 2018 7:32:46 AM GMT+01:00, Jakub Jelinek <jakub@redhat.com> wrote:
>Hi!
>
>We use incorrect type for the NULL return value, the builtin is
>char *strpbrk (const char *, const char *), so the first argument
>is cast to const char * and we return (const char *) 0, while we
>really should return (char *) 0. fold_builtin_n then adds:
> ret = build1 (NOP_EXPR, TREE_TYPE (ret), ret);
> SET_EXPR_LOCATION (ret, loc);
> TREE_NO_WARNING (ret) = 1;
>and thus we in the end have (char *) (_Literal (const char *) 0).
>This bug then results in a -Wdiscarded-qualifiers warning.
>
>Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok
>for
>trunk?
OK.
Richard.
>2018-03-20 Jakub Jelinek <jakub@redhat.com>
>
> PR c/84953
> * builtins.c (fold_builtin_strpbrk): For strpbrk(x, "") use type
> instead of TREE_TYPE (s1) for the return value.
>
> * gcc.dg/pr84953.c: New test.
>
>--- gcc/builtins.c.jj 2018-03-07 22:51:58.871478732 +0100
>+++ gcc/builtins.c 2018-03-19 18:49:45.313898848 +0100
>@@ -9573,7 +9573,7 @@ fold_builtin_strpbrk (location_t loc, tr
> if (p2[0] == '\0')
> /* strpbrk(x, "") == NULL.
> Evaluate and ignore s1 in case it had side-effects. */
>- return omit_one_operand_loc (loc, TREE_TYPE (s1), integer_zero_node,
>s1);
>+ return omit_one_operand_loc (loc, type, integer_zero_node, s1);
>
> if (p2[1] != '\0')
> return NULL_TREE; /* Really call strpbrk. */
>--- gcc/testsuite/gcc.dg/pr84953.c.jj 2018-03-19 18:52:48.295893571
>+0100
>+++ gcc/testsuite/gcc.dg/pr84953.c 2018-03-19 18:52:31.935894043 +0100
>@@ -0,0 +1,11 @@
>+/* PR c/84953 */
>+/* { dg-do compile } */
>+
>+char *strpbrk (const char *, const char *);
>+
>+char *
>+test (char *p)
>+{
>+ p = strpbrk (p, ""); /* { dg-bogus "assignment discards 'const'
>qualifier from pointer target type" } */
>+ return p;
>+}
>
> Jakub