Author: george.karpenkov
Date: Mon May 14 13:29:16 2018
New Revision: 332288

URL: http://llvm.org/viewvc/llvm-project?rev=332288&view=rev
Log:
Remove the fixit for the diagnostics regarding capturing autoreleasing 
variables in a block

The fixit is actively harmful, as it encourages developers to ignore the
warning and to write unsafe code.
It is almost impossible to write safe code while capturing autoreleasing
variables in the block, as in order to check that the block is never
called in the autoreleasing pool the developer has to check the
transitive closure of all potential callers of the block.

Differential Revision: https://reviews.llvm.org/D46778

Modified:
    cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
    cfe/trunk/lib/Sema/SemaExpr.cpp
    cfe/trunk/test/SemaObjC/arc.m

Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=332288&r1=332287&r2=332288&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Mon May 14 13:29:16 
2018
@@ -5435,8 +5435,6 @@ def warn_block_capture_autoreleasing : W
   "block captures an autoreleasing out-parameter, which may result in "
   "use-after-free bugs">,
   InGroup<BlockCaptureAutoReleasing>;
-def note_declare_parameter_autoreleasing : Note<
-  "declare the parameter __autoreleasing explicitly to suppress this warning">;
 def note_declare_parameter_strong : Note<
   "declare the parameter __strong or capture a __block __strong variable to "
   "keep values alive across autorelease pools">;

Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=332288&r1=332287&r2=332288&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExpr.cpp Mon May 14 13:29:16 2018
@@ -14579,30 +14579,6 @@ static bool captureInBlock(BlockScopeInf
       if (BuildAndDiagnose) {
         SourceLocation VarLoc = Var->getLocation();
         S.Diag(Loc, diag::warn_block_capture_autoreleasing);
-        {
-          auto AddAutoreleaseNote =
-              S.Diag(VarLoc, diag::note_declare_parameter_autoreleasing);
-          // Provide a fix-it for the '__autoreleasing' keyword at the
-          // appropriate location in the variable's type.
-          if (const auto *TSI = Var->getTypeSourceInfo()) {
-            PointerTypeLoc PTL =
-                TSI->getTypeLoc().getAsAdjusted<PointerTypeLoc>();
-            if (PTL) {
-              SourceLocation Loc = PTL.getPointeeLoc().getEndLoc();
-              Loc = Lexer::getLocForEndOfToken(Loc, 0, S.getSourceManager(),
-                                               S.getLangOpts());
-              if (Loc.isValid()) {
-                StringRef CharAtLoc = Lexer::getSourceText(
-                    CharSourceRange::getCharRange(Loc, 
Loc.getLocWithOffset(1)),
-                    S.getSourceManager(), S.getLangOpts());
-                AddAutoreleaseNote << FixItHint::CreateInsertion(
-                    Loc, CharAtLoc.empty() || !isWhitespace(CharAtLoc[0])
-                             ? " __autoreleasing "
-                             : " __autoreleasing");
-              }
-            }
-          }
-        }
         S.Diag(VarLoc, diag::note_declare_parameter_strong);
       }
     }

Modified: cfe/trunk/test/SemaObjC/arc.m
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/arc.m?rev=332288&r1=332287&r2=332288&view=diff
==============================================================================
--- cfe/trunk/test/SemaObjC/arc.m (original)
+++ cfe/trunk/test/SemaObjC/arc.m Mon May 14 13:29:16 2018
@@ -1,5 +1,5 @@
 // RUN: %clang_cc1 -triple x86_64-apple-darwin11 -fobjc-runtime-has-weak 
-fsyntax-only -fobjc-arc -fblocks -verify -Wno-objc-root-class %s
-// RUN: not %clang_cc1 -triple x86_64-apple-darwin11 -fobjc-runtime-has-weak 
-fsyntax-only -fobjc-arc -fblocks -Wno-objc-root-class 
-fdiagnostics-parseable-fixits %s 2>&1 | FileCheck %s
+// RUN: not %clang_cc1 -triple x86_64-apple-darwin11 -fobjc-runtime-has-weak 
-fsyntax-only -fobjc-arc -fblocks -Wno-objc-root-class 
-fdiagnostics-parseable-fixits %s 2>&1
 
 typedef unsigned long NSUInteger;
 typedef const void * CFTypeRef;
