[clang] 52e0337 - [HLSL][OpenCL] Strip addrspace from implicit cast diags (#135830)
via cfe-commits
cfe-commits at lists.llvm.org
Wed Apr 16 10:13:22 PDT 2025
Author: Chris B
Date: 2025-04-16T12:13:19-05:00
New Revision: 52e0337ea34142f55c427493e9ca2be5fce2dd38
URL: https://github.com/llvm/llvm-project/commit/52e0337ea34142f55c427493e9ca2be5fce2dd38
DIFF: https://github.com/llvm/llvm-project/commit/52e0337ea34142f55c427493e9ca2be5fce2dd38.diff
LOG: [HLSL][OpenCL] Strip addrspace from implicit cast diags (#135830)
The address space of a source value for an implicit cast isn't really
relevant when emitting conversion warnings. Since the lvalue->rvalue
cast effectively removes the address space they don't factor in, but
they do create visual noise in the diagnostics.
This is a small quality-of-life fixup to get in as HLSL adopts more
address space annotations.
Added:
clang/test/SemaHLSL/Language/ImpCastAddrSpace.hlsl
Modified:
clang/lib/Sema/SemaChecking.cpp
clang/test/SemaOpenCL/cl20-device-side-enqueue.cl
Removed:
################################################################################
diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp
index 42da9ba97e0d3..26c2dc655a931 100644
--- a/clang/lib/Sema/SemaChecking.cpp
+++ b/clang/lib/Sema/SemaChecking.cpp
@@ -11417,6 +11417,14 @@ static void AnalyzeAssignment(Sema &S, BinaryOperator *E) {
static void DiagnoseImpCast(Sema &S, Expr *E, QualType SourceType, QualType T,
SourceLocation CContext, unsigned diag,
bool pruneControlFlow = false) {
+ // For languages like HLSL and OpenCL, implicit conversion diagnostics listing
+ // address space annotations isn't really useful. The warnings aren't because
+ // you're converting a `private int` to `unsigned int`, it is because you're
+ // conerting `int` to `unsigned int`.
+ if (SourceType.hasAddressSpace())
+ SourceType = S.getASTContext().removeAddrSpaceQualType(SourceType);
+ if (T.hasAddressSpace())
+ T = S.getASTContext().removeAddrSpaceQualType(T);
if (pruneControlFlow) {
S.DiagRuntimeBehavior(E->getExprLoc(), E,
S.PDiag(diag)
diff --git a/clang/test/SemaHLSL/Language/ImpCastAddrSpace.hlsl b/clang/test/SemaHLSL/Language/ImpCastAddrSpace.hlsl
new file mode 100644
index 0000000000000..61e71b219b721
--- /dev/null
+++ b/clang/test/SemaHLSL/Language/ImpCastAddrSpace.hlsl
@@ -0,0 +1,12 @@
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -finclude-default-header -Wconversion -fnative-half-type %s -verify
+
+static double D = 2.0;
+static int I = D; // expected-warning{{implicit conversion turns floating-point number into integer: 'double' to 'int'}}
+groupshared float F = I; // expected-warning{{implicit conversion from 'int' to 'float' may lose precision}}
+
+export void fn() {
+ half d = I; // expected-warning{{implicit conversion from 'int' to 'half' may lose precision}}
+ int i = D; // expected-warning{{implicit conversion turns floating-point number into integer: 'double' to 'int'}}
+ int j = F; // expected-warning{{implicit conversion turns floating-point number into integer: 'float' to 'int'}}
+ int k = d; // expected-warning{{implicit conversion turns floating-point number into integer: 'half' to 'int'}}
+}
diff --git a/clang/test/SemaOpenCL/cl20-device-side-enqueue.cl b/clang/test/SemaOpenCL/cl20-device-side-enqueue.cl
index 36b901fc5f29e..524de8ce2f7dc 100644
--- a/clang/test/SemaOpenCL/cl20-device-side-enqueue.cl
+++ b/clang/test/SemaOpenCL/cl20-device-side-enqueue.cl
@@ -97,7 +97,7 @@ kernel void enqueue_kernel_tests(void) {
},
c, 1024L);
#ifdef WCONV
-// expected-warning-re at -2{{implicit conversion changes signedness: '__private char' to 'unsigned {{int|long}}'}}
+// expected-warning-re at -2{{implicit conversion changes signedness: 'char' to 'unsigned {{int|long}}'}}
#endif
#define UINT_MAX 4294967295
More information about the cfe-commits
mailing list