> On Dec 15, 2021, at 11:33 AM, Qing Zhao via Gcc-patches 
> <gcc-patches@gcc.gnu.org> wrote:
> 
> 
> 
>> On Dec 14, 2021, at 4:06 PM, Martin Sebor <mse...@gmail.com> wrote:
>> 
>>>>>> 
>>>>> 
>>>>> Dynamically creating the string seems quite cumbersome here, and
>>>>> it leaks the allocated block.  I wonder if it might be better to
>>>>> remove the gmsgid argument from the function and assign it to
>>>>> one of the literals based on the other arguments.
>>>>> 
>>>>> Since only one of var and var_name is used, I also wonder if
>>>>> the %qs form could be used for both to simplify the overall
>>>>> logic.  (I.e., get the IDENTIFIER_POINTER string from var and
>>>>> use it instead of %qD).
>>> Looks like that using “%qs” + get the IDENTIFIER_POINTER string from var 
>>> did not work very well for the following testing case:
>>>  1 /* PR tree-optimization/45083 */
>>>  2 /* { dg-do compile } */
>>>  3 /* { dg-options "-O2 -Wuninitialized" } */
>>>  4
>>>  5 struct S { char *a; unsigned b; unsigned c; };
>>>  6 extern int foo (const char *);
>>>  7 extern void bar (int, int);
>>>  8
>>>  9 static void
>>> 10 baz (void)
>>> 11 {
>>> 12   struct S cs[1];       /* { dg-message "was declared here" } */
>>> 13   switch (cs->b)        /* { dg-warning "cs\[^\n\r\]*\\.b\[^\n\r\]*is 
>>> used uninitialized" } */
>>> 14     {
>>> 15     case 101:
>>> 16       if (foo (cs->a))  /* { dg-warning "cs\[^\n\r\]*\\.a\[^\n\r\]*may 
>>> be used uninitialized" } */
>>> 17         bar (cs->c, cs->b);     /* { dg-warning 
>>> "cs\[^\n\r\]*\\.c\[^\n\r\]*may be used uninitialized"     } */
>>> 18     }
>>> 19 }
>>> 20
>>> 21 void
>>> 22 test (void)
>>> 23 {
>>> 24   baz ();
>>> 25 }
>>> For the uninitialized usages at line 13, 16, 17: the IDENTIFIER_POINTER 
>>> string of var are:
>>> cs$0$b, cs$0$a ,cs$0$c
>>> However, with %qD, they are printed as cs[0].b, cs[0].a, cs[0].c
>>> But with %qs, they are printed as cs$0$b, cs$0$a ,cs$0$c.
>>> Looks like that %qD does not simplify print out the IDENTIFIER_POINTER 
>>> string directly, it specially handle it for some cases.
>>> I tried to see how %qD specially handle the strings, but didn’t get it so 
>>> far.
>>> Do you know where the %qD handle this case specially?
>> 
>> In the front end's pretty printer where it handles %D (e.g.,
>> for C in c_tree_printer in c/c-objc-common.c).  For VARs with
>> DECL_HAS_DEBUG_EXPR_P (temp) the code uses DECL_DEBUG_EXPR().
>> 
>> There's also print_generic_expr_to_str(tree) that formats a decl
>> or an expression to a dynamically allocated string (the string
>> needs to be freed).
> 
> Thanks a lot.
> This resolved the issue.

However, there is another testing case gcc.dg/uninit-40.c still had issue when 
printing out the variable names:

 24   q[0] = bar (pt + __builtin_offsetof (struct T, u.b)); /* { dg-warning 
"'t\\.u\\.b'     is used uninitialized" } */

I guess that there are other details I need to copy into the routine 
“warn_uninit”. 
So, I gave up copying the details of %D to the routine “warn_uninit”, and kept 
%D for Var.  that might be better.

thanks.

Qing



> 
> Qing
>> 
>> Martin
>> 
>>> Thanks.
>>> Qing
>>>> Both are good suggestions, I will try to update the code based on this.
>>>> 
>>>> Thanks again.
>>>> 
>>>> Qing

Reply via email to