[Sema][ObjC] Don't warn about implicitly-retained self in an unevaluated
authorAkira Hatanaka <ahatanaka@apple.com>
Mon, 22 Aug 2022 19:13:48 +0000 (12:13 -0700)
committerAkira Hatanaka <ahatanaka@apple.com>
Mon, 22 Aug 2022 19:16:37 +0000 (12:16 -0700)
context

clang/lib/Sema/SemaExpr.cpp
clang/test/SemaObjCXX/warn-implicit-self-in-block.mm

index 5991846..eb1690c 100644 (file)
@@ -2946,7 +2946,7 @@ ExprResult Sema::BuildIvarRefExpr(Scope *S, SourceLocation Loc,
         !Diags.isIgnored(diag::warn_arc_repeated_use_of_weak, Loc))
       getCurFunction()->recordUseOfWeak(Result);
   }
-  if (getLangOpts().ObjCAutoRefCount)
+  if (getLangOpts().ObjCAutoRefCount && !isUnevaluatedContext())
     if (const BlockDecl *BD = CurContext->getInnermostBlockDecl())
       ImplicitlyRetainedSelfLocs.push_back({Loc, BD});
 
index 4842b4b..7cc811b 100644 (file)
@@ -39,4 +39,8 @@ void escapeFunc(BlockTy);
     noescapeFunc(^{ [&](){ (void)_bar; }(); });
     escapeFunc(^{ [&](){ (void)_bar; }(); }); // expected-warning {{block implicitly retains 'self'; explicitly mention 'self' to indicate this is intended behavior}}
   }
+
+  - (BlockTy)testDeclType{
+    return ^{ decltype(_bar) i = 12; (void)i; };
+  }
 @end