]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
2014-12-18 Paolo Carlini <paolo.carlini@oracle.com>
authorpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 19 Dec 2014 00:02:05 +0000 (00:02 +0000)
committerpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 19 Dec 2014 00:02:05 +0000 (00:02 +0000)
PR c++/63723
* g++.dg/cpp0x/sfinae54.C: New.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@218880 138bc75d-0d04-0410-961f-82ee72b054a4

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!");