Skip to content

Commit f30fd81

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 b6eba84 commit f30fd81

1 file changed

Lines changed: 6 additions & 18 deletions

File tree

src/wasm-type-printing.h

Lines changed: 6 additions & 18 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,9 @@ 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>;
56-
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
49+
static_assert(requires(Subclass& s, HeapType ht) {
50+
{ s.getNames(ht) } -> std::same_as<TypeNames>;
51+
}, "Derived class must implement getNames");
6152
}
6253
};
6354

@@ -123,11 +114,8 @@ struct ModuleTypeNameGenerator
123114
ModuleTypeNameGenerator(const Module& wasm, FallbackGenerator& fallback)
124115
: wasm(wasm), fallback(fallback) {}
125116

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)
117+
ModuleTypeNameGenerator(const Module& wasm)
118+
requires std::is_same_v<FallbackGenerator, DefaultTypeNameGenerator>
131119
: ModuleTypeNameGenerator(wasm, defaultGenerator) {}
132120

133121
TypeNames getNames(HeapType type) {

0 commit comments

Comments
 (0)