https://gcc.gnu.org/g:7a9396443bd81b27d61a99eefe1a29f832fc1434

commit 7a9396443bd81b27d61a99eefe1a29f832fc1434
Author: Mikael Morin <mik...@gcc.gnu.org>
Date:   Wed Jun 18 18:07:54 2025 +0200

    Ajout nom de variable au variables temporaires select type

Diff:
---
 gcc/fortran/match.cc   | 35 +++++++++++++++++++++++++++--------
 gcc/fortran/resolve.cc | 27 ++++++++++++++++++++-------
 2 files changed, 47 insertions(+), 15 deletions(-)

diff --git a/gcc/fortran/match.cc b/gcc/fortran/match.cc
index a99a757bede6..09082db8b24c 100644
--- a/gcc/fortran/match.cc
+++ b/gcc/fortran/match.cc
@@ -7171,7 +7171,7 @@ select_type_push (gfc_symbol *sel)
 /* Set the temporary for the current intrinsic SELECT TYPE selector.  */
 
 static gfc_symtree *
-select_intrinsic_set_tmp (gfc_typespec *ts)
+select_intrinsic_set_tmp (gfc_typespec *ts, const char *var_name)
 {
   char name[GFC_MAX_SYMBOL_LEN];
   gfc_symtree *tmp;
@@ -7192,12 +7192,12 @@ select_intrinsic_set_tmp (gfc_typespec *ts)
     charlen = gfc_mpz_get_hwi (ts->u.cl->length->value.integer);
 
   if (ts->type != BT_CHARACTER)
-    sprintf (name, "__tmp_%s_%d", gfc_basic_typename (ts->type),
-            ts->kind);
+    sprintf (name, "__tmp_%s_%d_%s", gfc_basic_typename (ts->type),
+            ts->kind, var_name);
   else
     snprintf (name, sizeof (name),
-             "__tmp_%s_" HOST_WIDE_INT_PRINT_DEC "_%d",
-             gfc_basic_typename (ts->type), charlen, ts->kind);
+             "__tmp_%s_" HOST_WIDE_INT_PRINT_DEC "_%d_%s",
+             gfc_basic_typename (ts->type), charlen, ts->kind, var_name);
 
   gfc_get_sym_tree (name, gfc_current_ns, &tmp, false);
   sym = tmp->n.sym;
@@ -7222,6 +7222,22 @@ select_intrinsic_set_tmp (gfc_typespec *ts)
 }
 
 
+static const char *
+get_select_type_var_name ()
+{
+  const char *name = "";
+  gfc_expr *e = gfc_state_stack->construct->expr1;
+  if (e->symtree)
+    name = e->symtree->name;
+  for (gfc_ref *r = e->ref; r; r = r->next)
+    if (r->type == REF_COMPONENT
+       && strcmp (r->u.c.component->name, "_data") != 0)
+      name = r->u.c.component->name;
+
+  return name;
+}
+
+
 /* Set up a temporary for the current TYPE IS / CLASS IS branch .  */
 
 static void
@@ -7239,7 +7255,10 @@ select_type_set_tmp (gfc_typespec *ts)
       return;
     }
 
-  tmp = select_intrinsic_set_tmp (ts);
+
+  const char *var_name = get_select_type_var_name ();
+
+  tmp = select_intrinsic_set_tmp (ts, var_name);
 
   if (tmp == NULL)
     {
@@ -7247,9 +7266,9 @@ select_type_set_tmp (gfc_typespec *ts)
        return;
 
       if (ts->type == BT_CLASS)
-       sprintf (name, "__tmp_class_%s", ts->u.derived->name);
+       sprintf (name, "__tmp_class_%s_%s", ts->u.derived->name, var_name);
       else
-       sprintf (name, "__tmp_type_%s", ts->u.derived->name);
+       sprintf (name, "__tmp_type_%s_%s", ts->u.derived->name, var_name);
 
       gfc_get_sym_tree (name, gfc_current_ns, &tmp, false);
       sym = tmp->n.sym;
diff --git a/gcc/fortran/resolve.cc b/gcc/fortran/resolve.cc
index 5413d8f9c542..0070e8c170d2 100644
--- a/gcc/fortran/resolve.cc
+++ b/gcc/fortran/resolve.cc
@@ -10819,6 +10819,8 @@ resolve_select_type (gfc_code *code, gfc_namespace 
*old_ns)
        ref = gfc_copy_ref (ref);
     }
 
