133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// RUN: %clang_cc1 -fsyntax-only -std=c++11 -Wloop-analysis -verify %s 233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// RUN: %clang_cc1 -fsyntax-only -std=c++11 -Wrange-loop-analysis -verify %s 333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainartemplate <typename return_type> 533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainarstruct Iterator { 633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar return_type operator*(); 733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar Iterator operator++(); 833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar bool operator!=(const Iterator); 933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar}; 1033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 1133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainartemplate <typename T> 1233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainarstruct Container { 1333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar typedef Iterator<T> I; 1433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 1533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar I begin(); 1633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar I end(); 1733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar}; 1833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 1933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainarstruct Foo {}; 2033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainarstruct Bar { 2133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar Bar(Foo); 2233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar Bar(int); 2333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar operator int(); 2433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar}; 2533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 2633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// Testing notes: 2733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// test0 checks that the full text of the warnings and notes is correct. The 2833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// rest of the tests checks a smaller portion of the text. 2933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// test1-6 are set in pairs, the odd numbers are the non-reference returning 3033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// versions of the even numbers. 3133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// test7-9 use an array instead of a range object 3233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// tests use all four versions of the loop varaible, const &T, const T, T&, and 3333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// T. Versions producing errors and are commented out. 3433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// 3533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// Conversion chart: 3633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// double <=> int 3733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// int <=> Bar 3833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// double => Bar 3933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// Foo => Bar 4033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// 4133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// Conversions during tests: 4233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// test1-2 4333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// int => int 4433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// int => double 4533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// int => Bar 4633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// test3-4 4733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// Bar => Bar 4833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// Bar => int 4933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// test5-6 5033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// Foo => Bar 5133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// test7 5233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// double => double 5333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// double => int 5433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// double => Bar 5533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// test8 5633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// Foo => Foo 5733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// Foo => Bar 5833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// test9 5933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// Bar => Bar 6033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar// Bar => int 6133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 6233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainarvoid test0() { 6333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar Container<int> int_non_ref_container; 6433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar Container<int&> int_container; 6533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar Container<Bar&> bar_container; 6633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 6733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (const int &x : int_non_ref_container) {} 6833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // expected-warning@-1 {{loop variable 'x' is always a copy because the range of type 'Container<int>' does not return a reference}} 6933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // expected-note@-2 {{use non-reference type 'int'}} 7033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 7133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (const double &x : int_container) {} 7233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // expected-warning@-1 {{loop variable 'x' has type 'const double &' but is initialized with type 'int' resulting in a copy}} 7333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // expected-note@-2 {{use non-reference type 'double' to keep the copy or type 'const int &' to prevent copying}} 7433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 7533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (const Bar x : bar_container) {} 7633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // expected-warning@-1 {{loop variable 'x' of type 'const Bar' creates a copy from type 'const Bar'}} 7733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // expected-note@-2 {{use reference type 'const Bar &' to prevent copying}} 7833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar} 7933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 8033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainarvoid test1() { 8133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar Container<int> A; 8233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 8333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (const int &x : A) {} 8433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // expected-warning@-1 {{always a copy}} 8533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // expected-note@-2 {{'int'}} 8633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (const int x : A) {} 8733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // No warning, non-reference type indicates copy is made 8833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar //for (int &x : A) {} 8933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // Binding error 9033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (int x : A) {} 9133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // No warning, non-reference type indicates copy is made 9233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 9333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (const double &x : A) {} 9433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // expected-warning@-1 {{always a copy}} 9533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // expected-note@-2 {{'double'}} 9633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (const double x : A) {} 9733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // No warning, non-reference type indicates copy is made 9833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar //for (double &x : A) {} 9933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // Binding error 10033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (double x : A) {} 10133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // No warning, non-reference type indicates copy is made 10233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 10333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (const Bar &x : A) {} 10433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // expected-warning@-1 {{always a copy}} 10533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // expected-note@-2 {{'Bar'}} 10633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (const Bar x : A) {} 10733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // No warning, non-reference type indicates copy is made 10833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar //for (Bar &x : A) {} 10933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // Binding error 11033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (Bar x : A) {} 11133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // No warning, non-reference type indicates copy is made 11233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar} 11333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 11433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainarvoid test2() { 11533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar Container<int&> B; 11633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 11733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (const int &x : B) {} 11833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // No warning, this reference is not a temporary 11933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (const int x : B) {} 12033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // No warning on POD copy 12133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (int &x : B) {} 12233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // No warning 12333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (int x : B) {} 12433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // No warning 12533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 12633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (const double &x : B) {} 12733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // expected-warning@-1 {{resulting in a copy}} 12833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // expected-note-re@-2 {{'double'{{.*}}'const int &'}} 12933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (const double x : B) {} 13033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar //for (double &x : B) {} 13133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // Binding error 13233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (double x : B) {} 13333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // No warning 13433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 13533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (const Bar &x : B) {} 13633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // expected-warning@-1 {{resulting in a copy}} 13733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // expected-note@-2 {{'Bar'}} 13833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (const Bar x : B) {} 13933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar //for (Bar &x : B) {} 14033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // Binding error 14133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (Bar x : B) {} 14233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // No warning 14333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar} 14433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 14533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainarvoid test3() { 14633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar Container<Bar> C; 14733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 14833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (const Bar &x : C) {} 14933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // expected-warning@-1 {{always a copy}} 15033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // expected-note@-2 {{'Bar'}} 15133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (const Bar x : C) {} 15233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // No warning, non-reference type indicates copy is made 15333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar //for (Bar &x : C) {} 15433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // Binding error 15533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (Bar x : C) {} 15633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // No warning, non-reference type indicates copy is made 15733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 15833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (const int &x : C) {} 15933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // expected-warning@-1 {{always a copy}} 16033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // expected-note@-2 {{'int'}} 16133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (const int x : C) {} 16233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // No warning, copy made 16333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar //for (int &x : C) {} 16433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // Binding error 16533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (int x : C) {} 16633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // No warning, copy made 16733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar} 16833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 16933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainarvoid test4() { 17033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar Container<Bar&> D; 17133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 17233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (const Bar &x : D) {} 17333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // No warning, this reference is not a temporary 17433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (const Bar x : D) {} 17533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // expected-warning@-1 {{creates a copy}} 17633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // expected-note@-2 {{'const Bar &'}} 17733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (Bar &x : D) {} 17833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // No warning 17933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (Bar x : D) {} 18033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // No warning 18133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 18233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (const int &x : D) {} 18333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // expected-warning@-1 {{resulting in a copy}} 18433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // expected-note-re@-2 {{'int'{{.*}}'const Bar &'}} 18533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (const int x : D) {} 18633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // No warning 18733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar //for (int &x : D) {} 18833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // Binding error 18933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (int x : D) {} 19033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // No warning 19133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar} 19233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 19333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainarvoid test5() { 19433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar Container<Foo> E; 19533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 19633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (const Bar &x : E) {} 19733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // expected-warning@-1 {{always a copy}} 19833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // expected-note@-2 {{'Bar'}} 19933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (const Bar x : E) {} 20033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // No warning, non-reference type indicates copy is made 20133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar //for (Bar &x : E) {} 20233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // Binding error 20333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (Bar x : E) {} 20433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // No warning, non-reference type indicates copy is made 20533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar} 20633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 20733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainarvoid test6() { 20833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar Container<Foo&> F; 20933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 21033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (const Bar &x : F) {} 21133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // expected-warning@-1 {{resulting in a copy}} 21233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // expected-note-re@-2 {{'Bar'{{.*}}'const Foo &'}} 21333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (const Bar x : F) {} 21433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // No warning. 21533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar //for (Bar &x : F) {} 21633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // Binding error 21733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (Bar x : F) {} 21833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // No warning 21933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar} 22033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 22133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainarvoid test7() { 22233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar double G[2]; 22333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 22433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (const double &x : G) {} 22533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // No warning 22633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (const double x : G) {} 22733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // No warning on POD copy 22833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (double &x : G) {} 22933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // No warning 23033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (double x : G) {} 23133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // No warning 23233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 23333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (const int &x : G) {} 23433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // expected-warning@-1 {{resulting in a copy}} 23533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // expected-note-re@-2 {{'int'{{.*}}'const double &'}} 23633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (const int x : G) {} 23733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // No warning 23833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar //for (int &x : G) {} 23933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // Binding error 24033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (int x : G) {} 24133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // No warning 24233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 24333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (const Bar &x : G) {} 24433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // expected-warning@-1 {{resulting in a copy}} 24533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // expected-note-re@-2 {{'Bar'{{.*}}'const double &'}} 24633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (const Bar x : G) {} 24733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // No warning 24833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar //for (int &Bar : G) {} 24933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // Binding error 25033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (int Bar : G) {} 25133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // No warning 25233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar} 25333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 25433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainarvoid test8() { 25533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar Foo H[2]; 25633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 25733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (const Foo &x : H) {} 25833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // No warning 25933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (const Foo x : H) {} 26033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // No warning on POD copy 26133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (Foo &x : H) {} 26233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // No warning 26333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (Foo x : H) {} 26433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // No warning 26533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 26633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (const Bar &x : H) {} 26733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // expected-warning@-1 {{resulting in a copy}} 26833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // expected-note-re@-2 {{'Bar'{{.*}}'const Foo &'}} 26933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (const Bar x : H) {} 27033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // No warning 27133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar //for (Bar &x: H) {} 27233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // Binding error 27333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (Bar x: H) {} 27433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // No warning 27533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar} 27633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 27733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainarvoid test9() { 27833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar Bar I[2] = {1,2}; 27933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 28033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (const Bar &x : I) {} 28133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // No warning 28233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (const Bar x : I) {} 28333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // expected-warning@-1 {{creates a copy}} 28433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // expected-note@-2 {{'const Bar &'}} 28533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (Bar &x : I) {} 28633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // No warning 28733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (Bar x : I) {} 28833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // No warning 28933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 29033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (const int &x : I) {} 29133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // expected-warning@-1 {{resulting in a copy}} 29233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // expected-note-re@-2 {{'int'{{.*}}'const Bar &'}} 29333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (const int x : I) {} 29433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // No warning 29533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar //for (int &x : I) {} 29633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // Binding error 29733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar for (int x : I) {} 29833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar // No warning 29933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar} 300