<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/61602>61602</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
RecursiveASTVisitor does not traverse field references in CXXCtorInitializer by default
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
varungandhi-src
</td>
</tr>
</table>
<pre>
The default code looks like this right now:
```cpp
template <typename Derived>
bool RecursiveASTVisitor<Derived>::TraverseConstructorInitializer(
CXXCtorInitializer *Init) {
if (TypeSourceInfo *TInfo = Init->getTypeSourceInfo())
TRY_TO(TraverseTypeLoc(TInfo->getTypeLoc()));
if (Init->isWritten() || getDerived().shouldVisitImplicitCode())
TRY_TO(TraverseStmt(Init->getInit()));
return true;
}
```
It seems like the fields are not being visited, because the correct AST node is not available, as CXXCtorInitializer stores a FieldDecl instead of storing a MemberExpr or a DeclRefExpr.
```
class CXXCtorInitializer final {
/// Either the base class name/delegating constructor type (stored as
/// a TypeSourceInfo*), an normal field (FieldDecl), or an anonymous field
/// (IndirectFieldDecl*) being initialized.
llvm::PointerUnion<TypeSourceInfo *, FieldDecl *, IndirectFieldDecl *>
Initializee;
```
Would it make sense to change the representation of CXXCtorInitializer to instead store some Expr node instead of *FieldDecl node directly, at the cost of increased memory usage, and a bit more indirection? Alternately, is there an equivalent of TypeLoc but for Decls which could be used here instead as a lighter alternative to DeclRefExpr which doesn't require any additional allocations? (I don't see any class named `DeclLoc`, but I may have missed something.)
I also understand if you want to close this issue as a Won't Fix, since anyone can override the default implementation to additionally traverse `FieldDecl/IndirectFieldDecl` in a custom way.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyEVl1v47YS_TX0yyCGItmO_eAHrxMDAe7Fvdi43e1TQZEjiV2KdMmRs-6vL4aUP3ZjtICQ2OR8nDlzZmQZo2kd4lrMP4n580QO1PmwPsowuFY63ZmHGNSk9vq03ncIGhs5WALlNYL1_lsEa74hUGciBNN2BM6_i2ojimdRnP8uivyowyGfEPYHKwlBVFs6HdDJHuEZgzmiFtVLNqq9t_AZ1RCiOeLmbf-riYZ8ENX2xrTaiGqzD_KIIeLWu0hhUOTDqzNkpDV_YRDlMkeE7dev2x_vQJQb_irKFYinT6MdmAZEudyfDvjmh6Dw1TWeTff5Q_UM7PQgqpcW6Uczzlau-Mmx9p9_-33_P442gmTz_3jFJ2x_EySfjt7lSlSfbmk8ozpnNvFLMETosg-Ip6142kKLdKYnnU9j5werE3mv_cEaZWjrNf4rzjfq6SZdi5SJ-geAAWkIDigMeL17ev5JBrc-rwQRsb_ICKExaHUEGRCcJ6jRuBaOjJ4r2kKNSg4x2yofAiqCzdseHEvSxOQkj9JYWVtkBxnv9T2SDxhBwo7zPaOyYFwklBp8k245r4T_Yl9jePl-COADSGDLz9jwwfSuyPNXZWW8m7cxTtpbqYlylx94MdRhSIXVMiLkGDwbotxptNhKYlDqqnLg6WFRpHI0yPgxrISfBbpJ7duCdOB86KXNpHOcCxujCdfsQDrvTr0fYjb8mCPpRBtuxk0EzjM20Fwo0CNtYO2xz-P7f28cYfjFGe9Etf04dozk2qfx4EPCdHHeHnAl_UaL9yT4hccDDEEvvyFEdCwuD6qTrs0yC3gIGNGRJOMd6-NOY8lfBJSaAdH3CEk4WZpXdYlycwWdLnMl9pS6QqO2I7GxcSqgjKihx96HEwxRtlnYToOEmpFzPjPykUjcwcYSBicJc1QTOWpAbif-OZijtOhSgnHzQD0QND4khUd474zqQCVuaoSBAST_cx2Sh8fyyscAckxmjom7myEZA2mP0YnyiSBw9oTjBFJrw3ilBWmtV4nfyOhZUKB9domYza8DoUEsCs7CK3NRpL0wELxCL0_QySNCbyJD5iZQZ1w7vWy6cfGAtNHD4DSGSEylaeDkB3iXjlL_rY_ji83EOGAu-MsIaWe-c9JonErYvENQ0oE_YghGZ92c35amP1jsL_ohf1O4PQGNC5drupme3ceJWhRgHEhQQyTfw7s8TSd6XelVtZITXD8unlaz2XxVPk669WyJSj3Ol6taz3XTNHo-k2qFy-VsXhWL1XJi1mVRVkVVlkUxm5eP0_liVdXLx8VquVisaoliVmAvjZ3ypE59aCeJiPXicVGUEytrtDH9cChLh--ZJVGW_DsirNnnoR7aKGaFNZHiNQoZsri-82ZPKkkL_EJJXkwBGwzoFEau_87w1acz2ZMh2HVHdIi8W9J2ag11Qz1VvhflLm2d_O_hEPwfqEiUu4Q9inKXavs7AAD__wh5-VA">