Author: Timm Baeder Date: 2024-12-10T15:05:29+01:00 New Revision: 502c08e672c68927bb6e084100edaad0a8ddbf26
URL: https://github.com/llvm/llvm-project/commit/502c08e672c68927bb6e084100edaad0a8ddbf26 DIFF: https://github.com/llvm/llvm-project/commit/502c08e672c68927bb6e084100edaad0a8ddbf26.diff LOG: [clang][ExprConst] Move vector diagnostics to checkBitCastConstexprEl… (#119366) …igibilityType This is the function we use to diagnose invalid types, so use it for those checks as well. NFC. Added: Modified: clang/lib/AST/ExprConstant.cpp Removed: ################################################################################ diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index fbba3f553489d5..89c515e6392764 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -7352,31 +7352,6 @@ class APValueToBufferConverter { const VectorType *VTy = Ty->castAs<VectorType>(); QualType EltTy = VTy->getElementType(); unsigned NElts = VTy->getNumElements(); - unsigned EltSize = - VTy->isExtVectorBoolType() ? 1 : Info.Ctx.getTypeSize(EltTy); - - if ((NElts * EltSize) % Info.Ctx.getCharWidth() != 0) { - // The vector's size in bits is not a multiple of the target's byte size, - // so its layout is unspecified. For now, we'll simply treat these cases - // as unsupported (this should only be possible with OpenCL bool vectors - // whose element count isn't a multiple of the byte size). - Info.FFDiag(BCE->getBeginLoc(), - diag::note_constexpr_bit_cast_invalid_vector) - << Ty.getCanonicalType() << EltSize << NElts - << Info.Ctx.getCharWidth(); - return false; - } - - if (EltTy->isRealFloatingType() && &Info.Ctx.getFloatTypeSemantics(EltTy) == - &APFloat::x87DoubleExtended()) { - // The layout for x86_fp80 vectors seems to be handled very inconsistently - // by both clang and LLVM, so for now we won't allow bit_casts involving - // it in a constexpr context. - Info.FFDiag(BCE->getBeginLoc(), - diag::note_constexpr_bit_cast_unsupported_type) - << EltTy; - return false; - } if (VTy->isExtVectorBoolType()) { // Special handling for OpenCL bool vectors: @@ -7643,28 +7618,6 @@ class BufferToAPValueConverter { unsigned EltSize = VTy->isExtVectorBoolType() ? 1 : Info.Ctx.getTypeSize(EltTy); - if ((NElts * EltSize) % Info.Ctx.getCharWidth() != 0) { - // The vector's size in bits is not a multiple of the target's byte size, - // so its layout is unspecified. For now, we'll simply treat these cases - // as unsupported (this should only be possible with OpenCL bool vectors - // whose element count isn't a multiple of the byte size). - Info.FFDiag(BCE->getBeginLoc(), - diag::note_constexpr_bit_cast_invalid_vector) - << QualType(VTy, 0) << EltSize << NElts << Info.Ctx.getCharWidth(); - return std::nullopt; - } - - if (EltTy->isRealFloatingType() && &Info.Ctx.getFloatTypeSemantics(EltTy) == - &APFloat::x87DoubleExtended()) { - // The layout for x86_fp80 vectors seems to be handled very inconsistently - // by both clang and LLVM, so for now we won't allow bit_casts involving - // it in a constexpr context. - Info.FFDiag(BCE->getBeginLoc(), - diag::note_constexpr_bit_cast_unsupported_type) - << EltTy; - return std::nullopt; - } - SmallVector<APValue, 4> Elts; Elts.reserve(NElts); if (VTy->isExtVectorBoolType()) { @@ -7793,6 +7746,32 @@ static bool checkBitCastConstexprEligibilityType(SourceLocation Loc, Info, Ctx, CheckingDest)) return false; + if (const auto *VTy = Ty->getAs<VectorType>()) { + QualType EltTy = VTy->getElementType(); + unsigned NElts = VTy->getNumElements(); + unsigned EltSize = VTy->isExtVectorBoolType() ? 1 : Ctx.getTypeSize(EltTy); + + if ((NElts * EltSize) % Ctx.getCharWidth() != 0) { + // The vector's size in bits is not a multiple of the target's byte size, + // so its layout is unspecified. For now, we'll simply treat these cases + // as unsupported (this should only be possible with OpenCL bool vectors + // whose element count isn't a multiple of the byte size). + Info->FFDiag(Loc, diag::note_constexpr_bit_cast_invalid_vector) + << QualType(VTy, 0) << EltSize << NElts << Ctx.getCharWidth(); + return false; + } + + if (EltTy->isRealFloatingType() && + &Ctx.getFloatTypeSemantics(EltTy) == &APFloat::x87DoubleExtended()) { + // The layout for x86_fp80 vectors seems to be handled very inconsistently + // by both clang and LLVM, so for now we won't allow bit_casts involving + // it in a constexpr context. + Info->FFDiag(Loc, diag::note_constexpr_bit_cast_unsupported_type) + << EltTy; + return false; + } + } + return true; } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits