public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [Patch, fortran] PR66993 - Spurious ambiguous symbol error with submodules
@ 2015-09-10 11:47 Paul Richard Thomas
  2015-09-10 14:47 ` FX
  0 siblings, 1 reply; 3+ messages in thread
From: Paul Richard Thomas @ 2015-09-10 11:47 UTC (permalink / raw)
  To: Mikael Morin, fortran, gcc-patches; +Cc: Damian Rouson

[-- Attachment #1: Type: text/plain, Size: 935 bytes --]

Dear All,

This is a very straight forward patch of a problem picked up by
Mikael. Since module symbols host associated in the submodule
statement are read using the use association mechanism, the can be
wrongly detected as being ambiguous with use associated symbols. The
latter have precedence, since the module is host. The fix attaches the
host associated symbol to a 'unique symtree' and procedes to process
the use associated symbol, using the existing symtree.

Bootstraps and regtests on FC21/x86_64 - OK for trunk?

Paul

2015-08-10  Paul Thomas  <pault@gcc.gnu.org>

    PR fortran/66993
    * module.c (read_module): If a symtree exists and the symbol has
    been associated in a submodule from a parent (sub)module, attach
    the symbol to a 'unique symtree' and the new symbol to the
    existing symtree.

2015-08-10  Paul Thomas  <pault@gcc.gnu.org>

    PR fortran/66993
    * gfortran.dg/submodule_11.f08: New test.

[-- Attachment #2: host_assoc.diff --]
[-- Type: text/plain, Size: 3132 bytes --]

Index: gcc/fortran/module.c
===================================================================
*** gcc/fortran/module.c	(revision 227527)
--- gcc/fortran/module.c	(working copy)
*************** read_module (void)
*** 5132,5138 ****

  	  st = gfc_find_symtree (gfc_current_ns->sym_root, p);

! 	  if (st != NULL)
  	    {
  	      /* Check for ambiguous symbols.  */
  	      if (check_for_ambiguous (st, info))
--- 5140,5147 ----

  	  st = gfc_find_symtree (gfc_current_ns->sym_root, p);

! 	  if (st != NULL
! 	      && !(st->n.sym && st->n.sym->attr.used_in_submodule))
  	    {
  	      /* Check for ambiguous symbols.  */
  	      if (check_for_ambiguous (st, info))
*************** read_module (void)
*** 5142,5155 ****
  	    }
  	  else
  	    {
! 	      st = gfc_find_symtree (gfc_current_ns->sym_root, name);
!
! 	      /* Create a symtree node in the current namespace for this
! 		 symbol.  */
! 	      st = check_unique_name (p)
! 		   ? gfc_get_unique_symtree (gfc_current_ns)
! 		   : gfc_new_symtree (&gfc_current_ns->sym_root, p);
! 	      st->ambiguous = ambiguous;

  	      sym = info->u.rsym.sym;

--- 5151,5173 ----
  	    }
  	  else
  	    {
! 	      if (st)
! 		{
! 		  /* This symbol is host associated from a module in a
! 		     submodule.  Hide it with a unique symtree.  */
! 		  gfc_symtree *s = gfc_get_unique_symtree (gfc_current_ns);
! 		  s->n.sym = st->n.sym;
! 		  st->n.sym = NULL;
! 		}
! 	      else
! 		{
! 		  /* Create a symtree node in the current namespace for this
! 		     symbol.  */
! 		  st = check_unique_name (p)
! 		       ? gfc_get_unique_symtree (gfc_current_ns)
! 		       : gfc_new_symtree (&gfc_current_ns->sym_root, p);
! 		  st->ambiguous = ambiguous;
! 		}

  	      sym = info->u.rsym.sym;

Index: gcc/testsuite/gfortran.dg/submodule_11.f08
===================================================================
*** gcc/testsuite/gfortran.dg/submodule_11.f08	(revision 0)
--- gcc/testsuite/gfortran.dg/submodule_11.f08	(working copy)
***************
*** 0 ****
--- 1,45 ----
+ ! { dg-do run }
+ ! Test the fix for PR66993, in which the use associated version of 'i'
+ ! was incorrectly determined to be ambiguous with the 'i', host associated
+ ! in submodule 'sm' from the module 'm'. The principle has been tested with
+ ! the function 'time_two' in addition.
+ !
+ ! Contributed by Mikael Morin  <mikael.morin@sfr.fr>
+ !
+ module m
+   integer, parameter :: i = -1
+   interface
+     module subroutine show_i
+     end subroutine show_i
+   end interface
+ contains
+   integer function times_two (arg)
+     integer :: arg
+     times_two = -2*arg
+   end function
+ end module m
+
+ module n
+   integer, parameter :: i = 2
+ contains
+   integer function times_two (arg)
+     integer :: arg
+     times_two = 2*arg
+   end function
+ end module n
+
+ submodule (m) sm
+   use n
+ contains
+   module subroutine show_i
+     if (i .ne. 2) call abort
+     if (times_two (i) .ne. 4) call abort
+   end subroutine show_i
+ end submodule sm
+
+ program p
+   use m
+   call show_i
+   if (i .ne. -1) call abort
+   if (times_two (i) .ne. 2) call abort
+ end program

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [Patch, fortran] PR66993 - Spurious ambiguous symbol error with submodules
  2015-09-10 11:47 [Patch, fortran] PR66993 - Spurious ambiguous symbol error with submodules Paul Richard Thomas
@ 2015-09-10 14:47 ` FX
  2015-09-10 16:28   ` Paul Richard Thomas
  0 siblings, 1 reply; 3+ messages in thread
From: FX @ 2015-09-10 14:47 UTC (permalink / raw)
  To: Paul Richard Thomas; +Cc: Mikael Morin, fortran, gcc-patches, Damian Rouson

> 2015-08-10  Paul Thomas  <pault@gcc.gnu.org>
> 
>    PR fortran/66993
>    * module.c (read_module): If a symtree exists and the symbol has
>    been associated in a submodule from a parent (sub)module, attach
>    the symbol to a 'unique symtree' and the new symbol to the
>    existing symtree.
> 
> 2015-08-10  Paul Thomas  <pault@gcc.gnu.org>
> 
>    PR fortran/66993
>    * gfortran.dg/submodule_11.f08: New test.

OK. Thanks for the patch.

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [Patch, fortran] PR66993 - Spurious ambiguous symbol error with submodules
  2015-09-10 14:47 ` FX
