================ @@ -4022,8 +4169,36 @@ LValue CodeGenFunction::EmitArraySubscriptExpr(const ArraySubscriptExpr *E, ArrayLV = EmitArraySubscriptExpr(ASE, /*Accessed*/ true); else ArrayLV = EmitLValue(Array); + auto *Idx = EmitIdxAfterBase(/*Promote*/true); + if (SanOpts.has(SanitizerKind::ArrayBounds)) { ---------------- rjmccall wrote:
Yeah. Specifically, I was thinking that you already have the address of this flexible array member, and if the immediately containing struct is uniquely allocated directly within the root type of the `__counted_by` path, you can just find that offset statically and subtract to get a pointer to the root type. But of course that only works if it *is* uniquely allocated directly within the root type, which it isn't going to be in the general case if the root type is just some lexically-enclosing struct, which ties this back to the other conversation. Stepping back for a second, I'm surprised you need to do so much from scratch for flexible arrays. Don't the other `-fbounds-safety` features already have some logic where they recognize e.g. a load from a `__counted_by` field of pointer type and then emit the count expression? How do those code paths solve this problem? https://github.com/llvm/llvm-project/pull/73730 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits