[PATCH] D97137: Bug fix of https://bugs.llvm.org/show_bug.cgi?id=49175

Darwin Xu via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Sun Feb 21 21:14:45 PST 2021


darwin added a comment.

In D97137#2577794 <https://reviews.llvm.org/D97137#2577794>, @HazardyKnusperkeks wrote:

> Just out of curiosity, in which language is `Const` used?

For example it is C's macro.

I found this issue in our C code. It has many macros and one function was defined like this:

  static IO_FLT_POSTOP_CALLBACK_STATUS FilterDriverClosePostOpCallback(
      IN OUT PIO_FLT_POSTOP_DATA          pPostopData,
      IN IO_FLT_RELATED_OBJECTS           FltObjects,
      IN OPTIONAL PIO_FLT_CONTEXT         pCompletionContext,
      IN IO_FLT_POST_OPERATION_FLAGS      Flags,
      OUT PIO_FLT_POSTOP_CANCEL_CALLBACK* pCancellationCallback,
      OUT OPTIONAL PVOID*                 ppCancellationContext)

And because of this issue, the last two lines couldn't be formatted properly:

  static IO_FLT_POSTOP_CALLBACK_STATUS FilterDriverClosePostOpCallback(
      IN OUT PIO_FLT_POSTOP_DATA     pPostopData,
      IN IO_FLT_RELATED_OBJECTS      FltObjects,
      IN OPTIONAL PIO_FLT_CONTEXT    pCompletionContext,
      IN IO_FLT_POST_OPERATION_FLAGS Flags,
      OUT PIO_FLT_POSTOP_CANCEL_CALLBACK* pCancellationCallback,
      OUT OPTIONAL PVOID* ppCancellationContext)

Then, I started to investigate this issue. Interestingly, if the token before the asterisk is a keyword like `const` or `int`, it works fine sometimes:

  static IO_FLT_POSTOP_CALLBACK_STATUS FilterDriverClosePostOpCallback(
      IN OUT PIO_FLT_POSTOP_DATA     pPostopData,
      IN IO_FLT_RELATED_OBJECTS      FltObjects,
      IN OPTIONAL PIO_FLT_CONTEXT    pCompletionContext,
      IN IO_FLT_POST_OPERATION_FLAGS Flags,
      OUT int*                       pCancellationCallback,                         <== I've changed PIO_FLT_POSTOP_CANCEL_CALLBACK into int, it could be formatted properly.
      OUT OPTIONAL const* ppCancellationContext)                                    <== I've changed PVOID into const, it still couldn't be formatted properly.

I didn't know the reason behind of this. Anyway, after this modification, it can handle all these types of code.



================
Comment at: clang/unittests/Format/FormatTest.cpp:14257
+
+  Alignment.PointerAlignment = FormatStyle::PAS_Left;
+  verifyFormat("unsigned int*       a;\n"
----------------
curdeius wrote:
> Could you please test as well mixed pointers and references?
Sure.


================
Comment at: clang/unittests/Format/FormatTest.cpp:14260
+               "int*                b;\n"
+               "unsigned int Const* c;",
+               Alignment);
----------------
curdeius wrote:
> Could you please test `const` as well?
Sure.

Actually, clang-format worked well for `const` originally.


================
Comment at: clang/unittests/Format/FormatTest.cpp:14261
+               "unsigned int Const* c;",
+               Alignment);
 }
----------------
MyDeveloperDay wrote:
> can you test west const too?
> 
> ```
> Const unsigned int* c;
> const unsigned int* d;
> Const unsigned int& e;
> const unsigned int& f;
> const unsigned g;
> Const unsigned h;
> ```
> 
Sure.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D97137/new/

https://reviews.llvm.org/D97137



More information about the cfe-commits mailing list