svenvh created this revision. svenvh added reviewers: Anastasia, rjmccall. Herald added a subscriber: yaxunl.
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. https://reviews.llvm.org/D70605 Files: clang/lib/Sema/SemaExprCXX.cpp clang/test/CodeGenOpenCLCXX/addrspace-derived-base.cl Index: clang/test/CodeGenOpenCLCXX/addrspace-derived-base.cl =================================================================== --- clang/test/CodeGenOpenCLCXX/addrspace-derived-base.cl +++ clang/test/CodeGenOpenCLCXX/addrspace-derived-base.cl @@ -69,3 +69,12 @@ // CHECK: bitcast i8 addrspace(4)* %add.ptr1 to %class.B2 addrspace(4)* // CHECK: call {{.*}} @_ZNU3AS42B26getRefEv } + +// Implicit conversion of derived to base. + +void functionWithBaseArg(class B2 *b) {} + +void pr43145_4() { + Derived d; + functionWithBaseArg(&d); +} Index: clang/lib/Sema/SemaExprCXX.cpp =================================================================== --- clang/lib/Sema/SemaExprCXX.cpp +++ clang/lib/Sema/SemaExprCXX.cpp @@ -4095,9 +4095,21 @@ << From->getSourceRange(); } + // Defer address space conversion to the third conversion. + QualType FromPteeType = From->getType()->getPointeeType(); + QualType ToPteeType = ToType->getPointeeType(); + QualType NewToType = ToType; + if (!FromPteeType.isNull() && !ToPteeType.isNull() && + FromPteeType.getAddressSpace() != ToPteeType.getAddressSpace()) { + NewToType = Context.removeAddrSpaceQualType(ToPteeType); + NewToType = Context.getAddrSpaceQualType(NewToType, + FromPteeType.getAddressSpace()); + NewToType = Context.getPointerType(NewToType); + } + CastKind Kind; CXXCastPath BasePath; - if (CheckPointerConversion(From, ToType, Kind, BasePath, CStyle)) + if (CheckPointerConversion(From, NewToType, Kind, BasePath, CStyle)) return ExprError(); // Make sure we extend blocks if necessary. @@ -4108,8 +4120,8 @@ From = E.get(); } if (getLangOpts().allowsNonTrivialObjCLifetimeQualifiers()) - CheckObjCConversion(SourceRange(), ToType, From, CCK); - From = ImpCastExprToType(From, ToType, Kind, VK_RValue, &BasePath, CCK) + CheckObjCConversion(SourceRange(), NewToType, From, CCK); + From = ImpCastExprToType(From, NewToType, Kind, VK_RValue, &BasePath, CCK) .get(); break; }
Index: clang/test/CodeGenOpenCLCXX/addrspace-derived-base.cl =================================================================== --- clang/test/CodeGenOpenCLCXX/addrspace-derived-base.cl +++ clang/test/CodeGenOpenCLCXX/addrspace-derived-base.cl @@ -69,3 +69,12 @@ // CHECK: bitcast i8 addrspace(4)* %add.ptr1 to %class.B2 addrspace(4)* // CHECK: call {{.*}} @_ZNU3AS42B26getRefEv } + +// Implicit conversion of derived to base. + +void functionWithBaseArg(class B2 *b) {} + +void pr43145_4() { + Derived d; + functionWithBaseArg(&d); +} Index: clang/lib/Sema/SemaExprCXX.cpp =================================================================== --- clang/lib/Sema/SemaExprCXX.cpp +++ clang/lib/Sema/SemaExprCXX.cpp @@ -4095,9 +4095,21 @@ << From->getSourceRange(); } + // Defer address space conversion to the third conversion. + QualType FromPteeType = From->getType()->getPointeeType(); + QualType ToPteeType = ToType->getPointeeType(); + QualType NewToType = ToType; + if (!FromPteeType.isNull() && !ToPteeType.isNull() && + FromPteeType.getAddressSpace() != ToPteeType.getAddressSpace()) { + NewToType = Context.removeAddrSpaceQualType(ToPteeType); + NewToType = Context.getAddrSpaceQualType(NewToType, + FromPteeType.getAddressSpace()); + NewToType = Context.getPointerType(NewToType); + } + CastKind Kind; CXXCastPath BasePath; - if (CheckPointerConversion(From, ToType, Kind, BasePath, CStyle)) + if (CheckPointerConversion(From, NewToType, Kind, BasePath, CStyle)) return ExprError(); // Make sure we extend blocks if necessary. @@ -4108,8 +4120,8 @@ From = E.get(); } if (getLangOpts().allowsNonTrivialObjCLifetimeQualifiers()) - CheckObjCConversion(SourceRange(), ToType, From, CCK); - From = ImpCastExprToType(From, ToType, Kind, VK_RValue, &BasePath, CCK) + CheckObjCConversion(SourceRange(), NewToType, From, CCK); + From = ImpCastExprToType(From, NewToType, Kind, VK_RValue, &BasePath, CCK) .get(); break; }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits