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