================
@@ -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) {
----------------
Endilll wrote:

If I do what you suggest, this pre-existing `operator<<`
https://github.com/llvm/llvm-project/blob/1121a496c0c5ba03d9751162fb851a9036c795ea/clang/include/clang/Basic/Diagnostic.h#L1297-L1302
causes the following ambiguity:
```
/home/user/endill/llvm-project/clang/lib/Parse/Parser.cpp:229:9: error: use of 
overloaded operator '<<' is ambiguous (with operand types 'DiagnosticBuilder' 
and 'ExtraSemiKind')
  228 |     Diag(StartLoc, diag::ext_extra_semi)
      |     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  229 |         << Kind
      |         ^  ~~~~
/home/user/endill/llvm-project/clang/include/clang/Basic/Diagnostic.h:1297:50: 
note: candidate function [with T = clang::ExtraSemiKind]
 1297 |   template <typename T> const DiagnosticBuilder &operator<<(const T &V) 
const {
      |                                                  ^
/home/user/endill/llvm-project/clang/include/clang/Basic/Diagnostic.h:1443:1: 
note: candidate function [with U = clang::ExtraSemiKind &]
 1443 | operator<<(const StreamingDiagnostic &DB, U &&SE) {
      | ^
```
This patch is far from my first attempt to implement this, but the first one 
that didn't run into one of those ambiguity errors. Overload set of 
`operator<<` for diagnostics is somewhat convoluted.

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

Reply via email to