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 Webervoid bar(char *p) { 12673dc3d4SNico Weber *p = x; 13673dc3d4SNico Weber } 14673dc3d4SNico Weber 15673dc3d4SNico Weber // A regular function in a namespace. spam(char * p)16673dc3d4SNico Webervoid 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 Webervoid 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 WeberA<char*>::~A() { 38673dc3d4SNico Weber baz<char*, true>(v_); 39673dc3d4SNico Weber } 40673dc3d4SNico Weber main()41673dc3d4SNico Weberint 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