From: Akira Hatanaka Date: Wed, 23 Jan 2019 00:55:48 +0000 (+0000) Subject: [Sema][ObjC] Check whether a DelayedDiagnosticPool has been pushed X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4566ed0d7c076ad061168f7c6cb5fa3a793614a8;p=clang [Sema][ObjC] Check whether a DelayedDiagnosticPool has been pushed before adding a delayed diagnostic to DelayedDiagnostics. This fixes an assertion failure in Sema::DelayedDiagnostics::add that was caused by the changes made in r141037. rdar://problem/42782323 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@351911 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index ccd9a5de66..c4a5b9cc5c 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -12545,9 +12545,13 @@ ParmVarDecl *Sema::CheckParameter(DeclContext *DC, SourceLocation StartLoc, // - otherwise, it's an error if (T->isArrayType()) { if (!T.isConstQualified()) { - DelayedDiagnostics.add( - sema::DelayedDiagnostic::makeForbiddenType( - NameLoc, diag::err_arc_array_param_no_ownership, T, false)); + if (DelayedDiagnostics.shouldDelayDiagnostics()) + DelayedDiagnostics.add( + sema::DelayedDiagnostic::makeForbiddenType( + NameLoc, diag::err_arc_array_param_no_ownership, T, false)); + else + Diag(NameLoc, diag::err_arc_array_param_no_ownership) + << TSInfo->getTypeLoc().getSourceRange(); } lifetime = Qualifiers::OCL_ExplicitNone; } else { diff --git a/test/SemaObjCXX/arc-0x.mm b/test/SemaObjCXX/arc-0x.mm index 391fc47f34..d0f3284a18 100644 --- a/test/SemaObjCXX/arc-0x.mm +++ b/test/SemaObjCXX/arc-0x.mm @@ -101,3 +101,13 @@ namespace rdar12078752 { __autoreleasing auto o3 = o; } } + +namespace test_err_arc_array_param_no_ownership { + template + void func(T a) {} + + void test() { + func([](A *a[]){}); // expected-error{{must explicitly describe intended ownership of an object array parameter}} + func(^(A *a[]){}); // expected-error{{must explicitly describe intended ownership of an object array parameter}} + } +}