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

            Bug ID: 92551
           Summary: accepts invalid code in function template
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: Darrell.Wright at gmail dot com
  Target Milestone: ---

I accidently produced this invalid code and it worked as intended until I
tested further.  However, the integer_sequence should never have been deduced
https://gcc.godbolt.org/z/hp4crn

This will return 20, but should be an error 

#include <algorithm>
#include <type_traits>

namespace algorithm_impl {
template <typename Function, typename... Args, size_t... Is>
constexpr void do_n(Function &&func, Args &&... args,
                    std::integer_sequence<size_t, Is...>) {
  if constexpr (sizeof...(Is) > 0) {
    (void)((func(args...), Is) + ...);
  }
}
}  // namespace algorithm_impl

template <size_t count, typename Function, typename... Args>
constexpr void do_n(Function &&func,
                    Args &&... args) noexcept(noexcept(func(args...))) {
  algorithm_impl::do_n(std::forward<Function>(func),
                       std::forward<Args>(args)...,
                       std::make_integer_sequence<size_t, count>{});
}

constexpr int do_n_1_test() {
  int n = 0;
  do_n<20>([&n] { ++n; });
  return n;
}

int main() { return do_n_1_test(); }

Reply via email to