xref: /llvm-project/clang-tools-extra/test/clang-tidy/checkers/modernize/loop-convert-negative.cpp (revision 6a1f8ef8a7aaefea80ef0bc7c6c462a96215b50e)
189a1d03eSRichard // RUN: %check_clang_tidy %s modernize-loop-convert %t -- -- -I %S/Inputs/loop-convert
289a1d03eSRichard 
389a1d03eSRichard #include "structures.h"
489a1d03eSRichard 
589a1d03eSRichard // CHECK-FIXES-NOT: for ({{.*[^:]:[^:].*}})
689a1d03eSRichard // CHECK-MESSAGES-NOT: modernize-loop-convert
789a1d03eSRichard 
8*6a1f8ef8SChris Cotter namespace somenamespace {
9*6a1f8ef8SChris Cotter   template <class T> auto begin(T& t) -> decltype(t.begin());
10*6a1f8ef8SChris Cotter   template <class T> auto begin(const T& t) -> decltype(t.begin());
11*6a1f8ef8SChris Cotter   template <class T> auto end(T& t) -> decltype(t.end());
12*6a1f8ef8SChris Cotter   template <class T> auto end(const T& t) -> decltype(t.end());
13*6a1f8ef8SChris Cotter   template <class T> auto size(const T& t) -> decltype(t.size());
14*6a1f8ef8SChris Cotter } // namespace somenamespace
15*6a1f8ef8SChris Cotter 
16*6a1f8ef8SChris Cotter struct SomeClass {
17*6a1f8ef8SChris Cotter   template <class T> static auto begin(T& t) -> decltype(t.begin());
18*6a1f8ef8SChris Cotter   template <class T> static auto begin(const T& t) -> decltype(t.begin());
19*6a1f8ef8SChris Cotter   template <class T> static auto end(T& t) -> decltype(t.end());
20*6a1f8ef8SChris Cotter   template <class T> static auto end(const T& t) -> decltype(t.end());
21*6a1f8ef8SChris Cotter   template <class T> static auto size(const T& t) -> decltype(t.size());
22*6a1f8ef8SChris Cotter };
23*6a1f8ef8SChris Cotter 
2489a1d03eSRichard namespace Negative {
2589a1d03eSRichard 
2689a1d03eSRichard const int N = 6;
2789a1d03eSRichard int Arr[N] = {1, 2, 3, 4, 5, 6};
2889a1d03eSRichard int (*pArr)[N] = &Arr;
2989a1d03eSRichard int Sum = 0;
3089a1d03eSRichard 
3189a1d03eSRichard // Checks for the Index start and end:
IndexStartAndEnd()3289a1d03eSRichard void IndexStartAndEnd() {
3389a1d03eSRichard   for (int I = 0; I < N + 1; ++I)
3489a1d03eSRichard     Sum += Arr[I];
3589a1d03eSRichard 
3689a1d03eSRichard   for (int I = 0; I < N - 1; ++I)
3789a1d03eSRichard     Sum += Arr[I];
3889a1d03eSRichard 
3989a1d03eSRichard   for (int I = 1; I < N; ++I)
4089a1d03eSRichard     Sum += Arr[I];
4189a1d03eSRichard 
4289a1d03eSRichard   for (int I = 1; I < N; ++I)
4389a1d03eSRichard     Sum += Arr[I];
4489a1d03eSRichard 
4589a1d03eSRichard   for (int I = 0;; ++I)
4689a1d03eSRichard     Sum += (*pArr)[I];
4789a1d03eSRichard }
4889a1d03eSRichard 
4989a1d03eSRichard // Checks for invalid increment steps:
increment()5089a1d03eSRichard void increment() {
5189a1d03eSRichard   for (int I = 0; I < N; --I)
5289a1d03eSRichard     Sum += Arr[I];
5389a1d03eSRichard 
5489a1d03eSRichard   for (int I = 0; I < N; I)
5589a1d03eSRichard     Sum += Arr[I];
5689a1d03eSRichard 
5789a1d03eSRichard   for (int I = 0; I < N;)
5889a1d03eSRichard     Sum += Arr[I];
5989a1d03eSRichard 
6089a1d03eSRichard   for (int I = 0; I < N; I += 2)
6189a1d03eSRichard     Sum++;
6289a1d03eSRichard }
6389a1d03eSRichard 
6489a1d03eSRichard // Checks to make sure that the Index isn't used outside of the array:
IndexUse()6589a1d03eSRichard void IndexUse() {
6689a1d03eSRichard   for (int I = 0; I < N; ++I)
6789a1d03eSRichard     Arr[I] += 1 + I;
6889a1d03eSRichard }
6989a1d03eSRichard 
7089a1d03eSRichard // Check for loops that don't mention arrays
noArray()7189a1d03eSRichard void noArray() {
7289a1d03eSRichard   for (int I = 0; I < N; ++I)
7389a1d03eSRichard     Sum += I;
7489a1d03eSRichard 
7589a1d03eSRichard   for (int I = 0; I < N; ++I) {
7689a1d03eSRichard   }
7789a1d03eSRichard 
7889a1d03eSRichard   for (int I = 0; I < N; ++I)
7989a1d03eSRichard     ;
8089a1d03eSRichard }
8189a1d03eSRichard 
8289a1d03eSRichard // Checks for incorrect loop variables.
mixedVariables()8389a1d03eSRichard void mixedVariables() {
8489a1d03eSRichard   int BadIndex;
8589a1d03eSRichard   for (int I = 0; BadIndex < N; ++I)
8689a1d03eSRichard     Sum += Arr[I];
8789a1d03eSRichard 
8889a1d03eSRichard   for (int I = 0; I < N; ++BadIndex)
8989a1d03eSRichard     Sum += Arr[I];
9089a1d03eSRichard 
9189a1d03eSRichard   for (int I = 0; BadIndex < N; ++BadIndex)
9289a1d03eSRichard     Sum += Arr[I];
9389a1d03eSRichard 
9489a1d03eSRichard   for (int I = 0; BadIndex < N; ++BadIndex)
9589a1d03eSRichard     Sum += Arr[BadIndex];
9689a1d03eSRichard }
9789a1d03eSRichard 
9889a1d03eSRichard // Checks for multiple arrays Indexed.
multipleArrays()9989a1d03eSRichard void multipleArrays() {
10089a1d03eSRichard   int BadArr[N];
10189a1d03eSRichard 
10289a1d03eSRichard   for (int I = 0; I < N; ++I)
10389a1d03eSRichard     Sum += Arr[I] + BadArr[I];
10489a1d03eSRichard 
10589a1d03eSRichard   for (int I = 0; I < N; ++I) {
10689a1d03eSRichard     int K = BadArr[I];
10789a1d03eSRichard     Sum += Arr[I] + K;
10889a1d03eSRichard   }
10989a1d03eSRichard }
11089a1d03eSRichard 
111*6a1f8ef8SChris Cotter } // namespace Negative
11289a1d03eSRichard 
11389a1d03eSRichard namespace NegativeIterator {
11489a1d03eSRichard 
11589a1d03eSRichard S Ss;
11689a1d03eSRichard T Tt;
11789a1d03eSRichard U Tu;
11889a1d03eSRichard 
11989a1d03eSRichard struct BadBeginEnd : T {
12089a1d03eSRichard   iterator notBegin();
12189a1d03eSRichard   iterator notEnd();
122*6a1f8ef8SChris Cotter   iterator begin(int);
123*6a1f8ef8SChris Cotter   iterator end(int);
124*6a1f8ef8SChris Cotter   iterator begin();
125*6a1f8ef8SChris Cotter   iterator end();
12689a1d03eSRichard };
12789a1d03eSRichard 
notBeginOrEnd()12889a1d03eSRichard void notBeginOrEnd() {
12989a1d03eSRichard   BadBeginEnd Bad;
13089a1d03eSRichard   for (T::iterator I = Bad.notBegin(), E = Bad.end();  I != E; ++I)
13189a1d03eSRichard     int K = *I;
13289a1d03eSRichard 
13389a1d03eSRichard   for (T::iterator I = Bad.begin(), E = Bad.notEnd();  I != E; ++I)
13489a1d03eSRichard     int K = *I;
135*6a1f8ef8SChris Cotter 
136*6a1f8ef8SChris Cotter   for (T::iterator I = Bad.begin(0), E = Bad.end(0);  I != E; ++I)
137*6a1f8ef8SChris Cotter     int K = *I;
13889a1d03eSRichard }
13989a1d03eSRichard 
badLoopShapes()14089a1d03eSRichard void badLoopShapes() {
14189a1d03eSRichard   for (T::iterator I = Tt.begin(), E = Tt.end(), F = E;  I != E; ++I)
14289a1d03eSRichard     int K = *I;
14389a1d03eSRichard 
14489a1d03eSRichard   for (T::iterator I = Tt.begin(), E = Tt.end();  I != E;)
14589a1d03eSRichard     int K = *I;
14689a1d03eSRichard 
14789a1d03eSRichard   for (T::iterator I = Tt.begin(), E = Tt.end();; ++I)
14889a1d03eSRichard     int K = *I;
14989a1d03eSRichard 
15089a1d03eSRichard   T::iterator OutsideI;
15189a1d03eSRichard   T::iterator OutsideE;
15289a1d03eSRichard 
15389a1d03eSRichard   for (; OutsideI != OutsideE; ++OutsideI)
15489a1d03eSRichard     int K = *OutsideI;
15589a1d03eSRichard }
15689a1d03eSRichard 
iteratorArrayMix()15789a1d03eSRichard void iteratorArrayMix() {
15889a1d03eSRichard   int Lower;
15989a1d03eSRichard   const int N = 6;
16089a1d03eSRichard   for (T::iterator I = Tt.begin(), E = Tt.end(); Lower < N; ++I)
16189a1d03eSRichard     int K = *I;
16289a1d03eSRichard 
16389a1d03eSRichard   for (T::iterator I = Tt.begin(), E = Tt.end(); Lower < N; ++Lower)
16489a1d03eSRichard     int K = *I;
16589a1d03eSRichard }
16689a1d03eSRichard 
16789a1d03eSRichard struct ExtraConstructor : T::iterator {
16889a1d03eSRichard   ExtraConstructor(T::iterator, int);
16989a1d03eSRichard   explicit ExtraConstructor(T::iterator);
17089a1d03eSRichard };
17189a1d03eSRichard 
badConstructor()17289a1d03eSRichard void badConstructor() {
17389a1d03eSRichard   for (T::iterator I = ExtraConstructor(Tt.begin(), 0), E = Tt.end();
17489a1d03eSRichard         I != E; ++I)
17589a1d03eSRichard     int K = *I;
17689a1d03eSRichard   for (T::iterator I = ExtraConstructor(Tt.begin()), E = Tt.end();  I != E; ++I)
17789a1d03eSRichard     int K = *I;
17889a1d03eSRichard }
17989a1d03eSRichard 
foo(S::iterator It)18089a1d03eSRichard void foo(S::iterator It) {}
18189a1d03eSRichard class Foo {public: void bar(S::iterator It); };
18289a1d03eSRichard Foo Fo;
18389a1d03eSRichard 
iteratorUsed()18489a1d03eSRichard void iteratorUsed() {
18589a1d03eSRichard   for (S::iterator I = Ss.begin(), E = Ss.end();  I != E; ++I)
18689a1d03eSRichard     foo(I);
18789a1d03eSRichard 
18889a1d03eSRichard   for (S::iterator I = Ss.begin(), E = Ss.end();  I != E; ++I)
18989a1d03eSRichard     Fo.bar(I);
19089a1d03eSRichard 
19189a1d03eSRichard   S::iterator Ret;
19289a1d03eSRichard   for (S::iterator I = Ss.begin(), E = Ss.end();  I != E; ++I)
19389a1d03eSRichard     Ret = I;
19489a1d03eSRichard }
19589a1d03eSRichard 
iteratorMemberUsed()19689a1d03eSRichard void iteratorMemberUsed() {
19789a1d03eSRichard   for (T::iterator I = Tt.begin(), E = Tt.end();  I != E; ++I)
19889a1d03eSRichard     I.X = *I;
19989a1d03eSRichard 
20089a1d03eSRichard   for (T::iterator I = Tt.begin(), E = Tt.end();  I != E; ++I)
20189a1d03eSRichard     int K = I.X + *I;
20289a1d03eSRichard 
20389a1d03eSRichard   for (T::iterator I = Tt.begin(), E = Tt.end();  I != E; ++I)
20489a1d03eSRichard     int K = E.X + *I;
20589a1d03eSRichard }
20689a1d03eSRichard 
iteratorMethodCalled()20789a1d03eSRichard void iteratorMethodCalled() {
20889a1d03eSRichard   for (T::iterator I = Tt.begin(), E = Tt.end();  I != E; ++I)
20989a1d03eSRichard     I.insert(3);
21089a1d03eSRichard 
21189a1d03eSRichard   for (T::iterator I = Tt.begin(), E = Tt.end();  I != E; ++I)
21289a1d03eSRichard     if (I != I)
21389a1d03eSRichard       int K = 3;
21489a1d03eSRichard }
21589a1d03eSRichard 
iteratorOperatorCalled()21689a1d03eSRichard void iteratorOperatorCalled() {
21789a1d03eSRichard   for (T::iterator I = Tt.begin(), E = Tt.end();  I != E; ++I)
21889a1d03eSRichard     int K = *(++I);
21989a1d03eSRichard 
22089a1d03eSRichard   for (S::iterator I = Ss.begin(), E = Ss.end();  I != E; ++I)
22189a1d03eSRichard     MutableVal K = *(++I);
22289a1d03eSRichard }
22389a1d03eSRichard 
differentContainers()22489a1d03eSRichard void differentContainers() {
22589a1d03eSRichard   T Other;
22689a1d03eSRichard   for (T::iterator I = Tt.begin(), E = Other.end();  I != E; ++I)
22789a1d03eSRichard     int K = *I;
228*6a1f8ef8SChris Cotter   for (T::iterator I = begin(Tt), E = end(Other);  I != E; ++I)
229*6a1f8ef8SChris Cotter     int K = *I;
23089a1d03eSRichard 
23189a1d03eSRichard   for (T::iterator I = Other.begin(), E = Tt.end();  I != E; ++I)
23289a1d03eSRichard     int K = *I;
23389a1d03eSRichard 
23489a1d03eSRichard   S OtherS;
23589a1d03eSRichard   for (S::iterator I = Ss.begin(), E = OtherS.end();  I != E; ++I)
23689a1d03eSRichard     MutableVal K = *I;
23789a1d03eSRichard 
23889a1d03eSRichard   for (S::iterator I = OtherS.begin(), E = Ss.end();  I != E; ++I)
23989a1d03eSRichard     MutableVal K = *I;
24089a1d03eSRichard }
24189a1d03eSRichard 
mixedMemberAndADL()242*6a1f8ef8SChris Cotter void mixedMemberAndADL() {
243*6a1f8ef8SChris Cotter   for (T::iterator I = Tt.begin(), E = end(Tt);  I != E; ++I)
244*6a1f8ef8SChris Cotter     int K = *I;
245*6a1f8ef8SChris Cotter   for (T::iterator I = begin(Tt), E = Tt.end();  I != E; ++I)
246*6a1f8ef8SChris Cotter     int K = *I;
247*6a1f8ef8SChris Cotter   for (T::iterator I = std::begin(Tt), E = Tt.end();  I != E; ++I)
248*6a1f8ef8SChris Cotter     int K = *I;
249*6a1f8ef8SChris Cotter   for (T::iterator I = std::begin(Tt), E = end(Tt);  I != E; ++I)
250*6a1f8ef8SChris Cotter     int K = *I;
251*6a1f8ef8SChris Cotter }
252*6a1f8ef8SChris Cotter 
nonADLOrStdCalls()253*6a1f8ef8SChris Cotter void nonADLOrStdCalls() {
254*6a1f8ef8SChris Cotter   for (T::iterator I = SomeClass::begin(Tt), E = SomeClass::end(Tt);  I != E; ++I)
255*6a1f8ef8SChris Cotter     int K = *I;
256*6a1f8ef8SChris Cotter   for (T::iterator I = somenamespace::begin(Tt), E = somenamespace::end(Tt);  I != E; ++I)
257*6a1f8ef8SChris Cotter     int K = *I;
258*6a1f8ef8SChris Cotter }
259*6a1f8ef8SChris Cotter 
wrongIterators()26089a1d03eSRichard void wrongIterators() {
26189a1d03eSRichard   T::iterator Other;
26289a1d03eSRichard   for (T::iterator I = Tt.begin(), E = Tt.end(); I != Other; ++I)
26389a1d03eSRichard     int K = *I;
26489a1d03eSRichard }
26589a1d03eSRichard 
26689a1d03eSRichard struct EvilArrow : U {
26789a1d03eSRichard   // Please, no one ever write code like this.
26889a1d03eSRichard   U *operator->();
26989a1d03eSRichard };
27089a1d03eSRichard 
differentMemberAccessTypes()27189a1d03eSRichard void differentMemberAccessTypes() {
27289a1d03eSRichard   EvilArrow A;
27389a1d03eSRichard   for (EvilArrow::iterator I = A.begin(), E = A->end();  I != E; ++I)
27489a1d03eSRichard     Val K = *I;
27589a1d03eSRichard   for (EvilArrow::iterator I = A->begin(), E = A.end();  I != E; ++I)
27689a1d03eSRichard     Val K = *I;
27789a1d03eSRichard }
27889a1d03eSRichard 
27989a1d03eSRichard void f(const T::iterator &It, int);
28089a1d03eSRichard void f(const T &It, int);
28189a1d03eSRichard void g(T &It, int);
28289a1d03eSRichard 
iteratorPassedToFunction()28389a1d03eSRichard void iteratorPassedToFunction() {
28489a1d03eSRichard   for (T::iterator I = Tt.begin(), E = Tt.end();  I != E; ++I)
28589a1d03eSRichard     f(I, *I);
28689a1d03eSRichard }
28789a1d03eSRichard 
28889a1d03eSRichard // FIXME: These tests can be removed if this tool ever does enough analysis to
28989a1d03eSRichard // decide that this is a safe transformation. Until then, we don't want it
29089a1d03eSRichard // applied.
iteratorDefinedOutside()29189a1d03eSRichard void iteratorDefinedOutside() {
29289a1d03eSRichard   T::iterator TheEnd = Tt.end();
29389a1d03eSRichard   for (T::iterator I = Tt.begin(); I != TheEnd; ++I)
29489a1d03eSRichard     int K = *I;
29589a1d03eSRichard 
29689a1d03eSRichard   T::iterator TheBegin = Tt.begin();
29789a1d03eSRichard   for (T::iterator E = Tt.end(); TheBegin != E; ++TheBegin)
29889a1d03eSRichard     int K = *TheBegin;
29989a1d03eSRichard }
30089a1d03eSRichard 
30189a1d03eSRichard } // namespace NegativeIterator
30289a1d03eSRichard 
30389a1d03eSRichard namespace NegativePseudoArray {
30489a1d03eSRichard 
30589a1d03eSRichard const int N = 6;
30689a1d03eSRichard dependent<int> V;
30789a1d03eSRichard dependent<int> *Pv;
30889a1d03eSRichard 
30989a1d03eSRichard int Sum = 0;
31089a1d03eSRichard 
31189a1d03eSRichard // Checks for the Index start and end:
IndexStartAndEnd()31289a1d03eSRichard void IndexStartAndEnd() {
31389a1d03eSRichard   for (int I = 0; I < V.size() + 1; ++I)
31489a1d03eSRichard     Sum += V[I];
31589a1d03eSRichard 
31689a1d03eSRichard   for (int I = 0; I < V.size() - 1; ++I)
31789a1d03eSRichard     Sum += V[I];
31889a1d03eSRichard 
31989a1d03eSRichard   for (int I = 1; I < V.size(); ++I)
32089a1d03eSRichard     Sum += V[I];
32189a1d03eSRichard 
32289a1d03eSRichard   for (int I = 1; I < V.size(); ++I)
32389a1d03eSRichard     Sum += V[I];
32489a1d03eSRichard 
32589a1d03eSRichard   for (int I = 0;; ++I)
32689a1d03eSRichard     Sum += (*Pv)[I];
32789a1d03eSRichard }
32889a1d03eSRichard 
32989a1d03eSRichard // Checks for invalid increment steps:
increment()33089a1d03eSRichard void increment() {
33189a1d03eSRichard   for (int I = 0; I < V.size(); --I)
33289a1d03eSRichard     Sum += V[I];
33389a1d03eSRichard 
33489a1d03eSRichard   for (int I = 0; I < V.size(); I)
33589a1d03eSRichard     Sum += V[I];
33689a1d03eSRichard 
33789a1d03eSRichard   for (int I = 0; I < V.size();)
33889a1d03eSRichard     Sum += V[I];
33989a1d03eSRichard 
34089a1d03eSRichard   for (int I = 0; I < V.size(); I += 2)
34189a1d03eSRichard     Sum++;
34289a1d03eSRichard }
34389a1d03eSRichard 
34489a1d03eSRichard // Checks to make sure that the Index isn't used outside of the container:
IndexUse()34589a1d03eSRichard void IndexUse() {
34689a1d03eSRichard   for (int I = 0; I < V.size(); ++I)
34789a1d03eSRichard     V[I] += 1 + I;
34889a1d03eSRichard }
34989a1d03eSRichard 
35089a1d03eSRichard // Checks for incorrect loop variables.
mixedVariables()35189a1d03eSRichard void mixedVariables() {
35289a1d03eSRichard   int BadIndex;
35389a1d03eSRichard   for (int I = 0; BadIndex < V.size(); ++I)
35489a1d03eSRichard     Sum += V[I];
35589a1d03eSRichard 
35689a1d03eSRichard   for (int I = 0; I < V.size(); ++BadIndex)
35789a1d03eSRichard     Sum += V[I];
35889a1d03eSRichard 
35989a1d03eSRichard   for (int I = 0; BadIndex < V.size(); ++BadIndex)
36089a1d03eSRichard     Sum += V[I];
36189a1d03eSRichard 
36289a1d03eSRichard   for (int I = 0; BadIndex < V.size(); ++BadIndex)
36389a1d03eSRichard     Sum += V[BadIndex];
36489a1d03eSRichard }
36589a1d03eSRichard 
36689a1d03eSRichard // Checks for an array Indexed in addition to the container.
multipleArrays()36789a1d03eSRichard void multipleArrays() {
36889a1d03eSRichard   int BadArr[N];
36989a1d03eSRichard 
37089a1d03eSRichard   for (int I = 0; I < V.size(); ++I)
37189a1d03eSRichard     Sum += V[I] + BadArr[I];
37289a1d03eSRichard 
37389a1d03eSRichard   for (int I = 0; I < V.size(); ++I)
37489a1d03eSRichard     Sum += BadArr[I];
37589a1d03eSRichard 
37689a1d03eSRichard   for (int I = 0; I < V.size(); ++I) {
37789a1d03eSRichard     int K = BadArr[I];
37889a1d03eSRichard     Sum += K + 2;
37989a1d03eSRichard   }
38089a1d03eSRichard 
38189a1d03eSRichard   for (int I = 0; I < V.size(); ++I) {
38289a1d03eSRichard     int K = BadArr[I];
38389a1d03eSRichard     Sum += V[I] + K;
38489a1d03eSRichard   }
38589a1d03eSRichard }
38689a1d03eSRichard 
38789a1d03eSRichard // Checks for multiple containers being Indexed container.
multipleContainers()38889a1d03eSRichard void multipleContainers() {
38989a1d03eSRichard   dependent<int> BadArr;
39089a1d03eSRichard 
39189a1d03eSRichard   for (int I = 0; I < V.size(); ++I)
39289a1d03eSRichard     Sum += V[I] + BadArr[I];
39389a1d03eSRichard 
39489a1d03eSRichard   for (int I = 0; I < V.size(); ++I)
39589a1d03eSRichard     Sum += BadArr[I];
39689a1d03eSRichard 
39789a1d03eSRichard   for (int I = 0; I < V.size(); ++I) {
39889a1d03eSRichard     int K = BadArr[I];
39989a1d03eSRichard     Sum += K + 2;
40089a1d03eSRichard   }
40189a1d03eSRichard 
40289a1d03eSRichard   for (int I = 0; I < V.size(); ++I) {
40389a1d03eSRichard     int K = BadArr[I];
40489a1d03eSRichard     Sum += V[I] + K;
40589a1d03eSRichard   }
40689a1d03eSRichard }
40789a1d03eSRichard 
40889a1d03eSRichard // Check to make sure that dereferenced pointers-to-containers behave nicely.
derefContainer()40989a1d03eSRichard void derefContainer() {
41089a1d03eSRichard   // Note the dependent<T>::operator*() returns another dependent<T>.
41189a1d03eSRichard   // This test makes sure that we don't allow an arbitrary number of *'s.
41289a1d03eSRichard   for (int I = 0; I < Pv->size(); ++I)
41389a1d03eSRichard     Sum += (**Pv).at(I);
41489a1d03eSRichard 
41589a1d03eSRichard   for (int I = 0; I < Pv->size(); ++I)
41689a1d03eSRichard     Sum += (**Pv)[I];
41789a1d03eSRichard }
41889a1d03eSRichard 
wrongEnd()41989a1d03eSRichard void wrongEnd() {
42089a1d03eSRichard   int Bad;
42189a1d03eSRichard   for (int I = 0, E = V.size(); I < Bad; ++I)
42289a1d03eSRichard     Sum += V[I];
42389a1d03eSRichard }
42489a1d03eSRichard 
nonADLOrStdCalls()425*6a1f8ef8SChris Cotter void nonADLOrStdCalls() {
426*6a1f8ef8SChris Cotter   for (int I = 0, E = somenamespace::size(V); E != I; ++I)
427*6a1f8ef8SChris Cotter     printf("Fibonacci number is %d\n", V[I]);
428*6a1f8ef8SChris Cotter   for (int I = 0, E = SomeClass::size(V); E != I; ++I)
429*6a1f8ef8SChris Cotter     printf("Fibonacci number is %d\n", V[I]);
430*6a1f8ef8SChris Cotter }
431*6a1f8ef8SChris Cotter 
43289a1d03eSRichard // Checks to see that non-const member functions are not called on the container
43389a1d03eSRichard // object.
43489a1d03eSRichard // These could be conceivably allowed with a lower required confidence level.
memberFunctionCalled()43589a1d03eSRichard void memberFunctionCalled() {
43689a1d03eSRichard   for (int I = 0; I < V.size(); ++I) {
43789a1d03eSRichard     Sum += V[I];
43889a1d03eSRichard     V.foo();
43989a1d03eSRichard   }
44089a1d03eSRichard 
44189a1d03eSRichard   for (int I = 0; I < V.size(); ++I) {
44289a1d03eSRichard     Sum += V[I];
44389a1d03eSRichard     dependent<int>::iterator It = V.begin();
44489a1d03eSRichard   }
44589a1d03eSRichard }
44689a1d03eSRichard 
44789a1d03eSRichard } // namespace NegativePseudoArray
44889a1d03eSRichard 
44989a1d03eSRichard namespace NegativeMultiEndCall {
45089a1d03eSRichard 
45189a1d03eSRichard S Ss;
45289a1d03eSRichard T Tt;
45389a1d03eSRichard U Uu;
45489a1d03eSRichard 
45589a1d03eSRichard void f(X);
45689a1d03eSRichard void f(S);
45789a1d03eSRichard void f(T);
45889a1d03eSRichard 
complexContainer()45989a1d03eSRichard void complexContainer() {
46089a1d03eSRichard   X Xx;
46189a1d03eSRichard   for (S::iterator I = Xx.Ss.begin(), E = Xx.Ss.end();  I != E; ++I) {
46289a1d03eSRichard     f(Xx);
46389a1d03eSRichard     MutableVal K = *I;
46489a1d03eSRichard   }
46589a1d03eSRichard 
46689a1d03eSRichard   for (T::iterator I = Xx.Tt.begin(), E = Xx.Tt.end();  I != E; ++I) {
46789a1d03eSRichard     f(Xx);
46889a1d03eSRichard     int K = *I;
46989a1d03eSRichard   }
47089a1d03eSRichard 
47189a1d03eSRichard   for (S::iterator I = Xx.Ss.begin(), E = Xx.Ss.end();  I != E; ++I) {
47289a1d03eSRichard     f(Xx.Ss);
47389a1d03eSRichard     MutableVal K = *I;
47489a1d03eSRichard   }
47589a1d03eSRichard 
47689a1d03eSRichard   for (T::iterator I = Xx.Tt.begin(), E = Xx.Tt.end();  I != E; ++I) {
47789a1d03eSRichard     f(Xx.Tt);
47889a1d03eSRichard     int K = *I;
47989a1d03eSRichard   }
48089a1d03eSRichard 
48189a1d03eSRichard   for (S::iterator I = Xx.getS().begin(), E = Xx.getS().end();  I != E; ++I) {
48289a1d03eSRichard     f(Xx.getS());
48389a1d03eSRichard     MutableVal K = *I;
48489a1d03eSRichard   }
48589a1d03eSRichard 
48689a1d03eSRichard   X Exes[5];
48789a1d03eSRichard   int Index = 0;
48889a1d03eSRichard 
48989a1d03eSRichard   for (S::iterator I = Exes[Index].getS().begin(),
49089a1d03eSRichard                    E = Exes[Index].getS().end();
49189a1d03eSRichard         I != E; ++I) {
49289a1d03eSRichard     Index++;
49389a1d03eSRichard     MutableVal K = *I;
49489a1d03eSRichard   }
49589a1d03eSRichard }
49689a1d03eSRichard 
49789a1d03eSRichard } // namespace NegativeMultiEndCall
49889a1d03eSRichard 
49989a1d03eSRichard namespace NoUsages {
50089a1d03eSRichard 
50189a1d03eSRichard const int N = 6;
50289a1d03eSRichard int Arr[N] = {1, 2, 3, 4, 5, 6};
50389a1d03eSRichard S Ss;
50489a1d03eSRichard dependent<int> V;
50589a1d03eSRichard int Count = 0;
50689a1d03eSRichard 
50789a1d03eSRichard void foo();
50889a1d03eSRichard 
f()50989a1d03eSRichard void f() {
51089a1d03eSRichard   for (int I = 0; I < N; ++I) {}
51189a1d03eSRichard   for (int I = 0; I < N; ++I)
51289a1d03eSRichard     printf("Hello world\n");
51389a1d03eSRichard   for (int I = 0; I < N; ++I)
51489a1d03eSRichard     ++Count;
51589a1d03eSRichard   for (int I = 0; I < N; ++I)
51689a1d03eSRichard     foo();
51789a1d03eSRichard 
51889a1d03eSRichard   for (S::iterator I = Ss.begin(), E = Ss.end(); I != E; ++I) {}
51989a1d03eSRichard   for (S::iterator I = Ss.begin(), E = Ss.end(); I != E; ++I)
52089a1d03eSRichard     printf("Hello world\n");
52189a1d03eSRichard   for (S::iterator I = Ss.begin(), E = Ss.end(); I != E; ++I)
52289a1d03eSRichard     ++Count;
52389a1d03eSRichard   for (S::iterator I = Ss.begin(), E = Ss.end(); I != E; ++I)
52489a1d03eSRichard     foo();
52589a1d03eSRichard 
52689a1d03eSRichard   for (int I = 0; I < V.size(); ++I) {}
52789a1d03eSRichard   for (int I = 0; I < V.size(); ++I)
52889a1d03eSRichard     printf("Hello world\n");
52989a1d03eSRichard   for (int I = 0; I < V.size(); ++I)
53089a1d03eSRichard     ++Count;
53189a1d03eSRichard   for (int I = 0; I < V.size(); ++I)
53289a1d03eSRichard     foo();
53389a1d03eSRichard }
53489a1d03eSRichard 
53589a1d03eSRichard } // namespace NoUsages
536