Author: Erik Pilkington Date: 2020-02-28T15:49:16-08:00 New Revision: 2e4f5e629de8ba77ae6facba5c595ef23d95acf4
URL: https://github.com/llvm/llvm-project/commit/2e4f5e629de8ba77ae6facba5c595ef23d95acf4 DIFF: https://github.com/llvm/llvm-project/commit/2e4f5e629de8ba77ae6facba5c595ef23d95acf4.diff LOG: [Sema] Fix an assert when objc_externally_retained was applied to an unprototyped function rdar://58893199 Added: Modified: clang/lib/Sema/SemaDeclAttr.cpp clang/test/SemaObjC/externally-retained.m Removed: ################################################################################ diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp index cf3fa3855cc8..3a6c2af30d8b 100644 --- a/clang/lib/Sema/SemaDeclAttr.cpp +++ b/clang/lib/Sema/SemaDeclAttr.cpp @@ -6561,7 +6561,9 @@ static void handleObjCExternallyRetainedAttr(Sema &S, Decl *D, // If D is a function-like declaration (method, block, or function), then we // make every parameter psuedo-strong. - for (unsigned I = 0, E = getFunctionOrMethodNumParams(D); I != E; ++I) { + unsigned NumParams = + hasFunctionProto(D) ? getFunctionOrMethodNumParams(D) : 0; + for (unsigned I = 0; I != NumParams; ++I) { auto *PVD = const_cast<ParmVarDecl *>(getFunctionOrMethodParam(D, I)); QualType Ty = PVD->getType(); diff --git a/clang/test/SemaObjC/externally-retained.m b/clang/test/SemaObjC/externally-retained.m index 24c531ccf739..f9fbdb068944 100644 --- a/clang/test/SemaObjC/externally-retained.m +++ b/clang/test/SemaObjC/externally-retained.m @@ -118,3 +118,6 @@ void test13(ObjCTy *first, __weak ObjCTy *second, __unsafe_unretained ObjCTy *th } #pragma clang attribute ext_ret.pop + +__attribute__((objc_externally_retained)) +void unprototyped(); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits