Blame SOURCES/0005-dec-comparisons.patch

ca6e07
From 6946d3e3e6a1d839772f4c59a5ab08901111800c Mon Sep 17 00:00:00 2001
ca6e07
From: Mark Eggleston <markeggleston@codethink.com>
ca6e07
Date: Thu, 23 May 2019 09:42:26 +0100
ca6e07
Subject: [PATCH 05/16] dec comparisons
ca6e07
ca6e07
Allow comparison of Hollerith constants with numeric and character
ca6e07
expressions. Also allow comparison of character literalsa with numeric
ca6e07
expressions.
ca6e07
ca6e07
Enable using -fdec-comparisons or -fdec
ca6e07
---
ca6e07
 gcc/fortran/intrinsic.c                            |  5 +-
ca6e07
 gcc/fortran/invoke.texi                            | 32 +++++++++++--
ca6e07
 gcc/fortran/lang.opt                               |  5 ++
ca6e07
 gcc/fortran/options.c                              |  1 +
ca6e07
 gcc/fortran/resolve.c                              | 53 +++++++++++++++++++++-
ca6e07
 .../gfortran.dg/dec-comparison-character_1.f90     | 18 ++++++++
ca6e07
 .../gfortran.dg/dec-comparison-character_2.f90     | 18 ++++++++
ca6e07
 .../gfortran.dg/dec-comparison-character_3.f90     | 17 +++++++
ca6e07
 .../gfortran.dg/dec-comparison-complex_1.f90       | 22 +++++++++
ca6e07
 .../gfortran.dg/dec-comparison-complex_2.f90       | 22 +++++++++
ca6e07
 .../gfortran.dg/dec-comparison-complex_3.f90       | 22 +++++++++
ca6e07
 gcc/testsuite/gfortran.dg/dec-comparison-int_1.f90 | 31 +++++++++++++
ca6e07
 gcc/testsuite/gfortran.dg/dec-comparison-int_2.f90 | 31 +++++++++++++
ca6e07
 gcc/testsuite/gfortran.dg/dec-comparison-int_3.f90 | 21 +++++++++
ca6e07
 .../gfortran.dg/dec-comparison-real_1.f90          | 31 +++++++++++++
ca6e07
 .../gfortran.dg/dec-comparison-real_2.f90          | 31 +++++++++++++
ca6e07
 .../gfortran.dg/dec-comparison-real_3.f90          | 31 +++++++++++++
ca6e07
 gcc/testsuite/gfortran.dg/dec-comparison.f90       | 41 +++++++++++++++++
ca6e07
 18 files changed, 424 insertions(+), 8 deletions(-)
ca6e07
 create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison-character_1.f90
ca6e07
 create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison-character_2.f90
ca6e07
 create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison-character_3.f90
ca6e07
 create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison-complex_1.f90
ca6e07
 create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison-complex_2.f90
ca6e07
 create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison-complex_3.f90
ca6e07
 create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison-int_1.f90
ca6e07
 create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison-int_2.f90
ca6e07
 create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison-int_3.f90
ca6e07
 create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison-real_1.f90
ca6e07
 create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison-real_2.f90
ca6e07
 create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison-real_3.f90
ca6e07
 create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison.f90
ca6e07
ca6e07
diff --git a/gcc/fortran/intrinsic.c b/gcc/fortran/intrinsic.c
ca6e07
index e94d5d3225f..6d47ae3105f 100644
ca6e07
--- a/gcc/fortran/intrinsic.c
ca6e07
+++ b/gcc/fortran/intrinsic.c
ca6e07
@@ -4020,7 +4020,7 @@ add_conversions (void)
ca6e07
 
ca6e07
   /* Flang allows character conversions similar to Hollerith conversions
ca6e07
      - the first characters will be turned into ascii values. */
ca6e07
-  if (flag_dec_char_conversions)
ca6e07
+  if (flag_dec_char_conversions || flag_dec_comparisons)
ca6e07
     {
ca6e07
       /* Character-Integer conversions.  */
ca6e07
       for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
ca6e07
@@ -5150,7 +5150,8 @@ gfc_convert_type_warn (gfc_expr *expr, gfc_typespec *ts, int eflag, int wflag)
ca6e07
 			     gfc_typename (&from_ts), gfc_typename (ts),
ca6e07
 			     &expr->where);
ca6e07
 	}
