@@ -7,12 +7,17 @@ extern "C" void *memcpy(void *s1, const void *s2, unsigned n);
77
88class TriviallyCopyable {};
99class NonTriviallyCopyable { NonTriviallyCopyable(const NonTriviallyCopyable&);};
10+ struct Incomplete ;
1011
1112void test_bzero (TriviallyCopyable* tc,
12- NonTriviallyCopyable *ntc) {
13+ NonTriviallyCopyable *ntc,
14+ Incomplete* i) {
1315 // OK
1416 bzero (tc, sizeof (*tc));
1517
18+ // OK
19+ bzero (i, 10 );
20+
1621 // expected-warning@+2{{first argument in call to 'bzero' is a pointer to non-trivially copyable type 'NonTriviallyCopyable'}}
1722 // expected-note@+1{{explicitly cast the pointer to silence this warning}}
1823 bzero (ntc, sizeof (*ntc));
@@ -22,10 +27,14 @@ void test_bzero(TriviallyCopyable* tc,
2227}
2328
2429void test_memset (TriviallyCopyable* tc,
25- NonTriviallyCopyable *ntc) {
30+ NonTriviallyCopyable *ntc,
31+ Incomplete* i) {
2632 // OK
2733 memset (tc, 0 , sizeof (*tc));
2834
35+ // OK
36+ memset (i, 0 , 10 );
37+
2938 // expected-warning@+2{{first argument in call to 'memset' is a pointer to non-trivially copyable type 'NonTriviallyCopyable'}}
3039 // expected-note@+1{{explicitly cast the pointer to silence this warning}}
3140 memset (ntc, 0 , sizeof (*ntc));
@@ -36,10 +45,14 @@ void test_memset(TriviallyCopyable* tc,
3645
3746
3847void test_memcpy (TriviallyCopyable* tc0, TriviallyCopyable* tc1,
39- NonTriviallyCopyable *ntc0, NonTriviallyCopyable *ntc1) {
48+ NonTriviallyCopyable *ntc0, NonTriviallyCopyable *ntc1,
49+ Incomplete *i0, Incomplete *i1) {
4050 // OK
4151 memcpy (tc0, tc1, sizeof (*tc0));
4252
53+ // OK
54+ memcpy (i0, i1, 10 );
55+
4356 // expected-warning@+2{{first argument in call to 'memcpy' is a pointer to non-trivially copyable type 'NonTriviallyCopyable'}}
4457 // expected-note@+1{{explicitly cast the pointer to silence this warning}}
4558 memcpy (ntc0, ntc1, sizeof (*ntc0));
@@ -52,10 +65,14 @@ void test_memcpy(TriviallyCopyable* tc0, TriviallyCopyable* tc1,
5265}
5366
5467void test_memmove (TriviallyCopyable* tc0, TriviallyCopyable* tc1,
55- NonTriviallyCopyable *ntc0, NonTriviallyCopyable *ntc1) {
68+ NonTriviallyCopyable *ntc0, NonTriviallyCopyable *ntc1,
69+ Incomplete *i0, Incomplete *i1) {
5670 // OK
5771 memmove (tc0, tc1, sizeof (*tc0));
5872
73+ // OK
74+ memmove (i0, i1, 10 );
75+
5976 // expected-warning@+2{{first argument in call to 'memmove' is a pointer to non-trivially copyable type 'NonTriviallyCopyable'}}
6077 // expected-note@+1{{explicitly cast the pointer to silence this warning}}
6178 memmove (ntc0, ntc1, sizeof (*ntc0));
0 commit comments