Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore(ci): Add clang-tidy checks and ensure they pass #639

Merged
merged 22 commits into from
Oct 2, 2024

Conversation

paleolimbot
Copy link
Member

@paleolimbot paleolimbot commented Sep 30, 2024

This PR adds a clang-tidy check to CI and fixes several issues that it identified (including a few from other repos like ADBC and cudf).

A reboot of #538; closes #537.

@paleolimbot
Copy link
Member Author

Still need to fix some additional decimal checks, possibly related to #594.

/home/dewey/gh/arrow-nanoarrow/src/nanoarrow/common/utils.c:384:32: warning: The left operand of '!=' is a garbage value due to array index out of bounds [clang-analyzer-core.UndefinedBinaryOperatorResult]
    if (words_little_endian[i] != 0) {
        ~~~~~~~~~~~~~~~~~~~~~~ ^
/home/dewey/gh/arrow-nanoarrow/src/nanoarrow/common/utils.c:362:7: note: Assuming field 'low_word_index' is not equal to 0
  if (decimal->low_word_index == 0) {
      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/dewey/gh/arrow-nanoarrow/src/nanoarrow/common/utils.c:362:3: note: Taking false branch
  if (decimal->low_word_index == 0) {
  ^
/home/dewey/gh/arrow-nanoarrow/src/nanoarrow/common/utils.c:365:21: note: Assuming 'i' is >= field 'n_words'
    for (int i = 0; i < decimal->n_words; i++) {
                    ^~~~~~~~~~~~~~~~~~~~
/home/dewey/gh/arrow-nanoarrow/src/nanoarrow/common/utils.c:365:5: note: Loop condition is false. Execution continues on line 371
    for (int i = 0; i < decimal->n_words; i++) {
    ^
/home/dewey/gh/arrow-nanoarrow/src/nanoarrow/common/utils.c:371:7: note: Assuming 'is_negative' is 0
  if (is_negative) {
      ^~~~~~~~~~~
/home/dewey/gh/arrow-nanoarrow/src/nanoarrow/common/utils.c:371:3: note: Taking false branch
  if (is_negative) {
  ^
/home/dewey/gh/arrow-nanoarrow/src/nanoarrow/common/utils.c:383:38: note: Assuming 'i' is >= 0
  for (int i = decimal->n_words - 1; i >= 0; i--) {
                                     ^~~~~~
/home/dewey/gh/arrow-nanoarrow/src/nanoarrow/common/utils.c:383:3: note: Loop condition is true.  Entering loop body
  for (int i = decimal->n_words - 1; i >= 0; i--) {
  ^
/home/dewey/gh/arrow-nanoarrow/src/nanoarrow/common/utils.c:384:9: note: Assuming the condition is false
    if (words_little_endian[i] != 0) {
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/dewey/gh/arrow-nanoarrow/src/nanoarrow/common/utils.c:384:5: note: Taking false branch
    if (words_little_endian[i] != 0) {
    ^
/home/dewey/gh/arrow-nanoarrow/src/nanoarrow/common/utils.c:383:46: note: The value 2147483646 is assigned to 'i'
  for (int i = decimal->n_words - 1; i >= 0; i--) {
                                             ^~~
/home/dewey/gh/arrow-nanoarrow/src/nanoarrow/common/utils.c:383:3: note: Loop condition is true.  Entering loop body
  for (int i = decimal->n_words - 1; i >= 0; i--) {
  ^
/home/dewey/gh/arrow-nanoarrow/src/nanoarrow/common/utils.c:384:32: note: The left operand of '!=' is a garbage value due to array index out of bounds
    if (words_little_endian[i] != 0) {
        ~~~~~~~~~~~~~~~~~~~~~~ ^
/home/dewey/gh/arrow-nanoarrow/src/nanoarrow/common/utils.c:417:38: warning: The left operand of '>>' is a garbage value [clang-analyzer-core.UndefinedBinaryOperatorResult]
      uint32_t hi = (uint32_t)(*elem >> 32);
                               ~~~~~ ^
/home/dewey/gh/arrow-nanoarrow/src/nanoarrow/common/utils.c:362:7: note: Assuming field 'low_word_index' is not equal to 0
  if (decimal->low_word_index == 0) {
      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/dewey/gh/arrow-nanoarrow/src/nanoarrow/common/utils.c:362:3: note: Taking false branch
  if (decimal->low_word_index == 0) {
  ^
/home/dewey/gh/arrow-nanoarrow/src/nanoarrow/common/utils.c:365:21: note: Assuming 'i' is >= field 'n_words'
    for (int i = 0; i < decimal->n_words; i++) {
                    ^~~~~~~~~~~~~~~~~~~~
/home/dewey/gh/arrow-nanoarrow/src/nanoarrow/common/utils.c:365:5: note: Loop condition is false. Execution continues on line 371
    for (int i = 0; i < decimal->n_words; i++) {
    ^
/home/dewey/gh/arrow-nanoarrow/src/nanoarrow/common/utils.c:371:7: note: Assuming 'is_negative' is 0
  if (is_negative) {
      ^~~~~~~~~~~
/home/dewey/gh/arrow-nanoarrow/src/nanoarrow/common/utils.c:371:3: note: Taking false branch
  if (is_negative) {
  ^
/home/dewey/gh/arrow-nanoarrow/src/nanoarrow/common/utils.c:383:38: note: Assuming 'i' is >= 0
  for (int i = decimal->n_words - 1; i >= 0; i--) {
                                     ^~~~~~
/home/dewey/gh/arrow-nanoarrow/src/nanoarrow/common/utils.c:383:3: note: Loop condition is true.  Entering loop body
  for (int i = decimal->n_words - 1; i >= 0; i--) {
  ^
/home/dewey/gh/arrow-nanoarrow/src/nanoarrow/common/utils.c:384:9: note: Assuming the condition is true
    if (words_little_endian[i] != 0) {
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/dewey/gh/arrow-nanoarrow/src/nanoarrow/common/utils.c:384:5: note: Taking true branch
    if (words_little_endian[i] != 0) {
    ^
/home/dewey/gh/arrow-nanoarrow/src/nanoarrow/common/utils.c:386:7: note:  Execution continues on line 391
      break;
      ^
/home/dewey/gh/arrow-nanoarrow/src/nanoarrow/common/utils.c:391:3: note: Taking false branch
  if (most_significant_elem_idx == -1) {
  ^
/home/dewey/gh/arrow-nanoarrow/src/nanoarrow/common/utils.c:417:38: note: The left operand of '>>' is a garbage value
      uint32_t hi = (uint32_t)(*elem >> 32);
                               ~~~~~ ^

@paleolimbot
Copy link
Member Author

@vyasr I'm not seeing anything from buffer_inline...any chance you could share the full output from those errors? I am thinking that it may be related to your specific usage (that might be incorrect, or might be exposing a code path we didn't consider).

@vyasr
Copy link
Contributor

vyasr commented Oct 1, 2024

Yeah one of those sounds quite likely. I've attached the output of running clang-tidy on one of our test files without patching in some NOLINT markers.

nanoarrow_clang_tidy.txt

r/.clang-tidy Outdated
@@ -0,0 +1,21 @@
# Licensed to the Apache Software Foundation (ASF) under one
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do you mean for this file to be in the r directory or in the project root?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

😬 (Thanks!)

@paleolimbot
Copy link
Member Author

I've attached the output of running clang-tidy on one of our test files

Thank you! I'll plug through more details tomorrow but I am wondering if clang-tidy can't see that if mask.empty() is true, mask.size() == 0...it's something about ArrowBitmapReserve(), in any case.

For my brain tomorrow, there is:

  • Check ArrowBitmapReserve(). I see a lot of:
/home/coder/cudf/cpp/build/conda/cuda-12.5/release/_deps/nanoarrow-src/src/nanoarrow/common/inline_buffer.h:558:7: note: Assuming 'min_capacity_bytes' is <= 'current_capacity_bytes'
  558 |   if (min_capacity_bytes <= current_capacity_bytes) {
      |       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/coder/cudf/cpp/build/conda/cuda-12.5/release/_deps/nanoarrow-src/src/nanoarrow/common/inline_buffer.h:558:3: note: Taking true branch
  558 |   if (min_capacity_bytes <= current_capacity_bytes) {
      |   ^
/home/coder/cudf/cpp/build/conda/cuda-12.5/release/_deps/nanoarrow-src/src/nanoarrow/common/inline_buffer.h:559:5: note: Returning without writing to 'bitmap->buffer.data'
  559 |     return NANOARROW_OK;
      |     ^

...and I wonder if _ArrowBitsForBytes() is getting in the way of clang-tidy correctly guessing that the reserve will take place.

  • From ADBC, it seems like malloc() implementations that don't return NULL for a zero-size allocation might leak memory (its example is from ArrowSchemaAllocationChildren(0)). I think sometimes we just check for n_children > 0 rather than children != NULL.

@vyasr
Copy link
Contributor

vyasr commented Oct 1, 2024

Here's another error in our CI (one that I haven't reproduced locally yet). This one may be our fault if there's some function that isn't safe to call when a buffer is empty, but I'm just letting you know in case it helps you track anything down. I haven't traced it yet.

@paleolimbot
Copy link
Member Author

Check ArrowBitmapReserve(). I see a lot of:

It seems like clang-tidy has some trouble guessing whether or not an allocation does or does not take place if the value of additional_size_bytes isn't obvious. I think in your case, mask.size() is definitely non-zero but clang-tidy doesn't seem to know that. It seems as though debug checks work to give clang-tidy these hints (e.g., assert(mask.size() > 0)), although maybe the dchecks I added internally will take care of your existing issues.

@vyasr
Copy link
Contributor

vyasr commented Oct 2, 2024

Yeah I would expect assertions to provide useful hints since other linters certainly work that way. When you have something working reasonably well let me know and I can test it directly within our repo by repointing the local clone to use this branch easily enough.

@paleolimbot paleolimbot marked this pull request as ready for review October 2, 2024 03:50
@paleolimbot
Copy link
Member Author

@vyasr I think this is ready...a test from your end would be very helpful! (Also because we're about to release and it would be great to identify any issues before we get to RC0!)

Copy link
Contributor

@WillAyd WillAyd left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm

return;
}

NANOARROW_DCHECK(bits != NULL);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since bits is a parameter this might also be a good use case for the clang/gcc nonnull attribute

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I didn't know about that! I think it can be NULL if length == 0 here but there are other places where it could be useful!

@paleolimbot paleolimbot merged commit b1ba426 into apache:main Oct 2, 2024
35 checks passed
@paleolimbot paleolimbot deleted the c-clang-tidy-reboot branch October 2, 2024 14:56
@vyasr
Copy link
Contributor

vyasr commented Oct 4, 2024

Thanks for getting this done @paleolimbot! Unfortunately I do still see some clang-tidy errors coming out of our build after upgrading to use this commit. I'm going to try and get our clang-tidy setup working first so that it's easier to reproduce, and then I'll ping you again so that you don't have to jump through so many hoops (and of course I can also dig in again).

@paleolimbot
Copy link
Member Author

Feel free to post any version of logs here in the meantime!

@vyasr
Copy link
Contributor

vyasr commented Oct 4, 2024

I'm focusing on getting clang-tidy running in our CI and easy to reproduce locally with pre-commit before I go any further here, that way I'll be able to hand it off to others like you without you having to recreate unnecessary complexity. So it'll probably be a week or so before I have something ready there, but once that happens I'll hopefully be able to post logs and also do so in a way that you can easily reproduce without needing to fully recompile our software or anything.

@paleolimbot
Copy link
Member Author

Ah ok! I am planning to put up a release candidate up on Monday (but can obviously follow up with fixes after). I don't personally mind unreproducible logs but no pressure!

@vyasr
Copy link
Contributor

vyasr commented Oct 14, 2024

I see that the release went up, nice! I just merged the PR to add clang-tidy to our CI in a way that should make it pretty easy to reproduce our issues locally now. Here's a PR that should demonstrate the issue. All you need to reproduce is in the edited ci/clang_tidy.sh script in that PR. To make things easy, I recommend that you run inside the rapidsai/ci-conda:latest docker container that we publish to make sure that everything is set up for you to build easily. The traceback that I linked to above remains the issue that appears. I'll paste it at the bottom of this message now so that it doesn't get lost. That error pops up when compiling the specific target that I've set up the test PR to compile, but if you do find the issue and this file no longer shows clang-tidy issues I would suggest also trying the other interop test targets since they all leverage nanoarrow and I believe that they showed a couple of slightly different underlying issues.

Here's the traceback.

/__w/cudf/cudf/cpp/tests/interop/nanoarrow_utils.hpp:259:5: warning: Null pointer passed to 1st parameter expecting 'nonnull' [clang-analyzer-core.NonNullParamChecker]
  259 |     std::memset(out.buffer.data, 0, out.buffer.size_bytes);
      |     ^
/__w/cudf/cudf/cpp/tests/interop/from_arrow_host_test.cpp:104:29: note: Calling 'get_nanoarrow_host_tables'
  104 |   auto [tbl, schema, arr] = get_nanoarrow_host_tables(0);
      |                             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
/__w/cudf/cudf/cpp/tests/interop/from_arrow_host_test.cpp:54:21: note: Calling 'get_nanoarrow_array<bool>'
   54 |   auto boolarray  = get_nanoarrow_array<bool>(test_data.bool_data, test_data.bool_validity);
      |                     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/__w/cudf/cudf/cpp/tests/interop/nanoarrow_utils.hpp:253:3: note: Assuming 'errno_status_92' is 0
  253 |   NANOARROW_THROW_NOT_OK(ArrowArrayInitFromType(tmp.get(), NANOARROW_TYPE_BOOL));
      |   ^
/__w/cudf/cudf/cpp/build/_deps/nanoarrow-src/src/nanoarrow/nanoarrow.hpp:80:32: note: expanded from macro 'NANOARROW_THROW_NOT_OK'
   80 |   _NANOARROW_THROW_NOT_OK_IMPL(_NANOARROW_MAKE_NAME(errno_status_, __COUNTER__), EXPR, \
      |                                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/__w/cudf/cudf/cpp/build/_deps/nanoarrow-src/src/nanoarrow/common/inline_types.h:137:36: note: expanded from macro '_NANOARROW_MAKE_NAME'
  137 | #define _NANOARROW_MAKE_NAME(x, y) _NANOARROW_CONCAT(x, y)
      |                                    ^~~~~~~~~~~~~~~~~~~~~~~
/__w/cudf/cudf/cpp/build/_deps/nanoarrow-src/src/nanoarrow/common/inline_types.h:136:33: note: expanded from macro '_NANOARROW_CONCAT'
  136 | #define _NANOARROW_CONCAT(x, y) x##y
      |                                 ^~~~
note: expanded from here
/__w/cudf/cudf/cpp/build/_deps/nanoarrow-src/src/nanoarrow/nanoarrow.hpp:71:9: note: expanded from macro '_NANOARROW_THROW_NOT_OK_IMPL'
   71 |     if (NAME) {                                                       \
      |         ^~~~
/__w/cudf/cudf/cpp/tests/interop/nanoarrow_utils.hpp:253:3: note: Taking false branch
  253 |   NANOARROW_THROW_NOT_OK(ArrowArrayInitFromType(tmp.get(), NANOARROW_TYPE_BOOL));
      |   ^
/__w/cudf/cudf/cpp/build/_deps/nanoarrow-src/src/nanoarrow/nanoarrow.hpp:80:3: note: expanded from macro 'NANOARROW_THROW_NOT_OK'
   80 |   _NANOARROW_THROW_NOT_OK_IMPL(_NANOARROW_MAKE_NAME(errno_status_, __COUNTER__), EXPR, \
      |   ^
/__w/cudf/cudf/cpp/build/_deps/nanoarrow-src/src/nanoarrow/nanoarrow.hpp:71:5: note: expanded from macro '_NANOARROW_THROW_NOT_OK_IMPL'
   71 |     if (NAME) {                                                       \
      |     ^
/__w/cudf/cudf/cpp/tests/interop/nanoarrow_utils.hpp:253:3: note: Loop condition is false.  Exiting loop
  253 |   NANOARROW_THROW_NOT_OK(ArrowArrayInitFromType(tmp.get(), NANOARROW_TYPE_BOOL));
      |   ^
/__w/cudf/cudf/cpp/build/_deps/nanoarrow-src/src/nanoarrow/nanoarrow.hpp:80:3: note: expanded from macro 'NANOARROW_THROW_NOT_OK'
   80 |   _NANOARROW_THROW_NOT_OK_IMPL(_NANOARROW_MAKE_NAME(errno_status_, __COUNTER__), EXPR, \
      |   ^
/__w/cudf/cudf/cpp/build/_deps/nanoarrow-src/src/nanoarrow/nanoarrow.hpp:69:3: note: expanded from macro '_NANOARROW_THROW_NOT_OK_IMPL'
      |   ^
/__w/cudf/cudf/cpp/build/_deps/nanoarrow-src/src/nanoarrow/common/inline_types.h:269:3: note: expanded from macro 'NANOARROW_RETURN_NOT_OK'
  269 |   _NANOARROW_RETURN_NOT_OK_IMPL(_NANOARROW_MAKE_NAME(errno_status_, __COUNTER__), EXPR)
      |   ^
/__w/cudf/cudf/cpp/build/_deps/nanoarrow-src/src/nanoarrow/common/inline_types.h:142:5: note: expanded from macro '_NANOARROW_RETURN_NOT_OK_IMPL'
  142 |     if (NAME) return NAME;                        \
      |     ^
/__w/cudf/cudf/cpp/build/_deps/nanoarrow-src/src/nanoarrow/common/inline_buffer.h:582:3: note: Loop condition is false.  Exiting loop
  582 |   NANOARROW_RETURN_NOT_OK(
      |   ^
/__w/cudf/cudf/cpp/build/_deps/nanoarrow-src/src/nanoarrow/common/inline_types.h:269:3: note: expanded from macro 'NANOARROW_RETURN_NOT_OK'
  269 |   _NANOARROW_RETURN_NOT_OK_IMPL(_NANOARROW_MAKE_NAME(errno_status_, __COUNTER__), EXPR)
      |   ^
/__w/cudf/cudf/cpp/build/_deps/nanoarrow-src/src/nanoarrow/common/inline_types.h:140:3: note: expanded from macro '_NANOARROW_RETURN_NOT_OK_IMPL'
  140 |   do {                                            \
      |   ^
/__w/cudf/cudf/cpp/build/_deps/nanoarrow-src/src/nanoarrow/common/inline_buffer.h:586:3: note: Returning without writing to 'bitmap->buffer.data'
  586 |   return NANOARROW_OK;
      |   ^
/__w/cudf/cudf/cpp/tests/interop/nanoarrow_utils.hpp:258:28: note: Returning from 'ArrowBitmapResize'
  258 |     NANOARROW_THROW_NOT_OK(ArrowBitmapResize(&out, b.size(), 1));
      |                            ^
/__w/cudf/cudf/cpp/build/_deps/nanoarrow-src/src/nanoarrow/nanoarrow.hpp:80:82: note: expanded from macro 'NANOARROW_THROW_NOT_OK'
   80 |   _NANOARROW_THROW_NOT_OK_IMPL(_NANOARROW_MAKE_NAME(errno_status_, __COUNTER__), EXPR, \
      |                                                                                  ^~~~
/__w/cudf/cudf/cpp/build/_deps/nanoarrow-src/src/nanoarrow/nanoarrow.hpp:70:23: note: expanded from macro '_NANOARROW_THROW_NOT_OK_IMPL'
   70 |     const int NAME = (EXPR);                                          \
      |                       ^~~~
/__w/cudf/cudf/cpp/tests/interop/nanoarrow_utils.hpp:258:5: note: 'errno_status_93' is 0
  258 |     NANOARROW_THROW_NOT_OK(ArrowBitmapResize(&out, b.size(), 1));
      |     ^
/__w/cudf/cudf/cpp/build/_deps/nanoarrow-src/src/nanoarrow/nanoarrow.hpp:80:32: note: expanded from macro 'NANOARROW_THROW_NOT_OK'
   80 |   _NANOARROW_THROW_NOT_OK_IMPL(_NANOARROW_MAKE_NAME(errno_status_, __COUNTER__), EXPR, \
      |                                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/__w/cudf/cudf/cpp/build/_deps/nanoarrow-src/src/nanoarrow/common/inline_types.h:137:36: note: expanded from macro '_NANOARROW_MAKE_NAME'
  137 | #define _NANOARROW_MAKE_NAME(x, y) _NANOARROW_CONCAT(x, y)
      |                                    ^~~~~~~~~~~~~~~~~~~~~~~
/__w/cudf/cudf/cpp/build/_deps/nanoarrow-src/src/nanoarrow/common/inline_types.h:136:33: note: expanded from macro '_NANOARROW_CONCAT'
  136 | #define _NANOARROW_CONCAT(x, y) x##y
      |                                 ^~~~
note: expanded from here
/__w/cudf/cudf/cpp/build/_deps/nanoarrow-src/src/nanoarrow/nanoarrow.hpp:71:9: note: expanded from macro '_NANOARROW_THROW_NOT_OK_IMPL'
   71 |     if (NAME) {                                                       \
      |         ^~~~
/__w/cudf/cudf/cpp/tests/interop/nanoarrow_utils.hpp:258:5: note: Taking false branch
  258 |     NANOARROW_THROW_NOT_OK(ArrowBitmapResize(&out, b.size(), 1));
      |     ^
/__w/cudf/cudf/cpp/build/_deps/nanoarrow-src/src/nanoarrow/nanoarrow.hpp:80:3: note: expanded from macro 'NANOARROW_THROW_NOT_OK'
   80 |   _NANOARROW_THROW_NOT_OK_IMPL(_NANOARROW_MAKE_NAME(errno_status_, __COUNTER__), EXPR, \
      |   ^
/__w/cudf/cudf/cpp/build/_deps/nanoarrow-src/src/nanoarrow/nanoarrow.hpp:71:5: note: expanded from macro '_NANOARROW_THROW_NOT_OK_IMPL'
   71 |     if (NAME) {                                                       \
      |     ^
/__w/cudf/cudf/cpp/tests/interop/nanoarrow_utils.hpp:258:5: note: Loop condition is false.  Exiting loop
  258 |     NANOARROW_THROW_NOT_OK(ArrowBitmapResize(&out, b.size(), 1));
      |     ^
/__w/cudf/cudf/cpp/build/_deps/nanoarrow-src/src/nanoarrow/nanoarrow.hpp:80:3: note: expanded from macro 'NANOARROW_THROW_NOT_OK'
   80 |   _NANOARROW_THROW_NOT_OK_IMPL(_NANOARROW_MAKE_NAME(errno_status_, __COUNTER__), EXPR, \
      |   ^
/__w/cudf/cudf/cpp/build/_deps/nanoarrow-src/src/nanoarrow/nanoarrow.hpp:69:3: note: expanded from macro '_NANOARROW_THROW_NOT_OK_IMPL'
   69 |   do {                                                                \
      |   ^
/__w/cudf/cudf/cpp/tests/interop/nanoarrow_utils.hpp:259:5: note: Null pointer passed to 1st parameter expecting 'nonnull'
  259 |     std::memset(out.buffer.data, 0, out.buffer.size_bytes);
      |     ^           ~~~~~~~~~~~~~~~

@paleolimbot
Copy link
Member Author

Thank you! I opened a new issue to track so that this doesn't get lost. I'll take a look this week!

@vyasr
Copy link
Contributor

vyasr commented Oct 16, 2024

Thanks! Let me know if you need help with the repro.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Run clang-tidy in CI or as an extended check
3 participants