<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/145400>145400</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[clang-cl] `constexpr` fields cannot reference DLL exported symbols unlike with MSVC cl
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
andrurogerz
</td>
</tr>
</table>
<pre>
This is a minor behavioral difference between `clang`/`clang-cl` and MSVC `cl` when dealing with DLL exported symbols.: when compiling with MSVC, a `constexpr` variable is allowed to reference a symbol that is DLL-exported. When compiling the same code with `clang-cl`, an error is produced indicating the variable must be initialized by a constant expression.
Simplest repro:
DLL source:
```
__declspec(dllexport) int sum(int a, int b) {
return a + b;
}
```
Client source:
```
__declspec(dllimport) void sum();
constexpr auto sumFn = sum;
```
Compiling this code with `clang-cl` results in:
```
error: constexpr variable 'sumFn' must be initialized by a constant expression
167 | constexpr auto sumFn = sum;
| ^ ~~~
1 error generated.
```
Honestly, it seems like Clang is correct to disallow this and MSVC is in the wrong. However, if `clang-cl` is meant to be a drop-in replacement for `cl` on Windows then it would need to behave the same.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJyUVE1v4zYQ_TX0ZRCDoiwrOujg2DX2kJ626B4XFDm2pqVIgaSszR7y2wtStrObtGhLGDA_Rm_evPmQIdDZIrasemLVYSWn2DvfSqv95N0Z_fdV5_RL-1tPASiAhIGs89BhLy_kvDSg6XRCj1YhdBhnRAtsy5WR9sy2nInj7fSgDNtykFbDr59_3y9W6Wbu0YJGacieYabYw-H5GfDb6HxEDeFl6JwJa1buFlPlhpHejBMYE3uQGdHZEPHb6BPwRXqSncHM3Bg3o4bowOONsLyCQ-xlTFaH5-eHm-M1fPnZW-wRghwQlNO4-P45tszCAnrvfEIbvdOTQg1kNSkZbyB3XsMUInQIZCmSNPQdNXQvICGHIW1MKngMgZxdM75jfPeZhtFgiOBx9I6V6S7JFdzkFS7nRGX58d3XrxqVCSMqJh61MUt0TDRANkKYBiYe004m8mnTpTdWPzG-A_AYJ2-TtOIJOlamW1Yf3vlgfLc3hAnvP7Kg4cbi4khfaTDRLB7uSQQ5RZdejxZYech2C4d33n_IEYV_zA94DJOJAch-pJizlmrszfs9T0zUmQQT9f_KWdKw2NbA6j2k9e-BZbO7_bvFql_g9fWV8V1xLbIzWvQyFetHUT45iyGal5zYCAFxCGDoT4R9kgSyUN6jiqkpNIXcIouC9yZNbW9z0c7e2fMaPrkZL-gz6Om9vhRgwCRBdEkiCdq78YFsKlYjFQ6pRk7Ov_W-s_CFrHZzSE5sIjq7yWiwuDRrnjR47731SrelbspGrrAt6orXvCmKZtW35YmfHitVlkVVi7rZ8LKuatmpclOUsiiLFbWCi4pvRSk4r4pmXT1Wp2qzkYI3TVFpyTYcB0lmbcxlWDt_XlEIE7bFptpwvjKyQxPypBTC4gz5lQmRBqdv00cP3XQObMMNhRjeYCJFk0fsXavq8GFYnQiNDqCktS7-MKP-bhbCZHMi7_MPlFlN3rR9jGNItS2OTBzPFPupWys3MHFMbK5_D6N3f6CKTBxzDIGJ4zXISyv-CgAA__-aFPRX">