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

    <tr>
        <th>Summary</th>
        <td>
            avoid error 'placement new would change type of storage'
        </td>
    </tr>

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

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

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

<pre>
    With the following code:

```c++

 template
  < unsigned I
  >
  struct
type
  {
      constexpr
 type(){}
  };
#include <cstddef>//std::byte
#include <algorithm>//for std::max
  template
  < typename... T
  >
  union 
uninitialized_T0
 /**<@brief
   *  A buffer for stoarge of a 
   *  variant of types T...
 */
  {
      constexpr uninitialized_T0() noexcept {}
 uninitialized_T0(const uninitialized_T0&) = delete;
      uninitialized_T0& operator=(const uninitialized_T0&) = delete;
      constexpr ~uninitialized_T0() noexcept {}
      
        static constexpr size_t
 Size = std::max( { sizeof( T)...})
        ;
          alignas(T...) 
 std::byte
      buffer[Size]{}
        /**<@brief
         * Storage for any of T... with proper alignment for all.
         */
 ;
        constexpr void*
      voidify()
        { return buffer
 ;}
    //#define EXPLICIT_TYPE0
    #ifdef EXPLICIT_TYPE0
 type<0>
      t0
        /**<@brief
         *  The only reason for this is to show the
         *  absurdity, in one sense, of the error when
 *  defined(USE_BUFFER) && defined(USE_CONSTEXPR). 
         *
         * The error is not absurd in another sense because
         *  it conforms to the <A HREF="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2747r2.html">standard</A>:
 *  saying(at "(5.14)"):
         *    "unless P points to an object whose type is similar to T;"
         *  and std::byte[Size] is NOT similar to type<0>.
         *
         *  OTOH, it is absurd because the purpose of this union is to provide
         *  an uninitialized buffer in which to placement new a type, T, whose 
         *  "alignment and size requirements" are "compatible"
         *  with that of the buffer's.
 *
         *  Note, "alignment and size requirements" means alignas(T) and sizeof(T). 
         *
         *  The constraint, "similar to" should be irrelevant, in this case.
         */
        ;
 #endif//EXPLICIT_TYPE0
  };
#include <new>
  template
  < typename... T
 >
  struct
variant
  {
  private:
        uninitialized_T0
        < T...
        >
      storage
        ;
  public:
          constexpr
 variant()
        {   
        ;  new
        #ifdef EXPLICIT_TYPE0
 ( &storage.t0
           //with clang++20, WHEN defined(USE_CONSTEXPR),
           //this compiles without error.
 #else
           ( storage.voidify()
           //with clang++20, WHEN defined(USE_CONSTEXPR),
           //this causes error:
           // error: constexpr variable 'v' must be initialized by a constant expression
 //  note: placement new would change type of storage from 'std::byte' to 'type<0>'
        #endif//EXPLICIT_TYPE0
           )
 type<0>
        ;}
  };
  int
main()
  {
 variant<type<0>,type<1>,type<2>>
  #define USE_CONSTEXPR
  #ifdef USE_CONSTEXPR
    constexpr
  #endif//USE_CONSTEXPR
  v
  ; return 0
 ;}
  
```
When:

`defined(USE_CONSTEXPR)` and `!defined(EXPLICIT_T0)`
 
as explained in the comments, `clang++-20 -std=c++26` produces the error shown in the comments.

However, when:

`defined(USE_CONSTEXPR)` and `defined(EXPLICIT_T0)`
  
No error is produced.

Is there someway to disable the error about:

`placement new would change type of storage`

