Import rpm: c8s
This commit is contained in:
commit
0546a2b6f2
12
.gitignore
vendored
Normal file
12
.gitignore
vendored
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
SOURCES/doxygen-1.8.0.src.tar.gz
|
||||||
|
SOURCES/gcc-9.2.1-20191120.tar.xz
|
||||||
|
SOURCES/isl-0.16.1.tar.bz2
|
||||||
|
SOURCES/mpc-0.8.1.tar.gz
|
||||||
|
SOURCES/nvptx-newlib-aadc8eb0ec43b7cd0dd2dfb484bae63c8b05ef24.tar.xz
|
||||||
|
SOURCES/nvptx-tools-c28050f60193b3b95a18866a96f03334e874e78f.tar.xz
|
||||||
|
/doxygen-1.8.0.src.tar.gz
|
||||||
|
/gcc-9.2.1-20191120.tar.xz
|
||||||
|
/isl-0.16.1.tar.bz2
|
||||||
|
/mpc-0.8.1.tar.gz
|
||||||
|
/nvptx-newlib-aadc8eb0ec43b7cd0dd2dfb484bae63c8b05ef24.tar.xz
|
||||||
|
/nvptx-tools-c28050f60193b3b95a18866a96f03334e874e78f.tar.xz
|
873
0001-Default-widths-for-i-f-and-g-format-specifiers-in-fo.patch
Normal file
873
0001-Default-widths-for-i-f-and-g-format-specifiers-in-fo.patch
Normal file
@ -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
0002-Allow-duplicate-declarations.patch
Normal file
219
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
|
||||||
|
|
298
0003-Convert-LOGICAL-to-INTEGER-for-arithmetic-ops-and-vi.patch
Normal file
298
0003-Convert-LOGICAL-to-INTEGER-for-arithmetic-ops-and-vi.patch
Normal file
@ -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
|
||||||
|
|
860
0004-Allow-CHARACTER-literals-in-assignments-and-data-sta.patch
Normal file
860
0004-Allow-CHARACTER-literals-in-assignments-and-data-sta.patch
Normal file
@ -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
0005-dec-comparisons.patch
Normal file
658
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
0006-Allow-blank-format-items-in-format-strings.patch
Normal file
150
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
0008-Allow-non-integer-substring-indexes.patch
Normal file
158
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
0009-Allow-old-style-initializers-in-derived-types.patch
Normal file
185
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
|
||||||
|
|
587
0010-Allow-string-length-and-kind-to-be-specified-on-a-pe.patch
Normal file
587
0010-Allow-string-length-and-kind-to-be-specified-on-a-pe.patch
Normal file
@ -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
|
||||||
|
|
378
0011-Allow-non-logical-expressions-in-IF-statements.patch
Normal file
378
0011-Allow-non-logical-expressions-in-IF-statements.patch
Normal file
@ -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
0012-Support-type-promotion-in-calls-to-intrinsics.patch
Normal file
2151
0012-Support-type-promotion-in-calls-to-intrinsics.patch
Normal file
File diff suppressed because it is too large
Load Diff
262
0013-Add-the-SEQUENCE-attribute-by-default-if-it-s-not-pr.patch
Normal file
262
0013-Add-the-SEQUENCE-attribute-by-default-if-it-s-not-pr.patch
Normal file
@ -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
|
||||||
|
|
181
0014-Fill-in-missing-array-dimensions-using-the-lower-bou.patch
Normal file
181
0014-Fill-in-missing-array-dimensions-using-the-lower-bou.patch
Normal file
@ -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
0015-Allow-automatics-in-equivalence.patch
Normal file
358
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
|
||||||
|
|
49
0016-Suppress-warning-with-Wno-overwrite-recursive.patch
Normal file
49
0016-Suppress-warning-with-Wno-overwrite-recursive.patch
Normal file
@ -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
doxygen-1.7.1-config.patch
Normal file
95
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
doxygen-1.7.5-timestamp.patch
Normal file
63
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
doxygen-1.8.0-rh856725.patch
Normal file
15
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
gcc9-Wno-format-security.patch
Normal file
27
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
|
159
gcc9-add-sve-tests.patch
Normal file
159
gcc9-add-sve-tests.patch
Normal file
@ -0,0 +1,159 @@
|
|||||||
|
These tests are missing from the r273140 commit in gcc-9-branch.
|
||||||
|
|
||||||
|
--- /dev/null
|
||||||
|
+++ gcc/testsuite/gcc.target/aarch64/pcs_attribute-2.c
|
||||||
|
@@ -0,0 +1,93 @@
|
||||||
|
+/* { dg-do compile } */
|
||||||
|
+/* { dg-require-effective-target aarch64_variant_pcs } */
|
||||||
|
+
|
||||||
|
+/* Test that .variant_pcs is emitted for vector PCS symbol references. */
|
||||||
|
+
|
||||||
|
+#define ATTR __attribute__ ((aarch64_vector_pcs))
|
||||||
|
+
|
||||||
|
+void f_undef_basepcs (void);
|
||||||
|
+
|
||||||
|
+void f_def_basepcs (void)
|
||||||
|
+{
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+ATTR void f_undef_vpcs (void);
|
||||||
|
+
|
||||||
|
+ATTR void f_def_vpcs (void)
|
||||||
|
+{
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+__attribute__ ((alias ("f_def_vpcs")))
|
||||||
|
+ATTR void f_alias_vpcs (void);
|
||||||
|
+
|
||||||
|
+__attribute__ ((weak, alias ("f_def_vpcs")))
|
||||||
|
+ATTR void f_weak_alias_vpcs (void);
|
||||||
|
+
|
||||||
|
+__attribute__ ((weak))
|
||||||
|
+ATTR void f_weak_undef_vpcs (void);
|
||||||
|
+
|
||||||
|
+__attribute__ ((visibility ("protected")))
|
||||||
|
+ATTR void f_protected_vpcs (void)
|
||||||
|
+{
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+__attribute__ ((visibility ("hidden")))
|
||||||
|
+ATTR void f_hidden_vpcs (void)
|
||||||
|
+{
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+ATTR static void f_local_vpcs (void)
|
||||||
|
+{
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+__attribute__((weakref ("f_undef_vpcs")))
|
||||||
|
+ATTR static void f_local_weakref_undef_vpcs (void);
|
||||||
|
+
|
||||||
|
+__attribute__((weakref ("f_hidden_vpcs")))
|
||||||
|
+ATTR static void f_local_weakref_def_vpcs (void);
|
||||||
|
+
|
||||||
|
+ATTR void bar_undef_vpcs (void) __asm__ ("f_undef_renamed_vpcs");
|
||||||
|
+
|
||||||
|
+ATTR void bar_def_vpcs (void) __asm__ ("f_def_renamed_vpcs");
|
||||||
|
+ATTR void bar_def_vpcs (void)
|
||||||
|
+{
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+void (*refs_basepcs[]) (void) = {
|
||||||
|
+ f_undef_basepcs,
|
||||||
|
+ f_def_basepcs,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+void (*ATTR refs_vpcs[]) (void) = {
|
||||||
|
+ f_undef_vpcs,
|
||||||
|
+ f_def_vpcs,
|
||||||
|
+ f_alias_vpcs,
|
||||||
|
+ f_weak_alias_vpcs,
|
||||||
|
+ f_weak_undef_vpcs,
|
||||||
|
+ f_protected_vpcs,
|
||||||
|
+ f_hidden_vpcs,
|
||||||
|
+ f_local_vpcs,
|
||||||
|
+ f_local_weakref_undef_vpcs,
|
||||||
|
+ f_local_weakref_def_vpcs,
|
||||||
|
+ bar_undef_vpcs,
|
||||||
|
+ bar_def_vpcs,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+/* Note: local symbols don't need .variant_pcs, but gcc generates it, so
|
||||||
|
+ we check them here. An undefined weakref does not show up in the
|
||||||
|
+ symbol table, only the target symbol, so it does not need .variant_pcs. */
|
||||||
|
+
|
||||||
|
+/* { dg-final { scan-assembler-not {\.variant_pcs\tf_undef_basepcs} } } */
|
||||||
|
+/* { dg-final { scan-assembler-not {\.variant_pcs\tf_def_basepcs} } } */
|
||||||
|
+/* { dg-final { scan-assembler-times {\.variant_pcs\tf_undef_vpcs} 1 } } */
|
||||||
|
+/* { dg-final { scan-assembler-times {\.variant_pcs\tf_def_vpcs} 1 } } */
|
||||||
|
+/* { dg-final { scan-assembler-times {\.variant_pcs\tf_alias_vpcs} 1 } } */
|
||||||
|
+/* { dg-final { scan-assembler-times {\.variant_pcs\tf_weak_alias_vpcs} 1 } } */
|
||||||
|
+/* { dg-final { scan-assembler-times {\.variant_pcs\tf_weak_undef_vpcs} 1 } } */
|
||||||
|
+/* { dg-final { scan-assembler-times {\.variant_pcs\tf_protected_vpcs} 1 } } */
|
||||||
|
+/* { dg-final { scan-assembler-times {\.variant_pcs\tf_hidden_vpcs} 1 } } */
|
||||||
|
+/* { dg-final { scan-assembler-times {\.variant_pcs\tf_local_vpcs} 1 } } */
|
||||||
|
+/* { dg-final { scan-assembler-not {\.variant_pcs\tf_local_weakref_undef_vpcs} } } */
|
||||||
|
+/* { dg-final { scan-assembler-times {\.variant_pcs\tf_local_weakref_def_vpcs} 1 } } */
|
||||||
|
+/* { dg-final { scan-assembler-times {\.variant_pcs\tf_undef_renamed_vpcs} 1 } } */
|
||||||
|
+/* { dg-final { scan-assembler-times {\.variant_pcs\tf_def_renamed_vpcs} 1 } } */
|
||||||
|
--- /dev/null
|
||||||
|
+++ gcc/testsuite/gcc.target/aarch64/pcs_attribute-3.c
|
||||||
|
@@ -0,0 +1,58 @@
|
||||||
|
+/* { dg-do compile } */
|
||||||
|
+/* { dg-require-ifunc "" } */
|
||||||
|
+/* { dg-require-effective-target aarch64_variant_pcs } */
|
||||||
|
+
|
||||||
|
+/* Test that .variant_pcs is emitted for vector PCS symbol references. */
|
||||||
|
+
|
||||||
|
+#define ATTR __attribute__ ((aarch64_vector_pcs))
|
||||||
|
+
|
||||||
|
+static void f_local_basepcs (void)
|
||||||
|
+{
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void (*f_ifunc_basepcs_resolver ()) (void)
|
||||||
|
+{
|
||||||
|
+ return (void (*)(void))f_local_basepcs;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+__attribute__ ((ifunc ("f_ifunc_basepcs_resolver")))
|
||||||
|
+void f_ifunc_basepcs (void);
|
||||||
|
+
|
||||||
|
+ATTR static void f_local_vpcs (void)
|
||||||
|
+{
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void (*f_ifunc_vpcs_resolver ()) (void)
|
||||||
|
+{
|
||||||
|
+ return (void (*)(void))f_local_vpcs;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+__attribute__ ((ifunc ("f_ifunc_vpcs_resolver")))
|
||||||
|
+ATTR void f_ifunc_vpcs (void);
|
||||||
|
+
|
||||||
|
+__attribute__ ((visibility ("hidden")))
|
||||||
|
+__attribute__ ((ifunc ("f_ifunc_vpcs_resolver")))
|
||||||
|
+ATTR void f_hidden_ifunc_vpcs (void);
|
||||||
|
+
|
||||||
|
+__attribute__ ((ifunc ("f_ifunc_vpcs_resolver")))
|
||||||
|
+ATTR static void f_local_ifunc_vpcs (void);
|
||||||
|
+
|
||||||
|
+void (*refs_basepcs[]) (void) = {
|
||||||
|
+ f_ifunc_basepcs,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+void (*ATTR refs_vpcs[]) (void) = {
|
||||||
|
+ f_ifunc_vpcs,
|
||||||
|
+ f_hidden_ifunc_vpcs,
|
||||||
|
+ f_local_ifunc_vpcs,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+/* Note: local symbols don't need .variant_pcs, but gcc generates it, so
|
||||||
|
+ we check them here. */
|
||||||
|
+
|
||||||
|
+/* { dg-final { scan-assembler-not {\.variant_pcs\tf_local_basepcs} } } */
|
||||||
|
+/* { dg-final { scan-assembler-not {\.variant_pcs\tf_ifunc_basepcs} } } */
|
||||||
|
+/* { dg-final { scan-assembler-times {\.variant_pcs\tf_local_vpcs} 1 } } */
|
||||||
|
+/* { dg-final { scan-assembler-times {\.variant_pcs\tf_ifunc_vpcs} 1 } } */
|
||||||
|
+/* { dg-final { scan-assembler-times {\.variant_pcs\tf_hidden_ifunc_vpcs} 1 } } */
|
||||||
|
+/* { dg-final { scan-assembler-times {\.variant_pcs\tf_local_ifunc_vpcs} 1 } } */
|
49
gcc9-alt-compat-test.patch
Normal file
49
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
gcc9-d-shared-libphobos.patch
Normal file
20
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)
|
481
gcc9-fixes.patch
Normal file
481
gcc9-fixes.patch
Normal file
@ -0,0 +1,481 @@
|
|||||||
|
2019-11-22 Jonathan Wakely <jwakely@redhat.com>
|
||||||
|
|
||||||
|
Backport from mainline
|
||||||
|
2019-10-29 Jonathan Wakely <jwakely@redhat.com>
|
||||||
|
|
||||||
|
PR libstdc++/92267
|
||||||
|
* include/bits/stl_deque.h (_Deque_iterator(const _Deque_iterator&)):
|
||||||
|
Do not define as defaulted.
|
||||||
|
* testsuite/23_containers/deque/types/92267.cc: New test.
|
||||||
|
|
||||||
|
2019-11-21 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
PR tree-optimization/91355
|
||||||
|
* tree-ssa-sink.c (select_best_block): Use >= rather than >
|
||||||
|
for early_bb scaled count with best_bb count comparison.
|
||||||
|
|
||||||
|
2019-11-21 Richard Biener <rguenther@suse.de>
|
||||||
|
|
||||||
|
Revert
|
||||||
|
2019-09-17 Richard Biener <rguenther@suse.de>
|
||||||
|
|
||||||
|
PR tree-optimization/91790
|
||||||
|
* tree-vect-stmts.c (vectorizable_load): For BB vectorization
|
||||||
|
use the correct DR for setting up realignment.
|
||||||
|
|
||||||
|
2019-11-20 Peter Bergner <bergner@linux.ibm.com>
|
||||||
|
|
||||||
|
Backport from mainline
|
||||||
|
2019-11-07 Peter Bergner <bergner@linux.ibm.com>
|
||||||
|
|
||||||
|
PR other/92090
|
||||||
|
* config/rs6000/predicates.md (input_operand): Allow MODE_PARTIAL_INT
|
||||||
|
modes for integer constants.
|
||||||
|
|
||||||
|
2019-11-20 Michael Matz <matz@suse.de>
|
||||||
|
|
||||||
|
Backport from mainline
|
||||||
|
PR middle-end/90796
|
||||||
|
* gimple-loop-jam.c (any_access_function_variant_p): New function.
|
||||||
|
(adjust_unroll_factor): Use it to constrain safety, new parameter.
|
||||||
|
(tree_loop_unroll_and_jam): Adjust call and profitable unroll factor.
|
||||||
|
|
||||||
|
2019-11-20 Joseph Myers <joseph@codesourcery.com>
|
||||||
|
|
||||||
|
* doc/invoke.texi (-Wc11-c2x-compat): Document.
|
||||||
|
|
||||||
|
--- libstdc++-v3/include/bits/stl_deque.h (revision 278492)
|
||||||
|
+++ libstdc++-v3/include/bits/stl_deque.h (revision 278614)
|
||||||
|
@@ -158,13 +158,16 @@
|
||||||
|
#else
|
||||||
|
// Conversion from iterator to const_iterator.
|
||||||
|
template<typename _Iter,
|
||||||
|
- typename = _Require<is_same<_Self, const_iterator>,
|
||||||
|
- is_same<_Iter, iterator>>>
|
||||||
|
+ typename = _Require<is_same<_Self, const_iterator>,
|
||||||
|
+ is_same<_Iter, iterator>>>
|
||||||
|
_Deque_iterator(const _Iter& __x) noexcept
|
||||||
|
: _M_cur(__x._M_cur), _M_first(__x._M_first),
|
||||||
|
- _M_last(__x._M_last), _M_node(__x._M_node) { }
|
||||||
|
+ _M_last(__x._M_last), _M_node(__x._M_node) { }
|
||||||
|
|
||||||
|
- _Deque_iterator(const _Deque_iterator&) = default;
|
||||||
|
+ _Deque_iterator(const _Deque_iterator& __x) noexcept
|
||||||
|
+ : _M_cur(__x._M_cur), _M_first(__x._M_first),
|
||||||
|
+ _M_last(__x._M_last), _M_node(__x._M_node) { }
|
||||||
|
+
|
||||||
|
_Deque_iterator& operator=(const _Deque_iterator&) = default;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
--- libstdc++-v3/testsuite/23_containers/deque/types/92267.cc (nonexistent)
|
||||||
|
+++ libstdc++-v3/testsuite/23_containers/deque/types/92267.cc (revision 278614)
|
||||||
|
@@ -0,0 +1,27 @@
|
||||||
|
+// Copyright (C) 2019 Free Software Foundation, Inc.
|
||||||
|
+//
|
||||||
|
+// This file is part of the GNU ISO C++ Library. This library is free
|
||||||
|
+// software; you can redistribute it and/or modify it under the
|
||||||
|
+// terms of the GNU General Public License as published by the
|
||||||
|
+// Free Software Foundation; either version 3, or (at your option)
|
||||||
|
+// any later version.
|
||||||
|
+
|
||||||
|
+// This library is distributed in the hope that it will be useful,
|
||||||
|
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
+// GNU General Public License for more details.
|
||||||
|
+
|
||||||
|
+// You should have received a copy of the GNU General Public License along
|
||||||
|
+// with this library; see the file COPYING3. If not see
|
||||||
|
+// <http://www.gnu.org/licenses/>.
|
||||||
|
+
|
||||||
|
+// { dg-do compile { target c++11 } }
|
||||||
|
+
|
||||||
|
+#include <deque>
|
||||||
|
+
|
||||||
|
+using std::deque;
|
||||||
|
+using std::is_trivially_copy_constructible;
|
||||||
|
+
|
||||||
|
+// PR libstdc++/92267
|
||||||
|
+static_assert(!is_trivially_copy_constructible<deque<int>::iterator>::value);
|
||||||
|
+static_assert(!is_trivially_copy_constructible<deque<int>::const_iterator>::value);
|
||||||
|
--- gcc/doc/invoke.texi (revision 278492)
|
||||||
|
+++ gcc/doc/invoke.texi (revision 278614)
|
||||||
|
@@ -292,6 +292,7 @@
|
||||||
|
-Wbool-compare -Wbool-operation @gol
|
||||||
|
-Wno-builtin-declaration-mismatch @gol
|
||||||
|
-Wno-builtin-macro-redefined -Wc90-c99-compat -Wc99-c11-compat @gol
|
||||||
|
+-Wc11-c2x-compat @gol
|
||||||
|
-Wc++-compat -Wc++11-compat -Wc++14-compat -Wc++17-compat @gol
|
||||||
|
-Wcast-align -Wcast-align=strict -Wcast-function-type -Wcast-qual @gol
|
||||||
|
-Wchar-subscripts -Wcatch-value -Wcatch-value=@var{n} @gol
|
||||||
|
@@ -6698,6 +6699,14 @@
|
||||||
|
and so on. This option is independent of the standards mode. Warnings are
|
||||||
|
disabled in the expression that follows @code{__extension__}.
|
||||||
|
|
||||||
|
+@item -Wc11-c2x-compat @r{(C and Objective-C only)}
|
||||||
|
+@opindex Wc11-c2x-compat
|
||||||
|
+@opindex Wno-c11-c2x-compat
|
||||||
|
+Warn about features not present in ISO C11, but present in ISO C2X.
|
||||||
|
+For instance, warn about omitting the string in @code{_Static_assert}.
|
||||||
|
+This option is independent of the standards mode. Warnings are
|
||||||
|
+disabled in the expression that follows @code{__extension__}.
|
||||||
|
+
|
||||||
|
@item -Wc++-compat @r{(C and Objective-C only)}
|
||||||
|
@opindex Wc++-compat
|
||||||
|
@opindex Wno-c++-compat
|
||||||
|
--- gcc/testsuite/gcc.target/powerpc/pr92090-2.c (nonexistent)
|
||||||
|
+++ gcc/testsuite/gcc.target/powerpc/pr92090-2.c (revision 278614)
|
||||||
|
@@ -0,0 +1,45 @@
|
||||||
|
+/* { dg-do compile } */
|
||||||
|
+/* { dg-options "-mdejagnu-cpu=power8 -Os -w" } */
|
||||||
|
+/* { dg-additional-options "-mbig" { target powerpc64le-*-* } } */
|
||||||
|
+
|
||||||
|
+/* Verify that we don't ICE. */
|
||||||
|
+
|
||||||
|
+int a;
|
||||||
|
+static _Atomic long double b, c, d, m;
|
||||||
|
+double n;
|
||||||
|
+extern int foo (void);
|
||||||
|
+extern void bar (int, int, int, int);
|
||||||
|
+
|
||||||
|
+void
|
||||||
|
+bug (void)
|
||||||
|
+{
|
||||||
|
+ b = 1.79769313486231580793728971405301199e308L;
|
||||||
|
+ for (int i = 0; i < 10000; i++)
|
||||||
|
+ if (__builtin_isinf (n))
|
||||||
|
+ b;
|
||||||
|
+ c = 1;
|
||||||
|
+ int e, f, g, h;
|
||||||
|
+ while (a)
|
||||||
|
+ ;
|
||||||
|
+ for (int i; i; i++)
|
||||||
|
+ {
|
||||||
|
+ double j = c /= foo ();
|
||||||
|
+ if (__builtin_isinf (j))
|
||||||
|
+ {
|
||||||
|
+ if (foo == 1 << 31)
|
||||||
|
+ e++;
|
||||||
|
+ f++;
|
||||||
|
+ c = 0;
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ if (foo == 1 << 30)
|
||||||
|
+ g++;
|
||||||
|
+ h++;
|
||||||
|
+ c = 1;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ bar (e, f, g, h);
|
||||||
|
+ d = 1.79769313486231580793728971405301199e308L;
|
||||||
|
+ m = 1;
|
||||||
|
+}
|
||||||
|
--- gcc/testsuite/gcc.target/powerpc/pr92090.c (nonexistent)
|
||||||
|
+++ gcc/testsuite/gcc.target/powerpc/pr92090.c (revision 278614)
|
||||||
|
@@ -0,0 +1,43 @@
|
||||||
|
+/* { dg-do compile } */
|
||||||
|
+/* { dg-options "-mdejagnu-cpu=power8 -Os" } */
|
||||||
|
+/* { dg-additional-options "-mbig" { target powerpc64le-*-* } } */
|
||||||
|
+
|
||||||
|
+/* Verify that we don't ICE. */
|
||||||
|
+
|
||||||
|
+_Atomic int a;
|
||||||
|
+_Atomic long double b, c;
|
||||||
|
+int j;
|
||||||
|
+void foo (void);
|
||||||
|
+void bar (int, int, int, int);
|
||||||
|
+
|
||||||
|
+void
|
||||||
|
+bug (void)
|
||||||
|
+{
|
||||||
|
+ b = 1;
|
||||||
|
+ int d, e, f, g;
|
||||||
|
+ while (a)
|
||||||
|
+ ;
|
||||||
|
+ for (int h = 0; h < 10000; h++)
|
||||||
|
+ {
|
||||||
|
+ double i = b /= 3;
|
||||||
|
+ foo ();
|
||||||
|
+ if (i)
|
||||||
|
+ {
|
||||||
|
+ if (i == 1)
|
||||||
|
+ d++;
|
||||||
|
+ e++;
|
||||||
|
+ b = 0;
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ if (i == 2)
|
||||||
|
+ f++;
|
||||||
|
+ g++;
|
||||||
|
+ b = 1;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ bar (d, e, f, g);
|
||||||
|
+ c = 1;
|
||||||
|
+ for (int h; h; h++)
|
||||||
|
+ j = 0;
|
||||||
|
+}
|
||||||
|
--- gcc/testsuite/gcc.dg/unroll-and-jam.c (revision 278492)
|
||||||
|
+++ gcc/testsuite/gcc.dg/unroll-and-jam.c (revision 278614)
|
||||||
|
@@ -1,5 +1,5 @@
|
||||||
|
/* { dg-do run } */
|
||||||
|
-/* { dg-options "-O3 -floop-unroll-and-jam --param unroll-jam-min-percent=0 -fdump-tree-unrolljam-details" } */
|
||||||
|
+/* { dg-options "-O3 -floop-unroll-and-jam -fno-tree-loop-im --param unroll-jam-min-percent=0 -fdump-tree-unrolljam-details" } */
|
||||||
|
/* { dg-require-effective-target int32plus } */
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
@@ -34,7 +34,7 @@
|
||||||
|
#define TEST(name, body, test) \
|
||||||
|
static void __attribute__((noinline,noclone)) name (unsigned long n, unsigned long m) \
|
||||||
|
{ \
|
||||||
|
- unsigned long i, j; \
|
||||||
|
+ unsigned i, j; \
|
||||||
|
for (i = 1; i < m; i++) { \
|
||||||
|
for (j = 1; j < n; j++) { \
|
||||||
|
body; \
|
||||||
|
@@ -58,9 +58,14 @@
|
||||||
|
TEST(foo4, aa[i][j] = aa[i-1][j+1] * aa[i-1][j+1] / 2, checkaa()) //notok, -1,1
|
||||||
|
TEST(foo5, aa[i][j] = aa[i+1][j+1] * aa[i+1][j+1] / 2, checkaa()) //ok, 1,1
|
||||||
|
TEST(foo6, aa[i][j] = aa[i+1][j] * aa[i+1][j] / 2, checkaa()) //ok, -1,0
|
||||||
|
+TEST(foo61, aa[i][0] = aa[i+1][0] * aa[i+1][0] / 2, checkaa()) //notok, -1,0
|
||||||
|
+TEST(foo62, aa[i][j/2] = aa[i+1][j/2] * aa[i+1][j/2] / 2, checkaa()) //notok, not affine
|
||||||
|
+TEST(foo63, aa[i][j%2] = aa[i+1][j%2] * aa[i+1][j%2] / 2, checkaa()) //notok, not affine
|
||||||
|
TEST(foo7, aa[i+1][j] = aa[i][j] * aa[i][j] / 2, checkaa()) //ok, 1,0
|
||||||
|
TEST(foo9, b[j] = 3*b[j+1] + 1, checkb()) //notok, 0,-1
|
||||||
|
TEST(foo10, b[j] = 3*b[j] + 1, checkb()) //ok, 0,0
|
||||||
|
+extern int f;
|
||||||
|
+TEST(foo11, f = b[i-1] = 1 + 3* b[i+1], checkb()) //ok, 2,0 but must reduce unroll factor to 2, (it would be incorrect with unroll-by-3, which the profitability would suggest)
|
||||||
|
|
||||||
|
/* foo8 should work as well, but currently doesn't because the distance
|
||||||
|
vectors we compute are too pessimistic. We compute
|
||||||
|
@@ -68,6 +73,7 @@
|
||||||
|
and the last one causes us to lose. */
|
||||||
|
TEST(foo8, b[j+1] = 3*b[j] + 1, checkb()) //ok, 0,1
|
||||||
|
|
||||||
|
+int f;
|
||||||
|
unsigned int a[1024];
|
||||||
|
unsigned int b[1024];
|
||||||
|
unsigned int aa[16][1024];
|
||||||
|
@@ -88,10 +94,12 @@
|
||||||
|
printf(" %s\n", #name); \
|
||||||
|
init();for(i=0;i<4;i++)name##noopt(32,8); checka = checksum; \
|
||||||
|
init();for(i=0;i<4;i++)name(32,8); \
|
||||||
|
+ if (checka != checksum) fail = 1; \
|
||||||
|
printf("%sok %s\n", checka != checksum ? "NOT " : "", #name);
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
+ int fail = 0;
|
||||||
|
int i;
|
||||||
|
unsigned checka;
|
||||||
|
RUN(foo1);
|
||||||
|
@@ -100,12 +108,18 @@
|
||||||
|
RUN(foo4);
|
||||||
|
RUN(foo5);
|
||||||
|
RUN(foo6);
|
||||||
|
+ RUN(foo61);
|
||||||
|
+ RUN(foo62);
|
||||||
|
+ RUN(foo63);
|
||||||
|
RUN(foo7);
|
||||||
|
RUN(foo8);
|
||||||
|
RUN(foo9);
|
||||||
|
RUN(foo10);
|
||||||
|
- return 0;
|
||||||
|
+ RUN(foo11);
|
||||||
|
+ if (fail)
|
||||||
|
+ __builtin_abort();
|
||||||
|
+ return fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
-/* Five loops should be unroll-jammed (actually six, but see above). */
|
||||||
|
-/* { dg-final { scan-tree-dump-times "applying unroll and jam" 5 "unrolljam" } } */
|
||||||
|
+/* Six loops should be unroll-jammed (actually seven, but see above). */
|
||||||
|
+/* { dg-final { scan-tree-dump-times "applying unroll and jam" 6 "unrolljam" } } */
|
||||||
|
--- gcc/testsuite/g++.dg/torture/pr91355.C (nonexistent)
|
||||||
|
+++ gcc/testsuite/g++.dg/torture/pr91355.C (revision 278614)
|
||||||
|
@@ -0,0 +1,28 @@
|
||||||
|
+// PR tree-optimization/91355
|
||||||
|
+// { dg-do run }
|
||||||
|
+// { dg-options "-std=c++14" }
|
||||||
|
+
|
||||||
|
+unsigned int d = 0;
|
||||||
|
+
|
||||||
|
+struct S {
|
||||||
|
+ S () { d++; }
|
||||||
|
+ S (const S &) { d++; }
|
||||||
|
+ ~S () { d--; }
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+void
|
||||||
|
+foo (int i) throw (int) // { dg-warning "dynamic exception specifications are deprecated" }
|
||||||
|
+{
|
||||||
|
+ if (i == 0)
|
||||||
|
+ throw 3;
|
||||||
|
+ S d;
|
||||||
|
+ throw 3;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+int
|
||||||
|
+main ()
|
||||||
|
+{
|
||||||
|
+ try { foo (1); } catch (...) {}
|
||||||
|
+ if (d)
|
||||||
|
+ __builtin_abort ();
|
||||||
|
+}
|
||||||
|
--- gcc/tree-ssa-sink.c (revision 278492)
|
||||||
|
+++ gcc/tree-ssa-sink.c (revision 278614)
|
||||||
|
@@ -229,7 +229,7 @@
|
||||||
|
/* If result of comparsion is unknown, preffer EARLY_BB.
|
||||||
|
Thus use !(...>=..) rather than (...<...) */
|
||||||
|
&& !(best_bb->count.apply_scale (100, 1)
|
||||||
|
- > (early_bb->count.apply_scale (threshold, 1))))
|
||||||
|
+ >= early_bb->count.apply_scale (threshold, 1)))
|
||||||
|
return best_bb;
|
||||||
|
|
||||||
|
/* No better block found, so return EARLY_BB, which happens to be the
|
||||||
|
--- gcc/tree-vect-stmts.c (revision 278492)
|
||||||
|
+++ gcc/tree-vect-stmts.c (revision 278614)
|
||||||
|
@@ -8276,9 +8276,7 @@
|
||||||
|
|| alignment_support_scheme == dr_explicit_realign)
|
||||||
|
&& !compute_in_loop)
|
||||||
|
{
|
||||||
|
- msq = vect_setup_realignment (first_stmt_info_for_drptr
|
||||||
|
- ? first_stmt_info_for_drptr
|
||||||
|
- : first_stmt_info, gsi, &realignment_token,
|
||||||
|
+ msq = vect_setup_realignment (first_stmt_info, gsi, &realignment_token,
|
||||||
|
alignment_support_scheme, NULL_TREE,
|
||||||
|
&at_loop);
|
||||||
|
if (alignment_support_scheme == dr_explicit_realign_optimized)
|
||||||
|
--- gcc/gimple-loop-jam.c (revision 278492)
|
||||||
|
+++ gcc/gimple-loop-jam.c (revision 278614)
|
||||||
|
@@ -360,9 +360,26 @@
|
||||||
|
rewrite_into_loop_closed_ssa_1 (NULL, 0, SSA_OP_USE, loop);
|
||||||
|
}
|
||||||
|
|
||||||
|
+/* Return true if any of the access functions for dataref A
|
||||||
|
+ isn't invariant with respect to loop LOOP_NEST. */
|
||||||
|
+static bool
|
||||||
|
+any_access_function_variant_p (const struct data_reference *a,
|
||||||
|
+ const class loop *loop_nest)
|
||||||
|
+{
|
||||||
|
+ unsigned int i;
|
||||||
|
+ vec<tree> fns = DR_ACCESS_FNS (a);
|
||||||
|
+ tree t;
|
||||||
|
+
|
||||||
|
+ FOR_EACH_VEC_ELT (fns, i, t)
|
||||||
|
+ if (!evolution_function_is_invariant_p (t, loop_nest->num))
|
||||||
|
+ return true;
|
||||||
|
+
|
||||||
|
+ return false;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/* Returns true if the distance in DDR can be determined and adjusts
|
||||||
|
the unroll factor in *UNROLL to make unrolling valid for that distance.
|
||||||
|
- Otherwise return false.
|
||||||
|
+ Otherwise return false. DDR is with respect to the outer loop of INNER.
|
||||||
|
|
||||||
|
If this data dep can lead to a removed memory reference, increment
|
||||||
|
*REMOVED and adjust *PROFIT_UNROLL to be the necessary unroll factor
|
||||||
|
@@ -369,7 +386,7 @@
|
||||||
|
for this to happen. */
|
||||||
|
|
||||||
|
static bool
|
||||||
|
-adjust_unroll_factor (struct data_dependence_relation *ddr,
|
||||||
|
+adjust_unroll_factor (class loop *inner, struct data_dependence_relation *ddr,
|
||||||
|
unsigned *unroll, unsigned *profit_unroll,
|
||||||
|
unsigned *removed)
|
||||||
|
{
|
||||||
|
@@ -392,9 +409,59 @@
|
||||||
|
gcc_unreachable ();
|
||||||
|
else if ((unsigned)dist >= *unroll)
|
||||||
|
;
|
||||||
|
- else if (lambda_vector_lexico_pos (dist_v + 1, DDR_NB_LOOPS (ddr) - 1)
|
||||||
|
- || (lambda_vector_zerop (dist_v + 1, DDR_NB_LOOPS (ddr) - 1)
|
||||||
|
- && dist > 0))
|
||||||
|
+ else if (lambda_vector_zerop (dist_v + 1, DDR_NB_LOOPS (ddr) - 1))
|
||||||
|
+ {
|
||||||
|
+ /* We have (a,0) with a < N, so this will be transformed into
|
||||||
|
+ (0,0) after unrolling by N. This might potentially be a
|
||||||
|
+ problem, if it's not a read-read dependency. */
|
||||||
|
+ if (DR_IS_READ (DDR_A (ddr)) && DR_IS_READ (DDR_B (ddr)))
|
||||||
|
+ ;
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ /* So, at least one is a write, and we might reduce the
|
||||||
|
+ distance vector to (0,0). This is still no problem
|
||||||
|
+ if both data-refs are affine with respect to the inner
|
||||||
|
+ loops. But if one of them is invariant with respect
|
||||||
|
+ to an inner loop our reordering implicit in loop fusion
|
||||||
|
+ corrupts the program, as our data dependences don't
|
||||||
|
+ capture this. E.g. for:
|
||||||
|
+ for (0 <= i < n)
|
||||||
|
+ for (0 <= j < m)
|
||||||
|
+ a[i][0] = a[i+1][0] + 2; // (1)
|
||||||
|
+ b[i][j] = b[i+1][j] + 2; // (2)
|
||||||
|
+ the distance vector for both statements is (-1,0),
|
||||||
|
+ but exchanging the order for (2) is okay, while
|
||||||
|
+ for (1) it is not. To see this, write out the original
|
||||||
|
+ accesses (assume m is 2):
|
||||||
|
+ a i j original
|
||||||
|
+ 0 0 0 r a[1][0] b[1][0]
|
||||||
|
+ 1 0 0 w a[0][0] b[0][0]
|
||||||
|
+ 2 0 1 r a[1][0] b[1][1]
|
||||||
|
+ 3 0 1 w a[0][0] b[0][1]
|
||||||
|
+ 4 1 0 r a[2][0] b[2][0]
|
||||||
|
+ 5 1 0 w a[1][0] b[1][0]
|
||||||
|
+ after unroll-by-2 and fusion the accesses are done in
|
||||||
|
+ this order (from column a): 0,1, 4,5, 2,3, i.e. this:
|
||||||
|
+ a i j transformed
|
||||||
|
+ 0 0 0 r a[1][0] b[1][0]
|
||||||
|
+ 1 0 0 w a[0][0] b[0][0]
|
||||||
|
+ 4 1 0 r a[2][0] b[2][0]
|
||||||
|
+ 5 1 0 w a[1][0] b[1][0]
|
||||||
|
+ 2 0 1 r a[1][0] b[1][1]
|
||||||
|
+ 3 0 1 w a[0][0] b[0][1]
|
||||||
|
+ Note how access 2 accesses the same element as access 5
|
||||||
|
+ for array 'a' but not for array 'b'. */
|
||||||
|
+ if (any_access_function_variant_p (DDR_A (ddr), inner)
|
||||||
|
+ && any_access_function_variant_p (DDR_B (ddr), inner))
|
||||||
|
+ ;
|
||||||
|
+ else
|
||||||
|
+ /* And if any dataref of this pair is invariant with
|
||||||
|
+ respect to the inner loop, we have no chance than
|
||||||
|
+ to reduce the unroll factor. */
|
||||||
|
+ *unroll = dist;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ else if (lambda_vector_lexico_pos (dist_v + 1, DDR_NB_LOOPS (ddr) - 1))
|
||||||
|
;
|
||||||
|
else
|
||||||
|
*unroll = dist;
|
||||||
|
@@ -486,7 +553,7 @@
|
||||||
|
/* Now check the distance vector, for determining a sensible
|
||||||
|
outer unroll factor, and for validity of merging the inner
|
||||||
|
loop copies. */
|
||||||
|
- if (!adjust_unroll_factor (ddr, &unroll_factor, &profit_unroll,
|
||||||
|
+ if (!adjust_unroll_factor (loop, ddr, &unroll_factor, &profit_unroll,
|
||||||
|
&removed))
|
||||||
|
{
|
||||||
|
/* Couldn't get the distance vector. For two reads that's
|
||||||
|
@@ -506,7 +573,7 @@
|
||||||
|
to ignore all profitability concerns and apply the transformation
|
||||||
|
always. */
|
||||||
|
if (!PARAM_VALUE (PARAM_UNROLL_JAM_MIN_PERCENT))
|
||||||
|
- profit_unroll = 2;
|
||||||
|
+ profit_unroll = MAX(2, profit_unroll);
|
||||||
|
else if (removed * 100 / datarefs.length ()
|
||||||
|
< (unsigned)PARAM_VALUE (PARAM_UNROLL_JAM_MIN_PERCENT))
|
||||||
|
profit_unroll = 1;
|
||||||
|
--- gcc/config/rs6000/predicates.md (revision 278492)
|
||||||
|
+++ gcc/config/rs6000/predicates.md (revision 278614)
|
||||||
|
@@ -1053,8 +1053,7 @@
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
/* Allow any integer constant. */
|
||||||
|
- if (GET_MODE_CLASS (mode) == MODE_INT
|
||||||
|
- && CONST_SCALAR_INT_P (op))
|
||||||
|
+ if (SCALAR_INT_MODE_P (mode) && CONST_SCALAR_INT_P (op))
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
/* Allow easy vector constants. */
|
122
gcc9-foffload-default.patch
Normal file
122
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
gcc9-hack.patch
Normal file
126
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
gcc9-i386-libgomp.patch
Normal file
11
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
gcc9-isl-dl.patch
Normal file
715
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
gcc9-isl-dl2.patch
Normal file
71
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
gcc9-libgfortran-compat.patch
Normal file
584
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
gcc9-libgomp-omp_h-multilib.patch
Normal file
17
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
|
||||||
|
|
12079
gcc9-libstdc++-compat.patch
Normal file
12079
gcc9-libstdc++-compat.patch
Normal file
File diff suppressed because it is too large
Load Diff
24
gcc9-libstdc++-docs.patch
Normal file
24
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
gcc9-libtool-no-rpath.patch
Normal file
27
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
gcc9-no-add-needed.patch
Normal file
37
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 \
|
31
gcc9-rh1574936.patch
Normal file
31
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
gcc9-sparc-config-detection.patch
Normal file
40
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
|
11
nvptx-tools-build.patch
Normal file
11
nvptx-tools-build.patch
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
--- nvptx-tools/nvptx-as.c.jj 2017-01-20 12:40:18.000000000 +0100
|
||||||
|
+++ nvptx-tools/nvptx-as.c 2017-01-20 12:43:53.864271442 +0100
|
||||||
|
@@ -939,7 +939,7 @@ fork_execute (const char *prog, char *co
|
||||||
|
fatal_error ("%s: %m", errmsg);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
- fatal_error (errmsg);
|
||||||
|
+ fatal_error ("%s", errmsg);
|
||||||
|
}
|
||||||
|
do_wait (prog, pex);
|
||||||
|
}
|
32
nvptx-tools-glibc.patch
Normal file
32
nvptx-tools-glibc.patch
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
--- nvptx-tools/configure.ac.jj 2017-01-13 12:48:31.000000000 +0100
|
||||||
|
+++ nvptx-tools/configure.ac 2017-05-03 10:26:57.076092259 +0200
|
||||||
|
@@ -66,6 +66,8 @@ CPPFLAGS=$save_CPPFLAGS
|
||||||
|
LDFLAGS=$save_LDFLAGS
|
||||||
|
LIBS=$save_LIBS
|
||||||
|
|
||||||
|
+AC_CHECK_DECLS(getopt)
|
||||||
|
+
|
||||||
|
AC_CONFIG_SUBDIRS([libiberty])
|
||||||
|
AC_CONFIG_FILES([Makefile dejagnu.exp])
|
||||||
|
AC_OUTPUT
|
||||||
|
--- nvptx-tools/configure.jj 2017-01-13 12:48:54.000000000 +0100
|
||||||
|
+++ nvptx-tools/configure 2017-05-03 10:27:13.503876809 +0200
|
||||||
|
@@ -3963,6 +3963,18 @@ CPPFLAGS=$save_CPPFLAGS
|
||||||
|
LDFLAGS=$save_LDFLAGS
|
||||||
|
LIBS=$save_LIBS
|
||||||
|
|
||||||
|
+ac_fn_c_check_decl "$LINENO" "getopt" "ac_cv_have_decl_getopt" "$ac_includes_default"
|
||||||
|
+if test "x$ac_cv_have_decl_getopt" = x""yes; then :
|
||||||
|
+ ac_have_decl=1
|
||||||
|
+else
|
||||||
|
+ ac_have_decl=0
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
+cat >>confdefs.h <<_ACEOF
|
||||||
|
+#define HAVE_DECL_GETOPT $ac_have_decl
|
||||||
|
+_ACEOF
|
||||||
|
+
|
||||||
|
+
|
||||||
|
|
||||||
|
|
||||||
|
subdirs="$subdirs libiberty"
|
947
nvptx-tools-no-ptxas.patch
Normal file
947
nvptx-tools-no-ptxas.patch
Normal file
@ -0,0 +1,947 @@
|
|||||||
|
--- nvptx-tools/configure.ac
|
||||||
|
+++ nvptx-tools/configure.ac
|
||||||
|
@@ -51,6 +51,7 @@ LIBS="$LIBS -lcuda"
|
||||||
|
AC_CHECK_FUNCS([[cuGetErrorName] [cuGetErrorString]])
|
||||||
|
AC_CHECK_DECLS([[cuGetErrorName], [cuGetErrorString]],
|
||||||
|
[], [], [[#include <cuda.h>]])
|
||||||
|
+AC_CHECK_HEADERS(unistd.h sys/stat.h)
|
||||||
|
|
||||||
|
AC_MSG_CHECKING([for extra programs to build requiring -lcuda])
|
||||||
|
NVPTX_RUN=
|
||||||
|
--- nvptx-tools/include/libiberty.h
|
||||||
|
+++ nvptx-tools/include/libiberty.h
|
||||||
|
@@ -390,6 +390,17 @@ extern void hex_init (void);
|
||||||
|
/* Save files used for communication between processes. */
|
||||||
|
#define PEX_SAVE_TEMPS 0x4
|
||||||
|
|
||||||
|
+/* Max number of alloca bytes per call before we must switch to malloc.
|
||||||
|
+
|
||||||
|
+ ?? Swiped from gnulib's regex_internal.h header. Is this actually
|
||||||
|
+ the case? This number seems arbitrary, though sane.
|
||||||
|
+
|
||||||
|
+ The OS usually guarantees only one guard page at the bottom of the stack,
|
||||||
|
+ and a page size can be as small as 4096 bytes. So we cannot safely
|
||||||
|
+ allocate anything larger than 4096 bytes. Also care for the possibility
|
||||||
|
+ of a few compiler-allocated temporary stack slots. */
|
||||||
|
+#define MAX_ALLOCA_SIZE 4032
|
||||||
|
+
|
||||||
|
/* Prepare to execute one or more programs, with standard output of
|
||||||
|
each program fed to standard input of the next.
|
||||||
|
FLAGS As above.
|
||||||
|
--- nvptx-tools/nvptx-as.c
|
||||||
|
+++ nvptx-tools/nvptx-as.c
|
||||||
|
@@ -30,6 +30,9 @@
|
||||||
|
#include <string.h>
|
||||||
|
#include <wait.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
+#ifdef HAVE_SYS_STAT_H
|
||||||
|
+#include <sys/stat.h>
|
||||||
|
+#endif
|
||||||
|
#include <errno.h>
|
||||||
|
#define obstack_chunk_alloc malloc
|
||||||
|
#define obstack_chunk_free free
|
||||||
|
@@ -42,6 +45,38 @@
|
||||||
|
|
||||||
|
#include "version.h"
|
||||||
|
|
||||||
|
+#ifndef R_OK
|
||||||
|
+#define R_OK 4
|
||||||
|
+#define W_OK 2
|
||||||
|
+#define X_OK 1
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
+#ifndef DIR_SEPARATOR
|
||||||
|
+# define DIR_SEPARATOR '/'
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
+#if defined (_WIN32) || defined (__MSDOS__) \
|
||||||
|
+ || defined (__DJGPP__) || defined (__OS2__)
|
||||||
|
+# define HAVE_DOS_BASED_FILE_SYSTEM
|
||||||
|
+# define HAVE_HOST_EXECUTABLE_SUFFIX
|
||||||
|
+# define HOST_EXECUTABLE_SUFFIX ".exe"
|
||||||
|
+# ifndef DIR_SEPARATOR_2
|
||||||
|
+# define DIR_SEPARATOR_2 '\\'
|
||||||
|
+# endif
|
||||||
|
+# define PATH_SEPARATOR ';'
|
||||||
|
+#else
|
||||||
|
+# define PATH_SEPARATOR ':'
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
+#ifndef DIR_SEPARATOR_2
|
||||||
|
+# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
|
||||||
|
+#else
|
||||||
|
+# define IS_DIR_SEPARATOR(ch) \
|
||||||
|
+ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
+#define DIR_UP ".."
|
||||||
|
+
|
||||||
|
static const char *outname = NULL;
|
||||||
|
|
||||||
|
static void __attribute__ ((format (printf, 1, 2)))
|
||||||
|
@@ -816,7 +851,7 @@ traverse (void **slot, void *data)
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
-process (FILE *in, FILE *out)
|
||||||
|
+process (FILE *in, FILE *out, int verify, const char *outname)
|
||||||
|
{
|
||||||
|
symbol_table = htab_create (500, hash_string_hash, hash_string_eq,
|
||||||
|
NULL);
|
||||||
|
@@ -824,6 +859,18 @@ process (FILE *in, FILE *out)
|
||||||
|
const char *input = read_file (in);
|
||||||
|
Token *tok = tokenize (input);
|
||||||
|
|
||||||
|
+ /* By default, when ptxas is not in PATH, do minimalistic verification,
|
||||||
|
+ just require that the first non-comment directive is .version. */
|
||||||
|
+ if (verify < 0)
|
||||||
|
+ {
|
||||||
|
+ size_t i;
|
||||||
|
+ for (i = 0; tok[i].kind == K_comment; i++)
|
||||||
|
+ ;
|
||||||
|
+ if (tok[i].kind != K_dotted || !is_keyword (&tok[i], "version"))
|
||||||
|
+ fatal_error ("missing .version directive at start of file '%s'",
|
||||||
|
+ outname);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
do
|
||||||
|
tok = parse_file (tok);
|
||||||
|
while (tok->kind);
|
||||||
|
@@ -897,9 +944,83 @@ fork_execute (const char *prog, char *const *argv)
|
||||||
|
do_wait (prog, pex);
|
||||||
|
}
|
||||||
|
|
||||||
|
+/* Determine if progname is available in PATH. */
|
||||||
|
+static bool
|
||||||
|
+program_available (const char *progname)
|
||||||
|
+{
|
||||||
|
+ char *temp = getenv ("PATH");
|
||||||
|
+ if (temp)
|
||||||
|
+ {
|
||||||
|
+ char *startp, *endp, *nstore, *alloc_ptr = NULL;
|
||||||
|
+ size_t prefixlen = strlen (temp) + 1;
|
||||||
|
+ size_t len;
|
||||||
|
+ if (prefixlen < 2)
|
||||||
|
+ prefixlen = 2;
|
||||||
|
+
|
||||||
|
+ len = prefixlen + strlen (progname) + 1;
|
||||||
|
+#ifdef HAVE_HOST_EXECUTABLE_SUFFIX
|
||||||
|
+ len += strlen (HOST_EXECUTABLE_SUFFIX);
|
||||||
|
+#endif
|
||||||
|
+ if (len < MAX_ALLOCA_SIZE)
|
||||||
|
+ nstore = (char *) alloca (len);
|
||||||
|
+ else
|
||||||
|
+ alloc_ptr = nstore = (char *) malloc (len);
|
||||||
|
+
|
||||||
|
+ startp = endp = temp;
|
||||||
|
+ while (1)
|
||||||
|
+ {
|
||||||
|
+ if (*endp == PATH_SEPARATOR || *endp == 0)
|
||||||
|
+ {
|
||||||
|
+ if (endp == startp)
|
||||||
|
+ {
|
||||||
|
+ nstore[0] = '.';
|
||||||
|
+ nstore[1] = DIR_SEPARATOR;
|
||||||
|
+ nstore[2] = '\0';
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ memcpy (nstore, startp, endp - startp);
|
||||||
|
+ if (! IS_DIR_SEPARATOR (endp[-1]))
|
||||||
|
+ {
|
||||||
|
+ nstore[endp - startp] = DIR_SEPARATOR;
|
||||||
|
+ nstore[endp - startp + 1] = 0;
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ nstore[endp - startp] = 0;
|
||||||
|
+ }
|
||||||
|
+ strcat (nstore, progname);
|
||||||
|
+ if (! access (nstore, X_OK)
|
||||||
|
+#ifdef HAVE_HOST_EXECUTABLE_SUFFIX
|
||||||
|
+ || ! access (strcat (nstore, HOST_EXECUTABLE_SUFFIX), X_OK)
|
||||||
|
+#endif
|
||||||
|
+ )
|
||||||
|
+ {
|
||||||
|
+#if defined (HAVE_SYS_STAT_H) && defined (S_ISREG)
|
||||||
|
+ struct stat st;
|
||||||
|
+ if (stat (nstore, &st) >= 0 && S_ISREG (st.st_mode))
|
||||||
|
+#endif
|
||||||
|
+ {
|
||||||
|
+ free (alloc_ptr);
|
||||||
|
+ return true;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (*endp == 0)
|
||||||
|
+ break;
|
||||||
|
+ endp = startp = endp + 1;
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ endp++;
|
||||||
|
+ }
|
||||||
|
+ free (alloc_ptr);
|
||||||
|
+ }
|
||||||
|
+ return false;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static struct option long_options[] = {
|
||||||
|
{"traditional-format", no_argument, 0, 0 },
|
||||||
|
{"save-temps", no_argument, 0, 0 },
|
||||||
|
+ {"verify", no_argument, 0, 0 },
|
||||||
|
{"no-verify", no_argument, 0, 0 },
|
||||||
|
{"help", no_argument, 0, 'h' },
|
||||||
|
{"version", no_argument, 0, 'V' },
|
||||||
|
@@ -912,7 +1033,7 @@ main (int argc, char **argv)
|
||||||
|
FILE *in = stdin;
|
||||||
|
FILE *out = stdout;
|
||||||
|
bool verbose __attribute__((unused)) = false;
|
||||||
|
- bool verify = true;
|
||||||
|
+ int verify = -1;
|
||||||
|
const char *smver = "sm_30";
|
||||||
|
|
||||||
|
int o;
|
||||||
|
@@ -923,7 +1044,9 @@ main (int argc, char **argv)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
if (option_index == 2)
|
||||||
|
- verify = false;
|
||||||
|
+ verify = 1;
|
||||||
|
+ else if (option_index == 3)
|
||||||
|
+ verify = 0;
|
||||||
|
break;
|
||||||
|
case 'v':
|
||||||
|
verbose = true;
|
||||||
|
@@ -948,7 +1071,8 @@ Usage: nvptx-none-as [option...] [asmfile]\n\
|
||||||
|
Options:\n\
|
||||||
|
-o FILE Write output to FILE\n\
|
||||||
|
-v Be verbose\n\
|
||||||
|
+ --verify Do verify output is acceptable to ptxas\n\
|
||||||
|
--no-verify Do not verify output is acceptable to ptxas\n\
|
||||||
|
--help Print this help and exit\n\
|
||||||
|
--version Print version number and exit\n\
|
||||||
|
\n\
|
||||||
|
@@ -983,11 +1108,17 @@ This program has absolutely no warranty.\n",
|
||||||
|
if (!in)
|
||||||
|
fatal_error ("cannot open input ptx file");
|
||||||
|
|
||||||
|
- process (in, out);
|
||||||
|
- if (outname)
|
||||||
|
+ if (outname == NULL)
|
||||||
|
+ verify = 0;
|
||||||
|
+ else if (verify == -1)
|
||||||
|
+ if (program_available ("ptxas"))
|
||||||
|
+ verify = 1;
|
||||||
|
+
|
||||||
|
+ process (in, out, verify, outname);
|
||||||
|
+ if (outname)
|
||||||
|
fclose (out);
|
||||||
|
|
||||||
|
- if (verify && outname)
|
||||||
|
+ if (verify > 0)
|
||||||
|
{
|
||||||
|
struct obstack argv_obstack;
|
||||||
|
obstack_init (&argv_obstack);
|
||||||
|
--- nvptx-tools/configure
|
||||||
|
+++ nvptx-tools/configure
|
||||||
|
@@ -168,7 +168,8 @@ test x\$exitcode = x0 || exit 1"
|
||||||
|
as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
|
||||||
|
as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
|
||||||
|
eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
|
||||||
|
- test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1"
|
||||||
|
+ test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
|
||||||
|
+test \$(( 1 + 1 )) = 2 || exit 1"
|
||||||
|
if (eval "$as_required") 2>/dev/null; then :
|
||||||
|
as_have_required=yes
|
||||||
|
else
|
||||||
|
@@ -552,11 +553,50 @@ PACKAGE_URL=
|
||||||
|
|
||||||
|
ac_unique_file="nvptx-tools"
|
||||||
|
ac_unique_file="nvptx-as.c"
|
||||||
|
+# Factoring default headers for most tests.
|
||||||
|
+ac_includes_default="\
|
||||||
|
+#include <stdio.h>
|
||||||
|
+#ifdef HAVE_SYS_TYPES_H
|
||||||
|
+# include <sys/types.h>
|
||||||
|
+#endif
|
||||||
|
+#ifdef HAVE_SYS_STAT_H
|
||||||
|
+# include <sys/stat.h>
|
||||||
|
+#endif
|
||||||
|
+#ifdef STDC_HEADERS
|
||||||
|
+# include <stdlib.h>
|
||||||
|
+# include <stddef.h>
|
||||||
|
+#else
|
||||||
|
+# ifdef HAVE_STDLIB_H
|
||||||
|
+# include <stdlib.h>
|
||||||
|
+# endif
|
||||||
|
+#endif
|
||||||
|
+#ifdef HAVE_STRING_H
|
||||||
|
+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
|
||||||
|
+# include <memory.h>
|
||||||
|
+# endif
|
||||||
|
+# include <string.h>
|
||||||
|
+#endif
|
||||||
|
+#ifdef HAVE_STRINGS_H
|
||||||
|
+# include <strings.h>
|
||||||
|
+#endif
|
||||||
|
+#ifdef HAVE_INTTYPES_H
|
||||||
|
+# include <inttypes.h>
|
||||||
|
+#endif
|
||||||
|
+#ifdef HAVE_STDINT_H
|
||||||
|
+# include <stdint.h>
|
||||||
|
+#endif
|
||||||
|
+#ifdef HAVE_UNISTD_H
|
||||||
|
+# include <unistd.h>
|
||||||
|
+#endif"
|
||||||
|
+
|
||||||
|
enable_option_checking=no
|
||||||
|
ac_subst_vars='LTLIBOBJS
|
||||||
|
LIBOBJS
|
||||||
|
subdirs
|
||||||
|
NVPTX_RUN
|
||||||
|
+EGREP
|
||||||
|
+GREP
|
||||||
|
+CPP
|
||||||
|
CUDA_DRIVER_LDFLAGS
|
||||||
|
CUDA_DRIVER_CPPFLAGS
|
||||||
|
AR
|
||||||
|
@@ -635,7 +675,8 @@ LIBS
|
||||||
|
CPPFLAGS
|
||||||
|
CXX
|
||||||
|
CXXFLAGS
|
||||||
|
-CCC'
|
||||||
|
+CCC
|
||||||
|
+CPP'
|
||||||
|
ac_subdirs_all='libiberty'
|
||||||
|
|
||||||
|
# Initialize some variables set by options.
|
||||||
|
@@ -1267,6 +1308,7 @@ Some influential environment variables:
|
||||||
|
you have headers in a nonstandard directory <include dir>
|
||||||
|
CXX C++ compiler command
|
||||||
|
CXXFLAGS C++ compiler flags
|
||||||
|
+ CPP C preprocessor
|
||||||
|
|
||||||
|
Use these variables to override the choices made by `configure' or to help
|
||||||
|
it to find libraries and programs with nonstandard names/locations.
|
||||||
|
@@ -1575,6 +1617,203 @@ $as_echo "$ac_res" >&6; }
|
||||||
|
eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
|
||||||
|
|
||||||
|
} # ac_fn_c_check_decl
|
||||||
|
+
|
||||||
|
+# ac_fn_c_try_cpp LINENO
|
||||||
|
+# ----------------------
|
||||||
|
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
|
||||||
|
+ac_fn_c_try_cpp ()
|
||||||
|
+{
|
||||||
|
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
|
||||||
|
+ if { { ac_try="$ac_cpp conftest.$ac_ext"
|
||||||
|
+case "(($ac_try" in
|
||||||
|
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
|
||||||
|
+ *) ac_try_echo=$ac_try;;
|
||||||
|
+esac
|
||||||
|
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
|
||||||
|
+$as_echo "$ac_try_echo"; } >&5
|
||||||
|
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
|
||||||
|
+ ac_status=$?
|
||||||
|
+ if test -s conftest.err; then
|
||||||
|
+ grep -v '^ *+' conftest.err >conftest.er1
|
||||||
|
+ cat conftest.er1 >&5
|
||||||
|
+ mv -f conftest.er1 conftest.err
|
||||||
|
+ fi
|
||||||
|
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
|
||||||
|
+ test $ac_status = 0; } >/dev/null && {
|
||||||
|
+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
|
||||||
|
+ test ! -s conftest.err
|
||||||
|
+ }; then :
|
||||||
|
+ ac_retval=0
|
||||||
|
+else
|
||||||
|
+ $as_echo "$as_me: failed program was:" >&5
|
||||||
|
+sed 's/^/| /' conftest.$ac_ext >&5
|
||||||
|
+
|
||||||
|
+ ac_retval=1
|
||||||
|
+fi
|
||||||
|
+ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
|
||||||
|
+ return $ac_retval
|
||||||
|
+
|
||||||
|
+} # ac_fn_c_try_cpp
|
||||||
|
+
|
||||||
|
+# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
|
||||||
|
+# -------------------------------------------------------
|
||||||
|
+# Tests whether HEADER exists, giving a warning if it cannot be compiled using
|
||||||
|
+# the include files in INCLUDES and setting the cache variable VAR
|
||||||
|
+# accordingly.
|
||||||
|
+ac_fn_c_check_header_mongrel ()
|
||||||
|
+{
|
||||||
|
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
|
||||||
|
+ if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
|
||||||
|
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
|
||||||
|
+$as_echo_n "checking for $2... " >&6; }
|
||||||
|
+if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
|
||||||
|
+ $as_echo_n "(cached) " >&6
|
||||||
|
+fi
|
||||||
|
+eval ac_res=\$$3
|
||||||
|
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
|
||||||
|
+$as_echo "$ac_res" >&6; }
|
||||||
|
+else
|
||||||
|
+ # Is the header compilable?
|
||||||
|
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
|
||||||
|
+$as_echo_n "checking $2 usability... " >&6; }
|
||||||
|
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||||
|
+/* end confdefs.h. */
|
||||||
|
+$4
|
||||||
|
+#include <$2>
|
||||||
|
+_ACEOF
|
||||||
|
+if ac_fn_c_try_compile "$LINENO"; then :
|
||||||
|
+ ac_header_compiler=yes
|
||||||
|
+else
|
||||||
|
+ ac_header_compiler=no
|
||||||
|
+fi
|
||||||
|
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
|
||||||
|
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
|
||||||
|
+$as_echo "$ac_header_compiler" >&6; }
|
||||||
|
+
|
||||||
|
+# Is the header present?
|
||||||
|
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
|
||||||
|
+$as_echo_n "checking $2 presence... " >&6; }
|
||||||
|
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||||
|
+/* end confdefs.h. */
|
||||||
|
+#include <$2>
|
||||||
|
+_ACEOF
|
||||||
|
+if ac_fn_c_try_cpp "$LINENO"; then :
|
||||||
|
+ ac_header_preproc=yes
|
||||||
|
+else
|
||||||
|
+ ac_header_preproc=no
|
||||||
|
+fi
|
||||||
|
+rm -f conftest.err conftest.$ac_ext
|
||||||
|
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
|
||||||
|
+$as_echo "$ac_header_preproc" >&6; }
|
||||||
|
+
|
||||||
|
+# So? What about this header?
|
||||||
|
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
|
||||||
|
+ yes:no: )
|
||||||
|
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
|
||||||
|
+$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
|
||||||
|
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
|
||||||
|
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
|
||||||
|
+ ;;
|
||||||
|
+ no:yes:* )
|
||||||
|
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
|
||||||
|
+$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
|
||||||
|
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5
|
||||||
|
+$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;}
|
||||||
|
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
|
||||||
|
+$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
|
||||||
|
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5
|
||||||
|
+$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;}
|
||||||
|
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
|
||||||
|
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
|
||||||
|
+ ;;
|
||||||
|
+esac
|
||||||
|
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
|
||||||
|
+$as_echo_n "checking for $2... " >&6; }
|
||||||
|
+if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
|
||||||
|
+ $as_echo_n "(cached) " >&6
|
||||||
|
+else
|
||||||
|
+ eval "$3=\$ac_header_compiler"
|
||||||
|
+fi
|
||||||
|
+eval ac_res=\$$3
|
||||||
|
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
|
||||||
|
+$as_echo "$ac_res" >&6; }
|
||||||
|
+fi
|
||||||
|
+ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
|
||||||
|
+
|
||||||
|
+} # ac_fn_c_check_header_mongrel
|
||||||
|
+
|
||||||
|
+# ac_fn_c_try_run LINENO
|
||||||
|
+# ----------------------
|
||||||
|
+# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
|
||||||
|
+# that executables *can* be run.
|
||||||
|
+ac_fn_c_try_run ()
|
||||||
|
+{
|
||||||
|
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
|
||||||
|
+ if { { ac_try="$ac_link"
|
||||||
|
+case "(($ac_try" in
|
||||||
|
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
|
||||||
|
+ *) ac_try_echo=$ac_try;;
|
||||||
|
+esac
|
||||||
|
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
|
||||||
|
+$as_echo "$ac_try_echo"; } >&5
|
||||||
|
+ (eval "$ac_link") 2>&5
|
||||||
|
+ ac_status=$?
|
||||||
|
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
|
||||||
|
+ test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
|
||||||
|
+ { { case "(($ac_try" in
|
||||||
|
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
|
||||||
|
+ *) ac_try_echo=$ac_try;;
|
||||||
|
+esac
|
||||||
|
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
|
||||||
|
+$as_echo "$ac_try_echo"; } >&5
|
||||||
|
+ (eval "$ac_try") 2>&5
|
||||||
|
+ ac_status=$?
|
||||||
|
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
|
||||||
|
+ test $ac_status = 0; }; }; then :
|
||||||
|
+ ac_retval=0
|
||||||
|
+else
|
||||||
|
+ $as_echo "$as_me: program exited with status $ac_status" >&5
|
||||||
|
+ $as_echo "$as_me: failed program was:" >&5
|
||||||
|
+sed 's/^/| /' conftest.$ac_ext >&5
|
||||||
|
+
|
||||||
|
+ ac_retval=$ac_status
|
||||||
|
+fi
|
||||||
|
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
|
||||||
|
+ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
|
||||||
|
+ return $ac_retval
|
||||||
|
+
|
||||||
|
+} # ac_fn_c_try_run
|
||||||
|
+
|
||||||
|
+# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
|
||||||
|
+# -------------------------------------------------------
|
||||||
|
+# Tests whether HEADER exists and can be compiled using the include files in
|
||||||
|
+# INCLUDES, setting the cache variable VAR accordingly.
|
||||||
|
+ac_fn_c_check_header_compile ()
|
||||||
|
+{
|
||||||
|
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
|
||||||
|
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
|
||||||
|
+$as_echo_n "checking for $2... " >&6; }
|
||||||
|
+if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
|
||||||
|
+ $as_echo_n "(cached) " >&6
|
||||||
|
+else
|
||||||
|
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||||
|
+/* end confdefs.h. */
|
||||||
|
+$4
|
||||||
|
+#include <$2>
|
||||||
|
+_ACEOF
|
||||||
|
+if ac_fn_c_try_compile "$LINENO"; then :
|
||||||
|
+ eval "$3=yes"
|
||||||
|
+else
|
||||||
|
+ eval "$3=no"
|
||||||
|
+fi
|
||||||
|
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
|
||||||
|
+fi
|
||||||
|
+eval ac_res=\$$3
|
||||||
|
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
|
||||||
|
+$as_echo "$ac_res" >&6; }
|
||||||
|
+ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
|
||||||
|
+
|
||||||
|
+} # ac_fn_c_check_header_compile
|
||||||
|
cat >config.log <<_ACEOF
|
||||||
|
This file contains any messages produced by compilers while
|
||||||
|
running configure, to aid debugging if configure makes a mistake.
|
||||||
|
@@ -3284,6 +3523,418 @@ cat >>confdefs.h <<_ACEOF
|
||||||
|
#define HAVE_DECL_CUGETERRORSTRING $ac_have_decl
|
||||||
|
_ACEOF
|
||||||
|
|
||||||
|
+ac_ext=c
|
||||||
|
+ac_cpp='$CPP $CPPFLAGS'
|
||||||
|
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
|
||||||
|
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
|
||||||
|
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
|
||||||
|
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
|
||||||
|
+$as_echo_n "checking how to run the C preprocessor... " >&6; }
|
||||||
|
+# On Suns, sometimes $CPP names a directory.
|
||||||
|
+if test -n "$CPP" && test -d "$CPP"; then
|
||||||
|
+ CPP=
|
||||||
|
+fi
|
||||||
|
+if test -z "$CPP"; then
|
||||||
|
+ if test "${ac_cv_prog_CPP+set}" = set; then :
|
||||||
|
+ $as_echo_n "(cached) " >&6
|
||||||
|
+else
|
||||||
|
+ # Double quotes because CPP needs to be expanded
|
||||||
|
+ for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
|
||||||
|
+ do
|
||||||
|
+ ac_preproc_ok=false
|
||||||
|
+for ac_c_preproc_warn_flag in '' yes
|
||||||
|
+do
|
||||||
|
+ # Use a header file that comes with gcc, so configuring glibc
|
||||||
|
+ # with a fresh cross-compiler works.
|
||||||
|
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
|
||||||
|
+ # <limits.h> exists even on freestanding compilers.
|
||||||
|
+ # On the NeXT, cc -E runs the code through the compiler's parser,
|
||||||
|
+ # not just through cpp. "Syntax error" is here to catch this case.
|
||||||
|
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||||
|
+/* end confdefs.h. */
|
||||||
|
+#ifdef __STDC__
|
||||||
|
+# include <limits.h>
|
||||||
|
+#else
|
||||||
|
+# include <assert.h>
|
||||||
|
+#endif
|
||||||
|
+ Syntax error
|
||||||
|
+_ACEOF
|
||||||
|
+if ac_fn_c_try_cpp "$LINENO"; then :
|
||||||
|
+
|
||||||
|
+else
|
||||||
|
+ # Broken: fails on valid input.
|
||||||
|
+continue
|
||||||
|
+fi
|
||||||
|
+rm -f conftest.err conftest.$ac_ext
|
||||||
|
+
|
||||||
|
+ # OK, works on sane cases. Now check whether nonexistent headers
|
||||||
|
+ # can be detected and how.
|
||||||
|
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||||
|
+/* end confdefs.h. */
|
||||||
|
+#include <ac_nonexistent.h>
|
||||||
|
+_ACEOF
|
||||||
|
+if ac_fn_c_try_cpp "$LINENO"; then :
|
||||||
|
+ # Broken: success on invalid input.
|
||||||
|
+continue
|
||||||
|
+else
|
||||||
|
+ # Passes both tests.
|
||||||
|
+ac_preproc_ok=:
|
||||||
|
+break
|
||||||
|
+fi
|
||||||
|
+rm -f conftest.err conftest.$ac_ext
|
||||||
|
+
|
||||||
|
+done
|
||||||
|
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
|
||||||
|
+rm -f conftest.err conftest.$ac_ext
|
||||||
|
+if $ac_preproc_ok; then :
|
||||||
|
+ break
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
+ done
|
||||||
|
+ ac_cv_prog_CPP=$CPP
|
||||||
|
+
|
||||||
|
+fi
|
||||||
|
+ CPP=$ac_cv_prog_CPP
|
||||||
|
+else
|
||||||
|
+ ac_cv_prog_CPP=$CPP
|
||||||
|
+fi
|
||||||
|
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
|
||||||
|
+$as_echo "$CPP" >&6; }
|
||||||
|
+ac_preproc_ok=false
|
||||||
|
+for ac_c_preproc_warn_flag in '' yes
|
||||||
|
+do
|
||||||
|
+ # Use a header file that comes with gcc, so configuring glibc
|
||||||
|
+ # with a fresh cross-compiler works.
|
||||||
|
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
|
||||||
|
+ # <limits.h> exists even on freestanding compilers.
|
||||||
|
+ # On the NeXT, cc -E runs the code through the compiler's parser,
|
||||||
|
+ # not just through cpp. "Syntax error" is here to catch this case.
|
||||||
|
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||||
|
+/* end confdefs.h. */
|
||||||
|
+#ifdef __STDC__
|
||||||
|
+# include <limits.h>
|
||||||
|
+#else
|
||||||
|
+# include <assert.h>
|
||||||
|
+#endif
|
||||||
|
+ Syntax error
|
||||||
|
+_ACEOF
|
||||||
|
+if ac_fn_c_try_cpp "$LINENO"; then :
|
||||||
|
+
|
||||||
|
+else
|
||||||
|
+ # Broken: fails on valid input.
|
||||||
|
+continue
|
||||||
|
+fi
|
||||||
|
+rm -f conftest.err conftest.$ac_ext
|
||||||
|
+
|
||||||
|
+ # OK, works on sane cases. Now check whether nonexistent headers
|
||||||
|
+ # can be detected and how.
|
||||||
|
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||||
|
+/* end confdefs.h. */
|
||||||
|
+#include <ac_nonexistent.h>
|
||||||
|
+_ACEOF
|
||||||
|
+if ac_fn_c_try_cpp "$LINENO"; then :
|
||||||
|
+ # Broken: success on invalid input.
|
||||||
|
+continue
|
||||||
|
+else
|
||||||
|
+ # Passes both tests.
|
||||||
|
+ac_preproc_ok=:
|
||||||
|
+break
|
||||||
|
+fi
|
||||||
|
+rm -f conftest.err conftest.$ac_ext
|
||||||
|
+
|
||||||
|
+done
|
||||||
|
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
|
||||||
|
+rm -f conftest.err conftest.$ac_ext
|
||||||
|
+if $ac_preproc_ok; then :
|
||||||
|
+
|
||||||
|
+else
|
||||||
|
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
|
||||||
|
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
|
||||||
|
+as_fn_error "C preprocessor \"$CPP\" fails sanity check
|
||||||
|
+See \`config.log' for more details." "$LINENO" 5; }
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
+ac_ext=c
|
||||||
|
+ac_cpp='$CPP $CPPFLAGS'
|
||||||
|
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
|
||||||
|
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
|
||||||
|
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
|
||||||
|
+$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
|
||||||
|
+if test "${ac_cv_path_GREP+set}" = set; then :
|
||||||
|
+ $as_echo_n "(cached) " >&6
|
||||||
|
+else
|
||||||
|
+ if test -z "$GREP"; then
|
||||||
|
+ ac_path_GREP_found=false
|
||||||
|
+ # Loop through the user's path and test for each of PROGNAME-LIST
|
||||||
|
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
|
||||||
|
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
|
||||||
|
+do
|
||||||
|
+ IFS=$as_save_IFS
|
||||||
|
+ test -z "$as_dir" && as_dir=.
|
||||||
|
+ for ac_prog in grep ggrep; do
|
||||||
|
+ for ac_exec_ext in '' $ac_executable_extensions; do
|
||||||
|
+ ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
|
||||||
|
+ { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
|
||||||
|
+# Check for GNU ac_path_GREP and select it if it is found.
|
||||||
|
+ # Check for GNU $ac_path_GREP
|
||||||
|
+case `"$ac_path_GREP" --version 2>&1` in
|
||||||
|
+*GNU*)
|
||||||
|
+ ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
|
||||||
|
+*)
|
||||||
|
+ ac_count=0
|
||||||
|
+ $as_echo_n 0123456789 >"conftest.in"
|
||||||
|
+ while :
|
||||||
|
+ do
|
||||||
|
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
|
||||||
|
+ mv "conftest.tmp" "conftest.in"
|
||||||
|
+ cp "conftest.in" "conftest.nl"
|
||||||
|
+ $as_echo 'GREP' >> "conftest.nl"
|
||||||
|
+ "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
|
||||||
|
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
|
||||||
|
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
|
||||||
|
+ if test $ac_count -gt ${ac_path_GREP_max-0}; then
|
||||||
|
+ # Best one so far, save it but keep looking for a better one
|
||||||
|
+ ac_cv_path_GREP="$ac_path_GREP"
|
||||||
|
+ ac_path_GREP_max=$ac_count
|
||||||
|
+ fi
|
||||||
|
+ # 10*(2^10) chars as input seems more than enough
|
||||||
|
+ test $ac_count -gt 10 && break
|
||||||
|
+ done
|
||||||
|
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
|
||||||
|
+esac
|
||||||
|
+
|
||||||
|
+ $ac_path_GREP_found && break 3
|
||||||
|
+ done
|
||||||
|
+ done
|
||||||
|
+ done
|
||||||
|
+IFS=$as_save_IFS
|
||||||
|
+ if test -z "$ac_cv_path_GREP"; then
|
||||||
|
+ as_fn_error "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
|
||||||
|
+ fi
|
||||||
|
+else
|
||||||
|
+ ac_cv_path_GREP=$GREP
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
+fi
|
||||||
|
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
|
||||||
|
+$as_echo "$ac_cv_path_GREP" >&6; }
|
||||||
|
+ GREP="$ac_cv_path_GREP"
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
|
||||||
|
+$as_echo_n "checking for egrep... " >&6; }
|
||||||
|
+if test "${ac_cv_path_EGREP+set}" = set; then :
|
||||||
|
+ $as_echo_n "(cached) " >&6
|
||||||
|
+else
|
||||||
|
+ if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
|
||||||
|
+ then ac_cv_path_EGREP="$GREP -E"
|
||||||
|
+ else
|
||||||
|
+ if test -z "$EGREP"; then
|
||||||
|
+ ac_path_EGREP_found=false
|
||||||
|
+ # Loop through the user's path and test for each of PROGNAME-LIST
|
||||||
|
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
|
||||||
|
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
|
||||||
|
+do
|
||||||
|
+ IFS=$as_save_IFS
|
||||||
|
+ test -z "$as_dir" && as_dir=.
|
||||||
|
+ for ac_prog in egrep; do
|
||||||
|
+ for ac_exec_ext in '' $ac_executable_extensions; do
|
||||||
|
+ ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
|
||||||
|
+ { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
|
||||||
|
+# Check for GNU ac_path_EGREP and select it if it is found.
|
||||||
|
+ # Check for GNU $ac_path_EGREP
|
||||||
|
+case `"$ac_path_EGREP" --version 2>&1` in
|
||||||
|
+*GNU*)
|
||||||
|
+ ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
|
||||||
|
+*)
|
||||||
|
+ ac_count=0
|
||||||
|
+ $as_echo_n 0123456789 >"conftest.in"
|
||||||
|
+ while :
|
||||||
|
+ do
|
||||||
|
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
|
||||||
|
+ mv "conftest.tmp" "conftest.in"
|
||||||
|
+ cp "conftest.in" "conftest.nl"
|
||||||
|
+ $as_echo 'EGREP' >> "conftest.nl"
|
||||||
|
+ "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
|
||||||
|
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
|
||||||
|
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
|
||||||
|
+ if test $ac_count -gt ${ac_path_EGREP_max-0}; then
|
||||||
|
+ # Best one so far, save it but keep looking for a better one
|
||||||
|
+ ac_cv_path_EGREP="$ac_path_EGREP"
|
||||||
|
+ ac_path_EGREP_max=$ac_count
|
||||||
|
+ fi
|
||||||
|
+ # 10*(2^10) chars as input seems more than enough
|
||||||
|
+ test $ac_count -gt 10 && break
|
||||||
|
+ done
|
||||||
|
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
|
||||||
|
+esac
|
||||||
|
+
|
||||||
|
+ $ac_path_EGREP_found && break 3
|
||||||
|
+ done
|
||||||
|
+ done
|
||||||
|
+ done
|
||||||
|
+IFS=$as_save_IFS
|
||||||
|
+ if test -z "$ac_cv_path_EGREP"; then
|
||||||
|
+ as_fn_error "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
|
||||||
|
+ fi
|
||||||
|
+else
|
||||||
|
+ ac_cv_path_EGREP=$EGREP
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
+ fi
|
||||||
|
+fi
|
||||||
|
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
|
||||||
|
+$as_echo "$ac_cv_path_EGREP" >&6; }
|
||||||
|
+ EGREP="$ac_cv_path_EGREP"
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
|
||||||
|
+$as_echo_n "checking for ANSI C header files... " >&6; }
|
||||||
|
+if test "${ac_cv_header_stdc+set}" = set; then :
|
||||||
|
+ $as_echo_n "(cached) " >&6
|
||||||
|
+else
|
||||||
|
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||||
|
+/* end confdefs.h. */
|
||||||
|
+#include <stdlib.h>
|
||||||
|
+#include <stdarg.h>
|
||||||
|
+#include <string.h>
|
||||||
|
+#include <float.h>
|
||||||
|
+
|
||||||
|
+int
|
||||||
|
+main ()
|
||||||
|
+{
|
||||||
|
+
|
||||||
|
+ ;
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+_ACEOF
|
||||||
|
+if ac_fn_c_try_compile "$LINENO"; then :
|
||||||
|
+ ac_cv_header_stdc=yes
|
||||||
|
+else
|
||||||
|
+ ac_cv_header_stdc=no
|
||||||
|
+fi
|
||||||
|
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
|
||||||
|
+
|
||||||
|
+if test $ac_cv_header_stdc = yes; then
|
||||||
|
+ # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
|
||||||
|
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||||
|
+/* end confdefs.h. */
|
||||||
|
+#include <string.h>
|
||||||
|
+
|
||||||
|
+_ACEOF
|
||||||
|
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
|
||||||
|
+ $EGREP "memchr" >/dev/null 2>&1; then :
|
||||||
|
+
|
||||||
|
+else
|
||||||
|
+ ac_cv_header_stdc=no
|
||||||
|
+fi
|
||||||
|
+rm -f conftest*
|
||||||
|
+
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
+if test $ac_cv_header_stdc = yes; then
|
||||||
|
+ # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
|
||||||
|
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||||
|
+/* end confdefs.h. */
|
||||||
|
+#include <stdlib.h>
|
||||||
|
+
|
||||||
|
+_ACEOF
|
||||||
|
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
|
||||||
|
+ $EGREP "free" >/dev/null 2>&1; then :
|
||||||
|
+
|
||||||
|
+else
|
||||||
|
+ ac_cv_header_stdc=no
|
||||||
|
+fi
|
||||||
|
+rm -f conftest*
|
||||||
|
+
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
+if test $ac_cv_header_stdc = yes; then
|
||||||
|
+ # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
|
||||||
|
+ if test "$cross_compiling" = yes; then :
|
||||||
|
+ :
|
||||||
|
+else
|
||||||
|
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||||
|
+/* end confdefs.h. */
|
||||||
|
+#include <ctype.h>
|
||||||
|
+#include <stdlib.h>
|
||||||
|
+#if ((' ' & 0x0FF) == 0x020)
|
||||||
|
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
|
||||||
|
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
|
||||||
|
+#else
|
||||||
|
+# define ISLOWER(c) \
|
||||||
|
+ (('a' <= (c) && (c) <= 'i') \
|
||||||
|
+ || ('j' <= (c) && (c) <= 'r') \
|
||||||
|
+ || ('s' <= (c) && (c) <= 'z'))
|
||||||
|
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
|
||||||
|
+int
|
||||||
|
+main ()
|
||||||
|
+{
|
||||||
|
+ int i;
|
||||||
|
+ for (i = 0; i < 256; i++)
|
||||||
|
+ if (XOR (islower (i), ISLOWER (i))
|
||||||
|
+ || toupper (i) != TOUPPER (i))
|
||||||
|
+ return 2;
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+_ACEOF
|
||||||
|
+if ac_fn_c_try_run "$LINENO"; then :
|
||||||
|
+
|
||||||
|
+else
|
||||||
|
+ ac_cv_header_stdc=no
|
||||||
|
+fi
|
||||||
|
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
|
||||||
|
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
+fi
|
||||||
|
+fi
|
||||||
|
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
|
||||||
|
+$as_echo "$ac_cv_header_stdc" >&6; }
|
||||||
|
+if test $ac_cv_header_stdc = yes; then
|
||||||
|
+
|
||||||
|
+$as_echo "#define STDC_HEADERS 1" >>confdefs.h
|
||||||
|
+
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
|
||||||
|
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
|
||||||
|
+ inttypes.h stdint.h unistd.h
|
||||||
|
+do :
|
||||||
|
+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
|
||||||
|
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
|
||||||
|
+"
|
||||||
|
+eval as_val=\$$as_ac_Header
|
||||||
|
+ if test "x$as_val" = x""yes; then :
|
||||||
|
+ cat >>confdefs.h <<_ACEOF
|
||||||
|
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
|
||||||
|
+_ACEOF
|
||||||
|
+
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
+done
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+for ac_header in unistd.h sys/stat.h
|
||||||
|
+do :
|
||||||
|
+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
|
||||||
|
+ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
|
||||||
|
+eval as_val=\$$as_ac_Header
|
||||||
|
+ if test "x$as_val" = x""yes; then :
|
||||||
|
+ cat >>confdefs.h <<_ACEOF
|
||||||
|
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
|
||||||
|
+_ACEOF
|
||||||
|
+
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
+done
|
||||||
|
+
|
||||||
|
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for extra programs to build requiring -lcuda" >&5
|
||||||
|
$as_echo_n "checking for extra programs to build requiring -lcuda... " >&6; }
|
6
sources
Normal file
6
sources
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
SHA512 (doxygen-1.8.0.src.tar.gz) = 21ebcbcc22e279a75b4b4495da0f8ceb175d615c2c7cd253b4ed8f049599d6d5ed61da442c750202db9b82869426b40201e5a1ecc1273175d1ee904cce4125a6
|
||||||
|
SHA512 (gcc-9.2.1-20191120.tar.xz) = cbd156d19afc4d4e752df3aee159906899f229342c314dcb16699e29bb43c0ac63b35ced11fcc50c4017c20e4e0e5609d941d88abcfe16e3903c3e7da6050acd
|
||||||
|
SHA512 (isl-0.16.1.tar.bz2) = c188667a84dc5bdddb4ab7c35f89c91bf15a8171f4fcaf41301cf285fb7328846d9a367c096012fec4cc69d244f0bc9e95d84c09ec097394cd4093076f2a041b
|
||||||
|
SHA512 (mpc-0.8.1.tar.gz) = 14cb9ae3d33caed24d5ae648eed28b2e00ad047a8baeff25981129af88245b4def2948573d7a00d65c5bd34e53524aa6a7351b76703c9f888b41830c1a1daae2
|
||||||
|
SHA512 (nvptx-newlib-aadc8eb0ec43b7cd0dd2dfb484bae63c8b05ef24.tar.xz) = 94f7089365296f7dfa485107b4143bebc850a81586f3460fd896bbbb6ba099a00217d4042133424fd2183b352132f4fd367e6a60599bdae2a26dfd48a77d0e04
|
||||||
|
SHA512 (nvptx-tools-c28050f60193b3b95a18866a96f03334e874e78f.tar.xz) = a688cb12cf805950a5abbb13b52f45c81dbee98e310b7ed57ae20e76dbfa5964a16270148374a6426d177db71909d28360490f091c86a5d19d4faa5127beeee1
|
Loading…
Reference in New Issue
Block a user