Skip to content

Commit

Permalink
[clang] ns_error_domain attribute also supports CFString typed variables
Browse files Browse the repository at this point in the history
Differential Revision: https://reviews.llvm.org/D90891
  • Loading branch information
hyp committed Nov 11, 2020
1 parent e3b64eb commit 3df3b62
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 6 deletions.
7 changes: 4 additions & 3 deletions clang/include/clang/Basic/AttrDocs.td
Expand Up @@ -3594,9 +3594,10 @@ def NSErrorDomainDocs : Documentation {
In Cocoa frameworks in Objective-C, one can group related error codes in enums
and categorize these enums with error domains.

The ``ns_error_domain`` attribute indicates a global ``NSString`` constant
representing the error domain that an error code belongs to. For pointer
uniqueness and code size this is a constant symbol, not a literal.
The ``ns_error_domain`` attribute indicates a global ``NSString`` or
``CFString`` constant representing the error domain that an error code belongs
to. For pointer uniqueness and code size this is a constant symbol, not a
literal.

The domain and error code need to be used together. The ``ns_error_domain``
attribute links error codes to their domain at the source level.
Expand Down
2 changes: 1 addition & 1 deletion clang/include/clang/Basic/DiagnosticSemaKinds.td
Expand Up @@ -9597,7 +9597,7 @@ def err_nsreturns_retained_attribute_mismatch : Error<
def err_nserrordomain_invalid_decl : Error<
"domain argument %select{|%1 }0does not refer to global constant">;
def err_nserrordomain_wrong_type : Error<
"domain argument %0 does not point to an NSString constant">;
"domain argument %0 does not point to an NSString or CFString constant">;

def warn_nsconsumed_attribute_mismatch : Warning<
err_nsconsumed_attribute_mismatch.Text>, InGroup<NSConsumedMismatch>;
Expand Down
3 changes: 2 additions & 1 deletion clang/lib/Sema/SemaDeclAttr.cpp
Expand Up @@ -5436,7 +5436,8 @@ static void handleNSErrorDomain(Sema &S, Decl *D, const ParsedAttr &AL) {
return;
}

if (!isNSStringType(VD->getType(), S.Context)) {
if (!isNSStringType(VD->getType(), S.Context) &&
!isCFStringType(VD->getType(), S.Context)) {
S.Diag(Loc, diag::err_nserrordomain_wrong_type) << VD;
return;
}
Expand Down
17 changes: 16 additions & 1 deletion clang/test/Sema/ns_error_enum.m
Expand Up @@ -36,9 +36,24 @@ typedef NS_ERROR_ENUM(unsigned char, MyTypedefErrorEnum, MyTypedefErrorDomain) {
MyTypedefErrSecond,
};

typedef const struct __CFString * CFStringRef;

extern CFStringRef const MyCFErrorDomain;
typedef NS_ERROR_ENUM(unsigned char, MyCFErrorEnum, MyCFErrorDomain) {
MyCFErrFirst,
MyCFErrSecond,
};

typedef CFStringRef CFErrorDomain;
extern CFErrorDomain const MyCFTypedefErrorDomain;
typedef NS_ERROR_ENUM(unsigned char, MyCFTypedefErrorEnum, MyCFTypedefErrorDomain) {
MyCFTypedefErrFirst,
MyCFTypedefErrSecond,
};

extern char *const WrongErrorDomainType;
enum __attribute__((ns_error_domain(WrongErrorDomainType))) MyWrongErrorDomainType { MyWrongErrorDomain };
// expected-error@-1{{domain argument 'WrongErrorDomainType' does not point to an NSString constant}}
// expected-error@-1{{domain argument 'WrongErrorDomainType' does not point to an NSString or CFString constant}}

struct __attribute__((ns_error_domain(MyErrorDomain))) MyStructWithErrorDomain {};
// expected-error@-1{{'ns_error_domain' attribute only applies to enums}}
Expand Down

0 comments on commit 3df3b62

Please sign in to comment.