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 <[email protected]> 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 <[email protected]> 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) { _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
