[ObjC] Fix AST serialization for pseudo-strong parameters

This bit was assumed to be always false for ParmVarDecls, but attribute
objc_externally_retained now can produce it.

Differential revision: https://reviews.llvm.org/D74417
This commit is contained in:
David Goldman 2020-06-05 14:00:13 -04:00 committed by Erik Pilkington
parent 80be54c08f
commit 8b529e311a
2 changed files with 31 additions and 3 deletions

View File

@ -1100,8 +1100,6 @@ void ASTDeclWriter::VisitParmVarDecl(ParmVarDecl *D) {
Record.AddStmt(D->getUninstantiatedDefaultArg());
Code = serialization::DECL_PARM_VAR;
assert(!D->isARCPseudoStrong()); // can be true of ImplicitParamDecl
// If the assumptions about the DECL_PARM_VAR abbrev are true, use it. Here
// we dynamically check for the properties that we optimize for, but don't
// know are true of all PARM_VAR_DECLs.
@ -2121,7 +2119,7 @@ void ASTWriter::WriteDeclAbbrevs() {
Abv->Add(BitCodeAbbrevOp(0)); // SClass
Abv->Add(BitCodeAbbrevOp(0)); // TSCSpec
Abv->Add(BitCodeAbbrevOp(0)); // InitStyle
Abv->Add(BitCodeAbbrevOp(0)); // ARCPseudoStrong
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isARCPseudoStrong
Abv->Add(BitCodeAbbrevOp(0)); // Linkage
Abv->Add(BitCodeAbbrevOp(0)); // HasInit
Abv->Add(BitCodeAbbrevOp(0)); // HasMemberSpecializationInfo

View File

@ -0,0 +1,30 @@
// Test for assertion failure due to objc_externally_retained on a function.
// Without PCH
// RUN: %clang_cc1 -fsyntax-only -verify -fobjc-arc -include %s %s
// With PCH
// RUN: %clang_cc1 %s -emit-pch -fobjc-arc -o %t
// RUN: %clang_cc1 -emit-llvm-only -verify %s -fobjc-arc -include-pch %t -debug-info-kind=limited
// expected-no-diagnostics
#ifndef HEADER
#define HEADER
//===----------------------------------------------------------------------===//
// Header
__attribute__((objc_externally_retained)) void doSomething(id someObject);
id sharedObject = 0;
//===----------------------------------------------------------------------===//
#else
//===----------------------------------------------------------------------===//
void callDoSomething() {
doSomething(sharedObject);
}
//===----------------------------------------------------------------------===//
#endif