annotate gcc/testsuite/g++.dg/expr/composite-ptr-type.C @ 152:2b5abeee2509

update gcc11
author anatofuz
date Mon, 25 May 2020 07:50:57 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
152
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1 // DR 1512
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
2 // Test the composite pointer type of two operands.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
3 // { dg-do compile { target c++11 } }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
4
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
5 using nullptr_t = decltype(nullptr);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
6
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
7 template <class T, class U> struct same;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
8 template <class T> struct same<T,T> { };
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
9
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
10 template<typename T>
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
11 T fn ()
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
12 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
13 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
14
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
15 // Check that the composite pointer type of T and U is RES.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
16 template<typename T, typename U, typename RES>
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
17 void test ()
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
18 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
19 same<decltype(true ? fn<T>() : fn<U>()), RES> s;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
20 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
21
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
22 struct A { };
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
23 struct B : A { };
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
24
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
25 // Test [expr.type]/3.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
26 void
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
27 foo ()
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
28 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
29 // if both p1 and p2 are null pointer constants -> std::nullptr_­t.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
30 test<nullptr_t, nullptr_t, nullptr_t>();
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
31
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
32 // if either p1 or p2 is a null pointer constant -> T2 or T1.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
33 test<nullptr_t, const char **, const char **>();
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
34 test<const char **, nullptr_t, const char **>();
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
35
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
36 // if T1 or T2 is 'pointer to cv1 void' and the other type is 'pointer
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
37 // to cv2 T', where T is an object type or void -> 'pointer to cv12 void',
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
38 // where cv12 is the union of cv1 and cv2.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
39 test<const int *, volatile void *, const volatile void *>();
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
40 test<const void *, volatile int *, const volatile void *>();
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
41
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
42 test<int *, const int *, const int *>();
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
43 // Make sure that we propagate 'const' here as per [conv.qual]/3.3.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
44 test<int **, const int **, const int *const *>();
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
45 test<int *volatile *, const int **, const int *const volatile *>();
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
46 test<int **, volatile int **, volatile int *const *>();
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
47
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
48 // if T1 is 'pointer to cv1 C1' and T2 is 'pointer to cv2 C2', where C1 is
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
49 // reference-related to C2 or C2 is reference-related to C1 -> the cv-combined
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
50 // type of T1 and T2 or the cv-combined type of T2 and T1, respectively.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
51 test<const A*, volatile B*, const volatile A *>();
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
52 test<const B*, volatile A*, const volatile A *>();
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
53
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
54 test<const int *A::*, volatile int *A::*, const volatile int *const A::*>();
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
55 // FIXME: This doesn't work if they're reference-related but not same.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
56 //test<const int *A::*, volatile int *B::*, const volatile int *const B::*>();
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
57 //test<const int *B::*, volatile int *A::*, const volatile int *const B::*>();
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
58
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
59 // if T1 or T2 is 'pointer to noexcept function' and the other type is
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
60 // 'pointer to function', where the function types are otherwise the same
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
61 // -> 'pointer to function'.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
62 test<int (*)() noexcept, int (*)(), int (*)()>();
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
63 test<int (*)(), int (*)() noexcept, int (*)()>();
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
64
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
65 // if T1 or T2 is 'pointer to member of C1 of type function', the other type
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
66 // is 'pointer to member of C2 of type noexcept function', and C1 is
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
67 // reference-related to C2 or C2 is reference-related to C1, where the
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
68 // function types are otherwise the same -> 'pointer to member of C2 of type
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
69 // function' or 'pointer to member of C1 of type function', respectively.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
70 test<int (A::*)() noexcept, int (A::*)(), int (A::*)()>();
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
71 test<int (A::*)(), int (A::*)() noexcept, int (A::*)()>();
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
72 }