aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/trans-decl.c
diff options
context:
space:
mode:
authorMikael Morin <mikael@gcc.gnu.org>2021-11-07 14:39:18 +0100
committerMikael Morin <mikael@gcc.gnu.org>2021-11-12 13:10:55 +0100
commit68d62cb20637b2faf2c2cc1716a0786b07a6a76f (patch)
tree2fe334a41d370b81f28b605b8c507b43310c69ac /gcc/fortran/trans-decl.c
parent7d6da11fce054b25b50d0dec7f8d49cf22852680 (diff)
downloadgcc-68d62cb20637b2faf2c2cc1716a0786b07a6a76f.zip
gcc-68d62cb20637b2faf2c2cc1716a0786b07a6a76f.tar.gz
gcc-68d62cb20637b2faf2c2cc1716a0786b07a6a76f.tar.bz2
fortran: Ignore unused args in scalarization [PR97896]
The KIND argument of the INDEX intrinsic is a compile time constant that is used at compile time only to resolve to a kind-specific library function. That argument is otherwise completely ignored at runtime, and there is no code generated for it as the library procedure has no kind argument. This confuses the scalarizer which expects to see every argument of elemental functions used when calling a procedure. This change removes the argument from the scalarization lists at the beginning of the scalarization process, so that the argument is completely ignored. This also reverts the existing workaround (commit d09847357b965a2c2cda063827ce362d4c9c86f2 except for its testcase). PR fortran/97896 gcc/fortran/ChangeLog: * intrinsic.c (add_sym_4ind): Remove. (add_functions): Use add_sym4 instead of add_sym4ind. Don’t special case the index intrinsic. * iresolve.c (gfc_resolve_index_func): Use the individual arguments directly instead of the full argument list. * intrinsic.h (gfc_resolve_index_func): Update the declaration accordingly. * trans-decl.c (gfc_get_extern_function_decl): Don’t modify the list of arguments in the case of the index intrinsic. * trans-array.h (gfc_get_intrinsic_for_expr, gfc_get_proc_ifc_for_expr): New. * trans-array.c (gfc_get_intrinsic_for_expr, arg_evaluated_for_scalarization): New. (gfc_walk_elemental_function_args): Add intrinsic procedure as argument. Count arguments. Check arg_evaluated_for_scalarization. * trans-intrinsic.c (gfc_walk_intrinsic_function): Update call. * trans-stmt.c (get_intrinsic_for_code): New. (gfc_trans_call): Update call. gcc/testsuite/ChangeLog: * gfortran.dg/index_5.f90: New.
Diffstat (limited to 'gcc/fortran/trans-decl.c')
-rw-r--r--gcc/fortran/trans-decl.c24
1 files changed, 1 insertions, 23 deletions
diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c
index 49ba906..cb7f684 100644
--- a/gcc/fortran/trans-decl.c
+++ b/gcc/fortran/trans-decl.c
@@ -42,7 +42,6 @@ along with GCC; see the file COPYING3. If not see
#include "trans-types.h"
#include "trans-array.h"
#include "trans-const.h"
-#include "intrinsic.h" /* For gfc_resolve_index_func. */
/* Only for gfc_trans_code. Shouldn't need to include this. */
#include "trans-stmt.h"
#include "gomp-constants.h"
@@ -2267,28 +2266,7 @@ module_sym:
{
/* All specific intrinsics take less than 5 arguments. */
gcc_assert (isym->formal->next->next->next->next == NULL);
- if (isym->resolve.f1m == gfc_resolve_index_func)
- {
- /* gfc_resolve_index_func is special because it takes a
- gfc_actual_arglist instead of individual arguments. */
- gfc_actual_arglist *a, *n;
- int i;
- a = gfc_get_actual_arglist();
- n = a;
-
- for (i = 0; i < 4; i++)
- {
- n->next = gfc_get_actual_arglist();
- n = n->next;
- }
-
- a->expr = &argexpr;
- isym->resolve.f1m (&e, a);
- a->expr = NULL;
- gfc_free_actual_arglist (a);
- }
- else
- isym->resolve.f4 (&e, &argexpr, NULL, NULL, NULL);
+ isym->resolve.f4 (&e, &argexpr, NULL, NULL, NULL);
}
}
}