1c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// Test dedup_token_length
2c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// RUN: %clangxx -O0 %s -o %t
3c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// RUN: env %tool_options='abort_on_error=0'                    not %run %t 2>&1   | FileCheck %s --check-prefix=CHECK0
4c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// RUN: env %tool_options='abort_on_error=0, dedup_token_length=0' not %run %t 2>&1   | FileCheck %s --check-prefix=CHECK0
5c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// RUN: env %tool_options='abort_on_error=0, dedup_token_length=1' not %run %t 2>&1   | FileCheck %s --check-prefix=CHECK1
6c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// RUN: env %tool_options='abort_on_error=0, dedup_token_length=2' not %run %t 2>&1   | FileCheck %s --check-prefix=CHECK2
7c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// RUN: env %tool_options='abort_on_error=0, dedup_token_length=3' not %run %t 2>&1   | FileCheck %s --check-prefix=CHECK3
8c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar
9c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// REQUIRES: stable-runtime
10c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// FIXME: implement SEGV handler in other sanitizers, not just asan.
11c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// XFAIL: msan
12c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// XFAIL: lsan
13c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// XFAIL: tsan
14c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar
15c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainarvolatile int *null = 0;
16c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar
17c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainarnamespace Xyz {
18c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  template<class A, class B> void Abc() {
19c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar    *null = 0;
20c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  }
21c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar}
22c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar
23c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainarextern "C" void bar() {
24c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  Xyz::Abc<int, int>();
25c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar}
26c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar
27c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainarvoid FOO() {
28c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  bar();
29c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar}
30c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar
31c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainarint main(int argc, char **argv) {
32c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  FOO();
33c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar}
34c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar
35c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// CHECK0-NOT: DEDUP_TOKEN:
36c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// CHECK1: DEDUP_TOKEN: void Xyz::Abc<int, int>()
37c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// CHECK1-NOT: bar
38c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// CHECK2: DEDUP_TOKEN: void Xyz::Abc<int, int>()--bar
39c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// CHECK2-NOT: FOO
40c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// CHECK3: DEDUP_TOKEN: void Xyz::Abc<int, int>()--bar--FOO()
41