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.
This commit is contained in:
Jerry DeLisle 2023-12-13 19:04:50 -08:00
parent 767e267487
commit 95b7054533
3 changed files with 45 additions and 102 deletions

View file

@ -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

View file

@ -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;

View file

@ -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