diff options
author | Jerry DeLisle <jvdelisle@gcc.gnu.org> | 2023-12-13 19:04:50 -0800 |
---|---|---|
committer | Jerry DeLisle <jvdelisle@gcc.gnu.org> | 2023-12-14 10:37:11 -0800 |
commit | 95b70545331764c85079a1d0e1e19b605bda1456 (patch) | |
tree | f127b15833a34f47e7db3c42b3d2a7fc3f3a4b56 | |
parent | 767e2674875139ac8f354ceee655c1a9561b9779 (diff) | |
download | gcc-95b70545331764c85079a1d0e1e19b605bda1456.zip gcc-95b70545331764c85079a1d0e1e19b605bda1456.tar.gz gcc-95b70545331764c85079a1d0e1e19b605bda1456.tar.bz2 |
fortran: Add degree based trig functions for F2023
PR fortran/112873
gcc/fortran/ChangeLog:
* gfortran.texi: Update to reflect the changes.
* intrinsic.cc (add_functions): Update the standard that the
various degree trigonometric functions have been described in.
(gfc_check_intrinsic_standard): Add an error string for F2023.
* intrinsic.texi: Update accordingly.
-rw-r--r-- | gcc/fortran/gfortran.texi | 37 | ||||
-rw-r--r-- | gcc/fortran/intrinsic.cc | 55 | ||||
-rw-r--r-- | gcc/fortran/intrinsic.texi | 55 |
3 files changed, 45 insertions, 102 deletions
diff --git a/gcc/fortran/gfortran.texi b/gcc/fortran/gfortran.texi index c29cb78..286c298 100644 --- a/gcc/fortran/gfortran.texi +++ b/gcc/fortran/gfortran.texi @@ -1239,7 +1239,6 @@ additional compatibility extensions along with those enabled by * UNION and MAP:: * Type variants for integer intrinsics:: * AUTOMATIC and STATIC attributes:: -* Extended math intrinsics:: * Form feed as whitespace:: * TYPE as an alias for PRINT:: * %LOC as an rvalue:: @@ -2317,42 +2316,6 @@ subroutine f endsubroutine @end example -@node Extended math intrinsics -@subsection Extended math intrinsics -@cindex intrinsics, math -@cindex intrinsics, trigonometric functions - -GNU Fortran supports an extended list of mathematical intrinsics with the -compile flag @option{-fdec-math} for compatability with legacy code. -These intrinsics are described fully in @ref{Intrinsic Procedures} where it is -noted that they are extensions and should be avoided whenever possible. - -Specifically, @option{-fdec-math} enables the @ref{COTAN} intrinsic, and -trigonometric intrinsics which accept or produce values in degrees instead of -radians. Here is a summary of the new intrinsics: - -@multitable @columnfractions .5 .5 -@headitem Radians @tab Degrees -@item @code{@ref{ACOS}} @tab @code{@ref{ACOSD}}* -@item @code{@ref{ASIN}} @tab @code{@ref{ASIND}}* -@item @code{@ref{ATAN}} @tab @code{@ref{ATAND}}* -@item @code{@ref{ATAN2}} @tab @code{@ref{ATAN2D}}* -@item @code{@ref{COS}} @tab @code{@ref{COSD}}* -@item @code{@ref{COTAN}}* @tab @code{@ref{COTAND}}* -@item @code{@ref{SIN}} @tab @code{@ref{SIND}}* -@item @code{@ref{TAN}} @tab @code{@ref{TAND}}* -@end multitable - -* Enabled with @option{-fdec-math}. - -For advanced users, it may be important to know the implementation of these -functions. They are simply wrappers around the standard radian functions, which -have more accurate builtin versions. These functions convert their arguments -(or results) to degrees (or radians) by taking the value modulus 360 (or 2*pi) -and then multiplying it by a constant radian-to-degree (or degree-to-radian) -factor, as appropriate. The factor is computed at compile-time as 180/pi (or -pi/180). - @node Form feed as whitespace @subsection Form feed as whitespace @cindex form feed whitespace diff --git a/gcc/fortran/intrinsic.cc b/gcc/fortran/intrinsic.cc index 74970e5..8d170dd 100644 --- a/gcc/fortran/intrinsic.cc +++ b/gcc/fortran/intrinsic.cc @@ -3310,72 +3310,75 @@ add_functions (void) make_generic ("loc", GFC_ISYM_LOC, GFC_STD_GNU); - /* The next of intrinsic subprogram are the degree trigonometric functions. - These were hidden behind the -fdec-math option, but are now simply - included as extensions to the set of intrinsic subprograms. */ + /* The degree trigonometric functions were added as part of the DEC + Fortran compatibility effort, and were hidden behind a -fdec-math + option. Fortran 2023 has added some of these functions to Fortran + standard as generic subprogram, e.g., acosd() is added while dacosd() + is not. So, update GFC_STD_GNU to GFC_STD_F2023 for the generic + functions. */ add_sym_1 ("acosd", GFC_ISYM_ACOSD, CLASS_ELEMENTAL, ACTUAL_YES, - BT_REAL, dr, GFC_STD_GNU, + BT_REAL, dr, GFC_STD_F2023, gfc_check_fn_r, gfc_simplify_acosd, gfc_resolve_trigd, x, BT_REAL, dr, REQUIRED); + make_generic ("acosd", GFC_ISYM_ACOSD, GFC_STD_F2023); + add_sym_1 ("dacosd", GFC_ISYM_ACOSD, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_GNU, gfc_check_fn_d, gfc_simplify_acosd, gfc_resolve_trigd, x, BT_REAL, dd, REQUIRED); - make_generic ("acosd", GFC_ISYM_ACOSD, GFC_STD_GNU); - add_sym_1 ("asind", GFC_ISYM_ASIND, CLASS_ELEMENTAL, ACTUAL_YES, - BT_REAL, dr, GFC_STD_GNU, + BT_REAL, dr, GFC_STD_F2023, gfc_check_fn_r, gfc_simplify_asind, gfc_resolve_trigd, x, BT_REAL, dr, REQUIRED); + make_generic ("asind", GFC_ISYM_ASIND, GFC_STD_F2023); + add_sym_1 ("dasind", GFC_ISYM_ASIND, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_GNU, gfc_check_fn_d, gfc_simplify_asind, gfc_resolve_trigd, x, BT_REAL, dd, REQUIRED); - make_generic ("asind", GFC_ISYM_ASIND, GFC_STD_GNU); - add_sym_1 ("atand", GFC_ISYM_ATAND, CLASS_ELEMENTAL, ACTUAL_YES, - BT_REAL, dr, GFC_STD_GNU, + BT_REAL, dr, GFC_STD_F2023, gfc_check_fn_r, gfc_simplify_atand, gfc_resolve_trigd, x, BT_REAL, dr, REQUIRED); + make_generic ("atand", GFC_ISYM_ATAND, GFC_STD_F2023); + add_sym_1 ("datand", GFC_ISYM_ATAND, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_GNU, gfc_check_fn_d, gfc_simplify_atand, gfc_resolve_trigd, x, BT_REAL, dd, REQUIRED); - make_generic ("atand", GFC_ISYM_ATAND, GFC_STD_GNU); - add_sym_2 ("atan2d", GFC_ISYM_ATAN2D, CLASS_ELEMENTAL, ACTUAL_YES, - BT_REAL, dr, GFC_STD_GNU, + BT_REAL, dr, GFC_STD_F2023, gfc_check_atan2, gfc_simplify_atan2d, gfc_resolve_trigd2, y, BT_REAL, dr, REQUIRED, x, BT_REAL, dr, REQUIRED); + make_generic ("atan2d", GFC_ISYM_ATAN2D, GFC_STD_F2023); + add_sym_2 ("datan2d", GFC_ISYM_ATAN2D, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_GNU, gfc_check_datan2, gfc_simplify_atan2d, gfc_resolve_trigd2, y, BT_REAL, dd, REQUIRED, x, BT_REAL, dd, REQUIRED); - make_generic ("atan2d", GFC_ISYM_ATAN2D, GFC_STD_GNU); - add_sym_1 ("cosd", GFC_ISYM_COSD, CLASS_ELEMENTAL, ACTUAL_YES, - BT_REAL, dr, GFC_STD_GNU, + BT_REAL, dr, GFC_STD_F2023, gfc_check_fn_r, gfc_simplify_cosd, gfc_resolve_trigd, x, BT_REAL, dr, REQUIRED); + make_generic ("cosd", GFC_ISYM_COSD, GFC_STD_F2023); + add_sym_1 ("dcosd", GFC_ISYM_COSD, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_GNU, gfc_check_fn_d, gfc_simplify_cosd, gfc_resolve_trigd, x, BT_REAL, dd, REQUIRED); - make_generic ("cosd", GFC_ISYM_COSD, GFC_STD_GNU); - add_sym_1 ("cotan", GFC_ISYM_COTAN, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dr, GFC_STD_GNU, gfc_check_fn_rc2008, gfc_simplify_cotan, gfc_resolve_trigd, @@ -3411,29 +3414,29 @@ add_functions (void) make_generic ("cotand", GFC_ISYM_COTAND, GFC_STD_GNU); add_sym_1 ("sind", GFC_ISYM_SIND, CLASS_ELEMENTAL, ACTUAL_YES, - BT_REAL, dr, GFC_STD_GNU, + BT_REAL, dr, GFC_STD_F2023, gfc_check_fn_r, gfc_simplify_sind, gfc_resolve_trigd, x, BT_REAL, dr, REQUIRED); + make_generic ("sind", GFC_ISYM_SIND, GFC_STD_F2023); + add_sym_1 ("dsind", GFC_ISYM_SIND, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_GNU, gfc_check_fn_d, gfc_simplify_sind, gfc_resolve_trigd, x, BT_REAL, dd, REQUIRED); - make_generic ("sind", GFC_ISYM_SIND, GFC_STD_GNU); - add_sym_1 ("tand", GFC_ISYM_TAND, CLASS_ELEMENTAL, ACTUAL_YES, - BT_REAL, dr, GFC_STD_GNU, + BT_REAL, dr, GFC_STD_F2023, gfc_check_fn_r, gfc_simplify_tand, gfc_resolve_trigd, x, BT_REAL, dr, REQUIRED); + make_generic ("tand", GFC_ISYM_TAND, GFC_STD_F2023); + add_sym_1 ("dtand", GFC_ISYM_TAND, CLASS_ELEMENTAL, ACTUAL_YES, BT_REAL, dd, GFC_STD_GNU, gfc_check_fn_d, gfc_simplify_tand, gfc_resolve_trigd, x, BT_REAL, dd, REQUIRED); - make_generic ("tand", GFC_ISYM_TAND, GFC_STD_GNU); - /* The following function is internally used for coarray libray functions. "make_from_module" makes it inaccessible for external users. */ add_sym_1 (GFC_PREFIX ("caf_get"), GFC_ISYM_CAF_GET, CLASS_IMPURE, ACTUAL_NO, @@ -4889,6 +4892,10 @@ gfc_check_intrinsic_standard (const gfc_intrinsic_sym* isym, symstd_msg = _("new in Fortran 2018"); break; + case GFC_STD_F2023: + symstd_msg = _("new in Fortran 2023"); + break; + case GFC_STD_GNU: symstd_msg = _("a GNU Fortran extension"); break; diff --git a/gcc/fortran/intrinsic.texi b/gcc/fortran/intrinsic.texi index d140718..80da011 100644 --- a/gcc/fortran/intrinsic.texi +++ b/gcc/fortran/intrinsic.texi @@ -649,11 +649,8 @@ Degrees function: @* @code{ACOSD(X)} computes the arccosine of @var{X} in degrees (inverse of @code{COSD(X)}). -This function is for compatibility only and should be avoided in favor of -standard constructs wherever possible. - @item @emph{Standard}: -GNU extension, enabled with @option{-fdec-math} +Fortran 2023 @item @emph{Class}: Elemental function @@ -683,7 +680,7 @@ end program test_acosd @item @emph{Specific names}: @multitable @columnfractions .20 .23 .20 .33 @headitem Name @tab Argument @tab Return type @tab Standard -@item @code{ACOSD(X)} @tab @code{REAL(4) X} @tab @code{REAL(4)} @tab GNU extension +@item @code{ACOSD(X)} @tab @code{REAL(4) X} @tab @code{REAL(4)} @tab Fortran 2023 @item @code{DACOSD(X)} @tab @code{REAL(8) X} @tab @code{REAL(8)} @tab GNU extension @end multitable @@ -1369,11 +1366,8 @@ Degrees function: @* @code{ASIND(X)} computes the arcsine of its @var{X} in degrees (inverse of @code{SIND(X)}). -This function is for compatibility only and should be avoided in favor of -standard constructs wherever possible. - @item @emph{Standard}: -GNU extension, enabled with @option{-fdec-math}. +Fortran 2023 @item @emph{Class}: Elemental function @@ -1403,7 +1397,7 @@ end program test_asind @item @emph{Specific names}: @multitable @columnfractions .20 .23 .20 .33 @headitem Name @tab Argument @tab Return type @tab Standard -@item @code{ASIND(X)} @tab @code{REAL(4) X} @tab @code{REAL(4)} @tab GNU extension +@item @code{ASIND(X)} @tab @code{REAL(4) X} @tab @code{REAL(4)} @tab Fortran 2023 @item @code{DASIND(X)} @tab @code{REAL(8) X} @tab @code{REAL(8)} @tab GNU extension @end multitable @@ -1414,8 +1408,6 @@ Radians function: @* @ref{ASIN} @end table - - @node ASINH @section @code{ASINH} --- Inverse hyperbolic sine function @fnindex ASINH @@ -1620,11 +1612,8 @@ Degrees function: @* @code{ATAND(X)} computes the arctangent of @var{X} in degrees (inverse of @ref{TAND}). -This function is for compatibility only and should be avoided in favor of -standard constructs wherever possible. - @item @emph{Standard}: -GNU extension, enabled with @option{-fdec-math}. +Fortran 2023 @item @emph{Class}: Elemental function @@ -1660,7 +1649,7 @@ end program test_atand @item @emph{Specific names}: @multitable @columnfractions .23 .23 .20 .30 @headitem Name @tab Argument @tab Return type @tab Standard -@item @code{ATAND(X)} @tab @code{REAL(4) X} @tab @code{REAL(4)} @tab GNU extension +@item @code{ATAND(X)} @tab @code{REAL(4) X} @tab @code{REAL(4)} @tab Fortran 2023 @item @code{DATAND(X)} @tab @code{REAL(8) X} @tab @code{REAL(8)} @tab GNU extension @end multitable @@ -1752,11 +1741,8 @@ function of the complex number @math{X + i Y} in degrees. This function can be used to transform from Cartesian into polar coordinates and allows to determine the angle in the correct quadrant. -This function is for compatibility only and should be avoided in favor of -standard constructs wherever possible. - @item @emph{Standard}: -GNU extension, enabled with @option{-fdec-math}. +Fortran 2023 @item @emph{Class}: Elemental function @@ -1793,7 +1779,7 @@ end program test_atan2d @item @emph{Specific names}: @multitable @columnfractions .23 .23 .20 .30 @headitem Name @tab Argument @tab Return type @tab Standard -@item @code{ATAN2D(X, Y)} @tab @code{REAL(4) X, Y} @tab @code{REAL(4)} @tab GNU extension +@item @code{ATAN2D(X, Y)} @tab @code{REAL(4) X, Y} @tab @code{REAL(4)} @tab Fortran 2023 @item @code{DATAN2D(X, Y)} @tab @code{REAL(8) X, Y} @tab @code{REAL(8)} @tab GNU extension @end multitable @@ -1804,8 +1790,6 @@ Radians function: @* @ref{ATAN2} @end table - - @node ATANH @section @code{ATANH} --- Inverse hyperbolic tangent function @fnindex ATANH @@ -4282,11 +4266,8 @@ Degrees function: @* @item @emph{Description}: @code{COSD(X)} computes the cosine of @var{X} in degrees. -This function is for compatibility only and should be avoided in favor of -standard constructs wherever possible. - @item @emph{Standard}: -GNU extension, enabled with @option{-fdec-math}. +Fortran 2023 @item @emph{Class}: Elemental function @@ -4316,7 +4297,7 @@ end program test_cosd @item @emph{Specific names}: @multitable @columnfractions .20 .23 .20 .33 @headitem Name @tab Argument @tab Return type @tab Standard -@item @code{COSD(X)} @tab @code{REAL(4) X} @tab @code{REAL(4)} @tab GNU extension +@item @code{COSD(X)} @tab @code{REAL(4) X} @tab @code{REAL(4)} @tab Fortran 2023 @item @code{DCOSD(X)} @tab @code{REAL(8) X} @tab @code{REAL(8)} @tab GNU extension @item @code{CCOSD(X)} @tab @code{COMPLEX(4) X} @tab @code{COMPLEX(4)} @tab GNU extension @item @code{ZCOSD(X)} @tab @code{COMPLEX(8) X} @tab @code{COMPLEX(8)} @tab GNU extension @@ -13298,11 +13279,8 @@ Degrees function: @* @item @emph{Description}: @code{SIND(X)} computes the sine of @var{X} in degrees. -This function is for compatibility only and should be avoided in favor of -standard constructs wherever possible. - @item @emph{Standard}: -GNU extension, enabled with @option{-fdec-math}. +Fortran 2023 @item @emph{Class}: Elemental function @@ -13330,7 +13308,7 @@ end program test_sind @item @emph{Specific names}: @multitable @columnfractions .20 .23 .20 .33 @headitem Name @tab Argument @tab Return type @tab Standard -@item @code{SIND(X)} @tab @code{REAL(4) X} @tab @code{REAL(4)} @tab GNU extension +@item @code{SIND(X)} @tab @code{REAL(4) X} @tab @code{REAL(4)} @tab Fortran 2023 @item @code{DSIND(X)} @tab @code{REAL(8) X} @tab @code{REAL(8)} @tab GNU extension @item @code{CSIND(X)} @tab @code{COMPLEX(4) X} @tab @code{COMPLEX(4)} @tab GNU extension @item @code{ZSIND(X)} @tab @code{COMPLEX(8) X} @tab @code{COMPLEX(8)} @tab GNU extension @@ -13344,8 +13322,6 @@ Radians function: @* @ref{SIN} @* @end table - - @node SINH @section @code{SINH} --- Hyperbolic sine function @fnindex SINH @@ -14147,11 +14123,8 @@ Degrees function: @* @item @emph{Description}: @code{TAND(X)} computes the tangent of @var{X} in degrees. -This function is for compatibility only and should be avoided in favor of -standard constructs wherever possible. - @item @emph{Standard}: -GNU extension, enabled with @option{-fdec-math}. +Fortran 2023 @item @emph{Class}: Elemental function @@ -14178,7 +14151,7 @@ end program test_tand @item @emph{Specific names}: @multitable @columnfractions .20 .23 .20 .33 @headitem Name @tab Argument @tab Return type @tab Standard -@item @code{TAND(X)} @tab @code{REAL(4) X} @tab @code{REAL(4)} @tab GNU extension +@item @code{TAND(X)} @tab @code{REAL(4) X} @tab @code{REAL(4)} @tab Fortran 2023 @item @code{DTAND(X)} @tab @code{REAL(8) X} @tab @code{REAL(8)} @tab GNU extension @end multitable |