]> gcc.gnu.org Git - gcc.git/commitdiff
fortran: Identify arguments by their names
authorMikael Morin <mikael@gcc.gnu.org>
Sun, 7 Nov 2021 13:40:36 +0000 (14:40 +0100)
committerMikael Morin <mikael@gcc.gnu.org>
Tue, 16 Nov 2021 18:07:51 +0000 (19:07 +0100)
This provides a new function to get the name of a dummy argument,
so that identifying an argument can be made using just its name
instead of a mix of name matching (for keyword actual arguments)
and argument counting (for other actual arguments).

gcc/fortran/ChangeLog:
* interface.c (gfc_dummy_arg_get_name): New function.
* gfortran.h (gfc_dummy_arg_get_name): Declare it.
* trans-array.c (arg_evaluated_for_scalarization): Pass a dummy
argument wrapper as argument instead of an actual argument
and an index number.  Check it’s non-NULL.  Use its name
to identify it.
(gfc_walk_elemental_function_args): Update call to
arg_evaluated for scalarization.  Remove argument counting.

gcc/fortran/gfortran.h
gcc/fortran/interface.c
gcc/fortran/trans-array.c

index bf6177058272b1adb86f817538942b0e9957b3fa..1846ee4fd3cd8be7eca266627bb7e71dd7a22fa7 100644 (file)
@@ -2329,6 +2329,7 @@ struct gfc_dummy_arg
 #define gfc_get_dummy_arg() XCNEW (gfc_dummy_arg)
 
 
+const char * gfc_dummy_arg_get_name (gfc_dummy_arg &);
 const gfc_typespec & gfc_dummy_arg_get_typespec (gfc_dummy_arg &);
 bool gfc_dummy_arg_is_optional (gfc_dummy_arg &);
 
index 12574f8f037158cdb835b8045e8ff3aa5b7c7313..85717096103ce3d5e8a3544adde6d22417a50cb7 100644 (file)
@@ -5534,6 +5534,23 @@ gfc_get_formal_from_actual_arglist (gfc_symbol *sym,
 }
 
 
+const char *
+gfc_dummy_arg_get_name (gfc_dummy_arg & dummy_arg)
+{
+  switch (dummy_arg.intrinsicness)
+    {
+    case GFC_INTRINSIC_DUMMY_ARG:
+      return dummy_arg.u.intrinsic->name;
+
+    case GFC_NON_INTRINSIC_DUMMY_ARG:
+      return dummy_arg.u.non_intrinsic->sym->name;
+
+    default:
+      gcc_unreachable ();
+    }
+}
+
+
 const gfc_typespec &
 gfc_dummy_arg_get_typespec (gfc_dummy_arg & dummy_arg)
 {
index d37c1e7ad7f0463b32222ad3dfeceff4da7b3dd1..2090adf01e7cf71fac68e9844392806f1f09d5e8 100644 (file)
@@ -11492,16 +11492,14 @@ gfc_get_intrinsic_for_expr (gfc_expr *call)
 
 static bool
 arg_evaluated_for_scalarization (gfc_intrinsic_sym *function,
-                                gfc_actual_arglist &actual_arg, int arg_num)
+                                gfc_dummy_arg *dummy_arg)
 {
-  if (function != NULL)
+  if (function != NULL && dummy_arg != NULL)
     {
       switch (function->id)
        {
          case GFC_ISYM_INDEX:
-           if ((actual_arg.name == NULL && arg_num == 3)
-               || (actual_arg.name != NULL
-                   && strcmp ("kind", actual_arg.name) == 0))
+           if (strcmp ("kind", gfc_dummy_arg_get_name (*dummy_arg)) == 0)
              return false;
          /* Fallthrough.  */
 
@@ -11532,15 +11530,14 @@ gfc_walk_elemental_function_args (gfc_ss * ss, gfc_actual_arglist *arg,
   head = gfc_ss_terminator;
   tail = NULL;
 
-  int arg_num = 0;
   scalar = 1;
   for (; arg; arg = arg->next)
     {
       gfc_dummy_arg * const dummy_arg = arg->associated_dummy;
       if (!arg->expr
          || arg->expr->expr_type == EXPR_NULL
-         || !arg_evaluated_for_scalarization (intrinsic_sym, *arg, arg_num))
-       goto loop_continue;
+         || !arg_evaluated_for_scalarization (intrinsic_sym, dummy_arg))
+       continue;
 
       newss = gfc_walk_subexpr (head, arg->expr);
       if (newss == head)
@@ -11570,9 +11567,6 @@ gfc_walk_elemental_function_args (gfc_ss * ss, gfc_actual_arglist *arg,
           while (tail->next != gfc_ss_terminator)
             tail = tail->next;
         }
-
-loop_continue:
-      arg_num++;
     }
 
   if (scalar)
This page took 0.074041 seconds and 5 git commands to generate.