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

--- Comment #3 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
Reduced all the way:
```
template <typename _Tp> struct remove_reference {
  using type = __remove_reference(_Tp);
};
template <typename _Tp>
using remove_reference_t = typename remove_reference<_Tp>::type;
template <typename _Tp, typename _Up>
inline constexpr bool is_same_v = __is_same(_Tp, _Up);

template <typename _Key> class s3 {
public:
  template <typename _Up, typename _Vp = remove_reference_t<_Up>>
  static constexpr bool __usable_key = is_same_v<const _Vp, const _Key>;
  template <typename _Args> void f(_Args __args, int t) {
    if constexpr (__usable_key<_Args>) {
      const _Key &__k = __args;
    }
  }
};
struct s0 {};
struct s1 {};
s1 g();
void createMember(int member, s3<s0> &children) { children.f(g(), member); }

```

Or if using the internal type_traits is bad idea here is better testcase:
```

#include <type_traits>

using namespace std;

template <typename _Key> class s3 {
public:
  template <typename _Up, typename _Vp = remove_reference_t<_Up>>
  static constexpr bool __usable_key = is_same_v<const _Vp, const _Key>;
  template <typename _Args> void f(_Args __args, int t) {
    if constexpr (__usable_key<_Args>) {
      const _Key &__k = __args;
    }
  }
};
struct s0 {};
struct s1 {};
s1 g();
void createMember(int member, s3<s0> &children) { children.f(g(), member); }
```

Here is a testcase using static assert rather than if constexpr:
```
#include <type_traits>

using namespace std;

template <typename _Key> class s3 {
public:
  template <typename _Up, typename _Vp = remove_reference_t<_Up>>
  static constexpr bool __usable_key = is_same_v<const _Vp, const _Key>;
  template <typename _Args> void f(_Args __args, int t) {
    static_assert(!__usable_key<_Args>);
  }
};
struct s0 {};
struct s1 {};
s1 g();
void createMember(int member, s3<s0> &children) { children.f(g(), member); }
```

Reply via email to