import gcc-toolset-9-gcc-9.1.1-2.4.el8
This commit is contained in:
commit
930e8fdfce
4
.gcc-toolset-9-gcc.metadata
Normal file
4
.gcc-toolset-9-gcc.metadata
Normal file
@ -0,0 +1,4 @@
|
||||
7f4348418dc3efefd357b32a2b5c8010211ab284 SOURCES/doxygen-1.8.0.src.tar.gz
|
||||
186c672996b17fd7ea17a188a2ed927d9e52a835 SOURCES/gcc-9.1.1-20190605.tar.xz
|
||||
c5a2b201bf05229647e73203c0bf2d9679d4d21f SOURCES/isl-0.16.1.tar.bz2
|
||||
5ef03ca7aee134fe7dfecb6c9d048799f0810278 SOURCES/mpc-0.8.1.tar.gz
|
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
SOURCES/doxygen-1.8.0.src.tar.gz
|
||||
SOURCES/gcc-9.1.1-20190605.tar.xz
|
||||
SOURCES/isl-0.16.1.tar.bz2
|
||||
SOURCES/mpc-0.8.1.tar.gz
|
@ -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
|
||||
|
95
SOURCES/doxygen-1.7.1-config.patch
Normal file
95
SOURCES/doxygen-1.7.1-config.patch
Normal file
@ -0,0 +1,95 @@
|
||||
diff -up doxygen-1.7.1/addon/doxywizard/Makefile.in.config doxygen-1.7.1/addon/doxywizard/Makefile.in
|
||||
--- doxygen-1.7.1/addon/doxywizard/Makefile.in.config 2010-05-23 16:51:31.000000000 +0200
|
||||
+++ doxygen-1.7.1/addon/doxywizard/Makefile.in 2010-07-19 13:38:33.000000000 +0200
|
||||
@@ -10,8 +10,6 @@
|
||||
# See the GNU General Public License for more details.
|
||||
#
|
||||
|
||||
-QMAKE=qmake $(MKSPECS)
|
||||
-
|
||||
all: Makefile.doxywizard
|
||||
$(MAKE) -f Makefile.doxywizard
|
||||
|
||||
@@ -29,11 +27,11 @@ distclean: Makefile.doxywizard
|
||||
$(RM) Makefile.doxywizard
|
||||
|
||||
install:
|
||||
- $(INSTTOOL) -d $(INSTALL)/bin
|
||||
- $(INSTTOOL) -m 755 ../../bin/doxywizard $(INSTALL)/bin
|
||||
- $(INSTTOOL) -d $(INSTALL)/$(MAN1DIR)
|
||||
+ $(INSTTOOL) -d $(DESTDIR)$(INSTALL)/bin
|
||||
+ $(INSTTOOL) -m 755 ../../bin/doxywizard $(DESTDIR)$(INSTALL)/bin
|
||||
+ $(INSTTOOL) -d $(DESTDIR)$(INSTALL)/$(MAN1DIR)
|
||||
cat ../../doc/doxywizard.1 | sed -e "s/DATE/$(DATE)/g" -e "s/VERSION/$(VERSION)/g" > doxywizard.1
|
||||
- $(INSTTOOL) -m 644 doxywizard.1 $(INSTALL)/$(MAN1DIR)/doxywizard.1
|
||||
+ $(INSTTOOL) -m 644 doxywizard.1 $(DESTDIR)$(INSTALL)/$(MAN1DIR)/doxywizard.1
|
||||
rm doxywizard.1
|
||||
|
||||
FORCE:
|
||||
diff -up doxygen-1.7.1/configure.config doxygen-1.7.1/configure
|
||||
--- doxygen-1.7.1/configure.config 2010-06-25 11:46:38.000000000 +0200
|
||||
+++ doxygen-1.7.1/configure 2010-07-19 12:03:53.000000000 +0200
|
||||
@@ -268,9 +268,10 @@ if test "$f_wizard" = YES; then
|
||||
if test -z "$QTDIR"; then
|
||||
echo " QTDIR environment variable not set!"
|
||||
echo -n " Checking for Qt..."
|
||||
- for d in /usr/{lib,share,qt}/{qt-4,qt4,qt,qt*,4} /usr; do
|
||||
+ for d in /usr/{lib64,lib,share,qt}/{qt-4,qt4,qt,qt*,4} /usr; do
|
||||
if test -x "$d/bin/qmake"; then
|
||||
QTDIR=$d
|
||||
+ QMAKE=$d/bin/qmake
|
||||
fi
|
||||
done
|
||||
else
|
||||
@@ -485,6 +486,8 @@ INSTTOOL = $f_insttool
|
||||
DOXYDOCS = ..
|
||||
DOCDIR = $f_docdir
|
||||
QTDIR = $QTDIR
|
||||
+QMAKE = $QMAKE
|
||||
+MAN1DIR = share/man/man1
|
||||
EOF
|
||||
|
||||
if test "$f_dot" != NO; then
|
||||
diff -up doxygen-1.7.1/Makefile.in.config doxygen-1.7.1/Makefile.in
|
||||
--- doxygen-1.7.1/Makefile.in.config 2009-08-20 21:41:13.000000000 +0200
|
||||
+++ doxygen-1.7.1/Makefile.in 2010-07-19 12:03:53.000000000 +0200
|
||||
@@ -44,8 +44,6 @@ distclean: clean
|
||||
|
||||
DATE=$(shell date "+%B %Y")
|
||||
|
||||
-MAN1DIR = man/man1
|
||||
-
|
||||
install: doxywizard_install
|
||||
$(INSTTOOL) -d $(DESTDIR)/$(INSTALL)/bin
|
||||
$(INSTTOOL) -m 755 bin/doxygen $(DESTDIR)/$(INSTALL)/bin
|
||||
diff -up doxygen-1.7.1/tmake/lib/linux-g++/tmake.conf.config doxygen-1.7.1/tmake/lib/linux-g++/tmake.conf
|
||||
--- doxygen-1.7.1/tmake/lib/linux-g++/tmake.conf.config 2008-12-06 14:16:20.000000000 +0100
|
||||
+++ doxygen-1.7.1/tmake/lib/linux-g++/tmake.conf 2010-07-19 12:03:53.000000000 +0200
|
||||
@@ -11,7 +11,7 @@ TMAKE_CC = gcc
|
||||
TMAKE_CFLAGS = -pipe
|
||||
TMAKE_CFLAGS_WARN_ON = -Wall -W -fno-exceptions
|
||||
TMAKE_CFLAGS_WARN_OFF =
|
||||
-TMAKE_CFLAGS_RELEASE = -O2
|
||||
+TMAKE_CFLAGS_RELEASE = $(RPM_OPT_FLAGS)
|
||||
TMAKE_CFLAGS_DEBUG = -g
|
||||
TMAKE_CFLAGS_SHLIB = -fPIC
|
||||
TMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
|
||||
@@ -27,12 +27,12 @@ TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YAC
|
||||
|
||||
TMAKE_INCDIR =
|
||||
TMAKE_LIBDIR =
|
||||
-TMAKE_INCDIR_X11 = /usr/X11R6/include
|
||||
-TMAKE_LIBDIR_X11 = /usr/X11R6/lib
|
||||
-TMAKE_INCDIR_QT = $(QTDIR)/include
|
||||
-TMAKE_LIBDIR_QT = $(QTDIR)/lib
|
||||
-TMAKE_INCDIR_OPENGL = /usr/X11R6/include
|
||||
-TMAKE_LIBDIR_OPENGL = /usr/X11R6/lib
|
||||
+TMAKE_INCDIR_X11 =
|
||||
+TMAKE_LIBDIR_X11 =
|
||||
+TMAKE_INCDIR_QT =
|
||||
+TMAKE_LIBDIR_QT =
|
||||
+TMAKE_INCDIR_OPENGL =
|
||||
+TMAKE_LIBDIR_OPENGL =
|
||||
|
||||
TMAKE_LINK = g++
|
||||
TMAKE_LINK_SHLIB = g++
|
63
SOURCES/doxygen-1.7.5-timestamp.patch
Normal file
63
SOURCES/doxygen-1.7.5-timestamp.patch
Normal file
@ -0,0 +1,63 @@
|
||||
diff -up doxygen-1.7.5/src/configoptions.cpp.timestamp doxygen-1.7.5/src/configoptions.cpp
|
||||
--- doxygen-1.7.5/src/configoptions.cpp.timestamp 2011-08-03 15:54:50.000000000 +0200
|
||||
+++ doxygen-1.7.5/src/configoptions.cpp 2011-08-23 12:55:56.000000000 +0200
|
||||
@@ -1173,6 +1173,14 @@ void addConfigOptions(Config *cfg)
|
||||
cs->setWidgetType(ConfigString::File);
|
||||
cs->addDependency("GENERATE_HTML");
|
||||
//----
|
||||
+ cb = cfg->addBool(
|
||||
+ "HTML_TIMESTAMP",
|
||||
+ "If the HTML_TIMESTAMP tag is set to YES then the generated HTML\n"
|
||||
+ "documentation will contain the timesstamp.",
|
||||
+ FALSE
|
||||
+ );
|
||||
+ cb->addDependency("GENERATE_HTML");
|
||||
+ //----
|
||||
cs = cfg->addString(
|
||||
"HTML_STYLESHEET",
|
||||
"The HTML_STYLESHEET tag can be used to specify a user-defined cascading\n"
|
||||
diff -up doxygen-1.7.5/src/config.xml.timestamp doxygen-1.7.5/src/config.xml
|
||||
--- doxygen-1.7.5/src/config.xml.timestamp 2011-08-03 15:54:48.000000000 +0200
|
||||
+++ doxygen-1.7.5/src/config.xml 2011-08-23 12:55:56.000000000 +0200
|
||||
@@ -819,6 +819,11 @@ The HTML_FOOTER tag can be used to speci
|
||||
each generated HTML page. If it is left blank doxygen will generate a
|
||||
standard footer.
|
||||
' defval='' depends='GENERATE_HTML'/>
|
||||
+ <option type='bool' id='HTML_TIMESTAMP' docs='
|
||||
+If the HTML_TIMESTAMP tag is set to YES then the generated HTML
|
||||
+documentation will contain the timesstamp.
|
||||
+' defval='' depends='GENERATE_HTML'/>
|
||||
+
|
||||
<option type='string' id='HTML_STYLESHEET' format='file' docs='
|
||||
The HTML_STYLESHEET tag can be used to specify a user-defined cascading
|
||||
style sheet that is used by each HTML page. It can be used to
|
||||
diff -up doxygen-1.7.5/src/htmlgen.cpp.timestamp doxygen-1.7.5/src/htmlgen.cpp
|
||||
--- doxygen-1.7.5/src/htmlgen.cpp.timestamp 2011-08-01 22:10:17.000000000 +0200
|
||||
+++ doxygen-1.7.5/src/htmlgen.cpp 2011-08-23 13:01:16.000000000 +0200
|
||||
@@ -88,7 +88,7 @@ static const char svgpan_script[]=
|
||||
|
||||
static QCString g_header;
|
||||
static QCString g_footer;
|
||||
-
|
||||
+static bool timestamp=false;
|
||||
//------------------------- Pictures for the Tabs ------------------------
|
||||
|
||||
// active
|
||||
@@ -1072,6 +1072,8 @@ void HtmlGenerator::init()
|
||||
{
|
||||
g_footer = defaultHtmlFooter;
|
||||
}
|
||||
+ if (Config_getBool("HTML_TIMESTAMP"))
|
||||
+ timestamp=true;
|
||||
createSubDirs(d);
|
||||
|
||||
QCString fileName=dname+"/tabs.css";
|
||||
@@ -1285,7 +1287,7 @@ QCString HtmlGenerator::writeLogoAsStrin
|
||||
if (timeStamp)
|
||||
{
|
||||
result += theTranslator->trGeneratedAt(
|
||||
- dateToString(TRUE),
|
||||
+ dateToString(timestamp),
|
||||
Config_getString("PROJECT_NAME")
|
||||
);
|
||||
}
|
15
SOURCES/doxygen-1.8.0-rh856725.patch
Normal file
15
SOURCES/doxygen-1.8.0-rh856725.patch
Normal file
@ -0,0 +1,15 @@
|
||||
--- doxygen-1.8.0/src/configgen.py 2012-01-29 10:12:54.000000000 -0500
|
||||
+++ doxygen-1.8.0/src/configgen.py 2012-08-07 17:38:54.751696536 -0400
|
||||
@@ -34,8 +34,10 @@
|
||||
if type=='bool':
|
||||
if len(adefval)>0:
|
||||
enabled = adefval
|
||||
- else:
|
||||
- enabled = "TRUE" if defval=='1' else "FALSE"
|
||||
+ elif defval=='1':
|
||||
+ enabled = "TRUE"
|
||||
+ else:
|
||||
+ enabled = "FALSE"
|
||||
print " cb = cfg->addBool("
|
||||
print " \"%s\"," % (name)
|
||||
print " \"%s\"," % (docC)
|
27
SOURCES/gcc9-Wno-format-security.patch
Normal file
27
SOURCES/gcc9-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
|
||||
@@ -481,7 +481,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 $wf_opt])), [loose_warn])
|
||||
--- 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
|
49
SOURCES/gcc9-alt-compat-test.patch
Normal file
49
SOURCES/gcc9-alt-compat-test.patch
Normal file
@ -0,0 +1,49 @@
|
||||
--- gcc/testsuite/g++.dg/compat/struct-layout-1_generate.c.jj 2011-01-03 06:50:42.000000000 -0500
|
||||
+++ gcc/testsuite/g++.dg/compat/struct-layout-1_generate.c 2011-02-18 06:28:53.858200077 -0500
|
||||
@@ -1501,6 +1501,8 @@ generate_random_tests (enum FEATURE feat
|
||||
int i, r;
|
||||
if (len > 'z' - 'a' + 1)
|
||||
abort ();
|
||||
+ if (getenv ("ALT_CXX_UNDER_TEST") != NULL)
|
||||
+ features &= ~FEATURE_VECTOR;
|
||||
memset (e, 0, sizeof (e));
|
||||
r = generate_random ();
|
||||
if ((r & 7) == 0)
|
||||
--- gcc/testsuite/g++.dg/compat/compat.exp.jj 2011-01-03 06:50:42.000000000 -0500
|
||||
+++ gcc/testsuite/g++.dg/compat/compat.exp 2011-02-18 06:30:54.248200398 -0500
|
||||
@@ -116,7 +116,12 @@ if [info exists ALT_CXX_UNDER_TEST] then
|
||||
}
|
||||
|
||||
# Main loop.
|
||||
-foreach src [lsort [find $srcdir/$subdir *_main.C]] {
|
||||
+set tests [lsort [find $srcdir/$subdir *_main.C]]
|
||||
+if { $use_alt != 0 } then {
|
||||
+ set tests [prune $tests $srcdir/$subdir/decimal/*]
|
||||
+}
|
||||
+
|
||||
+foreach src $tests {
|
||||
# If we're only testing specific files and this isn't one of them, skip it.
|
||||
if ![runtest_file_p $runtests $src] then {
|
||||
continue
|
||||
--- gcc/testsuite/gcc.dg/compat/struct-layout-1_generate.c.jj 2011-01-03 06:49:58.000000000 -0500
|
||||
+++ gcc/testsuite/gcc.dg/compat/struct-layout-1_generate.c 2011-02-18 06:27:54.922262671 -0500
|
||||
@@ -1912,6 +1912,8 @@ generate_random_tests (enum FEATURE feat
|
||||
int i, r;
|
||||
if (len > 'z' - 'a' + 1)
|
||||
abort ();
|
||||
+ if (getenv ("ALT_CC_UNDER_TEST") != NULL)
|
||||
+ features &= ~FEATURE_VECTOR;
|
||||
memset (e, 0, sizeof (e));
|
||||
r = generate_random ();
|
||||
if ((r & 7) == 0)
|
||||
--- gcc/testsuite/lib/c-compat.exp.jj 2011-01-03 06:48:38.000000000 -0500
|
||||
+++ gcc/testsuite/lib/c-compat.exp 2011-02-18 06:38:19.124265008 -0500
|
||||
@@ -75,7 +75,7 @@ proc compat_setup_dfp { } {
|
||||
# If there is an alternate compiler, does it support decimal float types?
|
||||
if { $compat_have_dfp == 1 && $compat_use_alt == 1 && $compat_same_alt == 0 } {
|
||||
compat-use-alt-compiler
|
||||
- set compat_have_dfp [check_effective_target_dfprt_nocache]
|
||||
+ set compat_have_dfp 0
|
||||
compat-use-tst-compiler
|
||||
verbose "compat_have_dfp for alt compiler: $compat_have_dfp" 2
|
||||
}
|
20
SOURCES/gcc9-d-shared-libphobos.patch
Normal file
20
SOURCES/gcc9-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
|
||||
@@ -405,9 +405,9 @@ lang_specific_driver (cl_decoded_option
|
||||
/* Add `-lgphobos' if we haven't already done so. */
|
||||
if (phobos_library != PHOBOS_NOLINK && need_phobos)
|
||||
{
|
||||
- /* 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_DYNAMIC && static_link)
|
122
SOURCES/gcc9-foffload-default.patch
Normal file
122
SOURCES/gcc9-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. */
|
||||
@@ -820,6 +821,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%>)\n",
|
||||
@@ -883,6 +890,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;
|
||||
@@ -895,18 +903,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\n", 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/gcc9-hack.patch
Normal file
126
SOURCES/gcc9-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/gcc9-i386-libgomp.patch
Normal file
11
SOURCES/gcc9-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/gcc9-isl-dl.patch
Normal file
715
SOURCES/gcc9-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
|
||||
@@ -1046,7 +1046,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)
|
||||
# Any system libraries needed just for GNAT.
|
||||
SYSLIBS = @GNAT_LIBEXC@
|
||||
@@ -2196,6 +2196,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/gcc9-isl-dl2.patch
Normal file
71
SOURCES/gcc9-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;
|
584
SOURCES/gcc9-libgfortran-compat.patch
Normal file
584
SOURCES/gcc9-libgfortran-compat.patch
Normal file
@ -0,0 +1,584 @@
|
||||
--- libgfortran/Makefile.am.jj 2019-05-02 15:02:58.276261865 +0200
|
||||
+++ libgfortran/Makefile.am 2019-05-17 12:38:34.269861044 +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` \
|
||||
@@ -1036,6 +1037,85 @@ 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_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_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_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
|
||||
+
|
||||
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/libgfortran.h.jj 2019-04-25 20:03:12.299973131 +0200
|
||||
+++ libgfortran/libgfortran.h 2019-05-17 11:11:16.944997078 +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))
|
||||
|
||||
@@ -1769,4 +1773,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/ieee/nonshared-ieee_arithmetic.c.jj 2019-05-17 11:53:19.151524852 +0200
|
||||
+++ libgfortran/ieee/nonshared-ieee_arithmetic.c 2019-05-17 12:05:44.160272463 +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/io/nonshared-transfer.c.jj 2019-05-17 12:18:32.538630920 +0200
|
||||
+++ libgfortran/io/nonshared-transfer.c 2019-05-17 12:18:59.216191976 +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;
|
||||
+}
|
||||
--- libgfortran/Makefile.in.jj 2019-05-02 15:02:58.304261418 +0200
|
||||
+++ libgfortran/Makefile.in 2019-05-17 12:38:53.273548433 +0200
|
||||
@@ -216,7 +216,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)
|
||||
@@ -463,6 +464,33 @@ 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_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_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
|
||||
+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
|
||||
+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
|
||||
@@ -479,10 +507,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) \
|
||||
@@ -526,7 +550,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;; \
|
||||
@@ -722,6 +747,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` \
|
||||
@@ -1547,6 +1573,53 @@ 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_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_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_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
|
||||
+
|
||||
I_M4_DEPS = m4/iparm.m4
|
||||
I_M4_DEPS0 = $(I_M4_DEPS) m4/iforeach.m4
|
||||
I_M4_DEPS1 = $(I_M4_DEPS) m4/ifunction.m4
|
||||
@@ -1657,6 +1730,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=; \
|
||||
@@ -1698,6 +1782,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)
|
||||
|
||||
@@ -2110,6 +2197,38 @@ 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-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_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_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)/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@
|
||||
@@ -6628,6 +6747,20 @@ 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
|
||||
+
|
||||
.f90.o:
|
||||
$(AM_V_FC)$(FCCOMPILE) -c -o $@ $<
|
||||
|
||||
@@ -6822,7 +6955,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)
|
||||
@@ -6902,14 +7036,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 \
|
||||
@@ -6967,6 +7102,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 $@
|
||||
|
17
SOURCES/gcc9-libgomp-omp_h-multilib.patch
Normal file
17
SOURCES/gcc9-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
|
||||
|
12093
SOURCES/gcc9-libstdc++-compat.patch
Normal file
12093
SOURCES/gcc9-libstdc++-compat.patch
Normal file
File diff suppressed because it is too large
Load Diff
24
SOURCES/gcc9-libstdc++-docs.patch
Normal file
24
SOURCES/gcc9-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 9.1.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 9.1.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/gcc9-libtool-no-rpath.patch
Normal file
27
SOURCES/gcc9-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/gcc9-no-add-needed.patch
Normal file
37
SOURCES/gcc9-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 \
|
55
SOURCES/gcc9-pr90756.patch
Normal file
55
SOURCES/gcc9-pr90756.patch
Normal file
@ -0,0 +1,55 @@
|
||||
2019-07-04 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR rtl-optimization/90756
|
||||
* explow.c (promote_ssa_mode): Always use TYPE_MODE, don't bypass it
|
||||
for VECTOR_TYPE_P.
|
||||
|
||||
--- gcc/explow.c
|
||||
+++ gcc/explow.c
|
||||
@@ -892,16 +892,7 @@ promote_ssa_mode (const_tree name, int *punsignedp)
|
||||
|
||||
tree type = TREE_TYPE (name);
|
||||
int unsignedp = TYPE_UNSIGNED (type);
|
||||
- machine_mode mode = TYPE_MODE (type);
|
||||
-
|
||||
- /* Bypass TYPE_MODE when it maps vector modes to BLKmode. */
|
||||
- if (mode == BLKmode)
|
||||
- {
|
||||
- gcc_assert (VECTOR_TYPE_P (type));
|
||||
- mode = type->type_common.mode;
|
||||
- }
|
||||
-
|
||||
- machine_mode pmode = promote_mode (type, mode, &unsignedp);
|
||||
+ machine_mode pmode = promote_mode (type, TYPE_MODE (type), &unsignedp);
|
||||
if (punsignedp)
|
||||
*punsignedp = unsignedp;
|
||||
|
||||
--- /dev/null
|
||||
+++ gcc/testsuite/gcc.dg/pr90756.c
|
||||
@@ -0,0 +1,26 @@
|
||||
+/* PR rtl-optimization/90756 */
|
||||
+/* { dg-do compile } */
|
||||
+/* { dg-options "-O2 -Wno-psabi" } */
|
||||
+/* { dg-additional-options "-mno-sse" { target ia32 } } */
|
||||
+
|
||||
+typedef float B __attribute__((vector_size(4 * sizeof (float))));
|
||||
+typedef unsigned long long C __attribute__((vector_size(4 * sizeof (long long))));
|
||||
+typedef short D __attribute__((vector_size(4 * sizeof (short))));
|
||||
+B z;
|
||||
+void foo (C);
|
||||
+C bar (D);
|
||||
+B baz ();
|
||||
+D qux (B);
|
||||
+
|
||||
+void
|
||||
+quux (int x)
|
||||
+{
|
||||
+ B n = z, b = z;
|
||||
+ while (1)
|
||||
+ switch (x)
|
||||
+ {
|
||||
+ case 0: n = baz (); /* FALLTHRU */
|
||||
+ case 1: { B o = n; n = b; b = o; } /* FALLTHRU */
|
||||
+ case 2: { D u = qux (b); C v = bar (u); foo (v); }
|
||||
+ }
|
||||
+}
|
31
SOURCES/gcc9-rh1574936.patch
Normal file
31
SOURCES/gcc9-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
|
||||
@@ -244,6 +244,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.
|
||||
@@ -297,6 +298,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)
|
||||
|
||||
# Extra flags to use when compiling crt{begin,end}.o.
|
||||
|
40
SOURCES/gcc9-sparc-config-detection.patch
Normal file
40
SOURCES/gcc9-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
|
2514
SPECS/gcc.spec
Normal file
2514
SPECS/gcc.spec
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user