blob: a7529510e9b43d654233dec2d845db0eff1fa359 [file] [log] [blame]
/*
PERMUTE_ARGS:
RUN_OUTPUT:
---
Success
---
*/
extern(C) int printf(const char*, ...);
/**********************************************/
enum Bar
{
bar2 = 2,
bar3,
bar4 = 0
}
void test1()
{
Bar b;
assert(b == 2);
}
/**********************************************/
void test2()
{
enum E
{
a=-1
}
assert(E.min == -1);
assert(E.max == -1);
}
/**********************************************/
void test3()
{
enum E
{
a = 1,
b = -1,
c = 3,
d = 2
}
assert(E.min == -1);
assert(E.max == 3);
}
/**********************************************/
void test4()
{
enum E
{
a = -1,
b = -1,
c = -3,
d = -3
}
assert(E.min==-3);
assert(E.max==-1);
}
/**********************************************/
enum Enum5
{
A = 3,
B = 10,
E = -5,
}
void test5()
{
assert(Enum5.init == Enum5.A);
assert(Enum5.init == 3);
Enum5 e;
assert(e == Enum5.A);
assert(e == 3);
}
/***********************************/
enum E6 : byte
{
NORMAL_VALUE = 0,
REFERRING_VALUE = NORMAL_VALUE + 1,
OTHER_NORMAL_VALUE = 2
}
void foo6(E6 e)
{
}
void test6()
{
foo6(E6.NORMAL_VALUE);
foo6(E6.REFERRING_VALUE);
foo6(E6.OTHER_NORMAL_VALUE);
}
/**********************************************/
// https://issues.dlang.org/show_bug.cgi?id=2407
int i2407;
void add2407() { ++i2407; }
void sub2407() { --i2407; }
enum EF2407f : void function()
{
a = &add2407,
s = &sub2407,
}
enum EF2407s
{
a = &add2407,
s = &sub2407,
}
enum
{
a2407 = &add2407,
s2407 = &sub2407,
}
enum : void function()
{
at2407 = &add2407,
st2407 = &sub2407,
}
enum EEF2407 : EF2407s
{
a = EF2407s.a,
s = EF2407s.s,
}
void test2407()
{
alias i2407 i;
EF2407f.a();
assert(i == 1);
EF2407f.s();
assert(i == 0);
EF2407s.a();
assert(i == 1);
EF2407s.s();
assert(i == 0);
a2407();
assert(i == 1);
s2407();
assert(i == 0);
at2407();
assert(i == 1);
st2407();
assert(i == 0);
EEF2407.a();
assert(i == 1);
EEF2407.s();
assert(i == 0);
EEF2407.init();
assert(i == 1);
struct S { int i; }
enum ES : S
{
a = S(1),
b = S(3),
c = S(2),
}
static assert(ES.init == S(1));
static assert(!__traits(compiles, ES.min));
static assert(!__traits(compiles, ES.max));
enum EES : ES
{
a = ES.a,
b = ES.b,
c = ES.c,
}
static assert(EES.init == S(1));
static assert(!__traits(compiles, EES.min));
static assert(!__traits(compiles, EES.max));
ES es = ES.c;
assert(es.i == 2);
es = ES.b;
assert(es.i == 3);
class C { this(int i) { this.i = i; } int i; }
enum EC : C
{
a = new C(42),
b = null,
c = new C(1),
d = new C(33),
}
static assert(EC.init.i == (new C(42)).i);
static assert(!__traits(compiles, EC.min));
static assert(!__traits(compiles, EC.max));
EC ec = EC.d;
assert(ec.i == 33);
ec = EC.b;
assert(ec is null);
}
/**********************************************/
// https://issues.dlang.org/show_bug.cgi?id=3096
void test3096()
{
template Tuple(T...) { alias Tuple = T; }
template Base(E)
{
static if(is(E B == enum))
alias Base = B;
}
template GetEnum(T)
{
enum GetEnum { v = T.init }
}
struct S { }
class C { }
foreach (Type; Tuple!(char, wchar, dchar, byte, ubyte,
short, ushort, int, uint, long,
ulong, float, double, real, S, C))
{
static assert(is(Base!(GetEnum!Type) == Type));
}
}
/**********************************************/
// https://issues.dlang.org/show_bug.cgi?id=7719
enum foo7719 = bar7719;
enum { bar7719 = 1 }
/**********************************************/
// https://issues.dlang.org/show_bug.cgi?id=9845
enum { A9845 = B9845 }
enum { B9845 = 1 }
/**********************************************/
// https://issues.dlang.org/show_bug.cgi?id=9846
const int A9846 = B9846;
enum { B9846 = 1 }
/**********************************************/
// https://issues.dlang.org/show_bug.cgi?id=10105
enum E10105 : char[1] { a = "a" }
/**********************************************/
// https://issues.dlang.org/show_bug.cgi?id=10113
enum E10113 : string
{
a = "a",
b = "b",
abc = "abc"
}
void test10113()
{
E10113 v = E10113.b;
bool check = false;
final switch (v) {
case E10113.a: assert(false);
case E10113.b: check = true; break;
case E10113.abc: assert(false);
}
assert(check);
}
/**********************************************/
// https://issues.dlang.org/show_bug.cgi?id=10503
@property int octal10503(string num)()
{
return num.length;
}
enum
{
A10503 = octal10503!"2000000",
B10503 = octal10503!"4000",
}
/**********************************************/
// https://issues.dlang.org/show_bug.cgi?id=10505
enum
{
a10505 = true,
b10505 = 10.0f,
c10505 = false,
d10505 = 10,
e10505 = null
}
static assert(is(typeof(a10505) == bool));
static assert(is(typeof(b10505) == float));
static assert(is(typeof(c10505) == bool));
static assert(is(typeof(d10505) == int));
static assert(is(typeof(e10505) == typeof(null)));
/**********************************************/
// https://issues.dlang.org/show_bug.cgi?id=10561
void test10561()
{
template Tuple(T...) { alias Tuple = T; }
foreach (Type; Tuple!(char, wchar, dchar, byte, ubyte,
short, ushort, int, uint, long,
ulong, float, double, real))
{
enum : Type { v = 0, w = 0, x, y = x }
static assert(is(typeof(v) == Type));
static assert(is(typeof(w) == Type));
static assert(is(typeof(x) == Type));
static assert(is(typeof(y) == Type));
}
class B { }
class D : B { }
enum : B { a = new D, b = new B, c = null }
static assert(is(typeof(a) == B));
static assert(is(typeof(b) == B));
static assert(is(typeof(c) == B));
struct S { this(int) { } }
enum : S { d = S(1), e = S(2) }
static assert(is(typeof(d) == S));
static assert(is(typeof(e) == S));
enum : float[] { f = [], g = [1.0, 2.0], h = [1.0f] }
static assert(is(typeof(f) == float[]));
static assert(is(typeof(g) == float[]));
static assert(is(typeof(h) == float[]));
}
/**********************************************/
// https://issues.dlang.org/show_bug.cgi?id=10612
int[E10612] ie10612;
E10612[int] ei10612;
E10612[E10612] ee10612;
enum E10612 { a }
/**********************************************/
// https://issues.dlang.org/show_bug.cgi?id=10788
enum v10788 = e10788;
enum : int { e10788 }
/**********************************************/
class C7
{
enum Policy
{
PREFER_READERS,
PREFER_WRITERS
}
void foo1( Policy policy = Policy.PREFER_READERS ) { }
void foo2( Policy policy = Policy.PREFER_WRITERS ) { }
}
/**********************************************/
void test8()
{
enum E
{
A = B,
E = D + 7,
B = 3,
C,
D,
}
assert(E.A == 3);
assert(E.B == 3);
assert(E.C == 4);
assert(E.D == 5);
assert(E.E == 12);
assert(E.max == 12);
}
/**********************************************/
// https://issues.dlang.org/show_bug.cgi?id=13220
enum E13220a;
@(1) enum E13220b;
void test13220()
{
auto prot = __traits(getProtection, E13220a);
assert(prot == "public");
auto udas = __traits(getAttributes, E13220b);
assert(udas[0] == 1);
}
/**********************************************/
int main()
{
test1();
test2();
test3();
test4();
test5();
test6();
test2407();
test10113();
test10561();
test8();
test13220();
printf("Success\n");
return 0;
}