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? 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
