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

    <tr>
        <th>Summary</th>
        <td>
            Assertion `!isa<ElaboratedType>(T) && "Elaborated type in nested-name-specifier"'
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            c++,
            clang:frontend,
            crash-on-valid
      </td>
    </tr>

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

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

<pre>
    I tried the following code with clang (assertions):

<details><summary>Details</summary>
<p>

```c++
namespace std {
typedef long unsigned int size_t;
typedef decltype(nullptr) nullptr_t;

template <typename _Tp> class reference_wrapper;
template <typename _Tp, _Tp __v> struct integral_constant {
  static constexpr _Tp value = __v;
  using value_type = _Tp;
  using type = integral_constant<_Tp, __v>;
 constexpr operator value_type() const noexcept { return value; }
 constexpr value_type operator()() const noexcept { return value; }
};
template <bool __v> using __bool_constant = integral_constant<bool, __v>;
using true_type = __bool_constant<true>;
using false_type = __bool_constant<false>;
template <bool, typename _Tp = void> struct enable_if {};
template <typename _Tp> struct enable_if<true, _Tp> {
 using type = _Tp;
};
template <typename _Tp, typename _Up = _Tp &&> _Up __declval(int);
template <typename _Tp> _Tp __declval(long);
template <typename _Tp> auto declval() noexcept -> decltype(__declval<_Tp>(0));
template <bool _Cond, typename _Tp = void>
using enable_if_t = typename enable_if<_Cond, _Tp>::type;
} // namespace std

template <class T> struct type {};
template <typename Iterator> class fragmented_memory_input_stream {};
template <typename Iterator> class memory_input_stream {
public:
  using fragmented_type = fragmented_memory_input_stream<Iterator>;
  fragmented_type _fragmented;

public:
  template <typename StreamVisitor>
 decltype(auto) with_stream(StreamVisitor &&visitor) const {
    return visitor(_fragmented);
  }
  using has_with_stream = std::true_type;
};
template <typename Stream, typename StreamVisitor,
          typename = std::enable_if_t<Stream::has_with_stream::value>>
decltype(auto) with_serialized_stream(Stream &stream, StreamVisitor &&visitor) {
  return stream.with_stream(visitor);
}
template <typename Stream, typename StreamVisitor,
          typename = std::enable_if_t<!Stream::has_with_stream::value>,
          typename = void>
