Re: [Patch, fortran] PR79447 - [F08] gfortran rejects valid & accepts invalid internal subprogram in a submodule

2017-02-19 Thread Paul Richard Thomas
Hi Jerry,

Committed as revision 245582.

Thanks for the review.

Paul

On 16 February 2017 at 00:37, Jerry DeLisle  wrote:
> On 02/15/2017 10:01 AM, Paul Richard Thomas wrote:
>> Dear All,
>>
>> This patch is straightforward, verging on 'obvious'.
>>
>> Bootstraps and regtests on FC23/x86_64 - OK for trunk and 6 branch?
>>
> Yes, OK
>
> Jerry



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


Re: [Patch, fortran] PR79447 - [F08] gfortran rejects valid & accepts invalid internal subprogram in a submodule

2017-02-15 Thread Jerry DeLisle
On 02/15/2017 10:01 AM, Paul Richard Thomas wrote:
> Dear All,
> 
> This patch is straightforward, verging on 'obvious'.
> 
> Bootstraps and regtests on FC23/x86_64 - OK for trunk and 6 branch?
> 
Yes, OK

Jerry


[Patch, fortran] PR79447 - [F08] gfortran rejects valid & accepts invalid internal subprogram in a submodule

2017-02-15 Thread Paul Richard Thomas
Dear All,

This patch is straightforward, verging on 'obvious'.

Bootstraps and regtests on FC23/x86_64 - OK for trunk and 6 branch?

Cheers

Paul

2017-02-15  Paul Thomas  

PR fortran/79447
* decl.c (gfc_set_constant_character_len): Whitespace.
(gfc_match_end): Catch case where a procedure is contained in
a module procedure and ensure that 'end procedure' is the
correct termination.

2017-02-15  Paul Thomas  

PR fortran/79447
* gfortran.dg/submodule_24.f08 : New test.
Index: gcc/fortran/decl.c
===
*** gcc/fortran/decl.c  (revision 245196)
--- gcc/fortran/decl.c  (working copy)
*** gfc_set_constant_character_len (int len,
*** 1499,1505 
  
if (expr->ts.type != BT_CHARACTER)
  return;
!  
if (expr->expr_type != EXPR_CONSTANT)
  {
gfc_error_now ("CHARACTER length must be a constant at %L", 
>where);
--- 1499,1505 
  
if (expr->ts.type != BT_CHARACTER)
  return;
! 
if (expr->expr_type != EXPR_CONSTANT)
  {
gfc_error_now ("CHARACTER length must be a constant at %L", 
>where);
*** gfc_match_end (gfc_statement *st)
*** 6756,6762 
match m;
gfc_namespace *parent_ns, *ns, *prev_ns;
gfc_namespace **nsp;
!   bool abreviated_modproc_decl;
bool got_matching_end = false;
  
old_loc = gfc_current_locus;
--- 6756,6762 
match m;
gfc_namespace *parent_ns, *ns, *prev_ns;
gfc_namespace **nsp;
!   bool abreviated_modproc_decl = false;
bool got_matching_end = false;
  
old_loc = gfc_current_locus;
*** gfc_match_end (gfc_statement *st)
*** 6780,6794 
state = gfc_state_stack->previous->state;
block_name = gfc_state_stack->previous->sym == NULL
 ? NULL : gfc_state_stack->previous->sym->name;
break;
  
  default:
break;
  }
  
!   abreviated_modproc_decl
!   = gfc_current_block ()
! && gfc_current_block ()->abr_modproc_decl;
  
switch (state)
  {
--- 6780,6796 
state = gfc_state_stack->previous->state;
block_name = gfc_state_stack->previous->sym == NULL
 ? NULL : gfc_state_stack->previous->sym->name;
+   abreviated_modproc_decl = gfc_state_stack->previous->sym
+   && gfc_state_stack->previous->sym->abr_modproc_decl;
break;
  
  default:
break;
  }
  
!   if (!abreviated_modproc_decl)
! abreviated_modproc_decl = gfc_current_block ()
! && gfc_current_block ()->abr_modproc_decl;
  
switch (state)
  {
Index: gcc/testsuite/gfortran.dg/submodule_24.f08
===
*** gcc/testsuite/gfortran.dg/submodule_24.f08  (nonexistent)
--- gcc/testsuite/gfortran.dg/submodule_24.f08  (working copy)
***
*** 0 
--- 1,23 
+ ! { dg-do compile }
+ ! Test the fix for PR79447, in which the END PROCEDURE statement
+ ! for MODULE PROCEDURE foo was not accepted.
+ !
+ ! Contributed by Damian Rouson  
+ !
+ module foo_interface
+   implicit none
+   interface
+ module subroutine foo()
+ end subroutine
+   end interface
+ end module foo_interface
+ 
+ submodule(foo_interface) foo_implementation
+ contains
+ module procedure foo
+ contains
+   module subroutine bar()
+   end subroutine
+ end procedure
+!end subroutine ! gfortran accepted this invalid workaround
+ end submodule