From 21d768472dddfe13f8f88f07b2ae4e9aaf23ad99 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 21 Feb 2026 00:26:01 +0000 Subject: [PATCH 1/5] Initial plan From 2ac173b6ce4a09c60e25d8fcad9df234407dd7e4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 21 Feb 2026 00:56:02 +0000 Subject: [PATCH 2/5] Emit error for user-defined conversion operators in HLSL (fixes #5103) Add err_hlsl_unsupported_conversion_operator diagnostic and check in CheckConversionDeclarator to reject conversion operators in HLSL. Previously these were silently ignored, misleading users into thinking their cast operator overloads were being used. Co-authored-by: damyanp <8118402+damyanp@users.noreply.github.com> --- .../clang/Basic/DiagnosticSemaKinds.td | 2 ++ tools/clang/lib/Sema/SemaDeclCXX.cpp | 8 ++++++ .../SemaHLSL/conversion-operator-errors.hlsl | 27 +++++++++++++++++++ 3 files changed, 37 insertions(+) create mode 100644 tools/clang/test/SemaHLSL/conversion-operator-errors.hlsl diff --git a/tools/clang/include/clang/Basic/DiagnosticSemaKinds.td b/tools/clang/include/clang/Basic/DiagnosticSemaKinds.td index 7e25e99d46..0117982866 100644 --- a/tools/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/tools/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -7550,6 +7550,8 @@ def err_hlsl_matrix_member_zero_in_one_based: Error< "the digit '0' is used in '%0', but the syntax is for one-based rows and columns">; def err_hlsl_overloading_operator_disallowed: Error< "overloading %select{|non-member }1%0 is not allowed">; +def err_hlsl_unsupported_conversion_operator: Error< + "conversion operator is not supported in HLSL">; def err_hlsl_vector_member_bad_format: Error< "invalid format for vector swizzle '%0'">; def err_hlsl_vector_member_empty: Error< diff --git a/tools/clang/lib/Sema/SemaDeclCXX.cpp b/tools/clang/lib/Sema/SemaDeclCXX.cpp index 3cd892f49e..490bd04e42 100644 --- a/tools/clang/lib/Sema/SemaDeclCXX.cpp +++ b/tools/clang/lib/Sema/SemaDeclCXX.cpp @@ -6956,6 +6956,14 @@ static void extendRight(SourceRange &R, const SourceRange &After) { /// well-formed type for the conversion operator. void Sema::CheckConversionDeclarator(Declarator &D, QualType &R, StorageClass& SC) { + // HLSL Change Starts + if (getLangOpts().HLSL) { + Diag(D.getIdentifierLoc(), diag::err_hlsl_unsupported_conversion_operator); + D.setInvalidType(); + return; + } + // HLSL Change Ends + // C++ [class.conv.fct]p1: // Neither parameter types nor return type can be specified. The // type of a conversion function (8.3.5) is "function taking no diff --git a/tools/clang/test/SemaHLSL/conversion-operator-errors.hlsl b/tools/clang/test/SemaHLSL/conversion-operator-errors.hlsl new file mode 100644 index 0000000000..6ba5ef1dfb --- /dev/null +++ b/tools/clang/test/SemaHLSL/conversion-operator-errors.hlsl @@ -0,0 +1,27 @@ +// RUN: %dxc -Tlib_6_3 -verify -HV 2021 %s + +// This test verifies that dxcompiler generates an error when defining +// a conversion operator (cast operator), which is not supported in HLSL. + +struct MyStruct { + float4 f; + + // expected-error@+1 {{conversion operator is not supported in HLSL}} + operator float4() { + return 42; + } +}; + +struct AnotherStruct { + int x; + + // expected-error@+1 {{conversion operator is not supported in HLSL}} + operator int() { + return x; + } + + // expected-error@+1 {{conversion operator is not supported in HLSL}} + operator bool() { + return x != 0; + } +}; From 744ec43a2657eef3956d42d48440bac9c8af04a9 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 21 Feb 2026 02:03:45 +0000 Subject: [PATCH 3/5] Update diagnostic message for consistency: 'conversion operator overload is not allowed' Co-authored-by: damyanp <8118402+damyanp@users.noreply.github.com> --- tools/clang/include/clang/Basic/DiagnosticSemaKinds.td | 2 +- tools/clang/test/SemaHLSL/conversion-operator-errors.hlsl | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tools/clang/include/clang/Basic/DiagnosticSemaKinds.td b/tools/clang/include/clang/Basic/DiagnosticSemaKinds.td index 0117982866..96618658fb 100644 --- a/tools/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/tools/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -7551,7 +7551,7 @@ def err_hlsl_matrix_member_zero_in_one_based: Error< def err_hlsl_overloading_operator_disallowed: Error< "overloading %select{|non-member }1%0 is not allowed">; def err_hlsl_unsupported_conversion_operator: Error< - "conversion operator is not supported in HLSL">; + "conversion operator overload is not allowed">; def err_hlsl_vector_member_bad_format: Error< "invalid format for vector swizzle '%0'">; def err_hlsl_vector_member_empty: Error< diff --git a/tools/clang/test/SemaHLSL/conversion-operator-errors.hlsl b/tools/clang/test/SemaHLSL/conversion-operator-errors.hlsl index 6ba5ef1dfb..b146d2a6f6 100644 --- a/tools/clang/test/SemaHLSL/conversion-operator-errors.hlsl +++ b/tools/clang/test/SemaHLSL/conversion-operator-errors.hlsl @@ -6,7 +6,7 @@ struct MyStruct { float4 f; - // expected-error@+1 {{conversion operator is not supported in HLSL}} + // expected-error@+1 {{conversion operator overload is not allowed}} operator float4() { return 42; } @@ -15,12 +15,12 @@ struct MyStruct { struct AnotherStruct { int x; - // expected-error@+1 {{conversion operator is not supported in HLSL}} + // expected-error@+1 {{conversion operator overload is not allowed}} operator int() { return x; } - // expected-error@+1 {{conversion operator is not supported in HLSL}} + // expected-error@+1 {{conversion operator overload is not allowed}} operator bool() { return x != 0; } From ce85b5c5896b843d09d8cfc2a7b014db494cf84c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 21 Feb 2026 04:11:47 +0000 Subject: [PATCH 4/5] Fix diagnostic message: 'conversion operator overloading is not allowed' Co-authored-by: damyanp <8118402+damyanp@users.noreply.github.com> --- tools/clang/include/clang/Basic/DiagnosticSemaKinds.td | 2 +- tools/clang/test/SemaHLSL/conversion-operator-errors.hlsl | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tools/clang/include/clang/Basic/DiagnosticSemaKinds.td b/tools/clang/include/clang/Basic/DiagnosticSemaKinds.td index 96618658fb..b39a6993b0 100644 --- a/tools/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/tools/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -7551,7 +7551,7 @@ def err_hlsl_matrix_member_zero_in_one_based: Error< def err_hlsl_overloading_operator_disallowed: Error< "overloading %select{|non-member }1%0 is not allowed">; def err_hlsl_unsupported_conversion_operator: Error< - "conversion operator overload is not allowed">; + "conversion operator overloading is not allowed">; def err_hlsl_vector_member_bad_format: Error< "invalid format for vector swizzle '%0'">; def err_hlsl_vector_member_empty: Error< diff --git a/tools/clang/test/SemaHLSL/conversion-operator-errors.hlsl b/tools/clang/test/SemaHLSL/conversion-operator-errors.hlsl index b146d2a6f6..58b3649e05 100644 --- a/tools/clang/test/SemaHLSL/conversion-operator-errors.hlsl +++ b/tools/clang/test/SemaHLSL/conversion-operator-errors.hlsl @@ -6,7 +6,7 @@ struct MyStruct { float4 f; - // expected-error@+1 {{conversion operator overload is not allowed}} + // expected-error@+1 {{conversion operator overloading is not allowed}} operator float4() { return 42; } @@ -15,12 +15,12 @@ struct MyStruct { struct AnotherStruct { int x; - // expected-error@+1 {{conversion operator overload is not allowed}} + // expected-error@+1 {{conversion operator overloading is not allowed}} operator int() { return x; } - // expected-error@+1 {{conversion operator overload is not allowed}} + // expected-error@+1 {{conversion operator overloading is not allowed}} operator bool() { return x != 0; } From ca5ca4f7ebbeb8865b706b5c3b39475da64b92a5 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 23 Feb 2026 18:01:16 +0000 Subject: [PATCH 5/5] Add release note for conversion operator error Co-authored-by: damyanp <8118402+damyanp@users.noreply.github.com> --- docs/ReleaseNotes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/ReleaseNotes.md b/docs/ReleaseNotes.md index d426b955f2..b0d8b9963f 100644 --- a/docs/ReleaseNotes.md +++ b/docs/ReleaseNotes.md @@ -39,6 +39,7 @@ line upon naming the release. Refer to previous for appropriate section names. #### Other Changes - Fixed mesh shader semantics that were incorrectly case sensitive. +- User-defined conversion operators (e.g., `operator float4()`) now produce an error instead of being silently ignored. ### Version 1.9.2602