From fe1649eea76f193732d22ec022a35326523eb37a Mon Sep 17 00:00:00 2001 From: Nathaniel Shead Date: Tue, 16 Jan 2024 20:56:46 +1100 Subject: [PATCH] c++: Fix ENABLE_SCOPE_CHECKING printing 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 --- 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 {