re PR fortran/86111 (ICE in gfc_arith_concat, at fortran/arith.c:985)
authorThomas Koenig <tkoenig@gcc.gnu.org>
Sat, 6 Oct 2018 18:20:14 +0000 (18:20 +0000)
committerThomas Koenig <tkoenig@gcc.gnu.org>
Sat, 6 Oct 2018 18:20:14 +0000 (18:20 +0000)
2018-10-06  Thomas Koenig  <tkoenig@gcc.gnu.org>

PR fortran/86111
* gfortran.h (enum arith): Add ARITH_WRONGCONCAT.
* arith.h (gfc_arith_error): Issue error for ARITH_WRONGCONCAT.
(gfc_arith_concat):  If the types of op1 and op2 are not
character of if their kinds do not match, issue ARITH_WRONGCONCAT.

2018-10-06  Thomas Koenig  <tkoenig@gcc.gnu.org>

PR fortran/86111
* gfortran.dg/array_constructor_type_23.f90: New test.

From-SVN: r264900

gcc/fortran/ChangeLog
gcc/fortran/arith.c
gcc/fortran/gfortran.h
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/array_constructor_type_23.f90 [new file with mode: 0644]

index 542d04c4c063986bed30e171e74ce22c26a42649..da3200de746c36d620492257c23f9bad15d2d311 100644 (file)
@@ -1,6 +1,14 @@
+2018-10-06  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+       PR fortran/86111
+       * gfortran.h (enum arith): Add ARITH_WRONGCONCAT.
+       * arith.h (gfc_arith_error): Issue error for ARITH_WRONGCONCAT.
+       (gfc_arith_concat):  If the types of op1 and op2 are not
+       character of if their kinds do not match, issue ARITH_WRONGCONCAT.
+
 2018-10-06  Paul Thomas  <pault@gcc.gnu.org>
 
-       Backport from trunk
+       PR fortran/83999
        * resolve.c (resolve_fl_procedure): Include class functions in
        the test that elemental function results be scalar.
 
index 6f97d0f978451f2243478ae04788f2d4f9acbdcd..98af27efcfef98b84add8ab4266dc745424a622d 100644 (file)
@@ -113,6 +113,11 @@ gfc_arith_error (arith code)
       p =
        _("Integer outside symmetric range implied by Standard Fortran at %L");
       break;
+    case ARITH_WRONGCONCAT:
+      p =
+       _("Illegal type in character concatenation at %L");
+      break;
+
     default:
       gfc_internal_error ("gfc_arith_error(): Bad error code");
     }
@@ -982,7 +987,12 @@ gfc_arith_concat (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
   gfc_expr *result;
   size_t len;
 
-  gcc_assert (op1->ts.kind == op2->ts.kind);
+  /* By cleverly playing around with constructors, is is possible
+     to get mismaching types here.  */
+  if (op1->ts.type != BT_CHARACTER || op2->ts.type != BT_CHARACTER
+      || op1->ts.kind != op2->ts.kind)
+    return ARITH_WRONGCONCAT;
+
   result = gfc_get_constant_expr (BT_CHARACTER, op1->ts.kind,
                                  &op1->where);
 
index b0518e228e9a98aca64acd30d36876b006933302..8e50e4d654a45da578b438f8c9f32fb31557ec40 100644 (file)
@@ -191,7 +191,8 @@ enum gfc_intrinsic_op
 /* Arithmetic results.  */
 enum arith
 { ARITH_OK = 1, ARITH_OVERFLOW, ARITH_UNDERFLOW, ARITH_NAN,
-  ARITH_DIV0, ARITH_INCOMMENSURATE, ARITH_ASYMMETRIC, ARITH_PROHIBIT
+  ARITH_DIV0, ARITH_INCOMMENSURATE, ARITH_ASYMMETRIC, ARITH_PROHIBIT,
+  ARITH_WRONGCONCAT
 };
 
 /* Statements.  */
index 407e90a2eef249cc9bb683fb763e783362274acc..a0b6eade3e8ffe3b20e6f1da13ac682528abf96e 100644 (file)
@@ -1,3 +1,8 @@
+2018-10-06  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+       PR fortran/86111
+       * gfortran.dg/array_constructor_type_23.f90: New test.
+
 2018-10-06  Paul Thomas  <pault@gcc.gnu.org>
 
        PR fortran/83999
diff --git a/gcc/testsuite/gfortran.dg/array_constructor_type_23.f90 b/gcc/testsuite/gfortran.dg/array_constructor_type_23.f90
new file mode 100644 (file)
index 0000000..cb88ad2
--- /dev/null
@@ -0,0 +1,7 @@
+! { dg-do compile }
+! PR 83999 - this used to ICE
+! Origial test case by Gerhard Steinmetz
+
+program p
+        character(2) :: c = 'a' // [character :: [1]] ! { dg-error "Illegal type in character concatenation" }
+end