public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Fritz Reese <fritzoreese@gmail.com>
To: Jakub Jelinek <jakub@redhat.com>
Cc: mark.eggleston@codethink.co.uk, fortran <fortran@gcc.gnu.org>,
		gcc-patches <gcc-patches@gcc.gnu.org>,
	beth.white@codethink.co.uk, 	emmet.hikory@codethink.co.uk,
	Jeff Law <law@redhat.com>
Subject: Re: PR fortran/87919 patch for -fno-dec-structure
Date: Thu, 08 Nov 2018 17:09:00 -0000	[thread overview]
Message-ID: <CAE4aFAmGo1v1Xe3z05qnweoJkgJiPZ_aL0=zj7eOiVXwhzOncw@mail.gmail.com> (raw)
In-Reply-To: <20181107223230.GI11625@tucnak>

[-- Attachment #1: Type: text/plain, Size: 6295 bytes --]

On Wed, Nov 7, 2018 at 5:32 PM Jakub Jelinek <jakub@redhat.com> wrote:
>
> On Wed, Nov 07, 2018 at 05:05:13PM -0500, Fritz Reese wrote:
>
> --- a/gcc/fortran/options.c
> +++ b/gcc/fortran/options.c
> @@ -32,6 +32,20 @@ along with GCC; see the file COPYING3.  If not see
>
>  gfc_option_t gfc_option;
>
> +#define _expand(m) m
>
> I think it would be better to avoid names like _expand, too generic
> name and starts with underscore, name it e.g. SET_BITFLAG_1 or something
> similar.  And it isn't mentioned in the ChangeLog.

I find "expand" a more helpful name than "set_bitflag_1" since it
describes what the macro does. However, I don't think it makes too
much of a difference so I'll follow your preference (but I'll use
SET_BITFLAG2 since then the definition line fits in 80 characters).

>
> @@ -62,14 +75,30 @@ set_dec_flags (int value)
>      }
>
> What about the
>       /* Allow legacy code without warnings.  */
>       gfc_option.allow_std |= GFC_STD_F95_OBS | GFC_STD_F95_DEL
>         | GFC_STD_GNU | GFC_STD_LEGACY;
>       gfc_option.warn_std &= ~(GFC_STD_LEGACY | GFC_STD_F95_DEL);
> that is done for value, shouldn't set_dec_flags remove those
> flags again?  Maybe not the allow_std ones, because those are set already by
> default, perhaps just the warn_std flags?
>

Sure. I wasn't convinced about this and how it might interplay with
-std= so I left it alone, but I suppose it makes sense to unsuppress
the warnings when disabling -fdec.

> --- /dev/null
> +++ b/gcc/testsuite/gfortran.dg/array_temporaries_5.f90
> @@ -0,0 +1,20 @@
> +! { dg-do run }
> +! { dg-options "-fcheck-array-temporaries -fno-check-array-temporaries" }
> +!
> +! PR fortran/87919
> +!
> +! Ensure -fno-check-array-temporaries disables array temporary checking.
> +! Copied from array_temporaries_2.f90.
>
> For tests where you expect no errors and that are just copies of other
> testcases, perhaps
> include 'array_temporaries_2.f90'
> or similar instead?
>

Strictly speaking it's not an exact copy because it omits the final {
dg-output } check for the runtime warning, since the warning is
supposed to occur in array_temporaries_2.f90 but not in the new case
array_temporaries_5.f90. I assumed include would propagate the {
dg-output } check -- upon actually testing this, it appears that is
not the case. I find this misleading at a glance, but it works, so I
don't mind this with an extra comment line.

Attached is a new patch which incorporates your recommendations.
Here's the diff between the two, followed by the new changelog:

diff --git a/gcc/fortran/options.c b/gcc/fortran/options.c
index e703cad96fd..167621905bc 100644
--- a/gcc/fortran/options.c
+++ b/gcc/fortran/options.c
@@ -32,8 +32,6 @@ along with GCC; see the file COPYING3.  If not see

 gfc_option_t gfc_option;

-#define _expand(m) m
-
 #define SET_FLAG(flag, condition, on_value, off_value) \
   do \
     { \
@@ -43,8 +41,10 @@ gfc_option_t gfc_option;
        flag = (off_value); \
     } while (0)

