diff options
author | Jakub Kuderski <jakub@nod-labs.com> | 2025-10-13 08:14:58 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-10-13 08:14:58 -0400 |
commit | 8642762ac356f0b8432b78d7a32c1f5213e494b3 (patch) | |
tree | ca37fa7ccebc412d5758f19e7997a17320ceee36 /llvm/lib/Support/TextEncoding.cpp | |
parent | 1ab59745eeafd288d7139eb95d8f35ded2f0b583 (diff) | |
download | llvm-8642762ac356f0b8432b78d7a32c1f5213e494b3.zip llvm-8642762ac356f0b8432b78d7a32c1f5213e494b3.tar.gz llvm-8642762ac356f0b8432b78d7a32c1f5213e494b3.tar.bz2 |
[ADT] Allow arbitrary number of cases in StringSwitch (#163117)
Prior to this patch, `.Cases` and `.CasesLower` were **not** variadic
functions and accepted a fixed number of arguments: up to 10 for the
former and up to 5 for the latter.
This is close to unfixable with variadic templates because of the
following constraints:
* There would be a variadic number of cases and the single value would
be at the very end. For a parameter pack approach to work, we would want
the value to be the head and the cases strings to follow, but rotating a
parameter pack is quite awkward and requires heavy template
metaprogramming.
* Even if we did rotate the parameter pack, the existing function
signature forces conversion of cases to `StringLiteral` and the value to
`T`. This is hard to achieve with variadic templates because we can't
specify that all cases must be of type `StringLiteral`, and doing the
conversion later won't work because of the attribute enable_if in
`StringLiteral`'s constructor that doesn't work on non-literal character
arrays.
* Refactoring all the existing code to put the value first is very
intrusive and bugprone when the value parameter is also a string
literal.
Instead, generalize `.Cases` and `.CasesLower` and make the code
manageable by taking an initializer list. The added benefit is that this
clearly delineates where case strings end and where the value begins,
which can be hard to tell when the value parameter is also a string
literal.
I plan to eventually deprecate the manually-enumerated overloads of
`.Cases.` and `.CasesLower`.
Diffstat (limited to 'llvm/lib/Support/TextEncoding.cpp')
0 files changed, 0 insertions, 0 deletions