[OBJC] Allow __attribute__((NSObject)) types be used as lightweight generic specifiers (#84593)
As per https://clang.llvm.org/docs/AutomaticReferenceCounting.html#retainable-object-pointers, types with `__attribute__((NSObject))` are retainable, and thus should be eligible to be used as lightweight generic specifiers. Fix for #84592 84592
This commit is contained in:
parent
999d4f8407
commit
3fefeafa49
@ -1018,6 +1018,11 @@ static QualType applyObjCTypeArgs(Sema &S, SourceLocation loc, QualType type,
|
||||
return type;
|
||||
}
|
||||
|
||||
// Types that have __attribute__((NSObject)) are permitted.
|
||||
if (typeArg->isObjCNSObjectType()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Dependent types will be checked at instantiation time.
|
||||
if (typeArg->isDependentType()) {
|
||||
continue;
|
||||
|
23
clang/test/SemaObjC/attr-objc-NSObject.m
Normal file
23
clang/test/SemaObjC/attr-objc-NSObject.m
Normal file
@ -0,0 +1,23 @@
|
||||
// RUN: %clang_cc1 -verify -Wno-objc-root-class -fsyntax-only %s
|
||||
|
||||
@interface NSArray<__covariant ObjectType>
|
||||
- (void)containsObject:(ObjectType)anObject; // expected-note {{passing argument to parameter 'anObject' here}}
|
||||
- (void)description;
|
||||
@end
|
||||
|
||||
typedef __attribute__((NSObject)) struct Foo *FooRef;
|
||||
typedef struct Bar *BarRef;
|
||||
|
||||
void good() {
|
||||
FooRef object;
|
||||
NSArray<FooRef> *array;
|
||||
[array containsObject:object];
|
||||
[object description];
|
||||
}
|
||||
|
||||
void bad() {
|
||||
BarRef object;
|
||||
NSArray<BarRef> *array; // expected-error {{type argument 'BarRef' (aka 'struct Bar *') is neither an Objective-C object nor a block type}}
|
||||
[array containsObject:object]; // expected-warning {{incompatible pointer types sending 'BarRef' (aka 'struct Bar *') to parameter of type 'id'}}
|
||||
[object description]; // expected-warning {{receiver type 'BarRef' (aka 'struct Bar *') is not 'id' or interface pointer, consider casting it to 'id'}}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user