olestrohm created this revision. olestrohm added reviewers: Anastasia, rjmccall. olestrohm added a project: clang. Herald added subscribers: ldrumm, yaxunl. olestrohm requested review of this revision. Herald added a subscriber: cfe-commits.
Allow converting between types with different address spaces. This allows converting a `__private int` to a `__private int`, which is currently not possible. It also allows converting a value to any other address space, which can make sense since the actual bit representation of the values doesn't depend on the address space. This is the solution I chose currently allows converting between any address space because the address space of `SrcExpr` is erased before entering the function, so allowing only converting when the address spaces is the same would require larger changes. I'm not sure if this conversion should be allowed, though converting to the exact same type definitely should. Fixes the first issue in PR49221 Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D102689 Files: clang/lib/Sema/SemaCast.cpp clang/test/SemaOpenCLCXX/reinterpret-cast.clcpp Index: clang/test/SemaOpenCLCXX/reinterpret-cast.clcpp =================================================================== --- clang/test/SemaOpenCLCXX/reinterpret-cast.clcpp +++ clang/test/SemaOpenCLCXX/reinterpret-cast.clcpp @@ -13,6 +13,11 @@ auto i2_to_i = reinterpret_cast<int>(i2); // expected-error{{reinterpret_cast from vector 'int2' (vector of 2 'int' values) to scalar 'int' of different size}} auto i2_to_i2 = reinterpret_cast<int2>(i2); + __private short s; + auto s2 = reinterpret_cast<__private short>(s); + auto s3 = reinterpret_cast<decltype(s)>(s); + auto s4 = reinterpret_cast<__global short>(s); + // Only integral types (and pointer/references) can be reinterpret casted to themselves. // Currently this does not include any opencl types. reserve_id_t r_id1; Index: clang/lib/Sema/SemaCast.cpp =================================================================== --- clang/lib/Sema/SemaCast.cpp +++ clang/lib/Sema/SemaCast.cpp @@ -2356,7 +2356,10 @@ return TC_Failed; } - if (SrcType == DestType) { + if (SrcType == DestType || + (Self.LangOpts.OpenCL && + Self.Context.removeAddrSpaceQualType(SrcType) == + Self.Context.removeAddrSpaceQualType(DestType))) { // C++ 5.2.10p2 has a note that mentions that, subject to all other // restrictions, a cast to the same type is allowed so long as it does not // cast away constness. In C++98, the intent was not entirely clear here,
Index: clang/test/SemaOpenCLCXX/reinterpret-cast.clcpp =================================================================== --- clang/test/SemaOpenCLCXX/reinterpret-cast.clcpp +++ clang/test/SemaOpenCLCXX/reinterpret-cast.clcpp @@ -13,6 +13,11 @@ auto i2_to_i = reinterpret_cast<int>(i2); // expected-error{{reinterpret_cast from vector 'int2' (vector of 2 'int' values) to scalar 'int' of different size}} auto i2_to_i2 = reinterpret_cast<int2>(i2); + __private short s; + auto s2 = reinterpret_cast<__private short>(s); + auto s3 = reinterpret_cast<decltype(s)>(s); + auto s4 = reinterpret_cast<__global short>(s); + // Only integral types (and pointer/references) can be reinterpret casted to themselves. // Currently this does not include any opencl types. reserve_id_t r_id1; Index: clang/lib/Sema/SemaCast.cpp =================================================================== --- clang/lib/Sema/SemaCast.cpp +++ clang/lib/Sema/SemaCast.cpp @@ -2356,7 +2356,10 @@ return TC_Failed; } - if (SrcType == DestType) { + if (SrcType == DestType || + (Self.LangOpts.OpenCL && + Self.Context.removeAddrSpaceQualType(SrcType) == + Self.Context.removeAddrSpaceQualType(DestType))) { // C++ 5.2.10p2 has a note that mentions that, subject to all other // restrictions, a cast to the same type is allowed so long as it does not // cast away constness. In C++98, the intent was not entirely clear here,
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits