[clang] [HLSL] Allow arrays to copy-initialize (PR #127557)
Justin Bogner via cfe-commits
cfe-commits at lists.llvm.org
Tue Feb 18 11:03:11 PST 2025
================
@@ -2927,6 +2898,53 @@ void CastOperation::CheckCXXCStyleCast(bool FunctionalStyle,
}
}
+// CheckHLSLCStyleCast - Returns `true` ihe cast is handled or errored as an
+// HLSL-specific cast. Returns false if the cast should be checked as a CXX
+// C-Style cast.
+bool CastOperation::CheckHLSLCStyleCast(CheckedConversionKind CCK) {
+ assert(Self.getLangOpts().HLSL && "Must be HLSL!");
+ QualType SrcTy = SrcExpr.get()->getType();
+ // HLSL has several unique forms of C-style casts which support aggregate to
+ // aggregate casting.
+ // This case should not trigger on regular vector cast, vector truncation
+ if (Self.HLSL().CanPerformElementwiseCast(SrcExpr.get(), DestType)) {
+ if (SrcTy->isConstantArrayType())
+ SrcExpr = Self.ImpCastExprToType(
+ SrcExpr.get(), Self.Context.getArrayParameterType(SrcTy),
+ CK_HLSLArrayRValue, VK_PRValue, nullptr, CCK);
+ Kind = CK_HLSLElementwiseCast;
+ return true;
+ }
+
+ // This case should not trigger on regular vector splat
+ // If the relative order of this and the HLSLElementWise cast checks
+ // are changed, it might change which cast handles what in a few cases
+ if (Self.HLSL().CanPerformAggregateSplatCast(SrcExpr.get(), DestType)) {
+ const VectorType *VT = SrcTy->getAs<VectorType>();
+ // change splat from vec1 case to splat from scalar
+ if (VT && VT->getNumElements() == 1)
+ SrcExpr = Self.ImpCastExprToType(
+ SrcExpr.get(), VT->getElementType(), CK_HLSLVectorTruncation,
+ SrcExpr.get()->getValueKind(), nullptr, CCK);
+ // Inserting a scalar cast here allows for a simplified codegen in
+ // the case the destTy is a vector
+ if (const VectorType *DVT = DestType->getAs<VectorType>())
+ SrcExpr = Self.ImpCastExprToType(
+ SrcExpr.get(), DVT->getElementType(),
+ Self.PrepareScalarCast(SrcExpr, DVT->getElementType()),
+ SrcExpr.get()->getValueKind(), nullptr, CCK);
+ Kind = CK_HLSLAggregateSplatCast;
+ return true;
+ }
+ if (DestType->isArrayType()) {
----------------
bogner wrote:
A blank line here would be aesthetically pleasing
https://github.com/llvm/llvm-project/pull/127557
More information about the cfe-commits
mailing list