<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/140492>140492</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            clang-tidy readability-non-const-parameter false positive with Obj-C
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            clang-tidy,
            false-positive
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          seanm
      </td>
    </tr>
</table>

<pre>
    With the following Obj-C code:

```objc
#import <AppKit/AppKit.h>

static void RRGetRGBFromColour(NSColor* inColour, double* outRed, double* outGreen, double* outBlue)
{
  NSColor* colour = [inColour colorUsingColorSpace:[NSColorSpace genericRGBColorSpace]];
  [colour getRed:outRed green:outGreen blue:outBlue alpha:nil];
}
```

clang-tidy incorrectly says:

```
/Users/sean/test.m:3:59: warning: pointer parameter 'outRed' can be pointer to const [readability-non-const-parameter]
    3 | static void RRGetRGBFromColour(NSColor* inColour, double* outRed, double* outGreen, double* outBlue)
      | ^
      | const
```

But those 3 `double*` ***can't*** be const, the whole point is that data is written at those 3 addresses.  If I use `-fix` the resulting change indeed does not compile.

Here's `clang-check --ast-dump` for the function:

```
`-FunctionDecl 0x12b261890 </Users/sean/test.m:3:1, line:6:1> line:3:13 RRGetRGBFromColour 'void (NSColor *__strong, double *, double *, double *)' static
  |-ParmVarDecl 0x12b2615c0 <col:32, col:41> col:41 used inColour 'NSColor *__strong' destroyed
  |-ParmVarDecl 0x12b261640 <col:51, col:59> col:59 used outRed 'double *'
  |-ParmVarDecl 0x12b2616c0 <col:67, col:75> col:75 used outGreen 'double *'
  |-ParmVarDecl 0x12b261740 <col:85, col:93> col:93 used outBlue 'double *'
  `-CompoundStmt 0x12b261b30 <line:4:1, line:6:1>
    `-ObjCMessageExpr 0x12b261ad0 <line:5:2, col:63> 'void' selector=getRed:green:blue:alpha:
 |-ImplicitCastExpr 0x12b261a58 <col:3> 'NSColor *' <LValueToRValue>
      | `-DeclRefExpr 0x12b261958 <col:3> 'NSColor *__strong' lvalue ParmVar 0x12b2615c0 'inColour' 'NSColor *__strong'
      |-ImplicitCastExpr 0x12b261a70 <col:19> 'double *' <LValueToRValue>
      | `-DeclRefExpr 0x12b261978 <col:19> 'double *' lvalue ParmVar 0x12b261640 'outRed' 'double *'
      |-ImplicitCastExpr 0x12b261a88 <col:32> 'double *' <LValueToRValue>
      | `-DeclRefExpr 0x12b261998 <col:32> 'double *' lvalue ParmVar 0x12b2616c0 'outGreen' 'double *'
      |-ImplicitCastExpr 0x12b261aa0 <col:46> 'double *' <LValueToRValue>
      | `-DeclRefExpr 0x12b2619b8 <col:46> 'double *' lvalue ParmVar 0x12b261740 'outBlue' 'double *'
      `-ImplicitCastExpr 0x12b261ab8 </Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/usr/include/sys/_types.h:64:23, col:33> 'CGFloat * _Nullable':'CGFloat *' <NullToPointer>
 `-ParenExpr 0x12b261a38 <col:23, col:33> 'void *'
          `-CStyleCastExpr 0x12b261a10 <col:24, col:32> 'void *' <NullToPointer>
 `-IntegerLiteral 0x12b2619d8 <col:32> 'int' 0
