diff mbox

Deal with singular sentences in builtin-sprintf-warn-1.c regex

Message ID 1a92da59-caba-3d2b-4f76-daadff2226e9@foss.arm.com
State New
Headers show

Commit Message

Thomas Preudhomme Sept. 23, 2016, 3:42 p.m. UTC
Sorry, forgot the patch. Please find it attached.

Best regards,

Thomas

On 23/09/16 16:40, Thomas Preudhomme wrote:
> Hi,
>
> New builtin-sprintf-warn-1.c testcase contains a few regex of the form "\[0-9\]+
> bytes" or ". bytes". This does not account for the case where the number of byte
> is 0 in which case byte would be in the singular form. This caused a FAIL on
> arm-none-eabi targets. This patch makes the s optional in all cases where the
> number of bytes is unknown.
>
> I did not commit this fix as obvious as people might want to only do the changes
> for lines where the number of bytes *could* be 0 so I prefer to get review.
>
> ChangeLog entry is as follows:
>
> *** gcc/testsuite/ChangeLog ***
>
> 2016-09-23  Thomas Preud'homme  <thomas.preudhomme@arm.com>
>
>         * gcc.dg/tree-ssa/builtin-sprintf-warn-1.c: Adjust regex to accept
>         singular form of byte when quantity is unknown.
>
>
> Is this ok for trunk?
>
> Best regards,
>
> Thomas

Comments

Martin Sebor Sept. 23, 2016, 4:17 p.m. UTC | #1
On 09/23/2016 09:42 AM, Thomas Preudhomme wrote:
> Sorry, forgot the patch. Please find it attached.
>
> Best regards,
>
> Thomas
>
> On 23/09/16 16:40, Thomas Preudhomme wrote:
>> Hi,
>>
>> New builtin-sprintf-warn-1.c testcase contains a few regex of the form
>> "\[0-9\]+
>> bytes" or ". bytes". This does not account for the case where the
>> number of byte
>> is 0 in which case byte would be in the singular form. This caused a
>> FAIL on
>> arm-none-eabi targets. This patch makes the s optional in all cases
>> where the
>> number of bytes is unknown.
>>
>> I did not commit this fix as obvious as people might want to only do
>> the changes
>> for lines where the number of bytes *could* be 0 so I prefer to get
>> review.

Thanks for the patch.  The %p fixes look correct to me (someone
else needs to approve the final patch).

For the INT_MAX tests, I think it's a sign of a bug in the pass if
for the following call

   sprintf (buf, "X%*c", INT_MAX, '1');

GCC prints

   warning: directive output of 0 byte causes result to exceed 'INT_MAX'

My guess is that the bug is specific to a 32-bit compiler (I can't
reproduce it in a 64-bit one with -m32).  Let me build one and look
into fixing it.

Martin

>>
>> ChangeLog entry is as follows:
>>
>> *** gcc/testsuite/ChangeLog ***
>>
>> 2016-09-23  Thomas Preud'homme  <thomas.preudhomme@arm.com>
>>
>>         * gcc.dg/tree-ssa/builtin-sprintf-warn-1.c: Adjust regex to
>> accept
>>         singular form of byte when quantity is unknown.
>>
>>
>> Is this ok for trunk?
>>
>> Best regards,
>>
>> Thomas
Thomas Preudhomme Sept. 23, 2016, 4:22 p.m. UTC | #2
Hi Martin,

On 23/09/16 17:17, Martin Sebor wrote:
> On 09/23/2016 09:42 AM, Thomas Preudhomme wrote:
>> Sorry, forgot the patch. Please find it attached.
>>
>> Best regards,
>>
>> Thomas
>>
>> On 23/09/16 16:40, Thomas Preudhomme wrote:
>>> Hi,
>>>
>>> New builtin-sprintf-warn-1.c testcase contains a few regex of the form
>>> "\[0-9\]+
>>> bytes" or ". bytes". This does not account for the case where the
>>> number of byte
>>> is 0 in which case byte would be in the singular form. This caused a
>>> FAIL on
>>> arm-none-eabi targets. This patch makes the s optional in all cases
>>> where the
>>> number of bytes is unknown.
>>>
>>> I did not commit this fix as obvious as people might want to only do
>>> the changes
>>> for lines where the number of bytes *could* be 0 so I prefer to get
>>> review.
>
> Thanks for the patch.  The %p fixes look correct to me (someone
> else needs to approve the final patch).
>
> For the INT_MAX tests, I think it's a sign of a bug in the pass if
> for the following call
>
>   sprintf (buf, "X%*c", INT_MAX, '1');
>
> GCC prints
>
>   warning: directive output of 0 byte causes result to exceed 'INT_MAX'

