Skip to content

Commit 1bafa20

Browse files
[SYCL] Add KernelNameTypeVisitor validation check (#2596)
This patch is a follow-up to a09aed0. It sets the kernel invocation function invalid, if the KernelNameTypeVisitor fails validating the kernel name type.
1 parent 5949228 commit 1bafa20

File tree

1 file changed

+16
-6
lines changed

1 file changed

+16
-6
lines changed

clang/lib/Sema/SemaSYCL.cpp

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2836,11 +2836,14 @@ class SYCLKernelNameTypeVisitor
28362836
using InnerTypeVisitor = TypeVisitor<SYCLKernelNameTypeVisitor>;
28372837
using InnerTAVisitor =
28382838
ConstTemplateArgumentVisitor<SYCLKernelNameTypeVisitor>;
2839+
bool IsInvalid = false;
28392840

28402841
public:
28412842
SYCLKernelNameTypeVisitor(Sema &S, SourceLocation KernelInvocationFuncLoc)
28422843
: S(S), KernelInvocationFuncLoc(KernelInvocationFuncLoc) {}
28432844

2845+
bool isValid() { return !IsInvalid; }
2846+
28442847
void Visit(QualType T) {
28452848
if (T.isNull())
28462849
return;
@@ -2872,6 +2875,7 @@ class SYCLKernelNameTypeVisitor
28722875
<< /* Unscoped enum requires fixed underlying type */ 2;
28732876
S.Diag(ED->getSourceRange().getBegin(), diag::note_entity_declared_at)
28742877
<< ED;
2878+
IsInvalid = true;
28752879
}
28762880
}
28772881

@@ -2888,12 +2892,14 @@ class SYCLKernelNameTypeVisitor
28882892
if (KernelNameIsMissing) {
28892893
S.Diag(KernelInvocationFuncLoc, diag::err_sycl_kernel_incorrectly_named)
28902894
<< /* kernel name is missing */ 0;
2895+
IsInvalid = true;
28912896
} else {
2892-
if (Tag->isCompleteDefinition())
2897+
if (Tag->isCompleteDefinition()) {
28932898
S.Diag(KernelInvocationFuncLoc,
28942899
diag::err_sycl_kernel_incorrectly_named)
28952900
<< /* kernel name is not globally-visible */ 1;
2896-
else
2901+
IsInvalid = true;
2902+
} else
28972903
S.Diag(KernelInvocationFuncLoc, diag::warn_sycl_implicit_decl);
28982904

28992905
S.Diag(Tag->getSourceRange().getBegin(), diag::note_previous_decl)
@@ -2970,11 +2976,13 @@ void Sema::CheckSYCLKernelCall(FunctionDecl *KernelFunc, SourceRange CallLoc,
29702976
SyclKernelArgsSizeChecker ArgsSizeChecker(*this, Args[0]->getExprLoc());
29712977

29722978
KernelObjVisitor Visitor{*this};
2973-
SYCLKernelNameTypeVisitor KernelTypeVisitor(*this, Args[0]->getExprLoc());
2979+
SYCLKernelNameTypeVisitor KernelNameTypeVisitor(*this, Args[0]->getExprLoc());
2980+
2981+
DiagnosingSYCLKernel = true;
2982+
29742983
// Emit diagnostics for SYCL device kernels only
29752984
if (LangOpts.SYCLIsDevice)
2976-
KernelTypeVisitor.Visit(KernelNameType);
2977-
DiagnosingSYCLKernel = true;
2985+
KernelNameTypeVisitor.Visit(KernelNameType);
29782986
Visitor.VisitRecordBases(KernelObj, FieldChecker, UnionChecker, DecompMarker);
29792987
Visitor.VisitRecordFields(KernelObj, FieldChecker, UnionChecker,
29802988
DecompMarker);
@@ -2987,7 +2995,9 @@ void Sema::CheckSYCLKernelCall(FunctionDecl *KernelFunc, SourceRange CallLoc,
29872995
Visitor.VisitRecordFields(KernelObj, ArgsSizeChecker);
29882996
}
29892997
DiagnosingSYCLKernel = false;
2990-
if (!FieldChecker.isValid() || !UnionChecker.isValid())
2998+
// Set the kernel function as invalid, if any of the checkers fail validation.
2999+
if (!FieldChecker.isValid() || !UnionChecker.isValid() ||
3000+
!KernelNameTypeVisitor.isValid())
29913001
KernelFunc->setInvalidDecl();
29923002
}
29933003

0 commit comments

Comments
 (0)