Issue 141563
Summary consteval and constexpr static variable do not work well together
Labels new issue
Assignees
Reporter fekir
    Consider following example

----
#include <iostream>
#include <string_view>

#define USECONSTEVAL
#ifdef USECONSTEVAL
#define CEXPR consteval
#else
#define CEXPR constexpr
#endif

CEXPR std::string_view name(){
    return __PRETTY_FUNCTION__;
}

CEXPR std::string_view name2(){
  constexpr auto function = std::string_view(__PRETTY_FUNCTION__);
  constexpr static auto value = [] <std::size_t...Idxs>(std::string_view str, std::index_sequence<Idxs...>)
  {
    return std::array{str[Idxs]..., '\0'};
  }(function, std::make_index_sequence<function.size()>{});
 static_assert(!std::string_view(value).empty());
  return std::string_view(value);
}


template <std::size_t...Idxs>
constexpr auto substring_as_array(std::string_view str, std::index_sequence<Idxs...>)
{
  return std::array{str[Idxs]..., '\0'};
}

CEXPR std::string_view name3(){
  constexpr auto function = std::string_view(__PRETTY_FUNCTION__);
  constexpr static auto value = substring_as_array(function, std::make_index_sequence<function.size()>{});
 static_assert(!std::string_view(value).empty());
  return std::string_view(value);
}

struct helper {
  static constexpr std::string_view value = name();
};
CEXPR std::string_view name4(){
 constexpr auto value = helper::value;
  return std::string_view{value.data(), value.size()};
}

int main(){
 static_assert(not name().empty());
    std::cout << "__PRETTY_FUNCTION__: \"" << name() << "\"\n";
    static_assert(not name2().empty());
 std::cout << "__PRETTY_FUNCTION__: \"" << name2() << "\"\n";
 static_assert(not name3().empty());
    std::cout << "__PRETTY_FUNCTION__: \"" << name3() << "\"\n";
    static_assert(not name4().empty());
 std::cout << "__PRETTY_FUNCTION__: \"" << name4() << "\"\n";
}
----


by toggling the macro `USECONSTEVAL`, the output of this sample program changes from

----
__PRETTY_FUNCTION__: "std::string_view name()"
__PRETTY_FUNCTION__: "std::string_view name2()"
__PRETTY_FUNCTION__: "std::string_view name3()"
__PRETTY_FUNCTION__: "std::string_view name()"
----


to

----
__PRETTY_FUNCTION__: "std::string_view name()"
__PRETTY_FUNCTION__: ""
__PRETTY_FUNCTION__: ""
__PRETTY_FUNCTION__: "std::string_view name()"
----


To the best of my knowledge, there is no reason why `consteval` instead of `constexpr` should change the meaning of the functions `name2` and `name3`.

Confusingly, none of the `static_assert` that check for emptiness fail, even when the return value is in fact empty.


In case it is relevant, GCC is not affected by this issue, the behavior between `constexpr` and `consteval` is consistent
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to