public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH] PR fortran/63797 - Bogus ambiguous reference to 'sqrt'
@ 2021-04-15 20:52 Harald Anlauf
       [not found] ` <20210416090600.5f1da58a@nbbrfq>
  0 siblings, 1 reply; 2+ messages in thread
From: Harald Anlauf @ 2021-04-15 20:52 UTC (permalink / raw)
  To: fortran, gcc-patches

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

Hello everybody,

we currently write the interface for intrinsic procedures to module
files although that should not be necessary.  (F2018:15.4.2.1 actually
states that interfaces e.g. of intrinsic procedures are 'explicit'.)
This lead to bogus errors due to an apparently bogus ambiguity.
A simple solution is to just avoid writing that (redundant) information
to the module file.

Regtested on x86_64-pc-linux-gnu.  OK for (current) mainline?
Or rather wait after 11 release?

Thanks,
Harald


PR fortran/63797 - Bogus ambiguous reference to 'sqrt'

The interface of an intrinsic procedure is automatically explicit.
Do not write it to the module file.

gcc/fortran/ChangeLog:

	* module.c (write_symtree): Do not write interface of intrinsic
	procedure to module file.

gcc/testsuite/ChangeLog:

	* gfortran.dg/pr63797.f90: New test.


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: pr63797.patch --]
[-- Type: text/x-patch, Size: 2041 bytes --]

diff --git a/gcc/fortran/module.c b/gcc/fortran/module.c
index 4db0a3ac76d..b4b7b437f86 100644
--- a/gcc/fortran/module.c
+++ b/gcc/fortran/module.c
@@ -6218,6 +6218,9 @@ write_symtree (gfc_symtree *st)
   if (check_unique_name (st->name))
     return;

+  if (strcmp (sym->module, "(intrinsic)") == 0)
+    return;
+
   p = find_pointer (sym);
   if (p == NULL)
     gfc_internal_error ("write_symtree(): Symbol not written");
diff --git a/gcc/testsuite/gfortran.dg/pr63797.f90 b/gcc/testsuite/gfortran.dg/pr63797.f90
new file mode 100644
index 00000000000..1131e8167b1
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr63797.f90
@@ -0,0 +1,60 @@
+! { dg-do compile }
+! PR63797 - Bogus ambiguous reference to 'sqrt'
+
+module mod1
+  implicit none
+  real, parameter :: z = sqrt (0.0)
+  real            :: w = sqrt (1.0)
+  interface
+     pure real function sqrt_ifc (x)
+       real, intent(in) :: x
+     end function sqrt_ifc
+  end interface
+contains
+  pure function myroot () result (f)
+    procedure(sqrt_ifc), pointer :: f
+    intrinsic :: sqrt
+    f => sqrt
+  end function myroot
+end module mod1
+
+module mod2
+  implicit none
+  type t
+     real :: a = 0.
+  end type
+  interface sqrt
+     module procedure sqrt
+  end interface
+contains
+  elemental function sqrt (a)
+    type(t), intent(in) :: a
+    type(t)             :: sqrt
+    sqrt% a = a% a
+  end function sqrt
+end module mod2
+
+module mod3
+  implicit none
+  abstract interface
+     function real_func (x)
+       real              :: real_func
+       real, intent (in) :: x
+     end function real_func
+  end interface
+  intrinsic :: sqrt
+  procedure(real_func), pointer :: real_root => sqrt
+end module mod3
+
+program test
+  use mod1
+  use mod2
+  use mod3
+  implicit none
+  type(t) :: x, y
+  procedure(sqrt_ifc), pointer :: root
+  root => myroot ()
+  y    = sqrt (x)
+  y% a = sqrt (x% a) + z - w + root (x% a)
+  y% a = real_root (x% a)
+end program test

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

* Re: [PATCH] PR fortran/63797 - Bogus ambiguous reference to 'sqrt'
       [not found]     ` <CAGkQGiLmwvbqGN3Whp_EDnz48WfvdLiFyT61SJe2BxczVJLPrg@mail.gmail.com>
