<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/121155>121155</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Clang mixes up class name with member variable name when parsing explicit dtors
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
wangbo15
</td>
</tr>
</table>
<pre>
A very simple case:
```c++
struct a {
int a;
~a()=default;
};
```
Clang rejects it by complaining that `a` is not a type name:
```c++
<source>:3:6: error: identifier 'a' after '~' in destructor name does not name a type
3 | ~a()=default;
| ^
| a
<source>:2:9: note: non-type declaration found by destructor name lookup
2 | int a;
| ^
1 error generated.
```
It seems that there shouldn't be any ambiguity here as that `a` in `~a()` definitely refers to `struct a` here. GCC and MSVC both accept the code.
Please see [https://godbolt.org/z/KjhE6rjTh](https://godbolt.org/z/KjhE6rjTh)
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJyMk1GL5DYMxz-N5kXs4NibzOQhD9nZnVJKodDSdyVWEm8dO9jO3k0f7rMXJ3NXdo-WC4ZIWLZ-kvynGM3omBson6B8PtCaJh-aT-TGzhflofP61rT4xuGG0cyLZewpMqgWxLYqsa8e5FNeoo0prH1CQjg9IYgWEdG4hARq978QyDPIGtSz5oFWm0Dlg3B6vhtfL91zXCy5EQO_cp8imoTdDXs_L5aMM27ENFFCqARBJdBEdD5nT7eF0dH8v6ygLtGvoWdQL6BaBaqtQLXIIfiQDaPZJTMYDgjyRCBPSEPavS_ZMw417yX7sOVD7XmH2Lyd5N4HhXC6ZOM_m7BtblFQvrzzt4--h5ag2jqzOp94_7uHrXrNvaVAyXiHg1-dzp37SGu9_2td7pnkt0zvJvaeIdsbW7H3CUd2HCixPn4_vJ8TRuY57lNKEwfGOPnVagfylLBjJHdDmjszribdcIug-GGqLpvfelYJ1DwYZxLbGwYeOERMPsd8fX05Jl91xJ8uFySn8dff_7xg59OE1Pe8bDDYe83HnfQ3yxQ50yKUT1NKS8xPR15BXkevO2_T0YcR5PVvkNdfXqeXKrz-MUH5DPL84-GyBtEedKN0rWo6cFOcVCmVEKo8TM2Zqa5Iqupc9STOwyBUV1eyV3UtezlUB9NIIR8LKauikkKVR0mkikJVgsWgi6KCR8EzGXu09m3OBAcT48pNIYuiLA-WOrZxk7uUfVYWSJmVH5p84KFbxwiPwpqY4r9XJJMsN7sQZ_OZI64L9pZi3B_RJ5MmnHnuOOAbBUOd5fvOxA4XCjErlT8v1vQmoU4-xMMabPOhcSZNa3fs_QzymrPffw9L8Fn-IK9bNRHk9V7QWyP_CQAA__9wUG8E">