+#define SET_BITFLAG2(m) m
+
 #define SET_BITFLAG(flag, condition, value) \
-  _expand (SET_FLAG (flag, condition, (flag | (value)), (flag & ~(value))))
+  SET_BITFLAG2 (SET_FLAG (flag, condition, (flag | (value)), (flag &
~(value))))


 /* Set flags that control warnings and errors for different
@@ -66,15 +66,17 @@ set_default_std_flags (void)
 static void
 set_dec_flags (int value)
 {
+  /* Allow legacy code without warnings.
+     Nb. We do not unset the allowed standards with value == 0 because
+     they are set by default in set_default_std_flags.  */
   if (value)
-    {
-      /* Allow legacy code without warnings.  */
-      gfc_option.allow_std |= GFC_STD_F95_OBS | GFC_STD_F95_DEL
-        | GFC_STD_GNU | GFC_STD_LEGACY;
-      gfc_option.warn_std &= ~(GFC_STD_LEGACY | GFC_STD_F95_DEL);
-    }
+    gfc_option.allow_std |= GFC_STD_F95_OBS | GFC_STD_F95_DEL
+      | GFC_STD_GNU | GFC_STD_LEGACY;
+
+  SET_BITFLAG (gfc_option.warn_std, !value, GFC_STD_LEGACY);
+  SET_BITFLAG (gfc_option.warn_std, !value, GFC_STD_F95_DEL);

-  /* Set other DEC compatibility extensions.  */
+  /* Set (or unset) other DEC compatibility extensions.  */
   SET_BITFLAG (flag_dollar_ok, value, value);
   SET_BITFLAG (flag_cray_pointer, value, value);
   SET_BITFLAG (flag_dec_structure, value, value);
@@ -855,3 +871,7 @@ gfc_get_option_string (void)
 }

 #undef SET_BITFLAG
+#undef SET_BITFLAG2
 #undef SET_FLAG
-#undef _expand

diff --git a/gcc/testsuite/gfortran.dg/array_temporaries_5.f90
b/gcc/testsuite/gfortran.dg/array_temporaries_5.f90
index 0070a935933..dd147ba38ed 100644
--- a/gcc/testsuite/gfortran.dg/array_temporaries_5.f90
+++ b/gcc/testsuite/gfortran.dg/array_temporaries_5.f90
@@ -4,17 +4,7 @@
 ! PR fortran/87919
 !
 ! Ensure -fno-check-array-temporaries disables array temporary checking.
-! Copied from array_temporaries_2.f90.
 !

-program test
-  implicit none
-  integer :: a(3,3)
-  call foo(a(:,1))  ! OK, no temporary created
-  call foo(a(1,:))  ! BAD, temporary var created
-contains
-  subroutine foo(x)
-    integer :: x(3)
-    x = 5
-  end subroutine foo
-end program test
+! Note that 'include' drops the dg-output check from the original test case.
+include 'array_temporaries_2.f90'



>>>>>> ChangeLog <<<<<<
PR fortran/87919

Fix handling -fno-* prefix for init-local-zero, check-array-temporaries and dec.

gcc/fortran/
        * options.c (SET_FLAG, SET_BITFLAG, SET_BITFLAG2): New macros.
        (set_dec_flags): Set/unset DEC and std flags according to value.
        (set_init_local_zero): New helper for -finit-local-zero flag group.
        (gfc_init_options): Fix disabling of init flags, array temporaries
        check, and dec flags when value is zero (from -fno-*).

gcc/testsuiste/
        * gfortran.dg/array_temporaries_5.f90: New test.
        * gfortran.dg/dec_bitwise_ops_3.f90: Ditto.
        * gfortran.dg/dec_d_lines_3.f: Ditto.
        * gfortran.dg/dec_exp_4.f90: Ditto.
        * gfortran.dg/dec_exp_5.f90: Ditto.
        * gfortran.dg/dec_io_7.f90: Ditto.
        * gfortran.dg/dec_structure_24.f: Ditto.
        * gfortran.dg/dec_structure_25.f: Ditto.
        * gfortran.dg/dec_structure_26.f: Ditto.
        * gfortran.dg/dec_structure_27.f: Ditto.
        * gfortran.dg/dec_type_print_3.f90: Ditto.
        * gfortran.dg/init_flag_20.f90: Ditto.

