|  | // REQUIRES: shell | 
|  |  | 
|  | // Check that all of the hashes in this file are unique (i.e, that none of the | 
|  | // profiles for these functions are mutually interchangeable). | 
|  | // | 
|  | // RUN: llvm-profdata show -all-functions %S/Inputs/cxx-hash-v2.profdata.v5 | grep "Hash: 0x" | sort > %t.hashes | 
|  | // RUN: uniq %t.hashes > %t.hashes.unique | 
|  | // RUN: diff %t.hashes %t.hashes.unique | 
|  |  | 
|  | // RUN: llvm-profdata merge %S/Inputs/cxx-hash-v2.proftext -o %t.profdata | 
|  | // 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 | 
|  | // 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 | 
|  |  | 
|  | // CHECK-NOT: warning: profile data may be out of date | 
|  |  | 
|  | int x; | 
|  | int arr[1] = {0}; | 
|  |  | 
|  | void loop_after_if_else() { | 
|  | if (1) | 
|  | x = 1; | 
|  | else | 
|  | x = 2; | 
|  | while (0) | 
|  | ++x; | 
|  | } | 
|  |  | 
|  | void loop_in_then_block() { | 
|  | if (1) { | 
|  | while (0) | 
|  | ++x; | 
|  | } else { | 
|  | x = 2; | 
|  | } | 
|  | } | 
|  |  | 
|  | void loop_in_else_block() { | 
|  | if (1) { | 
|  | x = 1; | 
|  | } else { | 
|  | while (0) | 
|  | ++x; | 
|  | } | 
|  | } | 
|  |  | 
|  | void if_inside_of_for() { | 
|  | for (x = 0; x < 0; ++x) { | 
|  | x = 1; | 
|  | if (1) | 
|  | x = 2; | 
|  | } | 
|  | } | 
|  |  | 
|  | void if_outside_of_for() { | 
|  | for (x = 0; x < 0; ++x) | 
|  | x = 1; | 
|  | if (1) | 
|  | x = 2; | 
|  | } | 
|  |  | 
|  | void if_inside_of_while() { | 
|  | while (0) { | 
|  | x = 1; | 
|  | if (1) | 
|  | x = 2; | 
|  | } | 
|  | } | 
|  |  | 
|  | void if_outside_of_while() { | 
|  | while (0) | 
|  | x = 1; | 
|  | if (1) | 
|  | x = 2; | 
|  | } | 
|  |  | 
|  | void nested_dos() { | 
|  | do { | 
|  | do { | 
|  | ++x; | 
|  | } while (0); | 
|  | } while (0); | 
|  | } | 
|  |  | 
|  | void consecutive_dos() { | 
|  | do { | 
|  | } while (0); | 
|  | do { | 
|  | ++x; | 
|  | } while (0); | 
|  | } | 
|  |  | 
|  | void loop_empty() { | 
|  | for (x = 0; x < 5; ++x) {} | 
|  | } | 
|  |  | 
|  | void loop_return() { | 
|  | for (x = 0; x < 5; ++x) | 
|  | return; | 
|  | } | 
|  |  | 
|  | void loop_continue() { | 
|  | for (x = 0; x < 5; ++x) | 
|  | continue; | 
|  | } | 
|  |  | 
|  | void loop_break() { | 
|  | for (x = 0; x < 5; ++x) | 
|  | break; | 
|  | } | 
|  |  | 
|  | void no_gotos() { | 
|  | static void *dispatch[] = {&&done}; | 
|  | x = 0; | 
|  | done: | 
|  | ++x; | 
|  | } | 
|  |  | 
|  | void direct_goto() { | 
|  | static void *dispatch[] = {&&done}; | 
|  | x = 0; | 
|  | goto done; | 
|  | done: | 
|  | ++x; | 
|  | } | 
|  |  | 
|  | void indirect_goto() { | 
|  | static void *dispatch[] = {&&done}; | 
|  | x = 0; | 
|  | goto *dispatch[x]; | 
|  | done: | 
|  | ++x; | 
|  | } | 
|  |  | 
|  | void nested_for_ranges() { | 
|  | for (int a : arr) | 
|  | for (int b : arr) | 
|  | ++x; | 
|  | } | 
|  |  | 
|  | void consecutive_for_ranges() { | 
|  | for (int a : arr) {} | 
|  | for (int b : arr) | 
|  | ++x; | 
|  | } | 
|  |  | 
|  | void nested_try_catch() { | 
|  | try { | 
|  | try { | 
|  | ++x; | 
|  | } catch (...) {} | 
|  | } catch (...) {} | 
|  | } | 
|  |  | 
|  | void consecutive_try_catch() { | 
|  | try {} catch (...) {} | 
|  | try { | 
|  | ++x; | 
|  | } catch (...) {} | 
|  | } | 
|  |  | 
|  | void no_throw() {} | 
|  |  | 
|  | void has_throw() { | 
|  | throw 0; | 
|  | } | 
|  |  | 
|  | void single_lnot() { | 
|  | if (!x) {} | 
|  | } | 
|  |  | 
|  | void double_lnot() { | 
|  | if (!!x) {} | 
|  | } | 
|  |  | 
|  | int main() { | 
|  | return 0; | 
|  | } |