@ 2015-09-10 16:28   ` Paul Richard Thomas
  0 siblings, 0 replies; 3+ messages in thread
From: Paul Richard Thomas @ 2015-09-10 16:28 UTC (permalink / raw)
  To: FX; +Cc: Mikael Morin, fortran, gcc-patches, Damian Rouson

Committed as revision 227648.

Thanks for the review and for the PR.

Paul



On 10 September 2015 at 16:22, FX <fxcoudert@gmail.com> wrote:
>> 2015-08-10  Paul Thomas  <pault@gcc.gnu.org>
>>
>>    PR fortran/66993
>>    * module.c (read_module): If a symtree exists and the symbol has
>>    been associated in a submodule from a parent (sub)module, attach
>>    the symbol to a 'unique symtree' and the new symbol to the
>>    existing symtree.
>>
>> 2015-08-10  Paul Thomas  <pault@gcc.gnu.org>
>>
>>    PR fortran/66993
>>    * gfortran.dg/submodule_11.f08: New test.
>
> OK. Thanks for the patch.
>



-- 
Outside of a dog, a book is a man's best friend. Inside of a dog it's
too dark to read.

Groucho Marx

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2015-09-10 16:21 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-09-10 11:47 [Patch, fortran] PR66993 - Spurious ambiguous symbol error with submodules Paul Richard Thomas
2015-09-10 14:47 ` FX
2015-09-10 16:28   ` Paul Richard Thomas

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).