@@ -7,12 +7,17 @@ extern "C" void *memcpy(void *s1, const void *s2, unsigned n);
7
7
8
8
class TriviallyCopyable {};
9
9
class NonTriviallyCopyable { NonTriviallyCopyable(const NonTriviallyCopyable&);};
10
+ struct Incomplete ;
10
11
11
12
void test_bzero (TriviallyCopyable* tc,
12
- NonTriviallyCopyable *ntc) {
13
+ NonTriviallyCopyable *ntc,
14
+ Incomplete* i) {
13
15
// OK
14
16
bzero (tc, sizeof (*tc));
15
17
18
+ // OK
19
+ bzero (i, 10 );
20
+
16
21
// expected-warning@+2{{first argument in call to 'bzero' is a pointer to non-trivially copyable type 'NonTriviallyCopyable'}}
17
22
// expected-note@+1{{explicitly cast the pointer to silence this warning}}
18
23
bzero (ntc, sizeof (*ntc));
@@ -22,10 +27,14 @@ void test_bzero(TriviallyCopyable* tc,
22
27
}
23
28
24
29
void test_memset (TriviallyCopyable* tc,
25
- NonTriviallyCopyable *ntc) {
30
+ NonTriviallyCopyable *ntc,
31
+ Incomplete* i) {
26
32
// OK
27
33
memset (tc, 0 , sizeof (*tc));
28
34
35
+ // OK
36
+ memset (i, 0 , 10 );
37
+
29
38
// expected-warning@+2{{first argument in call to 'memset' is a pointer to non-trivially copyable type 'NonTriviallyCopyable'}}
30
39
// expected-note@+1{{explicitly cast the pointer to silence this warning}}
31
40
memset (ntc, 0 , sizeof (*ntc));
@@ -36,10 +45,14 @@ void test_memset(TriviallyCopyable* tc,
36
45
37
46
38
47
void test_memcpy (TriviallyCopyable* tc0, TriviallyCopyable* tc1,
39
- NonTriviallyCopyable *ntc0, NonTriviallyCopyable *ntc1) {
48
+ NonTriviallyCopyable *ntc0, NonTriviallyCopyable *ntc1,
49
+ Incomplete *i0, Incomplete *i1) {
40
50
// OK
41
51
memcpy (tc0, tc1, sizeof (*tc0));
42
52
53
+ // OK
54
+ memcpy (i0, i1, 10 );
55
+
43
56
// expected-warning@+2{{first argument in call to 'memcpy' is a pointer to non-trivially copyable type 'NonTriviallyCopyable'}}
44
57
// expected-note@+1{{explicitly cast the pointer to silence this warning}}
45
58
memcpy (ntc0, ntc1, sizeof (*ntc0));
@@ -52,10 +65,14 @@ void test_memcpy(TriviallyCopyable* tc0, TriviallyCopyable* tc1,
52
65
}
53
66
54
67
void test_memmove (TriviallyCopyable* tc0, TriviallyCopyable* tc1,
55
- NonTriviallyCopyable *ntc0, NonTriviallyCopyable *ntc1) {
68
+ NonTriviallyCopyable *ntc0, NonTriviallyCopyable *ntc1,
69
+ Incomplete *i0, Incomplete *i1) {
56
70
// OK
57
71
memmove (tc0, tc1, sizeof (*tc0));
58
72
73
+ // OK
74
+ memmove (i0, i1, 10 );
75
+
59
76
// expected-warning@+2{{first argument in call to 'memmove' is a pointer to non-trivially copyable type 'NonTriviallyCopyable'}}
60
77
// expected-note@+1{{explicitly cast the pointer to silence this warning}}
61
78
memmove (ntc0, ntc1, sizeof (*ntc0));
0 commit comments