https://gcc.gnu.org/g:a1165e72b9ed9d5be6b538b42318aca989d73046
commit r16-6928-ga1165e72b9ed9d5be6b538b42318aca989d73046 Author: Jakub Jelinek <[email protected]> Date: Tue Jan 20 17:06:54 2026 +0100 c++: Fix -Wmisleading-indentation ICE on expansion stmt [PR123694] 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. 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. Diff: --- gcc/c-family/c-indentation.cc | 3 +++ gcc/testsuite/g++.dg/cpp26/expansion-stmt28.C | 13 +++++++++++++ 2 files changed, 16 insertions(+) diff --git a/gcc/c-family/c-indentation.cc b/gcc/c-family/c-indentation.cc index 88867540e611..ec371686a2e0 100644 --- a/gcc/c-family/c-indentation.cc +++ b/gcc/c-family/c-indentation.cc @@ -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 (); } diff --git a/gcc/testsuite/g++.dg/cpp26/expansion-stmt28.C b/gcc/testsuite/g++.dg/cpp26/expansion-stmt28.C new file mode 100644 index 000000000000..957022a417b9 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp26/expansion-stmt28.C @@ -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; +}
