public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug fortran/113152] New: Fortran 2023 half-cycle trigonometric functions
@ 2023-12-27  1:24 kargl at gcc dot gnu.org
  2023-12-27  1:25 ` [Bug fortran/113152] " kargl at gcc dot gnu.org
                   ` (18 more replies)
  0 siblings, 19 replies; 20+ messages in thread
From: kargl at gcc dot gnu.org @ 2023-12-27  1:24 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113152

            Bug ID: 113152
           Summary: Fortran 2023 half-cycle trigonometric functions
           Product: gcc
           Version: 13.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: fortran
          Assignee: unassigned at gcc dot gnu.org
          Reporter: kargl at gcc dot gnu.org
  Target Milestone: ---

Created attachment 56949
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=56949&action=edit
patch with implementation

The attach patch implements the half-cycle trigonometric functions that
are now contained within Fortran 2023.  There a few things to note.

1) IEEE 754-2008, ISO/IEC TS 18661-4, C23, and Fortran 2023 all contain
   these functions.  This likely means that the functions acospi(), asinpi(),
   ..., tanpi() may be available as part of an operating system's libm.  In
   fact, FreeBSD has implementations of cospi, sinpi, and tanpi in libm, and
   these conform to the requirements of IEEE 754-2008 and ISO/IEC TS 18661-4.
   The file libgfortran/intrinsics/trigpi_fallback1.c provides fallbacks for
   float, double, and long double functions.  As I don't know the internals
   for libquadmath or ibm double-double, the REAL(16) (and GFC_REAL_17)
   fallback functions are in libgfortran/intrinsics/trigpi_fallback1.F90.
   I have tested REAL(16) that sits on top of libquadmath.  I have not tested
   the double-double situation.  Finally, the fallback functions do not go
   to any length in meeting all of the requirements of IEEE 754-2008. For
   example, sinpi(n+0.5) is exactly +-1 for representable integer n.  The
   fallbacks may raise an FE_INEXACT exception. 

2) I tried adding math builtins in gcc/fortran/mathbuiltins.def to directly
   map to libm functions, but this ultimately led to much frustration.  I gave
   up and wrap, for example, cospi() in _gfortran_cospi_r8().  So, there is a
   level of in-direction.  This is done in libgfortran/intrinsics/trigpi.c.
   Someone smarter than I can do the math builtins.

3) I tried inserting GFC_ISYM_ACOSPI, ..., GFC_ISYM_TANPI in alphabetical
   order in 'enum gfc_isym_id' of gfortran.h.  This runs into some obscure
   issue with libgomp where C_ASSOCIATED is no longer recognized.  So, I
   placed the new members of the enum at its end.

4) I don't use git.  I tried to do 'git add libgfortran/intrinsics/trigpi\*'
   followed by 'git commit libgfortran/intrinsics/trigpi\*', and then 
   finally 'git diff > z_halfcycle.diff'.  This does not generate one 
   unified diff file.  Sigh.  I'll attach the new files along with the
   mangled diff.

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

* [Bug fortran/113152] Fortran 2023 half-cycle trigonometric functions
  2023-12-27  1:24 [Bug fortran/113152] New: Fortran 2023 half-cycle trigonometric functions kargl at gcc dot gnu.org
@ 2023-12-27  1:25 ` kargl at gcc dot gnu.org
  2023-12-27  1:26 ` kargl at gcc dot gnu.org
                   ` (17 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: kargl at gcc dot gnu.org @ 2023-12-27  1:25 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113152

--- Comment #1 from kargl at gcc dot gnu.org ---
Created attachment 56950
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=56950&action=edit
new file that git cannot diff

Put file in libgfortran/intrinsics.

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

* [Bug fortran/113152] Fortran 2023 half-cycle trigonometric functions
  2023-12-27  1:24 [Bug fortran/113152] New: Fortran 2023 half-cycle trigonometric functions kargl at gcc dot gnu.org
  2023-12-27  1:25 ` [Bug fortran/113152] " kargl at gcc dot gnu.org
