On Mon, Jan 15, 2024 at 04:04:49PM -0500, Jason Merrill wrote: > On 1/15/24 04:41, Nathaniel Shead wrote: > > While working on another bug, I noticed the ENABLE_SCOPE_CHECKING macro > > and thought to try it out. It caused selftest to ICE. This patch is a > > minimal fix to get it working again. > > > > Probably this should use a test to stop this regressing again in the > > future the next time new scope-kinds are added, but given it's dependent > > on a (almost certainly rarely-used) build-time macro I'm not sure > > exactly how you would do that? > > > > Or alternatively I could add a `sk_count` to the end of the scope kind > > list and `static_assert` that the size of the descriptor list matches? > > That sounds good. > > > (Also not sure if this would be appropriate for stage 4 or if it should > > wait till next stage 1. I suppose this fixes a regression but I suspect > > this has been broken for a very long time.) > > I think it's OK now since it doesn't affect the normal codepath. >
Thanks. Here's an updated version. Bootstrapped on x86_64-pc-linux-gnu, OK for trunk if regtesting passes? I've also built stage 1 with `-DENABLE_SCOPE_CHECKING` and verified it didn't immediately fail, but regtesting fails due to all the extra output. As an option specifically for developing GCC itself I assume that's OK. -- >8 -- The lists of scope kinds used by ENABLE_SCOPE_CHECKING don't seem to have been updated in a long while, causing ICEs and confusing output. This patch brings the list into line. Additionally, the comment on 'explicit_spec_p' says that the flag is only valid if kind is 'sk_template_parms', so we rewrite the condition to be more obviously correct here. gcc/cp/ChangeLog: * name-lookup.h (enum scope_kind): Add 'sk_count'. * name-lookup.cc (cp_binding_level_descriptor): Add missing scope kinds. Add assertion that the list is up to date. Fix handling of explicit_spec_p. Signed-off-by: Nathaniel Shead <nathanielosh...@gmail.com> --- gcc/cp/name-lookup.cc | 15 ++++++++++++--- gcc/cp/name-lookup.h | 3 ++- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/gcc/cp/name-lookup.cc b/gcc/cp/name-lookup.cc index d827d337d3b..15b5fba6297 100644 --- a/gcc/cp/name-lookup.cc +++ b/gcc/cp/name-lookup.cc @@ -4464,14 +4464,23 @@ cp_binding_level_descriptor (cp_binding_level *scope) "try-scope", "catch-scope", "for-scope", + "cond-init-scope", + "stmt-expr-scope", "function-parameter-scope", "class-scope", + "enum-scope", "namespace-scope", "template-parameter-scope", - "template-explicit-spec-scope" + "template-explicit-spec-scope", + "transaction-scope", + "openmp-scope" }; - const scope_kind kind = scope->explicit_spec_p - ? sk_template_spec : scope->kind; + static_assert (ARRAY_SIZE (scope_kind_names) == sk_count, + "must keep names aligned with scope_kind enum"); + + scope_kind kind = scope->kind; + if (kind == sk_template_parms && scope->explicit_spec_p) + kind = sk_template_spec; return scope_kind_names[kind]; } diff --git a/gcc/cp/name-lookup.h b/gcc/cp/name-lookup.h index 4f8454ee35e..d2371323337 100644 --- a/gcc/cp/name-lookup.h +++ b/gcc/cp/name-lookup.h @@ -213,7 +213,8 @@ enum scope_kind { explicit specialization is introduced by "template <>", this scope is always empty. */ sk_transaction, /* A synchronized or atomic statement. */ - sk_omp /* An OpenMP structured block. */ + sk_omp, /* An OpenMP structured block. */ + sk_count /* Number of scope_kind enumerations. */ }; struct GTY(()) cp_class_binding { -- 2.43.0