summaryrefslogtreecommitdiffstats
path: root/clang/test/SemaObjC/parameterized_classes_subst.m
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2015-07-07 03:58:28 +0000
committerDouglas Gregor <dgregor@apple.com>2015-07-07 03:58:28 +0000
commit10dc9d80cbb47675be0c6ea8481e12ec197e1637 (patch)
treedf1105b48af8c9755bf006c9c45ddcab262cbf6c /clang/test/SemaObjC/parameterized_classes_subst.m
parent5054cb04673f883cf7f2f2432fc3d0000b69f6fe (diff)
downloadbcm5719-llvm-10dc9d80cbb47675be0c6ea8481e12ec197e1637.tar.gz
bcm5719-llvm-10dc9d80cbb47675be0c6ea8481e12ec197e1637.zip
Warn when an intended Objective-C specialization was actually a useless protocol qualification.
Warn in cases where one has provided redundant protocol qualification that might be a typo for a specialization, e.g., NSArray<NSObject>, which is pointless (NSArray declares that it conforms to NSObject) and is likely to be a typo for NSArray<NSObject *>, i.e., an array of NSObject pointers. This warning is very narrow, only applying when the base type being qualified is parameterized, has the same number of parameters as their are protocols listed, all of the names can also refer to types (including Objective-C class types, of course), and at least one of those types is an Objective-C class (making this a typo for a missing '*'). The limitations are partly for performance reasons (we don't want to do redundant name lookup unless we really need to), and because we want the warning to apply in very limited cases to limit false positives. Part of rdar://problem/6294649. llvm-svn: 241547
Diffstat (limited to 'clang/test/SemaObjC/parameterized_classes_subst.m')
-rw-r--r--clang/test/SemaObjC/parameterized_classes_subst.m10
1 files changed, 9 insertions, 1 deletions
diff --git a/clang/test/SemaObjC/parameterized_classes_subst.m b/clang/test/SemaObjC/parameterized_classes_subst.m
index 979053bfa78..6804bdc7955 100644
--- a/clang/test/SemaObjC/parameterized_classes_subst.m
+++ b/clang/test/SemaObjC/parameterized_classes_subst.m
@@ -3,8 +3,11 @@
// Test the substitution of type arguments for type parameters when
// using parameterized classes in Objective-C.
+@protocol NSObject
+@end
+
__attribute__((objc_root_class))
-@interface NSObject
+@interface NSObject <NSObject>
+ (instancetype)alloc;
- (instancetype)init;
@end
@@ -376,3 +379,8 @@ void test_ternary_operator(NSArray<NSString *> *stringArray,
ip = [super array]; // expected-warning{{from 'NSArray<NSString *> *'}}
}
@end
+
+// --------------------------------------------------------------------------
+// warning about likely protocol/class name typos.
+// --------------------------------------------------------------------------
+typedef NSArray<NSObject> ArrayOfNSObjectWarning; // expected-warning{{parameterized class 'NSArray' already conforms to the protocols listed; did you forget a '*'?}}
OpenPOWER on IntegriCloud