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