Hello! Attached is a patch that fixes an ICE on the devel/c++-modules branch caused by a slot invalidation edge case in push_namespace.
It's been sitting around for a while and I wasn't sure if I should use the original date or not. Feel free to adjust that to the commit date if that's what it should be instead. 2020-05-15 Jeff Chapman II <jchap...@lock3software.com> gcc/cp/ * name-lookup.c (push_namespace): Fix slot invalidation related ICE when compiling with modules enabled. gcc/testsuite/ * g++.dg/modules/string-view1.C: New test. * g++.dg/modules/string-view2.C: Ditto. Please let me know if there's anything more I can do, Jeff Chapman II
From d33a239c187cb6cef1c39953c5f014bd266492de Mon Sep 17 00:00:00 2001 From: Jeff Chapman II <jchap...@lock3software.com> Date: Fri, 15 May 2020 06:37:41 -0400 Subject: [PATCH 1/1] c++: Fix push_namespace ICE with modules push_namespace was reusing an earlier find_namespace_slot result after it was invalidated by pushdecl in corner cases. 2020-05-15 Jeff Chapman II <jchap...@lock3software.com> gcc/cp/ * name-lookup.c (push_namespace): Fix slot invalidation related ICE when compiling with modules enabled. gcc/testsuite/ * g++.dg/modules/string-view1.C: New test. * g++.dg/modules/string-view2.C: Ditto. --- gcc/cp/name-lookup.c | 2 + gcc/testsuite/g++.dg/modules/string-view1.C | 6 +++ gcc/testsuite/g++.dg/modules/string-view2.C | 53 +++++++++++++++++++++ 3 files changed, 61 insertions(+) create mode 100644 gcc/testsuite/g++.dg/modules/string-view1.C create mode 100644 gcc/testsuite/g++.dg/modules/string-view2.C diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c index e9495d2a282..462f028617c 100644 --- a/gcc/cp/name-lookup.c +++ b/gcc/cp/name-lookup.c @@ -8920,6 +8920,8 @@ push_namespace (tree name, bool make_inline) { /* finish up making the namespace. */ add_decl_to_level (NAMESPACE_LEVEL (current_namespace), ns); + /* pushdecl may invalidate slot, find name again. */ + slot = find_namespace_slot (current_namespace, name, true); make_namespace_finish (ns, slot); /* Add the anon using-directive here, we don't do it in diff --git a/gcc/testsuite/g++.dg/modules/string-view1.C b/gcc/testsuite/g++.dg/modules/string-view1.C new file mode 100644 index 00000000000..dabc16a8b01 --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/string-view1.C @@ -0,0 +1,6 @@ +// { dg-additional-options "-fmodules-ts" } +module; +#include <cstdio> +#include <string_view> +export module foo; + diff --git a/gcc/testsuite/g++.dg/modules/string-view2.C b/gcc/testsuite/g++.dg/modules/string-view2.C new file mode 100644 index 00000000000..2e389eacd8f --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/string-view2.C @@ -0,0 +1,53 @@ +// { dg-additional-options "-fmodules-ts" } +// reduced from string-view1 through cvise. Broken under c++2a too. +namespace std { +typedef int a; +int b; +decltype(nullptr) c; +namespace xyz {} +__builtin_va_list d; +int n; +int e; +int f; +int g; +int h; +int i; +int j; +int k; +typedef struct l m; +typedef struct aa w; +typedef struct x o; +typedef x p; +long q; +long r; +typedef l s; +extern p ab; +void t(); +void v(); +extern p ac; +void ad(); +int ae; +int af; +extern p ag; +extern p ah; +void ai(); +void y(); +int aj; +int ak; +int al; +char am; +int an; +a ao; +int ap; +int aq; +void z(); +int ar; +int as; +void at(); +void au(); +void av(); +void aw(); +int u; +namespace zz { +} +} -- 2.27.0