I only had a failed warning on line 101:

   T (0, "%p",     (void*)0x1);    /* { dg-warning ".%p. directive writing . 
bytes into a region of size 0" } */

The other were fine. I just changed all the one that were using . or explicitely 
including 0 when matching the amount of bytes. I did not look into which one 
make sense to be 0 which is why I wanted review.

I'm happy to just keep the %p ones (or even only the one with 0, "%p") if you 
think that's the only one that needs it.

Best regards,

Thomas
diff mbox

Patch

diff --git a/gcc/testsuite/gcc.dg/tree-ssa/builtin-sprintf-warn-1.c b/gcc/testsuite/gcc.dg/tree-ssa/builtin-sprintf-warn-1.c
index e098be92bb0377414b1f9cacf5e4d2a3398e74ec..85dbcd9d6d3a5b1ad810037f03451207284a25b1 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/builtin-sprintf-warn-1.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/builtin-sprintf-warn-1.c
@@ -77,13 +77,13 @@  void test_sprintf_c_const (void)
   T (-1, "%*c",  INT_MAX - 1, '1');
   T (-1, "%*c",  INT_MAX,     '1');
   T (-1, "X%*c", INT_MAX - 1, '1');
-  T (-1, "X%*c", INT_MAX,     '1'); /* { dg-warning "directive output of \[0-9\]+ bytes causes result to exceed .INT_MAX." } */
+  T (-1, "X%*c", INT_MAX,     '1'); /* { dg-warning "directive output of \[0-9\]+ bytes? causes result to exceed .INT_MAX." } */
 
-  T (-1, "%*c%*c", INT_MAX - 1, '1', INT_MAX - 1, '2'); /* { dg-warning "directive output of \[0-9\]+ bytes causes result to exceed .INT_MAX." } */
+  T (-1, "%*c%*c", INT_MAX - 1, '1', INT_MAX - 1, '2'); /* { dg-warning "directive output of \[0-9\]+ bytes? causes result to exceed .INT_MAX." } */
 
   T (-1, "%*cX", INT_MAX - 2, '1');
   T (-1, "%*cX", INT_MAX - 1, '1');
-  T (-1, "%*cX", INT_MAX,     '1'); /* { dg-warning "output of \[0-9\]+ bytes causes result to exceed .INT_MAX." } */
+  T (-1, "%*cX", INT_MAX,     '1'); /* { dg-warning "output of \[0-9\]+ bytes? causes result to exceed .INT_MAX." } */
 }
 
 /* Exercise the "%p" directive with constant arguments.  */
@@ -98,9 +98,9 @@  void test_sprintf_p_const (void)
 
   /* The exact output for %p is unspecified by C.  Two formats are known:
      same as %tx (for example AIX) and same as %#tx (for example Solaris).  */
-  T (0, "%p",     (void*)0x1);    /* { dg-warning ".%p. directive writing . bytes into a region of size 0" } */
-  T (1, "%p",     (void*)0x12);   /* { dg-warning ".%p. directive writing . bytes into a region of size 1" } */
-  T (2, "%p",     (void*)0x123);  /* { dg-warning ".%p. directive writing . bytes into a region of size 2" } */
+  T (0, "%p",     (void*)0x1);    /* { dg-warning ".%p. directive writing . bytes? into a region of size 0" } */
+  T (1, "%p",     (void*)0x12);   /* { dg-warning ".%p. directive writing . bytes? into a region of size 1" } */
+  T (2, "%p",     (void*)0x123);  /* { dg-warning ".%p. directive writing . bytes? into a region of size 2" } */
 
   /* GLIBC and uClibc treat the ' ' flag with the "%p" directive the same
      as with signed integer conversions (i.e., it prepends a space).  Other
@@ -299,7 +299,7 @@  void test_sprintf_chk_s_const (void)
      when the size of the destination object is unknown.  */
   T (-1, "%*s",  INT_MAX - 1, "");
   T (-1, "%*s",  INT_MAX,     "");
-  T (-1, "X%*s", INT_MAX,     ""); /* { dg-warning "directive output of \[0-9\]+ bytes causes result to exceed .INT_MAX." } */
+  T (-1, "X%*s", INT_MAX,     ""); /* { dg-warning "directive output of \[0-9\]+ bytes? causes result to exceed .INT_MAX." } */
 
   /* Multiple directives.  */