[-- Attachment #2: 0002-PR-fortran-87919.patch --]
[-- Type: text/x-patch, Size: 18462 bytes --]

From 7257d88e050f96f83b66b8313087dbc8934dc465 Mon Sep 17 00:00:00 2001
From: Fritz Reese <fritzoreese@gmail.com>
Date: Thu, 8 Nov 2018 11:58:41 -0500
Subject: [PATCH] PR fortran/87919

Fix handling -fno-* prefix for init-local-zero, check-array-temporaries and dec.

gcc/fortran/
	* options.c (SET_FLAG, SET_BITFLAG, SET_BITFLAG2): New macros.
	(set_dec_flags): Set/unset DEC and std flags according to value.
	(set_init_local_zero): New helper for -finit-local-zero flag group.
	(gfc_init_options): Fix disabling of init flags, array temporaries
	check, and dec flags when value is zero (from -fno-*).

gcc/testsuiste/
	* gfortran.dg/array_temporaries_5.f90: New test.
	* gfortran.dg/dec_bitwise_ops_3.f90: Ditto.
	* gfortran.dg/dec_d_lines_3.f: Ditto.
	* gfortran.dg/dec_exp_4.f90: Ditto.
	* gfortran.dg/dec_exp_5.f90: Ditto.
	* gfortran.dg/dec_io_7.f90: Ditto.
	* gfortran.dg/dec_structure_24.f: Ditto.
	* gfortran.dg/dec_structure_25.f: Ditto.
	* gfortran.dg/dec_structure_26.f: Ditto.
	* gfortran.dg/dec_structure_27.f: Ditto.
	* gfortran.dg/dec_type_print_3.f90: Ditto.
	* gfortran.dg/init_flag_20.f90: Ditto.
---
 gcc/fortran/options.c                             | 88 ++++++++++++++---------
 gcc/testsuite/gfortran.dg/array_temporaries_5.f90 | 10 +++
 gcc/testsuite/gfortran.dg/dec_bitwise_ops_3.f90   | 19 +++++
 gcc/testsuite/gfortran.dg/dec_d_lines_3.f         | 10 +++
 gcc/testsuite/gfortran.dg/dec_exp_4.f90           | 13 ++++
 gcc/testsuite/gfortran.dg/dec_exp_5.f90           | 15 ++++
 gcc/testsuite/gfortran.dg/dec_io_7.f90            | 22 ++++++
 gcc/testsuite/gfortran.dg/dec_structure_24.f      | 21 ++++++
 gcc/testsuite/gfortran.dg/dec_structure_25.f      | 22 ++++++
 gcc/testsuite/gfortran.dg/dec_structure_26.f      | 22 ++++++
 gcc/testsuite/gfortran.dg/dec_structure_27.f      | 20 ++++++
 gcc/testsuite/gfortran.dg/dec_type_print_3.f90    | 29 ++++++++
 gcc/testsuite/gfortran.dg/init_flag_20.f90        | 62 ++++++++++++++++
 13 files changed, 320 insertions(+), 33 deletions(-)
 create mode 100644 gcc/testsuite/gfortran.dg/array_temporaries_5.f90
 create mode 100644 gcc/testsuite/gfortran.dg/dec_bitwise_ops_3.f90
 create mode 100644 gcc/testsuite/gfortran.dg/dec_d_lines_3.f
 create mode 100644 gcc/testsuite/gfortran.dg/dec_exp_4.f90
 create mode 100644 gcc/testsuite/gfortran.dg/dec_exp_5.f90
 create mode 100644 gcc/testsuite/gfortran.dg/dec_io_7.f90
 create mode 100644 gcc/testsuite/gfortran.dg/dec_structure_24.f
 create mode 100644 gcc/testsuite/gfortran.dg/dec_structure_25.f
 create mode 100644 gcc/testsuite/gfortran.dg/dec_structure_26.f
 create mode 100644 gcc/testsuite/gfortran.dg/dec_structure_27.f
 create mode 100644 gcc/testsuite/gfortran.dg/dec_type_print_3.f90
 create mode 100644 gcc/testsuite/gfortran.dg/init_flag_20.f90

diff --git a/gcc/fortran/options.c b/gcc/fortran/options.c
index 73f5389361d..af89a5d2faf 100644
--- a/gcc/fortran/options.c
+++ b/gcc/fortran/options.c
@@ -32,6 +32,20 @@ along with GCC; see the file COPYING3.  If not see
 
 gfc_option_t gfc_option;
 
+#define SET_FLAG(flag, condition, on_value, off_value) \
+  do \
+    { \
+      if (condition) \
+	flag = (on_value); \
+      else \
+	flag = (off_value); \
+    } while (0)
+
+#define SET_BITFLAG2(m) m
+
+#define SET_BITFLAG(flag, condition, value) \
+  SET_BITFLAG2 (SET_FLAG (flag, condition, (flag | (value)), (flag & ~(value))))
+
 
 /* Set flags that control warnings and errors for different
    Fortran standards to their default values.  Keep in sync with
@@ -47,29 +61,46 @@ set_default_std_flags (void)
   gfc_option.warn_std = GFC_STD_F2018_DEL | GFC_STD_F95_DEL | GFC_STD_LEGACY;
 }
 
-
-/* Set all the DEC extension flags.  */
+/* Set (or unset) the DEC extension flags.  */
 
 static void
 set_dec_flags (int value)
 {
+  /* Allow legacy code without warnings.
+     Nb. We do not unset the allowed standards with value == 0 because
+     they are set by default in set_default_std_flags.  */
   if (value)
-    {
-      /* Allow legacy code without warnings.  */
-      gfc_option.allow_std |= GFC_STD_F95_OBS | GFC_STD_F95_DEL
-        | GFC_STD_GNU | GFC_STD_LEGACY;
-      gfc_option.warn_std &= ~(GFC_STD_LEGACY | GFC_STD_F95_DEL);
-    }
-
-  /* Set other DEC compatibility extensions.  */
-  flag_dollar_ok |= value;
-  flag_cray_pointer |= value;
-  flag_dec_structure |= value;
-  flag_dec_intrinsic_ints |= value;
-  flag_dec_static |= value;
-  flag_dec_math |= value;
+    gfc_option.allow_std |= GFC_STD_F95_OBS | GFC_STD_F95_DEL
+      | GFC_STD_GNU | GFC_STD_LEGACY;
+
+  SET_BITFLAG (gfc_option.warn_std, !value, GFC_STD_LEGACY);
+  SET_BITFLAG (gfc_option.warn_std, !value, GFC_STD_F95_DEL);
+
+  /* Set (or unset) other DEC compatibility extensions.  */
+  SET_BITFLAG (flag_dollar_ok, value, value);
+  SET_BITFLAG (flag_cray_pointer, value, value);
+  SET_BITFLAG (flag_dec_structure, value, value);
+  SET_BITFLAG (flag_dec_intrinsic_ints, value, value);
+  SET_BITFLAG (flag_dec_static, value, value);
+  SET_BITFLAG (flag_dec_math, value, value);
 }
 
+/* Enable (or disable) -finit-local-zero.  */
+
+static void
+set_init_local_zero (int value)
+{
+  gfc_option.flag_init_integer_value = 0;
+  gfc_option.flag_init_character_value = (char)0;
+
+  SET_FLAG (gfc_option.flag_init_integer, value, GFC_INIT_INTEGER_ON,
+	    GFC_INIT_INTEGER_OFF);
+  SET_FLAG (gfc_option.flag_init_logical, value, GFC_INIT_LOGICAL_FALSE,
+	    GFC_INIT_LOGICAL_OFF);
+  SET_FLAG (gfc_option.flag_init_character, value, GFC_INIT_CHARACTER_ON,
+	    GFC_INIT_CHARACTER_OFF);
+  SET_FLAG (flag_init_real, value, GFC_INIT_REAL_ZERO, GFC_INIT_REAL_OFF);
+}
 
 /* Return language mask for Fortran options.  */
 
@@ -107,11 +138,7 @@ gfc_init_options (unsigned int decoded_options_count,
 
   gfc_option.flag_preprocessed = 0;
   gfc_option.flag_d_lines = -1;
-  gfc_option.flag_init_integer = GFC_INIT_INTEGER_OFF;
-  gfc_option.flag_init_integer_value = 0;
-  gfc_option.flag_init_logical = GFC_INIT_LOGICAL_OFF;
-  gfc_option.flag_init_character = GFC_INIT_CHARACTER_OFF;
-  gfc_option.flag_init_character_value = (char)0;
+  set_init_local_zero (0);
   
   gfc_option.fpe = 0;
   /* All except GFC_FPE_INEXACT.  */
@@ -604,7 +631,7 @@ gfc_handle_option (size_t scode, const char *arg, HOST_WIDE_INT value,
       break;
 
     case OPT_fcheck_array_temporaries:
-      gfc_option.rtcheck |= GFC_RTCHECK_ARRAY_TEMPS;
+      SET_BITFLAG (gfc_option.rtcheck, value, GFC_RTCHECK_ARRAY_TEMPS);
       break;
       
     case OPT_fd_lines_as_code:
@@ -654,12 +681,7 @@ gfc_handle_option (size_t scode, const char *arg, HOST_WIDE_INT value,
       break;
 
     case OPT_finit_local_zero:
-      gfc_option.flag_init_integer = GFC_INIT_INTEGER_ON;
-      gfc_option.flag_init_integer_value = 0;
-      flag_init_real = GFC_INIT_REAL_ZERO;
-      gfc_option.flag_init_logical = GFC_INIT_LOGICAL_FALSE;
-      gfc_option.flag_init_character = GFC_INIT_CHARACTER_ON;
-      gfc_option.flag_init_character_value = (char)0;
+      set_init_local_zero (value);
       break;
 
     case OPT_finit_logical_:
@@ -759,11 +781,7 @@ gfc_handle_option (size_t scode, const char *arg, HOST_WIDE_INT value,
 
     case OPT_fdec:
       /* Enable all DEC extensions.  */
-      set_dec_flags (1);
-      break;
-
-    case OPT_fdec_structure:
-      flag_dec_structure = 1;
+      set_dec_flags (value);
       break;
     }
 
@@ -855,3 +873,7 @@ gfc_get_option_string (void)
   result[--pos] = '\0';
   return result;
 }
+
+#undef SET_BITFLAG
+#undef SET_BITFLAG2
+#undef SET_FLAG
diff --git a/gcc/testsuite/gfortran.dg/array_temporaries_5.f90 b/gcc/testsuite/gfortran.dg/array_temporaries_5.f90
new file mode 100644
index 00000000000..dd147ba38ed
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/array_temporaries_5.f90
@@ -0,0 +1,10 @@
+! { dg-do run }
+! { dg-options "-fcheck-array-temporaries -fno-check-array-temporaries" }
+!
+! PR fortran/87919
+!
+! Ensure -fno-check-array-temporaries disables array temporary checking.
+!
+
+! Note that 'include' drops the dg-output check from the original test case.
+include 'array_temporaries_2.f90'
diff --git a/gcc/testsuite/gfortran.dg/dec_bitwise_ops_3.f90 b/gcc/testsuite/gfortran.dg/dec_bitwise_ops_3.f90
new file mode 100644
index 00000000000..88887c16f8e
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/dec_bitwise_ops_3.f90
@@ -0,0 +1,19 @@
+! { dg-do compile }
+! { dg-options "-std=legacy -fdec -fno-dec" }
+!
+! Make sure -fno-dec disables bitwise ops and check for the right errors.
+! -std=legacy is added to avoid the .XOR. extension warning.
+!
+
+implicit none
+
+integer i
+
+i = 3  .AND. 5 ! { dg-error "Operands of logical operator" }
+i = 3  .EQV. 5 ! { dg-error "Operands of logical operator" }
+i = 3 .NEQV. 5 ! { dg-error "Operands of logical operator" }
+i =    .NOT. 5 ! { dg-error "Operand of" }
+i = 3   .OR. 5 ! { dg-error "Operands of logical operator" }
+i = 3  .XOR. 5 ! { dg-error "Operands of logical operator" }
+
+end
diff --git a/gcc/testsuite/gfortran.dg/dec_d_lines_3.f b/gcc/testsuite/gfortran.dg/dec_d_lines_3.f
new file mode 100644
index 00000000000..fb35923712b
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/dec_d_lines_3.f
@@ -0,0 +1,10 @@
+! { dg-do compile }
+! { dg-options "-ffixed-form -fno-dec" }
+!
+! Ensure -fd-lines-as-comments is not enabled by default without -fdec.
+!
+
+d     ! { dg-error "Non-numeric character in statement label" }
+D     ! { dg-error "Non-numeric character in statement label" }
+
+      end
diff --git a/gcc/testsuite/gfortran.dg/dec_exp_4.f90 b/gcc/testsuite/gfortran.dg/dec_exp_4.f90
new file mode 100644
index 00000000000..a9c6998d712
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/dec_exp_4.f90
@@ -0,0 +1,13 @@
+! { dg-do compile }
+! { dg-options "-fdec -fno-dec" }
+!
+! Same as dec_exp_2, but make sure -fno-dec disables -fdec.
+!
+
+implicit none
+
+real, parameter :: r1 = 8e ! { dg-error "Missing exponent" }
+real, volatile :: r2
+r2 = 8e ! { dg-error "Missing exponent" }
+
+end
diff --git a/gcc/testsuite/gfortran.dg/dec_exp_5.f90 b/gcc/testsuite/gfortran.dg/dec_exp_5.f90
new file mode 100644
index 00000000000..ce14860418f
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/dec_exp_5.f90
@@ -0,0 +1,15 @@
+! { dg-do run "xfail *-*-*" }
+! { dg-options "-fdec -fno-dec" }
+!
+! Same as dec_exp_3, but make sure -fno-dec disables -fdec.
+!
+
+implicit none
+
+real :: r
+character(2) :: s
+s = '8e'
+
+read (s, *) r ! { XFAIL "Bad real number" }
+
+end
diff --git a/gcc/testsuite/gfortran.dg/dec_io_7.f90 b/gcc/testsuite/gfortran.dg/dec_io_7.f90
new file mode 100644
index 00000000000..339b8896169
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/dec_io_7.f90
@@ -0,0 +1,22 @@
+! { dg-do compile }
+! { dg-options "-fdec -fno-dec" }
+!
+! Make sure -fno-dec rejects -fdec I/O specifiers.
+!
+
+implicit none
+
+integer, parameter :: fd=3
+character(*), parameter :: fname="test.txt"
+
+open (unit=fd, file=fname, readonly) ! { dg-error "is a DEC extension" }
+open (unit=fd, file=fname, action='read', shared) ! { dg-error "is a DEC extension" }
+open (unit=fd, file=fname, action='read', share='DENYNONE') ! { dg-error "is a DEC extension" }
+open (unit=fd, file=fname, action='write', noshared) ! { dg-error "is a DEC extension" }
+open (unit=fd, file=fname, action='write', share='DENYRW') ! { dg-error "is a DEC extension" }
+open(unit=fd,  file=fname, action ='WRITE', carriagecontrol='FORTRAN') ! { dg-error "is a DEC extension" }
+open(unit=fd,  file=fname, action ='WRITE', carriagecontrol='LIST') ! { dg-error "is a DEC extension" }
+open(unit=fd,  file=fname, action ='WRITE', carriagecontrol='NONE') ! { dg-error "is a DEC extension" }
+
+
+end
diff --git a/gcc/testsuite/gfortran.dg/dec_structure_24.f b/gcc/testsuite/gfortran.dg/dec_structure_24.f
new file mode 100644
index 00000000000..410d3af4080
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/dec_structure_24.f
@@ -0,0 +1,21 @@
+! { dg-do compile }
+!
+! PR fortran/87919
+!
+! Should fail to compile without the -fdec or -fdec-structure options.
+!
+! Contributed by Mark Eggleston <mark.eggleston@codethink.com>
+
+      program test
+
+        structure /info/ ! { dg-error "-fdec-structure" }
+          integer a
+          real b
+         end structure   ! { dg-error "END PROGRAM" }
+
+        record /info/ s  ! { dg-error "-fdec-structure" }
+        s.a = 199        ! { dg-error "Unclassifiable" }
+        s.b = 7.6        ! { dg-error "Unclassifiable" }
+        write (*,*) s.a  ! { dg-error "Syntax error in WRITE" }
+        write (*,*) s.b  ! { dg-error "Syntax error in WRITE" }
+      end program test
diff --git a/gcc/testsuite/gfortran.dg/dec_structure_25.f b/gcc/testsuite/gfortran.dg/dec_structure_25.f
new file mode 100644
index 00000000000..4f1ea58b8d0
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/dec_structure_25.f
@@ -0,0 +1,22 @@
+! { dg-do run }
+! { dg-options "-fdec" }
+!
+! PR fortran/87919
+!
+! Should compile and run with the -fdec option.
+!
+! Contributed by Mark Eggleston <mark.eggleston@codethink.com>
+!
+      program test
+
+        structure /info/
+          integer a
+          real b
+         end structure
+
+        record /info/ s
+        s.a = 199
+        s.b = 7.6
+        if (s.a .ne. 199) stop 1
+        if (abs(s.b - 7.6) .gt. 1e-5) stop 2
+      end program test
diff --git a/gcc/testsuite/gfortran.dg/dec_structure_26.f b/gcc/testsuite/gfortran.dg/dec_structure_26.f
new file mode 100644
index 00000000000..186d72f622c
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/dec_structure_26.f
@@ -0,0 +1,22 @@
+! { dg-do compile }
+! { dg-options "-fdec -fno-dec-structure" }
+!
+! PR fortran/87919
+!
+! Should fail to compile with -fdec and -fno-dec-structure.
+!
+! Contributed by Mark Eggleston <mark.eggleston@codethink.com>
+!
+      program test
+
+        structure /info/ ! { dg-error "-fdec-structure" }
+          integer a
+          real b
+         end structure   ! { dg-error "END PROGRAM" }
+
+        record /info/ s  ! { dg-error "-fdec-structure" }
+        s.a = 199        ! { dg-error "Unclassifiable" }
+        s.b = 7.6        ! { dg-error "Unclassifiable" }
+        write (*,*) s.a  ! { dg-error "Syntax error in WRITE" }
+        write (*,*) s.b  ! { dg-error "Syntax error in WRITE" }
+      end program test
diff --git a/gcc/testsuite/gfortran.dg/dec_structure_27.f b/gcc/testsuite/gfortran.dg/dec_structure_27.f
new file mode 100644
index 00000000000..233aa38ab36
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/dec_structure_27.f
@@ -0,0 +1,20 @@
+! { dg-do compile }
+! { dg-options "-fdec-structure -fno-dec-structure" }
+!
+! PR fortran/87919
+!
+! Should fail to compile with -fdec-structure and -fno-dec-structure.
+!
+      program test
+
+        structure /info/ ! { dg-error "-fdec-structure" }
+          integer a
+          real b
+         end structure   ! { dg-error "END PROGRAM" }
+
+        record /info/ s  ! { dg-error "-fdec-structure" }
+        s.a = 199        ! { dg-error "Unclassifiable" }
+        s.b = 7.6        ! { dg-error "Unclassifiable" }
+        write (*,*) s.a  ! { dg-error "Syntax error in WRITE" }
+        write (*,*) s.b  ! { dg-error "Syntax error in WRITE" }
+      end program test
diff --git a/gcc/testsuite/gfortran.dg/dec_type_print_3.f90 b/gcc/testsuite/gfortran.dg/dec_type_print_3.f90
new file mode 100644
index 00000000000..5a9334c8c98
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/dec_type_print_3.f90
@@ -0,0 +1,29 @@
+! { dg-do compile }
+! { dg-options "-fdec -fno-dec" }
+!
+! Ensure that -fno-dec disables the usage of TYPE as an alias for PRINT.
+!
+
+implicit none
+
+integer i /0/, j /1/, k /2/
+character(*), parameter :: fmtstr = "(A11)"
+namelist /nmlist/ i, j, k
+integer, parameter :: n = 5
+
+! Type as alias for print
+type* ! { dg-error "Invalid character in name" }
+type * ! { dg-error "Invalid character in name" }
+type*,'St','ar' ! { dg-error "Invalid character in name" }
+type *, 'St', 'ar' ! { dg-error "Invalid character in name" }
+type 10, 'Integer literal' ! { dg-error "Invalid character in name" }
+type 10, 'Integer variable' ! { dg-error "Invalid character in name" }
+type '(A11)', 'Character literal' ! { dg-error "Invalid character in name" }
+type fmtstr, 'Character variable' ! { dg-error "Unclassifiable statement" }
+type nmlist ! { dg-error "NAMELIST attribute.*?conflicts with PROCEDURE" }
+
+if (n .eq. n) type*, fmtstr ! { dg-error "Cannot assign to a named constant" }
+
+10    format (A11)
+
+end program
diff --git a/gcc/testsuite/gfortran.dg/init_flag_20.f90 b/gcc/testsuite/gfortran.dg/init_flag_20.f90
new file mode 100644
index 00000000000..e05cf951f4c
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/init_flag_20.f90
@@ -0,0 +1,62 @@
+! { dg-do compile }
+! { dg-options "-finit-local-zero -fno-init-local-zero -fdump-tree-original" }
+!
+! PR fortran/87919
+!
+! Make sure -fno-init-local-zero disables -finit-local-zero.
+!
+! The basic test subroutines are copied from init_flag_1.f90, but this test
+! only compiles and check the original tree. The conditional checks are only
+! kept to prevent the variables from being marked unused.
+!
+
+subroutine real_test
+  real r1
+  real r2(10)
+  dimension r3(10,10)
+  if (r1 /= 0.0) STOP 1
+  if (r2(2) /= 0.0) STOP 2
+  if (r3(5,5) /= 0.0) STOP 3
+  if (r4 /= 0.0) STOP 4
+end subroutine real_test
+
+subroutine logical_test
+  logical l1
+  logical l2(2)
+  if (l1 .neqv. .false.) STOP 5
+  if (l2(2) .neqv. .false.) STOP 6
+end subroutine logical_test
+
+subroutine int_test
+  integer i1
+  integer i2(10)
+  dimension i3(10,10)
+  if (i1 /= 0) STOP 7
+  if (i2(2) /= 0) STOP 8
+  if (i3(5,5) /= 0) STOP 9
+  if (i4 /= 0) STOP 10
+end subroutine int_test
+
+subroutine complex_test
+  complex c1
+  complex c2(20,20)
+  if (c1 /= (0.0,0.0)) STOP 11
+  if (c2(1,1) /= (0.0,0.0)) STOP 12
+end subroutine complex_test
+
+subroutine char_test
+  character*1 c1
+  character*8 c2, c3(5)
+  character c4(10)
+  if (c1 /= '\0') STOP 13
+  if (c2 /= '\0\0\0\0\0\0\0\0') STOP 14
+  if (c3(1) /= '\0\0\0\0\0\0\0\0') STOP 15
+  if (c3(5) /= '\0\0\0\0\0\0\0\0') STOP 16
+  if (c4(5) /= '\0') STOP 17
+end subroutine char_test
+
+! Make sure no initialization code is generated.
+! { dg-final { scan-tree-dump-times "r\[1-4] *= *\[0\{]" 0 "original" } }
+! { dg-final { scan-tree-dump-times "l\[12] *= *\[0\{]" 0 "original" } }
+! { dg-final { scan-tree-dump-times "i\[1-4] *= *\[0\{]" 0 "original" } }
+! { dg-final { scan-tree-dump-times "memmove *\[(]\[^,]*c\[1-4]" 0 "original" } }
-- 
2.12.2


  reply	other threads:[~2018-11-08 17:09 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-11-07 15:07 Mark Eggleston
2018-11-07 15:22 ` Jakub Jelinek
2018-11-07 22:05   ` Fritz Reese
2018-11-07 22:32     ` Jakub Jelinek
2018-11-08 17:09       ` Fritz Reese [this message]
2018-11-08 17:54         ` Jakub Jelinek
2018-11-12 20:29           ` Fritz Reese
2018-11-12 20:42             ` Jakub Jelinek
2018-11-12 20:53               ` Fritz Reese
2018-11-22 11:46                 ` Jakub Jelinek
2018-12-03 15:26             ` Mark Eggleston
2018-12-03 15:52               ` Fritz Reese
2018-12-03 15:58                 ` Jakub Jelinek
2018-12-03 17:12                   ` Jakub Jelinek
2018-12-03 17:39                     ` Fritz Reese

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAE4aFAmGo1v1Xe3z05qnweoJkgJiPZ_aL0=zj7eOiVXwhzOncw@mail.gmail.com' \
    --to=fritzoreese@gmail.com \
    --cc=beth.white@codethink.co.uk \
    --cc=emmet.hikory@codethink.co.uk \
    --cc=fortran@gcc.gnu.org \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=jakub@redhat.com \
    --cc=law@redhat.com \
    --cc=mark.eggleston@codethink.co.uk \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).