Skip to content

Commit

Permalink
[OBJC] Allow __attribute__((NSObject)) types be used as lightweight g…
Browse files Browse the repository at this point in the history
…eneric 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
  • Loading branch information
dmaclach committed Mar 21, 2024
1 parent 999d4f8 commit 3fefeaf
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 0 deletions.
5 changes: 5 additions & 0 deletions clang/lib/Sema/SemaType.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
23 changes: 23 additions & 0 deletions clang/test/SemaObjC/attr-objc-NSObject.m
Original file line number Diff line number Diff line change
@@ -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'}}
}

0 comments on commit 3fefeaf

Please sign in to comment.