Extend reference binding behavior to account for address spaces. This change also fixes the diagnostic wording (for qualifier mismatch in reference binding) and simplifies it by using Qualifiers print method.
Details
Diff Detail
Event Timeline
include/clang/Basic/DiagnosticSemaKinds.td | ||
---|---|---|
1831 | We say that references are bound to objects, not that objects are bound to references. | |
lib/Sema/SemaInit.cpp | ||
4628 | I think the comment should go after the quote in the main comment above, i.e. something like "For address spaces, we interpret this to mean..." Also, this clause is part of the parenthesized group and should be indented consistently. |
So static_cast permits conversions from AS1 to AS2 where that conversion is implicitly allowed, and the new addrspace_cast would permit conversions from AS1 to AS2 where it is explicitly allowed. That seems like it fits in rather well with the idea in D57464 regarding support for specifying permitted AS conversions in target.
How about nested pointers, such as __X int * * -> __Y int * * or __X int * __Y * -> int * __Y *? static_cast has some ruleset for how to deal with qualifiers in nested pointers, I think, but I'm not sure how the rules for ASes should be here.
There's also C-style casts. Will addrspace_cast be added to the C-style cast rules somewhere?
(I should probably have commented on the original RFC)
We had discussion related to this with John earlier. And I documented it in this bug: https://bugs.llvm.org/show_bug.cgi?id=39674
There's also C-style casts. Will addrspace_cast be added to the C-style cast rules somewhere?
(I should probably have commented on the original RFC)
Yes, exactly. I am working on a patch now that separates the address space casting out into a function to be used in C-style cast only as a first step (because I would like to disallow accidental unsafe address space conversions in reinterpret_cast). Then we would just need to add parsing of a new cast operator and mapping into the new function.
- Changed the diagnostic for binding reference and combined with existing similar one. That affected more tests however.
- Changed comment explaining address space behavior in the reference initialization.
- Reformatted.
I think we observed something similar to this downstream in C, and I might have a patch(es) that fixes it.
Yes, exactly. I am working on a patch now that separates the address space casting out into a function to be used in C-style cast only as a first step (because I would like to disallow accidental unsafe address space conversions in reinterpret_cast). Then we would just need to add parsing of a new cast operator and mapping into the new function.
Okay, sounds good!
- Fixed incorrect diagnostic in address space mismatch case when binding reference to a temporary value of a constant with incompatible type. Added missing test case.
test/SemaOpenCLCXX/address-space-references.cl | ||
---|---|---|
8 | Is there a reason the declaration is commented out? If it's just a problem with the resolution, wouldn't it still be possible to have the declaration here anyway? |
test/SemaOpenCLCXX/address-space-references.cl | ||
---|---|---|
8 | Hmm... actually not at all! I commented it to show that this could work better... but FIXME is good enough to indicate this! |
@rjmccall or @ebevhan do you have any more feedback for this patch?
Btw, it has now dependency with https://reviews.llvm.org/D61318
Due to my recent commits I had to changed this slightly so it is now under a new review: https://reviews.llvm.org/D62914
We say that references are bound to objects, not that objects are bound to references.