diff --git a/clang/lib/CodeGen/CGBuilder.h b/clang/lib/CodeGen/CGBuilder.h index 2855649472ec27..eaf563a436ca1c 100644 --- a/clang/lib/CodeGen/CGBuilder.h +++ b/clang/lib/CodeGen/CGBuilder.h @@ -154,8 +154,10 @@ class CGBuilderTy : public CGBuilderBaseTy { using CGBuilderBaseTy::CreateAddrSpaceCast; Address CreateAddrSpaceCast(Address Addr, llvm::Type *Ty, const llvm::Twine &Name = "") { - return Address(CreateAddrSpaceCast(Addr.getPointer(), Ty, Name), - Addr.getAlignment()); + assert(cast(Ty)->isOpaqueOrPointeeTypeMatches( + Addr.getElementType()) && + "Should not change the element type"); + return Addr.withPointer(CreateAddrSpaceCast(Addr.getPointer(), Ty, Name)); } /// Cast the element type of the given address to a different type, diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp index e0e1dd5df586fb..7fc4c4f3579698 100644 --- a/clang/lib/CodeGen/CGExpr.cpp +++ b/clang/lib/CodeGen/CGExpr.cpp @@ -1114,11 +1114,11 @@ Address CodeGenFunction::EmitPointerWithAlignment(const Expr *E, CE->getBeginLoc()); } - if (CE->getCastKind() == CK_AddressSpaceConversion) - return Builder.CreateAddrSpaceCast(Addr, ConvertType(E->getType())); - llvm::Type *ElemTy = ConvertTypeForMem(E->getType()->getPointeeType()); - return Builder.CreateElementBitCast(Addr, ElemTy); + Addr = Builder.CreateElementBitCast(Addr, ElemTy); + if (CE->getCastKind() == CK_AddressSpaceConversion) + Addr = Builder.CreateAddrSpaceCast(Addr, ConvertType(E->getType())); + return Addr; } break;