+2020-02-10 Andrew Benson <abensonca@gmail.com>
+
+ PR fortran/83113
+ * array.c: Do not attempt to set the array spec for a submodule
+ function symbol (as it has already been set in the corresponding
+ module procedure interface).
+ * symbol.c: Do not reject duplicate POINTER, ALLOCATABLE, or
+ DIMENSION attributes in declarations of a submodule function.
+ * gfortran.h: Add a macro that tests for a module procedure in a
+ submodule.
+ * gfortran.dg/pr83113.f90: New test.
+
2020-02-03 Julian Brown <julian@codesourcery.com>
Tobias Burnus <tobias@codesourcery.com>
#include "coretypes.h"
#include "options.h"
#include "gfortran.h"
+#include "parse.h"
#include "match.h"
#include "constructor.h"
return MATCH_ERROR;
}
-
/* Given a symbol and an array specification, modify the symbol to
have that array specification. The error locus is needed in case
something goes wrong. On failure, the caller must free the spec. */
gfc_set_array_spec (gfc_symbol *sym, gfc_array_spec *as, locus *error_loc)
{
int i;
-
+ symbol_attribute *attr;
+
if (as == NULL)
return true;
+ /* If the symbol corresponds to a submodule module procedure the array spec is
+ already set, so do not attempt to set it again here. */
+ attr = &sym->attr;
+ if (gfc_submodule_procedure(attr))
+ return true;
+
if (as->rank
&& !gfc_add_dimension (&sym->attr, sym->name, error_loc))
return false;
match gfc_get_pdt_instance (gfc_actual_arglist *, gfc_symbol **,
gfc_actual_arglist **);
+
+/* Given a symbol, test whether it is a module procedure in a submodule */
+#define gfc_submodule_procedure(attr) \
+ (gfc_state_stack->previous && gfc_state_stack->previous->previous \
+ && gfc_state_stack->previous->previous->state == COMP_SUBMODULE \
+ && attr->module_procedure)
+
/* scanner.c */
void gfc_scanner_done_1 (void);
void gfc_scanner_init_1 (void);
if (check_used (attr, NULL, where))
return false;
- if (attr->allocatable)
+ if (attr->allocatable && ! gfc_submodule_procedure(attr))
{
duplicate_attr ("ALLOCATABLE", where);
return false;
if (check_used (attr, name, where))
return false;
- if (attr->dimension)
+ if (attr->dimension && ! gfc_submodule_procedure(attr))
{
duplicate_attr ("DIMENSION", where);
return false;
return false;
if (attr->pointer && !(attr->if_source == IFSRC_IFBODY
- && !gfc_find_state (COMP_INTERFACE)))
+ && !gfc_find_state (COMP_INTERFACE))
+ && ! gfc_submodule_procedure(attr))
{
duplicate_attr ("POINTER", where);
return false;
--- /dev/null
+! { dg-do compile }
+! PR fortran/83113
+module mm
+ implicit none
+ interface
+ module function c()
+ integer, dimension(2) :: c
+ end function c
+ end interface
+end module mm
+
+submodule (mm) oo
+ implicit none
+contains
+ module function c()
+ integer, dimension(3) :: c
+ end function c
+end submodule oo