re PR c++/63723 (Narrowing conversion allowed in braced init list in SFINAE context)
authorPaolo Carlini <paolo.carlini@oracle.com>
Fri, 19 Dec 2014 00:02:05 +0000 (00:02 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Fri, 19 Dec 2014 00:02:05 +0000 (00:02 +0000)
2014-12-18  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/63723
* g++.dg/cpp0x/sfinae54.C: New.

From-SVN: r218880

gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/sfinae54.C [new file with mode: 0644]

index 878a82e508cfa61ce3fac00c85e73ee5d1b663f3..87453b57fab6cc386b7ac6cb1ede1fe5e2aa237b 100644 (file)
@@ -1,3 +1,8 @@
+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
diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae54.C b/gcc/testsuite/g++.dg/cpp0x/sfinae54.C
new file mode 100644 (file)
index 0000000..f681fa7
--- /dev/null
@@ -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!");