xref: /llvm-project/clang/test/Analysis/copypaste/functions.cpp (revision 561f0de6d96eff6efc53e6e8b07bc9408304b381)
1*561f0de6SRaphael Isemann // RUN: %clang_analyze_cc1 -std=c++11 -analyzer-checker=alpha.clone.CloneChecker -analyzer-config alpha.clone.CloneChecker:MinimumCloneComplexity=10 -verify %s
2ba816326SArtem Dergachev 
3ba816326SArtem Dergachev // This tests if we search for clones in functions.
4ba816326SArtem Dergachev 
5ba816326SArtem Dergachev void log();
6ba816326SArtem Dergachev 
max(int a,int b)74eca0de7SArtem Dergachev int max(int a, int b) { // expected-warning{{Duplicate code detected}}
8ba816326SArtem Dergachev   log();
9ba816326SArtem Dergachev   if (a > b)
10ba816326SArtem Dergachev     return a;
11ba816326SArtem Dergachev   return b;
12ba816326SArtem Dergachev }
13ba816326SArtem Dergachev 
maxClone(int x,int y)144eca0de7SArtem Dergachev int maxClone(int x, int y) { // expected-note{{Similar code here}}
15ba816326SArtem Dergachev   log();
16ba816326SArtem Dergachev   if (x > y)
17ba816326SArtem Dergachev     return x;
18ba816326SArtem Dergachev   return y;
19ba816326SArtem Dergachev }
20ba816326SArtem Dergachev 
21ba816326SArtem Dergachev // Functions below are not clones and should not be reported.
22ba816326SArtem Dergachev 
2378692ea5SArtem Dergachev // The next two functions test that statement classes are still respected when
2478692ea5SArtem Dergachev // checking for clones in expressions. This will show that the statement
2578692ea5SArtem Dergachev // specific data of all base classes is collected, and not just the data of the
2678692ea5SArtem Dergachev // first base class.
testBaseClass(int a,int b)2778692ea5SArtem Dergachev int testBaseClass(int a, int b) { // no-warning
2878692ea5SArtem Dergachev   log();
2978692ea5SArtem Dergachev   if (a > b)
3078692ea5SArtem Dergachev     return true ? a : b;
3178692ea5SArtem Dergachev   return b;
3278692ea5SArtem Dergachev }
testBaseClass2(int a,int b)3378692ea5SArtem Dergachev int testBaseClass2(int a, int b) { // no-warning
3478692ea5SArtem Dergachev   log();
3578692ea5SArtem Dergachev   if (a > b)
3678692ea5SArtem Dergachev     return __builtin_choose_expr(true, a, b);
3778692ea5SArtem Dergachev   return b;
3878692ea5SArtem Dergachev }
3978692ea5SArtem Dergachev 
407a0088bbSArtem Dergachev // No clone because of the different comparison operator.
min1(int a,int b)4178692ea5SArtem Dergachev int min1(int a, int b) { // no-warning
4278692ea5SArtem Dergachev   log();
4378692ea5SArtem Dergachev   if (a < b)
4478692ea5SArtem Dergachev     return a;
4578692ea5SArtem Dergachev   return b;
4678692ea5SArtem Dergachev }
4778692ea5SArtem Dergachev 
487a0088bbSArtem Dergachev // No clone because of the different pattern in which the variables are used.
min2(int a,int b)497a0088bbSArtem Dergachev int min2(int a, int b) { // no-warning
507a0088bbSArtem Dergachev   log();
517a0088bbSArtem Dergachev   if (a > b)
527a0088bbSArtem Dergachev     return b;
537a0088bbSArtem Dergachev   return a;
547a0088bbSArtem Dergachev }
557a0088bbSArtem Dergachev 
foo(int a,int b)56ba816326SArtem Dergachev int foo(int a, int b) { // no-warning
57ba816326SArtem Dergachev   return a + b;
58ba816326SArtem Dergachev }
59