https://gcc.gnu.org/g:2a1b25e36ca2343ee1c744c67aceb8085317e12b

commit 2a1b25e36ca2343ee1c744c67aceb8085317e12b
Author: Mikael Morin <mik...@gcc.gnu.org>
Date:   Sat Mar 15 22:35:15 2025 +0100

    Suppression méthode get_type

Diff:
---
 gcc/fortran/trans-descriptor.cc | 97 +++++++++++++++++++++++------------------
 1 file changed, 55 insertions(+), 42 deletions(-)

diff --git a/gcc/fortran/trans-descriptor.cc b/gcc/fortran/trans-descriptor.cc
index 8910c2c35564..5fc181113475 100644
--- a/gcc/fortran/trans-descriptor.cc
+++ b/gcc/fortran/trans-descriptor.cc
@@ -1027,7 +1027,6 @@ class init_info : public modify_info
 {
 public:
   virtual bool is_initialization () const { return true; }
-  virtual gfc_typespec *get_type () const { return nullptr; }
   virtual bt get_type_type (const gfc_typespec &) const;
 };
 
@@ -1053,24 +1052,19 @@ private:
 
 public:
   null_init(gfc_typespec &arg_ts) : ts(arg_ts) { }
-  virtual gfc_typespec *get_type () const { return &ts; }
 };
 
 
 class scalar_value : public init_info
 {
 private:
-  gfc_typespec *ts;
   tree value;
   bool use_tree_type_;
   tree get_elt_type () const;
 
 public:
-  scalar_value(gfc_typespec &arg_ts, tree arg_value)
-    : ts(&arg_ts), value(arg_value),  use_tree_type_ (false) { }
-  scalar_value(tree arg_value)
-    : ts(nullptr), value(arg_value), use_tree_type_ (true) { }
-  virtual gfc_typespec *get_type () const { return ts; }
+  scalar_value(tree arg_value, bool arg_use_tree_type)
+    : value(arg_value), use_tree_type_ (arg_use_tree_type) { }
   virtual bool use_tree_type () const { return use_tree_type_; }
   virtual bt get_type_type (const gfc_typespec &) const;
   virtual tree get_length (gfc_typespec *ts) const;
@@ -1095,7 +1089,12 @@ struct descr_change_info {
       class modify_info *unknown_info;
       class nullification *nullification_info;
       class init_info *initialization_info;
-      class null_init *null_init_info;
+      struct
+       {
+         class null_init *info;
+         gfc_typespec *ts;
+       }
+      null_init;
       struct
        {
          class default_init *info;
@@ -1105,6 +1104,7 @@ struct descr_change_info {
       struct
        {
          class scalar_value *info;
+         gfc_typespec *ts;
          tree value;
          tree caf_token;
          bool clear_token;
@@ -1289,20 +1289,54 @@ scalar_value::get_length (gfc_typespec * type_info) 
const
 
 
 static tree
-build_dtype (gfc_typespec *ts, int rank, const symbol_attribute &,
-            const init_info &init)
+get_descr_dtype (const descr_change_info &change_info, gfc_typespec *ts,
+                int rank, const symbol_attribute & ATTRIBUTE_UNUSED)
 {
+  if (change_info.type == UNKNOWN_CHANGE
+      || change_info.type == EXPLICIT_NULLIFICATION)
+    return NULL_TREE;
+
   vec<constructor_elt, va_gc> *v = nullptr;
 
+  const init_info *init_info = nullptr;
+  if (change_info.type == INITIALISATION)
+    init_info = change_info.u.initialization_info;
+  else if (change_info.type == NULL_INITIALISATION)
+    init_info = change_info.u.null_init.info;
+  else if (change_info.type == DEFAULT_INITIALISATION)
+    init_info = change_info.u.default_init.info;
+  else if (change_info.type == SCALAR_VALUE)
+    init_info = change_info.u.scalar_value.info;
+  else
+    gcc_unreachable ();
+
   tree type = get_dtype_type_node ();
 
   tree fields = TYPE_FIELDS (type);
 
-  gfc_typespec *type_info = init.get_type ();
+  gfc_typespec *type_info;
+  switch (change_info.type)
+    {
+    case INITIALISATION:
+    case DEFAULT_INITIALISATION:
+      type_info = ts;
+      break;
+
+    case NULL_INITIALISATION:
+      type_info = change_info.u.null_init.ts;
+      break;
+
+    case SCALAR_VALUE:
+      type_info = change_info.u.scalar_value.ts;
+      break;
+
+    default:
+      gcc_unreachable ();
+    }
   if (type_info == nullptr)
     type_info = ts;
 
-  if (!(init.is_initialization ()
+  if (!(init_info->is_initialization ()
        && type_info
        && (type_info->type == BT_CLASS
            || (type_info->type == BT_CHARACTER
@@ -1310,7 +1344,7 @@ build_dtype (gfc_typespec *ts, int rank, const 
symbol_attribute &,
     {
       tree elem_len_field = gfc_advance_chain (fields, GFC_DTYPE_ELEM_LEN);
       tree elem_len_val = fold_convert (TREE_TYPE (elem_len_field),
-                                       init.get_length (type_info));
+                                       init_info->get_length (type_info));
       CONSTRUCTOR_APPEND_ELT (v, elem_len_field, elem_len_val);
     }
 
@@ -1326,7 +1360,7 @@ build_dtype (gfc_typespec *ts, int rank, const 
symbol_attribute &,
     }
 
   tree type_info_field = gfc_advance_chain (fields, GFC_DTYPE_TYPE);
-  bt n = init.get_type_type (*type_info);
+  bt n = init_info->get_type_type (*type_info);
   tree type_info_val = build_int_cst (TREE_TYPE (type_info_field), n);
   CONSTRUCTOR_APPEND_ELT (v, type_info_field, type_info_val);
 
@@ -1334,30 +1368,6 @@ build_dtype (gfc_typespec *ts, int rank, const 
symbol_attribute &,
 }
 
 
-static tree
-get_descr_dtype (const descr_change_info &change_info, gfc_typespec *ts,
-                int rank, const symbol_attribute &attr)
-{
-  if (change_info.type == UNKNOWN_CHANGE
-      || change_info.type == EXPLICIT_NULLIFICATION)
-    return NULL_TREE;
-
-  const init_info *init_info = nullptr;
-  if (change_info.type == INITIALISATION)
-    init_info = change_info.u.initialization_info;
-  else if (change_info.type == NULL_INITIALISATION)
-    init_info = change_info.u.null_init_info;
-  else if (change_info.type == DEFAULT_INITIALISATION)
-    init_info = change_info.u.default_init.info;
-  else if (change_info.type == SCALAR_VALUE)
-    init_info = change_info.u.scalar_value.info;
-  else
-    gcc_unreachable ();
-
-  return build_dtype (ts, rank, attr, *init_info);
-}
-
-
 /* Build a null array descriptor constructor.  */
 
 vec<constructor_elt, va_gc> *
@@ -1444,7 +1454,8 @@ get_null_array_descriptor_init (tree type, gfc_typespec 
&ts, int rank,
   struct descr_change_info info;
   info.type = NULL_INITIALISATION;
   info.descriptor_type = type;
-  info.u.initialization_info = &ni;
+  info.u.null_init.info = &ni;
+  info.u.null_init.ts = &ts;
 
   return get_descriptor_init (type, &ts, rank, &attr, info);
 }
@@ -1923,11 +1934,12 @@ gfc_set_scalar_descriptor (stmtblock_t *block, tree 
descriptor,
 
   attr = gfc_symbol_attr (sym);
 
-  scalar_value sv (expr->ts, value);
+  scalar_value sv (value, false);
   struct descr_change_info info;
   info.type = SCALAR_VALUE;
   info.descriptor_type = TREE_TYPE (descriptor);
   info.u.scalar_value.info = &sv;
+  info.u.scalar_value.ts = &expr->ts;
   info.u.scalar_value.value = value;
   info.u.scalar_value.caf_token = value;
   info.u.scalar_value.clear_token = true;
@@ -1942,11 +1954,12 @@ void
 gfc_set_descriptor_from_scalar (stmtblock_t *block, tree desc, tree scalar,
                                symbol_attribute *attr, tree caf_token)
 {
-  scalar_value sv (scalar);
+  scalar_value sv (scalar, true);
   struct descr_change_info info;
   info.type = SCALAR_VALUE;
   info.descriptor_type = TREE_TYPE (desc);
   info.u.scalar_value.info = &sv;
+  info.u.scalar_value.ts = nullptr;
   info.u.scalar_value.value = scalar;
   info.u.scalar_value.caf_token = caf_token;
   info.u.scalar_value.clear_token = false;

Reply via email to