aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae39.C
diff options
context:
space:
mode:
Diffstat (limited to 'gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae39.C')
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae39.C146
1 files changed, 146 insertions, 0 deletions
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae39.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae39.C
new file mode 100644
index 0000000..8183bda
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/sfinae39.C
@@ -0,0 +1,146 @@
+// PR c++/54191
+// { dg-do compile { target c++11 } }
+
+struct B
+{};
+
+struct D
+ : private B
+{};
+
+template<typename T>
+T &&declval();
+
+
+template<typename From, typename = decltype(B{declval<From>()})>
+constexpr bool test_braced_cast_to_base(int)
+{ return true; }
+
+template<typename>
+constexpr bool test_braced_cast_to_base(bool)
+{ return false; }
+
+static_assert(!test_braced_cast_to_base<D>(0), "");
+
+
+template<typename From, typename = decltype(D{declval<From>()})>
+constexpr bool test_braced_cast_to_derived(int)
+{ return true; }
+
+template<typename>
+constexpr bool test_braced_cast_to_derived(bool)
+{ return false; }
+
+static_assert(!test_braced_cast_to_derived<B>(0), "");
+
+
+typedef B *PB;
+
+template<typename From, typename = decltype(PB{declval<From>()})>
+constexpr bool test_braced_cast_to_ptr_to_base(int)
+{ return true; }
+
+template<typename>
+constexpr bool test_braced_cast_to_ptr_to_base(bool)
+{ return false; }
+
+static_assert(!test_braced_cast_to_ptr_to_base<D *>(0), "");
+
+
+typedef D *PD;
+
+template<typename From, typename = decltype(PD{declval<From>()})>
+constexpr bool test_braced_cast_to_ptr_to_derived(int)
+{ return true; }
+
+template<typename>
+constexpr bool test_braced_cast_to_ptr_to_derived(bool)
+{ return false; }
+
+static_assert(!test_braced_cast_to_ptr_to_derived<B *>(0), "");
+
+
+template<typename From, typename To,
+ typename = decltype(static_cast<To>(declval<From>()))>
+constexpr bool test_static_cast(int)
+{ return true; }
+
+template<typename, typename>
+constexpr bool test_static_cast(bool)
+{ return false; }
+
+static_assert(!test_static_cast<B &, D &>(0), "");
+static_assert(!test_static_cast<B *, D *>(0), "");
+
+
+template<typename From, typename To,
+ typename = decltype(dynamic_cast<To>(declval<From>()))>
+constexpr bool test_dynamic_cast(int)
+{ return true; }
+
+template<typename, typename>
+constexpr bool test_dynamic_cast(bool)
+{ return false; }
+
+static_assert(!test_dynamic_cast<D &, B &>(0), "");
+static_assert(!test_dynamic_cast<D *, B *>(0), "");
+
+
+int B::*pm = 0;
+
+template<typename T, typename = decltype(declval<T>().*pm)>
+constexpr bool test_member_ptr_dot(int)
+{ return true; }
+
+template<typename>
+constexpr bool test_member_ptr_dot(bool)
+{ return false; }
+
+static_assert(!test_member_ptr_dot<D>(0), "");
+
+
+template<typename T, typename = decltype(declval<T>()->*pm)>
+constexpr bool test_member_ptr_arrow(int)
+{ return true; }
+
+template<typename>
+constexpr bool test_member_ptr_arrow(bool)
+{ return false; }
+
+static_assert(!test_member_ptr_arrow<D *>(0), "");
+
+
+template<typename T, typename U,
+ typename = decltype(declval<T>() < declval<U>())>
+constexpr bool test_rel_op(int)
+{ return true; }
+
+template<typename, typename>
+constexpr bool test_rel_op(bool)
+{ return false; }
+
+static_assert(!test_rel_op<D *, B *>(0), "");
+
+
+template<typename T, typename U,
+ typename = decltype(declval<T>() == declval<U>())>
+constexpr bool test_eq(int)
+{ return true; }
+
+template<typename, typename>
+constexpr bool test_eq(bool)
+{ return false; }
+
+static_assert(!test_eq<D *, B *>(0), "");
+
+
+template<typename T, typename U,
+ typename = decltype(false ? declval<T>() : declval<U>())>
+constexpr bool test_cond_op(int)
+{ return true; }
+
+template<typename, typename>
+constexpr bool test_cond_op(bool)
+{ return false; }
+
+static_assert(!test_cond_op<B *, D *>(0), "");