/* REQUIRED_ARGS: -unittest */ module e7804; struct Bar {static struct B{}} alias BarB = __traits(getMember, Bar, "B"); static assert(is(BarB == Bar.B)); static assert(is(const(__traits(getMember, Bar, "B")) == const(Bar.B))); alias BarBParent = __traits(parent, BarB); static assert(is(BarBParent == Bar)); struct Foo {alias MyInt = int;} alias FooInt = __traits(getMember, Foo, "MyInt"); static immutable FooInt fi = 42; static assert(fi == 42); void declVsStatementSupport() { __traits(getMember, Foo, "MyInt") i1 = 1; const(__traits(getMember, Foo, "MyInt")) i2 = 1; assert(i1 == i2); __traits(getMember, Foo, "MyInt") i3 = __traits(getMember, Foo, "MyInt").max; assert(i3 == int.max); } enum __traits(getMember, Foo, "MyInt") a0 = 12; static assert(is(typeof(a0) == int)); static assert(a0 == 12); const __traits(getMember, Foo, "MyInt") a1 = 46; __traits(getMember, Foo, "MyInt") a2 = 78; const(__traits(getMember, Foo, "MyInt")) a3 = 63; struct WithSym {static int foo; static int bar(){return 42;}} alias m1 = __traits(getMember, WithSym, "foo"); alias m2 = WithSym.foo; static assert(__traits(isSame, m1, m2)); alias f1 = __traits(getMember, WithSym, "bar"); alias f2 = WithSym.bar; static assert(__traits(isSame, f1, f2)); auto ovld(const(char)[] s){return s;} auto ovld(int i){return i;} alias ovlds = __traits(getOverloads, e7804, "ovld"); struct TmpPrm(T) if (is(T == int)){T t;} TmpPrm!(__traits(getMember, Foo, "MyInt")) tpt = TmpPrm!(__traits(getMember, Foo, "MyInt"))(42); @Foo @(1) class Class { final void virtual(){} int virtual(int p){return p;} void test(this T)() { alias vf = __traits(getVirtualFunctions, Class, "virtual"); assert(vf.length == 2); alias vm = __traits(getVirtualMethods, Class, "virtual"); assert(vm.length == 1); assert(vm[0](42) == 42); alias attribs = __traits(getAttributes, Class); assert(attribs.length == 2); assert(is(typeof(attribs[0]()) == Foo)); assert(attribs[1] == 1); alias objectAll = __traits(allMembers, Object); alias classDerived = __traits(derivedMembers, Class); alias classAll = __traits(allMembers, Class); enum Seq(T...) = T; static assert (classAll == Seq!(classDerived, objectAll)); } } struct UnitTests { static int count; unittest { count++; } unittest {++++count;} static void test() { alias tests = __traits(getUnitTests, UnitTests); static assert(tests.length == 2); foreach(t; tests) t(); assert(count == 6); // not 3 because executed automatically (DRT) then manually } } class One { void foo(){} void foo(int){} } class Two : One { void test() { alias Seq(T...) = T; alias p1 = Seq!(__traits(getMember, super, "foo"))[0]; alias p2 = __traits(getMember, super, "foo"); static assert(__traits(isSame, p1, p2)); } } class SingleSymTuple { int foo(){return 42;} void test() { alias f = __traits(getMember, this, "foo"); assert(f() == 42); } } struct WithAliasThis { auto getter(){return 42;} alias getter this; void test() { alias getterCall = __traits(getAliasThis, typeof(this)); assert(mixin(getterCall[0]) == 42); } } void main() { declVsStatementSupport(); assert(a1 == 46); assert(a2 == 78); assert(a3 == 63); assert(f1() == f2()); Foo.MyInt fmi = cast(__traits(getMember, Foo, "MyInt")) 0; auto c = __traits(getMember, Foo, "MyInt").max; assert(c == int.max); assert(ovlds[0]("farfelu") == "farfelu"); assert(ovlds[1](42) == 42); (new Class).test(); UnitTests.test(); (new WithAliasThis).test(); (new Two).test(); (new SingleSymTuple).test(); } /* https://issues.dlang.org/show_bug.cgi?id=19708 */ struct Foo19708 {} struct Bar19708 {} template Baz19708(T) { struct Baz19708{T t;} } int symbol19708; @Foo19708 @Bar19708 @Baz19708 @symbol19708 int bar19708; alias TR19708 = __traits(getAttributes, bar19708); alias TRT = __traits(getAttributes, bar19708)[2]; TR19708[0] a119708; TR19708[1] a219708; alias A3 = TRT!int; alias C19708 = TR19708[0]; alias D19708 = TR19708[1]; C19708 c1; D19708 d1; static assert(__traits(isSame, TR19708[3], symbol19708));