Author: Farzon Lotfi Date: 2026-09-29T21:19:10-04:00 New Revision: 4daebaeb9b4e36a23cef9f222fcc7c4faa27b64c
URL: https://github.com/llvm/llvm-project/commit/4daebaeb9b4e36a23cef9f222fcc7c4faa27b64c DIFF: https://github.com/llvm/llvm-project/commit/4daebaeb9b4e36a23cef9f222fcc7c4faa27b64c.diff LOG: [Clang][HLSL] Reject matrix layout modifiers on array typedefs (#227364) Fixes #226251 Require row_major and column_major modifiers to apply directly to a matrix type rather than accepting an array typedef whose element type is a matrix. This preserves valid declarations of arrays of annotated matrix elements while rejecting attempts to apply a layout modifier to the array type itself. Added: Modified: clang/lib/Sema/SemaHLSL.cpp clang/test/SemaHLSL/matrix_layout_attr.hlsl Removed: ################################################################################ diff --git a/clang/lib/Sema/SemaHLSL.cpp b/clang/lib/Sema/SemaHLSL.cpp index 794371ce9a008..05e8293ffbd02 100644 --- a/clang/lib/Sema/SemaHLSL.cpp +++ b/clang/lib/Sema/SemaHLSL.cpp @@ -2678,10 +2678,8 @@ void SemaHLSL::handleParamModifierAttr(Decl *D, const ParsedAttr &AL) { D->addAttr(NewAttr); } -static bool isMatrixOrArrayOfMatrix(const ASTContext &Ctx, QualType QT) { +static bool isMatrixType(QualType QT) { const Type *Ty = QT->getUnqualifiedDesugaredType(); - while (isa<ArrayType>(Ty)) - Ty = Ty->getArrayElementTypeNoTypeQual(); return Ty->isDependentType() || Ty->isConstantMatrixType(); } @@ -2711,9 +2709,8 @@ Attr *SemaHLSL::buildMatrixLayoutTypeAttr(QualType T, const ParsedAttr &AL) { ? attr::HLSLRowMajor : attr::HLSLColumnMajor; - // For non-dependent types, the operand must be a matrix (or array of - // matrices). - if (!T->isDependentType() && !isMatrixOrArrayOfMatrix(Ctx, T)) { + // For non-dependent types, the operand must be a matrix. + if (!T->isDependentType() && !isMatrixType(T)) { Diag(AL.getLoc(), diag::err_hlsl_matrix_layout_non_matrix) << AL.getAttrName(); AL.setInvalid(); @@ -2755,7 +2752,7 @@ bool SemaHLSL::diagnoseMatrixLayoutInstantiation(attr::Kind K, QualType T, return false; if (T.isNull() || T->isDependentType()) return false; - if (isMatrixOrArrayOfMatrix(getASTContext(), T)) + if (isMatrixType(T)) return false; IdentifierInfo *II = &getASTContext().Idents.get( K == attr::HLSLRowMajor ? "row_major" : "column_major"); diff --git a/clang/test/SemaHLSL/matrix_layout_attr.hlsl b/clang/test/SemaHLSL/matrix_layout_attr.hlsl index 16ef8fb2e63a7..c17c4364ec512 100644 --- a/clang/test/SemaHLSL/matrix_layout_attr.hlsl +++ b/clang/test/SemaHLSL/matrix_layout_attr.hlsl @@ -15,6 +15,14 @@ column_major float4x4 cm_mat_arr[3]; row_major float3x3 rm_mat_arr_2d[2][3]; column_major float4x4 cm_mat_arr_2d[3][2]; +typedef float2x3 MatrixArray[2]; + +// Invalid: the modifier applies to the array typedef, not its matrix elements. +// expected-error@+1 {{'row_major' attribute can only be applied to a matrix type}} +row_major MatrixArray invalid_row_array; +// expected-error@+1 {{'column_major' attribute can only be applied to a matrix type}} +column_major MatrixArray invalid_column_array; + // Valid: on struct fields with matrix type. struct S { row_major float2x2 mat1; _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
