| // Examples from P1099R5 |
| // { dg-do compile { target c++20 } } |
| |
| namespace my_lib { |
| |
| enum class errcode |
| { |
| SUCCESS = 0, |
| ENOMEM = 1, |
| EAGAIN = 2, |
| ETOOSLOW = 3 |
| }; |
| using enum errcode; // import enumerators into namespace |
| } |
| |
| namespace NS { |
| my_lib::errcode get_widget() { |
| using namespace my_lib; |
| return ETOOSLOW; // works, and conversions to int don't. |
| int i = ETOOSLOW; // { dg-error "" } |
| } |
| } |
| |
| enum class rgba_color_channel { red, green, blue, alpha}; |
| |
| const char * to_string(rgba_color_channel channel) { |
| switch (channel) { |
| using enum rgba_color_channel; |
| case red: return "red"; |
| case green: return "green"; |
| case blue: return "blue"; |
| case alpha: return "alpha"; |
| } |
| return nullptr; |
| } |
| |
| namespace ns { |
| struct E_detail { |
| enum E { e1, e2 }; |
| friend void swap(E&, E&); // adl-only swap in the only associated scope of the enum |
| }; |
| using E = E_detail::E; // import E into ns |
| using enum E; // expose the enumerators of E in ns. Also note the direct reference to E. |
| } |
| |
| int main() { |
| auto x = ns::e1; |
| auto y = ns::e2; |
| swap(x, y); // finds the swap in the associated struct |
| } |
| |
| namespace N0 { |
| enum E { x }; |
| struct S { |
| enum H { y }; |
| enum class K { z }; |
| using E::x; // OK, introduces x into S |
| using E::x; // { dg-error "" } redeclaration in class scope |
| using H::y; // { dg-error "" } redeclaration in class scope |
| using K::z; // OK, introduces z into S |
| }; |
| namespace NS { |
| enum H { y }; |
| enum class K { z }; |
| using E::x; // OK, introduces x into NS |
| using E::x; // OK, just a redeclaration of the same entity |
| using H::y; // OK, redeclaration of the same entity |
| using K::z; // OK, introduces z into NS |
| }; |
| } |
| namespace N1 { |
| struct S { |
| enum E { x }; |
| enum class EC { y }; |
| using EC::y; |
| }; |
| |
| void f() { |
| using S::x; // OK |
| x; // resolves to S::E::x; |
| using S::y; // OK |
| y; // resolves to S::EC::y; |
| } |
| } |
| |
| namespace N2 { |
| enum class E { a, b, c }; |
| using E::a, E::b, E::c; // OK, imports all three |
| auto x = (a,b,c); |
| } |
| |
| namespace N3 { |
| struct B { |
| enum class E { x }; |
| }; |
| enum class H { y }; |
| struct C : B { |
| using enum B::E; // OK, introduces E::x into C |
| using enum H; // OK, introduces y into C. Does not introduce H |
| }; |
| auto i = C::y; // OK |
| C::H h; // { dg-error "" } |
| } |
| |
| namespace N4 { |
| enum class button { up, down }; |
| struct S { |
| using button::up; |
| button b = up; // OK |
| }; |
| } |
| |
| namespace N5 { |
| enum class fruit { orange, apple }; |
| struct S { |
| using enum fruit; // OK, introduces orange and apple into S |
| }; |
| void f() { |
| S s; |
| s.orange; // OK, names fruit::orange |
| S::orange; // OK, names fruit::orange |
| } |
| } |
| |
| namespace N6 { |
| enum class fruit { orange, apple }; |
| enum class color { red, orange }; |
| void f() { |
| using enum fruit; // OK |
| using enum color; // { dg-error "" } color::orange and fruit::orange conflict |
| } |
| } |