From bc1d56eafabef8f4de288c7ecb534f43d0513a9a Mon Sep 17 00:00:00 2001 From: Akira Hatanaka Date: Tue, 24 Oct 2017 23:38:14 +0000 Subject: [PATCH] [Sema][ObjC] Look for either objc_bridge or objc_bridge_mutable when determining whether a RecordDecl is CFError. CFErrorRef used to be declared with "objc_bridge(NSError)" but is now declared with "objc_bridge_mutable(NSError)". Look for either when checking whether a RecordDecl is CFError. rdar://problem/35034779 llvm-svn: 316531 --- clang/lib/Sema/SemaType.cpp | 19 +++++++++++++------ .../Inputs/nullability-completeness-cferror.h | 13 +++++++++++++ .../SemaObjCXX/nullability-completeness-cferror.mm | 5 +++++ 3 files changed, 31 insertions(+), 6 deletions(-) create mode 100644 clang/test/SemaObjCXX/Inputs/nullability-completeness-cferror.h create mode 100644 clang/test/SemaObjCXX/nullability-completeness-cferror.mm diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp index 80b6c1d..ec0d93c 100644 --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -3482,13 +3482,20 @@ classifyPointerDeclarator(Sema &S, QualType type, Declarator &declarator, isCFError = (S.CFError == recordDecl); } else { // Check whether this is CFError, which we identify based on its bridge - // to NSError. + // to NSError. CFErrorRef used to be declared with "objc_bridge" but is + // now declared with "objc_bridge_mutable", so look for either one of + // the two attributes. if (recordDecl->getTagKind() == TTK_Struct && numNormalPointers > 0) { - if (auto bridgeAttr = recordDecl->getAttr()) { - if (bridgeAttr->getBridgedType() == S.getNSErrorIdent()) { - S.CFError = recordDecl; - isCFError = true; - } + IdentifierInfo *bridgedType = nullptr; + if (auto bridgeAttr = recordDecl->getAttr()) + bridgedType = bridgeAttr->getBridgedType(); + else if (auto bridgeAttr = + recordDecl->getAttr()) + bridgedType = bridgeAttr->getBridgedType(); + + if (bridgedType == S.getNSErrorIdent()) { + S.CFError = recordDecl; + isCFError = true; } } } diff --git a/clang/test/SemaObjCXX/Inputs/nullability-completeness-cferror.h b/clang/test/SemaObjCXX/Inputs/nullability-completeness-cferror.h new file mode 100644 index 0000000..4988a74 --- /dev/null +++ b/clang/test/SemaObjCXX/Inputs/nullability-completeness-cferror.h @@ -0,0 +1,13 @@ +@class NSError; + +#pragma clang assume_nonnull begin + +#ifdef USE_MUTABLE +typedef struct __attribute__((objc_bridge_mutable(NSError))) __CFError * CFErrorRef; +#else +typedef struct __attribute__((objc_bridge(NSError))) __CFError * CFErrorRef; +#endif + +void func1(CFErrorRef *error); + +#pragma clang assume_nonnull end diff --git a/clang/test/SemaObjCXX/nullability-completeness-cferror.mm b/clang/test/SemaObjCXX/nullability-completeness-cferror.mm new file mode 100644 index 0000000..4cea9fb --- /dev/null +++ b/clang/test/SemaObjCXX/nullability-completeness-cferror.mm @@ -0,0 +1,5 @@ +// RUN: %clang_cc1 -fsyntax-only -I %S/Inputs -x objective-c -Wnullability-completeness -Werror -verify %s +// RUN: %clang_cc1 -fsyntax-only -I %S/Inputs -x objective-c -Wnullability-completeness -Werror -verify -DUSE_MUTABLE %s +// expected-no-diagnostics + +#include "nullability-completeness-cferror.h" -- 2.7.4