Skip to content

Commit 54d6e36

Browse files
committed
Use C++20 requires clauses in TypeNameGeneratorBase
This addresses the TODOs in src/wasm-type-printing.h by utilizing C++20 concepts and requires clauses. - Replaced the manual SFINAE/macro-based check in TypeNameGeneratorBase with a static_assert(requires { ... }) to ensure subclasses implement getNames correctly. This is cleaner and more robust. - Updated the ModuleTypeNameGenerator constructor to use a requires clause instead of std::enable_if_t for its default constructor, improving readability. - Added #include <concepts> as required.
1 parent 0005bc8 commit 54d6e36

1 file changed

Lines changed: 6 additions & 17 deletions

File tree

src/wasm-type-printing.h

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#ifndef wasm_wasm_type_printing_h
1818
#define wasm_wasm_type_printing_h
1919

20+
#include <concepts>
2021
#include <cstddef>
2122
#include <iostream>
2223
#include <unordered_map>
@@ -34,9 +35,6 @@ namespace wasm {
3435
template<typename Subclass> struct TypeNameGeneratorBase {
3536
TypeNameGeneratorBase() { assertValidUsage(); }
3637

37-
TypeNames getNames(HeapType type) {
38-
WASM_UNREACHABLE("Derived class must implement getNames");
39-
}
4038
HeapType::Printed operator()(HeapType type) {
4139
return type.print(
4240
[&](HeapType ht) { return static_cast<Subclass*>(this)->getNames(ht); });
@@ -48,16 +46,10 @@ template<typename Subclass> struct TypeNameGeneratorBase {
4846

4947
private:
5048
constexpr void assertValidUsage() {
51-
// This check current causes a crash on MSVC
52-
// TODO: Convert to C++20 requires check
53-
#if !defined(_MSC_VER) && (!defined(__GNUC__) || __GNUC__ >= 14)
54-
// Check that the subclass provides `getNames` with the correct type.
55-
using Self = TypeNameGeneratorBase<Subclass>;
5649
static_assert(
57-
static_cast<TypeNames (Self::*)(HeapType)>(&Self::getNames) !=
58-
static_cast<TypeNames (Self::*)(HeapType)>(&Subclass::getNames),
59-
"Derived class must implement getNames");
60-
#endif
50+
requires(Subclass& s, HeapType ht) {
51+
{ s.getNames(ht) } -> std::same_as<TypeNames>;
52+
}, "Derived class must implement getNames");
6153
}
6254
};
6355

@@ -123,11 +115,8 @@ struct ModuleTypeNameGenerator
123115
ModuleTypeNameGenerator(const Module& wasm, FallbackGenerator& fallback)
124116
: wasm(wasm), fallback(fallback) {}
125117

126-
// TODO: Use C++20 `requires` to clean this up.
127-
template<class T = FallbackGenerator>
128-
ModuleTypeNameGenerator(
129-
const Module& wasm,
130-
std::enable_if_t<std::is_same_v<T, DefaultTypeNameGenerator>>* = nullptr)
118+
ModuleTypeNameGenerator(const Module& wasm)
119+
requires std::is_same_v<FallbackGenerator, DefaultTypeNameGenerator>
131120
: ModuleTypeNameGenerator(wasm, defaultGenerator) {}
132121

133122
TypeNames getNames(HeapType type) {

0 commit comments

Comments
 (0)