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

    <tr>
        <th>Summary</th>
        <td>
            passing a pointer as an enumerated must be an error?
        </td>
    </tr>

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

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

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

<pre>
    The program below:

```
$ cat enumcast.c
enum E {
  E_FOO = 0,
  E_BAR = 1,
};

int foo_enum (enum E e);

int bar_enum (enum E e) {
  return foo_enum ((void *) e);
}

int foo_int (int x);

int bar_int (int x) {
  return foo_int ((void *) x);
}
```

Triggers an error in GCC, but only a warning in clang/llvm.

GCC:

```
$ gcc -c enumcast.c -o enumcast.o
enumcast.c: In function ‘bar_enum’:
enumcast.c:10:20: error: incompatible type for argument 1 of ‘foo_enum’
   10 |   return foo_enum ((void *) e);
      |                    ^~~~~~~~~~
      |                    |
      |                    void *
enumcast.c:7:22: note: expected ‘enum E’ but argument is of type ‘void *’
    7 | int foo_enum (enum E e);
      |               ~~~~~~~^
enumcast.c: In function ‘bar_int’:
enumcast.c:16:19: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
   16 |   return foo_int ((void *) x);
      |                   ^
enumcast.c:16:19: warning: passing argument 1 of ‘foo_int’ makes integer from pointer without a cast [-Wint-conversion]
   16 |   return foo_int ((void *) x);
      |                   ^~~~~~~~~~
      |                   |
      |                   void *
enumcast.c:13:18: note: expected ‘int’ but argument is of type ‘void *’
   13 | int foo_int (int x);
      |              ~~~~^
```

clang:

```
$ clang -c enumcast.c -o enumcast.o
enumcast.c:10:20: warning: incompatible pointer to integer conversion passing 'void *' to parameter of type 'enum E' [-Wint-conversion]
  return foo_enum ((void *) e);
                   ^~~~~~~~~~
enumcast.c:7:22: note: passing argument to parameter 'e' here
int foo_enum (enum E e);
                     ^
enumcast.c:16:19: warning: cast to 'void *' from smaller integer type 'int' [-Wint-to-void-pointer-cast]
  return foo_int ((void *) x);
                  ^~~~~~~~~~
enumcast.c:16:19: warning: incompatible pointer to integer conversion passing 'void *' to parameter of type 'int' [-Wint-conversion]
  return foo_int ((void *) x);
                  ^~~~~~~~~~
enumcast.c:13:18: note: passing argument to parameter 'x' here
int foo_int (int x);
                 ^
3 warnings generated.
```

It would be good to have the same behavior in both compilers.

Would clang consider to turn that warning into an error?  It seems to me that it makes very little sense to pass pointers as enumerated values...

The related GCC bugzilla is https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107843

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy0V82OozoTfRpnU0oEJglkkUV30hnNaqRPI82yZUwFPJ-xI9sk3bO4z35lCOSP_M1Vo8gEU7arTp062MxakSvEOZm8kslywCpXaDP_jSUzvBikOvuc_ywQNkbnhpWQotQ7Er2QYEmCtp0G-1_zSMfAmQNUVcmZdSPe9PtneAMSvzbPAG_vqx8_gERLCAhdHHpfX_5X94ZdL4mXJHo9XlQoB2ut3-tZCU32syOhsx7LlJk-y2NnDLrKqJM5CU22WmRA6Is3Pp07Xva54--EJv72cd2VM6srbuytzrz46PfiLAd1-9OIPEdjgSlAY7QBoeDbYkHoAtLKgVbyExjsmFFC5f4ll0zlhK6k3Jaj46n8qLtZzzmHIT9KPAz14UkfaLCnRfQC3xWsK8Wd0ArIGyVJQGZJm622Y9YtfTI4DEj0Qn3TROf_CMV1uWFOpBLBfW4Q1toAM3lVonIQgl4f1mlzfVhnnwQIAyDxAp5mBdRXM_TiIpO3f9rrEfN48YBV58olPrGHh3pUlHZYw_SxQe4wO0DQFEMHQE2LDi1hPVw1it2Abr0LzCCufXykMK9F1IIzeXuKK0K5e1SZ-sa_bNnu__rX4DRstFAODayNLr3_mKPxkWdivUbjkbDiDwKZvA5_CeWGTg_3Q4Z-CjJZHogzvSTOA3V8K8X9aPRHtPF6rvJbhD8GC0r2f7RdyHX8LRg74Qrt2dDA1AXPtdqisUKrr4_7iXJ5qFpuFEsY-Sa5XS0n2P2HUgmjk1K59tG4EspJifQKfyPj97_S3uxJxT4S3SPenchuyyCnO2YdSNNRlND4QIu4LkNmWImuqb0GShrvBYrGdxj4V0J9h2931PSi2E5i8L57tws0-PiWpcev5xSg1bQzeOvStiWTEk2XlRZjT-tjgJ0e-rHXRO5vSvwJoPvj-jqGnUd_j15fEvOl-txl10c_u26LSR-rohZnCzkqNMxhNrqhLt8d7HQlM0gRcq0z71nBtgiuQLCsREixYFvR7DdT7QrwuRMSjT3ZVP6qZ2lUiGtlRdbktIbaFcwdbU2d7naxJFoBfHdgEUvr7UtsrIXbf9C2aD5BCuckgkVlsQHP2pY5Fpitda6JFrZMVmhHoxP3_LnHoKwNvi38ljn_I6RkXuwL5zbWKyxdEbrKOR_lqhpp4zfPrR2hK1vo3Xta5SOeCxKtREaiZRjEyThqlhhk8yibRTM2wHk4jaMgnNBpMijm0xSDKAknU8SETpN4GoynMx6Ow2TCaRTxgZjTgEZBGEzDMY3HyWgcRFGQZGNOZ2HG-ZqMAyyZkKN6L69NPhDWVjifzJJJMpAsRWnrUx-lCndQvySU-kOgmfsxw7TKLRkHUlhnD7M44STOO3Z2tciaY8YB07KyzlPkKG2Dysj5GXTCFVU64rrcHzv2t-HG6N_IHaGr2jVL6Kp2_d8AAAD__2y-Pa0">