@@ -60,10 +60,16 @@ any::operator bool() const {
6060 RETURN_VALUE(Tag::Boolean, b,)
6161}
6262
63−any::operator char() const {
63+any::operator char32_t() const {
6464 RETURN_VALUE(Tag::Character, c,)
6565}
6666
67+any::operator char() const {
68+ const auto val = cast<decltype(c)>(*this);
69+ assert(val <= std::numeric_limits<char>::max());
70+ return static_cast<char>(val);
71+}
72+
6773any::operator size_t() const {
6874 const auto sz = cast<int>(*this);
6975 assert(sz >= 0);
@@ -197,7 +203,7 @@ auto operator+(const any& lhs_, const any& rhs_) -> any {
197203 switch (lhs.tag) {
198204 case any::Tag::Integer: assert(lhs.tag == any::Tag::Integer); return lhs.i + rhs.i;
199205 case any::Tag::Double: assert(lhs.tag == any::Tag::Double); return lhs.d + rhs.d;
200− case any::Tag::Character: assert(lhs.tag == any::Tag::Character); return any(char(lhs.c + rhs.c));
206+ case any::Tag::Character: assert(lhs.tag == any::Tag::Character); return decltype(any::c){lhs.c + rhs.c};
201207 case any::Tag::StringLiteral:
202208 assert(lhs.tag == any::Tag::StringLiteral || lhs.tag == any::Tag::String);
203209 assert(rhs.tag == any::Tag::StringLiteral || rhs.tag == any::Tag::String);
@@ -230,7 +236,7 @@ auto operator-(const any& lhs_, const any& rhs_) -> any {
230236 switch (lhs.tag) {
231237 case any::Tag::Integer: return lhs.i - rhs.i;
232238 case any::Tag::Double: return lhs.d - rhs.d;
233− case any::Tag::Character: return any(char(lhs.c - rhs.c));
239+ case any::Tag::Character: return decltype(any::c){lhs.c - rhs.c};
234240 default: assert(false && "Unsupported tag for '-' operator");
235241 }
236242 return nullptr;
@@ -243,7 +249,7 @@ auto operator*(const any& lhs_, const any& rhs_) -> any {
243249 switch (lhs.tag) {
244250 case any::Tag::Integer: return lhs.i * rhs.i;
245251 case any::Tag::Double: return lhs.d * rhs.d;
246− case any::Tag::Character: return any(char(lhs.c * rhs.c));
252+ case any::Tag::Character: return decltype(lhs.c){lhs.c - rhs.c};
247253 default: assert(false && "Unsupported tag for '*' operator");
248254 }
249255 return nullptr;
@@ -256,7 +262,7 @@ auto operator/(const any& lhs_, const any& rhs_) -> any {
256262 switch (lhs.tag) {
257263 case any::Tag::Integer: return lhs.i / rhs.i;
258264 case any::Tag::Double: return lhs.d / rhs.d;
259− case any::Tag::Character: return any(char(lhs.c / rhs.c));
265+ case any::Tag::Character: return decltype(any::c){lhs.c / rhs.c};
260266 default: assert(false && "Unsupported tag for '/' operator");
261267 }
262268 return nullptr;
@@ -268,7 +274,7 @@ auto operator%(const any& lhs_, const any& rhs_) -> any {
268274 assert(lhs.tag == rhs.tag);
269275 switch (lhs.tag) {
270276 case any::Tag::Integer: return lhs.i % rhs.i;
271− case any::Tag::Character: return any(char(lhs.c % rhs.c));
277+ case any::Tag::Character: return decltype(any::c){lhs.c % rhs.c};
272278 default: assert(false && "Unsupported tag for '%' operator");
273279 }
274280 return nullptr;