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

    <tr>
        <th>Summary</th>
        <td>
            [clang] "Member access into incomplete type" error is issued by clang but not gcc/MSVC
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            clang
      </td>
    </tr>

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

    <tr>
      <th>Reporter</th>
      <td>
          aelovikov-intel
      </td>
    </tr>
</table>

<pre>
    I don't know if clang or gcc/MSVC is correct here, so submitting the issue against the compiler that rejects the code. Godbolt link: https://godbolt.org/z/cMbo3drWa.

Same copy-pasted here:
```
#include <type_traits>

template <typename key_t>
struct key_tag {};
template <typename property_ty, typename key_t = property_ty>
struct property_base : key_tag<key_t> {
 constexpr auto get_property_impl(key_tag<key_t>) {
        return *static_cast<property_ty *>(this);
    }
};

template <typename...  property_tys>
struct properties : property_tys... {
 properties(property_tys... props) : property_tys(props)... {}

 using property_tys::get_property_impl...;

    template <typename key>
    using prop_t = decltype(std::declval<properties>().get_property_impl(key_tag<key>{}));

 template <typename key>
    static constexpr auto get_property() 
 -> std::enable_if_t<std::is_empty_v<prop_t<key>>, prop_t<key>> {
 return prop_t<key>{};
    }
    template <typename key>
 constexpr auto get_property(int = 0 /* Only needed for MSVC, gcc/clang are fine witout this */) 
    -> std::enable_if_t<!std::is_empty_v<prop_t<key>>, prop_t<key>> {
 return get_property_impl(key_tag<key>{});
    }
};

struct foo : property_base<foo> {};
struct bar : property_base<bar> { int x; };

int main() {
    properties pl{foo{}, bar{}};
}
```

clang's error:
```
<source>:19:55: error: member access into incomplete type 'properties<foo, bar>'
   19 | using prop_t = decltype(std::declval<properties>().get_property_impl(key_tag<key>{}));
 | ^
<source>:18:5: note: in instantiation of template type alias 'prop_t' requested here
   18 |     template <typename key>
      | ^
<source>:37:16: note: in instantiation of template class 'properties<foo, bar>' requested here
   37 |     properties pl{foo{}, bar{}};
      |                ^
<source>:13:8: note: definition of 'properties<foo, bar>' is not complete until the closing '}'
   13 | struct properties : property_tys... {
      |        ^
1 error generated.
Compiler returned: 1
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzEV02P4jgT_jXmUmpEbOjAgQNND6_ew2gPI-0ekZNUwNvGztqVnmF__aqcENL09MdIKy1q0UpcH89TXy50jObgENdi8SAWjxPd0tGHtUbrn82Tf74zjtBOCl-d1_-Hyjshc4In57-DqaG02h3ABziUpZC7r99-34KJUPoQsCQ4YkAhtxA9xLY4GSLjDkBHBBNji6AP2rhI6U3pT42xGICOmiDgn1hS7E8qnML_fFV4S2CNexJqA0eiJgq1EXIn5O7QnU59OAi5-1vIXfm18KoKf-ipmD2K2ab7_qZPbLA53zU6ElYdRNWfivtZ_9c9SmVcadsKQagtnRvcU9CGolBfxkYJT43VNEg5dvKE5z0NgpFCW1L3Uh9A5A8ifxTq4R0DTfANBjrv6cwxfGkYhHp8IXHjaDgqdGSzm4trobYXZAlFUoLSu0j4owmgW_JwQNoPFsypsUIuX-sLuRqZ6D8BqQ0OhNxE0mTKfakjCbUdYeXDpL6ko4lCroY4sAGOSxfbUYDeDtN0OoVxIOIbkTAYUxjGoqx7JXAVFHJ5K8bPMRG-sdHL8tnF3ECgs9tGLvqXEDdCbV4FeTqd3hDmeLxVXANPFrr66EujwtKytJDLSFXnkN89a3tNBlNNeWDwH-acRTt2cjVOWo_iUzi7mniv3Do00KvccZkOBNDpwuLe1Fx-2-G1iXs8NXTeP_fU0nHvmvlt4fXbUeL7kr2VedmiL0rzc3l5n6VxXaZmkCbYBn5z9gwOscIKah-Ahylj70ZrN2l1QKiNQ_huyLc8OE1M7cQmhqgBvBs4IbN_O3a_VjyfbPe-gWvvX3YdjzShtrX3Fywj1V6p0OGnSoUOvRJwAn4I9QCvPfPRSRt3KcbxkBvNk8aK_IFh9My27LZ_GNscKN5cL-k7JVbIPAKG4MObd5HaRt-GElMKNtlKqM1iwRQvanDCU4EBdFlijEzPg3F8rVokTPcHCJmPez_FsIfNyc4Hmhmz3v6ncyUBEIsvP-e_ZP7M2nniCxyMA94ltCOjyXgHvr72aCKvrdHxEoI9CZlDwL9avO4BA_tlcv7p8QvvYlU5A77_NNjS6hg_TNVb2FU-YP_1Ur2Sufm8mQcl1GY5plZhbZy5kPqQhYmsCUOZto6M7dY-61P1cVky5FFxqgTxVy_4W24Dp6zrITigw6AJq35l3F5W0m7KIdc7ZDftOanWqlqplZ7gOstVls1kvpxNjmtdrDJdyKxaVnU2X9bzOd4v87Ku5zKv6_t6YtZyJudZNlvKbKFms-mqrusiny_mel6qapGJ-QxP2tiptc8nXm0naW1eZ9liMc8nVhdoY1rcpezHiOQdPqxZ4a5oD1HMZ9ZEilcTZMimbb_TWDyCkPLrh6NDSNlHycRue6-gOPc_AIqWUhavvwImbbDrmxXd0LEtpqU_CbljOP2_uyZ4XvaF3CW7Uchdz_B5Lf8JAAD__8kG2To">