115 lines · cpp
1// RUN: %clang_cc1 -fsyntax-only -std=c++11 -Wloop-analysis -verify %s2// RUN: %clang_cc1 -fsyntax-only -std=c++11 -Wrange-loop-analysis -verify %s3 4void test_POD_64_bytes() {5 struct Record {6 char a[64];7 };8 9 Record records[8];10 for (const auto r : records)11 (void)r;12}13 14void test_POD_65_bytes() {15 struct Record {16 char a[65];17 };18 19 // expected-warning@+3 {{loop variable 'r' creates a copy from type 'const Record'}}20 // expected-note@+2 {{use reference type 'const Record &' to prevent copying}}21 Record records[8];22 for (const auto r : records)23 (void)r;24}25 26void test_TriviallyCopyable_64_bytes() {27 struct Record {28 Record() {}29 char a[64];30 };31 32 Record records[8];33 for (const auto r : records)34 (void)r;35}36void test_TriviallyCopyConstructible_64_bytes() {37 struct Record {38 char a[64];39 Record& operator=(Record const& other){return *this;};40 41 };42 43 Record records[8];44 for (const auto r : records)45 (void)r;46}47 48void test_TriviallyCopyable_65_bytes() {49 struct Record {50 Record() {}51 char a[65];52 };53 54 // expected-warning@+3 {{loop variable 'r' creates a copy from type 'const Record'}}55 // expected-note@+2 {{use reference type 'const Record &' to prevent copying}}56 Record records[8];57 for (const auto r : records)58 (void)r;59}60 61void test_TriviallyCopyConstructible_65_bytes() {62 struct Record {63 char a[65];64 Record& operator=(Record const& other){return *this;};65 66 };67 // expected-warning@+3 {{loop variable 'r' creates a copy from type 'const Record'}}68 // expected-note@+2 {{use reference type 'const Record &' to prevent copying}}69 Record records[8];70 for (const auto r : records)71 (void)r;72}73 74void test_NonTriviallyCopyable() {75 struct Record {76 Record() {}77 ~Record() {}78 volatile int a;79 int b;80 };81 82 // expected-warning@+3 {{loop variable 'r' creates a copy from type 'const Record'}}83 // expected-note@+2 {{use reference type 'const Record &' to prevent copying}}84 Record records[8];85 for (const auto r : records)86 (void)r;87}88 89void test_TrivialABI_64_bytes() {90 struct [[clang::trivial_abi]] Record {91 Record() {}92 ~Record() {}93 char a[64];94 };95 96 Record records[8];97 for (const auto r : records)98 (void)r;99}100 101void test_TrivialABI_65_bytes() {102 struct [[clang::trivial_abi]] Record {103 Record() {}104 ~Record() {}105 char a[65];106 };107 108 // expected-warning@+3 {{loop variable 'r' creates a copy from type 'const Record'}}109 // expected-note@+2 {{use reference type 'const Record &' to prevent copying}}110 Record records[8];111 for (const auto r : records)112 (void)r;113}114 115