@@ -3555,29 +3555,35 @@ enum hasMember(T, string name) = __traits(hasMember, T, name);
35553555}
35563556
35573557/**
3558- * Whether the symbol represented by the string, member, is a static member of T.
3558+ * Whether the symbol represented by the string, member, exists and is a static member of T.
35593559 *
35603560 * Params:
35613561 * T = Type containing symbol $(D member).
35623562 * member = Name of symbol to test that resides in $(D T).
35633563 *
35643564 * Returns:
3565- * $(D true) iff $(D member) is static.
3565+ * $(D true) iff $(D member) exists and is static.
35663566 */
3567- template isStaticMember (T, string member)
3568- if (__traits(hasMember, T, member))
3567+ template hasStaticMember (T, string member)
35693568{
3570- import std.meta : Alias;
3571- alias sym = Alias! (__traits(getMember, T, member));
3569+ static if (__traits(hasMember, T, member))
3570+ {
3571+ import std.meta : Alias;
3572+ alias sym = Alias! (__traits(getMember, T, member));
35723573
3573- static if (__traits(getOverloads, T, member).length == 0 )
3574- enum bool isStaticMember = __traits(compiles, &sym);
3574+ static if (__traits(getOverloads, T, member).length == 0 )
3575+ enum bool hasStaticMember = __traits(compiles, &sym);
3576+ else
3577+ enum bool hasStaticMember = __traits(isStaticFunction, sym);
3578+ }
35753579 else
3576- enum bool isStaticMember = __traits(isStaticFunction, sym);
3580+ {
3581+ enum bool hasStaticMember = false ;
3582+ }
35773583}
35783584
35793585// /
3580- unittest
3586+ @safe unittest
35813587{
35823588 static struct S
35833589 {
@@ -3588,16 +3594,16 @@ unittest
35883594 int i;
35893595 }
35903596
3591- static assert ( isStaticMember ! (S, " sf" ));
3592- static assert (! isStaticMember ! (S, " f" ));
3597+ static assert ( hasStaticMember ! (S, " sf" ));
3598+ static assert (! hasStaticMember ! (S, " f" ));
35933599
3594- static assert ( isStaticMember ! (S, " si" ));
3595- static assert (! isStaticMember ! (S, " i" ));
3600+ static assert ( hasStaticMember ! (S, " si" ));
3601+ static assert (! hasStaticMember ! (S, " i" ));
35963602
3597- static assert (! __traits(compiles, isStaticMember ! (S, " hello" ) ));
3603+ static assert (! hasStaticMember ! (S, " hello" ));
35983604}
35993605
3600- unittest
3606+ @safe unittest
36013607{
36023608 static struct S
36033609 {
@@ -3615,10 +3621,10 @@ unittest
36153621 Y y;
36163622 static Y sy;
36173623
3618- static void f () {}
3619- static void f2 () pure nothrow @nogc @safe {}
3624+ static void f ();
3625+ static void f2 () pure nothrow @nogc @safe ;
36203626
3621- shared void g () {}
3627+ shared void g ();
36223628
36233629 static void function () fp;
36243630 __gshared void function () gfp;
@@ -3627,14 +3633,14 @@ unittest
36273633 void delegate () dm;
36283634 static void delegate () sd;
36293635
3630- void m () {}
3631- final void m2 () const pure nothrow @nogc @safe {}
3636+ void m ();
3637+ final void m2 () const pure nothrow @nogc @safe ;
36323638
3633- inout (int ) iom () inout { return 10 ; }
3634- static inout (int ) iosf (inout int x) { return x; }
3639+ inout (int ) iom () inout ;
3640+ static inout (int ) iosf (inout int x);
36353641
3636- @property int p() { return 10 ; }
3637- static @property int sp() { return 10 ; }
3642+ @property int p();
3643+ static @property int sp();
36383644 }
36393645
36403646 static class C
@@ -3653,10 +3659,10 @@ unittest
36533659 Y y;
36543660 static Y sy;
36553661
3656- static void f () {}
3657- static void f2 () pure nothrow @nogc @safe {}
3662+ static void f ();
3663+ static void f2 () pure nothrow @nogc @safe ;
36583664
3659- shared void g () {}
3665+ shared void g () { }
36603666
36613667 static void function () fp;
36623668 __gshared void function () gfp;
@@ -3666,62 +3672,62 @@ unittest
36663672 static void delegate () sd;
36673673
36683674 void m () {}
3669- final void m2 () const pure nothrow @nogc @safe {}
3675+ final void m2 () const pure nothrow @nogc @safe ;
36703676
36713677 inout (int ) iom () inout { return 10 ; }
3672- static inout (int ) iosf (inout int x) { return x; }
3678+ static inout (int ) iosf (inout int x);
36733679
36743680 @property int p() { return 10 ; }
3675- static @property int sp() { return 10 ; }
3676- }
3677-
3678- static assert (! isStaticMember ! (S, " X" ));
3679- static assert (! isStaticMember ! (S, " Y" ));
3680- static assert (! __traits(compiles, isStaticMember ! (S, " Y.i" ) ));
3681- static assert (! isStaticMember ! (S, " S" ));
3682- static assert (! isStaticMember ! (S, " C" ));
3683- static assert ( isStaticMember ! (S, " sx" ));
3684- static assert ( isStaticMember ! (S, " gx" ));
3685- static assert (! isStaticMember ! (S, " y" ));
3686- static assert ( isStaticMember ! (S, " sy" ));
3687- static assert ( isStaticMember ! (S, " f" ));
3688- static assert ( isStaticMember ! (S, " f2" ));
3689- static assert (! isStaticMember ! (S, " dm" ));
3690- static assert ( isStaticMember ! (S, " sd" ));
3691- static assert (! isStaticMember ! (S, " g" ));
3692- static assert ( isStaticMember ! (S, " fp" ));
3693- static assert ( isStaticMember ! (S, " gfp" ));
3694- static assert (! isStaticMember ! (S, " fpm" ));
3695- static assert (! isStaticMember ! (S, " m" ));
3696- static assert (! isStaticMember ! (S, " m2" ));
3697- static assert (! isStaticMember ! (S, " iom" ));
3698- static assert ( isStaticMember ! (S, " iosf" ));
3699- static assert (! isStaticMember ! (S, " p" ));
3700- static assert ( isStaticMember ! (S, " sp" ));
3701-
3702- static assert (! isStaticMember ! (C, " X" ));
3703- static assert (! isStaticMember ! (C, " Y" ));
3704- static assert (! __traits(compiles, isStaticMember ! (C, " Y.i" ) ));
3705- static assert (! isStaticMember ! (C, " S" ));
3706- static assert (! isStaticMember ! (C, " C" ));
3707- static assert ( isStaticMember ! (C, " sx" ));
3708- static assert ( isStaticMember ! (C, " gx" ));
3709- static assert (! isStaticMember ! (C, " y" ));
3710- static assert ( isStaticMember ! (C, " sy" ));
3711- static assert ( isStaticMember ! (C, " f" ));
3712- static assert ( isStaticMember ! (C, " f2" ));
3713- static assert (! isStaticMember ! (S, " dm" ));
3714- static assert ( isStaticMember ! (S, " sd" ));
3715- static assert (! isStaticMember ! (C, " g" ));
3716- static assert ( isStaticMember ! (C, " fp" ));
3717- static assert ( isStaticMember ! (C, " gfp" ));
3718- static assert (! isStaticMember ! (C, " fpm" ));
3719- static assert (! isStaticMember ! (C, " m" ));
3720- static assert (! isStaticMember ! (C, " m2" ));
3721- static assert (! isStaticMember ! (C, " iom" ));
3722- static assert ( isStaticMember ! (C, " iosf" ));
3723- static assert (! isStaticMember ! (C, " p" ));
3724- static assert ( isStaticMember ! (C, " sp" ));
3681+ static @property int sp();
3682+ }
3683+
3684+ static assert (! hasStaticMember ! (S, " X" ));
3685+ static assert (! hasStaticMember ! (S, " Y" ));
3686+ static assert (! hasStaticMember ! (S, " Y.i" ));
3687+ static assert (! hasStaticMember ! (S, " S" ));
3688+ static assert (! hasStaticMember ! (S, " C" ));
3689+ static assert ( hasStaticMember ! (S, " sx" ));
3690+ static assert ( hasStaticMember ! (S, " gx" ));
3691+ static assert (! hasStaticMember ! (S, " y" ));
3692+ static assert ( hasStaticMember ! (S, " sy" ));
3693+ static assert ( hasStaticMember ! (S, " f" ));
3694+ static assert ( hasStaticMember ! (S, " f2" ));
3695+ static assert (! hasStaticMember ! (S, " dm" ));
3696+ static assert ( hasStaticMember ! (S, " sd" ));
3697+ static assert (! hasStaticMember ! (S, " g" ));
3698+ static assert ( hasStaticMember ! (S, " fp" ));
3699+ static assert ( hasStaticMember ! (S, " gfp" ));
3700+ static assert (! hasStaticMember ! (S, " fpm" ));
3701+ static assert (! hasStaticMember ! (S, " m" ));
3702+ static assert (! hasStaticMember ! (S, " m2" ));
3703+ static assert (! hasStaticMember ! (S, " iom" ));
3704+ static assert ( hasStaticMember ! (S, " iosf" ));
3705+ static assert (! hasStaticMember ! (S, " p" ));
3706+ static assert ( hasStaticMember ! (S, " sp" ));
3707+
3708+ static assert (! hasStaticMember ! (C, " X" ));
3709+ static assert (! hasStaticMember ! (C, " Y" ));
3710+ static assert (! hasStaticMember ! (C, " Y.i" ));
3711+ static assert (! hasStaticMember ! (C, " S" ));
3712+ static assert (! hasStaticMember ! (C, " C" ));
3713+ static assert ( hasStaticMember ! (C, " sx" ));
3714+ static assert ( hasStaticMember ! (C, " gx" ));
3715+ static assert (! hasStaticMember ! (C, " y" ));
3716+ static assert ( hasStaticMember ! (C, " sy" ));
3717+ static assert ( hasStaticMember ! (C, " f" ));
3718+ static assert ( hasStaticMember ! (C, " f2" ));
3719+ static assert (! hasStaticMember ! (S, " dm" ));
3720+ static assert ( hasStaticMember ! (S, " sd" ));
3721+ static assert (! hasStaticMember ! (C, " g" ));
3722+ static assert ( hasStaticMember ! (C, " fp" ));
3723+ static assert ( hasStaticMember ! (C, " gfp" ));
3724+ static assert (! hasStaticMember ! (C, " fpm" ));
3725+ static assert (! hasStaticMember ! (C, " m" ));
3726+ static assert (! hasStaticMember ! (C, " m2" ));
3727+ static assert (! hasStaticMember ! (C, " iom" ));
3728+ static assert ( hasStaticMember ! (C, " iosf" ));
3729+ static assert (! hasStaticMember ! (C, " p" ));
3730+ static assert ( hasStaticMember ! (C, " sp" ));
37253731}
37263732
37273733/**
0 commit comments