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

    <tr>
        <th>Summary</th>
        <td>
            Incorrectly rejecting qualified names as a member designator of offsetof
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            c,
            c++,
            rejects-valid
      </td>
    </tr>

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

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

<pre>
    Consider the following example (https://godbolt.org/z/jzTKMdMdn):
```cpp
#include <cstddef>

struct X2 {
    int field;
};

static_assert(offsetof(X2, X2::field) == 0);
static_assert(__builtin_offsetof(X2, X2::field) == 0);
```
Clang issues the following errors:
```
<source>:7:30: error: expected ')'
    7 | static_assert(offsetof(X2, X2::field) == 0);
      |                              ^
<source>:7:15: note: to match this '('
    7 | static_assert(offsetof(X2, X2::field) == 0);
      |               ^
/opt/compiler-explorer/clang-trunk-20230727/lib/clang/18/include/stddef.h:116:42: note: expanded from macro 'offsetof'
  116 | #define offsetof(t, d) __builtin_offsetof(t, d)
      |                                          ^
<source>:8:40: error: expected ')'
    8 | static_assert(__builtin_offsetof(X2, X2::field) == 0);
      |                                        ^
<source>:8:33: note: to match this '('
    8 | static_assert(__builtin_offsetof(X2, X2::field) == 0);
```
GCC, EDG, and MSVC accept the code.

The C++ Standard [says](http://eel.is/c++draft/support.types.layout#1.sentence-1) the following: _The macro offsetof(type, member-designator) has the same semantics as the corresponding macro in the C standard library header [<stddef.h>], but accepts a restricted set of type arguments in this document._

C23 (N3096) ยง7.21 p4: <...> _the value of which is the offset in bytes, to the subobject (designated by member-designator), from the beginning of any object of type type. The type and member designator shall be such that given_ `static type t;` _then the expression &(t. member-designator) evaluates to an address constant._

Since in C++ qualified names are allowed to the right of dot, `&(x2.X2::field)` is a well-formed expression ([CE](https://godbolt.org/z/8Yfz33e89)). I believe it's in the spirit of the wording to accept aforementioned example.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy8Vt2O27wRfRr6ZmBBon5sX_jCltcfgiK9SVCkVwYljiymFKmS1O46T18MZa83m22Q9OczDEuizOE5Z84MKbxXZ4O4ZeWelYeFmEJv3fbBSKW1XjRWXra1NV5JdBB6hM5qbZ-UOQM-i2HUCIyv-xBGz_Id40fGj2crG6tDYt2Z8eM3xo9fv33-y0f5URrGN_S39MDSHavS-duO43WE58q0epIILK9bH6TEjuUP17fx1wc3tQG-cGCr_TwEAKBMgE6hliy_jrLV4X5_nSqCak_Ce3SB8bXtOo_Bdoyvv3DGa_jCCVy-mwPxDbD8wPIDpBH2_v0op1MzKR2UOf1n8V5kmB9rLcwZlPcT-reCO2ed_1G_62Neezu5FkmwfLdi-S5PWb6bp8Wb5xHbgBIYXxECvrrrtwK2quF_oxDED8X76YeVD_8WeVYSYGMD0jVYGERoewi98jP69Z-O_g6XH-0YGD-2dhiVRrfE51Fbh47GKH3L4CbzjyVPeZ6uCO1Rq-b2kvFjtmb8eHU648fZ50lPvLOK5buCv2aPz6MwEiV0zg4wiNZZ0uDO7kWILKsicMZziZ0yCK8kCKRAZP2uY19e_1YOfyWfa2L0605cv5vL_7bKfpvPz9jk-W-58__D6E35_1HXNPXh8AddhJHw8dPfahBti2OIjaS1EpPX_fBzj1Azvmd8D5-CMFI4Cazce3HxrDxc-_pLW0fUifJk43mOdKKjMvDTOFoXknAZ0SdaXOwUGM-zxKMJaFpcZsThu15Gup1o_dnOr314GZEYDDg06JYSaX8SwTqK0Yu5J3oxIHgchAmq9XAdba1z6EdrJHXLObIy8VWUfyaoVeOEu0CPgvY02vfy-l6CD5F5Dc0UruJ5EODQB6eiZT0GsB0QThDuPA1ogp_XUR6kbeNIcnqtdM1z2ib_mqebKuaz5my3WiU8g7EgLVheJ0nC8gc4EdxHoScqXnjqVduDmvnNKtFSzSWgJ5TBznpMjW2-YhtolZtkKKG5vKsjzYzNhOY2eFbGkGK2A2EucI1040g_CVCuZspGXmPCPSb4XmgNDSGJhSACnNUjmhOwKp2df41G_q3SSHNODT6PDr1X1gDjFTkgeT_5SKqIQNuiBWFASEkTobWGkvtG8k_KtEha3Rz-z0lo1SmUYMSAHoRDEGRHlDcZnTr3kbi0sR1ScUVIzzx5W5NEQpE1nlDrZWfdgPJ7LmtW7uuHeyH97IC0_nv3Lc9xvYnZ2STwARrUCh8RVGB85W9G9qNyak5Oj_BkXfQ6CTIXuuisQzKgsiYCime0ZCG3udzkG7HAbVZt0qJc83W16LdFwZuqKTpeNlkjqq4qq6wsRNNUpdysV9lCbW_bWJYVRVEladGItNjwKm3KnKeCFSkOQulE68eBKC3i4WVbFVlZLLRoUPt4uuS8ZZz623y3j9_rs0PynF8-Cq0kjZaHhdtSxGUznT0rUq188Pc1ggoatx9MrPk26AvMIUiNHzJNafrRs7Z76TuLyentmxyp0E9N0tqBtm_9eLssR2dpIdrB4yGN8WOk-q8AAAD___RKWuo">