[PATCH] PR fortran/90166 -- check F2018:C1547

Steve Kargl sgk@troutmask.apl.washington.edu
Sat Apr 20 19:51:00 GMT 2019


On Sat, Apr 20, 2019 at 09:57:34AM -0700, Steve Kargl wrote:
> On Sat, Apr 20, 2019 at 05:38:34PM +0200, Dominique d'Humières wrote:
> > 
> > The changes in gfortran.dg/submodule_22.f08 look weird:
> > (1) is the error in the CONTAINS of a SUBMODULE invalid?
> > From
> > 
> > 	* decl.c (in_module_or_interface): New function to check that the
> > 	current state is in a module, submodule, or interface.
> > 
> > it should not, should it?
> > 
> > (2) left over?
> > +
> > +found outside of a module
> > 
> 
> It's a sequence of run-on errors.  The first statement in
> the original code is rejected with a syntax error.  When
> that happenrs gfc_current_state() is not COMP_MODULE, 
> COMP_SUBMODULE, or COMP_INTERFENCE.  The next line has 
> the MODULE prefix, and the new check finds that it 
> occurs outside of MODULE, SUBMODULE, and INTERFERENCE,
> so a new error occurs.  The remaining errors are then 
> found to be bogus assignments.  My conclusion, if the
> first error is fixed, then the run-on errors don't
> happen.
> 
> If you rather fix the problems with '! dg-options "-fmax-errors=1"'
> I'm fine with that.
> 

Just to follow up.  If you use a debugger, one finds

(gdb) b decl.c:6130
(gdb) c
Continuing.
/safe/sgk/gcc/gccx/gcc/testsuite/gfortran.dg/submodule_22.f08:41:23:

   41 | submodule (mtop:submod:subsubmod) subsubsubmod ! { dg-error "Syntax error in SUBMODULE statement" }
      |                       1
Error: Syntax error in SUBMODULE statement at (1)

This is the original error.  Note it is a syntax error.  gfortran
does nothing with this statement

(gdb) c

we reach the point where the new error will be issued.

(gdb) p gfc_state_stack->state
$2 = COMP_CONTAINS

This is the CONTAINS in the submodule.

(gdb) p gfc_state_stack->previous->state
$3 = COMP_PROGRAM

This state fine here, because the syntax rejects the submodule
statement.  So, the code looks like (from memory...)

  [program main implicitly included here]
  contains
  module subroutine foo
  x = 2
  y = 3
  end submodule

The module prefix cannot appear in the subroutine statement. The
new error rejects it.  So, now you have 2 assignments in after a
contains statement.  The program now looks like

  contains
  x = 2
  y = 3 
  end submodule

Well, you cannot do an assignment, so two additional error messages
are emitted.  So, now we come to a program of the form


  [program main implicitly included here]
  end submodule

gfortran is expecting an END [PROGRAM] statement.

Is this clear or do you want me to withdrawal the patch?

-- 
Steve



More information about the Gcc-patches mailing list