From b5601e3544d4c879d21609cbc9fa72960a430149 Mon Sep 17 00:00:00 2001 From: "Klochkov, Denis" Date: Tue, 6 May 2025 11:37:53 +0200 Subject: [PATCH 1/7] [SYCL] add clang diagnostic for kernel free function with default arg value --- .../include/clang/Basic/DiagnosticSemaKinds.td | 2 ++ clang/lib/Sema/SemaSYCL.cpp | 18 ++++++++++++++++++ .../free_function_kernels_diagnostics.cpp | 4 ++-- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 1c7ef71f41ffb..2da70735e22ff 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -12670,6 +12670,8 @@ def err_registered_kernels_name_already_registered : Error< "free function kernel has already been registered with '%0'; cannot register with '%1'">; def err_not_sycl_free_function : Error< "attempting to register a function that is not a SYCL free function as '%0'">; +def err_free_function_with_default_arg : Error< + "a function with a default argument value cannot be used as a kernel function, '%0'">; // SYCL kernel entry point diagnostics def err_sycl_entry_point_invalid : Error< diff --git a/clang/lib/Sema/SemaSYCL.cpp b/clang/lib/Sema/SemaSYCL.cpp index 7767f4f4d5367..038aac42ade67 100644 --- a/clang/lib/Sema/SemaSYCL.cpp +++ b/clang/lib/Sema/SemaSYCL.cpp @@ -5791,8 +5791,26 @@ void SemaSYCL::MarkDevices() { } } +static void CheckFreeFunctionDiagnostics(Sema &S, FunctionDecl *FD) { + for (ParmVarDecl *Param : FD->parameters()) { + // Default arguments are not allowed in SYCL kernels. + if (Param->hasDefaultArg()) { + llvm::SmallString<128> DiagOut; + llvm::raw_svector_ostream DiagOutStream{DiagOut}; + PrintingPolicy Policy{S.getLangOpts()}; + Param->getType().print(DiagOutStream, Policy); + DiagOutStream << " " << Param->getName() << " = "; + Param->getDefaultArg()->printPretty(DiagOutStream, nullptr, Policy); + S.Diag(Param->getLocation(), diag::err_free_function_with_default_arg) + << DiagOut.str(); + break; + } + } +} + void SemaSYCL::ProcessFreeFunction(FunctionDecl *FD) { if (isFreeFunction(FD)) { + CheckFreeFunctionDiagnostics(SemaRef, FD); SyclKernelDecompMarker DecompMarker(*this); SyclKernelFieldChecker FieldChecker(*this); SyclKernelUnionChecker UnionChecker(*this); diff --git a/sycl/test/extensions/free_function_kernels/free_function_kernels_diagnostics.cpp b/sycl/test/extensions/free_function_kernels/free_function_kernels_diagnostics.cpp index 8afbba4d1d460..c34cb959c64ca 100644 --- a/sycl/test/extensions/free_function_kernels/free_function_kernels_diagnostics.cpp +++ b/sycl/test/extensions/free_function_kernels/free_function_kernels_diagnostics.cpp @@ -21,10 +21,10 @@ void singleTaskKernelVariadic(...) {} SYCL_EXT_ONEAPI_FUNCTION_PROPERTY(syclexp::nd_range_kernel<3>) void ndRangeKernelVariadic(...) {} -// TODO: Add expected error when it will be implemented. +// expected-error@+2 {{a function with a default argument value cannot be used as a kernel function, 'int Value = 1'}} SYCL_EXT_ONEAPI_FUNCTION_PROPERTY(syclexp::single_task_kernel) void singleTaskKernelDefaultValues(int Value = 1) {} -// TODO: Add expected error when it will be implemented. +// expected-error@+2 {{a function with a default argument value cannot be used as a kernel function, 'int Value = 1'}} SYCL_EXT_ONEAPI_FUNCTION_PROPERTY(syclexp::nd_range_kernel<1>) void ndRangeKernelDefaultValues(int Value = 1) {} From 25027ee5cd8039daad4fdfad4751cc004d69e341 Mon Sep 17 00:00:00 2001 From: "Klochkov, Denis" Date: Tue, 6 May 2025 16:09:53 +0200 Subject: [PATCH 2/7] [SYCL] add clang diagnostic for kernel function non-void return type --- .../clang/Basic/DiagnosticSemaKinds.td | 5 ++++- clang/lib/Sema/SemaSYCL.cpp | 22 +++++++------------ .../free_function_kernels_diagnostics.cpp | 18 +++++++++++++++ 3 files changed, 30 insertions(+), 15 deletions(-) diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 3ce086b030d40..74b61387b74ab 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -12672,8 +12672,11 @@ def err_not_sycl_free_function : Error< "attempting to register a function that is not a SYCL free function as '%0'">; def err_free_function_with_default_arg : Error< "a function with a default argument value cannot be used as a kernel function, '%0'">; -def err_free_function_variadic_args: Error< +def err_free_function_variadic_args : Error< "free function kernel cannot be a variadic function">; +def err_free_function_return_type : Error< + "kernel free function should have return type 'void'">; + // SYCL kernel entry point diagnostics def err_sycl_entry_point_invalid : Error< diff --git a/clang/lib/Sema/SemaSYCL.cpp b/clang/lib/Sema/SemaSYCL.cpp index e17e2659cf540..499949361dde5 100644 --- a/clang/lib/Sema/SemaSYCL.cpp +++ b/clang/lib/Sema/SemaSYCL.cpp @@ -1159,8 +1159,6 @@ static target getAccessTarget(QualType FieldTy, AccTy->getTemplateArgs()[3].getAsIntegral().getExtValue()); } -// FIXME: Free functions must have void return type and be declared at file -// scope, outside any namespaces. bool SemaSYCL::isFreeFunction(const FunctionDecl *FD) { for (auto *IRAttr : FD->specific_attrs()) { SmallVector, 4> NameValuePairs = @@ -1169,9 +1167,7 @@ bool SemaSYCL::isFreeFunction(const FunctionDecl *FD) { if (NameValuePair.first == "sycl-nd-range-kernel" || NameValuePair.first == "sycl-single-task-kernel") { if (!FD->getReturnType()->isVoidType()) { - llvm::report_fatal_error( - "Only functions at file scope with void return " - "type are permitted as free functions"); + Diag(FD->getLocation(), diag::err_free_function_return_type); return false; } return true; @@ -5792,32 +5788,30 @@ void SemaSYCL::MarkDevices() { } static void CheckFreeFunctionDiagnostics(Sema &S, FunctionDecl *FD) { + if (FD->isVariadic()) { + S.Diag(FD->getLocation(), diag::err_free_function_variadic_args); + return; + } + + PrintingPolicy Policy{S.getLangOpts()}; for (ParmVarDecl *Param : FD->parameters()) { // Default arguments are not allowed in SYCL kernels. if (Param->hasDefaultArg()) { llvm::SmallString<128> DiagOut; llvm::raw_svector_ostream DiagOutStream{DiagOut}; - PrintingPolicy Policy{S.getLangOpts()}; Param->getType().print(DiagOutStream, Policy); DiagOutStream << " " << Param->getName() << " = "; Param->getDefaultArg()->printPretty(DiagOutStream, nullptr, Policy); S.Diag(Param->getLocation(), diag::err_free_function_with_default_arg) << DiagOut.str(); - break; + continue; } } } void SemaSYCL::ProcessFreeFunction(FunctionDecl *FD) { if (isFreeFunction(FD)) { - CheckFreeFunctionDiagnostics(SemaRef, FD); - - if (FD->isVariadic()) { - Diag(FD->getLocation(), diag::err_free_function_variadic_args); - return; - } - SyclKernelDecompMarker DecompMarker(*this); SyclKernelFieldChecker FieldChecker(*this); SyclKernelUnionChecker UnionChecker(*this); diff --git a/sycl/test/extensions/free_function_kernels/free_function_kernels_diagnostics.cpp b/sycl/test/extensions/free_function_kernels/free_function_kernels_diagnostics.cpp index 9dbb13610a8c8..c791085bf0577 100644 --- a/sycl/test/extensions/free_function_kernels/free_function_kernels_diagnostics.cpp +++ b/sycl/test/extensions/free_function_kernels/free_function_kernels_diagnostics.cpp @@ -26,3 +26,21 @@ void singleTaskKernelDefaultValues(int Value = 1) {} // expected-error@+2 {{a function with a default argument value cannot be used as a kernel function, 'int Value = 1'}} SYCL_EXT_ONEAPI_FUNCTION_PROPERTY(syclexp::nd_range_kernel<1>) void ndRangeKernelDefaultValues(int Value = 1) {} + +// expected-error@+3 {{a function with a default argument value cannot be used as a kernel function, 'int Ivalue = 1'}} +// expected-error@+2 {{a function with a default argument value cannot be used as a kernel function, 'unsigned int Uvalue = 3'}} +SYCL_EXT_ONEAPI_FUNCTION_PROPERTY(syclexp::single_task_kernel) +void singleTaskKernelDefaultValues(int Ivalue = 1, unsigned int Uvalue = 3) {} + +// expected-error@+3 {{a function with a default argument value cannot be used as a kernel function, 'int Ivalue = 1'}} +// expected-error@+2 {{a function with a default argument value cannot be used as a kernel function, 'unsigned int Uvalue = 3'}} +SYCL_EXT_ONEAPI_FUNCTION_PROPERTY(syclexp::nd_range_kernel<1>) +void ndRangeKernelDefaultValues(int Ivalue = 1, unsigned int Uvalue = 3) {} + +// expected-error@+2 {{kernel free function should have return type 'void'}} +SYCL_EXT_ONEAPI_FUNCTION_PROPERTY(syclexp::single_task_kernel) +int singleTaskKernelReturnType(int Value) {} + +// expected-error@+2 {{kernel free function should have return type 'void'}} +SYCL_EXT_ONEAPI_FUNCTION_PROPERTY(syclexp::nd_range_kernel<1>) +int ndRangeKernelReturnType(int Value) {} From e7e4599548b5b7d7904adde3d9ee323e9a66f902 Mon Sep 17 00:00:00 2001 From: "Klochkov, Denis" Date: Tue, 6 May 2025 17:35:00 +0200 Subject: [PATCH 3/7] [SYCL] move new test into clang directory --- .../clang/Basic/DiagnosticSemaKinds.td | 4 +-- clang/lib/Sema/SemaSYCL.cpp | 18 ++++------- .../test/SemaSYCL/free_function_negative.cpp | 32 +++++++++++++++++++ .../free_function_kernels_diagnostics.cpp | 25 --------------- 4 files changed, 40 insertions(+), 39 deletions(-) diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 74b61387b74ab..4594c55382b14 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -12671,11 +12671,11 @@ def err_registered_kernels_name_already_registered : Error< def err_not_sycl_free_function : Error< "attempting to register a function that is not a SYCL free function as '%0'">; def err_free_function_with_default_arg : Error< - "a function with a default argument value cannot be used as a kernel function, '%0'">; + "a function with a default argument value cannot be used to define SYCL free function kernel">; def err_free_function_variadic_args : Error< "free function kernel cannot be a variadic function">; def err_free_function_return_type : Error< - "kernel free function should have return type 'void'">; + "SYCL free function kernel should have return type 'void'">; // SYCL kernel entry point diagnostics diff --git a/clang/lib/Sema/SemaSYCL.cpp b/clang/lib/Sema/SemaSYCL.cpp index 499949361dde5..79b6fe0bb998c 100644 --- a/clang/lib/Sema/SemaSYCL.cpp +++ b/clang/lib/Sema/SemaSYCL.cpp @@ -1166,10 +1166,6 @@ bool SemaSYCL::isFreeFunction(const FunctionDecl *FD) { for (const auto &NameValuePair : NameValuePairs) { if (NameValuePair.first == "sycl-nd-range-kernel" || NameValuePair.first == "sycl-single-task-kernel") { - if (!FD->getReturnType()->isVoidType()) { - Diag(FD->getLocation(), diag::err_free_function_return_type); - return false; - } return true; } } @@ -5793,17 +5789,15 @@ static void CheckFreeFunctionDiagnostics(Sema &S, FunctionDecl *FD) { return; } - PrintingPolicy Policy{S.getLangOpts()}; + if (!FD->getReturnType()->isVoidType()) { + S.Diag(FD->getLocation(), diag::err_free_function_return_type); + return; + } + for (ParmVarDecl *Param : FD->parameters()) { - // Default arguments are not allowed in SYCL kernels. if (Param->hasDefaultArg()) { - llvm::SmallString<128> DiagOut; - llvm::raw_svector_ostream DiagOutStream{DiagOut}; - Param->getType().print(DiagOutStream, Policy); - DiagOutStream << " " << Param->getName() << " = "; - Param->getDefaultArg()->printPretty(DiagOutStream, nullptr, Policy); S.Diag(Param->getLocation(), diag::err_free_function_with_default_arg) - << DiagOut.str(); + << Param->getSourceRange(); continue; } } diff --git a/clang/test/SemaSYCL/free_function_negative.cpp b/clang/test/SemaSYCL/free_function_negative.cpp index 4e2bfe0011430..20340f5534a50 100644 --- a/clang/test/SemaSYCL/free_function_negative.cpp +++ b/clang/test/SemaSYCL/free_function_negative.cpp @@ -9,3 +9,35 @@ foo(int start, ...) { // expected-error {{free function kernel cannot be a varia [[__sycl_detail__::add_ir_attributes_function("sycl-single-task-kernel", 2)]] void foo1(int start, ...) { // expected-error {{free function kernel cannot be a variadic function}} } + +// expected-error@+2 {{a function with a default argument value cannot be used to define SYCL free function kernel}} +[[__sycl_detail__::add_ir_attributes_function("sycl-single-task-kernel", 2)]] void +singleTaskKernelDefaultValues(int Value = 1) { +} + +// expected-error@+2 {{a function with a default argument value cannot be used to define SYCL free function kernel}} +[[__sycl_detail__::add_ir_attributes_function("sycl-nd-range-kernel", 2)]] void +ndRangeKernelDefaultValues(int Value = 1) { +} + +// expected-error@+3 {{a function with a default argument value cannot be used to define SYCL free function kernel}} +// expected-error@+2 {{a function with a default argument value cannot be used to define SYCL free function kernel}} +[[__sycl_detail__::add_ir_attributes_function("sycl-single-task-kernel", 2)]] void +singleTaskKernelDefaultValues(int Ivalue = 1, unsigned int Uvalue = 3) { +} + +// expected-error@+3 {{a function with a default argument value cannot be used to define SYCL free function kernel}} +// expected-error@+2 {{a function with a default argument value cannot be used to define SYCL free function kernel}} +[[__sycl_detail__::add_ir_attributes_function("sycl-nd-range-kernel", 2)]] void +ndRangeKernelDefaultValues(int Ivalue = 1, unsigned int Uvalue = 3) { +} + +// expected-error@+2 {{SYCL free function kernel should have return type 'void'}} +[[__sycl_detail__::add_ir_attributes_function("sycl-single-task-kernel", 2)]] int +singleTaskKernelReturnType(int Value) { +} + +// expected-error@+2 {{SYCL free function kernel should have return type 'void'}} +[[__sycl_detail__::add_ir_attributes_function("sycl-nd-range-kernel", 2)]] int +ndRangeKernelReturnType(int Value) { +} diff --git a/sycl/test/extensions/free_function_kernels/free_function_kernels_diagnostics.cpp b/sycl/test/extensions/free_function_kernels/free_function_kernels_diagnostics.cpp index c791085bf0577..ab42b3be00f7b 100644 --- a/sycl/test/extensions/free_function_kernels/free_function_kernels_diagnostics.cpp +++ b/sycl/test/extensions/free_function_kernels/free_function_kernels_diagnostics.cpp @@ -19,28 +19,3 @@ SYCL_EXT_ONEAPI_FUNCTION_PROPERTY(syclexp::nd_range_kernel<3>) void ndRangeKernelVariadic( // expected-error {{free function kernel cannot be a variadic function}} ...) {} -// expected-error@+2 {{a function with a default argument value cannot be used as a kernel function, 'int Value = 1'}} -SYCL_EXT_ONEAPI_FUNCTION_PROPERTY(syclexp::single_task_kernel) -void singleTaskKernelDefaultValues(int Value = 1) {} - -// expected-error@+2 {{a function with a default argument value cannot be used as a kernel function, 'int Value = 1'}} -SYCL_EXT_ONEAPI_FUNCTION_PROPERTY(syclexp::nd_range_kernel<1>) -void ndRangeKernelDefaultValues(int Value = 1) {} - -// expected-error@+3 {{a function with a default argument value cannot be used as a kernel function, 'int Ivalue = 1'}} -// expected-error@+2 {{a function with a default argument value cannot be used as a kernel function, 'unsigned int Uvalue = 3'}} -SYCL_EXT_ONEAPI_FUNCTION_PROPERTY(syclexp::single_task_kernel) -void singleTaskKernelDefaultValues(int Ivalue = 1, unsigned int Uvalue = 3) {} - -// expected-error@+3 {{a function with a default argument value cannot be used as a kernel function, 'int Ivalue = 1'}} -// expected-error@+2 {{a function with a default argument value cannot be used as a kernel function, 'unsigned int Uvalue = 3'}} -SYCL_EXT_ONEAPI_FUNCTION_PROPERTY(syclexp::nd_range_kernel<1>) -void ndRangeKernelDefaultValues(int Ivalue = 1, unsigned int Uvalue = 3) {} - -// expected-error@+2 {{kernel free function should have return type 'void'}} -SYCL_EXT_ONEAPI_FUNCTION_PROPERTY(syclexp::single_task_kernel) -int singleTaskKernelReturnType(int Value) {} - -// expected-error@+2 {{kernel free function should have return type 'void'}} -SYCL_EXT_ONEAPI_FUNCTION_PROPERTY(syclexp::nd_range_kernel<1>) -int ndRangeKernelReturnType(int Value) {} From 2028109dc3d331a000d084da44dc42f9225c3edf Mon Sep 17 00:00:00 2001 From: "Klochkov, Denis" Date: Tue, 6 May 2025 17:39:54 +0200 Subject: [PATCH 4/7] fix formatting --- clang/lib/Sema/SemaSYCL.cpp | 2 +- .../free_function_kernels/free_function_kernels_diagnostics.cpp | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/clang/lib/Sema/SemaSYCL.cpp b/clang/lib/Sema/SemaSYCL.cpp index 79b6fe0bb998c..12b35817735cc 100644 --- a/clang/lib/Sema/SemaSYCL.cpp +++ b/clang/lib/Sema/SemaSYCL.cpp @@ -5797,7 +5797,7 @@ static void CheckFreeFunctionDiagnostics(Sema &S, FunctionDecl *FD) { for (ParmVarDecl *Param : FD->parameters()) { if (Param->hasDefaultArg()) { S.Diag(Param->getLocation(), diag::err_free_function_with_default_arg) - << Param->getSourceRange(); + << Param->getSourceRange(); continue; } } diff --git a/sycl/test/extensions/free_function_kernels/free_function_kernels_diagnostics.cpp b/sycl/test/extensions/free_function_kernels/free_function_kernels_diagnostics.cpp index ab42b3be00f7b..b2cd6b07003e5 100644 --- a/sycl/test/extensions/free_function_kernels/free_function_kernels_diagnostics.cpp +++ b/sycl/test/extensions/free_function_kernels/free_function_kernels_diagnostics.cpp @@ -18,4 +18,3 @@ SYCL_EXT_ONEAPI_FUNCTION_PROPERTY(syclexp::single_task_kernel) SYCL_EXT_ONEAPI_FUNCTION_PROPERTY(syclexp::nd_range_kernel<3>) void ndRangeKernelVariadic( // expected-error {{free function kernel cannot be a variadic function}} ...) {} - From c3a815e8451a9a591684c48bb6e2e87c9b4d0fb7 Mon Sep 17 00:00:00 2001 From: "Klochkov, Denis" Date: Wed, 7 May 2025 11:01:08 +0200 Subject: [PATCH 5/7] [SYCL] remove unnecessary keyword --- clang/lib/Sema/SemaSYCL.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/clang/lib/Sema/SemaSYCL.cpp b/clang/lib/Sema/SemaSYCL.cpp index 12b35817735cc..ff772cb4e5938 100644 --- a/clang/lib/Sema/SemaSYCL.cpp +++ b/clang/lib/Sema/SemaSYCL.cpp @@ -5798,7 +5798,6 @@ static void CheckFreeFunctionDiagnostics(Sema &S, FunctionDecl *FD) { if (Param->hasDefaultArg()) { S.Diag(Param->getLocation(), diag::err_free_function_with_default_arg) << Param->getSourceRange(); - continue; } } } From 3fc31c1ce3720a25bf385737be3d2c81cb6e8219 Mon Sep 17 00:00:00 2001 From: "Klochkov, Denis" Date: Wed, 7 May 2025 12:17:16 +0200 Subject: [PATCH 6/7] [SYCL] do not process free function if it does not pass diagnostics check --- clang/lib/Sema/SemaSYCL.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/clang/lib/Sema/SemaSYCL.cpp b/clang/lib/Sema/SemaSYCL.cpp index ff772cb4e5938..79c4dcd2228d7 100644 --- a/clang/lib/Sema/SemaSYCL.cpp +++ b/clang/lib/Sema/SemaSYCL.cpp @@ -5783,28 +5783,32 @@ void SemaSYCL::MarkDevices() { } } -static void CheckFreeFunctionDiagnostics(Sema &S, FunctionDecl *FD) { +static bool CheckFreeFunctionDiagnostics(Sema &S, FunctionDecl *FD) { if (FD->isVariadic()) { S.Diag(FD->getLocation(), diag::err_free_function_variadic_args); - return; + return false; } if (!FD->getReturnType()->isVoidType()) { S.Diag(FD->getLocation(), diag::err_free_function_return_type); - return; + return false; } + bool ReturnStatus = true; for (ParmVarDecl *Param : FD->parameters()) { if (Param->hasDefaultArg()) { S.Diag(Param->getLocation(), diag::err_free_function_with_default_arg) << Param->getSourceRange(); + ReturnStatus = false; } } + return ReturnStatus; } void SemaSYCL::ProcessFreeFunction(FunctionDecl *FD) { if (isFreeFunction(FD)) { - CheckFreeFunctionDiagnostics(SemaRef, FD); + if (!CheckFreeFunctionDiagnostics(SemaRef, FD)) + return; SyclKernelDecompMarker DecompMarker(*this); SyclKernelFieldChecker FieldChecker(*this); SyclKernelUnionChecker UnionChecker(*this); From 95916e19bf284cbf01eeb974ed0d0bebb91a83e2 Mon Sep 17 00:00:00 2001 From: "Klochkov, Denis" Date: Wed, 7 May 2025 14:42:34 +0200 Subject: [PATCH 7/7] [SYCL] follow clang practise to return true if check is not passed --- clang/lib/Sema/SemaSYCL.cpp | 17 +++++++---------- clang/test/SemaSYCL/free_function_negative.cpp | 2 -- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/clang/lib/Sema/SemaSYCL.cpp b/clang/lib/Sema/SemaSYCL.cpp index 79c4dcd2228d7..ab0864aaf41fe 100644 --- a/clang/lib/Sema/SemaSYCL.cpp +++ b/clang/lib/Sema/SemaSYCL.cpp @@ -5785,29 +5785,26 @@ void SemaSYCL::MarkDevices() { static bool CheckFreeFunctionDiagnostics(Sema &S, FunctionDecl *FD) { if (FD->isVariadic()) { - S.Diag(FD->getLocation(), diag::err_free_function_variadic_args); - return false; + return S.Diag(FD->getLocation(), diag::err_free_function_variadic_args); } if (!FD->getReturnType()->isVoidType()) { - S.Diag(FD->getLocation(), diag::err_free_function_return_type); - return false; + return S.Diag(FD->getLocation(), diag::err_free_function_return_type); } - bool ReturnStatus = true; for (ParmVarDecl *Param : FD->parameters()) { if (Param->hasDefaultArg()) { - S.Diag(Param->getLocation(), diag::err_free_function_with_default_arg) - << Param->getSourceRange(); - ReturnStatus = false; + return S.Diag(Param->getLocation(), + diag::err_free_function_with_default_arg) + << Param->getSourceRange(); } } - return ReturnStatus; + return false; } void SemaSYCL::ProcessFreeFunction(FunctionDecl *FD) { if (isFreeFunction(FD)) { - if (!CheckFreeFunctionDiagnostics(SemaRef, FD)) + if (CheckFreeFunctionDiagnostics(SemaRef, FD)) return; SyclKernelDecompMarker DecompMarker(*this); SyclKernelFieldChecker FieldChecker(*this); diff --git a/clang/test/SemaSYCL/free_function_negative.cpp b/clang/test/SemaSYCL/free_function_negative.cpp index 20340f5534a50..3c8e5a07851b5 100644 --- a/clang/test/SemaSYCL/free_function_negative.cpp +++ b/clang/test/SemaSYCL/free_function_negative.cpp @@ -20,13 +20,11 @@ singleTaskKernelDefaultValues(int Value = 1) { ndRangeKernelDefaultValues(int Value = 1) { } -// expected-error@+3 {{a function with a default argument value cannot be used to define SYCL free function kernel}} // expected-error@+2 {{a function with a default argument value cannot be used to define SYCL free function kernel}} [[__sycl_detail__::add_ir_attributes_function("sycl-single-task-kernel", 2)]] void singleTaskKernelDefaultValues(int Ivalue = 1, unsigned int Uvalue = 3) { } -// expected-error@+3 {{a function with a default argument value cannot be used to define SYCL free function kernel}} // expected-error@+2 {{a function with a default argument value cannot be used to define SYCL free function kernel}} [[__sycl_detail__::add_ir_attributes_function("sycl-nd-range-kernel", 2)]] void ndRangeKernelDefaultValues(int Ivalue = 1, unsigned int Uvalue = 3) {