decltype(auto) with_serialized_stream(Stream &stream, StreamVisitor &&visitor);
class fragment_iterator {};
template <typename T> struct serializer;
template <typename T, typename Input> T deserialize(Input &in, type<T> t);
using input_stream = memory_input_stream<fragment_iterator>;
struct mutation_partition_view {};
struct canonical_mutation_view {
  input_stream v;
  auto partition() const {
    return with_serialized_stream(
        v,
 [this](
            auto &v) -> decltype(deserialize(std::declval<input_stream &>(),
 type<mutation_partition_view>())) {
          auto in = v;
          return deserialize(in, type<mutation_partition_view>());
        });
 }
};
```

</p>
</details> 

I got the following assertion:

```
1.      schema_tables.cpp:65:10: current parser token ')'
2.      schema_tables.cpp:55:1: parsing struct/union/class body 'canonical_mutation_view'
3.      schema_tables.cpp:57:26: parsing function body 'canonical_mutation_view::partition'
4.      schema_tables.cpp:57:26: in compound statement ('{}')
...
#10 0x00007f5fa1721560 llvm::PointerIntPairInfo<void*, 1u, llvm::pointer_union_detail::PointerUnionUIntTraits<clang::Type const*, clang::ExtQuals const*>>::updatePointer(long, void*) /home/dianqk/llvm/llvm-project/llvm/include/llvm/ADT/PointerIntPair.h:202:5
#11 0x00007f5fa1721560 llvm::PointerIntPair<void*, 1u, int, llvm::pointer_union_detail::PointerUnionUIntTraits<clang::Type const*, clang::ExtQuals const*>, llvm::PointerIntPairInfo<void*, 1u, llvm::pointer_union_detail::PointerUnionUIntTraits<clang::Type const*, clang::ExtQuals const*>>>::setPointerAndInt(void*, int) & /home/dianqk/llvm/llvm-project/llvm/include/llvm/ADT/PointerIntPair.h:111:29
#12 0x00007f5fa1721560 llvm::PointerIntPair<void*, 1u, int, llvm::pointer_union_detail::PointerUnionUIntTraits<clang::Type const*, clang::ExtQuals const*>, llvm::PointerIntPairInfo<void*, 1u, llvm::pointer_union_detail::PointerUnionUIntTraits<clang::Type const*, clang::ExtQuals const*>>>::PointerIntPair(void*, int) /home/dianqk/llvm/llvm-project/llvm/include/llvm/ADT/PointerIntPair.h:89:5
#13 0x00007f5fa1721560 llvm::pointer_union_detail::PointerUnionMembers<llvm::PointerUnion<clang::Type const*, clang::ExtQuals const*>, llvm::PointerIntPair<void*, 1u, int, llvm::pointer_union_detail::PointerUnionUIntTraits<clang::Type const*, clang::ExtQuals const*>, llvm::PointerIntPairInfo<void*, 1u, llvm::pointer_union_detail::PointerUnionUIntTraits<clang::Type const*, clang::ExtQuals const*>>>, 0, clang::Type const*, clang::ExtQuals const*>::PointerUnionMembers(clang::Type const*) /home/dianqk/llvm/llvm-project/llvm/include/llvm/ADT/PointerUnion.h:77:16
```

This code is from https://github.com/llvm/llvm-project/issues/91312#issuecomment-2116404306.

The output from `creduce`:

```c++
namespace std {
      template <typename _Tp, _Tp __v> struct integral_constant {
       static constexpr _Tp value = __v;
     };
      template <bool __v> using __bool_constant = integral_constant<bool, __v>;
      using true_type = __bool_constant<true>;
      template <bool, typename _Tp = void> struct enable_if {
    };
      template <typename _Tp> _Tp __declval(long);
      template <typename _Tp> auto declval() noexcept -> decltype(__declval<_Tp>(0));
      template <bool _Cond, typename _Tp = void> using enable_if_t = typename enable_if<_Cond, _Tp>::type;
 namespace seastar {
      template <class T> struct type {
   };
 template <typename Iterator> class memory_input_stream {
    public: using fragmented_type = fragmented_memory_input_stream<Iterator>;
 using has_with_stream = std::true_type;
    };
      template <typename Stream, typename StreamVisitor,           typename = std::enable_if_t<Stream::has_with_stream::value>> decltype(auto) with_serialized_stream(Stream &stream, StreamVisitor &&visitor) {
 }
        class fragment_iterator {
      namespace ser {
 template <typename T, typename Input> T deserialize(Input &in, seastar::type<T> t);
      using input_stream = seastar::memory_input_stream<fragment_iterator>;
     struct mutation_partition_view {
     input_stream v;
     auto partition() const {
      return seastar::with_serialized_stream(         v, [this](auto &v) -> decltype(ser::deserialize( std::declval<input_stream &>(), seastar::type<mutation_partition_view>())) {
         }
 );
```

godbolt 1: https://llvm.godbolt.org/z/6sd8he1Me
godbolt 2: https://llvm.godbolt.org/z/jqfnKz47d
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsWttu67bSfhr6hoghUT5e-MLLjoGgKNCiXv-tQEuUzVYmVZLyOjz9jyF1oBTLcbKdXWygguEo5Jw483E4nIRqzY-CsRWafkHT7YiW5iTVasup-P2X0UGmP1Yv2CjOUmxODGcyz-U3Lo44kSnD37g54SSn4ogRWVCtmTJcCo3IEkVrFGxRUH9Hm5QZynONomcUbXR5PlP1A0XP23p4g8iuHW7YivYX9z0L3CdB5At87KigZ6YLmjCsTYrRvBo2PwqWsgznUhxxKexaU8yFwZr_ZLFBUY8wZUkO74gsRJnnhVGILHH16tFXXOxc5NQwjKINcIEVON6DyeAWrbFiGVNMJCz-pmhRMNVqHOIlG_iB4_gCYrRRZWLAZHZUNI8TKbShwrRrxFgbaniC7RT7XijLf6F5CcK3TlJDXGoIn52NQa8jAZt7JM3kK90o2tSGWiNb1tYEWTBFjVSeJkQW4ExLg4Vk3xNW2HVgxUyphCNF0ReM5ttXAj2La9lO4AfEwsu1OBykzGvHOyfEMYx5Xh_wB1BdcUjlSdXxdVckhF-BfX2ujOb6Jpsl8Pn6SwGDfGhZORfJUw9YTNBDzmKeWUAN-KWP7T5vvQYHXaBo0dkDk4-0u9R11vC1qIVgRGbwiZ7taBzDzr3QHJEFF8YmoDsW4jZaywp54l5eWhqJW1abJ2r0PQGBl0taHW7rRM-ILAIL3uvKHBI3UqS3gujDpQlG7FDa8PhRaiRWRkRrFNnc58cEI7JDZIc7OXUo7bk0t_dQ4UJ9B5heTLWNm2yZKXo8M2FYGp_ZWaofMRdFaWJtFKPnDwodkmRlFOUh50lzWNW5zzOkQe5t41C08VR7ybQvKm4HeqfJK1uuLvAPq-7_uOaVKkfsgQ2ACWiE07m2jiw6fNXuuVRSmvTpHSq4SZ810cI33cMt9vJ15b8T1bGn3voPQOTwVqfD-xPBH9UqvK3Q9QPZtHa7pyHs6PZ2CYo2lVg70zPZDVZHx3Pj50E3M8Vpzn-ytO9xcLVuzH8jCp7_K-871nE3li1Hx4X_df8hEt7vwjdUdFLa57q5cVo368S82sB3JRo_5TVmvVHe7TsReIH0AVL2OGWNCEQWdgKs5qJmQNHGKuycbG6vdRNbtL2W8KBa6K_ST1PVOs4lVJJSxAVVhtu3C2ff-v6oqBMqpOAJzeOGr6GuIt2xza9C7eHZaOmUcNdy0GDwu5C6tCBD0y_mxDWabl9RwWP1AyhAb_-07kajwX57hHddbquQuhat9VdBG_Cox7Ds7fuOhVy4veF5rn4qz3Rt7QDmHt19uRBmf_hqydxcwXo3PER2hX91Q2TXXvqwT_yCj9L0bpTN9bF_dexqC8coWOrkxM40NpCM9DgpChStZ1MUrcMARWuclEoxYQBgmils5F9MYETmdtFzJ4cMyZlaOSAG2MEyh3dEdqWwYN25vAG3Y5A6sA8aTdGgpjmK1oCeVlVWigQkvCncItLbQJWuyR26uMCJPBeyFKm9OjJIC9hiYl7tdOcqK3E8HldxIFEY4OB7EATBPJtmNJyTcDoLcJ5fqlz_m4S7kXoR5jfK1YvIJIo2NrGTNQAzLOG7pS8cfWz9GjusdCR9hYmvL8LsFeVGu3pTHB3NHsopmzMq8d7c83fze0lz3c67Q9xOlkVKDatUNFX_BjeWLqEEPskzAwRzKv7-C5GdNdv9eCqU_JNZSFSjXCR5mbJ2YL3dI7LrOmR8ghgEBMLR-jR8j0-v-dPed_5Bt3Z0_w9AoEKBZqZSsRbpC_hw4dnpLpGQ3D8RC2EIeabeaQAG8i8Y_hEw9Bx7HQqfBYPFspsRotsguM9Lv7LzgSlw0at42PnPi_O_sHwELMkGBz3q90saAgVZDIt9NNKtYovzOdQg4exGEbk_ce3-tMDhXibP-GRMocFO25M6cnMqD-NEngdt4lqXTCOyW4ZRSBCJ7EAiz1DlPJEwnE2CSRTMxl29DMvSwLXLakWzIFEsLRMGBg7Uo_f8AaK66D6u12-fdzX8q6o-GrTo4V1vp-Jjve_r5r2_k90Iu7329zaE35bw8LbwUMDeag7jh_aF_W4wo9pQdQvkN7rCNUcnLo9o5YINTQv14X3cD_U134G_Ozp0-POam8Pt40f3Nb1WsXtu9eA8Qh9-_uQD-2wVrn3wX2m6-cntVeutI-IDfbgqu7_ZjGuJBzts-P4mW9ts9s0fjD_2223dRtvNtppmqm6k-VHA72ywXY3Th_tsLR473fRrxclRpgeZG2x7Q926BGqQcTU_luqIyO4nIruZThcnFv7KugLI3QL-_DsTv_yczNNRuorSZbSkI7YK5-GMhNPlcjI6rSbzJMuWU0YXaRAcIhqR5YwtsizLAjqZzOcjviIBmQRTEoSTaDlZjBdRsggXGZkm6XSSRQc0CdiZ8nxsbZDqOLIV02pJ5tP5KKcHlmv77yGE1BUPIYhs4PeqiMyUFIbBCVJPKKpPT1I8XWjO7fB0O1IrW6odyqNGkyDn2uhWp-EmZ6t13QOECgyRkGuKos1zTg9SUcPSvY02xHRf3c7dBZ20JO6k4QILpg1LnyAFPOmCJTzjTFkL56NS5av_oLIEz_x_AAAA__-OyA1M">