public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug fortran/101632] New: NON_RECURSIVE procedure prefix is unsupported. F2018 defaults to recursive procedures.
@ 2021-07-26 19:11 kargl at gcc dot gnu.org
2021-07-26 19:14 ` [Bug fortran/101632] " kargl at gcc dot gnu.org
` (7 more replies)
0 siblings, 8 replies; 9+ messages in thread
From: kargl at gcc dot gnu.org @ 2021-07-26 19:11 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101632
Bug ID: 101632
Summary: NON_RECURSIVE procedure prefix is unsupported. F2018
defaults to recursive procedures.
Product: gcc
Version: 12.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: fortran
Assignee: unassigned at gcc dot gnu.org
Reporter: kargl at gcc dot gnu.org
Target Milestone: ---
^ permalink raw reply [flat|nested] 9+ messages in thread
* [Bug fortran/101632] NON_RECURSIVE procedure prefix is unsupported. F2018 defaults to recursive procedures.
2021-07-26 19:11 [Bug fortran/101632] New: NON_RECURSIVE procedure prefix is unsupported. F2018 defaults to recursive procedures kargl at gcc dot gnu.org
@ 2021-07-26 19:14 ` kargl at gcc dot gnu.org
2021-07-26 19:15 ` kargl at gcc dot gnu.org
` (6 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: kargl at gcc dot gnu.org @ 2021-07-26 19:14 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101632
--- Comment #1 from kargl at gcc dot gnu.org ---
F2018 introduced the NON_RECURSIVE prefix for procedures and also made
procedures recursive by default. This code is conforming to F2018.
module bah
contains
!
! non_recursive is F2018.
!
non_recursive function foo(i) result(k)
integer k
integer, intent(in) :: i
k = i
end function foo
!
! Recursive has been around for awhile, and still in F2018
!
recursive function fib1(i) result(k)
integer k
integer, intent(in) :: i
if (i <= 1) then
k = i
else
k = fib1(i-1) + fib1(i - 2)
end if
end function fib1
!
! This is recursive by default.
!
function fib2(i) result(k)
integer k
integer, intent(in) :: i
if (i <= 1) then
k = i
else
k = fib2(i-1) + fib2(i - 2)
end if
end function fib2
end module bah
program bar
use bah
integer i
i = 9
print *, fib1(i), fib2(i)
end program bar
^ permalink raw reply [flat|nested] 9+ messages in thread
* [Bug fortran/101632] NON_RECURSIVE procedure prefix is unsupported. F2018 defaults to recursive procedures.
2021-07-26 19:11 [Bug fortran/101632] New: NON_RECURSIVE procedure prefix is unsupported. F2018 defaults to recursive procedures kargl at gcc dot gnu.org
2021-07-26 19:14 ` [Bug fortran/101632] " kargl at gcc dot gnu.org
@ 2021-07-26 19:15 ` kargl at gcc dot gnu.org
2021-07-28 5:08 ` sgk at troutmask dot apl.washington.edu
` (5 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: kargl at gcc dot gnu.org @ 2021-07-26 19:15 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101632
--- Comment #2 from kargl at gcc dot gnu.org ---
Created attachment 51207
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=51207&action=edit
Diff that implements F2018 NON_RECURSIVE and makes things recursive by default.
^ permalink raw reply [flat|nested] 9+ messages in thread
* [Bug fortran/101632] NON_RECURSIVE procedure prefix is unsupported. F2018 defaults to recursive procedures.
2021-07-26 19:11 [Bug fortran/101632] New: NON_RECURSIVE procedure prefix is unsupported. F2018 defaults to recursive procedures kargl at gcc dot gnu.org
2021-07-26 19:14 ` [Bug fortran/101632] " kargl at gcc dot gnu.org
2021-07-26 19:15 ` kargl at gcc dot gnu.org
@ 2021-07-28 5:08 ` sgk at troutmask dot apl.washington.edu
2021-08-03 14:37 ` jb at gcc dot gnu.org
` (4 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: sgk at troutmask dot apl.washington.edu @ 2021-07-28 5:08 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101632
--- Comment #3 from Steve Kargl <sgk at troutmask dot apl.washington.edu> ---
On Mon, Jul 26, 2021 at 07:15:53PM +0000, kargl at gcc dot gnu.org wrote:
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101632
>
> --- Comment #2 from kargl at gcc dot gnu.org ---
> Created attachment 51207
> --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=51207&action=edit
> Diff that implements F2018 NON_RECURSIVE and makes things recursive by default.
>
Better patch.
diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c
index 413c7a75e0c..35ab2655a3b 100644
--- a/gcc/fortran/decl.c
+++ b/gcc/fortran/decl.c
@@ -6353,6 +6353,17 @@ gfc_match_prefix (gfc_typespec *ts)
found_prefix = true;
}
+ if (gfc_match ("non_recursive% ") == MATCH_YES)
+ {
+ if (!gfc_notify_std (GFC_STD_F2018, "NON_RECURSIVE procedure at %C"))
+ goto error;
+
+ if (!gfc_add_non_recursive (¤t_attr, NULL))
+ goto error;
+
+ found_prefix = true;
+ }
+
/* IMPURE is a somewhat special case, as it needs not set an actual
attribute but rather only prevents ELEMENTAL routines from being
automatically PURE. */
@@ -6381,6 +6392,15 @@ gfc_match_prefix (gfc_typespec *ts)
goto error;
}
+ /* If neither NON_RECURSIVE nor RECURSIVE has been seen and the F2018
+ standard is in play, then mark the the procedure as recursive. */
+ if ((gfc_option.allow_std & GFC_STD_F2018)
+ && !current_attr.non_recursive && !current_attr.recursive)
+ {
+ if (!gfc_add_recursive (¤t_attr, NULL))
+ goto error;
+ }
+
/* At this point, the next item is not a prefix. */
gcc_assert (gfc_matching_prefix);
@@ -6447,6 +6467,9 @@ copy_prefix (symbol_attribute *dest, locus *where)
if (current_attr.recursive && !gfc_add_recursive (dest, where))
return false;
+ if (current_attr.non_recursive && !gfc_add_non_recursive (dest, where))
+ return false;
+
return true;
}
diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h
index f4a50d74f14..72ed9c6ee3d 100644
--- a/gcc/fortran/gfortran.h
+++ b/gcc/fortran/gfortran.h
@@ -842,7 +842,7 @@ typedef struct
unsigned is_iso_c:1; /* Symbol is from iso_c_binding. */
/* Function/subroutine attributes */
- unsigned sequence:1, elemental:1, pure:1, recursive:1;
+ unsigned sequence:1, elemental:1, pure:1, recursive:1, non_recursive:1;
unsigned unmaskable:1, masked:1, contained:1, mod_proc:1, abstract:1;
/* Set if this is a module function or subroutine. Note that it is an
@@ -3223,6 +3223,7 @@ bool gfc_add_sequence (symbol_attribute *, const char *,
locus *);
bool gfc_add_elemental (symbol_attribute *, locus *);
bool gfc_add_pure (symbol_attribute *, locus *);
bool gfc_add_recursive (symbol_attribute *, locus *);
+bool gfc_add_non_recursive (symbol_attribute *, locus *);
bool gfc_add_function (symbol_attribute *, const char *, locus *);
bool gfc_add_subroutine (symbol_attribute *, const char *, locus *);
bool gfc_add_volatile (symbol_attribute *, const char *, locus *);
diff --git a/gcc/fortran/symbol.c b/gcc/fortran/symbol.c
index 6d61bf4982b..f456a02847c 100644
--- a/gcc/fortran/symbol.c
+++ b/gcc/fortran/symbol.c
@@ -410,24 +410,24 @@ gfc_check_function_type (gfc_namespace *ns)
bool
gfc_check_conflict (symbol_attribute *attr, const char *name, locus *where)
{
- static const char *dummy = "DUMMY", *save = "SAVE", *pointer = "POINTER",
- *target = "TARGET", *external = "EXTERNAL", *intent = "INTENT",
- *intent_in = "INTENT(IN)", *intrinsic = "INTRINSIC",
- *intent_out = "INTENT(OUT)", *intent_inout = "INTENT(INOUT)",
- *allocatable = "ALLOCATABLE", *elemental = "ELEMENTAL",
- *privat = "PRIVATE", *recursive = "RECURSIVE",
- *in_common = "COMMON", *result = "RESULT", *in_namelist = "NAMELIST",
- *publik = "PUBLIC", *optional = "OPTIONAL", *entry = "ENTRY",
- *function = "FUNCTION", *subroutine = "SUBROUTINE",
- *dimension = "DIMENSION", *in_equivalence = "EQUIVALENCE",
- *use_assoc = "USE ASSOCIATED", *cray_pointer = "CRAY POINTER",
- *cray_pointee = "CRAY POINTEE", *data = "DATA", *value = "VALUE",
- *volatile_ = "VOLATILE", *is_protected = "PROTECTED",
- *is_bind_c = "BIND(C)", *procedure = "PROCEDURE",
- *proc_pointer = "PROCEDURE POINTER", *abstract = "ABSTRACT",
- *asynchronous = "ASYNCHRONOUS", *codimension = "CODIMENSION",
- *contiguous = "CONTIGUOUS", *generic = "GENERIC", *automatic =
"AUTOMATIC",
- *pdt_len = "LEN", *pdt_kind = "KIND";
+ static const char *abstract = "ABSTRACT", *allocatable = "ALLOCATABLE",
+ *asynchronous = "ASYNCHRONOUS", *automatic = "AUTOMATIC",
+ *codimension = "CODIMENSION", *contiguous = "CONTIGUOUS",
+ *cray_pointee = "CRAYPOINTEE", *cray_pointer = "CRAYPOINTER",
+ *data = "DATA", *dimension = "DIMENSION", *dummy = "DUMMY",
+ *elemental = "ELEMENTAL", *entry = "ENTRY", *external = "EXTERNAL",
+ *function = "FUNCTION", *generic = "GENERIC", *in_common = "COMMON",
+ *in_equivalence = "EQUIVALENCE", *in_namelist = "NAMELIST",
+ *intent = "INTENT", *intent_in = "INTENT(IN)",
+ *intent_inout = "INTENT(INOUT)", *intent_out = "INTENT(OUT)",
+ *intrinsic = "INTRINSIC", *is_bind_c = "BIND(C)",
+ *is_protected = "PROTECTED", *non_recursive = "NON_RECURSIVE",
+ *optional = "OPTIONAL", *pdt_kind = "KIND", *pdt_len="LEN",
+ *pointer="POINTER", *privat="PRIVATE", *proc_pointer="PROCEDUREPOINTER",
+ *procedure="PROCEDURE", *publik="PUBLIC", *recursive="RECURSIVE",
+ *result="RESULT", *save="SAVE", *subroutine="SUBROUTINE",
+ *target="TARGET", *use_assoc="USEASSOCIATED", *value="VALUE",
+ *volatile_="VOLATILE";
static const char *threadprivate = "THREADPRIVATE";
static const char *omp_declare_target = "OMP DECLARE TARGET";
static const char *omp_declare_target_link = "OMP DECLARE TARGET LINK";
@@ -570,6 +570,7 @@ gfc_check_conflict (symbol_attribute *attr, const char
*name, locus *where)
conf_std (allocatable, function, GFC_STD_F2003);
conf_std (allocatable, result, GFC_STD_F2003);
conf_std (elemental, recursive, GFC_STD_F2018);
+ conf (non_recursive, recursive);
conf (in_common, dummy);
conf (in_common, allocatable);
@@ -1650,6 +1651,24 @@ gfc_add_recursive (symbol_attribute *attr, locus *where)
}
+bool
+gfc_add_non_recursive (symbol_attribute *attr, locus *where)
+{
+
+ if (check_used (attr, NULL, where))
+ return false;
+
+ if (attr->non_recursive)
+ {
+ duplicate_attr ("NON_RECURSIVE", where);
+ return false;
+ }
+
+ attr->non_recursive = 1;
+ return gfc_check_conflict (attr, NULL, where);
+}
+
+
bool
gfc_add_entry (symbol_attribute *attr, const char *name, locus *where)
{
@@ -2148,6 +2167,8 @@ gfc_copy_attr (symbol_attribute *dest, symbol_attribute
*src, locus *where)
goto fail;
if (src->recursive && !gfc_add_recursive (dest, where))
goto fail;
+ if (src->non_recursive && !gfc_add_non_recursive (dest, where))
+ goto fail;
if (src->flavor != FL_UNKNOWN
&& !gfc_add_flavor (dest, src->flavor, NULL, where))
^ permalink raw reply [flat|nested] 9+ messages in thread
* [Bug fortran/101632] NON_RECURSIVE procedure prefix is unsupported. F2018 defaults to recursive procedures.
2021-07-26 19:11 [Bug fortran/101632] New: NON_RECURSIVE procedure prefix is unsupported. F2018 defaults to recursive procedures kargl at gcc dot gnu.org
` (2 preceding siblings ...)
2021-07-28 5:08 ` sgk at troutmask dot apl.washington.edu
@ 2021-08-03 14:37 ` jb at gcc dot gnu.org
2021-08-03 15:14 ` sgk at troutmask dot apl.washington.edu
` (3 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: jb at gcc dot gnu.org @ 2021-08-03 14:37 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101632
Janne Blomqvist <jb at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |jb at gcc dot gnu.org
Depends on| |91413
--- Comment #4 from Janne Blomqvist <jb at gcc dot gnu.org> ---
In PR91413 we discussed the issue of stack overflows if recursive is made the
default. Some decision and solution on that issue is needed.
Referenced Bugs:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91413
[Bug 91413] [F2018]: Procedures are recursive by default; switching from stack
to static allocation is not safe
^ permalink raw reply [flat|nested] 9+ messages in thread
* [Bug fortran/101632] NON_RECURSIVE procedure prefix is unsupported. F2018 defaults to recursive procedures.
2021-07-26 19:11 [Bug fortran/101632] New: NON_RECURSIVE procedure prefix is unsupported. F2018 defaults to recursive procedures kargl at gcc dot gnu.org
` (3 preceding siblings ...)
2021-08-03 14:37 ` jb at gcc dot gnu.org
@ 2021-08-03 15:14 ` sgk at troutmask dot apl.washington.edu
2021-11-06 21:09 ` anlauf at gcc dot gnu.org
` (2 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: sgk at troutmask dot apl.washington.edu @ 2021-08-03 15:14 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101632
--- Comment #5 from Steve Kargl <sgk at troutmask dot apl.washington.edu> ---
On Tue, Aug 03, 2021 at 02:37:40PM +0000, jb at gcc dot gnu.org wrote:
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101632
>
> Janne Blomqvist <jb at gcc dot gnu.org> changed:
>
> What |Removed |Added
> ----------------------------------------------------------------------------
> CC| |jb at gcc dot gnu.org
> Depends on| |91413
>
> --- Comment #4 from Janne Blomqvist <jb at gcc dot gnu.org> ---
> In PR91413 we discussed the issue of stack overflows if recursive is made the
> default. Some decision and solution on that issue is needed.
>
> Referenced Bugs:
>
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91413
> [Bug 91413] [F2018]: Procedures are recursive by default; switching from stack
> to static allocation is not safe
Hi Janne, It's been awhile!
I compiled an older version of the polyhedron testsuite.
I did not see any impact while running the tests.
Perhaps, Polyhedron does not contain a usage pattern
that would cause a stack issue. I did run the test
with my normal user privilege
% limits | grep stack
stacksize 524288 kB
Perhaps, I should have limited the stack.
Note, the patch does allow gfortran to compile
standard conforming Fortran in that it will
now allow a NON_RECURSIVE prefix. We could disable
the actual setting of the recursive attribute
until someone comes up with a deeper analysis of
the handling of the stack. I suspect most current
code does not use recursion unless RECURSIVE is
explicitly used
^ permalink raw reply [flat|nested] 9+ messages in thread
* [Bug fortran/101632] NON_RECURSIVE procedure prefix is unsupported. F2018 defaults to recursive procedures.
2021-07-26 19:11 [Bug fortran/101632] New: NON_RECURSIVE procedure prefix is unsupported. F2018 defaults to recursive procedures kargl at gcc dot gnu.org
` (4 preceding siblings ...)
2021-08-03 15:14 ` sgk at troutmask dot apl.washington.edu
@ 2021-11-06 21:09 ` anlauf at gcc dot gnu.org
2021-12-06 20:47 ` anlauf at gcc dot gnu.org
2022-04-19 15:53 ` everythingfunctional at protonmail dot com
7 siblings, 0 replies; 9+ messages in thread
From: anlauf at gcc dot gnu.org @ 2021-11-06 21:09 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101632
anlauf at gcc dot gnu.org changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |anlauf at gcc dot gnu.org
--- Comment #6 from anlauf at gcc dot gnu.org ---
As a first step we could just parse and accept the attribute.
^ permalink raw reply [flat|nested] 9+ messages in thread
* [Bug fortran/101632] NON_RECURSIVE procedure prefix is unsupported. F2018 defaults to recursive procedures.
2021-07-26 19:11 [Bug fortran/101632] New: NON_RECURSIVE procedure prefix is unsupported. F2018 defaults to recursive procedures kargl at gcc dot gnu.org
` (5 preceding siblings ...)
2021-11-06 21:09 ` anlauf at gcc dot gnu.org
@ 2021-12-06 20:47 ` anlauf at gcc dot gnu.org
2022-04-19 15:53 ` everythingfunctional at protonmail dot com
7 siblings, 0 replies; 9+ messages in thread
From: anlauf at gcc dot gnu.org @ 2021-12-06 20:47 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101632
anlauf at gcc dot gnu.org changed:
What |Removed |Added
----------------------------------------------------------------------------
Last reconfirmed| |2021-12-06
Status|UNCONFIRMED |NEW
Ever confirmed|0 |1
--- Comment #7 from anlauf at gcc dot gnu.org ---
(In reply to Steve Kargl from comment #3)
> Better patch.
That patch produces many regressions in the test suite. Seems we're not ready
yet for RECURSIVE as the default.
Removing or commenting out the hunk
+ /* If neither NON_RECURSIVE nor RECURSIVE has been seen and the F2018
+ standard is in play, then mark the the procedure as recursive. */
+ if ((gfc_option.allow_std & GFC_STD_F2018)
+ && !current_attr.non_recursive && !current_attr.recursive)
+ {
+ if (!gfc_add_recursive (¤t_attr, NULL))
+ goto error;
+ }
+
allows at least parsing of NON_RECURSIVE, while having no effect otherwise.
Still lacking: handling of NON_RECURSIVE in module.c .
^ permalink raw reply [flat|nested] 9+ messages in thread
* [Bug fortran/101632] NON_RECURSIVE procedure prefix is unsupported. F2018 defaults to recursive procedures.
2021-07-26 19:11 [Bug fortran/101632] New: NON_RECURSIVE procedure prefix is unsupported. F2018 defaults to recursive procedures kargl at gcc dot gnu.org
` (6 preceding siblings ...)
2021-12-06 20:47 ` anlauf at gcc dot gnu.org
@ 2022-04-19 15:53 ` everythingfunctional at protonmail dot com
7 siblings, 0 replies; 9+ messages in thread
From: everythingfunctional at protonmail dot com @ 2022-04-19 15:53 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101632
Brad Richardson <everythingfunctional at protonmail dot com> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |everythingfunctional@proton
| |mail.com
--- Comment #8 from Brad Richardson <everythingfunctional at protonmail dot com> ---
*** Bug 105309 has been marked as a duplicate of this bug. ***
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2022-04-19 15:53 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-07-26 19:11 [Bug fortran/101632] New: NON_RECURSIVE procedure prefix is unsupported. F2018 defaults to recursive procedures kargl at gcc dot gnu.org
2021-07-26 19:14 ` [Bug fortran/101632] " kargl at gcc dot gnu.org
2021-07-26 19:15 ` kargl at gcc dot gnu.org
2021-07-28 5:08 ` sgk at troutmask dot apl.washington.edu
2021-08-03 14:37 ` jb at gcc dot gnu.org
2021-08-03 15:14 ` sgk at troutmask dot apl.washington.edu
2021-11-06 21:09 ` anlauf at gcc dot gnu.org
2021-12-06 20:47 ` anlauf at gcc dot gnu.org
2022-04-19 15:53 ` everythingfunctional at protonmail dot com
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).