1673dc3d4SNico Weber // RUN: %clang_cl_asan -Od %s -Fe%t
2673dc3d4SNico Weber // RUN: not %run %t 2>&1 | FileCheck %s
3673dc3d4SNico Weber //
4673dc3d4SNico Weber // This test makes sure ASan symbolizes stack traces the way they are typically
5673dc3d4SNico Weber // symbolized on Windows.
6673dc3d4SNico Weber #include <malloc.h>
7673dc3d4SNico Weber 
8673dc3d4SNico Weber namespace foo {
9673dc3d4SNico Weber // A template function in a namespace.
10673dc3d4SNico Weber template<int x>
bar(char * p)11673dc3d4SNico Weber void bar(char *p) {
12673dc3d4SNico Weber   *p = x;
13673dc3d4SNico Weber }
14673dc3d4SNico Weber 
15673dc3d4SNico Weber // A regular function in a namespace.
spam(char * p)16673dc3d4SNico Weber void spam(char *p) {
17673dc3d4SNico Weber   bar<42>(p);
18673dc3d4SNico Weber }
19673dc3d4SNico Weber }
20673dc3d4SNico Weber 
21673dc3d4SNico Weber // A multi-argument template with a bool template parameter.
22673dc3d4SNico Weber template<typename T, bool U>
baz(T t)23673dc3d4SNico Weber void baz(T t) {
24673dc3d4SNico Weber   if (U)
25673dc3d4SNico Weber     foo::spam(t);
26673dc3d4SNico Weber }
27673dc3d4SNico Weber 
28673dc3d4SNico Weber template<typename T>
29673dc3d4SNico Weber struct A {
AA30673dc3d4SNico Weber   A(T v) { v_ = v; }
31673dc3d4SNico Weber   ~A();
32673dc3d4SNico Weber   char *v_;
33673dc3d4SNico Weber };
34673dc3d4SNico Weber 
35673dc3d4SNico Weber // A destructor of a template class.
36673dc3d4SNico Weber template<>
~A()37673dc3d4SNico Weber A<char*>::~A() {
38673dc3d4SNico Weber   baz<char*, true>(v_);
39673dc3d4SNico Weber }
40673dc3d4SNico Weber 
main()41673dc3d4SNico Weber int main() {
42673dc3d4SNico Weber   char *buffer = (char*)malloc(42);
43673dc3d4SNico Weber   free(buffer);
44673dc3d4SNico Weber   A<char*> a(buffer);
45673dc3d4SNico Weber // CHECK: AddressSanitizer: heap-use-after-free on address [[ADDR:0x[0-9a-f]+]]
46673dc3d4SNico Weber // CHECK: foo::bar<42>{{.*}}demangled_names.cpp
47673dc3d4SNico Weber // CHECK: foo::spam{{.*}}demangled_names.cpp
48*0aaa1931SReid Kleckner // CHECK: baz<char *,{{ *}}1>{{.*}}demangled_names.cpp
49673dc3d4SNico Weber // CHECK: A<char *>::~A<char *>{{.*}}demangled_names.cpp
50673dc3d4SNico Weber }
51