From d46c7e2c546b26d036856cf570694b832d3b1f54 Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Wed, 17 Feb 2021 05:28:09 -0800 Subject: [PATCH] c++: ICE with header-units [PR 99071] This ICE was caused by dereferencing the wrong pointer and not finding the expected thing there. Pointers are like that. PR c++/99071 gcc/cp/ * name-lookup.c (maybe_record_mergeable_decl): Deref the correct pointer. gcc/testsuite/ * g++.dg/modules/pr99071_a.H: New. * g++.dg/modules/pr99071_b.H: New. --- gcc/cp/name-lookup.c | 2 +- gcc/testsuite/g++.dg/modules/pr99071_a.H | 6 ++++++ gcc/testsuite/g++.dg/modules/pr99071_b.H | 8 ++++++++ 3 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/modules/pr99071_a.H create mode 100644 gcc/testsuite/g++.dg/modules/pr99071_b.H diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c index 5aa206d..fda987e 100644 --- a/gcc/cp/name-lookup.c +++ b/gcc/cp/name-lookup.c @@ -3525,7 +3525,7 @@ maybe_record_mergeable_decl (tree *slot, tree name, tree decl) if (!partition) { binding_slot &orig - = BINDING_VECTOR_CLUSTER (*gslot, 0).slots[BINDING_SLOT_CURRENT]; + = BINDING_VECTOR_CLUSTER (*slot, 0).slots[BINDING_SLOT_CURRENT]; if (!STAT_HACK_P (tree (orig))) orig = stat_hack (tree (orig)); diff --git a/gcc/testsuite/g++.dg/modules/pr99071_a.H b/gcc/testsuite/g++.dg/modules/pr99071_a.H new file mode 100644 index 0000000..44bc7c4 --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/pr99071_a.H @@ -0,0 +1,6 @@ +// PR 99071 ICE with global-module merging +// { dg-additional-options -fmodule-header } +// { dg-module-cmi {} } + +template +void begin (T *); diff --git a/gcc/testsuite/g++.dg/modules/pr99071_b.H b/gcc/testsuite/g++.dg/modules/pr99071_b.H new file mode 100644 index 0000000..1c773d7 --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/pr99071_b.H @@ -0,0 +1,8 @@ +// PR 99071 ICE with global-module merging +// { dg-additional-options -fmodule-header } +// { dg-module-cmi {} } + +import "pr99071_a.H"; + +template +void begin(T &); -- 2.7.4