================ @@ -1429,6 +1429,22 @@ operator<<(const StreamingDiagnostic &DB, T *DC) { return DB; } +// Convert scope enums to their underlying type, so that we don't have +// clutter the emitting code with `llvm::to_underlying()`. +// We also need to disable implicit conversion for the first argument, +// because classes that derive from StreamingDiagnostic define their own +// templated operator<< that accept a wide variety of types, leading +// to ambiguity. +template <typename T, typename U> +inline std::enable_if_t< + std::is_same_v<std::remove_const_t<T>, StreamingDiagnostic> && + llvm::is_scoped_enum_v<std::remove_reference_t<U>>, + const StreamingDiagnostic &> +operator<<(const T &DB, U &&SE) { ---------------- cor3ntin wrote:
I'm not sure why `operator<<(const StreamingDiagnostic &DB, U &&SE)` would not work - if there are ambiguities in the derived classes, can we fix those instead? you have examples? https://github.com/llvm/llvm-project/pull/138089 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits