// This is the ASAN test of the same name ported to HWAsan.

// RUN: %clangxx_hwasan -mllvm -hwasan-use-after-scope -std=c++11 -O0 %s -o %t
// RUN: %clangxx_hwasan -fno-exceptions -mllvm -hwasan-use-after-scope -std=c++11 -O0 %s -o %t-noexcept

// RUN: not %run %t 0 2>&1 | FileCheck %s
// RUN: not %run %t 1 2>&1 | FileCheck %s
// RUN: not %run %t 2 2>&1 | FileCheck %s
// RUN: not %run %t 3 2>&1 | FileCheck %s
// RUN: not %run %t 4 2>&1 | FileCheck %s
// RUN: not %run %t 5 2>&1 | FileCheck %s
// RUN: not %run %t 6 2>&1 | FileCheck %s
// RUN: not %run %t 7 2>&1 | FileCheck %s
// RUN: not %run %t 8 2>&1 | FileCheck %s
// RUN: not %run %t 9 2>&1 | FileCheck %s
// RUN: not %run %t 10 2>&1 | FileCheck %s

// RUN: not %run %t-noexcept 0 2>&1 | FileCheck %s
// RUN: not %run %t-noexcept 1 2>&1 | FileCheck %s
// RUN: not %run %t-noexcept 2 2>&1 | FileCheck %s
// RUN: not %run %t-noexcept 3 2>&1 | FileCheck %s
// RUN: not %run %t-noexcept 4 2>&1 | FileCheck %s
// RUN: not %run %t-noexcept 5 2>&1 | FileCheck %s
// RUN: not %run %t-noexcept 6 2>&1 | FileCheck %s
// RUN: not %run %t-noexcept 7 2>&1 | FileCheck %s
// RUN: not %run %t-noexcept 8 2>&1 | FileCheck %s
// RUN: not %run %t-noexcept 9 2>&1 | FileCheck %s
// RUN: not %run %t-noexcept 10 2>&1 | FileCheck %s

// REQUIRES: aarch64-target-arch
// REQUIRES: stable-runtime

#include <stdlib.h>
#include <string>
#include <vector>

template <class T>
struct Ptr {
  void Store(T *ptr) { t = ptr; }

  void Access() { *t = {}; }

  T *t;
};

template <class T, size_t N>
struct Ptr<T[N]> {
  using Type = T[N];
  void Store(Type *ptr) { t = *ptr; }

  void Access() { *t = {}; }

  T *t;
};

template <class T>
__attribute__((noinline)) void test() {
  Ptr<T> ptr;
  {
    T x;
    ptr.Store(&x);
  }

  ptr.Access();
  // CHECK: ERROR: HWAddressSanitizer: tag-mismatch
  // CHECK:  #{{[0-9]+}} 0x{{.*}} in {{(void )?test.*\((void)?\) .*}}use-after-scope-types.cpp
  // CHECK: Cause: stack tag-mismatch
}

int main(int argc, char **argv) {
  using Tests = void (*)();
  Tests tests[] = {
      &test<bool>,
      &test<char>,
      &test<int>,
      &test<double>,
      &test<float>,
      &test<void *>,
      &test<std::vector<std::string>>,
      &test<int[3]>,
      &test<int[1000]>,
      &test<char[3]>,
      &test<char[1000]>,
  };

  int n = atoi(argv[1]);
  if (n == sizeof(tests) / sizeof(tests[0])) {
    for (auto te : tests)
      te();
  } else {
    tests[n]();
  }

  return 0;
}