ca6e07
-      else if (flag_dec_char_conversions && from_ts.type == BT_CHARACTER
ca6e07
+      else if ((flag_dec_char_conversions || flag_dec_comparisons)
ca6e07
+	       && from_ts.type == BT_CHARACTER
ca6e07
 	       && (gfc_numeric_ts (ts) || ts->type == BT_LOGICAL))
ca6e07
 	{
ca6e07
 	  if (warn_conversion)
ca6e07
diff --git a/gcc/fortran/invoke.texi b/gcc/fortran/invoke.texi
ca6e07
index 8364c67b2df..d101b01e301 100644
ca6e07
--- a/gcc/fortran/invoke.texi
ca6e07
+++ b/gcc/fortran/invoke.texi
ca6e07
@@ -117,15 +117,16 @@ by type.  Explanations are in the following sections.
ca6e07
 @item Fortran Language Options
ca6e07
 @xref{Fortran Dialect Options,,Options controlling Fortran dialect}.
ca6e07
 @gccoptlist{-fall-intrinsics -fbackslash -fcray-pointer -fd-lines-as-code @gol
ca6e07
--fd-lines-as-comments @gol
ca6e07
--fdec -fdec-structure -fdec-intrinsic-ints -fdec-static -fdec-math @gol
ca6e07
--fdec-include -fdefault-double-8 -fdefault-integer-8 -fdefault-real-8 @gol
ca6e07
--fdefault-real-10 -fdefault-real-16 -fdollar-ok -ffixed-line-length-@var{n} @gol
ca6e07
+-fd-lines-as-comments -fdec -fdec-structure -fdec-intrinsic-ints @gol
ca6e07
+-fdec-static -fdec-math -fdec-include -fdec-format-defaults @gol
ca6e07
+-fdec-add-missing-indexes -fdec-blank-format-item -fdec-comparisons @gol
ca6e07
+-fdefault-double-8 -fdefault-integer-8 -fdefault-real-8 -fdefault-real-10 @gol
ca6e07
+-fdefault-real-16 -fdollar-ok -ffixed-line-length-@var{n} @gol
ca6e07
 -ffixed-line-length-none -fpad-source -ffree-form -ffree-line-length-@var{n} @gol
ca6e07
 -ffree-line-length-none -fimplicit-none -finteger-4-integer-8 @gol
ca6e07
 -fmax-identifier-length -fmodule-private -ffixed-form -fno-range-check @gol
ca6e07
 -fopenacc -fopenmp -freal-4-real-10 -freal-4-real-16 -freal-4-real-8 @gol
ca6e07
--freal-8-real-10 -freal-8-real-16 -freal-8-real-4 -std=@var{std}
ca6e07
+-freal-8-real-10 -freal-8-real-16 -freal-8-real-4 -std=@var{std} @gol
ca6e07
 -ftest-forall-temp
ca6e07
 }
ca6e07
 
ca6e07
@@ -283,6 +284,27 @@ Enable parsing of INCLUDE as a statement in addition to parsing it as
ca6e07
 INCLUDE line.  When parsed as INCLUDE statement, INCLUDE does not have to
ca6e07
 be on a single line and can use line continuations.
ca6e07
 
ca6e07
+@item -fdec-add-missing-indexes
ca6e07
+@opindex @code{fdec-add-missing-indexes}
ca6e07
+Enable the insertion of missing dimensions using the lower bounds of those
ca6e07
+dimensions.
ca6e07
+
ca6e07
+@item -fdec-format-defaults
ca6e07
+@opindex @code{fdec-format-defaults}
ca6e07
+Enable format specifiers F, G and I to be used without width specifiers,
ca6e07
+default widths will be used instead.
ca6e07
+
ca6e07
+@item -fdec-blank-format-item
ca6e07
+@opindex @code{fdec-blank-format-item}
ca6e07
+Enable a blank format item at the end of a format specification i.e. nothing
ca6e07
+following the final comma.
ca6e07
+
ca6e07
+@item -fdec-comparisons
ca6e07
+@opindex @code{fdec-comparisons}
ca6e07
+Enable comparison of Hollerith constants and character literals with numeric and
ca6e07
+character expressions. Also enable comparison of Hollerith constants with numeric
ca6e07
+expressions.
ca6e07
+
ca6e07
 @item -fdollar-ok
ca6e07
 @opindex @code{fdollar-ok}
ca6e07
 @cindex @code{$}
ca6e07
diff --git a/gcc/fortran/lang.opt b/gcc/fortran/lang.opt
ca6e07
index 5746b99b1d4..a957b90707f 100644
ca6e07
--- a/gcc/fortran/lang.opt
ca6e07
+++ b/gcc/fortran/lang.opt
ca6e07
@@ -449,6 +449,11 @@ Fortran Var(flag_dec_char_conversions)
ca6e07
 Enable the use of character literals in assignments and data statements
ca6e07
 for non-character variables.
ca6e07
 
ca6e07
+fdec-comparisons
ca6e07
+Fortran Var(flag_dec_comparisons)
ca6e07
+Enable the use of hollerith constants in comparisons. Also enables comparison
ca6e07
+of character literals and numeric vaiables.
ca6e07
+
ca6e07
 fdec-include
ca6e07
 Fortran Var(flag_dec_include)
ca6e07
 Enable legacy parsing of INCLUDE as statement.
ca6e07
diff --git a/gcc/fortran/options.c b/gcc/fortran/options.c
ca6e07
index e97b1568810..b652be70f3d 100644
ca6e07
--- a/gcc/fortran/options.c
ca6e07
+++ b/gcc/fortran/options.c
ca6e07
@@ -77,6 +77,7 @@ set_dec_flags (int value)
ca6e07
   SET_BITFLAG (flag_dec_format_defaults, value, value);
ca6e07
   SET_BITFLAG (flag_dec_duplicates, value, value);
ca6e07
   SET_BITFLAG (flag_dec_char_conversions, value, value);
ca6e07
+  SET_BITFLAG (flag_dec_comparisons, value, value);
ca6e07
 }
ca6e07
 
ca6e07
 /* Finalize DEC flags.  */
ca6e07
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
ca6e07
index 43559185481..c8b6333874b 100644
ca6e07
--- a/gcc/fortran/resolve.c
ca6e07
+++ b/gcc/fortran/resolve.c
ca6e07
@@ -3888,6 +3888,30 @@ convert_integer_to_logical (gfc_expr *e)
ca6e07
     }
ca6e07
 }
ca6e07
 
ca6e07
+/* Return true if TYPE is character based, false otherwise.  */
ca6e07
+
ca6e07
+static int
ca6e07
+is_character_based (bt type)
ca6e07
+{
ca6e07
+  return type == BT_CHARACTER || type == BT_HOLLERITH;
ca6e07
+}
ca6e07
+
ca6e07
+
ca6e07
+/* If E is a hollerith, convert it to character and issue a warning
ca6e07
+   for the conversion.  */
ca6e07
+
ca6e07
+static void
ca6e07
+convert_hollerith_to_character (gfc_expr *e)
ca6e07
+{
ca6e07
+  if (e->ts.type == BT_HOLLERITH)
ca6e07
+    {
ca6e07
+      gfc_typespec t;
ca6e07
+      t.type = BT_CHARACTER;
ca6e07
+      t.kind = e->ts.kind;
ca6e07
+      gfc_convert_type_warn (e, &t, 2, 1);
ca6e07
+    }
ca6e07
+}
ca6e07
+
ca6e07
 /* If E is a logical, convert it to an integer and issue a warning
ca6e07
    for the conversion.  */
ca6e07
 
