arphaman created this revision. arphaman added reviewers: erik.pilkington, MForster. Herald added subscribers: ributzka, jkorous. Herald added a reviewer: aaron.ballman. arphaman requested review of this revision.
The change in a5b8757506b07e3091fe243b6c1e004220d3cba3 <https://reviews.llvm.org/rGa5b8757506b07e3091fe243b6c1e004220d3cba3> locked down the `ns_error_domain` attribute to `NSString` only, however we actually support `CFString` as well. https://reviews.llvm.org/D90891 Files: clang/include/clang/Basic/AttrDocs.td clang/include/clang/Basic/DiagnosticSemaKinds.td clang/lib/Sema/SemaDeclAttr.cpp clang/test/Sema/ns_error_enum.m Index: clang/test/Sema/ns_error_enum.m =================================================================== --- clang/test/Sema/ns_error_enum.m +++ clang/test/Sema/ns_error_enum.m @@ -36,9 +36,24 @@ 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}} Index: clang/lib/Sema/SemaDeclAttr.cpp =================================================================== --- clang/lib/Sema/SemaDeclAttr.cpp +++ clang/lib/Sema/SemaDeclAttr.cpp @@ -5422,7 +5422,8 @@ 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; } Index: clang/include/clang/Basic/DiagnosticSemaKinds.td =================================================================== --- clang/include/clang/Basic/DiagnosticSemaKinds.td +++ clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -9599,7 +9599,7 @@ 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>; Index: clang/include/clang/Basic/AttrDocs.td =================================================================== --- clang/include/clang/Basic/AttrDocs.td +++ clang/include/clang/Basic/AttrDocs.td @@ -3594,9 +3594,10 @@ 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.
Index: clang/test/Sema/ns_error_enum.m =================================================================== --- clang/test/Sema/ns_error_enum.m +++ clang/test/Sema/ns_error_enum.m @@ -36,9 +36,24 @@ 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}} Index: clang/lib/Sema/SemaDeclAttr.cpp =================================================================== --- clang/lib/Sema/SemaDeclAttr.cpp +++ clang/lib/Sema/SemaDeclAttr.cpp @@ -5422,7 +5422,8 @@ 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; } Index: clang/include/clang/Basic/DiagnosticSemaKinds.td =================================================================== --- clang/include/clang/Basic/DiagnosticSemaKinds.td +++ clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -9599,7 +9599,7 @@ 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>; Index: clang/include/clang/Basic/AttrDocs.td =================================================================== --- clang/include/clang/Basic/AttrDocs.td +++ clang/include/clang/Basic/AttrDocs.td @@ -3594,9 +3594,10 @@ 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.
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits