ebevhan added inline comments.

================
Comment at: lib/Sema/SemaCast.cpp:2224
+  } else if (IsLValueCast) {
     Kind = CK_LValueBitCast;
   } else if (DestType->isObjCObjectPointerType()) {
----------------
This might not be applicable to this patch, but just something I noticed.

So `reinterpret_cast` only operates on pointers when dealing with address 
spaces. What about something like
```
T a;
T& a_ref = reinterpret_cast<T&>(a);
```
`reinterpret_cast` on an lvalue like this is equivalent to 
`*reinterpret_cast<T*>(&a)`. So for AS code:
```
__private T x;
__generic T& ref = reinterpret_cast<__generic T&>(x);
```
This should work, since `*reinterpret_cast<__generic T*>(&x)` is valid, correct?

What if we have the reference cast case with a different address space like 
this? Doesn't the `IsLValueCast` check need to be first?



================
Comment at: lib/Sema/SemaCast.cpp:2309
+    auto DestPointeeTypeWithoutAS = Self.Context.removeAddrSpaceQualType(
+        DestPointeeType.getCanonicalType());
+    return Self.Context.hasSameType(SrcPointeeTypeWithoutAS,
----------------
Maybe I'm mistaken, but won't getting the canonical type here drop qualifiers 
(like cv) in nested pointers? If so, an addrspace_cast might strip qualifiers 
by mistake.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D58346/new/

https://reviews.llvm.org/D58346



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to