// RUN: %clang_cl_asan -O0 %s -Fe%t // RUN: not %run %t 2>&1 | FileCheck %s // // This test makes sure ASan symbolizes stack traces the way they are typically // symbolized on Windows. #include namespace foo { // A template function in a namespace. template void bar(char *p) { *p = x; } // A regular function in a namespace. void spam(char *p) { bar<42>(p); } } // A multi-argument template with a bool template parameter. template void baz(T t) { if (U) foo::spam(t); } template struct A { A(T v) { v_ = v; } ~A(); char *v_; }; // A destructor of a template class. template<> A::~A() { baz(v_); } int main() { char *buffer = (char*)malloc(42); free(buffer); A a(buffer); // CHECK: AddressSanitizer: heap-use-after-free on address [[ADDR:0x[0-9a-f]+]] // CHECK: foo::bar<42>{{.*}}demangled_names.cc // CHECK: foo::spam{{.*}}demangled_names.cc // CHECK: baz{{.*}}demangled_names.cc // CHECK: A::~A{{.*}}demangled_names.cc }