cppfront icon indicating copy to clipboard operation
cppfront copied to clipboard

[FIX] Add missing overload for `is` function to handle enums

Open filipsajdak opened this issue 2 years ago • 1 comments

The current implementation does not have an overload for the is function to handle enums.

The below code compiles by cppfront but the result code fails to compile with the cpp1 compiler.

enum class lexeme : std::uint8_t {
    hash,
};

to_string: (e:lexeme) -> auto = {
    return inspect (e) -> std::string {
        is lexeme::hash = "hash";
        is _ = "INTERNAL_ERROR";
    };
}

cppfront result

[[nodiscard]] auto to_string(cpp2::in<lexeme> e) -> auto{
    return [&] () -> std::string { auto&& __expr = (e);
        if (cpp2::is<lexeme::hash>(__expr)) { if constexpr( requires{"hash";} ) if constexpr( std::is_convertible_v<CPP2_TYPEOF("hash"),std::string> ) return "hash"; else return std::string{}; else return std::string{}; }
        else return "INTERNAL_ERROR"; }
    ()
; }

Unfortunately, there is no overload that can match using an enum value. This change provides additional overload that works with enums - it checks if the value is an enum type and if the compared value is the same type as the enum value provided.

Working prototype: https://godbolt.org/z/1c4o8qG6P

Close https://github.com/hsutter/cppfront/issues/73

filipsajdak avatar Oct 13 '22 20:10 filipsajdak

I have made a small change to the is function overload to work with various of enums. You can now compare values of two different types of enums and have a false as a return - it will compile in inspect like below:

v := lexeme::hash;

std::cout << inspect v -> std::string {
  is lexeme::hash  = "original lexeme";
  is lexeme2::hash = "fake lexeme2";
  is _             = "don't know";
} << std::endl;

and will match the proper alternative. Of course, it will also work for the lexeme2::hash value.

filipsajdak avatar Oct 14 '22 20:10 filipsajdak

I am closing it as it is also covered by https://github.com/hsutter/cppfront/pull/79

filipsajdak avatar Oct 18 '22 09:10 filipsajdak