diff options
author | Tobias Burnus <burnus@net-b.de> | 2006-10-08 15:21:42 +0200 |
---|---|---|
committer | François-Xavier Coudert <fxcoudert@gcc.gnu.org> | 2006-10-08 13:21:42 +0000 |
commit | bec93d793735ff33a75a0e77ba96e78dd4b01262 (patch) | |
tree | 4454e84128bde146be79c1a71c6c353d05b947ae | |
parent | 3ac25120de29ce52ab034ba79612657f8c9cdfbe (diff) | |
download | gcc-bec93d793735ff33a75a0e77ba96e78dd4b01262.zip gcc-bec93d793735ff33a75a0e77ba96e78dd4b01262.tar.gz gcc-bec93d793735ff33a75a0e77ba96e78dd4b01262.tar.bz2 |
re PR fortran/28585 (Fortran 2003: Support NEW_LINE intrinsic)
PR fortran/28585
* intrinsic.c (add_functions): Add new_line Fortran 2003 intrinsic.
* intrinsic.h: Add gfc_simplify_new_line and gfc_check_new_line
prototypes.
* check.c (gfc_check_new_line): New function.
* simplify.c (gfc_simplify_new_line): New function.
* intrinsic.texi: Document new_line intrinsic.
* gfortran.dg/new_line.f90: New test.
From-SVN: r117555
-rw-r--r-- | gcc/fortran/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/fortran/check.c | 8 | ||||
-rw-r--r-- | gcc/fortran/intrinsic.c | 4 | ||||
-rw-r--r-- | gcc/fortran/intrinsic.h | 2 | ||||
-rw-r--r-- | gcc/fortran/intrinsic.texi | 40 | ||||
-rw-r--r-- | gcc/fortran/simplify.c | 19 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/new_line.f90 | 7 |
8 files changed, 95 insertions, 0 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index fa073c9..e9b52e4 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,13 @@ +2006-10-08 Tobias Burnus <burnus@net-b.de> + + PR fortran/28585 + * intrinsic.c (add_functions): Add new_line Fortran 2003 intrinsic. + * intrinsic.h: Add gfc_simplify_new_line and gfc_check_new_line + prototypes. + * check.c (gfc_check_new_line): New function. + * simplify.c (gfc_simplify_new_line): New function. + * intrinsic.texi: Document new_line intrinsic. + 2006-10-07 Francois-Xavier Coudert <coudert@clipper.ens.fr> PR fortran/16580 diff --git a/gcc/fortran/check.c b/gcc/fortran/check.c index 2365822..4884265 100644 --- a/gcc/fortran/check.c +++ b/gcc/fortran/check.c @@ -1827,6 +1827,14 @@ gfc_check_nearest (gfc_expr * x, gfc_expr * s) return SUCCESS; } +try +gfc_check_new_line (gfc_expr * a) +{ + if (type_check (a, 0, BT_CHARACTER) == FAILURE) + return FAILURE; + + return SUCCESS; +} try gfc_check_null (gfc_expr * mold) diff --git a/gcc/fortran/intrinsic.c b/gcc/fortran/intrinsic.c index f95326f..9c30205 100644 --- a/gcc/fortran/intrinsic.c +++ b/gcc/fortran/intrinsic.c @@ -1910,6 +1910,10 @@ add_functions (void) make_generic ("nearest", GFC_ISYM_NEAREST, GFC_STD_F95); + add_sym_1 ("new_line", 0, 0, BT_CHARACTER, dc, GFC_STD_F2003, + gfc_check_new_line, gfc_simplify_new_line, NULL, + i, BT_CHARACTER, dc, REQUIRED); + add_sym_2 ("nint", 1, 1, BT_INTEGER, di, GFC_STD_F77, gfc_check_a_ikind, gfc_simplify_nint, gfc_resolve_nint, a, BT_REAL, dr, REQUIRED, kind, BT_INTEGER, di, OPTIONAL); diff --git a/gcc/fortran/intrinsic.h b/gcc/fortran/intrinsic.h index 3e7ad39..a7cdd85 100644 --- a/gcc/fortran/intrinsic.h +++ b/gcc/fortran/intrinsic.h @@ -98,6 +98,7 @@ try gfc_check_merge (gfc_expr *, gfc_expr *, gfc_expr *); try gfc_check_minloc_maxloc (gfc_actual_arglist *); try gfc_check_minval_maxval (gfc_actual_arglist *); try gfc_check_nearest (gfc_expr *, gfc_expr *); +try gfc_check_new_line (gfc_expr *); try gfc_check_null (gfc_expr *); try gfc_check_pack (gfc_expr *, gfc_expr *, gfc_expr *); try gfc_check_precision (gfc_expr *); @@ -255,6 +256,7 @@ gfc_expr *gfc_simplify_modulo (gfc_expr *, gfc_expr *); gfc_expr *gfc_simplify_mvbits (gfc_expr *, gfc_expr *, gfc_expr *, gfc_expr *, gfc_expr *); gfc_expr *gfc_simplify_nearest (gfc_expr *, gfc_expr *); +gfc_expr *gfc_simplify_new_line (gfc_expr *); gfc_expr *gfc_simplify_nint (gfc_expr *, gfc_expr *); gfc_expr *gfc_simplify_null (gfc_expr *); gfc_expr *gfc_simplify_idnint (gfc_expr *); diff --git a/gcc/fortran/intrinsic.texi b/gcc/fortran/intrinsic.texi index e3d8cc8..ebb5e53 100644 --- a/gcc/fortran/intrinsic.texi +++ b/gcc/fortran/intrinsic.texi @@ -183,6 +183,7 @@ Some intrinsics have documentation yet to be completed as indicated by 'document * @code{MODULO}: MODULO, Modulo function * @code{MVBITS}: MVBITS, Move bits from one integer to another * @code{NEAREST}: NEAREST, Nearest representable number +* @code{NEW_LINE}: NEW_LINE, New line character * @code{NINT}: NINT, Nearest whole number * @code{NOT}: NOT, Logical negation * @code{NULL}: NULL, Function that returns an disassociated pointer @@ -5879,6 +5880,45 @@ end program test_nearest +@node NEW_LINE +@section @code{NEW_LINE} --- New line character +@findex @code{NEW_LINE} intrinsic +@findex @code{NEW_LINE} intrinsic + +@table @asis +@item @emph{Description}: +@code{NEW_LINE(C)} returns the new-line character + +@item @emph{Standard}: +F2003 and later + +@item @emph{Class}: +Elemental function + +@item @emph{Syntax}: +@code{C = NEW_LINE(C)} + +@item @emph{Arguments}: +@multitable @columnfractions .15 .80 +@item @var{C} @tab The argument shall be a scalar or array of the + type @code{CHARACTER}. +@end multitable + +@item @emph{Return value}: +Returns a @var{CHARACTER} scalar of length one with the new-line character of +the same kind as parameter @var{C}. + +@item @emph{Example}: +@smallexample +program newline + implicit none + write(*,'(A)') 'This is record 1.'//NEW_LINE('A')//'This is record 2.' +end program newline +@end smallexample +@end table + + + @node NINT @section @code{NINT} --- Nearest whole number @findex @code{NINT} intrinsic diff --git a/gcc/fortran/simplify.c b/gcc/fortran/simplify.c index c9ca230..9d35bae 100644 --- a/gcc/fortran/simplify.c +++ b/gcc/fortran/simplify.c @@ -2615,6 +2615,25 @@ simplify_nint (const char *name, gfc_expr * e, gfc_expr * k) gfc_expr * +gfc_simplify_new_line (gfc_expr * e) +{ + gfc_expr *result; + + if (e->expr_type != EXPR_CONSTANT) + return NULL; + + result = gfc_constant_result (BT_CHARACTER, e->ts.kind, &e->where); + + result->value.character.string = gfc_getmem (2); + + result->value.character.length = 1; + result->value.character.string[0] = '\n'; + result->value.character.string[1] = '\0'; /* For debugger */ + return result; +} + + +gfc_expr * gfc_simplify_nint (gfc_expr * e, gfc_expr * k) { return simplify_nint ("NINT", e, k); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e9b3ec9..9446d21 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2006-10-08 Tobias Burnus <burnus@net-b.de> + + PR fortran/28585 + * gfortran.dg/new_line.f90: New test. + 2006-10-07 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> * gcc.dg/builtins-config.h: Ensure we use -std=c99 on solaris2. diff --git a/gcc/testsuite/gfortran.dg/new_line.f90 b/gcc/testsuite/gfortran.dg/new_line.f90 new file mode 100644 index 0000000..355ca30 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/new_line.f90 @@ -0,0 +1,7 @@ +! { dg-do run } +! Checks Fortran 2003's new_line intrinsic function +! PR fortran/28585 +program new_line_check + implicit none + if(achar(10) /= new_line('a')) call abort() +end program new_line_check |