fortran: Object types should be declared before use in NAMELIST.
authorJerry DeLisle <jvdelisle@gcc.gnu.org>
Fri, 19 Feb 2021 20:47:54 +0000 (12:47 -0800)
committerJerry DeLisle <jvdelisle@gcc.gnu.org>
Fri, 19 Feb 2021 20:47:54 +0000 (12:47 -0800)
gcc/fortran/ChangeLog:

PR fortran/98686
* match.c (gfc_match_namelist): If BT_UNKNOWN, check for
IMPLICIT NONE and and issue an error, otherwise set the type
to its IMPLICIT type so that any subsequent use of objects will
will confirm their types.

gcc/testsuite/ChangeLog:

PR fortran/98686
* gfortran.dg/namelist_4.f90: Modify.
* gfortran.dg/namelist_98.f90: New test.

gcc/fortran/match.c
gcc/testsuite/gfortran.dg/namelist_4.f90
gcc/testsuite/gfortran.dg/namelist_98.f90 [new file with mode: 0644]

index 2df6191d7e6809f4d3d53f151ff6dc2a43fbe02f..4d5890fd52329d523b4c1d32322caf86c3e97138 100644 (file)
@@ -5536,6 +5536,24 @@ gfc_match_namelist (void)
          if (m == MATCH_ERROR)
            goto error;
 
+         if (sym->ts.type == BT_UNKNOWN)
+           {
+             if (gfc_current_ns->seen_implicit_none)
+               {
+                 /* 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.  */
+                 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 ();
+               }
+             else
+               /* 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.  */
+               gfc_set_default_type (sym, 0, gfc_current_ns);
+           }
          if (sym->attr.in_namelist == 0
              && !gfc_add_in_namelist (&sym->attr, sym->name, NULL))
            goto error;
index 538bceaa4b6160b739954eaa6268a0c00c2ae3c8..e6681fd3b554207a0710c127d0750211b3df8810 100644 (file)
@@ -23,12 +23,13 @@ CONTAINS
     G3=1\r
   END FUNCTION\r
 END module M1\r
+\r
 program P1\r
+implicit none\r
 CONTAINS\r
 ! This has the additional wrinkle of a reference to the object.\r
   INTEGER FUNCTION F1()\r
-    NAMELIST /NML3/ F2 ! { dg-error "PROCEDURE attribute conflicts" }
+    NAMELIST /NML3/ F2 ! { dg-error "PROCEDURE attribute conflicts" }\r
 ! Used to ICE here\r
     f2 = 1             ! { dg-error "is not a VALUE" }\r
     F1=1\r
@@ -36,5 +37,5 @@ CONTAINS
   INTEGER FUNCTION F2()\r
     F2=1\r
   END FUNCTION\r
-END
+END\r
 \r
diff --git a/gcc/testsuite/gfortran.dg/namelist_98.f90 b/gcc/testsuite/gfortran.dg/namelist_98.f90
new file mode 100644 (file)
index 0000000..19a7e86
--- /dev/null
@@ -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