<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/59251>59251</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            Handle base class member access from derived class in include-cleaner
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          hokein
      </td>
    </tr>
</table>

<pre>
    Given an example

```
// base.h
class Base { int a; };
```

```
// derived.h
class Derived : pubic Base {};
```

```
// main.cpp
#include "derived.h"

void fun(Derived d) {
  d.a;
}
```
Should we include the `base.h` for the base member access `a` ? The conclusion is no, as this member expr is via the Derived object.

In current include-cleaner library implementation, we consider the `base.h` is used (thus we should insert it) -- when we visit the `MemberExpr .a` in `WalkAST.cpp`, the corresponding target symbol is the `FieldDecl a` defined in Base which is in base.h.

For this case, we should not report the `FieldDecl a`, instead we should visit the type of the Base expr `d` which is `class Derived`. 

A sad bit is that the `RefLocation` and `Target` is confusing in the HTML dump tool now:
  - `RefLocation` points to `d.^a`;
  - `Target` points to the `Derived` class;

But this is not a thing we need to worry about at the moment, we can improve later on. 
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJydVEGPmzoQ_jVwGQUFExI4cNi8dNsntZd2pZ6NbYJbYyPbJM2_f2MDm0276uFJCPB4PPN938y4NfzWfJQXoYFqEL_oMCqRbE_J9ml577fLMy_JMz7QUieyfjYxRZ2DI1ogORxBag80KY64OOHn_Sh_Cc2FRTj8MfppNkJSPME4tZK95vufWQYqdcbGcTUWUjM1cQxJyB0BIW8jXYzk0E06IdWKhyekjiiiAwDP6B0NInsPwbfeTIrDVcCa0_eYd79dRN1voTM2GoMFBjG0wgJlTKASuE2DS1I8wwu6MBOCOGk0SAfaJOQfoA5P42o5KX6NNmxeJI1RV_Cm_SGYz95S_FcDm6wVWMMF3IYpQTVGUbK11N5Ahg4Z0IN6TBrSXSMKJ1G3P6lg3smFypHK95MLzm4WQGonLObxQcPNBq49NiFuX6STfg30JVL4EBhkkbfUwfydqp9P315iBVFXBOGjFgjdjUZzqc_gqT0LD-42tEYFHEvIZykUPwmmIAbkopNaBDhzT117yfrgjoaZxoNCz7E0uM1wb2G_ENLGgxWjsf79VMEbSXtB-ZtTd7r-NgowXfyPUGLh8CAPOF9x4eJhKHCdwVuIT-AwQ4tRI2n6Cuer6D4bNtcNI1LNg_Ul6rTUCgvZYTehfEg_HPv08uUz8GkYwRuUUZsrzuDa7pt3oo4GbwDMayLyLCk_RO7F8eHQPendf0F5pwWR532g4vs4-bkAsd3xrgkrxIuKaoF1xEBX7IMb0Nag68J-MKFl127Fqw7b2JqLAEU9tq3RGaSiyff7-lCU9aFOeVPwuqhp6qVXovmEYqllIGf1H8eys2ZYr67FAQX8bYbSyaqm9350QcN4EZ0lTkWbMTPgQqnL-tkgujCduJTOTcLhT1mTMk_7Jj9UZSXKdrcjbbUtWUd2ec5Jvat2ouqKLlW0Fco1SXlMylMqG7IlJM9JnZcFKatsVzJ24FXe0YKVRX5IdluB96HKQuLM2HNqm4ihnc4ON5V03t03kZs8o9RrfDr53timNz-F1GlE20So_wEvAPZA">