[clang] [SYCL] Correct incomplete AST visitation for UnresolvedSYCLKernelCallStmt. (PR #185531)
Tom Honermann via cfe-commits
cfe-commits at lists.llvm.org
Tue Mar 10 09:13:37 PDT 2026
https://github.com/tahonermann updated https://github.com/llvm/llvm-project/pull/185531
>From 57e43343f6438144344c3cec87ceff1b4cbd0115 Mon Sep 17 00:00:00 2001
From: Tom Honermann <tom.honermann at intel.com>
Date: Mon, 9 Mar 2026 15:35:33 -0700
Subject: [PATCH 1/2] [SYCL] Correct incomplete AST visitation for
UnresolvedSYCLKernelCallStmt.
Previously, AST visitation for `UnresolvedSYCLKernelCallStmt` failed to visit
the kernel launch ID expression. This change adds visitation predicated on
whether synthesized code should be visited.
---
clang/include/clang/AST/ASTNodeTraverser.h | 11 ++++++-
.../ast-dump-sycl-kernel-call-stmt.cpp | 31 ++++++++++++-------
2 files changed, 30 insertions(+), 12 deletions(-)
diff --git a/clang/include/clang/AST/ASTNodeTraverser.h b/clang/include/clang/AST/ASTNodeTraverser.h
index e7aa6c26dfcef..bd9dafc147f09 100644
--- a/clang/include/clang/AST/ASTNodeTraverser.h
+++ b/clang/include/clang/AST/ASTNodeTraverser.h
@@ -159,7 +159,8 @@ class ASTNodeTraverser
// Some statements have custom mechanisms for dumping their children.
if (isa<DeclStmt, GenericSelectionExpr, RequiresExpr,
- OpenACCWaitConstruct, SYCLKernelCallStmt>(S))
+ OpenACCWaitConstruct, SYCLKernelCallStmt,
+ UnresolvedSYCLKernelCallStmt>(S))
return;
if (Traversal == TK_IgnoreUnlessSpelledInSource &&
@@ -845,6 +846,14 @@ class ASTNodeTraverser
}
}
+ void
+ VisitUnresolvedSYCLKernelCallStmt(const UnresolvedSYCLKernelCallStmt *Node) {
+ Visit(Node->getOriginalStmt());
+ if (Traversal != TK_IgnoreUnlessSpelledInSource) {
+ Visit(Node->getKernelLaunchIdExpr());
+ }
+ }
+
void VisitOMPExecutableDirective(const OMPExecutableDirective *Node) {
for (const auto *C : Node->clauses())
Visit(C);
diff --git a/clang/test/ASTSYCL/ast-dump-sycl-kernel-call-stmt.cpp b/clang/test/ASTSYCL/ast-dump-sycl-kernel-call-stmt.cpp
index c5518d9038448..0c9ee05ac7614 100644
--- a/clang/test/ASTSYCL/ast-dump-sycl-kernel-call-stmt.cpp
+++ b/clang/test/ASTSYCL/ast-dump-sycl-kernel-call-stmt.cpp
@@ -66,9 +66,13 @@ void skep2<KN<2>>(K<2>);
// CHECK-NEXT: | |-FunctionDecl {{.*}} skep2 'void (KT)'
// CHECK-NEXT: | | |-ParmVarDecl {{.*}} k 'KT'
// CHECK-NEXT: | | |-UnresolvedSYCLKernelCallStmt {{.*}}
-// CHECK-NEXT: | | | `-CompoundStmt {{.*}}
-// CHECK-NEXT: | | | `-CallExpr {{.*}} '<dependent type>'
-// CHECK-NEXT: | | | `-DeclRefExpr {{.*}} 'KT' lvalue ParmVar {{.*}} 'k' 'KT'
+// CHECK-NEXT: | | | |-CompoundStmt {{.*}}
+// CHECK-NEXT: | | | | `-CallExpr {{.*}} '<dependent type>'
+// CHECK-NEXT: | | | | `-DeclRefExpr {{.*}} 'KT' lvalue ParmVar {{.*}} 'k' 'KT'
+// CHECK-NEXT: | | | `-UnresolvedLookupExpr {{.*}} '<dependent type>' lvalue (ADL) = 'sycl_kernel_launch' {{.*}}
+// CHECK-NEXT: | | | `-TemplateArgument type 'KNT':'type-parameter-0-0'
+// CHECK-NEXT: | | | `-TemplateTypeParmType {{.*}} 'KNT' dependent depth 0 index 0
+// CHECK-NEXT: | | | `-TemplateTypeParm {{.*}} 'KNT'
// CHECK-NEXT: | | `-SYCLKernelEntryPointAttr {{.*}} KNT
// CHECK-NEXT: | `-FunctionDecl {{.*}} skep2 'void (K<2>)' explicit_instantiation_definition instantiated_from 0x{{.+}}
@@ -121,9 +125,13 @@ void skep3<KN<3>>(K<3> k) {
// CHECK-NEXT: | |-FunctionDecl {{.*}} skep3 'void (KT)'
// CHECK-NEXT: | | |-ParmVarDecl {{.*}} k 'KT'
// CHECK-NEXT: | | |-UnresolvedSYCLKernelCallStmt {{.*}}
-// CHECK-NEXT: | | | `-CompoundStmt {{.*}}
-// CHECK-NEXT: | | | `-CallExpr {{.*}} '<dependent type>'
-// CHECK-NEXT: | | | `-DeclRefExpr {{.*}} 'KT' lvalue ParmVar {{.*}} 'k' 'KT'
+// CHECK-NEXT: | | | |-CompoundStmt {{.*}}
+// CHECK-NEXT: | | | | `-CallExpr {{.*}} '<dependent type>'
+// CHECK-NEXT: | | | | `-DeclRefExpr {{.*}} 'KT' lvalue ParmVar {{.*}} 'k' 'KT'
+// CHECK-NEXT: | | | `-UnresolvedLookupExpr {{.*}} '<dependent type>' lvalue (ADL) = 'sycl_kernel_launch' {{.*}}
+// CHECK-NEXT: | | | `-TemplateArgument type 'KNT':'type-parameter-0-0'
+// CHECK-NEXT: | | | `-TemplateTypeParmType {{.*}} 'KNT' dependent depth 0 index 0
+// CHECK-NEXT: | | | `-TemplateTypeParm {{.*}} 'KNT'
// CHECK-NEXT: | | `-SYCLKernelEntryPointAttr {{.*}} KNT
// CHECK-NEXT: | `-Function {{.*}} 'skep3' 'void (K<3>)'
@@ -401,11 +409,12 @@ void foo() {
// CHECK-NEXT: | | | |-ParmVarDecl {{.*}} referenced a 'int'
// CHECK-NEXT: | | | |-ParmVarDecl {{.*}} referenced b 'int'
// CHECK-NEXT: | | | |-UnresolvedSYCLKernelCallStmt {{.*}}
-// CHECK-NEXT: | | | | `-CompoundStmt {{.*}}
-// CHECK-NEXT: | | | | `-CallExpr {{.*}} '<dependent type>'
-// CHECK-NEXT: | | | | |-DeclRefExpr {{.*}} 'KT' lvalue ParmVar {{.*}} 'k' 'KT'
-// CHECK-NEXT: | | | | |-DeclRefExpr {{.*}} 'int' lvalue ParmVar {{.*}} 'a' 'int'
-// CHECK-NEXT: | | | | `-DeclRefExpr {{.*}} 'int' lvalue ParmVar {{.*}} 'b' 'int'
+// CHECK-NEXT: | | | | |-CompoundStmt {{.*}}
+// CHECK-NEXT: | | | | | `-CallExpr {{.*}} '<dependent type>'
+// CHECK-NEXT: | | | | | |-DeclRefExpr {{.*}} 'KT' lvalue ParmVar {{.*}} 'k' 'KT'
+// CHECK-NEXT: | | | | | |-DeclRefExpr {{.*}} 'int' lvalue ParmVar {{.*}} 'a' 'int'
+// CHECK-NEXT: | | | | | `-DeclRefExpr {{.*}} 'int' lvalue ParmVar {{.*}} 'b' 'int'
+// CHECK-NEXT: | | | | `-UnresolvedMemberExpr {{.*}} '<bound member function type>' lvalue
// CHECK-NEXT: | | | `-SYCLKernelEntryPointAttr {{.*}} KNT
// CHECK-NEXT: | | `-CXXMethodDecl {{.*}} used skep9 {{.*}} implicit_instantiation implicit-inline instantiated_from 0x{{.*}}
// CHECK-NEXT: | | |-TemplateArgument type 'KN<9>'
>From 32f0b7e26582e323716a318fe2a8e8c359eebf1e Mon Sep 17 00:00:00 2001
From: Tom Honermann <tom.honermann at intel.com>
Date: Tue, 10 Mar 2026 09:13:06 -0700
Subject: [PATCH 2/2] Address Mariya's review comments.
---
clang/include/clang/AST/ASTNodeTraverser.h | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/clang/include/clang/AST/ASTNodeTraverser.h b/clang/include/clang/AST/ASTNodeTraverser.h
index bd9dafc147f09..3be24ff868c2d 100644
--- a/clang/include/clang/AST/ASTNodeTraverser.h
+++ b/clang/include/clang/AST/ASTNodeTraverser.h
@@ -849,9 +849,8 @@ class ASTNodeTraverser
void
VisitUnresolvedSYCLKernelCallStmt(const UnresolvedSYCLKernelCallStmt *Node) {
Visit(Node->getOriginalStmt());
- if (Traversal != TK_IgnoreUnlessSpelledInSource) {
+ if (Traversal != TK_IgnoreUnlessSpelledInSource)
Visit(Node->getKernelLaunchIdExpr());
- }
}
void VisitOMPExecutableDirective(const OMPExecutableDirective *Node) {
More information about the cfe-commits
mailing list