1*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -fexceptions -triple x86_64-windows-msvc -debug-info-kind=limited -gcodeview -fdeclspec -S -emit-llvm %s -o - | FileCheck %s
2ce7d3e1cSArthur Eubanks 
3ce7d3e1cSArthur Eubanks struct Foo {
4ce7d3e1cSArthur Eubanks   int x;
5ce7d3e1cSArthur Eubanks };
6ce7d3e1cSArthur Eubanks struct Bar {
7ce7d3e1cSArthur Eubanks   int y;
8ce7d3e1cSArthur Eubanks };
9ce7d3e1cSArthur Eubanks extern Foo *gv_foo;
10ce7d3e1cSArthur Eubanks extern Bar *gv_bar;
doit()11ce7d3e1cSArthur Eubanks extern "C" void doit() {
12ce7d3e1cSArthur Eubanks   gv_foo = new Foo();
13ce7d3e1cSArthur Eubanks   gv_bar = new Bar();
14ce7d3e1cSArthur Eubanks }
15ce7d3e1cSArthur Eubanks 
16ce7d3e1cSArthur Eubanks // CHECK-LABEL: define {{.*}}void @doit
171b1c8d83Shyeongyu kim // CHECK: call {{.*}} i8* {{.*}}@"??2@YAPEAX_K@Z"(i64 noundef 4) {{.*}} !heapallocsite [[DBG_FOO:!.*]]
181b1c8d83Shyeongyu kim // CHECK: call {{.*}} i8* {{.*}}@"??2@YAPEAX_K@Z"(i64 noundef 4) {{.*}} !heapallocsite [[DBG_BAR:!.*]]
19ce7d3e1cSArthur Eubanks 
useinvoke()20ce7d3e1cSArthur Eubanks extern "C" void useinvoke() {
21ce7d3e1cSArthur Eubanks   struct HasDtor {
22ce7d3e1cSArthur Eubanks     ~HasDtor() { delete gv_foo; }
23ce7d3e1cSArthur Eubanks   } o;
24ce7d3e1cSArthur Eubanks   gv_foo = new Foo();
25ce7d3e1cSArthur Eubanks }
26ce7d3e1cSArthur Eubanks 
27ce7d3e1cSArthur Eubanks // CHECK-LABEL: define {{.*}}void @useinvoke
281b1c8d83Shyeongyu kim // CHECK: invoke {{.*}} i8* {{.*}}@"??2@YAPEAX_K@Z"(i64 noundef 4)
29ce7d3e1cSArthur Eubanks // CHECK-NEXT: to label {{.*}} unwind label {{.*}} !heapallocsite [[DBG_FOO]]
30ce7d3e1cSArthur Eubanks 
31ce7d3e1cSArthur Eubanks // CHECK: [[DBG_FOO]] = distinct !DICompositeType(tag: DW_TAG_structure_type,
32ce7d3e1cSArthur Eubanks // CHECK-SAME:                                 name: "Foo"
33ce7d3e1cSArthur Eubanks // CHECK: [[DBG_BAR]] = distinct !DICompositeType(tag: DW_TAG_structure_type,
34ce7d3e1cSArthur Eubanks // CHECK-SAME:                                 name: "Bar"
35ce7d3e1cSArthur Eubanks 
36ce7d3e1cSArthur Eubanks // a new expression in a default arg has caused crashes in the past, add here to test that edge case
foo(int * a=new int)37ce7d3e1cSArthur Eubanks void foo(int *a = new int) {}
bar()38ce7d3e1cSArthur Eubanks void bar() { foo(); }
39