Compare commits
No commits in common. "f35" and "master" have entirely different histories.
@ -1 +0,0 @@
|
|||||||
1
|
|
53
.gitignore
vendored
53
.gitignore
vendored
@ -6,56 +6,3 @@
|
|||||||
/gcc-10.0.1-20200126.tar.xz
|
/gcc-10.0.1-20200126.tar.xz
|
||||||
/gcc-10.0.1-20200130.tar.xz
|
/gcc-10.0.1-20200130.tar.xz
|
||||||
/gcc-10.0.1-20200216.tar.xz
|
/gcc-10.0.1-20200216.tar.xz
|
||||||
/gcc-10.0.1-20200311.tar.xz
|
|
||||||
/gcc-10.0.1-20200325.tar.xz
|
|
||||||
/gcc-10.0.1-20200328.tar.xz
|
|
||||||
/gcc-10.0.1-20200420.tar.xz
|
|
||||||
/gcc-10.0.1-20200501.tar.xz
|
|
||||||
/gcc-10.1.1-20200507.tar.xz
|
|
||||||
/gcc-10.1.1-20200618.tar.xz
|
|
||||||
/gcc-10.2.1-20200723.tar.xz
|
|
||||||
/gcc-10.2.1-20200804.tar.xz
|
|
||||||
/gcc-10.2.1-20200826.tar.xz
|
|
||||||
/gcc-10.2.1-20200916.tar.xz
|
|
||||||
/gcc-10.2.1-20201005.tar.xz
|
|
||||||
/gcc-10.2.1-20201016.tar.xz
|
|
||||||
/gcc-10.2.1-20201102.tar.xz
|
|
||||||
/gcc-10.2.1-20201112.tar.xz
|
|
||||||
/gcc-10.2.1-20201125.tar.xz
|
|
||||||
/gcc-11.0.0-20201204.tar.xz
|
|
||||||
/gcc-11.0.0-20201216.tar.xz
|
|
||||||
/gcc-11.0.0-20201217.tar.xz
|
|
||||||
/gcc-11.0.0-20201223.tar.xz
|
|
||||||
/gcc-11.0.0-20210109.tar.xz
|
|
||||||
/gcc-11.0.0-20210113.tar.xz
|
|
||||||
/gcc-11.0.0-20210116.tar.xz
|
|
||||||
/gcc-11.0.0-20210119.tar.xz
|
|
||||||
/gcc-11.0.0-20210123.tar.xz
|
|
||||||
/gcc-11.0.0-20210130.tar.xz
|
|
||||||
/gcc-11.0.0-20210210.tar.xz
|
|
||||||
/gcc-11.0.0-20210225.tar.xz
|
|
||||||
/gcc-11.0.1-20210307.tar.xz
|
|
||||||
/gcc-11.0.1-20210319.tar.xz
|
|
||||||
/isl-0.18.tar.bz2
|
|
||||||
/gcc-11.0.1-20210324.tar.xz
|
|
||||||
/gcc-11.0.1-20210405.tar.xz
|
|
||||||
/gcc-11.0.1-20210418.tar.xz
|
|
||||||
/gcc-11.0.1-20210422.tar.xz
|
|
||||||
/gcc-11.0.1-20210423.tar.xz
|
|
||||||
/gcc-11.1.1-20210428.tar.xz
|
|
||||||
/gcc-11.1.1-20210512.tar.xz
|
|
||||||
/gcc-11.1.1-20210531.tar.xz
|
|
||||||
/gcc-11.1.1-20210617.tar.xz
|
|
||||||
/gcc-11.1.1-20210623.tar.xz
|
|
||||||
/gcc-11.1.1-20210726.tar.xz
|
|
||||||
/gcc-11.2.1-20210728.tar.xz
|
|
||||||
/gcc-11.2.1-20210823.tar.xz
|
|
||||||
/gcc-11.2.1-20211012.tar.xz
|
|
||||||
/gcc-11.2.1-20211018.tar.xz
|
|
||||||
/gcc-11.2.1-20211019.tar.xz
|
|
||||||
/gcc-11.2.1-20211203.tar.xz
|
|
||||||
/gcc-11.2.1-20220125.tar.xz
|
|
||||||
/gcc-11.2.1-20220127.tar.xz
|
|
||||||
/gcc-11.2.1-20220401.tar.xz
|
|
||||||
/gcc-11.3.1-20220421.tar.xz
|
|
||||||
/gcc-11.3.1-20221121.tar.xz
|
|
||||||
|
16
gating.yaml
16
gating.yaml
@ -1,16 +0,0 @@
|
|||||||
--- !Policy
|
|
||||||
product_versions:
|
|
||||||
- fedora-*
|
|
||||||
decision_context: bodhi_update_push_stable
|
|
||||||
subject_type: koji_build
|
|
||||||
rules:
|
|
||||||
- !PassingTestCaseRule {test_case_name: fedora-ci.koji-build.tier0.functional}
|
|
||||||
- !PassingTestCaseRule {test_case_name: baseos-qe.koji-build.scratch-build.validation}
|
|
||||||
--- !Policy
|
|
||||||
product_versions:
|
|
||||||
- rhel-9
|
|
||||||
decision_context: osci_compose_gate
|
|
||||||
rules:
|
|
||||||
- !PassingTestCaseRule {test_case_name: baseos-ci.brew-build.tier1-gating.functional}
|
|
||||||
- !PassingTestCaseRule {test_case_name: baseos-ci.brew-build.tier1-gating-p9.functional}
|
|
||||||
- !PassingTestCaseRule {test_case_name: baseos-qe.koji-build.scratch-build.validation}
|
|
@ -5,9 +5,9 @@
|
|||||||
|
|
||||||
--- gcc/d/d-spec.cc.jj 2019-01-01 12:37:49.502444257 +0100
|
--- 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
|
+++ gcc/d/d-spec.cc 2019-01-17 17:09:45.364949246 +0100
|
||||||
@@ -408,9 +408,9 @@ lang_specific_driver (cl_decoded_option
|
@@ -405,9 +405,9 @@ lang_specific_driver (cl_decoded_option
|
||||||
/* Add `-lgphobos' if we haven't already done so. */
|
/* Add `-lgphobos' if we haven't already done so. */
|
||||||
if (phobos_library != PHOBOS_NOLINK)
|
if (phobos_library != PHOBOS_NOLINK && need_phobos)
|
||||||
{
|
{
|
||||||
- /* Default to static linking. */
|
- /* Default to static linking. */
|
||||||
- if (phobos_library != PHOBOS_DYNAMIC)
|
- if (phobos_library != PHOBOS_DYNAMIC)
|
||||||
@ -17,4 +17,4 @@
|
|||||||
+ phobos_library = PHOBOS_DYNAMIC;
|
+ phobos_library = PHOBOS_DYNAMIC;
|
||||||
|
|
||||||
#ifdef HAVE_LD_STATIC_DYNAMIC
|
#ifdef HAVE_LD_STATIC_DYNAMIC
|
||||||
if (phobos_library == PHOBOS_STATIC && !static_link)
|
if (phobos_library == PHOBOS_DYNAMIC && static_link)
|
@ -16,7 +16,7 @@ libgomp/
|
|||||||
|
|
||||||
--- gcc/gcc.c.jj 2017-01-17 10:28:40.000000000 +0100
|
--- gcc/gcc.c.jj 2017-01-17 10:28:40.000000000 +0100
|
||||||
+++ gcc/gcc.c 2017-01-20 16:26:29.649962902 +0100
|
+++ gcc/gcc.c 2017-01-20 16:26:29.649962902 +0100
|
||||||
@@ -319,6 +319,10 @@ static const char *spec_host_machine = D
|
@@ -290,6 +290,10 @@ static const char *spec_host_machine = D
|
||||||
|
|
||||||
static char *offload_targets = NULL;
|
static char *offload_targets = NULL;
|
||||||
|
|
||||||
@ -27,7 +27,7 @@ libgomp/
|
|||||||
/* Nonzero if cross-compiling.
|
/* Nonzero if cross-compiling.
|
||||||
When -b is used, the value comes from the `specs' file. */
|
When -b is used, the value comes from the `specs' file. */
|
||||||
|
|
||||||
@@ -4828,7 +4832,10 @@ process_command (unsigned int decoded_op
|
@@ -4457,7 +4461,10 @@ process_command (unsigned int decoded_op
|
||||||
/* If the user didn't specify any, default to all configured offload
|
/* If the user didn't specify any, default to all configured offload
|
||||||
targets. */
|
targets. */
|
||||||
if (ENABLE_OFFLOADING && offload_targets == NULL)
|
if (ENABLE_OFFLOADING && offload_targets == NULL)
|
||||||
@ -37,14 +37,14 @@ libgomp/
|
|||||||
+ offload_targets_default = true;
|
+ offload_targets_default = true;
|
||||||
+ }
|
+ }
|
||||||
|
|
||||||
/* Handle -gtoggle as it would later in toplev.c:process_options to
|
if (output_file
|
||||||
make the debug-level-gt spec function work as expected. */
|
&& strcmp (output_file, "-") != 0
|
||||||
@@ -8494,6 +8501,8 @@ driver::maybe_putenv_OFFLOAD_TARGETS ()
|
@@ -7693,6 +7700,8 @@ driver::maybe_putenv_OFFLOAD_TARGETS ()
|
||||||
obstack_grow (&collect_obstack, offload_targets,
|
obstack_grow (&collect_obstack, offload_targets,
|
||||||
strlen (offload_targets) + 1);
|
strlen (offload_targets) + 1);
|
||||||
xputenv (XOBFINISH (&collect_obstack, char *));
|
xputenv (XOBFINISH (&collect_obstack, char *));
|
||||||
+ if (offload_targets_default)
|
+ if (offload_targets_default)
|
||||||
+ xputenv ("OFFLOAD_TARGET_DEFAULT=1");
|
+ xputenv ("OFFLOAD_TARGET_DEFAULT=1");
|
||||||
}
|
}
|
||||||
|
|
||||||
free (offload_targets);
|
free (offload_targets);
|
||||||
@ -56,9 +56,9 @@ libgomp/
|
|||||||
#define OFFLOAD_TARGET_NAMES_ENV "OFFLOAD_TARGET_NAMES"
|
#define OFFLOAD_TARGET_NAMES_ENV "OFFLOAD_TARGET_NAMES"
|
||||||
+#define OFFLOAD_TARGET_DEFAULT_ENV "OFFLOAD_TARGET_DEFAULT"
|
+#define OFFLOAD_TARGET_DEFAULT_ENV "OFFLOAD_TARGET_DEFAULT"
|
||||||
|
|
||||||
/* By default there is no special suffix for target executables. */
|
enum lto_mode_d {
|
||||||
#ifdef TARGET_EXECUTABLE_SUFFIX
|
LTO_MODE_NONE, /* Not doing LTO. */
|
||||||
@@ -906,6 +907,12 @@ compile_offload_image (const char *targe
|
@@ -822,6 +823,12 @@ compile_offload_image (const char *targe
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -71,38 +71,44 @@ libgomp/
|
|||||||
if (!compiler)
|
if (!compiler)
|
||||||
fatal_error (input_location,
|
fatal_error (input_location,
|
||||||
"could not find %s in %s (consider using %<-B%>)",
|
"could not find %s in %s (consider using %<-B%>)",
|
||||||
@@ -975,6 +982,7 @@ compile_images_for_offload_targets (unsi
|
@@ -885,6 +892,7 @@ compile_images_for_offload_targets (unsi
|
||||||
if (!target_names)
|
|
||||||
return;
|
|
||||||
unsigned num_targets = parse_env_var (target_names, &names, NULL);
|
unsigned num_targets = parse_env_var (target_names, &names, NULL);
|
||||||
+ int next_name_entry = 0;
|
|
||||||
|
|
||||||
|
int next_name_entry = 0;
|
||||||
|
+ bool hsa_seen = false;
|
||||||
const char *compiler_path = getenv ("COMPILER_PATH");
|
const char *compiler_path = getenv ("COMPILER_PATH");
|
||||||
if (!compiler_path)
|
if (!compiler_path)
|
||||||
@@ -985,13 +993,19 @@ compile_images_for_offload_targets (unsi
|
goto out;
|
||||||
offload_names = XCNEWVEC (char *, num_targets + 1);
|
@@ -897,18 +905,26 @@ compile_images_for_offload_targets (unsi
|
||||||
for (unsigned i = 0; i < num_targets; i++)
|
/* HSA does not use LTO-like streaming and a different compiler, skip
|
||||||
{
|
it. */
|
||||||
- offload_names[i]
|
if (strcmp (names[i], "hsa") == 0)
|
||||||
+ offload_names[next_name_entry]
|
- continue;
|
||||||
|
+ {
|
||||||
|
+ hsa_seen = true;
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
offload_names[next_name_entry]
|
||||||
= compile_offload_image (names[i], compiler_path, in_argc, in_argv,
|
= compile_offload_image (names[i], compiler_path, in_argc, in_argv,
|
||||||
compiler_opts, compiler_opt_count,
|
compiler_opts, compiler_opt_count,
|
||||||
linker_opts, linker_opt_count);
|
linker_opts, linker_opt_count);
|
||||||
- if (!offload_names[i])
|
if (!offload_names[next_name_entry])
|
||||||
- fatal_error (input_location,
|
- fatal_error (input_location,
|
||||||
- "problem with building target image for %s", names[i]);
|
- "problem with building target image for %s", names[i]);
|
||||||
+ if (!offload_names[next_name_entry])
|
|
||||||
+ continue;
|
+ continue;
|
||||||
+ next_name_entry++;
|
next_name_entry++;
|
||||||
+ }
|
}
|
||||||
+
|
|
||||||
+ if (next_name_entry == 0)
|
+ if (next_name_entry == 0 && !hsa_seen)
|
||||||
+ {
|
+ {
|
||||||
+ free (offload_names);
|
+ free (offload_names);
|
||||||
+ offload_names = NULL;
|
+ offload_names = NULL;
|
||||||
}
|
+ }
|
||||||
|
+
|
||||||
out:
|
out:
|
||||||
|
free_array_of_ptrs ((void **) names, num_targets);
|
||||||
|
}
|
||||||
--- libgomp/target.c.jj 2017-01-01 12:45:52.000000000 +0100
|
--- libgomp/target.c.jj 2017-01-01 12:45:52.000000000 +0100
|
||||||
+++ libgomp/target.c 2017-01-20 20:12:13.756710875 +0100
|
+++ libgomp/target.c 2017-01-20 20:12:13.756710875 +0100
|
||||||
@@ -2356,7 +2356,7 @@ gomp_load_plugin_for_device (struct gomp
|
@@ -2356,7 +2356,7 @@ gomp_load_plugin_for_device (struct gomp
|
@ -100,7 +100,7 @@
|
|||||||
|
|
||||||
--- libcpp/expr.c.jj 2019-01-09 13:01:22.415535734 +0100
|
--- libcpp/expr.c.jj 2019-01-09 13:01:22.415535734 +0100
|
||||||
+++ libcpp/expr.c 2019-01-11 18:16:23.444726882 +0100
|
+++ libcpp/expr.c 2019-01-11 18:16:23.444726882 +0100
|
||||||
@@ -803,16 +803,17 @@ cpp_classify_number (cpp_reader *pfile,
|
@@ -788,16 +788,17 @@ cpp_classify_number (cpp_reader *pfile,
|
||||||
if ((result & CPP_N_WIDTH) == CPP_N_LARGE
|
if ((result & CPP_N_WIDTH) == CPP_N_LARGE
|
||||||
&& CPP_OPTION (pfile, cpp_warn_long_long))
|
&& CPP_OPTION (pfile, cpp_warn_long_long))
|
||||||
{
|
{
|
||||||
@ -123,4 +123,4 @@
|
|||||||
+ : N_("use of C99 long long integer constant"));
|
+ : N_("use of C99 long long integer constant"));
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((result & CPP_N_SIZE_T) == CPP_N_SIZE_T
|
result |= CPP_N_INTEGER;
|
11
gcc10-i386-libgomp.patch
Normal file
11
gcc10-i386-libgomp.patch
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
--- libgomp/configure.tgt.jj 2008-01-10 20:53:48.000000000 +0100
|
||||||
|
+++ libgomp/configure.tgt 2008-03-27 12:44:51.000000000 +0100
|
||||||
|
@@ -67,7 +67,7 @@ if test $enable_linux_futex = yes; then
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
if test -z "$with_arch"; then
|
||||||
|
- XCFLAGS="${XCFLAGS} -march=i486 -mtune=${target_cpu}"
|
||||||
|
+ XCFLAGS="${XCFLAGS} -march=i486 -mtune=generic"
|
||||||
|
fi
|
||||||
|
esac
|
||||||
|
;;
|
@ -27,10 +27,10 @@
|
|||||||
# and compile them.
|
# and compile them.
|
||||||
--- gcc/graphite.h.jj 2016-01-27 12:44:06.000000000 +0100
|
--- gcc/graphite.h.jj 2016-01-27 12:44:06.000000000 +0100
|
||||||
+++ gcc/graphite.h 2016-01-27 13:26:38.309876856 +0100
|
+++ gcc/graphite.h 2016-01-27 13:26:38.309876856 +0100
|
||||||
@@ -24,6 +24,591 @@ along with GCC; see the file COPYING3.
|
@@ -39,6 +39,590 @@ along with GCC; see the file COPYING3.
|
||||||
|
#include <isl/schedule_node.h>
|
||||||
#include "sese.h"
|
#include <isl/id.h>
|
||||||
|
#include <isl/space.h>
|
||||||
+#include <isl/version.h>
|
+#include <isl/version.h>
|
||||||
+#include <dlfcn.h>
|
+#include <dlfcn.h>
|
||||||
+
|
+
|
||||||
@ -615,11 +615,10 @@
|
|||||||
+#define isl_version (*isl_pointers__.p_isl_version)
|
+#define isl_version (*isl_pointers__.p_isl_version)
|
||||||
+#define isl_options_get_on_error (*isl_pointers__.p_isl_options_get_on_error)
|
+#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)
|
+#define isl_ctx_reset_error (*isl_pointers__.p_isl_ctx_reset_error)
|
||||||
+
|
|
||||||
typedef struct poly_dr *poly_dr_p;
|
typedef struct poly_dr *poly_dr_p;
|
||||||
|
|
||||||
typedef struct poly_bb *poly_bb_p;
|
@@ -461,5 +1045,6 @@ extern void build_scops (vec<scop_p> *);
|
||||||
@@ -448,5 +1033,6 @@ extern tree cached_scalar_evolution_in_r
|
|
||||||
extern void dot_all_sese (FILE *, vec<sese_l> &);
|
extern void dot_all_sese (FILE *, vec<sese_l> &);
|
||||||
extern void dot_sese (sese_l &);
|
extern void dot_sese (sese_l &);
|
||||||
extern void dot_cfg ();
|
extern void dot_cfg ();
|
@ -4,7 +4,7 @@
|
|||||||
<a class="link" href="https://www.fsf.org" target="_top">FSF
|
<a class="link" href="https://www.fsf.org" target="_top">FSF
|
||||||
</a>
|
</a>
|
||||||
</p><p>
|
</p><p>
|
||||||
+ Release 11.3.1
|
+ Release 10.0.1
|
||||||
+ </p><p>
|
+ </p><p>
|
||||||
Permission is granted to copy, distribute and/or modify this
|
Permission is granted to copy, distribute and/or modify this
|
||||||
document under the terms of the GNU Free Documentation
|
document under the terms of the GNU Free Documentation
|
||||||
@ -17,7 +17,7 @@
|
|||||||
</p><p>
|
</p><p>
|
||||||
- The API documentation, rendered into HTML, can be viewed online
|
- The API documentation, rendered into HTML, can be viewed online
|
||||||
+ The API documentation, rendered into HTML, can be viewed locally
|
+ The API documentation, rendered into HTML, can be viewed locally
|
||||||
+ <a class="link" href="api/index.html" target="_top">for the 11.3.1 release</a>,
|
+ <a class="link" href="api/index.html" target="_top">for the 10.0.1 release</a>,
|
||||||
+ online
|
+ online
|
||||||
<a class="link" href="http://gcc.gnu.org/onlinedocs/" target="_top">for each GCC release</a>
|
<a class="link" href="http://gcc.gnu.org/onlinedocs/" target="_top">for each GCC release</a>
|
||||||
and
|
and
|
@ -1,181 +0,0 @@
|
|||||||
From 7001d522d0273658d9e1fb12ca104d56bfcae34d Mon Sep 17 00:00:00 2001
|
|
||||||
From: Mark Eggleston <markeggleston@gcc.gnu.org>
|
|
||||||
Date: Fri, 22 Jan 2021 15:06:08 +0000
|
|
||||||
Subject: [PATCH 10/10] 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 019c798cf09..f27de88ea3f 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.
|
|
||||||
@@ -460,6 +464,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 050f56fdc25..c3b2822685d 100644
|
|
||||||
--- a/gcc/fortran/options.c
|
|
||||||
+++ b/gcc/fortran/options.c
|
|
||||||
@@ -84,6 +84,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 fe7d0cc5944..0efeedab46e 100644
|
|
||||||
--- a/gcc/fortran/resolve.c
|
|
||||||
+++ b/gcc/fortran/resolve.c
|
|
||||||
@@ -4806,6 +4806,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.27.0
|
|
||||||
|
|
@ -1,215 +0,0 @@
|
|||||||
From 23b1fcb104c666429451ffaf936f8da5fcd3d43a Mon Sep 17 00:00:00 2001
|
|
||||||
From: Mark Eggleston <markeggleston@gcc.gnu.org>
|
|
||||||
Date: Fri, 22 Jan 2021 12:29:47 +0000
|
|
||||||
Subject: [PATCH 01/10] 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 | 21 +++++++++++++++++--
|
|
||||||
.../gfortran.dg/duplicate_type_4.f90 | 13 ++++++++++++
|
|
||||||
.../gfortran.dg/duplicate_type_5.f90 | 13 ++++++++++++
|
|
||||||
.../gfortran.dg/duplicate_type_6.f90 | 13 ++++++++++++
|
|
||||||
.../gfortran.dg/duplicate_type_7.f90 | 13 ++++++++++++
|
|
||||||
.../gfortran.dg/duplicate_type_8.f90 | 12 +++++++++++
|
|
||||||
.../gfortran.dg/duplicate_type_9.f90 | 12 +++++++++++
|
|
||||||
9 files changed, 100 insertions(+), 2 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 2b1977c523b..52bd522051e 100644
|
|
||||||
--- a/gcc/fortran/lang.opt
|
|
||||||
+++ b/gcc/fortran/lang.opt
|
|
||||||
@@ -469,6 +469,10 @@ Fortran Var(flag_dec_char_conversions)
|
|
||||||
Enable the use of character literals in assignments and data statements
|
|
||||||
for non-character variables.
|
|
||||||
|
|
||||||
+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 3a0b98bf1ec..f19ba87f8a0 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_blank_format_item, value, value);
|
|
||||||
SET_BITFLAG (flag_dec_char_conversions, 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 3b988d1be22..9843175cc2a 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)
|
|
||||||
@@ -2007,6 +2009,23 @@ gfc_add_type (gfc_symbol *sym, gfc_typespec *ts, locus *where)
|
|
||||||
else if (sym->attr.function && sym->attr.result)
|
|
||||||
gfc_error ("Symbol %qs at %L already has basic type of %s",
|
|
||||||
sym->ns->proc_name->name, where, gfc_basic_typename (type));
|
|
||||||
+ 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));
|
|
||||||
@@ -2020,8 +2039,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.27.0
|
|
||||||
|
|
@ -1,78 +0,0 @@
|
|||||||
From f883ac209b0feea860354cb4ef7ff06dc8063fab Mon Sep 17 00:00:00 2001
|
|
||||||
From: Mark Eggleston <markeggleston@gcc.gnu.org>
|
|
||||||
Date: Fri, 22 Jan 2021 12:53:35 +0000
|
|
||||||
Subject: [PATCH 03/10] Allow more than one character as argument to ICHAR
|
|
||||||
|
|
||||||
Use -fdec to enable.
|
|
||||||
---
|
|
||||||
gcc/fortran/check.c | 2 +-
|
|
||||||
gcc/fortran/simplify.c | 4 ++--
|
|
||||||
.../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 82db8e4e1b2..623c1cc470e 100644
|
|
||||||
--- a/gcc/fortran/check.c
|
|
||||||
+++ b/gcc/fortran/check.c
|
|
||||||
@@ -3157,7 +3157,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 23317a2e2d9..9900572424f 100644
|
|
||||||
--- a/gcc/fortran/simplify.c
|
|
||||||
+++ b/gcc/fortran/simplify.c
|
|
||||||
@@ -3261,7 +3261,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;
|
|
||||||
@@ -3459,7 +3459,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.27.0
|
|
||||||
|
|
@ -1,158 +0,0 @@
|
|||||||
From 67aef262311d6a746786ee0f59748ccaa7e1e711 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Mark Eggleston <markeggleston@gcc.gnu.org>
|
|
||||||
Date: Fri, 22 Jan 2021 13:09:54 +0000
|
|
||||||
Subject: [PATCH 04/10] 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 c4da248f07c..d527c106bd6 100644
|
|
||||||
--- a/gcc/fortran/lang.opt
|
|
||||||
+++ b/gcc/fortran/lang.opt
|
|
||||||
@@ -489,6 +489,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 f19ba87f8a0..9a042f64881 100644
|
|
||||||
--- a/gcc/fortran/options.c
|
|
||||||
+++ b/gcc/fortran/options.c
|
|
||||||
@@ -78,6 +78,7 @@ set_dec_flags (int value)
|
|
||||||
SET_BITFLAG (flag_dec_blank_format_item, value, value);
|
|
||||||
SET_BITFLAG (flag_dec_char_conversions, value, value);
|
|
||||||
SET_BITFLAG (flag_dec_duplicates, 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 4b90cb59902..bc0df0fdb99 100644
|
|
||||||
--- a/gcc/fortran/resolve.c
|
|
||||||
+++ b/gcc/fortran/resolve.c
|
|
||||||
@@ -5131,6 +5131,16 @@ gfc_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",
|
|
||||||
@@ -5160,6 +5170,16 @@ gfc_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.27.0
|
|
||||||
|
|
@ -1,378 +0,0 @@
|
|||||||
From cc87ddb841017bb0976b05091733609ee17d7f05 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Mark Eggleston <markeggleston@gcc.gnu.org>
|
|
||||||
Date: Fri, 22 Jan 2021 13:15:17 +0000
|
|
||||||
Subject: [PATCH 07/10] 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 ++++++++++++++++---
|
|
||||||
...gical_expressions_if_statements_blocks_1.f | 25 ++++++++
|
|
||||||
...gical_expressions_if_statements_blocks_2.f | 25 ++++++++
|
|
||||||
...gical_expressions_if_statements_blocks_3.f | 25 ++++++++
|
|
||||||
...gical_expressions_if_statements_blocks_4.f | 45 ++++++++++++++
|
|
||||||
...gical_expressions_if_statements_blocks_5.f | 45 ++++++++++++++
|
|
||||||
...gical_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 4a269ebb22d..d886c2f33ed 100644
|
|
||||||
--- a/gcc/fortran/lang.opt
|
|
||||||
+++ b/gcc/fortran/lang.opt
|
|
||||||
@@ -497,6 +497,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 edbab483b36..a946c86790a 100644
|
|
||||||
--- a/gcc/fortran/options.c
|
|
||||||
+++ b/gcc/fortran/options.c
|
|
||||||
@@ -81,6 +81,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 bc0df0fdb99..07dd039f3bf 100644
|
|
||||||
--- a/gcc/fortran/resolve.c
|
|
||||||
+++ b/gcc/fortran/resolve.c
|
|
||||||
@@ -10789,10 +10789,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:
|
|
||||||
@@ -12093,11 +12114,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.27.0
|
|
||||||
|
|
@ -1,185 +0,0 @@
|
|||||||
From 8bcc0f85ed1718c0dd9033ad4a34df181aabaffe Mon Sep 17 00:00:00 2001
|
|
||||||
From: Mark Eggleston <markeggleston@gcc.gnu.org>
|
|
||||||
Date: Fri, 22 Jan 2021 13:11:06 +0000
|
|
||||||
Subject: [PATCH 05/10] 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 +
|
|
||||||
...ec_derived_types_initialised_old_style_1.f | 25 +++++++++++++++++
|
|
||||||
...ec_derived_types_initialised_old_style_2.f | 25 +++++++++++++++++
|
|
||||||
...ec_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 723915822f3..5c8c1b7981b 100644
|
|
||||||
--- a/gcc/fortran/decl.c
|
|
||||||
+++ b/gcc/fortran/decl.c
|
|
||||||
@@ -2827,12 +2827,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 d527c106bd6..25cc948699b 100644
|
|
||||||
--- a/gcc/fortran/lang.opt
|
|
||||||
+++ b/gcc/fortran/lang.opt
|
|
||||||
@@ -493,6 +493,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 9a042f64881..d6bd36c3a8a 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_duplicates, 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.27.0
|
|
||||||
|
|
@ -1,588 +0,0 @@
|
|||||||
From 786869fd62813e80da9b6545a295d53c36275c19 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Mark Eggleston <markeggleston@gcc.gnu.org>
|
|
||||||
Date: Fri, 22 Jan 2021 13:12:14 +0000
|
|
||||||
Subject: [PATCH 06/10] 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 ++
|
|
||||||
.../gfortran.dg/dec_spec_in_variable_1.f | 31 ++++
|
|
||||||
.../gfortran.dg/dec_spec_in_variable_2.f | 31 ++++
|
|
||||||
.../gfortran.dg/dec_spec_in_variable_3.f | 31 ++++
|
|
||||||
.../gfortran.dg/dec_spec_in_variable_4.f | 14 ++
|
|
||||||
.../gfortran.dg/dec_spec_in_variable_5.f | 19 +++
|
|
||||||
.../gfortran.dg/dec_spec_in_variable_6.f | 19 +++
|
|
||||||
.../gfortran.dg/dec_spec_in_variable_7.f | 15 ++
|
|
||||||
.../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 5c8c1b7981b..f7dc9d8263d 100644
|
|
||||||
--- a/gcc/fortran/decl.c
|
|
||||||
+++ b/gcc/fortran/decl.c
|
|
||||||
@@ -1213,6 +1213,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
|
|
||||||
@@ -2443,6 +2491,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
|
|
||||||
@@ -2453,7 +2530,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;
|
|
||||||
@@ -2462,11 +2539,15 @@ variable_decl (int elem)
|
|
||||||
match m;
|
|
||||||
bool t;
|
|
||||||
gfc_symbol *sym;
|
|
||||||
+ match cl_match;
|
|
||||||
+ match kind_match;
|
|
||||||
+ int overridden_kind;
|
|
||||||
char c;
|
|
||||||
|
|
||||||
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
|
|
||||||
@@ -2519,6 +2600,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)
|
|
||||||
@@ -2667,40 +2770,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
|
|
||||||
@@ -2802,6 +2877,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 25cc948699b..4a269ebb22d 100644
|
|
||||||
--- a/gcc/fortran/lang.opt
|
|
||||||
+++ b/gcc/fortran/lang.opt
|
|
||||||
@@ -493,6 +493,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 d6bd36c3a8a..edbab483b36 100644
|
|
||||||
--- a/gcc/fortran/options.c
|
|
||||||
+++ b/gcc/fortran/options.c
|
|
||||||
@@ -80,6 +80,7 @@ set_dec_flags (int value)
|
|
||||||
SET_BITFLAG (flag_dec_duplicates, 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.27.0
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
@ -1,262 +0,0 @@
|
|||||||
From bb76446db10c21860a4e19569ce3e350d8a2b59f Mon Sep 17 00:00:00 2001
|
|
||||||
From: Mark Eggleston <markeggleston@gcc.gnu.org>
|
|
||||||
Date: Fri, 22 Jan 2021 15:00:44 +0000
|
|
||||||
Subject: [PATCH 09/10] 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 ++++-
|
|
||||||
...dd_SEQUENCE_to_COMMON_block_by_default_1.f | 57 +++++++++++++++++++
|
|
||||||
...dd_SEQUENCE_to_COMMON_block_by_default_2.f | 57 +++++++++++++++++++
|
|
||||||
...dd_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 4ca2f93f2df..019c798cf09 100644
|
|
||||||
--- a/gcc/fortran/lang.opt
|
|
||||||
+++ b/gcc/fortran/lang.opt
|
|
||||||
@@ -509,6 +509,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 15079c7e95a..050f56fdc25 100644
|
|
||||||
--- a/gcc/fortran/options.c
|
|
||||||
+++ b/gcc/fortran/options.c
|
|
||||||
@@ -83,6 +83,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 07dd039f3bf..fe7d0cc5944 100644
|
|
||||||
--- a/gcc/fortran/resolve.c
|
|
||||||
+++ b/gcc/fortran/resolve.c
|
|
||||||
@@ -978,9 +978,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.27.0
|
|
||||||
|
|
@ -1,305 +0,0 @@
|
|||||||
From 9b45f3063dfd2b893e7963a4828c1b0afecdc68a Mon Sep 17 00:00:00 2001
|
|
||||||
From: Mark Eggleston <markeggleston@gcc.gnu.org>
|
|
||||||
Date: Fri, 22 Jan 2021 12:41:46 +0000
|
|
||||||
Subject: [PATCH 02/10] 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 52bd522051e..c4da248f07c 100644
|
|
||||||
--- a/gcc/fortran/lang.opt
|
|
||||||
+++ b/gcc/fortran/lang.opt
|
|
||||||
@@ -497,6 +497,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 c075d0fa0c4..4b90cb59902 100644
|
|
||||||
--- a/gcc/fortran/resolve.c
|
|
||||||
+++ b/gcc/fortran/resolve.c
|
|
||||||
@@ -3915,7 +3915,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. */
|
|
||||||
@@ -3975,6 +3974,22 @@ convert_hollerith_to_character (gfc_expr *e)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
+/* 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);
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
/* Convert to numeric and issue a warning for the conversion. */
|
|
||||||
|
|
||||||
static void
|
|
||||||
@@ -3987,6 +4002,22 @@ convert_to_numeric (gfc_expr *a, gfc_expr *b)
|
|
||||||
gfc_convert_type_warn (a, &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. */
|
|
||||||
|
|
||||||
@@ -4072,6 +4103,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);
|
|
||||||
@@ -4108,6 +4145,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;
|
|
||||||
@@ -4158,6 +4202,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;
|
|
||||||
@@ -4198,6 +4245,12 @@ resolve_operator (gfc_expr *e)
|
|
||||||
convert_hollerith_to_character (op2);
|
|
||||||
}
|
|
||||||
|
|
||||||
+ 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.27.0
|
|
||||||
|
|
@ -1,71 +0,0 @@
|
|||||||
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.15 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
|
|
||||||
@@ -117,6 +117,8 @@ static void compile_file (void);
|
|
||||||
/* True if we don't need a backend (e.g. preprocessing only). */
|
|
||||||
static bool no_backend;
|
|
||||||
|
|
||||||
+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;
|
|
||||||
@@ -2287,6 +2289,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
|
|
||||||
@@ -64,11 +64,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;
|
|
@ -1,45 +0,0 @@
|
|||||||
libgcc: Honor LDFLAGS_FOR_TARGET when linking libgcc_s
|
|
||||||
|
|
||||||
When building gcc with some specific LDFLAGS_FOR_TARGET, e.g.
|
|
||||||
LDFLAGS_FOR_TARGET=-Wl,-z,relro,-z,now
|
|
||||||
those flags propagate info linking of target shared libraries,
|
|
||||||
e.g. lib{ubsan,tsan,stdc++,quadmath,objc,lsan,itm,gphobos,gdruntime,gomp,go,gfortran,atomic,asan}.so.*
|
|
||||||
but there is one important exception, libgcc_s.so.* linking ignores it.
|
|
||||||
|
|
||||||
The following patch fixes that.
|
|
||||||
|
|
||||||
Bootstrapped/regtested on x86_64-linux with LDFLAGS_FOR_TARGET=-Wl,-z,relro,-z,now
|
|
||||||
and verified that libgcc_s.so.* is BIND_NOW when it previously wasn't, and
|
|
||||||
without any LDFLAGS_FOR_TARGET on x86_64-linux and i686-linux.
|
|
||||||
There on x86_64-linux I've verified that the libgcc_s.so.1 linking command
|
|
||||||
line for -m64 is identical except for whitespace to one without the patch,
|
|
||||||
and for -m32 multilib $(LDFLAGS) actually do supply there an extra -m32
|
|
||||||
that also repeats later in the @multilib_flags@, which should be harmless.
|
|
||||||
|
|
||||||
2021-08-04 Jakub Jelinek <jakub@redhat.com>
|
|
||||||
|
|
||||||
* config/t-slibgcc (SHLIB_LINK): Add $(LDFLAGS).
|
|
||||||
* config/t-slibgcc-vms (SHLIB_LINK): Likewise.
|
|
||||||
|
|
||||||
--- libgcc/config/t-slibgcc
|
|
||||||
+++ libgcc/config/t-slibgcc
|
|
||||||
@@ -32,7 +32,7 @@ SHLIB_INSTALL_SOLINK = $(LN_S) $(SHLIB_SONAME) \
|
|
||||||
$(DESTDIR)$(slibdir)$(SHLIB_SLIBDIR_QUAL)/$(SHLIB_SOLINK)
|
|
||||||
|
|
||||||
SHLIB_LINK = $(CC) $(LIBGCC2_CFLAGS) -shared -nodefaultlibs \
|
|
||||||
- $(SHLIB_LDFLAGS) \
|
|
||||||
+ $(SHLIB_LDFLAGS) $(LDFLAGS) \
|
|
||||||
-o $(SHLIB_DIR)/$(SHLIB_SONAME).tmp @multilib_flags@ \
|
|
||||||
$(SHLIB_OBJS) $(SHLIB_LC) && \
|
|
||||||
rm -f $(SHLIB_DIR)/$(SHLIB_SOLINK) && \
|
|
||||||
--- libgcc/config/t-slibgcc-vms
|
|
||||||
+++ libgcc/config/t-slibgcc-vms
|
|
||||||
@@ -22,7 +22,7 @@ SHLIB_LINK = \
|
|
||||||
objdump --syms $(SHLIB_OBJS) | \
|
|
||||||
$(SHLIB_SYMVEC) >> SYMVEC_$$$$.opt ; \
|
|
||||||
echo "case_sensitive=NO" >> SYMVEC_$$$$.opt; \
|
|
||||||
- $(CC) $(LIBGCC2_CFLAGS) -nodefaultlibs \
|
|
||||||
+ $(CC) $(LIBGCC2_CFLAGS) $(LDFLAGS) -nodefaultlibs \
|
|
||||||
-shared --for-linker=/noinform -o $(SHLIB_NAME) $(SHLIB_OBJS) \
|
|
||||||
--for-linker=SYMVEC_$$$$.opt \
|
|
||||||
--for-linker=gsmatch=equal,$(shlib_version)
|
|
@ -1,66 +0,0 @@
|
|||||||
c++: Optimize constinit thread_local vars [PR101786]
|
|
||||||
|
|
||||||
The paper that introduced constinit mentioned in rationale that constinit
|
|
||||||
can be used on externs as well and that it can be used to avoid the
|
|
||||||
thread_local initialization wrappers, because the standard requires that
|
|
||||||
if constinit is present on any declaration, it is also present on the
|
|
||||||
initialization declaration, even if it is in some other TU etc.
|
|
||||||
|
|
||||||
There is a small problem though, we use the tls wrappers not just if
|
|
||||||
the thread_local variable needs dynamic initialization, but also when
|
|
||||||
it has static initialization, but non-trivial destructor, as the
|
|
||||||
"dynamic initialization" in that case needs to register the destructor.
|
|
||||||
|
|
||||||
So, the following patch optimizes constinit thread_local vars only
|
|
||||||
if we can prove they will not have non-trivial destructors. That includes
|
|
||||||
the case where we have incomplete type where we don't know and need to
|
|
||||||
conservatively assume the type will have non-trivial destructor at the
|
|
||||||
initializing declaration side.
|
|
||||||
|
|
||||||
2021-08-11 Jakub Jelinek <jakub@redhat.com>
|
|
||||||
|
|
||||||
PR c++/101786
|
|
||||||
* decl2.c (var_defined_without_dynamic_init): Return true for
|
|
||||||
DECL_DECLARED_CONSTINIT_P with complete type and trivial destructor.
|
|
||||||
|
|
||||||
* g++.dg/cpp2a/constinit16.C: New test.
|
|
||||||
|
|
||||||
--- gcc/cp/decl2.c
|
|
||||||
+++ gcc/cp/decl2.c
|
|
||||||
@@ -3447,6 +3447,12 @@ set_guard (tree guard)
|
|
||||||
static bool
|
|
||||||
var_defined_without_dynamic_init (tree var)
|
|
||||||
{
|
|
||||||
+ /* constinit vars are guaranteed to not have dynamic initializer,
|
|
||||||
+ but still registering the destructor counts as dynamic initialization. */
|
|
||||||
+ if (DECL_DECLARED_CONSTINIT_P (var)
|
|
||||||
+ && COMPLETE_TYPE_P (TREE_TYPE (var))
|
|
||||||
+ && !TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TREE_TYPE (var)))
|
|
||||||
+ return true;
|
|
||||||
/* If it's defined in another TU, we can't tell. */
|
|
||||||
if (DECL_EXTERNAL (var))
|
|
||||||
return false;
|
|
||||||
--- gcc/testsuite/g++.dg/cpp2a/constinit16.C
|
|
||||||
+++ gcc/testsuite/g++.dg/cpp2a/constinit16.C
|
|
||||||
@@ -0,0 +1,21 @@
|
|
||||||
+// PR c++/101786
|
|
||||||
+// { dg-do compile { target c++20 } }
|
|
||||||
+// { dg-add-options tls }
|
|
||||||
+// { dg-require-alias "" }
|
|
||||||
+// { dg-require-effective-target tls_runtime }
|
|
||||||
+// { dg-final { scan-assembler-not "_ZTH17mythreadlocalvar1" } }
|
|
||||||
+// { dg-final { scan-assembler "_ZTH17mythreadlocalvar2" } }
|
|
||||||
+// { dg-final { scan-assembler-not "_ZTH17mythreadlocalvar3" } }
|
|
||||||
+// { dg-final { scan-assembler "_ZTH17mythreadlocalvar4" } }
|
|
||||||
+
|
|
||||||
+extern thread_local constinit int mythreadlocalvar1;
|
|
||||||
+struct S;
|
|
||||||
+extern thread_local constinit S mythreadlocalvar2;
|
|
||||||
+struct T { int t; };
|
|
||||||
+extern thread_local constinit T mythreadlocalvar3;
|
|
||||||
+struct U { int u; ~U (); };
|
|
||||||
+extern thread_local constinit U mythreadlocalvar4;
|
|
||||||
+int foo () { return mythreadlocalvar1; }
|
|
||||||
+S *bar () { return &mythreadlocalvar2; }
|
|
||||||
+T *baz () { return &mythreadlocalvar3; }
|
|
||||||
+U *qux () { return &mythreadlocalvar4; }
|
|
@ -1,176 +0,0 @@
|
|||||||
libstdc++: Remove symbols for new std::call_once implementation [PR 99341]
|
|
||||||
|
|
||||||
This removes the new symbols added for the new futex-based
|
|
||||||
std::call_once implementation. These symbols were new on trunk, so not
|
|
||||||
in any released version. However, they are already present in some
|
|
||||||
beta distro releases (Fedora Linux 34) and in Fedora Linux rawhide. This
|
|
||||||
change can be locally reverted by distros that need to keep the symbols
|
|
||||||
present until affected packages have been rebuilt.
|
|
||||||
|
|
||||||
Revert:
|
|
||||||
2021-03-12 Jonathan Wakely <jwakely@redhat.com>
|
|
||||||
|
|
||||||
PR libstdc++/99341
|
|
||||||
* config/abi/post/aarch64-linux-gnu/baseline_symbols.txt: Remove
|
|
||||||
std::once_flag symbols.
|
|
||||||
* config/abi/post/ia64-linux-gnu/baseline_symbols.txt: Likewise.
|
|
||||||
* config/abi/post/m68k-linux-gnu/baseline_symbols.txt: Likewise.
|
|
||||||
* config/abi/post/riscv64-linux-gnu/baseline_symbols.txt:
|
|
||||||
Likewise.
|
|
||||||
* config/abi/pre/gnu.ver: Likewise.
|
|
||||||
* src/c++11/mutex.cc [_GLIBCXX_HAVE_LINUX_FUTEX]
|
|
||||||
(struct __once_flag_compat): Remove.
|
|
||||||
(_ZNSt9once_flag11_M_activateEv): Remove.
|
|
||||||
(_ZNSt9once_flag9_M_finishEb): Remove.
|
|
||||||
|
|
||||||
--- libstdc++-v3/config/abi/post/aarch64-linux-gnu/baseline_symbols.txt
|
|
||||||
+++ libstdc++-v3/config/abi/post/aarch64-linux-gnu/baseline_symbols.txt
|
|
||||||
@@ -4086,6 +4086,8 @@ FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Em@@GLIBCXX
|
|
||||||
FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCXX_3.4
|
|
||||||
FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCXX_3.4
|
|
||||||
FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCXX_3.4
|
|
||||||
+FUNC:_ZNSt9once_flag11_M_activateEv@@GLIBCXX_3.4.29
|
|
||||||
+FUNC:_ZNSt9once_flag9_M_finishEb@@GLIBCXX_3.4.29
|
|
||||||
FUNC:_ZNSt9strstream3strEv@@GLIBCXX_3.4
|
|
||||||
FUNC:_ZNSt9strstream6freezeEb@@GLIBCXX_3.4
|
|
||||||
FUNC:_ZNSt9strstreamC1EPciSt13_Ios_Openmode@@GLIBCXX_3.4
|
|
||||||
--- libstdc++-v3/config/abi/post/ia64-linux-gnu/baseline_symbols.txt
|
|
||||||
+++ libstdc++-v3/config/abi/post/ia64-linux-gnu/baseline_symbols.txt
|
|
||||||
@@ -4086,6 +4086,8 @@ FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Em@@GLIBCXX
|
|
||||||
FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCXX_3.4
|
|
||||||
FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCXX_3.4
|
|
||||||
FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCXX_3.4
|
|
||||||
+FUNC:_ZNSt9once_flag11_M_activateEv@@GLIBCXX_3.4.29
|
|
||||||
+FUNC:_ZNSt9once_flag9_M_finishEb@@GLIBCXX_3.4.29
|
|
||||||
FUNC:_ZNSt9strstream3strEv@@GLIBCXX_3.4
|
|
||||||
FUNC:_ZNSt9strstream6freezeEb@@GLIBCXX_3.4
|
|
||||||
FUNC:_ZNSt9strstreamC1EPciSt13_Ios_Openmode@@GLIBCXX_3.4
|
|
||||||
--- libstdc++-v3/config/abi/post/m68k-linux-gnu/baseline_symbols.txt
|
|
||||||
+++ libstdc++-v3/config/abi/post/m68k-linux-gnu/baseline_symbols.txt
|
|
||||||
@@ -4086,6 +4086,8 @@ FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Ej@@GLIBCXX
|
|
||||||
FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCXX_3.4
|
|
||||||
FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCXX_3.4
|
|
||||||
FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCXX_3.4
|
|
||||||
+FUNC:_ZNSt9once_flag11_M_activateEv@@GLIBCXX_3.4.29
|
|
||||||
+FUNC:_ZNSt9once_flag9_M_finishEb@@GLIBCXX_3.4.29
|
|
||||||
FUNC:_ZNSt9strstream3strEv@@GLIBCXX_3.4
|
|
||||||
FUNC:_ZNSt9strstream6freezeEb@@GLIBCXX_3.4
|
|
||||||
FUNC:_ZNSt9strstreamC1EPciSt13_Ios_Openmode@@GLIBCXX_3.4
|
|
||||||
--- libstdc++-v3/config/abi/post/riscv64-linux-gnu/baseline_symbols.txt
|
|
||||||
+++ libstdc++-v3/config/abi/post/riscv64-linux-gnu/baseline_symbols.txt
|
|
||||||
@@ -4086,6 +4086,8 @@ FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Em@@GLIBCXX
|
|
||||||
FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCXX_3.4
|
|
||||||
FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCXX_3.4
|
|
||||||
FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCXX_3.4
|
|
||||||
+FUNC:_ZNSt9once_flag11_M_activateEv@@GLIBCXX_3.4.29
|
|
||||||
+FUNC:_ZNSt9once_flag9_M_finishEb@@GLIBCXX_3.4.29
|
|
||||||
FUNC:_ZNSt9strstream3strEv@@GLIBCXX_3.4
|
|
||||||
FUNC:_ZNSt9strstream6freezeEb@@GLIBCXX_3.4
|
|
||||||
FUNC:_ZNSt9strstreamC1EPciSt13_Ios_Openmode@@GLIBCXX_3.4
|
|
||||||
--- libstdc++-v3/config/abi/pre/gnu.ver
|
|
||||||
+++ libstdc++-v3/config/abi/pre/gnu.ver
|
|
||||||
@@ -2388,6 +2388,11 @@ GLIBCXX_3.4.29 {
|
|
||||||
_ZNKRSt7__cxx1118basic_stringstreamI[cw]St11char_traitsI[cw]ESaI[cw]EE3strEv;
|
|
||||||
_ZNSt7__cxx1118basic_stringstreamI[cw]St11char_traitsI[cw]ESaI[cw]EE3strEONS_12basic_stringI[cw]S2_S3_EE;
|
|
||||||
|
|
||||||
+ # std::once_flag::_M_activate()
|
|
||||||
+ _ZNSt9once_flag11_M_activateEv;
|
|
||||||
+ # std::once_flag::_M_finish(bool)
|
|
||||||
+ _ZNSt9once_flag9_M_finishEb;
|
|
||||||
+
|
|
||||||
# std::to_chars(char*, char*, [float|double|long double])
|
|
||||||
_ZSt8to_charsPcS_[def];
|
|
||||||
# std::to_chars(char*, char*, [float|double|long double], chars_format)
|
|
||||||
--- libstdc++-v3/src/c++11/mutex.cc
|
|
||||||
+++ libstdc++-v3/src/c++11/mutex.cc
|
|
||||||
@@ -26,6 +26,90 @@
|
|
||||||
|
|
||||||
#ifdef _GLIBCXX_HAS_GTHREADS
|
|
||||||
|
|
||||||
+#if defined _GLIBCXX_SHARED && ! _GLIBCXX_INLINE_VERSION
|
|
||||||
+
|
|
||||||
+#ifdef _GLIBCXX_HAVE_LINUX_FUTEX
|
|
||||||
+# include <syscall.h>
|
|
||||||
+# include <unistd.h>
|
|
||||||
+# include <limits.h>
|
|
||||||
+
|
|
||||||
+namespace std _GLIBCXX_VISIBILITY(default)
|
|
||||||
+{
|
|
||||||
+_GLIBCXX_BEGIN_NAMESPACE_VERSION
|
|
||||||
+
|
|
||||||
+struct __once_flag_compat
|
|
||||||
+{
|
|
||||||
+ enum _Bits : int { _Init = 0, _Active = 1, _Done = 2 };
|
|
||||||
+ int _M_once = 0;
|
|
||||||
+ bool _M_activate();
|
|
||||||
+ void _M_finish(bool returning) noexcept;
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+bool
|
|
||||||
+__once_flag_compat::_M_activate()
|
|
||||||
+{
|
|
||||||
+ if (__gnu_cxx::__is_single_threaded())
|
|
||||||
+ {
|
|
||||||
+ if (_M_once == _Bits::_Done)
|
|
||||||
+ return false;
|
|
||||||
+ _M_once = _Bits::_Active;
|
|
||||||
+ return true;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ while (true)
|
|
||||||
+ {
|
|
||||||
+ int expected = _Bits::_Init;
|
|
||||||
+ constexpr int active = _Bits::_Active;
|
|
||||||
+ if (__atomic_compare_exchange_n(&_M_once, &expected, active, false,
|
|
||||||
+ __ATOMIC_ACQ_REL,
|
|
||||||
+ __ATOMIC_ACQUIRE))
|
|
||||||
+ {
|
|
||||||
+ // This thread is now doing an active execution.
|
|
||||||
+ return true;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (expected == _Bits::_Done)
|
|
||||||
+ return false; // A returning execution happened, this is passive.
|
|
||||||
+
|
|
||||||
+ // Otherwise, an active execution is happening. Wait for it to finish.
|
|
||||||
+ constexpr int futex_wait = 128; // FUTEX_WAIT_PRIVATE
|
|
||||||
+ syscall (SYS_futex, &_M_once, futex_wait, expected, 0);
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+void
|
|
||||||
+std::__once_flag_compat::_M_finish(bool returning) noexcept
|
|
||||||
+{
|
|
||||||
+ const int newval = returning ? _Bits::_Done : _Bits::_Init;
|
|
||||||
+ if (__gnu_cxx::__is_single_threaded())
|
|
||||||
+ {
|
|
||||||
+ __glibcxx_assert(_M_once == _Bits::_Active);
|
|
||||||
+ _M_once = newval;
|
|
||||||
+ }
|
|
||||||
+ else
|
|
||||||
+ {
|
|
||||||
+ int prev [[maybe_unused]]
|
|
||||||
+ = __atomic_exchange_n(&_M_once, newval, __ATOMIC_RELEASE);
|
|
||||||
+ __glibcxx_assert(prev & _Bits::_Active);
|
|
||||||
+ // Wake any other threads waiting for this execution to finish.
|
|
||||||
+ constexpr int futex_wake = 129; // FUTEX_WAKE_PRIVATE
|
|
||||||
+ syscall (SYS_futex, &_M_once, futex_wake, INT_MAX);
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+#pragma GCC diagnostic push
|
|
||||||
+#pragma GCC diagnostic ignored "-Wattribute-alias"
|
|
||||||
+extern "C" bool _ZNSt9once_flag11_M_activateEv()
|
|
||||||
+ __attribute__((alias ("_ZNSt18__once_flag_compat11_M_activateEv")));
|
|
||||||
+extern "C" void _ZNSt9once_flag9_M_finishEb() noexcept
|
|
||||||
+ __attribute__((alias ("_ZNSt18__once_flag_compat9_M_finishEb")));
|
|
||||||
+#pragma GCC diagnostic pop
|
|
||||||
+
|
|
||||||
+_GLIBCXX_END_NAMESPACE_VERSION
|
|
||||||
+} // namespace std
|
|
||||||
+#endif // FUTEX
|
|
||||||
+#endif // ONCE_FLAG_COMPAT && SHARED && ! INLINE_VERSION
|
|
||||||
+
|
|
||||||
namespace std _GLIBCXX_VISIBILITY(default)
|
|
||||||
{
|
|
||||||
_GLIBCXX_BEGIN_NAMESPACE_VERSION
|
|
@ -1,197 +0,0 @@
|
|||||||
libcpp: Fix up #__VA_OPT__ handling [PR103415]
|
|
||||||
|
|
||||||
stringify_arg uses pfile->u_buff to create the string literal.
|
|
||||||
Unfortunately, paste_tokens -> _cpp_lex_direct -> lex_number -> _cpp_unaligned_alloc
|
|
||||||
can in some cases use pfile->u_buff too, which results in losing everything
|
|
||||||
prepared for the string literal until the token pasting.
|
|
||||||
|
|
||||||
The following patch fixes that by not calling paste_token during the
|
|
||||||
construction of the string literal, but doing that before. All the tokens
|
|
||||||
we are processing have been pushed into a token buffer using
|
|
||||||
tokens_buff_add_token so it is fine if we paste some of them in that buffer
|
|
||||||
(successful pasting creates a new token in that buffer), move following
|
|
||||||
tokens if any to make it contiguous, pop (throw away) the extra tokens at
|
|
||||||
the end and then do stringify_arg.
|
|
||||||
|
|
||||||
Also, paste_tokens now copies over PREV_WHITE and PREV_FALLTHROUGH flags
|
|
||||||
from the original lhs token to the replacement token. Copying that way
|
|
||||||
the PREV_WHITE flag is needed for the #__VA_OPT__ handling and copying
|
|
||||||
over PREV_FALLTHROUGH fixes the new Wimplicit-fallthrough-38.c test.
|
|
||||||
|
|
||||||
2021-12-01 Jakub Jelinek <jakub@redhat.com>
|
|
||||||
|
|
||||||
PR preprocessor/103415
|
|
||||||
libcpp/
|
|
||||||
* macro.c (stringify_arg): Remove va_opt argument and va_opt handling.
|
|
||||||
(paste_tokens): On successful paste or in PREV_WHITE and
|
|
||||||
PREV_FALLTHROUGH flags from the *plhs token to the new token.
|
|
||||||
(replace_args): Adjust stringify_arg callers. For #__VA_OPT__,
|
|
||||||
perform token pasting in a separate loop before stringify_arg call.
|
|
||||||
gcc/testsuite/
|
|
||||||
* c-c++-common/cpp/va-opt-8.c: New test.
|
|
||||||
* c-c++-common/Wimplicit-fallthrough-38.c: New test.
|
|
||||||
|
|
||||||
--- libcpp/macro.c.jj
|
|
||||||
+++ libcpp/macro.c
|
|
||||||
@@ -295,7 +295,7 @@ static cpp_context *next_context (cpp_re
|
|
||||||
static const cpp_token *padding_token (cpp_reader *, const cpp_token *);
|
|
||||||
static const cpp_token *new_string_token (cpp_reader *, uchar *, unsigned int);
|
|
||||||
static const cpp_token *stringify_arg (cpp_reader *, const cpp_token **,
|
|
||||||
- unsigned int, bool);
|
|
||||||
+ unsigned int);
|
|
||||||
static void paste_all_tokens (cpp_reader *, const cpp_token *);
|
|
||||||
static bool paste_tokens (cpp_reader *, location_t,
|
|
||||||
const cpp_token **, const cpp_token *);
|
|
||||||
@@ -826,8 +826,7 @@ cpp_quote_string (uchar *dest, const uch
|
|
||||||
/* Convert a token sequence FIRST to FIRST+COUNT-1 to a single string token
|
|
||||||
according to the rules of the ISO C #-operator. */
|
|
||||||
static const cpp_token *
|
|
||||||
-stringify_arg (cpp_reader *pfile, const cpp_token **first, unsigned int count,
|
|
||||||
- bool va_opt)
|
|
||||||
+stringify_arg (cpp_reader *pfile, const cpp_token **first, unsigned int count)
|
|
||||||
{
|
|
||||||
unsigned char *dest;
|
|
||||||
unsigned int i, escape_it, backslash_count = 0;
|
|
||||||
@@ -844,24 +843,6 @@ stringify_arg (cpp_reader *pfile, const
|
|
||||||
{
|
|
||||||
const cpp_token *token = first[i];
|
|
||||||
|
|
||||||
- if (va_opt && (token->flags & PASTE_LEFT))
|
|
||||||
- {
|
|
||||||
- location_t virt_loc = pfile->invocation_location;
|
|
||||||
- const cpp_token *rhs;
|
|
||||||
- do
|
|
||||||
- {
|
|
||||||
- if (i == count)
|
|
||||||
- abort ();
|
|
||||||
- rhs = first[++i];
|
|
||||||
- if (!paste_tokens (pfile, virt_loc, &token, rhs))
|
|
||||||
- {
|
|
||||||
- --i;
|
|
||||||
- break;
|
|
||||||
- }
|
|
||||||
- }
|
|
||||||
- while (rhs->flags & PASTE_LEFT);
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
if (token->type == CPP_PADDING)
|
|
||||||
{
|
|
||||||
if (source == NULL
|
|
||||||
@@ -995,6 +976,7 @@ paste_tokens (cpp_reader *pfile, locatio
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
+ lhs->flags |= (*plhs)->flags & (PREV_WHITE | PREV_FALLTHROUGH);
|
|
||||||
*plhs = lhs;
|
|
||||||
_cpp_pop_buffer (pfile);
|
|
||||||
return true;
|
|
||||||
@@ -1937,8 +1919,7 @@ replace_args (cpp_reader *pfile, cpp_has
|
|
||||||
if (src->flags & STRINGIFY_ARG)
|
|
||||||
{
|
|
||||||
if (!arg->stringified)
|
|
||||||
- arg->stringified = stringify_arg (pfile, arg->first, arg->count,
|
|
||||||
- false);
|
|
||||||
+ arg->stringified = stringify_arg (pfile, arg->first, arg->count);
|
|
||||||
}
|
|
||||||
else if ((src->flags & PASTE_LEFT)
|
|
||||||
|| (src != macro->exp.tokens && (src[-1].flags & PASTE_LEFT)))
|
|
||||||
@@ -2065,11 +2046,46 @@ replace_args (cpp_reader *pfile, cpp_has
|
|
||||||
{
|
|
||||||
unsigned int count
|
|
||||||
= start ? paste_flag - start : tokens_buff_count (buff);
|
|
||||||
- const cpp_token *t
|
|
||||||
- = stringify_arg (pfile,
|
|
||||||
- start ? start + 1
|
|
||||||
- : (const cpp_token **) (buff->base),
|
|
||||||
- count, true);
|
|
||||||
+ const cpp_token **first
|
|
||||||
+ = start ? start + 1
|
|
||||||
+ : (const cpp_token **) (buff->base);
|
|
||||||
+ unsigned int i, j;
|
|
||||||
+
|
|
||||||
+ /* Paste any tokens that need to be pasted before calling
|
|
||||||
+ stringify_arg, because stringify_arg uses pfile->u_buff
|
|
||||||
+ which paste_tokens can use as well. */
|
|
||||||
+ for (i = 0, j = 0; i < count; i++, j++)
|
|
||||||
+ {
|
|
||||||
+ const cpp_token *token = first[i];
|
|
||||||
+
|
|
||||||
+ if (token->flags & PASTE_LEFT)
|
|
||||||
+ {
|
|
||||||
+ location_t virt_loc = pfile->invocation_location;
|
|
||||||
+ const cpp_token *rhs;
|
|
||||||
+ do
|
|
||||||
+ {
|
|
||||||
+ if (i == count)
|
|
||||||
+ abort ();
|
|
||||||
+ rhs = first[++i];
|
|
||||||
+ if (!paste_tokens (pfile, virt_loc, &token, rhs))
|
|
||||||
+ {
|
|
||||||
+ --i;
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ while (rhs->flags & PASTE_LEFT);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ first[j] = token;
|
|
||||||
+ }
|
|
||||||
+ if (j != i)
|
|
||||||
+ {
|
|
||||||
+ while (i-- != j)
|
|
||||||
+ tokens_buff_remove_last_token (buff);
|
|
||||||
+ count = j;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ const cpp_token *t = stringify_arg (pfile, first, count);
|
|
||||||
while (count--)
|
|
||||||
tokens_buff_remove_last_token (buff);
|
|
||||||
if (src->flags & PASTE_LEFT)
|
|
||||||
--- gcc/testsuite/c-c++-common/cpp/va-opt-8.c.jj
|
|
||||||
+++ gcc/testsuite/c-c++-common/cpp/va-opt-8.c
|
|
||||||
@@ -0,0 +1,18 @@
|
|
||||||
+/* PR preprocessor/103415 */
|
|
||||||
+/* { dg-do run } */
|
|
||||||
+/* { dg-options "-std=gnu99" { target c } } */
|
|
||||||
+/* { dg-options "-std=c++20" { target c++ } } */
|
|
||||||
+
|
|
||||||
+#define n(x, ...) = #__VA_OPT__(x##3)
|
|
||||||
+#define o(x, ...) #__VA_OPT__(x##__VA_ARGS__##9)
|
|
||||||
+const char *c n(1 2, 4);
|
|
||||||
+const char *d = o(5 6, 7 8);
|
|
||||||
+
|
|
||||||
+int
|
|
||||||
+main ()
|
|
||||||
+{
|
|
||||||
+ if (__builtin_strcmp (c, "1 23")
|
|
||||||
+ || __builtin_strcmp (d, "5 67 89"))
|
|
||||||
+ __builtin_abort ();
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
--- gcc/testsuite/c-c++-common/Wimplicit-fallthrough-38.c.jj
|
|
||||||
+++ gcc/testsuite/c-c++-common/Wimplicit-fallthrough-38.c
|
|
||||||
@@ -0,0 +1,24 @@
|
|
||||||
+/* { dg-do compile } */
|
|
||||||
+/* { dg-options "-Wimplicit-fallthrough=3" } */
|
|
||||||
+
|
|
||||||
+#define FOO \
|
|
||||||
+int \
|
|
||||||
+foo (int a) \
|
|
||||||
+{ \
|
|
||||||
+ switch (a) \
|
|
||||||
+ { \
|
|
||||||
+ case 1: \
|
|
||||||
+ ++a; \
|
|
||||||
+ /* FALLTHRU */ \
|
|
||||||
+ case 2: \
|
|
||||||
+ ++a; \
|
|
||||||
+ /* FALLTHRU */ \
|
|
||||||
+ ca##se 3: \
|
|
||||||
+ ++a; \
|
|
||||||
+ default: \
|
|
||||||
+ break; \
|
|
||||||
+ } \
|
|
||||||
+ return a; \
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+FOO
|
|
@ -1,307 +0,0 @@
|
|||||||
c++: Add C++20 #__VA_OPT__ support
|
|
||||||
|
|
||||||
The following patch implements C++20 # __VA_OPT__ (...) support.
|
|
||||||
Testcases cover what I came up with myself and what LLVM has for #__VA_OPT__
|
|
||||||
in its testsuite and the string literals are identical between the two
|
|
||||||
compilers on the va-opt-5.c testcase.
|
|
||||||
|
|
||||||
2021-08-17 Jakub Jelinek <jakub@redhat.com>
|
|
||||||
|
|
||||||
libcpp/
|
|
||||||
* macro.c (vaopt_state): Add m_stringify member.
|
|
||||||
(vaopt_state::vaopt_state): Initialize it.
|
|
||||||
(vaopt_state::update): Overwrite it.
|
|
||||||
(vaopt_state::stringify): New method.
|
|
||||||
(stringify_arg): Replace arg argument with first, count arguments
|
|
||||||
and add va_opt argument. Use first instead of arg->first and
|
|
||||||
count instead of arg->count, for va_opt add paste_tokens handling.
|
|
||||||
(paste_tokens): Fix up len calculation. Don't spell rhs twice,
|
|
||||||
instead use %.*s to supply lhs and rhs spelling lengths. Don't call
|
|
||||||
_cpp_backup_tokens here.
|
|
||||||
(paste_all_tokens): Call it here instead.
|
|
||||||
(replace_args): Adjust stringify_arg caller. For vaopt_state::END
|
|
||||||
if stringify is true handle __VA_OPT__ stringification.
|
|
||||||
(create_iso_definition): Handle # __VA_OPT__ similarly to # macro_arg.
|
|
||||||
gcc/testsuite/
|
|
||||||
* c-c++-common/cpp/va-opt-5.c: New test.
|
|
||||||
* c-c++-common/cpp/va-opt-6.c: New test.
|
|
||||||
|
|
||||||
--- libcpp/macro.c
|
|
||||||
+++ libcpp/macro.c
|
|
||||||
@@ -118,6 +118,7 @@ class vaopt_state {
|
|
||||||
m_arg (arg),
|
|
||||||
m_variadic (is_variadic),
|
|
||||||
m_last_was_paste (false),
|
|
||||||
+ m_stringify (false),
|
|
||||||
m_state (0),
|
|
||||||
m_paste_location (0),
|
|
||||||
m_location (0),
|
|
||||||
@@ -145,6 +146,7 @@ class vaopt_state {
|
|
||||||
}
|
|
||||||
++m_state;
|
|
||||||
m_location = token->src_loc;
|
|
||||||
+ m_stringify = (token->flags & STRINGIFY_ARG) != 0;
|
|
||||||
return BEGIN;
|
|
||||||
}
|
|
||||||
else if (m_state == 1)
|
|
||||||
@@ -234,6 +236,12 @@ class vaopt_state {
|
|
||||||
return m_state == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
+ /* Return true for # __VA_OPT__. */
|
|
||||||
+ bool stringify () const
|
|
||||||
+ {
|
|
||||||
+ return m_stringify;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
private:
|
|
||||||
|
|
||||||
/* The cpp_reader. */
|
|
||||||
@@ -247,6 +255,8 @@ class vaopt_state {
|
|
||||||
/* If true, the previous token was ##. This is used to detect when
|
|
||||||
a paste occurs at the end of the sequence. */
|
|
||||||
bool m_last_was_paste;
|
|
||||||
+ /* True for #__VA_OPT__. */
|
|
||||||
+ bool m_stringify;
|
|
||||||
|
|
||||||
/* The state variable:
|
|
||||||
0 means not parsing
|
|
||||||
@@ -284,7 +294,8 @@ static _cpp_buff *collect_args (cpp_read
|
|
||||||
static cpp_context *next_context (cpp_reader *);
|
|
||||||
static const cpp_token *padding_token (cpp_reader *, const cpp_token *);
|
|
||||||
static const cpp_token *new_string_token (cpp_reader *, uchar *, unsigned int);
|
|
||||||
-static const cpp_token *stringify_arg (cpp_reader *, macro_arg *);
|
|
||||||
+static const cpp_token *stringify_arg (cpp_reader *, const cpp_token **,
|
|
||||||
+ unsigned int, bool);
|
|
||||||
static void paste_all_tokens (cpp_reader *, const cpp_token *);
|
|
||||||
static bool paste_tokens (cpp_reader *, location_t,
|
|
||||||
const cpp_token **, const cpp_token *);
|
|
||||||
@@ -812,10 +823,11 @@ cpp_quote_string (uchar *dest, const uch
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
-/* Convert a token sequence ARG to a single string token according to
|
|
||||||
- the rules of the ISO C #-operator. */
|
|
||||||
+/* Convert a token sequence FIRST to FIRST+COUNT-1 to a single string token
|
|
||||||
+ according to the rules of the ISO C #-operator. */
|
|
||||||
static const cpp_token *
|
|
||||||
-stringify_arg (cpp_reader *pfile, macro_arg *arg)
|
|
||||||
+stringify_arg (cpp_reader *pfile, const cpp_token **first, unsigned int count,
|
|
||||||
+ bool va_opt)
|
|
||||||
{
|
|
||||||
unsigned char *dest;
|
|
||||||
unsigned int i, escape_it, backslash_count = 0;
|
|
||||||
@@ -828,9 +840,27 @@ stringify_arg (cpp_reader *pfile, macro_
|
|
||||||
*dest++ = '"';
|
|
||||||
|
|
||||||
/* Loop, reading in the argument's tokens. */
|
|
||||||
- for (i = 0; i < arg->count; i++)
|
|
||||||
+ for (i = 0; i < count; i++)
|
|
||||||
{
|
|
||||||
- const cpp_token *token = arg->first[i];
|
|
||||||
+ const cpp_token *token = first[i];
|
|
||||||
+
|
|
||||||
+ if (va_opt && (token->flags & PASTE_LEFT))
|
|
||||||
+ {
|
|
||||||
+ location_t virt_loc = pfile->invocation_location;
|
|
||||||
+ const cpp_token *rhs;
|
|
||||||
+ do
|
|
||||||
+ {
|
|
||||||
+ if (i == count)
|
|
||||||
+ abort ();
|
|
||||||
+ rhs = first[++i];
|
|
||||||
+ if (!paste_tokens (pfile, virt_loc, &token, rhs))
|
|
||||||
+ {
|
|
||||||
+ --i;
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ while (rhs->flags & PASTE_LEFT);
|
|
||||||
+ }
|
|
||||||
|
|
||||||
if (token->type == CPP_PADDING)
|
|
||||||
{
|
|
||||||
@@ -917,7 +947,7 @@ paste_tokens (cpp_reader *pfile, locatio
|
|
||||||
cpp_token *lhs;
|
|
||||||
unsigned int len;
|
|
||||||
|
|
||||||
- len = cpp_token_len (*plhs) + cpp_token_len (rhs) + 1;
|
|
||||||
+ len = cpp_token_len (*plhs) + cpp_token_len (rhs) + 2;
|
|
||||||
buf = (unsigned char *) alloca (len);
|
|
||||||
end = lhsend = cpp_spell_token (pfile, *plhs, buf, true);
|
|
||||||
|
|
||||||
@@ -943,8 +973,10 @@ paste_tokens (cpp_reader *pfile, locatio
|
|
||||||
location_t saved_loc = lhs->src_loc;
|
|
||||||
|
|
||||||
_cpp_pop_buffer (pfile);
|
|
||||||
- _cpp_backup_tokens (pfile, 1);
|
|
||||||
- *lhsend = '\0';
|
|
||||||
+
|
|
||||||
+ unsigned char *rhsstart = lhsend;
|
|
||||||
+ if ((*plhs)->type == CPP_DIV && rhs->type != CPP_EQ)
|
|
||||||
+ rhsstart++;
|
|
||||||
|
|
||||||
/* We have to remove the PASTE_LEFT flag from the old lhs, but
|
|
||||||
we want to keep the new location. */
|
|
||||||
@@ -956,8 +988,10 @@ paste_tokens (cpp_reader *pfile, locatio
|
|
||||||
/* Mandatory error for all apart from assembler. */
|
|
||||||
if (CPP_OPTION (pfile, lang) != CLK_ASM)
|
|
||||||
cpp_error_with_line (pfile, CPP_DL_ERROR, location, 0,
|
|
||||||
- "pasting \"%s\" and \"%s\" does not give a valid preprocessing token",
|
|
||||||
- buf, cpp_token_as_text (pfile, rhs));
|
|
||||||
+ "pasting \"%.*s\" and \"%.*s\" does not give "
|
|
||||||
+ "a valid preprocessing token",
|
|
||||||
+ (int) (lhsend - buf), buf,
|
|
||||||
+ (int) (end - rhsstart), rhsstart);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1033,7 +1067,10 @@ paste_all_tokens (cpp_reader *pfile, con
|
|
||||||
abort ();
|
|
||||||
}
|
|
||||||
if (!paste_tokens (pfile, virt_loc, &lhs, rhs))
|
|
||||||
- break;
|
|
||||||
+ {
|
|
||||||
+ _cpp_backup_tokens (pfile, 1);
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
while (rhs->flags & PASTE_LEFT);
|
|
||||||
|
|
||||||
@@ -1900,7 +1937,8 @@ replace_args (cpp_reader *pfile, cpp_has
|
|
||||||
if (src->flags & STRINGIFY_ARG)
|
|
||||||
{
|
|
||||||
if (!arg->stringified)
|
|
||||||
- arg->stringified = stringify_arg (pfile, arg);
|
|
||||||
+ arg->stringified = stringify_arg (pfile, arg->first, arg->count,
|
|
||||||
+ false);
|
|
||||||
}
|
|
||||||
else if ((src->flags & PASTE_LEFT)
|
|
||||||
|| (src != macro->exp.tokens && (src[-1].flags & PASTE_LEFT)))
|
|
||||||
@@ -2023,6 +2061,24 @@ replace_args (cpp_reader *pfile, cpp_has
|
|
||||||
paste_flag = tokens_buff_last_token_ptr (buff);
|
|
||||||
}
|
|
||||||
|
|
||||||
+ if (vaopt_tracker.stringify ())
|
|
||||||
+ {
|
|
||||||
+ unsigned int count
|
|
||||||
+ = start ? paste_flag - start : tokens_buff_count (buff);
|
|
||||||
+ const cpp_token *t
|
|
||||||
+ = stringify_arg (pfile,
|
|
||||||
+ start ? start + 1
|
|
||||||
+ : (const cpp_token **) (buff->base),
|
|
||||||
+ count, true);
|
|
||||||
+ while (count--)
|
|
||||||
+ tokens_buff_remove_last_token (buff);
|
|
||||||
+ if (src->flags & PASTE_LEFT)
|
|
||||||
+ copy_paste_flag (pfile, &t, src);
|
|
||||||
+ tokens_buff_add_token (buff, virt_locs,
|
|
||||||
+ t, t->src_loc, t->src_loc,
|
|
||||||
+ NULL, 0);
|
|
||||||
+ continue;
|
|
||||||
+ }
|
|
||||||
if (start && paste_flag == start && (*start)->flags & PASTE_LEFT)
|
|
||||||
/* If __VA_OPT__ expands to nothing (either because __VA_ARGS__
|
|
||||||
is empty or because it is __VA_OPT__() ), drop PASTE_LEFT
|
|
||||||
@@ -3584,7 +3640,10 @@ create_iso_definition (cpp_reader *pfile
|
|
||||||
function-like macros when lexing the subsequent token. */
|
|
||||||
if (macro->count > 1 && token[-1].type == CPP_HASH && macro->fun_like)
|
|
||||||
{
|
|
||||||
- if (token->type == CPP_MACRO_ARG)
|
|
||||||
+ if (token->type == CPP_MACRO_ARG
|
|
||||||
+ || (macro->variadic
|
|
||||||
+ && token->type == CPP_NAME
|
|
||||||
+ && token->val.node.node == pfile->spec_nodes.n__VA_OPT__))
|
|
||||||
{
|
|
||||||
if (token->flags & PREV_WHITE)
|
|
||||||
token->flags |= SP_PREV_WHITE;
|
|
||||||
--- gcc/testsuite/c-c++-common/cpp/va-opt-5.c
|
|
||||||
+++ gcc/testsuite/c-c++-common/cpp/va-opt-5.c
|
|
||||||
@@ -0,0 +1,67 @@
|
|
||||||
+/* { dg-do run } */
|
|
||||||
+/* { dg-options "-std=gnu99" { target c } } */
|
|
||||||
+/* { dg-options "-std=c++20" { target c++ } } */
|
|
||||||
+
|
|
||||||
+#define lparen (
|
|
||||||
+#define a0 fooa0
|
|
||||||
+#define a1 fooa1 a0
|
|
||||||
+#define a2 fooa2 a1
|
|
||||||
+#define a3 fooa3 a2
|
|
||||||
+#define a() b lparen )
|
|
||||||
+#define b() c lparen )
|
|
||||||
+#define c() d lparen )
|
|
||||||
+#define g h
|
|
||||||
+#define i(j) j
|
|
||||||
+#define f(...) #__VA_OPT__(g i(0))
|
|
||||||
+#define k(x,...) # __VA_OPT__(x) #x #__VA_OPT__(__VA_ARGS__)
|
|
||||||
+#define l(x,...) #__VA_OPT__(a1 x)
|
|
||||||
+#define m(x,...) "a()" #__VA_OPT__(a3 __VA_ARGS__ x ## __VA_ARGS__ ## x ## c a3) "a()"
|
|
||||||
+#define n(x,...) = #__VA_OPT__(a3 __VA_ARGS__ x ## __VA_ARGS__ ## x ## c a3) #x #__VA_OPT__(a0 __VA_ARGS__ x ## __VA_ARGS__ ## x ## c a0) ;
|
|
||||||
+#define o(x, ...) #__VA_OPT__(x##x x##x)
|
|
||||||
+#define p(x, ...) #__VA_OPT__(_Pragma ("foobar"))
|
|
||||||
+#define q(...) #__VA_OPT__(/* foo */x/* bar */)
|
|
||||||
+const char *v1 = f();
|
|
||||||
+const char *v2 = f(123);
|
|
||||||
+const char *v3 = k(1);
|
|
||||||
+const char *v4 = k(1, 2, 3 );
|
|
||||||
+const char *v5 = l(a());
|
|
||||||
+const char *v6 = l(a1 a(), 1);
|
|
||||||
+const char *v7 = m();
|
|
||||||
+const char *v8 = m(,);
|
|
||||||
+const char *v9 = m(,a3);
|
|
||||||
+const char *v10 = m(a3,a(),a0);
|
|
||||||
+const char *v11 n()
|
|
||||||
+const char *v12 n(,)
|
|
||||||
+const char *v13 n(,a0)
|
|
||||||
+const char *v14 n(a0, a(),a0)
|
|
||||||
+const char *v15 = o(, 0);
|
|
||||||
+const char *v16 = p(0);
|
|
||||||
+const char *v17 = p(0, 1);
|
|
||||||
+const char *v18 = q();
|
|
||||||
+const char *v19 = q(1);
|
|
||||||
+
|
|
||||||
+int
|
|
||||||
+main ()
|
|
||||||
+{
|
|
||||||
+ if (__builtin_strcmp (v1, "")
|
|
||||||
+ || __builtin_strcmp (v2, "g i(0)")
|
|
||||||
+ || __builtin_strcmp (v3, "1")
|
|
||||||
+ || __builtin_strcmp (v4, "112, 3")
|
|
||||||
+ || __builtin_strcmp (v5, "")
|
|
||||||
+ || __builtin_strcmp (v6, "a1 fooa1 fooa0 b ( )")
|
|
||||||
+ || __builtin_strcmp (v7, "a()a()")
|
|
||||||
+ || __builtin_strcmp (v8, "a()a()")
|
|
||||||
+ || __builtin_strcmp (v9, "a()a3 fooa3 fooa2 fooa1 fooa0 a3c a3a()")
|
|
||||||
+ || __builtin_strcmp (v10, "a()a3 b ( ),fooa0 a3a(),a0a3c a3a()")
|
|
||||||
+ || __builtin_strcmp (v11, "")
|
|
||||||
+ || __builtin_strcmp (v12, "")
|
|
||||||
+ || __builtin_strcmp (v13, "a3 fooa0 a0c a3a0 fooa0 a0c a0")
|
|
||||||
+ || __builtin_strcmp (v14, "a3 b ( ),fooa0 a0a(),a0a0c a3a0a0 b ( ),fooa0 a0a(),a0a0c a0")
|
|
||||||
+ || __builtin_strcmp (v15, "")
|
|
||||||
+ || __builtin_strcmp (v16, "")
|
|
||||||
+ || __builtin_strcmp (v17, "_Pragma (\"foobar\")")
|
|
||||||
+ || __builtin_strcmp (v18, "")
|
|
||||||
+ || __builtin_strcmp (v19, "x"))
|
|
||||||
+ __builtin_abort ();
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
--- gcc/testsuite/c-c++-common/cpp/va-opt-6.c
|
|
||||||
+++ gcc/testsuite/c-c++-common/cpp/va-opt-6.c
|
|
||||||
@@ -0,0 +1,17 @@
|
|
||||||
+/* { dg-do preprocess } */
|
|
||||||
+/* { dg-options "-std=gnu99" { target c } } */
|
|
||||||
+/* { dg-options "-std=c++20" { target c++ } } */
|
|
||||||
+
|
|
||||||
+#define a ""
|
|
||||||
+#define b(...) a ## #__VA_OPT__(1) /* { dg-error "pasting \"a\" and \"\"\"\" does not give a valid preprocessing token" } */
|
|
||||||
+#define c(...) a ## #__VA_OPT__(1) /* { dg-error "pasting \"a\" and \"\"1\"\" does not give a valid preprocessing token" } */
|
|
||||||
+#define d(...) #__VA_OPT__(1) ## !
|
|
||||||
+#define e(...) #__VA_OPT__(1) ## !
|
|
||||||
+#define f(...) #__VA_OPT__(. ## !)
|
|
||||||
+#define g(...) #__VA_OPT__(. ## !)
|
|
||||||
+b()
|
|
||||||
+c(1)
|
|
||||||
+d( ) /* { dg-error "pasting \"\"\"\" and \"!\" does not give a valid preprocessing token" } */
|
|
||||||
+e( 1 ) /* { dg-error "pasting \"\"1\"\" and \"!\" does not give a valid preprocessing token" } */
|
|
||||||
+f()
|
|
||||||
+g(0) /* { dg-error "pasting \".\" and \"!\" does not give a valid preprocessing token" } */
|
|
@ -1,6 +0,0 @@
|
|||||||
summary: CI Gating Plan
|
|
||||||
discover:
|
|
||||||
how: fmf
|
|
||||||
directory: tests
|
|
||||||
execute:
|
|
||||||
how: tmt
|
|
5
sources
5
sources
@ -1,4 +1,3 @@
|
|||||||
SHA512 (gcc-11.3.1-20221121.tar.xz) = c4e484b7cd8b54925cd420aa9d4a22d27ad1557b481c882e952ed65e7709cfc9c044111f2d194f06349d6510672e23b9d8c8da9f1ec070f453bb4ce74f885095
|
SHA512 (gcc-10.0.1-20200216.tar.xz) = 56507e273b00e85ed4145e80df65d9b4e4791f23e7cb5d931f85b9420cbf3a7125ba49978dc73c2987c0a6101f741dc5a60a08cb3346d4c5082400cbcfcdd008
|
||||||
SHA512 (isl-0.18.tar.bz2) = 85d0b40f4dbf14cb99d17aa07048cdcab2dc3eb527d2fbb1e84c41b2de5f351025370e57448b63b2b8a8cf8a0843a089c3263f9baee1542d5c2e1cb37ed39d94
|
SHA512 (newlib-cygwin-50e2a63b04bdd018484605fbb954fd1bd5147fa0.tar.xz) = 9ceea0b883185fe489724d54a7e909bb6ed4785fcadf80162033dc6a133e2657337175601278e4155d1f8fac275ff9c8a02572aea876166c608774c809f832e9
|
||||||
SHA512 (newlib-cygwin-50e2a63b04bdd018484605fbb954fd1bd5147fa0.tar.xz) = 002a48a7b689a81abbf16161bcaec001a842e67dfbe372e9e109092703bfc666675f16198f60ca429370e8850d564547dc505df81bc3aaca4ce6defbc014ad6c
|
|
||||||
SHA512 (nvptx-tools-5f6f343a302d620b0868edab376c00b15741e39e.tar.xz) = f6d10db94fa1570ae0f94df073fa3c73c8e5ee16d59070b53d94f7db0de8a031bc44d7f3f1852533da04b625ce758e022263855ed43cfc6867e0708d001e53c7
|
SHA512 (nvptx-tools-5f6f343a302d620b0868edab376c00b15741e39e.tar.xz) = f6d10db94fa1570ae0f94df073fa3c73c8e5ee16d59070b53d94f7db0de8a031bc44d7f3f1852533da04b625ce758e022263855ed43cfc6867e0708d001e53c7
|
||||||
|
@ -1,12 +0,0 @@
|
|||||||
summary: Test for BZ#1815504 (Regression in the line information debug)
|
|
||||||
description: |
|
|
||||||
Bug summary: Regression in the line information debug information generated by gcc
|
|
||||||
Bugzilla link: https://bugzilla.redhat.com/show_bug.cgi?id=1815504
|
|
||||||
recommend:
|
|
||||||
- gcc
|
|
||||||
- valgrind
|
|
||||||
duration: 5m
|
|
||||||
link:
|
|
||||||
- relates: https://bugzilla.redhat.com/show_bug.cgi?id=1815504
|
|
||||||
extra-summary: /tools/gcc/Regression/bz1815504-Regression-in-the-line-information-debug
|
|
||||||
extra-task: /tools/gcc/Regression/bz1815504-Regression-in-the-line-information-debug
|
|
@ -1,50 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
# vim: dict+=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
#
|
|
||||||
# runtest.sh of /tools/gcc/Regression/bz1815504-Regression-in-the-line-information-debug
|
|
||||||
# Description: Test for BZ#1815504 (Regression in the line information debug)
|
|
||||||
# Author: Alexandra Hájková <ahajkova@redhat.com>
|
|
||||||
#
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
#
|
|
||||||
# Copyright (c) 2021 Red Hat, Inc.
|
|
||||||
#
|
|
||||||
# This program 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 2 of
|
|
||||||
# the License, or (at your option) any later version.
|
|
||||||
#
|
|
||||||
# This program 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 program. If not, see http://www.gnu.org/licenses/.
|
|
||||||
#
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
# Include Beaker environment
|
|
||||||
. /usr/share/beakerlib/beakerlib.sh || exit 1
|
|
||||||
|
|
||||||
PACKAGE="gcc"
|
|
||||||
|
|
||||||
rlJournalStart
|
|
||||||
rlPhaseStartSetup
|
|
||||||
rlAssertRpm $PACKAGE
|
|
||||||
rlRun "TmpDir=\$(mktemp -d)" 0 "Creating tmp directory"
|
|
||||||
rlRun "pushd $TmpDir"
|
|
||||||
rlPhaseEnd
|
|
||||||
|
|
||||||
rlPhaseStartTest
|
|
||||||
rlRun "valgrind -q date &> log" 0
|
|
||||||
rlAssertNotGrep "Can't handle inlined call info entry with line number" log
|
|
||||||
rlPhaseEnd
|
|
||||||
|
|
||||||
rlPhaseStartCleanup
|
|
||||||
rlRun "popd"
|
|
||||||
rlRun "rm -r $TmpDir" 0 "Removing tmp directory"
|
|
||||||
rlPhaseEnd
|
|
||||||
rlJournalPrintText
|
|
||||||
rlJournalEnd
|
|
@ -1,17 +0,0 @@
|
|||||||
summary: Test for BZ#1852781 (Compiling with -flto and -g removes CET support)
|
|
||||||
description: |
|
|
||||||
Bug summary: Compiling with -flto and -g removes CET support
|
|
||||||
Bugzilla link: https://bugzilla.redhat.com/show_bug.cgi?id=1852781
|
|
||||||
contact: Alexandra Hájková <ahajkova@redhat.com>
|
|
||||||
component:
|
|
||||||
- gcc
|
|
||||||
test: ./runtest.sh
|
|
||||||
framework: beakerlib
|
|
||||||
recommend:
|
|
||||||
- gcc
|
|
||||||
- binutils
|
|
||||||
duration: 15m
|
|
||||||
link:
|
|
||||||
- relates: https://bugzilla.redhat.com/show_bug.cgi?id=1852781
|
|
||||||
extra-summary: /tools/gcc/Regression/bz1852781-Compiling-with-flto-and-g-removes-CET-support
|
|
||||||
extra-task: /tools/gcc/Regression/bz1852781-Compiling-with-flto-and-g-removes-CET-support
|
|
@ -1,55 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
# vim: dict+=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
#
|
|
||||||
# runtest.sh of /tools/gcc/Regression/bz1852781-Compiling-with-flto-and-g-removes-CET-support
|
|
||||||
# Description: Test for BZ#1852781 (Compiling with -flto and -g removes CET support)
|
|
||||||
# Author: Alexandra Hájková <ahajkova@redhat.com>
|
|
||||||
#
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
#
|
|
||||||
# Copyright (c) 2020 Red Hat, Inc.
|
|
||||||
#
|
|
||||||
# This program 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 2 of
|
|
||||||
# the License, or (at your option) any later version.
|
|
||||||
#
|
|
||||||
# This program 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 program. If not, see http://www.gnu.org/licenses/.
|
|
||||||
#
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
# Include Beaker environment
|
|
||||||
. /usr/share/beakerlib/beakerlib.sh || exit 1
|
|
||||||
|
|
||||||
PACKAGE="gcc"
|
|
||||||
TESTPROG="x"
|
|
||||||
|
|
||||||
rlJournalStart
|
|
||||||
rlPhaseStartSetup
|
|
||||||
rlAssertRpm $PACKAGE
|
|
||||||
rlRun "TmpDir=\$(mktemp -d)" 0 "Creating tmp directory"
|
|
||||||
rlRun "cp $TESTPROG.c $TmpDir"
|
|
||||||
rlRun "pushd $TmpDir"
|
|
||||||
rlPhaseEnd
|
|
||||||
|
|
||||||
rlPhaseStartTest
|
|
||||||
rlRun "gcc -flto -c -fcf-protection -g $TESTPROG.c"
|
|
||||||
rlRun "gcc -flto -Wl,-z,cet-report=error -fcf-protection -g $TESTPROG.o &> log"
|
|
||||||
rlAssertNotGrep " missing IBT and SHSTK properties" log
|
|
||||||
rlRun "readelf --wide --notes a.out | grep IBT &> log"
|
|
||||||
rlAsserGrep "IBT, SHSTK" log
|
|
||||||
rlPhaseEnd
|
|
||||||
|
|
||||||
rlPhaseStartCleanup
|
|
||||||
rlRun "popd"
|
|
||||||
rlRun "rm -r $TmpDir" 0 "Removing tmp directory"
|
|
||||||
rlPhaseEnd
|
|
||||||
rlJournalPrintText
|
|
||||||
rlJournalEnd
|
|
@ -1,8 +0,0 @@
|
|||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
int
|
|
||||||
main ()
|
|
||||||
{
|
|
||||||
printf ("hello\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,17 +0,0 @@
|
|||||||
summary: Test for BZ#1853900 (typeinfo for stdcodecvt_utf8<wchar_t, 1114111ul,)
|
|
||||||
description: |
|
|
||||||
Bug summary: typeinfo for std::codecvt_utf8<wchar_t, 1114111ul, (std::codecvt_mode)0> not found
|
|
||||||
Bugzilla link: https://bugzilla.redhat.com/show_bug.cgi?id=1853900
|
|
||||||
contact: Alexandra Hájková <ahajkova@redhat.com>
|
|
||||||
component:
|
|
||||||
- gcc
|
|
||||||
test: ./runtest.sh
|
|
||||||
framework: beakerlib
|
|
||||||
recommend:
|
|
||||||
- gcc
|
|
||||||
- gcc-c++
|
|
||||||
duration: 10m
|
|
||||||
link:
|
|
||||||
- relates: https://bugzilla.redhat.com/show_bug.cgi?id=1853900
|
|
||||||
extra-summary: /tools/gcc/Regression/bz1853900-typeinfo-for-std-codecvt-utf8-wchar-t-1114111ul
|
|
||||||
extra-task: /tools/gcc/Regression/bz1853900-typeinfo-for-std-codecvt-utf8-wchar-t-1114111ul
|
|
@ -1,52 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
# vim: dict+=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
#
|
|
||||||
# runtest.sh of /tools/gcc/Regression/bz1853900-typeinfo-for-std-codecvt-utf8-wchar-t-1114111ul
|
|
||||||
# Description: Test for BZ#1853900 (typeinfo for stdcodecvt_utf8<wchar_t, 1114111ul,)
|
|
||||||
# Author: Alexandra Hájková <ahajkova@redhat.com>
|
|
||||||
#
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
#
|
|
||||||
# Copyright (c) 2020 Red Hat, Inc.
|
|
||||||
#
|
|
||||||
# This program 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 2 of
|
|
||||||
# the License, or (at your option) any later version.
|
|
||||||
#
|
|
||||||
# This program 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 program. If not, see http://www.gnu.org/licenses/.
|
|
||||||
#
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
# Include Beaker environment
|
|
||||||
. /usr/share/beakerlib/beakerlib.sh || exit 1
|
|
||||||
|
|
||||||
PACKAGE="gcc"
|
|
||||||
TESTPROG="test.cc"
|
|
||||||
|
|
||||||
rlJournalStart
|
|
||||||
rlPhaseStartSetup
|
|
||||||
rlAssertRpm $PACKAGE
|
|
||||||
rlRun "TmpDir=\$(mktemp -d)" 0 "Creating tmp directory"
|
|
||||||
rlRun "cp $TESTPROG $TmpDir"
|
|
||||||
rlRun "pushd $TmpDir"
|
|
||||||
rlPhaseEnd
|
|
||||||
|
|
||||||
rlPhaseStartTest
|
|
||||||
rlRun "g++ -std=c++17 $TESTPROG &> log"
|
|
||||||
rlAssertNotGrep "hidden symbol " log
|
|
||||||
rlPhaseEnd
|
|
||||||
|
|
||||||
rlPhaseStartCleanup
|
|
||||||
rlRun "popd"
|
|
||||||
rlRun "rm -r $TmpDir" 0 "Removing tmp directory"
|
|
||||||
rlPhaseEnd
|
|
||||||
rlJournalPrintText
|
|
||||||
rlJournalEnd
|
|
@ -1,7 +0,0 @@
|
|||||||
#include <filesystem>
|
|
||||||
|
|
||||||
namespace fs = std::filesystem;
|
|
||||||
int main() {
|
|
||||||
fs::create_directory("sandbox");
|
|
||||||
fs::remove_all("sandbox");
|
|
||||||
}
|
|
@ -1,16 +0,0 @@
|
|||||||
summary: Test for BZ#1878841 (GOMP_parallel_loop_nonmonotonic_dynamic and)
|
|
||||||
description: |
|
|
||||||
Bug summary: GOMP_parallel_loop_nonmonotonic_dynamic and GOMP_loop_nonmonotonic_dynamic_next missing
|
|
||||||
Bugzilla link: https://bugzilla.redhat.com/show_bug.cgi?id=1878841
|
|
||||||
contact: Alexandra Hájková <ahajkova@redhat.com>
|
|
||||||
component:
|
|
||||||
- gcc
|
|
||||||
test: ./runtest.sh
|
|
||||||
framework: beakerlib
|
|
||||||
recommend:
|
|
||||||
- gcc
|
|
||||||
duration: 5m
|
|
||||||
link:
|
|
||||||
- relates: https://bugzilla.redhat.com/show_bug.cgi?id=1878841
|
|
||||||
extra-summary: /tools/gcc/Regression/bz1878841-GOMP-parallel-loop-nonmonotonic-dynamic-and
|
|
||||||
extra-task: /tools/gcc/Regression/bz1878841-GOMP-parallel-loop-nonmonotonic-dynamic-and
|
|
@ -1,52 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
# vim: dict+=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
#
|
|
||||||
# runtest.sh of /tools/gcc/Regression/bz1878841-GOMP-parallel-loop-nonmonotonic-dynamic-and
|
|
||||||
# Description: Test for BZ#1878841 (GOMP_parallel_loop_nonmonotonic_dynamic and)
|
|
||||||
# Author: Alexandra Hájková <ahajkova@redhat.com>
|
|
||||||
#
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
#
|
|
||||||
# Copyright (c) 2020 Red Hat, Inc.
|
|
||||||
#
|
|
||||||
# This program 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 2 of
|
|
||||||
# the License, or (at your option) any later version.
|
|
||||||
#
|
|
||||||
# This program 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 program. If not, see http://www.gnu.org/licenses/.
|
|
||||||
#
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
# Include Beaker environment
|
|
||||||
. /usr/share/beakerlib/beakerlib.sh || exit 1
|
|
||||||
|
|
||||||
PACKAGE="gcc"
|
|
||||||
TESTPROG="tst"
|
|
||||||
|
|
||||||
rlJournalStart
|
|
||||||
rlPhaseStartSetup
|
|
||||||
rlAssertRpm $PACKAGE
|
|
||||||
rlRun "TmpDir=\$(mktemp -d)" 0 "Creating tmp directory"
|
|
||||||
rlRun "cp $TESTPROG.c $TmpDir"
|
|
||||||
rlRun "pushd $TmpDir"
|
|
||||||
rlPhaseEnd
|
|
||||||
|
|
||||||
rlPhaseStartTest
|
|
||||||
rlRun "gcc -fopenmp $TESTPROG.c &> log"
|
|
||||||
rlAssertNotGrep "undefined reference to `GOMP_parallel_loop_nonmonotonic_dynamic`" log
|
|
||||||
rlPhaseEnd
|
|
||||||
|
|
||||||
rlPhaseStartCleanup
|
|
||||||
rlRun "popd"
|
|
||||||
rlRun "rm -r $TmpDir" 0 "Removing tmp directory"
|
|
||||||
rlPhaseEnd
|
|
||||||
rlJournalPrintText
|
|
||||||
rlJournalEnd
|
|
@ -1,6 +0,0 @@
|
|||||||
#include <omp.h>
|
|
||||||
int main ()
|
|
||||||
{
|
|
||||||
#pragma omp parallel for schedule(dynamic)
|
|
||||||
for (int i = 0; i < 10; i++);
|
|
||||||
}
|
|
@ -1,2 +0,0 @@
|
|||||||
info functions foo
|
|
||||||
q
|
|
@ -1,17 +0,0 @@
|
|||||||
summary: Test for BZ#1893340 (Variadic arguments are missing from debugging data)
|
|
||||||
description: |
|
|
||||||
Bug summary: Variadic arguments are missing from debugging data when building with -flto
|
|
||||||
Bugzilla link: https://bugzilla.redhat.com/show_bug.cgi?id=1893340
|
|
||||||
contact: Alexandra Hájková <ahajkova@redhat.com>
|
|
||||||
component:
|
|
||||||
- gcc
|
|
||||||
test: ./runtest.sh
|
|
||||||
framework: beakerlib
|
|
||||||
recommend:
|
|
||||||
- gcc
|
|
||||||
- gdb
|
|
||||||
duration: 5m
|
|
||||||
link:
|
|
||||||
- relates: https://bugzilla.redhat.com/show_bug.cgi?id=1893340
|
|
||||||
extra-summary: /tools/gcc/Regression/bz1893340-Variadic-arguments-are-missing-from-debugging-data
|
|
||||||
extra-task: /tools/gcc/Regression/bz1893340-Variadic-arguments-are-missing-from-debugging-data
|
|
@ -1,52 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
# vim: dict+=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
#
|
|
||||||
# runtest.sh of /tools/gcc/Regression/bz1893340-Variadic-arguments-are-missing-from-debugging-data
|
|
||||||
# Description: Test for BZ#1893340 (Variadic arguments are missing from debugging data)
|
|
||||||
# Author: Alexandra Hájková <ahajkova@redhat.com>
|
|
||||||
#
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
#
|
|
||||||
# Copyright (c) 2021 Red Hat, Inc.
|
|
||||||
#
|
|
||||||
# This program 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 2 of
|
|
||||||
# the License, or (at your option) any later version.
|
|
||||||
#
|
|
||||||
# This program 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 program. If not, see http://www.gnu.org/licenses/.
|
|
||||||
#
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
# Include Beaker environment
|
|
||||||
. /usr/share/beakerlib/beakerlib.sh || exit 1
|
|
||||||
|
|
||||||
PACKAGE="gcc"
|
|
||||||
|
|
||||||
rlJournalStart
|
|
||||||
rlPhaseStartSetup
|
|
||||||
rlAssertRpm $PACKAGE
|
|
||||||
rlRun "TmpDir=\$(mktemp -d)" 0 "Creating tmp directory"
|
|
||||||
rlRun "cp test.c b.gdb $TmpDir"
|
|
||||||
rlRun "pushd $TmpDir"
|
|
||||||
rlPhaseEnd
|
|
||||||
|
|
||||||
rlPhaseStartTest
|
|
||||||
rlRun "gcc -fPIC -shared -o libtest.so -O0 -g test.c"
|
|
||||||
rlRun "gdb -x b.gdb libtest.so > gdb.log"
|
|
||||||
rlAssertGrep "void foo(int, ...);" gdb.log
|
|
||||||
rlPhaseEnd
|
|
||||||
|
|
||||||
rlPhaseStartCleanup
|
|
||||||
rlRun "popd"
|
|
||||||
rlRun "rm -r $TmpDir" 0 "Removing tmp directory"
|
|
||||||
rlPhaseEnd
|
|
||||||
rlJournalPrintText
|
|
||||||
rlJournalEnd
|
|
@ -1,6 +0,0 @@
|
|||||||
#include <stdarg.h>
|
|
||||||
void foo(int args, ...) {
|
|
||||||
va_list ap;
|
|
||||||
va_start(ap, args);
|
|
||||||
va_end(ap);
|
|
||||||
}
|
|
@ -1,16 +0,0 @@
|
|||||||
summary: Test for BZ#1896093 (Compiling with -flto=auto fails if make is not)
|
|
||||||
description: |
|
|
||||||
Bug summary: Compiling with -flto=auto fails if make is not installed
|
|
||||||
Bugzilla link: https://bugzilla.redhat.com/show_bug.cgi?id=1896093
|
|
||||||
contact: Alexandra Hájková <ahajkova@redhat.com>
|
|
||||||
component:
|
|
||||||
- gcc
|
|
||||||
test: ./runtest.sh
|
|
||||||
framework: beakerlib
|
|
||||||
recommend:
|
|
||||||
- gcc
|
|
||||||
duration: 5m
|
|
||||||
link:
|
|
||||||
- relates: https://bugzilla.redhat.com/show_bug.cgi?id=1896093
|
|
||||||
extra-summary: /tools/gcc/Regression/bz1896093-Compiling-with-flto-auto-fails-if-make-is-not
|
|
||||||
extra-task: /tools/gcc/Regression/bz1896093-Compiling-with-flto-auto-fails-if-make-is-not
|
|
@ -1,56 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
# vim: dict+=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
#
|
|
||||||
# runtest.sh of /tools/gcc/Regression/bz1896093-Compiling-with-flto-auto-fails-if-make-is-not
|
|
||||||
# Description: Test for BZ#1896093 (Compiling with -flto=auto fails if make is not)
|
|
||||||
# Author: Alexandra Hájková <ahajkova@redhat.com>
|
|
||||||
#
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
#
|
|
||||||
# Copyright (c) 2020 Red Hat, Inc.
|
|
||||||
#
|
|
||||||
# This program 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 2 of
|
|
||||||
# the License, or (at your option) any later version.
|
|
||||||
#
|
|
||||||
# This program 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 program. If not, see http://www.gnu.org/licenses/.
|
|
||||||
#
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
# Include Beaker environment
|
|
||||||
. /usr/share/beakerlib/beakerlib.sh || exit 1
|
|
||||||
|
|
||||||
PACKAGE="gcc"
|
|
||||||
|
|
||||||
rlJournalStart
|
|
||||||
rlPhaseStartSetup
|
|
||||||
MAKE_WAS_PRESENT=false
|
|
||||||
rpm -q make &>/dev/null && MAKE_WAS_PRESENT=true
|
|
||||||
rlAssertRpm $PACKAGE
|
|
||||||
rlRun "TmpDir=\$(mktemp -d)" 0 "Creating tmp directory"
|
|
||||||
rlRun "pushd $TmpDir"
|
|
||||||
rlRun "rpm -e --nodeps make" 0,1
|
|
||||||
rlPhaseEnd
|
|
||||||
|
|
||||||
rlPhaseStartTest
|
|
||||||
echo "void main() { }" | gcc -x c -flto=auto - &> log
|
|
||||||
rlAssertNotGrep "lto-wrapper: fatal error: execvp: No such file or directory" log
|
|
||||||
rlPhaseEnd
|
|
||||||
|
|
||||||
rlPhaseStartCleanup
|
|
||||||
if $MAKE_WAS_PRESENT; then
|
|
||||||
rpm -q make &>/dev/null || rlRun "yum -y install make"
|
|
||||||
fi
|
|
||||||
rlRun "popd"
|
|
||||||
rlRun "rm -r $TmpDir" 0 "Removing tmp directory"
|
|
||||||
rlPhaseEnd
|
|
||||||
rlJournalPrintText
|
|
||||||
rlJournalEnd
|
|
@ -1,5 +0,0 @@
|
|||||||
program test_allocated
|
|
||||||
integer :: i = 4
|
|
||||||
real(4), allocatable :: x(:)
|
|
||||||
if (.not. allocated(x)) allocate(x(i))
|
|
||||||
end program test_allocated
|
|
@ -1,17 +0,0 @@
|
|||||||
summary: Test for BZ#1927579 (libgfortran seems to be missing)
|
|
||||||
description: |
|
|
||||||
Bug summary: libgfortran seems to be missing _gfortran_os_error_at
|
|
||||||
Bugzilla link: https://bugzilla.redhat.com/show_bug.cgi?id=1927579
|
|
||||||
contact: Alexandra Hájková <ahajkova@redhat.com>
|
|
||||||
component:
|
|
||||||
- gcc
|
|
||||||
test: ./runtest.sh
|
|
||||||
framework: beakerlib
|
|
||||||
recommend:
|
|
||||||
- gcc
|
|
||||||
- gcc-gfortran
|
|
||||||
duration: 5m
|
|
||||||
link:
|
|
||||||
- relates: https://bugzilla.redhat.com/show_bug.cgi?id=1927579
|
|
||||||
extra-summary: /tools/gcc/Regression/bz1927579-libgfortran-seems-to-be-missing
|
|
||||||
extra-task: /tools/gcc/Regression/bz1927579-libgfortran-seems-to-be-missing
|
|
@ -1,51 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
# vim: dict+=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
#
|
|
||||||
# runtest.sh of /tools/gcc/Regression/bz1927579-libgfortran-seems-to-be-missing
|
|
||||||
# Description: Test for BZ#1927579 (libgfortran seems to be missing)
|
|
||||||
# Author: Alexandra Hájková <ahajkova@redhat.com>
|
|
||||||
#
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
#
|
|
||||||
# Copyright (c) 2021 Red Hat, Inc.
|
|
||||||
#
|
|
||||||
# This program 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 2 of
|
|
||||||
# the License, or (at your option) any later version.
|
|
||||||
#
|
|
||||||
# This program 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 program. If not, see http://www.gnu.org/licenses/.
|
|
||||||
#
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
# Include Beaker environment
|
|
||||||
. /usr/share/beakerlib/beakerlib.sh || exit 1
|
|
||||||
|
|
||||||
PACKAGE="gcc"
|
|
||||||
|
|
||||||
rlJournalStart
|
|
||||||
rlPhaseStartSetup
|
|
||||||
rlAssertRpm $PACKAGE
|
|
||||||
rlRun "TmpDir=\$(mktemp -d)" 0 "Creating tmp directory"
|
|
||||||
rlRun "cp alloc1.f90 $TmpDir"
|
|
||||||
rlRun "pushd $TmpDir"
|
|
||||||
rlPhaseEnd
|
|
||||||
|
|
||||||
rlPhaseStartTest
|
|
||||||
rlRun "gfortran alloc1.f90" &> log
|
|
||||||
rlAssertNotGrep "alloc1.f90:(.text+0x131): undefined reference" log
|
|
||||||
rlPhaseEnd
|
|
||||||
|
|
||||||
rlPhaseStartCleanup
|
|
||||||
rlRun "popd"
|
|
||||||
rlRun "rm -r $TmpDir" 0 "Removing tmp directory"
|
|
||||||
rlPhaseEnd
|
|
||||||
rlJournalPrintText
|
|
||||||
rlJournalEnd
|
|
@ -1,17 +0,0 @@
|
|||||||
summary: Test for BZ#1939638 (gcc-toolset-10-libasan-devel depends on the wrong)
|
|
||||||
description: |
|
|
||||||
Bug summary: gcc-toolset-10-libasan-devel depends on the wrong libasan
|
|
||||||
Bugzilla link: https://bugzilla.redhat.com/show_bug.cgi?id=1939638
|
|
||||||
contact: Alexandra Hájková <ahajkova@redhat.com>
|
|
||||||
component:
|
|
||||||
- gcc
|
|
||||||
test: ./runtest.sh
|
|
||||||
framework: beakerlib
|
|
||||||
recommend:
|
|
||||||
- gcc
|
|
||||||
- libasan
|
|
||||||
duration: 5m
|
|
||||||
link:
|
|
||||||
- relates: https://bugzilla.redhat.com/show_bug.cgi?id=1939638
|
|
||||||
extra-summary: /tools/gcc/Regression/bz1939638-gcc-toolset-10-libasan-devel-depends-on-the-wrong
|
|
||||||
extra-task: /tools/gcc/Regression/bz1939638-gcc-toolset-10-libasan-devel-depends-on-the-wrong
|
|
@ -1,50 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
# vim: dict+=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
#
|
|
||||||
# runtest.sh of /tools/gcc/Regression/bz1939638-gcc-toolset-10-libasan-devel-depends-on-the-wrong
|
|
||||||
# Description: Test for BZ#1939638 (gcc-toolset-10-libasan-devel depends on the wrong)
|
|
||||||
# Author: Alexandra Hájková <ahajkova@redhat.com>
|
|
||||||
#
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
#
|
|
||||||
# Copyright (c) 2021 Red Hat, Inc.
|
|
||||||
#
|
|
||||||
# This program 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 2 of
|
|
||||||
# the License, or (at your option) any later version.
|
|
||||||
#
|
|
||||||
# This program 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 program. If not, see http://www.gnu.org/licenses/.
|
|
||||||
#
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
# Include Beaker environment
|
|
||||||
. /usr/share/beakerlib/beakerlib.sh || exit 1
|
|
||||||
|
|
||||||
PACKAGE="gcc"
|
|
||||||
|
|
||||||
rlJournalStart
|
|
||||||
rlPhaseStartSetup
|
|
||||||
rlAssertRpm $PACKAGE
|
|
||||||
rlRun "TmpDir=\$(mktemp -d)" 0 "Creating tmp directory"
|
|
||||||
rlRun "pushd $TmpDir"
|
|
||||||
rlPhaseEnd
|
|
||||||
|
|
||||||
rlPhaseStartTest
|
|
||||||
rlRun "echo 'int main () { return 0; }' | gcc -xc -fsanitize=address -" &> log
|
|
||||||
rlAssertNotGrep "cannot find /usr/lib64/libasan" log
|
|
||||||
rlPhaseEnd
|
|
||||||
|
|
||||||
rlPhaseStartCleanup
|
|
||||||
rlRun "popd"
|
|
||||||
rlRun "rm -r $TmpDir" 0 "Removing tmp directory"
|
|
||||||
rlPhaseEnd
|
|
||||||
rlJournalPrintText
|
|
||||||
rlJournalEnd
|
|
@ -1,16 +0,0 @@
|
|||||||
summary: Test for BZ#1960701 (Wrong-code regression starting with gcc 8.2)
|
|
||||||
description: |
|
|
||||||
Bug summary: Wrong-code regression starting with gcc 8.2
|
|
||||||
Bugzilla link: https://bugzilla.redhat.com/show_bug.cgi?id=1960701
|
|
||||||
contact: Vaclav Kadlcik <vkadlcik@redhat.com>
|
|
||||||
component:
|
|
||||||
- gcc
|
|
||||||
test: ./runtest.sh
|
|
||||||
framework: beakerlib
|
|
||||||
recommend:
|
|
||||||
- gcc-c++
|
|
||||||
duration: 15m
|
|
||||||
link:
|
|
||||||
- relates: https://bugzilla.redhat.com/show_bug.cgi?id=1960701
|
|
||||||
extra-summary: /tools/gcc/Regression/bz1960701-Wrong-code-regression-starting-with-gcc-8-2
|
|
||||||
extra-task: /tools/gcc/Regression/bz1960701-Wrong-code-regression-starting-with-gcc-8-2
|
|
@ -1,14 +0,0 @@
|
|||||||
#include <vector>
|
|
||||||
|
|
||||||
struct T {
|
|
||||||
unsigned a;
|
|
||||||
float b {8.};
|
|
||||||
};
|
|
||||||
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
T t = {1};
|
|
||||||
std::vector<T> tt = {{1}, {2}};
|
|
||||||
if (t.a != 1 || t.b != 8.0f || tt[0].a != 1 || tt[0].b != 8.0f || tt[1].a != 2 || tt[1].b != 8.0f)
|
|
||||||
__builtin_abort ();
|
|
||||||
}
|
|
@ -1,55 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# vim: dict+=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
#
|
|
||||||
# runtest.sh of /tools/gcc/Regression/bz1960701-Wrong-code-regression-starting-with-gcc-8-2
|
|
||||||
# Description: Test for BZ#1960701 (Wrong-code regression starting with gcc 8.2)
|
|
||||||
# Author: Vaclav Kadlcik <vkadlcik@redhat.com>
|
|
||||||
#
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
#
|
|
||||||
# Copyright (c) 2021 Red Hat, Inc.
|
|
||||||
#
|
|
||||||
# This program 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 2 of
|
|
||||||
# the License, or (at your option) any later version.
|
|
||||||
#
|
|
||||||
# This program 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 program. If not, see http://www.gnu.org/licenses/.
|
|
||||||
#
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
# Include Beaker environment
|
|
||||||
. /usr/share/beakerlib/beakerlib.sh || exit 1
|
|
||||||
|
|
||||||
GCC="${GCC:-$(type -P gcc)}"
|
|
||||||
PACKAGE=$(rpm --qf '%{name}\n' -qf $GCC | head -1)
|
|
||||||
PACKAGES="${PACKAGE} ${PACKAGE}-c++"
|
|
||||||
|
|
||||||
rlJournalStart
|
|
||||||
rlPhaseStartSetup
|
|
||||||
rlLogInfo "PACKAGES=$PACKAGES"
|
|
||||||
rlRun "dnf -y install $PACKAGES" 0-255
|
|
||||||
rlAssertRpm --all
|
|
||||||
rlRun "TmpDir=\$(mktemp -d)"
|
|
||||||
rlRun "cp reproducer.cc $TmpDir"
|
|
||||||
rlRun "pushd $TmpDir"
|
|
||||||
rlPhaseEnd
|
|
||||||
|
|
||||||
rlPhaseStartTest
|
|
||||||
rlRun 'g++ -o reproducer -Wall -Wextra -std=c++17 reproducer.cc'
|
|
||||||
rlRun './reproducer'
|
|
||||||
rlPhaseEnd
|
|
||||||
|
|
||||||
rlPhaseStartCleanup
|
|
||||||
rlRun 'popd'
|
|
||||||
rlRun "rm -r $TmpDir"
|
|
||||||
rlPhaseEnd
|
|
||||||
rlJournalPrintText
|
|
||||||
rlJournalEnd
|
|
@ -1,16 +0,0 @@
|
|||||||
summary: Test for BZ#1965951 (Wrong-code regression starting with gcc 8.5)
|
|
||||||
description: |
|
|
||||||
Bug summary: Wrong-code regression starting with gcc 8.5
|
|
||||||
Bugzilla link: https://bugzilla.redhat.com/show_bug.cgi?id=1965951
|
|
||||||
contact: Vaclav Kadlcik <vkadlcik@redhat.com>
|
|
||||||
component:
|
|
||||||
- gcc
|
|
||||||
test: ./runtest.sh
|
|
||||||
framework: beakerlib
|
|
||||||
recommend:
|
|
||||||
- gcc-c++
|
|
||||||
duration: 15m
|
|
||||||
link:
|
|
||||||
- relates: https://bugzilla.redhat.com/show_bug.cgi?id=1965951
|
|
||||||
extra-summary: /tools/gcc/Regression/bz1965951-Wrong-code-regression-starting-with-gcc-8-5
|
|
||||||
extra-task: /tools/gcc/Regression/bz1965951-Wrong-code-regression-starting-with-gcc-8-5
|
|
@ -1,12 +0,0 @@
|
|||||||
#include <iostream>
|
|
||||||
struct S1 { virtual ~S1() = default; };
|
|
||||||
struct S2 { virtual void f1() = 0; };
|
|
||||||
struct S3: S1, S2 {
|
|
||||||
void f1() { f2(); }
|
|
||||||
virtual void f2() = 0;
|
|
||||||
};
|
|
||||||
struct S4: S3 {
|
|
||||||
void f2() { std::cout << "called\n"; }
|
|
||||||
using S2::f1;
|
|
||||||
};
|
|
||||||
int main() { S4().f1(); }
|
|
@ -1,55 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# vim: dict+=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
#
|
|
||||||
# runtest.sh of /tools/gcc/Regression/bz1965951-Wrong-code-regression-starting-with-gcc-8-5
|
|
||||||
# Description: Test for BZ#1965951 (Wrong-code regression starting with gcc 8.5)
|
|
||||||
# Author: Vaclav Kadlcik <vkadlcik@redhat.com>
|
|
||||||
#
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
#
|
|
||||||
# Copyright (c) 2021 Red Hat, Inc.
|
|
||||||
#
|
|
||||||
# This program 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 2 of
|
|
||||||
# the License, or (at your option) any later version.
|
|
||||||
#
|
|
||||||
# This program 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 program. If not, see http://www.gnu.org/licenses/.
|
|
||||||
#
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
# Include Beaker environment
|
|
||||||
. /usr/share/beakerlib/beakerlib.sh || exit 1
|
|
||||||
|
|
||||||
GCC="${GCC:-$(type -P gcc)}"
|
|
||||||
PACKAGE=$(rpm --qf '%{name}\n' -qf $GCC | head -1)
|
|
||||||
PACKAGES="${PACKAGE} ${PACKAGE}-c++"
|
|
||||||
|
|
||||||
rlJournalStart
|
|
||||||
rlPhaseStartSetup
|
|
||||||
rlLogInfo "PACKAGES=$PACKAGES"
|
|
||||||
rlRun "dnf -y install $PACKAGES" 0-255
|
|
||||||
rlAssertRpm --all
|
|
||||||
rlRun "TmpDir=\$(mktemp -d)"
|
|
||||||
rlRun "cp reproducer.cc $TmpDir"
|
|
||||||
rlRun "pushd $TmpDir"
|
|
||||||
rlPhaseEnd
|
|
||||||
|
|
||||||
rlPhaseStartTest
|
|
||||||
rlRun 'g++ -o reproducer reproducer.cc'
|
|
||||||
rlRun './reproducer'
|
|
||||||
rlPhaseEnd
|
|
||||||
|
|
||||||
rlPhaseStartCleanup
|
|
||||||
rlRun 'popd'
|
|
||||||
rlRun "rm -r $TmpDir"
|
|
||||||
rlPhaseEnd
|
|
||||||
rlJournalPrintText
|
|
||||||
rlJournalEnd
|
|
@ -1,65 +0,0 @@
|
|||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
#
|
|
||||||
# Makefile of /tools/gcc/Sanity/smoke-test
|
|
||||||
# Description: Basic smoke test.
|
|
||||||
# Author: Marek Polacek <polacek@redhat.com>
|
|
||||||
#
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
#
|
|
||||||
# Copyright (c) 2012 Red Hat, Inc. All rights reserved.
|
|
||||||
#
|
|
||||||
# This copyrighted material is made available to anyone wishing
|
|
||||||
# to use, modify, copy, or redistribute it subject to the terms
|
|
||||||
# and conditions of the GNU General Public License version 2.
|
|
||||||
#
|
|
||||||
# This program 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 program; if not, write to the Free
|
|
||||||
# Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
|
||||||
# Boston, MA 02110-1301, USA.
|
|
||||||
#
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
export TEST=/tools/gcc/Sanity/smoke-test
|
|
||||||
export TESTVERSION=1.0
|
|
||||||
|
|
||||||
BUILT_FILES=
|
|
||||||
|
|
||||||
FILES=$(METADATA) runtest.sh Makefile PURPOSE hello.c hello.f90 hello.cpp tm.c quad.c omphello.c thr-init-2.c clear_cache.c
|
|
||||||
|
|
||||||
.PHONY: all install download clean
|
|
||||||
|
|
||||||
run: $(FILES) build
|
|
||||||
./runtest.sh
|
|
||||||
|
|
||||||
build: $(BUILT_FILES)
|
|
||||||
test -x runtest.sh || chmod a+x runtest.sh
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -f *~ $(BUILT_FILES)
|
|
||||||
|
|
||||||
|
|
||||||
include /usr/share/rhts/lib/rhts-make.include
|
|
||||||
|
|
||||||
$(METADATA): Makefile
|
|
||||||
@echo "Owner: Marek Polacek <mpolacek@redhat.com>" > $(METADATA)
|
|
||||||
@echo "Name: $(TEST)" >> $(METADATA)
|
|
||||||
@echo "TestVersion: $(TESTVERSION)" >> $(METADATA)
|
|
||||||
@echo "Path: $(TEST_DIR)" >> $(METADATA)
|
|
||||||
@echo "Description: Basic smoke test." >> $(METADATA)
|
|
||||||
@echo "Type: Sanity" >> $(METADATA)
|
|
||||||
@echo "TestTime: 10m" >> $(METADATA)
|
|
||||||
@echo "RunFor: gcc" >> $(METADATA)
|
|
||||||
@echo "RunFor: devtoolset-1.0-gcc" >> $(METADATA)
|
|
||||||
@echo "Requires: gcc gcc-c++ gcc-gfortran glibc-common glibc-devel" >> $(METADATA)
|
|
||||||
@echo "Requires: libquadmath libquadmath-devel libgomp libgcc libstdc++-devel" >> $(METADATA)
|
|
||||||
@echo "Priority: Normal" >> $(METADATA)
|
|
||||||
@echo "License: GPLv2" >> $(METADATA)
|
|
||||||
@echo "Confidential: no" >> $(METADATA)
|
|
||||||
@echo "Destructive: no" >> $(METADATA)
|
|
||||||
|
|
||||||
rhts-lint $(METADATA)
|
|
@ -1,3 +0,0 @@
|
|||||||
PURPOSE of /tools/gcc/Sanity/smoke-test
|
|
||||||
Description: Basic smoke test.
|
|
||||||
Author: Marek Polacek <polacek@redhat.com>
|
|
@ -1,7 +0,0 @@
|
|||||||
int
|
|
||||||
main (void)
|
|
||||||
{
|
|
||||||
char *mem = __builtin_alloca (40);
|
|
||||||
__builtin___clear_cache (mem, mem + 40);
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,7 +0,0 @@
|
|||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
int
|
|
||||||
main (void)
|
|
||||||
{
|
|
||||||
puts ("Hello World!");
|
|
||||||
}
|
|
@ -1,7 +0,0 @@
|
|||||||
#include <iostream>
|
|
||||||
|
|
||||||
int
|
|
||||||
main (void)
|
|
||||||
{
|
|
||||||
std::cout << "Hello, world!\n";
|
|
||||||
}
|
|
@ -1,3 +0,0 @@
|
|||||||
program hello
|
|
||||||
print *, "Hello World!"
|
|
||||||
end program hello
|
|
@ -1,22 +0,0 @@
|
|||||||
summary: Basic smoke test.
|
|
||||||
description: ''
|
|
||||||
contact:
|
|
||||||
- Marek Polacek <mpolacek@redhat.com>
|
|
||||||
component:
|
|
||||||
- gcc
|
|
||||||
test: ./runtest.sh
|
|
||||||
framework: beakerlib
|
|
||||||
recommend:
|
|
||||||
- gcc
|
|
||||||
- gcc-c++
|
|
||||||
- gcc-gfortran
|
|
||||||
- glibc-common
|
|
||||||
- glibc-devel
|
|
||||||
- libquadmath
|
|
||||||
- libquadmath-devel
|
|
||||||
- libgomp
|
|
||||||
- libgcc
|
|
||||||
- libstdc++-devel
|
|
||||||
duration: 10m
|
|
||||||
extra-summary: /tools/gcc/Sanity/smoke-test
|
|
||||||
extra-task: /tools/gcc/Sanity/smoke-test
|
|
@ -1,24 +0,0 @@
|
|||||||
#include <omp.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
int
|
|
||||||
main (void)
|
|
||||||
{
|
|
||||||
int th_id;
|
|
||||||
int nthreads;
|
|
||||||
|
|
||||||
#pragma omp parallel private(th_id)
|
|
||||||
{
|
|
||||||
th_id = omp_get_thread_num ();
|
|
||||||
printf ("Hello World from thread %d\n", th_id);
|
|
||||||
|
|
||||||
#pragma omp barrier
|
|
||||||
if (th_id == 0)
|
|
||||||
{
|
|
||||||
nthreads = omp_get_num_threads ();
|
|
||||||
printf ("There are %d threads\n", nthreads);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return EXIT_SUCCESS;
|
|
||||||
}
|
|
@ -1,38 +0,0 @@
|
|||||||
#include <quadmath.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
int
|
|
||||||
main (void)
|
|
||||||
{
|
|
||||||
__float128 r = strtoflt128 ("1.23456789", NULL);
|
|
||||||
|
|
||||||
int prec = 20;
|
|
||||||
int width = 46;
|
|
||||||
char buf[128];
|
|
||||||
|
|
||||||
r = 2.0q;
|
|
||||||
r = sqrtq (r);
|
|
||||||
int n = quadmath_snprintf (buf, sizeof buf, "%+-#*.20Qe", width, r);
|
|
||||||
if ((size_t) n < sizeof buf)
|
|
||||||
/* Prints: +1.41421356237309504880e+00 */
|
|
||||||
printf ("%s\n", buf);
|
|
||||||
quadmath_snprintf (buf, sizeof buf, "%Qa", r);
|
|
||||||
if ((size_t) n < sizeof buf)
|
|
||||||
/* Prints: 0x1.6a09e667f3bcc908b2fb1366ea96p+0 */
|
|
||||||
printf ("%s\n", buf);
|
|
||||||
n = quadmath_snprintf (NULL, 0, "%+-#46.*Qe", prec, r);
|
|
||||||
if (n > -1)
|
|
||||||
{
|
|
||||||
char *str = malloc (n + 1);
|
|
||||||
if (str)
|
|
||||||
{
|
|
||||||
quadmath_snprintf (str, n + 1, "%+-#46.*Qe", prec, r);
|
|
||||||
/* Prints: +1.41421356237309504880e+00 */
|
|
||||||
printf ("%s\n", str);
|
|
||||||
}
|
|
||||||
free (str);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,125 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
# vim: dict=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
#
|
|
||||||
# runtest.sh of /tools/gcc/Sanity/smoke-test
|
|
||||||
# Description: Basic smoke test.
|
|
||||||
# Author: Marek Polacek <polacek@redhat.com>
|
|
||||||
#
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
#
|
|
||||||
# Copyright (c) 2012 Red Hat, Inc. All rights reserved.
|
|
||||||
#
|
|
||||||
# This copyrighted material is made available to anyone wishing
|
|
||||||
# to use, modify, copy, or redistribute it subject to the terms
|
|
||||||
# and conditions of the GNU General Public License version 2.
|
|
||||||
#
|
|
||||||
# This program 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 program; if not, write to the Free
|
|
||||||
# Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
|
||||||
# Boston, MA 02110-1301, USA.
|
|
||||||
#
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
# Include Beaker environment
|
|
||||||
. /usr/share/beakerlib/beakerlib.sh || exit 1
|
|
||||||
|
|
||||||
PACKAGES=(gcc gcc-c++ gcc-gfortran glibc-common libgomp libgcc glibc-devel libstdc++ libstdc++-devel)
|
|
||||||
|
|
||||||
# Choose the compiler.
|
|
||||||
GCC=${GCC:-gcc}
|
|
||||||
GXX=${GXX:-g++}
|
|
||||||
GFORTRAN=${GFORTRAN:-gfortran}
|
|
||||||
|
|
||||||
PACKAGE=gcc
|
|
||||||
|
|
||||||
rlJournalStart
|
|
||||||
rlPhaseStartSetup
|
|
||||||
export PRI_ARCH=`rlGetPrimaryArch`
|
|
||||||
export SEC_ARCH=`rlGetSecondaryArch`
|
|
||||||
# don't assert anything under devtoolset
|
|
||||||
if type gcc | grep -q -v devtoolset
|
|
||||||
then
|
|
||||||
for p in "${PACKAGES[@]}"; do
|
|
||||||
rpm -q "$p.$PRI_ARCH" || yum install -y "$p.$PRI_ARCH"
|
|
||||||
rlAssertRpm "$p.$PRI_ARCH"
|
|
||||||
done; unset p
|
|
||||||
fi
|
|
||||||
rlLog "GCC = $GCC"
|
|
||||||
rlLog "Installed within `rpmquery -f $(which $GCC)`"
|
|
||||||
rlLog "GXX = $GXX"
|
|
||||||
rlLog "Installed within `rpmquery -f $(which $GXX)`"
|
|
||||||
rlLog "GFORTRAN = $GFORTRAN"
|
|
||||||
rlLog "Installed within `rpmquery -f $(which $GFORTRAN)`"
|
|
||||||
rlRun "TmpDir=\$(mktemp -d)" 0 "Creating tmp directory"
|
|
||||||
# We need some files.
|
|
||||||
rlRun "cp -v hello.{c,cpp,f90} tm.c quad.c thr-init-2.c clear_cache.c omphello.c $TmpDir"
|
|
||||||
rlRun "pushd $TmpDir"
|
|
||||||
rlRun "rpmquery -l libstdc++-devel.$PRI_ARCH"
|
|
||||||
test -n "$SEC_ARCH" && rpmquery "libstdc++-devel.$SEC_ARCH" && rlRun "rpmquery -l libstdc++-devel.$SEC_ARCH"
|
|
||||||
rlPhaseEnd
|
|
||||||
|
|
||||||
rlPhaseStartSetup "Showing compiler versions"
|
|
||||||
for compiler in $GCC $GXX $GFORTRAN
|
|
||||||
do
|
|
||||||
rlLog "Version of compiler: $compiler"
|
|
||||||
eval "$compiler --version 2>&1" | while read line
|
|
||||||
do
|
|
||||||
rlLog " $line"
|
|
||||||
done
|
|
||||||
done
|
|
||||||
rlPhaseEnd
|
|
||||||
|
|
||||||
rlPhaseStartTest "Compile"
|
|
||||||
rlRun "$GCC hello.c -o hello_c"
|
|
||||||
rlRun "$GXX hello.cpp -o hello_cpp"
|
|
||||||
rlRun "$GFORTRAN hello.f90 -o hello_fortran"
|
|
||||||
|
|
||||||
# TM support is GCC >=4.7 only.
|
|
||||||
$GCC -xc -O2 -std=gnu99 -fgnu-tm - <<< "int main(){}"
|
|
||||||
if test $? -eq 0; then
|
|
||||||
rlRun "$GCC -O2 -std=gnu99 -fgnu-tm tm.c -o tm"
|
|
||||||
rlRun "./tm"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Test OpenMP.
|
|
||||||
rlRun "$GCC omphello.c -O2 -std=gnu99 -fopenmp -o omp"
|
|
||||||
rlRun "./omp"
|
|
||||||
|
|
||||||
# Test __thread.
|
|
||||||
rlRun "$GCC thr-init-2.c -O2 -std=gnu99 -ftls-model=initial-exec -o thr"
|
|
||||||
rlRun "./thr"
|
|
||||||
|
|
||||||
# Now test some libquadmath stuff (__float128 support).
|
|
||||||
# libquadmath is mising on RHEL machines, usually.
|
|
||||||
test "`rpmquery --qf '%{version}-%{release}' libquadmath`" = "`rpmquery --qf '%{version}-%{release}' $GCC`"
|
|
||||||
if test $? -eq 0 -a "$GCC" = "gcc"; then
|
|
||||||
rlRun "$GCC quad.c -O2 -std=gnu99 -lquadmath -lm -o quad"
|
|
||||||
rlRun "./quad"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# And now something from libgcc, e.g. __builtin___clear_cache.
|
|
||||||
# But not on RHEL5.
|
|
||||||
if ! rlIsRHEL 5; then
|
|
||||||
rlRun "$GCC clear_cache.c -O2 -std=gnu99 -o cache"
|
|
||||||
rlRun "./cache"
|
|
||||||
fi
|
|
||||||
rlPhaseEnd
|
|
||||||
|
|
||||||
rlPhaseStartTest "Check dependant libraries"
|
|
||||||
rlRun "ldd hello_{c,cpp,fortran} &> ldd.out"
|
|
||||||
# Nothing should be linked against anything in /opt.
|
|
||||||
rlAssertNotGrep "/opt" ldd.out
|
|
||||||
rlPhaseEnd
|
|
||||||
|
|
||||||
rlPhaseStartCleanup
|
|
||||||
rlRun "popd"
|
|
||||||
rlRun "rm -r $TmpDir" 0 "Removing tmp directory"
|
|
||||||
rlPhaseEnd
|
|
||||||
rlJournalPrintText
|
|
||||||
rlJournalEnd
|
|
@ -1,24 +0,0 @@
|
|||||||
/* { dg-do run } */
|
|
||||||
/* { dg-require-effective-target tls_runtime } */
|
|
||||||
/* { dg-add-options tls } */
|
|
||||||
|
|
||||||
extern void abort() ;
|
|
||||||
|
|
||||||
static __thread int fstat ;
|
|
||||||
static __thread int fstat = 1;
|
|
||||||
|
|
||||||
int test_code(int b)
|
|
||||||
{
|
|
||||||
fstat += b ;
|
|
||||||
return fstat;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main (int ac, char *av[])
|
|
||||||
{
|
|
||||||
int a = test_code(1);
|
|
||||||
|
|
||||||
if ((a != 2) || (fstat != 2))
|
|
||||||
abort () ;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,34 +0,0 @@
|
|||||||
extern void *malloc (__SIZE_TYPE__) __attribute__((malloc,transaction_safe));
|
|
||||||
|
|
||||||
static int __attribute__((transaction_safe))
|
|
||||||
something (void)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct large { int foo[500]; };
|
|
||||||
|
|
||||||
int
|
|
||||||
main (void)
|
|
||||||
{
|
|
||||||
int *p;
|
|
||||||
struct large *lp;
|
|
||||||
|
|
||||||
__transaction_atomic {
|
|
||||||
p = malloc (sizeof (*p) * 100);
|
|
||||||
lp = malloc (sizeof (*lp) * 100);
|
|
||||||
|
|
||||||
/* No instrumentation necessary; P and LP are transaction local. */
|
|
||||||
p[5] = 123;
|
|
||||||
lp->foo[66] = 123;
|
|
||||||
|
|
||||||
if (something ())
|
|
||||||
__transaction_cancel;
|
|
||||||
}
|
|
||||||
|
|
||||||
__transaction_relaxed {
|
|
||||||
++p[5];
|
|
||||||
}
|
|
||||||
|
|
||||||
return ( (p[5] == 124) ? 0 : 1 );
|
|
||||||
}
|
|
@ -3,5 +3,5 @@
|
|||||||
git clone --depth 1 git://gcc.gnu.org/git/gcc.git gcc-dir.tmp
|
git clone --depth 1 git://gcc.gnu.org/git/gcc.git gcc-dir.tmp
|
||||||
git --git-dir=gcc-dir.tmp/.git fetch --depth 1 origin $1
|
git --git-dir=gcc-dir.tmp/.git fetch --depth 1 origin $1
|
||||||
d=`date --iso | sed 's/-//g'`
|
d=`date --iso | sed 's/-//g'`
|
||||||
git --git-dir=gcc-dir.tmp/.git archive --prefix=gcc-11.3.1-$d/ $1 | xz -9e > gcc-11.3.1-$d.tar.xz
|
git --git-dir=gcc-dir.tmp/.git archive --prefix=gcc-10.0.1-$d/ $1 | xz -9e > gcc-10.0.1-$d.tar.xz
|
||||||
rm -rf gcc-dir.tmp
|
rm -rf gcc-dir.tmp
|
||||||
|
Loading…
Reference in New Issue
Block a user