ca6e07
@@ -3904,6 +3928,17 @@ convert_logical_to_integer (gfc_expr *e)
ca6e07
     }
ca6e07
 }
ca6e07
 
ca6e07
+/* Convert to numeric and issue a warning for the conversion.  */
ca6e07
+
ca6e07
+static void
ca6e07
+convert_to_numeric (gfc_expr *a, gfc_expr *b)
ca6e07
+{
ca6e07
+  gfc_typespec t;
ca6e07
+  t.type = b->ts.type;
ca6e07
+  t.kind = b->ts.kind;
ca6e07
+  gfc_convert_type_warn (a, &t, 2, 1);
ca6e07
+}
ca6e07
+
ca6e07
 /* Resolve an operator expression node.  This can involve replacing the
ca6e07
    operation with a user defined function call.  */
ca6e07
 
ca6e07
@@ -4108,6 +4143,13 @@ resolve_operator (gfc_expr *e)
ca6e07
 	  convert_logical_to_integer (op2);
ca6e07
 	}
ca6e07
 
ca6e07
+      if (flag_dec_comparisons && is_character_based (op1->ts.type)
ca6e07
+          && is_character_based (op2->ts.type))
ca6e07
+	{
ca6e07
+	  convert_hollerith_to_character (op1);
ca6e07
+	  convert_hollerith_to_character (op2);
ca6e07
+	}
ca6e07
+
ca6e07
       if (op1->ts.type == BT_CHARACTER && op2->ts.type == BT_CHARACTER
ca6e07
 	  && op1->ts.kind == op2->ts.kind)
ca6e07
 	{
ca6e07
@@ -4116,6 +4158,15 @@ resolve_operator (gfc_expr *e)
ca6e07
 	  break;
ca6e07
 	}
ca6e07
 
ca6e07
+      if (flag_dec_comparisons && is_character_based (op1->ts.type)
ca6e07
+          && op1->expr_type == EXPR_CONSTANT && gfc_numeric_ts (&op2->ts))
ca6e07
+	convert_to_numeric (op1, op2);
ca6e07
+
ca6e07
+      if (flag_dec_comparisons && gfc_numeric_ts (&op1->ts)
ca6e07
+	  && is_character_based (op2->ts.type)
ca6e07
+	  && op2->expr_type == EXPR_CONSTANT)
ca6e07
+	convert_to_numeric (op2, op1);
ca6e07
+
ca6e07
       if (gfc_numeric_ts (&op1->ts) && gfc_numeric_ts (&op2->ts))
