[LLVMbugs] [Bug 10133] New: Objective-C should adopt `auto` keyword from C++0x
bugzilla-daemon at llvm.org
bugzilla-daemon at llvm.org
Mon Jun 13 14:33:41 PDT 2011
http://llvm.org/bugs/show_bug.cgi?id=10133
Summary: Objective-C should adopt `auto` keyword from C++0x
Product: clang
Version: unspecified
Platform: Macintosh
OS/Version: All
Status: NEW
Severity: normal
Priority: P
Component: Frontend
AssignedTo: unassignedclangbugs at nondot.org
ReportedBy: kyle at omnigroup.com
CC: llvmbugs at cs.uiuc.edu
C++0x overloads the auto keyword to support type inference in declarations.
This makes declarations much shorter and more readable without sacrificing
static type safety. Objective-C should adopt this feature, with the additional
enhancement of using `auto` in the return type of a declaration to refer to the
type of the receiver (or an instance of the receiver in class methods). For
example:
@interface MyObject : NSObject
+ (auto)sharedInstance; // every subclass has its own shared instance
+ (NSString *)defaultName;
- (auto)initWithName:(NSString *)name;
@property(readonly, nonatomic) NSString *name;
@end
@implementation MyObject
+ (auto)sharedInstance;
{
static NSDictionary classToInstanceMap;
if (!classToInstanceMap)
classToInstanceMap = [[NSDictionary alloc] init];
NSString *className = NSStringFromClass(self);
MyObject *instance = [classToInstanceMap valueForKey:className];
if (!instance) {
instance = [[[self alloc] initWithName:[self defaultName]] autorelease];
[classToInstanceMap setValue:instance forKey:className];
}
return instance;
}
+ (NSString *)defaultName;
{
return @"defaultInstance";
}
- (auto)initWithName:(NSString *)name;
{
return [[self class] initWithName:name];
}
@end
// ---
@interface SpecialObject : MyObject
@property(readonly, nonatomic) NSUInteger numberOfFoos;
@end
// ---
void DoSomething()
{
auto anObject = [SpecialObject sharedInstance];
NSLog(@"%lu", anObject.numberOfFoos); // okay; type inference says that
+[SpecialController sharedController] returns an instance of SharedController
auto nFoos = anObject.numberOfFoos;
NSLog(@"%@", nFoos.intValue); // error: invalid type `unsigned long` of
receiver
anObject = [[MyObject alloc] init]; // error: anObject was already
determined to be of type MyObject at declaration
auto anotherObject; // error: can't infer type without initializer
}
// ----****----
It's worth noting the compiler still needs the hardcoded knowledge that
-[NSObject class] returns an instance of the _metaclass_ of the receiver.
Alternatively, a new keyword like `auto Class` could be used here that is only
valid in the return type of a method declaration.
These keywords should all be implemented in terms of implied properties. That
is to say, these two declarations should be equivalent:
- (auto)initWithFoo:(id)foo;
- (id)initWithFoo:(id)foo __attribute__((__auto_return__));
As should these:
- (auto Class)class;
- (Class)class __attribute__((__auto_class_return__));
The programmer should be instructed to keep using explicit type declarations
where it makes sense--that is, where the intended API guarantee is only that
instances of a certain type are returned, even if a subclass overrides the
method. For example, +[NSDocumentController sharedDocumentController] should
*not* be declared with `auto`, because calling +sharedDocumentController on any
subclass should always return the same value, even if that instance is not of
the type of an instance of the receiver.
--
Configure bugmail: http://llvm.org/bugs/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.
More information about the llvm-bugs
mailing list