90 lines
2.0 KiB
C++
90 lines
2.0 KiB
C++
|
// RUN: %clang_cc1 -fsyntax-only -std=c++11 -Wloop-analysis -verify %s
|
||
|
// RUN: %clang_cc1 -fsyntax-only -std=c++11 -Wrange-loop-analysis -verify %s
|
||
|
|
||
|
void test_POD_64_bytes() {
|
||
|
struct Record {
|
||
|
char a[64];
|
||
|
};
|
||
|
|
||
|
Record records[8];
|
||
|
for (const auto r : records)
|
||
|
(void)r;
|
||
|
}
|
||
|
|
||
|
void test_POD_65_bytes() {
|
||
|
struct Record {
|
||
|
char a[65];
|
||
|
};
|
||
|
|
||
|
// expected-warning@+3 {{loop variable 'r' creates a copy from type 'const Record'}}
|
||
|
// expected-note@+2 {{use reference type 'const Record &' to prevent copying}}
|
||
|
Record records[8];
|
||
|
for (const auto r : records)
|
||
|
(void)r;
|
||
|
}
|
||
|
|
||
|
void test_TriviallyCopyable_64_bytes() {
|
||
|
struct Record {
|
||
|
Record() {}
|
||
|
char a[64];
|
||
|
};
|
||
|
|
||
|
Record records[8];
|
||
|
for (const auto r : records)
|
||
|
(void)r;
|
||
|
}
|
||
|
|
||
|
void test_TriviallyCopyable_65_bytes() {
|
||
|
struct Record {
|
||
|
Record() {}
|
||
|
char a[65];
|
||
|
};
|
||
|
|
||
|
// expected-warning@+3 {{loop variable 'r' creates a copy from type 'const Record'}}
|
||
|
// expected-note@+2 {{use reference type 'const Record &' to prevent copying}}
|
||
|
Record records[8];
|
||
|
for (const auto r : records)
|
||
|
(void)r;
|
||
|
}
|
||
|
|
||
|
void test_NonTriviallyCopyable() {
|
||
|
struct Record {
|
||
|
Record() {}
|
||
|
~Record() {}
|
||
|
volatile int a;
|
||
|
int b;
|
||
|
};
|
||
|
|
||
|
// expected-warning@+3 {{loop variable 'r' creates a copy from type 'const Record'}}
|
||
|
// expected-note@+2 {{use reference type 'const Record &' to prevent copying}}
|
||
|
Record records[8];
|
||
|
for (const auto r : records)
|
||
|
(void)r;
|
||
|
}
|
||
|
|
||
|
void test_TrivialABI_64_bytes() {
|
||
|
struct [[clang::trivial_abi]] Record {
|
||
|
Record() {}
|
||
|
~Record() {}
|
||
|
char a[64];
|
||
|
};
|
||
|
|
||
|
Record records[8];
|
||
|
for (const auto r : records)
|
||
|
(void)r;
|
||
|
}
|
||
|
|
||
|
void test_TrivialABI_65_bytes() {
|
||
|
struct [[clang::trivial_abi]] Record {
|
||
|
Record() {}
|
||
|
~Record() {}
|
||
|
char a[65];
|
||
|
};
|
||
|
|
||
|
// expected-warning@+3 {{loop variable 'r' creates a copy from type 'const Record'}}
|
||
|
// expected-note@+2 {{use reference type 'const Record &' to prevent copying}}
|
||
|
Record records[8];
|
||
|
for (const auto r : records)
|
||
|
(void)r;
|
||
|
}
|