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

    <tr>
        <th>Summary</th>
        <td>
            [HLSL] hlsl202x `double` compatability overloads
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            HLSL
      </td>
    </tr>

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

    <tr>
      <th>Reporter</th>
      <td>
          llvm-beanz
      </td>
    </tr>
</table>

<pre>
    Lots of HLSL builtin functions that operate on floating point elements do not have `double` overloads. In most cases DXC successfully resolves those overloads to `float` but does not emit conversion diagnostics.

In Clang we should provide wrapper overloads that call the `float` overloads and produce conversion diagnostics. We should use the C preprocessor to define these overloads and have them conditional on HLSL 202x.

Some macros I've been playing with:

```hlsl
#define DXC_COMPAT_UNARY_DOUBLE_OVERLOAD(fn) \
  float fn(double V) { return fn((float)V); } \
  float2 fn(double2 V) { return fn((float2)V); }                               \
  float3 fn(double3 V) { return fn((float3)V); }                               \
  float4 fn(double4 V) { return fn((float4)V); }

#define DXC_COMPAT_BINARY_DOUBLE_OVERLOAD(fn) \
  float fn(double V1, double V2) { return fn((float)V1, (float)V2); }          \
  float2 fn(double2 V1, double2 V2) { return fn((float2)V1, (float2)V2); }     \
  float3 fn(double3 V1, double3 V2) { return fn((float3)V1, (float3)V2); }     \
 float4 fn(double4 V1, double4 V2) { return fn((float4)V1, (float4)V2); }

#define DXC_COMPAT_BINARY_TERNARY_OVERLOAD(fn) \
  float fn(double V1, double V2, double V3) { \
    return fn((float)V1, (float)V1, (float)V3); \
  } \
  float2 fn(double2 V1, double2 V2, double2 V3) { \
    return fn((float2)V1, (float2)V2, (float2)V3);                             \
  } \
  float3 fn(double3 V1, double3 V2, double3 V3) {                              \
    return fn((float3)V1, (float3)V2, (float3)V3);                             \
  } \
 float4 fn(double4 V1, double4 V2, double4 V3) { \
    return fn((float4)V1, (float4)V2, (float4)V3); \
  }
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJyklltv6zYMxz-N8kKcwKac24MfcmmwAtk69Fx29lTINh1rkCXDktN1n36QkzTOpUnQEwQwRFn8kfrTIIW1cq2JYjaYscGiJxpXmDpWalN-SUjo_3qJyd7ilXEWTA6_rb6uIGmkclJD3ujUSaMtuEI4MBXVwhEYDbkywkm9hspI7YAUlaSdhcyANg4KsSFgwyAzTaKIDQMwG6qVEZntw6OG0lgHqbBkYfFzDrZJU7I2b5R6g5qsURvyTGPpcBCc8S5bsveYNA4yQ7YFUikdpEZvqLbSaMikWGtjnUxtnwVTFkwfNcyV0Gt4JbCFaVQGVW02MiN4rUVVUd1F-XRToRS4go6oh3eEbj1kTUofkeGvd1ZjqfU1h6qmqjY-X1P7nDLKpW43j7L17ttrdAWVHpBJL4VQ_vpblTDAf3fJfTUlQSnS2lh4ZDjaECREGiol3rxKr9IVjE-3L7NhsP0Xyiq_Rr6LYfFz_jJ_-v3P6beX739Mn_9-WTx9n60eXp5-PDyvnqYLhuNcM5wAG8xZMIVtGYC3jbdSw492ezSDmlxT6-2eP9deIE78PuMzYKPFsRfsusHrfvDE0fXfEYZ3Mfw6hn8eE3Ux0XVMdIzZiXRJlNnjZ1UJGc5hv8BbGrVvdw146RauytcB4g0iniHxEvOqjB0cv4HjZzh-BXdRzQ4tukGLzmjRCe223t8entvnrwh-WPB9uPvTcH8dnBn4Po-dr5uf9VlddFZ3RvZxvZxY9sHd89WeBX6zwjqr98DvQl3O6uOyPLF8Mqv7CrmzulONjwv8xHKhVLrNqJfFPJvwiehRHI6iIByF4RB7RTzkyTjIQx6FUcgHlGAucMxHwwnxiQiCUU_GGOAgQAwxGGCE_WyEQcYH0RjzfIjBgEUBlUKqvh96-qZe96S1DcUhjhHHPSUSUradjxB9Z2WIflLaD0nN2rIoUNI6e_DgpFPtTNUeGCzAN1PfkY_HntSUlXAikUq6t0N37zW1igvnKuu7Mi4ZLtfSFU3ST03JcOkxu8eXqjb_UOoYLtuoLcPlLvBNjP8HAAD__3_r1Tg">