Marek pointed out in another patch of mine [1] that I was missing an
auto_diagnostic_group to correctly associate informative notes with
their errors in structured error outputs. This patch goes through
constexpr.cc to correct this in other locations which seem to have the
same issue.

[1]: https://gcc.gnu.org/pipermail/gcc-patches/2023-October/632653.html

Bootstrapped and regtested on x86_64-pc-linux-gnu.

-- >8 --

gcc/cp/ChangeLog:

        * constexpr.cc (cxx_eval_dynamic_cast_fn): Add missing
        auto_diagnostic_group.
        (cxx_eval_call_expression): Likewise.
        (diag_array_subscript): Likewise.
        (outside_lifetime_error): Likewise.
        (potential_constant_expression_1): Likewise.

Signed-off-by: Nathaniel Shead <nathanielosh...@gmail.com>
---
 gcc/cp/constexpr.cc | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/gcc/cp/constexpr.cc b/gcc/cp/constexpr.cc
index dde4fec4a44..7c8f2cc189d 100644
--- a/gcc/cp/constexpr.cc
+++ b/gcc/cp/constexpr.cc
@@ -2437,6 +2437,7 @@ cxx_eval_dynamic_cast_fn (const constexpr_ctx *ctx, tree 
call,
          {
            if (!ctx->quiet)
              {
+               auto_diagnostic_group d;
                error_at (loc, "reference %<dynamic_cast%> failed");
                inform (loc, "dynamic type %qT of its operand does "
                        "not have a base class of type %qT",
@@ -2492,6 +2493,7 @@ cxx_eval_dynamic_cast_fn (const constexpr_ctx *ctx, tree 
call,
            {
              if (!ctx->quiet)
                {
+                 auto_diagnostic_group d;
                  error_at (loc, "reference %<dynamic_cast%> failed");
                  inform (loc, "static type %qT of its operand is a "
                          "non-public base class of dynamic type %qT",
@@ -2524,6 +2526,7 @@ cxx_eval_dynamic_cast_fn (const constexpr_ctx *ctx, tree 
call,
        {
          if (!ctx->quiet)
            {
+             auto_diagnostic_group d;
              error_at (loc, "reference %<dynamic_cast%> failed");
              inform (loc, "static type %qT of its operand is a non-public"
                      " base class of dynamic type %qT", objtype, mdtype);
@@ -2545,6 +2548,7 @@ cxx_eval_dynamic_cast_fn (const constexpr_ctx *ctx, tree 
call,
        {
          if (!ctx->quiet)
            {
+             auto_diagnostic_group d;
              error_at (loc, "reference %<dynamic_cast%> failed");
              if (b_kind == bk_ambig)
                inform (loc, "%qT is an ambiguous base class of dynamic "
@@ -2822,6 +2826,7 @@ cxx_eval_call_expression (const constexpr_ctx *ctx, tree 
t,
                        {
                          if (!ctx->quiet)
                            {
+                             auto_diagnostic_group d;
                              error_at (loc, "array deallocation of object "
                                             "allocated with non-array "
                                             "allocation");
@@ -2844,6 +2849,7 @@ cxx_eval_call_expression (const constexpr_ctx *ctx, tree 
t,
                        {
                          if (!ctx->quiet)
                            {
+                             auto_diagnostic_group d;
                              error_at (loc, "non-array deallocation of "
                                             "object allocated with array "
                                             "allocation");
@@ -4193,6 +4199,7 @@ diag_array_subscript (location_t loc, const constexpr_ctx 
*ctx, tree array, tree
       STRIP_ANY_LOCATION_WRAPPER (array);
       if (DECL_P (array))
        {
+         auto_diagnostic_group d;
          if (TYPE_DOMAIN (arraytype))
            error_at (loc, "array subscript value %qE is outside the bounds "
                      "of array %qD of type %qT", sidx, array, arraytype);
@@ -5838,6 +5845,7 @@ cxx_eval_indirect_ref (const constexpr_ctx *ctx, tree t,
 static void
 outside_lifetime_error (location_t loc, tree r)
 {
+  auto_diagnostic_group d;
   if (DECL_NAME (r) == heap_deleted_identifier)
     {
       /* Provide a more accurate message for deleted variables.  */
@@ -9460,6 +9468,7 @@ potential_constant_expression_1 (tree t, bool want_rval, 
bool strict, bool now,
              if (flags & tf_error)
                {
                  tree cap = DECL_CAPTURED_VARIABLE (t);
+                 auto_diagnostic_group d;
                  if (constexpr_error (input_location, fundef_p,
                                       "lambda capture of %qE is not a "
                                       "constant expression", cap)
-- 
2.42.0

Reply via email to