| // 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_TriviallyCopyConstructible_64_bytes() { |
| struct Record { |
| char a[64]; |
| Record& operator=(Record const& other){return *this;}; |
| |
| }; |
| |
| 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_TriviallyCopyConstructible_65_bytes() { |
| struct Record { |
| char a[65]; |
| Record& operator=(Record const& other){return *this;}; |
| |
| }; |
| // 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; |
| } |
| |