[clang] [HLSL] Diagnose dynamic indexing of struct arrays for resource access (PR #187132)
Helena Kotas via cfe-commits
cfe-commits at lists.llvm.org
Tue Apr 7 17:09:38 PDT 2026
================
@@ -3068,6 +3068,50 @@ void SemaHLSL::ActOnEndOfTranslationUnit(TranslationUnitDecl *TU) {
diagnoseAvailabilityViolations(TU);
}
+// For resource member access through a global struct array, verify that the
+// array index selecting the struct element is a constant integer expression.
+// Returns false if the member expression is invalid.
+bool SemaHLSL::ActOnResourceMemberAccessExpr(MemberExpr *ME) {
+ assert((ME->getType()->isHLSLResourceRecord() ||
+ ME->getType()->isHLSLResourceRecordArray()) &&
+ "expected member expr to have resource record type or array of them");
+
+ // Walk the AST from MemberExpr to the VarDecl of the parent struct instance
+ // and take note of any non-constant array indexing along the way. If the
+ // VarDecl we find is a global variable, report error if there was any
+ // non-constant array index in the resource member access along the way.
+ const Expr *NonConstIndexExpr = nullptr;
+ const Expr *E = ME->getBase();
+ while (E) {
+ if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E)) {
+ if (!NonConstIndexExpr)
----------------
hekota wrote:
Yes, `DeclRefExpr` can appear first and very often does - anytime the member access chain does not go through any array indexing. And in that case `NonConstIndexExpr` is correctly nullptr because there was no non-constant indexing happening.
https://github.com/llvm/llvm-project/pull/187132
More information about the cfe-commits
mailing list