aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.dg/cpp2a/concepts-ts1.C
blob: b819ad4a1a2bddc105faa9a61c93992337fa1dfd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
// { dg-do compile { target c++2a } }
// { dg-additional-options "-fconcepts-ts" }

// This tests the terse notation.

template<typename T>
concept True = true;

template<typename T>
concept False = false;

template<typename T, typename U>
concept SameAs = __is_same_as(T, U);

True x1 = 0;
False x2 = 0; // { dg-error "deduced initializer does not satisfy" }

void f1(True t) { }
void f2(False t) { }
void f3(SameAs<int> q) { }
void f4(True a, SameAs<decltype(a)> b) { }

True f5() { return 0; }
False f6() { return 0; } // { dg-error "deduced return type" }
SameAs<int> f7() { return 0; }
SameAs<int> f8() { return 'a'; } // { dg-error "deduced return type" }
auto f9() -> True { return 0; }
auto f10() -> False { return 0; } // { dg-error "deduced return type" }
auto f11() -> SameAs<int> { return 0; }
auto f12() -> SameAs<char> { return 0; } // { dg-error "deduced return type" }
auto f13(int n) -> SameAs<decltype(n)> { return n; }
auto f14(int n) -> SameAs<decltype(n)> { return 'a'; } // { dg-error "deduced return type" }
auto f15(auto x) -> SameAs<decltype(x)> { return 0; } // { dg-error "deduced return type" }

void driver()
{
  f1(0);
  f2(0); // { dg-error "cannot call" }
  f3(0);
  f3('a'); // { dg-error "cannot call" }
  f4(0, 0);
  f4(0, 'a'); // { dg-error "cannot call" }
  f15(0);
  f15('a'); // { dg-message "" }
}

template<class T> concept bool C1() { return false; }
template<C1 T> concept bool C2() { return true; } // { dg-error "cannot be constrained" }
template<C1 T> concept bool C3 = true; // { dg-error "cannot be constrained" }