summaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.dg/cpp1y
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite/g++.dg/cpp1y')
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/auto-fn27.C42
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/constexpr-array1.C20
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/constexpr-copy1.C25
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/lambda-generic-ice3.C3
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/lambda-generic-ice4.C10
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/var-templ32.C7
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/var-templ33.C20
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/var-templ35.C5
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/var-templ36.C15
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/var-templ37.C23
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/var-templ38.C9
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/var-templ39.C16
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/var-templ40.C9
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/var-templ42.C17
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/var-templ43.C35
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/var-templ44.C29
16 files changed, 285 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/cpp1y/auto-fn27.C b/gcc/testsuite/g++.dg/cpp1y/auto-fn27.C
new file mode 100644
index 0000000000..c9291c2b8e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/auto-fn27.C
@@ -0,0 +1,42 @@
+// PR c++/66919
+// { dg-do compile { target c++14 } }
+
+template <int>
+struct A {
+ template <typename F, typename R, typename T>
+ static auto run (F fn, R, T) { auto r = fn (); } // { dg-error "" }
+};
+template <typename F, typename T>
+auto foo (F fn, T)
+{
+ A <0>::run (fn, 0, 0);
+}
+struct B;
+struct C {
+ typedef B D;
+};
+struct E {
+ virtual void bar (const int &);
+};
+template <typename C>
+struct F : E {
+ typedef typename C::D::G G;
+ void bar (const G &);
+ typename C::D::H I;
+};
+struct J { struct K {}; };
+template <typename T>
+void
+F<T>::bar (const G &)
+{
+ auto s = I;
+ typedef decltype (s) L;
+ auto u =[&](L) { auto t = foo (J::K (), 0); }; // { dg-error "" }
+}
+struct B {
+ typedef int G;
+ typedef int H;
+};
+struct M : F <C> {
+ M () {}
+};
diff --git a/gcc/testsuite/g++.dg/cpp1y/constexpr-array1.C b/gcc/testsuite/g++.dg/cpp1y/constexpr-array1.C
new file mode 100644
index 0000000000..efe4617c9e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/constexpr-array1.C
@@ -0,0 +1,20 @@
+// PR c++/67104
+// { dg-do compile { target c++14 } }
+
+template <typename T, int N> struct array
+{
+ constexpr T &operator[](int index) { return data[index]; }
+ constexpr T operator[](int index) const { return data[index]; }
+ T data[N];
+};
+
+constexpr array<long unsigned, 1001>
+make_bottle_count ()
+{
+ array<long unsigned, 1001> a{};
+ a[65] = 1;
+ return a;
+}
+
+constexpr auto bottle_count = make_bottle_count ();
+static_assert (bottle_count[65], "");
diff --git a/gcc/testsuite/g++.dg/cpp1y/constexpr-copy1.C b/gcc/testsuite/g++.dg/cpp1y/constexpr-copy1.C
new file mode 100644
index 0000000000..ce0c12d729
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/constexpr-copy1.C
@@ -0,0 +1,25 @@
+// PR c++/67813
+// { dg-do compile { target c++14 } }
+
+struct Ptr {
+ int* p;
+
+ constexpr Ptr(int* p) noexcept : p{p} {}
+ constexpr int& operator*() const {
+ return *p;
+ }
+};
+
+constexpr int f(int& i) {
+ //Ptr first{&i}; // Works.
+ Ptr first = &i; // Error
+ return *first;
+}
+
+constexpr int g() {
+ int i = 42;
+ return f(i);
+}
+
+#define SA(X) static_assert((X), #X)
+SA(g() == 42);
diff --git a/gcc/testsuite/g++.dg/cpp1y/lambda-generic-ice3.C b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-ice3.C
new file mode 100644
index 0000000000..51e7a3f21d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-ice3.C
@@ -0,0 +1,3 @@
+// PR c++/66533
+// { dg-do compile { target c++14 } }
+auto a([](auto) -> decltype((void)0) {});
diff --git a/gcc/testsuite/g++.dg/cpp1y/lambda-generic-ice4.C b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-ice4.C
new file mode 100644
index 0000000000..ec4db83b6e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-ice4.C
@@ -0,0 +1,10 @@
+// PR c++/67369
+// { dg-do compile { target c++14 } }
+
+int main() {
+ unsigned const nsz = 0;
+ auto repeat_conditional = [&](auto) {
+ auto new_sz = nsz;
+ };
+ repeat_conditional(1);
+}
diff --git a/gcc/testsuite/g++.dg/cpp1y/var-templ32.C b/gcc/testsuite/g++.dg/cpp1y/var-templ32.C
new file mode 100644
index 0000000000..80077a16b5
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/var-templ32.C
@@ -0,0 +1,7 @@
+// { dg-do compile { target c++14 } }
+
+template<typename T>
+bool V1 = true;
+
+template<typename T>
+bool V1<int> = false; // { dg-error "primary template|not deducible" }
diff --git a/gcc/testsuite/g++.dg/cpp1y/var-templ33.C b/gcc/testsuite/g++.dg/cpp1y/var-templ33.C
new file mode 100644
index 0000000000..53c6db2b97
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/var-templ33.C
@@ -0,0 +1,20 @@
+// Test for variable templates in pack expansion
+// { dg-do compile { target c++14 } }
+
+template <int I> const int Val = I;
+
+constexpr int f () { return 0; }
+template <class T, class ...Ts>
+constexpr int f(T t, Ts... ts)
+{
+ return t + f(ts...);
+}
+
+template <int... Is>
+constexpr int g()
+{
+ return f(Val<Is>...);
+}
+
+#define SA(X) static_assert((X),#X)
+SA((g<1,2,3,4>() == 1+2+3+4));
diff --git a/gcc/testsuite/g++.dg/cpp1y/var-templ35.C b/gcc/testsuite/g++.dg/cpp1y/var-templ35.C
new file mode 100644
index 0000000000..5ed0abca4b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/var-templ35.C
@@ -0,0 +1,5 @@
+// PR c++/66595
+// { dg-do compile { target c++14 } }
+
+template<typename T> int typeID{42};
+template<typename T> double typeID<double>{10.10}; // { dg-error "primary template|redeclaration|not deducible" }
diff --git a/gcc/testsuite/g++.dg/cpp1y/var-templ36.C b/gcc/testsuite/g++.dg/cpp1y/var-templ36.C
new file mode 100644
index 0000000000..760e36fca4
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/var-templ36.C
@@ -0,0 +1,15 @@
+// { dg-do compile { target c++14 } }
+
+template <class T>
+constexpr T v = T();
+
+template <class T>
+constexpr T v<T*> = T();
+
+template <class T>
+struct A {
+ static constexpr decltype (v<T>) v = ::v<T>;
+};
+
+double d1 = v<double*>;
+double d2 = A<double*>::v;
diff --git a/gcc/testsuite/g++.dg/cpp1y/var-templ37.C b/gcc/testsuite/g++.dg/cpp1y/var-templ37.C
new file mode 100644
index 0000000000..11021a3f5b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/var-templ37.C
@@ -0,0 +1,23 @@
+// PR c++/65195
+// { dg-do compile { target c++14 } }
+
+template<typename T>
+T constant {};
+
+template<typename T>
+struct foo {
+ int operator()() const
+ { return 3; }
+};
+
+template<typename T>
+auto& f = constant<foo<T>>;
+
+int main()
+{
+ // fine
+ auto& ref = f<int>; ref();
+
+ // error: f<int> cannot be used as a function
+ f<int>();
+}
diff --git a/gcc/testsuite/g++.dg/cpp1y/var-templ38.C b/gcc/testsuite/g++.dg/cpp1y/var-templ38.C
new file mode 100644
index 0000000000..1fd76d38d4
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/var-templ38.C
@@ -0,0 +1,9 @@
+// PR c++/66596
+// { dg-do compile { target c++14 } }
+
+struct U { void f() {} };
+struct V { void f() {} };
+template<class T> U t;
+template<> V t<int>;
+template<class T> void g() { t<T>.f(); }
+int main() { g<int>(); }
diff --git a/gcc/testsuite/g++.dg/cpp1y/var-templ39.C b/gcc/testsuite/g++.dg/cpp1y/var-templ39.C
new file mode 100644
index 0000000000..e06519d548
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/var-templ39.C
@@ -0,0 +1,16 @@
+// PR c++/66260
+// { dg-do compile { target c++14 } }
+
+template <class>
+constexpr bool foo = false;
+template <>
+constexpr bool foo<int> = true;
+template <class T, int N>
+constexpr bool foo<T[N]> = foo<T>;
+
+static_assert(foo<int>, "");
+static_assert(!foo<double>, "");
+static_assert(foo<int[3]>, "");
+static_assert(!foo<double[3]>, "");
+static_assert(foo<int[2][5][3]>, "");
+static_assert(!foo<double[2][5][3]>, "");
diff --git a/gcc/testsuite/g++.dg/cpp1y/var-templ40.C b/gcc/testsuite/g++.dg/cpp1y/var-templ40.C
new file mode 100644
index 0000000000..0a952c4806
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/var-templ40.C
@@ -0,0 +1,9 @@
+// PR c++/66619
+// { dg-do compile { target c++14 } }
+
+int y;
+template<class T> T val1 = y;
+auto&& x1 = val1<int&>;
+
+template<class T> T val2 = 0;
+auto&& x2 = val2<int&&>;
diff --git a/gcc/testsuite/g++.dg/cpp1y/var-templ42.C b/gcc/testsuite/g++.dg/cpp1y/var-templ42.C
new file mode 100644
index 0000000000..a43149d9b5
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/var-templ42.C
@@ -0,0 +1,17 @@
+// PR c++/67131
+// { dg-do compile { target c++14 } }
+
+template <typename T> typename T::_ type;
+template <template <typename...> class> struct A;
+template <template <typename> class f> A<f> metafunction;
+namespace detail {
+template <typename> struct _decltype;
+}
+template <template <typename...> class F> struct A {
+ template <typename... T>
+ auto operator()() -> decltype(type<F<detail::_decltype<T>...>>);
+};
+template <typename F> auto valid_call(F f) -> decltype(f());
+constexpr auto valid_call(...) { return 0; }
+template <typename> struct no_type;
+static_assert(!valid_call(metafunction<no_type>),""); // { dg-error "" }
diff --git a/gcc/testsuite/g++.dg/cpp1y/var-templ43.C b/gcc/testsuite/g++.dg/cpp1y/var-templ43.C
new file mode 100644
index 0000000000..414802fd6c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/var-templ43.C
@@ -0,0 +1,35 @@
+// PR c++/67130
+// { dg-do compile { target c++14 } }
+
+namespace std {
+template <typename> struct __success_type;
+template <typename> void declval();
+template <typename> class decay {
+public:
+ typedef int type;
+};
+template <typename...> struct common_type;
+struct A {
+ template <typename, typename _Up>
+ static __success_type<typename decay<decltype(declval<_Up>)>::type> _S_test;
+};
+template <typename _Tp, typename _Up> struct __common_type_impl : A {
+ typedef decltype(_S_test<_Tp, _Up>) type;
+};
+template <typename _Tp, typename _Up>
+struct common_type<_Tp, _Up> : __common_type_impl<_Tp, _Up> {};
+}
+template <typename> struct B { struct _; };
+template <typename T> typename B<T>::_ type;
+template <template <typename...> class> struct C;
+template <template <typename...> class f> C<f> metafunction;
+template <typename T> struct B<T>::_ {};
+namespace detail {
+template <typename> struct _decltype;
+}
+template <template <typename...> class F> struct C {
+ template <typename... T>
+ auto operator()(T...)
+ -> decltype(type<typename F<detail::_decltype<T>...>::type>);
+};
+auto common_type = metafunction<std::common_type>(0, 0);
diff --git a/gcc/testsuite/g++.dg/cpp1y/var-templ44.C b/gcc/testsuite/g++.dg/cpp1y/var-templ44.C
new file mode 100644
index 0000000000..2fc21a5063
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/var-templ44.C
@@ -0,0 +1,29 @@
+// PR c++/67161
+// { dg-do compile { target c++14 } }
+
+template <typename _Tp> struct integral_constant {
+ static constexpr _Tp value = 0;
+};
+template <bool, typename, typename> struct conditional;
+template <typename...> struct __or_;
+template <typename _B1, typename _B2>
+struct __or_<_B1, _B2> : conditional<1, _B1, _B2>::type {};
+template <typename...> struct __and_;
+template <typename> struct __not_ : integral_constant<bool> {};
+template <typename> struct __is_void_helper : integral_constant<bool> {};
+template <typename> struct is_void : __is_void_helper<int> {};
+template <bool, typename _Iftrue, typename> struct conditional {
+ typedef _Iftrue type;
+};
+template <bool _Cond, typename _Iftrue, typename _Iffalse>
+using conditional_t = typename conditional<_Cond, _Iftrue, _Iffalse>::type;
+template <typename...> using common_type_t = int;
+template <typename, int> struct array {};
+template <typename _Tp> constexpr int is_void_v = is_void<_Tp>::value;
+template <typename _Dest = void, typename... _Types>
+constexpr auto make_array()
+ -> array<conditional_t<is_void_v<_Dest>, common_type_t<>, _Dest>,
+ sizeof...(_Types)> {
+ static_assert(__or_<__not_<is_void<_Dest>>, __and_<>>::value, ""); // { dg-error "static assert" }
+}
+auto d = make_array();