On 1/20/26 11:14 PM, Marek Polacek wrote:
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.
Yes, OK.
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