// 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 <malloc.h> namespace foo { // A template function in a namespace. template<int x> 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<typename T, bool U> void baz(T t) { if (U) foo::spam(t); } template<typename T> struct A { A(T v) { v_ = v; } ~A(); char *v_; }; // A destructor of a template class. template<> A<char*>::~A() { baz<char*, true>(v_); } int main() { char *buffer = (char*)malloc(42); free(buffer); A<char*> 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<char *,1>{{.*}}demangled_names.cc // CHECK: A<char *>::~A<char *>{{.*}}demangled_names.cc }