Author: Tom Honermann Date: 2026-03-10T12:53:31-04:00 New Revision: 7d47b695929cc7f85eeb0f87d0189adc04c1c629
URL: https://github.com/llvm/llvm-project/commit/7d47b695929cc7f85eeb0f87d0189adc04c1c629 DIFF: https://github.com/llvm/llvm-project/commit/7d47b695929cc7f85eeb0f87d0189adc04c1c629.diff LOG: [SYCL] Correct incomplete AST visitation for UnresolvedSYCLKernelCallStmt. (#185531) 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. Added: Modified: clang/include/clang/AST/ASTNodeTraverser.h clang/test/ASTSYCL/ast-dump-sycl-kernel-call-stmt.cpp Removed: ################################################################################ diff --git a/clang/include/clang/AST/ASTNodeTraverser.h b/clang/include/clang/AST/ASTNodeTraverser.h index e7aa6c26dfcef..3be24ff868c2d 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,13 @@ 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>' _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
