| // PR c++/97573 |
| // { dg-do compile { target c++20 } } |
| // { dg-options "-Wno-deprecated -Wno-enum-compare" } |
| |
| enum E1 { e } e1; |
| enum E2 { f } e2; |
| __extension__ static enum { } u1; |
| __extension__ static enum { } u2; |
| static double d; |
| |
| void |
| conv () |
| { |
| bool b1 = e == e1; |
| bool b2 = e == f; |
| bool b3 = e == 0.0; |
| bool b4 = 0.0 == f; |
| int n1 = true ? e : f; |
| int n2 = true ? e : 0.0; |
| } |
| |
| int |
| enum_enum (bool b) |
| { |
| int r = 0; |
| const E1 e1c = e; |
| |
| r += e - e; |
| r += e - e1; |
| r += e - f; |
| r += f - e; |
| |
| r += f + f; |
| r += f + e; |
| r += e + f; |
| |
| r += e1 - e2; |
| r += e1 - e1c; |
| r += e1c - e1; |
| |
| r += e * f; |
| r += f * e; |
| r += e * e; |
| |
| r += e1 < e1c; |
| r += e < e1; |
| r += e1 < e2; |
| r += e < f; |
| r += f < e; |
| |
| r += e1 == e1c; |
| r += e == e1; |
| r += e == f; |
| r += f == e; |
| r += e1 == e2; |
| r += e2 == e1; |
| |
| r += b ? e1 : e1c; |
| r += b ? e1 : e; |
| r += b ? f : e; |
| r += b ? e1 : e2; |
| |
| r += e | f; |
| r += e ^ f; |
| r += e & f; |
| r += !e; |
| r += e1 | e; |
| |
| r += e << f; |
| r += e >> f; |
| r += e || f; |
| r += e && f; |
| e1 = e1c; |
| |
| // Anonymous enum. |
| r += u1 - u1; |
| r += u1 + u2; |
| r += u1 * u2; |
| r += u1 == u2; |
| r += u1 & u2; |
| |
| return r; |
| } |
| |
| double |
| enum_float (bool b) |
| { |
| double r = 0.0; |
| |
| r += e1 - d; |
| r += d - e1; |
| r += e1 + d; |
| r += d + e1; |
| r += e1 * d; |
| r += d * e1; |
| r += u1 * d; |
| r += d * u1; |
| |
| r += e1 < d; |
| r += d < e1; |
| r += d == e1; |
| r += e1 == d; |
| r += u1 == d; |
| r += d == u1; |
| |
| r += b ? e1 : d; |
| r += b ? d : e1; |
| r += b ? d : u1; |
| r += b ? u1 : d; |
| |
| d += e1; |
| d = e1; |
| |
| return r; |
| } |