Message ID | 30913a8a-4605-f97e-d247-3d38ee98094c@codethink.co.uk |
---|---|
State | New |
Headers | show |
Series | [Fortran] dec comparisons - for approval | expand |
First, can you also create some news quip for your GCC 10 changes for https://gcc.gnu.org/gcc-10/changes.html ? See https://gcc.gnu.org/about.html#git for the repository to diff against. On 11/21/19 12:05 PM, Mark Eggleston wrote: > Please find attached an updated version of the patch originally > submitted on 15th November. The comparisons with Holleriths are no > only possible when using -fdec. s/no/now/ > The test cases have been revised to check for errors when -fdec is not > used. > OK to commit in stage 3 or delay until stage 1 in the new year? LGTM – The first version of the patch has been posted before Stage 3, which also has just started, and is very restricted – all are good reasons that GCC 10 trunk is fine. Cheers, Tobias > Change logs: > gcc/fortran > > 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. > > gcc/testsuite > > 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. > > -- > https://www.codethink.co.uk/privacy.html > > > 0001-dec-comparisons.patch > > From 2fc6d83614d7f58620a9a9662e9972b5d4018ed1 Mon Sep 17 00:00:00 2001 > From: Mark Eggleston<markeggleston@codethink.com> > Date: Thu, 23 May 2019 09:42:26 +0100 > Subject: [PATCH] dec comparisons > > Allow comparison of Hollerith constants with numeric and character > expressions. Also allow comparison of character literalsa with numeric > expressions. > > Enable using -fdec-comparisons or -fdec > --- > gcc/fortran/gfortran.texi | 32 +++++++++---- > gcc/fortran/invoke.texi | 24 +++++----- > gcc/fortran/resolve.c | 54 +++++++++++++++++++++- > .../gfortran.dg/dec-comparison-character_1.f90 | 18 ++++++++ > .../gfortran.dg/dec-comparison-character_2.f90 | 18 ++++++++ > .../gfortran.dg/dec-comparison-character_3.f90 | 26 +++++++++++ > .../gfortran.dg/dec-comparison-complex_1.f90 | 17 +++++++ > .../gfortran.dg/dec-comparison-complex_2.f90 | 14 ++++++ > .../gfortran.dg/dec-comparison-complex_3.f90 | 18 ++++++++ > gcc/testsuite/gfortran.dg/dec-comparison-int_1.f90 | 22 +++++++++ > gcc/testsuite/gfortran.dg/dec-comparison-int_2.f90 | 18 ++++++++ > gcc/testsuite/gfortran.dg/dec-comparison-int_3.f90 | 26 +++++++++++ > .../gfortran.dg/dec-comparison-real_1.f90 | 22 +++++++++ > .../gfortran.dg/dec-comparison-real_2.f90 | 18 ++++++++ > .../gfortran.dg/dec-comparison-real_3.f90 | 26 +++++++++++ > gcc/testsuite/gfortran.dg/dec-comparison.f90 | 41 ++++++++++++++++ > 16 files changed, 371 insertions(+), 23 deletions(-) > create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison-character_1.f90 > create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison-character_2.f90 > create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison-character_3.f90 > create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison-complex_1.f90 > create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison-complex_2.f90 > create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison-complex_3.f90 > create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison-int_1.f90 > create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison-int_2.f90 > create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison-int_3.f90 > create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison-real_1.f90 > create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison-real_2.f90 > create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison-real_3.f90 > create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison.f90 > > diff --git a/gcc/fortran/gfortran.texi b/gcc/fortran/gfortran.texi > index a34ac5aa1bf..96be58b992d 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 46ee3c9241b..0bc054f01e5 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 2371a9e201f..278dad363fd 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 > diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-character_1.f90 b/gcc/testsuite/gfortran.dg/dec-comparison-character_1.f90 > new file mode 100644 > index 00000000000..0e542e8354b > --- /dev/null > +++ b/gcc/testsuite/gfortran.dg/dec-comparison-character_1.f90 > @@ -0,0 +1,18 @@ > +! { dg-do run } > +! { dg-options "-fdec" } > +! > +! Test case contributed by Mark Eggleston<mark.eggleston@codethink.com> > +! > + > +program convert > + character(4) :: c = 4HJMAC > + if (4HJMAC.ne.4HJMAC) stop 1 > + if (4HJMAC.ne."JMAC") stop 2 > + if (4HJMAC.eq."JMAN") stop 3 > + if ("JMAC".eq.4HJMAN) stop 4 > + if ("AAAA".eq.5HAAAAA) stop 5 > + if ("BBBBB".eq.5HBBBB ) stop 6 > + if (4HJMAC.ne.c) stop 7 > + if (c.ne.4HJMAC) stop 8 > +end program > + > diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-character_2.f90 b/gcc/testsuite/gfortran.dg/dec-comparison-character_2.f90 > new file mode 100644 > index 00000000000..d35eaad17e1 > --- /dev/null > +++ b/gcc/testsuite/gfortran.dg/dec-comparison-character_2.f90 > @@ -0,0 +1,18 @@ > +! { dg-do run } > +! { dg-options "-fdec -Wconversion" } > +! > +! Test case contributed by Mark Eggleston<mark.eggleston@codethink.com> > +! > + > +include "dec-comparison-character_1.f90" > + > +! { dg-warning "HOLLERITH to CHARACTER" " " { target *-*-* } 8 } > +! { dg-warning "HOLLERITH to CHARACTER" " " { target *-*-* } 9 } > +! { dg-warning "HOLLERITH to CHARACTER" " " { target *-*-* } 10 } > +! { dg-warning "HOLLERITH to CHARACTER" " " { target *-*-* } 11 } > +! { dg-warning "HOLLERITH to CHARACTER" " " { target *-*-* } 12 } > +! { dg-warning "HOLLERITH to CHARACTER" " " { target *-*-* } 13 } > +! { dg-warning "HOLLERITH to CHARACTER" " " { target *-*-* } 14 } > +! { dg-warning "HOLLERITH to CHARACTER" " " { target *-*-* } 15 } > +! { dg-warning "HOLLERITH to CHARACTER" " " { target *-*-* } 16 } > + > diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-character_3.f90 b/gcc/testsuite/gfortran.dg/dec-comparison-character_3.f90 > new file mode 100644 > index 00000000000..adbb554bfbe > --- /dev/null > +++ b/gcc/testsuite/gfortran.dg/dec-comparison-character_3.f90 > @@ -0,0 +1,26 @@ > +! { dg-do compile } > +! > +! Test case contributed by Mark Eggleston<mark.eggleston@codethink.com> > +! > + > +include "dec-comparison-character_1.f90" > + > +! { dg-warning "Legacy Extension: Hollerith constant at" " " { target *-*-* } 8 } > +! { dg-warning "Legacy Extension: Hollerith constant at" " " { target *-*-* } 9 } > +! { dg-warning "Legacy Extension: Hollerith constant at" " " { target *-*-* } 10 } > +! { dg-warning "Legacy Extension: Hollerith constant at" " " { target *-*-* } 11 } > +! { dg-warning "Legacy Extension: Hollerith constant at" " " { target *-*-* } 12 } > +! { dg-warning "Legacy Extension: Hollerith constant at" " " { target *-*-* } 13 } > +! { dg-warning "Legacy Extension: Hollerith constant at" " " { target *-*-* } 14 } > +! { dg-warning "Legacy Extension: Hollerith constant at" " " { target *-*-* } 15 } > +! { dg-warning "Legacy Extension: Hollerith constant at" " " { target *-*-* } 16 } > +! { dg-warning "Extension: Conversion from HOLLERITH to CHARACTER" " " { target *-*-* } 8 } > +! { dg-error "Operands of comparison operator" " " { target *-*-* } 9 } > +! { dg-error "Operands of comparison operator" " " { target *-*-* } 10 } > +! { dg-error "Operands of comparison operator" " " { target *-*-* } 11 } > +! { dg-error "Operands of comparison operator" " " { target *-*-* } 12 } > +! { dg-error "Operands of comparison operator" " " { target *-*-* } 13 } > +! { dg-error "Operands of comparison operator" " " { target *-*-* } 14 } > +! { dg-error "Operands of comparison operator" " " { target *-*-* } 15 } > +! { dg-error "Operands of comparison operator" " " { target *-*-* } 16 } > + > diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-complex_1.f90 b/gcc/testsuite/gfortran.dg/dec-comparison-complex_1.f90 > new file mode 100644 > index 00000000000..4bbb9a18b88 > --- /dev/null > +++ b/gcc/testsuite/gfortran.dg/dec-comparison-complex_1.f90 > @@ -0,0 +1,17 @@ > +! { dg-do run } > +! { dg-options "-fdec" } > +! > +! Test case contributed by Mark Eggleston<mark.eggleston@codethink.com> > +! > + > +program convert > + complex(4) :: a > + complex(4) :: b > + a = 8HABCDABCD > + b = transfer("ABCDABCD", b); > + ! Hollerith constants > + if (a.ne.8HABCDABCD) stop 1 > + if (a.eq.8HABCEABCE) stop 2 > + if (8HABCDABCD.ne.b) stop 3 > + if (8HABCEABCE.eq.b) stop 4 > +end program > diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-complex_2.f90 b/gcc/testsuite/gfortran.dg/dec-comparison-complex_2.f90 > new file mode 100644 > index 00000000000..82372095362 > --- /dev/null > +++ b/gcc/testsuite/gfortran.dg/dec-comparison-complex_2.f90 > @@ -0,0 +1,14 @@ > +! { dg-do run } > +! { dg-options "-fdec -Wconversion" } > +! > +! Test case contributed by Mark Eggleston<mark.eggleston@codethink.com> > +! > + > +include "dec-comparison-complex_1.f90" > + > +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 10 } > +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 13 } > +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 14 } > +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 15 } > +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 16 } > + > diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-complex_3.f90 b/gcc/testsuite/gfortran.dg/dec-comparison-complex_3.f90 > new file mode 100644 > index 00000000000..9af12d9f8a0 > --- /dev/null > +++ b/gcc/testsuite/gfortran.dg/dec-comparison-complex_3.f90 > @@ -0,0 +1,18 @@ > +! { dg-do compile } > +! > +! Test case contributed by Mark Eggleston<mark.eggleston@codethink.com> > +! > + > +include "dec-comparison-complex_1.f90" > + > +! { dg-warning "Legacy Extension: Hollerith constant at" " " { target *-*-* } 10 } > +! { dg-warning "Legacy Extension: Hollerith constant at" " " { target *-*-* } 13 } > +! { dg-warning "Legacy Extension: Hollerith constant at" " " { target *-*-* } 14 } > +! { dg-warning "Legacy Extension: Hollerith constant at" " " { target *-*-* } 15 } > +! { dg-warning "Legacy Extension: Hollerith constant at" " " { target *-*-* } 16 } > +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 10 } > +! { dg-error "Operands of comparison operator" " " { target *-*-* } 13 } > +! { dg-error "Operands of comparison operator" " " { target *-*-* } 14 } > +! { dg-error "Operands of comparison operator" " " { target *-*-* } 15 } > +! { dg-error "Operands of comparison operator" " " { target *-*-* } 16 } > + > diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-int_1.f90 b/gcc/testsuite/gfortran.dg/dec-comparison-int_1.f90 > new file mode 100644 > index 00000000000..257cc1ddef7 > --- /dev/null > +++ b/gcc/testsuite/gfortran.dg/dec-comparison-int_1.f90 > @@ -0,0 +1,22 @@ > +! { dg-do run } > +! { dg-options "-fdec" } > +! > +! Test case contributed by Mark Eggleston<mark.eggleston@codethink.com> > +! > + > +program convert > + integer(4) :: a > + integer(4) :: b > + a = 4HABCD > + b = transfer("ABCD", b) > + ! Hollerith constants > + if (a.ne.4HABCD) stop 1 > + if (a.eq.4HABCE) stop 2 > + if (4HABCD.ne.b) stop 3 > + if (4HABCE.eq.b) stop 4 > + if (4HABCE.lt.a) stop 5 > + if (a.gt.4HABCE) stop 6 > + if (4HABCE.le.a) stop 7 > + if (a.ge.4HABCE) stop 8 > +end program > + > diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-int_2.f90 b/gcc/testsuite/gfortran.dg/dec-comparison-int_2.f90 > new file mode 100644 > index 00000000000..10d00071f22 > --- /dev/null > +++ b/gcc/testsuite/gfortran.dg/dec-comparison-int_2.f90 > @@ -0,0 +1,18 @@ > +! { dg-do run } > +! { dg-options "-fdec -Wconversion" } > +! > +! Test case contributed by Mark Eggleston<mark.eggleston@codethink.com> > +! > + > +include "dec-comparison-int_1.f90" > + > +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 10 } > +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 13 } > +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 14 } > +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 15 } > +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 16 } > +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 17 } > +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 18 } > +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 19 } > +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 20 } > + > diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-int_3.f90 b/gcc/testsuite/gfortran.dg/dec-comparison-int_3.f90 > new file mode 100644 > index 00000000000..bf17272676e > --- /dev/null > +++ b/gcc/testsuite/gfortran.dg/dec-comparison-int_3.f90 > @@ -0,0 +1,26 @@ > +! { dg-do compile } > +! > +! Test case contributed by Mark Eggleston<mark.eggleston@codethink.com> > +! > + > +include "dec-comparison-int_1.f90" > + > +! { dg-warning "Extension: Hollerith constant at" " " { target *-*-* } 10 } > +! { dg-warning "Extension: Hollerith constant at" " " { target *-*-* } 13 } > +! { dg-warning "Extension: Hollerith constant at" " " { target *-*-* } 14 } > +! { dg-warning "Extension: Hollerith constant at" " " { target *-*-* } 15 } > +! { dg-warning "Extension: Hollerith constant at" " " { target *-*-* } 16 } > +! { dg-warning "Extension: Hollerith constant at" " " { target *-*-* } 17 } > +! { dg-warning "Extension: Hollerith constant at" " " { target *-*-* } 18 } > +! { dg-warning "Extension: Hollerith constant at" " " { target *-*-* } 19 } > +! { dg-warning "Extension: Hollerith constant at" " " { target *-*-* } 20 } > +! { dg-warning "HOLLERITH to INTEGER" " " { target *-*-* } 10 } > +! { dg-error "Operands of comparison operator" " " { target *-*-* } 13 } > +! { dg-error "Operands of comparison operator" " " { target *-*-* } 14 } > +! { dg-error "Operands of comparison operator" " " { target *-*-* } 15 } > +! { dg-error "Operands of comparison operator" " " { target *-*-* } 16 } > +! { dg-error "Operands of comparison operator" " " { target *-*-* } 17 } > +! { dg-error "Operands of comparison operator" " " { target *-*-* } 18 } > +! { dg-error "Operands of comparison operator" " " { target *-*-* } 19 } > +! { dg-error "Operands of comparison operator" " " { target *-*-* } 20 } > + > diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-real_1.f90 b/gcc/testsuite/gfortran.dg/dec-comparison-real_1.f90 > new file mode 100644 > index 00000000000..a8d08e952cb > --- /dev/null > +++ b/gcc/testsuite/gfortran.dg/dec-comparison-real_1.f90 > @@ -0,0 +1,22 @@ > +! { dg-do run } > +! { dg-options "-fdec" } > +! > +! Test case contributed by Mark Eggleston<mark.eggleston@codethink.com> > +! > + > +program convert > + real(4) :: a > + real(4) :: b > + a = 4HABCD > + b = transfer("ABCD", b) > + ! Hollerith constants > + if (a.ne.4HABCD) stop 1 > + if (a.eq.4HABCE) stop 2 > + if (4HABCD.ne.b) stop 3 > + if (4HABCE.eq.b) stop 4 > + if (4HABCE.lt.a) stop 5 > + if (a.gt.4HABCE) stop 6 > + if (4HABCE.le.a) stop 7 > + if (a.ge.4HABCE) stop 8 > +end program > + > diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-real_2.f90 b/gcc/testsuite/gfortran.dg/dec-comparison-real_2.f90 > new file mode 100644 > index 00000000000..9b65901b92f > --- /dev/null > +++ b/gcc/testsuite/gfortran.dg/dec-comparison-real_2.f90 > @@ -0,0 +1,18 @@ > +! { dg-do run } > +! { dg-options "-fdec -Wconversion" } > +! > +! Test case contributed by Mark Eggleston<mark.eggleston@codethink.com> > +! > + > +include "dec-comparison-real_1.f90" > + > +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 10 } > +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 13 } > +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 14 } > +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 15 } > +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 16 } > +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 17 } > +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 18 } > +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 19 } > +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 20 } > + > diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-real_3.f90 b/gcc/testsuite/gfortran.dg/dec-comparison-real_3.f90 > new file mode 100644 > index 00000000000..1c2d496f9f0 > --- /dev/null > +++ b/gcc/testsuite/gfortran.dg/dec-comparison-real_3.f90 > @@ -0,0 +1,26 @@ > +! { dg-do compile } > +! > +! Test case contributed by Mark Eggleston<mark.eggleston@codethink.com> > +! > + > +include "dec-comparison-real_1.f90" > + > +! { dg-warning "Legacy Extension: Hollerith constant at" " " { target *-*-* } 10 } > +! { dg-warning "Legacy Extension: Hollerith constant at" " " { target *-*-* } 13 } > +! { dg-warning "Legacy Extension: Hollerith constant at" " " { target *-*-* } 14 } > +! { dg-warning "Legacy Extension: Hollerith constant at" " " { target *-*-* } 15 } > +! { dg-warning "Legacy Extension: Hollerith constant at" " " { target *-*-* } 16 } > +! { dg-warning "Legacy Extension: Hollerith constant at" " " { target *-*-* } 17 } > +! { dg-warning "Legacy Extension: Hollerith constant at" " " { target *-*-* } 18 } > +! { dg-warning "Legacy Extension: Hollerith constant at" " " { target *-*-* } 19 } > +! { dg-warning "Legacy Extension: Hollerith constant at" " " { target *-*-* } 20 } > +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 10 } > +! { dg-error "Operands of comparison operator" " " { target *-*-* } 13 } > +! { dg-error "Operands of comparison operator" " " { target *-*-* } 14 } > +! { dg-error "Operands of comparison operator" " " { target *-*-* } 15 } > +! { dg-error "Operands of comparison operator" " " { target *-*-* } 16 } > +! { dg-error "Operands of comparison operator" " " { target *-*-* } 17 } > +! { dg-error "Operands of comparison operator" " " { target *-*-* } 18 } > +! { dg-error "Operands of comparison operator" " " { target *-*-* } 19 } > +! { dg-error "Operands of comparison operator" " " { target *-*-* } 20 } > + > diff --git a/gcc/testsuite/gfortran.dg/dec-comparison.f90 b/gcc/testsuite/gfortran.dg/dec-comparison.f90 > new file mode 100644 > index 00000000000..b0b28e55111 > --- /dev/null > +++ b/gcc/testsuite/gfortran.dg/dec-comparison.f90 > @@ -0,0 +1,41 @@ > +! { dg-do run } > +! { dg-options "-fdec" } > +! > +! Test case contributed by Mark Eggleston<mark.eggleston@codethink.com> > +! > +! Hollerith constants and character literals are allowed in comparisons, > +! check that character variables can not be compared with numeric variables. > + > +program convert > + character(4) :: a = 4hJMAC > + integer(4) :: b = "JMAC" > + real(4) :: c = "JMAC" > + complex(4) :: d = "JMACJMAC" > + ! integers > + if (a.ne.b) stop 1 ! { dg-error "Operands of comparison" } > + if (b.eq.a) stop 2 ! { dg-error "Operands of comparison" } > + if (a.ge.b) stop 3 ! { dg-error "Operands of comparison" } > + if (b.ge.a) stop 4 ! { dg-error "Operands of comparison" } > + if (a.gt.b) stop 5 ! { dg-error "Operands of comparison" } > + if (b.gt.a) stop 6 ! { dg-error "Operands of comparison" } > + if (a.le.b) stop 3 ! { dg-error "Operands of comparison" } > + if (b.le.a) stop 4 ! { dg-error "Operands of comparison" } > + if (a.lt.b) stop 5 ! { dg-error "Operands of comparison" } > + if (b.lt.a) stop 6 ! { dg-error "Operands of comparison" } > + ! reals > + if (a.ne.c) stop 7 ! { dg-error "Operands of comparison" } > + if (c.eq.a) stop 8 ! { dg-error "Operands of comparison" } > + if (a.ge.c) stop 9 ! { dg-error "Operands of comparison" } > + if (c.ge.a) stop 10 ! { dg-error "Operands of comparison" } > + if (a.gt.c) stop 11 ! { dg-error "Operands of comparison" } > + if (c.gt.a) stop 12 ! { dg-error "Operands of comparison" } > + if (a.le.c) stop 13 ! { dg-error "Operands of comparison" } > + if (c.le.a) stop 14 ! { dg-error "Operands of comparison" } > + if (a.lt.c) stop 15 ! { dg-error "Operands of comparison" } > + if (c.lt.a) stop 16 ! { dg-error "Operands of comparison" } > + ! complexes > + a = "JMACJMAC" > + if (a.ne.d) stop 17 ! { dg-error "Operands of comparison" } > + if (d.eq.a) stop 18 ! { dg-error "Operands of comparison" } > +end program > + > -- 2.11.0
Commited https://gcc.gnu.org/viewcvs/gcc?view=revision&revision=278674 On 22/11/2019 11:33, Tobias Burnus wrote: > First, can you also create some news quip for your GCC 10 changes for > https://gcc.gnu.org/gcc-10/changes.html ? See > https://gcc.gnu.org/about.html#git for the repository to diff against. As I right in thinking that items should be added to the list of Fortran changes in the file gcc-wwwdocs/htdocs/gcc-10/changes.html? Is there any procedure for checking changes to this repository? regards, Mark > > On 11/21/19 12:05 PM, Mark Eggleston wrote: >> Please find attached an updated version of the patch originally >> submitted on 15th November. The comparisons with Holleriths are no >> only possible when using -fdec. > s/no/now/ >> The test cases have been revised to check for errors when -fdec is >> not used. >> OK to commit in stage 3 or delay until stage 1 in the new year? > > LGTM – The first version of the patch has been posted before Stage 3, > which also has just started, and is very restricted – all are good > reasons that GCC 10 trunk is fine. > > Cheers, > > Tobias > >> Change logs: >> gcc/fortran >> >> 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. >> >> gcc/testsuite >> >> 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. >> >> -- >> https://www.codethink.co.uk/privacy.html >> >> >> 0001-dec-comparisons.patch >> >> From 2fc6d83614d7f58620a9a9662e9972b5d4018ed1 Mon Sep 17 00:00:00 2001 >> From: Mark Eggleston<markeggleston@codethink.com> >> Date: Thu, 23 May 2019 09:42:26 +0100 >> Subject: [PATCH] dec comparisons >> >> Allow comparison of Hollerith constants with numeric and character >> expressions. Also allow comparison of character literalsa with numeric >> expressions. >> >> Enable using -fdec-comparisons or -fdec >> --- >> gcc/fortran/gfortran.texi | 32 +++++++++---- >> gcc/fortran/invoke.texi | 24 +++++----- >> gcc/fortran/resolve.c | 54 >> +++++++++++++++++++++- >> .../gfortran.dg/dec-comparison-character_1.f90 | 18 ++++++++ >> .../gfortran.dg/dec-comparison-character_2.f90 | 18 ++++++++ >> .../gfortran.dg/dec-comparison-character_3.f90 | 26 +++++++++++ >> .../gfortran.dg/dec-comparison-complex_1.f90 | 17 +++++++ >> .../gfortran.dg/dec-comparison-complex_2.f90 | 14 ++++++ >> .../gfortran.dg/dec-comparison-complex_3.f90 | 18 ++++++++ >> gcc/testsuite/gfortran.dg/dec-comparison-int_1.f90 | 22 +++++++++ >> gcc/testsuite/gfortran.dg/dec-comparison-int_2.f90 | 18 ++++++++ >> gcc/testsuite/gfortran.dg/dec-comparison-int_3.f90 | 26 +++++++++++ >> .../gfortran.dg/dec-comparison-real_1.f90 | 22 +++++++++ >> .../gfortran.dg/dec-comparison-real_2.f90 | 18 ++++++++ >> .../gfortran.dg/dec-comparison-real_3.f90 | 26 +++++++++++ >> gcc/testsuite/gfortran.dg/dec-comparison.f90 | 41 >> ++++++++++++++++ >> 16 files changed, 371 insertions(+), 23 deletions(-) >> create mode 100644 >> gcc/testsuite/gfortran.dg/dec-comparison-character_1.f90 >> create mode 100644 >> gcc/testsuite/gfortran.dg/dec-comparison-character_2.f90 >> create mode 100644 >> gcc/testsuite/gfortran.dg/dec-comparison-character_3.f90 >> create mode 100644 >> gcc/testsuite/gfortran.dg/dec-comparison-complex_1.f90 >> create mode 100644 >> gcc/testsuite/gfortran.dg/dec-comparison-complex_2.f90 >> create mode 100644 >> gcc/testsuite/gfortran.dg/dec-comparison-complex_3.f90 >> create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison-int_1.f90 >> create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison-int_2.f90 >> create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison-int_3.f90 >> create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison-real_1.f90 >> create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison-real_2.f90 >> create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison-real_3.f90 >> create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison.f90 >> >> diff --git a/gcc/fortran/gfortran.texi b/gcc/fortran/gfortran.texi >> index a34ac5aa1bf..96be58b992d 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 46ee3c9241b..0bc054f01e5 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 2371a9e201f..278dad363fd 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 >> diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-character_1.f90 >> b/gcc/testsuite/gfortran.dg/dec-comparison-character_1.f90 >> new file mode 100644 >> index 00000000000..0e542e8354b >> --- /dev/null >> +++ b/gcc/testsuite/gfortran.dg/dec-comparison-character_1.f90 >> @@ -0,0 +1,18 @@ >> +! { dg-do run } >> +! { dg-options "-fdec" } >> +! >> +! Test case contributed by Mark Eggleston<mark.eggleston@codethink.com> >> +! >> + >> +program convert >> + character(4) :: c = 4HJMAC >> + if (4HJMAC.ne.4HJMAC) stop 1 >> + if (4HJMAC.ne."JMAC") stop 2 >> + if (4HJMAC.eq."JMAN") stop 3 >> + if ("JMAC".eq.4HJMAN) stop 4 >> + if ("AAAA".eq.5HAAAAA) stop 5 >> + if ("BBBBB".eq.5HBBBB ) stop 6 >> + if (4HJMAC.ne.c) stop 7 >> + if (c.ne.4HJMAC) stop 8 >> +end program >> + >> diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-character_2.f90 >> b/gcc/testsuite/gfortran.dg/dec-comparison-character_2.f90 >> new file mode 100644 >> index 00000000000..d35eaad17e1 >> --- /dev/null >> +++ b/gcc/testsuite/gfortran.dg/dec-comparison-character_2.f90 >> @@ -0,0 +1,18 @@ >> +! { dg-do run } >> +! { dg-options "-fdec -Wconversion" } >> +! >> +! Test case contributed by Mark Eggleston<mark.eggleston@codethink.com> >> +! >> + >> +include "dec-comparison-character_1.f90" >> + >> +! { dg-warning "HOLLERITH to CHARACTER" " " { target *-*-* } 8 } >> +! { dg-warning "HOLLERITH to CHARACTER" " " { target *-*-* } 9 } >> +! { dg-warning "HOLLERITH to CHARACTER" " " { target *-*-* } 10 } >> +! { dg-warning "HOLLERITH to CHARACTER" " " { target *-*-* } 11 } >> +! { dg-warning "HOLLERITH to CHARACTER" " " { target *-*-* } 12 } >> +! { dg-warning "HOLLERITH to CHARACTER" " " { target *-*-* } 13 } >> +! { dg-warning "HOLLERITH to CHARACTER" " " { target *-*-* } 14 } >> +! { dg-warning "HOLLERITH to CHARACTER" " " { target *-*-* } 15 } >> +! { dg-warning "HOLLERITH to CHARACTER" " " { target *-*-* } 16 } >> + >> diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-character_3.f90 >> b/gcc/testsuite/gfortran.dg/dec-comparison-character_3.f90 >> new file mode 100644 >> index 00000000000..adbb554bfbe >> --- /dev/null >> +++ b/gcc/testsuite/gfortran.dg/dec-comparison-character_3.f90 >> @@ -0,0 +1,26 @@ >> +! { dg-do compile } >> +! >> +! Test case contributed by Mark Eggleston<mark.eggleston@codethink.com> >> +! >> + >> +include "dec-comparison-character_1.f90" >> + >> +! { dg-warning "Legacy Extension: Hollerith constant at" " " { >> target *-*-* } 8 } >> +! { dg-warning "Legacy Extension: Hollerith constant at" " " { >> target *-*-* } 9 } >> +! { dg-warning "Legacy Extension: Hollerith constant at" " " { >> target *-*-* } 10 } >> +! { dg-warning "Legacy Extension: Hollerith constant at" " " { >> target *-*-* } 11 } >> +! { dg-warning "Legacy Extension: Hollerith constant at" " " { >> target *-*-* } 12 } >> +! { dg-warning "Legacy Extension: Hollerith constant at" " " { >> target *-*-* } 13 } >> +! { dg-warning "Legacy Extension: Hollerith constant at" " " { >> target *-*-* } 14 } >> +! { dg-warning "Legacy Extension: Hollerith constant at" " " { >> target *-*-* } 15 } >> +! { dg-warning "Legacy Extension: Hollerith constant at" " " { >> target *-*-* } 16 } >> +! { dg-warning "Extension: Conversion from HOLLERITH to CHARACTER" " >> " { target *-*-* } 8 } >> +! { dg-error "Operands of comparison operator" " " { target *-*-* } 9 } >> +! { dg-error "Operands of comparison operator" " " { target *-*-* } >> 10 } >> +! { dg-error "Operands of comparison operator" " " { target *-*-* } >> 11 } >> +! { dg-error "Operands of comparison operator" " " { target *-*-* } >> 12 } >> +! { dg-error "Operands of comparison operator" " " { target *-*-* } >> 13 } >> +! { dg-error "Operands of comparison operator" " " { target *-*-* } >> 14 } >> +! { dg-error "Operands of comparison operator" " " { target *-*-* } >> 15 } >> +! { dg-error "Operands of comparison operator" " " { target *-*-* } >> 16 } >> + >> diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-complex_1.f90 >> b/gcc/testsuite/gfortran.dg/dec-comparison-complex_1.f90 >> new file mode 100644 >> index 00000000000..4bbb9a18b88 >> --- /dev/null >> +++ b/gcc/testsuite/gfortran.dg/dec-comparison-complex_1.f90 >> @@ -0,0 +1,17 @@ >> +! { dg-do run } >> +! { dg-options "-fdec" } >> +! >> +! Test case contributed by Mark Eggleston<mark.eggleston@codethink.com> >> +! >> + >> +program convert >> + complex(4) :: a >> + complex(4) :: b >> + a = 8HABCDABCD >> + b = transfer("ABCDABCD", b); >> + ! Hollerith constants >> + if (a.ne.8HABCDABCD) stop 1 >> + if (a.eq.8HABCEABCE) stop 2 >> + if (8HABCDABCD.ne.b) stop 3 >> + if (8HABCEABCE.eq.b) stop 4 >> +end program >> diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-complex_2.f90 >> b/gcc/testsuite/gfortran.dg/dec-comparison-complex_2.f90 >> new file mode 100644 >> index 00000000000..82372095362 >> --- /dev/null >> +++ b/gcc/testsuite/gfortran.dg/dec-comparison-complex_2.f90 >> @@ -0,0 +1,14 @@ >> +! { dg-do run } >> +! { dg-options "-fdec -Wconversion" } >> +! >> +! Test case contributed by Mark Eggleston<mark.eggleston@codethink.com> >> +! >> + >> +include "dec-comparison-complex_1.f90" >> + >> +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 10 } >> +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 13 } >> +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 14 } >> +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 15 } >> +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 16 } >> + >> diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-complex_3.f90 >> b/gcc/testsuite/gfortran.dg/dec-comparison-complex_3.f90 >> new file mode 100644 >> index 00000000000..9af12d9f8a0 >> --- /dev/null >> +++ b/gcc/testsuite/gfortran.dg/dec-comparison-complex_3.f90 >> @@ -0,0 +1,18 @@ >> +! { dg-do compile } >> +! >> +! Test case contributed by Mark Eggleston<mark.eggleston@codethink.com> >> +! >> + >> +include "dec-comparison-complex_1.f90" >> + >> +! { dg-warning "Legacy Extension: Hollerith constant at" " " { >> target *-*-* } 10 } >> +! { dg-warning "Legacy Extension: Hollerith constant at" " " { >> target *-*-* } 13 } >> +! { dg-warning "Legacy Extension: Hollerith constant at" " " { >> target *-*-* } 14 } >> +! { dg-warning "Legacy Extension: Hollerith constant at" " " { >> target *-*-* } 15 } >> +! { dg-warning "Legacy Extension: Hollerith constant at" " " { >> target *-*-* } 16 } >> +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 10 } >> +! { dg-error "Operands of comparison operator" " " { target *-*-* } >> 13 } >> +! { dg-error "Operands of comparison operator" " " { target *-*-* } >> 14 } >> +! { dg-error "Operands of comparison operator" " " { target *-*-* } >> 15 } >> +! { dg-error "Operands of comparison operator" " " { target *-*-* } >> 16 } >> + >> diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-int_1.f90 >> b/gcc/testsuite/gfortran.dg/dec-comparison-int_1.f90 >> new file mode 100644 >> index 00000000000..257cc1ddef7 >> --- /dev/null >> +++ b/gcc/testsuite/gfortran.dg/dec-comparison-int_1.f90 >> @@ -0,0 +1,22 @@ >> +! { dg-do run } >> +! { dg-options "-fdec" } >> +! >> +! Test case contributed by Mark Eggleston<mark.eggleston@codethink.com> >> +! >> + >> +program convert >> + integer(4) :: a >> + integer(4) :: b >> + a = 4HABCD >> + b = transfer("ABCD", b) >> + ! Hollerith constants >> + if (a.ne.4HABCD) stop 1 >> + if (a.eq.4HABCE) stop 2 >> + if (4HABCD.ne.b) stop 3 >> + if (4HABCE.eq.b) stop 4 >> + if (4HABCE.lt.a) stop 5 >> + if (a.gt.4HABCE) stop 6 >> + if (4HABCE.le.a) stop 7 >> + if (a.ge.4HABCE) stop 8 >> +end program >> + >> diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-int_2.f90 >> b/gcc/testsuite/gfortran.dg/dec-comparison-int_2.f90 >> new file mode 100644 >> index 00000000000..10d00071f22 >> --- /dev/null >> +++ b/gcc/testsuite/gfortran.dg/dec-comparison-int_2.f90 >> @@ -0,0 +1,18 @@ >> +! { dg-do run } >> +! { dg-options "-fdec -Wconversion" } >> +! >> +! Test case contributed by Mark Eggleston<mark.eggleston@codethink.com> >> +! >> + >> +include "dec-comparison-int_1.f90" >> + >> +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 10 } >> +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 13 } >> +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 14 } >> +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 15 } >> +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 16 } >> +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 17 } >> +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 18 } >> +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 19 } >> +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 20 } >> + >> diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-int_3.f90 >> b/gcc/testsuite/gfortran.dg/dec-comparison-int_3.f90 >> new file mode 100644 >> index 00000000000..bf17272676e >> --- /dev/null >> +++ b/gcc/testsuite/gfortran.dg/dec-comparison-int_3.f90 >> @@ -0,0 +1,26 @@ >> +! { dg-do compile } >> +! >> +! Test case contributed by Mark Eggleston<mark.eggleston@codethink.com> >> +! >> + >> +include "dec-comparison-int_1.f90" >> + >> +! { dg-warning "Extension: Hollerith constant at" " " { target *-*-* >> } 10 } >> +! { dg-warning "Extension: Hollerith constant at" " " { target *-*-* >> } 13 } >> +! { dg-warning "Extension: Hollerith constant at" " " { target *-*-* >> } 14 } >> +! { dg-warning "Extension: Hollerith constant at" " " { target *-*-* >> } 15 } >> +! { dg-warning "Extension: Hollerith constant at" " " { target *-*-* >> } 16 } >> +! { dg-warning "Extension: Hollerith constant at" " " { target *-*-* >> } 17 } >> +! { dg-warning "Extension: Hollerith constant at" " " { target *-*-* >> } 18 } >> +! { dg-warning "Extension: Hollerith constant at" " " { target *-*-* >> } 19 } >> +! { dg-warning "Extension: Hollerith constant at" " " { target *-*-* >> } 20 } >> +! { dg-warning "HOLLERITH to INTEGER" " " { target *-*-* } 10 } >> +! { dg-error "Operands of comparison operator" " " { target *-*-* } >> 13 } >> +! { dg-error "Operands of comparison operator" " " { target *-*-* } >> 14 } >> +! { dg-error "Operands of comparison operator" " " { target *-*-* } >> 15 } >> +! { dg-error "Operands of comparison operator" " " { target *-*-* } >> 16 } >> +! { dg-error "Operands of comparison operator" " " { target *-*-* } >> 17 } >> +! { dg-error "Operands of comparison operator" " " { target *-*-* } >> 18 } >> +! { dg-error "Operands of comparison operator" " " { target *-*-* } >> 19 } >> +! { dg-error "Operands of comparison operator" " " { target *-*-* } >> 20 } >> + >> diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-real_1.f90 >> b/gcc/testsuite/gfortran.dg/dec-comparison-real_1.f90 >> new file mode 100644 >> index 00000000000..a8d08e952cb >> --- /dev/null >> +++ b/gcc/testsuite/gfortran.dg/dec-comparison-real_1.f90 >> @@ -0,0 +1,22 @@ >> +! { dg-do run } >> +! { dg-options "-fdec" } >> +! >> +! Test case contributed by Mark Eggleston<mark.eggleston@codethink.com> >> +! >> + >> +program convert >> + real(4) :: a >> + real(4) :: b >> + a = 4HABCD >> + b = transfer("ABCD", b) >> + ! Hollerith constants >> + if (a.ne.4HABCD) stop 1 >> + if (a.eq.4HABCE) stop 2 >> + if (4HABCD.ne.b) stop 3 >> + if (4HABCE.eq.b) stop 4 >> + if (4HABCE.lt.a) stop 5 >> + if (a.gt.4HABCE) stop 6 >> + if (4HABCE.le.a) stop 7 >> + if (a.ge.4HABCE) stop 8 >> +end program >> + >> diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-real_2.f90 >> b/gcc/testsuite/gfortran.dg/dec-comparison-real_2.f90 >> new file mode 100644 >> index 00000000000..9b65901b92f >> --- /dev/null >> +++ b/gcc/testsuite/gfortran.dg/dec-comparison-real_2.f90 >> @@ -0,0 +1,18 @@ >> +! { dg-do run } >> +! { dg-options "-fdec -Wconversion" } >> +! >> +! Test case contributed by Mark Eggleston<mark.eggleston@codethink.com> >> +! >> + >> +include "dec-comparison-real_1.f90" >> + >> +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 10 } >> +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 13 } >> +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 14 } >> +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 15 } >> +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 16 } >> +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 17 } >> +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 18 } >> +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 19 } >> +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 20 } >> + >> diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-real_3.f90 >> b/gcc/testsuite/gfortran.dg/dec-comparison-real_3.f90 >> new file mode 100644 >> index 00000000000..1c2d496f9f0 >> --- /dev/null >> +++ b/gcc/testsuite/gfortran.dg/dec-comparison-real_3.f90 >> @@ -0,0 +1,26 @@ >> +! { dg-do compile } >> +! >> +! Test case contributed by Mark Eggleston<mark.eggleston@codethink.com> >> +! >> + >> +include "dec-comparison-real_1.f90" >> + >> +! { dg-warning "Legacy Extension: Hollerith constant at" " " { >> target *-*-* } 10 } >> +! { dg-warning "Legacy Extension: Hollerith constant at" " " { >> target *-*-* } 13 } >> +! { dg-warning "Legacy Extension: Hollerith constant at" " " { >> target *-*-* } 14 } >> +! { dg-warning "Legacy Extension: Hollerith constant at" " " { >> target *-*-* } 15 } >> +! { dg-warning "Legacy Extension: Hollerith constant at" " " { >> target *-*-* } 16 } >> +! { dg-warning "Legacy Extension: Hollerith constant at" " " { >> target *-*-* } 17 } >> +! { dg-warning "Legacy Extension: Hollerith constant at" " " { >> target *-*-* } 18 } >> +! { dg-warning "Legacy Extension: Hollerith constant at" " " { >> target *-*-* } 19 } >> +! { dg-warning "Legacy Extension: Hollerith constant at" " " { >> target *-*-* } 20 } >> +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 10 } >> +! { dg-error "Operands of comparison operator" " " { target *-*-* } >> 13 } >> +! { dg-error "Operands of comparison operator" " " { target *-*-* } >> 14 } >> +! { dg-error "Operands of comparison operator" " " { target *-*-* } >> 15 } >> +! { dg-error "Operands of comparison operator" " " { target *-*-* } >> 16 } >> +! { dg-error "Operands of comparison operator" " " { target *-*-* } >> 17 } >> +! { dg-error "Operands of comparison operator" " " { target *-*-* } >> 18 } >> +! { dg-error "Operands of comparison operator" " " { target *-*-* } >> 19 } >> +! { dg-error "Operands of comparison operator" " " { target *-*-* } >> 20 } >> + >> diff --git a/gcc/testsuite/gfortran.dg/dec-comparison.f90 >> b/gcc/testsuite/gfortran.dg/dec-comparison.f90 >> new file mode 100644 >> index 00000000000..b0b28e55111 >> --- /dev/null >> +++ b/gcc/testsuite/gfortran.dg/dec-comparison.f90 >> @@ -0,0 +1,41 @@ >> +! { dg-do run } >> +! { dg-options "-fdec" } >> +! >> +! Test case contributed by Mark Eggleston<mark.eggleston@codethink.com> >> +! >> +! Hollerith constants and character literals are allowed in >> comparisons, >> +! check that character variables can not be compared with numeric >> variables. >> + >> +program convert >> + character(4) :: a = 4hJMAC >> + integer(4) :: b = "JMAC" >> + real(4) :: c = "JMAC" >> + complex(4) :: d = "JMACJMAC" >> + ! integers >> + if (a.ne.b) stop 1 ! { dg-error "Operands of comparison" } >> + if (b.eq.a) stop 2 ! { dg-error "Operands of comparison" } >> + if (a.ge.b) stop 3 ! { dg-error "Operands of comparison" } >> + if (b.ge.a) stop 4 ! { dg-error "Operands of comparison" } >> + if (a.gt.b) stop 5 ! { dg-error "Operands of comparison" } >> + if (b.gt.a) stop 6 ! { dg-error "Operands of comparison" } >> + if (a.le.b) stop 3 ! { dg-error "Operands of comparison" } >> + if (b.le.a) stop 4 ! { dg-error "Operands of comparison" } >> + if (a.lt.b) stop 5 ! { dg-error "Operands of comparison" } >> + if (b.lt.a) stop 6 ! { dg-error "Operands of comparison" } >> + ! reals >> + if (a.ne.c) stop 7 ! { dg-error "Operands of comparison" } >> + if (c.eq.a) stop 8 ! { dg-error "Operands of comparison" } >> + if (a.ge.c) stop 9 ! { dg-error "Operands of comparison" } >> + if (c.ge.a) stop 10 ! { dg-error "Operands of comparison" } >> + if (a.gt.c) stop 11 ! { dg-error "Operands of comparison" } >> + if (c.gt.a) stop 12 ! { dg-error "Operands of comparison" } >> + if (a.le.c) stop 13 ! { dg-error "Operands of comparison" } >> + if (c.le.a) stop 14 ! { dg-error "Operands of comparison" } >> + if (a.lt.c) stop 15 ! { dg-error "Operands of comparison" } >> + if (c.lt.a) stop 16 ! { dg-error "Operands of comparison" } >> + ! complexes >> + a = "JMACJMAC" >> + if (a.ne.d) stop 17 ! { dg-error "Operands of comparison" } >> + if (d.eq.a) stop 18 ! { dg-error "Operands of comparison" } >> +end program >> + >> -- 2.11.0 >
On 11/25/19 11:57 AM, Mark Eggleston wrote: > > On 22/11/2019 11:33, Tobias Burnus wrote: >> First, can you also create some news quip for your GCC 10 changes for >> https://gcc.gnu.org/gcc-10/changes.html ? See >> https://gcc.gnu.org/about.html#git for the repository to diff against. > As I right in thinking that items should be added to the list of > Fortran changes in the file gcc-wwwdocs/htdocs/gcc-10/changes.html? Yes – at least I assume that all your (relevant, user-visible) changes are for gfortran. > Is there any procedure for checking changes to this repository? I think the usual – you create a diff, submit it, asking for comments/approval and then commit it. As with document changes, the bar is a bit lower than for code changes. You could/should also added Gerald Pfeifer in CC, who looks after the web pages; he often has some syntax remarks (like <code> not <tt>) or points-out typos or odd grammar :-) Cheers, Tobias
On Fri, Nov 22, 2019 at 12:33:47PM +0100, Tobias Burnus wrote: > > Mark Eggleston <mark.eggleston@codethink.com> > > Jim MacArthur <jim.macarthur@codethink.co.uk> > > > > * gfortran.dg/dec-comparison.f90: New test. This test is UNRESOLVED everywhere, a test which expects dg-error diagnostic really can't be dg-do run, as for erroneous sources no executable is produced. Fixed thusly, tested on x86_64-linux, committed to trunk as obvious: 2019-11-26 Jakub Jelinek <jakub@redhat.com> * gfortran.dg/dec-comparison.f90: Change dg-do from run to compile. --- gcc/testsuite/gfortran.dg/dec-comparison.f90.jj 2019-11-25 22:44:22.187388294 +0100 +++ gcc/testsuite/gfortran.dg/dec-comparison.f90 2019-11-26 00:23:08.669581035 +0100 @@ -1,4 +1,4 @@ -! { dg-do run } +! { dg-do compile } ! { dg-options "-fdec" } ! ! Test case contributed by Mark Eggleston <mark.eggleston@codethink.com> @@ -38,4 +38,3 @@ program convert if (a.ne.d) stop 17 ! { dg-error "Operands of comparison" } if (d.eq.a) stop 18 ! { dg-error "Operands of comparison" } end program - Jakub
From 2fc6d83614d7f58620a9a9662e9972b5d4018ed1 Mon Sep 17 00:00:00 2001 From: Mark Eggleston <markeggleston@codethink.com> Date: Thu, 23 May 2019 09:42:26 +0100 Subject: [PATCH] dec comparisons Allow comparison of Hollerith constants with numeric and character expressions. Also allow comparison of character literalsa with numeric expressions. Enable using -fdec-comparisons or -fdec --- gcc/fortran/gfortran.texi | 32 +++++++++---- gcc/fortran/invoke.texi | 24 +++++----- gcc/fortran/resolve.c | 54 +++++++++++++++++++++- .../gfortran.dg/dec-comparison-character_1.f90 | 18 ++++++++ .../gfortran.dg/dec-comparison-character_2.f90 | 18 ++++++++ .../gfortran.dg/dec-comparison-character_3.f90 | 26 +++++++++++ .../gfortran.dg/dec-comparison-complex_1.f90 | 17 +++++++ .../gfortran.dg/dec-comparison-complex_2.f90 | 14 ++++++ .../gfortran.dg/dec-comparison-complex_3.f90 | 18 ++++++++ gcc/testsuite/gfortran.dg/dec-comparison-int_1.f90 | 22 +++++++++ gcc/testsuite/gfortran.dg/dec-comparison-int_2.f90 | 18 ++++++++ gcc/testsuite/gfortran.dg/dec-comparison-int_3.f90 | 26 +++++++++++ .../gfortran.dg/dec-comparison-real_1.f90 | 22 +++++++++ .../gfortran.dg/dec-comparison-real_2.f90 | 18 ++++++++ .../gfortran.dg/dec-comparison-real_3.f90 | 26 +++++++++++ gcc/testsuite/gfortran.dg/dec-comparison.f90 | 41 ++++++++++++++++ 16 files changed, 371 insertions(+), 23 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison-character_1.f90 create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison-character_2.f90 create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison-character_3.f90 create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison-complex_1.f90 create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison-complex_2.f90 create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison-complex_3.f90 create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison-int_1.f90 create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison-int_2.f90 create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison-int_3.f90 create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison-real_1.f90 create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison-real_2.f90 create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison-real_3.f90 create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison.f90 diff --git a/gcc/fortran/gfortran.texi b/gcc/fortran/gfortran.texi index a34ac5aa1bf..96be58b992d 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 46ee3c9241b..0bc054f01e5 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 2371a9e201f..278dad363fd 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 diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-character_1.f90 b/gcc/testsuite/gfortran.dg/dec-comparison-character_1.f90 new file mode 100644 index 00000000000..0e542e8354b --- /dev/null +++ b/gcc/testsuite/gfortran.dg/dec-comparison-character_1.f90 @@ -0,0 +1,18 @@ +! { dg-do run } +! { dg-options "-fdec" } +! +! Test case contributed by Mark Eggleston <mark.eggleston@codethink.com> +! + +program convert + character(4) :: c = 4HJMAC + if (4HJMAC.ne.4HJMAC) stop 1 + if (4HJMAC.ne."JMAC") stop 2 + if (4HJMAC.eq."JMAN") stop 3 + if ("JMAC".eq.4HJMAN) stop 4 + if ("AAAA".eq.5HAAAAA) stop 5 + if ("BBBBB".eq.5HBBBB ) stop 6 + if (4HJMAC.ne.c) stop 7 + if (c.ne.4HJMAC) stop 8 +end program + diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-character_2.f90 b/gcc/testsuite/gfortran.dg/dec-comparison-character_2.f90 new file mode 100644 index 00000000000..d35eaad17e1 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/dec-comparison-character_2.f90 @@ -0,0 +1,18 @@ +! { dg-do run } +! { dg-options "-fdec -Wconversion" } +! +! Test case contributed by Mark Eggleston <mark.eggleston@codethink.com> +! + +include "dec-comparison-character_1.f90" + +! { dg-warning "HOLLERITH to CHARACTER" " " { target *-*-* } 8 } +! { dg-warning "HOLLERITH to CHARACTER" " " { target *-*-* } 9 } +! { dg-warning "HOLLERITH to CHARACTER" " " { target *-*-* } 10 } +! { dg-warning "HOLLERITH to CHARACTER" " " { target *-*-* } 11 } +! { dg-warning "HOLLERITH to CHARACTER" " " { target *-*-* } 12 } +! { dg-warning "HOLLERITH to CHARACTER" " " { target *-*-* } 13 } +! { dg-warning "HOLLERITH to CHARACTER" " " { target *-*-* } 14 } +! { dg-warning "HOLLERITH to CHARACTER" " " { target *-*-* } 15 } +! { dg-warning "HOLLERITH to CHARACTER" " " { target *-*-* } 16 } + diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-character_3.f90 b/gcc/testsuite/gfortran.dg/dec-comparison-character_3.f90 new file mode 100644 index 00000000000..adbb554bfbe --- /dev/null +++ b/gcc/testsuite/gfortran.dg/dec-comparison-character_3.f90 @@ -0,0 +1,26 @@ +! { dg-do compile } +! +! Test case contributed by Mark Eggleston <mark.eggleston@codethink.com> +! + +include "dec-comparison-character_1.f90" + +! { dg-warning "Legacy Extension: Hollerith constant at" " " { target *-*-* } 8 } +! { dg-warning "Legacy Extension: Hollerith constant at" " " { target *-*-* } 9 } +! { dg-warning "Legacy Extension: Hollerith constant at" " " { target *-*-* } 10 } +! { dg-warning "Legacy Extension: Hollerith constant at" " " { target *-*-* } 11 } +! { dg-warning "Legacy Extension: Hollerith constant at" " " { target *-*-* } 12 } +! { dg-warning "Legacy Extension: Hollerith constant at" " " { target *-*-* } 13 } +! { dg-warning "Legacy Extension: Hollerith constant at" " " { target *-*-* } 14 } +! { dg-warning "Legacy Extension: Hollerith constant at" " " { target *-*-* } 15 } +! { dg-warning "Legacy Extension: Hollerith constant at" " " { target *-*-* } 16 } +! { dg-warning "Extension: Conversion from HOLLERITH to CHARACTER" " " { target *-*-* } 8 } +! { dg-error "Operands of comparison operator" " " { target *-*-* } 9 } +! { dg-error "Operands of comparison operator" " " { target *-*-* } 10 } +! { dg-error "Operands of comparison operator" " " { target *-*-* } 11 } +! { dg-error "Operands of comparison operator" " " { target *-*-* } 12 } +! { dg-error "Operands of comparison operator" " " { target *-*-* } 13 } +! { dg-error "Operands of comparison operator" " " { target *-*-* } 14 } +! { dg-error "Operands of comparison operator" " " { target *-*-* } 15 } +! { dg-error "Operands of comparison operator" " " { target *-*-* } 16 } + diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-complex_1.f90 b/gcc/testsuite/gfortran.dg/dec-comparison-complex_1.f90 new file mode 100644 index 00000000000..4bbb9a18b88 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/dec-comparison-complex_1.f90 @@ -0,0 +1,17 @@ +! { dg-do run } +! { dg-options "-fdec" } +! +! Test case contributed by Mark Eggleston <mark.eggleston@codethink.com> +! + +program convert + complex(4) :: a + complex(4) :: b + a = 8HABCDABCD + b = transfer("ABCDABCD", b); + ! Hollerith constants + if (a.ne.8HABCDABCD) stop 1 + if (a.eq.8HABCEABCE) stop 2 + if (8HABCDABCD.ne.b) stop 3 + if (8HABCEABCE.eq.b) stop 4 +end program diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-complex_2.f90 b/gcc/testsuite/gfortran.dg/dec-comparison-complex_2.f90 new file mode 100644 index 00000000000..82372095362 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/dec-comparison-complex_2.f90 @@ -0,0 +1,14 @@ +! { dg-do run } +! { dg-options "-fdec -Wconversion" } +! +! Test case contributed by Mark Eggleston <mark.eggleston@codethink.com> +! + +include "dec-comparison-complex_1.f90" + +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 10 } +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 13 } +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 14 } +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 15 } +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 16 } + diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-complex_3.f90 b/gcc/testsuite/gfortran.dg/dec-comparison-complex_3.f90 new file mode 100644 index 00000000000..9af12d9f8a0 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/dec-comparison-complex_3.f90 @@ -0,0 +1,18 @@ +! { dg-do compile } +! +! Test case contributed by Mark Eggleston <mark.eggleston@codethink.com> +! + +include "dec-comparison-complex_1.f90" + +! { dg-warning "Legacy Extension: Hollerith constant at" " " { target *-*-* } 10 } +! { dg-warning "Legacy Extension: Hollerith constant at" " " { target *-*-* } 13 } +! { dg-warning "Legacy Extension: Hollerith constant at" " " { target *-*-* } 14 } +! { dg-warning "Legacy Extension: Hollerith constant at" " " { target *-*-* } 15 } +! { dg-warning "Legacy Extension: Hollerith constant at" " " { target *-*-* } 16 } +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 10 } +! { dg-error "Operands of comparison operator" " " { target *-*-* } 13 } +! { dg-error "Operands of comparison operator" " " { target *-*-* } 14 } +! { dg-error "Operands of comparison operator" " " { target *-*-* } 15 } +! { dg-error "Operands of comparison operator" " " { target *-*-* } 16 } + diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-int_1.f90 b/gcc/testsuite/gfortran.dg/dec-comparison-int_1.f90 new file mode 100644 index 00000000000..257cc1ddef7 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/dec-comparison-int_1.f90 @@ -0,0 +1,22 @@ +! { dg-do run } +! { dg-options "-fdec" } +! +! Test case contributed by Mark Eggleston <mark.eggleston@codethink.com> +! + +program convert + integer(4) :: a + integer(4) :: b + a = 4HABCD + b = transfer("ABCD", b) + ! Hollerith constants + if (a.ne.4HABCD) stop 1 + if (a.eq.4HABCE) stop 2 + if (4HABCD.ne.b) stop 3 + if (4HABCE.eq.b) stop 4 + if (4HABCE.lt.a) stop 5 + if (a.gt.4HABCE) stop 6 + if (4HABCE.le.a) stop 7 + if (a.ge.4HABCE) stop 8 +end program + diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-int_2.f90 b/gcc/testsuite/gfortran.dg/dec-comparison-int_2.f90 new file mode 100644 index 00000000000..10d00071f22 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/dec-comparison-int_2.f90 @@ -0,0 +1,18 @@ +! { dg-do run } +! { dg-options "-fdec -Wconversion" } +! +! Test case contributed by Mark Eggleston <mark.eggleston@codethink.com> +! + +include "dec-comparison-int_1.f90" + +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 10 } +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 13 } +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 14 } +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 15 } +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 16 } +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 17 } +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 18 } +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 19 } +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 20 } + diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-int_3.f90 b/gcc/testsuite/gfortran.dg/dec-comparison-int_3.f90 new file mode 100644 index 00000000000..bf17272676e --- /dev/null +++ b/gcc/testsuite/gfortran.dg/dec-comparison-int_3.f90 @@ -0,0 +1,26 @@ +! { dg-do compile } +! +! Test case contributed by Mark Eggleston <mark.eggleston@codethink.com> +! + +include "dec-comparison-int_1.f90" + +! { dg-warning "Extension: Hollerith constant at" " " { target *-*-* } 10 } +! { dg-warning "Extension: Hollerith constant at" " " { target *-*-* } 13 } +! { dg-warning "Extension: Hollerith constant at" " " { target *-*-* } 14 } +! { dg-warning "Extension: Hollerith constant at" " " { target *-*-* } 15 } +! { dg-warning "Extension: Hollerith constant at" " " { target *-*-* } 16 } +! { dg-warning "Extension: Hollerith constant at" " " { target *-*-* } 17 } +! { dg-warning "Extension: Hollerith constant at" " " { target *-*-* } 18 } +! { dg-warning "Extension: Hollerith constant at" " " { target *-*-* } 19 } +! { dg-warning "Extension: Hollerith constant at" " " { target *-*-* } 20 } +! { dg-warning "HOLLERITH to INTEGER" " " { target *-*-* } 10 } +! { dg-error "Operands of comparison operator" " " { target *-*-* } 13 } +! { dg-error "Operands of comparison operator" " " { target *-*-* } 14 } +! { dg-error "Operands of comparison operator" " " { target *-*-* } 15 } +! { dg-error "Operands of comparison operator" " " { target *-*-* } 16 } +! { dg-error "Operands of comparison operator" " " { target *-*-* } 17 } +! { dg-error "Operands of comparison operator" " " { target *-*-* } 18 } +! { dg-error "Operands of comparison operator" " " { target *-*-* } 19 } +! { dg-error "Operands of comparison operator" " " { target *-*-* } 20 } + diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-real_1.f90 b/gcc/testsuite/gfortran.dg/dec-comparison-real_1.f90 new file mode 100644 index 00000000000..a8d08e952cb --- /dev/null +++ b/gcc/testsuite/gfortran.dg/dec-comparison-real_1.f90 @@ -0,0 +1,22 @@ +! { dg-do run } +! { dg-options "-fdec" } +! +! Test case contributed by Mark Eggleston <mark.eggleston@codethink.com> +! + +program convert + real(4) :: a + real(4) :: b + a = 4HABCD + b = transfer("ABCD", b) + ! Hollerith constants + if (a.ne.4HABCD) stop 1 + if (a.eq.4HABCE) stop 2 + if (4HABCD.ne.b) stop 3 + if (4HABCE.eq.b) stop 4 + if (4HABCE.lt.a) stop 5 + if (a.gt.4HABCE) stop 6 + if (4HABCE.le.a) stop 7 + if (a.ge.4HABCE) stop 8 +end program + diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-real_2.f90 b/gcc/testsuite/gfortran.dg/dec-comparison-real_2.f90 new file mode 100644 index 00000000000..9b65901b92f --- /dev/null +++ b/gcc/testsuite/gfortran.dg/dec-comparison-real_2.f90 @@ -0,0 +1,18 @@ +! { dg-do run } +! { dg-options "-fdec -Wconversion" } +! +! Test case contributed by Mark Eggleston <mark.eggleston@codethink.com> +! + +include "dec-comparison-real_1.f90" + +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 10 } +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 13 } +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 14 } +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 15 } +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 16 } +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 17 } +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 18 } +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 19 } +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 20 } + diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-real_3.f90 b/gcc/testsuite/gfortran.dg/dec-comparison-real_3.f90 new file mode 100644 index 00000000000..1c2d496f9f0 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/dec-comparison-real_3.f90 @@ -0,0 +1,26 @@ +! { dg-do compile } +! +! Test case contributed by Mark Eggleston <mark.eggleston@codethink.com> +! + +include "dec-comparison-real_1.f90" + +! { dg-warning "Legacy Extension: Hollerith constant at" " " { target *-*-* } 10 } +! { dg-warning "Legacy Extension: Hollerith constant at" " " { target *-*-* } 13 } +! { dg-warning "Legacy Extension: Hollerith constant at" " " { target *-*-* } 14 } +! { dg-warning "Legacy Extension: Hollerith constant at" " " { target *-*-* } 15 } +! { dg-warning "Legacy Extension: Hollerith constant at" " " { target *-*-* } 16 } +! { dg-warning "Legacy Extension: Hollerith constant at" " " { target *-*-* } 17 } +! { dg-warning "Legacy Extension: Hollerith constant at" " " { target *-*-* } 18 } +! { dg-warning "Legacy Extension: Hollerith constant at" " " { target *-*-* } 19 } +! { dg-warning "Legacy Extension: Hollerith constant at" " " { target *-*-* } 20 } +! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 10 } +! { dg-error "Operands of comparison operator" " " { target *-*-* } 13 } +! { dg-error "Operands of comparison operator" " " { target *-*-* } 14 } +! { dg-error "Operands of comparison operator" " " { target *-*-* } 15 } +! { dg-error "Operands of comparison operator" " " { target *-*-* } 16 } +! { dg-error "Operands of comparison operator" " " { target *-*-* } 17 } +! { dg-error "Operands of comparison operator" " " { target *-*-* } 18 } +! { dg-error "Operands of comparison operator" " " { target *-*-* } 19 } +! { dg-error "Operands of comparison operator" " " { target *-*-* } 20 } + diff --git a/gcc/testsuite/gfortran.dg/dec-comparison.f90 b/gcc/testsuite/gfortran.dg/dec-comparison.f90 new file mode 100644 index 00000000000..b0b28e55111 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/dec-comparison.f90 @@ -0,0 +1,41 @@ +! { dg-do run } +! { dg-options "-fdec" } +! +! Test case contributed by Mark Eggleston <mark.eggleston@codethink.com> +! +! Hollerith constants and character literals are allowed in comparisons, +! check that character variables can not be compared with numeric variables. + +program convert + character(4) :: a = 4hJMAC + integer(4) :: b = "JMAC" + real(4) :: c = "JMAC" + complex(4) :: d = "JMACJMAC" + ! integers + if (a.ne.b) stop 1 ! { dg-error "Operands of comparison" } + if (b.eq.a) stop 2 ! { dg-error "Operands of comparison" } + if (a.ge.b) stop 3 ! { dg-error "Operands of comparison" } + if (b.ge.a) stop 4 ! { dg-error "Operands of comparison" } + if (a.gt.b) stop 5 ! { dg-error "Operands of comparison" } + if (b.gt.a) stop 6 ! { dg-error "Operands of comparison" } + if (a.le.b) stop 3 ! { dg-error "Operands of comparison" } + if (b.le.a) stop 4 ! { dg-error "Operands of comparison" } + if (a.lt.b) stop 5 ! { dg-error "Operands of comparison" } + if (b.lt.a) stop 6 ! { dg-error "Operands of comparison" } + ! reals + if (a.ne.c) stop 7 ! { dg-error "Operands of comparison" } + if (c.eq.a) stop 8 ! { dg-error "Operands of comparison" } + if (a.ge.c) stop 9 ! { dg-error "Operands of comparison" } + if (c.ge.a) stop 10 ! { dg-error "Operands of comparison" } + if (a.gt.c) stop 11 ! { dg-error "Operands of comparison" } + if (c.gt.a) stop 12 ! { dg-error "Operands of comparison" } + if (a.le.c) stop 13 ! { dg-error "Operands of comparison" } + if (c.le.a) stop 14 ! { dg-error "Operands of comparison" } + if (a.lt.c) stop 15 ! { dg-error "Operands of comparison" } + if (c.lt.a) stop 16 ! { dg-error "Operands of comparison" } + ! complexes + a = "JMACJMAC" + if (a.ne.d) stop 17 ! { dg-error "Operands of comparison" } + if (d.eq.a) stop 18 ! { dg-error "Operands of comparison" } +end program + -- 2.11.0