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

    <tr>
        <th>Summary</th>
        <td>
            Clang++ doesn't always add complete information for a class
        </td>
    </tr>

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

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

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

<pre>
    Consider the following code:

```
class A{
public:
    A() : member_(0) {};
    int member_;
};

class B : public A {};

int main(){
    B *test;
    return 0;
}
```

Because we only declare a pointer to B, clang++ only adds the following DWARF information for the type:

```
 <1><47>: Abbrev Number: 6 (DW_TAG_class_type)
    <48>   DW_AT_name        : (indexed string: 0x6): B
    <49>   DW_AT_declaration : 1
```

Despite having complete information about the type. Contrast with the result if we have declared `B test` instead:

```
<0><2b>: Abbrev Number: 2 (DW_TAG_class_type)
    <2c>   DW_AT_calling_convention: 5  (pass by value)
    <2d>   DW_AT_name        : (indexed string: 0x6): B
    <2e>   DW_AT_byte_size   : 4
    <2f>   DW_AT_decl_file   : 0
    <30>   DW_AT_decl_line   : 7
 <1><31>: Abbrev Number: 3 (DW_TAG_inheritance)
    <32>   DW_AT_type        : <0x42>
    <36>   DW_AT_data_member_location: 0
    <37>   DW_AT_accessibility: 1       (public)
 <1><38>: Abbrev Number: 4 (DW_TAG_subprogram)
    <39>   DW_AT_name        : (indexed string: 0x6): B
    <3a>   DW_AT_declaration : 1
    <3a>   DW_AT_artificial  : 1
    <3a>   DW_AT_external    : 1
    <3a>   DW_AT_accessibility: 1       (public)
 <2><3b>: Abbrev Number: 5 (DW_TAG_formal_parameter)
    <3c>   DW_AT_type        : <0x82>
    <40>   DW_AT_artificial  : 1
 <2><40>: Abbrev Number: 0
 <1><41>: Abbrev Number: 0
```

This is a problem because GDB is unable to properly print the type or values of `test`, along with making it impossible to call on functions that take an A parameter with a *B variable, since we can't figure out the relationship between the two classes. 
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJytVk2PozgQ_TXkYm1kPkLCgQN0duY2h1FLc4xsKBLvGBvZJunsr98yhDTpdLp7pYkQ4KL8qupVuSpc1-f8SSsrajDEHYA0Wkp9EmpPKl1DEBcB3QZ0uqf0cg3LSjJrSRGsy3Hd9VyK6rqH4K8Iok0QZQSFpIWWg9mhhA4i3LbeBnH5qi2Uu2pN8rnO3Gw5YI4mSfEWbbwPeEyo0Ymrn94Ubo8KB9bdOGDA9UYRemP9vdDHewkV6y2QExCt5JnUgL4ZIIx0Gm17SjUpg-iJoFztgwjfy1GV1bV9Q_j2V_HzG3LQaNMyJ7TCb2NS3Ln7JBVIxlMYxH_jI1kPz4IUnBs4kh-9J9QLUox5s_21ey6-7wYSdwMwMnMlwO_f4H58RcXieadYC-Ty8xiIIFQNL1AT6wy67YX0JfUo-FbeQmVzqJGdMTKvG37A7BZsJxyQAzuOtdh2EnA9Z4dx3bsrP0uCdewMs46chDsMcgO2l46IxmcIoWDKUE3QXkmG_KcUUa0DVn9MMcZDR4Yj_ojh6EsMR9WclopJiTHuKq2OoHxkHmlFPFTnK52fyZHJ_h6m_mOJimAOxc8Odlb8Cxeo5Fa3eZvUXSPkpEtvdGN6p4uxTrrru9qNw0fMxjNmhTqAEY6p6o6TOJob9OTfcIIpfEm8yu2m9MZL5tju0oWkrtiUkTeRred7WFWBtYILKdx5qO3JKuZw7IpXR2fRbh5Fm8yitT3vjN4b1t4Fm_2xAojZF07qu7rMONGISjBJPtWFF-yJymt-rvs_KY0ulD48mqsZpUMPkbsOY2yxq5g7YqtPq2hzV0UJ_Qotr64m9JGr7_T0h-eCftBEnw_CErxwHBnNJbSEXwbW923pP_SKodgPKVTowOBc6owfmlNTJTiAht5jiW58z7x0TD_SmNTYmYde27LfvksLbLVtp33WRlTf2oifY72qfDH5iccQnf3GGalwal8zMOIwP5RLtGiEd8xbsQJPuW_fFcMxvnakEfseR-zU-g3IoU7tQXQYnjsBqNH9kyZDCwa7JAvIwzRNNpssjONFncd1Fmds4YSTkD_NZnOtwY52mDyxs_Vz-v3p42czGy0seiPzg3Od9RMk-obXHsPp-RJ34kLK4_T4C4n-ByqHS2Et8oovq02YxItDHkIYJ2G9qpK0TjLgTZPBCihNWUOzNAsXknGQNg9WZbDaLkQe0SgKKU3COIzCeNkk4SplvN5wzqMwzYKEAv77kUtveKnNfmHywQfe7y1-lMI6-_oRAxF7BTDhs94dtMnxAEqMl4nF4HA-ePsf2t_ogA">