[all-commits] [llvm/llvm-project] 864276: [ADT] Allow arbitrary number of cases in StringSwi...

Jakub Kuderski via All-commits all-commits at lists.llvm.org
Mon Oct 13 05:15:20 PDT 2025


  Branch: refs/heads/main
  Home:   https://github.com/llvm/llvm-project
  Commit: 8642762ac356f0b8432b78d7a32c1f5213e494b3
      https://github.com/llvm/llvm-project/commit/8642762ac356f0b8432b78d7a32c1f5213e494b3
  Author: Jakub Kuderski <jakub at nod-labs.com>
  Date:   2025-10-13 (Mon, 13 Oct 2025)

  Changed paths:
    M llvm/include/llvm/ADT/StringSwitch.h
    M llvm/unittests/ADT/StringSwitchTest.cpp

  Log Message:
  -----------
  [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`.



To unsubscribe from these emails, change your notification settings at https://github.com/llvm/llvm-project/settings/notifications


More information about the All-commits mailing list