diff options
author | Paolo Carlini <paolo.carlini@oracle.com> | 2014-12-19 00:02:05 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2014-12-19 00:02:05 +0000 |
commit | ac1a984a5f45df2273bb58445378bc8ecff18564 (patch) | |
tree | 489f3fdeedf6636c21b3176f6bce9d56e4a17fc4 /gcc | |
parent | 90f6debee40951552f873164d332f7a46b1007df (diff) | |
download | gcc-ac1a984a5f45df2273bb58445378bc8ecff18564.zip gcc-ac1a984a5f45df2273bb58445378bc8ecff18564.tar.gz gcc-ac1a984a5f45df2273bb58445378bc8ecff18564.tar.bz2 |
re PR c++/63723 (Narrowing conversion allowed in braced init list in SFINAE context)
2014-12-18 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/63723
* g++.dg/cpp0x/sfinae54.C: New.
From-SVN: r218880
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/sfinae54.C | 41 |
2 files changed, 46 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 878a82e..87453b5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2014-12-18 Paolo Carlini <paolo.carlini@oracle.com> + PR c++/63723 + * g++.dg/cpp0x/sfinae54.C: New. + +2014-12-18 Paolo Carlini <paolo.carlini@oracle.com> + PR c++/59204 * g++.dg/cpp0x/sfinae53.C: New. diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae54.C b/gcc/testsuite/g++.dg/cpp0x/sfinae54.C new file mode 100644 index 0000000..f681fa7 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/sfinae54.C @@ -0,0 +1,41 @@ +// PR c++/63723 +// { dg-do compile { target c++11 } } + +template<typename Tp> Tp declval(); + +template<typename Tp, Tp v> +struct integral_constant +{ + static constexpr Tp value = v; + typedef Tp value_type; + typedef integral_constant<Tp, v> type; + constexpr operator value_type() const { return value; } +}; + +typedef integral_constant<bool, true> true_type; +typedef integral_constant<bool, false> false_type; + +template <typename From, typename To> +class is_list_convertible_helper +{ + template <typename To2> + static void requires_conversion(To2 t); + + template <typename From2, typename To2, + typename = decltype(requires_conversion<To2>({declval<From2>()}))> + static true_type helper(int); + + template <typename From2, typename To2> + static false_type helper(...); + +public: + using type = decltype(helper<From, To>(0)); +}; + +template <typename From, typename To> +class is_list_convertible + : public is_list_convertible_helper<From, To>::type +{ }; + +static_assert(!is_list_convertible<double, int>::value, + "double -> int is narrowing!"); |