59 lines · cpp
1// RUN: %clang_analyze_cc1 -std=c++11 -analyzer-checker=alpha.clone.CloneChecker -analyzer-config alpha.clone.CloneChecker:MinimumCloneComplexity=10 -verify %s2 3// This tests if we search for clones in functions.4 5void log();6 7int max(int a, int b) { // expected-warning{{Duplicate code detected}}8 log();9 if (a > b)10 return a;11 return b;12}13 14int maxClone(int x, int y) { // expected-note{{Similar code here}}15 log();16 if (x > y)17 return x;18 return y;19}20 21// Functions below are not clones and should not be reported.22 23// The next two functions test that statement classes are still respected when24// checking for clones in expressions. This will show that the statement25// specific data of all base classes is collected, and not just the data of the26// first base class.27int testBaseClass(int a, int b) { // no-warning28 log();29 if (a > b)30 return true ? a : b;31 return b;32}33int testBaseClass2(int a, int b) { // no-warning34 log();35 if (a > b)36 return __builtin_choose_expr(true, a, b);37 return b;38}39 40// No clone because of the different comparison operator.41int min1(int a, int b) { // no-warning42 log();43 if (a < b)44 return a;45 return b;46}47 48// No clone because of the different pattern in which the variables are used.49int min2(int a, int b) { // no-warning50 log();51 if (a > b)52 return b;53 return a;54}55 56int foo(int a, int b) { // no-warning57 return a + b;58}59