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

    <tr>
        <th>Summary</th>
        <td>
            [clang] constexpr template method cannot be used in a constant expression
        </td>
    </tr>

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

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

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

<pre>
    # [Online example](https://godbolt.org/z/qzaaGfe5h)
```c++
struct ConstexprTemplate
{
    static constexpr int sizeof_char()
    {
 return sizeof_template<char>();
    }

    static constexpr int sizeof_short()
    {
        return sizeof_template<short>();
 }

    static constexpr int sizeof_int()
    {
        return sizeof_template<int>();
    }

    static constexpr int sizeof_long()
    {
        return sizeof_template<long>();
 }

    template <typename I>
    static constexpr I sizeof_template()
    {
        return sizeof(I);
 }
};

constexpr int sizeof_char = ConstexprTemplate::sizeof_char();
constexpr int sizeof_short = ConstexprTemplate::sizeof_short();
constexpr int sizeof_int = ConstexprTemplate::sizeof_int();
constexpr int sizeof_long = ConstexprTemplate::sizeof_long();
```

clang version 18.1.8 (git@github.com:llvm/llvm-project.git 3b5b5c1ec4a3095ab096dd780e84d7ab81f3d7ff)

Full diagnostic message:
```txt
Example.cc:30:15: error: constexpr variable 'sizeof_char' must be initialized by a constant expression
   30 | constexpr int sizeof_char = ConstexprTemplate::sizeof_char();
      | ^             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Example.cc:5:16: note: undefined function 'sizeof_template<char>' cannot be used in a constant expression
    5 |         return sizeof_template<char>();
      | ^
Example.cc:30:29: note: in call to 'sizeof_char()'
   30 | constexpr int sizeof_char = ConstexprTemplate::sizeof_char();
      | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Example.cc:24:24: note: declared here
   24 |     static constexpr I sizeof_template()
 |                        ^
Example.cc:31:15: error: constexpr variable 'sizeof_short' must be initialized by a constant expression
   31 | constexpr int sizeof_short = ConstexprTemplate::sizeof_short();
      | ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Example.cc:10:16: note: undefined function 'sizeof_template<short>' cannot be used in a constant expression
 10 |         return sizeof_template<short>();
      | ^
Example.cc:31:30: note: in call to 'sizeof_short()'
   31 | constexpr int sizeof_short = ConstexprTemplate::sizeof_short();
      | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Example.cc:24:24: note: declared here
   24 |     static constexpr I sizeof_template()
      | ^
Example.cc:32:15: error: constexpr variable 'sizeof_int' must be initialized by a constant expression
   32 | constexpr int sizeof_int = ConstexprTemplate::sizeof_int();
      | ^            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Example.cc:15:16: note: undefined function 'sizeof_template<int>' cannot be used in a constant expression
   15 |         return sizeof_template<int>();
      | ^
Example.cc:32:28: note: in call to 'sizeof_int()'
   32 | constexpr int sizeof_int = ConstexprTemplate::sizeof_int();
      | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Example.cc:24:24: note: declared here
   24 |     static constexpr I sizeof_template()
 |                        ^
Example.cc:33:15: error: constexpr variable 'sizeof_long' must be initialized by a constant expression
   33 | constexpr int sizeof_long = ConstexprTemplate::sizeof_long();
      | ^             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Example.cc:20:16: note: undefined function 'sizeof_template<long>' cannot be used in a constant expression
   20 |         return sizeof_template<long>();
      | ^
Example.cc:33:29: note: in call to 'sizeof_long()'
   33 | constexpr int sizeof_long = ConstexprTemplate::sizeof_long();
      | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Example.cc:24:24: note: declared here
   24 |     static constexpr I sizeof_template()
 |                        ^
4 errors generated.
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzMWElv6zYQ_jX0hajBRYrkgw5OHBc5tYfeC1IcyyxoyiWpNMmhv_1BkhdlUbS894InGLIgcIbDb-abRcJ7XViADMW3KN4sRBX2pcv-FP8p8byQpXrOEOMYxbd_WKMtYHgSh6MBFG8QS_chHD3ia8S2iG2LUsnShGXpCsS2L4ht_30R4vcdxHvEVohsEFmjG9L-csRu61_z1gdX5QHfldYHeDq6v-BwNCLASSY5LcMYYx9E0DnOz0uxtgF7_QLl7u98Lxxi6WWzev1V2EGonD2vDect-F0jxu9Pkvy2K7w5mTBqf78vXeg34HT12tGKvzdkohXafocNtfCPgMKUtphvRSM9CoizEEb8LjwfwYoD4Idatt_Mh3c7TjIUsfShx6xkc3nb3nvDFCO--SDe-Rrx9ftoPivtj7oR-rrR-anC-nFY3TXMPlVWu3KEtk68XBA8p4pXgBphC_wIzuvSYpou6TLFiKWFDigihQ77Si7z8oD42pjHA2Lb-u-3oyv_gTwsCx0wl7GMcwp5JDhZxUKS1Y1SSUogjVQiZEp3XCW73TVnNfdtZQxWWhS29HU8HcB7UTSneG1ueArtm_s2VS7zHPE1J4ivaYz4GoNzpasfroA9CqeFNIARS165P8GHygcsAWurgxZGv4DC8hmLVlrYgGsN4GtALlHLCUbJXX-WnBd-LRlqxSi-x93r_4HrA0BqKOhNDYMtm61xZRXstAWFd5XNQ-3gKxwf5esE58LasoGn8qCwtgO44LgxfzAB9ZeEy_n7fFyvv55JW5wLY3Ao37m2Uc2Sr_TZdC-x6Hy7HElBboQDhffg4LIJiy7ITky4XYe8uXpgphOpdMp8c7lE-_3yPbn3NZuGGPSRcyiZzaFrrzGVRJSMo1BfNzPEIXom0ucc6iLaJdFXOGuGq76AR0PAsomsaQr8XM6wfjfMbS96q88M4swvPucGeXrtoSNrT28LPuhdlg7S5gprlzQ_21u_Il2mlx0-kUBtTzuXQbzfJ_N76h_awbH55ecy4E2nERtZf3pmyCEe8XEtXAfbLpF-vtN-ydIzhktRyxqPC7DgRAC1fDM4LVTG1YqvxAIymrCYk2jFyWKfxUpRLiS9kUCkjBKREEFjklPJyO5mJxc6Y4RFZEUYXTFGyZJHSbQSiZAUdkQmMYoIHIQ2y3oaXJauWGjvK8goSQhNF0ZIML75BsZYM2IixlC8WbisGR9lVXgUEaN98FcVQQfTfDhrJeJNB6_Ld4kDhH2pxkb5onIme_NV7TrTtsPsm5kWsW1zFo_Y9nScx4x9CwAA__8HJSu_">