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;
+}

Reply via email to