https://github.com/llvm-beanz created https://github.com/llvm/llvm-project/pull/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. >From 6022f3bd57f1ebf21f49d12871c9dbae2fc8cf29 Mon Sep 17 00:00:00 2001 From: Chris Bieneman <chris.biene...@me.com> Date: Tue, 15 Apr 2025 13:20:41 -0500 Subject: [PATCH] [HLSL][OpenCL] Strip addrspace from implicit cast diags 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. --- clang/lib/Sema/SemaChecking.cpp | 8 ++++++++ clang/test/SemaHLSL/Language/ImpCastAddrSpace.hlsl | 12 ++++++++++++ clang/test/SemaOpenCL/cl20-device-side-enqueue.cl | 2 +- 3 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 clang/test/SemaHLSL/Language/ImpCastAddrSpace.hlsl diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index d0143d29a4bcc..90293093fadd2 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -11360,6 +11360,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@-2{{implicit conversion changes signedness: '__private char' to 'unsigned {{int|long}}'}} +// expected-warning-re@-2{{implicit conversion changes signedness: 'char' to 'unsigned {{int|long}}'}} #endif #define UINT_MAX 4294967295 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits