<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/87456>87456</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Clang accepts forming pointer to ref qualified function type
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
ranaanoop
</td>
</tr>
</table>
<pre>
In the following program `#2` is accepted by clang and others but `#1` is rejected. Shouldn't `#2` also be rejected for the same reason.
[Demo](https://godbolt.org/z/n4fdxefGf)
```
#include <type_traits>
template <class Signature>
struct Decompose;
template <class T>
struct Decompose<void(T)> {
using Type = T;
};
template <class T>
using FTDecay = typename Decompose<void(T)>::Type;
// static_assert(std::is_same_v<FTDecay<int()&>, int (*)() &>); //#1: all rejects this as expected
FTDecay<int()&> x{}; //#2: all accepts this why?
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyUU0GPszYQ_TXDZfRFjk0gOXDIho-q52_vkTEGXBmb2sPupr--MrDddqUcKiEQ9vN745n3ZIxmcFpXcHqBU53JhUYfqiCdlM77OWt996h-d0ijxt5b69-NG3AOfghyQigYcMGhYGgiSqX0TLrD9oHKSjegdB16GnWI2C60w487POg_tCLdHfDX6BfbOeAl_ZtS2uix1f8AsfdhLSTKKa3K6N0BWA3sCqeXWk8eTjXw80g0RxBX4A3wZvBd6y0dfBiAN38Bb1zedx-6_60HftmPF2x_tl8ujFN26TSCuNFj1ncK0lAE8RM3COlptpJWgLIyRvxlBidpCfoLFCksirDWyk-zjxrEyy7whOMVxM9nR29v3nTAz6-p6iRR7mS4xDST18ecmOpE8ilT1v9DcqNpXmut5GNlSjd3qdfPy0htFtek_U3pP-91EBhJklF3GaMOBPwcqduOm3hPI72_gbjt-iBuxiVQkuFFUuI3NI5wXbuuy2kTP3cvIF4QN6nVZeKK0trdPRFpTBaNqD_mzU17954K4kdq8drCL1r-SbuZfad9Hx8gGvxmpqyrRHcRF5np6lge-ZGfWc6ysWKiyIueyV4U5VmK8iIVU6wvlG7V8ViqzFSc8ZzlTLCSlZwdpMxFUZzYhRdas0JCzvQkjT1Y-zYla2cmxkVX5zI_FZmVrbZxzTTnaxKB8xTvUCX8j3YZIuTMmkjxi4EMWV3dtuDut-t9mNbAe-NIBySPQff45yKt6U2K5OIUGe9Wr2C2BFt9i5-hcWkPyk_Am6S1f37MwafBAG_W0iPwZq3-7wAAAP__cTlekg">