Clang Project

clang_source_code/test/Profile/cxx-hash-v2.cpp
1// REQUIRES: shell
2
3// Check that all of the hashes in this file are unique (i.e, that none of the
4// profiles for these functions are mutually interchangeable).
5//
6// RUN: llvm-profdata show -all-functions %S/Inputs/cxx-hash-v2.profdata.v5 | grep "Hash: 0x" | sort > %t.hashes
7// RUN: uniq %t.hashes > %t.hashes.unique
8// RUN: diff %t.hashes %t.hashes.unique
9
10// RUN: llvm-profdata merge %S/Inputs/cxx-hash-v2.proftext -o %t.profdata
11// RUN: %clang_cc1 -std=c++11 -fexceptions -fcxx-exceptions -triple x86_64-apple-macosx10.9 -main-file-name cxx-hash-v2.mm %s -o /dev/null -emit-llvm -fprofile-instrument-use-path=%t.profdata 2>&1 | FileCheck %s -allow-empty
12// RUN: %clang_cc1 -std=c++11 -fexceptions -fcxx-exceptions -triple x86_64-apple-macosx10.9 -main-file-name cxx-hash-v2.mm %s -o /dev/null -emit-llvm -fprofile-instrument-use-path=%S/Inputs/cxx-hash-v2.profdata.v5 2>&1 | FileCheck %s -allow-empty
13
14// CHECK-NOT: warning: profile data may be out of date
15
16int x;
17int arr[1] = {0};
18
19void loop_after_if_else() {
20  if (1)
21    x = 1;
22  else
23    x = 2;
24  while (0)
25    ++x;
26}
27
28void loop_in_then_block() {
29  if (1) {
30    while (0)
31      ++x;
32  } else {
33    x = 2;
34  }
35}
36
37void loop_in_else_block() {
38  if (1) {
39    x = 1;
40  } else {
41    while (0)
42      ++x;
43  }
44}
45
46void if_inside_of_for() {
47  for (x = 0; x < 0; ++x) {
48    x = 1;
49    if (1)
50      x = 2;
51  }
52}
53
54void if_outside_of_for() {
55  for (x = 0; x < 0; ++x)
56    x = 1;
57  if (1)
58    x = 2;
59}
60
61void if_inside_of_while() {
62  while (0) {
63    x = 1;
64    if (1)
65      x = 2;
66  }
67}
68
69void if_outside_of_while() {
70  while (0)
71    x = 1;
72  if (1)
73    x = 2;
74}
75
76void nested_dos() {
77  do {
78    do {
79      ++x;
80    } while (0);
81  } while (0);
82}
83
84void consecutive_dos() {
85  do {
86  } while (0);
87  do {
88    ++x;
89  } while (0);
90}
91
92void loop_empty() {
93  for (x = 0; x < 5; ++x) {}
94}
95
96void loop_return() {
97  for (x = 0; x < 5; ++x)
98    return;
99}
100
101void loop_continue() {
102  for (x = 0; x < 5; ++x)
103    continue;
104}
105
106void loop_break() {
107  for (x = 0; x < 5; ++x)
108    break;
109}
110
111void no_gotos() {
112  static void *dispatch[] = {&&done};
113  x = 0;
114done:
115  ++x;
116}
117
118void direct_goto() {
119  static void *dispatch[] = {&&done};
120  x = 0;
121  goto done;
122done:
123  ++x;
124}
125
126void indirect_goto() {
127  static void *dispatch[] = {&&done};
128  x = 0;
129  goto *dispatch[x];
130done:
131  ++x;
132}
133
134void nested_for_ranges() {
135  for (int a : arr)
136    for (int b : arr)
137      ++x;
138}
139
140void consecutive_for_ranges() {
141  for (int a : arr) {}
142  for (int b : arr)
143    ++x;
144}
145
146void nested_try_catch() {
147  try {
148    try {
149      ++x;
150    } catch (...) {}
151  } catch (...) {}
152}
153
154void consecutive_try_catch() {
155  try {} catch (...) {}
156  try {
157    ++x;
158  } catch (...) {}
159}
160
161void no_throw() {}
162
163void has_throw() {
164  throw 0;
165}
166
167void single_lnot() {
168  if (!x) {}
169}
170
171void double_lnot() {
172  if (!!x) {}
173}
174
175int main() {
176  return 0;
177}
178