Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 16 additions & 6 deletions clang/lib/Sema/SemaSYCL.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2836,11 +2836,14 @@ class SYCLKernelNameTypeVisitor
using InnerTypeVisitor = TypeVisitor<SYCLKernelNameTypeVisitor>;
using InnerTAVisitor =
ConstTemplateArgumentVisitor<SYCLKernelNameTypeVisitor>;
bool IsInvalid = false;

public:
SYCLKernelNameTypeVisitor(Sema &S, SourceLocation KernelInvocationFuncLoc)
: S(S), KernelInvocationFuncLoc(KernelInvocationFuncLoc) {}

bool isValid() { return !IsInvalid; }

void Visit(QualType T) {
if (T.isNull())
return;
Expand Down Expand Up @@ -2872,6 +2875,7 @@ class SYCLKernelNameTypeVisitor
<< /* Unscoped enum requires fixed underlying type */ 2;
S.Diag(ED->getSourceRange().getBegin(), diag::note_entity_declared_at)
<< ED;
IsInvalid = true;
}
}

Expand All @@ -2888,12 +2892,14 @@ class SYCLKernelNameTypeVisitor
if (KernelNameIsMissing) {
S.Diag(KernelInvocationFuncLoc, diag::err_sycl_kernel_incorrectly_named)
<< /* kernel name is missing */ 0;
IsInvalid = true;
} else {
if (Tag->isCompleteDefinition())
if (Tag->isCompleteDefinition()) {
S.Diag(KernelInvocationFuncLoc,
diag::err_sycl_kernel_incorrectly_named)
<< /* kernel name is not globally-visible */ 1;
else
IsInvalid = true;
} else
S.Diag(KernelInvocationFuncLoc, diag::warn_sycl_implicit_decl);

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

KernelObjVisitor Visitor{*this};
SYCLKernelNameTypeVisitor KernelTypeVisitor(*this, Args[0]->getExprLoc());
SYCLKernelNameTypeVisitor KernelNameTypeVisitor(*this, Args[0]->getExprLoc());

DiagnosingSYCLKernel = true;

// Emit diagnostics for SYCL device kernels only
if (LangOpts.SYCLIsDevice)
KernelTypeVisitor.Visit(KernelNameType);
DiagnosingSYCLKernel = true;
KernelNameTypeVisitor.Visit(KernelNameType);
Visitor.VisitRecordBases(KernelObj, FieldChecker, UnionChecker, DecompMarker);
Visitor.VisitRecordFields(KernelObj, FieldChecker, UnionChecker,
DecompMarker);
Expand All @@ -2987,7 +2995,9 @@ void Sema::CheckSYCLKernelCall(FunctionDecl *KernelFunc, SourceRange CallLoc,
Visitor.VisitRecordFields(KernelObj, ArgsSizeChecker);
}
DiagnosingSYCLKernel = false;
if (!FieldChecker.isValid() || !UnionChecker.isValid())
// Set the kernel function as invalid, if any of the checkers fail validation.
if (!FieldChecker.isValid() || !UnionChecker.isValid() ||
!KernelNameTypeVisitor.isValid())
KernelFunc->setInvalidDecl();
}

Expand Down