https://github.com/jhuber6 created https://github.com/llvm/llvm-project/pull/175275
Summary: The original logic permitted this, while it's not permitted by the standard. >From 1718fae70e0b833e08aaba041e1296c3c585ed2b Mon Sep 17 00:00:00 2001 From: Joseph Huber <[email protected]> Date: Fri, 9 Jan 2026 20:05:32 -0600 Subject: [PATCH] [SPIR-V] Do not allow AS(2) to convert to generic Summary: The original logic permitted this, while it's not permitted by the standard. --- clang/lib/Basic/Targets/SPIR.h | 3 ++- clang/test/Sema/spirv-address-space.c | 3 +-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/clang/lib/Basic/Targets/SPIR.h b/clang/lib/Basic/Targets/SPIR.h index 8030aa9e10370..fad4c373d4725 100644 --- a/clang/lib/Basic/Targets/SPIR.h +++ b/clang/lib/Basic/Targets/SPIR.h @@ -325,7 +325,8 @@ class LLVM_LIBRARY_VISIBILITY BaseSPIRVTargetInfo : public BaseSPIRTargetInfo { (isTargetAddressSpace(A) && toTargetAddressSpace(A) == /*Generic=*/4)) && isTargetAddressSpace(B) && - toTargetAddressSpace(B) <= /*Generic=*/4); + (toTargetAddressSpace(B) <= /*Generic=*/4 && + toTargetAddressSpace(B) != /*Constant=*/2); } void getTargetDefines(const LangOptions &Opts, diff --git a/clang/test/Sema/spirv-address-space.c b/clang/test/Sema/spirv-address-space.c index 7ec41fd79bd96..fc212577b4841 100644 --- a/clang/test/Sema/spirv-address-space.c +++ b/clang/test/Sema/spirv-address-space.c @@ -9,7 +9,7 @@ #define _AS999 __attribute__((address_space(999))) void *p1(void _AS1 *p) { return p; } -void *p2(void _AS2 *p) { return p; } +void *p2(void _AS2 *p) { return p; } // expected-error {{returning '_AS2 void *' from a function with result type 'void *' changes address space of pointer}} void *p3(void _AS3 *p) { return p; } void *p4(void _AS4 *p) { return p; } void *p5(void _AS5 *p) { return p; } // expected-error {{returning '_AS5 void *' from a function with result type 'void *' changes address space of pointer}} @@ -18,4 +18,3 @@ void *pc(void __attribute__((opencl_local)) *p) { return p; } // expected-error void _AS1 *r0(void _AS1 *p) { return p; } void _AS1 *r1(void *p) { return p; } // expected-error {{returning 'void *' from a function with result type '_AS1 void *' changes address space of pointer}} void _AS1 *r2(void *p) { return (void _AS1 *)p; } - _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
