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

2019-04-22 Thread Dominique d'Humières



> Le 21 avr. 2019 à 18:02, Steve Kargl  a 
> écrit :
> 
> On Sat, Apr 20, 2019 at 09:51:11PM +0200, Dominique d'Humières wrote:
>> OK I missed the previous error. However I am still puzzled by (2):
>> 
>> +
>> +found outside of a module
>> 
> 
> Why are you puzzled?  Did you read the patch?  

I read

Index: gcc/testsuite/gfortran.dg/submodule_22.f08
===
--- gcc/testsuite/gfortran.dg/submodule_22.f08  (revision 270181)
+++ gcc/testsuite/gfortran.dg/submodule_22.f08  (working copy)
@@ -40,8 +40,10 @@ end
 
 submodule (mtop:submod:subsubmod) subsubsubmod ! { dg-error "Syntax error in 
SUBMODULE statement" }
 contains
-  module subroutine sub3
-r = 2.0
-s = 2.0
-  end subroutine sub3
+  module subroutine sub3  ! { dg-error "found outside of a module" }
+r = 2.0   ! { dg-error "Unexpected assignment" }
+s = 2.0   ! { dg-error "Unexpected assignment" }
+  end subroutine sub3 ! { dg-error "Expecting END PROGRAM statement" }
 end
+
+found outside of a module
 ^ I cannot relate this to any dejagnu command

Dominique

> The
> entire error message is 
> 
> +   gfc_error ("MODULE prefix at %C found outside of a module, "
> +"submodule, or interface");
> 
> In 
> 
>   program foo
> contains
> module subroutine foo
> end subroutine foo
>   end program foo
> 
> The "MODULE prefix" attached to "subroutine foo" is
> found outside of a module, a submodule, or interface.
> 
> -- 
> Steve



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

2019-04-21 Thread Steve Kargl
On Sat, Apr 20, 2019 at 09:51:11PM +0200, Dominique d'Humières wrote:
> OK I missed the previous error. However I am still puzzled by (2):
> 
> +
> +found outside of a module
> 

Why are you puzzled?  Did you read the patch?  The
entire error message is 

+   gfc_error ("MODULE prefix at %C found outside of a module, "
+"submodule, or interface");

In 

   program foo
 contains
 module subroutine foo
 end subroutine foo
   end program foo

The "MODULE prefix" attached to "subroutine foo" is
found outside of a module, a submodule, or interface.

-- 
Steve


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

2019-04-20 Thread Dominique d'Humières
OK I missed the previous error. However I am still puzzled by (2):

+
+found outside of a module

Dominique

> Le 20 avr. 2019 à 21:18, Steve Kargl  a 
> écrit :
> 
> 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



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

2019-04-20 Thread Steve Kargl
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


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

2019-04-20 Thread Paul Richard Thomas
It looks good to me, modulo Dominique's query. OK for trunk (note from
Richi - still aiming for zero P1 bugs so you're good to go).

Thanks

Paul


On Fri, 19 Apr 2019 at 22:44, Steve Kargl
 wrote:
>
> The attached patch fixes PR fortran/91066.  The original
> code was feeding a nonsense string of tokens to the
> assembler causing it to toss its cookies.  It turns out
> that gfortran was not enforcing the constraint C1547
> from Fortran 2018.  The attached patch now performs
> that check.  Regression tested on x86_64-*-freebsd.
> OK to commit?
>
> 2019-04-19  Steven G. Kargl  
>
> PR fortran/90166
> * decl.c (in_module_or_interface): New function to check that the
> current state is in a module, submodule, or interface.
> (gfc_match_prefix): Use it.
>
> PR fortran/90166
> * gfortran.dg/submodule_22.f08: Add additional dg-error comments.
>
> --
> Steve



--
"If you can't explain it simply, you don't understand it well enough"
- Albert Einstein


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

2019-04-20 Thread Steve Kargl
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.

-- 
Steve


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

2019-04-20 Thread Dominique d'Humières
Hi Steve,

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

TIA

Dominique



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

2019-04-19 Thread Steve Kargl
The attached patch fixes PR fortran/91066.  The original 
code was feeding a nonsense string of tokens to the
assembler causing it to toss its cookies.  It turns out
that gfortran was not enforcing the constraint C1547
from Fortran 2018.  The attached patch now performs 
that check.  Regression tested on x86_64-*-freebsd.
OK to commit?

2019-04-19  Steven G. Kargl  

PR fortran/90166
* decl.c (in_module_or_interface): New function to check that the
current state is in a module, submodule, or interface.
(gfc_match_prefix): Use it.

PR fortran/90166
* gfortran.dg/submodule_22.f08: Add additional dg-error comments.

-- 
Steve
Index: gcc/fortran/decl.c
===
--- gcc/fortran/decl.c	(revision 270181)
+++ gcc/fortran/decl.c	(working copy)
@@ -6070,7 +6070,29 @@ cleanup:
   return m;
 }
 
+static bool
+in_module_or_interface(void)
+{
+  if (gfc_current_state () == COMP_MODULE
+  || gfc_current_state () == COMP_SUBMODULE 
+  || gfc_current_state () == COMP_INTERFACE)
+return true;
 
+  if (gfc_state_stack->state == COMP_CONTAINS
+  || gfc_state_stack->state == COMP_FUNCTION
+  || gfc_state_stack->state == COMP_SUBROUTINE)
+{
+  gfc_state_data *p;
+  for (p = gfc_state_stack->previous; p ; p = p->previous)
+	{
+	  if (p->state == COMP_MODULE || p->state == COMP_SUBMODULE 
+	  || p->state == COMP_INTERFACE)
+	return true;
+	}
+}
+return false;
+}
+
 /* Match a prefix associated with a function or subroutine
declaration.  If the typespec pointer is nonnull, then a typespec
can be matched.  Note that if nothing matches, MATCH_YES is
@@ -6102,6 +6124,13 @@ gfc_match_prefix (gfc_typespec *ts)
 	{
 	  if (!gfc_notify_std (GFC_STD_F2008, "MODULE prefix at %C"))
 	goto error;
+
+	  if (!in_module_or_interface ())
+	{
+	  gfc_error ("MODULE prefix at %C found outside of a module, "
+			 "submodule, or INTERFACE");
+	  goto error;
+	}
 
 	  current_attr.module_procedure = 1;
 	  found_prefix = true;
Index: gcc/testsuite/gfortran.dg/submodule_22.f08
===
--- gcc/testsuite/gfortran.dg/submodule_22.f08	(revision 270181)
+++ gcc/testsuite/gfortran.dg/submodule_22.f08	(working copy)
@@ -40,8 +40,10 @@ end
 
 submodule (mtop:submod:subsubmod) subsubsubmod ! { dg-error "Syntax error in SUBMODULE statement" }
 contains
-  module subroutine sub3
-r = 2.0
-s = 2.0
-  end subroutine sub3
+  module subroutine sub3  ! { dg-error "found outside of a module" }
+r = 2.0   ! { dg-error "Unexpected assignment" }
+s = 2.0   ! { dg-error "Unexpected assignment" }
+  end subroutine sub3 ! { dg-error "Expecting END PROGRAM statement" }
 end
+
+found outside of a module