From e85810fe02fb8ab850f30a174effd1080f7847bd Mon Sep 17 00:00:00 2001 From: Robert Scheck Date: Sat, 29 Jan 2022 21:39:58 +0100 Subject: [PATCH] - backport from 11.2.1-9: update from releases/gcc-11-branch (#2047296) - backport from 11.2.1-9: fix up va-opt-6.c testcase - backport from 11.2.1-8: update from releases/gcc-11-branch (#2047296) - backport from 11.2.1-7.7: do not undefine _hardened_build (#2044917) - backport from 11.2.1-7.6: update annobin plugin patch (#2030667) - backport from 11.2.1-7.5: update annobin plugin patch (#2030667) - backport from 11.2.1-7.4: update annobin plugin patch (#2030667) - backport from 11.2.1-7.3: fix dg-ice tests (#1996047) - backport from 11.2.1-7.2: update annobin plugin patch (#2030667) - backport from 11.2.1-7.1: build annobin plugin (patch by Nick Clifton) (#2030667) - backport from 11.2.1-7: update from releases/gcc-11-branch (#1996858) - backport from 11.2.1-7: fix up #__VA_OPT__ handling (PR preprocessor/103415) --- gcc-epel.spec | 146 ++++++++++++++++++++- gcc11-dg-ice-fixes.patch | 83 ++++++++++++ gcc11-pr102642.patch | 47 ------- gcc11-stringify-__VA_OPT__-2.patch | 197 +++++++++++++++++++++++++++++ gcc11-stringify-__VA_OPT__.patch | 29 ++--- sources | 2 +- 6 files changed, 435 insertions(+), 69 deletions(-) create mode 100644 gcc11-dg-ice-fixes.patch delete mode 100644 gcc11-pr102642.patch create mode 100644 gcc11-stringify-__VA_OPT__-2.patch diff --git a/gcc-epel.spec b/gcc-epel.spec index 4a1b776..f0d0dae 100644 --- a/gcc-epel.spec +++ b/gcc-epel.spec @@ -1,14 +1,14 @@ -%global DATE 20211019 -%global gitrev 0990a48aaf68b56a3737fdb290328df1da9095cc +%global DATE 20220127 +%global gitrev 2fa6e5c54e782377faa4c9c1f0e0b16db27f266c %global gcc_version 11.2.1 %global gcc_major 11 # Note, gcc_release must be integer, if you want to add suffixes to # %%{release}, append them after %%{gcc_release} on Release: line. -%global gcc_release 8 +%global gcc_release 9 %global nvptx_tools_gitrev 5f6f343a302d620b0868edab376c00b15741e39e %global newlib_cygwin_gitrev 50e2a63b04bdd018484605fbb954fd1bd5147fa0 %global _unpackaged_files_terminate_build 0 -# Hardening slows the compiler way too much. +# Hardening lets Ada/GNAT compilation fail (PIE rather PIC objects). %undefine _hardened_build %if 0%{?fedora} > 27 || 0%{?rhel} > 7 # Until annobin is fixed (#1519165). @@ -318,8 +318,9 @@ Patch12: gcc11-d-shared-libphobos.patch Patch14: gcc11-libgcc-link.patch Patch15: gcc11-pr101786.patch Patch16: gcc11-stringify-__VA_OPT__.patch -Patch17: gcc11-pr102642.patch +Patch17: gcc11-stringify-__VA_OPT__-2.patch Patch18: gcc11-Wbidi-chars.patch +Patch19: gcc11-dg-ice-fixes.patch Patch100: gcc11-fortran-fdec-duplicates.patch Patch101: gcc11-fortran-flogical-as-integer.patch @@ -843,6 +844,25 @@ NVidia PTX. OpenMP and OpenACC programs linked with -fopenmp will by default add PTX code into the binaries, which can be offloaded to NVidia PTX capable devices if available. +%package plugin-annobin +Summary: The annobin plugin for gcc, built by the installed version of gcc +Requires: gcc = %{version}-%{release} +# Starting with release 10.01 annobin fixed a bug in its configure scripts +# which prevented them from working with a built but not installed compiler +BuildRequires: annobin >= 10.01 +# Starting with release 9.93 annobin-plugin-gcc puts a copy of the sources +# in /usr/src/annobin +# FIXME: Currently the annobin-plugin-gcc subpackage only exists in Fedora. +# For RHEL-9 the annobin package does everything. +# BuildRequires: annobin-plugin-gcc +# Needed in order to be able to decompress the annobin source tarball. +BuildRequires: xz + +%description plugin-annobin +This package adds a version of the annobin plugin for gcc. This version +of the plugin is explicitly built by the same version of gcc that is installed +so that there cannot be any synchronization problems. + %prep %setup -q -n gcc-%{version}-%{DATE} -a 1 -a 2 -a 3 %patch0 -p0 -b .hack~ @@ -866,8 +886,9 @@ to NVidia PTX capable devices if available. %patch14 -p0 -b .libgcc-link~ %patch15 -p0 -b .pr101786~ %patch16 -p0 -b .stringify-__VA_OPT__~ -%patch17 -p0 -b .pr102642~ +%patch17 -p0 -b .stringify-__VA_OPT__-2~ %patch18 -p1 -b .bidi~ +%patch19 -p1 -b .ice~ %if 0%{?rhel} >= 9 %patch100 -p1 -b .fortran-fdec-duplicates~ @@ -1331,6 +1352,82 @@ done) rm -f rpm.doc/changelogs/gcc/ChangeLog.[1-9] find rpm.doc -name \*ChangeLog\* | xargs bzip2 -9 +%if 0 +# Get the annobin sources. Note these are not added to the rpm as SOURCE4 +# because if they were the build phase would try to include them as part of +# gcc itself, and this causes problems. Instead we locate the sources in +# the buildroot. They should have been put there when annobin was installed. + +pushd %{_builddir} + +%global annobin_source_dir %{_usrsrc}/annobin + +if [ -d %{annobin_source_dir} ] +then + # Unpack the sources. + echo "Unpacking annobin sources" + rm -fr annobin-* + tar xvf %{annobin_source_dir}/latest-annobin.tar.xz + + # Setting this as a local symbol because using %%global does not appear to work. + annobin_dir=$(find . -maxdepth 1 -type d -name "annobin*") + + # Now build the annobin plugin using the just built compiler. + echo "annobin directory = ${annobin_dir}" + cd ${annobin_dir} + + # Work out where this version of gcc stores its plugins. +%global ANNOBIN_GCC_PLUGIN_DIR %{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_major}/plugin + + CONFIG_ARGS="--quiet" + CONFIG_ARGS="$CONFIG_ARGS --with-gcc-plugin-dir=%{ANNOBIN_GCC_PLUGIN_DIR}" + CONFIG_ARGS="$CONFIG_ARGS --without-annocheck" + CONFIG_ARGS="$CONFIG_ARGS --without-tests" + CONFIG_ARGS="$CONFIG_ARGS --disable-rpath" + + comp_dir="%{_builddir}/gcc-%{version}-%{DATE}/obj-%{gcc_target_platform}/gcc/" + ccompiler="%{_builddir}/gcc-%{version}-%{DATE}/obj-%{gcc_target_platform}/gcc/xgcc -B $comp_dir" + cxxcompiler="%{_builddir}/gcc-%{version}-%{DATE}/obj-%{gcc_target_platform}/gcc/xg++ -B $comp_dir" + + comp_flags="%build_cflags" + comp_flags="$comp_flags -I %{_builddir}/gcc-%{version}-%{DATE}/gcc" + comp_flags="$comp_flags -I %{_builddir}/gcc-%{version}-%{DATE}/obj-%{gcc_target_platform}/gcc/" + comp_flags="$comp_flags -I %{_builddir}/gcc-%{version}-%{DATE}/obj-%{gcc_target_platform}/%{gcc_target_platform}/libstdc++-v3/include" + comp_flags="$comp_flags -I %{_builddir}/gcc-%{version}-%{DATE}/obj-%{gcc_target_platform}/%{gcc_target_platform}/libstdc++-v3/include/%{gcc_target_platform}" + comp_flags="$comp_flags -I %{_builddir}/gcc-%{version}-%{DATE}/libstdc++-v3/libsupc++" + comp_flags="$comp_flags -I %{_builddir}/gcc-%{version}-%{DATE}/include" + comp_flags="$comp_flags -I %{_builddir}/gcc-%{version}-%{DATE}/libcpp/include" + + ld_flags="%build_ldflags" + ld_flags="$ld_flags -L%{_builddir}/gcc-%{version}-%{DATE}/obj-%{gcc_target_platform}/libstdc++-v3/.libs" + ld_flags="$ld_flags -L%{_builddir}/gcc-%{version}-%{DATE}/obj-%{gcc_target_platform}/%{gcc_target_platform}/libstdc++-v3/.libs" + ld_flags="$ld_flags -L%{_builddir}/gcc-%{version}-%{DATE}/obj-%{gcc_target_platform}/%{gcc_target_platform}/libstdc++-v3/src/.libs" + ld_flags="$ld_flags -L%{_builddir}/gcc-%{version}-%{DATE}/obj-%{gcc_target_platform}/libstdc++-v3/libsupc++/.libs" + ld_flags="$ld_flags -L%{_builddir}/gcc-%{version}-%{DATE}/obj-%{gcc_target_platform}/%{gcc_target_platform}/libstdc++-v3/libsupc++/.libs" + ld_flags="$ld_flags -L%{_builddir}/gcc-%{version}-%{DATE}/obj-%{gcc_target_platform}/%{gcc_target_platform}/libgcc/.libs" + ld_flags="$ld_flags -Wl,-rpath,/usr/%{_lib}" + + # libtool works with CFLAGS but ignores LDFLAGS, so we have to combine them. + comp_flags="$comp_flags $ld_flags" + + echo "Configuring the annobin plugin" + CC="${ccompiler}" CFLAGS="${comp_flags}" \ + CXX="${cxxcompiler}" CXXFLAGS="${comp_flags}" \ + LDFLAGS="${ld_flags}" \ + ./configure ${CONFIG_ARGS} || cat config.log + + echo "Building the annobin plugin" + make + + echo "Annobin plugin build complete" +else + echo "Unable to locate annobin sources (expected to find: %{annobin_source_dir}/latest-annobin.tar.xz)" + echo "These should be provided by installing the annobin package" + exit 1 +fi +popd +%endif + %install rm -rf %{buildroot} mkdir -p %{buildroot} @@ -2127,6 +2224,22 @@ echo gcc-%{version}-%{release}.%{_arch} > $FULLPATH/rpmver ln -s ../../libexec/gcc/%{gcc_target_platform}/%{gcc_major}/liblto_plugin.so \ %{buildroot}%{_libdir}/bfd-plugins/ +%if 0 +# Rename the annobin plugin to gcc-annobin. +mkdir -p %{buildroot}%{ANNOBIN_GCC_PLUGIN_DIR} +pushd %{buildroot}%{ANNOBIN_GCC_PLUGIN_DIR} + +annobin_dir=$(find %{_builddir} -maxdepth 1 -type d -name "annobin*") +echo "annobin directory = ${annobin_dir}" + +cp ${annobin_dir}/gcc-plugin/.libs/annobin.so.0.0.0 gcc-annobin.so.0.0.0 + +rm -f gcc-annobin.so.0 gcc-annobin.so +ln -s gcc-annobin.so.0.0.0 gcc-annobin.so.0 +ln -s gcc-annobin.so.0.0.0 gcc-annobin.so +popd +%endif + # Use (Ada/GNAT|Objective-C|Objective-C++)-enabled gcc binary artifact because # the RHEL/derivative 'gcc' was built without this support and can unfortunately # not be used to build any (Ada/GNAT|Objective-C|Objective-C++) source code. As @@ -3314,7 +3427,28 @@ end %{_prefix}/%{_lib}/libgomp-plugin-nvptx.so.* %endif +%if 0 +%files plugin-annobin +%{ANNOBIN_GCC_PLUGIN_DIR}/gcc-annobin.so +%{ANNOBIN_GCC_PLUGIN_DIR}/gcc-annobin.so.0 +%{ANNOBIN_GCC_PLUGIN_DIR}/gcc-annobin.so.0.0.0 +%endif + %changelog +* Sat Jan 29 2022 Robert Scheck 11.2.1-9 +- backport from 11.2.1-9: update from releases/gcc-11-branch (#2047296) +- backport from 11.2.1-9: fix up va-opt-6.c testcase +- backport from 11.2.1-8: update from releases/gcc-11-branch (#2047296) +- backport from 11.2.1-7.7: do not undefine _hardened_build (#2044917) +- backport from 11.2.1-7.6: update annobin plugin patch (#2030667) +- backport from 11.2.1-7.5: update annobin plugin patch (#2030667) +- backport from 11.2.1-7.4: update annobin plugin patch (#2030667) +- backport from 11.2.1-7.3: fix dg-ice tests (#1996047) +- backport from 11.2.1-7.2: update annobin plugin patch (#2030667) +- backport from 11.2.1-7.1: build annobin plugin (patch by Nick Clifton) (#2030667) +- backport from 11.2.1-7: update from releases/gcc-11-branch (#1996858) +- backport from 11.2.1-7: fix up #__VA_OPT__ handling (PR preprocessor/103415) + * Wed Jan 05 2022 Robert Scheck 11.2.1-8 - disable bootstrap mode and rebuild using gcc-epel-11.2.1-7.el9 diff --git a/gcc11-dg-ice-fixes.patch b/gcc11-dg-ice-fixes.patch new file mode 100644 index 0000000..33d0bc4 --- /dev/null +++ b/gcc11-dg-ice-fixes.patch @@ -0,0 +1,83 @@ +diff --git a/gcc/testsuite/c-c++-common/goacc/kernels-decompose-ice-1.c b/gcc/testsuite/c-c++-common/goacc/kernels-decompose-ice-1.c +index 8c3884bdc00..141f089d4f8 100644 +--- a/gcc/testsuite/c-c++-common/goacc/kernels-decompose-ice-1.c ++++ b/gcc/testsuite/c-c++-common/goacc/kernels-decompose-ice-1.c +@@ -1,7 +1,7 @@ + /* Test OpenACC 'kernels' construct decomposition. */ + + /* { dg-additional-options "-fopt-info-omp-all" } */ +-/* { dg-additional-options "-fchecking --param=openacc-kernels=decompose" } */ ++/* { dg-additional-options "-fno-report-bug -fchecking --param=openacc-kernels=decompose" } */ + /* { dg-ice "TODO" } + { dg-prune-output "during GIMPLE pass: omplower" } */ + +diff --git a/gcc/testsuite/c-c++-common/goacc/kernels-decompose-ice-2.c b/gcc/testsuite/c-c++-common/goacc/kernels-decompose-ice-2.c +index 8bf60a9a509..a07e0a42116 100644 +--- a/gcc/testsuite/c-c++-common/goacc/kernels-decompose-ice-2.c ++++ b/gcc/testsuite/c-c++-common/goacc/kernels-decompose-ice-2.c +@@ -1,6 +1,6 @@ + /* Test OpenACC 'kernels' construct decomposition. */ + +-/* { dg-additional-options "-fchecking --param=openacc-kernels=decompose" } */ ++/* { dg-additional-options "-fno-report-bug -fchecking --param=openacc-kernels=decompose" } */ + /* { dg-ice "TODO" } + { dg-prune-output "during GIMPLE pass: omplower" } */ + +diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-52830.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-52830.C +index eae0d8c377b..ed37f95e865 100644 +--- a/gcc/testsuite/g++.dg/cpp0x/constexpr-52830.C ++++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-52830.C +@@ -1,6 +1,6 @@ + // PR c++/52830 + // { dg-do compile { target c++11 } } +-// { dg-additional-options "-fchecking" } ++// { dg-additional-options "-fchecking -fno-report-bug" } + // { dg-ice "comptypes" } + + template struct eif { typedef void type; }; +diff --git a/gcc/testsuite/g++.dg/cpp0x/vt-88982.C b/gcc/testsuite/g++.dg/cpp0x/vt-88982.C +index 7a868233d73..45307a63483 100644 +--- a/gcc/testsuite/g++.dg/cpp0x/vt-88982.C ++++ b/gcc/testsuite/g++.dg/cpp0x/vt-88982.C +@@ -1,6 +1,6 @@ + // PR c++/88982 + // { dg-do compile { target c++11 } } +-// { dg-additional-options "-fchecking" } ++// { dg-additional-options "-fchecking -fno-report-bug" } + // { dg-ice "tsubst_pack_expansion" } + + template struct A { +diff --git a/gcc/testsuite/g++.dg/cpp1y/auto-fn61.C b/gcc/testsuite/g++.dg/cpp1y/auto-fn61.C +index bed5ea0cfc0..cb235bf891a 100644 +--- a/gcc/testsuite/g++.dg/cpp1y/auto-fn61.C ++++ b/gcc/testsuite/g++.dg/cpp1y/auto-fn61.C +@@ -1,6 +1,6 @@ + // PR c++/88003 + // { dg-do compile { target c++14 } } +-// { dg-additional-options "-fchecking" } ++// { dg-additional-options "-fchecking -fno-report-bug" } + // { dg-ice "poplevel_class" } + + auto test() { +diff --git a/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda26.C b/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda26.C +index 0cdb400d21c..8f17cca31dd 100644 +--- a/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda26.C ++++ b/gcc/testsuite/g++.dg/cpp1z/constexpr-lambda26.C +@@ -1,6 +1,6 @@ + // PR c++/87765 + // { dg-do compile { target c++17 } } +-// { dg-additional-options "-fchecking" } ++// { dg-additional-options "-fchecking -fno-report-bug" } + // { dg-ice "cxx_eval_constant_expression" } + + template +diff --git a/libgomp/testsuite/libgomp.oacc-c-c++-common/declare-vla-kernels-decompose-ice-1.c b/libgomp/testsuite/libgomp.oacc-c-c++-common/declare-vla-kernels-decompose-ice-1.c +index 0777b612b63..53abbe2db83 100644 +--- a/libgomp/testsuite/libgomp.oacc-c-c++-common/declare-vla-kernels-decompose-ice-1.c ++++ b/libgomp/testsuite/libgomp.oacc-c-c++-common/declare-vla-kernels-decompose-ice-1.c +@@ -1,4 +1,4 @@ +-/* { dg-additional-options "--param=openacc-kernels=decompose" } */ ++/* { dg-additional-options "--param=openacc-kernels=decompose -fno-report-bug" } */ + /* Hopefully, this is the same issue as '../../../gcc/testsuite/c-c++-common/goacc/kernels-decompose-ice-1.c'. + { dg-ice "TODO" } + TODO { dg-prune-output "during GIMPLE pass: omplower" } diff --git a/gcc11-pr102642.patch b/gcc11-pr102642.patch deleted file mode 100644 index 598794b..0000000 --- a/gcc11-pr102642.patch +++ /dev/null @@ -1,47 +0,0 @@ -2021-10-11 Jakub Jelinek - - PR c++/102642 - * name-lookup.c (push_local_extern_decl_alias): Don't call - set_decl_tls_model on error_mark_node. - * parser.c (cp_parser_omp_declare_target): Likewise. - - * g++.dg/tls/pr102642.C: New test. - ---- gcc/cp/name-lookup.c.jj 2021-10-01 10:30:07.674588541 +0200 -+++ gcc/cp/name-lookup.c 2021-10-11 12:43:39.261051228 +0200 -@@ -3474,7 +3474,9 @@ push_local_extern_decl_alias (tree decl) - push_nested_namespace (ns); - alias = do_pushdecl (alias, /* hiding= */true); - pop_nested_namespace (ns); -- if (VAR_P (decl) && CP_DECL_THREAD_LOCAL_P (decl)) -+ if (VAR_P (decl) -+ && CP_DECL_THREAD_LOCAL_P (decl) -+ && alias != error_mark_node) - set_decl_tls_model (alias, DECL_TLS_MODEL (decl)); - } - } ---- gcc/cp/parser.c.jj 2021-10-09 10:14:24.043098112 +0200 -+++ gcc/cp/parser.c 2021-10-11 12:47:21.220874667 +0200 -@@ -45665,7 +45666,8 @@ cp_parser_omp_declare_target (cp_parser - if (VAR_OR_FUNCTION_DECL_P (t) - && DECL_LOCAL_DECL_P (t) - && DECL_LANG_SPECIFIC (t) -- && DECL_LOCAL_DECL_ALIAS (t)) -+ && DECL_LOCAL_DECL_ALIAS (t) -+ && DECL_LOCAL_DECL_ALIAS (t) != error_mark_node) - handle_omp_declare_target_clause (c, DECL_LOCAL_DECL_ALIAS (t), - device_type); - } ---- gcc/testsuite/g++.dg/tls/pr102642.C.jj 2021-10-11 13:00:35.889503002 +0200 -+++ gcc/testsuite/g++.dg/tls/pr102642.C 2021-10-11 13:00:20.388724721 +0200 -@@ -0,0 +1,10 @@ -+// PR c++/102642 -+// { dg-do compile { target c++11 } } -+ -+thread_local int *z; // { dg-message "previous declaration" } -+ -+void -+foo () -+{ -+ extern thread_local int z; // { dg-error "conflicting declaration" } -+} diff --git a/gcc11-stringify-__VA_OPT__-2.patch b/gcc11-stringify-__VA_OPT__-2.patch new file mode 100644 index 0000000..5874bc1 --- /dev/null +++ b/gcc11-stringify-__VA_OPT__-2.patch @@ -0,0 +1,197 @@ +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 + + 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 diff --git a/gcc11-stringify-__VA_OPT__.patch b/gcc11-stringify-__VA_OPT__.patch index 3a2a71f..101b026 100644 --- a/gcc11-stringify-__VA_OPT__.patch +++ b/gcc11-stringify-__VA_OPT__.patch @@ -66,7 +66,7 @@ gcc/testsuite/ /* The state variable: 0 means not parsing -@@ -284,7 +294,8 @@ static _cpp_buff *collect_args (cpp_reader *, const cpp_hashnode *, +@@ -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); @@ -76,7 +76,7 @@ gcc/testsuite/ static void paste_all_tokens (cpp_reader *, const cpp_token *); static bool paste_tokens (cpp_reader *, location_t, const cpp_token **, const cpp_token *); -@@ -818,10 +829,11 @@ cpp_quote_string (uchar *dest, const uchar *src, unsigned int len) +@@ -812,10 +823,11 @@ cpp_quote_string (uchar *dest, const uch return dest; } @@ -91,7 +91,7 @@ gcc/testsuite/ { unsigned char *dest; unsigned int i, escape_it, backslash_count = 0; -@@ -834,9 +846,27 @@ stringify_arg (cpp_reader *pfile, macro_arg *arg) +@@ -828,9 +840,27 @@ stringify_arg (cpp_reader *pfile, macro_ *dest++ = '"'; /* Loop, reading in the argument's tokens. */ @@ -121,7 +121,7 @@ gcc/testsuite/ if (token->type == CPP_PADDING) { -@@ -923,7 +953,7 @@ paste_tokens (cpp_reader *pfile, location_t location, +@@ -917,7 +947,7 @@ paste_tokens (cpp_reader *pfile, locatio cpp_token *lhs; unsigned int len; @@ -130,7 +130,7 @@ gcc/testsuite/ buf = (unsigned char *) alloca (len); end = lhsend = cpp_spell_token (pfile, *plhs, buf, true); -@@ -949,8 +979,10 @@ paste_tokens (cpp_reader *pfile, location_t location, +@@ -943,8 +973,10 @@ paste_tokens (cpp_reader *pfile, locatio location_t saved_loc = lhs->src_loc; _cpp_pop_buffer (pfile); @@ -143,7 +143,7 @@ gcc/testsuite/ /* We have to remove the PASTE_LEFT flag from the old lhs, but we want to keep the new location. */ -@@ -962,8 +994,10 @@ paste_tokens (cpp_reader *pfile, location_t 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, @@ -156,7 +156,7 @@ gcc/testsuite/ return false; } -@@ -1039,7 +1073,10 @@ paste_all_tokens (cpp_reader *pfile, const cpp_token *lhs) +@@ -1033,7 +1067,10 @@ paste_all_tokens (cpp_reader *pfile, con abort (); } if (!paste_tokens (pfile, virt_loc, &lhs, rhs)) @@ -168,7 +168,7 @@ gcc/testsuite/ } while (rhs->flags & PASTE_LEFT); -@@ -1906,7 +1943,8 @@ replace_args (cpp_reader *pfile, cpp_hashnode *node, cpp_macro *macro, +@@ -1900,7 +1937,8 @@ replace_args (cpp_reader *pfile, cpp_has if (src->flags & STRINGIFY_ARG) { if (!arg->stringified) @@ -178,11 +178,10 @@ gcc/testsuite/ } else if ((src->flags & PASTE_LEFT) || (src != macro->exp.tokens && (src[-1].flags & PASTE_LEFT))) -@@ -2029,7 +2067,24 @@ replace_args (cpp_reader *pfile, cpp_hashnode *node, cpp_macro *macro, +@@ -2023,6 +2061,24 @@ replace_args (cpp_reader *pfile, cpp_has paste_flag = tokens_buff_last_token_ptr (buff); } -- if (src->flags & PASTE_LEFT) + if (vaopt_tracker.stringify ()) + { + unsigned int count @@ -199,12 +198,12 @@ gcc/testsuite/ + tokens_buff_add_token (buff, virt_locs, + t, t->src_loc, t->src_loc, + NULL, 0); ++ continue; + } -+ else if (src->flags & PASTE_LEFT) - { - /* With a non-empty __VA_OPT__ on the LHS of ##, the last - token should be flagged PASTE_LEFT. */ -@@ -3585,7 +3640,10 @@ create_iso_definition (cpp_reader *pfile) + 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) { diff --git a/sources b/sources index 43c3cb0..368229a 100644 --- a/sources +++ b/sources @@ -1,4 +1,4 @@ -SHA512 (gcc-11.2.1-20211019.tar.xz) = 08c85e39d028446730372cfbe13a708f240d9a20d89429542fa5c8190a7e9bc13c6734ad068152b4644a7ae561d8c76b9633289e9b20735bbca0d034cf1eea82 +SHA512 (gcc-11.2.1-20220127.tar.xz) = da9fa3122aa15ad647e07fac27e8c59de74fa04f1846074320751f6fbfa30ac239867b6c349c4d0c08ada01722e6074a89809dd89c3e189fefdfcf16fad70498 SHA512 (isl-0.18.tar.bz2) = 85d0b40f4dbf14cb99d17aa07048cdcab2dc3eb527d2fbb1e84c41b2de5f351025370e57448b63b2b8a8cf8a0843a089c3263f9baee1542d5c2e1cb37ed39d94 SHA512 (newlib-cygwin-50e2a63b04bdd018484605fbb954fd1bd5147fa0.tar.xz) = 002a48a7b689a81abbf16161bcaec001a842e67dfbe372e9e109092703bfc666675f16198f60ca429370e8850d564547dc505df81bc3aaca4ce6defbc014ad6c SHA512 (nvptx-tools-5f6f343a302d620b0868edab376c00b15741e39e.tar.xz) = f6d10db94fa1570ae0f94df073fa3c73c8e5ee16d59070b53d94f7db0de8a031bc44d7f3f1852533da04b625ce758e022263855ed43cfc6867e0708d001e53c7