[clang] [clang] Diagnose invalid/unavailable operator overloads for scoped flag_enums (PR #218290)

Corentin Jabot via cfe-commits cfe-commits at lists.llvm.org
Mon Aug 24 08:46:23 PDT 2026


================
@@ -0,0 +1,62 @@
+// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
+
+enum Unscoped { U0 = 1, U1 = 8 };
+enum class Scoped { S0 = 1, S1 = 8 };
+enum [[clang::flag_enum]] UnscopedFlag { D0 = 1, D1 = 8 };
+enum class [[clang::flag_enum]] WithOps { D0 = 1, D1 = 8 };
+enum class [[clang::flag_enum]] WithoutOps { D0 = 1, D1 = 8 };
+// expected-warning at -1 {{operator| is not available for flag-like enumeration type WithoutOps}} \
+// expected-warning at -1 {{operator& is not available for flag-like enumeration type WithoutOps}} \
+// expected-warning at -1 {{operator^ is not available for flag-like enumeration type WithoutOps}} \
+// expected-warning at -1 {{operator~ is not available for flag-like enumeration type WithoutOps}}
+
+WithOps operator|(WithOps L, WithOps R) {
+  return static_cast<WithOps>(static_cast<unsigned>(L) | static_cast<unsigned>(R));
+}
+
+WithOps operator&(WithOps L, WithOps R) {
+  return static_cast<WithOps>(static_cast<unsigned>(L) & static_cast<unsigned>(R));
+}
+
+WithOps operator^(WithOps L, WithOps R) {
+  return static_cast<WithOps>(static_cast<unsigned>(L) ^ static_cast<unsigned>(R));
+}
+
+WithOps operator~(WithOps L) {
+  return static_cast<WithOps>(~static_cast<unsigned>(L));
+}
+
----------------
cor3ntin wrote:

you don't actually need to provide implementations

https://github.com/llvm/llvm-project/pull/218290


More information about the cfe-commits mailing list