Clang was creating a DerivedToBase ImplicitCastExpr that was also
casting between address spaces as part of the second step in the
standard conversion sequence. Defer the address space conversion to
the third step in the sequence instead, such that we get a separate
ImplicitCastExpr for the address space conversion.
Details
Diff Detail
- Repository
- rG LLVM Github Monorepo
Event Timeline
It doesn't seem so, patching the test as follows gives reasonable output.
@@ -73,8 +73,10 @@ void pr43145_3(int n) { // Implicit conversion of derived to base. void functionWithBaseArg(class B2 *b) {} +void functionWithBaseArgRef(class B2 &b) {} void pr43145_4() { Derived d; functionWithBaseArg(&d); + functionWithBaseArgRef(d); }
clang/lib/Sema/SemaExprCXX.cpp | ||
---|---|---|
4108 | Hmm, sorry, just noticed this. Could you write this so that it preserves the original kind of pointer of ToType? I think it has to be a PointerType, BlockPointerType, or ObjCObjectPointerType. It doesn't look like there's an existing utility for that. |
I know this is some really late feedback on this patch. I struck upon some issues with while rebasing D62574.
clang/lib/Sema/SemaExprCXX.cpp | ||
---|---|---|
4106 | I don't think this will manage to properly repack the type if it's hidden behind enough sugar. When I enable C++ address space conversions in a non-OpenCL context, this breaks the derived-to-base example in CodeGenCXX/address-space-cast.cpp. IsPointerConversion doesn't have an issue with this since it reconstructs the destination type with the appropriate qualifiers through BuildSimilarlyQualifiedPointerType. Wouldn't it make more sense to have *PointerConversion only handle the derived-to-base and leave the address space conversion to *QualificationConversion? |
clang/lib/Sema/SemaExprCXX.cpp | ||
---|---|---|
4106 |
I didn't have a thorough look to understand all implications of that, but maybe it's worth trying. Not sure I'll be able to follow up on this any time soon, would you be able to give it a try? |
clang/lib/Sema/SemaExprCXX.cpp | ||
---|---|---|
4106 | I'll see if I can have a look, or at least make the existing implementation a bit more thorough. To be entirely honest, I feel a bit stupid right now: I forgot that I added the derived-to-base test in the test case I mentioned in my local experimental branch, so of course you wouldn't be able to use that as a baseline. Oops! |
I don't think this will manage to properly repack the type if it's hidden behind enough sugar. When I enable C++ address space conversions in a non-OpenCL context, this breaks the derived-to-base example in CodeGenCXX/address-space-cast.cpp.
IsPointerConversion doesn't have an issue with this since it reconstructs the destination type with the appropriate qualifiers through BuildSimilarlyQualifiedPointerType.
Wouldn't it make more sense to have *PointerConversion only handle the derived-to-base and leave the address space conversion to *QualificationConversion?