@@ -811,23 +811,17 @@ int garf() {
 }
 
 void block_capture_autoreleasing(A * __autoreleasing *a,
-                                 A **b, // expected-note {{declare the 
parameter __autoreleasing explicitly to suppress this warning}} expected-note 
{{declare the parameter __strong or capture a __block __strong variable to keep 
values alive across autorelease pools}}
-                                 A * _Nullable *c, // expected-note {{declare 
the parameter __autoreleasing explicitly to suppress this warning}} 
expected-note {{declare the parameter __strong or capture a __block __strong 
variable to keep values alive across autorelease pools}}
+                                 A **b, //  expected-note {{declare the 
parameter __strong or capture a __block __strong variable to keep values alive 
across autorelease pools}}
+                                 A * _Nullable *c, // expected-note {{declare 
the parameter __strong or capture a __block __strong variable to keep values 
alive across autorelease pools}}
                                  A * _Nullable __autoreleasing *d,
-                                 A ** _Nullable e, // expected-note {{declare 
the parameter __autoreleasing explicitly to suppress this warning}} 
expected-note {{declare the parameter __strong or capture a __block __strong 
variable to keep values alive across autorelease pools}}
+                                 A ** _Nullable e, // expected-note {{declare 
the parameter __strong or capture a __block __strong variable to keep values 
alive across autorelease pools}}
                                  A * __autoreleasing * _Nullable f,
                                  id __autoreleasing *g,
-                                 id *h, // expected-note {{declare the 
parameter __autoreleasing explicitly to suppress this warning}} expected-note 
{{declare the parameter __strong or capture a __block __strong variable to keep 
values alive across autorelease pools}}
-                                 id _Nullable *i, // expected-note {{declare 
the parameter __autoreleasing explicitly to suppress this warning}} 
expected-note {{declare the parameter __strong or capture a __block __strong 
variable to keep values alive across autorelease pools}}
+                                 id *h, // expected-note {{declare the 
parameter __strong or capture a __block __strong variable to keep values alive 
across autorelease pools}}
+                                 id _Nullable *i, // expected-note {{declare 
the parameter __strong or capture a __block __strong variable to keep values 
alive across autorelease pools}}
                                  id _Nullable __autoreleasing *j,
-                                 id * _Nullable k, // expected-note {{declare 
the parameter __autoreleasing explicitly to suppress this warning}} 
expected-note {{declare the parameter __strong or capture a __block __strong 
variable to keep values alive across autorelease pools}}
+                                 id * _Nullable k, // expected-note {{declare 
the parameter __strong or capture a __block __strong variable to keep values 
alive across autorelease pools}}
                                  id __autoreleasing * _Nullable l) {
-  // CHECK: fix-it:"{{.*}}":{[[@LINE-11]]:37-[[@LINE-11]]:37}:" 
__autoreleasing "
-  // CHECK: fix-it:"{{.*}}":{[[@LINE-11]]:47-[[@LINE-11]]:47}:" 
__autoreleasing"
-  // CHECK: fix-it:"{{.*}}":{[[@LINE-10]]:37-[[@LINE-10]]:37}:" 
__autoreleasing "
-  // CHECK: fix-it:"{{.*}}":{[[@LINE-8]]:36-[[@LINE-8]]:36}:" __autoreleasing"
-  // CHECK: fix-it:"{{.*}}":{[[@LINE-8]]:46-[[@LINE-8]]:46}:" __autoreleasing"
-  // CHECK: fix-it:"{{.*}}":{[[@LINE-7]]:36-[[@LINE-7]]:36}:" __autoreleasing"
   ^{
     (void)*a;
     (void)*b; // expected-warning {{block captures an autoreleasing 
out-parameter, which may result in use-after-free bugs}}


_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to