================
@@ -2704,60 +2704,76 @@ static bool isMatrixOrArrayOfMatrix(const ASTContext
&Ctx, QualType QT) {
return Ty->isDependentType() || Ty->isConstantMatrixType();
}
-static bool diagnoseMatrixLayoutOnNonMatrix(Sema &SemaRef, Decl *D,
- SourceLocation Loc,
- const IdentifierInfo *AttrName) {
- QualType Ty;
- if (auto *VD = dyn_cast<ValueDecl>(D))
- Ty = VD->getType();
- else if (auto *TD = dyn_cast<TypedefNameDecl>(D))
- Ty = TD->getUnderlyingType();
-
- if (Ty.isNull() || Ty->isDependentType())
- return false;
-
- // For functions, the qualifier can apply to the return type or any
parameter.
- if (const auto *FPT = Ty->getAs<FunctionProtoType>()) {
- if (isMatrixOrArrayOfMatrix(SemaRef.getASTContext(), FPT->getReturnType()))
- return false;
- SemaRef.Diag(Loc, diag::err_hlsl_matrix_layout_non_matrix) << AttrName;
- return true;
+/// Walks the existing AttributedType sugar of \p T looking for a previously
+/// applied HLSLRowMajor/HLSLColumnMajor marker. If one is found, populates
+/// \p ExistingKind with its attr::Kind and returns true.
+static bool findExistingMatrixLayoutMarker(QualType T,
+ attr::Kind &ExistingKind) {
+ QualType Cur = T;
+ while (const auto *AT = Cur->getAs<AttributedType>()) {
+ attr::Kind K = AT->getAttrKind();
+ if (K == attr::HLSLRowMajor || K == attr::HLSLColumnMajor) {
+ ExistingKind = K;
+ return true;
+ }
+ Cur = AT->getModifiedType();
}
+ return false;
+}
- if (isMatrixOrArrayOfMatrix(SemaRef.getASTContext(), Ty))
- return false;
+Attr *SemaHLSL::buildMatrixLayoutTypeAttr(QualType T, const ParsedAttr &AL) {
+ ASTContext &Ctx = getASTContext();
+ attr::Kind AttrK = AL.getKind() == ParsedAttr::AT_HLSLRowMajor
+ ? attr::HLSLRowMajor
+ : attr::HLSLColumnMajor;
- SemaRef.Diag(Loc, diag::err_hlsl_matrix_layout_non_matrix) << AttrName;
- return true;
-}
+ if (T.isNull())
+ return nullptr;
----------------
bogner wrote:
Should we do this null check / early exist before bothering to work out AttrK?
https://github.com/llvm/llvm-project/pull/198887
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits