On 1/16/24 06:59, Nathaniel Shead wrote:
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?

OK.

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 {

Reply via email to