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