ca6e07
 	{
ca6e07
 	  gfc_type_convert_binary (e, 1);
ca6e07
@@ -10499,7 +10550,7 @@ resolve_ordinary_assign (gfc_code *code, gfc_namespace *ns)
ca6e07
 
ca6e07
   if ((gfc_numeric_ts (&lhs->ts) || lhs->ts.type == BT_LOGICAL)
ca6e07
       && rhs->ts.type == BT_CHARACTER
ca6e07
-      && rhs->expr_type != EXPR_CONSTANT)
ca6e07
+      && (rhs->expr_type != EXPR_CONSTANT || !flag_dec_char_conversions))
ca6e07
     {
ca6e07
       gfc_error ("Cannot convert CHARACTER into %s at %L",
ca6e07
                  gfc_typename (&lhs->ts),     
ca6e07
diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-character_1.f90 b/gcc/testsuite/gfortran.dg/dec-comparison-character_1.f90
ca6e07
new file mode 100644
ca6e07
index 00000000000..d8209163a0e
ca6e07
--- /dev/null
ca6e07
+++ b/gcc/testsuite/gfortran.dg/dec-comparison-character_1.f90
ca6e07
@@ -0,0 +1,18 @@
ca6e07
+! { dg-do run }
ca6e07
+! { dg-options "-fdec -Wconversion" }
ca6e07
+!
ca6e07
+! Test case contributed by Mark Eggleston  <mark.eggleston@codethink.com>
ca6e07
+!
ca6e07
+
ca6e07
+program convert
ca6e07
+  character(4) :: c = 4HJMAC ! { dg-warning "HOLLERITH to CHARACTER" }
ca6e07
+  if (4HJMAC.ne.4HJMAC) stop 1 ! { dg-warning "HOLLERITH to CHARACTER" }
ca6e07
+  if (4HJMAC.ne."JMAC") stop 2 ! { dg-warning "HOLLERITH to CHARACTER" }
ca6e07
+  if (4HJMAC.eq."JMAN") stop 3 ! { dg-warning "HOLLERITH to CHARACTER" }
ca6e07
+  if ("JMAC".eq.4HJMAN) stop 4 ! { dg-warning "HOLLERITH to CHARACTER" }
ca6e07
+  if ("AAAA".eq.5HAAAAA) stop 5 ! { dg-warning "HOLLERITH to CHARACTER" }
ca6e07
+  if ("BBBBB".eq.5HBBBB ) stop 6 ! { dg-warning "HOLLERITH to CHARACTER" }
ca6e07
+  if (4HJMAC.ne.c) stop 7 ! { dg-warning "HOLLERITH to CHARACTER" }
ca6e07
+  if (c.ne.4HJMAC) stop 8 ! { dg-warning "HOLLERITH to CHARACTER" }
ca6e07
+end program
ca6e07
+
ca6e07
diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-character_2.f90 b/gcc/testsuite/gfortran.dg/dec-comparison-character_2.f90
ca6e07
new file mode 100644
ca6e07
index 00000000000..7332acbaf5c
ca6e07
--- /dev/null
ca6e07
+++ b/gcc/testsuite/gfortran.dg/dec-comparison-character_2.f90
ca6e07
@@ -0,0 +1,18 @@
ca6e07
+! { dg-do run }
ca6e07
+! { dg-options "-fdec-comparisons -std=legacy -Wconversion" }
ca6e07
+!
ca6e07
+! Test case contributed by Mark Eggleston  <mark.eggleston@codethink.com>
ca6e07
+!
ca6e07
+
ca6e07
+program convert
ca6e07
+  character(4) :: c = 4HJMAC ! { dg-warning "HOLLERITH to CHARACTER" }
ca6e07
+  if (4HJMAC.ne.4HJMAC) stop 1 ! { dg-warning "HOLLERITH to CHARACTER" }
ca6e07
+  if (4HJMAC.ne."JMAC") stop 2 ! { dg-warning "HOLLERITH to CHARACTER" }
ca6e07
+  if (4HJMAC.eq."JMAN") stop 3 ! { dg-warning "HOLLERITH to CHARACTER" }
ca6e07
+  if ("JMAC".eq.4HJMAN) stop 4 ! { dg-warning "HOLLERITH to CHARACTER" }
ca6e07
+  if ("AAAA".eq.5HAAAAA) stop 5 ! { dg-warning "HOLLERITH to CHARACTER" }
ca6e07
+  if ("BBBBB".eq.5HBBBB ) stop 6 ! { dg-warning "HOLLERITH to CHARACTER" }
ca6e07
+  if (4HJMAC.ne.c) stop 7 ! { dg-warning "HOLLERITH to CHARACTER" }
ca6e07
+  if (c.ne.4HJMAC) stop 8 ! { dg-warning "HOLLERITH to CHARACTER" }
ca6e07
+end program
ca6e07
+
ca6e07
diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-character_3.f90 b/gcc/testsuite/gfortran.dg/dec-comparison-character_3.f90
ca6e07
new file mode 100644
ca6e07
index 00000000000..c20c012478a
ca6e07
--- /dev/null
ca6e07
+++ b/gcc/testsuite/gfortran.dg/dec-comparison-character_3.f90
ca6e07
@@ -0,0 +1,17 @@
ca6e07
+! { dg-do compile }
ca6e07
+! { dg-options "-fdec -fno-dec-comparisons" }
ca6e07
+!
ca6e07
+! Test case contributed by Mark Eggleston  <mark.eggleston@codethink.com>
ca6e07
+!
ca6e07
+
ca6e07
+program convert
ca6e07
+  character(4) :: c = 4HJMAC
ca6e07
+  if (4HJMAC.ne.4HJMAC) stop 1 ! { dg-error "Operands of comparison" }
ca6e07
+  if (4HJMAC.ne."JMAC") stop 2 ! { dg-error "Operands of comparison" }
ca6e07
+  if (4HJMAC.eq."JMAN") stop 3 ! { dg-error "Operands of comparison" }
ca6e07
+  if ("JMAC".eq.4HJMAN) stop 4 !  { dg-error "Operands of comparison" }
ca6e07
+  if ("AAAA".eq.5HAAAAA) stop 5 ! { dg-error "Operands of comparison" }
ca6e07
+  if ("BBBBB".eq.5HBBBB ) stop 6 ! { dg-error "Operands of comparison" }
ca6e07
+  if (4HJMAC.ne.c) stop 7 ! { dg-error "Operands of comparison" }
ca6e07
+end program
ca6e07
+
ca6e07
diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-complex_1.f90 b/gcc/testsuite/gfortran.dg/dec-comparison-complex_1.f90
ca6e07
new file mode 100644
ca6e07
index 00000000000..3495f2ae414
ca6e07
--- /dev/null
ca6e07
+++ b/gcc/testsuite/gfortran.dg/dec-comparison-complex_1.f90
ca6e07
@@ -0,0 +1,22 @@
ca6e07
+! { dg-do run }
ca6e07
+! { dg-options "-std=legacy -fdec -Wconversion" }
ca6e07
+!
ca6e07
+! Test case contributed by Mark Eggleston  <mark.eggleston@codethink.com>
ca6e07
+!
ca6e07
+
ca6e07
+program convert
ca6e07
+  complex(4) :: a
ca6e07
+  complex(4) :: b
ca6e07
+  a = 8HABCDABCD ! { dg-warning "Conversion from HOLLERITH" }
ca6e07
+  b = transfer("ABCDABCD", b);
ca6e07
+  ! Hollerith constants
ca6e07
+  if (a.ne.8HABCDABCD) stop 1 ! { dg-warning "Conversion from HOLLERITH" }
ca6e07
+  if (a.eq.8HABCEABCE) stop 2 ! { dg-warning "Conversion from HOLLERITH" }
ca6e07
+  if (8HABCDABCD.ne.b) stop 3 ! { dg-warning "Conversion from HOLLERITH" }
ca6e07
+  if (8HABCEABCE.eq.b) stop 4 ! { dg-warning "Conversion from HOLLERITH" }
ca6e07
+  ! Character literals
ca6e07
+  if (a.ne."ABCDABCD") stop 5 ! { dg-warning "Conversion from CHARACTER" }
ca6e07
+  if (a.eq."ABCEABCE") stop 6 ! { dg-warning "Conversion from CHARACTER" }
ca6e07
+  if ("ABCDABCD".ne.b) stop 7 ! { dg-warning "Conversion from CHARACTER" }
ca6e07
+  if ("ABCEABCE".eq.b) stop 8 ! { dg-warning "Conversion from CHARACTER" }
ca6e07
+end program
ca6e07
diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-complex_2.f90 b/gcc/testsuite/gfortran.dg/dec-comparison-complex_2.f90
ca6e07
new file mode 100644
ca6e07
index 00000000000..c38042cc600
ca6e07
--- /dev/null
ca6e07
+++ b/gcc/testsuite/gfortran.dg/dec-comparison-complex_2.f90
ca6e07
@@ -0,0 +1,22 @@
ca6e07
+! { dg-do run }
ca6e07
+! { dg-options "-std=legacy -fdec-comparisons -Wconversion" }
ca6e07
+!
ca6e07
+! Test case contributed by Mark Eggleston  <mark.eggleston@codethink.com>
ca6e07
+!
ca6e07
+
ca6e07
+program convert
ca6e07
+  complex(4) :: a
ca6e07
+  complex(4) :: b
ca6e07
+  a = 8HABCDABCD ! { dg-warning "Conversion from HOLLERITH" }
ca6e07
+  b = transfer("ABCDABCD", b);
ca6e07
+  ! Hollerith constants
ca6e07
+  if (a.ne.8HABCDABCD) stop 1 ! { dg-warning "Conversion from HOLLERITH" }
ca6e07
+  if (a.eq.8HABCEABCE) stop 2 ! { dg-warning "Conversion from HOLLERITH" }
ca6e07
+  if (8HABCDABCD.ne.b) stop 3 ! { dg-warning "Conversion from HOLLERITH" }
ca6e07
+  if (8HABCEABCE.eq.b) stop 4 ! { dg-warning "Conversion from HOLLERITH" }
ca6e07
+  ! Character literals
ca6e07
+  if (a.ne."ABCDABCD") stop 5 ! { dg-warning "Conversion from CHARACTER" }
ca6e07
+  if (a.eq."ABCEABCE") stop 6 ! { dg-warning "Conversion from CHARACTER" }
ca6e07
+  if ("ABCDABCD".ne.b) stop 7 ! { dg-warning "Conversion from CHARACTER" }
ca6e07
+  if ("ABCEABCE".eq.b) stop 8 ! { dg-warning "Conversion from CHARACTER" }
ca6e07
+end program
ca6e07
diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-complex_3.f90 b/gcc/testsuite/gfortran.dg/dec-comparison-complex_3.f90
ca6e07
new file mode 100644
ca6e07
index 00000000000..9b27fc4d502
ca6e07
--- /dev/null
ca6e07
+++ b/gcc/testsuite/gfortran.dg/dec-comparison-complex_3.f90
ca6e07
@@ -0,0 +1,22 @@
ca6e07
+! { dg-do compile }
ca6e07
+! { dg-options "-std=legacy -fdec -fno-dec-comparisons -Wconversion" }
ca6e07
+!
ca6e07
+! Test case contributed by Mark Eggleston  <mark.eggleston@codethink.com>
ca6e07
+!
ca6e07
+
ca6e07
+program convert
ca6e07
+  complex(4) :: a
ca6e07
+  complex(4) :: b
ca6e07
+  a = 8HABCDABCD ! { dg-warning "Conversion from HOLLERITH" }
ca6e07
+  b = transfer("ABCDABCD", b);
ca6e07
+  ! Hollerith constants
ca6e07
+  if (a.ne.8HABCDABCD) stop 1 ! { dg-error "Operands of comparison" }
ca6e07
+  if (a.eq.8HABCEABCE) stop 2 ! { dg-error "Operands of comparison" }
ca6e07
+  if (8HABCDABCD.ne.b) stop 3 ! { dg-error "Operands of comparison" }
ca6e07
+  if (8HABCEABCE.eq.b) stop 4 ! { dg-error "Operands of comparison" }
ca6e07
+  ! character literals
ca6e07
+  if (a.ne."ABCDABCD") stop 5 ! { dg-error "Operands of comparison" }
ca6e07
+  if (a.eq."ABCEABCE") stop 6 ! { dg-error "Operands of comparison" }
ca6e07
+  if ("ABCDABCD".ne.b) stop 7 ! { dg-error "Operands of comparison" }
ca6e07
+  if ("ABCEABCE".eq.b) stop 8 ! { dg-error "Operands of comparison" }
ca6e07
+end program
ca6e07
diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-int_1.f90 b/gcc/testsuite/gfortran.dg/dec-comparison-int_1.f90
ca6e07
new file mode 100644
ca6e07
index 00000000000..c93b61e29cf
ca6e07
--- /dev/null
ca6e07
+++ b/gcc/testsuite/gfortran.dg/dec-comparison-int_1.f90
ca6e07
@@ -0,0 +1,31 @@
ca6e07
+! { dg-do run }
ca6e07
+! { dg-options "-std=legacy -fdec -Wconversion" }
ca6e07
+!
ca6e07
+! Test case contributed by Mark Eggleston  <mark.eggleston@codethink.com>
ca6e07
+!
ca6e07
+
ca6e07
+program convert
ca6e07
+  integer(4) :: a
ca6e07
+  integer(4) :: b
ca6e07
+  a = 4HABCD ! { dg-warning "Conversion from HOLLERITH" }
ca6e07
+  b = transfer("ABCD", b)
ca6e07
+  ! Hollerith constants
ca6e07
+  if (a.ne.4HABCD) stop 1 ! { dg-warning "Conversion from HOLLERITH" }
ca6e07
+  if (a.eq.4HABCE) stop 2 ! { dg-warning "Conversion from HOLLERITH" }
ca6e07
+  if (4HABCD.ne.b) stop 3 ! { dg-warning "Conversion from HOLLERITH" }
ca6e07
+  if (4HABCE.eq.b) stop 4 ! { dg-warning "Conversion from HOLLERITH" }
ca6e07
+  if (4HABCE.lt.a) stop 5 ! { dg-warning "Conversion from HOLLERITH" }
ca6e07
+  if (a.gt.4HABCE) stop 6 ! { dg-warning "Conversion from HOLLERITH" }
ca6e07
+  if (4HABCE.le.a) stop 7 ! { dg-warning "Conversion from HOLLERITH" }
ca6e07
+  if (a.ge.4HABCE) stop 8 ! { dg-warning "Conversion from HOLLERITH" }
ca6e07
+  ! Character literals
ca6e07
+  if (a.ne."ABCD") stop 9 ! { dg-warning "Conversion from CHARACTER" }
ca6e07
+  if (a.eq."ABCE") stop 10 ! { dg-warning "Conversion from CHARACTER" }
ca6e07
+  if ("ABCD".ne.b) stop 11 ! { dg-warning "Conversion from CHARACTER" }
ca6e07
+  if ("ABCE".eq.b) stop 12 ! { dg-warning "Conversion from CHARACTER" }
ca6e07
+  if ("ABCE".lt.a) stop 13 ! { dg-warning "Conversion from CHARACTER" }
ca6e07
+  if (a.gt."ABCE") stop 14 ! { dg-warning "Conversion from CHARACTER" }
ca6e07
+  if ("ABCE".le.a) stop 15 ! { dg-warning "Conversion from CHARACTER" }
ca6e07
+  if (a.ge."ABCE") stop 16 ! { dg-warning "Conversion from CHARACTER" }
ca6e07
+end program
ca6e07
+
ca6e07
diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-int_2.f90 b/gcc/testsuite/gfortran.dg/dec-comparison-int_2.f90
ca6e07
new file mode 100644
ca6e07
index 00000000000..cd1ae783d41
ca6e07
--- /dev/null
ca6e07
+++ b/gcc/testsuite/gfortran.dg/dec-comparison-int_2.f90
ca6e07
@@ -0,0 +1,31 @@
ca6e07
+! { dg-do run }
ca6e07
+! { dg-options "-std=legacy -fdec-comparisons -Wconversion" }
ca6e07
+!
ca6e07
+! Test case contributed by Mark Eggleston  <mark.eggleston@codethink.com>
ca6e07
+!
ca6e07
+
ca6e07
+program convert
ca6e07
+  integer(4) :: a
ca6e07
+  integer(4) :: b
ca6e07
+  a = 4HABCD ! { dg-warning "Conversion from HOLLERITH" }
ca6e07
+  b = transfer("ABCD", b)
ca6e07
+  ! Hollerith constants
ca6e07
+  if (a.ne.4HABCD) stop 1 ! { dg-warning "Conversion from HOLLERITH" }
ca6e07
+  if (a.eq.4HABCE) stop 2 ! { dg-warning "Conversion from HOLLERITH" }
ca6e07
+  if (4HABCD.ne.b) stop 3 ! { dg-warning "Conversion from HOLLERITH" }
ca6e07
+  if (4HABCE.eq.b) stop 4 ! { dg-warning "Conversion from HOLLERITH" }
ca6e07
+  if (4HABCE.lt.a) stop 5 ! { dg-warning "Conversion from HOLLERITH" }
ca6e07
+  if (a.gt.4HABCE) stop 6 ! { dg-warning "Conversion from HOLLERITH" }
ca6e07
+  if (4HABCE.le.a) stop 7 ! { dg-warning "Conversion from HOLLERITH" }
ca6e07
+  if (a.ge.4HABCE) stop 8 ! { dg-warning "Conversion from HOLLERITH" }
ca6e07
+  ! Character literals
ca6e07
+  if (a.ne."ABCD") stop 9 ! { dg-warning "Conversion from CHARACTER" }
ca6e07
+  if (a.eq."ABCE") stop 10 ! { dg-warning "Conversion from CHARACTER" }
ca6e07
+  if ("ABCD".ne.b) stop 11 ! { dg-warning "Conversion from CHARACTER" }
ca6e07
+  if ("ABCE".eq.b) stop 12 ! { dg-warning "Conversion from CHARACTER" }
ca6e07
+  if ("ABCE".lt.a) stop 13 ! { dg-warning "Conversion from CHARACTER" }
ca6e07
+  if (a.gt."ABCE") stop 14 ! { dg-warning "Conversion from CHARACTER" }
ca6e07
+  if ("ABCE".le.a) stop 15 ! { dg-warning "Conversion from CHARACTER" }
ca6e07
+  if (a.ge."ABCE") stop 16 ! { dg-warning "Conversion from CHARACTER" }
ca6e07
+end program
ca6e07
+
ca6e07
diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-int_3.f90 b/gcc/testsuite/gfortran.dg/dec-comparison-int_3.f90
ca6e07
new file mode 100644
ca6e07
index 00000000000..b350075afe7
ca6e07
--- /dev/null
ca6e07
+++ b/gcc/testsuite/gfortran.dg/dec-comparison-int_3.f90
ca6e07
@@ -0,0 +1,21 @@
ca6e07
+! { dg-do compile }
ca6e07
+! { dg-options "-fdec -fno-dec-comparisons -Wconversion" }
ca6e07
+!
ca6e07
+! Test case contributed by Mark Eggleston  <mark.eggleston@codethink.com>
ca6e07
+!
ca6e07
+
ca6e07
+program convert
ca6e07
+  integer(4) :: a
ca6e07
+  integer(4) :: b
ca6e07
+  a = 4HABCD ! { dg-warning "Conversion from HOLLERITH" }
ca6e07
+  b = transfer("ABCD", b)
ca6e07
+  if (a.ne.4HABCD) stop 1 ! { dg-error "Operands of comparison" }
ca6e07
+  if (a.eq.4HABCE) stop 2 ! { dg-error "Operands of comparison" }
ca6e07
+  if (4HABCD.ne.b) stop 3 ! { dg-error "Operands of comparison" }
ca6e07
+  if (4HABCE.eq.b) stop 4 ! { dg-error "Operands of comparison" }
ca6e07
+  if (4HABCE.lt.a) stop 5 ! { dg-error "Operands of comparison" }
ca6e07
+  if (a.gt.4HABCE) stop 6 ! { dg-error "Operands of comparison" }
ca6e07
+  if (4HABCE.le.a) stop 7 ! { dg-error "Operands of comparison" }
ca6e07
+  if (a.ge.4HABCE) stop 8 ! { dg-error "Operands of comparison" }
ca6e07
+end program
ca6e07
+
ca6e07
diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-real_1.f90 b/gcc/testsuite/gfortran.dg/dec-comparison-real_1.f90
ca6e07
new file mode 100644
ca6e07
index 00000000000..08b66aaebfd
ca6e07
--- /dev/null
ca6e07
+++ b/gcc/testsuite/gfortran.dg/dec-comparison-real_1.f90
ca6e07
@@ -0,0 +1,31 @@
ca6e07
+! { dg-do run }
ca6e07
+! { dg-options "-std=legacy -fdec -Wconversion" }
ca6e07
+!
ca6e07
+! Test case contributed by Mark Eggleston  <mark.eggleston@codethink.com>
ca6e07
+!
ca6e07
+
ca6e07
+program convert
ca6e07
+  real(4) :: a
ca6e07
+  real(4) :: b
ca6e07
+  a = 4HABCD ! { dg-warning "Conversion from HOLLERITH" }
ca6e07
+  b = transfer("ABCD", b)
ca6e07
+  ! Hollerith constants
ca6e07
+  if (a.ne.4HABCD) stop 1 ! { dg-warning "Conversion from HOLLERITH" }
ca6e07
+  if (a.eq.4HABCE) stop 2 ! { dg-warning "Conversion from HOLLERITH" }
ca6e07
+  if (4HABCD.ne.b) stop 3 ! { dg-warning "Conversion from HOLLERITH" }
ca6e07
+  if (4HABCE.eq.b) stop 4 ! { dg-warning "Conversion from HOLLERITH" }
ca6e07
+  if (4HABCE.lt.a) stop 5 ! { dg-warning "Conversion from HOLLERITH" }
ca6e07
+  if (a.gt.4HABCE) stop 6 ! { dg-warning "Conversion from HOLLERITH" }
ca6e07
+  if (4HABCE.le.a) stop 7 ! { dg-warning "Conversion from HOLLERITH" }
ca6e07
+  if (a.ge.4HABCE) stop 8 ! { dg-warning "Conversion from HOLLERITH" }
ca6e07
+  ! Character literals
ca6e07
+  if (a.ne."ABCD") stop 9 ! { dg-warning "Conversion from CHARACTER" }
ca6e07
+  if (a.eq."ABCE") stop 10 ! { dg-warning "Conversion from CHARACTER" }
ca6e07
+  if ("ABCD".ne.b) stop 11 ! { dg-warning "Conversion from CHARACTER" }
ca6e07
+  if ("ABCE".eq.b) stop 12 ! { dg-warning "Conversion from CHARACTER" }
ca6e07
+  if ("ABCE".lt.a) stop 13 ! { dg-warning "Conversion from CHARACTER" }
ca6e07
+  if (a.gt."ABCE") stop 14 ! { dg-warning "Conversion from CHARACTER" }
ca6e07
+  if ("ABCE".le.a) stop 15 ! { dg-warning "Conversion from CHARACTER" }
ca6e07
+  if (a.ge."ABCE") stop 16 ! { dg-warning "Conversion from CHARACTER" }
ca6e07
+end program
ca6e07
+
ca6e07
diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-real_2.f90 b/gcc/testsuite/gfortran.dg/dec-comparison-real_2.f90
ca6e07
new file mode 100644
ca6e07
index 00000000000..244abb84868
ca6e07
--- /dev/null
ca6e07
+++ b/gcc/testsuite/gfortran.dg/dec-comparison-real_2.f90
ca6e07
@@ -0,0 +1,31 @@
ca6e07
+! { dg-do run }
ca6e07
+! { dg-options "-std=legacy -fdec-comparisons -Wconversion" }
ca6e07
+!
ca6e07
+! Test case contributed by Mark Eggleston  <mark.eggleston@codethink.com>
ca6e07
+!
ca6e07
+
ca6e07
+program convert
ca6e07
+  real(4) :: a
ca6e07
+  real(4) :: b
ca6e07
+  a = 4HABCD ! { dg-warning "Conversion from HOLLERITH" }
ca6e07
+  b = transfer("ABCD", b)
ca6e07
+  ! Hollerith constants
ca6e07
+  if (a.ne.4HABCD) stop 1 ! { dg-warning "Conversion from HOLLERITH" }
ca6e07
+  if (a.eq.4HABCE) stop 2 ! { dg-warning "Conversion from HOLLERITH" }
ca6e07
+  if (4HABCD.ne.b) stop 3 ! { dg-warning "Conversion from HOLLERITH" }
ca6e07
+  if (4HABCE.eq.b) stop 4 ! { dg-warning "Conversion from HOLLERITH" }
ca6e07
+  if (4HABCE.lt.a) stop 5 ! { dg-warning "Conversion from HOLLERITH" }
ca6e07
+  if (a.gt.4HABCE) stop 6 ! { dg-warning "Conversion from HOLLERITH" }
ca6e07
+  if (4HABCE.le.a) stop 7 ! { dg-warning "Conversion from HOLLERITH" }
ca6e07
+  if (a.ge.4HABCE) stop 8 ! { dg-warning "Conversion from HOLLERITH" }
ca6e07
+  ! Character literals
ca6e07
+  if (a.ne."ABCD") stop 9 ! { dg-warning "Conversion from CHARACTER" }
ca6e07
+  if (a.eq."ABCE") stop 10 ! { dg-warning "Conversion from CHARACTER" }
ca6e07
+  if ("ABCD".ne.b) stop 11 ! { dg-warning "Conversion from CHARACTER" }
ca6e07
+  if ("ABCE".eq.b) stop 12 ! { dg-warning "Conversion from CHARACTER" }
ca6e07
+  if ("ABCE".lt.a) stop 13 ! { dg-warning "Conversion from CHARACTER" }
ca6e07
+  if (a.gt."ABCE") stop 14 ! { dg-warning "Conversion from CHARACTER" }
ca6e07
+  if ("ABCE".le.a) stop 15 ! { dg-warning "Conversion from CHARACTER" }
ca6e07
+  if (a.ge."ABCE") stop 16 ! { dg-warning "Conversion from CHARACTER" }
ca6e07
+end program
ca6e07
+
ca6e07
diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-real_3.f90 b/gcc/testsuite/gfortran.dg/dec-comparison-real_3.f90
ca6e07
new file mode 100644
ca6e07
index 00000000000..111c648f08c
ca6e07
--- /dev/null
ca6e07
+++ b/gcc/testsuite/gfortran.dg/dec-comparison-real_3.f90
ca6e07
@@ -0,0 +1,31 @@
ca6e07
+! { dg-do compile }
ca6e07
+! { dg-options "-std=legacy -fdec -fno-dec-comparisons -Wconversion" }
ca6e07
+!
ca6e07
+! Test case contributed by Mark Eggleston  <mark.eggleston@codethink.com>
ca6e07
+!
ca6e07
+
ca6e07
+program convert
ca6e07
+  real(4) :: a
ca6e07
+  real(4) :: b
ca6e07
+  a = 4HABCD ! { dg-warning "Conversion from HOLLERITH" }
ca6e07
+  b = transfer("ABCD", b)
ca6e07
+  ! Hollerith constants
ca6e07
+  if (a.ne.4HABCD) stop 1 ! { dg-error "Operands of comparison" }
ca6e07
+  if (a.eq.4HABCE) stop 2 ! { dg-error "Operands of comparison" }
ca6e07
+  if (4HABCD.ne.b) stop 3 ! { dg-error "Operands of comparison" }
ca6e07
+  if (4HABCE.eq.b) stop 4 ! { dg-error "Operands of comparison" }
ca6e07
+  if (4HABCE.lt.a) stop 5 ! { dg-error "Operands of comparison" }
ca6e07
+  if (a.gt.4HABCE) stop 6 ! { dg-error "Operands of comparison" }
ca6e07
+  if (4HABCE.le.a) stop 7 ! { dg-error "Operands of comparison" }
ca6e07
+  if (a.ge.4HABCE) stop 8 ! { dg-error "Operands of comparison" }
ca6e07
+  ! Character literals
ca6e07
+  if (a.ne."ABCD") stop 9 ! { dg-error "Operands of comparison" }
ca6e07
+  if (a.eq."ABCE") stop 10 ! { dg-error "Operands of comparison" }
ca6e07
+  if ("ABCD".ne.b) stop 11 ! { dg-error "Operands of comparison" }
ca6e07
+  if ("ABCE".eq.b) stop 12 ! { dg-error "Operands of comparison" }
ca6e07
+  if ("ABCE".lt.a) stop 13 ! { dg-error "Operands of comparison" }
ca6e07
+  if (a.gt."ABCE") stop 14 ! { dg-error "Operands of comparison" }
ca6e07
+  if ("ABCE".le.a) stop 15 ! { dg-error "Operands of comparison" }
ca6e07
+  if (a.ge."ABCE") stop 16 ! { dg-error "Operands of comparison" }
ca6e07
+end program
ca6e07
+
ca6e07
diff --git a/gcc/testsuite/gfortran.dg/dec-comparison.f90 b/gcc/testsuite/gfortran.dg/dec-comparison.f90
ca6e07
new file mode 100644
ca6e07
index 00000000000..b0b28e55111
ca6e07
--- /dev/null
ca6e07
+++ b/gcc/testsuite/gfortran.dg/dec-comparison.f90
ca6e07
@@ -0,0 +1,41 @@
ca6e07
+! { dg-do compile }
ca6e07
+! { dg-options "-fdec" }
ca6e07
+!
ca6e07
+! Test case contributed by Mark Eggleston  <mark.eggleston@codethink.com>
ca6e07
+!
ca6e07
+! Hollerith constants and character literals are allowed in comparisons,
ca6e07
+! check that character variables can not be compared with numeric variables.
ca6e07
+
ca6e07
+program convert
ca6e07
+  character(4) :: a = 4hJMAC
ca6e07
+  integer(4) :: b = "JMAC"
ca6e07
+  real(4) :: c = "JMAC"
ca6e07
+  complex(4) :: d = "JMACJMAC"
ca6e07
+  ! integers
ca6e07
+  if (a.ne.b) stop 1 ! { dg-error "Operands of comparison" }
ca6e07
+  if (b.eq.a) stop 2 ! { dg-error "Operands of comparison" }
ca6e07
+  if (a.ge.b) stop 3 ! { dg-error "Operands of comparison" }
ca6e07
+  if (b.ge.a) stop 4 ! { dg-error "Operands of comparison" }
ca6e07
+  if (a.gt.b) stop 5 ! { dg-error "Operands of comparison" }
ca6e07
+  if (b.gt.a) stop 6 ! { dg-error "Operands of comparison" }
ca6e07
+  if (a.le.b) stop 3 ! { dg-error "Operands of comparison" }
ca6e07
+  if (b.le.a) stop 4 ! { dg-error "Operands of comparison" }
ca6e07
+  if (a.lt.b) stop 5 ! { dg-error "Operands of comparison" }
ca6e07
+  if (b.lt.a) stop 6 ! { dg-error "Operands of comparison" }
ca6e07
+  ! reals
ca6e07
+  if (a.ne.c) stop 7 ! { dg-error "Operands of comparison" }
ca6e07
+  if (c.eq.a) stop 8 ! { dg-error "Operands of comparison" }
ca6e07
+  if (a.ge.c) stop 9 ! { dg-error "Operands of comparison" }
ca6e07
+  if (c.ge.a) stop 10 ! { dg-error "Operands of comparison" }
ca6e07
+  if (a.gt.c) stop 11 ! { dg-error "Operands of comparison" }
ca6e07
+  if (c.gt.a) stop 12 ! { dg-error "Operands of comparison" }
ca6e07
+  if (a.le.c) stop 13 ! { dg-error "Operands of comparison" }
ca6e07
+  if (c.le.a) stop 14 ! { dg-error "Operands of comparison" }
ca6e07
+  if (a.lt.c) stop 15 ! { dg-error "Operands of comparison" }
ca6e07
+  if (c.lt.a) stop 16 ! { dg-error "Operands of comparison" }
ca6e07
+  ! complexes
ca6e07
+  a = "JMACJMAC"
ca6e07
+  if (a.ne.d) stop 17 ! { dg-error "Operands of comparison" }
ca6e07
+  if (d.eq.a) stop 18 ! { dg-error "Operands of comparison" }
ca6e07
+end program
ca6e07
+
ca6e07
-- 
ca6e07
2.11.0
ca6e07