[cfe-dev] Introducing attribute objc_pure_virtual_method

Ted Kremenek kremenek at apple.com
Tue Oct 29 16:32:09 PDT 2013


On Oct 29, 2013, at 3:16 PM, variadictemplate . <variadic.template at googlemail.com> wrote:

> currently there is no possibility in objective-c to mark a method as "pure virtual" like in C++. I think the "pure-virtual"-construct enables an elegant and clean way to describe and specify APIs, although if it may be a rarely used construct.
> A workaround for objective-c is to declare the method within the base-class and add to it's implementation an assertion like assert(false && "has to be implemented by subclasses"). But i think it would be nicer when the compiler gives me a hint that there is something wrong, instead of crashing the app at runtime.
> 
> So, with my attached patch I'm introducing an attribute for that case, named objc_pure_virtual_method. It can only be attached to methods of a class-declaration (the other way round: extensions, categories and protocols are excluded). If a subclass does not implement the method, it will cause a warning. If the subclass redeclares the method within it's @interface-declaration and also adds the objc_pure_virtual_method, no warning will be generated. If the call of an init-method to an instance of a class with pure virtual methods is detected, an error is generated.
> 
> I'm not sure if the init-call to a subclass of an abstract class, that did not implement all pure virtual methods, should also produce an error, as this case already produces warnings of unimplemented methods - in my eyes, this is sufficient.
> 
> Surely there are some issues with my current implementation, as i'm not so sure if i have chosen the right places to add the logic and about the names / warnings i have chosen and I'm happy to hear any suggestion / criticism.


Hi there,

I think this an interesting direction to explore.  I have a few concerns about the model, as it doesn’t feel quite there yet.

(1) If a method is marked virtual in a class, should there be a warning to implement that method in the same class?

(2) In a subclass, if a method is redeclared as being “non-virtual”, should we also guarantee that it is implemented in the @implementation?  That may be tricky of course with categories.

It also seems like we should exclude this attribute to being applied to certain method families, such as “init”, as there are other idioms at play there.

Minor nit:

  “classdeclaration”

For clarity (and to fix the typo), just say “class’s @interface"

Once we resolve some of these questions, I’d also like to discuss this with a few others off list (particularly framework authors), as this is essentially a language change.

Cheers,
Ted
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20131029/02a8ce05/attachment.html>


More information about the cfe-dev mailing list