? If not, is there some code modification to disable that error message in
this particular case?  If so, where is that code?
  
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJy0WF-v2joS_zTmZXSi4ACBBx44HFCPtDqtbrnq3afKSSbEVWJnbQdKH_azr8YJkACnt13pIiRIPJn5zb_fDAhr5V4hLtn0mU1fRqJxhTbLtK7Lb3gQyo4SnZ2WX6QrwBUIuS5LfZRqD6nOkEUrFvr3LGzfKePP9PZ3wWFVl8IhfQcWraFR3lwGr92tjf-0zjSpY-HKnepOOH72n_RKtbIOv9fGqyQJPmd8QSLxSyf9wiJvlEdSpWWTIZlLrcsyzMkK3zK-tS4jxNEqOXlMQ2lR7rWRrqgu8rk2cHmmEt-9rTufCJESFQZBALuBW42SWgELV42SSjopSvkDs6-7kE69iRW9ozWbhImRmLcuM74CWEHS5DkaaEFoYfYIOgcBPaGDMFIoR_cJhYVdEASt8hXpfzeScIfIhxSUxu8p1g6uwX0g6dU8OJiRCha9QIYlOmxT0lp-IAy6RiOcNix6-f-UXt3576_741-XL1R7wsm0p8vKH_iVihE-yx_oTQ-KgM9JmxfTOV3tGF9Q3OMXqsqr5j5UeolS7pWwjM99msitcAW3RdnKtsln02fCwKYvN_jhJ-VzPl_BZ6eN2KMvIaFOVCZkGY7UzbWh-LegKlSulSrL4EZLV0dDZ67ROmiZkdT5jK5lfupatIc3fgaDrjHq7Fun9OJV23OMRxnmUiFs_vr0r9f16-7r7t-fNuFFKJJ5hvmDU88M0To8dx-9XPibIYNdgaBVeQKDwmrlo-IKaUFacBpsoY9EhHfPicQ2JpPuxPgapAKtECwqi3RN_VkgoDHawLFA1fUoQOtrxvj8z8-br89_brebP3xlUN3Pbo7XH98-7zZ_fSKJAG7zdINodzEoLSjtOoSETSjtCjQtPkgwFY2990g6SnOuTeU9JwdYtF7Bhz82W9-yvHCutlS8PnPH4zHQNaon67JAmz3j228uHRPvppyTwJ7TVaZTy_i2FjUa-sJDPqFrHk9iw4PCVSXjnEUb64TKhMkoXXy7orz6edPCs-Ik1Z7xuXBA8nw-DcYTKjq6WHSiA4_ogzeqRGvhE9RaKuddEwp08g1TB8dCW_SVRFGzspKlMCSyo1Ll_D7tKrvp4EvLkoa3j7u-ll6J3rXZreaPu48ffC05UtQlr8uVT0bdmJrQ-uKStps2bZnWRh9k9qBK1ZBhz0NGKjgWMi38s6VI0TOCwiOIbuKuiebWXYDu9DLOr0TiY0LUafA_jTRel2WcgzBIkqmuauFkUuKjiB7bVUO4c9d0dMFjexltt8-8aech_hqMCoWyfTamhjtLe0rf_UqD-Q7zRGiEVK6zf802mbKFbkpKG0hjsKSNynUE4XOWCovvEO75Rsu7jEeoMpm3rfaAGt9ZgRQez3z494vL3TrW7ReDPaI28kBaBv31aMG5OLC-rCWXW1eGtu2MejA26yYpZXrTx8Nl8Izv0bAZDHkWPQOV82AavDtJ_Ijnsw5aMBgil0Hl6zQtBXEQrbw8pMR--bB5-wlrM75-pKutBV3VskTrO0A3rmXv4Jz9ckjR4FGeIb43df9BtMRDtsV4m6NO7nLYXxcoY0lJPBAfGI-haqzz_dEnpROI9hlabuk5tFZqdVmbt0ATjWrwhq2Ovt3SQqh9R-M6PwcJcqMrsjvkax4T6TEe9_cHHg8r5ee91_N78d4mAv1l59KsANK3VyWk6iWv67VzeUfrAbbz1Xhwxf18bA1el6hhSruztu7vj26668bxe_lDRyWXzS68Wer6vwxZuPpCm0_vJ-NPKm8Wekam5_j4KncNfthKeYPhSlgqk1KQWEuuRM1VR_lr0tMr_icewpOvgpfu9yqfkcXa6KxJ0faWNdr31K3GoPXggz7igSbTut3pftezv3GL_HrT1x2uQ5d11l89TINgdYVHcaIqzqT1zXXFLxLduD6yX--XFga9oy285tRxfnT17fp_AaDSmcxlKhwtIAMYomMxqNBa6kFJTewJpBbGybShWUlTkIyQFau7eBpsTQnX_dXQTsVRtoyyRbQQI1yO4-liES_C6WxULJNJnOOEL_KpWMzn01m0EMk4n-VpFIpslkxHcslDPh2H4SKMwsl4Foyns5zH82ixGPPFeJKzSYiVkGVQloeKNtiRtLbB5XjGp_PFqBQJltb_UcI5Bc-f0gozfRmZJT30lDR7yyZhKa2zVzVOuhKXgki6Cwfj8W8kgsejxpTL4bq9l65okiDVFeNbMtV9PNVG0y7L-NYDpBW78-Cw5P8LAAD__2wpL9c">