[Fortran] dec comparisons - for approval

Message ID 30913a8a-4605-f97e-d247-3d38ee98094c@codethink.co.uk
State New
Headers show
Series
  • [Fortran] dec comparisons - for approval
Related show

Commit Message

Mark Eggleston Nov. 21, 2019, 11:05 a.m.
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.

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?

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

Comments

Tobias Burnus Nov. 22, 2019, 11:33 a.m. | #1
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
Mark Eggleston Nov. 25, 2019, 10:57 a.m. | #2
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

>

-- 
https://www.codethink.co.uk/privacy.html
Tobias Burnus Nov. 25, 2019, 11:25 a.m. | #3
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
Jakub Jelinek Nov. 25, 2019, 11:26 p.m. | #4
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

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