aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPaolo Carlini <paolo.carlini@oracle.com>2014-12-19 00:02:05 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2014-12-19 00:02:05 +0000
commitac1a984a5f45df2273bb58445378bc8ecff18564 (patch)
tree489f3fdeedf6636c21b3176f6bce9d56e4a17fc4 /gcc
parent90f6debee40951552f873164d332f7a46b1007df (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/sfinae54.C41
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!");