Hi Steve,

Your patch works as advertised. The second line in the error message
receives the same dg-error line as the first, giving "# of expected passes
6".

I'll push as soon as I get a chance - likely this afternoon.

Thanks!

Paul


On Sat, 12 Jul 2025 at 19:57, Steve Kargl <s...@troutmask.apl.washington.edu>
wrote:

> All, Paul,
>
> In testing Paul's recent addition of support for IMPORT,
> I have uncovered an ICE due to mangled source code.  The
> code leads to a NULL pointer dereference.  The patch that
> follows my .sig fixes the issue.  Note the testcase has one
> FAIL.
>
> % gmake check-fortran RUNTESTFLAGS="dg.exp=import13.f90"
>   ...
> Running /home/kargl/gcc/gcc/gcc/testsuite/gfortran.dg/dg.exp ...
> FAIL: gfortran.dg/import13.f90   -O  (test for excess errors)
>
>                 === gfortran Summary ===
>
> # of expected passes            4
> # of unexpected failures        1
> /home/kargl/gcc/obj/gcc/gfortran  version 16.0.0 20250712 (experimental)
> (GCC)
>
>
> % gfcx -c a.f90
> a.f90:13:20:
>
>     9 |       subroutine bah       ! { dg-error "is already defined at" }
>       |       2~~~~~~~~~~~~~
> ......
>    13 |       subroutine bah
>       |                    1
> Error: Procedure 'bah' at (1) is already defined at (2)
> a.f90:15:71:
>
> I do not remember how to deal with multi-line error messages
> in the dg-error case.  Any guidance?
>
> --
> Steve
>
>
> diff --git a/gcc/fortran/decl.cc b/gcc/fortran/decl.cc
> index 111ebc5f845..af425754d08 100644
> --- a/gcc/fortran/decl.cc
> +++ b/gcc/fortran/decl.cc
> @@ -5272,13 +5272,15 @@ gfc_match_import (void)
>        switch (m)
>         {
>         case MATCH_YES:
> -         if (gfc_current_ns->parent !=  NULL
> +         if (gfc_current_ns->parent != NULL
>               && gfc_find_symbol (name, gfc_current_ns->parent, 1, &sym))
>             {
>                gfc_error ("Type name %qs at %C is ambiguous", name);
>                return MATCH_ERROR;
>             }
> -         else if (!sym && gfc_current_ns->proc_name->ns->parent !=  NULL
> +         else if (!sym
> +                  && gfc_current_ns->proc_name
> +                  && gfc_current_ns->proc_name->ns->parent
>                    && gfc_find_symbol (name,
>
>  gfc_current_ns->proc_name->ns->parent,
>                                        1, &sym))
> @@ -5289,7 +5291,8 @@ gfc_match_import (void)
>
>           if (sym == NULL)
>             {
> -             if (gfc_current_ns->proc_name->attr.if_source ==
> IFSRC_IFBODY)
> +             if (gfc_current_ns->proc_name
> +                 && gfc_current_ns->proc_name->attr.if_source ==
> IFSRC_IFBODY)
>                 {
>                   gfc_error ("Cannot IMPORT %qs from host scoping unit "
>                              "at %C - does not exist.", name);
> diff --git a/gcc/testsuite/gfortran.dg/import13.f90
> b/gcc/testsuite/gfortran.dg/import13.f90
> new file mode 100644
> index 00000000000..2e4470aada2
> --- /dev/null
> +++ b/gcc/testsuite/gfortran.dg/import13.f90
> @@ -0,0 +1,18 @@
> +! { dg-do compile }
> +program foo
> +   implicit none
> +   integer i
> +   i = 42
> +   if (i /= 42) stop 1
> +   call bah
> +   contains
> +      subroutine bah       ! { dg-error "is already defined at" }
> +         i = 43
> +         if (i /= 43) stop 2
> +      end subroutine bah
> +      subroutine bah
> +         ! import statement missing a comma
> +         import none       ! { dg-error "Unexpected IMPORT statement" }
> +         i = 44            ! { dg-error "Unexpected assignment" }
> +      end subroutine bah   ! { dg-error "Expecting END PROGRAM" }
> +end program foo
>

Reply via email to