Mercurial > hg > CbC > CbC_gcc
diff gcc/testsuite/g++.dg/cpp2a/concepts-decltype.C @ 145:1830386684a0
gcc-9.2.0
author | anatofuz |
---|---|
date | Thu, 13 Feb 2020 11:34:05 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gcc/testsuite/g++.dg/cpp2a/concepts-decltype.C Thu Feb 13 11:34:05 2020 +0900 @@ -0,0 +1,67 @@ +// { dg-do compile { target c++2a } } + +// Tests constrained decltype(auto). + +template<typename T> +concept Type = true; + +template<typename T> +concept Int = __is_same_as(T, int); + +template<typename T, typename U> +concept SameAs = __is_same_as(T, U); + +template<typename T, typename U> + requires SameAs<T, U> +constexpr bool check = true; + +int z = 0; +const int cz = 0; + +Type decltype(auto) x1 = 0; +static_assert(check<decltype(x1), int>); +Type decltype(auto) x2 = z; +static_assert(check<decltype(x2), int>); +Type decltype(auto) x3 = (z); +static_assert(check<decltype(x3), int&>); +Type decltype(auto) x4 = cz; +static_assert(check<decltype(x4), const int>); +Type decltype(auto) x5 = (cz); +static_assert(check<decltype(x5), const int&>); + +Type decltype(auto) f1() { return 0; } +static_assert(check<decltype(f1()), int>); +Type decltype(auto) f2() { return z; } +static_assert(check<decltype(f2()), int>); +Type decltype(auto) f3() { return (z); } +static_assert(check<decltype(f3()), int&>); +Type decltype(auto) f4() { return cz; } +static_assert(check<decltype(f4()), int>); // Top-level const is removed? +Type decltype(auto) f5() { return (cz); } +static_assert(check<decltype(f5()), const int&>); + +bool b = true; +const bool cb = true; + +Int decltype(auto) b1 = true; // { dg-error "deduced initializer" } +Int decltype(auto) b2 = (b); // { dg-error "deduced initializer" } +Int decltype(auto) b3 = (cb); // { dg-error "deduced initializer" } + +Int decltype(auto) g1() { } // { dg-error "deduced return type" } +Int decltype(auto) g2() { return; } // { dg-error "deduced return type" } +Int decltype(auto) g3() { return true; } // { dg-error "deduced return type" } +int g4(Type decltype(auto) x) { return 0; } // { dg-error "cannot declare" } +int g5(decltype(auto) x) { return 0; } // { dg-error "cannot declare" } + +template<Type decltype(auto) X, typename T> + requires SameAs<decltype(X), T> +constexpr bool deduced_as = true; + +constexpr int Z = 10; + +static_assert(deduced_as<0, int>); +static_assert(deduced_as<0, int&>); // { dg-error "invalid variable template" } +static_assert(deduced_as<Z, const int>); +static_assert(deduced_as<(Z), const int>); // { dg-error "invalid variable template" } +static_assert(deduced_as<(Z), const int&>); +