This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c++/80691] New: Narrowing conversion in {} allowed in a SFINAE context
- From: "griwes at griwes dot info" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Tue, 09 May 2017 10:46:04 +0000
- Subject: [Bug c++/80691] New: Narrowing conversion in {} allowed in a SFINAE context
- Auto-submitted: auto-generated
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80691
Bug ID: 80691
Summary: Narrowing conversion in {} allowed in a SFINAE context
Product: gcc
Version: 7.1.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: griwes at griwes dot info
Target Milestone: ---
There seems to be a regression in GCC 7.1 in how the compiler treats narrowing
conversions in braced initialization, when using a user-provided constructor
for a type. The following code compiles with GCC 6.3 and several recent
versions of Clang (and some older too, if you implement void_t yourself), but
the second static_assert fails on GCC 7.1.
#include <utility>
#include <type_traits>
using std::void_t;
template<typename T, typename U, typename = void>
struct is_nonnarrowing_conversion : std::false_type {};
template<typename T, typename U>
struct is_nonnarrowing_conversion<T, U,
void_t<decltype(T{ std::declval<U>() })>> : std::true_type {};
template<typename T>
class wrapper
{
public:
wrapper(T) {}
};
static_assert(!is_nonnarrowing_conversion<int, float>());
static_assert(!is_nonnarrowing_conversion<wrapper<int>, float>());
As I read it, this explicitly violates [dcl.init.list]3.6
(http://eel.is/c++draft/dcl.init.list#3.6).