From: Jerry DeLisle <jvdelisle@charter.net>
To: gfortran <fortran@gcc.gnu.org>
Cc: gcc-patches <gcc-patches@gcc.gnu.org>
Subject: [patch, fortran] PR96686 Namelist group objects shall be defined before appearing in namelist
Date: Tue, 16 Feb 2021 19:02:35 -0800 [thread overview]
Message-ID: <61fc2d13-04fc-0262-578a-b3f48d130589@charter.net> (raw)
[-- Attachment #1: Type: text/plain, Size: 1027 bytes --]
Hi all,
Attached patch adds to checks. In the case of IMPLICIT typing it checks
to see if the objects listed in the NAMELIST have defined types andf if
not, sets them to the default implicit types.
In the case of IMPLICIT NONE, the types are required be declared before
the NAMELIST. If an object type is found to not be declared already,
an error is issued.
One new test case added and one modified to pass.
Regression tested.
OK for trunk?
Regards,
Jerry
fortran: Object types should be declared before use in NAMELIST.
gcc/fortran/ChangeLog:
PR fortran/98686
* match.c (gfc_match_namelist): Add checks for IMPLICIT NONE and
whether the type for each namelist object has been defined before
the namelist declaration. For IMPLICIT, set the types so that
any subsequent use of objects will have their types confirmed.
gcc/testsuite/ChangeLog:
PR fortran/98686
* gfortran.dg/namelist_4.f90: Modify.
* gfortran.dg/namelist_98.f90: New test.
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: pr98686.diff --]
[-- Type: text/x-patch; name="pr98686.diff", Size: 2275 bytes --]
diff --git a/gcc/fortran/match.c b/gcc/fortran/match.c
index 2df6191d7e6..3a06f308812 100644
--- a/gcc/fortran/match.c
+++ b/gcc/fortran/match.c
@@ -5536,6 +5536,27 @@ gfc_match_namelist (void)
if (m == MATCH_ERROR)
goto error;
+ if (!gfc_current_ns->seen_implicit_none)
+ {
+ /* If the type is not set already, we set it here to the
+ implicit default type. It is not allowed to set it
+ later to any other type. */
+ if (sym->ts.type == BT_UNKNOWN)
+ gfc_set_default_type (sym, 0, gfc_current_ns);
+ }
+ else
+ {
+ /* It is required that members of a namelist be declared
+ before the namelist. We check this by checking if the
+ symbol has a defined type for IMPLICIT NONE. */
+ if (sym->ts.type == BT_UNKNOWN)
+ {
+ gfc_error ("Symbol %qs in namelist %qs at %C must be "
+ "declared before the namelist is declared.",
+ sym->name, group_name->name);
+ gfc_error_check ();
+ }
+ }
if (sym->attr.in_namelist == 0
&& !gfc_add_in_namelist (&sym->attr, sym->name, NULL))
goto error;
diff --git a/gcc/testsuite/gfortran.dg/namelist_4.f90 b/gcc/testsuite/gfortran.dg/namelist_4.f90
index 538bceaa4b6..4e021253f01 100644
--- a/gcc/testsuite/gfortran.dg/namelist_4.f90
+++ b/gcc/testsuite/gfortran.dg/namelist_4.f90
@@ -27,14 +27,14 @@ END module M1
program P1
CONTAINS
! This has the additional wrinkle of a reference to the object.
+ INTEGER FUNCTION F2()
+ F2=1
+ END FUNCTION
INTEGER FUNCTION F1()
NAMELIST /NML3/ F2 ! { dg-error "PROCEDURE attribute conflicts" }
! Used to ICE here
- f2 = 1 ! { dg-error "is not a VALUE" }
+ f2 = 1 ! { dg-error "is not a variable" }
F1=1
END FUNCTION
- INTEGER FUNCTION F2()
- F2=1
- END FUNCTION
END
diff --git a/gcc/testsuite/gfortran.dg/namelist_98.f90 b/gcc/testsuite/gfortran.dg/namelist_98.f90
new file mode 100644
index 00000000000..19a7e869f92
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/namelist_98.f90
@@ -0,0 +1,11 @@
+! { dg-do compile }
+! pr98686
+ implicit none
+ real :: x, m
+ namelist /NML/ x, m, q ! { dg-error "must be declared before the namelist*" }
+ integer :: q
+ x = 1.0
+ m = 2.0
+ q = 3
+ write(*, nml=NML)
+end
next reply other threads:[~2021-02-17 3:02 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-02-17 3:02 Jerry DeLisle [this message]
2021-02-17 9:19 ` Tobias Burnus
2021-02-19 15:58 ` Jerry DeLisle
2021-02-19 16:42 ` Tobias Burnus
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=61fc2d13-04fc-0262-578a-b3f48d130589@charter.net \
--to=jvdelisle@charter.net \
--cc=fortran@gcc.gnu.org \
--cc=gcc-patches@gcc.gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).