]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++: Fix ENABLE_SCOPE_CHECKING printing
authorNathaniel Shead <nathanieloshead@gmail.com>
Tue, 16 Jan 2024 09:56:46 +0000 (20:56 +1100)
committerNathaniel Shead <nathanieloshead@gmail.com>
Tue, 16 Jan 2024 22:40:42 +0000 (09:40 +1100)
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 <nathanieloshead@gmail.com>
gcc/cp/name-lookup.cc
gcc/cp/name-lookup.h

index d827d337d3bbce0b118dd7e449aa3293b95832d0..15b5fba6297204911a98ca591fe4cbb3537420b1 100644 (file)
@@ -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];
 }
index 4f8454ee35efa0e614bd99910ae9f944c1273e4b..d2371323337ef78c1b9d60ea67509b773f78124d 100644 (file)
@@ -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 {