Make the modernize-loop-convert's const-detection smarter.

Summary:
Now, it detects that several kinds of usages are can't modify the elements. Examples:
-When an usage is a call to a const member function or operator of the element.
-If the element is used as an argument to a function or constructor that takes a const-reference or a value.
-LValue to RValue conversion, if the element is a fundamental type (which allows the use of most of the builtin operators).

Reviewers: klimek

Subscribers: cfe-commits, alexfh

Differential Revision: http://reviews.llvm.org/D14198

llvm-svn: 251808
diff --git a/clang-tools-extra/test/clang-tidy/modernize-loop-convert-lowercase.cpp b/clang-tools-extra/test/clang-tidy/modernize-loop-convert-lowercase.cpp
index a8081db..5f5c224 100644
--- a/clang-tools-extra/test/clang-tidy/modernize-loop-convert-lowercase.cpp
+++ b/clang-tools-extra/test/clang-tidy/modernize-loop-convert-lowercase.cpp
@@ -14,21 +14,21 @@
     printf("%d\n", arr[i]);
   }
   // CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use range-based for loop instead [modernize-loop-convert]
-  // CHECK-FIXES: for (int & elem : arr)
+  // CHECK-FIXES: for (int elem : arr)
   // CHECK-FIXES-NEXT: printf("%d\n", elem);
 
   for (int i = 0; i < n; ++i) {
     printf("%d\n", nums[i]);
   }
   // CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use range-based for loop instead
-  // CHECK-FIXES: for (int & num : nums)
+  // CHECK-FIXES: for (int num : nums)
   // CHECK-FIXES-NEXT: printf("%d\n", num);
 
   for (int i = 0; i < n; ++i) {
     printf("%d\n", nums_[i]);
   }
   // CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use range-based for loop instead
-  // CHECK-FIXES: for (int & num : nums_)
+  // CHECK-FIXES: for (int num : nums_)
   // CHECK-FIXES-NEXT: printf("%d\n", num);
 
   int num = 0;
@@ -36,7 +36,7 @@
     printf("%d\n", nums[i] + num);
   }
   // CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use range-based for loop instead
-  // CHECK-FIXES: for (int & elem : nums)
+  // CHECK-FIXES: for (int elem : nums)
   // CHECK-FIXES-NEXT: printf("%d\n", elem + num);
 
   int elem = 0;
@@ -44,7 +44,7 @@
     printf("%d\n", nums[i] + num + elem);
   }
   // CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use range-based for loop instead
-  // CHECK-FIXES: for (int & nums_i : nums)
+  // CHECK-FIXES: for (int nums_i : nums)
   // CHECK-FIXES-NEXT: printf("%d\n", nums_i + num + elem);
 
   int nums_i = 0;
@@ -52,7 +52,7 @@
     printf("%d\n", nums[i] + num + elem + nums_i);
   }
   // CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use range-based for loop instead
-  // CHECK-FIXES: for (int & nums_elem : nums)
+  // CHECK-FIXES: for (int nums_elem : nums)
   // CHECK-FIXES-NEXT: printf("%d\n", nums_elem + num + elem + nums_i);
 
   int nums_elem = 0;
@@ -60,7 +60,7 @@
     printf("%d\n", nums[i] + num + elem + nums_i + nums_elem);
   }
   // CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use range-based for loop instead
-  // CHECK-FIXES: for (int & give_me_name_0 : nums)
+  // CHECK-FIXES: for (int give_me_name_0 : nums)
   // CHECK-FIXES-NEXT: printf("%d\n", give_me_name_0 + num + elem + nums_i + nums_elem);
 
   int give_me_name_0 = 0;
@@ -68,7 +68,7 @@
     printf("%d\n", nums[i] + num + elem + nums_i + nums_elem + give_me_name_0);
   }
   // CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use range-based for loop instead
-  // CHECK-FIXES: for (int & give_me_name_1 : nums)
+  // CHECK-FIXES: for (int give_me_name_1 : nums)
   // CHECK-FIXES-NEXT: printf("%d\n", give_me_name_1 + num + elem + nums_i + nums_elem + give_me_name_0);
 
   int nums_j = 0;
@@ -79,7 +79,7 @@
   }
   // CHECK-MESSAGES: :[[@LINE-5]]:3: warning: use range-based for loop instead
   // CHECK-MESSAGES: :[[@LINE-5]]:5: warning: use range-based for loop instead
-  // CHECK-FIXES: for (int & give_me_name_0 : nums)
-  // CHECK-FIXES: for (int & give_me_name_1 : nums)
+  // CHECK-FIXES: for (int give_me_name_0 : nums)
+  // CHECK-FIXES: for (int give_me_name_1 : nums)
   // CHECK-FIXES-NEXT: printf("%d\n", give_me_name_0 + give_me_name_1 + num + elem + nums_i + nums_j + nums_elem);
 }