[clang] 502c08e - [clang][ExprConst] Move vector diagnostics to checkBitCastConstexprEl… (#119366)
via cfe-commits
cfe-commits at lists.llvm.org
Tue Dec 10 06:05:34 PST 2024
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;
}
More information about the cfe-commits
mailing list