• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // RUN: %clang_analyze_cc1 -std=c++1z -analyzer-checker=alpha.clone.CloneChecker -analyzer-config alpha.clone.CloneChecker:MinimumCloneComplexity=10 -verify %s
2 
3 // expected-no-diagnostics
4 
5 bool a();
6 bool b();
7 
8 // Calls method a with some extra code to pass the minimum complexity
foo1(int x)9 bool foo1(int x) {
10   if (x > 0)
11     return false;
12   else if (x < 0)
13     return a();
14   return true;
15 }
16 
17 // Calls method b with some extra code to pass the minimum complexity
foo2(int x)18 bool foo2(int x) {
19   if (x > 0)
20     return false;
21   else if (x < 0)
22     return b();
23   return true;
24 }
25 
26 // Test that we don't crash on function pointer calls
27 
28 bool (*funcPtr)(int);
29 
fooPtr1(int x)30 bool fooPtr1(int x) {
31   if (x > 0)
32     return false;
33   else if (x < 0)
34     return funcPtr(1);
35   return true;
36 }
37 
38 // Test that we respect the template arguments of function templates
39 
40 template<typename T, unsigned N>
templateFunc()41 bool templateFunc() { unsigned i = N; return false; }
42 
fooTemplate1(int x)43 bool fooTemplate1(int x) {
44   if (x > 0)
45     return false;
46   else if (x < 0)
47     return templateFunc<int, 1>();
48   return true;
49 }
50 
fooTemplate2(int x)51 bool fooTemplate2(int x) {
52   if (x > 0)
53     return false;
54   else if (x < 0)
55     return templateFunc<long, 1>();
56   return true;
57 }
58 
fooTemplate3(int x)59 bool fooTemplate3(int x) {
60   if (x > 0)
61     return false;
62   else if (x < 0)
63     return templateFunc<long, 2>();
64   return true;
65 }
66 
67 // Test that we don't just concatenate the template arguments into a string
68 // without having any padding between them (e.g. foo<X, XX>() != foo<XX, X>()).
69 
70 class X {};
71 class XX {};
72 
73 template<typename T1, typename T2>
templatePaddingFunc()74 bool templatePaddingFunc() { return false; }
75 
fooTemplatePadding1(int x)76 bool fooTemplatePadding1(int x) {
77   if (x > 0)
78     return false;
79   else if (x < 0)
80     return templatePaddingFunc<X, XX>();
81   return true;
82 }
83 
fooTemplatePadding2(int x)84 bool fooTemplatePadding2(int x) {
85   if (x > 0)
86     return false;
87   else if (x < 0)
88     return templatePaddingFunc<XX, X>();
89   return true;
90 }
91 
92 // Test that we don't crash on member functions of template instantiations.
93 
94 template<typename T>
95 struct A {
fooA96   void foo(T t) {}
97 };
98 
fooTestInstantiation()99 void fooTestInstantiation() {
100   A<int> a;
101   a.foo(1);
102 }
103