diff options
author | Mark Eggleston <mark.eggleston@codethink.com> | 2019-11-25 10:36:25 +0000 |
---|---|---|
committer | Mark Eggleston <markeggleston@gcc.gnu.org> | 2019-11-25 10:36:25 +0000 |
commit | 32bef8ff8090a0d108fa14fc4088e55e57a5e6d5 (patch) | |
tree | a4574f79a8a1d771a269addff0231d400703b7d2 /gcc/fortran | |
parent | ee499b407f6c59fe71c91fa7ad9686d1a4edfce3 (diff) | |
download | gcc-32bef8ff8090a0d108fa14fc4088e55e57a5e6d5.zip gcc-32bef8ff8090a0d108fa14fc4088e55e57a5e6d5.tar.gz gcc-32bef8ff8090a0d108fa14fc4088e55e57a5e6d5.tar.bz2 |
DEC comparisons - allow Hollerith constants in comparisons.
The -fdec option enables the use of Hollerith comparisons in comparisons
with INTEGER, COMPLEX, REAL and CHARACTER expressions.
Mark Eggleston <mark.eggleston@codethink.com>
Jim MacArthur <jim.macarthur@codethink.co.uk>
* gfortran.texi: Update Hollerith constants support for character types
and use in comparisons.
* invoke.texi: Tidy up list of options. Update description of
-fdec-char-conversions.
* resolve.c (is_character_based): New.
(Convert_hollerith_to_character): New. (convert_to_numeric): New.
(resolve_operator): If both sides are character based and -fdec is
enabled convert Hollerith to character. If an operand is Hollerith, the
other is numeric and -fdec is enabled convert to numeric.
(resolve_ordinary_assign): Add check for -fdec-char-conversions for
assignment of character literals.
Mark Eggleston <mark.eggleston@codethink.com>
Jim MacArthur <jim.macarthur@codethink.co.uk>
* gfortran.dg/dec-comparison-character_1.f90: New test.
* gfortran.dg/dec-comparison-character_2.f90: New test.
* gfortran.dg/dec-comparison-character_3.f90: New test.
* gfortran.dg/dec-comparison-complex_1.f90: New test.
* gfortran.dg/dec-comparison-complex_2.f90: New test.
* gfortran.dg/dec-comparison-complex_3.f90: New test.
* gfortran.dg/dec-comparison-int_1.f90: New test.
* gfortran.dg/dec-comparison-int_2.f90: New test.
* gfortran.dg/dec-comparison-int_3.f90: New test.
* gfortran.dg/dec-comparison-real_1.f90: New test.
* gfortran.dg/dec-comparison-real_2.f90: New test.
* gfortran.dg/dec-comparison-real_3.f90: New test.
* gfortran.dg/dec-comparison.f90: New test.
Co-Authored-By: Jim MacArthur <jim.macarthur@codethink.co.uk>
From-SVN: r278674
Diffstat (limited to 'gcc/fortran')
-rw-r--r-- | gcc/fortran/ChangeLog | 15 | ||||
-rw-r--r-- | gcc/fortran/gfortran.texi | 32 | ||||
-rw-r--r-- | gcc/fortran/invoke.texi | 24 | ||||
-rw-r--r-- | gcc/fortran/resolve.c | 54 |
4 files changed, 101 insertions, 24 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 5607724..95e2213 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,4 +1,17 @@ -2019-11-20 Janne Blomqvist <jb@gcc.gnu.org> +2019-11-25 Mark Eggleston <mark.eggleston@codethink.com> + Jim MacArthur <jim.macarthur@codethink.co.uk> + + * gfortran.texi: Update Hollerith constants support for character types + and use in comparisons. + * invoke.texi: Tidy up list of options. Update description of + -fdec-char-conversions. + * resolve.c (is_character_based): New. + (Convert_hollerith_to_character): New. (convert_to_numeric): New. + (resolve_operator): If both sides are character based and -fdec is + enabled convert Hollerith to character. If an operand is Hollerith, the + other is numeric and -fdec is enabled convert to numeric. + (resolve_ordinary_assign): Add check for -fdec-char-conversions for + assignment of character literals.2019-11-20 Janne Blomqvist <jb@gcc.gnu.org> PR fortran/92463 Revert r269139 diff --git a/gcc/fortran/gfortran.texi b/gcc/fortran/gfortran.texi index a34ac5a..96be58b 100644 --- a/gcc/fortran/gfortran.texi +++ b/gcc/fortran/gfortran.texi @@ -1916,14 +1916,14 @@ in I/O operations. @subsection Hollerith constants support @cindex Hollerith constants -GNU Fortran supports Hollerith constants in assignments, function -arguments, and @code{DATA} statements. A Hollerith constant is written -as a string of characters preceded by an integer constant indicating the -character count, and the letter @code{H} or @code{h}, and stored in -bytewise fashion in a numeric (@code{INTEGER}, @code{REAL}, or -@code{COMPLEX}) or @code{LOGICAL} variable. The constant will be padded -with spaces or truncated to fit the size of the variable in which it is -stored. +GNU Fortran supports Hollerith constants in assignments, @code{DATA} +statements, function and subroutine arguments. A Hollerith constant is +written as a string of characters preceded by an integer constant +indicating the character count, and the letter @code{H} or +@code{h}, and stored in bytewise fashion in a numeric (@code{INTEGER}, +@code{REAL}, or @code{COMPLEX}), @code{LOGICAL} or @code{CHARACTER} variable. +The constant will be padded with spaces or truncated to fit the size of +the variable in which it is stored. Examples of valid uses of Hollerith constants: @smallexample @@ -1951,10 +1951,22 @@ case where the intent is specifically to initialize a numeric variable with a given byte sequence. In these cases, the same result can be obtained by using the @code{TRANSFER} statement, as in this example. @smallexample - INTEGER(KIND=4) :: a - a = TRANSFER ("abcd", a) ! equivalent to: a = 4Habcd + integer(kind=4) :: a + a = transfer ("abcd", a) ! equivalent to: a = 4Habcd @end smallexample +The use of the @option{-fdec} option extends support of Hollerith constants +to comparisons: +@smallexample + integer*4 a + a = 4hABCD + if (a .ne. 4habcd) then + write(*,*) "no match" + end if +@end smallexample + +Supported types are numeric (@code{INTEGER}, @code{REAL}, or @code{COMPLEX}), +and @code{CHARACTER}. @node Character conversion @subsection Character conversion diff --git a/gcc/fortran/invoke.texi b/gcc/fortran/invoke.texi index 46ee3c9..0bc054f 100644 --- a/gcc/fortran/invoke.texi +++ b/gcc/fortran/invoke.texi @@ -117,17 +117,17 @@ by type. Explanations are in the following sections. @item Fortran Language Options @xref{Fortran Dialect Options,,Options controlling Fortran dialect}. @gccoptlist{-fall-intrinsics -fallow-argument-mismatch -fallow-invalid-boz @gol --fbackslash -fcray-pointer -fd-lines-as-code -fd-lines-as-comments -fdec @gol --fdec-char-conversions -fdec-structure -fdec-intrinsic-ints -fdec-static @gol --fdec-math -fdec-include -fdec-format-defaults -fdec-blank-format-item @gol --fdefault-double-8 -fdefault-integer-8 -fdefault-real-8 -fdefault-real-10 @gol --fdefault-real-16 -fdollar-ok -ffixed-line-length-@var{n} @gol --ffixed-line-length-none -fpad-source -ffree-form @gol --ffree-line-length-@var{n} -ffree-line-length-none -fimplicit-none @gol --finteger-4-integer-8 -fmax-identifier-length -fmodule-private @gol --ffixed-form -fno-range-check -fopenacc -fopenmp -freal-4-real-10 @gol --freal-4-real-16 -freal-4-real-8 -freal-8-real-10 -freal-8-real-16 @gol --freal-8-real-4 -std=@var{std} -ftest-forall-temp +-fbackslash -fcray-pointer -fd-lines-as-code -fd-lines-as-comments @gol +-fdec -fdec-char-conversions -fdec-structure -fdec-intrinsic-ints @gol +-fdec-static -fdec-math -fdec-include -fdec-format-defaults @gol +-fdec-blank-format-item -fdefault-double-8 -fdefault-integer-8 @gol +-fdefault-real-8 -fdefault-real-10 -fdefault-real-16 -fdollar-ok @gol +-ffixed-line-length-@var{n} -ffixed-line-length-none -fpad-source @gol +-ffree-form -ffree-line-length-@var{n} -ffree-line-length-none @gol +-fimplicit-none -finteger-4-integer-8 -fmax-identifier-length @gol +-fmodule-private -ffixed-form -fno-range-check -fopenacc -fopenmp @gol +-freal-4-real-10 -freal-4-real-16 -freal-4-real-8 -freal-8-real-10 @gol +-freal-8-real-16 -freal-8-real-4 -std=@var{std} -ftest-forall-temp } @item Preprocessing Options @@ -283,7 +283,7 @@ If @option{-fd-lines-as-code}/@option{-fd-lines-as-comments} are unset, then @item -fdec-char-conversions @opindex @code{fdec-char-conversions} -Enable the use of character literals in assignments and data statements +Enable the use of character literals in assignments and @code{DATA} statements for non-character variables. @item -fdec-structure diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 2371a9e..278dad3 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -3900,6 +3900,42 @@ impure_function_callback (gfc_expr **e, int *walk_subtrees ATTRIBUTE_UNUSED, return 0; } +/* Return true if TYPE is character based, false otherwise. */ + +static int +is_character_based (bt type) +{ + return type == BT_CHARACTER || type == BT_HOLLERITH; +} + + +/* If expression is a hollerith, convert it to character and issue a warning + for the conversion. */ + +static void +convert_hollerith_to_character (gfc_expr *e) +{ + if (e->ts.type == BT_HOLLERITH) + { + gfc_typespec t; + gfc_clear_ts (&t); + t.type = BT_CHARACTER; + t.kind = e->ts.kind; + gfc_convert_type_warn (e, &t, 2, 1); + } +} + +/* Convert to numeric and issue a warning for the conversion. */ + +static void +convert_to_numeric (gfc_expr *a, gfc_expr *b) +{ + gfc_typespec t; + gfc_clear_ts (&t); + t.type = b->ts.type; + t.kind = b->ts.kind; + gfc_convert_type_warn (a, &t, 2, 1); +} /* Resolve an operator expression node. This can involve replacing the operation with a user defined function call. */ @@ -4100,6 +4136,15 @@ resolve_operator (gfc_expr *e) case INTRINSIC_EQ_OS: case INTRINSIC_NE: case INTRINSIC_NE_OS: + + if (flag_dec + && is_character_based (op1->ts.type) + && is_character_based (op2->ts.type)) + { + convert_hollerith_to_character (op1); + convert_hollerith_to_character (op2); + } + if (op1->ts.type == BT_CHARACTER && op2->ts.type == BT_CHARACTER && op1->ts.kind == op2->ts.kind) { @@ -4137,6 +4182,13 @@ resolve_operator (gfc_expr *e) if (op1->ts.type == BT_REAL && !gfc_boz2real (op2, op1->ts.kind)) return false; } + if (flag_dec + && op1->ts.type == BT_HOLLERITH && gfc_numeric_ts (&op2->ts)) + convert_to_numeric (op1, op2); + + if (flag_dec + && gfc_numeric_ts (&op1->ts) && op2->ts.type == BT_HOLLERITH) + convert_to_numeric (op2, op1); if (gfc_numeric_ts (&op1->ts) && gfc_numeric_ts (&op2->ts)) { @@ -10693,7 +10745,7 @@ resolve_ordinary_assign (gfc_code *code, gfc_namespace *ns) if ((gfc_numeric_ts (&lhs->ts) || lhs->ts.type == BT_LOGICAL) && rhs->ts.type == BT_CHARACTER - && rhs->expr_type != EXPR_CONSTANT) + && (rhs->expr_type != EXPR_CONSTANT || !flag_dec_char_conversions)) { /* Use of -fdec-char-conversions allows assignment of character data to non-character variables. This not permited for nonconstant |