re PR fortran/88138 (ICE in gfc_arith_concat, at fortran/arith.c:1007)
authorSteven G. Kargl <kargl@gcc.gnu.org>
Sat, 15 Dec 2018 22:53:26 +0000 (22:53 +0000)
committerSteven G. Kargl <kargl@gcc.gnu.org>
Sat, 15 Dec 2018 22:53:26 +0000 (22:53 +0000)
2019-12-15  Steven G. Kargl  <kargl@gcc.gnu.org>

PR fortran/88138
* decl.c (variable_decl): Check that a derived isn't being assigned
an incompatible entity in an initialization.

2019-12-15  Steven G. Kargl  <kargl@gcc.gnu.org>

PR fortran/88138
* gfortran.dg/pr88138.f90: new test.

From-SVN: r267177

gcc/fortran/ChangeLog
gcc/fortran/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/pr88138.f90 [new file with mode: 0644]

index bb3da68adde8c8492b1ef47c61dc6e9a8493b1bf..2fe463a1fed0806ac07e3f1095c70460de61f13e 100644 (file)
@@ -1,3 +1,9 @@
+2019-12-15  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       PR fortran/88138
+       * decl.c (variable_decl): Check that a derived isn't being assigned
+       an incompatible entity in an initialization.
 2018-12-12  Jakub Jelinek  <jakub@redhat.com>
 
        PR fortran/88463
index 6bc78cc9f54a1fbd267c5a780c3195d6d6d19311..78555ce2f606d1fd43cf90d3e0e25949b50d75fb 100644 (file)
@@ -2784,6 +2784,22 @@ variable_decl (int elem)
        param->value = gfc_copy_expr (initializer);
     }
 
+  /* Before adding a possible initilizer, do a simple check for compatibility
+     of lhs and rhs types.  Assigning a REAL value to a derive type is not a
+     good thing.  */
+  if (current_ts.type == BT_DERIVED && initializer
+      && (gfc_numeric_ts (&initializer->ts)
+         || initializer->ts.type == BT_LOGICAL
+         || initializer->ts.type == BT_CHARACTER))
+    {
+      gfc_error ("Incompatible initialization between a derive type "
+                "entity and an entity with %qs type at %C",
+                 gfc_typename (&initializer->ts));
+      m = MATCH_ERROR;
+      goto cleanup;
+    }
+
+
   /* Add the initializer.  Note that it is fine if initializer is
      NULL here, because we sometimes also need to check if a
      declaration *must* have an initialization expression.  */
index d815e70a9c065eb7a9ab7f2655b82d0d20e249be..d97f9d094a813fdfccdffba5ef1558d81e32658a 100644 (file)
@@ -1,3 +1,8 @@
+2019-12-15  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       PR fortran/88138
+       * gfortran.dg/pr88138.f90: new test.
+
 2018-12-15  Jakub Jelinek  <jakub@redhat.com>
 
        PR tree-optimization/88464
diff --git a/gcc/testsuite/gfortran.dg/pr88138.f90 b/gcc/testsuite/gfortran.dg/pr88138.f90
new file mode 100644 (file)
index 0000000..04b826c
--- /dev/null
@@ -0,0 +1,9 @@
+! { dg-do compile }
+program p
+   type t
+      character :: c = 'c'
+   end type
+   type(t), parameter :: x  = 1.e1  ! { dg-error "Incompatible initialization between a" }s
+   print *, 'a' // x%c
+end
+! { dg-prune-output "has no IMPLICIT type" }