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

    <tr>
        <th>Summary</th>
        <td>
            Invalid unicode character in identifier not rejected by Clang when concatenated with macros
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            clang
      </td>
    </tr>

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

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

<pre>
    The following code gets accepted by Clang top-of-tree (tested on top of commit `bb064535bd071c1bddaf55ff7fe283fc8d23c1fc`):
```
#define DOT •

#define CONCAT_IMPL(Left, Separator, Right) Left##Separator##Right
#define CONCAT(Left, Separator, Right) CONCAT_IMPL(Left, Separator, Right)

#define MAKE_CLASS_NAME(A, B) CONCAT(A, DOT, B)

int main() {
    // struct foo•bar {} x;
    struct MAKE_CLASS_NAME(foo, bar) { int val = 0; } x;

    return x.val;
}
$ ./bin/clang++ -std=c++2a unicode.cpp
$ nm a.out
0000000100003f5c t __ZZ4mainEN9foo•barC1Ev
0000000100003f88 t __ZZ4mainEN9foo•barC2Ev
0000000100000000 T __mh_execute_header
0000000100003f34 T _main
```

But when I just take the pre-processed of this and run Clang on it, we error out as expected:
```
$ ./bin/clang++ -E -std=c++2a unicode.cpp > processed.cpp
$ ./bin/clang++ processed.cpp -std=c++2a
unicode.cpp:9:15: error: character <U+2022> not allowed in an identifier
    9 |     struct foo•bar {} x;
      |               ^
1 error generated.
```

It looks like we should reject the compilation in both cases.

NB, GCC rejects both cases: https://godbolt.org/z/8cfj6s3P8
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyUVVFz2jgQ_jXiZSeMLdlgHvwABm4y16Sda-6lL4wsrbESIzHSmqT362-ESSApbe80jLG8-33S7rcryRDM1iKWLF-wfDmSPbXOl3dGtRK7VExHtdPfy4cWoXFd556N3YJyGmGLFEAqhXtCDfV3qDppt0Buf-OaG_KIwHhBGKLZ2WgA14Byu50hYJOkrpNJlou81sk0VWmttWzyvGmmDfJCNKrQXKi0UWySMD5jYs6SJUvmcTr8hikXGhtjEZafH4CtOCsSNucn4weX6vN9NX_Y3N59-cR48QkbYryCr7iXXpLzcfKX2bbE-AwGq2BcXNjjdPC4yvxb0v-xgesR3M3_XG2qT_OvXzf387sV48U8ghZn8tdPy88Pr5ZLKmMJdtJYxouIYdPF8B0AgPE142sI5HtF0Dj3ls5a-qPrdAkvTFxATr4_biuieQW19KdlIK58kB0wsYSEiQW8ZztzeqTeW3gZH2R3Nk-Xr7nIYMz4uo4xrFUsOsYXjC_gJpBmYqmGKZfQWxNLdaz2-zPW7kCOXX9SMBlGGh-iyRUQbDbfvmUxRav72YccVOnqcA1XFL_B8Wu4OOABNptdu8EXVD3hpkWp0V9bQ2TR9yjd1T44Phc9wXOLFm7hsQ8EJJ8QqEXYe7zZe6cwhNiODVBrAkirwff21LrOgjnW4zMCeu88uJ5ABsCXPSpC_fMe_Kkkq1-qAkys4G1b73W6TvjO-QfuAX0pu5jHkyPNmZgPMcUX1UovFaEHJqq_IzLhPG7FOgIZTznUYCxIC0ajJdOYV01ifcZyruCi-v9Tp8Ab6jxYvhoc0lPCt2jRS0I9_oXItwSdc08BOvOEUazQur7T4PERFR3lVm63N50kEzW1UDtqQcmAYXxJdL-Iav9RVSdouHCMeWqJ9vFlOBe2Tteuo7HzW8bX_zC-LlTzOAniSzHSpdAzMZMjLNMp55mYZOls1JbZFFFJOZPNJJlNppmsdZ5P6tgxqZRNMTIlT3iWTEWaZkKIyTjVeYqy1hMtUlUnNcsS3EnTjbvusItrj0wIPZZpkoqMjzpZYxeOtxfnp0Lh8SLzZQTc1P02sCzpTKBwpiBDHZa39iA7o18L8qIszKXwx6oYEnR50R3bTDmrJKGNksGzoRZ2UnkXRr3vyg_pM9T29Vi5HePruJPTX2zLyM34-hhZYHx9Cu5Q8n8DAAD__z-sOOA">