https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99368

kargl at gcc dot gnu.org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |kargl at gcc dot gnu.org
           Priority|P3                          |P4

--- Comment #2 from kargl at gcc dot gnu.org ---
% gfc -c z1.f90

    2 |    type y
      |         1
......
    7 |       namelist /x/ y
      |                    2
Error: Derived type 'y' at (1) conflicts with namelist object 'y' at (2)

diff --git a/gcc/fortran/match.c b/gcc/fortran/match.c
index d148de3e3b5..6bde5707926 100644
--- a/gcc/fortran/match.c
+++ b/gcc/fortran/match.c
@@ -5551,10 +5582,32 @@ gfc_match_namelist (void)
                  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);
+               {
+                 /* Before the symbol is given an implicit type, check to
+                    see if the symbol is already available in the namespace,
+                    possibly through host association.  Importantly, the
+                    symbol may be a user defined type.  */
+
+                 gfc_symbol *tmp;
+
+                 gfc_find_symbol (sym->name, NULL, 1, &tmp);
+                 if (tmp
+                     && tmp->attr.generic
+                     && (tmp = gfc_find_dt_in_generic (tmp)))
+                   {
+                     if (tmp->attr.flavor == FL_DERIVED)
+                       {
+                         gfc_error ("Derived type %qs at %L conflicts with "
+                                    "namelist object %qs at %C", 
+                                    tmp->name, &tmp->declared_at, sym->name);
+                         goto error;
+                       }
+                   }
+
+                 /* Set type of the symbol to its 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))

Reply via email to