77#include < llvm/Support/MemoryBuffer.h>
88
99#include < algorithm>
10- #include < format>
1110#include < string>
1211#include < vector>
1312
@@ -17,6 +16,21 @@ namespace cpp2rust::TranslationRule {
1716
1817namespace {
1918
19+ struct GenericPlaceholders {
20+ char storage[kMaxGenerics ][3 ]{};
21+
22+ constexpr GenericPlaceholders () {
23+ for (unsigned i = 0 ; i < kMaxGenerics ; ++i) {
24+ storage[i][0 ] = ' T' ;
25+ storage[i][1 ] = static_cast <char >(' 1' + i);
26+ storage[i][2 ] = ' \0 ' ;
27+ }
28+ }
29+ };
30+ static_assert (kMaxGenerics <= 9 ,
31+ " GenericPlaceholders assumes single-digit names" );
32+ constexpr GenericPlaceholders kGenericPlaceholders {};
33+
2034TypeInfo ParseTypeInfoJSON (const llvm::json::Object &obj) {
2135 TypeInfo info;
2236 if (auto ty = obj.getString (" type" ))
@@ -307,9 +321,10 @@ void ExprRule::validate(const std::string &name) const {
307321 assert (0 && " Expr rule loaded from IR but has no src" );
308322 }
309323
310- // Check that both source and target use the same generics.
311- for (unsigned i = 0 ; i < generics.size (); ++i) {
312- auto placeholder = std::format (" T{}" , i + 1 );
324+ assert (generics.size () <= kMaxGenerics &&
325+ " rule declares more generics than kMaxGenerics" );
326+ for (unsigned i = 0 , e = generics.size (); i < e; ++i) {
327+ const char *placeholder = kGenericPlaceholders .storage [i];
313328 if (src.find (placeholder) == std::string::npos) {
314329 llvm::errs () << name << ' \n ' ;
315330 dump ();
0 commit comments