diff options
Diffstat (limited to 'gcc/testsuite/g++.dg/cpp1y')
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/auto-fn27.C | 42 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/constexpr-array1.C | 20 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/constexpr-copy1.C | 25 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/lambda-generic-ice3.C | 3 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/lambda-generic-ice4.C | 10 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/var-templ32.C | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/var-templ33.C | 20 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/var-templ35.C | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/var-templ36.C | 15 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/var-templ37.C | 23 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/var-templ38.C | 9 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/var-templ39.C | 16 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/var-templ40.C | 9 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/var-templ42.C | 17 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/var-templ43.C | 35 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/var-templ44.C | 29 |
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(); |