```

</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzEV1tv2zoS_jX0CyFDpm7Wgx98ibPBOW2DpO32LaCosc2UJgWSSup_vxhKtuXmht0tcAwBIin6--abGQ5J7pzcaoAZyRYkW41463fGzhxwvR9Vpj7M_i39jvod0I1RyjxLvaVfqsdoSYWpgSRzEocnj7vHVI8C-yyR-8ZYT0mynDfNX9ITtu4a4x1Jrrq_Oc-9FPTJyJre3V2Dv7terK3ZL40yrSVs-vkem5awOZX6OLqktWkrBThqWn8H9YuxawugX4wuVAuElchdLEg8p3SALwI6JcmKkmxxZAvD9puTehtm3jdcBNnZov9vGKFb0GCluLteDKZlK3ySjopki55iC8HmZN4ZT7fB2NANdtMK7Qx9tJhy1ew4SeZaqhMeKVZDt3fuFIrrbeRlfaBSC2MtCK8O1PGDexmpEKX1NwfWEbbGiBO29uD8eE-SeUKSeVaSZE6fudVSb7HZGKk9WNpwy_eALcKKYwQKKrimFZxmeUOF0c6jcgu85pVU0h8ibXQUPkQnHJSFPqI0oaRY0n8sL2j4oQkku7roB4tfunzReup3xgFanscnWJLHFF_hEejbwp_66KUOjy3D2nreGdU7jkpH_Y57WnPPsfNspfegKT8T8bq24By4MaU3G3pDWwfIHm3kLyRGSAuuVR6Xq9hxvQUqdQ1Q09qAo9p4Ksy-kQrGnY5_gQXCCocwXRqJHYifNIq481Hd7hsE3hjb1YJWCy-Nfj2r8jha9xNWIBSNf01YxfLJtIyxHHyQdRN0ipIaV0Ae-snVsR--J6-kBCZiyJZzbqD7Hx6ct0ZvzxHvgvJer8RU7hKwW7fFMrrldv-d2ws1mQhqhFFoGEOYrp0Gi49tjE19SlK081X7CloDtg9Qv8uapwPWbHJmxcV6dWp3rH19IawYCizeJxjKyoszQZGdCYrsRNBVrP-KohhqmGZnijI5U5TJiSIUwdcZ8jhamn1jWl3f-70_UVRJoOjTJn0jrfoFjihfqsflJ3COb-HqV2NPQLweAmUkmQ8inQd7-9QLaQMKhDeWJKtTkT9W976oH4s5cqODbvaNkkL6JXf-kjmbDvKrJxrkDvKRZPn3d65a-Gruwvssqq9ieRyh7-9gcwFefgA-TEz1hMi0j-Rl_rPiXH6LtzGGNr2juBjkxaTsrbqI-v-huJh-CP6G0rDmhhvdq7n4sbzp9KJg_Fl55cfgb8kTR3n97vg_C-SD-KX5HxZYTT8Ef0NgcYpft9G_py-P39HXmdAdZJUUHHc43MZ-4Fl4zJuGsPXSaA_a4_AKnkCZBixh61vF_cbYPY5_4uLL_Y9x0w_9NvN-9dd50iQbs7GrfxK2bh1-lVqotgbcOw847cEfGnB4pJ7nWOZYci5PyXFhL6_XynCPYunD51YpHg4pBZahi699hHDKV3PbneP6AKFnbrkFfemSZBCVV7n7XfnCy0dPL-_9QcFLP08GecTSASh7CfqevTfawxbs39KD5ef9p6xfWytSe4SLfzvNjOpZUpdJyUcwmxRpkbNskqej3ayasmJTTjcihSItoeYpTDmvJ5N4ktVxKUZyxmKWxdmkjBOWx-m4TOtkCpDXEz4tplVG0hj2XKqxUk_7sbHbkXSuhdkkjdOSjRSvQLlwM2PsfLQnDHcgwtiGKwdRY5z08glwOFuN7AzBoqrdOpLGSjrvzvBeegWzwS3hg2M5DRT0SEGf8S4Ybn-j1qrZzvsmXCzYmrD1VvpdW42FwYRGyv4VNdY8gsD7X5CHWdsrfJqx_wQAAP__fOtNeQ">