================
@@ -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
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits