// REQUIRED_ARGS: -o- /* TEST_OUTPUT: --- 1: false 2: true 3: true --- */ class A { abstract void foo(); } template MixinAbstractBar() { abstract void bar(); } class B1 : A { // Use pragma instead of static assert, in order to evaluate // __traits during ClassDeclaration.semantic(). pragma(msg, "1: ", __traits(isAbstractClass, typeof(this))); override void foo() {} } class B2 : A { pragma(msg, "2: ", __traits(isAbstractClass, typeof(this))); override void foo() {} abstract void bar(); } class B3 : A { pragma(msg, "3: ", __traits(isAbstractClass, typeof(this))); override void foo() {} mixin MixinAbstractBar!(); } void main() { static assert( __traits(compiles, { auto b = new B1(); })); static assert(!__traits(compiles, { auto b = new B2(); })); static assert(!__traits(compiles, { auto b = new B3(); })); } class B : A { // __traits(isAbstractClass) is not usable in static if condition. static assert (!__traits(isAbstractClass, typeof(this))); override void foo() { } } void main2() { B b = new B(); }