Re: [PATCH] [PR125747] Fix shadow-variable bugs for DO, CONCURRENT/FORALL type-spec

Thomas Koenig <[email protected]> Tue, 16 Jun 2026 08:34:50 +0200
Newsgroups gmane.comp.gcc.patches,gmane.comp.gcc.fortran
Message-ID <[email protected]>
Hi Jerry,

>>> This patch fixes a problem with nested DO_CONCURRENT loops. In short, 
>>> shadow variables were not unique between the nested levels.
>>>
>>> Regression tested on x86_64.
>>
>>> OK for mainline?
>>
>> I have a couple of questions.
>>
>> +      int nunderscore = 1;
>> +      name = (char *) alloca (strlen (v->symtree->name) + 32);
>>
>> This restricts the number of underscores to 32, and will break if there
>> are more.  I would suggest declaring a static counter which adds the
>> number to a string, like n_vars in frontend-passes.cc , which is then
>> used in create_vars.
>>
> 
> I have updated the patch, attached, to remove the limitation on 
> underscores and use a counter to generate unique names.

Regarding

+      name = (char *) alloca (GFC_MAX_SYMBOL_LEN + 1);
+      do
+	snprintf (name, GFC_MAX_SYMBOL_LEN + 1, "_%s_%d",
+		  v->symtree->name, shadow_var_num++);
+      while (gfc_find_symtree (gfc_current_ns->sym_root, name) != NULL);

I still think that can overflow when the name comes close to
GFC_MAX_SYMBOL_LEN.  Also, the do/while loop is not needed because
shadow_var_num should make things unique.

Regarding name: Not sure why alloca was used in the first place.
I think it would be better so use something like

    char name[31]; /* 6 for shadow, 4 underscores, 10 for %d, 10 for %s,
                      1 for \0' */

    snprintf (name, sizeof(name), "__shadow_%d_%10s", shadow_var_num)

Or make name longer so %s could hold the whole name of the gfc_symbol.

OK with a solution to the name length problem.

Best regards

	Thomas