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

            Bug ID: 106398
           Summary: ICE in finish_expr_stmt at cp/semantics.c:872 for
                    lambda with conditional noexcept against lambda in
                    unevaluated context
           Product: gcc
           Version: 12.1.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: jbassett271 at gmail dot com
  Target Milestone: ---

This ICEs:

#define FWD(...) static_cast<decltype(__VA_ARGS__)&&>(__VA_ARGS__)

template <bool B>
struct bool_t { static constexpr bool value = B; };

template <typename T>
struct set {
  bool contains(T const&) const { return true; }
};

template <typename T>
void intersect(set<T> const& lhs, set<T> const& rhs) {
  auto f = [&]<typename T1>(T1&& _1) noexcept(decltype([] {
      return bool_t<noexcept(rhs.contains(_1))>{};
  }(FWD(_1)))::value) {
      return rhs.contains(_1);
  };
  f(1);
}

int main() 
{
    set<int> a, b;
    intersect(a, b);
}


#define FWD(...) static_cast<decltype(__VA_ARGS__)&&>(__VA_ARGS__)

template <bool B>
struct bool_t { static constexpr bool value = B; };

template <typename T>
struct set {
  bool contains(T const&) const { return true; }
};

template <typename T>
void intersect(set<T> const& lhs, set<T> const& rhs) {
  auto f = [&]<typename T1>(T1&& _1) noexcept(decltype([] {
      return bool_t<noexcept(rhs.contains(_1))>{};
  }(FWD(_1)))::value) {
      return rhs.contains(_1);
  };
  f(1);
}

int main() 
{
    set<int> a, b;
    intersect(a, b);
}


#define FWD(...) static_cast<decltype(__VA_ARGS__)&&>(__VA_ARGS__)

template <bool B>
struct bool_t { static constexpr bool value = B; };

template <typename T>
struct set {
  bool contains(T const&) const { return true; }
};

template <typename T>
void intersect(set<T> const& lhs, set<T> const& rhs) {
  auto f = [&]<typename T1>(T1&& _1) noexcept(decltype([] {
      return bool_t<noexcept(rhs.contains(_1))>{};
  }(FWD(_1)))::value) {
      return rhs.contains(_1);
  };
  f(1);
}

int main() 
{
    set<int> a, b;
    intersect(a, b);
}


#define FWD(...) static_cast<decltype(__VA_ARGS__)&&>(__VA_ARGS__)

template <bool B>
struct bool_t { static constexpr bool value = B; };

template <typename T>
struct set {
  bool contains(T const&) const { return true; }
};

template <typename T>
void intersect(set<T> const& lhs, set<T> const& rhs) {
  auto f = [&]<typename T1>(T1&& _1) noexcept(decltype([] {
      return bool_t<noexcept(rhs.contains(_1))>{};
  }(FWD(_1)))::value) {
      return rhs.contains(_1);
  };
  f(1);
}

int main() 
{
    set<int> a, b;
    intersect(a, b);
}

#define FWD(...) static_cast<decltype(__VA_ARGS__)&&>(__VA_ARGS__)

template <bool B>
struct bool_t { static constexpr bool value = B; };

template <typename T>
struct set {
  bool contains(T const&) const { return true; }
};

template <typename T>
void intersect(set<T> const& lhs, set<T> const& rhs) {
  auto f = [&]<typename T1>(T1&& _1) noexcept(decltype([] {
      return bool_t<noexcept(rhs.contains(_1))>{};
  }(FWD(_1)))::value) {
      return rhs.contains(_1);
  };
  f(1);
}

int main() 
{
    set<int> a, b;
    intersect(a, b);
}


https://godbolt.org/z/hPYP8s9W7

I've seen this ICE on several versions of GCC, including 11.1.0, 10.3.0, and
this 12.1.1.

This is possibly https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105692, but I
don't know enough to deduplicate.

This may be related to https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101043.

Reply via email to