1a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany// RUN: %clangxx_asan %s -o %t && %t
2a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany// http://code.google.com/p/address-sanitizer/issues/detail?id=147 (not fixed).
3a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany// BROKEN: %clangxx_asan %s -o %t -static-libstdc++ && %t
4a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany#include <stdio.h>
5a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryanystatic volatile int zero = 0;
6a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryanyinline void pretend_to_do_something(void *x) {
7a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany  __asm__ __volatile__("" : : "r" (x) : "memory");
8a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany}
9a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany
1000b8a34250e9f6c1c0211c33f4fe4da15d0fb24aKostya Serebryany__attribute__((noinline, no_sanitize_address))
11a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryanyvoid ReallyThrow() {
12a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany  fprintf(stderr, "ReallyThrow\n");
13a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany  if (zero == 0)
14a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany    throw 42;
15a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany}
16a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany
17a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany__attribute__((noinline))
18a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryanyvoid Throw() {
19a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany  int a, b, c, d, e;
20a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany  pretend_to_do_something(&a);
21a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany  pretend_to_do_something(&b);
22a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany  pretend_to_do_something(&c);
23a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany  pretend_to_do_something(&d);
24a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany  pretend_to_do_something(&e);
25a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany  fprintf(stderr, "Throw stack = %p\n", &a);
26a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany  ReallyThrow();
27a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany}
28a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany
29a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany__attribute__((noinline))
30a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryanyvoid CheckStack() {
31a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany  int ar[100];
32a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany  pretend_to_do_something(ar);
33a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany  for (int i = 0; i < 100; i++)
34a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany    ar[i] = i;
35a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany  fprintf(stderr, "CheckStack stack = %p, %p\n", ar, ar + 100);
36a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany}
37a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany
38a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryanyint main(int argc, char** argv) {
39a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany  try {
40a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany    Throw();
4169b109a665247d424874253b412fe9b5253d1702Evgeniy Stepanov  } catch(int a) {
42a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany    fprintf(stderr, "a = %d\n", a);
43a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany  }
44a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany  CheckStack();
45a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany}
46