@ 2023-12-27  1:26 ` kargl at gcc dot gnu.org
  2023-12-27  1:27 ` kargl at gcc dot gnu.org
                   ` (16 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: kargl at gcc dot gnu.org @ 2023-12-27  1:26 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113152

--- Comment #2 from kargl at gcc dot gnu.org ---
Created attachment 56951
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=56951&action=edit
file that git cannot find

Put file in libgfortran/intrinsics

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

* [Bug fortran/113152] Fortran 2023 half-cycle trigonometric functions
  2023-12-27  1:24 [Bug fortran/113152] New: Fortran 2023 half-cycle trigonometric functions kargl at gcc dot gnu.org
  2023-12-27  1:25 ` [Bug fortran/113152] " kargl at gcc dot gnu.org
  2023-12-27  1:26 ` kargl at gcc dot gnu.org
@ 2023-12-27  1:27 ` kargl at gcc dot gnu.org
  2023-12-27  1:28 ` kargl at gcc dot gnu.org
                   ` (15 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: kargl at gcc dot gnu.org @ 2023-12-27  1:27 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113152

--- Comment #3 from kargl at gcc dot gnu.org ---
Created attachment 56952
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=56952&action=edit
file that git cannot find

Put in libgfortran/intrinsics

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

* [Bug fortran/113152] Fortran 2023 half-cycle trigonometric functions
  2023-12-27  1:24 [Bug fortran/113152] New: Fortran 2023 half-cycle trigonometric functions kargl at gcc dot gnu.org
                   ` (2 preceding siblings ...)
  2023-12-27  1:27 ` kargl at gcc dot gnu.org
@ 2023-12-27  1:28 ` kargl at gcc dot gnu.org
  2023-12-27 10:20 ` mikael at gcc dot gnu.org
                   ` (14 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: kargl at gcc dot gnu.org @ 2023-12-27  1:28 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113152

--- Comment #4 from kargl at gcc dot gnu.org ---
Created attachment 56953
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=56953&action=edit
test program

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

* [Bug fortran/113152] Fortran 2023 half-cycle trigonometric functions
  2023-12-27  1:24 [Bug fortran/113152] New: Fortran 2023 half-cycle trigonometric functions kargl at gcc dot gnu.org
                   ` (3 preceding siblings ...)
  2023-12-27  1:28 ` kargl at gcc dot gnu.org
@ 2023-12-27 10:20 ` mikael at gcc dot gnu.org
  2023-12-27 19:16 ` kargl at gcc dot gnu.org
                   ` (13 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: mikael at gcc dot gnu.org @ 2023-12-27 10:20 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113152

Mikael Morin <mikael at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |mikael at gcc dot gnu.org

--- Comment #5 from Mikael Morin <mikael at gcc dot gnu.org> ---
(In reply to kargl from comment #0)
>
> 4) I don't use git.  I tried to do 'git add libgfortran/intrinsics/trigpi\*'
>    followed by 'git commit libgfortran/intrinsics/trigpi\*', and then 
>    finally 'git diff > z_halfcycle.diff'.  This does not generate one 
>    unified diff file.  Sigh.  I'll attach the new files along with the
>    mangled diff.

With git you need to add all the files, not only the new ones (you can use git
add --update to add the existing files).
Then the patch can be generated (if you don't commit) with git diff --staged

If you commit, you need to add an argument to git diff to tell him a reference
to compare against, namely origin/master (remote master), master (local
master), HEAD^ (last commit before the tip of the branch), etc.  The default
reference if omitted is the tip of the branch, what you have just committed, so
the diff is empty.

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

* [Bug fortran/113152] Fortran 2023 half-cycle trigonometric functions
  2023-12-27  1:24 [Bug fortran/113152] New: Fortran 2023 half-cycle trigonometric functions kargl at gcc dot gnu.org
                   ` (4 preceding siblings ...)
  2023-12-27 10:20 ` mikael at gcc dot gnu.org
@ 2023-12-27 19:16 ` kargl at gcc dot gnu.org
  2023-12-27 23:51 ` kargl at gcc dot gnu.org
                   ` (12 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: kargl at gcc dot gnu.org @ 2023-12-27 19:16 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113152

--- Comment #6 from kargl at gcc dot gnu.org ---
In reflecting on the possibility of an OS lacking support for
REAL(10) but having a REAL(16), the mapping of types into 
C are likely REAL(4) <--> float, REAL(8) <--> double, and
REAL(16) <--> long double.  The current patch sort of gets 
this wrong, because REAL(16) is not properly mapped.  I'll
fix that shortly.

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

* [Bug fortran/113152] Fortran 2023 half-cycle trigonometric functions
  2023-12-27  1:24 [Bug fortran/113152] New: Fortran 2023 half-cycle trigonometric functions kargl at gcc dot gnu.org
                   ` (5 preceding siblings ...)
  2023-12-27 19:16 ` kargl at gcc dot gnu.org
@ 2023-12-27 23:51 ` kargl at gcc dot gnu.org
  2023-12-27 23:56 ` kargl at gcc dot gnu.org
                   ` (11 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: kargl at gcc dot gnu.org @ 2023-12-27 23:51 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113152

--- Comment #7 from kargl at gcc dot gnu.org ---
Created attachment 56955
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=56955&action=edit
test program for inverse functions

The attach program tests the inverse functions, e.g., acospi, for all kinds on
AMD64 hardware.

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

* [Bug fortran/113152] Fortran 2023 half-cycle trigonometric functions
  2023-12-27  1:24 [Bug fortran/113152] New: Fortran 2023 half-cycle trigonometric functions kargl at gcc dot gnu.org
                   ` (6 preceding siblings ...)
  2023-12-27 23:51 ` kargl at gcc dot gnu.org
@ 2023-12-27 23:56 ` kargl at gcc dot gnu.org
  2023-12-27 23:57 ` kargl at gcc dot gnu.org
                   ` (10 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: kargl at gcc dot gnu.org @ 2023-12-27 23:56 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113152

--- Comment #8 from kargl at gcc dot gnu.org ---
Created attachment 56956
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=56956&action=edit
git diff cannot find trigpi.c (updated file)

The new file tries to deal with a system with REAL(4), REAL(8), and REAL(16).
The various files and patch have been tested on AMD64 where gfortran has
REAL(4), REAL(8), REAL(10), and REAL(16).

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

* [Bug fortran/113152] Fortran 2023 half-cycle trigonometric functions
  2023-12-27  1:24 [Bug fortran/113152] New: Fortran 2023 half-cycle trigonometric functions kargl at gcc dot gnu.org
                   ` (7 preceding siblings ...)
  2023-12-27 23:56 ` kargl at gcc dot gnu.org
@ 2023-12-27 23:57 ` kargl at gcc dot gnu.org
  2023-12-29 20:08 ` kargl at gcc dot gnu.org
                   ` (9 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: kargl at gcc dot gnu.org @ 2023-12-27 23:57 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113152

kargl at gcc dot gnu.org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Priority|P3                          |P4

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

* [Bug fortran/113152] Fortran 2023 half-cycle trigonometric functions
  2023-12-27  1:24 [Bug fortran/113152] New: Fortran 2023 half-cycle trigonometric functions kargl at gcc dot gnu.org
                   ` (8 preceding siblings ...)
  2023-12-27 23:57 ` kargl at gcc dot gnu.org
@ 2023-12-29 20:08 ` kargl at gcc dot gnu.org
  2023-12-29 20:34 ` anlauf at gcc dot gnu.org
                   ` (8 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: kargl at gcc dot gnu.org @ 2023-12-29 20:08 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113152

--- Comment #9 from kargl at gcc dot gnu.org ---
Current patch is incomplete as it fails to scalarize.
It seems I need to remember how to register the new
intrinsic subprograms in trans-intrinsics.cc.

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

* [Bug fortran/113152] Fortran 2023 half-cycle trigonometric functions
  2023-12-27  1:24 [Bug fortran/113152] New: Fortran 2023 half-cycle trigonometric functions kargl at gcc dot gnu.org
                   ` (9 preceding siblings ...)
  2023-12-29 20:08 ` kargl at gcc dot gnu.org
@ 2023-12-29 20:34 ` anlauf at gcc dot gnu.org
  2023-12-30  0:56 ` sgk at troutmask dot apl.washington.edu
                   ` (7 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: anlauf at gcc dot gnu.org @ 2023-12-29 20:34 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113152

--- Comment #10 from anlauf at gcc dot gnu.org ---
(In reply to kargl from comment #0)
> Created attachment 56949 [details]
> patch with implementation

Not a review, just a comment:

diff --git a/gcc/fortran/simplify.cc b/gcc/fortran/simplify.cc
index 87fefe46cfd..4e546ddb8fa 100644
--- a/gcc/fortran/simplify.cc
+++ b/gcc/fortran/simplify.cc
@@ -30,6 +30,14 @@ along with GCC; see the file COPYING3.  If not see
 #include "constructor.h"
 #include "version.h"   /* For version_string.  */

+/* MPFR 4.2.0 introduced half-cycle trigonometric functions, e.g., sinpi(x).
+   Introduce a macro so older versions of the MPFR can still be used.  */
+
+#ifdef MPFR_HALF_CYCLE
+#undef MPFR_HALF_CYCLE
+#endif
+#define MPFR_HALF_CYCLE (MPFR_VERSION_MAJOR > 3 && MPFR_VERSION_MINOR > 1)
+
 /* Prototypes.  */


This does not look right, as it would exclude e.g. all mpfr-[5-9].[01]
How about:

#define MPFR_HALF_CYCLE (MPFR_VERSION_MAJOR * 100 + MPFR_VERSION_MINOR >= 402)

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

* [Bug fortran/113152] Fortran 2023 half-cycle trigonometric functions
  2023-12-27  1:24 [Bug fortran/113152] New: Fortran 2023 half-cycle trigonometric functions kargl at gcc dot gnu.org
                   ` (10 preceding siblings ...)
  2023-12-29 20:34 ` anlauf at gcc dot gnu.org
@ 2023-12-30  0:56 ` sgk at troutmask dot apl.washington.edu
  2024-01-20 19:12 ` kargl at gcc dot gnu.org
                   ` (6 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: sgk at troutmask dot apl.washington.edu @ 2023-12-30  0:56 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113152

--- Comment #11 from Steve Kargl <sgk at troutmask dot apl.washington.edu> ---
On Fri, Dec 29, 2023 at 08:34:38PM +0000, anlauf at gcc dot gnu.org wrote:
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113152
> 
> --- Comment #10 from anlauf at gcc dot gnu.org ---
> (In reply to kargl from comment #0)
> > Created attachment 56949 [details]
> > patch with implementation
> 
> Not a review, just a comment:
> 
> diff --git a/gcc/fortran/simplify.cc b/gcc/fortran/simplify.cc
> index 87fefe46cfd..4e546ddb8fa 100644
> --- a/gcc/fortran/simplify.cc
> +++ b/gcc/fortran/simplify.cc
> @@ -30,6 +30,14 @@ along with GCC; see the file COPYING3.  If not see
>  #include "constructor.h"
>  #include "version.h"   /* For version_string.  */
> 
> +/* MPFR 4.2.0 introduced half-cycle trigonometric functions, e.g., sinpi(x).
> +   Introduce a macro so older versions of the MPFR can still be used.  */
> +
> +#ifdef MPFR_HALF_CYCLE
> +#undef MPFR_HALF_CYCLE
> +#endif
> +#define MPFR_HALF_CYCLE (MPFR_VERSION_MAJOR > 3 && MPFR_VERSION_MINOR > 1)
> +
>  /* Prototypes.  */
> 
> 
> This does not look right, as it would exclude e.g. all mpfr-[5-9].[01]
> How about:
> 
> #define MPFR_HALF_CYCLE (MPFR_VERSION_MAJOR * 100 + MPFR_VERSION_MINOR >= 402)
> 

Indeed, it looks like I'm skipping all .0 and .1 minor releases.
I'll adopt your suggestion, and include it in an updated patch.

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

* [Bug fortran/113152] Fortran 2023 half-cycle trigonometric functions
  2023-12-27  1:24 [Bug fortran/113152] New: Fortran 2023 half-cycle trigonometric functions kargl at gcc dot gnu.org
                   ` (11 preceding siblings ...)
  2023-12-30  0:56 ` sgk at troutmask dot apl.washington.edu
@ 2024-01-20 19:12 ` kargl at gcc dot gnu.org
  2024-01-21 21:52 ` anlauf at gcc dot gnu.org
                   ` (5 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: kargl at gcc dot gnu.org @ 2024-01-20 19:12 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113152

kargl at gcc dot gnu.org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
  Attachment #56949|0                           |1
        is obsolete|                            |
  Attachment #56950|0                           |1
        is obsolete|                            |
  Attachment #56951|0                           |1
        is obsolete|                            |
  Attachment #56952|0                           |1
        is obsolete|                            |
  Attachment #56956|0                           |1
        is obsolete|                            |

--- Comment #12 from kargl at gcc dot gnu.org ---
Created attachment 57179
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=57179&action=edit
Patch

Here is a new patch.  It includes an implementation for the half-cycle
trigonometric functions as well as fixes for

PR113412 -- better error message for atan(y,x)
PR113413 -- implement atand(y,x)

Here's text that may be suitable formatted for a ChangeLog.

gfortran:

        * gfortran.h (gfc_isym_id): Add GFC_ISYM_ACOSPI, GFC_ISYM_ASINPI,
        GFC_ISYM_ATANPI, GFC_ISYM_ATAN2PI, GFC_ISYM_COSPI, GFC_ISYM_SINPI, and
        GFC_ISYM_TANPI
        * intrinsic.cc (do_check): Whitespace and typo in comments.
        (add_functions): Add two-argument form of ATAND.  Add half-cycle 
        trigonometric functions ACOSPI, ASINPI, ATANPI, ATAN2PI, COSPI,
        SINPI, and TANPI.
        (sort_actual): Generate sensible error messages for two argument
        versions of ATAN, ATAND, and ATANPI.
        * intrinsic.h: New prototypes for gfc_simplify_acospi, 
        gfc_simplify_asinpi, gfc_simplify_atanpi, gfc_simplify_atan2pi,
        gfc_simplify_cospi, gfc_simplify_sinpi, gfc_simplify_tanpi,
        gfc_resolve_acospi, gfc_resolve_asinpi, gfc_resolve_atanpi,
        gfc_resolve_atan2pi, gfc_resolve_cospi, gfc_resolve_sinpi, and
        gfc_resolve_tanpi
        * intrinsic.texi: Document new functions ACOSPI, ASINPI, ATANPI,
        ATAN2PI, COSPI, SINPI, and TANPI.  Put the ATAN* family of functions
        in lexigraphical order.
        * iresolve.cc (gfc_resolve_acospi, gfc_resolve_asinpi,
        gfc_resolve_atanpi, gfc_resolve_atan2pi, gfc_resolve_cospi,
        gfc_resolve_sinpi, gfc_resolve_tanpi):  New functions.
        * simplify.cc (gfc_simplify_acospi, gfc_simplify_asinpi,
        gfc_simplify_atanpi, gfc_simplify_atan2pi, gfc_simplify_cospi,
        gfc_simplify_sinpi, gfc_simplify_tanpi): New functions.
        Introduce MPFR_HALF_CYCLE macros to use MPFR half-cycle functions
        if available.
        * trans-intrinsic.cc: Declare asinpi, acospi, atanpi, atan2pi, sinpi, 
        cospi, and tanpi as LIB_FUNCTION's.

libgfortran 

        *Makefile.am: New files trigpi.c, trigpi_fallback1.c, and
        trigpi_fallback2.F90
        * configure.ac: Check libm for float, double, and long double
        functions for asinpi, acospi, atanpi, atan2pi, sinpi, cospi, and
        tanpi
        * Makefile.in: Regenerated.
        * config.h.in: Ditto.
        * configure: Ditto.
        * gfortran.map: Add GFORTRAN_14 section to expose the library
        symbols.
        * trigpi.c: Fallback implementations of the half-cycle trigonometric
        functions.
        * trigpi_fallback1.c: Fallback functions for float, double, and
        long double routines if libm does provide them.
        * trigpi_fallback2.F90: REAL(16)/REAL(17) fallback implementations
        of the half-cycle trigonometric functions.

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

* [Bug fortran/113152] Fortran 2023 half-cycle trigonometric functions
  2023-12-27  1:24 [Bug fortran/113152] New: Fortran 2023 half-cycle trigonometric functions kargl at gcc dot gnu.org
                   ` (12 preceding siblings ...)
  2024-01-20 19:12 ` kargl at gcc dot gnu.org
@ 2024-01-21 21:52 ` anlauf at gcc dot gnu.org
  2024-01-21 23:52 ` sgk at troutmask dot apl.washington.edu
                   ` (4 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: anlauf at gcc dot gnu.org @ 2024-01-21 21:52 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113152

anlauf at gcc dot gnu.org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
   Last reconfirmed|                            |2024-01-21
     Ever confirmed|0                           |1
             Status|UNCONFIRMED                 |NEW

--- Comment #13 from anlauf at gcc dot gnu.org ---
(In reply to kargl from comment #12)
> Created attachment 57179 [details]
> Patch

This patch does not compile with older MPFR versions:

../../gcc-trunk/gcc/fortran/simplify.cc: In function 'gfc_expr*
gfc_simplify_cospi(gfc_expr*)':
../../gcc-trunk/gcc/fortran/simplify.cc:2085:7: error: 'mpfr_cospi' was not
declared in this scope; did you mean 'mpfr_cosh'?
 2085 |       mpfr_cospi (result->value.real, result->value.real,
GFC_RND_MODE);
      |       ^~~~~~~~~~
      |       mpfr_cosh
../../gcc-trunk/gcc/fortran/simplify.cc: In function 'gfc_expr*
gfc_simplify_sinpi(gfc_expr*)':
../../gcc-trunk/gcc/fortran/simplify.cc:7893:7: error: 'mpfr_sinpi' was not
declared in this scope; did you mean 'mpfr_sinh'?
 7893 |       mpfr_sinpi (result->value.real, x->value.real, GFC_RND_MODE);
      |       ^~~~~~~~~~
      |       mpfr_sinh
../../gcc-trunk/gcc/fortran/simplify.cc: In function 'gfc_expr*
gfc_simplify_tanpi(gfc_expr*)':
../../gcc-trunk/gcc/fortran/simplify.cc:8265:7: error: 'mpfr_tanpi' was not
declared in this scope; did you mean 'mpfr_tanh'?
 8265 |       mpfr_tanpi (result->value.real, x->value.real, GFC_RND_MODE);
      |       ^~~~~~~~~~
      |       mpfr_tanh
../../gcc-trunk/gcc/fortran/simplify.cc: In function 'gfc_expr*
gfc_simplify_atan2pi(gfc_expr*, gfc_expr*)':
../../gcc-trunk/gcc/fortran/simplify.cc:8320:7: error: 'mpfr_atan2pi' was not
declared in this scope; did you mean 'mpfr_atan2'?
 8320 |       mpfr_atan2pi (result->value.real, y->value.real, x->value.real,
      |       ^~~~~~~~~~~~
      |       mpfr_atan2
../../gcc-trunk/gcc/fortran/simplify.cc: In function 'gfc_expr*
gfc_simplify_atanpi(gfc_expr*)':
../../gcc-trunk/gcc/fortran/simplify.cc:8349:7: error: 'mpfr_atanpi' was not
declared in this scope; did you mean 'mpfr_atanh'?
 8349 |       mpfr_atanpi (result->value.real, x->value.real, GFC_RND_MODE);
      |       ^~~~~~~~~~~
      |       mpfr_atanh
../../gcc-trunk/gcc/fortran/simplify.cc: In function 'gfc_expr*
gfc_simplify_asinpi(gfc_expr*)':
../../gcc-trunk/gcc/fortran/simplify.cc:8377:7: error: 'mpfr_asinpi' was not
declared in this scope; did you mean 'mpfr_asinh'?
 8377 |       mpfr_asinpi (result->value.real, x->value.real, GFC_RND_MODE);
      |       ^~~~~~~~~~~
      |       mpfr_asinh
../../gcc-trunk/gcc/fortran/simplify.cc: In function 'gfc_expr*
gfc_simplify_acospi(gfc_expr*)':
../../gcc-trunk/gcc/fortran/simplify.cc:8405:7: error: 'mpfr_acospi' was not
declared in this scope; did you mean 'mpfr_acosh'?
 8405 |       mpfr_acospi (result->value.real, x->value.real, GFC_RND_MODE);
      |       ^~~~~~~~~~~
      |       mpfr_acosh

I think that you cannot do

+  if (MPFR_HALF_CYCLE)

you really must use

#if MPFR_HALF_CYCLE

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

* [Bug fortran/113152] Fortran 2023 half-cycle trigonometric functions
  2023-12-27  1:24 [Bug fortran/113152] New: Fortran 2023 half-cycle trigonometric functions kargl at gcc dot gnu.org
                   ` (13 preceding siblings ...)
  2024-01-21 21:52 ` anlauf at gcc dot gnu.org
@ 2024-01-21 23:52 ` sgk at troutmask dot apl.washington.edu
  2024-01-22  0:10 ` kargl at gcc dot gnu.org
                   ` (3 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: sgk at troutmask dot apl.washington.edu @ 2024-01-21 23:52 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113152

--- Comment #14 from Steve Kargl <sgk at troutmask dot apl.washington.edu> ---
On Sun, Jan 21, 2024 at 09:52:39PM +0000, anlauf at gcc dot gnu.org wrote:
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113152
> 
> I think that you cannot do
> 
> +  if (MPFR_HALF_CYCLE)
> 
> you really must use
> 
> #if MPFR_HALF_CYCLE
> 

#include <stdio.h>
#include "mpfr.h"

#define MPFR_HALF_CYCLE (MPFR_VERSION_MAJOR * 100 + MPFR_VERSION_MINOR >= 402)

int
main(void)
{
   if (MPFR_HALF_CYCLE)
      printf("here\n");
   else
      printf("there\n");
   return (0);
}

% cc -o z -I/usr/local/include a.c && ./z
here
% cc -E -I/usr/local/include a.c | grep -v mpfr_ | grep -v gmp | cat -s
...
int
main(void)
{
   if ((4 * 100 + 2 >= 402))
      printf("here\n");
   else
      printf("here\n");
   return (0);
}

Are you sure that your testing is finding the right mpfr.h?
If I add 

#ifdef MPFR_VERSION_MAJOR
#undef MPFR_VERSION_MAJOR
#endif 
#define MPFR_VERSION_MAJOR 3

above the define for MPFR_HALF_CYCLE in simplify.cc, it compiles
for me.  With this simple program

   real, parameter :: x = cospi(1.)
   print *,x
   end

gdb ends up in the else { } branch.

Breakpoint 1, gfc_simplify_cospi (x=0x803e24b60)
    at ../../gcc/gcc/fortran/simplify.cc:2085
2085      result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
(gdb) n
2101          mpfr_inits2 (2 * mpfr_get_prec (x->value.real), cs, n, r, NULL);

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

* [Bug fortran/113152] Fortran 2023 half-cycle trigonometric functions
  2023-12-27  1:24 [Bug fortran/113152] New: Fortran 2023 half-cycle trigonometric functions kargl at gcc dot gnu.org
                   ` (14 preceding siblings ...)
  2024-01-21 23:52 ` sgk at troutmask dot apl.washington.edu
@ 2024-01-22  0:10 ` kargl at gcc dot gnu.org
  2024-01-22 17:35 ` anlauf at gcc dot gnu.org
                   ` (2 subsequent siblings)
  18 siblings, 0 replies; 20+ messages in thread
From: kargl at gcc dot gnu.org @ 2024-01-22  0:10 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113152

--- Comment #15 from kargl at gcc dot gnu.org ---
(In reply to Steve Kargl from comment #14)
> On Sun, Jan 21, 2024 at 09:52:39PM +0000, anlauf at gcc dot gnu.org wrote:
> > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113152
> > 
> > I think that you cannot do
> > 
> > +  if (MPFR_HALF_CYCLE)
> > 
> > you really must use
> > 
> > #if MPFR_HALF_CYCLE
> > 
> 

...

> Breakpoint 1, gfc_simplify_cospi (x=0x803e24b60)
>     at ../../gcc/gcc/fortran/simplify.cc:2085
> 2085      result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
> (gdb) n
> 2101          mpfr_inits2 (2 * mpfr_get_prec (x->value.real), cs, n, r,
> NULL);

Good news is that your testing forced me to look at the
else-{} branch again, and it exposed a shortcoming.  I'm
looking at a fix.  So an updated patch will be necessary.

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

* [Bug fortran/113152] Fortran 2023 half-cycle trigonometric functions
  2023-12-27  1:24 [Bug fortran/113152] New: Fortran 2023 half-cycle trigonometric functions kargl at gcc dot gnu.org
                   ` (15 preceding siblings ...)
  2024-01-22  0:10 ` kargl at gcc dot gnu.org
@ 2024-01-22 17:35 ` anlauf at gcc dot gnu.org
  2024-01-22 18:06 ` sgk at troutmask dot apl.washington.edu
  2024-01-22 18:22 ` anlauf at gcc dot gnu.org
  18 siblings, 0 replies; 20+ messages in thread
From: anlauf at gcc dot gnu.org @ 2024-01-22 17:35 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113152

anlauf at gcc dot gnu.org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |anlauf at gcc dot gnu.org

--- Comment #16 from anlauf at gcc dot gnu.org ---
(In reply to Steve Kargl from comment #14)
> On Sun, Jan 21, 2024 at 09:52:39PM +0000, anlauf at gcc dot gnu.org wrote:
> > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113152
> > 
> > I think that you cannot do
> > 
> > +  if (MPFR_HALF_CYCLE)
> > 
> > you really must use
> > 
> > #if MPFR_HALF_CYCLE
> > 
> 
> #include <stdio.h>
> #include "mpfr.h"
> 
> #define MPFR_HALF_CYCLE (MPFR_VERSION_MAJOR * 100 + MPFR_VERSION_MINOR >=
> 402)
> 
> int
> main(void)
> {
>    if (MPFR_HALF_CYCLE)
>       printf("here\n");
>    else
>       printf("there\n");
>    return (0);
> }
> 
> % cc -o z -I/usr/local/include a.c && ./z

This does not test the right thing.

% cat sgk.cc
#include <stdio.h>

#define MPFR_HALF_CYCLE 0

int
main(void)
{
   if (MPFR_HALF_CYCLE)
      printf_not_declared_if_0 ("here\n");
   else
      printf ("there\n");
   return (0);
}

% g++ sgk.cc
sgk.cc: In function 'int main()':
sgk.cc:9:7: error: 'printf_not_declared_if_0' was not declared in this scope
       printf_not_declared_if_0 ("here\n");
       ^~~~~~~~~~~~~~~~~~~~~~~~

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

* [Bug fortran/113152] Fortran 2023 half-cycle trigonometric functions
  2023-12-27  1:24 [Bug fortran/113152] New: Fortran 2023 half-cycle trigonometric functions kargl at gcc dot gnu.org
                   ` (16 preceding siblings ...)
  2024-01-22 17:35 ` anlauf at gcc dot gnu.org
@ 2024-01-22 18:06 ` sgk at troutmask dot apl.washington.edu
  2024-01-22 18:22 ` anlauf at gcc dot gnu.org
  18 siblings, 0 replies; 20+ messages in thread
From: sgk at troutmask dot apl.washington.edu @ 2024-01-22 18:06 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113152

--- Comment #17 from Steve Kargl <sgk at troutmask dot apl.washington.edu> ---
On Mon, Jan 22, 2024 at 05:35:41PM +0000, anlauf at gcc dot gnu.org wrote:
> --- Comment #16 from anlauf at gcc dot gnu.org ---
> (In reply to Steve Kargl from comment #14)
> > On Sun, Jan 21, 2024 at 09:52:39PM +0000, anlauf at gcc dot gnu.org wrote:
> > > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113152
> > > 
> > > I think that you cannot do
> > > 
> > > +  if (MPFR_HALF_CYCLE)
> > > 
> > > you really must use
> > > 
> > > #if MPFR_HALF_CYCLE
> > > 
> > 
> > #include <stdio.h>
> > #include "mpfr.h"
> > 
> > #define MPFR_HALF_CYCLE (MPFR_VERSION_MAJOR * 100 + MPFR_VERSION_MINOR >=
> > 402)
> > 
> > int
> > main(void)
> > {
> >    if (MPFR_HALF_CYCLE)
> >       printf("here\n");
> >    else
> >       printf("there\n");
> >    return (0);
> > }
> > 
> > % cc -o z -I/usr/local/include a.c && ./z
> 
> This does not test the right thing.
> 
> % cat sgk.cc
> #include <stdio.h>
> 
> #define MPFR_HALF_CYCLE 0

This is not what the pre-processor should be doing
(on at least FreeBSD).  See below.


> int
> main(void)
> {
>    if (MPFR_HALF_CYCLE)
>       printf_not_declared_if_0 ("here\n");
>    else
>       printf ("there\n");
>    return (0);
> }
> 
> % g++ sgk.cc
> sgk.cc: In function 'int main()':
> sgk.cc:9:7: error: 'printf_not_declared_if_0' was not declared in this scope
>        printf_not_declared_if_0 ("here\n");
>        ^~~~~~~~~~~~~~~~~~~~~~~~

Of course, it will fail.  You need to actually have a
printf_not_declared_if_0 function defined during parsing.

#include <stdlib.h>
#include <stdio.h>

#define MPFR_HALF_CYCLE 1
#define printf_not_declared_if_0(a) abort()

int
main(void)
{
   if (MPFR_HALF_CYCLE)
      printf_not_declared_if_0 ("here\n");
   else
      printf ("there\n");
   return (0);
}

~/work/x/bin/g++ -I/usr/local/include -o z a.cc && ./z
Abort (core dumped)

Changing 1 to 0 the MPFR_HALF_CYCLE define.

 ~/work/x/bin/g++ -I/usr/local/include -o z a.cc && ./z
there

Going back to my original example and g++ from master, I'm seeing

% ~/work/x/bin/g++ -I/usr/local/include -E a.cc

int
main(void)
{
   if ((
# 9 "a.cc" 3
      4 
# 9 "a.cc"
      * 100 + 
# 9 "a.cc" 3
      2 
# 9 "a.cc"
      >= 402))
      printf("here\n");
   else
      printf("there\n");
   return (0);
}

and with clang++

% c++ -E -I/usr/local/include a.cc
int
main(void)
{
   if ((4 * 100 + 2 >= 402))
      printf("here\n");
   else
      printf("there\n");
   return (0);
}

Is there something that is different between your OS and FreeBSD?
Or is there some fundamental difference between C and C++ that
I am unaware of?

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

* [Bug fortran/113152] Fortran 2023 half-cycle trigonometric functions
  2023-12-27  1:24 [Bug fortran/113152] New: Fortran 2023 half-cycle trigonometric functions kargl at gcc dot gnu.org
                   ` (17 preceding siblings ...)
  2024-01-22 18:06 ` sgk at troutmask dot apl.washington.edu
@ 2024-01-22 18:22 ` anlauf at gcc dot gnu.org
  18 siblings, 0 replies; 20+ messages in thread
From: anlauf at gcc dot gnu.org @ 2024-01-22 18:22 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113152

--- Comment #18 from anlauf at gcc dot gnu.org ---
(In reply to Steve Kargl from comment #17)
> Is there something that is different between your OS and FreeBSD?
> Or is there some fundamental difference between C and C++ that
> I am unaware of?

You should not expect everybody to have the latest MPFR installed.
That's the whole point.

Please use #if / #else / #endif

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

end of thread, other threads:[~2024-01-22 18:22 UTC | newest]

Thread overview: 20+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-12-27  1:24 [Bug fortran/113152] New: Fortran 2023 half-cycle trigonometric functions kargl at gcc dot gnu.org
2023-12-27  1:25 ` [Bug fortran/113152] " kargl at gcc dot gnu.org
2023-12-27  1:26 ` kargl at gcc dot gnu.org
2023-12-27  1:27 ` kargl at gcc dot gnu.org
2023-12-27  1:28 ` kargl at gcc dot gnu.org
2023-12-27 10:20 ` mikael at gcc dot gnu.org
2023-12-27 19:16 ` kargl at gcc dot gnu.org
2023-12-27 23:51 ` kargl at gcc dot gnu.org
2023-12-27 23:56 ` kargl at gcc dot gnu.org
2023-12-27 23:57 ` kargl at gcc dot gnu.org
2023-12-29 20:08 ` kargl at gcc dot gnu.org
2023-12-29 20:34 ` anlauf at gcc dot gnu.org
2023-12-30  0:56 ` sgk at troutmask dot apl.washington.edu
2024-01-20 19:12 ` kargl at gcc dot gnu.org
2024-01-21 21:52 ` anlauf at gcc dot gnu.org
2024-01-21 23:52 ` sgk at troutmask dot apl.washington.edu
2024-01-22  0:10 ` kargl at gcc dot gnu.org
2024-01-22 17:35 ` anlauf at gcc dot gnu.org
2024-01-22 18:06 ` sgk at troutmask dot apl.washington.edu
2024-01-22 18:22 ` anlauf at gcc dot gnu.org

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