On 11 Jul 2025, at 14:17, Riccardo Mottola <riccardo.mott...@libero.it> wrote: > > Hi, > > In Grr there is this code: > > wsAndTagClosing = [NSMutableCharacterSet > characterSetWithCharactersInString: @"/>"]; > > Clang warns me with: > > NSString+TolerantHTML.m:109:21: warning: incompatible pointer types > assigning to 'NSMutableCharacterSet *' from 'NSCharacterSet *' > [-Wincompatible-pointer-types] > 109 | wsAndTagClosing = [NSMutableCharacterSet > characterSetWithCharactersInString: @"/>"]; > > GCC gives a more generic issue about "distinct objective C type". > > Now, characterSetWithCharactersInString: is a class method of > NSCharacterSet: > > https://www.gnustep.org/resources/documentation/Developer/Base/Reference/NSCharacterSet.html#method$NSCharacterSet+characterSetWithCharactersInString$ > > and NSMutableCharacterSet is a subclass of NSCharacterSet > > Shouldn't thus the method called on the subclass still return a valid > subclass and not the superclass? > > Could it be a header issue? we define it as: > + (NSCharacterSet*) characterSetWithCharactersInString: (NSString*)aString; > > maybe it should return instancetype?
Factory methods on the superclass, if called on the subclass, are not required to return an instance of the subclass, they can return a totally unrelated subclass. For example, a bunch of the NSString and NSDictionary factory methods will return a specialised version for small of arguments. If you’re doing this kind of trick, you need an explicit check in the method implementation to see if `self` is the expected class. If that check exists, or if this method isn’t returning a subclass instance, it’s safe to turn it into instancetype and this warning will go away. If not, then this is a real warning and the mutable subclass is not being returned. You can also try `NSLog(@“What even is this? %@“, [wsAndTagClosing class]);` to see. David