blob: c5ddae5a65f3e0f5e74ebbf0061379848ad5d423 [file] [log] [blame]
Raphael Isemann561f0de2017-09-04 05:56:36 +00001// RUN: %clang_analyze_cc1 -std=c++1z -analyzer-checker=alpha.clone.CloneChecker -analyzer-config alpha.clone.CloneChecker:MinimumCloneComplexity=10 -verify %s
Artem Dergachev78692ea2016-08-02 12:21:09 +00002
3// expected-no-diagnostics
4
5bool a();
6bool b();
7
8// Calls method a with some extra code to pass the minimum complexity
9bool 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
18bool foo2(int x) {
19 if (x > 0)
20 return false;
21 else if (x < 0)
22 return b();
23 return true;
24}
Artem Dergachevcad15142016-08-10 16:25:16 +000025
26// Test that we don't crash on function pointer calls
27
28bool (*funcPtr)(int);
29
30bool fooPtr1(int x) {
31 if (x > 0)
32 return false;
33 else if (x < 0)
34 return funcPtr(1);
35 return true;
36}
Artem Dergachev51838882016-08-20 09:57:21 +000037
38// Test that we respect the template arguments of function templates
39
40template<typename T, unsigned N>
41bool templateFunc() { unsigned i = N; return false; }
42
43bool 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
51bool 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
59bool 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
70class X {};
71class XX {};
72
73template<typename T1, typename T2>
74bool templatePaddingFunc() { return false; }
75
76bool 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
84bool fooTemplatePadding2(int x) {
85 if (x > 0)
86 return false;
87 else if (x < 0)
88 return templatePaddingFunc<XX, X>();
89 return true;
90}
Artem Dergachev5f94b082016-08-23 16:42:00 +000091
92// Test that we don't crash on member functions of template instantiations.
93
94template<typename T>
95struct A {
96 void foo(T t) {}
97};
98
99void fooTestInstantiation() {
100 A<int> a;
101 a.foo(1);
102}