https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102284

--- Comment #6 from Johel Ernesto Guerrero Peña <johelegp at gmail dot com> ---
Another example.

Simplified: https://godbolt.org/z/z781c56PM.

```C++
struct ratio {
  int numerator;
};

template<auto> struct constant;

template<auto F> concept constant_invocable = requires { typename
constant<(F(), 0)>; };

static_assert(not constant_invocable<[] {
  ratio r;
  (void)int{r.*&ratio::numerator};
}>);
```

```
<source>:9:15: error: static assertion failed
    9 | static_assert(not constant_invocable<[] {
      |               ^~~~~~~~~~~~~~~~~~~~~~~~~~~
   10 |   ratio r;
      |   ~~~~~~~~     
   11 |   (void)int{r.*&ratio::numerator};
      |   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   12 | }>);
      | ~~             
Compiler returned: 1
```

Found while opening https://github.com/llvm/llvm-project/issues/57958:
https://godbolt.org/z/KWfvEnaae.

```C++
#include <concepts>
#include <cstdint>
#include <functional>
#include <type_traits>

struct ratio {
  std::intmax_t numerator;
  std::intmax_t denominator{1};
};

template<auto F> concept constant_invocable = requires { typename
std::integral_constant<int, (F(), 0)>; };

template<auto P> requires std::is_member_object_pointer_v<decltype(P)>
inline constexpr bool default_initialization_leaves_uninitialized =
  []<class T, class M>(M T::*) {
    return not constant_invocable<[]() {
      T v;
      (void)M{v.*P};
    }>;
  }(P);

static_assert(default_initialization_leaves_uninitialized<&ratio::numerator>);
static_assert(not
default_initialization_leaves_uninitialized<&ratio::denominator>);
```

```
<source>:22:15: error: static assertion failed
   22 |
static_assert(default_initialization_leaves_uninitialized<&ratio::numerator>);
      |              
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Compiler returned: 1
```

Reply via email to