[Sema] Fix an assert when objc_externally_retained was applied to an unprototyped...
authorErik Pilkington <erik.pilkington@gmail.com>
Fri, 28 Feb 2020 23:24:23 +0000 (15:24 -0800)
committerErik Pilkington <erik.pilkington@gmail.com>
Fri, 28 Feb 2020 23:49:16 +0000 (15:49 -0800)
rdar://58893199

clang/lib/Sema/SemaDeclAttr.cpp
clang/test/SemaObjC/externally-retained.m

index cf3fa38..3a6c2af 100644 (file)
@@ -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();
 
index 24c531c..f9fbdb0 100644 (file)
@@ -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();