[PATCH] D77507: [clangd] Fix HitMapping assertion in Tokens.cpp

Sam McCall via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Mon Apr 6 08:06:14 PDT 2020


sammccall added a comment.

Thanks for tracking this down. Unfortunately I don't think removing the assertion is enough, the code doesn't handle this case correctly.



================
Comment at: clang/unittests/Tooling/Syntax/TokensTest.cpp:487
 )"},
+      // Baseline case, bugz: https://bugs.llvm.org/show_bug.cgi?id=45428
+      {R"cpp(
----------------
This is the case that always worked, right? Not sure we need to add this test.


================
Comment at: clang/unittests/Tooling/Syntax/TokensTest.cpp:505
+      // Causes mapping miss when invoking tryConsumeSpelledUntil
+      {R"cpp(
+    #define NUM 42
----------------
>From the linked bug, the varags isn't essential to this crash.
The linked example can be simplified a little further by removing foo:

```
#define N 1
#define ID(X) X
#define ID2 ID
ID2(N)
```

This makes it clearer that the trigger is using a macro in a arg to an "indirect" function macro (i.e. the function macro's name is expanded from another macro).


================
Comment at: clang/unittests/Tooling/Syntax/TokensTest.cpp:519
+    ['#'_0, 'void'_34) => ['void'_0, 'void'_0)
+    ['M0'_40, 'NUM'_44) => ['{'_6, ';'_10)
+    ['NUM'_44, ')'_45) => [';'_10, ';'_10)
----------------
The problem with just removing the assertion is that this behavior is wrong: it's mapping `M0(,` onto `{ 42 ; }` - i.e. the whole M0 macro expansion. Then all the other mappings are empty. Compare to the baseline case above...

This should be `[M0_42, ;_46)] => [{_6, ;_10]` I think.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D77507





More information about the cfe-commits mailing list