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