decl.c (match_byte_typespec): New function.
authorSteven G. Kargl <kargl@gcc.gnu.org>
Fri, 1 Nov 2019 16:59:06 +0000 (16:59 +0000)
committerSteven G. Kargl <kargl@gcc.gnu.org>
Fri, 1 Nov 2019 16:59:06 +0000 (16:59 +0000)
2019-11-01  Steven G. Kargl  <kargl@gcc.gnu.org>

* decl.c (match_byte_typespec): New function.  Match BYTE type-spec.
(gfc_match_decl_type_spec): Use it.

2019-11-01  Steven G. Kargl  <kargl@gcc.gnu.org>

* gfortran.dg/byte_3.f: New test.
* gfortran.dg/byte_4.f90: Ditto.

From-SVN: r277715

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

index 34d7a718c3380bf10526fe689712010d276a0e36..74211ced3fdf1815be7a10d5bc24326b1f607610 100644 (file)
@@ -1,3 +1,8 @@
+2019-11-01  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       * decl.c (match_byte_typespec): New function.  Match BYTE type-spec.
+       (gfc_match_decl_type_spec): Use it.
+
 2019-11-01  Steven G. Kargl  <kargl@gcc.gnu.org>
 
        PR fortran/90988
index 652b578b0dd944f07e950e1a162b4445fa2fbd54..7858973cc20b5958a6764e2c7b419fc5a75be2aa 100644 (file)
@@ -3980,6 +3980,38 @@ error_return:
 }
 
 
+/* Match a legacy nonstandard BYTE type-spec.  */
+
+static match
+match_byte_typespec (gfc_typespec *ts)
+{
+  if (gfc_match (" byte") == MATCH_YES)
+    {
+      if (!gfc_notify_std (GFC_STD_GNU, "BYTE type at %C"))
+       return MATCH_ERROR;
+
+      if (gfc_current_form == FORM_FREE)
+       {
+         char c = gfc_peek_ascii_char ();
+         if (!gfc_is_whitespace (c) && c != ',')
+           return MATCH_NO;
+       }
+
+      if (gfc_validate_kind (BT_INTEGER, 1, true) < 0)
+       {
+         gfc_error ("BYTE type used at %C "
+                    "is not available on the target machine");
+         return MATCH_ERROR;
+       }
+
+      ts->type = BT_INTEGER;
+      ts->kind = 1;
+      return MATCH_YES;
+    }
+  return MATCH_NO;
+}
+
+
 /* Matches a declaration-type-spec (F03:R502).  If successful, sets the ts
    structure to the matched specification.  This is necessary for FUNCTION and
    IMPLICIT statements.
@@ -4012,22 +4044,10 @@ gfc_match_decl_type_spec (gfc_typespec *ts, int implicit_flag)
   /* Clear the current binding label, in case one is given.  */
   curr_binding_label = NULL;
 
-  if (gfc_match (" byte") == MATCH_YES)
-    {
-      if (!gfc_notify_std (GFC_STD_GNU, "BYTE type at %C"))
-       return MATCH_ERROR;
-
-      if (gfc_validate_kind (BT_INTEGER, 1, true) < 0)
-       {
-         gfc_error ("BYTE type used at %C "
-                    "is not available on the target machine");
-         return MATCH_ERROR;
-       }
-
-      ts->type = BT_INTEGER;
-      ts->kind = 1;
-      return MATCH_YES;
-    }
+  /* Match BYTE type-spec.  */
+  m = match_byte_typespec (ts);
+  if (m != MATCH_NO)
+    return m;
 
   m = gfc_match (" type (");
   matched_type = (m == MATCH_YES);
index e7dec2ec88268a6b1de55ee53438163638547d5a..8b03bd9913e5f3a8eff7a9032a49ac163f984c28 100644 (file)
@@ -1,3 +1,8 @@
+2019-11-01  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       * gfortran.dg/byte_3.f: New test.
+       * gfortran.dg/byte_4.f90: Ditto.
+
 2019-11-01  Steven G. Kargl  <kargl@gcc.gnu.org>
 
        PR fortran/90988
diff --git a/gcc/testsuite/gfortran.dg/byte_3.f b/gcc/testsuite/gfortran.dg/byte_3.f
new file mode 100644 (file)
index 0000000..35ee828
--- /dev/null
@@ -0,0 +1,6 @@
+c { dg-do run }
+c { dg-options "-std=legacy" }
+      bytea
+      a = 1
+      if (a /= 1 .and. kind(a) /= a) stop 1
+      end
diff --git a/gcc/testsuite/gfortran.dg/byte_4.f90 b/gcc/testsuite/gfortran.dg/byte_4.f90
new file mode 100644 (file)
index 0000000..06873e5
--- /dev/null
@@ -0,0 +1,10 @@
+! { dg-do compile }
+! { dg-options "-w" }
+      bytea          ! { dg-error "Unclassifiable statement" }
+      byte b
+      byte :: d
+      a = 1
+      b = 1
+      d = 1
+      print *, a, b * d
+      end