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

    <tr>
        <th>Summary</th>
        <td>
            Wrong return type for __get_cpuid_max in cpuid.h
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

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

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

<pre>
    The function [__get_cpuid_max](https://github.com/llvm/llvm-project/blob/main/clang/lib/Headers/cpuid.h#L264-L292) returns `int`, but should return `unsigned int`.

The type of the expression (`__eax`) it is trying to return is `unsigned int`:

```c
static __inline int __get_cpuid_max (unsigned int __leaf, unsigned int *__sig)
{
    unsigned int __eax, __ebx, __ecx, __edx;
   // Redacted
    return __eax;
}
```

And also [callers](https://github.com/llvm/llvm-project/blob/main/clang/lib/Headers/cpuid.h#L298) expect an `unsigned int`:

```c
unsigned int __max_leaf = __get_cpuid_max(__leaf & 0x80000000, 0);
```

It looks like the signature should be changed to return `unsigned int` instead of `int`. 

If you run a [reproducer with clang 15](https://godbolt.org/z/oh14c55bn), ubsan also reports:

> /opt/compiler-explorer/clang-15.0.0/lib/clang/15.0.0/include/cpuid.h:291:12: runtime error: implicit conversion from type 'unsigned int' of value 2147483656 (32-bit, unsigned) to type 'int' changed the value to -2147483640 (32-bit, signed)
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior /opt/compiler-explorer/clang-15.0.0/lib/clang/15.0.0/include/cpuid.h:291:12 in 
/opt/compiler-explorer/clang-15.0.0/lib/clang/15.0.0/include/cpuid.h:298:31: runtime error: implicit conversion from type 'int' of value -2147483640 (32-bit, signed) to type 'unsigned int' changed the value to 2147483656 (32-bit, unsigned)
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior /opt/compiler-explorer/clang-15.0.0/lib/clang/15.0.0/include/cpuid.h:298:31 in 

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzNVV2PozYU_TXwYgWBDYQ88JDptGql3Zfdrqo-IYMvwR3HjmwzO7O_vtcQkgyNtO1Ku2pE_InvxznHl9aI1_r3AUg_6s5Lo0lUPDTNAXzTnUYpmiN_iYrHiFaD9ycXsX1Ef8HnIP0wtklnjjhR6nnpNidr_oLO47RVpsXuyKXGrlNcH8JLMiz-ClyAdWE9eEmGiLJ3tMw37-iORnRHLPjRakeiMpXaYxvRn0g7euIGMypx3g_bo3byoEGQ-b0kSh-jdD-3ITH_egJieuJxDC8nC85NadIK324awPyC9R2RnkhHvH2V-kC8WVxId8dLwOHGT1iZnm6eO8-97EjTSK2khnCIrEANAdwaxX0FvA9pvlmO6L5pcI4Rnn1tH-YBwd_KQkgGDeCgXQbdMhAvEbuenFkkH0DwzoO4WjxnPdtaDkTbx1Wit9nvtSBcOROk03GlArE_SjK7KlCHvKIBwu8J4itUrRBEZiYeSMQe15RhRs15k5YkfanS-RcADgq6wnUPpd88UcY8OaLkE0xqDI45og2LqFsg3YA5YzRX_f0zI-ycRzSCqi_3IyFvnPXk1YzEjprwQIsFBFmMHVjyGWkgE7QkK-7yZERrlE-MDeB_wb8ZsrwrilaHJINAW4dQT5SjYWO9W4PMfg4KM6dAKhJ-kiiKDbKkjAW7ULvJiiRN0gvDC9-XZak7NQq4oZzt6S7DNqPYhPS8POK1ttbYsCCPJyU7vMid0c8olnDRe2uOcxGI6PYNknQbEHzmagRCs3ybV6wsynAxGd200t_exaAy5GSxcz5-YQvZnO3gO5vFVp6-tXWxNIP08dP79_sPf4a4P2kBPRYK8QADf5bGfuRaevkFpqzGZXfTnre_N7gIzyKn7-WowpZl38bimryvI37L3VoDd0n8F3r4H7M4g3tlMYY6K8tiWxQVY7GomdixHY-99ArqP6zBWnCuNhNIPca2_lyhrbOHeLSq_s-lXTo3QqjeGEKxi4caqq7ngrZ5W7AUI-tzWkDBhOCs2vEcYsVbUK7G6hVRquEzmUzgGItWLGuaUpqlWZ6xYpuxJKs4ZDQvym1flD1rozwF_I6oJMQRalls6ymkdjw43FTSeXfd5G7iFSZ3aJ-PfjC2fsIC7UHHk-t6Cv1vv0HaWw">