// Copyright (C) 2018-2021 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library.  This library is free
// software; you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 3, or (at your option)
// any later version.

// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License along
// with this library; see the file COPYING3.  If not see
// <http://www.gnu.org/licenses/>.

// { dg-do compile { target c++17 } }
// FIXME: Need increased timeout due to PR c++/102780
// { dg-timeout-factor 2 { target c++20 } }

#include <variant>
#include <utility>
#include <limits>

template<std::size_t I>
struct S {
};

template <std::size_t... Is>
void f_impl(std::index_sequence<Is...>)
{
	using V = std::variant<S<Is>...>;
	// For a variant of 255 alternatives the valid indices are [0,254]
	// and index 255 means valueless-by-exception, so fits in one byte.
	if constexpr (std::variant_size_v<V> <=
		      std::numeric_limits<unsigned char>::max())
	  static_assert(sizeof(V) == 2);
	else
	  static_assert(sizeof(V) > 2);
}

template <std::size_t I>
void f()
{
	f_impl(std::make_index_sequence<I>{});
}

int main()
{
	f<std::numeric_limits<unsigned char>::max() - 1>();
	f<std::numeric_limits<unsigned char>::max()>();
	f<std::numeric_limits<unsigned char>::max() + 1>();
}
