================
@@ -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@-1 {{operator| is not available for flag-like enumeration 
type WithoutOps}} \
+// expected-warning@-1 {{operator& is not available for flag-like enumeration 
type WithoutOps}} \
+// expected-warning@-1 {{operator^ is not available for flag-like enumeration 
type WithoutOps}} \
+// expected-warning@-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
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to