[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