On Tue, Jan 20, 2026 at 01:44:35AM +0100, Jakub Jelinek wrote:
> Hi!
> 
> The following testcase ICEs in the -Wmisleading-indentation warning.
> For C++11 and later expansion statement can appear in the set of keywords
> the warning sees and it is the first keyword of it (for expansion stmt
> of a pair of keywords), so RID_TEMPLATE.
> 
> Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux,
> ok for trunk?

LGTM.
 
> 2026-01-20  Jakub Jelinek  <[email protected]>
> 
>       PR c++/123694
>       * c-indentation.cc (guard_tinfo_to_string): Handle RID_TEMPLATE
>       for C++11 or later.
> 
>       * g++.dg/cpp26/expansion-stmt28.C: New test.
> 
> --- gcc/c-family/c-indentation.cc.jj  2026-01-02 09:56:09.910340858 +0100
> +++ gcc/c-family/c-indentation.cc     2026-01-19 18:32:05.483488251 +0100
> @@ -606,6 +606,9 @@ guard_tinfo_to_string (enum rid keyword)
>        return "do";
>      case RID_SWITCH:
>        return "switch";
> +    case RID_TEMPLATE:
> +      gcc_assert (cxx_dialect >= cxx11);
> +      return "template for";
>      default:
>        gcc_unreachable ();
>      }
> --- gcc/testsuite/g++.dg/cpp26/expansion-stmt28.C.jj  2026-01-19 
> 18:36:16.350153705 +0100
> +++ gcc/testsuite/g++.dg/cpp26/expansion-stmt28.C     2026-01-19 
> 18:35:29.797956009 +0100
> @@ -0,0 +1,13 @@
> +// PR c++/123694
> +// { dg-do compile { target c++11 } }
> +// { dg-options "-Wmisleading-indentation" }
> +
> +int
> +foo ()
> +{
> +  int b = 0;
> +  template for (constexpr auto a : { 1, 2L, 3.0 })   // { dg-warning 
> "'template for' only available with" "" { target c++23_down } }
> +    b += a;                                          // { dg-warning "this 
> 'template for' clause does not guard\\.\\.\\." "" { target *-*-* } .-1 }
> +    b++;                                             // { dg-message 
> "\\.\\.\\.this statement, but the latter is misleadingly indented as if it 
> were guarded by the 'template for'" }
> +  return b;
> +}
> 
>       Jakub
> 

Marek

Reply via email to