import gcc-toolset-10-gcc-10.2.1-2.el8
This commit is contained in:
commit
c2df8d99d8
6
.gcc-toolset-10-gcc.metadata
Normal file
6
.gcc-toolset-10-gcc.metadata
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
7f4348418dc3efefd357b32a2b5c8010211ab284 SOURCES/doxygen-1.8.0.src.tar.gz
|
||||||
|
19a2803c35999e08af82cdbfc7e7502ad2fe7b59 SOURCES/gcc-10.2.1-20200804.tar.xz
|
||||||
|
c5a2b201bf05229647e73203c0bf2d9679d4d21f SOURCES/isl-0.16.1.tar.bz2
|
||||||
|
5ef03ca7aee134fe7dfecb6c9d048799f0810278 SOURCES/mpc-0.8.1.tar.gz
|
||||||
|
6ec33952e824e837fef0e829c93d39d6a507082f SOURCES/newlib-cygwin-50e2a63b04bdd018484605fbb954fd1bd5147fa0.tar.xz
|
||||||
|
0e0c6f8d68ab0878f02287ac082c1077c831cd81 SOURCES/nvptx-tools-5f6f343a302d620b0868edab376c00b15741e39e.tar.xz
|
6
.gitignore
vendored
Normal file
6
.gitignore
vendored
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
SOURCES/doxygen-1.8.0.src.tar.gz
|
||||||
|
SOURCES/gcc-10.2.1-20200804.tar.xz
|
||||||
|
SOURCES/isl-0.16.1.tar.bz2
|
||||||
|
SOURCES/mpc-0.8.1.tar.gz
|
||||||
|
SOURCES/newlib-cygwin-50e2a63b04bdd018484605fbb954fd1bd5147fa0.tar.xz
|
||||||
|
SOURCES/nvptx-tools-5f6f343a302d620b0868edab376c00b15741e39e.tar.xz
|
@ -0,0 +1,873 @@
|
|||||||
|
From f3e3034684c7ac44a14c70d6a248d8acee303176 Mon Sep 17 00:00:00 2001
|
||||||
|
From: law <law@138bc75d-0d04-0410-961f-82ee72b054a4>
|
||||||
|
Date: Thu, 10 May 2018 11:48:34 +0100
|
||||||
|
Subject: [PATCH 01/16] Default widths for i, f and g format specifiers in
|
||||||
|
format strings.
|
||||||
|
|
||||||
|
Enabled using -fdec.
|
||||||
|
|
||||||
|
The behaviour is modelled on the Oracle Fortran compiler. At the time
|
||||||
|
of writing, the details were available at this URL:
|
||||||
|
|
||||||
|
https://docs.oracle.com/cd/E19957-01/805-4939/6j4m0vnc3/index.html#z4000743746d
|
||||||
|
|
||||||
|
Addition by Mark Eggleston <mark.eggleston@codethink.com>:
|
||||||
|
|
||||||
|
Use -fdec-format-defaults to enable this feature. Also enabled using -fdec.
|
||||||
|
---
|
||||||
|
gcc/fortran/io.c | 31 +++++++++++--
|
||||||
|
gcc/fortran/lang.opt | 4 ++
|
||||||
|
gcc/fortran/options.c | 1 +
|
||||||
|
.../gfortran.dg/fmt_f_default_field_width_1.f90 | 43 ++++++++++++++++++
|
||||||
|
.../gfortran.dg/fmt_f_default_field_width_2.f90 | 46 +++++++++++++++++++
|
||||||
|
.../gfortran.dg/fmt_f_default_field_width_3.f90 | 28 ++++++++++++
|
||||||
|
.../gfortran.dg/fmt_g_default_field_width_1.f90 | 48 ++++++++++++++++++++
|
||||||
|
.../gfortran.dg/fmt_g_default_field_width_2.f90 | 52 ++++++++++++++++++++++
|
||||||
|
.../gfortran.dg/fmt_g_default_field_width_3.f90 | 31 +++++++++++++
|
||||||
|
.../gfortran.dg/fmt_i_default_field_width_1.f90 | 38 ++++++++++++++++
|
||||||
|
.../gfortran.dg/fmt_i_default_field_width_2.f90 | 42 +++++++++++++++++
|
||||||
|
.../gfortran.dg/fmt_i_default_field_width_3.f90 | 35 +++++++++++++++
|
||||||
|
libgfortran/io/format.c | 35 +++++++++++++++
|
||||||
|
libgfortran/io/io.h | 50 +++++++++++++++++++++
|
||||||
|
libgfortran/io/read.c | 6 +++
|
||||||
|
libgfortran/io/write.c | 22 +++++----
|
||||||
|
libgfortran/io/write_float.def | 37 ++++++++++++---
|
||||||
|
17 files changed, 531 insertions(+), 18 deletions(-)
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/fmt_f_default_field_width_1.f90
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/fmt_f_default_field_width_2.f90
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/fmt_f_default_field_width_3.f90
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/fmt_g_default_field_width_1.f90
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/fmt_g_default_field_width_2.f90
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/fmt_g_default_field_width_3.f90
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/fmt_i_default_field_width_1.f90
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/fmt_i_default_field_width_2.f90
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/fmt_i_default_field_width_3.f90
|
||||||
|
|
||||||
|
diff --git a/gcc/fortran/io.c b/gcc/fortran/io.c
|
||||||
|
index 9828897852a..57117579627 100644
|
||||||
|
--- a/gcc/fortran/io.c
|
||||||
|
+++ b/gcc/fortran/io.c
|
||||||
|
@@ -903,6 +903,13 @@ data_desc:
|
||||||
|
|
||||||
|
if (u != FMT_POSINT)
|
||||||
|
{
|
||||||
|
+ if (flag_dec_format_defaults)
|
||||||
|
+ {
|
||||||
|
+ /* Assume a default width based on the variable size. */
|
||||||
|
+ saved_token = u;
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
format_locus.nextc += format_string_pos;
|
||||||
|
gfc_error ("Positive width required in format "
|
||||||
|
"specifier %s at %L", token_to_string (t),
|
||||||
|
@@ -1027,6 +1034,13 @@ data_desc:
|
||||||
|
goto fail;
|
||||||
|
if (t != FMT_ZERO && t != FMT_POSINT)
|
||||||
|
{
|
||||||
|
+ if (flag_dec_format_defaults)
|
||||||
|
+ {
|
||||||
|
+ /* Assume the default width is expected here and continue lexing. */
|
||||||
|
+ value = 0; /* It doesn't matter what we set the value to here. */
|
||||||
|
+ saved_token = t;
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
error = nonneg_required;
|
||||||
|
goto syntax;
|
||||||
|
}
|
||||||
|
@@ -1096,8 +1110,17 @@ data_desc:
|
||||||
|
goto fail;
|
||||||
|
if (t != FMT_ZERO && t != FMT_POSINT)
|
||||||
|
{
|
||||||
|
- error = nonneg_required;
|
||||||
|
- goto syntax;
|
||||||
|
+ if (flag_dec_format_defaults)
|
||||||
|
+ {
|
||||||
|
+ /* Assume the default width is expected here and continue lexing. */
|
||||||
|
+ value = 0; /* It doesn't matter what we set the value to here. */
|
||||||
|
+ saved_token = t;
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ error = nonneg_required;
|
||||||
|
+ goto syntax;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
else if (is_input && t == FMT_ZERO)
|
||||||
|
{
|
||||||
|
@@ -4368,8 +4391,8 @@ get_io_list:
|
||||||
|
}
|
||||||
|
|
||||||
|
/* See if we want to use defaults for missing exponents in real transfers
|
||||||
|
- and other DEC runtime extensions. */
|
||||||
|
- if (flag_dec)
|
||||||
|
+ and other DEC runtime extensions. */
|
||||||
|
+ if (flag_dec_format_defaults)
|
||||||
|
dt->dec_ext = 1;
|
||||||
|
|
||||||
|
/* A full IO statement has been matched. Check the constraints. spec_end is
|
||||||
|
diff --git a/gcc/fortran/lang.opt b/gcc/fortran/lang.opt
|
||||||
|
index 9151d02c491..26e82601b62 100644
|
||||||
|
--- a/gcc/fortran/lang.opt
|
||||||
|
+++ b/gcc/fortran/lang.opt
|
||||||
|
@@ -444,6 +444,10 @@ fdec-include
|
||||||
|
Fortran Var(flag_dec_include)
|
||||||
|
Enable legacy parsing of INCLUDE as statement.
|
||||||
|
|
||||||
|
+fdec-format-defaults
|
||||||
|
+Fortran Var(flag_dec_format_defaults)
|
||||||
|
+Enable default widths for i, f and g format specifiers.
|
||||||
|
+
|
||||||
|
fdec-intrinsic-ints
|
||||||
|
Fortran Var(flag_dec_intrinsic_ints)
|
||||||
|
Enable kind-specific variants of integer intrinsic functions.
|
||||||
|
diff --git a/gcc/fortran/options.c b/gcc/fortran/options.c
|
||||||
|
index 02970d59066..4f91486e977 100644
|
||||||
|
--- a/gcc/fortran/options.c
|
||||||
|
+++ b/gcc/fortran/options.c
|
||||||
|
@@ -74,6 +74,7 @@ set_dec_flags (int value)
|
||||||
|
SET_BITFLAG (flag_dec_static, value, value);
|
||||||
|
SET_BITFLAG (flag_dec_math, value, value);
|
||||||
|
SET_BITFLAG (flag_dec_include, value, value);
|
||||||
|
+ SET_BITFLAG (flag_dec_format_defaults, value, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Finalize DEC flags. */
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/fmt_f_default_field_width_1.f90 b/gcc/testsuite/gfortran.dg/fmt_f_default_field_width_1.f90
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..49c77155761
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/fmt_f_default_field_width_1.f90
|
||||||
|
@@ -0,0 +1,43 @@
|
||||||
|
+! { dg-do run }
|
||||||
|
+! { dg-options -fdec }
|
||||||
|
+!
|
||||||
|
+! Test case for the default field widths enabled by the -fdec-format-defaults flag.
|
||||||
|
+!
|
||||||
|
+! This feature is not part of any Fortran standard, but it is supported by the
|
||||||
|
+! Oracle Fortran compiler and others.
|
||||||
|
+!
|
||||||
|
+! libgfortran uses printf() internally to implement FORMAT. If you print float
|
||||||
|
+! values to a higher precision than the type can actually store, the results
|
||||||
|
+! are implementation dependent: some platforms print zeros, others print random
|
||||||
|
+! numbers. Don't depend on this behaviour in tests because they will not be
|
||||||
|
+! portable.
|
||||||
|
+
|
||||||
|
+ character(50) :: buffer
|
||||||
|
+
|
||||||
|
+ real*4 :: real_4
|
||||||
|
+ real*8 :: real_8
|
||||||
|
+ real*16 :: real_16
|
||||||
|
+ integer :: len
|
||||||
|
+
|
||||||
|
+ real_4 = 4.18
|
||||||
|
+ write(buffer, '(A, F, A)') ':',real_4,':'
|
||||||
|
+ print *,buffer
|
||||||
|
+ if (buffer.ne.": 4.1799998:") stop 1
|
||||||
|
+
|
||||||
|
+ real_4 = 0.00000018
|
||||||
|
+ write(buffer, '(A, F, A)') ':',real_4,':'
|
||||||
|
+ print *,buffer
|
||||||
|
+ if (buffer.ne.": 0.0000002:") stop 2
|
||||||
|
+
|
||||||
|
+ real_8 = 4.18
|
||||||
|
+ write(buffer, '(A, F, A)') ':',real_8,':'
|
||||||
|
+ print *,buffer
|
||||||
|
+ len = len_trim(buffer)
|
||||||
|
+ if (len /= 27) stop 3
|
||||||
|
+
|
||||||
|
+ real_16 = 4.18
|
||||||
|
+ write(buffer, '(A, F, A)') ':',real_16,':'
|
||||||
|
+ print *,buffer
|
||||||
|
+ len = len_trim(buffer)
|
||||||
|
+ if (len /= 44) stop 4
|
||||||
|
+end
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/fmt_f_default_field_width_2.f90 b/gcc/testsuite/gfortran.dg/fmt_f_default_field_width_2.f90
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..1c2ec0413a7
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/fmt_f_default_field_width_2.f90
|
||||||
|
@@ -0,0 +1,46 @@
|
||||||
|
+! { dg-do run }
|
||||||
|
+! { dg-options -fdec-format-defaults }
|
||||||
|
+!
|
||||||
|
+! Test case for the default field widths enabled by the -fdec-format-defaults flag.
|
||||||
|
+!
|
||||||
|
+! This feature is not part of any Fortran standard, but it is supported by the
|
||||||
|
+! Oracle Fortran compiler and others.
|
||||||
|
+!
|
||||||
|
+! libgfortran uses printf() internally to implement FORMAT. If you print float
|
||||||
|
+! values to a higher precision than the type can actually store, the results
|
||||||
|
+! are implementation dependent: some platforms print zeros, others print random
|
||||||
|
+! numbers. Don't depend on this behaviour in tests because they will not be
|
||||||
|
+! portable.
|
||||||
|
+!
|
||||||
|
+! Test case added by Mark Eggleston <mark.eggleston@codethink.com> to check
|
||||||
|
+! use of -fdec-format-defaults
|
||||||
|
+!
|
||||||
|
+ character(50) :: buffer
|
||||||
|
+
|
||||||
|
+ real*4 :: real_4
|
||||||
|
+ real*8 :: real_8
|
||||||
|
+ real*16 :: real_16
|
||||||
|
+ integer :: len
|
||||||
|
+
|
||||||
|
+ real_4 = 4.18
|
||||||
|
+ write(buffer, '(A, F, A)') ':',real_4,':'
|
||||||
|
+ print *,buffer
|
||||||
|
+ if (buffer.ne.": 4.1799998:") stop 1
|
||||||
|
+
|
||||||
|
+ real_4 = 0.00000018
|
||||||
|
+ write(buffer, '(A, F, A)') ':',real_4,':'
|
||||||
|
+ print *,buffer
|
||||||
|
+ if (buffer.ne.": 0.0000002:") stop 2
|
||||||
|
+
|
||||||
|
+ real_8 = 4.18
|
||||||
|
+ write(buffer, '(A, F, A)') ':',real_8,':'
|
||||||
|
+ print *,buffer
|
||||||
|
+ len = len_trim(buffer)
|
||||||
|
+ if (len /= 27) stop 3
|
||||||
|
+
|
||||||
|
+ real_16 = 4.18
|
||||||
|
+ write(buffer, '(A, F, A)') ':',real_16,':'
|
||||||
|
+ print *,buffer
|
||||||
|
+ len = len_trim(buffer)
|
||||||
|
+ if (len /= 44) stop 4
|
||||||
|
+end
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/fmt_f_default_field_width_3.f90 b/gcc/testsuite/gfortran.dg/fmt_f_default_field_width_3.f90
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..e513063189b
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/fmt_f_default_field_width_3.f90
|
||||||
|
@@ -0,0 +1,28 @@
|
||||||
|
+! { dg-do compile }
|
||||||
|
+! { dg-options "-fdec -fno-dec-format-defaults" }
|
||||||
|
+!
|
||||||
|
+! Test case for the default field widths not enabled.
|
||||||
|
+!
|
||||||
|
+! Test case added by Mark Eggleston <mark.eggleston@codethink.com> to check
|
||||||
|
+! use of -fno-dec-format-defaults
|
||||||
|
+!
|
||||||
|
+
|
||||||
|
+ character(50) :: buffer
|
||||||
|
+
|
||||||
|
+ real*4 :: real_4
|
||||||
|
+ real*8 :: real_8
|
||||||
|
+ real*16 :: real_16
|
||||||
|
+ integer :: len
|
||||||
|
+
|
||||||
|
+ real_4 = 4.18
|
||||||
|
+ write(buffer, '(A, F, A)') ':',real_4,':' ! { dg-error "Nonnegative width required" }
|
||||||
|
+
|
||||||
|
+ real_4 = 0.00000018
|
||||||
|
+ write(buffer, '(A, F, A)') ':',real_4,':' ! { dg-error "Nonnegative width required" }
|
||||||
|
+
|
||||||
|
+ real_8 = 4.18
|
||||||
|
+ write(buffer, '(A, F, A)') ':',real_8,':' ! { dg-error "Nonnegative width required" }
|
||||||
|
+
|
||||||
|
+ real_16 = 4.18
|
||||||
|
+ write(buffer, '(A, F, A)') ':',real_16,':' ! { dg-error "Nonnegative width required" }
|
||||||
|
+end
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/fmt_g_default_field_width_1.f90 b/gcc/testsuite/gfortran.dg/fmt_g_default_field_width_1.f90
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..6e2ad141d4a
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/fmt_g_default_field_width_1.f90
|
||||||
|
@@ -0,0 +1,48 @@
|
||||||
|
+! { dg-do run }
|
||||||
|
+! { dg-options -fdec }
|
||||||
|
+!
|
||||||
|
+! Test case for the default field widths enabled by the -fdec-format-defaults flag.
|
||||||
|
+!
|
||||||
|
+! This feature is not part of any Fortran standard, but it is supported by the
|
||||||
|
+! Oracle Fortran compiler and others.
|
||||||
|
+!
|
||||||
|
+! libgfortran uses printf() internally to implement FORMAT. If you print float
|
||||||
|
+! values to a higher precision than the type can actually store, the results
|
||||||
|
+! are implementation dependent: some platforms print zeros, others print random
|
||||||
|
+! numbers. Don't depend on this behaviour in tests because they will not be
|
||||||
|
+! portable.
|
||||||
|
+
|
||||||
|
+ character(50) :: buffer
|
||||||
|
+
|
||||||
|
+ real*4 :: real_4
|
||||||
|
+ real*8 :: real_8
|
||||||
|
+ real*16 :: real_16
|
||||||
|
+ integer :: len
|
||||||
|
+
|
||||||
|
+ real_4 = 4.18
|
||||||
|
+ write(buffer, '(A, G, A)') ':',real_4,':'
|
||||||
|
+ print *,buffer
|
||||||
|
+ if (buffer.ne.": 4.180000 :") stop 1
|
||||||
|
+
|
||||||
|
+ real_4 = 0.00000018
|
||||||
|
+ write(buffer, '(A, G, A)') ':',real_4,':'
|
||||||
|
+ print *,buffer
|
||||||
|
+ if (buffer.ne.": 0.1800000E-06:") stop 2
|
||||||
|
+
|
||||||
|
+ real_4 = 18000000.4
|
||||||
|
+ write(buffer, '(A, G, A)') ':',real_4,':'
|
||||||
|
+ print *,buffer
|
||||||
|
+ if (buffer.ne.": 0.1800000E+08:") stop 3
|
||||||
|
+
|
||||||
|
+ real_8 = 4.18
|
||||||
|
+ write(buffer, '(A, G, A)') ':',real_8,':'
|
||||||
|
+ print *,buffer
|
||||||
|
+ len = len_trim(buffer)
|
||||||
|
+ if (len /= 27) stop 4
|
||||||
|
+
|
||||||
|
+ real_16 = 4.18
|
||||||
|
+ write(buffer, '(A, G, A)') ':',real_16,':'
|
||||||
|
+ print *,buffer
|
||||||
|
+ len = len_trim(buffer)
|
||||||
|
+ if (len /= 44) stop 5
|
||||||
|
+end
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/fmt_g_default_field_width_2.f90 b/gcc/testsuite/gfortran.dg/fmt_g_default_field_width_2.f90
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..7b218af8610
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/fmt_g_default_field_width_2.f90
|
||||||
|
@@ -0,0 +1,52 @@
|
||||||
|
+! { dg-do run }
|
||||||
|
+! { dg-options -fdec-format-defaults }
|
||||||
|
+!
|
||||||
|
+! Test case for the default field widths enabled by the -fdec-format-defaults flag.
|
||||||
|
+!
|
||||||
|
+! This feature is not part of any Fortran standard, but it is supported by the
|
||||||
|
+! Oracle Fortran compiler and others.
|
||||||
|
+!
|
||||||
|
+! libgfortran uses printf() internally to implement FORMAT. If you print float
|
||||||
|
+! values to a higher precision than the type can actually store, the results
|
||||||
|
+! are implementation dependent: some platforms print zeros, others print random
|
||||||
|
+! numbers. Don't depend on this behaviour in tests because they will not be
|
||||||
|
+! portable.
|
||||||
|
+!
|
||||||
|
+! Test case added by Mark Eggleston <mark.eggleston@codethink.com> to check
|
||||||
|
+! use of -fdec-format-defaults
|
||||||
|
+!
|
||||||
|
+
|
||||||
|
+ character(50) :: buffer
|
||||||
|
+
|
||||||
|
+ real*4 :: real_4
|
||||||
|
+ real*8 :: real_8
|
||||||
|
+ real*16 :: real_16
|
||||||
|
+ integer :: len
|
||||||
|
+
|
||||||
|
+ real_4 = 4.18
|
||||||
|
+ write(buffer, '(A, G, A)') ':',real_4,':'
|
||||||
|
+ print *,buffer
|
||||||
|
+ if (buffer.ne.": 4.180000 :") stop 1
|
||||||
|
+
|
||||||
|
+ real_4 = 0.00000018
|
||||||
|
+ write(buffer, '(A, G, A)') ':',real_4,':'
|
||||||
|
+ print *,buffer
|
||||||
|
+ if (buffer.ne.": 0.1800000E-06:") stop 2
|
||||||
|
+
|
||||||
|
+ real_4 = 18000000.4
|
||||||
|
+ write(buffer, '(A, G, A)') ':',real_4,':'
|
||||||
|
+ print *,buffer
|
||||||
|
+ if (buffer.ne.": 0.1800000E+08:") stop 3
|
||||||
|
+
|
||||||
|
+ real_8 = 4.18
|
||||||
|
+ write(buffer, '(A, G, A)') ':',real_8,':'
|
||||||
|
+ print *,buffer
|
||||||
|
+ len = len_trim(buffer)
|
||||||
|
+ if (len /= 27) stop 4
|
||||||
|
+
|
||||||
|
+ real_16 = 4.18
|
||||||
|
+ write(buffer, '(A, G, A)') ':',real_16,':'
|
||||||
|
+ print *,buffer
|
||||||
|
+ len = len_trim(buffer)
|
||||||
|
+ if (len /= 44) stop 5
|
||||||
|
+end
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/fmt_g_default_field_width_3.f90 b/gcc/testsuite/gfortran.dg/fmt_g_default_field_width_3.f90
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..e255c2f94a0
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/fmt_g_default_field_width_3.f90
|
||||||
|
@@ -0,0 +1,31 @@
|
||||||
|
+! { dg-do compile }
|
||||||
|
+! { dg-options "-fdec -fno-dec-format-defaults" }
|
||||||
|
+!
|
||||||
|
+! Test case for the default field widths not enabled.
|
||||||
|
+!
|
||||||
|
+! Test case added by Mark Eggleston <mark.eggleston@codethink.com> to check
|
||||||
|
+! use of -fno-dec-format-defaults
|
||||||
|
+!
|
||||||
|
+
|
||||||
|
+ character(50) :: buffer
|
||||||
|
+
|
||||||
|
+ real*4 :: real_4
|
||||||
|
+ real*8 :: real_8
|
||||||
|
+ real*16 :: real_16
|
||||||
|
+ integer :: len
|
||||||
|
+
|
||||||
|
+ real_4 = 4.18
|
||||||
|
+ write(buffer, '(A, G, A)') ':',real_4,':' ! { dg-error "Positive width required" }
|
||||||
|
+
|
||||||
|
+ real_4 = 0.00000018
|
||||||
|
+ write(buffer, '(A, G, A)') ':',real_4,':' ! { dg-error "Positive width required" }
|
||||||
|
+
|
||||||
|
+ real_4 = 18000000.4
|
||||||
|
+ write(buffer, '(A, G, A)') ':',real_4,':' ! { dg-error "Positive width required" }
|
||||||
|
+
|
||||||
|
+ real_8 = 4.18
|
||||||
|
+ write(buffer, '(A, G, A)') ':',real_8,':' ! { dg-error "Positive width required" }
|
||||||
|
+
|
||||||
|
+ real_16 = 4.18
|
||||||
|
+ write(buffer, '(A, G, A)') ':',real_16,':' ! { dg-error "Positive width required" }
|
||||||
|
+end
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/fmt_i_default_field_width_1.f90 b/gcc/testsuite/gfortran.dg/fmt_i_default_field_width_1.f90
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..0d32d240394
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/fmt_i_default_field_width_1.f90
|
||||||
|
@@ -0,0 +1,38 @@
|
||||||
|
+! { dg-do run }
|
||||||
|
+! { dg-options -fdec }
|
||||||
|
+!
|
||||||
|
+! Test case for the default field widths enabled by the -fdec-format-defaults flag.
|
||||||
|
+!
|
||||||
|
+! This feature is not part of any Fortran standard, but it is supported by the
|
||||||
|
+! Oracle Fortran compiler and others.
|
||||||
|
+
|
||||||
|
+ character(50) :: buffer
|
||||||
|
+ character(1) :: colon
|
||||||
|
+
|
||||||
|
+ integer*2 :: integer_2
|
||||||
|
+ integer*4 :: integer_4
|
||||||
|
+ integer*8 :: integer_8
|
||||||
|
+
|
||||||
|
+ write(buffer, '(A, I, A)') ':',12340,':'
|
||||||
|
+ print *,buffer
|
||||||
|
+ if (buffer.ne.": 12340:") stop 1
|
||||||
|
+
|
||||||
|
+ read(buffer, '(A1, I, A1)') colon, integer_4, colon
|
||||||
|
+ if (integer_4.ne.12340) stop 2
|
||||||
|
+
|
||||||
|
+ integer_2 = -99
|
||||||
|
+ write(buffer, '(A, I, A)') ':',integer_2,':'
|
||||||
|
+ print *,buffer
|
||||||
|
+ if (buffer.ne.": -99:") stop 3
|
||||||
|
+
|
||||||
|
+ integer_8 = -11112222
|
||||||
|
+ write(buffer, '(A, I, A)') ':',integer_8,':'
|
||||||
|
+ print *,buffer
|
||||||
|
+ if (buffer.ne.": -11112222:") stop 4
|
||||||
|
+
|
||||||
|
+! If the width is 7 and there are 7 leading zeroes, the result should be zero.
|
||||||
|
+ integer_2 = 789
|
||||||
|
+ buffer = '0000000789'
|
||||||
|
+ read(buffer, '(I)') integer_2
|
||||||
|
+ if (integer_2.ne.0) stop 5
|
||||||
|
+end
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/fmt_i_default_field_width_2.f90 b/gcc/testsuite/gfortran.dg/fmt_i_default_field_width_2.f90
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..6cee3f86809
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/fmt_i_default_field_width_2.f90
|
||||||
|
@@ -0,0 +1,42 @@
|
||||||
|
+! { dg-do run }
|
||||||
|
+! { dg-options -fdec-format-defaults }
|
||||||
|
+!
|
||||||
|
+! Test case for the default field widths enabled by the -fdec-format-defaults flag.
|
||||||
|
+!
|
||||||
|
+! This feature is not part of any Fortran standard, but it is supported by the
|
||||||
|
+! Oracle Fortran compiler and others.
|
||||||
|
+!
|
||||||
|
+! Test case added by Mark Eggleston <mark.eggleston@codethink.com> to check
|
||||||
|
+! use of -fdec-format-defaults
|
||||||
|
+!
|
||||||
|
+
|
||||||
|
+ character(50) :: buffer
|
||||||
|
+ character(1) :: colon
|
||||||
|
+
|
||||||
|
+ integer*2 :: integer_2
|
||||||
|
+ integer*4 :: integer_4
|
||||||
|
+ integer*8 :: integer_8
|
||||||
|
+
|
||||||
|
+ write(buffer, '(A, I, A)') ':',12340,':'
|
||||||
|
+ print *,buffer
|
||||||
|
+ if (buffer.ne.": 12340:") stop 1
|
||||||
|
+
|
||||||
|
+ read(buffer, '(A1, I, A1)') colon, integer_4, colon
|
||||||
|
+ if (integer_4.ne.12340) stop 2
|
||||||
|
+
|
||||||
|
+ integer_2 = -99
|
||||||
|
+ write(buffer, '(A, I, A)') ':',integer_2,':'
|
||||||
|
+ print *,buffer
|
||||||
|
+ if (buffer.ne.": -99:") stop 3
|
||||||
|
+
|
||||||
|
+ integer_8 = -11112222
|
||||||
|
+ write(buffer, '(A, I, A)') ':',integer_8,':'
|
||||||
|
+ print *,buffer
|
||||||
|
+ if (buffer.ne.": -11112222:") stop 4
|
||||||
|
+
|
||||||
|
+! If the width is 7 and there are 7 leading zeroes, the result should be zero.
|
||||||
|
+ integer_2 = 789
|
||||||
|
+ buffer = '0000000789'
|
||||||
|
+ read(buffer, '(I)') integer_2
|
||||||
|
+ if (integer_2.ne.0) stop 5
|
||||||
|
+end
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/fmt_i_default_field_width_3.f90 b/gcc/testsuite/gfortran.dg/fmt_i_default_field_width_3.f90
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..3a6684b3c4d
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/fmt_i_default_field_width_3.f90
|
||||||
|
@@ -0,0 +1,35 @@
|
||||||
|
+! { dg-do compile }
|
||||||
|
+! { dg-options "-fdec -fno-dec-format-defaults" }
|
||||||
|
+!
|
||||||
|
+! Test case for the default field widths enabled by the -fdec-format-defaults flag.
|
||||||
|
+!
|
||||||
|
+! This feature is not part of any Fortran standard, but it is supported by the
|
||||||
|
+! Oracle Fortran compiler and others.
|
||||||
|
+!
|
||||||
|
+! Test case added by Mark Eggleston <mark.eggleston@codethink.com> to check
|
||||||
|
+! use of -fdec-format-defaults
|
||||||
|
+!
|
||||||
|
+
|
||||||
|
+ character(50) :: buffer
|
||||||
|
+ character(1) :: colon
|
||||||
|
+
|
||||||
|
+ integer*2 :: integer_2
|
||||||
|
+ integer*4 :: integer_4
|
||||||
|
+ integer*8 :: integer_8
|
||||||
|
+
|
||||||
|
+ write(buffer, '(A, I, A)') ':',12340,':' ! { dg-error "Nonnegative width required" }
|
||||||
|
+
|
||||||
|
+ read(buffer, '(A1, I, A1)') colon, integer_4, colon ! { dg-error "Nonnegative width required" }
|
||||||
|
+ if (integer_4.ne.12340) stop 2
|
||||||
|
+
|
||||||
|
+ integer_2 = -99
|
||||||
|
+ write(buffer, '(A, I, A)') ':',integer_2,':' ! { dg-error "Nonnegative width required" }
|
||||||
|
+
|
||||||
|
+ integer_8 = -11112222
|
||||||
|
+ write(buffer, '(A, I, A)') ':',integer_8,':' ! { dg-error "Nonnegative width required" }
|
||||||
|
+
|
||||||
|
+! If the width is 7 and there are 7 leading zeroes, the result should be zero.
|
||||||
|
+ integer_2 = 789
|
||||||
|
+ buffer = '0000000789'
|
||||||
|
+ read(buffer, '(I)') integer_2 ! { dg-error "Nonnegative width required" }
|
||||||
|
+end
|
||||||
|
diff --git a/libgfortran/io/format.c b/libgfortran/io/format.c
|
||||||
|
index 688764785da..e798d9bda87 100644
|
||||||
|
--- a/libgfortran/io/format.c
|
||||||
|
+++ b/libgfortran/io/format.c
|
||||||
|
@@ -956,12 +956,33 @@ parse_format_list (st_parameter_dt *dtp, bool *seen_dd)
|
||||||
|
*seen_dd = true;
|
||||||
|
if (u != FMT_POSINT && u != FMT_ZERO)
|
||||||
|
{
|
||||||
|
+ if (dtp->common.flags & IOPARM_DT_DEC_EXT)
|
||||||
|
+ {
|
||||||
|
+ tail->u.real.w = DEFAULT_WIDTH;
|
||||||
|
+ tail->u.real.d = 0;
|
||||||
|
+ tail->u.real.e = -1;
|
||||||
|
+ fmt->saved_token = u;
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
fmt->error = nonneg_required;
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
+ else if (u == FMT_ZERO)
|
||||||
|
+ {
|
||||||
|
+ fmt->error = posint_required;
|
||||||
|
+ goto finished;
|
||||||
|
+ }
|
||||||
|
else if (u != FMT_POSINT)
|
||||||
|
{
|
||||||
|
+ if (dtp->common.flags & IOPARM_DT_DEC_EXT)
|
||||||
|
+ {
|
||||||
|
+ tail->u.real.w = DEFAULT_WIDTH;
|
||||||
|
+ tail->u.real.d = 0;
|
||||||
|
+ tail->u.real.e = -1;
|
||||||
|
+ fmt->saved_token = u;
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
fmt->error = posint_required;
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
@@ -1100,6 +1121,13 @@ parse_format_list (st_parameter_dt *dtp, bool *seen_dd)
|
||||||
|
{
|
||||||
|
if (t != FMT_POSINT)
|
||||||
|
{
|
||||||
|
+ if (dtp->common.flags & IOPARM_DT_DEC_EXT)
|
||||||
|
+ {
|
||||||
|
+ tail->u.integer.w = DEFAULT_WIDTH;
|
||||||
|
+ tail->u.integer.m = -1;
|
||||||
|
+ fmt->saved_token = t;
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
fmt->error = posint_required;
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
@@ -1108,6 +1136,13 @@ parse_format_list (st_parameter_dt *dtp, bool *seen_dd)
|
||||||
|
{
|
||||||
|
if (t != FMT_ZERO && t != FMT_POSINT)
|
||||||
|
{
|
||||||
|
+ if (dtp->common.flags & IOPARM_DT_DEC_EXT)
|
||||||
|
+ {
|
||||||
|
+ tail->u.integer.w = DEFAULT_WIDTH;
|
||||||
|
+ tail->u.integer.m = -1;
|
||||||
|
+ fmt->saved_token = t;
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
fmt->error = nonneg_required;
|
||||||
|
goto finished;
|
||||||
|
}
|
||||||
|
diff --git a/libgfortran/io/io.h b/libgfortran/io/io.h
|
||||||
|
index 5caaea280f0..f5e63797ba1 100644
|
||||||
|
--- a/libgfortran/io/io.h
|
||||||
|
+++ b/libgfortran/io/io.h
|
||||||
|
@@ -1011,6 +1011,56 @@ memset4 (gfc_char4_t *p, gfc_char4_t c, int k)
|
||||||
|
*p++ = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
+/* Used in width fields to indicate that the default should be used */
|
||||||
|
+#define DEFAULT_WIDTH -1
|
||||||
|
+
|
||||||
|
+/* Defaults for certain format field descriptors. These are decided based on
|
||||||
|
+ * the type of the value being formatted.
|
||||||
|
+ *
|
||||||
|
+ * The behaviour here is modelled on the Oracle Fortran compiler. At the time
|
||||||
|
+ * of writing, the details were available at this URL:
|
||||||
|
+ *
|
||||||
|
+ * https://docs.oracle.com/cd/E19957-01/805-4939/6j4m0vnc3/index.html#z4000743746d
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+static inline int
|
||||||
|
+default_width_for_integer (int kind)
|
||||||
|
+{
|
||||||
|
+ switch (kind)
|
||||||
|
+ {
|
||||||
|
+ case 1:
|
||||||
|
+ case 2: return 7;
|
||||||
|
+ case 4: return 12;
|
||||||
|
+ case 8: return 23;
|
||||||
|
+ case 16: return 44;
|
||||||
|
+ default: return 0;
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static inline int
|
||||||
|
+default_width_for_float (int kind)
|
||||||
|
+{
|
||||||
|
+ switch (kind)
|
||||||
|
+ {
|
||||||
|
+ case 4: return 15;
|
||||||
|
+ case 8: return 25;
|
||||||
|
+ case 16: return 42;
|
||||||
|
+ default: return 0;
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static inline int
|
||||||
|
+default_precision_for_float (int kind)
|
||||||
|
+{
|
||||||
|
+ switch (kind)
|
||||||
|
+ {
|
||||||
|
+ case 4: return 7;
|
||||||
|
+ case 8: return 16;
|
||||||
|
+ case 16: return 33;
|
||||||
|
+ default: return 0;
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern void
|
||||||
|
diff --git a/libgfortran/io/read.c b/libgfortran/io/read.c
|
||||||
|
index 52ffb4639ac..be9f6cb6f76 100644
|
||||||
|
--- a/libgfortran/io/read.c
|
||||||
|
+++ b/libgfortran/io/read.c
|
||||||
|
@@ -635,6 +635,12 @@ read_decimal (st_parameter_dt *dtp, const fnode *f, char *dest, int length)
|
||||||
|
|
||||||
|
w = f->u.w;
|
||||||
|
|
||||||
|
+ /* This is a legacy extension, and the frontend will only allow such cases
|
||||||
|
+ * through when -fdec-format-defaults is passed.
|
||||||
|
+ */
|
||||||
|
+ if (w == DEFAULT_WIDTH)
|
||||||
|
+ w = default_width_for_integer (length);
|
||||||
|
+
|
||||||
|
p = read_block_form (dtp, &w);
|
||||||
|
|
||||||
|
if (p == NULL)
|
||||||
|
diff --git a/libgfortran/io/write.c b/libgfortran/io/write.c
|
||||||
|
index c8811e200e0..4ef35561fdd 100644
|
||||||
|
--- a/libgfortran/io/write.c
|
||||||
|
+++ b/libgfortran/io/write.c
|
||||||
|
@@ -685,9 +685,8 @@ write_l (st_parameter_dt *dtp, const fnode *f, char *source, int len)
|
||||||
|
p[wlen - 1] = (n) ? 'T' : 'F';
|
||||||
|
}
|
||||||
|
|
||||||
|
-
|
||||||
|
static void
|
||||||
|
-write_boz (st_parameter_dt *dtp, const fnode *f, const char *q, int n)
|
||||||
|
+write_boz (st_parameter_dt *dtp, const fnode *f, const char *q, int n, int len)
|
||||||
|
{
|
||||||
|
int w, m, digits, nzero, nblank;
|
||||||
|
char *p;
|
||||||
|
@@ -720,6 +719,9 @@ write_boz (st_parameter_dt *dtp, const fnode *f, const char *q, int n)
|
||||||
|
/* Select a width if none was specified. The idea here is to always
|
||||||
|
print something. */
|
||||||
|
|
||||||
|
+ if (w == DEFAULT_WIDTH)
|
||||||
|
+ w = default_width_for_integer (len);
|
||||||
|
+
|
||||||
|
if (w == 0)
|
||||||
|
w = ((digits < m) ? m : digits);
|
||||||
|
|
||||||
|
@@ -846,6 +848,8 @@ write_decimal (st_parameter_dt *dtp, const fnode *f, const char *source,
|
||||||
|
|
||||||
|
/* Select a width if none was specified. The idea here is to always
|
||||||
|
print something. */
|
||||||
|
+ if (w == DEFAULT_WIDTH)
|
||||||
|
+ w = default_width_for_integer (len);
|
||||||
|
|
||||||
|
if (w == 0)
|
||||||
|
w = ((digits < m) ? m : digits) + nsign;
|
||||||
|
@@ -1206,13 +1210,13 @@ write_b (st_parameter_dt *dtp, const fnode *f, const char *source, int len)
|
||||||
|
if (len > (int) sizeof (GFC_UINTEGER_LARGEST))
|
||||||
|
{
|
||||||
|
p = btoa_big (source, itoa_buf, len, &n);
|
||||||
|
- write_boz (dtp, f, p, n);
|
||||||
|
+ write_boz (dtp, f, p, n, len);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
n = extract_uint (source, len);
|
||||||
|
p = btoa (n, itoa_buf, sizeof (itoa_buf));
|
||||||
|
- write_boz (dtp, f, p, n);
|
||||||
|
+ write_boz (dtp, f, p, n, len);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1227,13 +1231,13 @@ write_o (st_parameter_dt *dtp, const fnode *f, const char *source, int len)
|
||||||
|
if (len > (int) sizeof (GFC_UINTEGER_LARGEST))
|
||||||
|
{
|
||||||
|
p = otoa_big (source, itoa_buf, len, &n);
|
||||||
|
- write_boz (dtp, f, p, n);
|
||||||
|
+ write_boz (dtp, f, p, n, len);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
n = extract_uint (source, len);
|
||||||
|
p = otoa (n, itoa_buf, sizeof (itoa_buf));
|
||||||
|
- write_boz (dtp, f, p, n);
|
||||||
|
+ write_boz (dtp, f, p, n, len);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1247,13 +1251,13 @@ write_z (st_parameter_dt *dtp, const fnode *f, const char *source, int len)
|
||||||
|
if (len > (int) sizeof (GFC_UINTEGER_LARGEST))
|
||||||
|
{
|
||||||
|
p = ztoa_big (source, itoa_buf, len, &n);
|
||||||
|
- write_boz (dtp, f, p, n);
|
||||||
|
+ write_boz (dtp, f, p, n, len);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
n = extract_uint (source, len);
|
||||||
|
p = gfc_xtoa (n, itoa_buf, sizeof (itoa_buf));
|
||||||
|
- write_boz (dtp, f, p, n);
|
||||||
|
+ write_boz (dtp, f, p, n, len);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1491,7 +1495,7 @@ size_from_kind (st_parameter_dt *dtp, const fnode *f, int kind)
|
||||||
|
{
|
||||||
|
int size;
|
||||||
|
|
||||||
|
- if (f->format == FMT_F && f->u.real.w == 0)
|
||||||
|
+ if ((f->format == FMT_F && f->u.real.w == 0) || f->u.real.w == DEFAULT_WIDTH)
|
||||||
|
{
|
||||||
|
switch (kind)
|
||||||
|
{
|
||||||
|
diff --git a/libgfortran/io/write_float.def b/libgfortran/io/write_float.def
|
||||||
|
index c63db4e77ef..daa16679f53 100644
|
||||||
|
--- a/libgfortran/io/write_float.def
|
||||||
|
+++ b/libgfortran/io/write_float.def
|
||||||
|
@@ -113,7 +113,8 @@ determine_precision (st_parameter_dt * dtp, const fnode * f, int len)
|
||||||
|
static void
|
||||||
|
build_float_string (st_parameter_dt *dtp, const fnode *f, char *buffer,
|
||||||
|
size_t size, int nprinted, int precision, int sign_bit,
|
||||||
|
- bool zero_flag, int npad, char *result, size_t *len)
|
||||||
|
+ bool zero_flag, int npad, int default_width, char *result,
|
||||||
|
+ size_t *len)
|
||||||
|
{
|
||||||
|
char *put;
|
||||||
|
char *digits;
|
||||||
|
@@ -132,8 +133,17 @@ build_float_string (st_parameter_dt *dtp, const fnode *f, char *buffer,
|
||||||
|
sign_t sign;
|
||||||
|
|
||||||
|
ft = f->format;
|
||||||
|
- w = f->u.real.w;
|
||||||
|
- d = f->u.real.d;
|
||||||
|
+ if (f->u.real.w == DEFAULT_WIDTH)
|
||||||
|
+ /* This codepath can only be reached with -fdec-format-defaults. */
|
||||||
|
+ {
|
||||||
|
+ w = default_width;
|
||||||
|
+ d = precision;
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ w = f->u.real.w;
|
||||||
|
+ d = f->u.real.d;
|
||||||
|
+ }
|
||||||
|
p = dtp->u.p.scale_factor;
|
||||||
|
*len = 0;
|
||||||
|
|
||||||
|
@@ -960,6 +970,11 @@ determine_en_precision (st_parameter_dt *dtp, const fnode *f,
|
||||||
|
int save_scale_factor;\
|
||||||
|
volatile GFC_REAL_ ## x temp;\
|
||||||
|
save_scale_factor = dtp->u.p.scale_factor;\
|
||||||
|
+ if (w == DEFAULT_WIDTH)\
|
||||||
|
+ {\
|
||||||
|
+ w = default_width;\
|
||||||
|
+ d = precision;\
|
||||||
|
+ }\
|
||||||
|
switch (dtp->u.p.current_unit->round_status)\
|
||||||
|
{\
|
||||||
|
case ROUND_ZERO:\
|
||||||
|
@@ -1035,7 +1050,8 @@ determine_en_precision (st_parameter_dt *dtp, const fnode *f,
|
||||||
|
nprinted = FDTOA(y,precision,m);\
|
||||||
|
}\
|
||||||
|
build_float_string (dtp, &newf, buffer, size, nprinted, precision,\
|
||||||
|
- sign_bit, zero_flag, npad, result, res_len);\
|
||||||
|
+ sign_bit, zero_flag, npad, default_width,\
|
||||||
|
+ result, res_len);\
|
||||||
|
dtp->u.p.scale_factor = save_scale_factor;\
|
||||||
|
}\
|
||||||
|
else\
|
||||||
|
@@ -1045,7 +1061,8 @@ determine_en_precision (st_parameter_dt *dtp, const fnode *f,
|
||||||
|
else\
|
||||||
|
nprinted = DTOA(y,precision,m);\
|
||||||
|
build_float_string (dtp, f, buffer, size, nprinted, precision,\
|
||||||
|
- sign_bit, zero_flag, npad, result, res_len);\
|
||||||
|
+ sign_bit, zero_flag, npad, default_width,\
|
||||||
|
+ result, res_len);\
|
||||||
|
}\
|
||||||
|
}\
|
||||||
|
|
||||||
|
@@ -1059,6 +1076,16 @@ get_float_string (st_parameter_dt *dtp, const fnode *f, const char *source,
|
||||||
|
{
|
||||||
|
int sign_bit, nprinted;
|
||||||
|
bool zero_flag;
|
||||||
|
+ int default_width = 0;
|
||||||
|
+
|
||||||
|
+ if (f->u.real.w == DEFAULT_WIDTH)
|
||||||
|
+ /* This codepath can only be reached with -fdec-format-defaults. The default
|
||||||
|
+ * values are based on those used in the Oracle Fortran compiler.
|
||||||
|
+ */
|
||||||
|
+ {
|
||||||
|
+ default_width = default_width_for_float (kind);
|
||||||
|
+ precision = default_precision_for_float (kind);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
switch (kind)
|
||||||
|
{
|
||||||
|
--
|
||||||
|
2.11.0
|
||||||
|
|
219
SOURCES/0002-Allow-duplicate-declarations.patch
Normal file
219
SOURCES/0002-Allow-duplicate-declarations.patch
Normal file
@ -0,0 +1,219 @@
|
|||||||
|
From dd2c3c5e8e8370d6e08a87b7122b8fbe4ddf7dde Mon Sep 17 00:00:00 2001
|
||||||
|
From: Mark Doffman <mark.doffman@codethink.co.uk>
|
||||||
|
Date: Tue, 23 Jun 2015 22:59:08 +0000
|
||||||
|
Subject: [PATCH 02/16] Allow duplicate declarations.
|
||||||
|
|
||||||
|
Enabled by -fdec-duplicates and -fdec.
|
||||||
|
|
||||||
|
Some fixes by Jim MacArthur <jim.macarthur@codethink.co.uk>
|
||||||
|
Addition of -fdec-duplicates by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
---
|
||||||
|
gcc/fortran/lang.opt | 4 ++++
|
||||||
|
gcc/fortran/options.c | 1 +
|
||||||
|
gcc/fortran/symbol.c | 23 ++++++++++++++++++++---
|
||||||
|
gcc/testsuite/gfortran.dg/duplicate_type_4.f90 | 13 +++++++++++++
|
||||||
|
gcc/testsuite/gfortran.dg/duplicate_type_5.f90 | 13 +++++++++++++
|
||||||
|
gcc/testsuite/gfortran.dg/duplicate_type_6.f90 | 13 +++++++++++++
|
||||||
|
gcc/testsuite/gfortran.dg/duplicate_type_7.f90 | 13 +++++++++++++
|
||||||
|
gcc/testsuite/gfortran.dg/duplicate_type_8.f90 | 12 ++++++++++++
|
||||||
|
gcc/testsuite/gfortran.dg/duplicate_type_9.f90 | 12 ++++++++++++
|
||||||
|
9 files changed, 101 insertions(+), 3 deletions(-)
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/duplicate_type_4.f90
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/duplicate_type_5.f90
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/duplicate_type_6.f90
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/duplicate_type_7.f90
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/duplicate_type_8.f90
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/duplicate_type_9.f90
|
||||||
|
|
||||||
|
diff --git a/gcc/fortran/lang.opt b/gcc/fortran/lang.opt
|
||||||
|
index 26e82601b62..491d81ccaa5 100644
|
||||||
|
--- a/gcc/fortran/lang.opt
|
||||||
|
+++ b/gcc/fortran/lang.opt
|
||||||
|
@@ -440,6 +440,10 @@ fdec
|
||||||
|
Fortran Var(flag_dec)
|
||||||
|
Enable all DEC language extensions.
|
||||||
|
|
||||||
|
+fdec-duplicates
|
||||||
|
+Fortran Var(flag_dec_duplicates)
|
||||||
|
+Allow varibles to be duplicated in the type specification matches.
|
||||||
|
+
|
||||||
|
fdec-include
|
||||||
|
Fortran Var(flag_dec_include)
|
||||||
|
Enable legacy parsing of INCLUDE as statement.
|
||||||
|
diff --git a/gcc/fortran/options.c b/gcc/fortran/options.c
|
||||||
|
index 4f91486e977..f93db8b6d7c 100644
|
||||||
|
--- a/gcc/fortran/options.c
|
||||||
|
+++ b/gcc/fortran/options.c
|
||||||
|
@@ -75,6 +75,7 @@ set_dec_flags (int value)
|
||||||
|
SET_BITFLAG (flag_dec_math, value, value);
|
||||||
|
SET_BITFLAG (flag_dec_include, value, value);
|
||||||
|
SET_BITFLAG (flag_dec_format_defaults, value, value);
|
||||||
|
+ SET_BITFLAG (flag_dec_duplicates, value, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Finalize DEC flags. */
|
||||||
|
diff --git a/gcc/fortran/symbol.c b/gcc/fortran/symbol.c
|
||||||
|
index ec753229a98..4247b5b60c8 100644
|
||||||
|
--- a/gcc/fortran/symbol.c
|
||||||
|
+++ b/gcc/fortran/symbol.c
|
||||||
|
@@ -1995,6 +1995,8 @@ gfc_add_type (gfc_symbol *sym, gfc_typespec *ts, locus *where)
|
||||||
|
if (sym->attr.result && type == BT_UNKNOWN && sym->ns->proc_name)
|
||||||
|
type = sym->ns->proc_name->ts.type;
|
||||||
|
|
||||||
|
+ flavor = sym->attr.flavor;
|
||||||
|
+
|
||||||
|
if (type != BT_UNKNOWN && !(sym->attr.function && sym->attr.implicit_type)
|
||||||
|
&& !(gfc_state_stack->previous && gfc_state_stack->previous->previous
|
||||||
|
&& gfc_state_stack->previous->previous->state == COMP_SUBMODULE)
|
||||||
|
@@ -2004,9 +2006,26 @@ gfc_add_type (gfc_symbol *sym, gfc_typespec *ts, locus *where)
|
||||||
|
gfc_error ("Symbol %qs at %L conflicts with symbol from module %qs, "
|
||||||
|
"use-associated at %L", sym->name, where, sym->module,
|
||||||
|
&sym->declared_at);
|
||||||
|
+ else if (flag_dec_duplicates)
|
||||||
|
+ {
|
||||||
|
+ /* Ignore temporaries and class/procedure names */
|
||||||
|
+ if (sym->ts.type == BT_DERIVED || sym->ts.type == BT_CLASS
|
||||||
|
+ || sym->ts.type == BT_PROCEDURE)
|
||||||
|
+ return false;
|
||||||
|
+
|
||||||
|
+ if (gfc_compare_types (&sym->ts, ts)
|
||||||
|
+ && (flavor == FL_UNKNOWN || flavor == FL_VARIABLE
|
||||||
|
+ || flavor == FL_PROCEDURE))
|
||||||
|
+ {
|
||||||
|
+ return gfc_notify_std (GFC_STD_LEGACY,
|
||||||
|
+ "Symbol '%qs' at %L already has "
|
||||||
|
+ "basic type of %s", sym->name, where,
|
||||||
|
+ gfc_basic_typename (type));
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
else
|
||||||
|
gfc_error ("Symbol %qs at %L already has basic type of %s", sym->name,
|
||||||
|
- where, gfc_basic_typename (type));
|
||||||
|
+ where, gfc_basic_typename (type));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -2017,8 +2036,6 @@ gfc_add_type (gfc_symbol *sym, gfc_typespec *ts, locus *where)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
- flavor = sym->attr.flavor;
|
||||||
|
-
|
||||||
|
if (flavor == FL_PROGRAM || flavor == FL_BLOCK_DATA || flavor == FL_MODULE
|
||||||
|
|| flavor == FL_LABEL
|
||||||
|
|| (flavor == FL_PROCEDURE && sym->attr.subroutine)
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/duplicate_type_4.f90 b/gcc/testsuite/gfortran.dg/duplicate_type_4.f90
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..cdd29ea8846
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/duplicate_type_4.f90
|
||||||
|
@@ -0,0 +1,13 @@
|
||||||
|
+! { dg-do compile }
|
||||||
|
+! { dg-options "-std=f95" }
|
||||||
|
+
|
||||||
|
+! PR fortran/30239
|
||||||
|
+! Check for errors when a symbol gets declared a type twice, even if it
|
||||||
|
+! is the same.
|
||||||
|
+
|
||||||
|
+INTEGER FUNCTION foo ()
|
||||||
|
+ IMPLICIT NONE
|
||||||
|
+ INTEGER :: x
|
||||||
|
+ INTEGER :: x ! { dg-error "basic type of" }
|
||||||
|
+ x = 42
|
||||||
|
+END FUNCTION foo
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/duplicate_type_5.f90 b/gcc/testsuite/gfortran.dg/duplicate_type_5.f90
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..00f931809aa
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/duplicate_type_5.f90
|
||||||
|
@@ -0,0 +1,13 @@
|
||||||
|
+! { dg-do run }
|
||||||
|
+! { dg-options "-fdec" }
|
||||||
|
+!
|
||||||
|
+! Test case contributed by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+!
|
||||||
|
+
|
||||||
|
+program test
|
||||||
|
+ implicit none
|
||||||
|
+ integer :: x
|
||||||
|
+ integer :: x
|
||||||
|
+ x = 42
|
||||||
|
+ if (x /= 42) stop 1
|
||||||
|
+end program test
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/duplicate_type_6.f90 b/gcc/testsuite/gfortran.dg/duplicate_type_6.f90
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..f0df27e323c
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/duplicate_type_6.f90
|
||||||
|
@@ -0,0 +1,13 @@
|
||||||
|
+! { dg-do run }
|
||||||
|
+! { dg-options "-std=legacy -fdec-duplicates" }
|
||||||
|
+!
|
||||||
|
+! Test case contributed by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+!
|
||||||
|
+
|
||||||
|
+program test
|
||||||
|
+ implicit none
|
||||||
|
+ integer :: x
|
||||||
|
+ integer :: x
|
||||||
|
+ x = 42
|
||||||
|
+ if (x /= 42) stop 1
|
||||||
|
+end program test
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/duplicate_type_7.f90 b/gcc/testsuite/gfortran.dg/duplicate_type_7.f90
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..f32472ff586
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/duplicate_type_7.f90
|
||||||
|
@@ -0,0 +1,13 @@
|
||||||
|
+! { dg-do run }
|
||||||
|
+! { dg-options "-fdec-duplicates" }
|
||||||
|
+!
|
||||||
|
+! Test case contributed by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+!
|
||||||
|
+
|
||||||
|
+program test
|
||||||
|
+ implicit none
|
||||||
|
+ integer :: x
|
||||||
|
+ integer :: x! { dg-warning "Legacy Extension" }
|
||||||
|
+ x = 42
|
||||||
|
+ if (x /= 42) stop 1
|
||||||
|
+end program test
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/duplicate_type_8.f90 b/gcc/testsuite/gfortran.dg/duplicate_type_8.f90
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..23c94add179
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/duplicate_type_8.f90
|
||||||
|
@@ -0,0 +1,12 @@
|
||||||
|
+! { dg-do compile }
|
||||||
|
+! { dg-options "-fdec -fno-dec-duplicates" }
|
||||||
|
+!
|
||||||
|
+! Test case contributed by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+!
|
||||||
|
+
|
||||||
|
+integer function foo ()
|
||||||
|
+ implicit none
|
||||||
|
+ integer :: x
|
||||||
|
+ integer :: x ! { dg-error "basic type of" }
|
||||||
|
+ x = 42
|
||||||
|
+end function foo
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/duplicate_type_9.f90 b/gcc/testsuite/gfortran.dg/duplicate_type_9.f90
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..d5edee4d8ee
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/duplicate_type_9.f90
|
||||||
|
@@ -0,0 +1,12 @@
|
||||||
|
+! { dg-do compile }
|
||||||
|
+! { dg-options "-fdec-duplicates -fno-dec-duplicates" }
|
||||||
|
+!
|
||||||
|
+! Test case contributed by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+!
|
||||||
|
+
|
||||||
|
+integer function foo ()
|
||||||
|
+ implicit none
|
||||||
|
+ integer :: x
|
||||||
|
+ integer :: x ! { dg-error "basic type of" }
|
||||||
|
+ x = 42
|
||||||
|
+end function foo
|
||||||
|
--
|
||||||
|
2.11.0
|
||||||
|
|
@ -0,0 +1,298 @@
|
|||||||
|
From 6a3faecd0b1eed41e865bdab721cc3a60492845d Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jim MacArthur <jim.macarthur@codethink.co.uk>
|
||||||
|
Date: Wed, 7 Oct 2015 16:31:18 -0400
|
||||||
|
Subject: [PATCH 03/16] Convert LOGICAL to INTEGER for arithmetic ops, and vice
|
||||||
|
versa
|
||||||
|
|
||||||
|
We allow converting LOGICAL types to INTEGER when doing arithmetic
|
||||||
|
operations, and converting INTEGER types to LOGICAL for use in
|
||||||
|
boolean operations.
|
||||||
|
|
||||||
|
This feature is enabled with the -flogical-as-integer flag.
|
||||||
|
|
||||||
|
Note: using this feature will disable bitwise logical operations enabled by
|
||||||
|
-fdec.
|
||||||
|
---
|
||||||
|
gcc/fortran/lang.opt | 4 ++
|
||||||
|
gcc/fortran/resolve.c | 55 +++++++++++++++++++++-
|
||||||
|
.../logical_to_integer_and_vice_versa_1.f | 31 ++++++++++++
|
||||||
|
.../logical_to_integer_and_vice_versa_2.f | 31 ++++++++++++
|
||||||
|
.../logical_to_integer_and_vice_versa_3.f | 33 +++++++++++++
|
||||||
|
.../logical_to_integer_and_vice_versa_4.f | 33 +++++++++++++
|
||||||
|
6 files changed, 186 insertions(+), 1 deletion(-)
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/logical_to_integer_and_vice_versa_1.f
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/logical_to_integer_and_vice_versa_2.f
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/logical_to_integer_and_vice_versa_3.f
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/logical_to_integer_and_vice_versa_4.f
|
||||||
|
|
||||||
|
diff --git a/gcc/fortran/lang.opt b/gcc/fortran/lang.opt
|
||||||
|
index 491d81ccaa5..13a8e9778bb 100644
|
||||||
|
--- a/gcc/fortran/lang.opt
|
||||||
|
+++ b/gcc/fortran/lang.opt
|
||||||
|
@@ -468,6 +468,10 @@ fdec-static
|
||||||
|
Fortran Var(flag_dec_static)
|
||||||
|
Enable DEC-style STATIC and AUTOMATIC attributes.
|
||||||
|
|
||||||
|
+flogical-as-integer
|
||||||
|
+Fortran Var(flag_logical_as_integer)
|
||||||
|
+Convert from integer to logical or logical to integer for arithmetic operations.
|
||||||
|
+
|
||||||
|
fdefault-double-8
|
||||||
|
Fortran Var(flag_default_double)
|
||||||
|
Set the default double precision kind to an 8 byte wide type.
|
||||||
|
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
|
||||||
|
index 8232deb8170..32b8d504ff6 100644
|
||||||
|
--- a/gcc/fortran/resolve.c
|
||||||
|
+++ b/gcc/fortran/resolve.c
|
||||||
|
@@ -3838,7 +3838,6 @@ lookup_uop_fuzzy (const char *op, gfc_symtree *uop)
|
||||||
|
return gfc_closest_fuzzy_match (op, candidates);
|
||||||
|
}
|
||||||
|
|
||||||
|
-
|
||||||
|
/* Callback finding an impure function as an operand to an .and. or
|
||||||
|
.or. expression. Remember the last function warned about to
|
||||||
|
avoid double warnings when recursing. */
|
||||||
|
@@ -3873,6 +3872,37 @@ impure_function_callback (gfc_expr **e, int *walk_subtrees ATTRIBUTE_UNUSED,
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
+/* If E is a logical, convert it to an integer and issue a warning
|
||||||
|
+ for the conversion. */
|
||||||
|
+
|
||||||
|
+static void
|
||||||
|
+convert_integer_to_logical (gfc_expr *e)
|
||||||
|
+{
|
||||||
|
+ if (e->ts.type == BT_INTEGER)
|
||||||
|
+ {
|
||||||
|
+ /* Convert to LOGICAL */
|
||||||
|
+ gfc_typespec t;
|
||||||
|
+ t.type = BT_LOGICAL;
|
||||||
|
+ t.kind = 1;
|
||||||
|
+ gfc_convert_type_warn (e, &t, 2, 1);
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/* If E is a logical, convert it to an integer and issue a warning
|
||||||
|
+ for the conversion. */
|
||||||
|
+
|
||||||
|
+static void
|
||||||
|
+convert_logical_to_integer (gfc_expr *e)
|
||||||
|
+{
|
||||||
|
+ if (e->ts.type == BT_LOGICAL)
|
||||||
|
+ {
|
||||||
|
+ /* Convert to INTEGER */
|
||||||
|
+ gfc_typespec t;
|
||||||
|
+ t.type = BT_INTEGER;
|
||||||
|
+ t.kind = 1;
|
||||||
|
+ gfc_convert_type_warn (e, &t, 2, 1);
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
|
||||||
|
/* Resolve an operator expression node. This can involve replacing the
|
||||||
|
operation with a user defined function call. */
|
||||||
|
@@ -3938,6 +3968,12 @@ resolve_operator (gfc_expr *e)
|
||||||
|
case INTRINSIC_TIMES:
|
||||||
|
case INTRINSIC_DIVIDE:
|
||||||
|
case INTRINSIC_POWER:
|
||||||
|
+ if (flag_logical_as_integer)
|
||||||
|
+ {
|
||||||
|
+ convert_logical_to_integer (op1);
|
||||||
|
+ convert_logical_to_integer (op2);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (gfc_numeric_ts (&op1->ts) && gfc_numeric_ts (&op2->ts))
|
||||||
|
{
|
||||||
|
gfc_type_convert_binary (e, 1);
|
||||||
|
@@ -3974,6 +4010,13 @@ resolve_operator (gfc_expr *e)
|
||||||
|
case INTRINSIC_OR:
|
||||||
|
case INTRINSIC_EQV:
|
||||||
|
case INTRINSIC_NEQV:
|
||||||
|
+
|
||||||
|
+ if (flag_logical_as_integer)
|
||||||
|
+ {
|
||||||
|
+ convert_integer_to_logical (op1);
|
||||||
|
+ convert_integer_to_logical (op2);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (op1->ts.type == BT_LOGICAL && op2->ts.type == BT_LOGICAL)
|
||||||
|
{
|
||||||
|
e->ts.type = BT_LOGICAL;
|
||||||
|
@@ -4024,6 +4067,9 @@ resolve_operator (gfc_expr *e)
|
||||||
|
goto simplify_op;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (flag_logical_as_integer)
|
||||||
|
+ convert_integer_to_logical (op1);
|
||||||
|
+
|
||||||
|
if (op1->ts.type == BT_LOGICAL)
|
||||||
|
{
|
||||||
|
e->ts.type = BT_LOGICAL;
|
||||||
|
@@ -4055,6 +4101,13 @@ resolve_operator (gfc_expr *e)
|
||||||
|
case INTRINSIC_EQ_OS:
|
||||||
|
case INTRINSIC_NE:
|
||||||
|
case INTRINSIC_NE_OS:
|
||||||
|
+
|
||||||
|
+ if (flag_logical_as_integer)
|
||||||
|
+ {
|
||||||
|
+ convert_logical_to_integer (op1);
|
||||||
|
+ convert_logical_to_integer (op2);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (op1->ts.type == BT_CHARACTER && op2->ts.type == BT_CHARACTER
|
||||||
|
&& op1->ts.kind == op2->ts.kind)
|
||||||
|
{
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/logical_to_integer_and_vice_versa_1.f b/gcc/testsuite/gfortran.dg/logical_to_integer_and_vice_versa_1.f
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..938a91d9e9a
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/logical_to_integer_and_vice_versa_1.f
|
||||||
|
@@ -0,0 +1,31 @@
|
||||||
|
+! { dg-do run }
|
||||||
|
+! { dg-options "-std=legacy -flogical-as-integer" }
|
||||||
|
+!
|
||||||
|
+! Test conversion between logical and integer for logical operators
|
||||||
|
+!
|
||||||
|
+! Test case contributed by Jim MacArthur <jim.macarthur@codethink.co.uk>
|
||||||
|
+! Modified for -flogical-as-integer by Mark Eggleston
|
||||||
|
+! <mark.eggleston@codethink.com>
|
||||||
|
+!
|
||||||
|
+ PROGRAM logical_integer_conversion
|
||||||
|
+ LOGICAL lpos /.true./
|
||||||
|
+ INTEGER ineg/0/
|
||||||
|
+ INTEGER ires
|
||||||
|
+ LOGICAL lres
|
||||||
|
+
|
||||||
|
+ ! Test Logicals converted to Integers
|
||||||
|
+ if ((lpos.AND.ineg).EQ.1) STOP 3
|
||||||
|
+ if ((ineg.AND.lpos).NE.0) STOP 4
|
||||||
|
+ ires = (.true..AND.0)
|
||||||
|
+ if (ires.NE.0) STOP 5
|
||||||
|
+ ires = (1.AND..false.)
|
||||||
|
+ if (ires.EQ.1) STOP 6
|
||||||
|
+
|
||||||
|
+ ! Test Integers converted to Logicals
|
||||||
|
+ if (lpos.EQ.ineg) STOP 7
|
||||||
|
+ if (ineg.EQ.lpos) STOP 8
|
||||||
|
+ lres = (.true..EQ.0)
|
||||||
|
+ if (lres) STOP 9
|
||||||
|
+ lres = (1.EQ..false.)
|
||||||
|
+ if (lres) STOP 10
|
||||||
|
+ END
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/logical_to_integer_and_vice_versa_2.f b/gcc/testsuite/gfortran.dg/logical_to_integer_and_vice_versa_2.f
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..9f146202ba5
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/logical_to_integer_and_vice_versa_2.f
|
||||||
|
@@ -0,0 +1,31 @@
|
||||||
|
+! { dg-do compile }
|
||||||
|
+! { dg-options "-std=legacy -flogical-as-integer -fno-logical-as-integer" }
|
||||||
|
+!
|
||||||
|
+! Based on logical_to_integer_and_vice_versa_1.f but with option disabled
|
||||||
|
+! to test for error messages.
|
||||||
|
+!
|
||||||
|
+! Test case contributed by by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+!
|
||||||
|
+!
|
||||||
|
+ PROGRAM logical_integer_conversion
|
||||||
|
+ LOGICAL lpos /.true./
|
||||||
|
+ INTEGER ineg/0/
|
||||||
|
+ INTEGER ires
|
||||||
|
+ LOGICAL lres
|
||||||
|
+
|
||||||
|
+ ! Test Logicals converted to Integers
|
||||||
|
+ if ((lpos.AND.ineg).EQ.1) STOP 3 ! { dg-error "Operands of logical operator" }
|
||||||
|
+ if ((ineg.AND.lpos).NE.0) STOP 4 ! { dg-error "Operands of logical operator" }
|
||||||
|
+ ires = (.true..AND.0) ! { dg-error "Operands of logical operator" }
|
||||||
|
+ if (ires.NE.0) STOP 5
|
||||||
|
+ ires = (1.AND..false.) ! { dg-error "Operands of logical operator" }
|
||||||
|
+ if (ires.EQ.1) STOP 6
|
||||||
|
+
|
||||||
|
+ ! Test Integers converted to Logicals
|
||||||
|
+ if (lpos.EQ.ineg) STOP 7 ! { dg-error "Operands of comparison operator" }
|
||||||
|
+ if (ineg.EQ.lpos) STOP 8 ! { dg-error "Operands of comparison operator" }
|
||||||
|
+ lres = (.true..EQ.0) ! { dg-error "Operands of comparison operator" }
|
||||||
|
+ if (lres) STOP 9
|
||||||
|
+ lres = (1.EQ..false.) ! { dg-error "Operands of comparison operator" }
|
||||||
|
+ if (lres) STOP 10
|
||||||
|
+ END
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/logical_to_integer_and_vice_versa_3.f b/gcc/testsuite/gfortran.dg/logical_to_integer_and_vice_versa_3.f
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..446873eb2dc
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/logical_to_integer_and_vice_versa_3.f
|
||||||
|
@@ -0,0 +1,33 @@
|
||||||
|
+! { dg-do compile }
|
||||||
|
+! { dg-options "-std=legacy -flogical-as-integer" }
|
||||||
|
+!
|
||||||
|
+! Test conversion between logical and integer for logical operators
|
||||||
|
+!
|
||||||
|
+ program test
|
||||||
|
+ logical f /.false./
|
||||||
|
+ logical t /.true./
|
||||||
|
+ real x
|
||||||
|
+
|
||||||
|
+ x = 7.7
|
||||||
|
+ x = x + t*3.0
|
||||||
|
+ if (abs(x - 10.7).gt.0.00001) stop 1
|
||||||
|
+ x = x + .false.*5.0
|
||||||
|
+ if (abs(x - 10.7).gt.0.00001) stop 2
|
||||||
|
+ x = x - .true.*5.0
|
||||||
|
+ if (abs(x - 5.7).gt.0.00001) stop 3
|
||||||
|
+ x = x + t
|
||||||
|
+ if (abs(x - 6.7).gt.0.00001) stop 4
|
||||||
|
+ x = x + f
|
||||||
|
+ if (abs(x - 6.7).gt.0.00001) stop 5
|
||||||
|
+ x = x - t
|
||||||
|
+ if (abs(x - 5.7).gt.0.00001) stop 6
|
||||||
|
+ x = x - f
|
||||||
|
+ if (abs(x - 5.7).gt.0.00001) stop 7
|
||||||
|
+ x = x**.true.
|
||||||
|
+ if (abs(x - 5.7).gt.0.00001) stop 8
|
||||||
|
+ x = x**.false.
|
||||||
|
+ if (abs(x - 1.0).gt.0.00001) stop 9
|
||||||
|
+ x = x/t
|
||||||
|
+ if (abs(x - 1.0).gt.0.00001) stop 10
|
||||||
|
+ if ((x/.false.).le.huge(x)) stop 11
|
||||||
|
+ end
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/logical_to_integer_and_vice_versa_4.f b/gcc/testsuite/gfortran.dg/logical_to_integer_and_vice_versa_4.f
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..4301a4988d8
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/logical_to_integer_and_vice_versa_4.f
|
||||||
|
@@ -0,0 +1,33 @@
|
||||||
|
+! { dg-do compile }
|
||||||
|
+! { dg-options "-std=legacy -flogical-as-integer -fno-logical-as-integer" }
|
||||||
|
+!
|
||||||
|
+! Test conversion between logical and integer for logical operators
|
||||||
|
+!
|
||||||
|
+ program test
|
||||||
|
+ logical f /.false./
|
||||||
|
+ logical t /.true./
|
||||||
|
+ real x
|
||||||
|
+
|
||||||
|
+ x = 7.7
|
||||||
|
+ x = x + t*3.0 ! { dg-error "Operands of binary numeric" }
|
||||||
|
+ if (abs(x - 10.7).gt.0.00001) stop 1
|
||||||
|
+ x = x + .false.*5.0 ! { dg-error "Operands of binary numeric" }
|
||||||
|
+ if (abs(x - 10.7).gt.0.00001) stop 2
|
||||||
|
+ x = x - .true.*5.0 ! { dg-error "Operands of binary numeric" }
|
||||||
|
+ if (abs(x - 5.7).gt.0.00001) stop 3
|
||||||
|
+ x = x + t ! { dg-error "Operands of binary numeric" }
|
||||||
|
+ if (abs(x - 6.7).gt.0.00001) stop 4
|
||||||
|
+ x = x + f ! { dg-error "Operands of binary numeric" }
|
||||||
|
+ if (abs(x - 6.7).gt.0.00001) stop 5
|
||||||
|
+ x = x - t ! { dg-error "Operands of binary numeric" }
|
||||||
|
+ if (abs(x - 5.7).gt.0.00001) stop 6
|
||||||
|
+ x = x - f ! { dg-error "Operands of binary numeric" }
|
||||||
|
+ if (abs(x - 5.7).gt.0.00001) stop 7
|
||||||
|
+ x = x**.true. ! { dg-error "Operands of binary numeric" }
|
||||||
|
+ if (abs(x - 5.7).gt.0.00001) stop 8
|
||||||
|
+ x = x**.false. ! { dg-error "Operands of binary numeric" }
|
||||||
|
+ if (abs(x - 1.0).gt.0.00001) stop 9
|
||||||
|
+ x = x/t ! { dg-error "Operands of binary numeric" }
|
||||||
|
+ if (abs(x - 1.0).gt.0.00001) stop 10
|
||||||
|
+ if ((x/.false.).le.huge(x)) stop 11 ! { dg-error "Operands of binary numeric" }
|
||||||
|
+ end
|
||||||
|
--
|
||||||
|
2.11.0
|
||||||
|
|
@ -0,0 +1,860 @@
|
|||||||
|
From c1d6c81730ffda61eff8fccf4d0c7efa3ae6fd8d Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jim MacArthur <jim.macarthur@codethink.co.uk>
|
||||||
|
Date: Thu, 4 Feb 2016 17:18:30 +0000
|
||||||
|
Subject: [PATCH 04/16] Allow CHARACTER literals in assignments and data
|
||||||
|
statements
|
||||||
|
|
||||||
|
Warnings are raised when this happens.
|
||||||
|
|
||||||
|
Enable using -fdec-char-as-int or -fdec
|
||||||
|
---
|
||||||
|
gcc/fortran/arith.c | 96 +++++++++++++++++++++-
|
||||||
|
gcc/fortran/arith.h | 4 +
|
||||||
|
gcc/fortran/expr.c | 5 ++
|
||||||
|
gcc/fortran/intrinsic.c | 32 +++++++-
|
||||||
|
gcc/fortran/lang.opt | 5 ++
|
||||||
|
gcc/fortran/options.c | 1 +
|
||||||
|
gcc/fortran/resolve.c | 11 ++-
|
||||||
|
gcc/fortran/simplify.c | 29 ++++++-
|
||||||
|
gcc/fortran/trans-const.c | 3 +-
|
||||||
|
.../dec_char_conversion_in_assignment_1.f90 | 61 ++++++++++++++
|
||||||
|
.../dec_char_conversion_in_assignment_2.f90 | 61 ++++++++++++++
|
||||||
|
.../dec_char_conversion_in_assignment_3.f90 | 61 ++++++++++++++
|
||||||
|
.../gfortran.dg/dec_char_conversion_in_data_1.f90 | 69 ++++++++++++++++
|
||||||
|
.../gfortran.dg/dec_char_conversion_in_data_2.f90 | 69 ++++++++++++++++
|
||||||
|
.../gfortran.dg/dec_char_conversion_in_data_3.f90 | 69 ++++++++++++++++
|
||||||
|
gcc/testsuite/gfortran.dg/hollerith5.f90 | 5 +-
|
||||||
|
gcc/testsuite/gfortran.dg/hollerith_legacy.f90 | 2 +-
|
||||||
|
.../gfortran.dg/no_char_to_int_assign.f90 | 20 +++++
|
||||||
|
18 files changed, 589 insertions(+), 14 deletions(-)
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/dec_char_conversion_in_assignment_1.f90
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/dec_char_conversion_in_assignment_2.f90
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/dec_char_conversion_in_assignment_3.f90
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/dec_char_conversion_in_data_1.f90
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/dec_char_conversion_in_data_2.f90
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/dec_char_conversion_in_data_3.f90
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/no_char_to_int_assign.f90
|
||||||
|
|
||||||
|
diff --git a/gcc/fortran/arith.c b/gcc/fortran/arith.c
|
||||||
|
index f2d311c044c..7e6d6dd3bb8 100644
|
||||||
|
--- a/gcc/fortran/arith.c
|
||||||
|
+++ b/gcc/fortran/arith.c
|
||||||
|
@@ -2553,11 +2553,11 @@ hollerith2representation (gfc_expr *result, gfc_expr *src)
|
||||||
|
src_len = src->representation.length - src->ts.u.pad;
|
||||||
|
gfc_target_expr_size (result, &result_len);
|
||||||
|
|
||||||
|
- if (src_len > result_len)
|
||||||
|
+ if (src_len > result_len && warn_character_truncation)
|
||||||
|
{
|
||||||
|
- gfc_warning (0,
|
||||||
|
- "The Hollerith constant at %L is too long to convert to %qs",
|
||||||
|
- &src->where, gfc_typename(&result->ts));
|
||||||
|
+ gfc_warning (OPT_Wcharacter_truncation, "The Hollerith constant at %L "
|
||||||
|
+ "is truncated in conversion to %qs", &src->where,
|
||||||
|
+ gfc_typename(&result->ts));
|
||||||
|
}
|
||||||
|
|
||||||
|
result->representation.string = XCNEWVEC (char, result_len + 1);
|
||||||
|
@@ -2572,6 +2572,36 @@ hollerith2representation (gfc_expr *result, gfc_expr *src)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
+/* Helper function to set the representation in a character conversion.
|
||||||
|
+ This assumes that the ts.type and ts.kind of the result have already
|
||||||
|
+ been set. */
|
||||||
|
+
|
||||||
|
+static void
|
||||||
|
+character2representation (gfc_expr *result, gfc_expr *src)
|
||||||
|
+{
|
||||||
|
+ size_t src_len, result_len;
|
||||||
|
+ int i;
|
||||||
|
+ src_len = src->value.character.length;
|
||||||
|
+ gfc_target_expr_size (result, &result_len);
|
||||||
|
+
|
||||||
|
+ if (src_len > result_len && warn_character_truncation)
|
||||||
|
+ gfc_warning (OPT_Wcharacter_truncation, "The character constant at %L is "
|
||||||
|
+ "is truncated in conversion to %s", &src->where,
|
||||||
|
+ gfc_typename(&result->ts));
|
||||||
|
+
|
||||||
|
+ result->representation.string = XCNEWVEC (char, result_len + 1);
|
||||||
|
+
|
||||||
|
+ for (i = 0; i < MIN (result_len, src_len); i++)
|
||||||
|
+ result->representation.string[i] = (char) src->value.character.string[i];
|
||||||
|
+
|
||||||
|
+ if (src_len < result_len)
|
||||||
|
+ memset (&result->representation.string[src_len], ' ',
|
||||||
|
+ result_len - src_len);
|
||||||
|
+
|
||||||
|
+ result->representation.string[result_len] = '\0'; /* For debugger */
|
||||||
|
+ result->representation.length = result_len;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/* Convert Hollerith to integer. The constant will be padded or truncated. */
|
||||||
|
|
||||||
|
gfc_expr *
|
||||||
|
@@ -2587,6 +2617,19 @@ gfc_hollerith2int (gfc_expr *src, int kind)
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
+/* Convert character to integer. The constant will be padded or truncated. */
|
||||||
|
+
|
||||||
|
+gfc_expr *
|
||||||
|
+gfc_character2int (gfc_expr *src, int kind)
|
||||||
|
+{
|
||||||
|
+ gfc_expr *result;
|
||||||
|
+ result = gfc_get_constant_expr (BT_INTEGER, kind, &src->where);
|
||||||
|
+
|
||||||
|
+ character2representation (result, src);
|
||||||
|
+ gfc_interpret_integer (kind, (unsigned char *) result->representation.string,
|
||||||
|
+ result->representation.length, result->value.integer);
|
||||||
|
+ return result;
|
||||||
|
+}
|
||||||
|
|
||||||
|
/* Convert Hollerith to real. The constant will be padded or truncated. */
|
||||||
|
|
||||||
|
@@ -2603,6 +2646,21 @@ gfc_hollerith2real (gfc_expr *src, int kind)
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
+/* Convert character to real. The constant will be padded or truncated. */
|
||||||
|
+
|
||||||
|
+gfc_expr *
|
||||||
|
+gfc_character2real (gfc_expr *src, int kind)
|
||||||
|
+{
|
||||||
|
+ gfc_expr *result;
|
||||||
|
+ result = gfc_get_constant_expr (BT_REAL, kind, &src->where);
|
||||||
|
+
|
||||||
|
+ character2representation (result, src);
|
||||||
|
+ gfc_interpret_float (kind, (unsigned char *) result->representation.string,
|
||||||
|
+ result->representation.length, result->value.real);
|
||||||
|
+
|
||||||
|
+ return result;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
|
||||||
|
/* Convert Hollerith to complex. The constant will be padded or truncated. */
|
||||||
|
|
||||||
|
@@ -2619,6 +2677,21 @@ gfc_hollerith2complex (gfc_expr *src, int kind)
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
+/* Convert character to complex. The constant will be padded or truncated. */
|
||||||
|
+
|
||||||
|
+gfc_expr *
|
||||||
|
+gfc_character2complex (gfc_expr *src, int kind)
|
||||||
|
+{
|
||||||
|
+ gfc_expr *result;
|
||||||
|
+ result = gfc_get_constant_expr (BT_COMPLEX, kind, &src->where);
|
||||||
|
+
|
||||||
|
+ character2representation (result, src);
|
||||||
|
+ gfc_interpret_complex (kind, (unsigned char *) result->representation.string,
|
||||||
|
+ result->representation.length, result->value.complex);
|
||||||
|
+
|
||||||
|
+ return result;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
|
||||||
|
/* Convert Hollerith to character. */
|
||||||
|
|
||||||
|
@@ -2654,3 +2727,18 @@ gfc_hollerith2logical (gfc_expr *src, int kind)
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+/* Convert character to logical. The constant will be padded or truncated. */
|
||||||
|
+
|
||||||
|
+gfc_expr *
|
||||||
|
+gfc_character2logical (gfc_expr *src, int kind)
|
||||||
|
+{
|
||||||
|
+ gfc_expr *result;
|
||||||
|
+ result = gfc_get_constant_expr (BT_LOGICAL, kind, &src->where);
|
||||||
|
+
|
||||||
|
+ character2representation (result, src);
|
||||||
|
+ gfc_interpret_logical (kind, (unsigned char *) result->representation.string,
|
||||||
|
+ result->representation.length, &result->value.logical);
|
||||||
|
+
|
||||||
|
+ return result;
|
||||||
|
+}
|
||||||
|
diff --git a/gcc/fortran/arith.h b/gcc/fortran/arith.h
|
||||||
|
index e06c7059885..13ffd8d0b6c 100644
|
||||||
|
--- a/gcc/fortran/arith.h
|
||||||
|
+++ b/gcc/fortran/arith.h
|
||||||
|
@@ -82,7 +82,11 @@ gfc_expr *gfc_hollerith2real (gfc_expr *, int);
|
||||||
|
gfc_expr *gfc_hollerith2complex (gfc_expr *, int);
|
||||||
|
gfc_expr *gfc_hollerith2character (gfc_expr *, int);
|
||||||
|
gfc_expr *gfc_hollerith2logical (gfc_expr *, int);
|
||||||
|
+gfc_expr *gfc_character2int (gfc_expr *, int);
|
||||||
|
+gfc_expr *gfc_character2real (gfc_expr *, int);
|
||||||
|
+gfc_expr *gfc_character2complex (gfc_expr *, int);
|
||||||
|
gfc_expr *gfc_character2character (gfc_expr *, int);
|
||||||
|
+gfc_expr *gfc_character2logical (gfc_expr *, int);
|
||||||
|
|
||||||
|
#endif /* GFC_ARITH_H */
|
||||||
|
|
||||||
|
diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c
|
||||||
|
index 474e9ecc401..77600a5f2e8 100644
|
||||||
|
--- a/gcc/fortran/expr.c
|
||||||
|
+++ b/gcc/fortran/expr.c
|
||||||
|
@@ -3695,6 +3695,11 @@ gfc_check_assign (gfc_expr *lvalue, gfc_expr *rvalue, int conform,
|
||||||
|
|| rvalue->ts.type == BT_HOLLERITH)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
+ if (flag_dec_char_conversions && (gfc_numeric_ts (&lvalue->ts)
|
||||||
|
+ || lvalue->ts.type == BT_LOGICAL)
|
||||||
|
+ && rvalue->ts.type == BT_CHARACTER)
|
||||||
|
+ return true;
|
||||||
|
+
|
||||||
|
if (lvalue->ts.type == BT_LOGICAL && rvalue->ts.type == BT_LOGICAL)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
diff --git a/gcc/fortran/intrinsic.c b/gcc/fortran/intrinsic.c
|
||||||
|
index c21fbddd5fb..e94d5d3225f 100644
|
||||||
|
--- a/gcc/fortran/intrinsic.c
|
||||||
|
+++ b/gcc/fortran/intrinsic.c
|
||||||
|
@@ -4017,6 +4017,28 @@ add_conversions (void)
|
||||||
|
add_conv (BT_LOGICAL, gfc_logical_kinds[j].kind,
|
||||||
|
BT_INTEGER, gfc_integer_kinds[i].kind, GFC_STD_LEGACY);
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ /* Flang allows character conversions similar to Hollerith conversions
|
||||||
|
+ - the first characters will be turned into ascii values. */
|
||||||
|
+ if (flag_dec_char_conversions)
|
||||||
|
+ {
|
||||||
|
+ /* Character-Integer conversions. */
|
||||||
|
+ for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
|
||||||
|
+ add_conv (BT_CHARACTER, gfc_default_character_kind,
|
||||||
|
+ BT_INTEGER, gfc_integer_kinds[i].kind, GFC_STD_LEGACY);
|
||||||
|
+ /* Character-Real conversions. */
|
||||||
|
+ for (i = 0; gfc_real_kinds[i].kind != 0; i++)
|
||||||
|
+ add_conv (BT_CHARACTER, gfc_default_character_kind,
|
||||||
|
+ BT_REAL, gfc_real_kinds[i].kind, GFC_STD_LEGACY);
|
||||||
|
+ /* Character-Complex conversions. */
|
||||||
|
+ for (i = 0; gfc_real_kinds[i].kind != 0; i++)
|
||||||
|
+ add_conv (BT_CHARACTER, gfc_default_character_kind,
|
||||||
|
+ BT_COMPLEX, gfc_real_kinds[i].kind, GFC_STD_LEGACY);
|
||||||
|
+ /* Character-Logical conversions. */
|
||||||
|
+ for (i = 0; gfc_logical_kinds[i].kind != 0; i++)
|
||||||
|
+ add_conv (BT_CHARACTER, gfc_default_character_kind,
|
||||||
|
+ BT_LOGICAL, gfc_logical_kinds[i].kind, GFC_STD_LEGACY);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -5128,8 +5150,16 @@ gfc_convert_type_warn (gfc_expr *expr, gfc_typespec *ts, int eflag, int wflag)
|
||||||
|
gfc_typename (&from_ts), gfc_typename (ts),
|
||||||
|
&expr->where);
|
||||||
|
}
|
||||||
|
+ else if (flag_dec_char_conversions && from_ts.type == BT_CHARACTER
|
||||||
|
+ && (gfc_numeric_ts (ts) || ts->type == BT_LOGICAL))
|
||||||
|
+ {
|
||||||
|
+ if (warn_conversion)
|
||||||
|
+ gfc_warning_now (OPT_Wconversion, "Conversion from %s to %s at %L",
|
||||||
|
+ gfc_typename (&from_ts), gfc_typename (ts),
|
||||||
|
+ &expr->where);
|
||||||
|
+ }
|
||||||
|
else
|
||||||
|
- gcc_unreachable ();
|
||||||
|
+ gcc_unreachable ();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Insert a pre-resolved function call to the right function. */
|
||||||
|
diff --git a/gcc/fortran/lang.opt b/gcc/fortran/lang.opt
|
||||||
|
index 13a8e9778bb..5746b99b1d4 100644
|
||||||
|
--- a/gcc/fortran/lang.opt
|
||||||
|
+++ b/gcc/fortran/lang.opt
|
||||||
|
@@ -444,6 +444,11 @@ fdec-duplicates
|
||||||
|
Fortran Var(flag_dec_duplicates)
|
||||||
|
Allow varibles to be duplicated in the type specification matches.
|
||||||
|
|
||||||
|
+fdec-char-conversions
|
||||||
|
+Fortran Var(flag_dec_char_conversions)
|
||||||
|
+Enable the use of character literals in assignments and data statements
|
||||||
|
+for non-character variables.
|
||||||
|
+
|
||||||
|
fdec-include
|
||||||
|
Fortran Var(flag_dec_include)
|
||||||
|
Enable legacy parsing of INCLUDE as statement.
|
||||||
|
diff --git a/gcc/fortran/options.c b/gcc/fortran/options.c
|
||||||
|
index f93db8b6d7c..e97b1568810 100644
|
||||||
|
--- a/gcc/fortran/options.c
|
||||||
|
+++ b/gcc/fortran/options.c
|
||||||
|
@@ -76,6 +76,7 @@ set_dec_flags (int value)
|
||||||
|
SET_BITFLAG (flag_dec_include, value, value);
|
||||||
|
SET_BITFLAG (flag_dec_format_defaults, value, value);
|
||||||
|
SET_BITFLAG (flag_dec_duplicates, value, value);
|
||||||
|
+ SET_BITFLAG (flag_dec_char_conversions, value, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Finalize DEC flags. */
|
||||||
|
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
|
||||||
|
index 32b8d504ff6..43559185481 100644
|
||||||
|
--- a/gcc/fortran/resolve.c
|
||||||
|
+++ b/gcc/fortran/resolve.c
|
||||||
|
@@ -4320,7 +4320,6 @@ bad_op:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
-
|
||||||
|
/************** Array resolution subroutines **************/
|
||||||
|
|
||||||
|
enum compare_result
|
||||||
|
@@ -10498,6 +10497,16 @@ resolve_ordinary_assign (gfc_code *code, gfc_namespace *ns)
|
||||||
|
lhs = code->expr1;
|
||||||
|
rhs = code->expr2;
|
||||||
|
|
||||||
|
+ if ((gfc_numeric_ts (&lhs->ts) || lhs->ts.type == BT_LOGICAL)
|
||||||
|
+ && rhs->ts.type == BT_CHARACTER
|
||||||
|
+ && rhs->expr_type != EXPR_CONSTANT)
|
||||||
|
+ {
|
||||||
|
+ gfc_error ("Cannot convert CHARACTER into %s at %L",
|
||||||
|
+ gfc_typename (&lhs->ts),
|
||||||
|
+ &rhs->where);
|
||||||
|
+ return false;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (rhs->is_boz
|
||||||
|
&& !gfc_notify_std (GFC_STD_GNU, "BOZ literal at %L outside "
|
||||||
|
"a DATA statement and outside INT/REAL/DBLE/CMPLX",
|
||||||
|
diff --git a/gcc/fortran/simplify.c b/gcc/fortran/simplify.c
|
||||||
|
index 6c1f4bd4fce..7d7e3f22f73 100644
|
||||||
|
--- a/gcc/fortran/simplify.c
|
||||||
|
+++ b/gcc/fortran/simplify.c
|
||||||
|
@@ -8457,10 +8457,31 @@ gfc_convert_constant (gfc_expr *e, bt type, int kind)
|
||||||
|
break;
|
||||||
|
|
||||||
|
case BT_CHARACTER:
|
||||||
|
- if (type == BT_CHARACTER)
|
||||||
|
- f = gfc_character2character;
|
||||||
|
- else
|
||||||
|
- goto oops;
|
||||||
|
+ switch (type)
|
||||||
|
+ {
|
||||||
|
+ case BT_INTEGER:
|
||||||
|
+ f = gfc_character2int;
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
+ case BT_REAL:
|
||||||
|
+ f = gfc_character2real;
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
+ case BT_COMPLEX:
|
||||||
|
+ f = gfc_character2complex;
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
+ case BT_CHARACTER:
|
||||||
|
+ f = gfc_character2character;
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
+ case BT_LOGICAL:
|
||||||
|
+ f = gfc_character2logical;
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
+ default:
|
||||||
|
+ goto oops;
|
||||||
|
+ }
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
diff --git a/gcc/fortran/trans-const.c b/gcc/fortran/trans-const.c
|
||||||
|
index 432d12bf168..b155e35cbdd 100644
|
||||||
|
--- a/gcc/fortran/trans-const.c
|
||||||
|
+++ b/gcc/fortran/trans-const.c
|
||||||
|
@@ -25,6 +25,7 @@ along with GCC; see the file COPYING3. If not see
|
||||||
|
#include "coretypes.h"
|
||||||
|
#include "tree.h"
|
||||||
|
#include "gfortran.h"
|
||||||
|
+#include "options.h"
|
||||||
|
#include "trans.h"
|
||||||
|
#include "fold-const.h"
|
||||||
|
#include "stor-layout.h"
|
||||||
|
@@ -330,7 +331,7 @@ gfc_conv_constant_to_tree (gfc_expr * expr)
|
||||||
|
gfc_get_int_type (expr->ts.kind),
|
||||||
|
gfc_build_string_const (expr->representation.length,
|
||||||
|
expr->representation.string));
|
||||||
|
- if (!integer_zerop (tmp) && !integer_onep (tmp))
|
||||||
|
+ if (!integer_zerop (tmp) && !integer_onep (tmp) && warn_surprising)
|
||||||
|
gfc_warning (0, "Assigning value other than 0 or 1 to LOGICAL"
|
||||||
|
" has undefined result at %L", &expr->where);
|
||||||
|
return fold_convert (gfc_get_logical_type (expr->ts.kind), tmp);
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/dec_char_conversion_in_assignment_1.f90 b/gcc/testsuite/gfortran.dg/dec_char_conversion_in_assignment_1.f90
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..d504f92fbbc
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/dec_char_conversion_in_assignment_1.f90
|
||||||
|
@@ -0,0 +1,61 @@
|
||||||
|
+! { dg-do run }
|
||||||
|
+! { dg-options "-fdec -Wsurprising -Wcharacter-truncation" }
|
||||||
|
+!
|
||||||
|
+! Modified by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+!
|
||||||
|
+program test
|
||||||
|
+ integer(4) :: a
|
||||||
|
+ real(4) :: b
|
||||||
|
+ complex(4) :: c
|
||||||
|
+ logical(4) :: d
|
||||||
|
+ integer(4) :: e
|
||||||
|
+ real(4) :: f
|
||||||
|
+ complex(4) :: g
|
||||||
|
+ logical(4) :: h
|
||||||
|
+
|
||||||
|
+ a = '1234'
|
||||||
|
+ b = '1234'
|
||||||
|
+ c = '12341234'
|
||||||
|
+ d = '1234' ! { dg-warning "undefined result" }
|
||||||
|
+ e = 4h1234
|
||||||
|
+ f = 4h1234
|
||||||
|
+ g = 8h12341234
|
||||||
|
+ h = 4h1234 ! { dg-warning "undefined result" }
|
||||||
|
+
|
||||||
|
+ if (a.ne.e) stop 1
|
||||||
|
+ if (b.ne.f) stop 2
|
||||||
|
+ if (c.ne.g) stop 3
|
||||||
|
+ if (d.neqv.h) stop 4
|
||||||
|
+
|
||||||
|
+ ! padded values
|
||||||
|
+ a = '12'
|
||||||
|
+ b = '12'
|
||||||
|
+ c = '12234'
|
||||||
|
+ d = '124' ! { dg-warning "undefined result" }
|
||||||
|
+ e = 2h12
|
||||||
|
+ f = 2h12
|
||||||
|
+ g = 5h12234
|
||||||
|
+ h = 3h123 ! { dg-warning "undefined result" }
|
||||||
|
+
|
||||||
|
+ if (a.ne.e) stop 5
|
||||||
|
+ if (b.ne.f) stop 6
|
||||||
|
+ if (c.ne.g) stop 7
|
||||||
|
+ if (d.neqv.h) stop 8
|
||||||
|
+
|
||||||
|
+ ! truncated values
|
||||||
|
+ a = '123478' ! { dg-warning "truncated in" }
|
||||||
|
+ b = '123478' ! { dg-warning "truncated in" }
|
||||||
|
+ c = '12341234987' ! { dg-warning "truncated in" }
|
||||||
|
+ d = '1234abc' ! { dg-warning "truncated in|undefined result" }
|
||||||
|
+ e = 6h123478 ! { dg-warning "truncated in" }
|
||||||
|
+ f = 6h123478 ! { dg-warning "truncated in" }
|
||||||
|
+ g = 11h12341234987 ! { dg-warning "truncated in" }
|
||||||
|
+ h = 7h1234abc ! { dg-warning "truncated in|undefined result" }
|
||||||
|
+
|
||||||
|
+ if (a.ne.e) stop 5
|
||||||
|
+ if (b.ne.f) stop 6
|
||||||
|
+ if (c.ne.g) stop 7
|
||||||
|
+ if (d.neqv.h) stop 8
|
||||||
|
+
|
||||||
|
+end program
|
||||||
|
+
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/dec_char_conversion_in_assignment_2.f90 b/gcc/testsuite/gfortran.dg/dec_char_conversion_in_assignment_2.f90
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..737ddc664de
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/dec_char_conversion_in_assignment_2.f90
|
||||||
|
@@ -0,0 +1,61 @@
|
||||||
|
+! { dg-do run }
|
||||||
|
+! { dg-options "-fdec-char-conversions -std=legacy -Wcharacter-truncation -Wsurprising" }
|
||||||
|
+!
|
||||||
|
+! Modified by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+!
|
||||||
|
+program test
|
||||||
|
+ integer(4) :: a
|
||||||
|
+ real(4) :: b
|
||||||
|
+ complex(4) :: c
|
||||||
|
+ logical(4) :: d
|
||||||
|
+ integer(4) :: e
|
||||||
|
+ real(4) :: f
|
||||||
|
+ complex(4) :: g
|
||||||
|
+ logical(4) :: h
|
||||||
|
+
|
||||||
|
+ a = '1234'
|
||||||
|
+ b = '1234'
|
||||||
|
+ c = '12341234'
|
||||||
|
+ d = '1234' ! { dg-warning "undefined result" }
|
||||||
|
+ e = 4h1234
|
||||||
|
+ f = 4h1234
|
||||||
|
+ g = 8h12341234
|
||||||
|
+ h = 4h1234 ! { dg-warning "undefined result" }
|
||||||
|
+
|
||||||
|
+ if (a.ne.e) stop 1
|
||||||
|
+ if (b.ne.f) stop 2
|
||||||
|
+ if (c.ne.g) stop 3
|
||||||
|
+ if (d.neqv.h) stop 4
|
||||||
|
+
|
||||||
|
+ ! padded values
|
||||||
|
+ a = '12'
|
||||||
|
+ b = '12'
|
||||||
|
+ c = '12234'
|
||||||
|
+ d = '124' ! { dg-warning "undefined result" }
|
||||||
|
+ e = 2h12
|
||||||
|
+ f = 2h12
|
||||||
|
+ g = 5h12234
|
||||||
|
+ h = 3h123 ! { dg-warning "undefined result" }
|
||||||
|
+
|
||||||
|
+ if (a.ne.e) stop 5
|
||||||
|
+ if (b.ne.f) stop 6
|
||||||
|
+ if (c.ne.g) stop 7
|
||||||
|
+ if (d.neqv.h) stop 8
|
||||||
|
+
|
||||||
|
+ ! truncated values
|
||||||
|
+ a = '123478' ! { dg-warning "truncated in" }
|
||||||
|
+ b = '123478' ! { dg-warning "truncated in" }
|
||||||
|
+ c = '12341234987' ! { dg-warning "truncated in" }
|
||||||
|
+ d = '1234abc' ! { dg-warning "truncated in|undefined result" }
|
||||||
|
+ e = 6h123478 ! { dg-warning "truncated in" }
|
||||||
|
+ f = 6h123478 ! { dg-warning "truncated in" }
|
||||||
|
+ g = 11h12341234987 ! { dg-warning "truncated in" }
|
||||||
|
+ h = 7h1234abc ! { dg-warning "truncated in|undefined result" }
|
||||||
|
+
|
||||||
|
+ if (a.ne.e) stop 5
|
||||||
|
+ if (b.ne.f) stop 6
|
||||||
|
+ if (c.ne.g) stop 7
|
||||||
|
+ if (d.neqv.h) stop 8
|
||||||
|
+
|
||||||
|
+end program
|
||||||
|
+
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/dec_char_conversion_in_assignment_3.f90 b/gcc/testsuite/gfortran.dg/dec_char_conversion_in_assignment_3.f90
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..0ec494c4a92
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/dec_char_conversion_in_assignment_3.f90
|
||||||
|
@@ -0,0 +1,61 @@
|
||||||
|
+! { dg-do compile }
|
||||||
|
+! { dg-options "-fdec -fno-dec-char-conversions" }
|
||||||
|
+!
|
||||||
|
+! Modified by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+!
|
||||||
|
+program test
|
||||||
|
+ integer(4) :: a
|
||||||
|
+ real(4) :: b
|
||||||
|
+ complex(4) :: c
|
||||||
|
+ logical(4) :: d
|
||||||
|
+ integer(4) :: e
|
||||||
|
+ real(4) :: f
|
||||||
|
+ complex(4) :: g
|
||||||
|
+ logical(4) :: h
|
||||||
|
+
|
||||||
|
+ a = '1234' ! { dg-error "Cannot convert" }
|
||||||
|
+ b = '1234' ! { dg-error "Cannot convert" }
|
||||||
|
+ c = '12341234' ! { dg-error "Cannot convert" }
|
||||||
|
+ d = '1234' ! { dg-error "Cannot convert" }
|
||||||
|
+ e = 4h1234
|
||||||
|
+ f = 4h1234
|
||||||
|
+ g = 8h12341234
|
||||||
|
+ h = 4h1234
|
||||||
|
+
|
||||||
|
+ if (a.ne.e) stop 1
|
||||||
|
+ if (b.ne.f) stop 2
|
||||||
|
+ if (c.ne.g) stop 3
|
||||||
|
+ if (d.neqv.h) stop 4
|
||||||
|
+
|
||||||
|
+ ! padded values
|
||||||
|
+ a = '12' ! { dg-error "Cannot convert" }
|
||||||
|
+ b = '12' ! { dg-error "Cannot convert" }
|
||||||
|
+ c = '12234' ! { dg-error "Cannot convert" }
|
||||||
|
+ d = '124' ! { dg-error "Cannot convert" }
|
||||||
|
+ e = 2h12
|
||||||
|
+ f = 2h12
|
||||||
|
+ g = 5h12234
|
||||||
|
+ h = 3h123
|
||||||
|
+
|
||||||
|
+ if (a.ne.e) stop 5
|
||||||
|
+ if (b.ne.f) stop 6
|
||||||
|
+ if (c.ne.g) stop 7
|
||||||
|
+ if (d.neqv.h) stop 8
|
||||||
|
+
|
||||||
|
+ ! truncated values
|
||||||
|
+ a = '123478' ! { dg-error "Cannot convert" }
|
||||||
|
+ b = '123478' ! { dg-error "Cannot convert" }
|
||||||
|
+ c = '12341234987' ! { dg-error "Cannot convert" }
|
||||||
|
+ d = '1234abc' ! { dg-error "Cannot convert" }
|
||||||
|
+ e = 6h123478 !
|
||||||
|
+ f = 6h123478 !
|
||||||
|
+ g = 11h12341234987 !
|
||||||
|
+ h = 7h1234abc !
|
||||||
|
+
|
||||||
|
+ if (a.ne.e) stop 5
|
||||||
|
+ if (b.ne.f) stop 6
|
||||||
|
+ if (c.ne.g) stop 7
|
||||||
|
+ if (d.neqv.h) stop 8
|
||||||
|
+
|
||||||
|
+end program
|
||||||
|
+
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/dec_char_conversion_in_data_1.f90 b/gcc/testsuite/gfortran.dg/dec_char_conversion_in_data_1.f90
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..c493be9314b
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/dec_char_conversion_in_data_1.f90
|
||||||
|
@@ -0,0 +1,69 @@
|
||||||
|
+! { dg-do run }
|
||||||
|
+! { dg-options "-fdec -Wsurprising" }
|
||||||
|
+!
|
||||||
|
+! Modified by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+!
|
||||||
|
+
|
||||||
|
+subroutine normal
|
||||||
|
+ integer(4) :: a
|
||||||
|
+ real(4) :: b
|
||||||
|
+ complex(4) :: c
|
||||||
|
+ logical(4) :: d
|
||||||
|
+ integer(4) :: e
|
||||||
|
+ real(4) :: f
|
||||||
|
+ complex(4) :: g
|
||||||
|
+ logical(4) :: h
|
||||||
|
+
|
||||||
|
+ data a, b, c, d / '1234', '1234', '12341234', '1234' / ! { dg-warning "undefined result" }
|
||||||
|
+ data e, f, g, h / 4h1234, 4h1234, 8h12341234, 4h1234 / ! { dg-warning "undefined result" }
|
||||||
|
+
|
||||||
|
+ if (a.ne.e) stop 1
|
||||||
|
+ if (b.ne.f) stop 2
|
||||||
|
+ if (c.ne.g) stop 3
|
||||||
|
+ if (d.neqv.h) stop 4
|
||||||
|
+end subroutine
|
||||||
|
+
|
||||||
|
+subroutine padded
|
||||||
|
+ integer(4) :: a
|
||||||
|
+ real(4) :: b
|
||||||
|
+ complex(4) :: c
|
||||||
|
+ logical(4) :: d
|
||||||
|
+ integer(4) :: e
|
||||||
|
+ real(4) :: f
|
||||||
|
+ complex(4) :: g
|
||||||
|
+ logical(4) :: h
|
||||||
|
+
|
||||||
|
+ data a, b, c, d / '12', '12', '12334', '123' / ! { dg-warning "undefined result" }
|
||||||
|
+ data e, f, g, h / 2h12, 2h12, 5h12334, 3h123 / ! { dg-warning "undefined result" }
|
||||||
|
+
|
||||||
|
+ if (a.ne.e) stop 5
|
||||||
|
+ if (b.ne.f) stop 6
|
||||||
|
+ if (c.ne.g) stop 7
|
||||||
|
+ if (d.neqv.h) stop 8
|
||||||
|
+end subroutine
|
||||||
|
+
|
||||||
|
+subroutine truncated
|
||||||
|
+ integer(4) :: a
|
||||||
|
+ real(4) :: b
|
||||||
|
+ complex(4) :: c
|
||||||
|
+ logical(4) :: d
|
||||||
|
+ integer(4) :: e
|
||||||
|
+ real(4) :: f
|
||||||
|
+ complex(4) :: g
|
||||||
|
+ logical(4) :: h
|
||||||
|
+
|
||||||
|
+ data a, b, c, d / '123478', '123478', '1234123498', '12345' / ! { dg-warning "too long|undefined result" }
|
||||||
|
+ data e, f, g, h / 6h123478, 6h123478, 10h1234123498, 5h12345 / ! { dg-warning "too long|undefined result" }
|
||||||
|
+
|
||||||
|
+ if (a.ne.e) stop 9
|
||||||
|
+ if (b.ne.f) stop 10
|
||||||
|
+ if (c.ne.g) stop 11
|
||||||
|
+ if (d.neqv.h) stop 12
|
||||||
|
+end subroutine
|
||||||
|
+
|
||||||
|
+program test
|
||||||
|
+ call normal
|
||||||
|
+ call padded
|
||||||
|
+ call truncated
|
||||||
|
+end program
|
||||||
|
+
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/dec_char_conversion_in_data_2.f90 b/gcc/testsuite/gfortran.dg/dec_char_conversion_in_data_2.f90
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..c7d8e241cec
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/dec_char_conversion_in_data_2.f90
|
||||||
|
@@ -0,0 +1,69 @@
|
||||||
|
+! { dg-do run }
|
||||||
|
+! { dg-options "-fdec-char-conversions -std=legacy -Wsurprising" }
|
||||||
|
+!
|
||||||
|
+! Modified by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+!
|
||||||
|
+
|
||||||
|
+subroutine normal
|
||||||
|
+ integer(4) :: a
|
||||||
|
+ real(4) :: b
|
||||||
|
+ complex(4) :: c
|
||||||
|
+ logical(4) :: d
|
||||||
|
+ integer(4) :: e
|
||||||
|
+ real(4) :: f
|
||||||
|
+ complex(4) :: g
|
||||||
|
+ logical(4) :: h
|
||||||
|
+
|
||||||
|
+ data a, b, c, d / '1234', '1234', '12341234', '1234' / ! { dg-warning "undefined result" }
|
||||||
|
+ data e, f, g, h / 4h1234, 4h1234, 8h12341234, 4h1234 / ! { dg-warning "undefined result" }
|
||||||
|
+
|
||||||
|
+ if (a.ne.e) stop 1
|
||||||
|
+ if (b.ne.f) stop 2
|
||||||
|
+ if (c.ne.g) stop 3
|
||||||
|
+ if (d.neqv.h) stop 4
|
||||||
|
+end subroutine
|
||||||
|
+
|
||||||
|
+subroutine padded
|
||||||
|
+ integer(4) :: a
|
||||||
|
+ real(4) :: b
|
||||||
|
+ complex(4) :: c
|
||||||
|
+ logical(4) :: d
|
||||||
|
+ integer(4) :: e
|
||||||
|
+ real(4) :: f
|
||||||
|
+ complex(4) :: g
|
||||||
|
+ logical(4) :: h
|
||||||
|
+
|
||||||
|
+ data a, b, c, d / '12', '12', '12334', '123' / ! { dg-warning "undefined result" }
|
||||||
|
+ data e, f, g, h / 2h12, 2h12, 5h12334, 3h123 / ! { dg-warning "undefined result" }
|
||||||
|
+
|
||||||
|
+ if (a.ne.e) stop 5
|
||||||
|
+ if (b.ne.f) stop 6
|
||||||
|
+ if (c.ne.g) stop 7
|
||||||
|
+ if (d.neqv.h) stop 8
|
||||||
|
+end subroutine
|
||||||
|
+
|
||||||
|
+subroutine truncated
|
||||||
|
+ integer(4) :: a
|
||||||
|
+ real(4) :: b
|
||||||
|
+ complex(4) :: c
|
||||||
|
+ logical(4) :: d
|
||||||
|
+ integer(4) :: e
|
||||||
|
+ real(4) :: f
|
||||||
|
+ complex(4) :: g
|
||||||
|
+ logical(4) :: h
|
||||||
|
+
|
||||||
|
+ data a, b, c, d / '123478', '123478', '1234123498', '12345' / ! { dg-warning "too long|undefined result" }
|
||||||
|
+ data e, f, g, h / 6h123478, 6h123478, 10h1234123498, 5h12345 / ! { dg-warning "too long|undefined result" }
|
||||||
|
+
|
||||||
|
+ if (a.ne.e) stop 9
|
||||||
|
+ if (b.ne.f) stop 10
|
||||||
|
+ if (c.ne.g) stop 11
|
||||||
|
+ if (d.neqv.h) stop 12
|
||||||
|
+end subroutine
|
||||||
|
+
|
||||||
|
+program test
|
||||||
|
+ call normal
|
||||||
|
+ call padded
|
||||||
|
+ call truncated
|
||||||
|
+end program
|
||||||
|
+
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/dec_char_conversion_in_data_3.f90 b/gcc/testsuite/gfortran.dg/dec_char_conversion_in_data_3.f90
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..e7d084b5ffc
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/dec_char_conversion_in_data_3.f90
|
||||||
|
@@ -0,0 +1,69 @@
|
||||||
|
+! { dg-do compile }
|
||||||
|
+! { dg-options "-fdec -fno-dec-char-conversions" }
|
||||||
|
+!
|
||||||
|
+! Modified by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+!
|
||||||
|
+
|
||||||
|
+subroutine normal
|
||||||
|
+ integer(4) :: a
|
||||||
|
+ real(4) :: b
|
||||||
|
+ complex(4) :: c
|
||||||
|
+ logical(4) :: d
|
||||||
|
+ integer(4) :: e
|
||||||
|
+ real(4) :: f
|
||||||
|
+ complex(4) :: g
|
||||||
|
+ logical(4) :: h
|
||||||
|
+
|
||||||
|
+ data a, b, c, d / '1234', '1234', '12341234', '1234' / ! { dg-error "Incompatible types" }
|
||||||
|
+ data e, f, g, h / 4h1234, 4h1234, 8h12341234, 4h1234 /
|
||||||
|
+
|
||||||
|
+ if (a.ne.e) stop 1
|
||||||
|
+ if (b.ne.f) stop 2
|
||||||
|
+ if (c.ne.g) stop 3
|
||||||
|
+ if (d.neqv.h) stop 4
|
||||||
|
+end subroutine
|
||||||
|
+
|
||||||
|
+subroutine padded
|
||||||
|
+ integer(4) :: a
|
||||||
|
+ real(4) :: b
|
||||||
|
+ complex(4) :: c
|
||||||
|
+ logical(4) :: d
|
||||||
|
+ integer(4) :: e
|
||||||
|
+ real(4) :: f
|
||||||
|
+ complex(4) :: g
|
||||||
|
+ logical(4) :: h
|
||||||
|
+
|
||||||
|
+ data a, b, c, d / '12', '12', '12334', '123' / ! { dg-error "Incompatible types" }
|
||||||
|
+ data e, f, g, h / 2h12, 2h12, 5h12334, 3h123 /
|
||||||
|
+
|
||||||
|
+ if (a.ne.e) stop 5
|
||||||
|
+ if (b.ne.f) stop 6
|
||||||
|
+ if (c.ne.g) stop 7
|
||||||
|
+ if (d.neqv.h) stop 8
|
||||||
|
+end subroutine
|
||||||
|
+
|
||||||
|
+subroutine truncated
|
||||||
|
+ integer(4) :: a
|
||||||
|
+ real(4) :: b
|
||||||
|
+ complex(4) :: c
|
||||||
|
+ logical(4) :: d
|
||||||
|
+ integer(4) :: e
|
||||||
|
+ real(4) :: f
|
||||||
|
+ complex(4) :: g
|
||||||
|
+ logical(4) :: h
|
||||||
|
+
|
||||||
|
+ data a, b, c, d / '123478', '123478', '1234123498', '12345' / ! { dg-error "Incompatible types" }
|
||||||
|
+ data e, f, g, h / 6h123478, 6h123478, 10h1234123498, 5h12345 /
|
||||||
|
+
|
||||||
|
+ if (a.ne.e) stop 9
|
||||||
|
+ if (b.ne.f) stop 10
|
||||||
|
+ if (c.ne.g) stop 11
|
||||||
|
+ if (d.neqv.h) stop 12
|
||||||
|
+end subroutine
|
||||||
|
+
|
||||||
|
+program test
|
||||||
|
+ call normal
|
||||||
|
+ call padded
|
||||||
|
+ call truncated
|
||||||
|
+end program
|
||||||
|
+
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/hollerith5.f90 b/gcc/testsuite/gfortran.dg/hollerith5.f90
|
||||||
|
index ebd0a117c4f..d17f9ae40cf 100644
|
||||||
|
--- a/gcc/testsuite/gfortran.dg/hollerith5.f90
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/hollerith5.f90
|
||||||
|
@@ -1,8 +1,9 @@
|
||||||
|
! { dg-do compile }
|
||||||
|
+ ! { dg-options "-Wsurprising" }
|
||||||
|
implicit none
|
||||||
|
logical b
|
||||||
|
b = 4Habcd ! { dg-warning "has undefined result" }
|
||||||
|
end
|
||||||
|
|
||||||
|
-! { dg-warning "Hollerith constant" "const" { target *-*-* } 4 }
|
||||||
|
-! { dg-warning "Conversion" "conversion" { target *-*-* } 4 }
|
||||||
|
+! { dg-warning "Hollerith constant" "const" { target *-*-* } 5 }
|
||||||
|
+! { dg-warning "Conversion" "conversion" { target *-*-* } 5 }
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/hollerith_legacy.f90 b/gcc/testsuite/gfortran.dg/hollerith_legacy.f90
|
||||||
|
index c3322498345..9d7e989b552 100644
|
||||||
|
--- a/gcc/testsuite/gfortran.dg/hollerith_legacy.f90
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/hollerith_legacy.f90
|
||||||
|
@@ -1,5 +1,5 @@
|
||||||
|
! { dg-do compile }
|
||||||
|
-! { dg-options "-std=legacy" }
|
||||||
|
+! { dg-options "-std=legacy -Wsurprising" }
|
||||||
|
! PR15966, PR18781 & PR16531
|
||||||
|
implicit none
|
||||||
|
complex(kind=8) x(2)
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/no_char_to_int_assign.f90 b/gcc/testsuite/gfortran.dg/no_char_to_int_assign.f90
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..ccfcc9ae512
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/no_char_to_int_assign.f90
|
||||||
|
@@ -0,0 +1,20 @@
|
||||||
|
+! { dg-do compile }
|
||||||
|
+! { dg-options "-fdec-char-conversions" }
|
||||||
|
+!
|
||||||
|
+! Test character to int conversion in DATA types
|
||||||
|
+!
|
||||||
|
+! Test case contributed by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+!
|
||||||
|
+program test
|
||||||
|
+ integer a
|
||||||
|
+ real b
|
||||||
|
+ complex c
|
||||||
|
+ logical d
|
||||||
|
+ character e
|
||||||
|
+
|
||||||
|
+ e = "A"
|
||||||
|
+ a = e ! { dg-error "Cannot convert" }
|
||||||
|
+ b = e ! { dg-error "Cannot convert" }
|
||||||
|
+ c = e ! { dg-error "Cannot convert" }
|
||||||
|
+ d = e ! { dg-error "Cannot convert" }
|
||||||
|
+end program
|
||||||
|
--
|
||||||
|
2.11.0
|
||||||
|
|
658
SOURCES/0005-dec-comparisons.patch
Normal file
658
SOURCES/0005-dec-comparisons.patch
Normal file
@ -0,0 +1,658 @@
|
|||||||
|
From 6946d3e3e6a1d839772f4c59a5ab08901111800c Mon Sep 17 00:00:00 2001
|
||||||
|
From: Mark Eggleston <markeggleston@codethink.com>
|
||||||
|
Date: Thu, 23 May 2019 09:42:26 +0100
|
||||||
|
Subject: [PATCH 05/16] dec comparisons
|
||||||
|
|
||||||
|
Allow comparison of Hollerith constants with numeric and character
|
||||||
|
expressions. Also allow comparison of character literalsa with numeric
|
||||||
|
expressions.
|
||||||
|
|
||||||
|
Enable using -fdec-comparisons or -fdec
|
||||||
|
---
|
||||||
|
gcc/fortran/intrinsic.c | 5 +-
|
||||||
|
gcc/fortran/invoke.texi | 32 +++++++++++--
|
||||||
|
gcc/fortran/lang.opt | 5 ++
|
||||||
|
gcc/fortran/options.c | 1 +
|
||||||
|
gcc/fortran/resolve.c | 53 +++++++++++++++++++++-
|
||||||
|
.../gfortran.dg/dec-comparison-character_1.f90 | 18 ++++++++
|
||||||
|
.../gfortran.dg/dec-comparison-character_2.f90 | 18 ++++++++
|
||||||
|
.../gfortran.dg/dec-comparison-character_3.f90 | 17 +++++++
|
||||||
|
.../gfortran.dg/dec-comparison-complex_1.f90 | 22 +++++++++
|
||||||
|
.../gfortran.dg/dec-comparison-complex_2.f90 | 22 +++++++++
|
||||||
|
.../gfortran.dg/dec-comparison-complex_3.f90 | 22 +++++++++
|
||||||
|
gcc/testsuite/gfortran.dg/dec-comparison-int_1.f90 | 31 +++++++++++++
|
||||||
|
gcc/testsuite/gfortran.dg/dec-comparison-int_2.f90 | 31 +++++++++++++
|
||||||
|
gcc/testsuite/gfortran.dg/dec-comparison-int_3.f90 | 21 +++++++++
|
||||||
|
.../gfortran.dg/dec-comparison-real_1.f90 | 31 +++++++++++++
|
||||||
|
.../gfortran.dg/dec-comparison-real_2.f90 | 31 +++++++++++++
|
||||||
|
.../gfortran.dg/dec-comparison-real_3.f90 | 31 +++++++++++++
|
||||||
|
gcc/testsuite/gfortran.dg/dec-comparison.f90 | 41 +++++++++++++++++
|
||||||
|
18 files changed, 424 insertions(+), 8 deletions(-)
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison-character_1.f90
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison-character_2.f90
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison-character_3.f90
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison-complex_1.f90
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison-complex_2.f90
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison-complex_3.f90
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison-int_1.f90
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison-int_2.f90
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison-int_3.f90
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison-real_1.f90
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison-real_2.f90
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison-real_3.f90
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/dec-comparison.f90
|
||||||
|
|
||||||
|
diff --git a/gcc/fortran/intrinsic.c b/gcc/fortran/intrinsic.c
|
||||||
|
index e94d5d3225f..6d47ae3105f 100644
|
||||||
|
--- a/gcc/fortran/intrinsic.c
|
||||||
|
+++ b/gcc/fortran/intrinsic.c
|
||||||
|
@@ -4020,7 +4020,7 @@ add_conversions (void)
|
||||||
|
|
||||||
|
/* Flang allows character conversions similar to Hollerith conversions
|
||||||
|
- the first characters will be turned into ascii values. */
|
||||||
|
- if (flag_dec_char_conversions)
|
||||||
|
+ if (flag_dec_char_conversions || flag_dec_comparisons)
|
||||||
|
{
|
||||||
|
/* Character-Integer conversions. */
|
||||||
|
for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
|
||||||
|
@@ -5150,7 +5150,8 @@ gfc_convert_type_warn (gfc_expr *expr, gfc_typespec *ts, int eflag, int wflag)
|
||||||
|
gfc_typename (&from_ts), gfc_typename (ts),
|
||||||
|
&expr->where);
|
||||||
|
}
|
||||||
|
- else if (flag_dec_char_conversions && from_ts.type == BT_CHARACTER
|
||||||
|
+ else if ((flag_dec_char_conversions || flag_dec_comparisons)
|
||||||
|
+ && from_ts.type == BT_CHARACTER
|
||||||
|
&& (gfc_numeric_ts (ts) || ts->type == BT_LOGICAL))
|
||||||
|
{
|
||||||
|
if (warn_conversion)
|
||||||
|
diff --git a/gcc/fortran/invoke.texi b/gcc/fortran/invoke.texi
|
||||||
|
index 8364c67b2df..d101b01e301 100644
|
||||||
|
--- a/gcc/fortran/invoke.texi
|
||||||
|
+++ b/gcc/fortran/invoke.texi
|
||||||
|
@@ -117,15 +117,16 @@ by type. Explanations are in the following sections.
|
||||||
|
@item Fortran Language Options
|
||||||
|
@xref{Fortran Dialect Options,,Options controlling Fortran dialect}.
|
||||||
|
@gccoptlist{-fall-intrinsics -fbackslash -fcray-pointer -fd-lines-as-code @gol
|
||||||
|
--fd-lines-as-comments @gol
|
||||||
|
--fdec -fdec-structure -fdec-intrinsic-ints -fdec-static -fdec-math @gol
|
||||||
|
--fdec-include -fdefault-double-8 -fdefault-integer-8 -fdefault-real-8 @gol
|
||||||
|
--fdefault-real-10 -fdefault-real-16 -fdollar-ok -ffixed-line-length-@var{n} @gol
|
||||||
|
+-fd-lines-as-comments -fdec -fdec-structure -fdec-intrinsic-ints @gol
|
||||||
|
+-fdec-static -fdec-math -fdec-include -fdec-format-defaults @gol
|
||||||
|
+-fdec-add-missing-indexes -fdec-blank-format-item -fdec-comparisons @gol
|
||||||
|
+-fdefault-double-8 -fdefault-integer-8 -fdefault-real-8 -fdefault-real-10 @gol
|
||||||
|
+-fdefault-real-16 -fdollar-ok -ffixed-line-length-@var{n} @gol
|
||||||
|
-ffixed-line-length-none -fpad-source -ffree-form -ffree-line-length-@var{n} @gol
|
||||||
|
-ffree-line-length-none -fimplicit-none -finteger-4-integer-8 @gol
|
||||||
|
-fmax-identifier-length -fmodule-private -ffixed-form -fno-range-check @gol
|
||||||
|
-fopenacc -fopenmp -freal-4-real-10 -freal-4-real-16 -freal-4-real-8 @gol
|
||||||
|
--freal-8-real-10 -freal-8-real-16 -freal-8-real-4 -std=@var{std}
|
||||||
|
+-freal-8-real-10 -freal-8-real-16 -freal-8-real-4 -std=@var{std} @gol
|
||||||
|
-ftest-forall-temp
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -283,6 +284,27 @@ Enable parsing of INCLUDE as a statement in addition to parsing it as
|
||||||
|
INCLUDE line. When parsed as INCLUDE statement, INCLUDE does not have to
|
||||||
|
be on a single line and can use line continuations.
|
||||||
|
|
||||||
|
+@item -fdec-add-missing-indexes
|
||||||
|
+@opindex @code{fdec-add-missing-indexes}
|
||||||
|
+Enable the insertion of missing dimensions using the lower bounds of those
|
||||||
|
+dimensions.
|
||||||
|
+
|
||||||
|
+@item -fdec-format-defaults
|
||||||
|
+@opindex @code{fdec-format-defaults}
|
||||||
|
+Enable format specifiers F, G and I to be used without width specifiers,
|
||||||
|
+default widths will be used instead.
|
||||||
|
+
|
||||||
|
+@item -fdec-blank-format-item
|
||||||
|
+@opindex @code{fdec-blank-format-item}
|
||||||
|
+Enable a blank format item at the end of a format specification i.e. nothing
|
||||||
|
+following the final comma.
|
||||||
|
+
|
||||||
|
+@item -fdec-comparisons
|
||||||
|
+@opindex @code{fdec-comparisons}
|
||||||
|
+Enable comparison of Hollerith constants and character literals with numeric and
|
||||||
|
+character expressions. Also enable comparison of Hollerith constants with numeric
|
||||||
|
+expressions.
|
||||||
|
+
|
||||||
|
@item -fdollar-ok
|
||||||
|
@opindex @code{fdollar-ok}
|
||||||
|
@cindex @code{$}
|
||||||
|
diff --git a/gcc/fortran/lang.opt b/gcc/fortran/lang.opt
|
||||||
|
index 5746b99b1d4..a957b90707f 100644
|
||||||
|
--- a/gcc/fortran/lang.opt
|
||||||
|
+++ b/gcc/fortran/lang.opt
|
||||||
|
@@ -449,6 +449,11 @@ Fortran Var(flag_dec_char_conversions)
|
||||||
|
Enable the use of character literals in assignments and data statements
|
||||||
|
for non-character variables.
|
||||||
|
|
||||||
|
+fdec-comparisons
|
||||||
|
+Fortran Var(flag_dec_comparisons)
|
||||||
|
+Enable the use of hollerith constants in comparisons. Also enables comparison
|
||||||
|
+of character literals and numeric vaiables.
|
||||||
|
+
|
||||||
|
fdec-include
|
||||||
|
Fortran Var(flag_dec_include)
|
||||||
|
Enable legacy parsing of INCLUDE as statement.
|
||||||
|
diff --git a/gcc/fortran/options.c b/gcc/fortran/options.c
|
||||||
|
index e97b1568810..b652be70f3d 100644
|
||||||
|
--- a/gcc/fortran/options.c
|
||||||
|
+++ b/gcc/fortran/options.c
|
||||||
|
@@ -77,6 +77,7 @@ set_dec_flags (int value)
|
||||||
|
SET_BITFLAG (flag_dec_format_defaults, value, value);
|
||||||
|
SET_BITFLAG (flag_dec_duplicates, value, value);
|
||||||
|
SET_BITFLAG (flag_dec_char_conversions, value, value);
|
||||||
|
+ SET_BITFLAG (flag_dec_comparisons, value, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Finalize DEC flags. */
|
||||||
|
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
|
||||||
|
index 43559185481..c8b6333874b 100644
|
||||||
|
--- a/gcc/fortran/resolve.c
|
||||||
|
+++ b/gcc/fortran/resolve.c
|
||||||
|
@@ -3888,6 +3888,30 @@ convert_integer_to_logical (gfc_expr *e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+/* Return true if TYPE is character based, false otherwise. */
|
||||||
|
+
|
||||||
|
+static int
|
||||||
|
+is_character_based (bt type)
|
||||||
|
+{
|
||||||
|
+ return type == BT_CHARACTER || type == BT_HOLLERITH;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+/* If E is a hollerith, convert it to character and issue a warning
|
||||||
|
+ for the conversion. */
|
||||||
|
+
|
||||||
|
+static void
|
||||||
|
+convert_hollerith_to_character (gfc_expr *e)
|
||||||
|
+{
|
||||||
|
+ if (e->ts.type == BT_HOLLERITH)
|
||||||
|
+ {
|
||||||
|
+ gfc_typespec t;
|
||||||
|
+ t.type = BT_CHARACTER;
|
||||||
|
+ t.kind = e->ts.kind;
|
||||||
|
+ gfc_convert_type_warn (e, &t, 2, 1);
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/* If E is a logical, convert it to an integer and issue a warning
|
||||||
|
for the conversion. */
|
||||||
|
|
||||||
|
@@ -3904,6 +3928,17 @@ convert_logical_to_integer (gfc_expr *e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+/* Convert to numeric and issue a warning for the conversion. */
|
||||||
|
+
|
||||||
|
+static void
|
||||||
|
+convert_to_numeric (gfc_expr *a, gfc_expr *b)
|
||||||
|
+{
|
||||||
|
+ gfc_typespec t;
|
||||||
|
+ t.type = b->ts.type;
|
||||||
|
+ t.kind = b->ts.kind;
|
||||||
|
+ gfc_convert_type_warn (a, &t, 2, 1);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/* Resolve an operator expression node. This can involve replacing the
|
||||||
|
operation with a user defined function call. */
|
||||||
|
|
||||||
|
@@ -4108,6 +4143,13 @@ resolve_operator (gfc_expr *e)
|
||||||
|
convert_logical_to_integer (op2);
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (flag_dec_comparisons && is_character_based (op1->ts.type)
|
||||||
|
+ && is_character_based (op2->ts.type))
|
||||||
|
+ {
|
||||||
|
+ convert_hollerith_to_character (op1);
|
||||||
|
+ convert_hollerith_to_character (op2);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (op1->ts.type == BT_CHARACTER && op2->ts.type == BT_CHARACTER
|
||||||
|
&& op1->ts.kind == op2->ts.kind)
|
||||||
|
{
|
||||||
|
@@ -4116,6 +4158,15 @@ resolve_operator (gfc_expr *e)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (flag_dec_comparisons && is_character_based (op1->ts.type)
|
||||||
|
+ && op1->expr_type == EXPR_CONSTANT && gfc_numeric_ts (&op2->ts))
|
||||||
|
+ convert_to_numeric (op1, op2);
|
||||||
|
+
|
||||||
|
+ if (flag_dec_comparisons && gfc_numeric_ts (&op1->ts)
|
||||||
|
+ && is_character_based (op2->ts.type)
|
||||||
|
+ && op2->expr_type == EXPR_CONSTANT)
|
||||||
|
+ convert_to_numeric (op2, op1);
|
||||||
|
+
|
||||||
|
if (gfc_numeric_ts (&op1->ts) && gfc_numeric_ts (&op2->ts))
|
||||||
|
{
|
||||||
|
gfc_type_convert_binary (e, 1);
|
||||||
|
@@ -10499,7 +10550,7 @@ resolve_ordinary_assign (gfc_code *code, gfc_namespace *ns)
|
||||||
|
|
||||||
|
if ((gfc_numeric_ts (&lhs->ts) || lhs->ts.type == BT_LOGICAL)
|
||||||
|
&& rhs->ts.type == BT_CHARACTER
|
||||||
|
- && rhs->expr_type != EXPR_CONSTANT)
|
||||||
|
+ && (rhs->expr_type != EXPR_CONSTANT || !flag_dec_char_conversions))
|
||||||
|
{
|
||||||
|
gfc_error ("Cannot convert CHARACTER into %s at %L",
|
||||||
|
gfc_typename (&lhs->ts),
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-character_1.f90 b/gcc/testsuite/gfortran.dg/dec-comparison-character_1.f90
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..d8209163a0e
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/dec-comparison-character_1.f90
|
||||||
|
@@ -0,0 +1,18 @@
|
||||||
|
+! { dg-do run }
|
||||||
|
+! { dg-options "-fdec -Wconversion" }
|
||||||
|
+!
|
||||||
|
+! Test case contributed by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+!
|
||||||
|
+
|
||||||
|
+program convert
|
||||||
|
+ character(4) :: c = 4HJMAC ! { dg-warning "HOLLERITH to CHARACTER" }
|
||||||
|
+ if (4HJMAC.ne.4HJMAC) stop 1 ! { dg-warning "HOLLERITH to CHARACTER" }
|
||||||
|
+ if (4HJMAC.ne."JMAC") stop 2 ! { dg-warning "HOLLERITH to CHARACTER" }
|
||||||
|
+ if (4HJMAC.eq."JMAN") stop 3 ! { dg-warning "HOLLERITH to CHARACTER" }
|
||||||
|
+ if ("JMAC".eq.4HJMAN) stop 4 ! { dg-warning "HOLLERITH to CHARACTER" }
|
||||||
|
+ if ("AAAA".eq.5HAAAAA) stop 5 ! { dg-warning "HOLLERITH to CHARACTER" }
|
||||||
|
+ if ("BBBBB".eq.5HBBBB ) stop 6 ! { dg-warning "HOLLERITH to CHARACTER" }
|
||||||
|
+ if (4HJMAC.ne.c) stop 7 ! { dg-warning "HOLLERITH to CHARACTER" }
|
||||||
|
+ if (c.ne.4HJMAC) stop 8 ! { dg-warning "HOLLERITH to CHARACTER" }
|
||||||
|
+end program
|
||||||
|
+
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-character_2.f90 b/gcc/testsuite/gfortran.dg/dec-comparison-character_2.f90
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..7332acbaf5c
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/dec-comparison-character_2.f90
|
||||||
|
@@ -0,0 +1,18 @@
|
||||||
|
+! { dg-do run }
|
||||||
|
+! { dg-options "-fdec-comparisons -std=legacy -Wconversion" }
|
||||||
|
+!
|
||||||
|
+! Test case contributed by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+!
|
||||||
|
+
|
||||||
|
+program convert
|
||||||
|
+ character(4) :: c = 4HJMAC ! { dg-warning "HOLLERITH to CHARACTER" }
|
||||||
|
+ if (4HJMAC.ne.4HJMAC) stop 1 ! { dg-warning "HOLLERITH to CHARACTER" }
|
||||||
|
+ if (4HJMAC.ne."JMAC") stop 2 ! { dg-warning "HOLLERITH to CHARACTER" }
|
||||||
|
+ if (4HJMAC.eq."JMAN") stop 3 ! { dg-warning "HOLLERITH to CHARACTER" }
|
||||||
|
+ if ("JMAC".eq.4HJMAN) stop 4 ! { dg-warning "HOLLERITH to CHARACTER" }
|
||||||
|
+ if ("AAAA".eq.5HAAAAA) stop 5 ! { dg-warning "HOLLERITH to CHARACTER" }
|
||||||
|
+ if ("BBBBB".eq.5HBBBB ) stop 6 ! { dg-warning "HOLLERITH to CHARACTER" }
|
||||||
|
+ if (4HJMAC.ne.c) stop 7 ! { dg-warning "HOLLERITH to CHARACTER" }
|
||||||
|
+ if (c.ne.4HJMAC) stop 8 ! { dg-warning "HOLLERITH to CHARACTER" }
|
||||||
|
+end program
|
||||||
|
+
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-character_3.f90 b/gcc/testsuite/gfortran.dg/dec-comparison-character_3.f90
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..c20c012478a
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/dec-comparison-character_3.f90
|
||||||
|
@@ -0,0 +1,17 @@
|
||||||
|
+! { dg-do compile }
|
||||||
|
+! { dg-options "-fdec -fno-dec-comparisons" }
|
||||||
|
+!
|
||||||
|
+! Test case contributed by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+!
|
||||||
|
+
|
||||||
|
+program convert
|
||||||
|
+ character(4) :: c = 4HJMAC
|
||||||
|
+ if (4HJMAC.ne.4HJMAC) stop 1 ! { dg-error "Operands of comparison" }
|
||||||
|
+ if (4HJMAC.ne."JMAC") stop 2 ! { dg-error "Operands of comparison" }
|
||||||
|
+ if (4HJMAC.eq."JMAN") stop 3 ! { dg-error "Operands of comparison" }
|
||||||
|
+ if ("JMAC".eq.4HJMAN) stop 4 ! { dg-error "Operands of comparison" }
|
||||||
|
+ if ("AAAA".eq.5HAAAAA) stop 5 ! { dg-error "Operands of comparison" }
|
||||||
|
+ if ("BBBBB".eq.5HBBBB ) stop 6 ! { dg-error "Operands of comparison" }
|
||||||
|
+ if (4HJMAC.ne.c) stop 7 ! { dg-error "Operands of comparison" }
|
||||||
|
+end program
|
||||||
|
+
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-complex_1.f90 b/gcc/testsuite/gfortran.dg/dec-comparison-complex_1.f90
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..3495f2ae414
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/dec-comparison-complex_1.f90
|
||||||
|
@@ -0,0 +1,22 @@
|
||||||
|
+! { dg-do run }
|
||||||
|
+! { dg-options "-std=legacy -fdec -Wconversion" }
|
||||||
|
+!
|
||||||
|
+! Test case contributed by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+!
|
||||||
|
+
|
||||||
|
+program convert
|
||||||
|
+ complex(4) :: a
|
||||||
|
+ complex(4) :: b
|
||||||
|
+ a = 8HABCDABCD ! { dg-warning "Conversion from HOLLERITH" }
|
||||||
|
+ b = transfer("ABCDABCD", b);
|
||||||
|
+ ! Hollerith constants
|
||||||
|
+ if (a.ne.8HABCDABCD) stop 1 ! { dg-warning "Conversion from HOLLERITH" }
|
||||||
|
+ if (a.eq.8HABCEABCE) stop 2 ! { dg-warning "Conversion from HOLLERITH" }
|
||||||
|
+ if (8HABCDABCD.ne.b) stop 3 ! { dg-warning "Conversion from HOLLERITH" }
|
||||||
|
+ if (8HABCEABCE.eq.b) stop 4 ! { dg-warning "Conversion from HOLLERITH" }
|
||||||
|
+ ! Character literals
|
||||||
|
+ if (a.ne."ABCDABCD") stop 5 ! { dg-warning "Conversion from CHARACTER" }
|
||||||
|
+ if (a.eq."ABCEABCE") stop 6 ! { dg-warning "Conversion from CHARACTER" }
|
||||||
|
+ if ("ABCDABCD".ne.b) stop 7 ! { dg-warning "Conversion from CHARACTER" }
|
||||||
|
+ if ("ABCEABCE".eq.b) stop 8 ! { dg-warning "Conversion from CHARACTER" }
|
||||||
|
+end program
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-complex_2.f90 b/gcc/testsuite/gfortran.dg/dec-comparison-complex_2.f90
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..c38042cc600
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/dec-comparison-complex_2.f90
|
||||||
|
@@ -0,0 +1,22 @@
|
||||||
|
+! { dg-do run }
|
||||||
|
+! { dg-options "-std=legacy -fdec-comparisons -Wconversion" }
|
||||||
|
+!
|
||||||
|
+! Test case contributed by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+!
|
||||||
|
+
|
||||||
|
+program convert
|
||||||
|
+ complex(4) :: a
|
||||||
|
+ complex(4) :: b
|
||||||
|
+ a = 8HABCDABCD ! { dg-warning "Conversion from HOLLERITH" }
|
||||||
|
+ b = transfer("ABCDABCD", b);
|
||||||
|
+ ! Hollerith constants
|
||||||
|
+ if (a.ne.8HABCDABCD) stop 1 ! { dg-warning "Conversion from HOLLERITH" }
|
||||||
|
+ if (a.eq.8HABCEABCE) stop 2 ! { dg-warning "Conversion from HOLLERITH" }
|
||||||
|
+ if (8HABCDABCD.ne.b) stop 3 ! { dg-warning "Conversion from HOLLERITH" }
|
||||||
|
+ if (8HABCEABCE.eq.b) stop 4 ! { dg-warning "Conversion from HOLLERITH" }
|
||||||
|
+ ! Character literals
|
||||||
|
+ if (a.ne."ABCDABCD") stop 5 ! { dg-warning "Conversion from CHARACTER" }
|
||||||
|
+ if (a.eq."ABCEABCE") stop 6 ! { dg-warning "Conversion from CHARACTER" }
|
||||||
|
+ if ("ABCDABCD".ne.b) stop 7 ! { dg-warning "Conversion from CHARACTER" }
|
||||||
|
+ if ("ABCEABCE".eq.b) stop 8 ! { dg-warning "Conversion from CHARACTER" }
|
||||||
|
+end program
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-complex_3.f90 b/gcc/testsuite/gfortran.dg/dec-comparison-complex_3.f90
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..9b27fc4d502
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/dec-comparison-complex_3.f90
|
||||||
|
@@ -0,0 +1,22 @@
|
||||||
|
+! { dg-do compile }
|
||||||
|
+! { dg-options "-std=legacy -fdec -fno-dec-comparisons -Wconversion" }
|
||||||
|
+!
|
||||||
|
+! Test case contributed by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+!
|
||||||
|
+
|
||||||
|
+program convert
|
||||||
|
+ complex(4) :: a
|
||||||
|
+ complex(4) :: b
|
||||||
|
+ a = 8HABCDABCD ! { dg-warning "Conversion from HOLLERITH" }
|
||||||
|
+ b = transfer("ABCDABCD", b);
|
||||||
|
+ ! Hollerith constants
|
||||||
|
+ if (a.ne.8HABCDABCD) stop 1 ! { dg-error "Operands of comparison" }
|
||||||
|
+ if (a.eq.8HABCEABCE) stop 2 ! { dg-error "Operands of comparison" }
|
||||||
|
+ if (8HABCDABCD.ne.b) stop 3 ! { dg-error "Operands of comparison" }
|
||||||
|
+ if (8HABCEABCE.eq.b) stop 4 ! { dg-error "Operands of comparison" }
|
||||||
|
+ ! character literals
|
||||||
|
+ if (a.ne."ABCDABCD") stop 5 ! { dg-error "Operands of comparison" }
|
||||||
|
+ if (a.eq."ABCEABCE") stop 6 ! { dg-error "Operands of comparison" }
|
||||||
|
+ if ("ABCDABCD".ne.b) stop 7 ! { dg-error "Operands of comparison" }
|
||||||
|
+ if ("ABCEABCE".eq.b) stop 8 ! { dg-error "Operands of comparison" }
|
||||||
|
+end program
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-int_1.f90 b/gcc/testsuite/gfortran.dg/dec-comparison-int_1.f90
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..c93b61e29cf
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/dec-comparison-int_1.f90
|
||||||
|
@@ -0,0 +1,31 @@
|
||||||
|
+! { dg-do run }
|
||||||
|
+! { dg-options "-std=legacy -fdec -Wconversion" }
|
||||||
|
+!
|
||||||
|
+! Test case contributed by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+!
|
||||||
|
+
|
||||||
|
+program convert
|
||||||
|
+ integer(4) :: a
|
||||||
|
+ integer(4) :: b
|
||||||
|
+ a = 4HABCD ! { dg-warning "Conversion from HOLLERITH" }
|
||||||
|
+ b = transfer("ABCD", b)
|
||||||
|
+ ! Hollerith constants
|
||||||
|
+ if (a.ne.4HABCD) stop 1 ! { dg-warning "Conversion from HOLLERITH" }
|
||||||
|
+ if (a.eq.4HABCE) stop 2 ! { dg-warning "Conversion from HOLLERITH" }
|
||||||
|
+ if (4HABCD.ne.b) stop 3 ! { dg-warning "Conversion from HOLLERITH" }
|
||||||
|
+ if (4HABCE.eq.b) stop 4 ! { dg-warning "Conversion from HOLLERITH" }
|
||||||
|
+ if (4HABCE.lt.a) stop 5 ! { dg-warning "Conversion from HOLLERITH" }
|
||||||
|
+ if (a.gt.4HABCE) stop 6 ! { dg-warning "Conversion from HOLLERITH" }
|
||||||
|
+ if (4HABCE.le.a) stop 7 ! { dg-warning "Conversion from HOLLERITH" }
|
||||||
|
+ if (a.ge.4HABCE) stop 8 ! { dg-warning "Conversion from HOLLERITH" }
|
||||||
|
+ ! Character literals
|
||||||
|
+ if (a.ne."ABCD") stop 9 ! { dg-warning "Conversion from CHARACTER" }
|
||||||
|
+ if (a.eq."ABCE") stop 10 ! { dg-warning "Conversion from CHARACTER" }
|
||||||
|
+ if ("ABCD".ne.b) stop 11 ! { dg-warning "Conversion from CHARACTER" }
|
||||||
|
+ if ("ABCE".eq.b) stop 12 ! { dg-warning "Conversion from CHARACTER" }
|
||||||
|
+ if ("ABCE".lt.a) stop 13 ! { dg-warning "Conversion from CHARACTER" }
|
||||||
|
+ if (a.gt."ABCE") stop 14 ! { dg-warning "Conversion from CHARACTER" }
|
||||||
|
+ if ("ABCE".le.a) stop 15 ! { dg-warning "Conversion from CHARACTER" }
|
||||||
|
+ if (a.ge."ABCE") stop 16 ! { dg-warning "Conversion from CHARACTER" }
|
||||||
|
+end program
|
||||||
|
+
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-int_2.f90 b/gcc/testsuite/gfortran.dg/dec-comparison-int_2.f90
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..cd1ae783d41
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/dec-comparison-int_2.f90
|
||||||
|
@@ -0,0 +1,31 @@
|
||||||
|
+! { dg-do run }
|
||||||
|
+! { dg-options "-std=legacy -fdec-comparisons -Wconversion" }
|
||||||
|
+!
|
||||||
|
+! Test case contributed by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+!
|
||||||
|
+
|
||||||
|
+program convert
|
||||||
|
+ integer(4) :: a
|
||||||
|
+ integer(4) :: b
|
||||||
|
+ a = 4HABCD ! { dg-warning "Conversion from HOLLERITH" }
|
||||||
|
+ b = transfer("ABCD", b)
|
||||||
|
+ ! Hollerith constants
|
||||||
|
+ if (a.ne.4HABCD) stop 1 ! { dg-warning "Conversion from HOLLERITH" }
|
||||||
|
+ if (a.eq.4HABCE) stop 2 ! { dg-warning "Conversion from HOLLERITH" }
|
||||||
|
+ if (4HABCD.ne.b) stop 3 ! { dg-warning "Conversion from HOLLERITH" }
|
||||||
|
+ if (4HABCE.eq.b) stop 4 ! { dg-warning "Conversion from HOLLERITH" }
|
||||||
|
+ if (4HABCE.lt.a) stop 5 ! { dg-warning "Conversion from HOLLERITH" }
|
||||||
|
+ if (a.gt.4HABCE) stop 6 ! { dg-warning "Conversion from HOLLERITH" }
|
||||||
|
+ if (4HABCE.le.a) stop 7 ! { dg-warning "Conversion from HOLLERITH" }
|
||||||
|
+ if (a.ge.4HABCE) stop 8 ! { dg-warning "Conversion from HOLLERITH" }
|
||||||
|
+ ! Character literals
|
||||||
|
+ if (a.ne."ABCD") stop 9 ! { dg-warning "Conversion from CHARACTER" }
|
||||||
|
+ if (a.eq."ABCE") stop 10 ! { dg-warning "Conversion from CHARACTER" }
|
||||||
|
+ if ("ABCD".ne.b) stop 11 ! { dg-warning "Conversion from CHARACTER" }
|
||||||
|
+ if ("ABCE".eq.b) stop 12 ! { dg-warning "Conversion from CHARACTER" }
|
||||||
|
+ if ("ABCE".lt.a) stop 13 ! { dg-warning "Conversion from CHARACTER" }
|
||||||
|
+ if (a.gt."ABCE") stop 14 ! { dg-warning "Conversion from CHARACTER" }
|
||||||
|
+ if ("ABCE".le.a) stop 15 ! { dg-warning "Conversion from CHARACTER" }
|
||||||
|
+ if (a.ge."ABCE") stop 16 ! { dg-warning "Conversion from CHARACTER" }
|
||||||
|
+end program
|
||||||
|
+
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-int_3.f90 b/gcc/testsuite/gfortran.dg/dec-comparison-int_3.f90
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..b350075afe7
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/dec-comparison-int_3.f90
|
||||||
|
@@ -0,0 +1,21 @@
|
||||||
|
+! { dg-do compile }
|
||||||
|
+! { dg-options "-fdec -fno-dec-comparisons -Wconversion" }
|
||||||
|
+!
|
||||||
|
+! Test case contributed by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+!
|
||||||
|
+
|
||||||
|
+program convert
|
||||||
|
+ integer(4) :: a
|
||||||
|
+ integer(4) :: b
|
||||||
|
+ a = 4HABCD ! { dg-warning "Conversion from HOLLERITH" }
|
||||||
|
+ b = transfer("ABCD", b)
|
||||||
|
+ if (a.ne.4HABCD) stop 1 ! { dg-error "Operands of comparison" }
|
||||||
|
+ if (a.eq.4HABCE) stop 2 ! { dg-error "Operands of comparison" }
|
||||||
|
+ if (4HABCD.ne.b) stop 3 ! { dg-error "Operands of comparison" }
|
||||||
|
+ if (4HABCE.eq.b) stop 4 ! { dg-error "Operands of comparison" }
|
||||||
|
+ if (4HABCE.lt.a) stop 5 ! { dg-error "Operands of comparison" }
|
||||||
|
+ if (a.gt.4HABCE) stop 6 ! { dg-error "Operands of comparison" }
|
||||||
|
+ if (4HABCE.le.a) stop 7 ! { dg-error "Operands of comparison" }
|
||||||
|
+ if (a.ge.4HABCE) stop 8 ! { dg-error "Operands of comparison" }
|
||||||
|
+end program
|
||||||
|
+
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-real_1.f90 b/gcc/testsuite/gfortran.dg/dec-comparison-real_1.f90
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..08b66aaebfd
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/dec-comparison-real_1.f90
|
||||||
|
@@ -0,0 +1,31 @@
|
||||||
|
+! { dg-do run }
|
||||||
|
+! { dg-options "-std=legacy -fdec -Wconversion" }
|
||||||
|
+!
|
||||||
|
+! Test case contributed by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+!
|
||||||
|
+
|
||||||
|
+program convert
|
||||||
|
+ real(4) :: a
|
||||||
|
+ real(4) :: b
|
||||||
|
+ a = 4HABCD ! { dg-warning "Conversion from HOLLERITH" }
|
||||||
|
+ b = transfer("ABCD", b)
|
||||||
|
+ ! Hollerith constants
|
||||||
|
+ if (a.ne.4HABCD) stop 1 ! { dg-warning "Conversion from HOLLERITH" }
|
||||||
|
+ if (a.eq.4HABCE) stop 2 ! { dg-warning "Conversion from HOLLERITH" }
|
||||||
|
+ if (4HABCD.ne.b) stop 3 ! { dg-warning "Conversion from HOLLERITH" }
|
||||||
|
+ if (4HABCE.eq.b) stop 4 ! { dg-warning "Conversion from HOLLERITH" }
|
||||||
|
+ if (4HABCE.lt.a) stop 5 ! { dg-warning "Conversion from HOLLERITH" }
|
||||||
|
+ if (a.gt.4HABCE) stop 6 ! { dg-warning "Conversion from HOLLERITH" }
|
||||||
|
+ if (4HABCE.le.a) stop 7 ! { dg-warning "Conversion from HOLLERITH" }
|
||||||
|
+ if (a.ge.4HABCE) stop 8 ! { dg-warning "Conversion from HOLLERITH" }
|
||||||
|
+ ! Character literals
|
||||||
|
+ if (a.ne."ABCD") stop 9 ! { dg-warning "Conversion from CHARACTER" }
|
||||||
|
+ if (a.eq."ABCE") stop 10 ! { dg-warning "Conversion from CHARACTER" }
|
||||||
|
+ if ("ABCD".ne.b) stop 11 ! { dg-warning "Conversion from CHARACTER" }
|
||||||
|
+ if ("ABCE".eq.b) stop 12 ! { dg-warning "Conversion from CHARACTER" }
|
||||||
|
+ if ("ABCE".lt.a) stop 13 ! { dg-warning "Conversion from CHARACTER" }
|
||||||
|
+ if (a.gt."ABCE") stop 14 ! { dg-warning "Conversion from CHARACTER" }
|
||||||
|
+ if ("ABCE".le.a) stop 15 ! { dg-warning "Conversion from CHARACTER" }
|
||||||
|
+ if (a.ge."ABCE") stop 16 ! { dg-warning "Conversion from CHARACTER" }
|
||||||
|
+end program
|
||||||
|
+
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-real_2.f90 b/gcc/testsuite/gfortran.dg/dec-comparison-real_2.f90
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..244abb84868
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/dec-comparison-real_2.f90
|
||||||
|
@@ -0,0 +1,31 @@
|
||||||
|
+! { dg-do run }
|
||||||
|
+! { dg-options "-std=legacy -fdec-comparisons -Wconversion" }
|
||||||
|
+!
|
||||||
|
+! Test case contributed by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+!
|
||||||
|
+
|
||||||
|
+program convert
|
||||||
|
+ real(4) :: a
|
||||||
|
+ real(4) :: b
|
||||||
|
+ a = 4HABCD ! { dg-warning "Conversion from HOLLERITH" }
|
||||||
|
+ b = transfer("ABCD", b)
|
||||||
|
+ ! Hollerith constants
|
||||||
|
+ if (a.ne.4HABCD) stop 1 ! { dg-warning "Conversion from HOLLERITH" }
|
||||||
|
+ if (a.eq.4HABCE) stop 2 ! { dg-warning "Conversion from HOLLERITH" }
|
||||||
|
+ if (4HABCD.ne.b) stop 3 ! { dg-warning "Conversion from HOLLERITH" }
|
||||||
|
+ if (4HABCE.eq.b) stop 4 ! { dg-warning "Conversion from HOLLERITH" }
|
||||||
|
+ if (4HABCE.lt.a) stop 5 ! { dg-warning "Conversion from HOLLERITH" }
|
||||||
|
+ if (a.gt.4HABCE) stop 6 ! { dg-warning "Conversion from HOLLERITH" }
|
||||||
|
+ if (4HABCE.le.a) stop 7 ! { dg-warning "Conversion from HOLLERITH" }
|
||||||
|
+ if (a.ge.4HABCE) stop 8 ! { dg-warning "Conversion from HOLLERITH" }
|
||||||
|
+ ! Character literals
|
||||||
|
+ if (a.ne."ABCD") stop 9 ! { dg-warning "Conversion from CHARACTER" }
|
||||||
|
+ if (a.eq."ABCE") stop 10 ! { dg-warning "Conversion from CHARACTER" }
|
||||||
|
+ if ("ABCD".ne.b) stop 11 ! { dg-warning "Conversion from CHARACTER" }
|
||||||
|
+ if ("ABCE".eq.b) stop 12 ! { dg-warning "Conversion from CHARACTER" }
|
||||||
|
+ if ("ABCE".lt.a) stop 13 ! { dg-warning "Conversion from CHARACTER" }
|
||||||
|
+ if (a.gt."ABCE") stop 14 ! { dg-warning "Conversion from CHARACTER" }
|
||||||
|
+ if ("ABCE".le.a) stop 15 ! { dg-warning "Conversion from CHARACTER" }
|
||||||
|
+ if (a.ge."ABCE") stop 16 ! { dg-warning "Conversion from CHARACTER" }
|
||||||
|
+end program
|
||||||
|
+
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/dec-comparison-real_3.f90 b/gcc/testsuite/gfortran.dg/dec-comparison-real_3.f90
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..111c648f08c
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/dec-comparison-real_3.f90
|
||||||
|
@@ -0,0 +1,31 @@
|
||||||
|
+! { dg-do compile }
|
||||||
|
+! { dg-options "-std=legacy -fdec -fno-dec-comparisons -Wconversion" }
|
||||||
|
+!
|
||||||
|
+! Test case contributed by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+!
|
||||||
|
+
|
||||||
|
+program convert
|
||||||
|
+ real(4) :: a
|
||||||
|
+ real(4) :: b
|
||||||
|
+ a = 4HABCD ! { dg-warning "Conversion from HOLLERITH" }
|
||||||
|
+ b = transfer("ABCD", b)
|
||||||
|
+ ! Hollerith constants
|
||||||
|
+ if (a.ne.4HABCD) stop 1 ! { dg-error "Operands of comparison" }
|
||||||
|
+ if (a.eq.4HABCE) stop 2 ! { dg-error "Operands of comparison" }
|
||||||
|
+ if (4HABCD.ne.b) stop 3 ! { dg-error "Operands of comparison" }
|
||||||
|
+ if (4HABCE.eq.b) stop 4 ! { dg-error "Operands of comparison" }
|
||||||
|
+ if (4HABCE.lt.a) stop 5 ! { dg-error "Operands of comparison" }
|
||||||
|
+ if (a.gt.4HABCE) stop 6 ! { dg-error "Operands of comparison" }
|
||||||
|
+ if (4HABCE.le.a) stop 7 ! { dg-error "Operands of comparison" }
|
||||||
|
+ if (a.ge.4HABCE) stop 8 ! { dg-error "Operands of comparison" }
|
||||||
|
+ ! Character literals
|
||||||
|
+ if (a.ne."ABCD") stop 9 ! { dg-error "Operands of comparison" }
|
||||||
|
+ if (a.eq."ABCE") stop 10 ! { dg-error "Operands of comparison" }
|
||||||
|
+ if ("ABCD".ne.b) stop 11 ! { dg-error "Operands of comparison" }
|
||||||
|
+ if ("ABCE".eq.b) stop 12 ! { dg-error "Operands of comparison" }
|
||||||
|
+ if ("ABCE".lt.a) stop 13 ! { dg-error "Operands of comparison" }
|
||||||
|
+ if (a.gt."ABCE") stop 14 ! { dg-error "Operands of comparison" }
|
||||||
|
+ if ("ABCE".le.a) stop 15 ! { dg-error "Operands of comparison" }
|
||||||
|
+ if (a.ge."ABCE") stop 16 ! { dg-error "Operands of comparison" }
|
||||||
|
+end program
|
||||||
|
+
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/dec-comparison.f90 b/gcc/testsuite/gfortran.dg/dec-comparison.f90
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..b0b28e55111
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/dec-comparison.f90
|
||||||
|
@@ -0,0 +1,41 @@
|
||||||
|
+! { dg-do compile }
|
||||||
|
+! { dg-options "-fdec" }
|
||||||
|
+!
|
||||||
|
+! Test case contributed by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+!
|
||||||
|
+! Hollerith constants and character literals are allowed in comparisons,
|
||||||
|
+! check that character variables can not be compared with numeric variables.
|
||||||
|
+
|
||||||
|
+program convert
|
||||||
|
+ character(4) :: a = 4hJMAC
|
||||||
|
+ integer(4) :: b = "JMAC"
|
||||||
|
+ real(4) :: c = "JMAC"
|
||||||
|
+ complex(4) :: d = "JMACJMAC"
|
||||||
|
+ ! integers
|
||||||
|
+ if (a.ne.b) stop 1 ! { dg-error "Operands of comparison" }
|
||||||
|
+ if (b.eq.a) stop 2 ! { dg-error "Operands of comparison" }
|
||||||
|
+ if (a.ge.b) stop 3 ! { dg-error "Operands of comparison" }
|
||||||
|
+ if (b.ge.a) stop 4 ! { dg-error "Operands of comparison" }
|
||||||
|
+ if (a.gt.b) stop 5 ! { dg-error "Operands of comparison" }
|
||||||
|
+ if (b.gt.a) stop 6 ! { dg-error "Operands of comparison" }
|
||||||
|
+ if (a.le.b) stop 3 ! { dg-error "Operands of comparison" }
|
||||||
|
+ if (b.le.a) stop 4 ! { dg-error "Operands of comparison" }
|
||||||
|
+ if (a.lt.b) stop 5 ! { dg-error "Operands of comparison" }
|
||||||
|
+ if (b.lt.a) stop 6 ! { dg-error "Operands of comparison" }
|
||||||
|
+ ! reals
|
||||||
|
+ if (a.ne.c) stop 7 ! { dg-error "Operands of comparison" }
|
||||||
|
+ if (c.eq.a) stop 8 ! { dg-error "Operands of comparison" }
|
||||||
|
+ if (a.ge.c) stop 9 ! { dg-error "Operands of comparison" }
|
||||||
|
+ if (c.ge.a) stop 10 ! { dg-error "Operands of comparison" }
|
||||||
|
+ if (a.gt.c) stop 11 ! { dg-error "Operands of comparison" }
|
||||||
|
+ if (c.gt.a) stop 12 ! { dg-error "Operands of comparison" }
|
||||||
|
+ if (a.le.c) stop 13 ! { dg-error "Operands of comparison" }
|
||||||
|
+ if (c.le.a) stop 14 ! { dg-error "Operands of comparison" }
|
||||||
|
+ if (a.lt.c) stop 15 ! { dg-error "Operands of comparison" }
|
||||||
|
+ if (c.lt.a) stop 16 ! { dg-error "Operands of comparison" }
|
||||||
|
+ ! complexes
|
||||||
|
+ a = "JMACJMAC"
|
||||||
|
+ if (a.ne.d) stop 17 ! { dg-error "Operands of comparison" }
|
||||||
|
+ if (d.eq.a) stop 18 ! { dg-error "Operands of comparison" }
|
||||||
|
+end program
|
||||||
|
+
|
||||||
|
--
|
||||||
|
2.11.0
|
||||||
|
|
150
SOURCES/0006-Allow-blank-format-items-in-format-strings.patch
Normal file
150
SOURCES/0006-Allow-blank-format-items-in-format-strings.patch
Normal file
@ -0,0 +1,150 @@
|
|||||||
|
From 8a5920d930429f91b269d9265323bf2507a6b8e5 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jim MacArthur <jim.macarthur@codethink.co.uk>
|
||||||
|
Date: Thu, 4 Feb 2016 16:59:41 +0000
|
||||||
|
Subject: [PATCH 06/16] Allow blank format items in format strings
|
||||||
|
|
||||||
|
This has to be written in a slightly verbose manner because GCC 7
|
||||||
|
defaults to building with -Werror=implicit-fallthrough which prevents
|
||||||
|
us from just falling through to the default: case.
|
||||||
|
|
||||||
|
Test written by: Francisco Redondo Marchena <francisco.marchena@codethink.co.uk>
|
||||||
|
|
||||||
|
Use -fdec-blank-format-item to enable. Also enabled by -fdec.
|
||||||
|
---
|
||||||
|
gcc/fortran/io.c | 10 ++++++++++
|
||||||
|
gcc/fortran/lang.opt | 4 ++++
|
||||||
|
gcc/fortran/options.c | 1 +
|
||||||
|
gcc/testsuite/gfortran.dg/dec_format_empty_item_1.f | 19 +++++++++++++++++++
|
||||||
|
gcc/testsuite/gfortran.dg/dec_format_empty_item_2.f | 19 +++++++++++++++++++
|
||||||
|
gcc/testsuite/gfortran.dg/dec_format_empty_item_3.f | 19 +++++++++++++++++++
|
||||||
|
6 files changed, 72 insertions(+)
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/dec_format_empty_item_1.f
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/dec_format_empty_item_2.f
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/dec_format_empty_item_3.f
|
||||||
|
|
||||||
|
diff --git a/gcc/fortran/io.c b/gcc/fortran/io.c
|
||||||
|
index 57117579627..5b355952840 100644
|
||||||
|
--- a/gcc/fortran/io.c
|
||||||
|
+++ b/gcc/fortran/io.c
|
||||||
|
@@ -756,6 +756,16 @@ format_item_1:
|
||||||
|
error = unexpected_end;
|
||||||
|
goto syntax;
|
||||||
|
|
||||||
|
+ case FMT_RPAREN:
|
||||||
|
+ /* Oracle allows a blank format item. */
|
||||||
|
+ if (flag_dec_blank_format_item)
|
||||||
|
+ goto finished;
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ error = unexpected_element;
|
||||||
|
+ goto syntax;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
default:
|
||||||
|
error = unexpected_element;
|
||||||
|
goto syntax;
|
||||||
|
diff --git a/gcc/fortran/lang.opt b/gcc/fortran/lang.opt
|
||||||
|
index a957b90707f..3d8aaeaaf44 100644
|
||||||
|
--- a/gcc/fortran/lang.opt
|
||||||
|
+++ b/gcc/fortran/lang.opt
|
||||||
|
@@ -440,6 +440,10 @@ fdec
|
||||||
|
Fortran Var(flag_dec)
|
||||||
|
Enable all DEC language extensions.
|
||||||
|
|
||||||
|
+fdec-blank-format-item
|
||||||
|
+Fortran Var(flag_dec_blank_format_item)
|
||||||
|
+Enable the use of blank format items in format strings.
|
||||||
|
+
|
||||||
|
fdec-duplicates
|
||||||
|
Fortran Var(flag_dec_duplicates)
|
||||||
|
Allow varibles to be duplicated in the type specification matches.
|
||||||
|
diff --git a/gcc/fortran/options.c b/gcc/fortran/options.c
|
||||||
|
index b652be70f3d..a8c2cf71c3b 100644
|
||||||
|
--- a/gcc/fortran/options.c
|
||||||
|
+++ b/gcc/fortran/options.c
|
||||||
|
@@ -78,6 +78,7 @@ set_dec_flags (int value)
|
||||||
|
SET_BITFLAG (flag_dec_duplicates, value, value);
|
||||||
|
SET_BITFLAG (flag_dec_char_conversions, value, value);
|
||||||
|
SET_BITFLAG (flag_dec_comparisons, value, value);
|
||||||
|
+ SET_BITFLAG (flag_dec_blank_format_item, value, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Finalize DEC flags. */
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/dec_format_empty_item_1.f b/gcc/testsuite/gfortran.dg/dec_format_empty_item_1.f
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..ed27c18944b
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/dec_format_empty_item_1.f
|
||||||
|
@@ -0,0 +1,19 @@
|
||||||
|
+! { dg-do run }
|
||||||
|
+! { dg-options "-fdec" }
|
||||||
|
+!
|
||||||
|
+! Test blank/empty format items in format string
|
||||||
|
+!
|
||||||
|
+! Test case contributed by Jim MacArthur <jim.macarthur@codethink.co.uk>
|
||||||
|
+! Modified by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+!
|
||||||
|
+ PROGRAM blank_format_items
|
||||||
|
+ INTEGER A/0/
|
||||||
|
+
|
||||||
|
+ OPEN(1, status="scratch")
|
||||||
|
+ WRITE(1, 10) 100
|
||||||
|
+ REWIND(1)
|
||||||
|
+ READ(1, 10) A
|
||||||
|
+ IF (a.NE.100) STOP 1
|
||||||
|
+ PRINT 10, A
|
||||||
|
+10 FORMAT( I5,)
|
||||||
|
+ END
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/dec_format_empty_item_2.f b/gcc/testsuite/gfortran.dg/dec_format_empty_item_2.f
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..2793cb16225
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/dec_format_empty_item_2.f
|
||||||
|
@@ -0,0 +1,19 @@
|
||||||
|
+! { dg-do run }
|
||||||
|
+! { dg-options "-fdec-blank-format-item" }
|
||||||
|
+!
|
||||||
|
+! Test blank/empty format items in format string
|
||||||
|
+!
|
||||||
|
+! Test case contributed by Jim MacArthur <jim.macarthur@codethink.co.uk>
|
||||||
|
+! Modified by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+!
|
||||||
|
+ PROGRAM blank_format_items
|
||||||
|
+ INTEGER A/0/
|
||||||
|
+
|
||||||
|
+ OPEN(1, status="scratch")
|
||||||
|
+ WRITE(1, 10) 100
|
||||||
|
+ REWIND(1)
|
||||||
|
+ READ(1, 10) A
|
||||||
|
+ IF (a.NE.100) STOP 1
|
||||||
|
+ PRINT 10, A
|
||||||
|
+10 FORMAT( I5,)
|
||||||
|
+ END
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/dec_format_empty_item_3.f b/gcc/testsuite/gfortran.dg/dec_format_empty_item_3.f
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..499db922876
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/dec_format_empty_item_3.f
|
||||||
|
@@ -0,0 +1,19 @@
|
||||||
|
+! { dg-do compile }
|
||||||
|
+! { dg-options "-fdec -fno-dec-blank-format-item" }
|
||||||
|
+!
|
||||||
|
+! Test blank/empty format items in format string
|
||||||
|
+!
|
||||||
|
+! Test case contributed by Jim MacArthur <jim.macarthur@codethink.co.uk>
|
||||||
|
+! Modified by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+!
|
||||||
|
+ PROGRAM blank_format_items
|
||||||
|
+ INTEGER A/0/
|
||||||
|
+
|
||||||
|
+ OPEN(1, status="scratch")
|
||||||
|
+ WRITE(1, 10) 100 ! { dg-error "FORMAT label 10 at \\(1\\) not defined" }
|
||||||
|
+ REWIND(1)
|
||||||
|
+ READ(1, 10) A ! { dg-error "FORMAT label 10 at \\(1\\) not defined" }
|
||||||
|
+ IF (a.NE.100) STOP 1
|
||||||
|
+ PRINT 10, A ! { dg-error "FORMAT label 10 at \\(1\\) not defined" }
|
||||||
|
+10 FORMAT( I5,) ! { dg-error "Unexpected element" }
|
||||||
|
+ END
|
||||||
|
--
|
||||||
|
2.11.0
|
||||||
|
|
@ -0,0 +1,78 @@
|
|||||||
|
From d15e5e207e2a6b46edee2f2b5d3e4c1cc7cdb80f Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jim MacArthur <jim.macarthur@codethink.co.uk>
|
||||||
|
Date: Mon, 5 Oct 2015 13:45:15 +0100
|
||||||
|
Subject: [PATCH 07/16] Allow more than one character as argument to ICHAR
|
||||||
|
|
||||||
|
Use -fdec to enable..
|
||||||
|
---
|
||||||
|
gcc/fortran/check.c | 2 +-
|
||||||
|
gcc/fortran/simplify.c | 4 ++--
|
||||||
|
gcc/testsuite/gfortran.dg/dec_ichar_with_string_1.f | 21 +++++++++++++++++++++
|
||||||
|
3 files changed, 24 insertions(+), 3 deletions(-)
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/dec_ichar_with_string_1.f
|
||||||
|
|
||||||
|
diff --git a/gcc/fortran/check.c b/gcc/fortran/check.c
|
||||||
|
index a04f0d66655..0ba4d0a031f 100644
|
||||||
|
--- a/gcc/fortran/check.c
|
||||||
|
+++ b/gcc/fortran/check.c
|
||||||
|
@@ -2603,7 +2603,7 @@ gfc_check_ichar_iachar (gfc_expr *c, gfc_expr *kind)
|
||||||
|
else
|
||||||
|
return true;
|
||||||
|
|
||||||
|
- if (i != 1)
|
||||||
|
+ if (i != 1 && !flag_dec)
|
||||||
|
{
|
||||||
|
gfc_error ("Argument of %s at %L must be of length one",
|
||||||
|
gfc_current_intrinsic, &c->where);
|
||||||
|
diff --git a/gcc/fortran/simplify.c b/gcc/fortran/simplify.c
|
||||||
|
index 7d7e3f22f73..7aff256c6b3 100644
|
||||||
|
--- a/gcc/fortran/simplify.c
|
||||||
|
+++ b/gcc/fortran/simplify.c
|
||||||
|
@@ -3229,7 +3229,7 @@ gfc_simplify_iachar (gfc_expr *e, gfc_expr *kind)
|
||||||
|
if (e->expr_type != EXPR_CONSTANT)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
- if (e->value.character.length != 1)
|
||||||
|
+ if (e->value.character.length != 1 && !flag_dec)
|
||||||
|
{
|
||||||
|
gfc_error ("Argument of IACHAR at %L must be of length one", &e->where);
|
||||||
|
return &gfc_bad_expr;
|
||||||
|
@@ -3427,7 +3427,7 @@ gfc_simplify_ichar (gfc_expr *e, gfc_expr *kind)
|
||||||
|
if (e->expr_type != EXPR_CONSTANT)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
- if (e->value.character.length != 1)
|
||||||
|
+ if (e->value.character.length != 1 && !flag_dec)
|
||||||
|
{
|
||||||
|
gfc_error ("Argument of ICHAR at %L must be of length one", &e->where);
|
||||||
|
return &gfc_bad_expr;
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/dec_ichar_with_string_1.f b/gcc/testsuite/gfortran.dg/dec_ichar_with_string_1.f
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..85efccecc0f
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/dec_ichar_with_string_1.f
|
||||||
|
@@ -0,0 +1,21 @@
|
||||||
|
+! { dg-do run }
|
||||||
|
+! { dg-options "-fdec" }
|
||||||
|
+!
|
||||||
|
+! Test ICHAR and IACHAR with more than one character as argument
|
||||||
|
+!
|
||||||
|
+! Test case contributed by Jim MacArthur <jim.macarthur@codethink.co.uk>
|
||||||
|
+! Modified by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+!
|
||||||
|
+ PROGRAM ichar_more_than_one_character
|
||||||
|
+ CHARACTER*4 st/'Test'/
|
||||||
|
+ INTEGER i
|
||||||
|
+
|
||||||
|
+ i = ICHAR(st)
|
||||||
|
+ if (i.NE.84) STOP 1
|
||||||
|
+ i = IACHAR(st)
|
||||||
|
+ if (i.NE.84) STOP 2
|
||||||
|
+ i = ICHAR('Test')
|
||||||
|
+ if (i.NE.84) STOP 3
|
||||||
|
+ i = IACHAR('Test')
|
||||||
|
+ if (i.NE.84) STOP 4
|
||||||
|
+ END
|
||||||
|
--
|
||||||
|
2.11.0
|
||||||
|
|
158
SOURCES/0008-Allow-non-integer-substring-indexes.patch
Normal file
158
SOURCES/0008-Allow-non-integer-substring-indexes.patch
Normal file
@ -0,0 +1,158 @@
|
|||||||
|
From 96563a652406d3c8471d75e6527ba634fa013400 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jim MacArthur <jim.macarthur@codethink.co.uk>
|
||||||
|
Date: Mon, 5 Oct 2015 14:05:03 +0100
|
||||||
|
Subject: [PATCH 08/16] Allow non-integer substring indexes
|
||||||
|
|
||||||
|
Use -fdec-non-integer-index compiler flag to enable. Also enabled by -fdec.
|
||||||
|
---
|
||||||
|
gcc/fortran/lang.opt | 4 ++++
|
||||||
|
gcc/fortran/options.c | 1 +
|
||||||
|
gcc/fortran/resolve.c | 20 ++++++++++++++++++++
|
||||||
|
.../dec_not_integer_substring_indexes_1.f | 18 ++++++++++++++++++
|
||||||
|
.../dec_not_integer_substring_indexes_2.f | 18 ++++++++++++++++++
|
||||||
|
.../dec_not_integer_substring_indexes_3.f | 18 ++++++++++++++++++
|
||||||
|
6 files changed, 79 insertions(+)
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/dec_not_integer_substring_indexes_1.f
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/dec_not_integer_substring_indexes_2.f
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/dec_not_integer_substring_indexes_3.f
|
||||||
|
|
||||||
|
diff --git a/gcc/fortran/lang.opt b/gcc/fortran/lang.opt
|
||||||
|
index 3d8aaeaaf44..772cf5e81f1 100644
|
||||||
|
--- a/gcc/fortran/lang.opt
|
||||||
|
+++ b/gcc/fortran/lang.opt
|
||||||
|
@@ -474,6 +474,10 @@ fdec-math
|
||||||
|
Fortran Var(flag_dec_math)
|
||||||
|
Enable legacy math intrinsics for compatibility.
|
||||||
|
|
||||||
|
+fdec-non-integer-index
|
||||||
|
+Fortran Var(flag_dec_non_integer_index)
|
||||||
|
+Enable support for non-integer substring indexes.
|
||||||
|
+
|
||||||
|
fdec-structure
|
||||||
|
Fortran Var(flag_dec_structure)
|
||||||
|
Enable support for DEC STRUCTURE/RECORD.
|
||||||
|
diff --git a/gcc/fortran/options.c b/gcc/fortran/options.c
|
||||||
|
index a8c2cf71c3b..e0ef03e6cc5 100644
|
||||||
|
--- a/gcc/fortran/options.c
|
||||||
|
+++ b/gcc/fortran/options.c
|
||||||
|
@@ -79,6 +79,7 @@ set_dec_flags (int value)
|
||||||
|
SET_BITFLAG (flag_dec_char_conversions, value, value);
|
||||||
|
SET_BITFLAG (flag_dec_comparisons, value, value);
|
||||||
|
SET_BITFLAG (flag_dec_blank_format_item, value, value);
|
||||||
|
+ SET_BITFLAG (flag_dec_non_integer_index, value, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Finalize DEC flags. */
|
||||||
|
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
|
||||||
|
index c8b6333874b..04679d3a15d 100644
|
||||||
|
--- a/gcc/fortran/resolve.c
|
||||||
|
+++ b/gcc/fortran/resolve.c
|
||||||
|
@@ -4992,6 +4992,16 @@ resolve_substring (gfc_ref *ref, bool *equal_length)
|
||||||
|
if (!gfc_resolve_expr (ref->u.ss.start))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
+ /* In legacy mode, allow non-integer string indexes by converting */
|
||||||
|
+ if (flag_dec_non_integer_index && ref->u.ss.start->ts.type != BT_INTEGER
|
||||||
|
+ && gfc_numeric_ts (&ref->u.ss.start->ts))
|
||||||
|
+ {
|
||||||
|
+ gfc_typespec t;
|
||||||
|
+ t.type = BT_INTEGER;
|
||||||
|
+ t.kind = ref->u.ss.start->ts.kind;
|
||||||
|
+ gfc_convert_type_warn (ref->u.ss.start, &t, 2, 1);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (ref->u.ss.start->ts.type != BT_INTEGER)
|
||||||
|
{
|
||||||
|
gfc_error ("Substring start index at %L must be of type INTEGER",
|
||||||
|
@@ -5021,6 +5031,16 @@ resolve_substring (gfc_ref *ref, bool *equal_length)
|
||||||
|
if (!gfc_resolve_expr (ref->u.ss.end))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
+ /* Non-integer string index endings, as for start */
|
||||||
|
+ if (flag_dec_non_integer_index && ref->u.ss.end->ts.type != BT_INTEGER
|
||||||
|
+ && gfc_numeric_ts (&ref->u.ss.end->ts))
|
||||||
|
+ {
|
||||||
|
+ gfc_typespec t;
|
||||||
|
+ t.type = BT_INTEGER;
|
||||||
|
+ t.kind = ref->u.ss.end->ts.kind;
|
||||||
|
+ gfc_convert_type_warn (ref->u.ss.end, &t, 2, 1);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (ref->u.ss.end->ts.type != BT_INTEGER)
|
||||||
|
{
|
||||||
|
gfc_error ("Substring end index at %L must be of type INTEGER",
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/dec_not_integer_substring_indexes_1.f b/gcc/testsuite/gfortran.dg/dec_not_integer_substring_indexes_1.f
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..0be28abaa4b
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/dec_not_integer_substring_indexes_1.f
|
||||||
|
@@ -0,0 +1,18 @@
|
||||||
|
+! { dg-do run }
|
||||||
|
+! { dg-options "-fdec" }
|
||||||
|
+!
|
||||||
|
+! Test not integer substring indexes
|
||||||
|
+!
|
||||||
|
+! Test case contributed by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+!
|
||||||
|
+ PROGRAM not_integer_substring_indexes
|
||||||
|
+ CHARACTER*5 st/'Tests'/
|
||||||
|
+ REAL ir/1.0/
|
||||||
|
+ REAL ir2/4.0/
|
||||||
|
+
|
||||||
|
+ if (st(ir:4).ne.'Test') stop 1
|
||||||
|
+ if (st(1:ir2).ne.'Test') stop 2
|
||||||
|
+ if (st(1.0:4).ne.'Test') stop 3
|
||||||
|
+ if (st(1:4.0).ne.'Test') stop 4
|
||||||
|
+ if (st(2.5:4).ne.'est') stop 5
|
||||||
|
+ END
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/dec_not_integer_substring_indexes_2.f b/gcc/testsuite/gfortran.dg/dec_not_integer_substring_indexes_2.f
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..3cf05296d0c
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/dec_not_integer_substring_indexes_2.f
|
||||||
|
@@ -0,0 +1,18 @@
|
||||||
|
+! { dg-do run }
|
||||||
|
+! { dg-options "-fdec-non-integer-index" }
|
||||||
|
+!
|
||||||
|
+! Test not integer substring indexes
|
||||||
|
+!
|
||||||
|
+! Test case contributed by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+!
|
||||||
|
+ PROGRAM not_integer_substring_indexes
|
||||||
|
+ CHARACTER*5 st/'Tests'/
|
||||||
|
+ REAL ir/1.0/
|
||||||
|
+ REAL ir2/4.0/
|
||||||
|
+
|
||||||
|
+ if (st(ir:4).ne.'Test') stop 1
|
||||||
|
+ if (st(1:ir2).ne.'Test') stop 2
|
||||||
|
+ if (st(1.0:4).ne.'Test') stop 3
|
||||||
|
+ if (st(1:4.0).ne.'Test') stop 4
|
||||||
|
+ if (st(2.5:4).ne.'est') stop 5
|
||||||
|
+ END
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/dec_not_integer_substring_indexes_3.f b/gcc/testsuite/gfortran.dg/dec_not_integer_substring_indexes_3.f
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..703de995897
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/dec_not_integer_substring_indexes_3.f
|
||||||
|
@@ -0,0 +1,18 @@
|
||||||
|
+! { dg-do compile }
|
||||||
|
+! { dg-options "-fdec -fno-dec-non-integer-index" }
|
||||||
|
+!
|
||||||
|
+! Test not integer substring indexes
|
||||||
|
+!
|
||||||
|
+! Test case contributed by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+!
|
||||||
|
+ PROGRAM not_integer_substring_indexes
|
||||||
|
+ CHARACTER*5 st/'Tests'/
|
||||||
|
+ REAL ir/1.0/
|
||||||
|
+ REAL ir2/4.0/
|
||||||
|
+
|
||||||
|
+ if (st(ir:4).ne.'Test') stop 1 ! { dg-error "Substring start index" }
|
||||||
|
+ if (st(1:ir2).ne.'Test') stop 2 ! { dg-error "Substring end index" }
|
||||||
|
+ if (st(1.0:4).ne.'Test') stop 3 ! { dg-error "Substring start index" }
|
||||||
|
+ if (st(1:4.0).ne.'Test') stop 4 ! { dg-error "Substring end index" }
|
||||||
|
+ if (st(2.5:4).ne.'est') stop 5 ! { dg-error "Substring start index" }
|
||||||
|
+ END
|
||||||
|
--
|
||||||
|
2.11.0
|
||||||
|
|
185
SOURCES/0009-Allow-old-style-initializers-in-derived-types.patch
Normal file
185
SOURCES/0009-Allow-old-style-initializers-in-derived-types.patch
Normal file
@ -0,0 +1,185 @@
|
|||||||
|
From 772fea9acdac79164f3496f54ef4f63dd2562a0c Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jim MacArthur <jim.macarthur@codethink.co.uk>
|
||||||
|
Date: Thu, 4 Feb 2016 16:00:30 +0000
|
||||||
|
Subject: [PATCH 09/16] Allow old-style initializers in derived types
|
||||||
|
|
||||||
|
This allows simple declarations in derived types and structures, such as:
|
||||||
|
LOGICAL*1 NIL /0/
|
||||||
|
Only single value expressions are allowed at the moment.
|
||||||
|
|
||||||
|
Use -fdec-old-init to enable. Also enabled by -fdec.
|
||||||
|
---
|
||||||
|
gcc/fortran/decl.c | 27 ++++++++++++++++++----
|
||||||
|
gcc/fortran/lang.opt | 4 ++++
|
||||||
|
gcc/fortran/options.c | 1 +
|
||||||
|
.../dec_derived_types_initialised_old_style_1.f | 25 ++++++++++++++++++++
|
||||||
|
.../dec_derived_types_initialised_old_style_2.f | 25 ++++++++++++++++++++
|
||||||
|
.../dec_derived_types_initialised_old_style_3.f | 26 +++++++++++++++++++++
|
||||||
|
6 files changed, 103 insertions(+), 5 deletions(-)
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/dec_derived_types_initialised_old_style_1.f
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/dec_derived_types_initialised_old_style_2.f
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/dec_derived_types_initialised_old_style_3.f
|
||||||
|
|
||||||
|
diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c
|
||||||
|
index 66f1094aa3d..cdf161a7efa 100644
|
||||||
|
--- a/gcc/fortran/decl.c
|
||||||
|
+++ b/gcc/fortran/decl.c
|
||||||
|
@@ -2739,12 +2739,29 @@ variable_decl (int elem)
|
||||||
|
but not components of derived types. */
|
||||||
|
else if (gfc_current_state () == COMP_DERIVED)
|
||||||
|
{
|
||||||
|
- gfc_error ("Invalid old style initialization for derived type "
|
||||||
|
- "component at %C");
|
||||||
|
- m = MATCH_ERROR;
|
||||||
|
- goto cleanup;
|
||||||
|
+ if (flag_dec_old_init)
|
||||||
|
+ {
|
||||||
|
+ /* Attempt to match an old-style initializer which is a simple
|
||||||
|
+ integer or character expression; this will not work with
|
||||||
|
+ multiple values. */
|
||||||
|
+ m = gfc_match_init_expr (&initializer);
|
||||||
|
+ if (m == MATCH_ERROR)
|
||||||
|
+ goto cleanup;
|
||||||
|
+ else if (m == MATCH_YES)
|
||||||
|
+ {
|
||||||
|
+ m = gfc_match ("/");
|
||||||
|
+ if (m != MATCH_YES)
|
||||||
|
+ goto cleanup;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ gfc_error ("Invalid old style initialization for derived type "
|
||||||
|
+ "component at %C");
|
||||||
|
+ m = MATCH_ERROR;
|
||||||
|
+ goto cleanup;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
-
|
||||||
|
/* For structure components, read the initializer as a special
|
||||||
|
expression and let the rest of this function apply the initializer
|
||||||
|
as usual. */
|
||||||
|
diff --git a/gcc/fortran/lang.opt b/gcc/fortran/lang.opt
|
||||||
|
index 772cf5e81f1..610d91b6cfd 100644
|
||||||
|
--- a/gcc/fortran/lang.opt
|
||||||
|
+++ b/gcc/fortran/lang.opt
|
||||||
|
@@ -478,6 +478,10 @@ fdec-non-integer-index
|
||||||
|
Fortran Var(flag_dec_non_integer_index)
|
||||||
|
Enable support for non-integer substring indexes.
|
||||||
|
|
||||||
|
+fdec-old-init
|
||||||
|
+Fortran Var(flag_dec_old_init)
|
||||||
|
+Enable support for old style initializers in derived types.
|
||||||
|
+
|
||||||
|
fdec-structure
|
||||||
|
Fortran Var(flag_dec_structure)
|
||||||
|
Enable support for DEC STRUCTURE/RECORD.
|
||||||
|
diff --git a/gcc/fortran/options.c b/gcc/fortran/options.c
|
||||||
|
index e0ef03e6cc5..0aa16825980 100644
|
||||||
|
--- a/gcc/fortran/options.c
|
||||||
|
+++ b/gcc/fortran/options.c
|
||||||
|
@@ -80,6 +80,7 @@ set_dec_flags (int value)
|
||||||
|
SET_BITFLAG (flag_dec_comparisons, value, value);
|
||||||
|
SET_BITFLAG (flag_dec_blank_format_item, value, value);
|
||||||
|
SET_BITFLAG (flag_dec_non_integer_index, value, value);
|
||||||
|
+ SET_BITFLAG (flag_dec_old_init, value, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Finalize DEC flags. */
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/dec_derived_types_initialised_old_style_1.f b/gcc/testsuite/gfortran.dg/dec_derived_types_initialised_old_style_1.f
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..eac4f9bfcf1
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/dec_derived_types_initialised_old_style_1.f
|
||||||
|
@@ -0,0 +1,25 @@
|
||||||
|
+! { dg-do run }
|
||||||
|
+! { dg-options "-fdec" }
|
||||||
|
+!
|
||||||
|
+! Test old style initializers in derived types
|
||||||
|
+!
|
||||||
|
+! Contributed by Jim MacArthur <jim.macarthur@codethink.co.uk>
|
||||||
|
+! Modified by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+!
|
||||||
|
+ PROGRAM spec_in_var
|
||||||
|
+ TYPE STRUCT1
|
||||||
|
+ INTEGER*4 ID /8/
|
||||||
|
+ INTEGER*4 TYPE /5/
|
||||||
|
+ INTEGER*8 DEFVAL /0/
|
||||||
|
+ CHARACTER*(5) NAME /'tests'/
|
||||||
|
+ LOGICAL*1 NIL /0/
|
||||||
|
+ END TYPE STRUCT1
|
||||||
|
+
|
||||||
|
+ TYPE (STRUCT1) SINST
|
||||||
|
+
|
||||||
|
+ IF(SINST%ID.NE.8) STOP 1
|
||||||
|
+ IF(SINST%TYPE.NE.5) STOP 2
|
||||||
|
+ IF(SINST%DEFVAL.NE.0) STOP 3
|
||||||
|
+ IF(SINST%NAME.NE.'tests') STOP 4
|
||||||
|
+ IF(SINST%NIL) STOP 5
|
||||||
|
+ END
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/dec_derived_types_initialised_old_style_2.f b/gcc/testsuite/gfortran.dg/dec_derived_types_initialised_old_style_2.f
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..d904c8b2974
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/dec_derived_types_initialised_old_style_2.f
|
||||||
|
@@ -0,0 +1,25 @@
|
||||||
|
+! { dg-do run }
|
||||||
|
+! { dg-options "-std=legacy -fdec-old-init" }
|
||||||
|
+!
|
||||||
|
+! Test old style initializers in derived types
|
||||||
|
+!
|
||||||
|
+! Contributed by Jim MacArthur <jim.macarthur@codethink.co.uk>
|
||||||
|
+! Modified by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+!
|
||||||
|
+ PROGRAM spec_in_var
|
||||||
|
+ TYPE STRUCT1
|
||||||
|
+ INTEGER*4 ID /8/
|
||||||
|
+ INTEGER*4 TYPE /5/
|
||||||
|
+ INTEGER*8 DEFVAL /0/
|
||||||
|
+ CHARACTER*(5) NAME /'tests'/
|
||||||
|
+ LOGICAL*1 NIL /0/
|
||||||
|
+ END TYPE STRUCT1
|
||||||
|
+
|
||||||
|
+ TYPE (STRUCT1) SINST
|
||||||
|
+
|
||||||
|
+ IF(SINST%ID.NE.8) STOP 1
|
||||||
|
+ IF(SINST%TYPE.NE.5) STOP 2
|
||||||
|
+ IF(SINST%DEFVAL.NE.0) STOP 3
|
||||||
|
+ IF(SINST%NAME.NE.'tests') STOP 4
|
||||||
|
+ IF(SINST%NIL) STOP 5
|
||||||
|
+ END
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/dec_derived_types_initialised_old_style_3.f b/gcc/testsuite/gfortran.dg/dec_derived_types_initialised_old_style_3.f
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..58c2b4b66cf
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/dec_derived_types_initialised_old_style_3.f
|
||||||
|
@@ -0,0 +1,26 @@
|
||||||
|
+! { dg-do compile }
|
||||||
|
+! { dg-options "-std=legacy -fdec -fno-dec-old-init" }
|
||||||
|
+!
|
||||||
|
+! Test old style initializers in derived types
|
||||||
|
+!
|
||||||
|
+! Contributed by Jim MacArthur <jim.macarthur@codethink.co.uk>
|
||||||
|
+! Modified by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+!
|
||||||
|
+
|
||||||
|
+ PROGRAM spec_in_var
|
||||||
|
+ TYPE STRUCT1
|
||||||
|
+ INTEGER*4 ID /8/ ! { dg-error "Invalid old style initialization" }
|
||||||
|
+ INTEGER*4 TYPE /5/ ! { dg-error "Invalid old style initialization" }
|
||||||
|
+ INTEGER*8 DEFVAL /0/ ! { dg-error "Invalid old style initialization" }
|
||||||
|
+ CHARACTER*(5) NAME /'tests'/ ! { dg-error "Invalid old style initialization" }
|
||||||
|
+ LOGICAL*1 NIL /0/ ! { dg-error "Invalid old style initialization" }
|
||||||
|
+ END TYPE STRUCT1
|
||||||
|
+
|
||||||
|
+ TYPE (STRUCT1) SINST
|
||||||
|
+
|
||||||
|
+ IF(SINST%ID.NE.8) STOP 1 ! { dg-error "'id' at \\(1\\) is not a member" }
|
||||||
|
+ IF(SINST%TYPE.NE.5) STOP 2 ! { dg-error "'type' at \\(1\\) is not a member" }
|
||||||
|
+ IF(SINST%DEFVAL.NE.0) STOP 3 ! { dg-error "'defval' at \\(1\\) is not a member" }
|
||||||
|
+ IF(SINST%NAME.NE.'tests') STOP 4 ! { dg-error "'name' at \\(1\\) is not a member" }
|
||||||
|
+ IF(SINST%NIL) STOP 5 ! { dg-error "'nil' at \\(1\\) is not a member" }
|
||||||
|
+ END
|
||||||
|
--
|
||||||
|
2.11.0
|
||||||
|
|
@ -0,0 +1,587 @@
|
|||||||
|
From 08e63b85674f146b5f242906d7d5f063b2abd31c Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jim MacArthur <jim.macarthur@codethink.co.uk>
|
||||||
|
Date: Wed, 7 Oct 2015 17:04:06 -0400
|
||||||
|
Subject: [PATCH 10/16] Allow string length and kind to be specified on a per
|
||||||
|
variable basis.
|
||||||
|
|
||||||
|
This allows kind/length to be mixed with array specification in
|
||||||
|
declarations.
|
||||||
|
|
||||||
|
e.g.
|
||||||
|
|
||||||
|
INTEGER*4 x*2, y*8
|
||||||
|
CHARACTER names*20(10)
|
||||||
|
REAL v(100)*8, vv*4(50)
|
||||||
|
|
||||||
|
The per-variable size overrides the kind or length specified for the type.
|
||||||
|
|
||||||
|
Use -fdec-override-kind to enable. Also enabled by -fdec.
|
||||||
|
|
||||||
|
Note: this feature is a merger of two previously separate features.
|
||||||
|
|
||||||
|
Now accepts named constants as kind parameters:
|
||||||
|
|
||||||
|
INTEGER A
|
||||||
|
PARAMETER (A=2)
|
||||||
|
INTEGER B*(A)
|
||||||
|
|
||||||
|
Contributed by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
|
||||||
|
Now rejects invalid kind parameters and prints error messages:
|
||||||
|
|
||||||
|
INTEGER X*3
|
||||||
|
|
||||||
|
caused an internal compiler error.
|
||||||
|
|
||||||
|
Contributed by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
---
|
||||||
|
gcc/fortran/decl.c | 156 ++++++++++++++++-----
|
||||||
|
gcc/fortran/lang.opt | 4 +
|
||||||
|
gcc/fortran/options.c | 1 +
|
||||||
|
.../dec_mixed_char_array_declaration_1.f | 13 ++
|
||||||
|
.../dec_mixed_char_array_declaration_2.f | 13 ++
|
||||||
|
.../dec_mixed_char_array_declaration_3.f | 13 ++
|
||||||
|
gcc/testsuite/gfortran.dg/dec_spec_in_variable_1.f | 31 ++++
|
||||||
|
gcc/testsuite/gfortran.dg/dec_spec_in_variable_2.f | 31 ++++
|
||||||
|
gcc/testsuite/gfortran.dg/dec_spec_in_variable_3.f | 31 ++++
|
||||||
|
gcc/testsuite/gfortran.dg/dec_spec_in_variable_4.f | 14 ++
|
||||||
|
gcc/testsuite/gfortran.dg/dec_spec_in_variable_5.f | 19 +++
|
||||||
|
gcc/testsuite/gfortran.dg/dec_spec_in_variable_6.f | 19 +++
|
||||||
|
gcc/testsuite/gfortran.dg/dec_spec_in_variable_7.f | 15 ++
|
||||||
|
gcc/testsuite/gfortran.dg/dec_spec_in_variable_8.f | 14 ++
|
||||||
|
14 files changed, 340 insertions(+), 34 deletions(-)
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/dec_mixed_char_array_declaration_1.f
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/dec_mixed_char_array_declaration_2.f
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/dec_mixed_char_array_declaration_3.f
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/dec_spec_in_variable_1.f
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/dec_spec_in_variable_2.f
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/dec_spec_in_variable_3.f
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/dec_spec_in_variable_4.f
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/dec_spec_in_variable_5.f
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/dec_spec_in_variable_6.f
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/dec_spec_in_variable_7.f
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/dec_spec_in_variable_8.f
|
||||||
|
|
||||||
|
diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c
|
||||||
|
index cdf161a7efa..eb26bf3bc2d 100644
|
||||||
|
--- a/gcc/fortran/decl.c
|
||||||
|
+++ b/gcc/fortran/decl.c
|
||||||
|
@@ -1153,6 +1153,54 @@ syntax:
|
||||||
|
return MATCH_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
+/* This matches the nonstandard kind given after a variable name, like:
|
||||||
|
+ INTEGER x*2, y*4
|
||||||
|
+ The per-variable kind will override any kind given in the type
|
||||||
|
+ declaration.
|
||||||
|
+*/
|
||||||
|
+
|
||||||
|
+static match
|
||||||
|
+match_per_symbol_kind (int *length)
|
||||||
|
+{
|
||||||
|
+ match m;
|
||||||
|
+ gfc_expr *expr = NULL;
|
||||||
|
+
|
||||||
|
+ m = gfc_match_char ('*');
|
||||||
|
+ if (m != MATCH_YES)
|
||||||
|
+ return m;
|
||||||
|
+
|
||||||
|
+ m = gfc_match_small_literal_int (length, NULL);
|
||||||
|
+ if (m == MATCH_YES || m == MATCH_ERROR)
|
||||||
|
+ return m;
|
||||||
|
+
|
||||||
|
+ if (gfc_match_char ('(') == MATCH_NO)
|
||||||
|
+ return MATCH_ERROR;
|
||||||
|
+
|
||||||
|
+ m = gfc_match_expr (&expr);
|
||||||
|
+ if (m == MATCH_YES)
|
||||||
|
+ {
|
||||||
|
+ m = MATCH_ERROR; // Assume error
|
||||||
|
+ if (gfc_expr_check_typed (expr, gfc_current_ns, false))
|
||||||
|
+ {
|
||||||
|
+ if ((expr->expr_type == EXPR_CONSTANT)
|
||||||
|
+ && (expr->ts.type == BT_INTEGER))
|
||||||
|
+ {
|
||||||
|
+ *length = mpz_get_si(expr->value.integer);
|
||||||
|
+ m = MATCH_YES;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (m == MATCH_YES)
|
||||||
|
+ {
|
||||||
|
+ if (gfc_match_char (')') == MATCH_NO)
|
||||||
|
+ m = MATCH_ERROR;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (expr != NULL)
|
||||||
|
+ gfc_free_expr (expr);
|
||||||
|
+ return m;
|
||||||
|
+}
|
||||||
|
|
||||||
|
/* Special subroutine for finding a symbol. Check if the name is found
|
||||||
|
in the current name space. If not, and we're compiling a function or
|
||||||
|
@@ -2390,6 +2438,35 @@ check_function_name (char *name)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
+static match
|
||||||
|
+match_character_length_clause (gfc_charlen **cl, bool *cl_deferred, int elem)
|
||||||
|
+{
|
||||||
|
+ gfc_expr* char_len;
|
||||||
|
+ char_len = NULL;
|
||||||
|
+
|
||||||
|
+ match m = match_char_length (&char_len, cl_deferred, false);
|
||||||
|
+ if (m == MATCH_YES)
|
||||||
|
+ {
|
||||||
|
+ *cl = gfc_new_charlen (gfc_current_ns, NULL);
|
||||||
|
+ (*cl)->length = char_len;
|
||||||
|
+ }
|
||||||
|
+ else if (m == MATCH_NO)
|
||||||
|
+ {
|
||||||
|
+ if (elem > 1
|
||||||
|
+ && (current_ts.u.cl->length == NULL
|
||||||
|
+ || current_ts.u.cl->length->expr_type != EXPR_CONSTANT))
|
||||||
|
+ {
|
||||||
|
+ *cl = gfc_new_charlen (gfc_current_ns, NULL);
|
||||||
|
+ (*cl)->length = gfc_copy_expr (current_ts.u.cl->length);
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ *cl = current_ts.u.cl;
|
||||||
|
+
|
||||||
|
+ *cl_deferred = current_ts.deferred;
|
||||||
|
+ }
|
||||||
|
+ return m;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/* Match a variable name with an optional initializer. When this
|
||||||
|
subroutine is called, a variable is expected to be parsed next.
|
||||||
|
Depending on what is happening at the moment, updates either the
|
||||||
|
@@ -2400,7 +2477,7 @@ variable_decl (int elem)
|
||||||
|
{
|
||||||
|
char name[GFC_MAX_SYMBOL_LEN + 1];
|
||||||
|
static unsigned int fill_id = 0;
|
||||||
|
- gfc_expr *initializer, *char_len;
|
||||||
|
+ gfc_expr *initializer;
|
||||||
|
gfc_array_spec *as;
|
||||||
|
gfc_array_spec *cp_as; /* Extra copy for Cray Pointees. */
|
||||||
|
gfc_charlen *cl;
|
||||||
|
@@ -2409,10 +2486,14 @@ variable_decl (int elem)
|
||||||
|
match m;
|
||||||
|
bool t;
|
||||||
|
gfc_symbol *sym;
|
||||||
|
+ match cl_match;
|
||||||
|
+ match kind_match;
|
||||||
|
+ int overridden_kind;
|
||||||
|
|
||||||
|
initializer = NULL;
|
||||||
|
as = NULL;
|
||||||
|
cp_as = NULL;
|
||||||
|
+ kind_match = MATCH_NO;
|
||||||
|
|
||||||
|
/* When we get here, we've just matched a list of attributes and
|
||||||
|
maybe a type and a double colon. The next thing we expect to see
|
||||||
|
@@ -2461,6 +2542,28 @@ variable_decl (int elem)
|
||||||
|
|
||||||
|
var_locus = gfc_current_locus;
|
||||||
|
|
||||||
|
+
|
||||||
|
+ cl = NULL;
|
||||||
|
+ cl_deferred = false;
|
||||||
|
+ cl_match = MATCH_NO;
|
||||||
|
+
|
||||||
|
+ /* Check for a character length clause before an array clause */
|
||||||
|
+ if (flag_dec_override_kind)
|
||||||
|
+ {
|
||||||
|
+ if (current_ts.type == BT_CHARACTER)
|
||||||
|
+ {
|
||||||
|
+ cl_match = match_character_length_clause (&cl, &cl_deferred, elem);
|
||||||
|
+ if (cl_match == MATCH_ERROR)
|
||||||
|
+ goto cleanup;
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ kind_match = match_per_symbol_kind (&overridden_kind);
|
||||||
|
+ if (kind_match == MATCH_ERROR)
|
||||||
|
+ goto cleanup;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
/* Now we could see the optional array spec. or character length. */
|
||||||
|
m = gfc_match_array_spec (&as, true, true);
|
||||||
|
if (m == MATCH_ERROR)
|
||||||
|
@@ -2579,40 +2682,12 @@ variable_decl (int elem)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- char_len = NULL;
|
||||||
|
- cl = NULL;
|
||||||
|
- cl_deferred = false;
|
||||||
|
-
|
||||||
|
- if (current_ts.type == BT_CHARACTER)
|
||||||
|
+ /* Second chance for a character length clause */
|
||||||
|
+ if (cl_match == MATCH_NO && current_ts.type == BT_CHARACTER)
|
||||||
|
{
|
||||||
|
- switch (match_char_length (&char_len, &cl_deferred, false))
|
||||||
|
- {
|
||||||
|
- case MATCH_YES:
|
||||||
|
- cl = gfc_new_charlen (gfc_current_ns, NULL);
|
||||||
|
-
|
||||||
|
- cl->length = char_len;
|
||||||
|
- break;
|
||||||
|
-
|
||||||
|
- /* Non-constant lengths need to be copied after the first
|
||||||
|
- element. Also copy assumed lengths. */
|
||||||
|
- case MATCH_NO:
|
||||||
|
- if (elem > 1
|
||||||
|
- && (current_ts.u.cl->length == NULL
|
||||||
|
- || current_ts.u.cl->length->expr_type != EXPR_CONSTANT))
|
||||||
|
- {
|
||||||
|
- cl = gfc_new_charlen (gfc_current_ns, NULL);
|
||||||
|
- cl->length = gfc_copy_expr (current_ts.u.cl->length);
|
||||||
|
- }
|
||||||
|
- else
|
||||||
|
- cl = current_ts.u.cl;
|
||||||
|
-
|
||||||
|
- cl_deferred = current_ts.deferred;
|
||||||
|
-
|
||||||
|
- break;
|
||||||
|
-
|
||||||
|
- case MATCH_ERROR:
|
||||||
|
- goto cleanup;
|
||||||
|
- }
|
||||||
|
+ m = match_character_length_clause (&cl, &cl_deferred, elem);
|
||||||
|
+ if (m == MATCH_ERROR)
|
||||||
|
+ goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The dummy arguments and result of the abreviated form of MODULE
|
||||||
|
@@ -2714,6 +2789,19 @@ variable_decl (int elem)
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (kind_match == MATCH_YES)
|
||||||
|
+ {
|
||||||
|
+ gfc_find_symbol (name, gfc_current_ns, 1, &sym);
|
||||||
|
+ /* sym *must* be found at this point */
|
||||||
|
+ sym->ts.kind = overridden_kind;
|
||||||
|
+ if (gfc_validate_kind (sym->ts.type, sym->ts.kind, true) < 0)
|
||||||
|
+ {
|
||||||
|
+ gfc_error ("Kind %d not supported for type %s at %C",
|
||||||
|
+ sym->ts.kind, gfc_basic_typename (sym->ts.type));
|
||||||
|
+ return MATCH_ERROR;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (!check_function_name (name))
|
||||||
|
{
|
||||||
|
m = MATCH_ERROR;
|
||||||
|
diff --git a/gcc/fortran/lang.opt b/gcc/fortran/lang.opt
|
||||||
|
index 610d91b6cfd..38d31e620bf 100644
|
||||||
|
--- a/gcc/fortran/lang.opt
|
||||||
|
+++ b/gcc/fortran/lang.opt
|
||||||
|
@@ -478,6 +478,10 @@ fdec-non-integer-index
|
||||||
|
Fortran Var(flag_dec_non_integer_index)
|
||||||
|
Enable support for non-integer substring indexes.
|
||||||
|
|
||||||
|
+fdec-override-kind
|
||||||
|
+Fortran Var(flag_dec_override_kind)
|
||||||
|
+Enable support for per variable kind specification.
|
||||||
|
+
|
||||||
|
fdec-old-init
|
||||||
|
Fortran Var(flag_dec_old_init)
|
||||||
|
Enable support for old style initializers in derived types.
|
||||||
|
diff --git a/gcc/fortran/options.c b/gcc/fortran/options.c
|
||||||
|
index 0aa16825980..720fd25b570 100644
|
||||||
|
--- a/gcc/fortran/options.c
|
||||||
|
+++ b/gcc/fortran/options.c
|
||||||
|
@@ -81,6 +81,7 @@ set_dec_flags (int value)
|
||||||
|
SET_BITFLAG (flag_dec_blank_format_item, value, value);
|
||||||
|
SET_BITFLAG (flag_dec_non_integer_index, value, value);
|
||||||
|
SET_BITFLAG (flag_dec_old_init, value, value);
|
||||||
|
+ SET_BITFLAG (flag_dec_override_kind, value, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Finalize DEC flags. */
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/dec_mixed_char_array_declaration_1.f b/gcc/testsuite/gfortran.dg/dec_mixed_char_array_declaration_1.f
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..706ea4112a4
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/dec_mixed_char_array_declaration_1.f
|
||||||
|
@@ -0,0 +1,13 @@
|
||||||
|
+! { dg-do run }
|
||||||
|
+! { dg-options "-fdec" }
|
||||||
|
+!
|
||||||
|
+! Test character declaration with mixed string length and array specification
|
||||||
|
+!
|
||||||
|
+! Contributed by Jim MacArthur <jim.macarthur@codethink.co.uk>
|
||||||
|
+! Modified by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+!
|
||||||
|
+ PROGRAM character_declaration
|
||||||
|
+ CHARACTER ASPEC_SLENGTH*2 (5) /'01','02','03','04','05'/
|
||||||
|
+ CHARACTER SLENGTH_ASPEC(5)*2 /'01','02','03','04','05'/
|
||||||
|
+ if (ASPEC_SLENGTH(3).NE.SLENGTH_ASPEC(3)) STOP 1
|
||||||
|
+ END
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/dec_mixed_char_array_declaration_2.f b/gcc/testsuite/gfortran.dg/dec_mixed_char_array_declaration_2.f
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..26d2acf01de
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/dec_mixed_char_array_declaration_2.f
|
||||||
|
@@ -0,0 +1,13 @@
|
||||||
|
+! { dg-do run }
|
||||||
|
+! { dg-options "-fdec-override-kind" }
|
||||||
|
+!
|
||||||
|
+! Test character declaration with mixed string length and array specification
|
||||||
|
+!
|
||||||
|
+! Contributed by Jim MacArthur <jim.macarthur@codethink.co.uk>
|
||||||
|
+! Modified by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+!
|
||||||
|
+ PROGRAM character_declaration
|
||||||
|
+ CHARACTER ASPEC_SLENGTH*2 (5) /'01','02','03','04','05'/
|
||||||
|
+ CHARACTER SLENGTH_ASPEC(5)*2 /'01','02','03','04','05'/
|
||||||
|
+ if (ASPEC_SLENGTH(3).NE.SLENGTH_ASPEC(3)) STOP 1
|
||||||
|
+ END
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/dec_mixed_char_array_declaration_3.f b/gcc/testsuite/gfortran.dg/dec_mixed_char_array_declaration_3.f
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..76e4f0bdb93
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/dec_mixed_char_array_declaration_3.f
|
||||||
|
@@ -0,0 +1,13 @@
|
||||||
|
+! { dg-do compile }
|
||||||
|
+! { dg-options "-fdec-override-kind -fno-dec-override-kind" }
|
||||||
|
+!
|
||||||
|
+! Test character declaration with mixed string length and array specification
|
||||||
|
+!
|
||||||
|
+! Contributed by Jim MacArthur <jim.macarthur@codethink.co.uk>
|
||||||
|
+! Modified by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+!
|
||||||
|
+ PROGRAM character_declaration
|
||||||
|
+ CHARACTER ASPEC_SLENGTH*2 (5) /'01','02','03','04','05'/ ! { dg-error "Syntax error" }
|
||||||
|
+ CHARACTER SLENGTH_ASPEC(5)*2 /'01','02','03','04','05'/
|
||||||
|
+ if (ASPEC_SLENGTH(3).NE.SLENGTH_ASPEC(3)) STOP 1 ! { dg-error " Operands of comparison operator" }
|
||||||
|
+ END
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/dec_spec_in_variable_1.f b/gcc/testsuite/gfortran.dg/dec_spec_in_variable_1.f
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..edd0f5874b7
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/dec_spec_in_variable_1.f
|
||||||
|
@@ -0,0 +1,31 @@
|
||||||
|
+! { dg-do run }
|
||||||
|
+! { dg-options "-fdec" }
|
||||||
|
+!
|
||||||
|
+! Test kind specification in variable not in type
|
||||||
|
+!
|
||||||
|
+! Contributed by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+!
|
||||||
|
+ program spec_in_var
|
||||||
|
+ integer*8 ai*1, bi*4, ci
|
||||||
|
+ real*4 ar*4, br*8, cr
|
||||||
|
+
|
||||||
|
+ ai = 1
|
||||||
|
+ ar = 1.0
|
||||||
|
+ bi = 2
|
||||||
|
+ br = 2.0
|
||||||
|
+ ci = 3
|
||||||
|
+ cr = 3.0
|
||||||
|
+
|
||||||
|
+ if (ai .ne. 1) stop 1
|
||||||
|
+ if (abs(ar - 1.0) > 1.0D-6) stop 2
|
||||||
|
+ if (bi .ne. 2) stop 3
|
||||||
|
+ if (abs(br - 2.0) > 1.0D-6) stop 4
|
||||||
|
+ if (ci .ne. 3) stop 5
|
||||||
|
+ if (abs(cr - 3.0) > 1.0D-6) stop 6
|
||||||
|
+ if (kind(ai) .ne. 1) stop 7
|
||||||
|
+ if (kind(ar) .ne. 4) stop 8
|
||||||
|
+ if (kind(bi) .ne. 4) stop 9
|
||||||
|
+ if (kind(br) .ne. 8) stop 10
|
||||||
|
+ if (kind(ci) .ne. 8) stop 11
|
||||||
|
+ if (kind(cr) .ne. 4) stop 12
|
||||||
|
+ end
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/dec_spec_in_variable_2.f b/gcc/testsuite/gfortran.dg/dec_spec_in_variable_2.f
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..bfaba584dbb
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/dec_spec_in_variable_2.f
|
||||||
|
@@ -0,0 +1,31 @@
|
||||||
|
+! { dg-do run }
|
||||||
|
+! { dg-options "-fdec-override-kind" }
|
||||||
|
+!
|
||||||
|
+! Test kind specification in variable not in type
|
||||||
|
+!
|
||||||
|
+! Contributed by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+!
|
||||||
|
+ program spec_in_var
|
||||||
|
+ integer*8 ai*1, bi*4, ci
|
||||||
|
+ real*4 ar*4, br*8, cr
|
||||||
|
+
|
||||||
|
+ ai = 1
|
||||||
|
+ ar = 1.0
|
||||||
|
+ bi = 2
|
||||||
|
+ br = 2.0
|
||||||
|
+ ci = 3
|
||||||
|
+ cr = 3.0
|
||||||
|
+
|
||||||
|
+ if (ai .ne. 1) stop 1
|
||||||
|
+ if (abs(ar - 1.0) > 1.0D-6) stop 2
|
||||||
|
+ if (bi .ne. 2) stop 3
|
||||||
|
+ if (abs(br - 2.0) > 1.0D-6) stop 4
|
||||||
|
+ if (ci .ne. 3) stop 5
|
||||||
|
+ if (abs(cr - 3.0) > 1.0D-6) stop 6
|
||||||
|
+ if (kind(ai) .ne. 1) stop 7
|
||||||
|
+ if (kind(ar) .ne. 4) stop 8
|
||||||
|
+ if (kind(bi) .ne. 4) stop 9
|
||||||
|
+ if (kind(br) .ne. 8) stop 10
|
||||||
|
+ if (kind(ci) .ne. 8) stop 11
|
||||||
|
+ if (kind(cr) .ne. 4) stop 12
|
||||||
|
+ end
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/dec_spec_in_variable_3.f b/gcc/testsuite/gfortran.dg/dec_spec_in_variable_3.f
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..5ff434e7466
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/dec_spec_in_variable_3.f
|
||||||
|
@@ -0,0 +1,31 @@
|
||||||
|
+! { dg-do compile }
|
||||||
|
+! { dg-options "-fdec -fno-dec-override-kind" }
|
||||||
|
+!
|
||||||
|
+! Test kind specification in variable not in type
|
||||||
|
+!
|
||||||
|
+! Contributed by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+!
|
||||||
|
+ program spec_in_var
|
||||||
|
+ integer*8 ai*1, bi*4, ci ! { dg-error "Syntax error" }
|
||||||
|
+ real*4 ar*4, br*8, cr ! { dg-error "Syntax error" }
|
||||||
|
+
|
||||||
|
+ ai = 1
|
||||||
|
+ ar = 1.0
|
||||||
|
+ bi = 2
|
||||||
|
+ br = 2.0
|
||||||
|
+ ci = 3
|
||||||
|
+ cr = 3.0
|
||||||
|
+
|
||||||
|
+ if (ai .ne. 1) stop 1
|
||||||
|
+ if (abs(ar - 1.0) > 1.0D-6) stop 2
|
||||||
|
+ if (bi .ne. 2) stop 3
|
||||||
|
+ if (abs(br - 2.0) > 1.0D-6) stop 4
|
||||||
|
+ if (ci .ne. 3) stop 5
|
||||||
|
+ if (abs(cr - 3.0) > 1.0D-6) stop 6
|
||||||
|
+ if (kind(ai) .ne. 1) stop 7
|
||||||
|
+ if (kind(ar) .ne. 4) stop 8
|
||||||
|
+ if (kind(bi) .ne. 4) stop 9
|
||||||
|
+ if (kind(br) .ne. 8) stop 10
|
||||||
|
+ if (kind(ci) .ne. 8) stop 11
|
||||||
|
+ if (kind(cr) .ne. 4) stop 12
|
||||||
|
+ end
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/dec_spec_in_variable_4.f b/gcc/testsuite/gfortran.dg/dec_spec_in_variable_4.f
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..c01980e8b9d
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/dec_spec_in_variable_4.f
|
||||||
|
@@ -0,0 +1,14 @@
|
||||||
|
+! { dg-do compile }
|
||||||
|
+!
|
||||||
|
+! Test kind specification in variable not in type. The per variable
|
||||||
|
+! kind specification is not enabled so these should fail
|
||||||
|
+!
|
||||||
|
+! Contributed by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+!
|
||||||
|
+ program spec_in_var
|
||||||
|
+ integer a
|
||||||
|
+ parameter(a=2)
|
||||||
|
+ integer b*(a) ! { dg-error "Syntax error" }
|
||||||
|
+ real c*(8) ! { dg-error "Syntax error" }
|
||||||
|
+ logical d*1_1 ! { dg-error "Syntax error" }
|
||||||
|
+ end
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/dec_spec_in_variable_5.f b/gcc/testsuite/gfortran.dg/dec_spec_in_variable_5.f
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..e2f39da3f4f
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/dec_spec_in_variable_5.f
|
||||||
|
@@ -0,0 +1,19 @@
|
||||||
|
+! { dg-do run }
|
||||||
|
+! { dg-options "-fdec-override-kind" }
|
||||||
|
+!
|
||||||
|
+! Test kind specification in variable not in type
|
||||||
|
+!
|
||||||
|
+! Contributed by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+!
|
||||||
|
+ program spec_in_var
|
||||||
|
+ integer a
|
||||||
|
+ parameter(a=2)
|
||||||
|
+ integer b*(a)
|
||||||
|
+ real c*(8)
|
||||||
|
+ logical d*(1_1)
|
||||||
|
+ character e*(a)
|
||||||
|
+ if (kind(b).ne.2) stop 1
|
||||||
|
+ if (kind(c).ne.8) stop 2
|
||||||
|
+ if (kind(d).ne.1) stop 3
|
||||||
|
+ if (len(e).ne.2) stop 4
|
||||||
|
+ end
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/dec_spec_in_variable_6.f b/gcc/testsuite/gfortran.dg/dec_spec_in_variable_6.f
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..569747874e3
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/dec_spec_in_variable_6.f
|
||||||
|
@@ -0,0 +1,19 @@
|
||||||
|
+! { dg-do run }
|
||||||
|
+! { dg-options "-fdec" }
|
||||||
|
+!
|
||||||
|
+! Test kind specification in variable not in type
|
||||||
|
+!
|
||||||
|
+! Contributed by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+!
|
||||||
|
+ program spec_in_var
|
||||||
|
+ integer a
|
||||||
|
+ parameter(a=2)
|
||||||
|
+ integer b*(a)
|
||||||
|
+ real c*(8)
|
||||||
|
+ logical d*(1_1)
|
||||||
|
+ character e*(a)
|
||||||
|
+ if (kind(b).ne.2) stop 1
|
||||||
|
+ if (kind(c).ne.8) stop 2
|
||||||
|
+ if (kind(d).ne.1) stop 3
|
||||||
|
+ if (len(e).ne.2) stop 4
|
||||||
|
+ end
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/dec_spec_in_variable_7.f b/gcc/testsuite/gfortran.dg/dec_spec_in_variable_7.f
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..b975bfd15c5
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/dec_spec_in_variable_7.f
|
||||||
|
@@ -0,0 +1,15 @@
|
||||||
|
+! { dg-do compile }
|
||||||
|
+! { dg-options "-fdec -fno-dec-override-kind" }
|
||||||
|
+!
|
||||||
|
+! Test kind specification in variable not in type as the per variable
|
||||||
|
+! kind specification is not enables these should fail
|
||||||
|
+!
|
||||||
|
+! Contributed by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+!
|
||||||
|
+ program spec_in_var
|
||||||
|
+ integer a
|
||||||
|
+ parameter(a=2)
|
||||||
|
+ integer b*(a) ! { dg-error "Syntax error" }
|
||||||
|
+ real c*(8) ! { dg-error "Syntax error" }
|
||||||
|
+ logical d*1_1 ! { dg-error "Syntax error" }
|
||||||
|
+ end
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/dec_spec_in_variable_8.f b/gcc/testsuite/gfortran.dg/dec_spec_in_variable_8.f
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..85732e0bd85
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/dec_spec_in_variable_8.f
|
||||||
|
@@ -0,0 +1,14 @@
|
||||||
|
+! { dg-do compile }
|
||||||
|
+! { dg-options "-fdec" }
|
||||||
|
+!
|
||||||
|
+! Check that invalid kind values are rejected.
|
||||||
|
+!
|
||||||
|
+! Contributed by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+!
|
||||||
|
+ program spec_in_var
|
||||||
|
+ integer a
|
||||||
|
+ parameter(a=3)
|
||||||
|
+ integer b*(a) ! { dg-error "Kind 3 not supported" }
|
||||||
|
+ real c*(78) ! { dg-error "Kind 78 not supported" }
|
||||||
|
+ logical d*(*) ! { dg-error "Invalid character" }
|
||||||
|
+ end
|
||||||
|
--
|
||||||
|
2.11.0
|
||||||
|
|
@ -0,0 +1,378 @@
|
|||||||
|
From f6197d0e59059a172f68a697e25cd585ad158937 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jim MacArthur <jim.macarthur@codethink.co.uk>
|
||||||
|
Date: Wed, 11 Nov 2015 15:37:00 +0000
|
||||||
|
Subject: [PATCH 11/16] Allow non-logical expressions in IF statements
|
||||||
|
|
||||||
|
Use -fdec-non-logical-if to enable feature. Also enabled using -fdec.
|
||||||
|
---
|
||||||
|
gcc/fortran/lang.opt | 4 ++
|
||||||
|
gcc/fortran/options.c | 1 +
|
||||||
|
gcc/fortran/resolve.c | 60 ++++++++++++++++++----
|
||||||
|
...ec_logical_expressions_if_statements_blocks_1.f | 25 +++++++++
|
||||||
|
...ec_logical_expressions_if_statements_blocks_2.f | 25 +++++++++
|
||||||
|
...ec_logical_expressions_if_statements_blocks_3.f | 25 +++++++++
|
||||||
|
...ec_logical_expressions_if_statements_blocks_4.f | 45 ++++++++++++++++
|
||||||
|
...ec_logical_expressions_if_statements_blocks_5.f | 45 ++++++++++++++++
|
||||||
|
...ec_logical_expressions_if_statements_blocks_6.f | 45 ++++++++++++++++
|
||||||
|
9 files changed, 266 insertions(+), 9 deletions(-)
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/dec_logical_expressions_if_statements_blocks_1.f
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/dec_logical_expressions_if_statements_blocks_2.f
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/dec_logical_expressions_if_statements_blocks_3.f
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/dec_logical_expressions_if_statements_blocks_4.f
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/dec_logical_expressions_if_statements_blocks_5.f
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/dec_logical_expressions_if_statements_blocks_6.f
|
||||||
|
|
||||||
|
diff --git a/gcc/fortran/lang.opt b/gcc/fortran/lang.opt
|
||||||
|
index 38d31e620bf..fa2851ae837 100644
|
||||||
|
--- a/gcc/fortran/lang.opt
|
||||||
|
+++ b/gcc/fortran/lang.opt
|
||||||
|
@@ -482,6 +482,10 @@ fdec-override-kind
|
||||||
|
Fortran Var(flag_dec_override_kind)
|
||||||
|
Enable support for per variable kind specification.
|
||||||
|
|
||||||
|
+fdec-non-logical-if
|
||||||
|
+Fortran Var(flag_dec_non_logical_if)
|
||||||
|
+Enable support for non-logical expressions in if statements.
|
||||||
|
+
|
||||||
|
fdec-old-init
|
||||||
|
Fortran Var(flag_dec_old_init)
|
||||||
|
Enable support for old style initializers in derived types.
|
||||||
|
diff --git a/gcc/fortran/options.c b/gcc/fortran/options.c
|
||||||
|
index 720fd25b570..7b04a681f7b 100644
|
||||||
|
--- a/gcc/fortran/options.c
|
||||||
|
+++ b/gcc/fortran/options.c
|
||||||
|
@@ -82,6 +82,7 @@ set_dec_flags (int value)
|
||||||
|
SET_BITFLAG (flag_dec_non_integer_index, value, value);
|
||||||
|
SET_BITFLAG (flag_dec_old_init, value, value);
|
||||||
|
SET_BITFLAG (flag_dec_override_kind, value, value);
|
||||||
|
+ SET_BITFLAG (flag_dec_non_logical_if, value, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Finalize DEC flags. */
|
||||||
|
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
|
||||||
|
index 04679d3a15d..a90f7f849b5 100644
|
||||||
|
--- a/gcc/fortran/resolve.c
|
||||||
|
+++ b/gcc/fortran/resolve.c
|
||||||
|
@@ -10398,10 +10398,31 @@ gfc_resolve_blocks (gfc_code *b, gfc_namespace *ns)
|
||||||
|
switch (b->op)
|
||||||
|
{
|
||||||
|
case EXEC_IF:
|
||||||
|
- if (t && b->expr1 != NULL
|
||||||
|
- && (b->expr1->ts.type != BT_LOGICAL || b->expr1->rank != 0))
|
||||||
|
- gfc_error ("IF clause at %L requires a scalar LOGICAL expression",
|
||||||
|
- &b->expr1->where);
|
||||||
|
+ if (t && b->expr1 != NULL)
|
||||||
|
+ {
|
||||||
|
+ if (flag_dec_non_logical_if && b->expr1->ts.type != BT_LOGICAL)
|
||||||
|
+ {
|
||||||
|
+ gfc_expr* cast;
|
||||||
|
+ cast = gfc_ne (b->expr1,
|
||||||
|
+ gfc_get_int_expr (1, &gfc_current_locus, 0),
|
||||||
|
+ INTRINSIC_NE);
|
||||||
|
+ if (cast == NULL)
|
||||||
|
+ gfc_internal_error ("gfc_resolve_blocks(): Failed to cast "
|
||||||
|
+ "to LOGICAL in IF");
|
||||||
|
+ b->expr1 = cast;
|
||||||
|
+ if (warn_conversion_extra)
|
||||||
|
+ {
|
||||||
|
+ gfc_warning (OPT_Wconversion_extra, "Non-LOGICAL type in"
|
||||||
|
+ " IF statement condition %L will be true if"
|
||||||
|
+ " it evaluates to nonzero",
|
||||||
|
+ &b->expr1->where);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if ((b->expr1->ts.type != BT_LOGICAL || b->expr1->rank != 0))
|
||||||
|
+ gfc_error ("IF clause at %L requires a scalar LOGICAL "
|
||||||
|
+ "expression", &b->expr1->where);
|
||||||
|
+ }
|
||||||
|
break;
|
||||||
|
|
||||||
|
case EXEC_WHERE:
|
||||||
|
@@ -11690,11 +11711,32 @@ start:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case EXEC_IF:
|
||||||
|
- if (t && code->expr1 != NULL
|
||||||
|
- && (code->expr1->ts.type != BT_LOGICAL
|
||||||
|
- || code->expr1->rank != 0))
|
||||||
|
- gfc_error ("IF clause at %L requires a scalar LOGICAL expression",
|
||||||
|
- &code->expr1->where);
|
||||||
|
+ if (t && code->expr1 != NULL)
|
||||||
|
+ {
|
||||||
|
+ if (flag_dec_non_logical_if
|
||||||
|
+ && code->expr1->ts.type != BT_LOGICAL)
|
||||||
|
+ {
|
||||||
|
+ gfc_expr* cast;
|
||||||
|
+ cast = gfc_ne (code->expr1,
|
||||||
|
+ gfc_get_int_expr (1, &gfc_current_locus, 0),
|
||||||
|
+ INTRINSIC_NE);
|
||||||
|
+ if (cast == NULL)
|
||||||
|
+ gfc_internal_error ("gfc_resolve_code(): Failed to cast "
|
||||||
|
+ "to LOGICAL in IF");
|
||||||
|
+ code->expr1 = cast;
|
||||||
|
+ if (warn_conversion_extra)
|
||||||
|
+ {
|
||||||
|
+ gfc_warning (OPT_Wconversion_extra, "Non-LOGICAL type in"
|
||||||
|
+ " IF statement condition %L will be true if"
|
||||||
|
+ " it evaluates to nonzero",
|
||||||
|
+ &code->expr1->where);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (code->expr1->ts.type != BT_LOGICAL || code->expr1->rank != 0)
|
||||||
|
+ gfc_error ("IF clause at %L requires a scalar LOGICAL "
|
||||||
|
+ "expression", &code->expr1->where);
|
||||||
|
+ }
|
||||||
|
break;
|
||||||
|
|
||||||
|
case EXEC_CALL:
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/dec_logical_expressions_if_statements_blocks_1.f b/gcc/testsuite/gfortran.dg/dec_logical_expressions_if_statements_blocks_1.f
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..0101db893ca
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/dec_logical_expressions_if_statements_blocks_1.f
|
||||||
|
@@ -0,0 +1,25 @@
|
||||||
|
+! { dg-do run }
|
||||||
|
+! { dg-options "-fdec -Wconversion-extra" }
|
||||||
|
+!
|
||||||
|
+! Allow logical expressions in if statements and blocks
|
||||||
|
+!
|
||||||
|
+! Contributed by Francisco Redondo Marchena <francisco.marchema@codethink.co.uk>
|
||||||
|
+! and Jeff Law <law@redhat.com>
|
||||||
|
+! Modified by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+!
|
||||||
|
+ PROGRAM logical_exp_if_st_bl
|
||||||
|
+ INTEGER ipos/1/
|
||||||
|
+ INTEGER ineg/0/
|
||||||
|
+
|
||||||
|
+ ! Test non logical variables
|
||||||
|
+ if (ineg) STOP 1 ! { dg-warning "if it evaluates to nonzero" }
|
||||||
|
+ if (0) STOP 2 ! { dg-warning "if it evaluates to nonzero" }
|
||||||
|
+
|
||||||
|
+ ! Test non logical expressions in if statements
|
||||||
|
+ if (MOD(ipos, 1)) STOP 3 ! { dg-warning "if it evaluates to nonzero" }
|
||||||
|
+
|
||||||
|
+ ! Test non logical expressions in if blocks
|
||||||
|
+ if (MOD(2 * ipos, 2)) then ! { dg-warning "if it evaluates to nonzero" }
|
||||||
|
+ STOP 4
|
||||||
|
+ endif
|
||||||
|
+ END
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/dec_logical_expressions_if_statements_blocks_2.f b/gcc/testsuite/gfortran.dg/dec_logical_expressions_if_statements_blocks_2.f
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..876f4e09508
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/dec_logical_expressions_if_statements_blocks_2.f
|
||||||
|
@@ -0,0 +1,25 @@
|
||||||
|
+! { dg-do run }
|
||||||
|
+! { dg-options "-fdec-non-logical-if -Wconversion-extra" }
|
||||||
|
+!
|
||||||
|
+! Allow logical expressions in if statements and blocks
|
||||||
|
+!
|
||||||
|
+! Contributed by Francisco Redondo Marchena <francisco.marchema@codethink.co.uk>
|
||||||
|
+! and Jeff Law <law@redhat.com>
|
||||||
|
+! Modified by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+!
|
||||||
|
+ PROGRAM logical_exp_if_st_bl
|
||||||
|
+ INTEGER ipos/1/
|
||||||
|
+ INTEGER ineg/0/
|
||||||
|
+
|
||||||
|
+ ! Test non logical variables
|
||||||
|
+ if (ineg) STOP 1 ! { dg-warning "if it evaluates to nonzero" }
|
||||||
|
+ if (0) STOP 2 ! { dg-warning "if it evaluates to nonzero" }
|
||||||
|
+
|
||||||
|
+ ! Test non logical expressions in if statements
|
||||||
|
+ if (MOD(ipos, 1)) STOP 3 ! { dg-warning "if it evaluates to nonzero" }
|
||||||
|
+
|
||||||
|
+ ! Test non logical expressions in if blocks
|
||||||
|
+ if (MOD(2 * ipos, 2)) then ! { dg-warning "if it evaluates to nonzero" }
|
||||||
|
+ STOP 4
|
||||||
|
+ endif
|
||||||
|
+ END
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/dec_logical_expressions_if_statements_blocks_3.f b/gcc/testsuite/gfortran.dg/dec_logical_expressions_if_statements_blocks_3.f
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..35cb4c51b8d
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/dec_logical_expressions_if_statements_blocks_3.f
|
||||||
|
@@ -0,0 +1,25 @@
|
||||||
|
+! { dg-do compile }
|
||||||
|
+! { dg-options "-fdec -fno-dec-non-logical-if" }
|
||||||
|
+!
|
||||||
|
+! Allow logical expressions in if statements and blocks
|
||||||
|
+!
|
||||||
|
+! Contributed by Francisco Redondo Marchena <francisco.marchema@codethink.co.uk>
|
||||||
|
+! and Jeff Law <law@redhat.com>
|
||||||
|
+! Modified by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+!
|
||||||
|
+ PROGRAM logical_exp_if_st_bl
|
||||||
|
+ INTEGER ipos/1/
|
||||||
|
+ INTEGER ineg/0/
|
||||||
|
+
|
||||||
|
+ ! Test non logical variables
|
||||||
|
+ if (ineg) STOP 1 ! { dg-error "IF clause at" }
|
||||||
|
+ if (0) STOP 2 ! { dg-error "IF clause at" }
|
||||||
|
+
|
||||||
|
+ ! Test non logical expressions in if statements
|
||||||
|
+ if (MOD(ipos, 1)) STOP 3 ! { dg-error "IF clause at" }
|
||||||
|
+
|
||||||
|
+ ! Test non logical expressions in if blocks
|
||||||
|
+ if (MOD(2 * ipos, 2)) then ! { dg-error "IF clause at" }
|
||||||
|
+ STOP 4
|
||||||
|
+ endif
|
||||||
|
+ END
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/dec_logical_expressions_if_statements_blocks_4.f b/gcc/testsuite/gfortran.dg/dec_logical_expressions_if_statements_blocks_4.f
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..7b60b60827f
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/dec_logical_expressions_if_statements_blocks_4.f
|
||||||
|
@@ -0,0 +1,45 @@
|
||||||
|
+! { dg-do run }
|
||||||
|
+! { dg-options "-fdec -Wconversion-extra" }
|
||||||
|
+!
|
||||||
|
+! Contributed by Francisco Redondo Marchena <francisco.marchema@codethink.co.uk>
|
||||||
|
+! and Jeff Law <law@redhat.com>
|
||||||
|
+! Modified by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+!
|
||||||
|
+ function othersub1()
|
||||||
|
+ integer*4 othersub1
|
||||||
|
+ othersub1 = 9
|
||||||
|
+ end
|
||||||
|
+
|
||||||
|
+ function othersub2()
|
||||||
|
+ integer*4 othersub2
|
||||||
|
+ othersub2 = 0
|
||||||
|
+ end
|
||||||
|
+
|
||||||
|
+ program MAIN
|
||||||
|
+ integer*4 othersub1
|
||||||
|
+ integer*4 othersub2
|
||||||
|
+ integer a /1/
|
||||||
|
+ integer b /2/
|
||||||
|
+
|
||||||
|
+ if (othersub1()) then ! { dg-warning "if it evaluates to nonzero" }
|
||||||
|
+ write(*,*) "OK"
|
||||||
|
+ else
|
||||||
|
+ stop 1
|
||||||
|
+ end if
|
||||||
|
+ if (othersub2()) then ! { dg-warning "if it evaluates to nonzero" }
|
||||||
|
+ stop 2
|
||||||
|
+ else
|
||||||
|
+ write(*,*) "OK"
|
||||||
|
+ end if
|
||||||
|
+ if (a-b) then ! { dg-warning "if it evaluates to nonzero" }
|
||||||
|
+ write(*,*) "OK"
|
||||||
|
+ else
|
||||||
|
+ stop 3
|
||||||
|
+ end if
|
||||||
|
+ if (b-(a+1)) then ! { dg-warning "if it evaluates to nonzero" }
|
||||||
|
+ stop 3
|
||||||
|
+ else
|
||||||
|
+ write(*,*) "OK"
|
||||||
|
+ end if
|
||||||
|
+ end
|
||||||
|
+
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/dec_logical_expressions_if_statements_blocks_5.f b/gcc/testsuite/gfortran.dg/dec_logical_expressions_if_statements_blocks_5.f
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..80336f48ca1
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/dec_logical_expressions_if_statements_blocks_5.f
|
||||||
|
@@ -0,0 +1,45 @@
|
||||||
|
+! { dg-do run }
|
||||||
|
+! { dg-options "-fdec-non-logical-if -Wconversion-extra" }
|
||||||
|
+!
|
||||||
|
+! Contributed by Francisco Redondo Marchena <francisco.marchema@codethink.co.uk>
|
||||||
|
+! and Jeff Law <law@redhat.com>
|
||||||
|
+! Modified by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+!
|
||||||
|
+ function othersub1()
|
||||||
|
+ integer*4 othersub1
|
||||||
|
+ othersub1 = 9
|
||||||
|
+ end
|
||||||
|
+
|
||||||
|
+ function othersub2()
|
||||||
|
+ integer*4 othersub2
|
||||||
|
+ othersub2 = 0
|
||||||
|
+ end
|
||||||
|
+
|
||||||
|
+ program MAIN
|
||||||
|
+ integer*4 othersub1
|
||||||
|
+ integer*4 othersub2
|
||||||
|
+ integer a /1/
|
||||||
|
+ integer b /2/
|
||||||
|
+
|
||||||
|
+ if (othersub1()) then ! { dg-warning "Non-LOGICAL type in IF statement" }
|
||||||
|
+ write(*,*) "OK"
|
||||||
|
+ else
|
||||||
|
+ stop 1
|
||||||
|
+ end if
|
||||||
|
+ if (othersub2()) then ! { dg-warning "Non-LOGICAL type in IF statement" }
|
||||||
|
+ stop 2
|
||||||
|
+ else
|
||||||
|
+ write(*,*) "OK"
|
||||||
|
+ end if
|
||||||
|
+ if (a-b) then ! { dg-warning "Non-LOGICAL type in IF statement" }
|
||||||
|
+ write(*,*) "OK"
|
||||||
|
+ else
|
||||||
|
+ stop 3
|
||||||
|
+ end if
|
||||||
|
+ if (b-(a+1)) then ! { dg-warning "Non-LOGICAL type in IF statement" }
|
||||||
|
+ stop 3
|
||||||
|
+ else
|
||||||
|
+ write(*,*) "OK"
|
||||||
|
+ end if
|
||||||
|
+ end
|
||||||
|
+
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/dec_logical_expressions_if_statements_blocks_6.f b/gcc/testsuite/gfortran.dg/dec_logical_expressions_if_statements_blocks_6.f
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..e1125ca717a
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/dec_logical_expressions_if_statements_blocks_6.f
|
||||||
|
@@ -0,0 +1,45 @@
|
||||||
|
+! { dg-do compile }
|
||||||
|
+! { dg-options "-fdec -fno-dec-non-logical-if" }
|
||||||
|
+!
|
||||||
|
+! Contributed by Francisco Redondo Marchena <francisco.marchema@codethink.co.uk>
|
||||||
|
+! and Jeff Law <law@redhat.com>
|
||||||
|
+! Modified by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+!
|
||||||
|
+ function othersub1()
|
||||||
|
+ integer*4 othersub1
|
||||||
|
+ othersub1 = 9
|
||||||
|
+ end
|
||||||
|
+
|
||||||
|
+ function othersub2()
|
||||||
|
+ integer*4 othersub2
|
||||||
|
+ othersub2 = 0
|
||||||
|
+ end
|
||||||
|
+
|
||||||
|
+ program MAIN
|
||||||
|
+ integer*4 othersub1
|
||||||
|
+ integer*4 othersub2
|
||||||
|
+ integer a /1/
|
||||||
|
+ integer b /2/
|
||||||
|
+
|
||||||
|
+ if (othersub1()) then ! { dg-error "IF clause at" }
|
||||||
|
+ write(*,*) "OK"
|
||||||
|
+ else
|
||||||
|
+ stop 1
|
||||||
|
+ end if
|
||||||
|
+ if (othersub2()) then ! { dg-error "IF clause at" }
|
||||||
|
+ stop 2
|
||||||
|
+ else
|
||||||
|
+ write(*,*) "OK"
|
||||||
|
+ end if
|
||||||
|
+ if (a-b) then ! { dg-error "IF clause at" }
|
||||||
|
+ write(*,*) "OK"
|
||||||
|
+ else
|
||||||
|
+ stop 3
|
||||||
|
+ end if
|
||||||
|
+ if (b-(a+1)) then ! { dg-error "IF clause at" }
|
||||||
|
+ stop 3
|
||||||
|
+ else
|
||||||
|
+ write(*,*) "OK"
|
||||||
|
+ end if
|
||||||
|
+ end
|
||||||
|
+
|
||||||
|
--
|
||||||
|
2.11.0
|
||||||
|
|
2151
SOURCES/0012-Support-type-promotion-in-calls-to-intrinsics.patch
Normal file
2151
SOURCES/0012-Support-type-promotion-in-calls-to-intrinsics.patch
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,262 @@
|
|||||||
|
From aafd9c215d41b4a846c6724bc25025b124c65ec4 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jim MacArthur <jim.macarthur@codethink.co.uk>
|
||||||
|
Date: Wed, 18 Nov 2015 15:08:56 +0000
|
||||||
|
Subject: [PATCH 13/16] Add the SEQUENCE attribute by default if it's not
|
||||||
|
present.
|
||||||
|
|
||||||
|
Use -fdec-sequence to enable this feature. Also enabled by -fdec.
|
||||||
|
---
|
||||||
|
gcc/fortran/lang.opt | 4 ++
|
||||||
|
gcc/fortran/options.c | 1 +
|
||||||
|
gcc/fortran/resolve.c | 13 +++--
|
||||||
|
...dec_add_SEQUENCE_to_COMMON_block_by_default_1.f | 57 ++++++++++++++++++++++
|
||||||
|
...dec_add_SEQUENCE_to_COMMON_block_by_default_2.f | 57 ++++++++++++++++++++++
|
||||||
|
...dec_add_SEQUENCE_to_COMMON_block_by_default_3.f | 57 ++++++++++++++++++++++
|
||||||
|
6 files changed, 186 insertions(+), 3 deletions(-)
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/dec_add_SEQUENCE_to_COMMON_block_by_default_1.f
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/dec_add_SEQUENCE_to_COMMON_block_by_default_2.f
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/dec_add_SEQUENCE_to_COMMON_block_by_default_3.f
|
||||||
|
|
||||||
|
diff --git a/gcc/fortran/lang.opt b/gcc/fortran/lang.opt
|
||||||
|
index 2a8f5f661a8..ffd9ce6f270 100644
|
||||||
|
--- a/gcc/fortran/lang.opt
|
||||||
|
+++ b/gcc/fortran/lang.opt
|
||||||
|
@@ -494,6 +494,10 @@ fdec-promotion
|
||||||
|
Fortran Var(flag_dec_promotion)
|
||||||
|
Add support for type promotion in intrinsic arguments.
|
||||||
|
|
||||||
|
+fdec-sequence
|
||||||
|
+Fortran Var(flag_dec_sequence)
|
||||||
|
+Add the SEQUENCE attribute by default if it's not present.
|
||||||
|
+
|
||||||
|
fdec-structure
|
||||||
|
Fortran Var(flag_dec_structure)
|
||||||
|
Enable support for DEC STRUCTURE/RECORD.
|
||||||
|
diff --git a/gcc/fortran/options.c b/gcc/fortran/options.c
|
||||||
|
index 7a2583a2076..b6fd327d057 100644
|
||||||
|
--- a/gcc/fortran/options.c
|
||||||
|
+++ b/gcc/fortran/options.c
|
||||||
|
@@ -84,6 +84,7 @@ set_dec_flags (int value)
|
||||||
|
SET_BITFLAG (flag_dec_override_kind, value, value);
|
||||||
|
SET_BITFLAG (flag_dec_non_logical_if, value, value);
|
||||||
|
SET_BITFLAG (flag_dec_promotion, value, value);
|
||||||
|
+ SET_BITFLAG (flag_dec_sequence, value, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Finalize DEC flags. */
|
||||||
|
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
|
||||||
|
index a90f7f849b5..08627866c9c 100644
|
||||||
|
--- a/gcc/fortran/resolve.c
|
||||||
|
+++ b/gcc/fortran/resolve.c
|
||||||
|
@@ -968,9 +968,16 @@ resolve_common_vars (gfc_common_head *common_block, bool named_common)
|
||||||
|
|
||||||
|
if (!(csym->ts.u.derived->attr.sequence
|
||||||
|
|| csym->ts.u.derived->attr.is_bind_c))
|
||||||
|
- gfc_error_now ("Derived type variable %qs in COMMON at %L "
|
||||||
|
- "has neither the SEQUENCE nor the BIND(C) "
|
||||||
|
- "attribute", csym->name, &csym->declared_at);
|
||||||
|
+ {
|
||||||
|
+ if (flag_dec_sequence)
|
||||||
|
+ /* Assume sequence. */
|
||||||
|
+ csym->ts.u.derived->attr.sequence = 1;
|
||||||
|
+ else
|
||||||
|
+ gfc_error_now ("Derived type variable '%s' in COMMON at %L "
|
||||||
|
+ "has neither the SEQUENCE nor the BIND(C) "
|
||||||
|
+ "attribute", csym->name, &csym->declared_at);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (csym->ts.u.derived->attr.alloc_comp)
|
||||||
|
gfc_error_now ("Derived type variable %qs in COMMON at %L "
|
||||||
|
"has an ultimate component that is "
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/dec_add_SEQUENCE_to_COMMON_block_by_default_1.f b/gcc/testsuite/gfortran.dg/dec_add_SEQUENCE_to_COMMON_block_by_default_1.f
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..fe7b39625eb
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/dec_add_SEQUENCE_to_COMMON_block_by_default_1.f
|
||||||
|
@@ -0,0 +1,57 @@
|
||||||
|
+! { dg-do run }
|
||||||
|
+! { dg-options "-fdec" }
|
||||||
|
+!
|
||||||
|
+! Test add default SEQUENCE attribute derived types appearing in
|
||||||
|
+! COMMON blocks and EQUIVALENCE statements.
|
||||||
|
+!
|
||||||
|
+! Contributed by Francisco Redondo Marchena <francisco.marchena@codethink.co.uk>
|
||||||
|
+! Modified by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+!
|
||||||
|
+ MODULE SEQ
|
||||||
|
+ TYPE STRUCT1
|
||||||
|
+ INTEGER*4 ID
|
||||||
|
+ INTEGER*4 TYPE
|
||||||
|
+ INTEGER*8 DEFVAL
|
||||||
|
+ CHARACTER*(4) NAME
|
||||||
|
+ LOGICAL*1 NIL
|
||||||
|
+ END TYPE STRUCT1
|
||||||
|
+ END MODULE
|
||||||
|
+
|
||||||
|
+ SUBROUTINE A
|
||||||
|
+ USE SEQ
|
||||||
|
+ TYPE (STRUCT1) S
|
||||||
|
+ COMMON /BLOCK1/ S
|
||||||
|
+ IF (S%ID.NE.5) STOP 1
|
||||||
|
+ IF (S%TYPE.NE.1000) STOP 2
|
||||||
|
+ IF (S%DEFVAL.NE.-99) STOP 3
|
||||||
|
+ IF (S%NAME.NE."JANE") STOP 4
|
||||||
|
+ IF (S%NIL.NEQV..FALSE.) STOP 5
|
||||||
|
+ END SUBROUTINE
|
||||||
|
+
|
||||||
|
+ PROGRAM sequence_att_common
|
||||||
|
+ USE SEQ
|
||||||
|
+ IMPLICIT NONE
|
||||||
|
+ TYPE (STRUCT1) S1
|
||||||
|
+ TYPE (STRUCT1) S2
|
||||||
|
+ TYPE (STRUCT1) S3
|
||||||
|
+
|
||||||
|
+ EQUIVALENCE (S1,S2)
|
||||||
|
+ COMMON /BLOCK1/ S3
|
||||||
|
+
|
||||||
|
+ S1%ID = 5
|
||||||
|
+ S1%TYPE = 1000
|
||||||
|
+ S1%DEFVAL = -99
|
||||||
|
+ S1%NAME = "JANE"
|
||||||
|
+ S1%NIL = .FALSE.
|
||||||
|
+
|
||||||
|
+ IF (S2%ID.NE.5) STOP 1
|
||||||
|
+ IF (S2%TYPE.NE.1000) STOP 2
|
||||||
|
+ IF (S2%DEFVAL.NE.-99) STOP 3
|
||||||
|
+ IF (S2%NAME.NE."JANE") STOP 4
|
||||||
|
+ IF (S2%NIL.NEQV..FALSE.) STOP 5
|
||||||
|
+
|
||||||
|
+ S3 = S1
|
||||||
|
+
|
||||||
|
+ CALL A
|
||||||
|
+
|
||||||
|
+ END
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/dec_add_SEQUENCE_to_COMMON_block_by_default_2.f b/gcc/testsuite/gfortran.dg/dec_add_SEQUENCE_to_COMMON_block_by_default_2.f
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..83512f0f3a2
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/dec_add_SEQUENCE_to_COMMON_block_by_default_2.f
|
||||||
|
@@ -0,0 +1,57 @@
|
||||||
|
+! { dg-do run }
|
||||||
|
+! { dg-options "-fdec-sequence" }
|
||||||
|
+!
|
||||||
|
+! Test add default SEQUENCE attribute derived types appearing in
|
||||||
|
+! COMMON blocks and EQUIVALENCE statements.
|
||||||
|
+!
|
||||||
|
+! Contributed by Francisco Redondo Marchena <francisco.marchena@codethink.co.uk>
|
||||||
|
+! Modified by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+!
|
||||||
|
+ MODULE SEQ
|
||||||
|
+ TYPE STRUCT1
|
||||||
|
+ INTEGER*4 ID
|
||||||
|
+ INTEGER*4 TYPE
|
||||||
|
+ INTEGER*8 DEFVAL
|
||||||
|
+ CHARACTER*(4) NAME
|
||||||
|
+ LOGICAL*1 NIL
|
||||||
|
+ END TYPE STRUCT1
|
||||||
|
+ END MODULE
|
||||||
|
+
|
||||||
|
+ SUBROUTINE A
|
||||||
|
+ USE SEQ
|
||||||
|
+ TYPE (STRUCT1) S
|
||||||
|
+ COMMON /BLOCK1/ S
|
||||||
|
+ IF (S%ID.NE.5) STOP 1
|
||||||
|
+ IF (S%TYPE.NE.1000) STOP 2
|
||||||
|
+ IF (S%DEFVAL.NE.-99) STOP 3
|
||||||
|
+ IF (S%NAME.NE."JANE") STOP 4
|
||||||
|
+ IF (S%NIL.NEQV..FALSE.) STOP 5
|
||||||
|
+ END SUBROUTINE
|
||||||
|
+
|
||||||
|
+ PROGRAM sequence_att_common
|
||||||
|
+ USE SEQ
|
||||||
|
+ IMPLICIT NONE
|
||||||
|
+ TYPE (STRUCT1) S1
|
||||||
|
+ TYPE (STRUCT1) S2
|
||||||
|
+ TYPE (STRUCT1) S3
|
||||||
|
+
|
||||||
|
+ EQUIVALENCE (S1,S2)
|
||||||
|
+ COMMON /BLOCK1/ S3
|
||||||
|
+
|
||||||
|
+ S1%ID = 5
|
||||||
|
+ S1%TYPE = 1000
|
||||||
|
+ S1%DEFVAL = -99
|
||||||
|
+ S1%NAME = "JANE"
|
||||||
|
+ S1%NIL = .FALSE.
|
||||||
|
+
|
||||||
|
+ IF (S2%ID.NE.5) STOP 1
|
||||||
|
+ IF (S2%TYPE.NE.1000) STOP 2
|
||||||
|
+ IF (S2%DEFVAL.NE.-99) STOP 3
|
||||||
|
+ IF (S2%NAME.NE."JANE") STOP 4
|
||||||
|
+ IF (S2%NIL.NEQV..FALSE.) STOP 5
|
||||||
|
+
|
||||||
|
+ S3 = S1
|
||||||
|
+
|
||||||
|
+ CALL A
|
||||||
|
+
|
||||||
|
+ END
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/dec_add_SEQUENCE_to_COMMON_block_by_default_3.f b/gcc/testsuite/gfortran.dg/dec_add_SEQUENCE_to_COMMON_block_by_default_3.f
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..26cd59f9090
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/dec_add_SEQUENCE_to_COMMON_block_by_default_3.f
|
||||||
|
@@ -0,0 +1,57 @@
|
||||||
|
+! { dg-do compile }
|
||||||
|
+! { dg-options "-fdec -fno-dec-sequence" }
|
||||||
|
+!
|
||||||
|
+! Test add default SEQUENCE attribute derived types appearing in
|
||||||
|
+! COMMON blocks and EQUIVALENCE statements.
|
||||||
|
+!
|
||||||
|
+! Contributed by Francisco Redondo Marchena <francisco.marchena@codethink.co.uk>
|
||||||
|
+! Modified by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+!
|
||||||
|
+ MODULE SEQ
|
||||||
|
+ TYPE STRUCT1
|
||||||
|
+ INTEGER*4 ID
|
||||||
|
+ INTEGER*4 TYPE
|
||||||
|
+ INTEGER*8 DEFVAL
|
||||||
|
+ CHARACTER*(4) NAME
|
||||||
|
+ LOGICAL*1 NIL
|
||||||
|
+ END TYPE STRUCT1
|
||||||
|
+ END MODULE
|
||||||
|
+
|
||||||
|
+ SUBROUTINE A
|
||||||
|
+ USE SEQ
|
||||||
|
+ TYPE (STRUCT1) S ! { dg-error "Derived type variable" }
|
||||||
|
+ COMMON /BLOCK1/ S
|
||||||
|
+ IF (S%ID.NE.5) STOP 1
|
||||||
|
+ IF (S%TYPE.NE.1000) STOP 2
|
||||||
|
+ IF (S%DEFVAL.NE.-99) STOP 3
|
||||||
|
+ IF (S%NAME.NE."JANE") STOP 4
|
||||||
|
+ IF (S%NIL.NEQV..FALSE.) STOP 5
|
||||||
|
+ END SUBROUTINE
|
||||||
|
+
|
||||||
|
+ PROGRAM sequence_att_common
|
||||||
|
+ USE SEQ
|
||||||
|
+ IMPLICIT NONE
|
||||||
|
+ TYPE (STRUCT1) S1
|
||||||
|
+ TYPE (STRUCT1) S2
|
||||||
|
+ TYPE (STRUCT1) S3 ! { dg-error "Derived type variable" }
|
||||||
|
+
|
||||||
|
+ EQUIVALENCE (S1,S2) ! { dg-error "Derived type variable" }
|
||||||
|
+ COMMON /BLOCK1/ S3
|
||||||
|
+
|
||||||
|
+ S1%ID = 5
|
||||||
|
+ S1%TYPE = 1000
|
||||||
|
+ S1%DEFVAL = -99
|
||||||
|
+ S1%NAME = "JANE"
|
||||||
|
+ S1%NIL = .FALSE.
|
||||||
|
+
|
||||||
|
+ IF (S2%ID.NE.5) STOP 1
|
||||||
|
+ IF (S2%TYPE.NE.1000) STOP 2
|
||||||
|
+ IF (S2%DEFVAL.NE.-99) STOP 3
|
||||||
|
+ IF (S2%NAME.NE."JANE") STOP 4
|
||||||
|
+ IF (S2%NIL.NEQV..FALSE.) STOP 5
|
||||||
|
+
|
||||||
|
+ S3 = S1
|
||||||
|
+
|
||||||
|
+ CALL A
|
||||||
|
+
|
||||||
|
+ END
|
||||||
|
--
|
||||||
|
2.11.0
|
||||||
|
|
@ -0,0 +1,181 @@
|
|||||||
|
From 60b2e0b9ad2057f256591f56d5433e9ca54bf56f Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jim MacArthur <jim.macarthur@codethink.co.uk>
|
||||||
|
Date: Fri, 26 Aug 2016 17:46:05 +0100
|
||||||
|
Subject: [PATCH 14/16] Fill in missing array dimensions using the lower bound
|
||||||
|
|
||||||
|
Use -fdec-add-missing-indexes to enable feature. Also enabled by fdec.
|
||||||
|
---
|
||||||
|
gcc/fortran/lang.opt | 8 ++++++++
|
||||||
|
gcc/fortran/options.c | 1 +
|
||||||
|
gcc/fortran/resolve.c | 24 ++++++++++++++++++++++++
|
||||||
|
gcc/testsuite/gfortran.dg/array_6.f90 | 23 +++++++++++++++++++++++
|
||||||
|
gcc/testsuite/gfortran.dg/array_7.f90 | 23 +++++++++++++++++++++++
|
||||||
|
gcc/testsuite/gfortran.dg/array_8.f90 | 23 +++++++++++++++++++++++
|
||||||
|
6 files changed, 102 insertions(+)
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/array_6.f90
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/array_7.f90
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/array_8.f90
|
||||||
|
|
||||||
|
diff --git a/gcc/fortran/lang.opt b/gcc/fortran/lang.opt
|
||||||
|
index ffd9ce6f270..dca3fd27aa3 100644
|
||||||
|
--- a/gcc/fortran/lang.opt
|
||||||
|
+++ b/gcc/fortran/lang.opt
|
||||||
|
@@ -281,6 +281,10 @@ Wmissing-include-dirs
|
||||||
|
Fortran
|
||||||
|
; Documented in C/C++
|
||||||
|
|
||||||
|
+Wmissing-index
|
||||||
|
+Fortran Var(warn_missing_index) Warning LangEnabledBy(Fortran,Wall)
|
||||||
|
+Warn that the lower bound of a missing index will be used.
|
||||||
|
+
|
||||||
|
Wuse-without-only
|
||||||
|
Fortran Var(warn_use_without_only) Warning
|
||||||
|
Warn about USE statements that have no ONLY qualifier.
|
||||||
|
@@ -440,6 +444,10 @@ fdec
|
||||||
|
Fortran Var(flag_dec)
|
||||||
|
Enable all DEC language extensions.
|
||||||
|
|
||||||
|
+fdec-add-missing-indexes
|
||||||
|
+Fortran Var(flag_dec_add_missing_indexes)
|
||||||
|
+Enable the addition of missing indexes using their lower bounds.
|
||||||
|
+
|
||||||
|
fdec-blank-format-item
|
||||||
|
Fortran Var(flag_dec_blank_format_item)
|
||||||
|
Enable the use of blank format items in format strings.
|
||||||
|
diff --git a/gcc/fortran/options.c b/gcc/fortran/options.c
|
||||||
|
index b6fd327d057..f417f48f6a7 100644
|
||||||
|
--- a/gcc/fortran/options.c
|
||||||
|
+++ b/gcc/fortran/options.c
|
||||||
|
@@ -85,6 +85,7 @@ set_dec_flags (int value)
|
||||||
|
SET_BITFLAG (flag_dec_non_logical_if, value, value);
|
||||||
|
SET_BITFLAG (flag_dec_promotion, value, value);
|
||||||
|
SET_BITFLAG (flag_dec_sequence, value, value);
|
||||||
|
+ SET_BITFLAG (flag_dec_add_missing_indexes, value, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Finalize DEC flags. */
|
||||||
|
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
|
||||||
|
index 08627866c9c..70093c952f6 100644
|
||||||
|
--- a/gcc/fortran/resolve.c
|
||||||
|
+++ b/gcc/fortran/resolve.c
|
||||||
|
@@ -4676,6 +4676,30 @@ compare_spec_to_ref (gfc_array_ref *ar)
|
||||||
|
if (ar->type == AR_FULL)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
+ if (flag_dec_add_missing_indexes && as->rank > ar->dimen)
|
||||||
|
+ {
|
||||||
|
+ /* Add in the missing dimensions, assuming they are the lower bound
|
||||||
|
+ of that dimension if not specified. */
|
||||||
|
+ int j;
|
||||||
|
+ if (warn_missing_index)
|
||||||
|
+ {
|
||||||
|
+ gfc_warning (OPT_Wmissing_index, "Using the lower bound for "
|
||||||
|
+ "unspecified dimensions in array reference at %L",
|
||||||
|
+ &ar->where);
|
||||||
|
+ }
|
||||||
|
+ /* Other parts of the code iterate ar->start and ar->end from 0 to
|
||||||
|
+ ar->dimen, so it is safe to assume slots from ar->dimen upwards
|
||||||
|
+ are unused (i.e. there are no gaps; the specified indexes are
|
||||||
|
+ contiguous and start at zero. */
|
||||||
|
+ for(j = ar->dimen; j <= as->rank; j++)
|
||||||
|
+ {
|
||||||
|
+ ar->start[j] = gfc_copy_expr (as->lower[j]);
|
||||||
|
+ ar->end[j] = gfc_copy_expr (as->lower[j]);
|
||||||
|
+ ar->dimen_type[j] = DIMEN_ELEMENT;
|
||||||
|
+ }
|
||||||
|
+ ar->dimen = as->rank;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (as->rank != ar->dimen)
|
||||||
|
{
|
||||||
|
gfc_error ("Rank mismatch in array reference at %L (%d/%d)",
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/array_6.f90 b/gcc/testsuite/gfortran.dg/array_6.f90
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..5c26e18ab3e
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/array_6.f90
|
||||||
|
@@ -0,0 +1,23 @@
|
||||||
|
+! { dg-do run }
|
||||||
|
+! { dg-options "-fdec -Wmissing-index" }!
|
||||||
|
+! Checks that under-specified arrays (referencing arrays with fewer
|
||||||
|
+! dimensions than the array spec) generates a warning.
|
||||||
|
+!
|
||||||
|
+! Contributed by Jim MacArthur <jim.macarthur@codethink.co.uk>
|
||||||
|
+! Updated by Mark Eggleston <mark.eggleston@codethink.co.uk>
|
||||||
|
+!
|
||||||
|
+
|
||||||
|
+program under_specified_array
|
||||||
|
+ integer chessboard(8,8)
|
||||||
|
+ integer chessboard3d(8,8,3:5)
|
||||||
|
+ chessboard(3,1) = 5
|
||||||
|
+ chessboard(3,2) = 55
|
||||||
|
+ chessboard3d(4,1,3) = 6
|
||||||
|
+ chessboard3d(4,1,4) = 66
|
||||||
|
+ chessboard3d(4,4,3) = 7
|
||||||
|
+ chessboard3d(4,4,4) = 77
|
||||||
|
+
|
||||||
|
+ if (chessboard(3).ne.5) stop 1 ! { dg-warning "Using the lower bound for unspecified dimensions in array reference" }
|
||||||
|
+ if (chessboard3d(4).ne.6) stop 2 ! { dg-warning "Using the lower bound for unspecified dimensions in array reference" }
|
||||||
|
+ if (chessboard3d(4,4).ne.7) stop 3 ! { dg-warning "Using the lower bound for unspecified dimensions in array reference" }
|
||||||
|
+end program
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/array_7.f90 b/gcc/testsuite/gfortran.dg/array_7.f90
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..5588a5bd02d
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/array_7.f90
|
||||||
|
@@ -0,0 +1,23 @@
|
||||||
|
+! { dg-do run }
|
||||||
|
+! { dg-options "-fdec-add-missing-indexes -Wmissing-index" }!
|
||||||
|
+! Checks that under-specified arrays (referencing arrays with fewer
|
||||||
|
+! dimensions than the array spec) generates a warning.
|
||||||
|
+!
|
||||||
|
+! Contributed by Jim MacArthur <jim.macarthur@codethink.co.uk>
|
||||||
|
+! Updated by Mark Eggleston <mark.eggleston@codethink.co.uk>
|
||||||
|
+!
|
||||||
|
+
|
||||||
|
+program under_specified_array
|
||||||
|
+ integer chessboard(8,8)
|
||||||
|
+ integer chessboard3d(8,8,3:5)
|
||||||
|
+ chessboard(3,1) = 5
|
||||||
|
+ chessboard(3,2) = 55
|
||||||
|
+ chessboard3d(4,1,3) = 6
|
||||||
|
+ chessboard3d(4,1,4) = 66
|
||||||
|
+ chessboard3d(4,4,3) = 7
|
||||||
|
+ chessboard3d(4,4,4) = 77
|
||||||
|
+
|
||||||
|
+ if (chessboard(3).ne.5) stop 1 ! { dg-warning "Using the lower bound for unspecified dimensions in array reference" }
|
||||||
|
+ if (chessboard3d(4).ne.6) stop 2 ! { dg-warning "Using the lower bound for unspecified dimensions in array reference" }
|
||||||
|
+ if (chessboard3d(4,4).ne.7) stop 3 ! { dg-warning "Using the lower bound for unspecified dimensions in array reference" }
|
||||||
|
+end program
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/array_8.f90 b/gcc/testsuite/gfortran.dg/array_8.f90
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..f0d2ef5e37d
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/array_8.f90
|
||||||
|
@@ -0,0 +1,23 @@
|
||||||
|
+! { dg-do compile }
|
||||||
|
+! { dg-options "-fdec -fno-dec-add-missing-indexes" }!
|
||||||
|
+! Checks that under-specified arrays (referencing arrays with fewer
|
||||||
|
+! dimensions than the array spec) generates a warning.
|
||||||
|
+!
|
||||||
|
+! Contributed by Jim MacArthur <jim.macarthur@codethink.co.uk>
|
||||||
|
+! Updated by Mark Eggleston <mark.eggleston@codethink.co.uk>
|
||||||
|
+!
|
||||||
|
+
|
||||||
|
+program under_specified_array
|
||||||
|
+ integer chessboard(8,8)
|
||||||
|
+ integer chessboard3d(8,8,3:5)
|
||||||
|
+ chessboard(3,1) = 5
|
||||||
|
+ chessboard(3,2) = 55
|
||||||
|
+ chessboard3d(4,1,3) = 6
|
||||||
|
+ chessboard3d(4,1,4) = 66
|
||||||
|
+ chessboard3d(4,4,3) = 7
|
||||||
|
+ chessboard3d(4,4,4) = 77
|
||||||
|
+
|
||||||
|
+ if (chessboard(3).ne.5) stop 1 ! { dg-error "Rank mismatch" }
|
||||||
|
+ if (chessboard3d(4).ne.6) stop 2 ! { dg-error "Rank mismatch" }
|
||||||
|
+ if (chessboard3d(4,4).ne.7) stop 3 ! { dg-error "Rank mismatch" }
|
||||||
|
+end program
|
||||||
|
--
|
||||||
|
2.11.0
|
||||||
|
|
358
SOURCES/0015-Allow-automatics-in-equivalence.patch
Normal file
358
SOURCES/0015-Allow-automatics-in-equivalence.patch
Normal file
@ -0,0 +1,358 @@
|
|||||||
|
From e6f385f8258148890a097878a618b694be663db6 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Mark Eggleston <markeggleston@codethink.com>
|
||||||
|
Date: Tue, 11 Sep 2018 12:50:11 +0100
|
||||||
|
Subject: [PATCH 15/16] Allow automatics in equivalence
|
||||||
|
|
||||||
|
If a variable with an automatic attribute appears in an
|
||||||
|
equivalence statement the storage should be allocated on
|
||||||
|
the stack.
|
||||||
|
|
||||||
|
Note: most of this patch was provided by Jeff Law <law@redhat.com>.
|
||||||
|
---
|
||||||
|
gcc/fortran/gfortran.h | 1 +
|
||||||
|
gcc/fortran/symbol.c | 4 +-
|
||||||
|
gcc/fortran/trans-common.c | 75 +++++++++++++++++++++++++--
|
||||||
|
gcc/testsuite/gfortran.dg/auto_in_equiv_1.f90 | 36 +++++++++++++
|
||||||
|
gcc/testsuite/gfortran.dg/auto_in_equiv_2.f90 | 38 ++++++++++++++
|
||||||
|
gcc/testsuite/gfortran.dg/auto_in_equiv_3.f90 | 63 ++++++++++++++++++++++
|
||||||
|
6 files changed, 210 insertions(+), 7 deletions(-)
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/auto_in_equiv_1.f90
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/auto_in_equiv_2.f90
|
||||||
|
create mode 100644 gcc/testsuite/gfortran.dg/auto_in_equiv_3.f90
|
||||||
|
|
||||||
|
diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h
|
||||||
|
index 23d01b10728..eb2a29fea5f 100644
|
||||||
|
--- a/gcc/fortran/gfortran.h
|
||||||
|
+++ b/gcc/fortran/gfortran.h
|
||||||
|
@@ -2993,6 +2993,7 @@ bool gfc_merge_new_implicit (gfc_typespec *);
|
||||||
|
void gfc_set_implicit_none (bool, bool, locus *);
|
||||||
|
void gfc_check_function_type (gfc_namespace *);
|
||||||
|
bool gfc_is_intrinsic_typename (const char *);
|
||||||
|
+bool check_conflict (symbol_attribute *, const char *, locus *);
|
||||||
|
|
||||||
|
gfc_typespec *gfc_get_default_type (const char *, gfc_namespace *);
|
||||||
|
bool gfc_set_default_type (gfc_symbol *, int, gfc_namespace *);
|
||||||
|
diff --git a/gcc/fortran/symbol.c b/gcc/fortran/symbol.c
|
||||||
|
index 4247b5b60c8..5fdb46c4b32 100644
|
||||||
|
--- a/gcc/fortran/symbol.c
|
||||||
|
+++ b/gcc/fortran/symbol.c
|
||||||
|
@@ -407,7 +407,7 @@ gfc_check_function_type (gfc_namespace *ns)
|
||||||
|
goto conflict_std;\
|
||||||
|
}
|
||||||
|
|
||||||
|
-static bool
|
||||||
|
+bool
|
||||||
|
check_conflict (symbol_attribute *attr, const char *name, locus *where)
|
||||||
|
{
|
||||||
|
static const char *dummy = "DUMMY", *save = "SAVE", *pointer = "POINTER",
|
||||||
|
@@ -544,7 +544,6 @@ check_conflict (symbol_attribute *attr, const char *name, locus *where)
|
||||||
|
conf (allocatable, elemental);
|
||||||
|
|
||||||
|
conf (in_common, automatic);
|
||||||
|
- conf (in_equivalence, automatic);
|
||||||
|
conf (result, automatic);
|
||||||
|
conf (use_assoc, automatic);
|
||||||
|
conf (dummy, automatic);
|
||||||
|
@@ -4261,6 +4260,7 @@ save_symbol (gfc_symbol *sym)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (sym->attr.in_common
|
||||||
|
+ || sym->attr.in_equivalence
|
||||||
|
|| sym->attr.dummy
|
||||||
|
|| sym->attr.result
|
||||||
|
|| sym->attr.flavor != FL_VARIABLE)
|
||||||
|
diff --git a/gcc/fortran/trans-common.c b/gcc/fortran/trans-common.c
|
||||||
|
index debdbd98ac0..a5fb230bb1b 100644
|
||||||
|
--- a/gcc/fortran/trans-common.c
|
||||||
|
+++ b/gcc/fortran/trans-common.c
|
||||||
|
@@ -339,7 +339,7 @@ build_field (segment_info *h, tree union_type, record_layout_info rli)
|
||||||
|
/* Get storage for local equivalence. */
|
||||||
|
|
||||||
|
static tree
|
||||||
|
-build_equiv_decl (tree union_type, bool is_init, bool is_saved)
|
||||||
|
+build_equiv_decl (tree union_type, bool is_init, bool is_saved, bool is_auto)
|
||||||
|
{
|
||||||
|
tree decl;
|
||||||
|
char name[18];
|
||||||
|
@@ -359,8 +359,8 @@ build_equiv_decl (tree union_type, bool is_init, bool is_saved)
|
||||||
|
DECL_ARTIFICIAL (decl) = 1;
|
||||||
|
DECL_IGNORED_P (decl) = 1;
|
||||||
|
|
||||||
|
- if (!gfc_can_put_var_on_stack (DECL_SIZE_UNIT (decl))
|
||||||
|
- || is_saved)
|
||||||
|
+ if (!is_auto && (!gfc_can_put_var_on_stack (DECL_SIZE_UNIT (decl))
|
||||||
|
+ || is_saved))
|
||||||
|
TREE_STATIC (decl) = 1;
|
||||||
|
|
||||||
|
TREE_ADDRESSABLE (decl) = 1;
|
||||||
|
@@ -611,6 +611,7 @@ create_common (gfc_common_head *com, segment_info *head, bool saw_equiv)
|
||||||
|
tree decl;
|
||||||
|
bool is_init = false;
|
||||||
|
bool is_saved = false;
|
||||||
|
+ bool is_auto = false;
|
||||||
|
|
||||||
|
/* Declare the variables inside the common block.
|
||||||
|
If the current common block contains any equivalence object, then
|
||||||
|
@@ -654,6 +655,10 @@ create_common (gfc_common_head *com, segment_info *head, bool saw_equiv)
|
||||||
|
/* Has SAVE attribute. */
|
||||||
|
if (s->sym->attr.save)
|
||||||
|
is_saved = true;
|
||||||
|
+
|
||||||
|
+ /* Has AUTOMATIC attribute. */
|
||||||
|
+ if (s->sym->attr.automatic)
|
||||||
|
+ is_auto = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
finish_record_layout (rli, true);
|
||||||
|
@@ -661,7 +666,7 @@ create_common (gfc_common_head *com, segment_info *head, bool saw_equiv)
|
||||||
|
if (com)
|
||||||
|
decl = build_common_decl (com, union_type, is_init);
|
||||||
|
else
|
||||||
|
- decl = build_equiv_decl (union_type, is_init, is_saved);
|
||||||
|
+ decl = build_equiv_decl (union_type, is_init, is_saved, is_auto);
|
||||||
|
|
||||||
|
if (is_init)
|
||||||
|
{
|
||||||
|
@@ -948,6 +953,61 @@ add_condition (segment_info *f, gfc_equiv *eq1, gfc_equiv *eq2)
|
||||||
|
confirm_condition (f, eq1, n, eq2);
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void
|
||||||
|
+accumulate_equivalence_attributes (symbol_attribute *dummy_symbol, gfc_equiv *e)
|
||||||
|
+{
|
||||||
|
+ symbol_attribute attr = e->expr->symtree->n.sym->attr;
|
||||||
|
+
|
||||||
|
+ dummy_symbol->dummy |= attr.dummy;
|
||||||
|
+ dummy_symbol->pointer |= attr.pointer;
|
||||||
|
+ dummy_symbol->target |= attr.target;
|
||||||
|
+ dummy_symbol->external |= attr.external;
|
||||||
|
+ dummy_symbol->intrinsic |= attr.intrinsic;
|
||||||
|
+ dummy_symbol->allocatable |= attr.allocatable;
|
||||||
|
+ dummy_symbol->elemental |= attr.elemental;
|
||||||
|
+ dummy_symbol->recursive |= attr.recursive;
|
||||||
|
+ dummy_symbol->in_common |= attr.in_common;
|
||||||
|
+ dummy_symbol->result |= attr.result;
|
||||||
|
+ dummy_symbol->in_namelist |= attr.in_namelist;
|
||||||
|
+ dummy_symbol->optional |= attr.optional;
|
||||||
|
+ dummy_symbol->entry |= attr.entry;
|
||||||
|
+ dummy_symbol->function |= attr.function;
|
||||||
|
+ dummy_symbol->subroutine |= attr.subroutine;
|
||||||
|
+ dummy_symbol->dimension |= attr.dimension;
|
||||||
|
+ dummy_symbol->in_equivalence |= attr.in_equivalence;
|
||||||
|
+ dummy_symbol->use_assoc |= attr.use_assoc;
|
||||||
|
+ dummy_symbol->cray_pointer |= attr.cray_pointer;
|
||||||
|
+ dummy_symbol->cray_pointee |= attr.cray_pointee;
|
||||||
|
+ dummy_symbol->data |= attr.data;
|
||||||
|
+ dummy_symbol->value |= attr.value;
|
||||||
|
+ dummy_symbol->volatile_ |= attr.volatile_;
|
||||||
|
+ dummy_symbol->is_protected |= attr.is_protected;
|
||||||
|
+ dummy_symbol->is_bind_c |= attr.is_bind_c;
|
||||||
|
+ dummy_symbol->procedure |= attr.procedure;
|
||||||
|
+ dummy_symbol->proc_pointer |= attr.proc_pointer;
|
||||||
|
+ dummy_symbol->abstract |= attr.abstract;
|
||||||
|
+ dummy_symbol->asynchronous |= attr.asynchronous;
|
||||||
|
+ dummy_symbol->codimension |= attr.codimension;
|
||||||
|
+ dummy_symbol->contiguous |= attr.contiguous;
|
||||||
|
+ dummy_symbol->generic |= attr.generic;
|
||||||
|
+ dummy_symbol->automatic |= attr.automatic;
|
||||||
|
+ dummy_symbol->threadprivate |= attr.threadprivate;
|
||||||
|
+ dummy_symbol->omp_declare_target |= attr.omp_declare_target;
|
||||||
|
+ dummy_symbol->omp_declare_target_link |= attr.omp_declare_target_link;
|
||||||
|
+ dummy_symbol->oacc_declare_copyin |= attr.oacc_declare_copyin;
|
||||||
|
+ dummy_symbol->oacc_declare_create |= attr.oacc_declare_create;
|
||||||
|
+ dummy_symbol->oacc_declare_deviceptr |= attr.oacc_declare_deviceptr;
|
||||||
|
+ dummy_symbol->oacc_declare_device_resident
|
||||||
|
+ |= attr.oacc_declare_device_resident;
|
||||||
|
+
|
||||||
|
+ /* Not strictly correct, but probably close enough. */
|
||||||
|
+ if (attr.save > dummy_symbol->save)
|
||||||
|
+ dummy_symbol->save = attr.save;
|
||||||
|
+ if (attr.intent > dummy_symbol->intent)
|
||||||
|
+ dummy_symbol->intent = attr.intent;
|
||||||
|
+ if (attr.access > dummy_symbol->access)
|
||||||
|
+ dummy_symbol->access = attr.access;
|
||||||
|
+}
|
||||||
|
|
||||||
|
/* Given a segment element, search through the equivalence lists for unused
|
||||||
|
conditions that involve the symbol. Add these rules to the segment. */
|
||||||
|
@@ -965,9 +1025,12 @@ find_equivalence (segment_info *n)
|
||||||
|
eq = NULL;
|
||||||
|
|
||||||
|
/* Search the equivalence list, including the root (first) element
|
||||||
|
- for the symbol that owns the segment. */
|
||||||
|
+ for the symbol that owns the segment. */
|
||||||
|
+ symbol_attribute dummy_symbol;
|
||||||
|
+ memset (&dummy_symbol, 0, sizeof (dummy_symbol));
|
||||||
|
for (e2 = e1; e2; e2 = e2->eq)
|
||||||
|
{
|
||||||
|
+ accumulate_equivalence_attributes (&dummy_symbol, e2);
|
||||||
|
if (!e2->used && e2->expr->symtree->n.sym == n->sym)
|
||||||
|
{
|
||||||
|
eq = e2;
|
||||||
|
@@ -975,6 +1038,8 @@ find_equivalence (segment_info *n)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+ check_conflict (&dummy_symbol, e1->expr->symtree->name, &e1->expr->where);
|
||||||
|
+
|
||||||
|
/* Go to the next root element. */
|
||||||
|
if (eq == NULL)
|
||||||
|
continue;
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/auto_in_equiv_1.f90 b/gcc/testsuite/gfortran.dg/auto_in_equiv_1.f90
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..61bfd0738c5
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/auto_in_equiv_1.f90
|
||||||
|
@@ -0,0 +1,36 @@
|
||||||
|
+! { dg-compile }
|
||||||
|
+
|
||||||
|
+! Contributed by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+program test
|
||||||
|
+ call suba(0)
|
||||||
|
+ call subb(0)
|
||||||
|
+ call suba(1)
|
||||||
|
+
|
||||||
|
+contains
|
||||||
|
+ subroutine suba(option)
|
||||||
|
+ integer, intent(in) :: option
|
||||||
|
+ integer, automatic :: a ! { dg-error "AUTOMATIC at \\(1\\) is a DEC extension" }
|
||||||
|
+ integer :: b
|
||||||
|
+ integer :: c
|
||||||
|
+ equivalence (a, b)
|
||||||
|
+ if (option.eq.0) then
|
||||||
|
+ ! initialise a and c
|
||||||
|
+ a = 9
|
||||||
|
+ c = 99
|
||||||
|
+ if (a.ne.b) stop 1
|
||||||
|
+ if (loc(a).ne.loc(b)) stop 2
|
||||||
|
+ else
|
||||||
|
+ ! a should've been overwritten
|
||||||
|
+ if (a.eq.9) stop 3
|
||||||
|
+ end if
|
||||||
|
+ end subroutine suba
|
||||||
|
+
|
||||||
|
+ subroutine subb(dummy)
|
||||||
|
+ integer, intent(in) :: dummy
|
||||||
|
+ integer, automatic :: x ! { dg-error "AUTOMATIC at \\(1\\) is a DEC extension" }
|
||||||
|
+ integer :: y
|
||||||
|
+ x = 77
|
||||||
|
+ y = 7
|
||||||
|
+ end subroutine subb
|
||||||
|
+
|
||||||
|
+end program test
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/auto_in_equiv_2.f90 b/gcc/testsuite/gfortran.dg/auto_in_equiv_2.f90
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..406e718604a
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/auto_in_equiv_2.f90
|
||||||
|
@@ -0,0 +1,38 @@
|
||||||
|
+! { dg-run }
|
||||||
|
+! { dg-options "-fdec-static" }
|
||||||
|
+
|
||||||
|
+! Contributed by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+
|
||||||
|
+program test
|
||||||
|
+ call suba(0)
|
||||||
|
+ call subb(0)
|
||||||
|
+ call suba(1)
|
||||||
|
+
|
||||||
|
+contains
|
||||||
|
+ subroutine suba(option)
|
||||||
|
+ integer, intent(in) :: option
|
||||||
|
+ integer, automatic :: a
|
||||||
|
+ integer :: b
|
||||||
|
+ integer :: c
|
||||||
|
+ equivalence (a, b)
|
||||||
|
+ if (option.eq.0) then
|
||||||
|
+ ! initialise a and c
|
||||||
|
+ a = 9
|
||||||
|
+ c = 99
|
||||||
|
+ if (a.ne.b) stop 1
|
||||||
|
+ if (loc(a).ne.loc(b)) stop 2
|
||||||
|
+ else
|
||||||
|
+ ! a should've been overwritten
|
||||||
|
+ if (a.eq.9) stop 3
|
||||||
|
+ end if
|
||||||
|
+ end subroutine suba
|
||||||
|
+
|
||||||
|
+ subroutine subb(dummy)
|
||||||
|
+ integer, intent(in) :: dummy
|
||||||
|
+ integer, automatic :: x
|
||||||
|
+ integer :: y
|
||||||
|
+ x = 77
|
||||||
|
+ y = 7
|
||||||
|
+ end subroutine subb
|
||||||
|
+
|
||||||
|
+end program test
|
||||||
|
diff --git a/gcc/testsuite/gfortran.dg/auto_in_equiv_3.f90 b/gcc/testsuite/gfortran.dg/auto_in_equiv_3.f90
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000000..c67aa8c6ac1
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/gcc/testsuite/gfortran.dg/auto_in_equiv_3.f90
|
||||||
|
@@ -0,0 +1,63 @@
|
||||||
|
+! { dg-run }
|
||||||
|
+! { dg-options "-fdec-static -fno-automatic" }
|
||||||
|
+
|
||||||
|
+! Contributed by Mark Eggleston <mark.eggleston@codethink.com>
|
||||||
|
+
|
||||||
|
+! Storage is NOT on the static unless explicitly specified using the
|
||||||
|
+! DEC extension "automatic". The address of the first local variable
|
||||||
|
+! is used to determine that storage for the automatic local variable
|
||||||
|
+! is different to that of a local variable with no attributes. The
|
||||||
|
+! contents of the local variable in suba should be overwritten by the
|
||||||
|
+! call to subb.
|
||||||
|
+!
|
||||||
|
+program test
|
||||||
|
+ integer :: dummy
|
||||||
|
+ integer, parameter :: address = kind(loc(dummy))
|
||||||
|
+ integer(address) :: ad1
|
||||||
|
+ integer(address) :: ad2
|
||||||
|
+ integer(address) :: ad3
|
||||||
|
+ logical :: ok
|
||||||
|
+
|
||||||
|
+ call suba(0, ad1)
|
||||||
|
+ call subb(0, ad2)
|
||||||
|
+ call suba(1, ad1)
|
||||||
|
+ call subc(0, ad3)
|
||||||
|
+ ok = (ad1.eq.ad3).and.(ad1.ne.ad2)
|
||||||
|
+ if (.not.ok) stop 4
|
||||||
|
+
|
||||||
|
+contains
|
||||||
|
+ subroutine suba(option, addr)
|
||||||
|
+ integer, intent(in) :: option
|
||||||
|
+ integer(address), intent(out) :: addr
|
||||||
|
+ integer, automatic :: a
|
||||||
|
+ integer :: b
|
||||||
|
+ equivalence (a, b)
|
||||||
|
+ addr = loc(a)
|
||||||
|
+ if (option.eq.0) then
|
||||||
|
+ ! initialise a and c
|
||||||
|
+ a = 9
|
||||||
|
+ if (a.ne.b) stop 1
|
||||||
|
+ if (loc(a).ne.loc(b)) stop 2
|
||||||
|
+ else
|
||||||
|
+ ! a should've been overwritten
|
||||||
|
+ if (a.eq.9) stop 3
|
||||||
|
+ end if
|
||||||
|
+ end subroutine suba
|
||||||
|
+
|
||||||
|
+ subroutine subb(dummy, addr)
|
||||||
|
+ integer, intent(in) :: dummy
|
||||||
|
+ integer(address), intent(out) :: addr
|
||||||
|
+ integer :: x
|
||||||
|
+ addr = loc(x)
|
||||||
|
+ x = 77
|
||||||
|
+ end subroutine subb
|
||||||
|
+
|
||||||
|
+ subroutine subc(dummy, addr)
|
||||||
|
+ integer, intent(in) :: dummy
|
||||||
|
+ integer(address), intent(out) :: addr
|
||||||
|
+ integer, automatic :: y
|
||||||
|
+ addr = loc(y)
|
||||||
|
+ y = 77
|
||||||
|
+ end subroutine subc
|
||||||
|
+
|
||||||
|
+end program test
|
||||||
|
--
|
||||||
|
2.11.0
|
||||||
|
|
@ -0,0 +1,49 @@
|
|||||||
|
From 9bf3b68e118a749ab87f52649fd56aca059470e8 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Mark Eggleston <markeggleston@codethink.com>
|
||||||
|
Date: Tue, 16 Apr 2019 09:09:12 +0100
|
||||||
|
Subject: [PATCH 16/16] Suppress warning with -Wno-overwrite-recursive
|
||||||
|
|
||||||
|
The message "Warning: Flag '-fno-automatic' overwrites '-frecursive'" is
|
||||||
|
output by default when -fno-automatic and -frecursive are used together.
|
||||||
|
It warns that recursion may be broken, however if all the relavent variables
|
||||||
|
in the recursive procedure have automatic attributes the warning is
|
||||||
|
unnecessary so -Wno-overwrite-recursive can be used to suppress it. This
|
||||||
|
will allow compilation when warnings are regarded as errors.
|
||||||
|
|
||||||
|
Suppress warning with -Wno-overwrite-recursive
|
||||||
|
---
|
||||||
|
gcc/fortran/lang.opt | 4 ++++
|
||||||
|
gcc/fortran/options.c | 2 +-
|
||||||
|
2 files changed, 5 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/gcc/fortran/lang.opt b/gcc/fortran/lang.opt
|
||||||
|
index dca3fd27aa3..e5074f614e3 100644
|
||||||
|
--- a/gcc/fortran/lang.opt
|
||||||
|
+++ b/gcc/fortran/lang.opt
|
||||||
|
@@ -293,6 +293,10 @@ Wopenmp-simd
|
||||||
|
Fortran
|
||||||
|
; Documented in C
|
||||||
|
|
||||||
|
+Woverwrite-recursive
|
||||||
|
+Fortran Warning Var(warn_overwrite_recursive) Init(1)
|
||||||
|
+Warn that -fno-automatic may break recursion.
|
||||||
|
+
|
||||||
|
Wpedantic
|
||||||
|
Fortran
|
||||||
|
; Documented in common.opt
|
||||||
|
diff --git a/gcc/fortran/options.c b/gcc/fortran/options.c
|
||||||
|
index f417f48f6a7..6cbc64bf1ae 100644
|
||||||
|
--- a/gcc/fortran/options.c
|
||||||
|
+++ b/gcc/fortran/options.c
|
||||||
|
@@ -418,7 +418,7 @@ gfc_post_options (const char **pfilename)
|
||||||
|
&& flag_max_stack_var_size != 0)
|
||||||
|
gfc_warning_now (0, "Flag %<-fno-automatic%> overwrites %<-fmax-stack-var-size=%d%>",
|
||||||
|
flag_max_stack_var_size);
|
||||||
|
- else if (!flag_automatic && flag_recursive)
|
||||||
|
+ else if (!flag_automatic && flag_recursive && warn_overwrite_recursive)
|
||||||
|
gfc_warning_now (0, "Flag %<-fno-automatic%> overwrites %<-frecursive%>");
|
||||||
|
else if (!flag_automatic && flag_openmp)
|
||||||
|
gfc_warning_now (0, "Flag %<-fno-automatic%> overwrites %<-frecursive%> implied by "
|
||||||
|
--
|
||||||
|
2.11.0
|
||||||
|
|
27
SOURCES/gcc10-Wno-format-security.patch
Normal file
27
SOURCES/gcc10-Wno-format-security.patch
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
2017-02-25 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
* configure.ac: When adding -Wno-format, also add -Wno-format-security.
|
||||||
|
* configure: Regenerated.
|
||||||
|
|
||||||
|
--- gcc/configure.ac.jj 2017-02-13 12:20:53.000000000 +0100
|
||||||
|
+++ gcc/configure.ac 2017-02-25 12:42:32.859175403 +0100
|
||||||
|
@@ -480,7 +480,7 @@ AC_ARG_ENABLE(build-format-warnings,
|
||||||
|
AS_HELP_STRING([--disable-build-format-warnings],[don't use -Wformat while building GCC]),
|
||||||
|
[],[enable_build_format_warnings=yes])
|
||||||
|
AS_IF([test $enable_build_format_warnings = no],
|
||||||
|
- [wf_opt=-Wno-format],[wf_opt=])
|
||||||
|
+ [wf_opt="-Wno-format -Wno-format-security"],[wf_opt=])
|
||||||
|
ACX_PROG_CXX_WARNING_OPTS(
|
||||||
|
m4_quote(m4_do([-W -Wall -Wno-narrowing -Wwrite-strings ],
|
||||||
|
[-Wcast-qual -Wno-error=format-diag $wf_opt])),
|
||||||
|
--- gcc/configure.jj 2017-02-13 12:20:52.000000000 +0100
|
||||||
|
+++ gcc/configure 2017-02-25 12:42:50.041946391 +0100
|
||||||
|
@@ -6647,7 +6647,7 @@ else
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test $enable_build_format_warnings = no; then :
|
||||||
|
- wf_opt=-Wno-format
|
||||||
|
+ wf_opt="-Wno-format -Wno-format-security"
|
||||||
|
else
|
||||||
|
wf_opt=
|
||||||
|
fi
|
20
SOURCES/gcc10-d-shared-libphobos.patch
Normal file
20
SOURCES/gcc10-d-shared-libphobos.patch
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
2019-01-17 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
* d-spec.cc (lang_specific_driver): Make -shared-libphobos
|
||||||
|
the default rather than -static-libphobos.
|
||||||
|
|
||||||
|
--- gcc/d/d-spec.cc.jj 2019-01-01 12:37:49.502444257 +0100
|
||||||
|
+++ gcc/d/d-spec.cc 2019-01-17 17:09:45.364949246 +0100
|
||||||
|
@@ -408,9 +408,9 @@ lang_specific_driver (cl_decoded_option
|
||||||
|
/* Add `-lgphobos' if we haven't already done so. */
|
||||||
|
if (phobos_library != PHOBOS_NOLINK)
|
||||||
|
{
|
||||||
|
- /* Default to static linking. */
|
||||||
|
- if (phobos_library != PHOBOS_DYNAMIC)
|
||||||
|
- phobos_library = PHOBOS_STATIC;
|
||||||
|
+ /* Default to shared linking. */
|
||||||
|
+ if (phobos_library != PHOBOS_STATIC)
|
||||||
|
+ phobos_library = PHOBOS_DYNAMIC;
|
||||||
|
|
||||||
|
#ifdef HAVE_LD_STATIC_DYNAMIC
|
||||||
|
if (phobos_library == PHOBOS_STATIC && !static_link)
|
122
SOURCES/gcc10-foffload-default.patch
Normal file
122
SOURCES/gcc10-foffload-default.patch
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
2019-01-17 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
* gcc.c (offload_targets_default): New variable.
|
||||||
|
(process_command): Set it if -foffload is defaulted.
|
||||||
|
(driver::maybe_putenv_OFFLOAD_TARGETS): Add OFFLOAD_TARGET_DEFAULT=1
|
||||||
|
into environment if -foffload has been defaulted.
|
||||||
|
* lto-wrapper.c (OFFLOAD_TARGET_DEFAULT_ENV): Define.
|
||||||
|
(compile_offload_image): If OFFLOAD_TARGET_DEFAULT
|
||||||
|
is in the environment, don't fail if corresponding mkoffload
|
||||||
|
can't be found.
|
||||||
|
(compile_images_for_offload_targets): Likewise. Free and clear
|
||||||
|
offload_names if no valid offload is found.
|
||||||
|
libgomp/
|
||||||
|
* target.c (gomp_load_plugin_for_device): If a plugin can't be
|
||||||
|
dlopened, assume it has no devices silently.
|
||||||
|
|
||||||
|
--- gcc/gcc.c.jj 2017-01-17 10:28:40.000000000 +0100
|
||||||
|
+++ gcc/gcc.c 2017-01-20 16:26:29.649962902 +0100
|
||||||
|
@@ -290,6 +290,10 @@ static const char *spec_host_machine = D
|
||||||
|
|
||||||
|
static char *offload_targets = NULL;
|
||||||
|
|
||||||
|
+/* Set to true if -foffload has not been used and offload_targets
|
||||||
|
+ is set to the configured in default. */
|
||||||
|
+static bool offload_targets_default;
|
||||||
|
+
|
||||||
|
/* Nonzero if cross-compiling.
|
||||||
|
When -b is used, the value comes from the `specs' file. */
|
||||||
|
|
||||||
|
@@ -4457,7 +4461,10 @@ process_command (unsigned int decoded_op
|
||||||
|
/* If the user didn't specify any, default to all configured offload
|
||||||
|
targets. */
|
||||||
|
if (ENABLE_OFFLOADING && offload_targets == NULL)
|
||||||
|
- handle_foffload_option (OFFLOAD_TARGETS);
|
||||||
|
+ {
|
||||||
|
+ handle_foffload_option (OFFLOAD_TARGETS);
|
||||||
|
+ offload_targets_default = true;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
if (output_file
|
||||||
|
&& strcmp (output_file, "-") != 0
|
||||||
|
@@ -7693,6 +7700,8 @@ driver::maybe_putenv_OFFLOAD_TARGETS ()
|
||||||
|
obstack_grow (&collect_obstack, offload_targets,
|
||||||
|
strlen (offload_targets) + 1);
|
||||||
|
xputenv (XOBFINISH (&collect_obstack, char *));
|
||||||
|
+ if (offload_targets_default)
|
||||||
|
+ xputenv ("OFFLOAD_TARGET_DEFAULT=1");
|
||||||
|
}
|
||||||
|
|
||||||
|
free (offload_targets);
|
||||||
|
--- gcc/lto-wrapper.c.jj 2017-01-01 12:45:34.000000000 +0100
|
||||||
|
+++ gcc/lto-wrapper.c 2017-01-20 16:34:18.294016997 +0100
|
||||||
|
@@ -52,6 +52,7 @@ along with GCC; see the file COPYING3.
|
||||||
|
/* Environment variable, used for passing the names of offload targets from GCC
|
||||||
|
driver to lto-wrapper. */
|
||||||
|
#define OFFLOAD_TARGET_NAMES_ENV "OFFLOAD_TARGET_NAMES"
|
||||||
|
+#define OFFLOAD_TARGET_DEFAULT_ENV "OFFLOAD_TARGET_DEFAULT"
|
||||||
|
|
||||||
|
enum lto_mode_d {
|
||||||
|
LTO_MODE_NONE, /* Not doing LTO. */
|
||||||
|
@@ -822,6 +823,12 @@ compile_offload_image (const char *targe
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (!compiler && getenv (OFFLOAD_TARGET_DEFAULT_ENV))
|
||||||
|
+ {
|
||||||
|
+ free_array_of_ptrs ((void **) paths, n_paths);
|
||||||
|
+ return NULL;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (!compiler)
|
||||||
|
fatal_error (input_location,
|
||||||
|
"could not find %s in %s (consider using %<-B%>)",
|
||||||
|
@@ -885,6 +892,7 @@ compile_images_for_offload_targets (unsi
|
||||||
|
unsigned num_targets = parse_env_var (target_names, &names, NULL);
|
||||||
|
|
||||||
|
int next_name_entry = 0;
|
||||||
|
+ bool hsa_seen = false;
|
||||||
|
const char *compiler_path = getenv ("COMPILER_PATH");
|
||||||
|
if (!compiler_path)
|
||||||
|
goto out;
|
||||||
|
@@ -897,18 +905,26 @@ compile_images_for_offload_targets (unsi
|
||||||
|
/* HSA does not use LTO-like streaming and a different compiler, skip
|
||||||
|
it. */
|
||||||
|
if (strcmp (names[i], "hsa") == 0)
|
||||||
|
- continue;
|
||||||
|
+ {
|
||||||
|
+ hsa_seen = true;
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
offload_names[next_name_entry]
|
||||||
|
= compile_offload_image (names[i], compiler_path, in_argc, in_argv,
|
||||||
|
compiler_opts, compiler_opt_count,
|
||||||
|
linker_opts, linker_opt_count);
|
||||||
|
if (!offload_names[next_name_entry])
|
||||||
|
- fatal_error (input_location,
|
||||||
|
- "problem with building target image for %s", names[i]);
|
||||||
|
+ continue;
|
||||||
|
next_name_entry++;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (next_name_entry == 0 && !hsa_seen)
|
||||||
|
+ {
|
||||||
|
+ free (offload_names);
|
||||||
|
+ offload_names = NULL;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
out:
|
||||||
|
free_array_of_ptrs ((void **) names, num_targets);
|
||||||
|
}
|
||||||
|
--- libgomp/target.c.jj 2017-01-01 12:45:52.000000000 +0100
|
||||||
|
+++ libgomp/target.c 2017-01-20 20:12:13.756710875 +0100
|
||||||
|
@@ -2356,7 +2356,7 @@ gomp_load_plugin_for_device (struct gomp
|
||||||
|
|
||||||
|
void *plugin_handle = dlopen (plugin_name, RTLD_LAZY);
|
||||||
|
if (!plugin_handle)
|
||||||
|
- goto dl_fail;
|
||||||
|
+ return 0;
|
||||||
|
|
||||||
|
/* Check if all required functions are available in the plugin and store
|
||||||
|
their handlers. None of the symbols can legitimately be NULL,
|
126
SOURCES/gcc10-hack.patch
Normal file
126
SOURCES/gcc10-hack.patch
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
--- libada/Makefile.in.jj 2019-01-09 13:01:18.015608205 +0100
|
||||||
|
+++ libada/Makefile.in 2019-01-11 18:16:23.441726931 +0100
|
||||||
|
@@ -71,18 +71,40 @@ version := $(shell @get_gcc_base_ver@ $(
|
||||||
|
libsubdir := $(libdir)/gcc/$(target_noncanonical)/$(version)$(MULTISUBDIR)
|
||||||
|
ADA_RTS_DIR=$(GCC_DIR)/ada/rts$(subst /,_,$(MULTISUBDIR))
|
||||||
|
|
||||||
|
+DEFAULTMULTIFLAGS :=
|
||||||
|
+ifeq ($(MULTISUBDIR),)
|
||||||
|
+targ:=$(subst -, ,$(target))
|
||||||
|
+arch:=$(word 1,$(targ))
|
||||||
|
+ifeq ($(words $(targ)),2)
|
||||||
|
+osys:=$(word 2,$(targ))
|
||||||
|
+else
|
||||||
|
+osys:=$(word 3,$(targ))
|
||||||
|
+endif
|
||||||
|
+ifeq ($(strip $(filter-out i%86 x86_64 powerpc% ppc% s390% sparc% linux%, $(arch) $(osys))),)
|
||||||
|
+ifeq ($(shell $(CC) $(CFLAGS) -print-multi-os-directory),../lib64)
|
||||||
|
+DEFAULTMULTIFLAGS := -m64
|
||||||
|
+else
|
||||||
|
+ifeq ($(strip $(filter-out s390%, $(arch))),)
|
||||||
|
+DEFAULTMULTIFLAGS := -m31
|
||||||
|
+else
|
||||||
|
+DEFAULTMULTIFLAGS := -m32
|
||||||
|
+endif
|
||||||
|
+endif
|
||||||
|
+endif
|
||||||
|
+endif
|
||||||
|
+
|
||||||
|
# exeext should not be used because it's the *host* exeext. We're building
|
||||||
|
# a *target* library, aren't we?!? Likewise for CC. Still, provide bogus
|
||||||
|
# definitions just in case something slips through the safety net provided
|
||||||
|
# by recursive make invocations in gcc/ada/Makefile.in
|
||||||
|
LIBADA_FLAGS_TO_PASS = \
|
||||||
|
"MAKEOVERRIDES=" \
|
||||||
|
- "LDFLAGS=$(LDFLAGS)" \
|
||||||
|
+ "LDFLAGS=$(LDFLAGS) $(DEFAULTMULTIFLAGS)" \
|
||||||
|
"LN_S=$(LN_S)" \
|
||||||
|
"SHELL=$(SHELL)" \
|
||||||
|
- "GNATLIBFLAGS=$(GNATLIBFLAGS) $(MULTIFLAGS)" \
|
||||||
|
- "GNATLIBCFLAGS=$(GNATLIBCFLAGS) $(MULTIFLAGS)" \
|
||||||
|
- "GNATLIBCFLAGS_FOR_C=$(GNATLIBCFLAGS_FOR_C) $(MULTIFLAGS)" \
|
||||||
|
+ "GNATLIBFLAGS=$(GNATLIBFLAGS) $(MULTIFLAGS) $(DEFAULTMULTIFLAGS)" \
|
||||||
|
+ "GNATLIBCFLAGS=$(GNATLIBCFLAGS) $(MULTIFLAGS) $(DEFAULTMULTIFLAGS)" \
|
||||||
|
+ "GNATLIBCFLAGS_FOR_C=$(GNATLIBCFLAGS_FOR_C) $(MULTIFLAGS) $(DEFAULTMULTIFLAGS)" \
|
||||||
|
"PICFLAG_FOR_TARGET=$(PICFLAG)" \
|
||||||
|
"THREAD_KIND=$(THREAD_KIND)" \
|
||||||
|
"TRACE=$(TRACE)" \
|
||||||
|
@@ -93,7 +115,7 @@ LIBADA_FLAGS_TO_PASS = \
|
||||||
|
"exeext=.exeext.should.not.be.used " \
|
||||||
|
'CC=the.host.compiler.should.not.be.needed' \
|
||||||
|
"GCC_FOR_TARGET=$(CC)" \
|
||||||
|
- "CFLAGS=$(CFLAGS)"
|
||||||
|
+ "CFLAGS=$(CFLAGS) $(DEFAULTMULTIFLAGS)"
|
||||||
|
|
||||||
|
.PHONY: libada gnatlib gnatlib-shared gnatlib-sjlj gnatlib-zcx osconstool
|
||||||
|
|
||||||
|
--- config-ml.in.jj 2019-01-09 12:50:16.646501448 +0100
|
||||||
|
+++ config-ml.in 2019-01-11 18:16:23.442726914 +0100
|
||||||
|
@@ -511,6 +511,8 @@ multi-do:
|
||||||
|
ADAFLAGS="$(ADAFLAGS) $${flags}" \
|
||||||
|
prefix="$(prefix)" \
|
||||||
|
exec_prefix="$(exec_prefix)" \
|
||||||
|
+ mandir="$(mandir)" \
|
||||||
|
+ infodir="$(infodir)" \
|
||||||
|
GOCFLAGS="$(GOCFLAGS) $${flags}" \
|
||||||
|
GDCFLAGS="$(GDCFLAGS) $${flags}" \
|
||||||
|
CXXFLAGS="$(CXXFLAGS) $${flags}" \
|
||||||
|
--- libcpp/macro.c.jj 2019-01-09 13:01:21.420552123 +0100
|
||||||
|
+++ libcpp/macro.c 2019-01-11 18:18:17.736876285 +0100
|
||||||
|
@@ -3256,8 +3256,6 @@ static cpp_macro *
|
||||||
|
create_iso_definition (cpp_reader *pfile)
|
||||||
|
{
|
||||||
|
bool following_paste_op = false;
|
||||||
|
- const char *paste_op_error_msg =
|
||||||
|
- N_("'##' cannot appear at either end of a macro expansion");
|
||||||
|
unsigned int num_extra_tokens = 0;
|
||||||
|
unsigned nparms = 0;
|
||||||
|
cpp_hashnode **params = NULL;
|
||||||
|
@@ -3382,7 +3380,9 @@ create_iso_definition (cpp_reader *pfile
|
||||||
|
function-like macros, but not at the end. */
|
||||||
|
if (following_paste_op)
|
||||||
|
{
|
||||||
|
- cpp_error (pfile, CPP_DL_ERROR, paste_op_error_msg);
|
||||||
|
+ cpp_error (pfile, CPP_DL_ERROR,
|
||||||
|
+ "'##' cannot appear at either end of a macro "
|
||||||
|
+ "expansion");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
if (!vaopt_tracker.completed ())
|
||||||
|
@@ -3397,7 +3397,9 @@ create_iso_definition (cpp_reader *pfile
|
||||||
|
function-like macros, but not at the beginning. */
|
||||||
|
if (macro->count == 1)
|
||||||
|
{
|
||||||
|
- cpp_error (pfile, CPP_DL_ERROR, paste_op_error_msg);
|
||||||
|
+ cpp_error (pfile, CPP_DL_ERROR,
|
||||||
|
+ "'##' cannot appear at either end of a macro "
|
||||||
|
+ "expansion");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
--- libcpp/expr.c.jj 2019-01-09 13:01:22.415535734 +0100
|
||||||
|
+++ libcpp/expr.c 2019-01-11 18:16:23.444726882 +0100
|
||||||
|
@@ -788,16 +788,17 @@ cpp_classify_number (cpp_reader *pfile,
|
||||||
|
if ((result & CPP_N_WIDTH) == CPP_N_LARGE
|
||||||
|
&& CPP_OPTION (pfile, cpp_warn_long_long))
|
||||||
|
{
|
||||||
|
- const char *message = CPP_OPTION (pfile, cplusplus)
|
||||||
|
- ? N_("use of C++11 long long integer constant")
|
||||||
|
- : N_("use of C99 long long integer constant");
|
||||||
|
-
|
||||||
|
if (CPP_OPTION (pfile, c99))
|
||||||
|
cpp_warning_with_line (pfile, CPP_W_LONG_LONG, virtual_location,
|
||||||
|
- 0, message);
|
||||||
|
+ 0, CPP_OPTION (pfile, cplusplus)
|
||||||
|
+ ? N_("use of C++11 long long integer constant")
|
||||||
|
+ : N_("use of C99 long long integer constant"));
|
||||||
|
else
|
||||||
|
cpp_pedwarning_with_line (pfile, CPP_W_LONG_LONG,
|
||||||
|
- virtual_location, 0, message);
|
||||||
|
+ virtual_location, 0,
|
||||||
|
+ CPP_OPTION (pfile, cplusplus)
|
||||||
|
+ ? N_("use of C++11 long long integer constant")
|
||||||
|
+ : N_("use of C99 long long integer constant"));
|
||||||
|
}
|
||||||
|
|
||||||
|
result |= CPP_N_INTEGER;
|
11
SOURCES/gcc10-i386-libgomp.patch
Normal file
11
SOURCES/gcc10-i386-libgomp.patch
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
--- libgomp/configure.tgt.jj 2008-01-10 20:53:48.000000000 +0100
|
||||||
|
+++ libgomp/configure.tgt 2008-03-27 12:44:51.000000000 +0100
|
||||||
|
@@ -67,7 +67,7 @@ if test $enable_linux_futex = yes; then
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
if test -z "$with_arch"; then
|
||||||
|
- XCFLAGS="${XCFLAGS} -march=i486 -mtune=${target_cpu}"
|
||||||
|
+ XCFLAGS="${XCFLAGS} -march=i486 -mtune=generic"
|
||||||
|
fi
|
||||||
|
esac
|
||||||
|
;;
|
715
SOURCES/gcc10-isl-dl.patch
Normal file
715
SOURCES/gcc10-isl-dl.patch
Normal file
@ -0,0 +1,715 @@
|
|||||||
|
--- gcc/Makefile.in.jj 2015-06-06 10:00:25.000000000 +0200
|
||||||
|
+++ gcc/Makefile.in 2015-11-04 14:56:02.643536437 +0100
|
||||||
|
@@ -1063,7 +1063,7 @@ BUILD_LIBDEPS= $(BUILD_LIBIBERTY)
|
||||||
|
# and the system's installed libraries.
|
||||||
|
LIBS = @LIBS@ libcommon.a $(CPPLIB) $(LIBINTL) $(LIBICONV) $(LIBBACKTRACE) \
|
||||||
|
$(LIBIBERTY) $(LIBDECNUMBER) $(HOST_LIBS)
|
||||||
|
-BACKENDLIBS = $(ISLLIBS) $(GMPLIBS) $(PLUGINLIBS) $(HOST_LIBS) \
|
||||||
|
+BACKENDLIBS = $(if $(ISLLIBS),-ldl) $(GMPLIBS) $(PLUGINLIBS) $(HOST_LIBS) \
|
||||||
|
$(ZLIB) $(ZSTD_LIB)
|
||||||
|
# Any system libraries needed just for GNAT.
|
||||||
|
SYSLIBS = @GNAT_LIBEXC@
|
||||||
|
@@ -2302,6 +2302,15 @@ $(out_object_file): $(out_file)
|
||||||
|
$(common_out_object_file): $(common_out_file)
|
||||||
|
$(COMPILE) $<
|
||||||
|
$(POSTCOMPILE)
|
||||||
|
+
|
||||||
|
+graphite%.o : \
|
||||||
|
+ ALL_CFLAGS := -O $(filter-out -fkeep-inline-functions, $(ALL_CFLAGS))
|
||||||
|
+graphite.o : \
|
||||||
|
+ ALL_CFLAGS := -O $(filter-out -fkeep-inline-functions, $(ALL_CFLAGS))
|
||||||
|
+graphite%.o : \
|
||||||
|
+ ALL_CXXFLAGS := -O $(filter-out -fkeep-inline-functions, $(ALL_CXXFLAGS))
|
||||||
|
+graphite.o : \
|
||||||
|
+ ALL_CXXFLAGS := -O $(filter-out -fkeep-inline-functions, $(ALL_CXXFLAGS))
|
||||||
|
#
|
||||||
|
# Generate header and source files from the machine description,
|
||||||
|
# and compile them.
|
||||||
|
--- gcc/graphite.h.jj 2016-01-27 12:44:06.000000000 +0100
|
||||||
|
+++ gcc/graphite.h 2016-01-27 13:26:38.309876856 +0100
|
||||||
|
@@ -39,6 +39,590 @@ along with GCC; see the file COPYING3.
|
||||||
|
#include <isl/schedule_node.h>
|
||||||
|
#include <isl/id.h>
|
||||||
|
#include <isl/space.h>
|
||||||
|
+#include <isl/version.h>
|
||||||
|
+#include <dlfcn.h>
|
||||||
|
+
|
||||||
|
+#define DYNSYMS \
|
||||||
|
+ DYNSYM (isl_aff_add_coefficient_si); \
|
||||||
|
+ DYNSYM (isl_aff_free); \
|
||||||
|
+ DYNSYM (isl_aff_get_space); \
|
||||||
|
+ DYNSYM (isl_aff_set_coefficient_si); \
|
||||||
|
+ DYNSYM (isl_aff_set_constant_si); \
|
||||||
|
+ DYNSYM (isl_aff_zero_on_domain); \
|
||||||
|
+ DYNSYM (isl_band_free); \
|
||||||
|
+ DYNSYM (isl_band_get_children); \
|
||||||
|
+ DYNSYM (isl_band_get_partial_schedule); \
|
||||||
|
+ DYNSYM (isl_band_has_children); \
|
||||||
|
+ DYNSYM (isl_band_list_free); \
|
||||||
|
+ DYNSYM (isl_band_list_get_band); \
|
||||||
|
+ DYNSYM (isl_band_list_get_ctx); \
|
||||||
|
+ DYNSYM (isl_band_list_n_band); \
|
||||||
|
+ DYNSYM (isl_band_n_member); \
|
||||||
|
+ DYNSYM (isl_basic_map_add_constraint); \
|
||||||
|
+ DYNSYM (isl_basic_map_project_out); \
|
||||||
|
+ DYNSYM (isl_basic_map_universe); \
|
||||||
|
+ DYNSYM (isl_constraint_set_coefficient_si); \
|
||||||
|
+ DYNSYM (isl_constraint_set_constant_si); \
|
||||||
|
+ DYNSYM (isl_ctx_alloc); \
|
||||||
|
+ DYNSYM (isl_ctx_free); \
|
||||||
|
+ DYNSYM (isl_equality_alloc); \
|
||||||
|
+ DYNSYM (isl_id_alloc); \
|
||||||
|
+ DYNSYM (isl_id_copy); \
|
||||||
|
+ DYNSYM (isl_id_free); \
|
||||||
|
+ DYNSYM (isl_inequality_alloc); \
|
||||||
|
+ DYNSYM (isl_local_space_copy); \
|
||||||
|
+ DYNSYM (isl_local_space_free); \
|
||||||
|
+ DYNSYM (isl_local_space_from_space); \
|
||||||
|
+ DYNSYM (isl_local_space_range); \
|
||||||
|
+ DYNSYM (isl_map_add_constraint); \
|
||||||
|
+ DYNSYM (isl_map_add_dims); \
|
||||||
|
+ DYNSYM (isl_map_align_params); \
|
||||||
|
+ DYNSYM (isl_map_apply_range); \
|
||||||
|
+ DYNSYM (isl_map_copy); \
|
||||||
|
+ DYNSYM (isl_map_dim); \
|
||||||
|
+ DYNSYM (isl_map_dump); \
|
||||||
|
+ DYNSYM (isl_map_equate); \
|
||||||
|
+ DYNSYM (isl_map_fix_si); \
|
||||||
|
+ DYNSYM (isl_map_flat_product); \
|
||||||
|
+ DYNSYM (isl_map_flat_range_product); \
|
||||||
|
+ DYNSYM (isl_map_free); \
|
||||||
|
+ DYNSYM (isl_map_from_basic_map); \
|
||||||
|
+ DYNSYM (isl_map_from_pw_aff); \
|
||||||
|
+ DYNSYM (isl_map_from_union_map); \
|
||||||
|
+ DYNSYM (isl_map_get_ctx); \
|
||||||
|
+ DYNSYM (isl_map_get_space); \
|
||||||
|
+ DYNSYM (isl_map_get_tuple_id); \
|
||||||
|
+ DYNSYM (isl_map_insert_dims); \
|
||||||
|
+ DYNSYM (isl_map_intersect); \
|
||||||
|
+ DYNSYM (isl_map_intersect_domain); \
|
||||||
|
+ DYNSYM (isl_map_intersect_range); \
|
||||||
|
+ DYNSYM (isl_map_is_empty); \
|
||||||
|
+ DYNSYM (isl_map_lex_ge); \
|
||||||
|
+ DYNSYM (isl_map_lex_le); \
|
||||||
|
+ DYNSYM (isl_map_n_out); \
|
||||||
|
+ DYNSYM (isl_map_range); \
|
||||||
|
+ DYNSYM (isl_map_set_tuple_id); \
|
||||||
|
+ DYNSYM (isl_map_universe); \
|
||||||
|
+ DYNSYM (isl_options_set_on_error); \
|
||||||
|
+ DYNSYM (isl_options_set_schedule_serialize_sccs); \
|
||||||
|
+ DYNSYM (isl_printer_set_yaml_style); \
|
||||||
|
+ DYNSYM (isl_options_set_schedule_max_constant_term); \
|
||||||
|
+ DYNSYM (isl_options_set_schedule_maximize_band_depth); \
|
||||||
|
+ DYNSYM (isl_printer_free); \
|
||||||
|
+ DYNSYM (isl_printer_print_aff); \
|
||||||
|
+ DYNSYM (isl_printer_print_constraint); \
|
||||||
|
+ DYNSYM (isl_printer_print_map); \
|
||||||
|
+ DYNSYM (isl_printer_print_set); \
|
||||||
|
+ DYNSYM (isl_printer_to_file); \
|
||||||
|
+ DYNSYM (isl_pw_aff_add); \
|
||||||
|
+ DYNSYM (isl_pw_aff_alloc); \
|
||||||
|
+ DYNSYM (isl_pw_aff_copy); \
|
||||||
|
+ DYNSYM (isl_pw_aff_eq_set); \
|
||||||
|
+ DYNSYM (isl_pw_aff_free); \
|
||||||
|
+ DYNSYM (isl_pw_aff_from_aff); \
|
||||||
|
+ DYNSYM (isl_pw_aff_ge_set); \
|
||||||
|
+ DYNSYM (isl_pw_aff_gt_set); \
|
||||||
|
+ DYNSYM (isl_pw_aff_is_cst); \
|
||||||
|
+ DYNSYM (isl_pw_aff_le_set); \
|
||||||
|
+ DYNSYM (isl_pw_aff_lt_set); \
|
||||||
|
+ DYNSYM (isl_pw_aff_mul); \
|
||||||
|
+ DYNSYM (isl_pw_aff_ne_set); \
|
||||||
|
+ DYNSYM (isl_pw_aff_nonneg_set); \
|
||||||
|
+ DYNSYM (isl_pw_aff_set_tuple_id); \
|
||||||
|
+ DYNSYM (isl_pw_aff_sub); \
|
||||||
|
+ DYNSYM (isl_pw_aff_zero_set); \
|
||||||
|
+ DYNSYM (isl_schedule_free); \
|
||||||
|
+ DYNSYM (isl_schedule_get_band_forest); \
|
||||||
|
+ DYNSYM (isl_set_add_constraint); \
|
||||||
|
+ DYNSYM (isl_set_add_dims); \
|
||||||
|
+ DYNSYM (isl_set_apply); \
|
||||||
|
+ DYNSYM (isl_set_coalesce); \
|
||||||
|
+ DYNSYM (isl_set_copy); \
|
||||||
|
+ DYNSYM (isl_set_dim); \
|
||||||
|
+ DYNSYM (isl_set_fix_si); \
|
||||||
|
+ DYNSYM (isl_set_free); \
|
||||||
|
+ DYNSYM (isl_set_get_space); \
|
||||||
|
+ DYNSYM (isl_set_get_tuple_id); \
|
||||||
|
+ DYNSYM (isl_set_intersect); \
|
||||||
|
+ DYNSYM (isl_set_is_empty); \
|
||||||
|
+ DYNSYM (isl_set_n_dim); \
|
||||||
|
+ DYNSYM (isl_set_nat_universe); \
|
||||||
|
+ DYNSYM (isl_set_project_out); \
|
||||||
|
+ DYNSYM (isl_set_set_tuple_id); \
|
||||||
|
+ DYNSYM (isl_set_universe); \
|
||||||
|
+ DYNSYM (isl_space_add_dims); \
|
||||||
|
+ DYNSYM (isl_space_alloc); \
|
||||||
|
+ DYNSYM (isl_space_copy); \
|
||||||
|
+ DYNSYM (isl_space_dim); \
|
||||||
|
+ DYNSYM (isl_space_domain); \
|
||||||
|
+ DYNSYM (isl_space_find_dim_by_id); \
|
||||||
|
+ DYNSYM (isl_space_free); \
|
||||||
|
+ DYNSYM (isl_space_from_domain); \
|
||||||
|
+ DYNSYM (isl_space_get_tuple_id); \
|
||||||
|
+ DYNSYM (isl_space_params_alloc); \
|
||||||
|
+ DYNSYM (isl_space_range); \
|
||||||
|
+ DYNSYM (isl_space_set_alloc); \
|
||||||
|
+ DYNSYM (isl_space_set_dim_id); \
|
||||||
|
+ DYNSYM (isl_space_set_tuple_id); \
|
||||||
|
+ DYNSYM (isl_union_map_add_map); \
|
||||||
|
+ DYNSYM (isl_union_map_align_params); \
|
||||||
|
+ DYNSYM (isl_union_map_apply_domain); \
|
||||||
|
+ DYNSYM (isl_union_map_apply_range); \
|
||||||
|
+ DYNSYM (isl_union_map_compute_flow); \
|
||||||
|
+ DYNSYM (isl_union_map_copy); \
|
||||||
|
+ DYNSYM (isl_union_map_empty); \
|
||||||
|
+ DYNSYM (isl_union_map_flat_range_product); \
|
||||||
|
+ DYNSYM (isl_union_map_foreach_map); \
|
||||||
|
+ DYNSYM (isl_union_map_free); \
|
||||||
|
+ DYNSYM (isl_union_map_from_map); \
|
||||||
|
+ DYNSYM (isl_union_map_get_ctx); \
|
||||||
|
+ DYNSYM (isl_union_map_get_space); \
|
||||||
|
+ DYNSYM (isl_union_map_gist_domain); \
|
||||||
|
+ DYNSYM (isl_union_map_gist_range); \
|
||||||
|
+ DYNSYM (isl_union_map_intersect_domain); \
|
||||||
|
+ DYNSYM (isl_union_map_is_empty); \
|
||||||
|
+ DYNSYM (isl_union_map_subtract); \
|
||||||
|
+ DYNSYM (isl_union_map_union); \
|
||||||
|
+ DYNSYM (isl_union_set_add_set); \
|
||||||
|
+ DYNSYM (isl_union_set_compute_schedule); \
|
||||||
|
+ DYNSYM (isl_union_set_copy); \
|
||||||
|
+ DYNSYM (isl_union_set_empty); \
|
||||||
|
+ DYNSYM (isl_union_set_from_set); \
|
||||||
|
+ DYNSYM (isl_aff_add_constant_val); \
|
||||||
|
+ DYNSYM (isl_aff_get_coefficient_val); \
|
||||||
|
+ DYNSYM (isl_aff_get_ctx); \
|
||||||
|
+ DYNSYM (isl_aff_mod_val); \
|
||||||
|
+ DYNSYM (isl_ast_build_ast_from_schedule); \
|
||||||
|
+ DYNSYM (isl_ast_build_free); \
|
||||||
|
+ DYNSYM (isl_ast_build_from_context); \
|
||||||
|
+ DYNSYM (isl_ast_build_get_ctx); \
|
||||||
|
+ DYNSYM (isl_ast_build_get_schedule); \
|
||||||
|
+ DYNSYM (isl_ast_build_get_schedule_space); \
|
||||||
|
+ DYNSYM (isl_ast_build_set_before_each_for); \
|
||||||
|
+ DYNSYM (isl_ast_build_set_options); \
|
||||||
|
+ DYNSYM (isl_ast_expr_free); \
|
||||||
|
+ DYNSYM (isl_ast_expr_from_val); \
|
||||||
|
+ DYNSYM (isl_ast_expr_get_ctx); \
|
||||||
|
+ DYNSYM (isl_ast_expr_get_id); \
|
||||||
|
+ DYNSYM (isl_ast_expr_get_op_arg); \
|
||||||
|
+ DYNSYM (isl_ast_expr_get_op_n_arg); \
|
||||||
|
+ DYNSYM (isl_ast_expr_get_op_type); \
|
||||||
|
+ DYNSYM (isl_ast_expr_get_type); \
|
||||||
|
+ DYNSYM (isl_ast_expr_get_val); \
|
||||||
|
+ DYNSYM (isl_ast_expr_sub); \
|
||||||
|
+ DYNSYM (isl_ast_node_block_get_children); \
|
||||||
|
+ DYNSYM (isl_ast_node_for_get_body); \
|
||||||
|
+ DYNSYM (isl_ast_node_for_get_cond); \
|
||||||
|
+ DYNSYM (isl_ast_node_for_get_inc); \
|
||||||
|
+ DYNSYM (isl_ast_node_for_get_init); \
|
||||||
|
+ DYNSYM (isl_ast_node_for_get_iterator); \
|
||||||
|
+ DYNSYM (isl_ast_node_free); \
|
||||||
|
+ DYNSYM (isl_ast_node_get_annotation); \
|
||||||
|
+ DYNSYM (isl_ast_node_get_type); \
|
||||||
|
+ DYNSYM (isl_ast_node_if_get_cond); \
|
||||||
|
+ DYNSYM (isl_ast_node_if_get_else); \
|
||||||
|
+ DYNSYM (isl_ast_node_if_get_then); \
|
||||||
|
+ DYNSYM (isl_ast_node_list_free); \
|
||||||
|
+ DYNSYM (isl_ast_node_list_get_ast_node); \
|
||||||
|
+ DYNSYM (isl_ast_node_list_n_ast_node); \
|
||||||
|
+ DYNSYM (isl_ast_node_user_get_expr); \
|
||||||
|
+ DYNSYM (isl_constraint_set_coefficient_val); \
|
||||||
|
+ DYNSYM (isl_constraint_set_constant_val); \
|
||||||
|
+ DYNSYM (isl_id_get_user); \
|
||||||
|
+ DYNSYM (isl_local_space_get_ctx); \
|
||||||
|
+ DYNSYM (isl_map_fix_val); \
|
||||||
|
+ DYNSYM (isl_options_set_ast_build_atomic_upper_bound); \
|
||||||
|
+ DYNSYM (isl_printer_print_ast_node); \
|
||||||
|
+ DYNSYM (isl_printer_print_str); \
|
||||||
|
+ DYNSYM (isl_printer_set_output_format); \
|
||||||
|
+ DYNSYM (isl_pw_aff_mod_val); \
|
||||||
|
+ DYNSYM (isl_schedule_constraints_compute_schedule); \
|
||||||
|
+ DYNSYM (isl_schedule_constraints_on_domain); \
|
||||||
|
+ DYNSYM (isl_schedule_constraints_set_coincidence); \
|
||||||
|
+ DYNSYM (isl_schedule_constraints_set_proximity); \
|
||||||
|
+ DYNSYM (isl_schedule_constraints_set_validity); \
|
||||||
|
+ DYNSYM (isl_set_get_dim_id); \
|
||||||
|
+ DYNSYM (isl_set_max_val); \
|
||||||
|
+ DYNSYM (isl_set_min_val); \
|
||||||
|
+ DYNSYM (isl_set_params); \
|
||||||
|
+ DYNSYM (isl_space_align_params); \
|
||||||
|
+ DYNSYM (isl_space_map_from_domain_and_range); \
|
||||||
|
+ DYNSYM (isl_space_set_tuple_name); \
|
||||||
|
+ DYNSYM (isl_space_wrap); \
|
||||||
|
+ DYNSYM (isl_union_map_from_domain_and_range); \
|
||||||
|
+ DYNSYM (isl_union_map_range); \
|
||||||
|
+ DYNSYM (isl_union_set_union); \
|
||||||
|
+ DYNSYM (isl_union_set_universe); \
|
||||||
|
+ DYNSYM (isl_val_2exp); \
|
||||||
|
+ DYNSYM (isl_val_add_ui); \
|
||||||
|
+ DYNSYM (isl_val_copy); \
|
||||||
|
+ DYNSYM (isl_val_free); \
|
||||||
|
+ DYNSYM (isl_val_int_from_si); \
|
||||||
|
+ DYNSYM (isl_val_int_from_ui); \
|
||||||
|
+ DYNSYM (isl_val_mul); \
|
||||||
|
+ DYNSYM (isl_val_neg); \
|
||||||
|
+ DYNSYM (isl_val_sub); \
|
||||||
|
+ DYNSYM (isl_printer_print_union_map); \
|
||||||
|
+ DYNSYM (isl_pw_aff_get_ctx); \
|
||||||
|
+ DYNSYM (isl_val_is_int); \
|
||||||
|
+ DYNSYM (isl_ctx_get_max_operations); \
|
||||||
|
+ DYNSYM (isl_ctx_set_max_operations); \
|
||||||
|
+ DYNSYM (isl_ctx_last_error); \
|
||||||
|
+ DYNSYM (isl_ctx_reset_operations); \
|
||||||
|
+ DYNSYM (isl_map_coalesce); \
|
||||||
|
+ DYNSYM (isl_printer_print_schedule); \
|
||||||
|
+ DYNSYM (isl_set_set_dim_id); \
|
||||||
|
+ DYNSYM (isl_union_map_coalesce); \
|
||||||
|
+ DYNSYM (isl_multi_val_set_val); \
|
||||||
|
+ DYNSYM (isl_multi_val_zero); \
|
||||||
|
+ DYNSYM (isl_options_set_schedule_max_coefficient); \
|
||||||
|
+ DYNSYM (isl_options_set_tile_scale_tile_loops); \
|
||||||
|
+ DYNSYM (isl_schedule_copy); \
|
||||||
|
+ DYNSYM (isl_schedule_get_map); \
|
||||||
|
+ DYNSYM (isl_schedule_map_schedule_node_bottom_up); \
|
||||||
|
+ DYNSYM (isl_schedule_node_band_get_permutable); \
|
||||||
|
+ DYNSYM (isl_schedule_node_band_get_space); \
|
||||||
|
+ DYNSYM (isl_schedule_node_band_tile); \
|
||||||
|
+ DYNSYM (isl_schedule_node_child); \
|
||||||
|
+ DYNSYM (isl_schedule_node_free); \
|
||||||
|
+ DYNSYM (isl_schedule_node_get_child); \
|
||||||
|
+ DYNSYM (isl_schedule_node_get_ctx); \
|
||||||
|
+ DYNSYM (isl_schedule_node_get_type); \
|
||||||
|
+ DYNSYM (isl_schedule_node_n_children); \
|
||||||
|
+ DYNSYM (isl_union_map_is_equal); \
|
||||||
|
+ DYNSYM (isl_union_access_info_compute_flow); \
|
||||||
|
+ DYNSYM (isl_union_access_info_from_sink); \
|
||||||
|
+ DYNSYM (isl_union_access_info_set_may_source); \
|
||||||
|
+ DYNSYM (isl_union_access_info_set_must_source); \
|
||||||
|
+ DYNSYM (isl_union_access_info_set_schedule); \
|
||||||
|
+ DYNSYM (isl_union_flow_free); \
|
||||||
|
+ DYNSYM (isl_union_flow_get_may_dependence); \
|
||||||
|
+ DYNSYM (isl_union_flow_get_must_dependence); \
|
||||||
|
+ DYNSYM (isl_aff_var_on_domain); \
|
||||||
|
+ DYNSYM (isl_multi_aff_from_aff); \
|
||||||
|
+ DYNSYM (isl_schedule_get_ctx); \
|
||||||
|
+ DYNSYM (isl_multi_aff_set_tuple_id); \
|
||||||
|
+ DYNSYM (isl_multi_aff_dim); \
|
||||||
|
+ DYNSYM (isl_schedule_get_domain); \
|
||||||
|
+ DYNSYM (isl_union_set_is_empty); \
|
||||||
|
+ DYNSYM (isl_union_set_get_space); \
|
||||||
|
+ DYNSYM (isl_union_pw_multi_aff_empty); \
|
||||||
|
+ DYNSYM (isl_union_set_foreach_set); \
|
||||||
|
+ DYNSYM (isl_union_set_free); \
|
||||||
|
+ DYNSYM (isl_multi_union_pw_aff_from_union_pw_multi_aff); \
|
||||||
|
+ DYNSYM (isl_multi_union_pw_aff_apply_multi_aff); \
|
||||||
|
+ DYNSYM (isl_schedule_insert_partial_schedule); \
|
||||||
|
+ DYNSYM (isl_union_pw_multi_aff_free); \
|
||||||
|
+ DYNSYM (isl_pw_multi_aff_project_out_map); \
|
||||||
|
+ DYNSYM (isl_union_pw_multi_aff_add_pw_multi_aff); \
|
||||||
|
+ DYNSYM (isl_schedule_from_domain); \
|
||||||
|
+ DYNSYM (isl_schedule_sequence); \
|
||||||
|
+ DYNSYM (isl_ast_build_node_from_schedule); \
|
||||||
|
+ DYNSYM (isl_ast_node_mark_get_node); \
|
||||||
|
+ DYNSYM (isl_schedule_node_band_member_get_ast_loop_type); \
|
||||||
|
+ DYNSYM (isl_schedule_node_band_member_set_ast_loop_type); \
|
||||||
|
+ DYNSYM (isl_val_n_abs_num_chunks); \
|
||||||
|
+ DYNSYM (isl_val_get_abs_num_chunks); \
|
||||||
|
+ DYNSYM (isl_val_int_from_chunks); \
|
||||||
|
+ DYNSYM (isl_val_is_neg); \
|
||||||
|
+ DYNSYM (isl_version); \
|
||||||
|
+ DYNSYM (isl_options_get_on_error); \
|
||||||
|
+ DYNSYM (isl_ctx_reset_error);
|
||||||
|
+
|
||||||
|
+extern struct isl_pointers_s__
|
||||||
|
+{
|
||||||
|
+ bool inited;
|
||||||
|
+ void *h;
|
||||||
|
+#define DYNSYM(x) __typeof (x) *p_##x
|
||||||
|
+ DYNSYMS
|
||||||
|
+#undef DYNSYM
|
||||||
|
+} isl_pointers__;
|
||||||
|
+
|
||||||
|
+#define isl_aff_add_coefficient_si (*isl_pointers__.p_isl_aff_add_coefficient_si)
|
||||||
|
+#define isl_aff_free (*isl_pointers__.p_isl_aff_free)
|
||||||
|
+#define isl_aff_get_space (*isl_pointers__.p_isl_aff_get_space)
|
||||||
|
+#define isl_aff_set_coefficient_si (*isl_pointers__.p_isl_aff_set_coefficient_si)
|
||||||
|
+#define isl_aff_set_constant_si (*isl_pointers__.p_isl_aff_set_constant_si)
|
||||||
|
+#define isl_aff_zero_on_domain (*isl_pointers__.p_isl_aff_zero_on_domain)
|
||||||
|
+#define isl_band_free (*isl_pointers__.p_isl_band_free)
|
||||||
|
+#define isl_band_get_children (*isl_pointers__.p_isl_band_get_children)
|
||||||
|
+#define isl_band_get_partial_schedule (*isl_pointers__.p_isl_band_get_partial_schedule)
|
||||||
|
+#define isl_band_has_children (*isl_pointers__.p_isl_band_has_children)
|
||||||
|
+#define isl_band_list_free (*isl_pointers__.p_isl_band_list_free)
|
||||||
|
+#define isl_band_list_get_band (*isl_pointers__.p_isl_band_list_get_band)
|
||||||
|
+#define isl_band_list_get_ctx (*isl_pointers__.p_isl_band_list_get_ctx)
|
||||||
|
+#define isl_band_list_n_band (*isl_pointers__.p_isl_band_list_n_band)
|
||||||
|
+#define isl_band_n_member (*isl_pointers__.p_isl_band_n_member)
|
||||||
|
+#define isl_basic_map_add_constraint (*isl_pointers__.p_isl_basic_map_add_constraint)
|
||||||
|
+#define isl_basic_map_project_out (*isl_pointers__.p_isl_basic_map_project_out)
|
||||||
|
+#define isl_basic_map_universe (*isl_pointers__.p_isl_basic_map_universe)
|
||||||
|
+#define isl_constraint_set_coefficient_si (*isl_pointers__.p_isl_constraint_set_coefficient_si)
|
||||||
|
+#define isl_constraint_set_constant_si (*isl_pointers__.p_isl_constraint_set_constant_si)
|
||||||
|
+#define isl_ctx_alloc (*isl_pointers__.p_isl_ctx_alloc)
|
||||||
|
+#define isl_ctx_free (*isl_pointers__.p_isl_ctx_free)
|
||||||
|
+#define isl_equality_alloc (*isl_pointers__.p_isl_equality_alloc)
|
||||||
|
+#define isl_id_alloc (*isl_pointers__.p_isl_id_alloc)
|
||||||
|
+#define isl_id_copy (*isl_pointers__.p_isl_id_copy)
|
||||||
|
+#define isl_id_free (*isl_pointers__.p_isl_id_free)
|
||||||
|
+#define isl_inequality_alloc (*isl_pointers__.p_isl_inequality_alloc)
|
||||||
|
+#define isl_local_space_copy (*isl_pointers__.p_isl_local_space_copy)
|
||||||
|
+#define isl_local_space_free (*isl_pointers__.p_isl_local_space_free)
|
||||||
|
+#define isl_local_space_from_space (*isl_pointers__.p_isl_local_space_from_space)
|
||||||
|
+#define isl_local_space_range (*isl_pointers__.p_isl_local_space_range)
|
||||||
|
+#define isl_map_add_constraint (*isl_pointers__.p_isl_map_add_constraint)
|
||||||
|
+#define isl_map_add_dims (*isl_pointers__.p_isl_map_add_dims)
|
||||||
|
+#define isl_map_align_params (*isl_pointers__.p_isl_map_align_params)
|
||||||
|
+#define isl_map_apply_range (*isl_pointers__.p_isl_map_apply_range)
|
||||||
|
+#define isl_map_copy (*isl_pointers__.p_isl_map_copy)
|
||||||
|
+#define isl_map_dim (*isl_pointers__.p_isl_map_dim)
|
||||||
|
+#define isl_map_dump (*isl_pointers__.p_isl_map_dump)
|
||||||
|
+#define isl_map_equate (*isl_pointers__.p_isl_map_equate)
|
||||||
|
+#define isl_map_fix_si (*isl_pointers__.p_isl_map_fix_si)
|
||||||
|
+#define isl_map_flat_product (*isl_pointers__.p_isl_map_flat_product)
|
||||||
|
+#define isl_map_flat_range_product (*isl_pointers__.p_isl_map_flat_range_product)
|
||||||
|
+#define isl_map_free (*isl_pointers__.p_isl_map_free)
|
||||||
|
+#define isl_map_from_basic_map (*isl_pointers__.p_isl_map_from_basic_map)
|
||||||
|
+#define isl_map_from_pw_aff (*isl_pointers__.p_isl_map_from_pw_aff)
|
||||||
|
+#define isl_map_from_union_map (*isl_pointers__.p_isl_map_from_union_map)
|
||||||
|
+#define isl_map_get_ctx (*isl_pointers__.p_isl_map_get_ctx)
|
||||||
|
+#define isl_map_get_space (*isl_pointers__.p_isl_map_get_space)
|
||||||
|
+#define isl_map_get_tuple_id (*isl_pointers__.p_isl_map_get_tuple_id)
|
||||||
|
+#define isl_map_insert_dims (*isl_pointers__.p_isl_map_insert_dims)
|
||||||
|
+#define isl_map_intersect (*isl_pointers__.p_isl_map_intersect)
|
||||||
|
+#define isl_map_intersect_domain (*isl_pointers__.p_isl_map_intersect_domain)
|
||||||
|
+#define isl_map_intersect_range (*isl_pointers__.p_isl_map_intersect_range)
|
||||||
|
+#define isl_map_is_empty (*isl_pointers__.p_isl_map_is_empty)
|
||||||
|
+#define isl_map_lex_ge (*isl_pointers__.p_isl_map_lex_ge)
|
||||||
|
+#define isl_map_lex_le (*isl_pointers__.p_isl_map_lex_le)
|
||||||
|
+#define isl_map_n_out (*isl_pointers__.p_isl_map_n_out)
|
||||||
|
+#define isl_map_range (*isl_pointers__.p_isl_map_range)
|
||||||
|
+#define isl_map_set_tuple_id (*isl_pointers__.p_isl_map_set_tuple_id)
|
||||||
|
+#define isl_map_universe (*isl_pointers__.p_isl_map_universe)
|
||||||
|
+#define isl_options_set_on_error (*isl_pointers__.p_isl_options_set_on_error)
|
||||||
|
+#define isl_options_set_schedule_serialize_sccs (*isl_pointers__.p_isl_options_set_schedule_serialize_sccs)
|
||||||
|
+#define isl_printer_set_yaml_style (*isl_pointers__.p_isl_printer_set_yaml_style)
|
||||||
|
+#define isl_options_set_schedule_max_constant_term (*isl_pointers__.p_isl_options_set_schedule_max_constant_term)
|
||||||
|
+#define isl_options_set_schedule_maximize_band_depth (*isl_pointers__.p_isl_options_set_schedule_maximize_band_depth)
|
||||||
|
+#define isl_printer_free (*isl_pointers__.p_isl_printer_free)
|
||||||
|
+#define isl_printer_print_aff (*isl_pointers__.p_isl_printer_print_aff)
|
||||||
|
+#define isl_printer_print_constraint (*isl_pointers__.p_isl_printer_print_constraint)
|
||||||
|
+#define isl_printer_print_map (*isl_pointers__.p_isl_printer_print_map)
|
||||||
|
+#define isl_printer_print_set (*isl_pointers__.p_isl_printer_print_set)
|
||||||
|
+#define isl_printer_to_file (*isl_pointers__.p_isl_printer_to_file)
|
||||||
|
+#define isl_pw_aff_add (*isl_pointers__.p_isl_pw_aff_add)
|
||||||
|
+#define isl_pw_aff_alloc (*isl_pointers__.p_isl_pw_aff_alloc)
|
||||||
|
+#define isl_pw_aff_copy (*isl_pointers__.p_isl_pw_aff_copy)
|
||||||
|
+#define isl_pw_aff_eq_set (*isl_pointers__.p_isl_pw_aff_eq_set)
|
||||||
|
+#define isl_pw_aff_free (*isl_pointers__.p_isl_pw_aff_free)
|
||||||
|
+#define isl_pw_aff_from_aff (*isl_pointers__.p_isl_pw_aff_from_aff)
|
||||||
|
+#define isl_pw_aff_ge_set (*isl_pointers__.p_isl_pw_aff_ge_set)
|
||||||
|
+#define isl_pw_aff_gt_set (*isl_pointers__.p_isl_pw_aff_gt_set)
|
||||||
|
+#define isl_pw_aff_is_cst (*isl_pointers__.p_isl_pw_aff_is_cst)
|
||||||
|
+#define isl_pw_aff_le_set (*isl_pointers__.p_isl_pw_aff_le_set)
|
||||||
|
+#define isl_pw_aff_lt_set (*isl_pointers__.p_isl_pw_aff_lt_set)
|
||||||
|
+#define isl_pw_aff_mul (*isl_pointers__.p_isl_pw_aff_mul)
|
||||||
|
+#define isl_pw_aff_ne_set (*isl_pointers__.p_isl_pw_aff_ne_set)
|
||||||
|
+#define isl_pw_aff_nonneg_set (*isl_pointers__.p_isl_pw_aff_nonneg_set)
|
||||||
|
+#define isl_pw_aff_set_tuple_id (*isl_pointers__.p_isl_pw_aff_set_tuple_id)
|
||||||
|
+#define isl_pw_aff_sub (*isl_pointers__.p_isl_pw_aff_sub)
|
||||||
|
+#define isl_pw_aff_zero_set (*isl_pointers__.p_isl_pw_aff_zero_set)
|
||||||
|
+#define isl_schedule_free (*isl_pointers__.p_isl_schedule_free)
|
||||||
|
+#define isl_schedule_get_band_forest (*isl_pointers__.p_isl_schedule_get_band_forest)
|
||||||
|
+#define isl_set_add_constraint (*isl_pointers__.p_isl_set_add_constraint)
|
||||||
|
+#define isl_set_add_dims (*isl_pointers__.p_isl_set_add_dims)
|
||||||
|
+#define isl_set_apply (*isl_pointers__.p_isl_set_apply)
|
||||||
|
+#define isl_set_coalesce (*isl_pointers__.p_isl_set_coalesce)
|
||||||
|
+#define isl_set_copy (*isl_pointers__.p_isl_set_copy)
|
||||||
|
+#define isl_set_dim (*isl_pointers__.p_isl_set_dim)
|
||||||
|
+#define isl_set_fix_si (*isl_pointers__.p_isl_set_fix_si)
|
||||||
|
+#define isl_set_free (*isl_pointers__.p_isl_set_free)
|
||||||
|
+#define isl_set_get_space (*isl_pointers__.p_isl_set_get_space)
|
||||||
|
+#define isl_set_get_tuple_id (*isl_pointers__.p_isl_set_get_tuple_id)
|
||||||
|
+#define isl_set_intersect (*isl_pointers__.p_isl_set_intersect)
|
||||||
|
+#define isl_set_is_empty (*isl_pointers__.p_isl_set_is_empty)
|
||||||
|
+#define isl_set_n_dim (*isl_pointers__.p_isl_set_n_dim)
|
||||||
|
+#define isl_set_nat_universe (*isl_pointers__.p_isl_set_nat_universe)
|
||||||
|
+#define isl_set_project_out (*isl_pointers__.p_isl_set_project_out)
|
||||||
|
+#define isl_set_set_tuple_id (*isl_pointers__.p_isl_set_set_tuple_id)
|
||||||
|
+#define isl_set_universe (*isl_pointers__.p_isl_set_universe)
|
||||||
|
+#define isl_space_add_dims (*isl_pointers__.p_isl_space_add_dims)
|
||||||
|
+#define isl_space_alloc (*isl_pointers__.p_isl_space_alloc)
|
||||||
|
+#define isl_space_copy (*isl_pointers__.p_isl_space_copy)
|
||||||
|
+#define isl_space_dim (*isl_pointers__.p_isl_space_dim)
|
||||||
|
+#define isl_space_domain (*isl_pointers__.p_isl_space_domain)
|
||||||
|
+#define isl_space_find_dim_by_id (*isl_pointers__.p_isl_space_find_dim_by_id)
|
||||||
|
+#define isl_space_free (*isl_pointers__.p_isl_space_free)
|
||||||
|
+#define isl_space_from_domain (*isl_pointers__.p_isl_space_from_domain)
|
||||||
|
+#define isl_space_get_tuple_id (*isl_pointers__.p_isl_space_get_tuple_id)
|
||||||
|
+#define isl_space_params_alloc (*isl_pointers__.p_isl_space_params_alloc)
|
||||||
|
+#define isl_space_range (*isl_pointers__.p_isl_space_range)
|
||||||
|
+#define isl_space_set_alloc (*isl_pointers__.p_isl_space_set_alloc)
|
||||||
|
+#define isl_space_set_dim_id (*isl_pointers__.p_isl_space_set_dim_id)
|
||||||
|
+#define isl_space_set_tuple_id (*isl_pointers__.p_isl_space_set_tuple_id)
|
||||||
|
+#define isl_union_map_add_map (*isl_pointers__.p_isl_union_map_add_map)
|
||||||
|
+#define isl_union_map_align_params (*isl_pointers__.p_isl_union_map_align_params)
|
||||||
|
+#define isl_union_map_apply_domain (*isl_pointers__.p_isl_union_map_apply_domain)
|
||||||
|
+#define isl_union_map_apply_range (*isl_pointers__.p_isl_union_map_apply_range)
|
||||||
|
+#define isl_union_map_compute_flow (*isl_pointers__.p_isl_union_map_compute_flow)
|
||||||
|
+#define isl_union_map_copy (*isl_pointers__.p_isl_union_map_copy)
|
||||||
|
+#define isl_union_map_empty (*isl_pointers__.p_isl_union_map_empty)
|
||||||
|
+#define isl_union_map_flat_range_product (*isl_pointers__.p_isl_union_map_flat_range_product)
|
||||||
|
+#define isl_union_map_foreach_map (*isl_pointers__.p_isl_union_map_foreach_map)
|
||||||
|
+#define isl_union_map_free (*isl_pointers__.p_isl_union_map_free)
|
||||||
|
+#define isl_union_map_from_map (*isl_pointers__.p_isl_union_map_from_map)
|
||||||
|
+#define isl_union_map_get_ctx (*isl_pointers__.p_isl_union_map_get_ctx)
|
||||||
|
+#define isl_union_map_get_space (*isl_pointers__.p_isl_union_map_get_space)
|
||||||
|
+#define isl_union_map_gist_domain (*isl_pointers__.p_isl_union_map_gist_domain)
|
||||||
|
+#define isl_union_map_gist_range (*isl_pointers__.p_isl_union_map_gist_range)
|
||||||
|
+#define isl_union_map_intersect_domain (*isl_pointers__.p_isl_union_map_intersect_domain)
|
||||||
|
+#define isl_union_map_is_empty (*isl_pointers__.p_isl_union_map_is_empty)
|
||||||
|
+#define isl_union_map_subtract (*isl_pointers__.p_isl_union_map_subtract)
|
||||||
|
+#define isl_union_map_union (*isl_pointers__.p_isl_union_map_union)
|
||||||
|
+#define isl_union_set_add_set (*isl_pointers__.p_isl_union_set_add_set)
|
||||||
|
+#define isl_union_set_compute_schedule (*isl_pointers__.p_isl_union_set_compute_schedule)
|
||||||
|
+#define isl_union_set_copy (*isl_pointers__.p_isl_union_set_copy)
|
||||||
|
+#define isl_union_set_empty (*isl_pointers__.p_isl_union_set_empty)
|
||||||
|
+#define isl_union_set_from_set (*isl_pointers__.p_isl_union_set_from_set)
|
||||||
|
+#define isl_aff_add_constant_val (*isl_pointers__.p_isl_aff_add_constant_val)
|
||||||
|
+#define isl_aff_get_coefficient_val (*isl_pointers__.p_isl_aff_get_coefficient_val)
|
||||||
|
+#define isl_aff_get_ctx (*isl_pointers__.p_isl_aff_get_ctx)
|
||||||
|
+#define isl_aff_mod_val (*isl_pointers__.p_isl_aff_mod_val)
|
||||||
|
+#define isl_ast_build_ast_from_schedule (*isl_pointers__.p_isl_ast_build_ast_from_schedule)
|
||||||
|
+#define isl_ast_build_free (*isl_pointers__.p_isl_ast_build_free)
|
||||||
|
+#define isl_ast_build_from_context (*isl_pointers__.p_isl_ast_build_from_context)
|
||||||
|
+#define isl_ast_build_get_ctx (*isl_pointers__.p_isl_ast_build_get_ctx)
|
||||||
|
+#define isl_ast_build_get_schedule (*isl_pointers__.p_isl_ast_build_get_schedule)
|
||||||
|
+#define isl_ast_build_get_schedule_space (*isl_pointers__.p_isl_ast_build_get_schedule_space)
|
||||||
|
+#define isl_ast_build_set_before_each_for (*isl_pointers__.p_isl_ast_build_set_before_each_for)
|
||||||
|
+#define isl_ast_build_set_options (*isl_pointers__.p_isl_ast_build_set_options)
|
||||||
|
+#define isl_ast_expr_free (*isl_pointers__.p_isl_ast_expr_free)
|
||||||
|
+#define isl_ast_expr_from_val (*isl_pointers__.p_isl_ast_expr_from_val)
|
||||||
|
+#define isl_ast_expr_get_ctx (*isl_pointers__.p_isl_ast_expr_get_ctx)
|
||||||
|
+#define isl_ast_expr_get_id (*isl_pointers__.p_isl_ast_expr_get_id)
|
||||||
|
+#define isl_ast_expr_get_op_arg (*isl_pointers__.p_isl_ast_expr_get_op_arg)
|
||||||
|
+#define isl_ast_expr_get_op_n_arg (*isl_pointers__.p_isl_ast_expr_get_op_n_arg)
|
||||||
|
+#define isl_ast_expr_get_op_type (*isl_pointers__.p_isl_ast_expr_get_op_type)
|
||||||
|
+#define isl_ast_expr_get_type (*isl_pointers__.p_isl_ast_expr_get_type)
|
||||||
|
+#define isl_ast_expr_get_val (*isl_pointers__.p_isl_ast_expr_get_val)
|
||||||
|
+#define isl_ast_expr_sub (*isl_pointers__.p_isl_ast_expr_sub)
|
||||||
|
+#define isl_ast_node_block_get_children (*isl_pointers__.p_isl_ast_node_block_get_children)
|
||||||
|
+#define isl_ast_node_for_get_body (*isl_pointers__.p_isl_ast_node_for_get_body)
|
||||||
|
+#define isl_ast_node_for_get_cond (*isl_pointers__.p_isl_ast_node_for_get_cond)
|
||||||
|
+#define isl_ast_node_for_get_inc (*isl_pointers__.p_isl_ast_node_for_get_inc)
|
||||||
|
+#define isl_ast_node_for_get_init (*isl_pointers__.p_isl_ast_node_for_get_init)
|
||||||
|
+#define isl_ast_node_for_get_iterator (*isl_pointers__.p_isl_ast_node_for_get_iterator)
|
||||||
|
+#define isl_ast_node_free (*isl_pointers__.p_isl_ast_node_free)
|
||||||
|
+#define isl_ast_node_get_annotation (*isl_pointers__.p_isl_ast_node_get_annotation)
|
||||||
|
+#define isl_ast_node_get_type (*isl_pointers__.p_isl_ast_node_get_type)
|
||||||
|
+#define isl_ast_node_if_get_cond (*isl_pointers__.p_isl_ast_node_if_get_cond)
|
||||||
|
+#define isl_ast_node_if_get_else (*isl_pointers__.p_isl_ast_node_if_get_else)
|
||||||
|
+#define isl_ast_node_if_get_then (*isl_pointers__.p_isl_ast_node_if_get_then)
|
||||||
|
+#define isl_ast_node_list_free (*isl_pointers__.p_isl_ast_node_list_free)
|
||||||
|
+#define isl_ast_node_list_get_ast_node (*isl_pointers__.p_isl_ast_node_list_get_ast_node)
|
||||||
|
+#define isl_ast_node_list_n_ast_node (*isl_pointers__.p_isl_ast_node_list_n_ast_node)
|
||||||
|
+#define isl_ast_node_user_get_expr (*isl_pointers__.p_isl_ast_node_user_get_expr)
|
||||||
|
+#define isl_constraint_set_coefficient_val (*isl_pointers__.p_isl_constraint_set_coefficient_val)
|
||||||
|
+#define isl_constraint_set_constant_val (*isl_pointers__.p_isl_constraint_set_constant_val)
|
||||||
|
+#define isl_id_get_user (*isl_pointers__.p_isl_id_get_user)
|
||||||
|
+#define isl_local_space_get_ctx (*isl_pointers__.p_isl_local_space_get_ctx)
|
||||||
|
+#define isl_map_fix_val (*isl_pointers__.p_isl_map_fix_val)
|
||||||
|
+#define isl_options_set_ast_build_atomic_upper_bound (*isl_pointers__.p_isl_options_set_ast_build_atomic_upper_bound)
|
||||||
|
+#define isl_printer_print_ast_node (*isl_pointers__.p_isl_printer_print_ast_node)
|
||||||
|
+#define isl_printer_print_str (*isl_pointers__.p_isl_printer_print_str)
|
||||||
|
+#define isl_printer_set_output_format (*isl_pointers__.p_isl_printer_set_output_format)
|
||||||
|
+#define isl_pw_aff_mod_val (*isl_pointers__.p_isl_pw_aff_mod_val)
|
||||||
|
+#define isl_schedule_constraints_compute_schedule (*isl_pointers__.p_isl_schedule_constraints_compute_schedule)
|
||||||
|
+#define isl_schedule_constraints_on_domain (*isl_pointers__.p_isl_schedule_constraints_on_domain)
|
||||||
|
+#define isl_schedule_constraints_set_coincidence (*isl_pointers__.p_isl_schedule_constraints_set_coincidence)
|
||||||
|
+#define isl_schedule_constraints_set_proximity (*isl_pointers__.p_isl_schedule_constraints_set_proximity)
|
||||||
|
+#define isl_schedule_constraints_set_validity (*isl_pointers__.p_isl_schedule_constraints_set_validity)
|
||||||
|
+#define isl_set_get_dim_id (*isl_pointers__.p_isl_set_get_dim_id)
|
||||||
|
+#define isl_set_max_val (*isl_pointers__.p_isl_set_max_val)
|
||||||
|
+#define isl_set_min_val (*isl_pointers__.p_isl_set_min_val)
|
||||||
|
+#define isl_set_params (*isl_pointers__.p_isl_set_params)
|
||||||
|
+#define isl_space_align_params (*isl_pointers__.p_isl_space_align_params)
|
||||||
|
+#define isl_space_map_from_domain_and_range (*isl_pointers__.p_isl_space_map_from_domain_and_range)
|
||||||
|
+#define isl_space_set_tuple_name (*isl_pointers__.p_isl_space_set_tuple_name)
|
||||||
|
+#define isl_space_wrap (*isl_pointers__.p_isl_space_wrap)
|
||||||
|
+#define isl_union_map_from_domain_and_range (*isl_pointers__.p_isl_union_map_from_domain_and_range)
|
||||||
|
+#define isl_union_map_range (*isl_pointers__.p_isl_union_map_range)
|
||||||
|
+#define isl_union_set_union (*isl_pointers__.p_isl_union_set_union)
|
||||||
|
+#define isl_union_set_universe (*isl_pointers__.p_isl_union_set_universe)
|
||||||
|
+#define isl_val_2exp (*isl_pointers__.p_isl_val_2exp)
|
||||||
|
+#define isl_val_add_ui (*isl_pointers__.p_isl_val_add_ui)
|
||||||
|
+#define isl_val_copy (*isl_pointers__.p_isl_val_copy)
|
||||||
|
+#define isl_val_free (*isl_pointers__.p_isl_val_free)
|
||||||
|
+#define isl_val_int_from_si (*isl_pointers__.p_isl_val_int_from_si)
|
||||||
|
+#define isl_val_int_from_ui (*isl_pointers__.p_isl_val_int_from_ui)
|
||||||
|
+#define isl_val_mul (*isl_pointers__.p_isl_val_mul)
|
||||||
|
+#define isl_val_neg (*isl_pointers__.p_isl_val_neg)
|
||||||
|
+#define isl_val_sub (*isl_pointers__.p_isl_val_sub)
|
||||||
|
+#define isl_printer_print_union_map (*isl_pointers__.p_isl_printer_print_union_map)
|
||||||
|
+#define isl_pw_aff_get_ctx (*isl_pointers__.p_isl_pw_aff_get_ctx)
|
||||||
|
+#define isl_val_is_int (*isl_pointers__.p_isl_val_is_int)
|
||||||
|
+#define isl_ctx_get_max_operations (*isl_pointers__.p_isl_ctx_get_max_operations)
|
||||||
|
+#define isl_ctx_set_max_operations (*isl_pointers__.p_isl_ctx_set_max_operations)
|
||||||
|
+#define isl_ctx_last_error (*isl_pointers__.p_isl_ctx_last_error)
|
||||||
|
+#define isl_ctx_reset_operations (*isl_pointers__.p_isl_ctx_reset_operations)
|
||||||
|
+#define isl_map_coalesce (*isl_pointers__.p_isl_map_coalesce)
|
||||||
|
+#define isl_printer_print_schedule (*isl_pointers__.p_isl_printer_print_schedule)
|
||||||
|
+#define isl_set_set_dim_id (*isl_pointers__.p_isl_set_set_dim_id)
|
||||||
|
+#define isl_union_map_coalesce (*isl_pointers__.p_isl_union_map_coalesce)
|
||||||
|
+#define isl_multi_val_set_val (*isl_pointers__.p_isl_multi_val_set_val)
|
||||||
|
+#define isl_multi_val_zero (*isl_pointers__.p_isl_multi_val_zero)
|
||||||
|
+#define isl_options_set_schedule_max_coefficient (*isl_pointers__.p_isl_options_set_schedule_max_coefficient)
|
||||||
|
+#define isl_options_set_tile_scale_tile_loops (*isl_pointers__.p_isl_options_set_tile_scale_tile_loops)
|
||||||
|
+#define isl_schedule_copy (*isl_pointers__.p_isl_schedule_copy)
|
||||||
|
+#define isl_schedule_get_map (*isl_pointers__.p_isl_schedule_get_map)
|
||||||
|
+#define isl_schedule_map_schedule_node_bottom_up (*isl_pointers__.p_isl_schedule_map_schedule_node_bottom_up)
|
||||||
|
+#define isl_schedule_node_band_get_permutable (*isl_pointers__.p_isl_schedule_node_band_get_permutable)
|
||||||
|
+#define isl_schedule_node_band_get_space (*isl_pointers__.p_isl_schedule_node_band_get_space)
|
||||||
|
+#define isl_schedule_node_band_tile (*isl_pointers__.p_isl_schedule_node_band_tile)
|
||||||
|
+#define isl_schedule_node_child (*isl_pointers__.p_isl_schedule_node_child)
|
||||||
|
+#define isl_schedule_node_free (*isl_pointers__.p_isl_schedule_node_free)
|
||||||
|
+#define isl_schedule_node_get_child (*isl_pointers__.p_isl_schedule_node_get_child)
|
||||||
|
+#define isl_schedule_node_get_ctx (*isl_pointers__.p_isl_schedule_node_get_ctx)
|
||||||
|
+#define isl_schedule_node_get_type (*isl_pointers__.p_isl_schedule_node_get_type)
|
||||||
|
+#define isl_schedule_node_n_children (*isl_pointers__.p_isl_schedule_node_n_children)
|
||||||
|
+#define isl_union_map_is_equal (*isl_pointers__.p_isl_union_map_is_equal)
|
||||||
|
+#define isl_union_access_info_compute_flow (*isl_pointers__.p_isl_union_access_info_compute_flow)
|
||||||
|
+#define isl_union_access_info_from_sink (*isl_pointers__.p_isl_union_access_info_from_sink)
|
||||||
|
+#define isl_union_access_info_set_may_source (*isl_pointers__.p_isl_union_access_info_set_may_source)
|
||||||
|
+#define isl_union_access_info_set_must_source (*isl_pointers__.p_isl_union_access_info_set_must_source)
|
||||||
|
+#define isl_union_access_info_set_schedule (*isl_pointers__.p_isl_union_access_info_set_schedule)
|
||||||
|
+#define isl_union_flow_free (*isl_pointers__.p_isl_union_flow_free)
|
||||||
|
+#define isl_union_flow_get_may_dependence (*isl_pointers__.p_isl_union_flow_get_may_dependence)
|
||||||
|
+#define isl_union_flow_get_must_dependence (*isl_pointers__.p_isl_union_flow_get_must_dependence)
|
||||||
|
+#define isl_aff_var_on_domain (*isl_pointers__.p_isl_aff_var_on_domain)
|
||||||
|
+#define isl_multi_aff_from_aff (*isl_pointers__.p_isl_multi_aff_from_aff)
|
||||||
|
+#define isl_schedule_get_ctx (*isl_pointers__.p_isl_schedule_get_ctx)
|
||||||
|
+#define isl_multi_aff_set_tuple_id (*isl_pointers__.p_isl_multi_aff_set_tuple_id)
|
||||||
|
+#define isl_multi_aff_dim (*isl_pointers__.p_isl_multi_aff_dim)
|
||||||
|
+#define isl_schedule_get_domain (*isl_pointers__.p_isl_schedule_get_domain)
|
||||||
|
+#define isl_union_set_is_empty (*isl_pointers__.p_isl_union_set_is_empty)
|
||||||
|
+#define isl_union_set_get_space (*isl_pointers__.p_isl_union_set_get_space)
|
||||||
|
+#define isl_union_pw_multi_aff_empty (*isl_pointers__.p_isl_union_pw_multi_aff_empty)
|
||||||
|
+#define isl_union_set_foreach_set (*isl_pointers__.p_isl_union_set_foreach_set)
|
||||||
|
+#define isl_union_set_free (*isl_pointers__.p_isl_union_set_free)
|
||||||
|
+#define isl_multi_union_pw_aff_from_union_pw_multi_aff (*isl_pointers__.p_isl_multi_union_pw_aff_from_union_pw_multi_aff)
|
||||||
|
+#define isl_multi_union_pw_aff_apply_multi_aff (*isl_pointers__.p_isl_multi_union_pw_aff_apply_multi_aff)
|
||||||
|
+#define isl_schedule_insert_partial_schedule (*isl_pointers__.p_isl_schedule_insert_partial_schedule)
|
||||||
|
+#define isl_union_pw_multi_aff_free (*isl_pointers__.p_isl_union_pw_multi_aff_free)
|
||||||
|
+#define isl_pw_multi_aff_project_out_map (*isl_pointers__.p_isl_pw_multi_aff_project_out_map)
|
||||||
|
+#define isl_union_pw_multi_aff_add_pw_multi_aff (*isl_pointers__.p_isl_union_pw_multi_aff_add_pw_multi_aff)
|
||||||
|
+#define isl_schedule_from_domain (*isl_pointers__.p_isl_schedule_from_domain)
|
||||||
|
+#define isl_schedule_sequence (*isl_pointers__.p_isl_schedule_sequence)
|
||||||
|
+#define isl_ast_build_node_from_schedule (*isl_pointers__.p_isl_ast_build_node_from_schedule)
|
||||||
|
+#define isl_ast_node_mark_get_node (*isl_pointers__.p_isl_ast_node_mark_get_node)
|
||||||
|
+#define isl_schedule_node_band_member_get_ast_loop_type (*isl_pointers__.p_isl_schedule_node_band_member_get_ast_loop_type)
|
||||||
|
+#define isl_schedule_node_band_member_set_ast_loop_type (*isl_pointers__.p_isl_schedule_node_band_member_set_ast_loop_type)
|
||||||
|
+#define isl_val_n_abs_num_chunks (*isl_pointers__.p_isl_val_n_abs_num_chunks)
|
||||||
|
+#define isl_val_get_abs_num_chunks (*isl_pointers__.p_isl_val_get_abs_num_chunks)
|
||||||
|
+#define isl_val_int_from_chunks (*isl_pointers__.p_isl_val_int_from_chunks)
|
||||||
|
+#define isl_val_is_neg (*isl_pointers__.p_isl_val_is_neg)
|
||||||
|
+#define isl_version (*isl_pointers__.p_isl_version)
|
||||||
|
+#define isl_options_get_on_error (*isl_pointers__.p_isl_options_get_on_error)
|
||||||
|
+#define isl_ctx_reset_error (*isl_pointers__.p_isl_ctx_reset_error)
|
||||||
|
|
||||||
|
typedef struct poly_dr *poly_dr_p;
|
||||||
|
|
||||||
|
@@ -461,5 +1045,6 @@ extern void build_scops (vec<scop_p> *);
|
||||||
|
extern void dot_all_sese (FILE *, vec<sese_l> &);
|
||||||
|
extern void dot_sese (sese_l &);
|
||||||
|
extern void dot_cfg ();
|
||||||
|
+extern const char *get_isl_version (bool);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
--- gcc/graphite.c.jj 2015-11-04 14:15:32.000000000 +0100
|
||||||
|
+++ gcc/graphite.c 2015-11-04 14:56:02.645536409 +0100
|
||||||
|
@@ -60,6 +60,35 @@ along with GCC; see the file COPYING3.
|
||||||
|
#include "tree-into-ssa.h"
|
||||||
|
#include "graphite.h"
|
||||||
|
|
||||||
|
+__typeof (isl_pointers__) isl_pointers__;
|
||||||
|
+
|
||||||
|
+static bool
|
||||||
|
+init_isl_pointers (void)
|
||||||
|
+{
|
||||||
|
+ void *h;
|
||||||
|
+
|
||||||
|
+ if (isl_pointers__.inited)
|
||||||
|
+ return isl_pointers__.h != NULL;
|
||||||
|
+ h = dlopen ("libisl.so.15", RTLD_LAZY);
|
||||||
|
+ isl_pointers__.h = h;
|
||||||
|
+ if (h == NULL)
|
||||||
|
+ return false;
|
||||||
|
+#define DYNSYM(x) \
|
||||||
|
+ do \
|
||||||
|
+ { \
|
||||||
|
+ union { __typeof (isl_pointers__.p_##x) p; void *q; } u; \
|
||||||
|
+ u.q = dlsym (h, #x); \
|
||||||
|
+ if (u.q == NULL) \
|
||||||
|
+ return false; \
|
||||||
|
+ isl_pointers__.p_##x = u.p; \
|
||||||
|
+ } \
|
||||||
|
+ while (0)
|
||||||
|
+ DYNSYMS
|
||||||
|
+#undef DYNSYM
|
||||||
|
+ isl_pointers__.inited = true;
|
||||||
|
+ return true;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/* Print global statistics to FILE. */
|
||||||
|
|
||||||
|
static void
|
||||||
|
@@ -365,6 +394,15 @@ graphite_transform_loops (void)
|
||||||
|
if (parallelized_function_p (cfun->decl))
|
||||||
|
return;
|
||||||
|
|
||||||
|
+ if (number_of_loops (cfun) <= 1)
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
+ if (!init_isl_pointers ())
|
||||||
|
+ {
|
||||||
|
+ sorry ("Graphite loop optimizations cannot be used");
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
calculate_dominance_info (CDI_DOMINATORS);
|
||||||
|
|
||||||
|
/* We rely on post-dominators during merging of SESE regions so those
|
||||||
|
@@ -455,6 +493,14 @@ graphite_transform_loops (void)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+const char *
|
||||||
|
+get_isl_version (bool force)
|
||||||
|
+{
|
||||||
|
+ if (force)
|
||||||
|
+ init_isl_pointers ();
|
||||||
|
+ return (isl_pointers__.inited && isl_version) ? isl_version () : "none";
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
#else /* If isl is not available: #ifndef HAVE_isl. */
|
||||||
|
|
||||||
|
static void
|
||||||
|
--- gcc/toplev.c.jj 2017-02-19 13:02:31.000000000 +0100
|
||||||
|
+++ gcc/toplev.c 2017-02-19 16:50:25.536301350 +0100
|
||||||
|
@@ -94,6 +94,7 @@ along with GCC; see the file COPYING3.
|
||||||
|
|
||||||
|
#ifdef HAVE_isl
|
||||||
|
#include <isl/version.h>
|
||||||
|
+extern const char *get_isl_version (bool);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static void general_init (const char *, bool);
|
||||||
|
@@ -683,7 +684,7 @@ print_version (FILE *file, const char *i
|
||||||
|
#ifndef HAVE_isl
|
||||||
|
"none"
|
||||||
|
#else
|
||||||
|
- isl_version ()
|
||||||
|
+ get_isl_version (*indent == 0)
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
if (strcmp (GCC_GMP_STRINGIFY_VERSION, gmp_version))
|
71
SOURCES/gcc10-isl-dl2.patch
Normal file
71
SOURCES/gcc10-isl-dl2.patch
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
2011-04-04 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
* toplev.c (toplev_main_argv): New variable.
|
||||||
|
(toplev_main): Initialize it.
|
||||||
|
* graphite.c (init_isl_pointers): Load libisl.so.13 from gcc's private
|
||||||
|
directory.
|
||||||
|
|
||||||
|
--- gcc/toplev.c.jj 2008-12-09 23:59:10.000000000 +0100
|
||||||
|
+++ gcc/toplev.c 2009-01-27 14:33:52.000000000 +0100
|
||||||
|
@@ -154,6 +154,8 @@ static bool no_backend;
|
||||||
|
/* Length of line when printing switch values. */
|
||||||
|
#define MAX_LINE 75
|
||||||
|
|
||||||
|
+const char **toplev_main_argv;
|
||||||
|
+
|
||||||
|
/* Decoded options, and number of such options. */
|
||||||
|
struct cl_decoded_option *save_decoded_options;
|
||||||
|
unsigned int save_decoded_options_count;
|
||||||
|
@@ -2126,6 +2128,8 @@ toplev::main (int argc, char **argv)
|
||||||
|
|
||||||
|
expandargv (&argc, &argv);
|
||||||
|
|
||||||
|
+ toplev_main_argv = CONST_CAST2 (const char **, char **, argv);
|
||||||
|
+
|
||||||
|
/* Initialization of GCC's environment, and diagnostics. */
|
||||||
|
general_init (argv[0], m_init_signals);
|
||||||
|
|
||||||
|
--- gcc/graphite.c.jj 2010-12-01 10:24:32.000000000 -0500
|
||||||
|
+++ gcc/graphite.c 2010-12-01 11:46:07.832118193 -0500
|
||||||
|
@@ -60,11 +60,39 @@ __typeof (isl_pointers__) isl_pointers__
|
||||||
|
static bool
|
||||||
|
init_isl_pointers (void)
|
||||||
|
{
|
||||||
|
- void *h;
|
||||||
|
+ void *h = NULL;
|
||||||
|
+ extern const char **toplev_main_argv;
|
||||||
|
+ char *buf, *p;
|
||||||
|
+ size_t len;
|
||||||
|
|
||||||
|
if (isl_pointers__.inited)
|
||||||
|
return isl_pointers__.h != NULL;
|
||||||
|
- h = dlopen ("libisl.so.15", RTLD_LAZY);
|
||||||
|
+ len = progname - toplev_main_argv[0];
|
||||||
|
+ buf = XALLOCAVAR (char, len + sizeof "libisl.so.15");
|
||||||
|
+ memcpy (buf, toplev_main_argv[0], len);
|
||||||
|
+ strcpy (buf + len, "libisl.so.15");
|
||||||
|
+ len += sizeof "libisl.so.15";
|
||||||
|
+ p = strstr (buf, "/libexec/");
|
||||||
|
+ if (p != NULL)
|
||||||
|
+ {
|
||||||
|
+ while (1)
|
||||||
|
+ {
|
||||||
|
+ char *q = strstr (p + 8, "/libexec/");
|
||||||
|
+ if (q == NULL)
|
||||||
|
+ break;
|
||||||
|
+ p = q;
|
||||||
|
+ }
|
||||||
|
+ memmove (p + 4, p + 8, len - (p + 8 - buf));
|
||||||
|
+ h = dlopen (buf, RTLD_LAZY);
|
||||||
|
+ if (h == NULL)
|
||||||
|
+ {
|
||||||
|
+ len = progname - toplev_main_argv[0];
|
||||||
|
+ memcpy (buf, toplev_main_argv[0], len);
|
||||||
|
+ strcpy (buf + len, "libisl.so.15");
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ if (h == NULL)
|
||||||
|
+ h = dlopen (buf, RTLD_LAZY);
|
||||||
|
isl_pointers__.h = h;
|
||||||
|
if (h == NULL)
|
||||||
|
return false;
|
78
SOURCES/gcc10-libgfortran-compat-2.patch
Normal file
78
SOURCES/gcc10-libgfortran-compat-2.patch
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
diff -u libgfortran/Makefile.am libgfortran/Makefile.am
|
||||||
|
--- libgfortran/Makefile.am 2020-05-28 13:55:44.816954223 +0200
|
||||||
|
+++ libgfortran/Makefile.am 2020-05-28 13:55:44.816954223 +0200
|
||||||
|
@@ -1087,6 +1087,7 @@
|
||||||
|
nonshared-findloc0_r16.c \
|
||||||
|
nonshared-findloc0_c4.c \
|
||||||
|
nonshared-findloc0_c8.c \
|
||||||
|
+nonshared-findloc0_c10.c \
|
||||||
|
nonshared-findloc0_c16.c \
|
||||||
|
nonshared-findloc0_s1.c \
|
||||||
|
nonshared-findloc0_s4.c \
|
||||||
|
@@ -1101,6 +1102,7 @@
|
||||||
|
nonshared-findloc1_r16.c \
|
||||||
|
nonshared-findloc1_c4.c \
|
||||||
|
nonshared-findloc1_c8.c \
|
||||||
|
+nonshared-findloc1_c10.c \
|
||||||
|
nonshared-findloc1_c16.c \
|
||||||
|
nonshared-findloc1_s1.c \
|
||||||
|
nonshared-findloc1_s4.c \
|
||||||
|
diff -u libgfortran/Makefile.in libgfortran/Makefile.in
|
||||||
|
--- libgfortran/Makefile.in 2020-05-28 14:05:15.576583891 +0200
|
||||||
|
+++ libgfortran/Makefile.in 2020-05-28 14:05:15.576583891 +0200
|
||||||
|
@@ -475,14 +475,15 @@
|
||||||
|
nonshared-findloc0_i16.lo nonshared-findloc0_r4.lo \
|
||||||
|
nonshared-findloc0_r8.lo nonshared-findloc0_r10.lo \
|
||||||
|
nonshared-findloc0_r16.lo nonshared-findloc0_c4.lo \
|
||||||
|
- nonshared-findloc0_c8.lo nonshared-findloc0_c16.lo \
|
||||||
|
- nonshared-findloc0_s1.lo nonshared-findloc0_s4.lo \
|
||||||
|
- nonshared-findloc1_i1.lo nonshared-findloc1_i2.lo \
|
||||||
|
- nonshared-findloc1_i4.lo nonshared-findloc1_i8.lo \
|
||||||
|
- nonshared-findloc1_i16.lo nonshared-findloc1_r4.lo \
|
||||||
|
- nonshared-findloc1_r8.lo nonshared-findloc1_r10.lo \
|
||||||
|
- nonshared-findloc1_r16.lo nonshared-findloc1_c4.lo \
|
||||||
|
- nonshared-findloc1_c8.lo nonshared-findloc1_c16.lo \
|
||||||
|
+ nonshared-findloc0_c8.lo nonshared-findloc0_c10.lo \
|
||||||
|
+ nonshared-findloc0_c16.lo nonshared-findloc0_s1.lo \
|
||||||
|
+ nonshared-findloc0_s4.lo nonshared-findloc1_i1.lo \
|
||||||
|
+ nonshared-findloc1_i2.lo nonshared-findloc1_i4.lo \
|
||||||
|
+ nonshared-findloc1_i8.lo nonshared-findloc1_i16.lo \
|
||||||
|
+ nonshared-findloc1_r4.lo nonshared-findloc1_r8.lo \
|
||||||
|
+ nonshared-findloc1_r10.lo nonshared-findloc1_r16.lo \
|
||||||
|
+ nonshared-findloc1_c4.lo nonshared-findloc1_c8.lo \
|
||||||
|
+ nonshared-findloc1_c10.lo nonshared-findloc1_c16.lo \
|
||||||
|
nonshared-findloc1_s1.lo nonshared-findloc1_s4.lo \
|
||||||
|
nonshared-findloc2_s1.lo nonshared-findloc2_s4.lo
|
||||||
|
am__objects_68 = nonshared-is_contiguous.lo \
|
||||||
|
@@ -1597,6 +1598,7 @@
|
||||||
|
nonshared-findloc0_r16.c \
|
||||||
|
nonshared-findloc0_c4.c \
|
||||||
|
nonshared-findloc0_c8.c \
|
||||||
|
+nonshared-findloc0_c10.c \
|
||||||
|
nonshared-findloc0_c16.c \
|
||||||
|
nonshared-findloc0_s1.c \
|
||||||
|
nonshared-findloc0_s4.c \
|
||||||
|
@@ -1611,6 +1613,7 @@
|
||||||
|
nonshared-findloc1_r16.c \
|
||||||
|
nonshared-findloc1_c4.c \
|
||||||
|
nonshared-findloc1_c8.c \
|
||||||
|
+nonshared-findloc1_c10.c \
|
||||||
|
nonshared-findloc1_c16.c \
|
||||||
|
nonshared-findloc1_s1.c \
|
||||||
|
nonshared-findloc1_s4.c \
|
||||||
|
@@ -2214,6 +2217,7 @@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mvbits.Plo@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-ISO_Fortran_binding.Plo@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-error.Plo@am__quote@
|
||||||
|
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc0_c10.Plo@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc0_c16.Plo@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc0_c4.Plo@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc0_c8.Plo@am__quote@
|
||||||
|
@@ -2228,6 +2232,7 @@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc0_r8.Plo@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc0_s1.Plo@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc0_s4.Plo@am__quote@
|
||||||
|
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc1_c10.Plo@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc1_c16.Plo@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc1_c4.Plo@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc1_c8.Plo@am__quote@
|
665
SOURCES/gcc10-libgfortran-compat.patch
Normal file
665
SOURCES/gcc10-libgfortran-compat.patch
Normal file
@ -0,0 +1,665 @@
|
|||||||
|
--- libgfortran/Makefile.am.jj 2020-04-30 17:41:43.451589601 +0200
|
||||||
|
+++ libgfortran/Makefile.am 2020-05-28 13:55:44.816954223 +0200
|
||||||
|
@@ -37,6 +37,7 @@ LTLDFLAGS = $(shell $(SHELL) $(top_srcdi
|
||||||
|
$(lt_host_flags)
|
||||||
|
|
||||||
|
toolexeclib_LTLIBRARIES = libgfortran.la
|
||||||
|
+noinst_LTLIBRARIES = libgfortran_nonshared80.la
|
||||||
|
toolexeclib_DATA = libgfortran.spec
|
||||||
|
libgfortran_la_LINK = $(LINK) $(libgfortran_la_LDFLAGS)
|
||||||
|
libgfortran_la_LDFLAGS = -version-info `grep -v '^\#' $(srcdir)/libtool-version` \
|
||||||
|
@@ -1039,6 +1040,89 @@ libgfortran_la_SOURCES = $(prereq_SRC)
|
||||||
|
|
||||||
|
endif
|
||||||
|
|
||||||
|
+$(patsubst %.c,%.lo,$(nonshared_generated_C_SRC) $(nonshared)): \
|
||||||
|
+nonshared-%.lo: $(srcdir)/generated/%.c
|
||||||
|
+ $(LTCOMPILE) -c -o $@ $< -DLIBGFORTRAN_NONSHARED
|
||||||
|
+
|
||||||
|
+$(patsubst %.c,%.o,$(nonshared_generated_C_SRC) $(nonshared)): \
|
||||||
|
+nonshared-%.o: $(srcdir)/generated/%.c
|
||||||
|
+ $(COMPILE) -c -o $@ $< -DLIBGFORTRAN_NONSHARED
|
||||||
|
+
|
||||||
|
+$(patsubst %.c,%.lo,$(nonshared_intrinsics_C_SRC) $(nonshared)): \
|
||||||
|
+nonshared-%.lo: $(srcdir)/intrinsics/%.c
|
||||||
|
+ $(LTCOMPILE) -c -o $@ $< -DLIBGFORTRAN_NONSHARED
|
||||||
|
+
|
||||||
|
+$(patsubst %.c,%.o,$(nonshared_intrinsics_C_SRC) $(nonshared)): \
|
||||||
|
+nonshared-%.o: $(srcdir)/intrinsics/%.c
|
||||||
|
+ $(COMPILE) -c -o $@ $< -DLIBGFORTRAN_NONSHARED
|
||||||
|
+
|
||||||
|
+$(patsubst %.c,%.lo,$(nonshared_runtime_C_SRC) $(nonshared)): \
|
||||||
|
+nonshared-%.lo: $(srcdir)/runtime/%.c
|
||||||
|
+ $(LTCOMPILE) -c -o $@ $< -DLIBGFORTRAN_NONSHARED
|
||||||
|
+
|
||||||
|
+$(patsubst %.c,%.o,$(nonshared_runtime_C_SRC) $(nonshared)): \
|
||||||
|
+nonshared-%.o: $(srcdir)/runtime/%.c
|
||||||
|
+ $(COMPILE) -c -o $@ $< -DLIBGFORTRAN_NONSHARED
|
||||||
|
+
|
||||||
|
+$(patsubst %.f90,%.lo,$(nonshared_intrinsics_f90_SRC) $(nonshared)): \
|
||||||
|
+nonshared-%.lo: $(srcdir)/intrinsics/%.f90
|
||||||
|
+ $(LTPPFCCOMPILE) -c -o $@ $< -fallow-leading-underscore
|
||||||
|
+
|
||||||
|
+$(patsubst %.f90,%.o,$(nonshared_intrinsics_f90_SRC) $(nonshared)): \
|
||||||
|
+nonshared-%.o: $(srcdir)/intrinsics/%.f90
|
||||||
|
+ $(PPFCCOMPILE) -c -o $@ $< -fallow-leading-underscore
|
||||||
|
+
|
||||||
|
+nonshared_runtime_C_SRC = \
|
||||||
|
+nonshared-ISO_Fortran_binding.c
|
||||||
|
+
|
||||||
|
+nonshared_generated_C_SRC = \
|
||||||
|
+nonshared-findloc0_i1.c \
|
||||||
|
+nonshared-findloc0_i2.c \
|
||||||
|
+nonshared-findloc0_i4.c \
|
||||||
|
+nonshared-findloc0_i8.c \
|
||||||
|
+nonshared-findloc0_i16.c \
|
||||||
|
+nonshared-findloc0_r4.c \
|
||||||
|
+nonshared-findloc0_r8.c \
|
||||||
|
+nonshared-findloc0_r10.c \
|
||||||
|
+nonshared-findloc0_r16.c \
|
||||||
|
+nonshared-findloc0_c4.c \
|
||||||
|
+nonshared-findloc0_c8.c \
|
||||||
|
+nonshared-findloc0_c16.c \
|
||||||
|
+nonshared-findloc0_s1.c \
|
||||||
|
+nonshared-findloc0_s4.c \
|
||||||
|
+nonshared-findloc1_i1.c \
|
||||||
|
+nonshared-findloc1_i2.c \
|
||||||
|
+nonshared-findloc1_i4.c \
|
||||||
|
+nonshared-findloc1_i8.c \
|
||||||
|
+nonshared-findloc1_i16.c \
|
||||||
|
+nonshared-findloc1_r4.c \
|
||||||
|
+nonshared-findloc1_r8.c \
|
||||||
|
+nonshared-findloc1_r10.c \
|
||||||
|
+nonshared-findloc1_r16.c \
|
||||||
|
+nonshared-findloc1_c4.c \
|
||||||
|
+nonshared-findloc1_c8.c \
|
||||||
|
+nonshared-findloc1_c16.c \
|
||||||
|
+nonshared-findloc1_s1.c \
|
||||||
|
+nonshared-findloc1_s4.c \
|
||||||
|
+nonshared-findloc2_s1.c \
|
||||||
|
+nonshared-findloc2_s4.c
|
||||||
|
+
|
||||||
|
+nonshared_intrinsics_C_SRC = \
|
||||||
|
+nonshared-is_contiguous.c \
|
||||||
|
+nonshared-trigd.c
|
||||||
|
+
|
||||||
|
+nonshared_intrinsics_f90_SRC = \
|
||||||
|
+nonshared-random_init.f90
|
||||||
|
+
|
||||||
|
+libgfortran_nonshared80_la_SOURCES = \
|
||||||
|
+$(nonshared_runtime_C_SRC) \
|
||||||
|
+$(nonshared_generated_C_SRC) \
|
||||||
|
+$(nonshared_intrinsics_C_SRC) \
|
||||||
|
+$(nonshared_intrinsics_f90_SRC) \
|
||||||
|
+$(srcdir)/ieee/nonshared-ieee_arithmetic.c \
|
||||||
|
+$(srcdir)/io/nonshared-transfer.c \
|
||||||
|
+$(srcdir)/runtime/nonshared-error.c
|
||||||
|
+
|
||||||
|
I_M4_DEPS=m4/iparm.m4
|
||||||
|
I_M4_DEPS0=$(I_M4_DEPS) m4/iforeach.m4
|
||||||
|
I_M4_DEPS1=$(I_M4_DEPS) m4/ifunction.m4
|
||||||
|
--- libgfortran/ieee/nonshared-ieee_arithmetic.c.jj 2020-05-27 17:46:36.538953840 +0200
|
||||||
|
+++ libgfortran/ieee/nonshared-ieee_arithmetic.c 2020-05-27 17:46:36.538953840 +0200
|
||||||
|
@@ -0,0 +1,64 @@
|
||||||
|
+/* Helper functions in C for IEEE modules
|
||||||
|
+ Copyright (C) 2013-2019 Free Software Foundation, Inc.
|
||||||
|
+ Contributed by Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
|
||||||
|
+
|
||||||
|
+This file is part of the GNU Fortran runtime library (libgfortran).
|
||||||
|
+
|
||||||
|
+Libgfortran is free software; you can redistribute it and/or
|
||||||
|
+modify it under the terms of the GNU General Public
|
||||||
|
+License as published by the Free Software Foundation; either
|
||||||
|
+version 3 of the License, or (at your option) any later version.
|
||||||
|
+
|
||||||
|
+Libgfortran is distributed in the hope that it will be useful,
|
||||||
|
+but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
+GNU General Public License for more details.
|
||||||
|
+
|
||||||
|
+Under Section 7 of GPL version 3, you are granted additional
|
||||||
|
+permissions described in the GCC Runtime Library Exception, version
|
||||||
|
+3.1, as published by the Free Software Foundation.
|
||||||
|
+
|
||||||
|
+You should have received a copy of the GNU General Public License and
|
||||||
|
+a copy of the GCC Runtime Library Exception along with this program;
|
||||||
|
+see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
||||||
|
+<http://www.gnu.org/licenses/>. */
|
||||||
|
+
|
||||||
|
+#include "libgfortran.h"
|
||||||
|
+
|
||||||
|
+GFC_LOGICAL_4
|
||||||
|
+__ieee_arithmetic_MOD_ieee_support_subnormal_4 (gfc_array_r4 *arg)
|
||||||
|
+{
|
||||||
|
+ (void) arg;
|
||||||
|
+ return 1;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+GFC_LOGICAL_4
|
||||||
|
+__ieee_arithmetic_MOD_ieee_support_subnormal_8 (gfc_array_r8 *arg)
|
||||||
|
+{
|
||||||
|
+ (void) arg;
|
||||||
|
+ return 1;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+#ifdef HAVE_GFC_REAL_10
|
||||||
|
+GFC_LOGICAL_4
|
||||||
|
+__ieee_arithmetic_MOD_ieee_support_subnormal_10 (gfc_array_r10 *arg)
|
||||||
|
+{
|
||||||
|
+ (void) arg;
|
||||||
|
+ return 1;
|
||||||
|
+}
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
+#ifdef HAVE_GFC_REAL_16
|
||||||
|
+GFC_LOGICAL_4
|
||||||
|
+__ieee_arithmetic_MOD_ieee_support_subnormal_16 (gfc_array_r16 *arg)
|
||||||
|
+{
|
||||||
|
+ (void) arg;
|
||||||
|
+ return 1;
|
||||||
|
+}
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
+GFC_LOGICAL_4
|
||||||
|
+__ieee_arithmetic_MOD_ieee_support_subnormal_noarg (void)
|
||||||
|
+{
|
||||||
|
+ return 1;
|
||||||
|
+}
|
||||||
|
--- libgfortran/Makefile.in.jj 2020-04-30 17:41:43.467589365 +0200
|
||||||
|
+++ libgfortran/Makefile.in 2020-05-28 14:05:15.576583891 +0200
|
||||||
|
@@ -217,7 +217,8 @@ am__uninstall_files_from_dir = { \
|
||||||
|
am__installdirs = "$(DESTDIR)$(cafexeclibdir)" \
|
||||||
|
"$(DESTDIR)$(toolexeclibdir)" "$(DESTDIR)$(toolexeclibdir)" \
|
||||||
|
"$(DESTDIR)$(gfor_cdir)" "$(DESTDIR)$(fincludedir)"
|
||||||
|
-LTLIBRARIES = $(cafexeclib_LTLIBRARIES) $(toolexeclib_LTLIBRARIES)
|
||||||
|
+LTLIBRARIES = $(cafexeclib_LTLIBRARIES) $(noinst_LTLIBRARIES) \
|
||||||
|
+ $(toolexeclib_LTLIBRARIES)
|
||||||
|
libcaf_single_la_LIBADD =
|
||||||
|
am_libcaf_single_la_OBJECTS = single.lo
|
||||||
|
libcaf_single_la_OBJECTS = $(am_libcaf_single_la_OBJECTS)
|
||||||
|
@@ -467,6 +468,36 @@ am__objects_65 = $(am__objects_3) $(am__
|
||||||
|
@onestep_FALSE@am_libgfortran_la_OBJECTS = $(am__objects_65)
|
||||||
|
@onestep_TRUE@am_libgfortran_la_OBJECTS = libgfortran_c.lo
|
||||||
|
libgfortran_la_OBJECTS = $(am_libgfortran_la_OBJECTS)
|
||||||
|
+libgfortran_nonshared80_la_LIBADD =
|
||||||
|
+am__objects_66 = nonshared-ISO_Fortran_binding.lo
|
||||||
|
+am__objects_67 = nonshared-findloc0_i1.lo nonshared-findloc0_i2.lo \
|
||||||
|
+ nonshared-findloc0_i4.lo nonshared-findloc0_i8.lo \
|
||||||
|
+ nonshared-findloc0_i16.lo nonshared-findloc0_r4.lo \
|
||||||
|
+ nonshared-findloc0_r8.lo nonshared-findloc0_r10.lo \
|
||||||
|
+ nonshared-findloc0_r16.lo nonshared-findloc0_c4.lo \
|
||||||
|
+ nonshared-findloc0_c8.lo nonshared-findloc0_c16.lo \
|
||||||
|
+ nonshared-findloc0_s1.lo nonshared-findloc0_s4.lo \
|
||||||
|
+ nonshared-findloc1_i1.lo nonshared-findloc1_i2.lo \
|
||||||
|
+ nonshared-findloc1_i4.lo nonshared-findloc1_i8.lo \
|
||||||
|
+ nonshared-findloc1_i16.lo nonshared-findloc1_r4.lo \
|
||||||
|
+ nonshared-findloc1_r8.lo nonshared-findloc1_r10.lo \
|
||||||
|
+ nonshared-findloc1_r16.lo nonshared-findloc1_c4.lo \
|
||||||
|
+ nonshared-findloc1_c8.lo nonshared-findloc1_c16.lo \
|
||||||
|
+ nonshared-findloc1_s1.lo nonshared-findloc1_s4.lo \
|
||||||
|
+ nonshared-findloc2_s1.lo nonshared-findloc2_s4.lo
|
||||||
|
+am__objects_68 = nonshared-is_contiguous.lo \
|
||||||
|
+ nonshared-trigd.lo
|
||||||
|
+am__objects_69 = nonshared-random_init.lo
|
||||||
|
+am_libgfortran_nonshared80_la_OBJECTS = $(am__objects_66) \
|
||||||
|
+ $(am__objects_67) $(am__objects_68) $(am__objects_69) \
|
||||||
|
+ nonshared-ieee_arithmetic.lo nonshared-transfer.lo \
|
||||||
|
+ nonshared-error.lo
|
||||||
|
+libgfortran_nonshared80_la_OBJECTS = \
|
||||||
|
+ $(am_libgfortran_nonshared80_la_OBJECTS)
|
||||||
|
+AM_V_lt = $(am__v_lt_@AM_V@)
|
||||||
|
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
|
||||||
|
+am__v_lt_0 = --silent
|
||||||
|
+am__v_lt_1 =
|
||||||
|
AM_V_P = $(am__v_P_@AM_V@)
|
||||||
|
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
|
||||||
|
am__v_P_0 = false
|
||||||
|
@@ -483,10 +514,6 @@ DEFAULT_INCLUDES = -I.@am__isrc@
|
||||||
|
depcomp = $(SHELL) $(top_srcdir)/../depcomp
|
||||||
|
am__depfiles_maybe = depfiles
|
||||||
|
am__mv = mv -f
|
||||||
|
-AM_V_lt = $(am__v_lt_@AM_V@)
|
||||||
|
-am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
|
||||||
|
-am__v_lt_0 = --silent
|
||||||
|
-am__v_lt_1 =
|
||||||
|
PPFCCOMPILE = $(FC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
|
||||||
|
$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_FCFLAGS) $(FCFLAGS)
|
||||||
|
LTPPFCCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \
|
||||||
|
@@ -530,7 +557,8 @@ AM_V_FC = $(am__v_FC_@AM_V@)
|
||||||
|
am__v_FC_ = $(am__v_FC_@AM_DEFAULT_V@)
|
||||||
|
am__v_FC_0 = @echo " FC " $@;
|
||||||
|
am__v_FC_1 =
|
||||||
|
-SOURCES = $(libcaf_single_la_SOURCES) $(libgfortran_la_SOURCES)
|
||||||
|
+SOURCES = $(libcaf_single_la_SOURCES) $(libgfortran_la_SOURCES) \
|
||||||
|
+ $(libgfortran_nonshared80_la_SOURCES)
|
||||||
|
am__can_run_installinfo = \
|
||||||
|
case $$AM_UPDATE_INFO_DIR in \
|
||||||
|
n|no|NO) false;; \
|
||||||
|
@@ -726,6 +754,7 @@ LTLDFLAGS = $(shell $(SHELL) $(top_srcdi
|
||||||
|
$(lt_host_flags)
|
||||||
|
|
||||||
|
toolexeclib_LTLIBRARIES = libgfortran.la
|
||||||
|
+noinst_LTLIBRARIES = libgfortran_nonshared80.la
|
||||||
|
toolexeclib_DATA = libgfortran.spec
|
||||||
|
libgfortran_la_LINK = $(LINK) $(libgfortran_la_LDFLAGS)
|
||||||
|
libgfortran_la_LDFLAGS = -version-info `grep -v '^\#' $(srcdir)/libtool-version` \
|
||||||
|
@@ -1553,6 +1582,57 @@ prereq_SRC = $(gfor_src) $(gfor_built_sr
|
||||||
|
#libgfortran_F.lo:
|
||||||
|
# $(LTPPFCCOMPILE) -c -o $@ $^ -combine
|
||||||
|
@onestep_TRUE@libgfortran_la_SOURCES = libgfortran_c.c $(filter-out %.c,$(prereq_SRC))
|
||||||
|
+nonshared_runtime_C_SRC = \
|
||||||
|
+nonshared-ISO_Fortran_binding.c
|
||||||
|
+
|
||||||
|
+nonshared_generated_C_SRC = \
|
||||||
|
+nonshared-findloc0_i1.c \
|
||||||
|
+nonshared-findloc0_i2.c \
|
||||||
|
+nonshared-findloc0_i4.c \
|
||||||
|
+nonshared-findloc0_i8.c \
|
||||||
|
+nonshared-findloc0_i16.c \
|
||||||
|
+nonshared-findloc0_r4.c \
|
||||||
|
+nonshared-findloc0_r8.c \
|
||||||
|
+nonshared-findloc0_r10.c \
|
||||||
|
+nonshared-findloc0_r16.c \
|
||||||
|
+nonshared-findloc0_c4.c \
|
||||||
|
+nonshared-findloc0_c8.c \
|
||||||
|
+nonshared-findloc0_c16.c \
|
||||||
|
+nonshared-findloc0_s1.c \
|
||||||
|
+nonshared-findloc0_s4.c \
|
||||||
|
+nonshared-findloc1_i1.c \
|
||||||
|
+nonshared-findloc1_i2.c \
|
||||||
|
+nonshared-findloc1_i4.c \
|
||||||
|
+nonshared-findloc1_i8.c \
|
||||||
|
+nonshared-findloc1_i16.c \
|
||||||
|
+nonshared-findloc1_r4.c \
|
||||||
|
+nonshared-findloc1_r8.c \
|
||||||
|
+nonshared-findloc1_r10.c \
|
||||||
|
+nonshared-findloc1_r16.c \
|
||||||
|
+nonshared-findloc1_c4.c \
|
||||||
|
+nonshared-findloc1_c8.c \
|
||||||
|
+nonshared-findloc1_c16.c \
|
||||||
|
+nonshared-findloc1_s1.c \
|
||||||
|
+nonshared-findloc1_s4.c \
|
||||||
|
+nonshared-findloc2_s1.c \
|
||||||
|
+nonshared-findloc2_s4.c
|
||||||
|
+
|
||||||
|
+nonshared_intrinsics_C_SRC = \
|
||||||
|
+nonshared-is_contiguous.c \
|
||||||
|
+nonshared-trigd.c
|
||||||
|
+
|
||||||
|
+nonshared_intrinsics_f90_SRC = \
|
||||||
|
+nonshared-random_init.f90
|
||||||
|
+
|
||||||
|
+libgfortran_nonshared80_la_SOURCES = \
|
||||||
|
+$(nonshared_runtime_C_SRC) \
|
||||||
|
+$(nonshared_generated_C_SRC) \
|
||||||
|
+$(nonshared_intrinsics_C_SRC) \
|
||||||
|
+$(nonshared_intrinsics_f90_SRC) \
|
||||||
|
+$(srcdir)/ieee/nonshared-ieee_arithmetic.c \
|
||||||
|
+$(srcdir)/io/nonshared-transfer.c \
|
||||||
|
+$(srcdir)/runtime/nonshared-error.c
|
||||||
|
+
|
||||||
|
I_M4_DEPS = m4/iparm.m4
|
||||||
|
I_M4_DEPS0 = $(I_M4_DEPS) m4/iforeach.m4
|
||||||
|
I_M4_DEPS1 = $(I_M4_DEPS) m4/ifunction.m4
|
||||||
|
@@ -1663,6 +1743,17 @@ clean-cafexeclibLTLIBRARIES:
|
||||||
|
rm -f $${locs}; \
|
||||||
|
}
|
||||||
|
|
||||||
|
+clean-noinstLTLIBRARIES:
|
||||||
|
+ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
|
||||||
|
+ @list='$(noinst_LTLIBRARIES)'; \
|
||||||
|
+ locs=`for p in $$list; do echo $$p; done | \
|
||||||
|
+ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
|
||||||
|
+ sort -u`; \
|
||||||
|
+ test -z "$$locs" || { \
|
||||||
|
+ echo rm -f $${locs}; \
|
||||||
|
+ rm -f $${locs}; \
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
install-toolexeclibLTLIBRARIES: $(toolexeclib_LTLIBRARIES)
|
||||||
|
@$(NORMAL_INSTALL)
|
||||||
|
@list='$(toolexeclib_LTLIBRARIES)'; test -n "$(toolexeclibdir)" || list=; \
|
||||||
|
@@ -1704,6 +1795,9 @@ libcaf_single.la: $(libcaf_single_la_OBJ
|
||||||
|
libgfortran.la: $(libgfortran_la_OBJECTS) $(libgfortran_la_DEPENDENCIES) $(EXTRA_libgfortran_la_DEPENDENCIES)
|
||||||
|
$(AM_V_GEN)$(libgfortran_la_LINK) -rpath $(toolexeclibdir) $(libgfortran_la_OBJECTS) $(libgfortran_la_LIBADD) $(LIBS)
|
||||||
|
|
||||||
|
+libgfortran_nonshared80.la: $(libgfortran_nonshared80_la_OBJECTS) $(libgfortran_nonshared80_la_DEPENDENCIES) $(EXTRA_libgfortran_nonshared80_la_DEPENDENCIES)
|
||||||
|
+ $(AM_V_FCLD)$(FCLINK) $(libgfortran_nonshared80_la_OBJECTS) $(libgfortran_nonshared80_la_LIBADD) $(LIBS)
|
||||||
|
+
|
||||||
|
mostlyclean-compile:
|
||||||
|
-rm -f *.$(OBJEXT)
|
||||||
|
|
||||||
|
@@ -2118,6 +2212,42 @@ distclean-compile:
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/minval_r8.Plo@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/move_alloc.Plo@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mvbits.Plo@am__quote@
|
||||||
|
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-ISO_Fortran_binding.Plo@am__quote@
|
||||||
|
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-error.Plo@am__quote@
|
||||||
|
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc0_c16.Plo@am__quote@
|
||||||
|
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc0_c4.Plo@am__quote@
|
||||||
|
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc0_c8.Plo@am__quote@
|
||||||
|
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc0_i1.Plo@am__quote@
|
||||||
|
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc0_i16.Plo@am__quote@
|
||||||
|
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc0_i2.Plo@am__quote@
|
||||||
|
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc0_i4.Plo@am__quote@
|
||||||
|
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc0_i8.Plo@am__quote@
|
||||||
|
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc0_r10.Plo@am__quote@
|
||||||
|
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc0_r16.Plo@am__quote@
|
||||||
|
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc0_r4.Plo@am__quote@
|
||||||
|
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc0_r8.Plo@am__quote@
|
||||||
|
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc0_s1.Plo@am__quote@
|
||||||
|
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc0_s4.Plo@am__quote@
|
||||||
|
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc1_c16.Plo@am__quote@
|
||||||
|
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc1_c4.Plo@am__quote@
|
||||||
|
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc1_c8.Plo@am__quote@
|
||||||
|
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc1_i1.Plo@am__quote@
|
||||||
|
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc1_i16.Plo@am__quote@
|
||||||
|
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc1_i2.Plo@am__quote@
|
||||||
|
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc1_i4.Plo@am__quote@
|
||||||
|
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc1_i8.Plo@am__quote@
|
||||||
|
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc1_r10.Plo@am__quote@
|
||||||
|
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc1_r16.Plo@am__quote@
|
||||||
|
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc1_r4.Plo@am__quote@
|
||||||
|
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc1_r8.Plo@am__quote@
|
||||||
|
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc1_s1.Plo@am__quote@
|
||||||
|
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc1_s4.Plo@am__quote@
|
||||||
|
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc2_s1.Plo@am__quote@
|
||||||
|
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-findloc2_s4.Plo@am__quote@
|
||||||
|
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-ieee_arithmetic.Plo@am__quote@
|
||||||
|
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-is_contiguous.Plo@am__quote@
|
||||||
|
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-transfer.Plo@am__quote@
|
||||||
|
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonshared-trigd.Plo@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/norm2_r10.Plo@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/norm2_r16.Plo@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/norm2_r4.Plo@am__quote@
|
||||||
|
@@ -6658,6 +6788,27 @@ ieee_helper.lo: ieee/ieee_helper.c
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||||
|
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ieee_helper.lo `test -f 'ieee/ieee_helper.c' || echo '$(srcdir)/'`ieee/ieee_helper.c
|
||||||
|
|
||||||
|
+nonshared-ieee_arithmetic.lo: $(srcdir)/ieee/nonshared-ieee_arithmetic.c
|
||||||
|
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT nonshared-ieee_arithmetic.lo -MD -MP -MF $(DEPDIR)/nonshared-ieee_arithmetic.Tpo -c -o nonshared-ieee_arithmetic.lo `test -f '$(srcdir)/ieee/nonshared-ieee_arithmetic.c' || echo '$(srcdir)/'`$(srcdir)/ieee/nonshared-ieee_arithmetic.c
|
||||||
|
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nonshared-ieee_arithmetic.Tpo $(DEPDIR)/nonshared-ieee_arithmetic.Plo
|
||||||
|
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$(srcdir)/ieee/nonshared-ieee_arithmetic.c' object='nonshared-ieee_arithmetic.lo' libtool=yes @AMDEPBACKSLASH@
|
||||||
|
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||||
|
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o nonshared-ieee_arithmetic.lo `test -f '$(srcdir)/ieee/nonshared-ieee_arithmetic.c' || echo '$(srcdir)/'`$(srcdir)/ieee/nonshared-ieee_arithmetic.c
|
||||||
|
+
|
||||||
|
+nonshared-transfer.lo: $(srcdir)/io/nonshared-transfer.c
|
||||||
|
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT nonshared-transfer.lo -MD -MP -MF $(DEPDIR)/nonshared-transfer.Tpo -c -o nonshared-transfer.lo `test -f '$(srcdir)/io/nonshared-transfer.c' || echo '$(srcdir)/'`$(srcdir)/io/nonshared-transfer.c
|
||||||
|
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nonshared-transfer.Tpo $(DEPDIR)/nonshared-transfer.Plo
|
||||||
|
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$(srcdir)/io/nonshared-transfer.c' object='nonshared-transfer.lo' libtool=yes @AMDEPBACKSLASH@
|
||||||
|
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||||
|
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o nonshared-transfer.lo `test -f '$(srcdir)/io/nonshared-transfer.c' || echo '$(srcdir)/'`$(srcdir)/io/nonshared-transfer.c
|
||||||
|
+
|
||||||
|
+nonshared-error.lo: $(srcdir)/runtime/nonshared-error.c
|
||||||
|
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT nonshared-error.lo -MD -MP -MF $(DEPDIR)/nonshared-error.Tpo -c -o nonshared-error.lo `test -f '$(srcdir)/runtime/nonshared-error.c' || echo '$(srcdir)/'`$(srcdir)/runtime/nonshared-error.c
|
||||||
|
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nonshared-error.Tpo $(DEPDIR)/nonshared-error.Plo
|
||||||
|
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$(srcdir)/runtime/nonshared-error.c' object='nonshared-error.lo' libtool=yes @AMDEPBACKSLASH@
|
||||||
|
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||||
|
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o nonshared-error.lo `test -f '$(srcdir)/runtime/nonshared-error.c' || echo '$(srcdir)/'`$(srcdir)/runtime/nonshared-error.c
|
||||||
|
+
|
||||||
|
.f90.o:
|
||||||
|
$(AM_V_FC)$(FCCOMPILE) -c -o $@ $<
|
||||||
|
|
||||||
|
@@ -6852,7 +7003,8 @@ maintainer-clean-generic:
|
||||||
|
clean: clean-am
|
||||||
|
|
||||||
|
clean-am: clean-cafexeclibLTLIBRARIES clean-generic clean-libtool \
|
||||||
|
- clean-local clean-toolexeclibLTLIBRARIES mostlyclean-am
|
||||||
|
+ clean-local clean-noinstLTLIBRARIES \
|
||||||
|
+ clean-toolexeclibLTLIBRARIES mostlyclean-am
|
||||||
|
|
||||||
|
distclean: distclean-am
|
||||||
|
-rm -f $(am__CONFIG_DISTCLEAN_FILES)
|
||||||
|
@@ -6932,14 +7084,15 @@ uninstall-am: uninstall-cafexeclibLTLIBR
|
||||||
|
.PHONY: CTAGS GTAGS TAGS all all-am all-local am--refresh check \
|
||||||
|
check-am clean clean-cafexeclibLTLIBRARIES clean-cscope \
|
||||||
|
clean-generic clean-libtool clean-local \
|
||||||
|
- clean-toolexeclibLTLIBRARIES cscope cscopelist-am ctags \
|
||||||
|
- ctags-am distclean distclean-compile distclean-generic \
|
||||||
|
- distclean-hdr distclean-libtool distclean-local distclean-tags \
|
||||||
|
- dvi dvi-am html html-am info info-am install install-am \
|
||||||
|
- install-cafexeclibLTLIBRARIES install-data install-data-am \
|
||||||
|
- install-dvi install-dvi-am install-exec install-exec-am \
|
||||||
|
- install-exec-local install-gfor_cHEADERS install-html \
|
||||||
|
- install-html-am install-info install-info-am install-man \
|
||||||
|
+ clean-noinstLTLIBRARIES clean-toolexeclibLTLIBRARIES cscope \
|
||||||
|
+ cscopelist-am ctags ctags-am distclean distclean-compile \
|
||||||
|
+ distclean-generic distclean-hdr distclean-libtool \
|
||||||
|
+ distclean-local distclean-tags dvi dvi-am html html-am info \
|
||||||
|
+ info-am install install-am install-cafexeclibLTLIBRARIES \
|
||||||
|
+ install-data install-data-am install-dvi install-dvi-am \
|
||||||
|
+ install-exec install-exec-am install-exec-local \
|
||||||
|
+ install-gfor_cHEADERS install-html install-html-am \
|
||||||
|
+ install-info install-info-am install-man \
|
||||||
|
install-nodist_fincludeHEADERS install-pdf install-pdf-am \
|
||||||
|
install-ps install-ps-am install-strip install-toolexeclibDATA \
|
||||||
|
install-toolexeclibLTLIBRARIES installcheck installcheck-am \
|
||||||
|
@@ -6997,6 +7150,38 @@ ieee_arithmetic.mod: ieee_arithmetic.lo
|
||||||
|
@onestep_TRUE@libgfortran_c.lo: $(filter %.c,$(prereq_SRC))
|
||||||
|
@onestep_TRUE@ $(LTCOMPILE) -c -o $@ $^ -combine
|
||||||
|
|
||||||
|
+$(patsubst %.c,%.lo,$(nonshared_generated_C_SRC) $(nonshared)): \
|
||||||
|
+nonshared-%.lo: $(srcdir)/generated/%.c
|
||||||
|
+ $(LTCOMPILE) -c -o $@ $< -DLIBGFORTRAN_NONSHARED
|
||||||
|
+
|
||||||
|
+$(patsubst %.c,%.o,$(nonshared_generated_C_SRC) $(nonshared)): \
|
||||||
|
+nonshared-%.o: $(srcdir)/generated/%.c
|
||||||
|
+ $(COMPILE) -c -o $@ $< -DLIBGFORTRAN_NONSHARED
|
||||||
|
+
|
||||||
|
+$(patsubst %.c,%.lo,$(nonshared_intrinsics_C_SRC) $(nonshared)): \
|
||||||
|
+nonshared-%.lo: $(srcdir)/intrinsics/%.c
|
||||||
|
+ $(LTCOMPILE) -c -o $@ $< -DLIBGFORTRAN_NONSHARED
|
||||||
|
+
|
||||||
|
+$(patsubst %.c,%.o,$(nonshared_intrinsics_C_SRC) $(nonshared)): \
|
||||||
|
+nonshared-%.o: $(srcdir)/intrinsics/%.c
|
||||||
|
+ $(COMPILE) -c -o $@ $< -DLIBGFORTRAN_NONSHARED
|
||||||
|
+
|
||||||
|
+$(patsubst %.c,%.lo,$(nonshared_runtime_C_SRC) $(nonshared)): \
|
||||||
|
+nonshared-%.lo: $(srcdir)/runtime/%.c
|
||||||
|
+ $(LTCOMPILE) -c -o $@ $< -DLIBGFORTRAN_NONSHARED
|
||||||
|
+
|
||||||
|
+$(patsubst %.c,%.o,$(nonshared_runtime_C_SRC) $(nonshared)): \
|
||||||
|
+nonshared-%.o: $(srcdir)/runtime/%.c
|
||||||
|
+ $(COMPILE) -c -o $@ $< -DLIBGFORTRAN_NONSHARED
|
||||||
|
+
|
||||||
|
+$(patsubst %.f90,%.lo,$(nonshared_intrinsics_f90_SRC) $(nonshared)): \
|
||||||
|
+nonshared-%.lo: $(srcdir)/intrinsics/%.f90
|
||||||
|
+ $(LTPPFCCOMPILE) -c -o $@ $< -fallow-leading-underscore
|
||||||
|
+
|
||||||
|
+$(patsubst %.f90,%.o,$(nonshared_intrinsics_f90_SRC) $(nonshared)): \
|
||||||
|
+nonshared-%.o: $(srcdir)/intrinsics/%.f90
|
||||||
|
+ $(PPFCCOMPILE) -c -o $@ $< -fallow-leading-underscore
|
||||||
|
+
|
||||||
|
kinds.h: $(srcdir)/mk-kinds-h.sh
|
||||||
|
$(SHELL) $(srcdir)/mk-kinds-h.sh '$(FCCOMPILE)' > $@ || rm $@
|
||||||
|
|
||||||
|
--- libgfortran/libgfortran.h.jj 2020-04-30 17:41:43.652586644 +0200
|
||||||
|
+++ libgfortran/libgfortran.h 2020-05-27 17:46:36.530953956 +0200
|
||||||
|
@@ -195,7 +195,7 @@ extern int __mingw_snprintf (char *, siz
|
||||||
|
# define internal_proto(x) sym_rename(x, IPREFIX(x))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
-#if defined(HAVE_ATTRIBUTE_VISIBILITY) && defined(HAVE_ATTRIBUTE_ALIAS)
|
||||||
|
+#if defined(HAVE_ATTRIBUTE_VISIBILITY) && defined(HAVE_ATTRIBUTE_ALIAS) && !defined(LIBGFORTRAN_NONSHARED)
|
||||||
|
# define export_proto(x) sym_rename(x, PREFIX(x))
|
||||||
|
# define export_proto_np(x) extern char swallow_semicolon
|
||||||
|
# define iexport_proto(x) internal_proto(x)
|
||||||
|
@@ -270,6 +270,10 @@ typedef GFC_UINTEGER_4 gfc_char4_t;
|
||||||
|
simply equal to the kind parameter itself. */
|
||||||
|
#define GFC_SIZE_OF_CHAR_KIND(kind) (kind)
|
||||||
|
|
||||||
|
+#ifdef LIBGFORTRAN_NONSHARED
|
||||||
|
+#define big_endian (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
#define GFOR_POINTER_TO_L1(p, kind) \
|
||||||
|
((__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ ? 1: 0) * (kind - 1) + (GFC_LOGICAL_1 *)(p))
|
||||||
|
|
||||||
|
@@ -1774,4 +1778,63 @@ internal_proto(cshift1_16_c16);
|
||||||
|
#define HAVE_GFC_UINTEGER_1 1
|
||||||
|
#define HAVE_GFC_UINTEGER_4 1
|
||||||
|
|
||||||
|
+#ifdef LIBGFORTRAN_NONSHARED
|
||||||
|
+#include <stdlib.h>
|
||||||
|
+#include <string.h>
|
||||||
|
+#include <errno.h>
|
||||||
|
+
|
||||||
|
+#define internal_malloc_size nonshared_internal_malloc_size
|
||||||
|
+#define xmalloc nonshared_internal_xmalloc
|
||||||
|
+#define xmallocarray nonshared_internal_xmallocarray
|
||||||
|
+#define reshape_packed nonshared_reshape_packed
|
||||||
|
+static inline __attribute__((__always_inline__, __unused__))
|
||||||
|
+void *
|
||||||
|
+internal_malloc_size (size_t size)
|
||||||
|
+{
|
||||||
|
+ void *p;
|
||||||
|
+
|
||||||
|
+ if (size == 0)
|
||||||
|
+ return NULL;
|
||||||
|
+
|
||||||
|
+ p = (void *) malloc (size);
|
||||||
|
+ if (p == NULL)
|
||||||
|
+ os_error ("Memory allocation failed");
|
||||||
|
+ return p;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static inline __attribute__((__always_inline__, __unused__))
|
||||||
|
+void *
|
||||||
|
+xmalloc (size_t size)
|
||||||
|
+{
|
||||||
|
+ return internal_malloc_size (size ? size : 1);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static inline __attribute__((__always_inline__, __unused__))
|
||||||
|
+void *
|
||||||
|
+xmallocarray (size_t nmemb, size_t size)
|
||||||
|
+{
|
||||||
|
+ if (!nmemb || !size)
|
||||||
|
+ size = nmemb = 1;
|
||||||
|
+ else if (__builtin_expect ((nmemb | size)
|
||||||
|
+ >= (((size_t) 1) << (__CHAR_BIT__
|
||||||
|
+ * sizeof (size_t) / 2)), 0)
|
||||||
|
+ && nmemb > __SIZE_MAX__ / size)
|
||||||
|
+ {
|
||||||
|
+ errno = ENOMEM;
|
||||||
|
+ os_error ("Integer overflow in xmallocarray");
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return internal_malloc_size (nmemb * size);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static inline __attribute__((__always_inline__, __unused__))
|
||||||
|
+#include "intrinsics/reshape_packed.c"
|
||||||
|
+
|
||||||
|
+struct no_bounds_check { int bounds_check; };
|
||||||
|
+#define compile_options ((struct no_bounds_check) { .bounds_check = 0 })
|
||||||
|
+
|
||||||
|
+#define internal_error(x, y...) runtime_error (y)
|
||||||
|
+
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
#endif /* LIBGFOR_H */
|
||||||
|
--- libgfortran/runtime/nonshared-error.c.jj 2020-05-27 19:01:38.937435776 +0200
|
||||||
|
+++ libgfortran/runtime/nonshared-error.c 2020-05-27 19:11:53.280403140 +0200
|
||||||
|
@@ -0,0 +1,56 @@
|
||||||
|
+/* Copyright (C) 2020 Free Software Foundation, Inc.
|
||||||
|
+
|
||||||
|
+This file is part of the GNU Fortran runtime library (libgfortran).
|
||||||
|
+
|
||||||
|
+Libgfortran is free software; you can redistribute it and/or modify
|
||||||
|
+it under the terms of the GNU General Public License as published by
|
||||||
|
+the Free Software Foundation; either version 3, or (at your option)
|
||||||
|
+any later version.
|
||||||
|
+
|
||||||
|
+Libgfortran is distributed in the hope that it will be useful,
|
||||||
|
+but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
+GNU General Public License for more details.
|
||||||
|
+
|
||||||
|
+Under Section 7 of GPL version 3, you are granted additional
|
||||||
|
+permissions described in the GCC Runtime Library Exception, version
|
||||||
|
+3.1, as published by the Free Software Foundation.
|
||||||
|
+
|
||||||
|
+You should have received a copy of the GNU General Public License and
|
||||||
|
+a copy of the GCC Runtime Library Exception along with this program;
|
||||||
|
+see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
||||||
|
+<http://www.gnu.org/licenses/>. */
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+#define LIBGFORTRAN_NONSHARED
|
||||||
|
+#include "libgfortran.h"
|
||||||
|
+#include "io.h"
|
||||||
|
+#include "async.h"
|
||||||
|
+
|
||||||
|
+#include <string.h>
|
||||||
|
+#include <stdio.h>
|
||||||
|
+
|
||||||
|
+/* Improved version of os_error with a printf style format string and
|
||||||
|
+ a locus. */
|
||||||
|
+
|
||||||
|
+void
|
||||||
|
+os_error_at (const char *where, const char *message, ...)
|
||||||
|
+{
|
||||||
|
+ char buf[4096];
|
||||||
|
+ size_t len = strlen (where);
|
||||||
|
+ int written;
|
||||||
|
+ va_list ap;
|
||||||
|
+
|
||||||
|
+ if (len >= 2048)
|
||||||
|
+ os_error ("Unknown error");
|
||||||
|
+ memcpy (buf, where, len);
|
||||||
|
+ memcpy (buf + len, ": ", 2);
|
||||||
|
+ va_start (ap, message);
|
||||||
|
+ written = vsnprintf (buf + len + 2, 4095 - len - 2, message, ap);
|
||||||
|
+ va_end (ap);
|
||||||
|
+ if (written < 0)
|
||||||
|
+ written = 0;
|
||||||
|
+ buf[len + 2 + written] = '\0';
|
||||||
|
+ os_error (buf);
|
||||||
|
+}
|
||||||
|
+iexport(os_error_at);
|
||||||
|
--- libgfortran/io/nonshared-transfer.c.jj 2020-05-27 17:46:36.539953825 +0200
|
||||||
|
+++ libgfortran/io/nonshared-transfer.c 2020-05-27 17:46:36.539953825 +0200
|
||||||
|
@@ -0,0 +1,42 @@
|
||||||
|
+/* Copyright (C) 2002-2019 Free Software Foundation, Inc.
|
||||||
|
+ Contributed by Andy Vaught
|
||||||
|
+ Namelist transfer functions contributed by Paul Thomas
|
||||||
|
+ F2003 I/O support contributed by Jerry DeLisle
|
||||||
|
+
|
||||||
|
+This file is part of the GNU Fortran runtime library (libgfortran).
|
||||||
|
+
|
||||||
|
+Libgfortran is free software; you can redistribute it and/or modify
|
||||||
|
+it under the terms of the GNU General Public License as published by
|
||||||
|
+the Free Software Foundation; either version 3, or (at your option)
|
||||||
|
+any later version.
|
||||||
|
+
|
||||||
|
+Libgfortran is distributed in the hope that it will be useful,
|
||||||
|
+but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
+GNU General Public License for more details.
|
||||||
|
+
|
||||||
|
+Under Section 7 of GPL version 3, you are granted additional
|
||||||
|
+permissions described in the GCC Runtime Library Exception, version
|
||||||
|
+3.1, as published by the Free Software Foundation.
|
||||||
|
+
|
||||||
|
+You should have received a copy of the GNU General Public License and
|
||||||
|
+a copy of the GCC Runtime Library Exception along with this program;
|
||||||
|
+see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
||||||
|
+<http://www.gnu.org/licenses/>. */
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+/* transfer.c -- Top level handling of data transfer statements. */
|
||||||
|
+
|
||||||
|
+#include "io.h"
|
||||||
|
+#include "fbuf.h"
|
||||||
|
+#include "format.h"
|
||||||
|
+#include "unix.h"
|
||||||
|
+#include "async.h"
|
||||||
|
+#include <string.h>
|
||||||
|
+#include <errno.h>
|
||||||
|
+
|
||||||
|
+void
|
||||||
|
+st_wait_async (st_parameter_wait *wtp)
|
||||||
|
+{
|
||||||
|
+ (void) wtp;
|
||||||
|
+}
|
17
SOURCES/gcc10-libgomp-omp_h-multilib.patch
Normal file
17
SOURCES/gcc10-libgomp-omp_h-multilib.patch
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
2008-06-09 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
* omp.h.in (omp_nest_lock_t): Fix up for Linux multilibs.
|
||||||
|
|
||||||
|
--- libgomp/omp.h.in.jj 2008-06-09 13:34:05.000000000 +0200
|
||||||
|
+++ libgomp/omp.h.in 2008-06-09 13:34:48.000000000 +0200
|
||||||
|
@@ -42,8 +42,8 @@ typedef struct
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
- unsigned char _x[@OMP_NEST_LOCK_SIZE@]
|
||||||
|
- __attribute__((__aligned__(@OMP_NEST_LOCK_ALIGN@)));
|
||||||
|
+ unsigned char _x[8 + sizeof (void *)]
|
||||||
|
+ __attribute__((__aligned__(sizeof (void *))));
|
||||||
|
} omp_nest_lock_t;
|
||||||
|
#endif
|
||||||
|
|
12173
SOURCES/gcc10-libstdc++-compat.patch
Normal file
12173
SOURCES/gcc10-libstdc++-compat.patch
Normal file
File diff suppressed because it is too large
Load Diff
24
SOURCES/gcc10-libstdc++-docs.patch
Normal file
24
SOURCES/gcc10-libstdc++-docs.patch
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
--- libstdc++-v3/doc/html/index.html.jj 2011-01-03 12:53:21.282829010 +0100
|
||||||
|
+++ libstdc++-v3/doc/html/index.html 2011-01-04 18:06:28.999851145 +0100
|
||||||
|
@@ -5,6 +5,8 @@
|
||||||
|
<a class="link" href="https://www.fsf.org" target="_top">FSF
|
||||||
|
</a>
|
||||||
|
</p><p>
|
||||||
|
+ Release 10.2.1
|
||||||
|
+ </p><p>
|
||||||
|
Permission is granted to copy, distribute and/or modify this
|
||||||
|
document under the terms of the GNU Free Documentation
|
||||||
|
License, Version 1.2 or any later version published by the
|
||||||
|
--- libstdc++-v3/doc/html/api.html.jj 2011-01-03 12:53:21.000000000 +0100
|
||||||
|
+++ libstdc++-v3/doc/html/api.html 2011-01-04 18:12:01.672757784 +0100
|
||||||
|
@@ -20,7 +20,9 @@
|
||||||
|
member functions for the library classes, finding out what is in a
|
||||||
|
particular include file, looking at inheritance diagrams, etc.
|
||||||
|
</p><p>
|
||||||
|
- The API documentation, rendered into HTML, can be viewed online
|
||||||
|
+ The API documentation, rendered into HTML, can be viewed locally
|
||||||
|
+ <a class="link" href="api/index.html" target="_top">for the 10.2.1 release</a>,
|
||||||
|
+ online
|
||||||
|
<a class="link" href="http://gcc.gnu.org/onlinedocs/" target="_top">for each GCC release</a>
|
||||||
|
and
|
||||||
|
<a class="link" href="http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/index.html" target="_top">
|
27
SOURCES/gcc10-libtool-no-rpath.patch
Normal file
27
SOURCES/gcc10-libtool-no-rpath.patch
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
libtool sucks.
|
||||||
|
--- ltmain.sh.jj 2007-12-07 14:53:21.000000000 +0100
|
||||||
|
+++ ltmain.sh 2008-09-05 21:51:48.000000000 +0200
|
||||||
|
@@ -5394,6 +5394,7 @@ EOF
|
||||||
|
rpath="$finalize_rpath"
|
||||||
|
test "$mode" != relink && rpath="$compile_rpath$rpath"
|
||||||
|
for libdir in $rpath; do
|
||||||
|
+ case "$libdir" in /usr/lib|/usr/lib64|/usr/lib/../lib|/usr/lib/../lib64) continue;; esac
|
||||||
|
if test -n "$hardcode_libdir_flag_spec"; then
|
||||||
|
if test -n "$hardcode_libdir_separator"; then
|
||||||
|
if test -z "$hardcode_libdirs"; then
|
||||||
|
@@ -6071,6 +6072,7 @@ EOF
|
||||||
|
rpath=
|
||||||
|
hardcode_libdirs=
|
||||||
|
for libdir in $compile_rpath $finalize_rpath; do
|
||||||
|
+ case "$libdir" in /usr/lib|/usr/lib64|/usr/lib/../lib|/usr/lib/../lib64) continue;; esac
|
||||||
|
if test -n "$hardcode_libdir_flag_spec"; then
|
||||||
|
if test -n "$hardcode_libdir_separator"; then
|
||||||
|
if test -z "$hardcode_libdirs"; then
|
||||||
|
@@ -6120,6 +6122,7 @@ EOF
|
||||||
|
rpath=
|
||||||
|
hardcode_libdirs=
|
||||||
|
for libdir in $finalize_rpath; do
|
||||||
|
+ case "$libdir" in /usr/lib|/usr/lib64|/usr/lib/../lib|/usr/lib/../lib64) continue;; esac
|
||||||
|
if test -n "$hardcode_libdir_flag_spec"; then
|
||||||
|
if test -n "$hardcode_libdir_separator"; then
|
||||||
|
if test -z "$hardcode_libdirs"; then
|
37
SOURCES/gcc10-no-add-needed.patch
Normal file
37
SOURCES/gcc10-no-add-needed.patch
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
2010-02-08 Roland McGrath <roland@redhat.com>
|
||||||
|
|
||||||
|
* config/gnu-user.h (LINK_EH_SPEC): Pass --no-add-needed to the linker.
|
||||||
|
* config/alpha/elf.h (LINK_EH_SPEC): Likewise.
|
||||||
|
* config/ia64/linux.h (LINK_EH_SPEC): Likewise.
|
||||||
|
|
||||||
|
--- gcc/config/alpha/elf.h.jj 2011-01-03 12:52:31.118056764 +0100
|
||||||
|
+++ gcc/config/alpha/elf.h 2011-01-04 18:14:10.931874160 +0100
|
||||||
|
@@ -168,5 +168,5 @@ extern int alpha_this_gpdisp_sequence_nu
|
||||||
|
I imagine that other systems will catch up. In the meantime, it
|
||||||
|
doesn't harm to make sure that the data exists to be used later. */
|
||||||
|
#if defined(HAVE_LD_EH_FRAME_HDR)
|
||||||
|
-#define LINK_EH_SPEC "%{!static|static-pie:--eh-frame-hdr} "
|
||||||
|
+#define LINK_EH_SPEC "--no-add-needed %{!static|static-pie:--eh-frame-hdr} "
|
||||||
|
#endif
|
||||||
|
--- gcc/config/ia64/linux.h.jj 2011-01-03 13:02:11.462994522 +0100
|
||||||
|
+++ gcc/config/ia64/linux.h 2011-01-04 18:14:10.931874160 +0100
|
||||||
|
@@ -76,7 +76,7 @@ do { \
|
||||||
|
Signalize that because we have fde-glibc, we don't need all C shared libs
|
||||||
|
linked against -lgcc_s. */
|
||||||
|
#undef LINK_EH_SPEC
|
||||||
|
-#define LINK_EH_SPEC ""
|
||||||
|
+#define LINK_EH_SPEC "--no-add-needed "
|
||||||
|
|
||||||
|
#undef TARGET_INIT_LIBFUNCS
|
||||||
|
#define TARGET_INIT_LIBFUNCS ia64_soft_fp_init_libfuncs
|
||||||
|
--- gcc/config/gnu-user.h.jj 2011-01-03 12:53:03.739057299 +0100
|
||||||
|
+++ gcc/config/gnu-user.h 2011-01-04 18:14:10.932814884 +0100
|
||||||
|
@@ -106,7 +106,7 @@ see the files COPYING3 and COPYING.RUNTI
|
||||||
|
#define LIB_SPEC GNU_USER_TARGET_LIB_SPEC
|
||||||
|
|
||||||
|
#if defined(HAVE_LD_EH_FRAME_HDR)
|
||||||
|
-#define LINK_EH_SPEC "%{!static|static-pie:--eh-frame-hdr} "
|
||||||
|
+#define LINK_EH_SPEC "--no-add-needed %{!static|static-pie:--eh-frame-hdr} "
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define GNU_USER_TARGET_LINK_GCC_C_SEQUENCE_SPEC \
|
324
SOURCES/gcc10-pr94540.patch
Normal file
324
SOURCES/gcc10-pr94540.patch
Normal file
@ -0,0 +1,324 @@
|
|||||||
|
commit 632183ddcc8f3aead8b4fc63c4ab59a42ef9ad00
|
||||||
|
Author: Jonathan Wakely <jwakely@redhat.com>
|
||||||
|
Date: Wed Jun 17 22:49:06 2020 +0100
|
||||||
|
|
||||||
|
libstdc++: Avoid stack overflow in std::vector (PR 94540)
|
||||||
|
|
||||||
|
The std::__uninitialized_default_n algorithm used by std::vector creates
|
||||||
|
an initial object as a local variable then copies that into the
|
||||||
|
destination range. If the object is too large for the stack this
|
||||||
|
crashes. We should create the first object directly into the
|
||||||
|
destination and then copy it from there.
|
||||||
|
|
||||||
|
This doesn't fix the bug for C++98, because in that case the initial
|
||||||
|
value is created as a default argument of the vector constructor i.e. in
|
||||||
|
the user's code, not inside libstdc++. We can't prevent that.
|
||||||
|
|
||||||
|
PR libstdc++/94540
|
||||||
|
* include/bits/stl_uninitialized.h (__uninitialized_default_1<true>):
|
||||||
|
Construct the first value at *__first instead of on the stack.
|
||||||
|
(__uninitialized_default_n_1<true>): Likewise.
|
||||||
|
Improve comments on several of the non-standard algorithms.
|
||||||
|
* testsuite/20_util/specialized_algorithms/uninitialized_default/94540.cc:
|
||||||
|
New test.
|
||||||
|
* testsuite/20_util/specialized_algorithms/uninitialized_default_n/94540.cc:
|
||||||
|
New test.
|
||||||
|
* testsuite/20_util/specialized_algorithms/uninitialized_value_construct/94540.cc:
|
||||||
|
New test.
|
||||||
|
* testsuite/20_util/specialized_algorithms/uninitialized_value_construct_n/94540.cc:
|
||||||
|
New test.
|
||||||
|
* testsuite/23_containers/vector/cons/94540.cc: New test.
|
||||||
|
|
||||||
|
--- libstdc++-v3/include/bits/stl_uninitialized.h
|
||||||
|
+++ libstdc++-v3/include/bits/stl_uninitialized.h
|
||||||
|
@@ -556,7 +556,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||||
|
typedef typename iterator_traits<_ForwardIterator>::value_type
|
||||||
|
_ValueType;
|
||||||
|
|
||||||
|
- std::fill(__first, __last, _ValueType());
|
||||||
|
+ if (__first == __last)
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
+ typename iterator_traits<_ForwardIterator>::value_type* __val
|
||||||
|
+ = std::__addressof(*__first);
|
||||||
|
+ std::_Construct(__val);
|
||||||
|
+ if (++__first != __last)
|
||||||
|
+ std::fill(__first, __last, *__val);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
@@ -589,16 +596,20 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||||
|
static _ForwardIterator
|
||||||
|
__uninit_default_n(_ForwardIterator __first, _Size __n)
|
||||||
|
{
|
||||||
|
- typedef typename iterator_traits<_ForwardIterator>::value_type
|
||||||
|
- _ValueType;
|
||||||
|
-
|
||||||
|
- return std::fill_n(__first, __n, _ValueType());
|
||||||
|
+ if (__n > 0)
|
||||||
|
+ {
|
||||||
|
+ typename iterator_traits<_ForwardIterator>::value_type* __val
|
||||||
|
+ = std::__addressof(*__first);
|
||||||
|
+ std::_Construct(__val);
|
||||||
|
+ ++__first;
|
||||||
|
+ __first = std::fill_n(__first, __n - 1, *__val);
|
||||||
|
+ }
|
||||||
|
+ return __first;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// __uninitialized_default
|
||||||
|
- // Fills [first, last) with std::distance(first, last) default
|
||||||
|
- // constructed value_types(s).
|
||||||
|
+ // Fills [first, last) with value-initialized value_types.
|
||||||
|
template<typename _ForwardIterator>
|
||||||
|
inline void
|
||||||
|
__uninitialized_default(_ForwardIterator __first,
|
||||||
|
@@ -615,7 +626,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||||
|
}
|
||||||
|
|
||||||
|
// __uninitialized_default_n
|
||||||
|
- // Fills [first, first + n) with n default constructed value_type(s).
|
||||||
|
+ // Fills [first, first + n) with value-initialized value_types.
|
||||||
|
template<typename _ForwardIterator, typename _Size>
|
||||||
|
inline _ForwardIterator
|
||||||
|
__uninitialized_default_n(_ForwardIterator __first, _Size __n)
|
||||||
|
@@ -633,8 +644,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||||
|
|
||||||
|
|
||||||
|
// __uninitialized_default_a
|
||||||
|
- // Fills [first, last) with std::distance(first, last) default
|
||||||
|
- // constructed value_types(s), constructed with the allocator alloc.
|
||||||
|
+ // Fills [first, last) with value_types constructed by the allocator
|
||||||
|
+ // alloc, with no arguments passed to the construct call.
|
||||||
|
template<typename _ForwardIterator, typename _Allocator>
|
||||||
|
void
|
||||||
|
__uninitialized_default_a(_ForwardIterator __first,
|
||||||
|
@@ -664,8 +675,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||||
|
|
||||||
|
|
||||||
|
// __uninitialized_default_n_a
|
||||||
|
- // Fills [first, first + n) with n default constructed value_types(s),
|
||||||
|
- // constructed with the allocator alloc.
|
||||||
|
+ // Fills [first, first + n) with value_types constructed by the allocator
|
||||||
|
+ // alloc, with no arguments passed to the construct call.
|
||||||
|
template<typename _ForwardIterator, typename _Size, typename _Allocator>
|
||||||
|
_ForwardIterator
|
||||||
|
__uninitialized_default_n_a(_ForwardIterator __first, _Size __n,
|
||||||
|
@@ -686,6 +697,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+ // __uninitialized_default_n_a specialization for std::allocator,
|
||||||
|
+ // which ignores the allocator and value-initializes the elements.
|
||||||
|
template<typename _ForwardIterator, typename _Size, typename _Tp>
|
||||||
|
inline _ForwardIterator
|
||||||
|
__uninitialized_default_n_a(_ForwardIterator __first, _Size __n,
|
||||||
|
@@ -757,8 +770,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||||
|
};
|
||||||
|
|
||||||
|
// __uninitialized_default_novalue
|
||||||
|
- // Fills [first, last) with std::distance(first, last) default-initialized
|
||||||
|
- // value_types(s).
|
||||||
|
+ // Fills [first, last) with default-initialized value_types.
|
||||||
|
template<typename _ForwardIterator>
|
||||||
|
inline void
|
||||||
|
__uninitialized_default_novalue(_ForwardIterator __first,
|
||||||
|
@@ -772,8 +784,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||||
|
__uninit_default_novalue(__first, __last);
|
||||||
|
}
|
||||||
|
|
||||||
|
- // __uninitialized_default_n
|
||||||
|
- // Fills [first, first + n) with n default-initialized value_type(s).
|
||||||
|
+ // __uninitialized_default_novalue_n
|
||||||
|
+ // Fills [first, first + n) with default-initialized value_types.
|
||||||
|
template<typename _ForwardIterator, typename _Size>
|
||||||
|
inline _ForwardIterator
|
||||||
|
__uninitialized_default_novalue_n(_ForwardIterator __first, _Size __n)
|
||||||
|
--- /dev/null
|
||||||
|
+++ libstdc++-v3/testsuite/20_util/specialized_algorithms/uninitialized_default/94540.cc
|
||||||
|
@@ -0,0 +1,34 @@
|
||||||
|
+// Copyright (C) 2020 Free Software Foundation, Inc.
|
||||||
|
+//
|
||||||
|
+// This file is part of the GNU ISO C++ Library. This library is free
|
||||||
|
+// software; you can redistribute it and/or modify it under the
|
||||||
|
+// terms of the GNU General Public License as published by the
|
||||||
|
+// Free Software Foundation; either version 3, or (at your option)
|
||||||
|
+// any later version.
|
||||||
|
+
|
||||||
|
+// This library is distributed in the hope that it will be useful,
|
||||||
|
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
+// GNU General Public License for more details.
|
||||||
|
+
|
||||||
|
+// You should have received a copy of the GNU General Public License along
|
||||||
|
+// with this library; see the file COPYING3. If not see
|
||||||
|
+// <http://www.gnu.org/licenses/>.
|
||||||
|
+
|
||||||
|
+// { dg-do run { target { c++11 && { ! simulator } } } }
|
||||||
|
+
|
||||||
|
+#include <memory>
|
||||||
|
+#include <testsuite_hooks.h>
|
||||||
|
+
|
||||||
|
+// Assume that 9MB is larger than the stack limit.
|
||||||
|
+struct X { char data[9*1024*1024]; };
|
||||||
|
+
|
||||||
|
+static_assert( std::is_trivial<X>::value, "" );
|
||||||
|
+
|
||||||
|
+int main()
|
||||||
|
+{
|
||||||
|
+ auto mem = new char[sizeof(X) * 2];
|
||||||
|
+ auto p = reinterpret_cast<X*>(mem);
|
||||||
|
+ std::__uninitialized_default(p, p + 2);
|
||||||
|
+ delete[] mem;
|
||||||
|
+}
|
||||||
|
--- /dev/null
|
||||||
|
+++ libstdc++-v3/testsuite/20_util/specialized_algorithms/uninitialized_default_n/94540.cc
|
||||||
|
@@ -0,0 +1,34 @@
|
||||||
|
+// Copyright (C) 2020 Free Software Foundation, Inc.
|
||||||
|
+//
|
||||||
|
+// This file is part of the GNU ISO C++ Library. This library is free
|
||||||
|
+// software; you can redistribute it and/or modify it under the
|
||||||
|
+// terms of the GNU General Public License as published by the
|
||||||
|
+// Free Software Foundation; either version 3, or (at your option)
|
||||||
|
+// any later version.
|
||||||
|
+
|
||||||
|
+// This library is distributed in the hope that it will be useful,
|
||||||
|
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
+// GNU General Public License for more details.
|
||||||
|
+
|
||||||
|
+// You should have received a copy of the GNU General Public License along
|
||||||
|
+// with this library; see the file COPYING3. If not see
|
||||||
|
+// <http://www.gnu.org/licenses/>.
|
||||||
|
+
|
||||||
|
+// { dg-do run { target { c++11 && { ! simulator } } } }
|
||||||
|
+
|
||||||
|
+#include <memory>
|
||||||
|
+#include <testsuite_hooks.h>
|
||||||
|
+
|
||||||
|
+// Assume that 9MB is larger than the stack limit.
|
||||||
|
+struct X { char data[9*1024*1024]; };
|
||||||
|
+
|
||||||
|
+static_assert( std::is_trivial<X>::value, "" );
|
||||||
|
+
|
||||||
|
+int main()
|
||||||
|
+{
|
||||||
|
+ auto mem = new char[sizeof(X) * 2];
|
||||||
|
+ auto p = reinterpret_cast<X*>(mem);
|
||||||
|
+ std::__uninitialized_default_n(p, 2);
|
||||||
|
+ delete[] mem;
|
||||||
|
+}
|
||||||
|
--- /dev/null
|
||||||
|
+++ libstdc++-v3/testsuite/20_util/specialized_algorithms/uninitialized_value_construct/94540.cc
|
||||||
|
@@ -0,0 +1,35 @@
|
||||||
|
+// Copyright (C) 2020 Free Software Foundation, Inc.
|
||||||
|
+//
|
||||||
|
+// This file is part of the GNU ISO C++ Library. This library is free
|
||||||
|
+// software; you can redistribute it and/or modify it under the
|
||||||
|
+// terms of the GNU General Public License as published by the
|
||||||
|
+// Free Software Foundation; either version 3, or (at your option)
|
||||||
|
+// any later version.
|
||||||
|
+
|
||||||
|
+// This library is distributed in the hope that it will be useful,
|
||||||
|
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
+// GNU General Public License for more details.
|
||||||
|
+
|
||||||
|
+// You should have received a copy of the GNU General Public License along
|
||||||
|
+// with this library; see the file COPYING3. If not see
|
||||||
|
+// <http://www.gnu.org/licenses/>.
|
||||||
|
+
|
||||||
|
+// { dg-options "-std=gnu++17" }
|
||||||
|
+// { dg-do run { target { c++17 && { ! simulator } } } }
|
||||||
|
+
|
||||||
|
+#include <memory>
|
||||||
|
+#include <testsuite_hooks.h>
|
||||||
|
+
|
||||||
|
+// Assume that 9MB is larger than the stack limit.
|
||||||
|
+struct X { char data[9*1024*1024]; };
|
||||||
|
+
|
||||||
|
+static_assert( std::is_trivial_v<X> );
|
||||||
|
+
|
||||||
|
+int main()
|
||||||
|
+{
|
||||||
|
+ auto mem = new char[sizeof(X) * 2];
|
||||||
|
+ auto p = reinterpret_cast<X*>(mem);
|
||||||
|
+ std::uninitialized_value_construct(p, p + 2);
|
||||||
|
+ delete[] mem;
|
||||||
|
+}
|
||||||
|
--- /dev/null
|
||||||
|
+++ libstdc++-v3/testsuite/20_util/specialized_algorithms/uninitialized_value_construct_n/94540.cc
|
||||||
|
@@ -0,0 +1,34 @@
|
||||||
|
+// Copyright (C) 2020 Free Software Foundation, Inc.
|
||||||
|
+//
|
||||||
|
+// This file is part of the GNU ISO C++ Library. This library is free
|
||||||
|
+// software; you can redistribute it and/or modify it under the
|
||||||
|
+// terms of the GNU General Public License as published by the
|
||||||
|
+// Free Software Foundation; either version 3, or (at your option)
|
||||||
|
+// any later version.
|
||||||
|
+
|
||||||
|
+// This library is distributed in the hope that it will be useful,
|
||||||
|
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
+// GNU General Public License for more details.
|
||||||
|
+
|
||||||
|
+// You should have received a copy of the GNU General Public License along
|
||||||
|
+// with this library; see the file COPYING3. If not see
|
||||||
|
+// <http://www.gnu.org/licenses/>.
|
||||||
|
+
|
||||||
|
+// { dg-options "-std=gnu++17" }
|
||||||
|
+// { dg-do run { target { c++17 && { ! simulator } } } }
|
||||||
|
+
|
||||||
|
+#include <memory>
|
||||||
|
+#include <testsuite_hooks.h>
|
||||||
|
+
|
||||||
|
+// Assume that 9MB is larger than the stack limit.
|
||||||
|
+struct X { char data[9*1024*1024]; };
|
||||||
|
+
|
||||||
|
+static_assert( std::is_trivial_v<X> );
|
||||||
|
+
|
||||||
|
+int main()
|
||||||
|
+{
|
||||||
|
+ auto mem = new char[sizeof(X) * 2];
|
||||||
|
+ std::uninitialized_value_construct_n(reinterpret_cast<X*>(mem), 2);
|
||||||
|
+ delete[] mem;
|
||||||
|
+}
|
||||||
|
--- /dev/null
|
||||||
|
+++ libstdc++-v3/testsuite/23_containers/vector/cons/94540.cc
|
||||||
|
@@ -0,0 +1,35 @@
|
||||||
|
+// Copyright (C) 2020 Free Software Foundation, Inc.
|
||||||
|
+//
|
||||||
|
+// This file is part of the GNU ISO C++ Library. This library is free
|
||||||
|
+// software; you can redistribute it and/or modify it under the
|
||||||
|
+// terms of the GNU General Public License as published by the
|
||||||
|
+// Free Software Foundation; either version 3, or (at your option)
|
||||||
|
+// any later version.
|
||||||
|
+
|
||||||
|
+// This library is distributed in the hope that it will be useful,
|
||||||
|
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
+// GNU General Public License for more details.
|
||||||
|
+
|
||||||
|
+// You should have received a copy of the GNU General Public License along
|
||||||
|
+// with this library; see the file COPYING3. If not see
|
||||||
|
+// <http://www.gnu.org/licenses/>.
|
||||||
|
+
|
||||||
|
+// { dg-do run { target { c++11 && { ! simulator } } } }
|
||||||
|
+
|
||||||
|
+#include <vector>
|
||||||
|
+#include <testsuite_hooks.h>
|
||||||
|
+
|
||||||
|
+// Assume that 9MB is larger than the stack limit.
|
||||||
|
+struct X { char data[9*1024*1024]; };
|
||||||
|
+
|
||||||
|
+static_assert( std::is_trivial<X>::value, "" );
|
||||||
|
+
|
||||||
|
+int main()
|
||||||
|
+{
|
||||||
|
+ std::vector<X> v(1);
|
||||||
|
+ VERIFY( v.size() == 1 );
|
||||||
|
+ v.clear();
|
||||||
|
+ v.resize(2);
|
||||||
|
+ VERIFY( v.size() == 2 );
|
||||||
|
+}
|
236
SOURCES/gcc10-pr96383.patch
Normal file
236
SOURCES/gcc10-pr96383.patch
Normal file
@ -0,0 +1,236 @@
|
|||||||
|
2020-07-30 Richard Biener <rguenther@suse.de>
|
||||||
|
|
||||||
|
PR debug/96383
|
||||||
|
* langhooks-def.h (lhd_finalize_early_debug): Declare.
|
||||||
|
(LANG_HOOKS_FINALIZE_EARLY_DEBUG): Define.
|
||||||
|
(LANG_HOOKS_INITIALIZER): Amend.
|
||||||
|
* langhooks.c: Include cgraph.h and debug.h.
|
||||||
|
(lhd_finalize_early_debug): Default implementation from
|
||||||
|
former code in finalize_compilation_unit.
|
||||||
|
* langhooks.h (lang_hooks::finalize_early_debug): Add.
|
||||||
|
* cgraphunit.c (symbol_table::finalize_compilation_unit):
|
||||||
|
Call the finalize_early_debug langhook.
|
||||||
|
|
||||||
|
gcc/c-family/
|
||||||
|
* c-common.h (c_common_finalize_early_debug): Declare.
|
||||||
|
* c-common.c: Include debug.h.
|
||||||
|
(c_common_finalize_early_debug): finalize_early_debug langhook
|
||||||
|
implementation generating debug for extern declarations.
|
||||||
|
|
||||||
|
gcc/c/
|
||||||
|
* c-objc-common.h (LANG_HOOKS_FINALIZE_EARLY_DEBUG):
|
||||||
|
Define to c_common_finalize_early_debug.
|
||||||
|
|
||||||
|
gcc/cp/
|
||||||
|
* cp-objcp-common.h (LANG_HOOKS_FINALIZE_EARLY_DEBUG):
|
||||||
|
Define to c_common_finalize_early_debug.
|
||||||
|
|
||||||
|
gcc/testsuite/
|
||||||
|
* gcc.dg/debug/dwarf2/pr96383-1.c: New testcase.
|
||||||
|
* gcc.dg/debug/dwarf2/pr96383-2.c: Likewise.
|
||||||
|
|
||||||
|
libstdc++-v3/
|
||||||
|
* testsuite/20_util/assume_aligned/3.cc: Use -g0.
|
||||||
|
|
||||||
|
--- gcc/c-family/c-common.c
|
||||||
|
+++ gcc/c-family/c-common.c
|
||||||
|
@@ -50,6 +50,7 @@ along with GCC; see the file COPYING3. If not see
|
||||||
|
#include "spellcheck.h"
|
||||||
|
#include "c-spellcheck.h"
|
||||||
|
#include "selftest.h"
|
||||||
|
+#include "debug.h"
|
||||||
|
|
||||||
|
cpp_reader *parse_in; /* Declared in c-pragma.h. */
|
||||||
|
|
||||||
|
@@ -9086,4 +9087,20 @@ braced_lists_to_strings (tree type, tree ctor)
|
||||||
|
return braced_lists_to_strings (type, ctor, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
+
|
||||||
|
+/* Emit debug for functions before finalizing early debug. */
|
||||||
|
+
|
||||||
|
+void
|
||||||
|
+c_common_finalize_early_debug (void)
|
||||||
|
+{
|
||||||
|
+ /* Emit early debug for reachable functions, and by consequence,
|
||||||
|
+ locally scoped symbols. Also emit debug for extern declared
|
||||||
|
+ functions that are still reachable at this point. */
|
||||||
|
+ struct cgraph_node *cnode;
|
||||||
|
+ FOR_EACH_FUNCTION (cnode)
|
||||||
|
+ if (!cnode->alias && !cnode->thunk.thunk_p
|
||||||
|
+ && (cnode->has_gimple_body_p () || !DECL_IS_BUILTIN (cnode->decl)))
|
||||||
|
+ (*debug_hooks->early_global_decl) (cnode->decl);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
#include "gt-c-family-c-common.h"
|
||||||
|
--- gcc/c-family/c-common.h
|
||||||
|
+++ gcc/c-family/c-common.h
|
||||||
|
@@ -885,6 +885,8 @@ extern bool bool_promoted_to_int_p (tree);
|
||||||
|
extern tree fold_for_warn (tree);
|
||||||
|
extern tree c_common_get_narrower (tree, int *);
|
||||||
|
extern bool get_attribute_operand (tree, unsigned HOST_WIDE_INT *);
|
||||||
|
+extern void c_common_finalize_early_debug (void);
|
||||||
|
+
|
||||||
|
|
||||||
|
#define c_sizeof(LOC, T) c_sizeof_or_alignof_type (LOC, T, true, false, 1)
|
||||||
|
#define c_alignof(LOC, T) c_sizeof_or_alignof_type (LOC, T, false, false, 1)
|
||||||
|
--- gcc/c/c-objc-common.h
|
||||||
|
+++ gcc/c/c-objc-common.h
|
||||||
|
@@ -65,6 +65,8 @@ along with GCC; see the file COPYING3. If not see
|
||||||
|
c_simulate_builtin_function_decl
|
||||||
|
#undef LANG_HOOKS_EMITS_BEGIN_STMT
|
||||||
|
#define LANG_HOOKS_EMITS_BEGIN_STMT true
|
||||||
|
+#undef LANG_HOOKS_FINALIZE_EARLY_DEBUG
|
||||||
|
+#define LANG_HOOKS_FINALIZE_EARLY_DEBUG c_common_finalize_early_debug
|
||||||
|
|
||||||
|
/* Attribute hooks. */
|
||||||
|
#undef LANG_HOOKS_COMMON_ATTRIBUTE_TABLE
|
||||||
|
--- gcc/cgraphunit.c
|
||||||
|
+++ gcc/cgraphunit.c
|
||||||
|
@@ -2998,11 +2998,9 @@ symbol_table::finalize_compilation_unit (void)
|
||||||
|
|
||||||
|
if (!seen_error ())
|
||||||
|
{
|
||||||
|
- /* Emit early debug for reachable functions, and by consequence,
|
||||||
|
- locally scoped symbols. */
|
||||||
|
- struct cgraph_node *cnode;
|
||||||
|
- FOR_EACH_FUNCTION_WITH_GIMPLE_BODY (cnode)
|
||||||
|
- (*debug_hooks->early_global_decl) (cnode->decl);
|
||||||
|
+ /* Give the frontends the chance to emit early debug based on
|
||||||
|
+ what is still reachable in the TU. */
|
||||||
|
+ (*lang_hooks.finalize_early_debug) ();
|
||||||
|
|
||||||
|
/* Clean up anything that needs cleaning up after initial debug
|
||||||
|
generation. */
|
||||||
|
--- gcc/cp/cp-objcp-common.h
|
||||||
|
+++ gcc/cp/cp-objcp-common.h
|
||||||
|
@@ -115,6 +115,8 @@ extern tree cxx_simulate_enum_decl (location_t, const char *,
|
||||||
|
#define LANG_HOOKS_BLOCK_MAY_FALLTHRU cxx_block_may_fallthru
|
||||||
|
#undef LANG_HOOKS_EMITS_BEGIN_STMT
|
||||||
|
#define LANG_HOOKS_EMITS_BEGIN_STMT true
|
||||||
|
+#undef LANG_HOOKS_FINALIZE_EARLY_DEBUG
|
||||||
|
+#define LANG_HOOKS_FINALIZE_EARLY_DEBUG c_common_finalize_early_debug
|
||||||
|
|
||||||
|
/* Attribute hooks. */
|
||||||
|
#undef LANG_HOOKS_COMMON_ATTRIBUTE_TABLE
|
||||||
|
--- gcc/langhooks-def.h
|
||||||
|
+++ gcc/langhooks-def.h
|
||||||
|
@@ -92,6 +92,7 @@ extern const char *lhd_get_substring_location (const substring_loc &,
|
||||||
|
location_t *out_loc);
|
||||||
|
extern int lhd_decl_dwarf_attribute (const_tree, int);
|
||||||
|
extern int lhd_type_dwarf_attribute (const_tree, int);
|
||||||
|
+extern void lhd_finalize_early_debug (void);
|
||||||
|
|
||||||
|
#define LANG_HOOKS_NAME "GNU unknown"
|
||||||
|
#define LANG_HOOKS_IDENTIFIER_SIZE sizeof (struct lang_identifier)
|
||||||
|
@@ -139,6 +140,7 @@ extern int lhd_type_dwarf_attribute (const_tree, int);
|
||||||
|
#define LANG_HOOKS_EMITS_BEGIN_STMT false
|
||||||
|
#define LANG_HOOKS_RUN_LANG_SELFTESTS lhd_do_nothing
|
||||||
|
#define LANG_HOOKS_GET_SUBSTRING_LOCATION lhd_get_substring_location
|
||||||
|
+#define LANG_HOOKS_FINALIZE_EARLY_DEBUG lhd_finalize_early_debug
|
||||||
|
|
||||||
|
/* Attribute hooks. */
|
||||||
|
#define LANG_HOOKS_ATTRIBUTE_TABLE NULL
|
||||||
|
@@ -364,7 +366,8 @@ extern void lhd_end_section (void);
|
||||||
|
LANG_HOOKS_CUSTOM_FUNCTION_DESCRIPTORS, \
|
||||||
|
LANG_HOOKS_EMITS_BEGIN_STMT, \
|
||||||
|
LANG_HOOKS_RUN_LANG_SELFTESTS, \
|
||||||
|
- LANG_HOOKS_GET_SUBSTRING_LOCATION \
|
||||||
|
+ LANG_HOOKS_GET_SUBSTRING_LOCATION, \
|
||||||
|
+ LANG_HOOKS_FINALIZE_EARLY_DEBUG \
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* GCC_LANG_HOOKS_DEF_H */
|
||||||
|
--- gcc/langhooks.c
|
||||||
|
+++ gcc/langhooks.c
|
||||||
|
@@ -36,6 +36,8 @@ along with GCC; see the file COPYING3. If not see
|
||||||
|
#include "output.h"
|
||||||
|
#include "timevar.h"
|
||||||
|
#include "stor-layout.h"
|
||||||
|
+#include "cgraph.h"
|
||||||
|
+#include "debug.h"
|
||||||
|
|
||||||
|
/* Do nothing; in many cases the default hook. */
|
||||||
|
|
||||||
|
@@ -866,6 +868,18 @@ lhd_unit_size_without_reusable_padding (tree t)
|
||||||
|
return TYPE_SIZE_UNIT (t);
|
||||||
|
}
|
||||||
|
|
||||||
|
+/* Default implementation for the finalize_early_debug hook. */
|
||||||
|
+
|
||||||
|
+void
|
||||||
|
+lhd_finalize_early_debug (void)
|
||||||
|
+{
|
||||||
|
+ /* Emit early debug for reachable functions, and by consequence,
|
||||||
|
+ locally scoped symbols. */
|
||||||
|
+ struct cgraph_node *cnode;
|
||||||
|
+ FOR_EACH_FUNCTION_WITH_GIMPLE_BODY (cnode)
|
||||||
|
+ (*debug_hooks->early_global_decl) (cnode->decl);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/* Returns true if the current lang_hooks represents the GNU C frontend. */
|
||||||
|
|
||||||
|
bool
|
||||||
|
--- gcc/langhooks.h
|
||||||
|
+++ gcc/langhooks.h
|
||||||
|
@@ -580,6 +580,9 @@ struct lang_hooks
|
||||||
|
const char *(*get_substring_location) (const substring_loc &,
|
||||||
|
location_t *out_loc);
|
||||||
|
|
||||||
|
+ /* Invoked before the early_finish debug hook is invoked. */
|
||||||
|
+ void (*finalize_early_debug) (void);
|
||||||
|
+
|
||||||
|
/* Whenever you add entries here, make sure you adjust langhooks-def.h
|
||||||
|
and langhooks.c accordingly. */
|
||||||
|
};
|
||||||
|
--- gcc/testsuite/gcc.dg/debug/dwarf2/pr96383-1.c
|
||||||
|
+++ gcc/testsuite/gcc.dg/debug/dwarf2/pr96383-1.c
|
||||||
|
@@ -0,0 +1,17 @@
|
||||||
|
+/* { dg-do compile } */
|
||||||
|
+/* { dg-options "-g -gdwarf -dA" } */
|
||||||
|
+
|
||||||
|
+extern void foo (int);
|
||||||
|
+extern void unusedbar (int);
|
||||||
|
+
|
||||||
|
+int main()
|
||||||
|
+{
|
||||||
|
+ foo (1);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/* We want subprogram DIEs for both foo and main and a DIE for
|
||||||
|
+ the formal parameter of foo. We do not want a DIE for
|
||||||
|
+ unusedbar. */
|
||||||
|
+/* { dg-final { scan-assembler-times "DW_TAG_subprogram" 4 } } */
|
||||||
|
+/* { dg-final { scan-assembler-times "DW_TAG_formal_parameter" 2 } } */
|
||||||
|
+/* { dg-final { scan-assembler-not "unusedbar" } } */
|
||||||
|
--- gcc/testsuite/gcc.dg/debug/dwarf2/pr96383-2.c
|
||||||
|
+++ gcc/testsuite/gcc.dg/debug/dwarf2/pr96383-2.c
|
||||||
|
@@ -0,0 +1,17 @@
|
||||||
|
+/* { dg-do compile } */
|
||||||
|
+/* { dg-options "-g -O2 -gdwarf -dA" } */
|
||||||
|
+
|
||||||
|
+extern void foo (int);
|
||||||
|
+extern void unusedbar (int);
|
||||||
|
+
|
||||||
|
+int main()
|
||||||
|
+{
|
||||||
|
+ foo (1);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/* We want subprogram DIEs for both foo and main and a DIE for
|
||||||
|
+ the formal parameter of foo. We do not want a DIE for
|
||||||
|
+ unusedbar. */
|
||||||
|
+/* { dg-final { scan-assembler-times "DW_TAG_subprogram" 4 } } */
|
||||||
|
+/* { dg-final { scan-assembler-times "DW_TAG_formal_parameter" 2 } } */
|
||||||
|
+/* { dg-final { scan-assembler-not "unusedbar" } } */
|
||||||
|
--- libstdc++-v3/testsuite/20_util/assume_aligned/3.cc
|
||||||
|
+++ libstdc++-v3/testsuite/20_util/assume_aligned/3.cc
|
||||||
|
@@ -15,7 +15,7 @@
|
||||||
|
// with this library; see the file COPYING3. If not see
|
||||||
|
// <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
-// { dg-options "-std=gnu++2a -O2" }
|
||||||
|
+// { dg-options "-std=gnu++2a -O2 -g0" }
|
||||||
|
// { dg-do compile { target c++2a } }
|
||||||
|
// { dg-final { scan-assembler-not "undefined" } }
|
||||||
|
|
22
SOURCES/gcc10-pr96385.patch
Normal file
22
SOURCES/gcc10-pr96385.patch
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
2020-08-03 Richard Biener <rguenther@suse.de>
|
||||||
|
|
||||||
|
PR lto/96385
|
||||||
|
libiberty/
|
||||||
|
* simple-object-elf.c
|
||||||
|
(simple_object_elf_copy_lto_debug_sections): Localize global
|
||||||
|
UNDEFs and reuse the prevailing name.
|
||||||
|
|
||||||
|
--- libiberty/simple-object-elf.c
|
||||||
|
+++ libiberty/simple-object-elf.c
|
||||||
|
@@ -1467,6 +1467,11 @@ simple_object_elf_copy_lto_debug_sections (simple_object_read *sobj,
|
||||||
|
&& st_shndx < shnum
|
||||||
|
&& pfnret[st_shndx - 1] == -1)
|
||||||
|
discard = 1;
|
||||||
|
+ /* We also need to remove global UNDEFs which can
|
||||||
|
+ cause link fails later. */
|
||||||
|
+ else if (st_shndx == SHN_UNDEF
|
||||||
|
+ && ELF_ST_BIND (*st_info) == STB_GLOBAL)
|
||||||
|
+ discard = 1;
|
||||||
|
|
||||||
|
if (discard)
|
||||||
|
{
|
31
SOURCES/gcc10-rh1574936.patch
Normal file
31
SOURCES/gcc10-rh1574936.patch
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
crt files and statically linked libgcc objects cause false positives
|
||||||
|
in annobin coverage, so we add the assembler flag to generate notes
|
||||||
|
for them.
|
||||||
|
|
||||||
|
The patch also adds notes to libgcc_s.so, but this is harmless because
|
||||||
|
these notes only confer that there is no other annobin markup.
|
||||||
|
|
||||||
|
2018-07-25 Florian Weimer <fweimer@redhat.com>
|
||||||
|
|
||||||
|
* Makefile.in (LIBGCC2_CFLAGS, CRTSTUFF_CFLAGS): Add
|
||||||
|
-Wa,--generate-missing-build-notes=yes.
|
||||||
|
|
||||||
|
--- libgcc/Makefile.in 2018-01-13 13:05:41.000000000 +0100
|
||||||
|
+++ libgcc/Makefile.in 2018-07-25 13:15:02.036226940 +0200
|
||||||
|
@@ -247,6 +247,7 @@
|
||||||
|
LIBGCC2_CFLAGS = -O2 $(LIBGCC2_INCLUDES) $(GCC_CFLAGS) $(HOST_LIBGCC2_CFLAGS) \
|
||||||
|
$(LIBGCC2_DEBUG_CFLAGS) -DIN_LIBGCC2 \
|
||||||
|
-fbuilding-libgcc -fno-stack-protector \
|
||||||
|
+ -Wa,--generate-missing-build-notes=yes \
|
||||||
|
$(INHIBIT_LIBC_CFLAGS)
|
||||||
|
|
||||||
|
# Additional options to use when compiling libgcc2.a.
|
||||||
|
@@ -302,6 +303,7 @@
|
||||||
|
$(NO_PIE_CFLAGS) -finhibit-size-directive -fno-inline -fno-exceptions \
|
||||||
|
-fno-zero-initialized-in-bss -fno-toplevel-reorder -fno-tree-vectorize \
|
||||||
|
-fbuilding-libgcc -fno-stack-protector $(FORCE_EXPLICIT_EH_REGISTRY) \
|
||||||
|
+ -Wa,--generate-missing-build-notes=yes \
|
||||||
|
$(INHIBIT_LIBC_CFLAGS) $(USE_TM_CLONE_REGISTRY)
|
||||||
|
|
||||||
|
# Extra flags to use when compiling crt{begin,end}.o.
|
||||||
|
|
40
SOURCES/gcc10-sparc-config-detection.patch
Normal file
40
SOURCES/gcc10-sparc-config-detection.patch
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
--- gcc/config.gcc.jj 2008-04-24 15:42:46.000000000 -0500
|
||||||
|
+++ gcc/config.gcc 2008-04-24 15:44:51.000000000 -0500
|
||||||
|
@@ -2790,7 +2790,7 @@ sparc-*-rtems*)
|
||||||
|
tm_file="${tm_file} dbxelf.h elfos.h sparc/sysv4.h sparc/sp-elf.h sparc/rtemself.h rtems.h newlib-stdint.h"
|
||||||
|
tmake_file="${tmake_file} sparc/t-sparc sparc/t-rtems"
|
||||||
|
;;
|
||||||
|
-sparc-*-linux*)
|
||||||
|
+sparc-*-linux* | sparcv9-*-linux*)
|
||||||
|
tm_file="${tm_file} dbxelf.h elfos.h sparc/sysv4.h gnu-user.h linux.h glibc-stdint.h sparc/tso.h"
|
||||||
|
extra_options="${extra_options} sparc/long-double-switch.opt"
|
||||||
|
case ${target} in
|
||||||
|
@@ -2844,7 +2844,7 @@ sparc64-*-rtems*)
|
||||||
|
extra_options="${extra_options}"
|
||||||
|
tmake_file="${tmake_file} sparc/t-sparc sparc/t-rtems-64"
|
||||||
|
;;
|
||||||
|
-sparc64-*-linux*)
|
||||||
|
+sparc64*-*-linux*)
|
||||||
|
tm_file="sparc/biarch64.h ${tm_file} dbxelf.h elfos.h sparc/sysv4.h gnu-user.h linux.h glibc-stdint.h sparc/default64.h sparc/linux64.h sparc/tso.h"
|
||||||
|
extra_options="${extra_options} sparc/long-double-switch.opt"
|
||||||
|
tmake_file="${tmake_file} sparc/t-sparc sparc/t-linux64"
|
||||||
|
--- libgcc/config.host.jj 2008-04-24 15:46:19.000000000 -0500
|
||||||
|
+++ libgcc/config.host 2008-04-24 15:46:49.000000000 -0500
|
||||||
|
@@ -1002,7 +1002,7 @@ sparc-*-elf*)
|
||||||
|
tmake_file="${tmake_file} t-fdpbit t-crtfm"
|
||||||
|
extra_parts="$extra_parts crti.o crtn.o crtfastmath.o"
|
||||||
|
;;
|
||||||
|
-sparc-*-linux*) # SPARC's running GNU/Linux, libc6
|
||||||
|
+sparc-*-linux* | sparcv9-*-linux*) # SPARC's running GNU/Linux, libc6
|
||||||
|
tmake_file="${tmake_file} t-crtfm"
|
||||||
|
if test "${host_address}" = 64; then
|
||||||
|
tmake_file="$tmake_file sparc/t-linux64"
|
||||||
|
@@ -1050,7 +1050,7 @@ sparc64-*-freebsd*|ultrasparc-*-freebsd*
|
||||||
|
tmake_file="$tmake_file t-crtfm"
|
||||||
|
extra_parts="$extra_parts crtfastmath.o"
|
||||||
|
;;
|
||||||
|
-sparc64-*-linux*) # 64-bit SPARC's running GNU/Linux
|
||||||
|
+sparc64*-*-linux*) # 64-bit SPARC's running GNU/Linux
|
||||||
|
extra_parts="$extra_parts crtfastmath.o"
|
||||||
|
tmake_file="${tmake_file} t-crtfm sparc/t-linux"
|
||||||
|
if test "${host_address}" = 64; then
|
2650
SPECS/gcc.spec
Normal file
2650
SPECS/gcc.spec
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user