]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR fortran/51825 (Fortran runtime error: Cannot match namelist object name)
authorTilo Schwarz <tilo@tilo-schwarz.de>
Wed, 20 Mar 2013 07:56:02 +0000 (07:56 +0000)
committerTobias Burnus <burnus@gcc.gnu.org>
Wed, 20 Mar 2013 07:56:02 +0000 (08:56 +0100)
2013-03-20  Tilo Schwarz  <tilo@tilo-schwarz.de>

        PR libfortran/51825
        * io/list_read.c (nml_read_obj): Don't end the component loop on
        a nested derived type, but continue with the next loop iteration.
        (nml_get_obj_data): Don't move the first_nl pointer further in
        the list if a qualifier was found.

2013-03-20  Tilo Schwarz  <tilo@tilo-schwarz.de>

        PR libfortran/51825
        * gcc/testsuite/gfortran.dg/namelist_77.f90: New.
        * gcc/testsuite/gfortran.dg/namelist_78.f90: New.

From-SVN: r196806

gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/namelist_77.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/namelist_78.f90 [new file with mode: 0644]
libgfortran/ChangeLog
libgfortran/io/list_read.c

index 7fe42de5bf297bae6976c9d82cf8899b1ce0fe93..72f436e78ae485c3cc98113eb8ce81898be9f88c 100644 (file)
@@ -1,3 +1,9 @@
+2013-03-20  Tilo Schwarz  <tilo@tilo-schwarz.de>
+
+       PR libfortran/51825
+       * gfortran.dg/namelist_77.f90: New.
+       * gfortran.dg/namelist_78.f90: New.
+
 2013-03-20  Tilo Schwarz  <tilo@tilo-schwarz.de>
 
        PR libfortran/48618
diff --git a/gcc/testsuite/gfortran.dg/namelist_77.f90 b/gcc/testsuite/gfortran.dg/namelist_77.f90
new file mode 100644 (file)
index 0000000..5cbfe3a
--- /dev/null
@@ -0,0 +1,49 @@
+! { dg-do run }
+!
+! PR libfortran/51825 - Fortran runtime error: Cannot match namelist object name
+! Test case derived from PR.
+
+module local_mod
+
+    type mytype1
+        integer :: int1
+    end type
+
+    type mytype2
+        integer :: n_x       
+        integer :: n_px        
+    end type
+
+    type beam_init_struct
+        character(16) :: chars(1) = ''                                  
+        type (mytype1) dummy
+        type (mytype2) grid(1)      
+    end type
+
+end module
+
+program error_namelist
+
+    use local_mod
+
+    implicit none
+
+    type (beam_init_struct) beam_init
+
+    namelist / error_params / beam_init
+
+    open (10, status='scratch')
+    write (10, '(a)') "&error_params"
+    write (10, '(a)') "  beam_init%chars(1)='JUNK'"
+    write (10, '(a)') "  beam_init%grid(1)%n_x=3"
+    write (10, '(a)') "  beam_init%grid(1)%n_px=2"
+    write (10, '(a)') "/"
+    rewind(10)
+    read(10, nml=error_params)
+    close (10)
+
+    if (beam_init%chars(1) /= 'JUNK') call abort
+    if (beam_init%grid(1)%n_x /= 3) call abort
+    if (beam_init%grid(1)%n_px /= 2) call abort
+
+end program
diff --git a/gcc/testsuite/gfortran.dg/namelist_78.f90 b/gcc/testsuite/gfortran.dg/namelist_78.f90
new file mode 100644 (file)
index 0000000..d4e29ab
--- /dev/null
@@ -0,0 +1,34 @@
+! { dg-do run }
+!
+! PR libfortran/51825
+! Test case regarding namelist problems with derived types
+
+program namelist
+
+    type d1
+        integer :: j = 0
+    end type d1
+
+    type d2
+        type(d1) k
+    end type d2
+
+    type d3
+        type(d2) d(2)
+    end type d3
+
+    type(d3) der
+    namelist /nmlst/ der
+
+    open (10, status='scratch')
+    write (10, '(a)') "&NMLST"
+    write (10, '(a)') " DER%D(1)%K%J = 1,"
+    write (10, '(a)') " DER%D(2)%K%J = 2,"
+    write (10, '(a)') "/"
+    rewind(10)
+    read(10, nml=nmlst)
+    close (10)
+
+    if (der%d(1)%k%j /= 1) call abort
+    if (der%d(2)%k%j /= 2) call abort
+end program namelist
index 31d5b57ef91339790f3f5fc17bd96b916fc2e9bc..877d2d0c95965e622b8cc8f4e0bb43d472d1ebf0 100644 (file)
@@ -1,3 +1,11 @@
+2013-03-20  Tilo Schwarz  <tilo@tilo-schwarz.de>
+
+       PR libfortran/51825
+       * io/list_read.c (nml_read_obj): Don't end the component loop on a
+       nested derived type, but continue with the next loop iteration.
+       (nml_get_obj_data): Don't move the first_nl pointer further in the
+       list if a qualifier was found.
+
 2013-03-20  Tilo Schwarz  <tilo@tilo-schwarz.de>
 
        PR libfortran/48618
index 22125be1afe254458687a93b1eda894674a0a3ba..aa7c8c0d2c1c37cdbc07aff823c5c6bc61ccfe99 100644 (file)
@@ -2578,17 +2578,17 @@ nml_read_obj (st_parameter_dt *dtp, namelist_info * nl, index_type offset,
               since a single object can have multiple reads.  */
            dtp->u.p.expanded_read = 0;
 
-           /* Now loop over the components. Update the component pointer
-              with the return value from nml_write_obj.  This loop jumps
-              past nested derived types by testing if the potential
-              component name contains '%'.  */
+           /* Now loop over the components.  */
 
            for (cmp = nl->next;
                 cmp &&
-                  !strncmp (cmp->var_name, obj_name, obj_name_len) &&
-                  !strchr (cmp->var_name + obj_name_len, '%');
+                  !strncmp (cmp->var_name, obj_name, obj_name_len);
                 cmp = cmp->next)
              {
+               /* Jump over nested derived type by testing if the potential
+                  component name contains '%'.  */
+               if (strchr (cmp->var_name + obj_name_len, '%'))
+                   continue;
 
                if (!nml_read_obj (dtp, cmp, (index_type)(pdata - nl->mem_pos),
                                  pprev_nl, nml_err_msg, nml_err_msg_size,
@@ -2901,7 +2901,8 @@ get_name:
          goto nml_err_ret;
        }
 
-      if (*pprev_nl == NULL || !component_flag)
+      /* Don't move first_nl further in the list if a qualifier was found.  */
+      if ((*pprev_nl == NULL && !qualifier_flag) || !component_flag)
        first_nl = nl;
 
       root_nl = nl;