DKLoehr wrote:

Here's what cvise gave me; unfortunately, I'm in a rush so I don't have time to 
clean it up any further. It crashes when run with `clang++ repro.cc -std=c++20 
-Wno-everyt hing -fsyntax-only -ferror-limit=0`

repro.cc:
```
template <bool, class _IfRes, class> using conditional_t = _IfRes;
template <class> void forward();
template <typename> class OnceCallback;
template <template <typename> class, typename> bool is_instantiation_v;
template <template <typename> class C, typename... Ts>
constexpr bool is_instantiation_v<C, C<Ts...>> = true;
template <template <typename> class C, typename T>
concept is_instantiation = is_instantiation_v<C, T>;
template <bool...> constexpr bool kIsWeakMethod = false;
template <typename> struct TypeList;
struct C;
template <int, typename> using DropTypeListItem = TypeList<C>;
template <typename, typename> struct MakeFunctionTypeImpl;
template <typename R, typename... Args>
struct MakeFunctionTypeImpl<R, TypeList<Args...>> {
  using Type = R(Args...);
};
template <typename R, typename ArgList>
using MakeFunctionType = MakeFunctionTypeImpl<R, ArgList>::Type;
template <typename Signature> using ExtractArgs = Signature;
template <typename Signature> using ExtractReturnType = Signature;
template <typename...> struct FunctorTraits;
template <typename> struct DecayedFunctorTraits;
template <typename R, typename Receiver>
struct DecayedFunctorTraits<R (Receiver::*)()> {
  using RunType = R;
  template <typename Method, typename ReceiverPtr>
  static void Invoke(Method, ReceiverPtr);
};
template <typename Functor>
struct FunctorTraits<Functor> : DecayedFunctorTraits<Functor> {};
template <bool, typename...> struct InvokeHelper;
template <typename Traits, typename ReturnType>
struct InvokeHelper<false, Traits, ReturnType> {
  template <typename Functor, typename BoundArgsTuple, typename... RunArgs>
  static void MakeItSo(Functor, BoundArgsTuple, RunArgs...) {
    Traits::Invoke(0, forward<RunArgs>...);
  }
};
template <bool is_once, typename T, typename StoredType = T,
          typename ForwardedType =
              conditional_t<is_once, StoredType, StoredType>>
using TransformToUnwrappedType = decltype(ForwardedType());
template <typename, typename> struct Invoker2;
template <typename Traits, typename R, typename... UnboundArgs>
struct Invoker2<Traits, R(UnboundArgs...)> {
  static void RunOnce() { RunImpl(0, 0); }
  template <typename Functor, typename BoundArgsTuple>
  static void RunImpl(Functor, BoundArgsTuple) {
    InvokeHelper<kIsWeakMethod<>, Traits, R>::MakeItSo(0, 0,
                                                       forward<UnboundArgs>...);
  }
};
template <template <typename> class CallbackT> struct BindHelper2 {
  static constexpr bool kIsOnce =
      is_instantiation<OnceCallback, CallbackT<void>>;
  template <typename Functor, typename... Args> static void BindImpl(Functor) {
    using Traits = FunctorTraits<TransformToUnwrappedType<kIsOnce, Functor>>;
    Invoker2<
        Traits,
        MakeFunctionType<
            ExtractReturnType<typename Traits::RunType>,
            DropTypeListItem<sizeof...(Args),
                             ExtractArgs<typename Traits::RunType>>>>::RunOnce;
  }
};
void (C::*BindOnce2void___trans_tmp_1)();
void BindOnce2void() {
  BindHelper2<OnceCallback>::BindImpl(BindOnce2void___trans_tmp_1);
}
```


https://github.com/llvm/llvm-project/pull/136128
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to