@ 2021-04-16 14:31       ` Harald Anlauf
  0 siblings, 0 replies; 2+ messages in thread
From: Harald Anlauf @ 2021-04-16 14:31 UTC (permalink / raw)
  To: Paul Richard Thomas, fortran, gcc-patches
  Cc: Bernhard Reutner-Fischer, Harald Anlauf via Fortran

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

Hi Paul, all,
 
having really enjoyed the review process, I've now committed Paul's version
including his comment.  See also attached.

Thanks,
Harald

 
Gesendet: Freitag, 16. April 2021 um 13:02 Uhr
Von: "Paul Richard Thomas" <paul.richard.thomas@gmail.com>
An: "Bernhard Reutner-Fischer" <rep.dot.nop@gmail.com>
Cc: "Harald Anlauf via Fortran" <fortran@gcc.gnu.org>, "Harald Anlauf" <anlauf@gmx.de>
Betreff: Re: [PATCH] PR fortran/63797 - Bogus ambiguous reference to 'sqrt'

Hi Harald,
 
This is the output from a completely tedious Zoom meeting:
 
  /* From F2003 onwards, intrinsic procedures are no longer subject to
     the restriction, "that an elemental intrinsic function here be of
     type integer or character and each argument must be an initialization
     expr of type integer or character" is lifted so that intrinsic
     procedures can be over-ridden. This requires that the intrinsic
     symbol not appear in the module file, thereby preventing ambiguity
     when USEd.  */
  if (strcmp (sym->module, "(intrinsic)") == 0
      && (gfc_option.allow_std & GFC_STD_F2003))
    return;
 
Modify or replace the comment, as desired. The change to the condition gives the desired result in terms of standard compliance.
 
Regards
 
Paul


PR fortran/63797 - Bogus ambiguous reference to 'sqrt'

The interface of an intrinsic procedure is automatically explicit.
Do not write it to the module file to prevent wrong ambiguities on USE.

gcc/fortran/ChangeLog:

	PR fortran/63797
	* module.c (write_symtree): Do not write interface of intrinsic
	procedure to module file for F2003 and newer.

gcc/testsuite/ChangeLog:

	PR fortran/63797
	* gfortran.dg/pr63797.f90: New test.

Co-authored-by: Paul Thomas <pault@gcc.gnu.org>


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: pr63797.patch --]
[-- Type: text/x-patch, Size: 2552 bytes --]

diff --git a/gcc/fortran/module.c b/gcc/fortran/module.c
index 4db0a3ac76d..089453caa03 100644
--- a/gcc/fortran/module.c
+++ b/gcc/fortran/module.c
@@ -6218,6 +6218,17 @@ write_symtree (gfc_symtree *st)
   if (check_unique_name (st->name))
     return;

+  /* From F2003 onwards, intrinsic procedures are no longer subject to
+     the restriction, "that an elemental intrinsic function here be of
+     type integer or character and each argument must be an initialization
+     expr of type integer or character" is lifted so that intrinsic
+     procedures can be over-ridden. This requires that the intrinsic
+     symbol not appear in the module file, thereby preventing ambiguity
+     when USEd.  */
+  if (strcmp (sym->module, "(intrinsic)") == 0
+      && (gfc_option.allow_std & GFC_STD_F2003))
+    return;
+
   p = find_pointer (sym);
   if (p == NULL)
     gfc_internal_error ("write_symtree(): Symbol not written");
diff --git a/gcc/testsuite/gfortran.dg/pr63797.f90 b/gcc/testsuite/gfortran.dg/pr63797.f90
new file mode 100644
index 00000000000..1131e8167b1
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr63797.f90
@@ -0,0 +1,60 @@
+! { dg-do compile }
+! PR63797 - Bogus ambiguous reference to 'sqrt'
+
+module mod1
+  implicit none
+  real, parameter :: z = sqrt (0.0)
+  real            :: w = sqrt (1.0)
+  interface
+     pure real function sqrt_ifc (x)
+       real, intent(in) :: x
+     end function sqrt_ifc
+  end interface
+contains
+  pure function myroot () result (f)
+    procedure(sqrt_ifc), pointer :: f
+    intrinsic :: sqrt
+    f => sqrt
+  end function myroot
+end module mod1
+
+module mod2
+  implicit none
+  type t
+     real :: a = 0.
+  end type
+  interface sqrt
+     module procedure sqrt
+  end interface
+contains
+  elemental function sqrt (a)
+    type(t), intent(in) :: a
+    type(t)             :: sqrt
+    sqrt% a = a% a
+  end function sqrt
+end module mod2
+
+module mod3
+  implicit none
+  abstract interface
+     function real_func (x)
+       real              :: real_func
+       real, intent (in) :: x
+     end function real_func
+  end interface
+  intrinsic :: sqrt
+  procedure(real_func), pointer :: real_root => sqrt
+end module mod3
+
+program test
+  use mod1
+  use mod2
+  use mod3
+  implicit none
+  type(t) :: x, y
+  procedure(sqrt_ifc), pointer :: root
+  root => myroot ()
+  y    = sqrt (x)
+  y% a = sqrt (x% a) + z - w + root (x% a)
+  y% a = real_root (x% a)
+end program test

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

end of thread, other threads:[~2021-04-16 14:31 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-04-15 20:52 [PATCH] PR fortran/63797 - Bogus ambiguous reference to 'sqrt' Harald Anlauf
     [not found] ` <20210416090600.5f1da58a@nbbrfq>
     [not found]   ` <CAGkQGiKUcjjSTnwJwBgF0oNwq=qCNrA3NXF55WNVNyGznNLSOQ@mail.gmail.com>
     [not found]     ` <CAGkQGiLmwvbqGN3Whp_EDnz48WfvdLiFyT61SJe2BxczVJLPrg@mail.gmail.com>
2021-04-16 14:31       ` Harald Anlauf

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).