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

Reply via email to