[clang] [libclang]: visit C++17 switch init statements (PR #173670)

via cfe-commits cfe-commits at lists.llvm.org
Fri Feb 13 08:03:48 PST 2026


https://github.com/Serafean updated https://github.com/llvm/llvm-project/pull/173670

>From 273228a56ffd3aa1c49ec7e1ea72ce6240d736e0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Martin=20Bedn=C3=A1r?= <martin at serafean.cz>
Date: Fri, 26 Dec 2025 17:20:08 +0100
Subject: [PATCH] [libclang]: visit C++17 switch init statements

This makes the previously unaccessible AST nodes for C++17 "switch with
init statements" accessible to consumers of libclang.

Fixes https://bugs.kde.org/show_bug.cgi?id=415537#c2
---
 clang/docs/ReleaseNotes.rst                    |  1 +
 .../Index/cxx17-switch-with-initializer.cpp    | 18 ++++++++++++++++++
 clang/tools/libclang/CIndex.cpp                |  1 +
 3 files changed, 20 insertions(+)
 create mode 100644 clang/test/Index/cxx17-switch-with-initializer.cpp

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 92731326ca1bf..de4e73a0c0f43 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -383,6 +383,7 @@ clang-format
 
 libclang
 --------
+- Visit switch initializer statements (https://bugs.kde.org/show_bug.cgi?id=415537#c2)
 
 Code Completion
 ---------------
diff --git a/clang/test/Index/cxx17-switch-with-initializer.cpp b/clang/test/Index/cxx17-switch-with-initializer.cpp
new file mode 100644
index 0000000000000..ffa77f318e97a
--- /dev/null
+++ b/clang/test/Index/cxx17-switch-with-initializer.cpp
@@ -0,0 +1,18 @@
+// Test is line- and column-sensitive; see below.
+
+void foo() {
+  switch (int bar = true; bar) {
+  }
+}
+
+// RUN: c-index-test -test-load-source all -std=c++17 %s | FileCheck -check-prefix=CHECK %s
+// CHECK: cxx17-switch-with-initializer.cpp:3:6: FunctionDecl=foo:3:6 (Definition) Extent=[3:1 - 6:2]
+// CHECK: cxx17-switch-with-initializer.cpp:3:12: CompoundStmt= Extent=[3:12 - 6:2]
+// CHECK: cxx17-switch-with-initializer.cpp:4:3: SwitchStmt= Extent=[4:3 - 5:4]
+// CHECK: cxx17-switch-with-initializer.cpp:4:11: DeclStmt= Extent=[4:11 - 4:26]
+// CHECK: cxx17-switch-with-initializer.cpp:4:15: VarDecl=bar:4:15 (Definition) Extent=[4:11 - 4:25]
+// CHECK: cxx17-switch-with-initializer.cpp:4:21: UnexposedExpr= Extent=[4:21 - 4:25]
+// CHECK: cxx17-switch-with-initializer.cpp:4:21: CXXBoolLiteralExpr= Extent=[4:21 - 4:25]
+// CHECK: cxx17-switch-with-initializer.cpp:4:27: UnexposedExpr=bar:4:15 Extent=[4:27 - 4:30]
+// CHECK: cxx17-switch-with-initializer.cpp:4:27: DeclRefExpr=bar:4:15 Extent=[4:27 - 4:30]
+// CHECK: cxx17-switch-with-initializer.cpp:4:32: CompoundStmt= Extent=[4:32 - 5:4]
diff --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp
index 15eec87652451..ece794003f359 100644
--- a/clang/tools/libclang/CIndex.cpp
+++ b/clang/tools/libclang/CIndex.cpp
@@ -3222,6 +3222,7 @@ void EnqueueVisitor::VisitStmt(const Stmt *S) { EnqueueChildren(S); }
 void EnqueueVisitor::VisitSwitchStmt(const SwitchStmt *S) {
   AddStmt(S->getBody());
   AddStmt(S->getCond());
+  AddStmt(S->getInit());
   AddDecl(S->getConditionVariable());
 }
 



More information about the cfe-commits mailing list