bwendling wrote: > CodeGenFunction::FindCountedByField finds a field with a corresponding base > expression. Currently, it throws away the base expression. And the code > you've just written tries to recompute the base. Instead of doing this dance, > can we just make CodeGenFunction::FindCountedByField return both the field > and the base expression?
Maybe... `CodeGenFunction::FindCountedByField` isn't super concerned with finding the `DeclRefExpr`. It just goes down the `RecordDecl` to find the `Decl` with the `counted_by` attribute. It jumps through some hoops to see if the FAM is in a sub-structure. I'll look into it though. > I'm extremely suspicious of the way MemberExprBaseVisitor works; it's > basically never right in CodeGen to treat all CastExprs the same way, or > handle MemberExprs without checking isArrow(). I initially had a check to see if a cast had the same `RecordDecl` type as the one we're looking for; if so return that expression. Would that help in this case? I'm also wondering about the `ParenExpr`. Should they get the same treatment? For the `MemberExprs`, I could check the `isArrow()`, but in that case we'd be dealing with a pointer into another object, which ... ick. We should probably return `nullptr` in that instance. At this point though, we *should* be dealing with a more-or-less well structured `MemberExpr` to `DeclRefExpr` expression. I.e. it'll be a list of `MemberExprs` with potential casts and maybe a `UnaryOperand` thrown in for good measure until we get to a `DeclRefExpr` or `CompoundLiteralExpr`. Of course, it's hard to state anything for sure with C, but I'll need examples to help harden this code. 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