[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:
dmaclach 2024-03-21 11:22:35 -07:00 committed by GitHub
parent 999d4f8407
commit 3fefeafa49
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 28 additions and 0 deletions

View File

@ -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;

View 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'}}
}