Idea to verify virtual/final methods

Adam D. Ruppe destructionator at gmail.com
Tue Jun 4 06:46:31 PDT 2013


On Tuesday, 4 June 2013 at 13:15:39 UTC, bearophile wrote:
> An idea:

bearophile, you're a genius. I've been trying to think of a way 
to do this for the last week or so and you've got it.

usage:

struct small(T) if(T.sizeof < 9) {}

@CustomCheck!small
class RTTest {}


object.d additions:

         enum CustomCtCheckResult {
                 fail, pass
         }
         template CustomCheck(alias C) {
                 template CustomCheck(T) {
                         static if(__traits(compiles, C!T))
                                 enum CustomCheck = 
CustomCtCheckResult.pass;
                         else
                                 enum CustomCheck = 
CustomCtCheckResult.fail;
                 }
         }

     bool doCustomChecks(T)() {
         if(__ctfe) {
              foreach(attr; __traits(getAttributes, T)) {
                  static if(is(typeof(attr!T) == 
CustomCtCheckResult)) {
                        static assert(attr!T == 
CustomCtCheckResult.pass);
                  }
              }
              return true;
        }
    }

        template RTInfo(T) {
  /* other rtinfo stuff can remain */
                 enum customChecksPassed = doCustomChecks!T;
         }




If we updated this to go right through the members too, we'd be 
really cooking.


object.d(755): Error: static assert  (cast(CustomCtCheckResult)0 
== cast(CustomCtCheckResult)1) is false
object.d(774):        instantiated from here: 
doCustomChecks!(RTTest)
minimal.d(168):        instantiated from here: RTInfo!(RTTest)


the last line helps find it. For members it will be trickier but 
there the CustomCheck template could take __FILE__ and __LINE__ 
as default arguments and just print them instead of static assert 
0.


More information about the Digitalmars-d mailing list