+  gfc_expr *orig_expr1 = code->expr1;
+
   /* Add EXEC_SELECT to switch on type.  */
   new_st = gfc_get_code (code->op);
   new_st->expr1 = code->expr1;
@@ -10846,7 +10848,6 @@ resolve_select_type (gfc_code *code, gfc_namespace 
*old_ns)
   for (body = code->block; body; body = body->block)
     {
       gfc_symbol *vtab;
-      gfc_expr *e;
       c = body->ext.block.case_list;
 
       /* Generate an index integer expression for address of the
@@ -10854,6 +10855,7 @@ resolve_select_type (gfc_code *code, gfc_namespace 
*old_ns)
         is stored in c->high and is used to resolve intrinsic cases.  */
       if (c->ts.type != BT_UNKNOWN)
        {
+         gfc_expr *e;
          if (c->ts.type == BT_DERIVED || c->ts.type == BT_CLASS)
            {
              vtab = gfc_find_derived_vtab (c->ts.u.derived);
@@ -10886,11 +10888,22 @@ resolve_select_type (gfc_code *code, gfc_namespace 
*old_ns)
         when this case is actually true, so build a new ASSOCIATE
         that does precisely this here (instead of using the
         'global' one).  */
+      const char * var_name = "";
+      if (orig_expr1->symtree)
+       var_name = orig_expr1->symtree->name;
+      if (orig_expr1->ref)
+       {
+         for (gfc_ref *r = orig_expr1->ref; r; r = r->next)
+           if (r->type == REF_COMPONENT
+               && !(strcmp (r->u.c.component->name, "_data") == 0
+                    || strcmp (r->u.c.component->name, "_vptr") == 0))
+             var_name = r->u.c.component->name;
+       }
 
       if (c->ts.type == BT_CLASS)
-       sprintf (name, "__tmp_class_%s", c->ts.u.derived->name);
+       sprintf (name, "__tmp_class_%s_%s", c->ts.u.derived->name, var_name);
       else if (c->ts.type == BT_DERIVED)
-       sprintf (name, "__tmp_type_%s", c->ts.u.derived->name);
+       sprintf (name, "__tmp_type_%s_%s", c->ts.u.derived->name, var_name);
       else if (c->ts.type == BT_CHARACTER)
        {
          HOST_WIDE_INT charlen = 0;
@@ -10898,12 +10911,12 @@ resolve_select_type (gfc_code *code, gfc_namespace 
*old_ns)
              && c->ts.u.cl->length->expr_type == EXPR_CONSTANT)
            charlen = gfc_mpz_get_hwi (c->ts.u.cl->length->value.integer);
          snprintf (name, sizeof (name),
-                   "__tmp_%s_" HOST_WIDE_INT_PRINT_DEC "_%d",
-                   gfc_basic_typename (c->ts.type), charlen, c->ts.kind);
+                   "__tmp_%s_" HOST_WIDE_INT_PRINT_DEC "_%d_%s",
+                   gfc_basic_typename (c->ts.type), charlen, c->ts.kind, 
var_name);
        }
       else
-       sprintf (name, "__tmp_%s_%d", gfc_basic_typename (c->ts.type),
-                c->ts.kind);
+       sprintf (name, "__tmp_%s_%d_%s", gfc_basic_typename (c->ts.type),
+                c->ts.kind, var_name);
 
       st = gfc_find_symtree (ns->sym_root, name);
       gcc_assert (st->n.sym->assoc);

Reply via email to