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

        PR fortran/86111
Backport from trunk
        * 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
Backport from trunk
        * gfortran.dg/array_constructor_type_23.f90: New test.

From-SVN: r264902

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 05b264a558afad7fe83c6496738b22cf0de5dac6..288e3abb99bdf4fc1b5407c5e5b0749abdaf5171 100644 (file)
@@ -1,3 +1,12 @@
+2018-10-06  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+        PR fortran/86111
+       Backport from trunk
+        * 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-09-18  Janus Weil  <janus@gcc.gnu.org>
 
        Backport from trunk
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 507570ccbff2c03b8b3c7972b30aaeb9a682fd63..c0d10503c2fb05f8f04811b9a2f7427825363f4f 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 d1acd06002d8a42c1ccc9aea2d4dde41e1dd3590..b1be1778c4d888583024c318c00a1f7b03e77bf3 100644 (file)
@@ -1,3 +1,9 @@
+2018-10-06  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+        PR fortran/86111
+       Backport from trunk
+        * gfortran.dg/array_constructor_type_23.f90: New test.
+
 2018-10-03  Martin Liska  <mliska@suse.cz>
 
        Backport from mainline
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
This page took 0.089846 seconds and 5 git commands to generate.