Skip to content

Commit d3dc7d0

Browse files
committed
[Sema][NFC] Improve test coverage of builtin operators.
In preparation for D112453. Fix numbering of tests for [over.built]: 15->16, 16->17.
1 parent 8720149 commit d3dc7d0

File tree

13 files changed

+355
-143
lines changed

13 files changed

+355
-143
lines changed

clang/test/CXX/over/over.built/p7-ast.cpp renamed to clang/test/CXX/over/over.built/ast.cpp

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
struct A{};
44

5-
template <typename T>
6-
auto Test(T* pt) {
5+
template <typename T, typename U>
6+
auto Test(T* pt, U* pu) {
77
// CHECK: UnaryOperator {{.*}} '<dependent type>' prefix '*'
88
// CHECK-NEXT: DeclRefExpr {{.*}} 'T *' lvalue ParmVar {{.*}} 'pt' 'T *'
99
(void)*pt;
@@ -24,7 +24,18 @@ auto Test(T* pt) {
2424
// CHECK: BinaryOperator {{.*}} '<dependent type>' '-'
2525
// CHECK-NEXT: DeclRefExpr {{.*}} 'T *' lvalue ParmVar {{.*}} 'pt' 'T *'
2626
// CHECK-NEXT: DeclRefExpr {{.*}} 'T *' lvalue ParmVar {{.*}} 'pt' 'T *'
27-
(void)(pt -pt);
27+
(void)(pt - pt);
28+
29+
// CHECK: BinaryOperator {{.*}} '<dependent type>' '-'
30+
// CHECK-NEXT: DeclRefExpr {{.*}} 'T *' lvalue ParmVar {{.*}} 'pt' 'T *'
31+
// CHECK-NEXT: DeclRefExpr {{.*}} 'U *' lvalue ParmVar {{.*}} 'pu' 'U *'
32+
(void)(pt - pu);
33+
34+
// CHECK: BinaryOperator {{.*}} '<dependent type>' '=='
35+
// CHECK-NEXT: DeclRefExpr {{.*}} 'T *' lvalue ParmVar {{.*}} 'pt' 'T *'
36+
// CHECK-NEXT: DeclRefExpr {{.*}} 'U *' lvalue ParmVar {{.*}} 'pu' 'U *'
37+
(void)(pt == pu);
38+
2839
}
2940

3041

Lines changed: 9 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1,75 +1,12 @@
11
// RUN: %clang_cc1 -std=c++11 -verify %s -Wno-tautological-compare
22

3-
struct A { operator decltype(nullptr)(); }; // expected-note 16{{implicitly converted}}
4-
struct B { operator const int *(); }; // expected-note 8{{implicitly converted}}
5-
void f(A a, B b, volatile int *pi) {
6-
(void)(a == a);
7-
(void)(a != a);
8-
(void)(a < a); // expected-error {{invalid operands}}
9-
(void)(a > a); // expected-error {{invalid operands}}
10-
(void)(a <= a); // expected-error {{invalid operands}}
11-
(void)(a >= a); // expected-error {{invalid operands}}
12-
13-
(void)(a == b);
14-
(void)(a != b);
15-
(void)(a < b); // expected-error {{invalid operands}}
16-
(void)(a > b); // expected-error {{invalid operands}}
17-
(void)(a <= b); // expected-error {{invalid operands}}
18-
(void)(a >= b); // expected-error {{invalid operands}}
19-
20-
(void)(b == a);
21-
(void)(b != a);
22-
(void)(b < a); // expected-error {{invalid operands}}
23-
(void)(b > a); // expected-error {{invalid operands}}
24-
(void)(b <= a); // expected-error {{invalid operands}}
25-
(void)(b >= a); // expected-error {{invalid operands}}
26-
27-
(void)(a == pi);
28-
(void)(a != pi);
29-
(void)(a < pi); // expected-error {{invalid operands}}
30-
(void)(a > pi); // expected-error {{invalid operands}}
31-
(void)(a <= pi); // expected-error {{invalid operands}}
32-
(void)(a >= pi); // expected-error {{invalid operands}}
33-
34-
(void)(pi == a);
35-
(void)(pi != a);
36-
(void)(pi < a); // expected-error {{invalid operands}}
37-
(void)(pi > a); // expected-error {{invalid operands}}
38-
(void)(pi <= a); // expected-error {{invalid operands}}
39-
(void)(pi >= a); // expected-error {{invalid operands}}
40-
41-
(void)(b == pi);
42-
(void)(b != pi);
43-
(void)(b < pi);
44-
(void)(b > pi);
45-
(void)(b <= pi);
46-
(void)(b >= pi);
47-
48-
(void)(pi == b);
49-
(void)(pi != b);
50-
(void)(pi < b);
51-
(void)(pi > b);
52-
(void)(pi <= b);
53-
(void)(pi >= b);
54-
55-
(void)(b == b);
56-
(void)(b != b);
57-
(void)(b < b);
58-
(void)(b > b);
59-
(void)(b <= b);
60-
(void)(b >= b);
61-
62-
(void)(pi == pi);
63-
(void)(pi != pi);
64-
(void)(pi < pi);
65-
(void)(pi > pi);
66-
(void)(pi <= pi);
67-
(void)(pi >= pi);
68-
}
69-
70-
// FIXME: This is wrong: the type T = 'const volatile int * const * const *'
71-
// would work here, and there exists a builtin candidate for that type.
72-
struct C { operator const int ***(); };
73-
void g(C c, volatile int ***p) {
74-
(void)(c < p); // expected-error {{invalid operands}}
3+
template <typename T, typename U>
4+
void f(int* pi, float* pf, T* pt, U* pu, T t) {
5+
(void)(pi - pi);
6+
(void)(pi - pf); // expected-error {{not pointers to compatible types}}
7+
(void)(pi - pt);
8+
(void)(pu - pi);
9+
(void)(pu - pt);
10+
(void)(pu - t);
11+
(void)(pi - t);
7512
}

clang/test/CXX/over/over.built/p16.cpp

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
// RUN: %clang_cc1 -std=c++11 -verify %s -Wno-tautological-compare
22

3-
struct A { operator decltype(nullptr)(); };
4-
struct B { operator int A::*(); };
5-
void f(A a, B b, int A::*pi) {
3+
struct A { operator decltype(nullptr)(); }; // expected-note 16{{implicitly converted}}
4+
struct B { operator const int *(); }; // expected-note 8{{implicitly converted}}
5+
void f(A a, B b, volatile int *pi) {
66
(void)(a == a);
77
(void)(a != a);
88
(void)(a < a); // expected-error {{invalid operands}}
@@ -40,36 +40,36 @@ void f(A a, B b, int A::*pi) {
4040

4141
(void)(b == pi);
4242
(void)(b != pi);
43-
(void)(b < pi); // expected-error {{invalid operands}}
44-
(void)(b > pi); // expected-error {{invalid operands}}
45-
(void)(b <= pi); // expected-error {{invalid operands}}
46-
(void)(b >= pi); // expected-error {{invalid operands}}
43+
(void)(b < pi);
44+
(void)(b > pi);
45+
(void)(b <= pi);
46+
(void)(b >= pi);
4747

4848
(void)(pi == b);
4949
(void)(pi != b);
50-
(void)(pi < b); // expected-error {{invalid operands}}
51-
(void)(pi > b); // expected-error {{invalid operands}}
52-
(void)(pi <= b); // expected-error {{invalid operands}}
53-
(void)(pi >= b); // expected-error {{invalid operands}}
50+
(void)(pi < b);
51+
(void)(pi > b);
52+
(void)(pi <= b);
53+
(void)(pi >= b);
5454

5555
(void)(b == b);
5656
(void)(b != b);
57-
(void)(b < b); // expected-error {{invalid operands}}
58-
(void)(b > b); // expected-error {{invalid operands}}
59-
(void)(b <= b); // expected-error {{invalid operands}}
60-
(void)(b >= b); // expected-error {{invalid operands}}
57+
(void)(b < b);
58+
(void)(b > b);
59+
(void)(b <= b);
60+
(void)(b >= b);
6161

6262
(void)(pi == pi);
6363
(void)(pi != pi);
64-
(void)(pi < pi); // expected-error {{invalid operands}}
65-
(void)(pi > pi); // expected-error {{invalid operands}}
66-
(void)(pi <= pi); // expected-error {{invalid operands}}
67-
(void)(pi >= pi); // expected-error {{invalid operands}}
64+
(void)(pi < pi);
65+
(void)(pi > pi);
66+
(void)(pi <= pi);
67+
(void)(pi >= pi);
6868
}
6969

70-
// FIXME: This is wrong: type T = 'const volatile int * const A::* const B::*'
70+
// FIXME: This is wrong: the type T = 'const volatile int * const * const *'
7171
// would work here, and there exists a builtin candidate for that type.
72-
struct C { operator const int *A::*B::*(); };
73-
void g(C c, volatile int *A::*B::*p) {
74-
(void)(c == p); // expected-error {{invalid operands}}
72+
struct C { operator const int ***(); };
73+
void g(C c, volatile int ***p) {
74+
(void)(c < p); // expected-error {{invalid operands}}
7575
}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
// RUN: %clang_cc1 -std=c++11 -verify %s -Wno-tautological-compare
2+
3+
struct A { operator decltype(nullptr)(); };
4+
struct B { operator int A::*(); };
5+
void f(A a, B b, int A::*pi) {
6+
(void)(a == a);
7+
(void)(a != a);
8+
(void)(a < a); // expected-error {{invalid operands}}
9+
(void)(a > a); // expected-error {{invalid operands}}
10+
(void)(a <= a); // expected-error {{invalid operands}}
11+
(void)(a >= a); // expected-error {{invalid operands}}
12+
13+
(void)(a == b);
14+
(void)(a != b);
15+
(void)(a < b); // expected-error {{invalid operands}}
16+
(void)(a > b); // expected-error {{invalid operands}}
17+
(void)(a <= b); // expected-error {{invalid operands}}
18+
(void)(a >= b); // expected-error {{invalid operands}}
19+
20+
(void)(b == a);
21+
(void)(b != a);
22+
(void)(b < a); // expected-error {{invalid operands}}
23+
(void)(b > a); // expected-error {{invalid operands}}
24+
(void)(b <= a); // expected-error {{invalid operands}}
25+
(void)(b >= a); // expected-error {{invalid operands}}
26+
27+
(void)(a == pi);
28+
(void)(a != pi);
29+
(void)(a < pi); // expected-error {{invalid operands}}
30+
(void)(a > pi); // expected-error {{invalid operands}}
31+
(void)(a <= pi); // expected-error {{invalid operands}}
32+
(void)(a >= pi); // expected-error {{invalid operands}}
33+
34+
(void)(pi == a);
35+
(void)(pi != a);
36+
(void)(pi < a); // expected-error {{invalid operands}}
37+
(void)(pi > a); // expected-error {{invalid operands}}
38+
(void)(pi <= a); // expected-error {{invalid operands}}
39+
(void)(pi >= a); // expected-error {{invalid operands}}
40+
41+
(void)(b == pi);
42+
(void)(b != pi);
43+
(void)(b < pi); // expected-error {{invalid operands}}
44+
(void)(b > pi); // expected-error {{invalid operands}}
45+
(void)(b <= pi); // expected-error {{invalid operands}}
46+
(void)(b >= pi); // expected-error {{invalid operands}}
47+
48+
(void)(pi == b);
49+
(void)(pi != b);
50+
(void)(pi < b); // expected-error {{invalid operands}}
51+
(void)(pi > b); // expected-error {{invalid operands}}
52+
(void)(pi <= b); // expected-error {{invalid operands}}
53+
(void)(pi >= b); // expected-error {{invalid operands}}
54+
55+
(void)(b == b);
56+
(void)(b != b);
57+
(void)(b < b); // expected-error {{invalid operands}}
58+
(void)(b > b); // expected-error {{invalid operands}}
59+
(void)(b <= b); // expected-error {{invalid operands}}
60+
(void)(b >= b); // expected-error {{invalid operands}}
61+
62+
(void)(pi == pi);
63+
(void)(pi != pi);
64+
(void)(pi < pi); // expected-error {{invalid operands}}
65+
(void)(pi > pi); // expected-error {{invalid operands}}
66+
(void)(pi <= pi); // expected-error {{invalid operands}}
67+
(void)(pi >= pi); // expected-error {{invalid operands}}
68+
}
69+
70+
// FIXME: This is wrong: type T = 'const volatile int * const A::* const B::*'
71+
// would work here, and there exists a builtin candidate for that type.
72+
struct C { operator const int *A::*B::*(); };
73+
void g(C c, volatile int *A::*B::*p) {
74+
(void)(c == p); // expected-error {{invalid operands}}
75+
}
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
// RUN: %clang_cc1 -std=c++11 -verify %s -Wno-tautological-compare
2+
3+
template <typename T, typename U>
4+
void f(int i, float f, bool b, int* pi, T* pt, T t) {
5+
(void)(i % 3);
6+
(void)(f % 3); // expected-error {{invalid operands}}
7+
(void)(b % 3);
8+
(void)(pi % 3); // expected-error {{invalid operands}}
9+
(void)(pt % 3); // FIXME
10+
(void)(t % 3);
11+
(void)(3 % i);
12+
(void)(3 % f); // expected-error {{invalid operands}}
13+
(void)(3 % b);
14+
(void)(3 % pi); // expected-error {{invalid operands}}
15+
(void)(3 % pt); // FIXME
16+
(void)(3 % t);
17+
18+
(void)(i & 3);
19+
(void)(f & 3); // expected-error {{invalid operands}}
20+
(void)(b & 3);
21+
(void)(pi & 3); // expected-error {{invalid operands}}
22+
(void)(pt & 3); // FIXME
23+
(void)(t & 3);
24+
(void)(3 & i);
25+
(void)(3 & f); // expected-error {{invalid operands}}
26+
(void)(3 & b);
27+
(void)(3 & pi); // expected-error {{invalid operands}}
28+
(void)(3 & pt); // FIXME
29+
(void)(3 & t);
30+
31+
(void)(i ^ 3);
32+
(void)(f ^ 3); // expected-error {{invalid operands}}
33+
(void)(b ^ 3);
34+
(void)(pi ^ 3); // expected-error {{invalid operands}}
35+
(void)(pt ^ 3); // FIXME
36+
(void)(t ^ 3);
37+
(void)(3 ^ i);
38+
(void)(3 ^ f); // expected-error {{invalid operands}}
39+
(void)(3 ^ b);
40+
(void)(3 ^ pi); // expected-error {{invalid operands}}
41+
(void)(3 ^ pt); // FIXME
42+
(void)(3 ^ t);
43+
44+
(void)(i | 3);
45+
(void)(f | 3); // expected-error {{invalid operands}}
46+
(void)(b | 3);
47+
(void)(pi | 3); // expected-error {{invalid operands}}
48+
(void)(pt | 3); // FIXME
49+
(void)(t | 3);
50+
(void)(3 | i);
51+
(void)(3 | f); // expected-error {{invalid operands}}
52+
(void)(3 | b);
53+
(void)(3 | pi); // expected-error {{invalid operands}}
54+
(void)(3 | pt); // FIXME
55+
(void)(3 | t);
56+
57+
(void)(i << 3);
58+
(void)(f << 3); // expected-error {{invalid operands}}
59+
(void)(b << 3);
60+
(void)(pi << 3); // expected-error {{invalid operands}}
61+
(void)(pt << 3); // FIXME
62+
(void)(t << 3);
63+
(void)(3 << i);
64+
(void)(3 << f); // expected-error {{invalid operands}}
65+
(void)(3 << b);
66+
(void)(3 << pi); // expected-error {{invalid operands}}
67+
(void)(3 << pt); // FIXME
68+
(void)(3 << t);
69+
70+
(void)(i >> 3);
71+
(void)(f >> 3); // expected-error {{invalid operands}}
72+
(void)(b >> 3);
73+
(void)(pi >> 3); // expected-error {{invalid operands}}
74+
(void)(pt >> 3); // FIXME
75+
(void)(t >> 3);
76+
(void)(3 >> i);
77+
(void)(3 >> f); // expected-error {{invalid operands}}
78+
(void)(3 >> b);
79+
(void)(3 >> pi); // expected-error {{invalid operands}}
80+
(void)(3 >> pt); // FIXME
81+
(void)(3 >> t);
82+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// RUN: %clang_cc1 -std=c++11 -verify %s -Wno-tautological-compare
2+
3+
template <typename T>
4+
void f(int i, float f, int* pi, T* pt, T t) {
5+
i = i;
6+
i *= i;
7+
i /= i;
8+
i += i;
9+
i -= i;
10+
i -= f;
11+
i -= pi; // expected-error {{invalid operands}}
12+
i -= pt; // FIXME
13+
i -= t;
14+
15+
f = f;
16+
f *= f;
17+
f /= f;
18+
f += f;
19+
f -= f;
20+
f -= i;
21+
f -= pi; // expected-error {{invalid operands}}
22+
f -= pt; // FIXME
23+
f -= t;
24+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
// RUN: %clang_cc1 -std=c++11 -verify %s -Wno-tautological-compare
2+
3+
template <typename T, typename U>
4+
void f(int* pi, float* pf, T* pt, U* pu, T t) {
5+
pi = pi;
6+
pi = pf; // expected-error {{incompatible pointer types}}
7+
pi = pt;
8+
pu = pi;
9+
pu = pt;
10+
pi = t;
11+
pu = t;
12+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
// RUN: %clang_cc1 -std=c++11 -verify %s -Wno-tautological-compare
2+
3+
struct A {
4+
};
5+
6+
template <typename T>
7+
void f(int A::* pi, float A::* pf, int T::* pt, T A::* pu, T t) {
8+
pi = pi;
9+
pi = pf; // expected-error {{assigning to 'int A::*' from incompatible type 'float A::*'}}
10+
pi = pt;
11+
pi = pu;
12+
pi = t;
13+
}

0 commit comments

Comments
 (0)