aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErik Pilkington <erik.pilkington@gmail.com>2020-02-28 15:24:23 -0800
committerErik Pilkington <erik.pilkington@gmail.com>2020-02-28 15:49:16 -0800
commit2e4f5e629de8ba77ae6facba5c595ef23d95acf4 (patch)
tree69178060f34e35c94f894add99f084895504c013
parentf668baa4592646aa12937bd986305cd4dad2ad37 (diff)
downloadllvm-2e4f5e629de8ba77ae6facba5c595ef23d95acf4.zip
llvm-2e4f5e629de8ba77ae6facba5c595ef23d95acf4.tar.gz
llvm-2e4f5e629de8ba77ae6facba5c595ef23d95acf4.tar.bz2
[Sema] Fix an assert when objc_externally_retained was applied to an unprototyped function
rdar://58893199
-rw-r--r--clang/lib/Sema/SemaDeclAttr.cpp4
-rw-r--r--clang/test/SemaObjC/externally-retained.m3
2 files changed, 6 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp
index cf3fa38..3a6c2af 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 24c531c..f9fbdb0 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();