mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-09-24 19:50:14 +01:00
Rename and rearrange entities in tests to avoid name reuse (#7656)
Fix a bunch of cases where we use the same external name to mean multiple different things in the same test. We've historically gotten away with this, but under `--share-cpp-ast`, it becomes an error, at least if the entity is either defined in, or used from, C++ code. Assisted-by: Gemini via Antigravity (original change) and Claude Code (suggested edits in review) --------- Co-authored-by: Chandler Carruth <chandlerc@gmail.com>
This commit is contained in:
co-authored by
Chandler Carruth
parent
6eb900dff5
commit
c588eadb57
+102
-102
@@ -34,40 +34,40 @@ library "[[@TEST_NAME]]";
|
||||
|
||||
import Cpp;
|
||||
|
||||
base class A {
|
||||
base class LayoutA {
|
||||
var x: i32*;
|
||||
var y: i32;
|
||||
}
|
||||
|
||||
class B {
|
||||
var a: A;
|
||||
class LayoutB {
|
||||
var a: LayoutA;
|
||||
var b: i32;
|
||||
}
|
||||
|
||||
class C {
|
||||
extend base: A;
|
||||
class LayoutC {
|
||||
extend base: LayoutA;
|
||||
var c: i32;
|
||||
}
|
||||
|
||||
fn CallA(a: A*);
|
||||
fn CallB(b: B*);
|
||||
fn CallC(b: C*);
|
||||
fn CallLayoutA(a: LayoutA*);
|
||||
fn CallLayoutB(b: LayoutB*);
|
||||
fn CallLayoutC(b: LayoutC*);
|
||||
|
||||
inline Cpp '''
|
||||
void f() {
|
||||
Carbon::A a;
|
||||
Carbon::CallA(&a);
|
||||
Carbon::LayoutA a;
|
||||
Carbon::CallLayoutA(&a);
|
||||
}
|
||||
|
||||
void g() {
|
||||
Carbon::B b;
|
||||
Carbon::CallB(&b);
|
||||
Carbon::LayoutB b;
|
||||
Carbon::CallLayoutB(&b);
|
||||
}
|
||||
|
||||
void h() {
|
||||
Carbon::C c;
|
||||
Carbon::CallC(&c);
|
||||
Carbon::CallA(&c);
|
||||
Carbon::LayoutC c;
|
||||
Carbon::CallLayoutC(&c);
|
||||
Carbon::CallLayoutA(&c);
|
||||
}
|
||||
''';
|
||||
|
||||
@@ -77,20 +77,20 @@ library "[[@TEST_NAME]]";
|
||||
|
||||
import Cpp;
|
||||
|
||||
class C {
|
||||
class FieldC {
|
||||
var a: i32;
|
||||
var b: i32;
|
||||
}
|
||||
|
||||
inline Cpp '''
|
||||
void F(Carbon::C& c) {
|
||||
void F(Carbon::FieldC& c) {
|
||||
c.a = 12;
|
||||
c.b = 34;
|
||||
}
|
||||
''';
|
||||
|
||||
fn G() {
|
||||
var c: C = {.a = 0, .b = 0};
|
||||
var c: FieldC = {.a = 0, .b = 0};
|
||||
Cpp.F(ref c);
|
||||
}
|
||||
|
||||
@@ -157,23 +157,23 @@ fn G() {
|
||||
// CHECK:STDOUT: target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
|
||||
// CHECK:STDOUT: target triple = "x86_64-unknown-linux-gnu"
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: %"class.Carbon::A" = type <{ ptr, i32 }>
|
||||
// CHECK:STDOUT: %"class.Carbon::B" = type { %"class.Carbon::A", i32 }
|
||||
// CHECK:STDOUT: %"class.Carbon::C" = type { %"class.Carbon::A", i32 }
|
||||
// CHECK:STDOUT: %"class.Carbon::LayoutA" = type <{ ptr, i32 }>
|
||||
// CHECK:STDOUT: %"class.Carbon::LayoutB" = type { %"class.Carbon::LayoutA", i32 }
|
||||
// CHECK:STDOUT: %"class.Carbon::LayoutC" = type { %"class.Carbon::LayoutA", i32 }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: $_ZN6Carbon1AD2Ev = comdat any
|
||||
// CHECK:STDOUT: $_ZN6Carbon7LayoutAD2Ev = comdat any
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: $_ZN6Carbon1BD2Ev = comdat any
|
||||
// CHECK:STDOUT: $_ZN6Carbon7LayoutBD2Ev = comdat any
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: $_ZN6Carbon1CD2Ev = comdat any
|
||||
// CHECK:STDOUT: $_ZN6Carbon7LayoutCD2Ev = comdat any
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: mustprogress nounwind uwtable
|
||||
// CHECK:STDOUT: define dso_local void @_Z1fv() #0 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %a = alloca %"class.Carbon::A", align 8
|
||||
// CHECK:STDOUT: %a = alloca %"class.Carbon::LayoutA", align 8
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %a) #5
|
||||
// CHECK:STDOUT: call void @_ZN6CarbonL5CallAEPNS_1AE(ptr noundef %a)
|
||||
// CHECK:STDOUT: call void @_ZN6Carbon1AD2Ev(ptr noundef nonnull align 8 dead_on_return(12) dereferenceable(12) %a) #5
|
||||
// CHECK:STDOUT: call void @_ZN6CarbonL11CallLayoutAEPNS_7LayoutAE(ptr noundef %a)
|
||||
// CHECK:STDOUT: call void @_ZN6Carbon7LayoutAD2Ev(ptr noundef nonnull align 8 dead_on_return(12) dereferenceable(12) %a) #5
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.end.p0(ptr %a) #5
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
@@ -182,21 +182,21 @@ fn G() {
|
||||
// CHECK:STDOUT: declare void @llvm.lifetime.start.p0(ptr captures(none)) #1
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: alwaysinline mustprogress nounwind uwtable
|
||||
// CHECK:STDOUT: define internal void @_ZN6CarbonL5CallAEPNS_1AE(ptr noundef %0) #2 {
|
||||
// CHECK:STDOUT: define internal void @_ZN6CarbonL11CallLayoutAEPNS_7LayoutAE(ptr noundef %0) #2 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %.addr = alloca ptr, align 8
|
||||
// CHECK:STDOUT: store ptr %0, ptr %.addr, align 8, !tbaa !12
|
||||
// CHECK:STDOUT: call void @_CCallA__carbon_thunk.Main(ptr noundef nonnull align 8 dereferenceable(8) %.addr)
|
||||
// CHECK:STDOUT: call void @_CCallLayoutA__carbon_thunk.Main(ptr noundef nonnull align 8 dereferenceable(8) %.addr)
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: inlinehint mustprogress nounwind uwtable
|
||||
// CHECK:STDOUT: define linkonce_odr dso_local void @_ZN6Carbon1AD2Ev(ptr noundef nonnull align 8 dead_on_return(12) dereferenceable(12) %this) unnamed_addr #3 comdat align 2 {
|
||||
// CHECK:STDOUT: define linkonce_odr dso_local void @_ZN6Carbon7LayoutAD2Ev(ptr noundef nonnull align 8 dead_on_return(12) dereferenceable(12) %this) unnamed_addr #3 comdat align 2 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %this.addr = alloca ptr, align 8
|
||||
// CHECK:STDOUT: store ptr %this, ptr %this.addr, align 8, !tbaa !12
|
||||
// CHECK:STDOUT: %this1 = load ptr, ptr %this.addr, align 8
|
||||
// CHECK:STDOUT: call void @"_C__destroy_thunk:thunk.A.Main"(ptr noundef nonnull align 8 dereferenceable(12) %this1)
|
||||
// CHECK:STDOUT: call void @"_C__destroy_thunk:thunk.LayoutA.Main"(ptr noundef nonnull align 8 dereferenceable(12) %this1)
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
@@ -206,77 +206,77 @@ fn G() {
|
||||
// CHECK:STDOUT: ; Function Attrs: mustprogress nounwind uwtable
|
||||
// CHECK:STDOUT: define dso_local void @_Z1gv() #0 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %b = alloca %"class.Carbon::B", align 8
|
||||
// CHECK:STDOUT: %b = alloca %"class.Carbon::LayoutB", align 8
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %b) #5
|
||||
// CHECK:STDOUT: call void @_ZN6CarbonL5CallBEPNS_1BE(ptr noundef %b)
|
||||
// CHECK:STDOUT: call void @_ZN6Carbon1BD2Ev(ptr noundef nonnull align 8 dead_on_return(16) dereferenceable(16) %b) #5
|
||||
// CHECK:STDOUT: call void @_ZN6CarbonL11CallLayoutBEPNS_7LayoutBE(ptr noundef %b)
|
||||
// CHECK:STDOUT: call void @_ZN6Carbon7LayoutBD2Ev(ptr noundef nonnull align 8 dead_on_return(16) dereferenceable(16) %b) #5
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.end.p0(ptr %b) #5
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: alwaysinline mustprogress nounwind uwtable
|
||||
// CHECK:STDOUT: define internal void @_ZN6CarbonL5CallBEPNS_1BE(ptr noundef %0) #2 {
|
||||
// CHECK:STDOUT: define internal void @_ZN6CarbonL11CallLayoutBEPNS_7LayoutBE(ptr noundef %0) #2 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %.addr = alloca ptr, align 8
|
||||
// CHECK:STDOUT: store ptr %0, ptr %.addr, align 8, !tbaa !15
|
||||
// CHECK:STDOUT: call void @_CCallB__carbon_thunk.Main(ptr noundef nonnull align 8 dereferenceable(8) %.addr)
|
||||
// CHECK:STDOUT: call void @_CCallLayoutB__carbon_thunk.Main(ptr noundef nonnull align 8 dereferenceable(8) %.addr)
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: inlinehint mustprogress nounwind uwtable
|
||||
// CHECK:STDOUT: define linkonce_odr dso_local void @_ZN6Carbon1BD2Ev(ptr noundef nonnull align 8 dead_on_return(16) dereferenceable(16) %this) unnamed_addr #3 comdat align 2 {
|
||||
// CHECK:STDOUT: define linkonce_odr dso_local void @_ZN6Carbon7LayoutBD2Ev(ptr noundef nonnull align 8 dead_on_return(16) dereferenceable(16) %this) unnamed_addr #3 comdat align 2 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %this.addr = alloca ptr, align 8
|
||||
// CHECK:STDOUT: store ptr %this, ptr %this.addr, align 8, !tbaa !15
|
||||
// CHECK:STDOUT: %this1 = load ptr, ptr %this.addr, align 8
|
||||
// CHECK:STDOUT: call void @"_C__destroy_thunk:thunk.B.Main"(ptr noundef nonnull align 8 dereferenceable(16) %this1)
|
||||
// CHECK:STDOUT: %a = getelementptr inbounds nuw %"class.Carbon::B", ptr %this1, i32 0, i32 0
|
||||
// CHECK:STDOUT: call void @_ZN6Carbon1AD2Ev(ptr noundef nonnull align 8 dead_on_return(12) dereferenceable(12) %a) #5
|
||||
// CHECK:STDOUT: call void @"_C__destroy_thunk:thunk.LayoutB.Main"(ptr noundef nonnull align 8 dereferenceable(16) %this1)
|
||||
// CHECK:STDOUT: %a = getelementptr inbounds nuw %"class.Carbon::LayoutB", ptr %this1, i32 0, i32 0
|
||||
// CHECK:STDOUT: call void @_ZN6Carbon7LayoutAD2Ev(ptr noundef nonnull align 8 dead_on_return(12) dereferenceable(12) %a) #5
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: mustprogress nounwind uwtable
|
||||
// CHECK:STDOUT: define dso_local void @_Z1hv() #0 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %c = alloca %"class.Carbon::C", align 8
|
||||
// CHECK:STDOUT: %c = alloca %"class.Carbon::LayoutC", align 8
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %c) #5
|
||||
// CHECK:STDOUT: call void @_ZN6CarbonL5CallCEPNS_1CE(ptr noundef %c)
|
||||
// CHECK:STDOUT: call void @_ZN6CarbonL5CallAEPNS_1AE(ptr noundef %c)
|
||||
// CHECK:STDOUT: call void @_ZN6Carbon1CD2Ev(ptr noundef nonnull align 8 dead_on_return(16) dereferenceable(16) %c) #5
|
||||
// CHECK:STDOUT: call void @_ZN6CarbonL11CallLayoutCEPNS_7LayoutCE(ptr noundef %c)
|
||||
// CHECK:STDOUT: call void @_ZN6CarbonL11CallLayoutAEPNS_7LayoutAE(ptr noundef %c)
|
||||
// CHECK:STDOUT: call void @_ZN6Carbon7LayoutCD2Ev(ptr noundef nonnull align 8 dead_on_return(16) dereferenceable(16) %c) #5
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.end.p0(ptr %c) #5
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: alwaysinline mustprogress nounwind uwtable
|
||||
// CHECK:STDOUT: define internal void @_ZN6CarbonL5CallCEPNS_1CE(ptr noundef %0) #2 {
|
||||
// CHECK:STDOUT: define internal void @_ZN6CarbonL11CallLayoutCEPNS_7LayoutCE(ptr noundef %0) #2 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %.addr = alloca ptr, align 8
|
||||
// CHECK:STDOUT: store ptr %0, ptr %.addr, align 8, !tbaa !17
|
||||
// CHECK:STDOUT: call void @_CCallC__carbon_thunk.Main(ptr noundef nonnull align 8 dereferenceable(8) %.addr)
|
||||
// CHECK:STDOUT: call void @_CCallLayoutC__carbon_thunk.Main(ptr noundef nonnull align 8 dereferenceable(8) %.addr)
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: inlinehint mustprogress nounwind uwtable
|
||||
// CHECK:STDOUT: define linkonce_odr dso_local void @_ZN6Carbon1CD2Ev(ptr noundef nonnull align 8 dead_on_return(16) dereferenceable(16) %this) unnamed_addr #3 comdat align 2 {
|
||||
// CHECK:STDOUT: define linkonce_odr dso_local void @_ZN6Carbon7LayoutCD2Ev(ptr noundef nonnull align 8 dead_on_return(16) dereferenceable(16) %this) unnamed_addr #3 comdat align 2 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %this.addr = alloca ptr, align 8
|
||||
// CHECK:STDOUT: store ptr %this, ptr %this.addr, align 8, !tbaa !17
|
||||
// CHECK:STDOUT: %this1 = load ptr, ptr %this.addr, align 8
|
||||
// CHECK:STDOUT: call void @"_C__destroy_thunk:thunk.C.Main"(ptr noundef nonnull align 8 dereferenceable(16) %this1)
|
||||
// CHECK:STDOUT: call void @_ZN6Carbon1AD2Ev(ptr noundef nonnull align 8 dead_on_return(12) dereferenceable(12) %this1) #5
|
||||
// CHECK:STDOUT: call void @"_C__destroy_thunk:thunk.LayoutC.Main"(ptr noundef nonnull align 8 dereferenceable(16) %this1)
|
||||
// CHECK:STDOUT: call void @_ZN6Carbon7LayoutAD2Ev(ptr noundef nonnull align 8 dead_on_return(12) dereferenceable(12) %this1) #5
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: declare void @_CCallA.Main(ptr)
|
||||
// CHECK:STDOUT: declare void @_CCallLayoutA.Main(ptr)
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: declare void @_CCallB.Main(ptr)
|
||||
// CHECK:STDOUT: declare void @_CCallLayoutB.Main(ptr)
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: declare void @_CCallC.Main(ptr)
|
||||
// CHECK:STDOUT: declare void @_CCallLayoutC.Main(ptr)
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: alwaysinline nounwind
|
||||
// CHECK:STDOUT: define weak_odr void @"_C__destroy_thunk:thunk.A.Main"(ptr %self) #4 !dbg !19 {
|
||||
// CHECK:STDOUT: define weak_odr void @"_C__destroy_thunk:thunk.LayoutA.Main"(ptr %self) #4 !dbg !19 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: call void @"_COp.e649d414b9e7644a:core.Destroy.Core"(ptr %self), !dbg !25
|
||||
// CHECK:STDOUT: call void @"_COp.576418bb54cb7290:core.Destroy.Core"(ptr %self), !dbg !25
|
||||
// CHECK:STDOUT: ret void, !dbg !25
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
@@ -293,75 +293,75 @@ fn G() {
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define weak_odr void @"_COp.e649d414b9e7644a:core.Destroy.Core"(ptr %self) #5 !dbg !37 {
|
||||
// CHECK:STDOUT: define weak_odr void @"_COp.576418bb54cb7290:core.Destroy.Core"(ptr %self) #5 !dbg !37 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: ret void, !dbg !40
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define void @_CCallA__carbon_thunk.Main(ptr %_) #5 !dbg !41 {
|
||||
// CHECK:STDOUT: define void @_CCallLayoutA__carbon_thunk.Main(ptr %_) #5 !dbg !41 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %.loc21 = load ptr, ptr %_, align 8, !dbg !44
|
||||
// CHECK:STDOUT: call void @_CCallA.Main(ptr %.loc21), !dbg !44
|
||||
// CHECK:STDOUT: call void @_CCallLayoutA.Main(ptr %.loc21), !dbg !44
|
||||
// CHECK:STDOUT: ret void, !dbg !44
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: alwaysinline nounwind
|
||||
// CHECK:STDOUT: define weak_odr void @"_C__destroy_thunk:thunk.B.Main"(ptr %self) #4 !dbg !45 {
|
||||
// CHECK:STDOUT: define weak_odr void @"_C__destroy_thunk:thunk.LayoutB.Main"(ptr %self) #4 !dbg !45 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: call void @"_COp.535580a8a7a96b3b:core.Destroy.Core"(ptr %self), !dbg !48
|
||||
// CHECK:STDOUT: call void @"_COp.1e05456dbecd0195:core.Destroy.Core"(ptr %self), !dbg !48
|
||||
// CHECK:STDOUT: ret void, !dbg !48
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define weak_odr void @"_COp.8e58843eeaf37d77:core.Destroy.Core"(ptr %self) #5 !dbg !49 {
|
||||
// CHECK:STDOUT: define weak_odr void @"_COp.ed90af642ee14836:core.Destroy.Core"(ptr %self) #5 !dbg !49 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: ret void, !dbg !52
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define weak_odr void @"_COp.535580a8a7a96b3b:core.Destroy.Core"(ptr %self) #5 !dbg !53 {
|
||||
// CHECK:STDOUT: define weak_odr void @"_COp.1e05456dbecd0195:core.Destroy.Core"(ptr %self) #5 !dbg !53 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: ret void, !dbg !56
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define void @_CCallB__carbon_thunk.Main(ptr %_) #5 !dbg !57 {
|
||||
// CHECK:STDOUT: define void @_CCallLayoutB__carbon_thunk.Main(ptr %_) #5 !dbg !57 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %.loc22 = load ptr, ptr %_, align 8, !dbg !60
|
||||
// CHECK:STDOUT: call void @_CCallB.Main(ptr %.loc22), !dbg !60
|
||||
// CHECK:STDOUT: call void @_CCallLayoutB.Main(ptr %.loc22), !dbg !60
|
||||
// CHECK:STDOUT: ret void, !dbg !60
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: alwaysinline nounwind
|
||||
// CHECK:STDOUT: define weak_odr void @"_C__destroy_thunk:thunk.C.Main"(ptr %self) #4 !dbg !61 {
|
||||
// CHECK:STDOUT: define weak_odr void @"_C__destroy_thunk:thunk.LayoutC.Main"(ptr %self) #4 !dbg !61 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: call void @"_COp.cbd14a388b4a1c25:core.Destroy.Core"(ptr %self), !dbg !64
|
||||
// CHECK:STDOUT: call void @"_COp.51e6fd9285cd1110:core.Destroy.Core"(ptr %self), !dbg !64
|
||||
// CHECK:STDOUT: ret void, !dbg !64
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define weak_odr void @"_COp.cf9748c540fa2b51:core.Destroy.Core"(ptr %self) #5 !dbg !65 {
|
||||
// CHECK:STDOUT: define weak_odr void @"_COp.16bee2ebebabb5ed:core.Destroy.Core"(ptr %self) #5 !dbg !65 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: ret void, !dbg !68
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define weak_odr void @"_COp.cbd14a388b4a1c25:core.Destroy.Core"(ptr %self) #5 !dbg !69 {
|
||||
// CHECK:STDOUT: define weak_odr void @"_COp.51e6fd9285cd1110:core.Destroy.Core"(ptr %self) #5 !dbg !69 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: ret void, !dbg !72
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define void @_CCallC__carbon_thunk.Main(ptr %_) #5 !dbg !73 {
|
||||
// CHECK:STDOUT: define void @_CCallLayoutC__carbon_thunk.Main(ptr %_) #5 !dbg !73 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %.loc23 = load ptr, ptr %_, align 8, !dbg !76
|
||||
// CHECK:STDOUT: call void @_CCallC.Main(ptr %.loc23), !dbg !76
|
||||
// CHECK:STDOUT: call void @_CCallLayoutC.Main(ptr %.loc23), !dbg !76
|
||||
// CHECK:STDOUT: ret void, !dbg !76
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; uselistorder directives
|
||||
// CHECK:STDOUT: uselistorder ptr @_ZN6Carbon1AD2Ev, { 2, 1, 0 }
|
||||
// CHECK:STDOUT: uselistorder ptr @_ZN6Carbon7LayoutAD2Ev, { 2, 1, 0 }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: attributes #0 = { mustprogress nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
|
||||
// CHECK:STDOUT: attributes #1 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
|
||||
@@ -387,13 +387,13 @@ fn G() {
|
||||
// CHECK:STDOUT: !10 = !{!"omnipotent char", !11, i64 0}
|
||||
// CHECK:STDOUT: !11 = !{!"Simple C++ TBAA"}
|
||||
// CHECK:STDOUT: !12 = !{!13, !13, i64 0}
|
||||
// CHECK:STDOUT: !13 = !{!"p1 _ZTSN6Carbon1AE", !14, i64 0}
|
||||
// CHECK:STDOUT: !13 = !{!"p1 _ZTSN6Carbon7LayoutAE", !14, i64 0}
|
||||
// CHECK:STDOUT: !14 = !{!"any pointer", !10, i64 0}
|
||||
// CHECK:STDOUT: !15 = !{!16, !16, i64 0}
|
||||
// CHECK:STDOUT: !16 = !{!"p1 _ZTSN6Carbon1BE", !14, i64 0}
|
||||
// CHECK:STDOUT: !16 = !{!"p1 _ZTSN6Carbon7LayoutBE", !14, i64 0}
|
||||
// CHECK:STDOUT: !17 = !{!18, !18, i64 0}
|
||||
// CHECK:STDOUT: !18 = !{!"p1 _ZTSN6Carbon1CE", !14, i64 0}
|
||||
// CHECK:STDOUT: !19 = distinct !DISubprogram(name: "__destroy_thunk", linkageName: "_C__destroy_thunk:thunk.A.Main", scope: null, file: !1, line: 6, type: !20, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !23)
|
||||
// CHECK:STDOUT: !18 = !{!"p1 _ZTSN6Carbon7LayoutCE", !14, i64 0}
|
||||
// CHECK:STDOUT: !19 = distinct !DISubprogram(name: "__destroy_thunk", linkageName: "_C__destroy_thunk:thunk.LayoutA.Main", scope: null, file: !1, line: 6, type: !20, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !23)
|
||||
// CHECK:STDOUT: !20 = !DISubroutineType(types: !21)
|
||||
// CHECK:STDOUT: !21 = !{null, !22}
|
||||
// CHECK:STDOUT: !22 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: null, size: 64)
|
||||
@@ -411,43 +411,43 @@ fn G() {
|
||||
// CHECK:STDOUT: !34 = !{!35}
|
||||
// CHECK:STDOUT: !35 = !DILocalVariable(arg: 1, scope: !33, type: !22)
|
||||
// CHECK:STDOUT: !36 = !DILocation(line: 6, column: 1, scope: !33)
|
||||
// CHECK:STDOUT: !37 = distinct !DISubprogram(name: "Op", linkageName: "_COp.e649d414b9e7644a:core.Destroy.Core", scope: null, file: !1, line: 6, type: !20, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !38)
|
||||
// CHECK:STDOUT: !37 = distinct !DISubprogram(name: "Op", linkageName: "_COp.576418bb54cb7290:core.Destroy.Core", scope: null, file: !1, line: 6, type: !20, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !38)
|
||||
// CHECK:STDOUT: !38 = !{!39}
|
||||
// CHECK:STDOUT: !39 = !DILocalVariable(arg: 1, scope: !37, type: !22)
|
||||
// CHECK:STDOUT: !40 = !DILocation(line: 6, column: 1, scope: !37)
|
||||
// CHECK:STDOUT: !41 = distinct !DISubprogram(name: "CallA__carbon_thunk", linkageName: "_CCallA__carbon_thunk.Main", scope: null, file: !1, line: 21, type: !20, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !42)
|
||||
// CHECK:STDOUT: !41 = distinct !DISubprogram(name: "CallLayoutA__carbon_thunk", linkageName: "_CCallLayoutA__carbon_thunk.Main", scope: null, file: !1, line: 21, type: !20, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !42)
|
||||
// CHECK:STDOUT: !42 = !{!43}
|
||||
// CHECK:STDOUT: !43 = !DILocalVariable(arg: 1, scope: !41, type: !22)
|
||||
// CHECK:STDOUT: !44 = !DILocation(line: 21, column: 1, scope: !41)
|
||||
// CHECK:STDOUT: !45 = distinct !DISubprogram(name: "__destroy_thunk", linkageName: "_C__destroy_thunk:thunk.B.Main", scope: null, file: !1, line: 11, type: !20, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !46)
|
||||
// CHECK:STDOUT: !45 = distinct !DISubprogram(name: "__destroy_thunk", linkageName: "_C__destroy_thunk:thunk.LayoutB.Main", scope: null, file: !1, line: 11, type: !20, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !46)
|
||||
// CHECK:STDOUT: !46 = !{!47}
|
||||
// CHECK:STDOUT: !47 = !DILocalVariable(arg: 1, scope: !45, type: !22)
|
||||
// CHECK:STDOUT: !48 = !DILocation(line: 11, column: 1, scope: !45)
|
||||
// CHECK:STDOUT: !49 = distinct !DISubprogram(name: "Op", linkageName: "_COp.8e58843eeaf37d77:core.Destroy.Core", scope: null, file: !1, line: 11, type: !20, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !50)
|
||||
// CHECK:STDOUT: !49 = distinct !DISubprogram(name: "Op", linkageName: "_COp.ed90af642ee14836:core.Destroy.Core", scope: null, file: !1, line: 11, type: !20, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !50)
|
||||
// CHECK:STDOUT: !50 = !{!51}
|
||||
// CHECK:STDOUT: !51 = !DILocalVariable(arg: 1, scope: !49, type: !22)
|
||||
// CHECK:STDOUT: !52 = !DILocation(line: 11, column: 1, scope: !49)
|
||||
// CHECK:STDOUT: !53 = distinct !DISubprogram(name: "Op", linkageName: "_COp.535580a8a7a96b3b:core.Destroy.Core", scope: null, file: !1, line: 11, type: !20, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !54)
|
||||
// CHECK:STDOUT: !53 = distinct !DISubprogram(name: "Op", linkageName: "_COp.1e05456dbecd0195:core.Destroy.Core", scope: null, file: !1, line: 11, type: !20, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !54)
|
||||
// CHECK:STDOUT: !54 = !{!55}
|
||||
// CHECK:STDOUT: !55 = !DILocalVariable(arg: 1, scope: !53, type: !22)
|
||||
// CHECK:STDOUT: !56 = !DILocation(line: 11, column: 1, scope: !53)
|
||||
// CHECK:STDOUT: !57 = distinct !DISubprogram(name: "CallB__carbon_thunk", linkageName: "_CCallB__carbon_thunk.Main", scope: null, file: !1, line: 22, type: !20, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !58)
|
||||
// CHECK:STDOUT: !57 = distinct !DISubprogram(name: "CallLayoutB__carbon_thunk", linkageName: "_CCallLayoutB__carbon_thunk.Main", scope: null, file: !1, line: 22, type: !20, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !58)
|
||||
// CHECK:STDOUT: !58 = !{!59}
|
||||
// CHECK:STDOUT: !59 = !DILocalVariable(arg: 1, scope: !57, type: !22)
|
||||
// CHECK:STDOUT: !60 = !DILocation(line: 22, column: 1, scope: !57)
|
||||
// CHECK:STDOUT: !61 = distinct !DISubprogram(name: "__destroy_thunk", linkageName: "_C__destroy_thunk:thunk.C.Main", scope: null, file: !1, line: 16, type: !20, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !62)
|
||||
// CHECK:STDOUT: !61 = distinct !DISubprogram(name: "__destroy_thunk", linkageName: "_C__destroy_thunk:thunk.LayoutC.Main", scope: null, file: !1, line: 16, type: !20, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !62)
|
||||
// CHECK:STDOUT: !62 = !{!63}
|
||||
// CHECK:STDOUT: !63 = !DILocalVariable(arg: 1, scope: !61, type: !22)
|
||||
// CHECK:STDOUT: !64 = !DILocation(line: 16, column: 1, scope: !61)
|
||||
// CHECK:STDOUT: !65 = distinct !DISubprogram(name: "Op", linkageName: "_COp.cf9748c540fa2b51:core.Destroy.Core", scope: null, file: !1, line: 16, type: !20, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !66)
|
||||
// CHECK:STDOUT: !65 = distinct !DISubprogram(name: "Op", linkageName: "_COp.16bee2ebebabb5ed:core.Destroy.Core", scope: null, file: !1, line: 16, type: !20, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !66)
|
||||
// CHECK:STDOUT: !66 = !{!67}
|
||||
// CHECK:STDOUT: !67 = !DILocalVariable(arg: 1, scope: !65, type: !22)
|
||||
// CHECK:STDOUT: !68 = !DILocation(line: 16, column: 1, scope: !65)
|
||||
// CHECK:STDOUT: !69 = distinct !DISubprogram(name: "Op", linkageName: "_COp.cbd14a388b4a1c25:core.Destroy.Core", scope: null, file: !1, line: 16, type: !20, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !70)
|
||||
// CHECK:STDOUT: !69 = distinct !DISubprogram(name: "Op", linkageName: "_COp.51e6fd9285cd1110:core.Destroy.Core", scope: null, file: !1, line: 16, type: !20, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !70)
|
||||
// CHECK:STDOUT: !70 = !{!71}
|
||||
// CHECK:STDOUT: !71 = !DILocalVariable(arg: 1, scope: !69, type: !22)
|
||||
// CHECK:STDOUT: !72 = !DILocation(line: 16, column: 1, scope: !69)
|
||||
// CHECK:STDOUT: !73 = distinct !DISubprogram(name: "CallC__carbon_thunk", linkageName: "_CCallC__carbon_thunk.Main", scope: null, file: !1, line: 23, type: !20, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !74)
|
||||
// CHECK:STDOUT: !73 = distinct !DISubprogram(name: "CallLayoutC__carbon_thunk", linkageName: "_CCallLayoutC__carbon_thunk.Main", scope: null, file: !1, line: 23, type: !20, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !74)
|
||||
// CHECK:STDOUT: !74 = !{!75}
|
||||
// CHECK:STDOUT: !75 = !DILocalVariable(arg: 1, scope: !73, type: !22)
|
||||
// CHECK:STDOUT: !76 = !DILocation(line: 23, column: 1, scope: !73)
|
||||
@@ -458,28 +458,28 @@ fn G() {
|
||||
// CHECK:STDOUT: target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
|
||||
// CHECK:STDOUT: target triple = "x86_64-unknown-linux-gnu"
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: %"class.Carbon::C.0" = type { i32, i32 }
|
||||
// CHECK:STDOUT: %"class.Carbon::FieldC" = type { i32, i32 }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: @C.val.loc19_3 = internal constant { i32, i32 } zeroinitializer
|
||||
// CHECK:STDOUT: @FieldC.val.loc19_3 = internal constant { i32, i32 } zeroinitializer
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: mustprogress nounwind uwtable
|
||||
// CHECK:STDOUT: define dso_local void @_Z1FRN6Carbon1CE(ptr noundef nonnull align 4 dereferenceable(8) %c) #0 {
|
||||
// CHECK:STDOUT: define dso_local void @_Z1FRN6Carbon6FieldCE(ptr noundef nonnull align 4 dereferenceable(8) %c) #0 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %c.addr = alloca ptr, align 8
|
||||
// CHECK:STDOUT: store ptr %c, ptr %c.addr, align 8, !tbaa !12
|
||||
// CHECK:STDOUT: %0 = load ptr, ptr %c.addr, align 8, !tbaa !12, !nonnull !15, !align !16
|
||||
// CHECK:STDOUT: %a = getelementptr inbounds nuw %"class.Carbon::C.0", ptr %0, i32 0, i32 0
|
||||
// CHECK:STDOUT: %a = getelementptr inbounds nuw %"class.Carbon::FieldC", ptr %0, i32 0, i32 0
|
||||
// CHECK:STDOUT: store i32 12, ptr %a, align 4, !tbaa !17
|
||||
// CHECK:STDOUT: %1 = load ptr, ptr %c.addr, align 8, !tbaa !12, !nonnull !15, !align !16
|
||||
// CHECK:STDOUT: %b = getelementptr inbounds nuw %"class.Carbon::C.0", ptr %1, i32 0, i32 1
|
||||
// CHECK:STDOUT: %b = getelementptr inbounds nuw %"class.Carbon::FieldC", ptr %1, i32 0, i32 1
|
||||
// CHECK:STDOUT: store i32 34, ptr %b, align 4, !tbaa !19
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: alwaysinline nounwind
|
||||
// CHECK:STDOUT: define weak_odr void @"_C__destroy_thunk:thunk.C.Main"(ptr %self) #1 !dbg !20 {
|
||||
// CHECK:STDOUT: define weak_odr void @"_C__destroy_thunk:thunk.FieldC.Main"(ptr %self) #1 !dbg !20 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: call void @"_COp.cbd14a388b4a1c25:core.Destroy.Core"(ptr %self), !dbg !26
|
||||
// CHECK:STDOUT: call void @"_COp.a5500aaf922cc288:core.Destroy.Core"(ptr %self), !dbg !26
|
||||
// CHECK:STDOUT: ret void, !dbg !26
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
@@ -496,7 +496,7 @@ fn G() {
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define weak_odr void @"_COp.cbd14a388b4a1c25:core.Destroy.Core"(ptr %self) #2 !dbg !38 {
|
||||
// CHECK:STDOUT: define weak_odr void @"_COp.a5500aaf922cc288:core.Destroy.Core"(ptr %self) #2 !dbg !38 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: ret void, !dbg !41
|
||||
// CHECK:STDOUT: }
|
||||
@@ -506,11 +506,11 @@ fn G() {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %c.var = alloca { i32, i32 }, align 4, !dbg !45
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %c.var), !dbg !45
|
||||
// CHECK:STDOUT: %.loc19_29.3.a = getelementptr inbounds nuw { i32, i32 }, ptr %c.var, i32 0, i32 0, !dbg !46
|
||||
// CHECK:STDOUT: %.loc19_29.6.b = getelementptr inbounds nuw { i32, i32 }, ptr %c.var, i32 0, i32 1, !dbg !46
|
||||
// CHECK:STDOUT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 %c.var, ptr align 4 @C.val.loc19_3, i64 8, i1 false), !dbg !45
|
||||
// CHECK:STDOUT: call void @_Z1FRN6Carbon1CE(ptr %c.var), !dbg !47
|
||||
// CHECK:STDOUT: call void @"_COp.cbd14a388b4a1c25:core.Destroy.Core"(ptr %c.var), !dbg !45
|
||||
// CHECK:STDOUT: %.loc19_34.3.a = getelementptr inbounds nuw { i32, i32 }, ptr %c.var, i32 0, i32 0, !dbg !46
|
||||
// CHECK:STDOUT: %.loc19_34.6.b = getelementptr inbounds nuw { i32, i32 }, ptr %c.var, i32 0, i32 1, !dbg !46
|
||||
// CHECK:STDOUT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 %c.var, ptr align 4 @FieldC.val.loc19_3, i64 8, i1 false), !dbg !45
|
||||
// CHECK:STDOUT: call void @_Z1FRN6Carbon6FieldCE(ptr %c.var), !dbg !47
|
||||
// CHECK:STDOUT: call void @"_COp.a5500aaf922cc288:core.Destroy.Core"(ptr %c.var), !dbg !45
|
||||
// CHECK:STDOUT: ret void, !dbg !48
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
@@ -542,14 +542,14 @@ fn G() {
|
||||
// CHECK:STDOUT: !10 = !{!"omnipotent char", !11, i64 0}
|
||||
// CHECK:STDOUT: !11 = !{!"Simple C++ TBAA"}
|
||||
// CHECK:STDOUT: !12 = !{!13, !13, i64 0}
|
||||
// CHECK:STDOUT: !13 = !{!"p1 _ZTSN6Carbon1CE", !14, i64 0}
|
||||
// CHECK:STDOUT: !13 = !{!"p1 _ZTSN6Carbon6FieldCE", !14, i64 0}
|
||||
// CHECK:STDOUT: !14 = !{!"any pointer", !10, i64 0}
|
||||
// CHECK:STDOUT: !15 = !{}
|
||||
// CHECK:STDOUT: !16 = !{i64 4}
|
||||
// CHECK:STDOUT: !17 = !{!18, !9, i64 0}
|
||||
// CHECK:STDOUT: !18 = !{!"_ZTSN6Carbon1CE", !9, i64 0, !9, i64 4}
|
||||
// CHECK:STDOUT: !18 = !{!"_ZTSN6Carbon6FieldCE", !9, i64 0, !9, i64 4}
|
||||
// CHECK:STDOUT: !19 = !{!18, !9, i64 4}
|
||||
// CHECK:STDOUT: !20 = distinct !DISubprogram(name: "__destroy_thunk", linkageName: "_C__destroy_thunk:thunk.C.Main", scope: null, file: !1, line: 6, type: !21, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !24)
|
||||
// CHECK:STDOUT: !20 = distinct !DISubprogram(name: "__destroy_thunk", linkageName: "_C__destroy_thunk:thunk.FieldC.Main", scope: null, file: !1, line: 6, type: !21, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !24)
|
||||
// CHECK:STDOUT: !21 = !DISubroutineType(types: !22)
|
||||
// CHECK:STDOUT: !22 = !{null, !23}
|
||||
// CHECK:STDOUT: !23 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: null, size: 64)
|
||||
@@ -567,7 +567,7 @@ fn G() {
|
||||
// CHECK:STDOUT: !35 = !{!36}
|
||||
// CHECK:STDOUT: !36 = !DILocalVariable(arg: 1, scope: !34, type: !23)
|
||||
// CHECK:STDOUT: !37 = !DILocation(line: 6, column: 1, scope: !34)
|
||||
// CHECK:STDOUT: !38 = distinct !DISubprogram(name: "Op", linkageName: "_COp.cbd14a388b4a1c25:core.Destroy.Core", scope: null, file: !1, line: 6, type: !21, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !39)
|
||||
// CHECK:STDOUT: !38 = distinct !DISubprogram(name: "Op", linkageName: "_COp.a5500aaf922cc288:core.Destroy.Core", scope: null, file: !1, line: 6, type: !21, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !39)
|
||||
// CHECK:STDOUT: !39 = !{!40}
|
||||
// CHECK:STDOUT: !40 = !DILocalVariable(arg: 1, scope: !38, type: !23)
|
||||
// CHECK:STDOUT: !41 = !DILocation(line: 6, column: 1, scope: !38)
|
||||
@@ -575,7 +575,7 @@ fn G() {
|
||||
// CHECK:STDOUT: !43 = !DISubroutineType(types: !44)
|
||||
// CHECK:STDOUT: !44 = !{null}
|
||||
// CHECK:STDOUT: !45 = !DILocation(line: 19, column: 3, scope: !42)
|
||||
// CHECK:STDOUT: !46 = !DILocation(line: 19, column: 14, scope: !42)
|
||||
// CHECK:STDOUT: !46 = !DILocation(line: 19, column: 19, scope: !42)
|
||||
// CHECK:STDOUT: !47 = !DILocation(line: 20, column: 3, scope: !42)
|
||||
// CHECK:STDOUT: !48 = !DILocation(line: 18, column: 1, scope: !42)
|
||||
// CHECK:STDOUT:
|
||||
|
||||
+47
-47
@@ -31,7 +31,7 @@ library "[[@TEST_NAME]]";
|
||||
|
||||
import Cpp;
|
||||
|
||||
class A {
|
||||
class ArgsA {
|
||||
fn F(self, a: i32) -> i32 {
|
||||
self;
|
||||
return a;
|
||||
@@ -39,29 +39,29 @@ class A {
|
||||
}
|
||||
|
||||
inline Cpp '''
|
||||
int CallF() {
|
||||
return Carbon::A().F(123);
|
||||
int CallArgsF() {
|
||||
return Carbon::ArgsA().F(123);
|
||||
}
|
||||
''';
|
||||
|
||||
fn CallCallF() -> i32 { return Cpp.CallF(); }
|
||||
fn CallCallF() -> i32 { return Cpp.CallArgsF(); }
|
||||
|
||||
// --- static.carbon
|
||||
library "[[@TEST_NAME]]";
|
||||
|
||||
import Cpp;
|
||||
|
||||
class A {
|
||||
class StaticA {
|
||||
fn F() {}
|
||||
}
|
||||
|
||||
inline Cpp '''
|
||||
void CallF() {
|
||||
Carbon::A::F();
|
||||
void CallStaticF() {
|
||||
Carbon::StaticA::F();
|
||||
}
|
||||
''';
|
||||
|
||||
fn CallCallF() { Cpp.CallF(); }
|
||||
fn CallCallF() { Cpp.CallStaticF(); }
|
||||
|
||||
// CHECK:STDOUT: ; ---
|
||||
// CHECK:STDOUT: ; ModuleID = 'method.carbon'
|
||||
@@ -188,17 +188,17 @@ fn CallCallF() { Cpp.CallF(); }
|
||||
// CHECK:STDOUT: target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
|
||||
// CHECK:STDOUT: target triple = "x86_64-unknown-linux-gnu"
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: %"class.Carbon::A.0" = type {}
|
||||
// CHECK:STDOUT: %"class.Carbon::ArgsA" = type {}
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: $_ZN6Carbon1AD2Ev = comdat any
|
||||
// CHECK:STDOUT: $_ZN6Carbon5ArgsAD2Ev = comdat any
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: mustprogress nounwind uwtable
|
||||
// CHECK:STDOUT: define dso_local noundef i32 @_Z5CallFv() #0 {
|
||||
// CHECK:STDOUT: define dso_local noundef i32 @_Z9CallArgsFv() #0 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %ref.tmp = alloca %"class.Carbon::A.0", align 1
|
||||
// CHECK:STDOUT: %ref.tmp = alloca %"class.Carbon::ArgsA", align 1
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %ref.tmp) #4
|
||||
// CHECK:STDOUT: %call = call noundef i32 @_ZNK6Carbon1A1FEi(ptr noundef nonnull align 1 %ref.tmp, i32 noundef 123)
|
||||
// CHECK:STDOUT: call void @_ZN6Carbon1AD2Ev(ptr noundef nonnull align 1 %ref.tmp) #4
|
||||
// CHECK:STDOUT: %call = call noundef i32 @_ZNK6Carbon5ArgsA1FEi(ptr noundef nonnull align 1 %ref.tmp, i32 noundef 123)
|
||||
// CHECK:STDOUT: call void @_ZN6Carbon5ArgsAD2Ev(ptr noundef nonnull align 1 %ref.tmp) #4
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.end.p0(ptr %ref.tmp) #4
|
||||
// CHECK:STDOUT: ret i32 %call
|
||||
// CHECK:STDOUT: }
|
||||
@@ -207,7 +207,7 @@ fn CallCallF() { Cpp.CallF(); }
|
||||
// CHECK:STDOUT: declare void @llvm.lifetime.start.p0(ptr captures(none)) #1
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: alwaysinline mustprogress nounwind uwtable
|
||||
// CHECK:STDOUT: define internal noundef i32 @_ZNK6Carbon1A1FEi(ptr noundef nonnull align 1 %this, i32 noundef %0) #2 align 2 {
|
||||
// CHECK:STDOUT: define internal noundef i32 @_ZNK6Carbon5ArgsA1FEi(ptr noundef nonnull align 1 %this, i32 noundef %0) #2 align 2 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %retval = alloca i32, align 4
|
||||
// CHECK:STDOUT: %this.addr = alloca ptr, align 8
|
||||
@@ -215,18 +215,18 @@ fn CallCallF() { Cpp.CallF(); }
|
||||
// CHECK:STDOUT: store ptr %this, ptr %this.addr, align 8, !tbaa !12
|
||||
// CHECK:STDOUT: store i32 %0, ptr %.addr, align 4, !tbaa !15
|
||||
// CHECK:STDOUT: %this1 = load ptr, ptr %this.addr, align 8
|
||||
// CHECK:STDOUT: call void @_CF__carbon_thunk.A.Main(ptr noundef nonnull align 1 %this1, ptr noundef nonnull align 4 dereferenceable(4) %.addr, ptr noundef nonnull align 4 dereferenceable(4) %retval)
|
||||
// CHECK:STDOUT: call void @_CF__carbon_thunk.ArgsA.Main(ptr noundef nonnull align 1 %this1, ptr noundef nonnull align 4 dereferenceable(4) %.addr, ptr noundef nonnull align 4 dereferenceable(4) %retval)
|
||||
// CHECK:STDOUT: %1 = load i32, ptr %retval, align 4
|
||||
// CHECK:STDOUT: ret i32 %1
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: inlinehint mustprogress nounwind uwtable
|
||||
// CHECK:STDOUT: define linkonce_odr dso_local void @_ZN6Carbon1AD2Ev(ptr noundef nonnull align 1 %this) unnamed_addr #3 comdat align 2 {
|
||||
// CHECK:STDOUT: define linkonce_odr dso_local void @_ZN6Carbon5ArgsAD2Ev(ptr noundef nonnull align 1 %this) unnamed_addr #3 comdat align 2 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %this.addr = alloca ptr, align 8
|
||||
// CHECK:STDOUT: store ptr %this, ptr %this.addr, align 8, !tbaa !12
|
||||
// CHECK:STDOUT: %this1 = load ptr, ptr %this.addr, align 8
|
||||
// CHECK:STDOUT: call void @"_C__destroy_thunk:thunk.A.Main"(ptr noundef nonnull align 1 %this1)
|
||||
// CHECK:STDOUT: call void @"_C__destroy_thunk:thunk.ArgsA.Main"(ptr noundef nonnull align 1 %this1)
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
@@ -234,38 +234,38 @@ fn CallCallF() { Cpp.CallF(); }
|
||||
// CHECK:STDOUT: declare void @llvm.lifetime.end.p0(ptr captures(none)) #1
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define i32 @_CF.A.Main(ptr %self, i32 %a) #4 !dbg !16 {
|
||||
// CHECK:STDOUT: define i32 @_CF.ArgsA.Main(ptr %self, i32 %a) #4 !dbg !16 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: ret i32 %a, !dbg !24
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: alwaysinline nounwind
|
||||
// CHECK:STDOUT: define weak_odr void @"_C__destroy_thunk:thunk.A.Main"(ptr %self) #5 !dbg !25 {
|
||||
// CHECK:STDOUT: define weak_odr void @"_C__destroy_thunk:thunk.ArgsA.Main"(ptr %self) #5 !dbg !25 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: call void @"_COp.e649d414b9e7644a:core.Destroy.Core"(ptr %self), !dbg !30
|
||||
// CHECK:STDOUT: call void @"_COp.433c867dbc0ac54b:core.Destroy.Core"(ptr %self), !dbg !30
|
||||
// CHECK:STDOUT: ret void, !dbg !30
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define weak_odr void @"_COp.e649d414b9e7644a:core.Destroy.Core"(ptr %self) #4 !dbg !31 {
|
||||
// CHECK:STDOUT: define weak_odr void @"_COp.433c867dbc0ac54b:core.Destroy.Core"(ptr %self) #4 !dbg !31 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: ret void, !dbg !34
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define void @_CF__carbon_thunk.A.Main(ptr %self, ptr %_, ptr %_1) #4 !dbg !35 {
|
||||
// CHECK:STDOUT: define void @_CF__carbon_thunk.ArgsA.Main(ptr %self, ptr %_, ptr %_1) #4 !dbg !35 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %.loc6_29.2 = load i32, ptr %_, align 4, !dbg !42
|
||||
// CHECK:STDOUT: %A.F.call = call i32 @_CF.A.Main(ptr %self, i32 %.loc6_29.2), !dbg !42
|
||||
// CHECK:STDOUT: store i32 %A.F.call, ptr %_1, align 4, !dbg !42
|
||||
// CHECK:STDOUT: %ArgsA.F.call = call i32 @_CF.ArgsA.Main(ptr %self, i32 %.loc6_29.2), !dbg !42
|
||||
// CHECK:STDOUT: store i32 %ArgsA.F.call, ptr %_1, align 4, !dbg !42
|
||||
// CHECK:STDOUT: ret void, !dbg !42
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define i32 @_CCallCallF.Main() #4 !dbg !43 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %CallF.call = call i32 @_Z5CallFv(), !dbg !46
|
||||
// CHECK:STDOUT: ret i32 %CallF.call, !dbg !47
|
||||
// CHECK:STDOUT: %CallArgsF.call = call i32 @_Z9CallArgsFv(), !dbg !46
|
||||
// CHECK:STDOUT: ret i32 %CallArgsF.call, !dbg !47
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: attributes #0 = { mustprogress nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
|
||||
@@ -292,10 +292,10 @@ fn CallCallF() { Cpp.CallF(); }
|
||||
// CHECK:STDOUT: !10 = !{!"omnipotent char", !11, i64 0}
|
||||
// CHECK:STDOUT: !11 = !{!"Simple C++ TBAA"}
|
||||
// CHECK:STDOUT: !12 = !{!13, !13, i64 0}
|
||||
// CHECK:STDOUT: !13 = !{!"p1 _ZTSN6Carbon1AE", !14, i64 0}
|
||||
// CHECK:STDOUT: !13 = !{!"p1 _ZTSN6Carbon5ArgsAE", !14, i64 0}
|
||||
// CHECK:STDOUT: !14 = !{!"any pointer", !10, i64 0}
|
||||
// CHECK:STDOUT: !15 = !{!9, !9, i64 0}
|
||||
// CHECK:STDOUT: !16 = distinct !DISubprogram(name: "F", linkageName: "_CF.A.Main", scope: null, file: !1, line: 6, type: !17, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !21)
|
||||
// CHECK:STDOUT: !16 = distinct !DISubprogram(name: "F", linkageName: "_CF.ArgsA.Main", scope: null, file: !1, line: 6, type: !17, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !21)
|
||||
// CHECK:STDOUT: !17 = !DISubroutineType(types: !18)
|
||||
// CHECK:STDOUT: !18 = !{!19, !20, !19}
|
||||
// CHECK:STDOUT: !19 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
|
||||
@@ -304,17 +304,17 @@ fn CallCallF() { Cpp.CallF(); }
|
||||
// CHECK:STDOUT: !22 = !DILocalVariable(arg: 1, scope: !16, type: !20)
|
||||
// CHECK:STDOUT: !23 = !DILocalVariable(arg: 2, scope: !16, type: !19)
|
||||
// CHECK:STDOUT: !24 = !DILocation(line: 8, column: 5, scope: !16)
|
||||
// CHECK:STDOUT: !25 = distinct !DISubprogram(name: "__destroy_thunk", linkageName: "_C__destroy_thunk:thunk.A.Main", scope: null, file: !1, line: 5, type: !26, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !28)
|
||||
// CHECK:STDOUT: !25 = distinct !DISubprogram(name: "__destroy_thunk", linkageName: "_C__destroy_thunk:thunk.ArgsA.Main", scope: null, file: !1, line: 5, type: !26, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !28)
|
||||
// CHECK:STDOUT: !26 = !DISubroutineType(types: !27)
|
||||
// CHECK:STDOUT: !27 = !{null, !20}
|
||||
// CHECK:STDOUT: !28 = !{!29}
|
||||
// CHECK:STDOUT: !29 = !DILocalVariable(arg: 1, scope: !25, type: !20)
|
||||
// CHECK:STDOUT: !30 = !DILocation(line: 5, column: 1, scope: !25)
|
||||
// CHECK:STDOUT: !31 = distinct !DISubprogram(name: "Op", linkageName: "_COp.e649d414b9e7644a:core.Destroy.Core", scope: null, file: !1, line: 5, type: !26, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !32)
|
||||
// CHECK:STDOUT: !31 = distinct !DISubprogram(name: "Op", linkageName: "_COp.433c867dbc0ac54b:core.Destroy.Core", scope: null, file: !1, line: 5, type: !26, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !32)
|
||||
// CHECK:STDOUT: !32 = !{!33}
|
||||
// CHECK:STDOUT: !33 = !DILocalVariable(arg: 1, scope: !31, type: !20)
|
||||
// CHECK:STDOUT: !34 = !DILocation(line: 5, column: 1, scope: !31)
|
||||
// CHECK:STDOUT: !35 = distinct !DISubprogram(name: "F__carbon_thunk", linkageName: "_CF__carbon_thunk.A.Main", scope: null, file: !1, line: 6, type: !36, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !38)
|
||||
// CHECK:STDOUT: !35 = distinct !DISubprogram(name: "F__carbon_thunk", linkageName: "_CF__carbon_thunk.ArgsA.Main", scope: null, file: !1, line: 6, type: !36, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !38)
|
||||
// CHECK:STDOUT: !36 = !DISubroutineType(types: !37)
|
||||
// CHECK:STDOUT: !37 = !{null, !20, !19, !19}
|
||||
// CHECK:STDOUT: !38 = !{!39, !40, !41}
|
||||
@@ -335,49 +335,49 @@ fn CallCallF() { Cpp.CallF(); }
|
||||
// CHECK:STDOUT: target triple = "x86_64-unknown-linux-gnu"
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: mustprogress nounwind uwtable
|
||||
// CHECK:STDOUT: define dso_local void @_Z5CallFv() #0 {
|
||||
// CHECK:STDOUT: define dso_local void @_Z11CallStaticFv() #0 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: call void @_ZN6Carbon1A1FEv()
|
||||
// CHECK:STDOUT: call void @_ZN6Carbon7StaticA1FEv()
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: alwaysinline mustprogress nounwind uwtable
|
||||
// CHECK:STDOUT: define internal void @_ZN6Carbon1A1FEv() #1 align 2 {
|
||||
// CHECK:STDOUT: define internal void @_ZN6Carbon7StaticA1FEv() #1 align 2 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: call void @_CF__carbon_thunk.A.Main()
|
||||
// CHECK:STDOUT: call void @_CF__carbon_thunk.StaticA.Main()
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define void @_CF.A.Main() #2 !dbg !12 {
|
||||
// CHECK:STDOUT: define void @_CF.StaticA.Main() #2 !dbg !12 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: ret void, !dbg !15
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: alwaysinline nounwind
|
||||
// CHECK:STDOUT: define weak_odr void @"_C__destroy_thunk:thunk.A.Main"(ptr %self) #3 !dbg !16 {
|
||||
// CHECK:STDOUT: define weak_odr void @"_C__destroy_thunk:thunk.StaticA.Main"(ptr %self) #3 !dbg !16 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: call void @"_COp.e649d414b9e7644a:core.Destroy.Core"(ptr %self), !dbg !22
|
||||
// CHECK:STDOUT: call void @"_COp.f6473606999de44c:core.Destroy.Core"(ptr %self), !dbg !22
|
||||
// CHECK:STDOUT: ret void, !dbg !22
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define weak_odr void @"_COp.e649d414b9e7644a:core.Destroy.Core"(ptr %self) #2 !dbg !23 {
|
||||
// CHECK:STDOUT: define weak_odr void @"_COp.f6473606999de44c:core.Destroy.Core"(ptr %self) #2 !dbg !23 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: ret void, !dbg !26
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define void @_CF__carbon_thunk.A.Main() #2 !dbg !27 {
|
||||
// CHECK:STDOUT: define void @_CF__carbon_thunk.StaticA.Main() #2 !dbg !27 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: call void @_CF.A.Main(), !dbg !28
|
||||
// CHECK:STDOUT: call void @_CF.StaticA.Main(), !dbg !28
|
||||
// CHECK:STDOUT: ret void, !dbg !28
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define void @_CCallCallF.Main() #2 !dbg !29 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: call void @_Z5CallFv(), !dbg !30
|
||||
// CHECK:STDOUT: call void @_Z11CallStaticFv(), !dbg !30
|
||||
// CHECK:STDOUT: ret void, !dbg !31
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
@@ -402,22 +402,22 @@ fn CallCallF() { Cpp.CallF(); }
|
||||
// CHECK:STDOUT: !9 = !{!"int", !10, i64 0}
|
||||
// CHECK:STDOUT: !10 = !{!"omnipotent char", !11, i64 0}
|
||||
// CHECK:STDOUT: !11 = !{!"Simple C++ TBAA"}
|
||||
// CHECK:STDOUT: !12 = distinct !DISubprogram(name: "F", linkageName: "_CF.A.Main", scope: null, file: !1, line: 6, type: !13, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !12 = distinct !DISubprogram(name: "F", linkageName: "_CF.StaticA.Main", scope: null, file: !1, line: 6, type: !13, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !13 = !DISubroutineType(types: !14)
|
||||
// CHECK:STDOUT: !14 = !{null}
|
||||
// CHECK:STDOUT: !15 = !DILocation(line: 6, column: 3, scope: !12)
|
||||
// CHECK:STDOUT: !16 = distinct !DISubprogram(name: "__destroy_thunk", linkageName: "_C__destroy_thunk:thunk.A.Main", scope: null, file: !1, line: 5, type: !17, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !20)
|
||||
// CHECK:STDOUT: !16 = distinct !DISubprogram(name: "__destroy_thunk", linkageName: "_C__destroy_thunk:thunk.StaticA.Main", scope: null, file: !1, line: 5, type: !17, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !20)
|
||||
// CHECK:STDOUT: !17 = !DISubroutineType(types: !18)
|
||||
// CHECK:STDOUT: !18 = !{null, !19}
|
||||
// CHECK:STDOUT: !19 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: null, size: 64)
|
||||
// CHECK:STDOUT: !20 = !{!21}
|
||||
// CHECK:STDOUT: !21 = !DILocalVariable(arg: 1, scope: !16, type: !19)
|
||||
// CHECK:STDOUT: !22 = !DILocation(line: 5, column: 1, scope: !16)
|
||||
// CHECK:STDOUT: !23 = distinct !DISubprogram(name: "Op", linkageName: "_COp.e649d414b9e7644a:core.Destroy.Core", scope: null, file: !1, line: 5, type: !17, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !24)
|
||||
// CHECK:STDOUT: !23 = distinct !DISubprogram(name: "Op", linkageName: "_COp.f6473606999de44c:core.Destroy.Core", scope: null, file: !1, line: 5, type: !17, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !24)
|
||||
// CHECK:STDOUT: !24 = !{!25}
|
||||
// CHECK:STDOUT: !25 = !DILocalVariable(arg: 1, scope: !23, type: !19)
|
||||
// CHECK:STDOUT: !26 = !DILocation(line: 5, column: 1, scope: !23)
|
||||
// CHECK:STDOUT: !27 = distinct !DISubprogram(name: "F__carbon_thunk", linkageName: "_CF__carbon_thunk.A.Main", scope: null, file: !1, line: 6, type: !13, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !27 = distinct !DISubprogram(name: "F__carbon_thunk", linkageName: "_CF__carbon_thunk.StaticA.Main", scope: null, file: !1, line: 6, type: !13, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !28 = !DILocation(line: 6, column: 3, scope: !27)
|
||||
// CHECK:STDOUT: !29 = distinct !DISubprogram(name: "CallCallF", linkageName: "_CCallCallF.Main", scope: null, file: !1, line: 15, type: !13, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !30 = !DILocation(line: 15, column: 18, scope: !29)
|
||||
|
||||
@@ -127,12 +127,12 @@ fn F() {
|
||||
|
||||
// --- multi_argument.h
|
||||
|
||||
class C {
|
||||
class MultiArgC {
|
||||
public:
|
||||
C() {}
|
||||
C(int) {}
|
||||
C(int, int) {}
|
||||
C(int, int, int, int = 0) {}
|
||||
MultiArgC() {}
|
||||
MultiArgC(int) {}
|
||||
MultiArgC(int, int) {}
|
||||
MultiArgC(int, int, int, int = 0) {}
|
||||
};
|
||||
|
||||
// --- call_multi_argument.carbon
|
||||
@@ -142,29 +142,29 @@ library "[[@TEST_NAME]]";
|
||||
import Cpp library "multi_argument.h";
|
||||
|
||||
fn Zero() {
|
||||
let _: Cpp.C = Cpp.C.C();
|
||||
let _: Cpp.C = ();
|
||||
let _: Cpp.MultiArgC = Cpp.MultiArgC.MultiArgC();
|
||||
let _: Cpp.MultiArgC = ();
|
||||
}
|
||||
|
||||
fn One() {
|
||||
let _: Cpp.C = Cpp.C.C(1);
|
||||
let _: Cpp.C = 2;
|
||||
let _: Cpp.C = (3,);
|
||||
let _: Cpp.MultiArgC = Cpp.MultiArgC.MultiArgC(1);
|
||||
let _: Cpp.MultiArgC = 2;
|
||||
let _: Cpp.MultiArgC = (3,);
|
||||
}
|
||||
|
||||
fn Two() {
|
||||
let _: Cpp.C = Cpp.C.C(1, 2);
|
||||
let _: Cpp.C = (3, 4);
|
||||
let _: Cpp.MultiArgC = Cpp.MultiArgC.MultiArgC(1, 2);
|
||||
let _: Cpp.MultiArgC = (3, 4);
|
||||
}
|
||||
|
||||
fn Three() {
|
||||
let _: Cpp.C = Cpp.C.C(1, 2, 3);
|
||||
let _: Cpp.C = (4, 5, 6);
|
||||
let _: Cpp.MultiArgC = Cpp.MultiArgC.MultiArgC(1, 2, 3);
|
||||
let _: Cpp.MultiArgC = (4, 5, 6);
|
||||
}
|
||||
|
||||
fn Four() {
|
||||
let _: Cpp.C = Cpp.C.C(1, 2, 3, 4);
|
||||
let _: Cpp.C = (5, 6, 7, 8);
|
||||
let _: Cpp.MultiArgC = Cpp.MultiArgC.MultiArgC(1, 2, 3, 4);
|
||||
let _: Cpp.MultiArgC = (5, 6, 7, 8);
|
||||
}
|
||||
|
||||
// CHECK:STDOUT: ; ---
|
||||
@@ -711,63 +711,63 @@ fn Four() {
|
||||
// CHECK:STDOUT: target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
|
||||
// CHECK:STDOUT: target triple = "x86_64-unknown-linux-gnu"
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: $_ZN1CC2Ev = comdat any
|
||||
// CHECK:STDOUT: $_ZN9MultiArgCC2Ev = comdat any
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: $_ZN1CC2Ei = comdat any
|
||||
// CHECK:STDOUT: $_ZN9MultiArgCC2Ei = comdat any
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: $_ZN1CC2Eii = comdat any
|
||||
// CHECK:STDOUT: $_ZN9MultiArgCC2Eii = comdat any
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: $_ZN1CC2Eiiii = comdat any
|
||||
// CHECK:STDOUT: $_ZN9MultiArgCC2Eiiii = comdat any
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define void @_CZero.Main() #0 !dbg !12 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %.loc7_26.1.temp = alloca [1 x i8], align 1, !dbg !15
|
||||
// CHECK:STDOUT: %.loc8_19.2.temp = alloca [1 x i8], align 1, !dbg !16
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc7_26.1.temp), !dbg !15
|
||||
// CHECK:STDOUT: call void @_ZN1CC1Ev.carbon_thunk.(ptr %.loc7_26.1.temp), !dbg !15
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc8_19.2.temp), !dbg !16
|
||||
// CHECK:STDOUT: call void @_ZN1CC1Ev.carbon_thunk_tuple.(ptr %.loc8_19.2.temp), !dbg !16
|
||||
// CHECK:STDOUT: %.loc7_50.1.temp = alloca [1 x i8], align 1, !dbg !15
|
||||
// CHECK:STDOUT: %.loc8_27.2.temp = alloca [1 x i8], align 1, !dbg !16
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc7_50.1.temp), !dbg !15
|
||||
// CHECK:STDOUT: call void @_ZN9MultiArgCC1Ev.carbon_thunk.(ptr %.loc7_50.1.temp), !dbg !15
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc8_27.2.temp), !dbg !16
|
||||
// CHECK:STDOUT: call void @_ZN9MultiArgCC1Ev.carbon_thunk_tuple.(ptr %.loc8_27.2.temp), !dbg !16
|
||||
// CHECK:STDOUT: ret void, !dbg !17
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: alwaysinline mustprogress uwtable
|
||||
// CHECK:STDOUT: define internal void @_ZN1CC1Ev.carbon_thunk.(ptr noundef %return) #1 {
|
||||
// CHECK:STDOUT: define internal void @_ZN9MultiArgCC1Ev.carbon_thunk.(ptr noundef %return) #1 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %return.addr = alloca ptr, align 8
|
||||
// CHECK:STDOUT: store ptr %return, ptr %return.addr, align 8, !tbaa !18
|
||||
// CHECK:STDOUT: %0 = load ptr, ptr %return.addr, align 8, !tbaa !18
|
||||
// CHECK:STDOUT: call void @_ZN1CC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %0)
|
||||
// CHECK:STDOUT: call void @_ZN9MultiArgCC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %0)
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: alwaysinline mustprogress uwtable
|
||||
// CHECK:STDOUT: define internal void @_ZN1CC1Ev.carbon_thunk_tuple.(ptr noundef %return) #1 {
|
||||
// CHECK:STDOUT: define internal void @_ZN9MultiArgCC1Ev.carbon_thunk_tuple.(ptr noundef %return) #1 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %return.addr = alloca ptr, align 8
|
||||
// CHECK:STDOUT: store ptr %return, ptr %return.addr, align 8, !tbaa !18
|
||||
// CHECK:STDOUT: %0 = load ptr, ptr %return.addr, align 8, !tbaa !18
|
||||
// CHECK:STDOUT: call void @_ZN1CC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %0)
|
||||
// CHECK:STDOUT: call void @_ZN9MultiArgCC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %0)
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define void @_COne.Main() #0 !dbg !21 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %.loc12_27.1.temp = alloca [1 x i8], align 1, !dbg !22
|
||||
// CHECK:STDOUT: %.loc13_18.1.temp = alloca [1 x i8], align 1, !dbg !23
|
||||
// CHECK:STDOUT: %.loc14_21.2.temp = alloca [1 x i8], align 1, !dbg !24
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc12_27.1.temp), !dbg !22
|
||||
// CHECK:STDOUT: call void @_ZN1CC1Ei.carbon_thunk._(i32 1, ptr %.loc12_27.1.temp), !dbg !22
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc13_18.1.temp), !dbg !23
|
||||
// CHECK:STDOUT: call void @_ZN1CC1Ei.carbon_thunk._(i32 2, ptr %.loc13_18.1.temp), !dbg !23
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc14_21.2.temp), !dbg !24
|
||||
// CHECK:STDOUT: call void @_ZN1CC1Ei.carbon_thunk_tuple._(i32 3, ptr %.loc14_21.2.temp), !dbg !24
|
||||
// CHECK:STDOUT: %.loc12_51.1.temp = alloca [1 x i8], align 1, !dbg !22
|
||||
// CHECK:STDOUT: %.loc13_26.1.temp = alloca [1 x i8], align 1, !dbg !23
|
||||
// CHECK:STDOUT: %.loc14_29.2.temp = alloca [1 x i8], align 1, !dbg !24
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc12_51.1.temp), !dbg !22
|
||||
// CHECK:STDOUT: call void @_ZN9MultiArgCC1Ei.carbon_thunk._(i32 1, ptr %.loc12_51.1.temp), !dbg !22
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc13_26.1.temp), !dbg !23
|
||||
// CHECK:STDOUT: call void @_ZN9MultiArgCC1Ei.carbon_thunk._(i32 2, ptr %.loc13_26.1.temp), !dbg !23
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc14_29.2.temp), !dbg !24
|
||||
// CHECK:STDOUT: call void @_ZN9MultiArgCC1Ei.carbon_thunk_tuple._(i32 3, ptr %.loc14_29.2.temp), !dbg !24
|
||||
// CHECK:STDOUT: ret void, !dbg !25
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: alwaysinline mustprogress uwtable
|
||||
// CHECK:STDOUT: define internal void @_ZN1CC1Ei.carbon_thunk._(i32 noundef %0, ptr noundef %return) #1 {
|
||||
// CHECK:STDOUT: define internal void @_ZN9MultiArgCC1Ei.carbon_thunk._(i32 noundef %0, ptr noundef %return) #1 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %.addr = alloca i32, align 4
|
||||
// CHECK:STDOUT: %return.addr = alloca ptr, align 8
|
||||
@@ -775,12 +775,12 @@ fn Four() {
|
||||
// CHECK:STDOUT: store ptr %return, ptr %return.addr, align 8, !tbaa !18
|
||||
// CHECK:STDOUT: %1 = load ptr, ptr %return.addr, align 8, !tbaa !18
|
||||
// CHECK:STDOUT: %2 = load i32, ptr %.addr, align 4, !tbaa !26
|
||||
// CHECK:STDOUT: call void @_ZN1CC2Ei(ptr noundef nonnull align 1 dereferenceable(1) %1, i32 noundef %2)
|
||||
// CHECK:STDOUT: call void @_ZN9MultiArgCC2Ei(ptr noundef nonnull align 1 dereferenceable(1) %1, i32 noundef %2)
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: alwaysinline mustprogress uwtable
|
||||
// CHECK:STDOUT: define internal void @_ZN1CC1Ei.carbon_thunk_tuple._(i32 noundef %0, ptr noundef %return) #1 {
|
||||
// CHECK:STDOUT: define internal void @_ZN9MultiArgCC1Ei.carbon_thunk_tuple._(i32 noundef %0, ptr noundef %return) #1 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %.addr = alloca i32, align 4
|
||||
// CHECK:STDOUT: %return.addr = alloca ptr, align 8
|
||||
@@ -788,24 +788,24 @@ fn Four() {
|
||||
// CHECK:STDOUT: store ptr %return, ptr %return.addr, align 8, !tbaa !18
|
||||
// CHECK:STDOUT: %1 = load ptr, ptr %return.addr, align 8, !tbaa !18
|
||||
// CHECK:STDOUT: %2 = load i32, ptr %.addr, align 4, !tbaa !26
|
||||
// CHECK:STDOUT: call void @_ZN1CC2Ei(ptr noundef nonnull align 1 dereferenceable(1) %1, i32 noundef %2)
|
||||
// CHECK:STDOUT: call void @_ZN9MultiArgCC2Ei(ptr noundef nonnull align 1 dereferenceable(1) %1, i32 noundef %2)
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define void @_CTwo.Main() #0 !dbg !27 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %.loc18_30.1.temp = alloca [1 x i8], align 1, !dbg !28
|
||||
// CHECK:STDOUT: %.loc19_23.2.temp = alloca [1 x i8], align 1, !dbg !29
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc18_30.1.temp), !dbg !28
|
||||
// CHECK:STDOUT: call void @_ZN1CC1Eii.carbon_thunk.__(i32 1, i32 2, ptr %.loc18_30.1.temp), !dbg !28
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc19_23.2.temp), !dbg !29
|
||||
// CHECK:STDOUT: call void @_ZN1CC1Eii.carbon_thunk_tuple.__(i32 3, i32 4, ptr %.loc19_23.2.temp), !dbg !29
|
||||
// CHECK:STDOUT: %.loc18_54.1.temp = alloca [1 x i8], align 1, !dbg !28
|
||||
// CHECK:STDOUT: %.loc19_31.2.temp = alloca [1 x i8], align 1, !dbg !29
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc18_54.1.temp), !dbg !28
|
||||
// CHECK:STDOUT: call void @_ZN9MultiArgCC1Eii.carbon_thunk.__(i32 1, i32 2, ptr %.loc18_54.1.temp), !dbg !28
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc19_31.2.temp), !dbg !29
|
||||
// CHECK:STDOUT: call void @_ZN9MultiArgCC1Eii.carbon_thunk_tuple.__(i32 3, i32 4, ptr %.loc19_31.2.temp), !dbg !29
|
||||
// CHECK:STDOUT: ret void, !dbg !30
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: alwaysinline mustprogress uwtable
|
||||
// CHECK:STDOUT: define internal void @_ZN1CC1Eii.carbon_thunk.__(i32 noundef %0, i32 noundef %1, ptr noundef %return) #1 {
|
||||
// CHECK:STDOUT: define internal void @_ZN9MultiArgCC1Eii.carbon_thunk.__(i32 noundef %0, i32 noundef %1, ptr noundef %return) #1 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %.addr = alloca i32, align 4
|
||||
// CHECK:STDOUT: %.addr1 = alloca i32, align 4
|
||||
@@ -816,12 +816,12 @@ fn Four() {
|
||||
// CHECK:STDOUT: %2 = load ptr, ptr %return.addr, align 8, !tbaa !18
|
||||
// CHECK:STDOUT: %3 = load i32, ptr %.addr, align 4, !tbaa !26
|
||||
// CHECK:STDOUT: %4 = load i32, ptr %.addr1, align 4, !tbaa !26
|
||||
// CHECK:STDOUT: call void @_ZN1CC2Eii(ptr noundef nonnull align 1 dereferenceable(1) %2, i32 noundef %3, i32 noundef %4)
|
||||
// CHECK:STDOUT: call void @_ZN9MultiArgCC2Eii(ptr noundef nonnull align 1 dereferenceable(1) %2, i32 noundef %3, i32 noundef %4)
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: alwaysinline mustprogress uwtable
|
||||
// CHECK:STDOUT: define internal void @_ZN1CC1Eii.carbon_thunk_tuple.__(i32 noundef %0, i32 noundef %1, ptr noundef %return) #1 {
|
||||
// CHECK:STDOUT: define internal void @_ZN9MultiArgCC1Eii.carbon_thunk_tuple.__(i32 noundef %0, i32 noundef %1, ptr noundef %return) #1 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %.addr = alloca i32, align 4
|
||||
// CHECK:STDOUT: %.addr1 = alloca i32, align 4
|
||||
@@ -832,24 +832,24 @@ fn Four() {
|
||||
// CHECK:STDOUT: %2 = load ptr, ptr %return.addr, align 8, !tbaa !18
|
||||
// CHECK:STDOUT: %3 = load i32, ptr %.addr, align 4, !tbaa !26
|
||||
// CHECK:STDOUT: %4 = load i32, ptr %.addr1, align 4, !tbaa !26
|
||||
// CHECK:STDOUT: call void @_ZN1CC2Eii(ptr noundef nonnull align 1 dereferenceable(1) %2, i32 noundef %3, i32 noundef %4)
|
||||
// CHECK:STDOUT: call void @_ZN9MultiArgCC2Eii(ptr noundef nonnull align 1 dereferenceable(1) %2, i32 noundef %3, i32 noundef %4)
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define void @_CThree.Main() #0 !dbg !31 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %.loc23_33.1.temp = alloca [1 x i8], align 1, !dbg !32
|
||||
// CHECK:STDOUT: %.loc24_26.2.temp = alloca [1 x i8], align 1, !dbg !33
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc23_33.1.temp), !dbg !32
|
||||
// CHECK:STDOUT: call void @_ZN1CC1Eiiii.carbon_thunk.___(i32 1, i32 2, i32 3, ptr %.loc23_33.1.temp), !dbg !32
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc24_26.2.temp), !dbg !33
|
||||
// CHECK:STDOUT: call void @_ZN1CC1Eiiii.carbon_thunk_tuple.___(i32 4, i32 5, i32 6, ptr %.loc24_26.2.temp), !dbg !33
|
||||
// CHECK:STDOUT: %.loc23_57.1.temp = alloca [1 x i8], align 1, !dbg !32
|
||||
// CHECK:STDOUT: %.loc24_34.2.temp = alloca [1 x i8], align 1, !dbg !33
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc23_57.1.temp), !dbg !32
|
||||
// CHECK:STDOUT: call void @_ZN9MultiArgCC1Eiiii.carbon_thunk.___(i32 1, i32 2, i32 3, ptr %.loc23_57.1.temp), !dbg !32
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc24_34.2.temp), !dbg !33
|
||||
// CHECK:STDOUT: call void @_ZN9MultiArgCC1Eiiii.carbon_thunk_tuple.___(i32 4, i32 5, i32 6, ptr %.loc24_34.2.temp), !dbg !33
|
||||
// CHECK:STDOUT: ret void, !dbg !34
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: alwaysinline mustprogress uwtable
|
||||
// CHECK:STDOUT: define internal void @_ZN1CC1Eiiii.carbon_thunk.___(i32 noundef %0, i32 noundef %1, i32 noundef %2, ptr noundef %return) #1 {
|
||||
// CHECK:STDOUT: define internal void @_ZN9MultiArgCC1Eiiii.carbon_thunk.___(i32 noundef %0, i32 noundef %1, i32 noundef %2, ptr noundef %return) #1 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %.addr = alloca i32, align 4
|
||||
// CHECK:STDOUT: %.addr1 = alloca i32, align 4
|
||||
@@ -863,12 +863,12 @@ fn Four() {
|
||||
// CHECK:STDOUT: %4 = load i32, ptr %.addr, align 4, !tbaa !26
|
||||
// CHECK:STDOUT: %5 = load i32, ptr %.addr1, align 4, !tbaa !26
|
||||
// CHECK:STDOUT: %6 = load i32, ptr %.addr2, align 4, !tbaa !26
|
||||
// CHECK:STDOUT: call void @_ZN1CC2Eiiii(ptr noundef nonnull align 1 dereferenceable(1) %3, i32 noundef %4, i32 noundef %5, i32 noundef %6, i32 noundef 0)
|
||||
// CHECK:STDOUT: call void @_ZN9MultiArgCC2Eiiii(ptr noundef nonnull align 1 dereferenceable(1) %3, i32 noundef %4, i32 noundef %5, i32 noundef %6, i32 noundef 0)
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: alwaysinline mustprogress uwtable
|
||||
// CHECK:STDOUT: define internal void @_ZN1CC1Eiiii.carbon_thunk_tuple.___(i32 noundef %0, i32 noundef %1, i32 noundef %2, ptr noundef %return) #1 {
|
||||
// CHECK:STDOUT: define internal void @_ZN9MultiArgCC1Eiiii.carbon_thunk_tuple.___(i32 noundef %0, i32 noundef %1, i32 noundef %2, ptr noundef %return) #1 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %.addr = alloca i32, align 4
|
||||
// CHECK:STDOUT: %.addr1 = alloca i32, align 4
|
||||
@@ -882,24 +882,24 @@ fn Four() {
|
||||
// CHECK:STDOUT: %4 = load i32, ptr %.addr, align 4, !tbaa !26
|
||||
// CHECK:STDOUT: %5 = load i32, ptr %.addr1, align 4, !tbaa !26
|
||||
// CHECK:STDOUT: %6 = load i32, ptr %.addr2, align 4, !tbaa !26
|
||||
// CHECK:STDOUT: call void @_ZN1CC2Eiiii(ptr noundef nonnull align 1 dereferenceable(1) %3, i32 noundef %4, i32 noundef %5, i32 noundef %6, i32 noundef 0)
|
||||
// CHECK:STDOUT: call void @_ZN9MultiArgCC2Eiiii(ptr noundef nonnull align 1 dereferenceable(1) %3, i32 noundef %4, i32 noundef %5, i32 noundef %6, i32 noundef 0)
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define void @_CFour.Main() #0 !dbg !35 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %.loc28_36.1.temp = alloca [1 x i8], align 1, !dbg !36
|
||||
// CHECK:STDOUT: %.loc29_29.2.temp = alloca [1 x i8], align 1, !dbg !37
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc28_36.1.temp), !dbg !36
|
||||
// CHECK:STDOUT: call void @_ZN1CC1Eiiii.carbon_thunk.____(i32 1, i32 2, i32 3, i32 4, ptr %.loc28_36.1.temp), !dbg !36
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc29_29.2.temp), !dbg !37
|
||||
// CHECK:STDOUT: call void @_ZN1CC1Eiiii.carbon_thunk_tuple.____(i32 5, i32 6, i32 7, i32 8, ptr %.loc29_29.2.temp), !dbg !37
|
||||
// CHECK:STDOUT: %.loc28_60.1.temp = alloca [1 x i8], align 1, !dbg !36
|
||||
// CHECK:STDOUT: %.loc29_37.2.temp = alloca [1 x i8], align 1, !dbg !37
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc28_60.1.temp), !dbg !36
|
||||
// CHECK:STDOUT: call void @_ZN9MultiArgCC1Eiiii.carbon_thunk.____(i32 1, i32 2, i32 3, i32 4, ptr %.loc28_60.1.temp), !dbg !36
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc29_37.2.temp), !dbg !37
|
||||
// CHECK:STDOUT: call void @_ZN9MultiArgCC1Eiiii.carbon_thunk_tuple.____(i32 5, i32 6, i32 7, i32 8, ptr %.loc29_37.2.temp), !dbg !37
|
||||
// CHECK:STDOUT: ret void, !dbg !38
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: alwaysinline mustprogress uwtable
|
||||
// CHECK:STDOUT: define internal void @_ZN1CC1Eiiii.carbon_thunk.____(i32 noundef %0, i32 noundef %1, i32 noundef %2, i32 noundef %3, ptr noundef %return) #1 {
|
||||
// CHECK:STDOUT: define internal void @_ZN9MultiArgCC1Eiiii.carbon_thunk.____(i32 noundef %0, i32 noundef %1, i32 noundef %2, i32 noundef %3, ptr noundef %return) #1 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %.addr = alloca i32, align 4
|
||||
// CHECK:STDOUT: %.addr1 = alloca i32, align 4
|
||||
@@ -916,12 +916,12 @@ fn Four() {
|
||||
// CHECK:STDOUT: %6 = load i32, ptr %.addr1, align 4, !tbaa !26
|
||||
// CHECK:STDOUT: %7 = load i32, ptr %.addr2, align 4, !tbaa !26
|
||||
// CHECK:STDOUT: %8 = load i32, ptr %.addr3, align 4, !tbaa !26
|
||||
// CHECK:STDOUT: call void @_ZN1CC2Eiiii(ptr noundef nonnull align 1 dereferenceable(1) %4, i32 noundef %5, i32 noundef %6, i32 noundef %7, i32 noundef %8)
|
||||
// CHECK:STDOUT: call void @_ZN9MultiArgCC2Eiiii(ptr noundef nonnull align 1 dereferenceable(1) %4, i32 noundef %5, i32 noundef %6, i32 noundef %7, i32 noundef %8)
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: alwaysinline mustprogress uwtable
|
||||
// CHECK:STDOUT: define internal void @_ZN1CC1Eiiii.carbon_thunk_tuple.____(i32 noundef %0, i32 noundef %1, i32 noundef %2, i32 noundef %3, ptr noundef %return) #1 {
|
||||
// CHECK:STDOUT: define internal void @_ZN9MultiArgCC1Eiiii.carbon_thunk_tuple.____(i32 noundef %0, i32 noundef %1, i32 noundef %2, i32 noundef %3, ptr noundef %return) #1 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %.addr = alloca i32, align 4
|
||||
// CHECK:STDOUT: %.addr1 = alloca i32, align 4
|
||||
@@ -938,7 +938,7 @@ fn Four() {
|
||||
// CHECK:STDOUT: %6 = load i32, ptr %.addr1, align 4, !tbaa !26
|
||||
// CHECK:STDOUT: %7 = load i32, ptr %.addr2, align 4, !tbaa !26
|
||||
// CHECK:STDOUT: %8 = load i32, ptr %.addr3, align 4, !tbaa !26
|
||||
// CHECK:STDOUT: call void @_ZN1CC2Eiiii(ptr noundef nonnull align 1 dereferenceable(1) %4, i32 noundef %5, i32 noundef %6, i32 noundef %7, i32 noundef %8)
|
||||
// CHECK:STDOUT: call void @_ZN9MultiArgCC2Eiiii(ptr noundef nonnull align 1 dereferenceable(1) %4, i32 noundef %5, i32 noundef %6, i32 noundef %7, i32 noundef %8)
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
@@ -946,7 +946,7 @@ fn Four() {
|
||||
// CHECK:STDOUT: declare void @llvm.lifetime.start.p0(ptr captures(none)) #2
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: mustprogress nounwind uwtable
|
||||
// CHECK:STDOUT: define linkonce_odr dso_local void @_ZN1CC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %this) unnamed_addr #3 comdat align 2 {
|
||||
// CHECK:STDOUT: define linkonce_odr dso_local void @_ZN9MultiArgCC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %this) unnamed_addr #3 comdat align 2 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %this.addr = alloca ptr, align 8
|
||||
// CHECK:STDOUT: store ptr %this, ptr %this.addr, align 8, !tbaa !18
|
||||
@@ -955,7 +955,7 @@ fn Four() {
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: mustprogress nounwind uwtable
|
||||
// CHECK:STDOUT: define linkonce_odr dso_local void @_ZN1CC2Ei(ptr noundef nonnull align 1 dereferenceable(1) %this, i32 noundef %0) unnamed_addr #3 comdat align 2 {
|
||||
// CHECK:STDOUT: define linkonce_odr dso_local void @_ZN9MultiArgCC2Ei(ptr noundef nonnull align 1 dereferenceable(1) %this, i32 noundef %0) unnamed_addr #3 comdat align 2 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %this.addr = alloca ptr, align 8
|
||||
// CHECK:STDOUT: %.addr = alloca i32, align 4
|
||||
@@ -966,7 +966,7 @@ fn Four() {
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: mustprogress nounwind uwtable
|
||||
// CHECK:STDOUT: define linkonce_odr dso_local void @_ZN1CC2Eii(ptr noundef nonnull align 1 dereferenceable(1) %this, i32 noundef %0, i32 noundef %1) unnamed_addr #3 comdat align 2 {
|
||||
// CHECK:STDOUT: define linkonce_odr dso_local void @_ZN9MultiArgCC2Eii(ptr noundef nonnull align 1 dereferenceable(1) %this, i32 noundef %0, i32 noundef %1) unnamed_addr #3 comdat align 2 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %this.addr = alloca ptr, align 8
|
||||
// CHECK:STDOUT: %.addr = alloca i32, align 4
|
||||
@@ -979,7 +979,7 @@ fn Four() {
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: mustprogress nounwind uwtable
|
||||
// CHECK:STDOUT: define linkonce_odr dso_local void @_ZN1CC2Eiiii(ptr noundef nonnull align 1 dereferenceable(1) %this, i32 noundef %0, i32 noundef %1, i32 noundef %2, i32 noundef %3) unnamed_addr #3 comdat align 2 {
|
||||
// CHECK:STDOUT: define linkonce_odr dso_local void @_ZN9MultiArgCC2Eiiii(ptr noundef nonnull align 1 dereferenceable(1) %this, i32 noundef %0, i32 noundef %1, i32 noundef %2, i32 noundef %3) unnamed_addr #3 comdat align 2 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %this.addr = alloca ptr, align 8
|
||||
// CHECK:STDOUT: %.addr = alloca i32, align 4
|
||||
@@ -996,7 +996,7 @@ fn Four() {
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; uselistorder directives
|
||||
// CHECK:STDOUT: uselistorder ptr @_ZN1CC1Ei.carbon_thunk._, { 1, 0 }
|
||||
// CHECK:STDOUT: uselistorder ptr @_ZN9MultiArgCC1Ei.carbon_thunk._, { 1, 0 }
|
||||
// CHECK:STDOUT: uselistorder ptr @llvm.lifetime.start.p0, { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: attributes #0 = { nounwind }
|
||||
@@ -1023,28 +1023,28 @@ fn Four() {
|
||||
// CHECK:STDOUT: !12 = distinct !DISubprogram(name: "Zero", linkageName: "_CZero.Main", scope: null, file: !1, line: 6, type: !13, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !13 = !DISubroutineType(types: !14)
|
||||
// CHECK:STDOUT: !14 = !{null}
|
||||
// CHECK:STDOUT: !15 = !DILocation(line: 7, column: 18, scope: !12)
|
||||
// CHECK:STDOUT: !16 = !DILocation(line: 8, column: 18, scope: !12)
|
||||
// CHECK:STDOUT: !15 = !DILocation(line: 7, column: 26, scope: !12)
|
||||
// CHECK:STDOUT: !16 = !DILocation(line: 8, column: 26, scope: !12)
|
||||
// CHECK:STDOUT: !17 = !DILocation(line: 6, column: 1, scope: !12)
|
||||
// CHECK:STDOUT: !18 = !{!19, !19, i64 0}
|
||||
// CHECK:STDOUT: !19 = !{!"p1 _ZTS1C", !20, i64 0}
|
||||
// CHECK:STDOUT: !19 = !{!"p1 _ZTS9MultiArgC", !20, i64 0}
|
||||
// CHECK:STDOUT: !20 = !{!"any pointer", !10, i64 0}
|
||||
// CHECK:STDOUT: !21 = distinct !DISubprogram(name: "One", linkageName: "_COne.Main", scope: null, file: !1, line: 11, type: !13, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !22 = !DILocation(line: 12, column: 18, scope: !21)
|
||||
// CHECK:STDOUT: !23 = !DILocation(line: 13, column: 18, scope: !21)
|
||||
// CHECK:STDOUT: !24 = !DILocation(line: 14, column: 18, scope: !21)
|
||||
// CHECK:STDOUT: !22 = !DILocation(line: 12, column: 26, scope: !21)
|
||||
// CHECK:STDOUT: !23 = !DILocation(line: 13, column: 26, scope: !21)
|
||||
// CHECK:STDOUT: !24 = !DILocation(line: 14, column: 26, scope: !21)
|
||||
// CHECK:STDOUT: !25 = !DILocation(line: 11, column: 1, scope: !21)
|
||||
// CHECK:STDOUT: !26 = !{!9, !9, i64 0}
|
||||
// CHECK:STDOUT: !27 = distinct !DISubprogram(name: "Two", linkageName: "_CTwo.Main", scope: null, file: !1, line: 17, type: !13, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !28 = !DILocation(line: 18, column: 18, scope: !27)
|
||||
// CHECK:STDOUT: !29 = !DILocation(line: 19, column: 18, scope: !27)
|
||||
// CHECK:STDOUT: !28 = !DILocation(line: 18, column: 26, scope: !27)
|
||||
// CHECK:STDOUT: !29 = !DILocation(line: 19, column: 26, scope: !27)
|
||||
// CHECK:STDOUT: !30 = !DILocation(line: 17, column: 1, scope: !27)
|
||||
// CHECK:STDOUT: !31 = distinct !DISubprogram(name: "Three", linkageName: "_CThree.Main", scope: null, file: !1, line: 22, type: !13, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !32 = !DILocation(line: 23, column: 18, scope: !31)
|
||||
// CHECK:STDOUT: !33 = !DILocation(line: 24, column: 18, scope: !31)
|
||||
// CHECK:STDOUT: !32 = !DILocation(line: 23, column: 26, scope: !31)
|
||||
// CHECK:STDOUT: !33 = !DILocation(line: 24, column: 26, scope: !31)
|
||||
// CHECK:STDOUT: !34 = !DILocation(line: 22, column: 1, scope: !31)
|
||||
// CHECK:STDOUT: !35 = distinct !DISubprogram(name: "Four", linkageName: "_CFour.Main", scope: null, file: !1, line: 27, type: !13, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !36 = !DILocation(line: 28, column: 18, scope: !35)
|
||||
// CHECK:STDOUT: !37 = !DILocation(line: 29, column: 18, scope: !35)
|
||||
// CHECK:STDOUT: !36 = !DILocation(line: 28, column: 26, scope: !35)
|
||||
// CHECK:STDOUT: !37 = !DILocation(line: 29, column: 26, scope: !35)
|
||||
// CHECK:STDOUT: !38 = !DILocation(line: 27, column: 1, scope: !35)
|
||||
// CHECK:STDOUT:
|
||||
|
||||
@@ -41,18 +41,18 @@ import Cpp;
|
||||
inline Cpp '''
|
||||
enum S : short {};
|
||||
enum I : short {};
|
||||
struct B {
|
||||
struct EnumB {
|
||||
operator S() const;
|
||||
operator I() const;
|
||||
};
|
||||
''';
|
||||
|
||||
fn ConvertToVar(b: Cpp.B) {
|
||||
fn ConvertToVar(b: Cpp.EnumB) {
|
||||
var unused s: Cpp.S = b;
|
||||
var unused i: Cpp.I = b;
|
||||
}
|
||||
|
||||
fn ConvertToValue(b: Cpp.B) {
|
||||
fn ConvertToValue(b: Cpp.EnumB) {
|
||||
let unused s: Cpp.S = b;
|
||||
let unused i: Cpp.I = b;
|
||||
}
|
||||
@@ -63,16 +63,16 @@ library "[[@TEST_NAME]]";
|
||||
|
||||
import Cpp;
|
||||
inline Cpp '''
|
||||
struct B {
|
||||
struct IntB {
|
||||
operator int() const;
|
||||
};
|
||||
''';
|
||||
|
||||
fn ConvertToVar(b: Cpp.B) {
|
||||
fn ConvertToVar(b: Cpp.IntB) {
|
||||
var unused a: Cpp.int = b;
|
||||
}
|
||||
|
||||
fn ConvertToValue(b: Cpp.B) {
|
||||
fn ConvertToValue(b: Cpp.IntB) {
|
||||
let unused a: Cpp.int = b;
|
||||
}
|
||||
|
||||
@@ -182,14 +182,14 @@ fn ConvertToValue(b: Cpp.B) {
|
||||
// CHECK:STDOUT: %s.var = alloca i16, align 2, !dbg !18
|
||||
// CHECK:STDOUT: %i.var = alloca i16, align 2, !dbg !19
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %s.var), !dbg !18
|
||||
// CHECK:STDOUT: call void @_ZNK1Bcv1SEv.carbon_thunk._(ptr %b, ptr %s.var), !dbg !18
|
||||
// CHECK:STDOUT: call void @_ZNK5EnumBcv1SEv.carbon_thunk._(ptr %b, ptr %s.var), !dbg !18
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %i.var), !dbg !19
|
||||
// CHECK:STDOUT: call void @_ZNK1Bcv1IEv.carbon_thunk._(ptr %b, ptr %i.var), !dbg !19
|
||||
// CHECK:STDOUT: call void @_ZNK5EnumBcv1IEv.carbon_thunk._(ptr %b, ptr %i.var), !dbg !19
|
||||
// CHECK:STDOUT: ret void, !dbg !20
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: alwaysinline mustprogress uwtable
|
||||
// CHECK:STDOUT: define internal void @_ZNK1Bcv1SEv.carbon_thunk._(ptr noundef nonnull align 1 dereferenceable(1) %this, ptr noundef %return) #1 {
|
||||
// CHECK:STDOUT: define internal void @_ZNK5EnumBcv1SEv.carbon_thunk._(ptr noundef nonnull align 1 dereferenceable(1) %this, ptr noundef %return) #1 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %this.addr = alloca ptr, align 8
|
||||
// CHECK:STDOUT: %return.addr = alloca ptr, align 8
|
||||
@@ -197,13 +197,13 @@ fn ConvertToValue(b: Cpp.B) {
|
||||
// CHECK:STDOUT: store ptr %return, ptr %return.addr, align 8, !tbaa !24
|
||||
// CHECK:STDOUT: %0 = load ptr, ptr %return.addr, align 8, !tbaa !24
|
||||
// CHECK:STDOUT: %1 = load ptr, ptr %this.addr, align 8, !tbaa !21, !nonnull !25
|
||||
// CHECK:STDOUT: %call = call noundef signext i16 @_ZNK1Bcv1SEv(ptr noundef nonnull align 1 dereferenceable(1) %1)
|
||||
// CHECK:STDOUT: %call = call noundef signext i16 @_ZNK5EnumBcv1SEv(ptr noundef nonnull align 1 dereferenceable(1) %1)
|
||||
// CHECK:STDOUT: store i16 %call, ptr %0, align 2, !tbaa !26
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: alwaysinline mustprogress uwtable
|
||||
// CHECK:STDOUT: define internal void @_ZNK1Bcv1IEv.carbon_thunk._(ptr noundef nonnull align 1 dereferenceable(1) %this, ptr noundef %return) #1 {
|
||||
// CHECK:STDOUT: define internal void @_ZNK5EnumBcv1IEv.carbon_thunk._(ptr noundef nonnull align 1 dereferenceable(1) %this, ptr noundef %return) #1 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %this.addr = alloca ptr, align 8
|
||||
// CHECK:STDOUT: %return.addr = alloca ptr, align 8
|
||||
@@ -211,7 +211,7 @@ fn ConvertToValue(b: Cpp.B) {
|
||||
// CHECK:STDOUT: store ptr %return, ptr %return.addr, align 8, !tbaa !24
|
||||
// CHECK:STDOUT: %0 = load ptr, ptr %return.addr, align 8, !tbaa !24
|
||||
// CHECK:STDOUT: %1 = load ptr, ptr %this.addr, align 8, !tbaa !21, !nonnull !25
|
||||
// CHECK:STDOUT: %call = call noundef signext i16 @_ZNK1Bcv1IEv(ptr noundef nonnull align 1 dereferenceable(1) %1)
|
||||
// CHECK:STDOUT: %call = call noundef signext i16 @_ZNK5EnumBcv1IEv(ptr noundef nonnull align 1 dereferenceable(1) %1)
|
||||
// CHECK:STDOUT: store i16 %call, ptr %0, align 2, !tbaa !28
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
@@ -222,10 +222,10 @@ fn ConvertToValue(b: Cpp.B) {
|
||||
// CHECK:STDOUT: %.loc20_25.1.temp = alloca i16, align 2, !dbg !33
|
||||
// CHECK:STDOUT: %.loc21_25.1.temp = alloca i16, align 2, !dbg !34
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc20_25.1.temp), !dbg !33
|
||||
// CHECK:STDOUT: call void @_ZNK1Bcv1SEv.carbon_thunk._(ptr %b, ptr %.loc20_25.1.temp), !dbg !33
|
||||
// CHECK:STDOUT: call void @_ZNK5EnumBcv1SEv.carbon_thunk._(ptr %b, ptr %.loc20_25.1.temp), !dbg !33
|
||||
// CHECK:STDOUT: %.loc20_25.5 = load i16, ptr %.loc20_25.1.temp, align 2, !dbg !33
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc21_25.1.temp), !dbg !34
|
||||
// CHECK:STDOUT: call void @_ZNK1Bcv1IEv.carbon_thunk._(ptr %b, ptr %.loc21_25.1.temp), !dbg !34
|
||||
// CHECK:STDOUT: call void @_ZNK5EnumBcv1IEv.carbon_thunk._(ptr %b, ptr %.loc21_25.1.temp), !dbg !34
|
||||
// CHECK:STDOUT: %.loc21_25.5 = load i16, ptr %.loc21_25.1.temp, align 2, !dbg !34
|
||||
// CHECK:STDOUT: ret void, !dbg !35
|
||||
// CHECK:STDOUT: }
|
||||
@@ -233,9 +233,9 @@ fn ConvertToValue(b: Cpp.B) {
|
||||
// CHECK:STDOUT: ; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite)
|
||||
// CHECK:STDOUT: declare void @llvm.lifetime.start.p0(ptr captures(none)) #2
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: declare noundef signext i16 @_ZNK1Bcv1SEv(ptr noundef nonnull align 1 dereferenceable(1)) #3
|
||||
// CHECK:STDOUT: declare noundef signext i16 @_ZNK5EnumBcv1SEv(ptr noundef nonnull align 1 dereferenceable(1)) #3
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: declare noundef signext i16 @_ZNK1Bcv1IEv(ptr noundef nonnull align 1 dereferenceable(1)) #3
|
||||
// CHECK:STDOUT: declare noundef signext i16 @_ZNK5EnumBcv1IEv(ptr noundef nonnull align 1 dereferenceable(1)) #3
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; uselistorder directives
|
||||
// CHECK:STDOUT: uselistorder ptr @llvm.lifetime.start.p0, { 3, 2, 1, 0 }
|
||||
@@ -271,7 +271,7 @@ fn ConvertToValue(b: Cpp.B) {
|
||||
// CHECK:STDOUT: !19 = !DILocation(line: 16, column: 3, scope: !12)
|
||||
// CHECK:STDOUT: !20 = !DILocation(line: 14, column: 1, scope: !12)
|
||||
// CHECK:STDOUT: !21 = !{!22, !22, i64 0}
|
||||
// CHECK:STDOUT: !22 = !{!"p1 _ZTS1B", !23, i64 0}
|
||||
// CHECK:STDOUT: !22 = !{!"p1 _ZTS5EnumB", !23, i64 0}
|
||||
// CHECK:STDOUT: !23 = !{!"any pointer", !10, i64 0}
|
||||
// CHECK:STDOUT: !24 = !{!23, !23, i64 0}
|
||||
// CHECK:STDOUT: !25 = !{}
|
||||
@@ -297,19 +297,19 @@ fn ConvertToValue(b: Cpp.B) {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %a.var = alloca i32, align 4, !dbg !18
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %a.var), !dbg !18
|
||||
// CHECK:STDOUT: %__carbon_thunk.call = call i32 @_ZNK1BcviEv.carbon_thunk._(ptr %b), !dbg !18
|
||||
// CHECK:STDOUT: %__carbon_thunk.call = call i32 @_ZNK4IntBcviEv.carbon_thunk._(ptr %b), !dbg !18
|
||||
// CHECK:STDOUT: store i32 %__carbon_thunk.call, ptr %a.var, align 4, !dbg !18
|
||||
// CHECK:STDOUT: call void @"_COp.70db2d92ffddbef7:core.Destroy.Core"(ptr %a.var), !dbg !18
|
||||
// CHECK:STDOUT: ret void, !dbg !19
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: alwaysinline mustprogress uwtable
|
||||
// CHECK:STDOUT: define internal noundef i32 @_ZNK1BcviEv.carbon_thunk._(ptr noundef nonnull align 1 dereferenceable(1) %this) #1 {
|
||||
// CHECK:STDOUT: define internal noundef i32 @_ZNK4IntBcviEv.carbon_thunk._(ptr noundef nonnull align 1 dereferenceable(1) %this) #1 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %this.addr = alloca ptr, align 8
|
||||
// CHECK:STDOUT: store ptr %this, ptr %this.addr, align 8, !tbaa !20
|
||||
// CHECK:STDOUT: %0 = load ptr, ptr %this.addr, align 8, !tbaa !20, !nonnull !23
|
||||
// CHECK:STDOUT: %call = call noundef i32 @_ZNK1BcviEv(ptr noundef nonnull align 1 dereferenceable(1) %0)
|
||||
// CHECK:STDOUT: %call = call noundef i32 @_ZNK4IntBcviEv(ptr noundef nonnull align 1 dereferenceable(1) %0)
|
||||
// CHECK:STDOUT: ret i32 %call
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
@@ -322,14 +322,14 @@ fn ConvertToValue(b: Cpp.B) {
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define void @_CConvertToValue.Main(ptr %b) #0 !dbg !31 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %__carbon_thunk.call = call i32 @_ZNK1BcviEv.carbon_thunk._(ptr %b), !dbg !34
|
||||
// CHECK:STDOUT: %__carbon_thunk.call = call i32 @_ZNK4IntBcviEv.carbon_thunk._(ptr %b), !dbg !34
|
||||
// CHECK:STDOUT: ret void, !dbg !35
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite)
|
||||
// CHECK:STDOUT: declare void @llvm.lifetime.start.p0(ptr captures(none)) #2
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: declare noundef i32 @_ZNK1BcviEv(ptr noundef nonnull align 1 dereferenceable(1)) #3
|
||||
// CHECK:STDOUT: declare noundef i32 @_ZNK4IntBcviEv(ptr noundef nonnull align 1 dereferenceable(1)) #3
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: attributes #0 = { nounwind }
|
||||
// CHECK:STDOUT: attributes #1 = { alwaysinline mustprogress uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
|
||||
@@ -361,7 +361,7 @@ fn ConvertToValue(b: Cpp.B) {
|
||||
// CHECK:STDOUT: !18 = !DILocation(line: 12, column: 3, scope: !12)
|
||||
// CHECK:STDOUT: !19 = !DILocation(line: 11, column: 1, scope: !12)
|
||||
// CHECK:STDOUT: !20 = !{!21, !21, i64 0}
|
||||
// CHECK:STDOUT: !21 = !{!"p1 _ZTS1B", !22, i64 0}
|
||||
// CHECK:STDOUT: !21 = !{!"p1 _ZTS4IntB", !22, i64 0}
|
||||
// CHECK:STDOUT: !22 = !{!"any pointer", !10, i64 0}
|
||||
// CHECK:STDOUT: !23 = !{}
|
||||
// CHECK:STDOUT: !24 = distinct !DISubprogram(name: "Op", linkageName: "_COp.70db2d92ffddbef7:core.Destroy.Core", scope: null, file: !1, line: 12, type: !25, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !28)
|
||||
|
||||
@@ -21,26 +21,26 @@ struct Copyable {
|
||||
Copyable& operator=(const Copyable&);
|
||||
~Copyable();
|
||||
};
|
||||
Copyable make();
|
||||
void pass(Copyable);
|
||||
Copyable make_copyable();
|
||||
void pass_copyable(Copyable);
|
||||
''';
|
||||
|
||||
var c: Cpp.Copyable = Cpp.make();
|
||||
var c: Cpp.Copyable = Cpp.make_copyable();
|
||||
|
||||
fn PassGlobal() {
|
||||
Cpp.pass(c);
|
||||
Cpp.pass_copyable(c);
|
||||
}
|
||||
|
||||
fn PassTemporary() {
|
||||
Cpp.pass(Cpp.make());
|
||||
Cpp.pass_copyable(Cpp.make_copyable());
|
||||
}
|
||||
|
||||
fn PassValue(c: Cpp.Copyable) {
|
||||
Cpp.pass(c);
|
||||
Cpp.pass_copyable(c);
|
||||
}
|
||||
|
||||
fn PassRef(ref c: Cpp.Copyable) {
|
||||
Cpp.pass(c);
|
||||
Cpp.pass_copyable(c);
|
||||
}
|
||||
|
||||
// --- copy_or_move.carbon
|
||||
@@ -55,26 +55,26 @@ struct CopyOrMove {
|
||||
CopyOrMove& operator=(CopyOrMove&&);
|
||||
~CopyOrMove();
|
||||
};
|
||||
CopyOrMove make();
|
||||
void pass(CopyOrMove);
|
||||
CopyOrMove make_copy_or_move();
|
||||
void pass_copy_or_move(CopyOrMove);
|
||||
''';
|
||||
|
||||
var c: Cpp.CopyOrMove = Cpp.make();
|
||||
var c: Cpp.CopyOrMove = Cpp.make_copy_or_move();
|
||||
|
||||
fn PassGlobal() {
|
||||
Cpp.pass(c);
|
||||
Cpp.pass_copy_or_move(c);
|
||||
}
|
||||
|
||||
fn PassTemporary() {
|
||||
Cpp.pass(Cpp.make());
|
||||
Cpp.pass_copy_or_move(Cpp.make_copy_or_move());
|
||||
}
|
||||
|
||||
fn PassValue(c: Cpp.CopyOrMove) {
|
||||
Cpp.pass(c);
|
||||
Cpp.pass_copy_or_move(c);
|
||||
}
|
||||
|
||||
fn PassRef(ref c: Cpp.CopyOrMove) {
|
||||
Cpp.pass(c);
|
||||
Cpp.pass_copy_or_move(c);
|
||||
}
|
||||
|
||||
// --- move_only.carbon
|
||||
@@ -93,19 +93,19 @@ struct MoveOnly {
|
||||
MoveOnly& operator=(MoveOnly&&);
|
||||
~MoveOnly();
|
||||
};
|
||||
MoveOnly make();
|
||||
void pass(MoveOnly);
|
||||
MoveOnly make_move_only();
|
||||
void pass_move_only(MoveOnly);
|
||||
''';
|
||||
|
||||
var c: Cpp.MoveOnly = Cpp.make();
|
||||
var c: Cpp.MoveOnly = Cpp.make_move_only();
|
||||
|
||||
fn PassGlobalByMove() {
|
||||
// TODO: This should be accepted.
|
||||
// Cpp.pass(Cpp.std.move(ref c));
|
||||
// Cpp.pass_move_only(Cpp.std.move(ref c));
|
||||
}
|
||||
|
||||
fn PassTemporary() {
|
||||
Cpp.pass(Cpp.make());
|
||||
Cpp.pass_move_only(Cpp.make_move_only());
|
||||
}
|
||||
|
||||
// CHECK:STDOUT: ; ---
|
||||
@@ -120,31 +120,31 @@ fn PassTemporary() {
|
||||
// CHECK:STDOUT: @llvm.global_ctors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 0, ptr @_C__global_init.Main, ptr null }]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: alwaysinline mustprogress nounwind uwtable
|
||||
// CHECK:STDOUT: define internal void @_Z4makev.carbon_thunk.(ptr noundef %return) #0 {
|
||||
// CHECK:STDOUT: define internal void @_Z13make_copyablev.carbon_thunk.(ptr noundef %return) #0 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %return.addr = alloca ptr, align 8
|
||||
// CHECK:STDOUT: store ptr %return, ptr %return.addr, align 8, !tbaa !12
|
||||
// CHECK:STDOUT: %0 = load ptr, ptr %return.addr, align 8, !tbaa !12
|
||||
// CHECK:STDOUT: call void @_Z4makev(ptr dead_on_unwind writable sret(%struct.Copyable) align 1 %0)
|
||||
// CHECK:STDOUT: call void @_Z13make_copyablev(ptr dead_on_unwind writable sret(%struct.Copyable) align 1 %0)
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define void @_CPassGlobal.Main() #1 !dbg !15 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: call void @_Z4pass8Copyable.carbon_thunk._(ptr @_Cc.Main), !dbg !18
|
||||
// CHECK:STDOUT: call void @_Z13pass_copyable8Copyable.carbon_thunk._(ptr @_Cc.Main), !dbg !18
|
||||
// CHECK:STDOUT: ret void, !dbg !19
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: alwaysinline mustprogress nounwind uwtable
|
||||
// CHECK:STDOUT: define internal void @_Z4pass8Copyable.carbon_thunk._(ptr noundef %0) #0 {
|
||||
// CHECK:STDOUT: define internal void @_Z13pass_copyable8Copyable.carbon_thunk._(ptr noundef %0) #0 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %.addr = alloca ptr, align 8
|
||||
// CHECK:STDOUT: %agg.tmp = alloca %struct.Copyable, align 1
|
||||
// CHECK:STDOUT: store ptr %0, ptr %.addr, align 8, !tbaa !12
|
||||
// CHECK:STDOUT: %1 = load ptr, ptr %.addr, align 8, !tbaa !12
|
||||
// CHECK:STDOUT: call void @_ZN8CopyableC1ERKS_(ptr noundef nonnull align 1 dereferenceable(1) %agg.tmp, ptr noundef nonnull align 1 dereferenceable(1) %1)
|
||||
// CHECK:STDOUT: call void @_Z4pass8Copyable(ptr noundef align 1 %agg.tmp)
|
||||
// CHECK:STDOUT: call void @_Z13pass_copyable8Copyable(ptr noundef align 1 %agg.tmp)
|
||||
// CHECK:STDOUT: call void @_ZN8CopyableD1Ev(ptr noundef nonnull align 1 dereferenceable(1) %agg.tmp) #1
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
@@ -152,11 +152,11 @@ fn PassTemporary() {
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define void @_CPassTemporary.Main() #1 !dbg !20 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %.loc21_21.1.temp = alloca [1 x i8], align 1, !dbg !21
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc21_21.1.temp), !dbg !21
|
||||
// CHECK:STDOUT: call void @_Z4makev.carbon_thunk.(ptr %.loc21_21.1.temp), !dbg !21
|
||||
// CHECK:STDOUT: call void @_Z4pass8Copyable.carbon_thunk._(ptr %.loc21_21.1.temp), !dbg !22
|
||||
// CHECK:STDOUT: call void @_ZN8CopyableD1Ev(ptr %.loc21_21.1.temp), !dbg !21
|
||||
// CHECK:STDOUT: %.loc21_39.1.temp = alloca [1 x i8], align 1, !dbg !21
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc21_39.1.temp), !dbg !21
|
||||
// CHECK:STDOUT: call void @_Z13make_copyablev.carbon_thunk.(ptr %.loc21_39.1.temp), !dbg !21
|
||||
// CHECK:STDOUT: call void @_Z13pass_copyable8Copyable.carbon_thunk._(ptr %.loc21_39.1.temp), !dbg !22
|
||||
// CHECK:STDOUT: call void @_ZN8CopyableD1Ev(ptr %.loc21_39.1.temp), !dbg !21
|
||||
// CHECK:STDOUT: ret void, !dbg !23
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
@@ -166,14 +166,14 @@ fn PassTemporary() {
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define void @_CPassValue.Main(ptr %c) #1 !dbg !24 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: call void @_Z4pass8Copyable.carbon_thunk._(ptr %c), !dbg !30
|
||||
// CHECK:STDOUT: call void @_Z13pass_copyable8Copyable.carbon_thunk._(ptr %c), !dbg !30
|
||||
// CHECK:STDOUT: ret void, !dbg !31
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define void @_CPassRef.Main(ptr %c) #1 !dbg !32 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: call void @_Z4pass8Copyable.carbon_thunk._(ptr %c), !dbg !35
|
||||
// CHECK:STDOUT: call void @_Z13pass_copyable8Copyable.carbon_thunk._(ptr %c), !dbg !35
|
||||
// CHECK:STDOUT: ret void, !dbg !36
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
@@ -183,13 +183,13 @@ fn PassTemporary() {
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define internal void @_C__global_init.Main() #1 !dbg !37 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: call void @_Z4makev.carbon_thunk.(ptr @_Cc.Main), !dbg !38
|
||||
// CHECK:STDOUT: call void @_Z13make_copyablev.carbon_thunk.(ptr @_Cc.Main), !dbg !38
|
||||
// CHECK:STDOUT: ret void, !dbg !39
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: declare void @_Z4makev(ptr dead_on_unwind writable sret(%struct.Copyable) align 1) #4
|
||||
// CHECK:STDOUT: declare void @_Z13make_copyablev(ptr dead_on_unwind writable sret(%struct.Copyable) align 1) #4
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: declare void @_Z4pass8Copyable(ptr noundef align 1) #4
|
||||
// CHECK:STDOUT: declare void @_Z13pass_copyable8Copyable(ptr noundef align 1) #4
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: declare void @_ZN8CopyableC1ERKS_(ptr noundef nonnull align 1 dereferenceable(1), ptr noundef nonnull align 1 dereferenceable(1)) unnamed_addr #4
|
||||
// CHECK:STDOUT:
|
||||
@@ -224,7 +224,7 @@ fn PassTemporary() {
|
||||
// CHECK:STDOUT: !18 = !DILocation(line: 17, column: 3, scope: !15)
|
||||
// CHECK:STDOUT: !19 = !DILocation(line: 16, column: 1, scope: !15)
|
||||
// CHECK:STDOUT: !20 = distinct !DISubprogram(name: "PassTemporary", linkageName: "_CPassTemporary.Main", scope: null, file: !1, line: 20, type: !16, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !21 = !DILocation(line: 21, column: 12, scope: !20)
|
||||
// CHECK:STDOUT: !21 = !DILocation(line: 21, column: 21, scope: !20)
|
||||
// CHECK:STDOUT: !22 = !DILocation(line: 21, column: 3, scope: !20)
|
||||
// CHECK:STDOUT: !23 = !DILocation(line: 20, column: 1, scope: !20)
|
||||
// CHECK:STDOUT: !24 = distinct !DISubprogram(name: "PassValue", linkageName: "_CPassValue.Main", scope: null, file: !1, line: 24, type: !25, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !28)
|
||||
@@ -256,31 +256,31 @@ fn PassTemporary() {
|
||||
// CHECK:STDOUT: @llvm.global_ctors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 0, ptr @_C__global_init.Main, ptr null }]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: alwaysinline mustprogress nounwind uwtable
|
||||
// CHECK:STDOUT: define internal void @_Z4makev.carbon_thunk.(ptr noundef %return) #0 {
|
||||
// CHECK:STDOUT: define internal void @_Z17make_copy_or_movev.carbon_thunk.(ptr noundef %return) #0 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %return.addr = alloca ptr, align 8
|
||||
// CHECK:STDOUT: store ptr %return, ptr %return.addr, align 8, !tbaa !12
|
||||
// CHECK:STDOUT: %0 = load ptr, ptr %return.addr, align 8, !tbaa !12
|
||||
// CHECK:STDOUT: call void @_Z4makev(ptr dead_on_unwind writable sret(%struct.CopyOrMove) align 1 %0)
|
||||
// CHECK:STDOUT: call void @_Z17make_copy_or_movev(ptr dead_on_unwind writable sret(%struct.CopyOrMove) align 1 %0)
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define void @_CPassGlobal.Main() #1 !dbg !15 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: call void @_Z4pass10CopyOrMove.carbon_thunk._(ptr @_Cc.Main), !dbg !18
|
||||
// CHECK:STDOUT: call void @_Z17pass_copy_or_move10CopyOrMove.carbon_thunk._(ptr @_Cc.Main), !dbg !18
|
||||
// CHECK:STDOUT: ret void, !dbg !19
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: alwaysinline mustprogress nounwind uwtable
|
||||
// CHECK:STDOUT: define internal void @_Z4pass10CopyOrMove.carbon_thunk._(ptr noundef %0) #0 {
|
||||
// CHECK:STDOUT: define internal void @_Z17pass_copy_or_move10CopyOrMove.carbon_thunk._(ptr noundef %0) #0 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %.addr = alloca ptr, align 8
|
||||
// CHECK:STDOUT: %agg.tmp = alloca %struct.CopyOrMove, align 1
|
||||
// CHECK:STDOUT: store ptr %0, ptr %.addr, align 8, !tbaa !12
|
||||
// CHECK:STDOUT: %1 = load ptr, ptr %.addr, align 8, !tbaa !12
|
||||
// CHECK:STDOUT: call void @_ZN10CopyOrMoveC1ERKS_(ptr noundef nonnull align 1 dereferenceable(1) %agg.tmp, ptr noundef nonnull align 1 dereferenceable(1) %1)
|
||||
// CHECK:STDOUT: call void @_Z4pass10CopyOrMove(ptr noundef align 1 %agg.tmp)
|
||||
// CHECK:STDOUT: call void @_Z17pass_copy_or_move10CopyOrMove(ptr noundef align 1 %agg.tmp)
|
||||
// CHECK:STDOUT: call void @_ZN10CopyOrMoveD1Ev(ptr noundef nonnull align 1 dereferenceable(1) %agg.tmp) #1
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
@@ -290,21 +290,21 @@ fn PassTemporary() {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %_.var = alloca [1 x i8], align 1, !dbg !21
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %_.var), !dbg !21
|
||||
// CHECK:STDOUT: call void @_Z4makev.carbon_thunk.(ptr %_.var), !dbg !22
|
||||
// CHECK:STDOUT: call void @_Z4pass10CopyOrMove.carbon_thunk.v(ptr %_.var), !dbg !23
|
||||
// CHECK:STDOUT: call void @_Z17make_copy_or_movev.carbon_thunk.(ptr %_.var), !dbg !22
|
||||
// CHECK:STDOUT: call void @_Z17pass_copy_or_move10CopyOrMove.carbon_thunk.v(ptr %_.var), !dbg !23
|
||||
// CHECK:STDOUT: call void @_ZN10CopyOrMoveD1Ev(ptr %_.var), !dbg !21
|
||||
// CHECK:STDOUT: ret void, !dbg !24
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: alwaysinline mustprogress nounwind uwtable
|
||||
// CHECK:STDOUT: define internal void @_Z4pass10CopyOrMove.carbon_thunk.v(ptr noundef %0) #0 {
|
||||
// CHECK:STDOUT: define internal void @_Z17pass_copy_or_move10CopyOrMove.carbon_thunk.v(ptr noundef %0) #0 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %.addr = alloca ptr, align 8
|
||||
// CHECK:STDOUT: %agg.tmp = alloca %struct.CopyOrMove, align 1
|
||||
// CHECK:STDOUT: store ptr %0, ptr %.addr, align 8, !tbaa !12
|
||||
// CHECK:STDOUT: %1 = load ptr, ptr %.addr, align 8, !tbaa !12
|
||||
// CHECK:STDOUT: call void @_ZN10CopyOrMoveC1EOS_(ptr noundef nonnull align 1 dereferenceable(1) %agg.tmp, ptr noundef nonnull align 1 dereferenceable(1) %1)
|
||||
// CHECK:STDOUT: call void @_Z4pass10CopyOrMove(ptr noundef align 1 %agg.tmp)
|
||||
// CHECK:STDOUT: call void @_Z17pass_copy_or_move10CopyOrMove(ptr noundef align 1 %agg.tmp)
|
||||
// CHECK:STDOUT: call void @_ZN10CopyOrMoveD1Ev(ptr noundef nonnull align 1 dereferenceable(1) %agg.tmp) #1
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
@@ -315,14 +315,14 @@ fn PassTemporary() {
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define void @_CPassValue.Main(ptr %c) #1 !dbg !25 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: call void @_Z4pass10CopyOrMove.carbon_thunk._(ptr %c), !dbg !31
|
||||
// CHECK:STDOUT: call void @_Z17pass_copy_or_move10CopyOrMove.carbon_thunk._(ptr %c), !dbg !31
|
||||
// CHECK:STDOUT: ret void, !dbg !32
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define void @_CPassRef.Main(ptr %c) #1 !dbg !33 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: call void @_Z4pass10CopyOrMove.carbon_thunk._(ptr %c), !dbg !36
|
||||
// CHECK:STDOUT: call void @_Z17pass_copy_or_move10CopyOrMove.carbon_thunk._(ptr %c), !dbg !36
|
||||
// CHECK:STDOUT: ret void, !dbg !37
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
@@ -332,13 +332,13 @@ fn PassTemporary() {
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define internal void @_C__global_init.Main() #1 !dbg !38 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: call void @_Z4makev.carbon_thunk.(ptr @_Cc.Main), !dbg !39
|
||||
// CHECK:STDOUT: call void @_Z17make_copy_or_movev.carbon_thunk.(ptr @_Cc.Main), !dbg !39
|
||||
// CHECK:STDOUT: ret void, !dbg !40
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: declare void @_Z4makev(ptr dead_on_unwind writable sret(%struct.CopyOrMove) align 1) #4
|
||||
// CHECK:STDOUT: declare void @_Z17make_copy_or_movev(ptr dead_on_unwind writable sret(%struct.CopyOrMove) align 1) #4
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: declare void @_Z4pass10CopyOrMove(ptr noundef align 1) #4
|
||||
// CHECK:STDOUT: declare void @_Z17pass_copy_or_move10CopyOrMove(ptr noundef align 1) #4
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: declare void @_ZN10CopyOrMoveC1ERKS_(ptr noundef nonnull align 1 dereferenceable(1), ptr noundef nonnull align 1 dereferenceable(1)) unnamed_addr #4
|
||||
// CHECK:STDOUT:
|
||||
@@ -346,7 +346,7 @@ fn PassTemporary() {
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; uselistorder directives
|
||||
// CHECK:STDOUT: uselistorder ptr @_ZN10CopyOrMoveD1Ev, { 1, 2, 0 }
|
||||
// CHECK:STDOUT: uselistorder ptr @_Z4pass10CopyOrMove, { 1, 0 }
|
||||
// CHECK:STDOUT: uselistorder ptr @_Z17pass_copy_or_move10CopyOrMove, { 1, 0 }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: attributes #0 = { alwaysinline mustprogress nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
|
||||
// CHECK:STDOUT: attributes #1 = { nounwind }
|
||||
@@ -379,8 +379,8 @@ fn PassTemporary() {
|
||||
// CHECK:STDOUT: !18 = !DILocation(line: 19, column: 3, scope: !15)
|
||||
// CHECK:STDOUT: !19 = !DILocation(line: 18, column: 1, scope: !15)
|
||||
// CHECK:STDOUT: !20 = distinct !DISubprogram(name: "PassTemporary", linkageName: "_CPassTemporary.Main", scope: null, file: !1, line: 22, type: !16, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !21 = !DILocation(line: 13, column: 21, scope: !20)
|
||||
// CHECK:STDOUT: !22 = !DILocation(line: 23, column: 12, scope: !20)
|
||||
// CHECK:STDOUT: !21 = !DILocation(line: 13, column: 34, scope: !20)
|
||||
// CHECK:STDOUT: !22 = !DILocation(line: 23, column: 25, scope: !20)
|
||||
// CHECK:STDOUT: !23 = !DILocation(line: 23, column: 3, scope: !20)
|
||||
// CHECK:STDOUT: !24 = !DILocation(line: 22, column: 1, scope: !20)
|
||||
// CHECK:STDOUT: !25 = distinct !DISubprogram(name: "PassValue", linkageName: "_CPassValue.Main", scope: null, file: !1, line: 26, type: !26, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !29)
|
||||
@@ -412,12 +412,12 @@ fn PassTemporary() {
|
||||
// CHECK:STDOUT: @llvm.global_ctors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 0, ptr @_C__global_init.Main, ptr null }]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: alwaysinline mustprogress nounwind uwtable
|
||||
// CHECK:STDOUT: define internal void @_Z4makev.carbon_thunk.(ptr noundef %return) #0 {
|
||||
// CHECK:STDOUT: define internal void @_Z14make_move_onlyv.carbon_thunk.(ptr noundef %return) #0 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %return.addr = alloca ptr, align 8
|
||||
// CHECK:STDOUT: store ptr %return, ptr %return.addr, align 8, !tbaa !12
|
||||
// CHECK:STDOUT: %0 = load ptr, ptr %return.addr, align 8, !tbaa !12
|
||||
// CHECK:STDOUT: call void @_Z4makev(ptr dead_on_unwind writable sret(%struct.MoveOnly) align 1 %0)
|
||||
// CHECK:STDOUT: call void @_Z14make_move_onlyv(ptr dead_on_unwind writable sret(%struct.MoveOnly) align 1 %0)
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
@@ -432,21 +432,21 @@ fn PassTemporary() {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %_.var = alloca [1 x i8], align 1, !dbg !20
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %_.var), !dbg !20
|
||||
// CHECK:STDOUT: call void @_Z4makev.carbon_thunk.(ptr %_.var), !dbg !21
|
||||
// CHECK:STDOUT: call void @_Z4pass8MoveOnly.carbon_thunk.v(ptr %_.var), !dbg !22
|
||||
// CHECK:STDOUT: call void @_Z14make_move_onlyv.carbon_thunk.(ptr %_.var), !dbg !21
|
||||
// CHECK:STDOUT: call void @_Z14pass_move_only8MoveOnly.carbon_thunk.v(ptr %_.var), !dbg !22
|
||||
// CHECK:STDOUT: call void @_ZN8MoveOnlyD1Ev(ptr %_.var), !dbg !20
|
||||
// CHECK:STDOUT: ret void, !dbg !23
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: alwaysinline mustprogress nounwind uwtable
|
||||
// CHECK:STDOUT: define internal void @_Z4pass8MoveOnly.carbon_thunk.v(ptr noundef %0) #0 {
|
||||
// CHECK:STDOUT: define internal void @_Z14pass_move_only8MoveOnly.carbon_thunk.v(ptr noundef %0) #0 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %.addr = alloca ptr, align 8
|
||||
// CHECK:STDOUT: %agg.tmp = alloca %struct.MoveOnly, align 1
|
||||
// CHECK:STDOUT: store ptr %0, ptr %.addr, align 8, !tbaa !12
|
||||
// CHECK:STDOUT: %1 = load ptr, ptr %.addr, align 8, !tbaa !12
|
||||
// CHECK:STDOUT: call void @_ZN8MoveOnlyC1EOS_(ptr noundef nonnull align 1 dereferenceable(1) %agg.tmp, ptr noundef nonnull align 1 dereferenceable(1) %1)
|
||||
// CHECK:STDOUT: call void @_Z4pass8MoveOnly(ptr noundef align 1 %agg.tmp)
|
||||
// CHECK:STDOUT: call void @_Z14pass_move_only8MoveOnly(ptr noundef align 1 %agg.tmp)
|
||||
// CHECK:STDOUT: call void @_ZN8MoveOnlyD1Ev(ptr noundef nonnull align 1 dereferenceable(1) %agg.tmp) #1
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
@@ -460,13 +460,13 @@ fn PassTemporary() {
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define internal void @_C__global_init.Main() #1 !dbg !24 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: call void @_Z4makev.carbon_thunk.(ptr @_Cc.Main), !dbg !25
|
||||
// CHECK:STDOUT: call void @_Z14make_move_onlyv.carbon_thunk.(ptr @_Cc.Main), !dbg !25
|
||||
// CHECK:STDOUT: ret void, !dbg !26
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: declare void @_Z4makev(ptr dead_on_unwind writable sret(%struct.MoveOnly) align 1) #4
|
||||
// CHECK:STDOUT: declare void @_Z14make_move_onlyv(ptr dead_on_unwind writable sret(%struct.MoveOnly) align 1) #4
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: declare void @_Z4pass8MoveOnly(ptr noundef align 1) #4
|
||||
// CHECK:STDOUT: declare void @_Z14pass_move_only8MoveOnly(ptr noundef align 1) #4
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: declare void @_ZN8MoveOnlyC1EOS_(ptr noundef nonnull align 1 dereferenceable(1), ptr noundef nonnull align 1 dereferenceable(1)) unnamed_addr #4
|
||||
// CHECK:STDOUT:
|
||||
@@ -503,8 +503,8 @@ fn PassTemporary() {
|
||||
// CHECK:STDOUT: !17 = !{null}
|
||||
// CHECK:STDOUT: !18 = !DILocation(line: 22, column: 1, scope: !15)
|
||||
// CHECK:STDOUT: !19 = distinct !DISubprogram(name: "PassTemporary", linkageName: "_CPassTemporary.Main", scope: null, file: !1, line: 27, type: !16, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !20 = !DILocation(line: 17, column: 19, scope: !19)
|
||||
// CHECK:STDOUT: !21 = !DILocation(line: 28, column: 12, scope: !19)
|
||||
// CHECK:STDOUT: !20 = !DILocation(line: 17, column: 29, scope: !19)
|
||||
// CHECK:STDOUT: !21 = !DILocation(line: 28, column: 22, scope: !19)
|
||||
// CHECK:STDOUT: !22 = !DILocation(line: 28, column: 3, scope: !19)
|
||||
// CHECK:STDOUT: !23 = !DILocation(line: 27, column: 1, scope: !19)
|
||||
// CHECK:STDOUT: !24 = distinct !DISubprogram(name: "__global_init", linkageName: "_C__global_init.Main", scope: null, file: !1, type: !16, spFlags: DISPFlagDefinition, unit: !0)
|
||||
|
||||
+13
-13
@@ -12,7 +12,7 @@
|
||||
|
||||
// --- struct.h
|
||||
|
||||
struct A {
|
||||
struct StructA {
|
||||
int n;
|
||||
alignas(16) int m;
|
||||
};
|
||||
@@ -25,11 +25,11 @@ import Cpp library "struct.h";
|
||||
|
||||
// TODO: We generate 4-byte-aligned loads here, and should generate
|
||||
// 16-byte-aligned loads as Clang does.
|
||||
fn AccessN(a: Cpp.A) -> i32 {
|
||||
fn AccessN(a: Cpp.StructA) -> i32 {
|
||||
return a.n;
|
||||
}
|
||||
|
||||
fn AccessM(a: Cpp.A) -> i32 {
|
||||
fn AccessM(a: Cpp.StructA) -> i32 {
|
||||
return a.m;
|
||||
}
|
||||
|
||||
@@ -41,17 +41,17 @@ import Cpp library "struct.h";
|
||||
|
||||
// TODO: We generate 4-byte-aligned stores here, and should generate
|
||||
// 16-byte-aligned stores as Clang does.
|
||||
fn AssignN(p: Cpp.A*) {
|
||||
fn AssignN(p: Cpp.StructA*) {
|
||||
p->n = 1;
|
||||
}
|
||||
|
||||
fn AssignM(p: Cpp.A*) {
|
||||
fn AssignM(p: Cpp.StructA*) {
|
||||
p->m = 1;
|
||||
}
|
||||
|
||||
// --- union.h
|
||||
|
||||
union A {
|
||||
union UnionA {
|
||||
int n;
|
||||
int m;
|
||||
};
|
||||
@@ -62,11 +62,11 @@ library "[[@TEST_NAME]]";
|
||||
|
||||
import Cpp library "union.h";
|
||||
|
||||
fn AccessN(a: Cpp.A) -> i32 {
|
||||
fn AccessN(a: Cpp.UnionA) -> i32 {
|
||||
return a.n;
|
||||
}
|
||||
|
||||
fn AccessM(a: Cpp.A) -> i32 {
|
||||
fn AccessM(a: Cpp.UnionA) -> i32 {
|
||||
return a.m;
|
||||
}
|
||||
|
||||
@@ -76,17 +76,17 @@ library "[[@TEST_NAME]]";
|
||||
|
||||
import Cpp library "union.h";
|
||||
|
||||
fn AssignN(p: Cpp.A*) {
|
||||
fn AssignN(p: Cpp.UnionA*) {
|
||||
p->n = 1;
|
||||
}
|
||||
|
||||
fn AssignM(p: Cpp.A*) {
|
||||
fn AssignM(p: Cpp.UnionA*) {
|
||||
p->m = 1;
|
||||
}
|
||||
|
||||
// --- anon_union.h
|
||||
|
||||
struct A {
|
||||
struct AnonUnionA {
|
||||
int x;
|
||||
union {
|
||||
int n;
|
||||
@@ -100,11 +100,11 @@ library "[[@TEST_NAME]]";
|
||||
|
||||
import Cpp library "anon_union.h";
|
||||
|
||||
fn AccessN(a: Cpp.A) -> i32 {
|
||||
fn AccessN(a: Cpp.AnonUnionA) -> i32 {
|
||||
return a.n;
|
||||
}
|
||||
|
||||
fn AccessP(a: Cpp.A) -> i32 {
|
||||
fn AccessP(a: Cpp.AnonUnionA) -> i32 {
|
||||
return *a.p;
|
||||
}
|
||||
|
||||
|
||||
@@ -79,12 +79,12 @@ library "[[@TEST_NAME]]";
|
||||
|
||||
import Cpp;
|
||||
inline Cpp '''
|
||||
struct A {
|
||||
struct RefSelfA {
|
||||
void f(int x, int y);
|
||||
};
|
||||
''';
|
||||
|
||||
fn F(ref r: Cpp.A) {
|
||||
fn F(ref r: Cpp.RefSelfA) {
|
||||
r.f(1, 2);
|
||||
}
|
||||
|
||||
@@ -443,11 +443,11 @@ fn F(ref r: Cpp.A) {
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define void @_CF.Main(ptr %r) #0 !dbg !12 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: call void @_ZN1A1fEii(ptr %r, i32 1, i32 2), !dbg !18
|
||||
// CHECK:STDOUT: call void @_ZN8RefSelfA1fEii(ptr %r, i32 1, i32 2), !dbg !18
|
||||
// CHECK:STDOUT: ret void, !dbg !19
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: declare void @_ZN1A1fEii(ptr noundef nonnull align 1 dereferenceable(1), i32 noundef, i32 noundef) #1
|
||||
// CHECK:STDOUT: declare void @_ZN8RefSelfA1fEii(ptr noundef nonnull align 1 dereferenceable(1), i32 noundef, i32 noundef) #1
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: attributes #0 = { nounwind }
|
||||
// CHECK:STDOUT: attributes #1 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
|
||||
|
||||
+6
-6
@@ -52,7 +52,7 @@ fn MyF() {
|
||||
|
||||
// --- extern_c_variable.h
|
||||
|
||||
extern "C" int foo;
|
||||
extern "C" int foo_var;
|
||||
|
||||
// --- import_extern_c_variable.carbon
|
||||
|
||||
@@ -61,7 +61,7 @@ library "[[@TEST_NAME]]";
|
||||
import Cpp library "extern_c_variable.h";
|
||||
|
||||
fn MyF() -> i32 {
|
||||
return Cpp.foo;
|
||||
return Cpp.foo_var;
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
@@ -90,7 +90,7 @@ fn MyF(a: Cpp.X, b: Cpp.X) -> Cpp.X {
|
||||
|
||||
// --- extern_c_with_asm_label.h
|
||||
|
||||
extern "C" void foo() __asm__("bar");
|
||||
extern "C" void foo_with_asm_label() __asm__("bar");
|
||||
|
||||
// --- import_extern_c_with_asm_label.carbon
|
||||
|
||||
@@ -99,7 +99,7 @@ library "[[@TEST_NAME]]";
|
||||
import Cpp library "extern_c_with_asm_label.h";
|
||||
|
||||
fn MyF() {
|
||||
Cpp.foo();
|
||||
Cpp.foo_with_asm_label();
|
||||
}
|
||||
|
||||
// CHECK:STDOUT: ; ---
|
||||
@@ -192,12 +192,12 @@ fn MyF() {
|
||||
// CHECK:STDOUT: target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
|
||||
// CHECK:STDOUT: target triple = "x86_64-unknown-linux-gnu"
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: @foo = external global i32, align 4
|
||||
// CHECK:STDOUT: @foo_var = external global i32, align 4
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define i32 @_CMyF.Main() #0 !dbg !12 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %.loc7 = load i32, ptr @foo, align 4, !dbg !16
|
||||
// CHECK:STDOUT: %.loc7 = load i32, ptr @foo_var, align 4, !dbg !16
|
||||
// CHECK:STDOUT: ret i32 %.loc7, !dbg !17
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
|
||||
+37
-37
@@ -34,7 +34,7 @@ fn MyF() {
|
||||
|
||||
// --- inline_function_decl.h
|
||||
|
||||
inline void foo() {}
|
||||
inline void foo_inline() {}
|
||||
|
||||
// --- import_inline_function_decl.carbon
|
||||
|
||||
@@ -43,7 +43,7 @@ library "[[@TEST_NAME]]";
|
||||
import Cpp library "inline_function_decl.h";
|
||||
|
||||
fn MyF() {
|
||||
Cpp.foo();
|
||||
Cpp.foo_inline();
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
@@ -52,7 +52,7 @@ fn MyF() {
|
||||
|
||||
// --- inline_used_function_decl.h
|
||||
|
||||
inline __attribute__((used)) void foo() {}
|
||||
inline __attribute__((used)) void foo_used() {}
|
||||
|
||||
// --- import_inline_used_function_decl.carbon
|
||||
|
||||
@@ -61,7 +61,7 @@ library "[[@TEST_NAME]]";
|
||||
import Cpp library "inline_used_function_decl.h";
|
||||
|
||||
fn MyF() {
|
||||
Cpp.foo();
|
||||
Cpp.foo_used();
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
@@ -70,9 +70,9 @@ fn MyF() {
|
||||
|
||||
// --- multiple_inline_function_decls.h
|
||||
|
||||
inline void foo1() {}
|
||||
inline void foo2() {}
|
||||
inline void foo3() {}
|
||||
inline void multi_foo1() {}
|
||||
inline void multi_foo2() {}
|
||||
inline void multi_foo3() {}
|
||||
|
||||
// --- import_multiple_inline_function_decls.carbon
|
||||
|
||||
@@ -81,9 +81,9 @@ library "[[@TEST_NAME]]";
|
||||
import Cpp library "multiple_inline_function_decls.h";
|
||||
|
||||
fn MyF() {
|
||||
Cpp.foo1();
|
||||
Cpp.foo2();
|
||||
Cpp.foo3();
|
||||
Cpp.multi_foo1();
|
||||
Cpp.multi_foo2();
|
||||
Cpp.multi_foo3();
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
@@ -92,8 +92,8 @@ fn MyF() {
|
||||
|
||||
// --- inline_recursive_function_decl.h
|
||||
|
||||
inline void foo1() {}
|
||||
inline void foo2() { foo1(); }
|
||||
inline void rec_foo1() {}
|
||||
inline void rec_foo2() { rec_foo1(); }
|
||||
|
||||
// --- import_inline_recursive_function_decl.carbon
|
||||
|
||||
@@ -102,8 +102,8 @@ library "[[@TEST_NAME]]";
|
||||
import Cpp library "inline_recursive_function_decl.h";
|
||||
|
||||
fn MyF() {
|
||||
// This should generate the definition of the inline function `foo1()`.
|
||||
Cpp.foo2();
|
||||
// This should generate the definition of the inline function `rec_foo1()`.
|
||||
Cpp.rec_foo2();
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
@@ -178,17 +178,17 @@ fn MyF() -> i32 {
|
||||
// CHECK:STDOUT: target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
|
||||
// CHECK:STDOUT: target triple = "x86_64-unknown-linux-gnu"
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: $_Z3foov = comdat any
|
||||
// CHECK:STDOUT: $_Z10foo_inlinev = comdat any
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define void @_CMyF.Main() #0 !dbg !12 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: call void @_Z3foov(), !dbg !15
|
||||
// CHECK:STDOUT: call void @_Z10foo_inlinev(), !dbg !15
|
||||
// CHECK:STDOUT: ret void, !dbg !16
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: inlinehint mustprogress nounwind uwtable
|
||||
// CHECK:STDOUT: define linkonce_odr dso_local void @_Z3foov() #1 comdat {
|
||||
// CHECK:STDOUT: define linkonce_odr dso_local void @_Z10foo_inlinev() #1 comdat {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
@@ -224,12 +224,12 @@ fn MyF() -> i32 {
|
||||
// CHECK:STDOUT: target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
|
||||
// CHECK:STDOUT: target triple = "x86_64-unknown-linux-gnu"
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: $_Z3foov = comdat any
|
||||
// CHECK:STDOUT: $_Z8foo_usedv = comdat any
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: @llvm.compiler.used = appending global [1 x ptr] [ptr @_Z3foov], section "llvm.metadata"
|
||||
// CHECK:STDOUT: @llvm.compiler.used = appending global [1 x ptr] [ptr @_Z8foo_usedv], section "llvm.metadata"
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: inlinehint mustprogress nounwind uwtable
|
||||
// CHECK:STDOUT: define linkonce_odr dso_local void @_Z3foov() #0 comdat {
|
||||
// CHECK:STDOUT: define linkonce_odr dso_local void @_Z8foo_usedv() #0 comdat {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
@@ -237,12 +237,12 @@ fn MyF() -> i32 {
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define void @_CMyF.Main() #1 !dbg !12 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: call void @_Z3foov(), !dbg !15
|
||||
// CHECK:STDOUT: call void @_Z8foo_usedv(), !dbg !15
|
||||
// CHECK:STDOUT: ret void, !dbg !16
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; uselistorder directives
|
||||
// CHECK:STDOUT: uselistorder ptr @_Z3foov, { 1, 0 }
|
||||
// CHECK:STDOUT: uselistorder ptr @_Z8foo_usedv, { 1, 0 }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: attributes #0 = { inlinehint mustprogress nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
|
||||
// CHECK:STDOUT: attributes #1 = { nounwind }
|
||||
@@ -275,35 +275,35 @@ fn MyF() -> i32 {
|
||||
// CHECK:STDOUT: target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
|
||||
// CHECK:STDOUT: target triple = "x86_64-unknown-linux-gnu"
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: $_Z4foo1v = comdat any
|
||||
// CHECK:STDOUT: $_Z10multi_foo1v = comdat any
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: $_Z4foo2v = comdat any
|
||||
// CHECK:STDOUT: $_Z10multi_foo2v = comdat any
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: $_Z4foo3v = comdat any
|
||||
// CHECK:STDOUT: $_Z10multi_foo3v = comdat any
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define void @_CMyF.Main() #0 !dbg !12 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: call void @_Z4foo1v(), !dbg !15
|
||||
// CHECK:STDOUT: call void @_Z4foo2v(), !dbg !16
|
||||
// CHECK:STDOUT: call void @_Z4foo3v(), !dbg !17
|
||||
// CHECK:STDOUT: call void @_Z10multi_foo1v(), !dbg !15
|
||||
// CHECK:STDOUT: call void @_Z10multi_foo2v(), !dbg !16
|
||||
// CHECK:STDOUT: call void @_Z10multi_foo3v(), !dbg !17
|
||||
// CHECK:STDOUT: ret void, !dbg !18
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: inlinehint mustprogress nounwind uwtable
|
||||
// CHECK:STDOUT: define linkonce_odr dso_local void @_Z4foo1v() #1 comdat {
|
||||
// CHECK:STDOUT: define linkonce_odr dso_local void @_Z10multi_foo1v() #1 comdat {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: inlinehint mustprogress nounwind uwtable
|
||||
// CHECK:STDOUT: define linkonce_odr dso_local void @_Z4foo2v() #1 comdat {
|
||||
// CHECK:STDOUT: define linkonce_odr dso_local void @_Z10multi_foo2v() #1 comdat {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: inlinehint mustprogress nounwind uwtable
|
||||
// CHECK:STDOUT: define linkonce_odr dso_local void @_Z4foo3v() #1 comdat {
|
||||
// CHECK:STDOUT: define linkonce_odr dso_local void @_Z10multi_foo3v() #1 comdat {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
@@ -341,26 +341,26 @@ fn MyF() -> i32 {
|
||||
// CHECK:STDOUT: target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
|
||||
// CHECK:STDOUT: target triple = "x86_64-unknown-linux-gnu"
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: $_Z4foo2v = comdat any
|
||||
// CHECK:STDOUT: $_Z8rec_foo2v = comdat any
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: $_Z4foo1v = comdat any
|
||||
// CHECK:STDOUT: $_Z8rec_foo1v = comdat any
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define void @_CMyF.Main() #0 !dbg !12 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: call void @_Z4foo2v(), !dbg !15
|
||||
// CHECK:STDOUT: call void @_Z8rec_foo2v(), !dbg !15
|
||||
// CHECK:STDOUT: ret void, !dbg !16
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: inlinehint mustprogress uwtable
|
||||
// CHECK:STDOUT: define linkonce_odr dso_local void @_Z4foo2v() #1 comdat {
|
||||
// CHECK:STDOUT: define linkonce_odr dso_local void @_Z8rec_foo2v() #1 comdat {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: call void @_Z4foo1v()
|
||||
// CHECK:STDOUT: call void @_Z8rec_foo1v()
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: inlinehint mustprogress nounwind uwtable
|
||||
// CHECK:STDOUT: define linkonce_odr dso_local void @_Z4foo1v() #2 comdat {
|
||||
// CHECK:STDOUT: define linkonce_odr dso_local void @_Z8rec_foo1v() #2 comdat {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
|
||||
+19
-19
@@ -35,12 +35,12 @@ fn MyF() {
|
||||
|
||||
// --- inline.h
|
||||
|
||||
struct C {
|
||||
C();
|
||||
~C();
|
||||
struct InlineC {
|
||||
InlineC();
|
||||
~InlineC();
|
||||
void f();
|
||||
};
|
||||
inline C inline_global;
|
||||
inline InlineC inline_global;
|
||||
|
||||
// --- import_inline.carbon
|
||||
|
||||
@@ -132,7 +132,7 @@ fn ReadVarTemplateWithConstructor() -> Cpp.Y* {
|
||||
|
||||
// --- static_template.h
|
||||
|
||||
struct X {
|
||||
struct StaticTmplX {
|
||||
template<typename T> static T static_tmpl = T();
|
||||
};
|
||||
|
||||
@@ -147,11 +147,11 @@ library "[[@TEST_NAME]]";
|
||||
import Cpp library "static_template.h";
|
||||
|
||||
fn ReadStaticVarTemplate() -> i32 {
|
||||
return Cpp.X.static_tmpl(i32);
|
||||
return Cpp.StaticTmplX.static_tmpl(i32);
|
||||
}
|
||||
|
||||
fn ReadStaticVarTemplateWithConstructor() -> Cpp.Y* {
|
||||
return &Cpp.X.static_tmpl(Cpp.Y);
|
||||
return &Cpp.StaticTmplX.static_tmpl(Cpp.Y);
|
||||
}
|
||||
|
||||
// CHECK:STDOUT: ; ---
|
||||
@@ -199,11 +199,11 @@ fn ReadStaticVarTemplateWithConstructor() -> Cpp.Y* {
|
||||
// CHECK:STDOUT: target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
|
||||
// CHECK:STDOUT: target triple = "x86_64-unknown-linux-gnu"
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: %struct.C = type { i8 }
|
||||
// CHECK:STDOUT: %struct.InlineC = type { i8 }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: $inline_global = comdat any
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: @inline_global = linkonce_odr dso_local global %struct.C zeroinitializer, comdat, align 1
|
||||
// CHECK:STDOUT: @inline_global = linkonce_odr dso_local global %struct.InlineC zeroinitializer, comdat, align 1
|
||||
// CHECK:STDOUT: @_ZGV13inline_global = linkonce_odr dso_local global i64 0, comdat($inline_global), align 8
|
||||
// CHECK:STDOUT: @__dso_handle = external hidden global i8
|
||||
// CHECK:STDOUT: @llvm.global_ctors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr @__cxx_global_var_init, ptr @inline_global }]
|
||||
@@ -224,11 +224,11 @@ fn ReadStaticVarTemplateWithConstructor() -> Cpp.Y* {
|
||||
// CHECK:STDOUT: br i1 %tobool, label %init, label %init.end
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: init: ; preds = %init.check
|
||||
// CHECK:STDOUT: invoke void @_ZN1CC1Ev(ptr noundef nonnull align 1 dereferenceable(1) @inline_global)
|
||||
// CHECK:STDOUT: invoke void @_ZN7InlineCC1Ev(ptr noundef nonnull align 1 dereferenceable(1) @inline_global)
|
||||
// CHECK:STDOUT: to label %invoke.cont unwind label %lpad
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: invoke.cont: ; preds = %init
|
||||
// CHECK:STDOUT: %2 = call i32 @__cxa_atexit(ptr @_ZN1CD1Ev, ptr @inline_global, ptr @__dso_handle) #1
|
||||
// CHECK:STDOUT: %2 = call i32 @__cxa_atexit(ptr @_ZN7InlineCD1Ev, ptr @inline_global, ptr @__dso_handle) #1
|
||||
// CHECK:STDOUT: call void @__cxa_guard_release(ptr @_ZGV13inline_global) #1
|
||||
// CHECK:STDOUT: br label %init.end
|
||||
// CHECK:STDOUT:
|
||||
@@ -256,12 +256,12 @@ fn ReadStaticVarTemplateWithConstructor() -> Cpp.Y* {
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: declare i32 @__cxa_guard_acquire(ptr) #1
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: declare void @_ZN1CC1Ev(ptr noundef nonnull align 1 dereferenceable(1)) unnamed_addr #2
|
||||
// CHECK:STDOUT: declare void @_ZN7InlineCC1Ev(ptr noundef nonnull align 1 dereferenceable(1)) unnamed_addr #2
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: declare i32 @__gxx_personality_v0(...)
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: declare void @_ZN1CD1Ev(ptr noundef nonnull align 1 dereferenceable(1)) unnamed_addr #3
|
||||
// CHECK:STDOUT: declare void @_ZN7InlineCD1Ev(ptr noundef nonnull align 1 dereferenceable(1)) unnamed_addr #3
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: declare i32 @__cxa_atexit(ptr, ptr, ptr) #1
|
||||
@@ -275,11 +275,11 @@ fn ReadStaticVarTemplateWithConstructor() -> Cpp.Y* {
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define void @_CCallF.Main() #1 !dbg !12 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: call void @_ZN1C1fEv(ptr @inline_global), !dbg !15
|
||||
// CHECK:STDOUT: call void @_ZN7InlineC1fEv(ptr @inline_global), !dbg !15
|
||||
// CHECK:STDOUT: ret void, !dbg !16
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: declare void @_ZN1C1fEv(ptr noundef nonnull align 1 dereferenceable(1)) #2
|
||||
// CHECK:STDOUT: declare void @_ZN7InlineC1fEv(ptr noundef nonnull align 1 dereferenceable(1)) #2
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; uselistorder directives
|
||||
// CHECK:STDOUT: uselistorder ptr @inline_global, { 2, 3, 4, 0, 1 }
|
||||
@@ -530,20 +530,20 @@ fn ReadStaticVarTemplateWithConstructor() -> Cpp.Y* {
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: %struct.Y.26 = type { i8 }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: @_ZN1X11static_tmplIiEE = external global i32, align 4
|
||||
// CHECK:STDOUT: @_ZN1X11static_tmplI1YEE = external global %struct.Y.26, align 1
|
||||
// CHECK:STDOUT: @_ZN11StaticTmplX11static_tmplIiEE = external global i32, align 4
|
||||
// CHECK:STDOUT: @_ZN11StaticTmplX11static_tmplI1YEE = external global %struct.Y.26, align 1
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define i32 @_CReadStaticVarTemplate.Main() #0 !dbg !12 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %.loc7 = load i32, ptr @_ZN1X11static_tmplIiEE, align 4, !dbg !16
|
||||
// CHECK:STDOUT: %.loc7 = load i32, ptr @_ZN11StaticTmplX11static_tmplIiEE, align 4, !dbg !16
|
||||
// CHECK:STDOUT: ret i32 %.loc7, !dbg !17
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define ptr @_CReadStaticVarTemplateWithConstructor.Main() #0 !dbg !18 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: ret ptr @_ZN1X11static_tmplI1YEE, !dbg !22
|
||||
// CHECK:STDOUT: ret ptr @_ZN11StaticTmplX11static_tmplI1YEE, !dbg !22
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: attributes #0 = { nounwind }
|
||||
|
||||
+142
-142
@@ -15,14 +15,14 @@
|
||||
library "[[@TEST_NAME]]";
|
||||
|
||||
import Cpp inline '''c++
|
||||
struct A {
|
||||
struct EqA {
|
||||
int value;
|
||||
|
||||
friend auto operator==(A x, A y) -> bool {
|
||||
friend auto operator==(EqA x, EqA y) -> bool {
|
||||
return x.value == y.value;
|
||||
}
|
||||
|
||||
friend auto operator!=(A x, A y) -> bool {
|
||||
friend auto operator!=(EqA x, EqA y) -> bool {
|
||||
return !(x == y);
|
||||
}
|
||||
};
|
||||
@@ -33,7 +33,7 @@ fn CheckEqWith[U: type, T: Core.EqWith(U)](x: T, y: U) {
|
||||
x != y;
|
||||
}
|
||||
|
||||
fn Driver(x: Cpp.A, y: Cpp.A) {
|
||||
fn Driver(x: Cpp.EqA, y: Cpp.EqA) {
|
||||
CheckEqWith(x, y);
|
||||
}
|
||||
|
||||
@@ -42,22 +42,22 @@ fn Driver(x: Cpp.A, y: Cpp.A) {
|
||||
library "[[@TEST_NAME]]";
|
||||
|
||||
import Cpp inline '''c++
|
||||
struct A {
|
||||
struct OrderedA {
|
||||
int value;
|
||||
|
||||
friend auto operator<(A x, A y) -> bool {
|
||||
friend auto operator<(OrderedA x, OrderedA y) -> bool {
|
||||
return x.value < y.value;
|
||||
}
|
||||
|
||||
friend auto operator>(A x, A y) -> bool {
|
||||
friend auto operator>(OrderedA x, OrderedA y) -> bool {
|
||||
return y < x;
|
||||
}
|
||||
|
||||
friend auto operator<=(A x, A y) -> bool {
|
||||
friend auto operator<=(OrderedA x, OrderedA y) -> bool {
|
||||
return !(y < x);
|
||||
}
|
||||
|
||||
friend auto operator>=(A x, A y) -> bool {
|
||||
friend auto operator>=(OrderedA x, OrderedA y) -> bool {
|
||||
return !(x < y);
|
||||
}
|
||||
};
|
||||
@@ -70,7 +70,7 @@ fn CheckOrderedWith[U: type, T: Core.OrderedWith(U)](x: T, y: U) {
|
||||
x >= y;
|
||||
}
|
||||
|
||||
fn Driver(x: Cpp.A, y: Cpp.A) {
|
||||
fn Driver(x: Cpp.OrderedA, y: Cpp.OrderedA) {
|
||||
CheckOrderedWith(x, y);
|
||||
}
|
||||
|
||||
@@ -80,27 +80,27 @@ fn Driver(x: Cpp.A, y: Cpp.A) {
|
||||
// CHECK:STDOUT: target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
|
||||
// CHECK:STDOUT: target triple = "x86_64-unknown-linux-gnu"
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: %struct.A = type { i32 }
|
||||
// CHECK:STDOUT: %struct.EqA = type { i32 }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: $_Zeq1AS_ = comdat any
|
||||
// CHECK:STDOUT: $_Zeq3EqAS_ = comdat any
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: $_Zne1AS_ = comdat any
|
||||
// CHECK:STDOUT: $_Zne3EqAS_ = comdat any
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define void @_CDriver.Main(ptr %x, ptr %y) #0 !dbg !12 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: call void @_CCheckEqWith.Main.bdef5a2ed02e32a1(ptr %x, ptr %y), !dbg !19
|
||||
// CHECK:STDOUT: call void @_CCheckEqWith.Main.5d19350ce19a6fbd(ptr %x, ptr %y), !dbg !19
|
||||
// CHECK:STDOUT: ret void, !dbg !20
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: alwaysinline mustprogress uwtable
|
||||
// CHECK:STDOUT: define internal void @_Zeq1AS_.carbon_thunk.__(ptr noundef %x, ptr noundef %y, ptr noundef %return) #1 {
|
||||
// CHECK:STDOUT: define internal void @_Zeq3EqAS_.carbon_thunk.__(ptr noundef %x, ptr noundef %y, ptr noundef %return) #1 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %x.addr = alloca ptr, align 8
|
||||
// CHECK:STDOUT: %y.addr = alloca ptr, align 8
|
||||
// CHECK:STDOUT: %return.addr = alloca ptr, align 8
|
||||
// CHECK:STDOUT: %agg.tmp = alloca %struct.A, align 4
|
||||
// CHECK:STDOUT: %agg.tmp1 = alloca %struct.A, align 4
|
||||
// CHECK:STDOUT: %agg.tmp = alloca %struct.EqA, align 4
|
||||
// CHECK:STDOUT: %agg.tmp1 = alloca %struct.EqA, align 4
|
||||
// CHECK:STDOUT: store ptr %x, ptr %x.addr, align 8, !tbaa !21
|
||||
// CHECK:STDOUT: store ptr %y, ptr %y.addr, align 8, !tbaa !21
|
||||
// CHECK:STDOUT: store ptr %return, ptr %return.addr, align 8, !tbaa !24
|
||||
@@ -109,24 +109,24 @@ fn Driver(x: Cpp.A, y: Cpp.A) {
|
||||
// CHECK:STDOUT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 %agg.tmp, ptr align 4 %1, i64 4, i1 false), !tbaa.struct !26
|
||||
// CHECK:STDOUT: %2 = load ptr, ptr %y.addr, align 8, !tbaa !21
|
||||
// CHECK:STDOUT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 %agg.tmp1, ptr align 4 %2, i64 4, i1 false), !tbaa.struct !26
|
||||
// CHECK:STDOUT: %coerce.dive = getelementptr inbounds nuw %struct.A, ptr %agg.tmp, i32 0, i32 0
|
||||
// CHECK:STDOUT: %coerce.dive = getelementptr inbounds nuw %struct.EqA, ptr %agg.tmp, i32 0, i32 0
|
||||
// CHECK:STDOUT: %3 = load i32, ptr %coerce.dive, align 4
|
||||
// CHECK:STDOUT: %coerce.dive2 = getelementptr inbounds nuw %struct.A, ptr %agg.tmp1, i32 0, i32 0
|
||||
// CHECK:STDOUT: %coerce.dive2 = getelementptr inbounds nuw %struct.EqA, ptr %agg.tmp1, i32 0, i32 0
|
||||
// CHECK:STDOUT: %4 = load i32, ptr %coerce.dive2, align 4
|
||||
// CHECK:STDOUT: %call = call noundef zeroext i1 @_Zeq1AS_(i32 %3, i32 %4)
|
||||
// CHECK:STDOUT: %call = call noundef zeroext i1 @_Zeq3EqAS_(i32 %3, i32 %4)
|
||||
// CHECK:STDOUT: %storedv = zext i1 %call to i8
|
||||
// CHECK:STDOUT: store i8 %storedv, ptr %0, align 1, !tbaa !28
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: alwaysinline mustprogress uwtable
|
||||
// CHECK:STDOUT: define internal void @_Zne1AS_.carbon_thunk.__(ptr noundef %x, ptr noundef %y, ptr noundef %return) #1 {
|
||||
// CHECK:STDOUT: define internal void @_Zne3EqAS_.carbon_thunk.__(ptr noundef %x, ptr noundef %y, ptr noundef %return) #1 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %x.addr = alloca ptr, align 8
|
||||
// CHECK:STDOUT: %y.addr = alloca ptr, align 8
|
||||
// CHECK:STDOUT: %return.addr = alloca ptr, align 8
|
||||
// CHECK:STDOUT: %agg.tmp = alloca %struct.A, align 4
|
||||
// CHECK:STDOUT: %agg.tmp1 = alloca %struct.A, align 4
|
||||
// CHECK:STDOUT: %agg.tmp = alloca %struct.EqA, align 4
|
||||
// CHECK:STDOUT: %agg.tmp1 = alloca %struct.EqA, align 4
|
||||
// CHECK:STDOUT: store ptr %x, ptr %x.addr, align 8, !tbaa !21
|
||||
// CHECK:STDOUT: store ptr %y, ptr %y.addr, align 8, !tbaa !21
|
||||
// CHECK:STDOUT: store ptr %return, ptr %return.addr, align 8, !tbaa !24
|
||||
@@ -135,41 +135,41 @@ fn Driver(x: Cpp.A, y: Cpp.A) {
|
||||
// CHECK:STDOUT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 %agg.tmp, ptr align 4 %1, i64 4, i1 false), !tbaa.struct !26
|
||||
// CHECK:STDOUT: %2 = load ptr, ptr %y.addr, align 8, !tbaa !21
|
||||
// CHECK:STDOUT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 %agg.tmp1, ptr align 4 %2, i64 4, i1 false), !tbaa.struct !26
|
||||
// CHECK:STDOUT: %coerce.dive = getelementptr inbounds nuw %struct.A, ptr %agg.tmp, i32 0, i32 0
|
||||
// CHECK:STDOUT: %coerce.dive = getelementptr inbounds nuw %struct.EqA, ptr %agg.tmp, i32 0, i32 0
|
||||
// CHECK:STDOUT: %3 = load i32, ptr %coerce.dive, align 4
|
||||
// CHECK:STDOUT: %coerce.dive2 = getelementptr inbounds nuw %struct.A, ptr %agg.tmp1, i32 0, i32 0
|
||||
// CHECK:STDOUT: %coerce.dive2 = getelementptr inbounds nuw %struct.EqA, ptr %agg.tmp1, i32 0, i32 0
|
||||
// CHECK:STDOUT: %4 = load i32, ptr %coerce.dive2, align 4
|
||||
// CHECK:STDOUT: %call = call noundef zeroext i1 @_Zne1AS_(i32 %3, i32 %4)
|
||||
// CHECK:STDOUT: %call = call noundef zeroext i1 @_Zne3EqAS_(i32 %3, i32 %4)
|
||||
// CHECK:STDOUT: %storedv = zext i1 %call to i8
|
||||
// CHECK:STDOUT: store i8 %storedv, ptr %0, align 1, !tbaa !28
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: alwaysinline nounwind
|
||||
// CHECK:STDOUT: define weak_odr i1 @"_CEqual:thunk:EqWith.ffb401eeee8c4872.Core:Cpp"(ptr %self, ptr %other) #2 !dbg !30 {
|
||||
// CHECK:STDOUT: define weak_odr i1 @"_CEqual:thunk:EqWith.c41e21bae407dec8.Core:Cpp"(ptr %self, ptr %other) #2 !dbg !30 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %.6.temp = alloca i1, align 1, !dbg !36
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.6.temp), !dbg !36
|
||||
// CHECK:STDOUT: call void @_Zeq1AS_.carbon_thunk.__(ptr %self, ptr %other, ptr %.6.temp), !dbg !36
|
||||
// CHECK:STDOUT: call void @_Zeq3EqAS_.carbon_thunk.__(ptr %self, ptr %other, ptr %.6.temp), !dbg !36
|
||||
// CHECK:STDOUT: %0 = load i1, ptr %.6.temp, align 1, !dbg !36
|
||||
// CHECK:STDOUT: ret i1 %0, !dbg !36
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: alwaysinline nounwind
|
||||
// CHECK:STDOUT: define weak_odr i1 @"_CNotEqual:thunk:EqWith.ffb401eeee8c4872.Core:Cpp"(ptr %self, ptr %other) #2 !dbg !37 {
|
||||
// CHECK:STDOUT: define weak_odr i1 @"_CNotEqual:thunk:EqWith.c41e21bae407dec8.Core:Cpp"(ptr %self, ptr %other) #2 !dbg !37 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %.6.temp = alloca i1, align 1, !dbg !41
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.6.temp), !dbg !41
|
||||
// CHECK:STDOUT: call void @_Zne1AS_.carbon_thunk.__(ptr %self, ptr %other, ptr %.6.temp), !dbg !41
|
||||
// CHECK:STDOUT: call void @_Zne3EqAS_.carbon_thunk.__(ptr %self, ptr %other, ptr %.6.temp), !dbg !41
|
||||
// CHECK:STDOUT: %0 = load i1, ptr %.6.temp, align 1, !dbg !41
|
||||
// CHECK:STDOUT: ret i1 %0, !dbg !41
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define linkonce_odr void @_CCheckEqWith.Main.bdef5a2ed02e32a1(ptr %x, ptr %y) #0 !dbg !42 {
|
||||
// CHECK:STDOUT: define linkonce_odr void @_CCheckEqWith.Main.5d19350ce19a6fbd(ptr %x, ptr %y) #0 !dbg !42 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %EqWith.WithSelf.Equal.call = call i1 @"_CEqual:thunk:EqWith.ffb401eeee8c4872.Core:Cpp"(ptr %x, ptr %y), !dbg !46
|
||||
// CHECK:STDOUT: %EqWith.WithSelf.NotEqual.call = call i1 @"_CNotEqual:thunk:EqWith.ffb401eeee8c4872.Core:Cpp"(ptr %x, ptr %y), !dbg !47
|
||||
// CHECK:STDOUT: %EqWith.WithSelf.Equal.call = call i1 @"_CEqual:thunk:EqWith.c41e21bae407dec8.Core:Cpp"(ptr %x, ptr %y), !dbg !46
|
||||
// CHECK:STDOUT: %EqWith.WithSelf.NotEqual.call = call i1 @"_CNotEqual:thunk:EqWith.c41e21bae407dec8.Core:Cpp"(ptr %x, ptr %y), !dbg !47
|
||||
// CHECK:STDOUT: ret void, !dbg !48
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
@@ -177,17 +177,17 @@ fn Driver(x: Cpp.A, y: Cpp.A) {
|
||||
// CHECK:STDOUT: declare void @llvm.lifetime.start.p0(ptr captures(none)) #3
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: mustprogress nounwind uwtable
|
||||
// CHECK:STDOUT: define linkonce_odr dso_local noundef zeroext i1 @_Zeq1AS_(i32 %x.coerce, i32 %y.coerce) #4 comdat {
|
||||
// CHECK:STDOUT: define linkonce_odr dso_local noundef zeroext i1 @_Zeq3EqAS_(i32 %x.coerce, i32 %y.coerce) #4 comdat {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %x = alloca %struct.A, align 4
|
||||
// CHECK:STDOUT: %y = alloca %struct.A, align 4
|
||||
// CHECK:STDOUT: %coerce.dive = getelementptr inbounds nuw %struct.A, ptr %x, i32 0, i32 0
|
||||
// CHECK:STDOUT: %x = alloca %struct.EqA, align 4
|
||||
// CHECK:STDOUT: %y = alloca %struct.EqA, align 4
|
||||
// CHECK:STDOUT: %coerce.dive = getelementptr inbounds nuw %struct.EqA, ptr %x, i32 0, i32 0
|
||||
// CHECK:STDOUT: store i32 %x.coerce, ptr %coerce.dive, align 4
|
||||
// CHECK:STDOUT: %coerce.dive1 = getelementptr inbounds nuw %struct.A, ptr %y, i32 0, i32 0
|
||||
// CHECK:STDOUT: %coerce.dive1 = getelementptr inbounds nuw %struct.EqA, ptr %y, i32 0, i32 0
|
||||
// CHECK:STDOUT: store i32 %y.coerce, ptr %coerce.dive1, align 4
|
||||
// CHECK:STDOUT: %value = getelementptr inbounds nuw %struct.A, ptr %x, i32 0, i32 0
|
||||
// CHECK:STDOUT: %value = getelementptr inbounds nuw %struct.EqA, ptr %x, i32 0, i32 0
|
||||
// CHECK:STDOUT: %0 = load i32, ptr %value, align 4, !tbaa !49
|
||||
// CHECK:STDOUT: %value2 = getelementptr inbounds nuw %struct.A, ptr %y, i32 0, i32 0
|
||||
// CHECK:STDOUT: %value2 = getelementptr inbounds nuw %struct.EqA, ptr %y, i32 0, i32 0
|
||||
// CHECK:STDOUT: %1 = load i32, ptr %value2, align 4, !tbaa !49
|
||||
// CHECK:STDOUT: %cmp = icmp eq i32 %0, %1
|
||||
// CHECK:STDOUT: ret i1 %cmp
|
||||
@@ -197,23 +197,23 @@ fn Driver(x: Cpp.A, y: Cpp.A) {
|
||||
// CHECK:STDOUT: declare void @llvm.memcpy.p0.p0.i64(ptr noalias writeonly captures(none), ptr noalias readonly captures(none), i64, i1 immarg) #3
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: mustprogress nounwind uwtable
|
||||
// CHECK:STDOUT: define linkonce_odr dso_local noundef zeroext i1 @_Zne1AS_(i32 %x.coerce, i32 %y.coerce) #4 comdat {
|
||||
// CHECK:STDOUT: define linkonce_odr dso_local noundef zeroext i1 @_Zne3EqAS_(i32 %x.coerce, i32 %y.coerce) #4 comdat {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %x = alloca %struct.A, align 4
|
||||
// CHECK:STDOUT: %y = alloca %struct.A, align 4
|
||||
// CHECK:STDOUT: %agg.tmp = alloca %struct.A, align 4
|
||||
// CHECK:STDOUT: %agg.tmp2 = alloca %struct.A, align 4
|
||||
// CHECK:STDOUT: %coerce.dive = getelementptr inbounds nuw %struct.A, ptr %x, i32 0, i32 0
|
||||
// CHECK:STDOUT: %x = alloca %struct.EqA, align 4
|
||||
// CHECK:STDOUT: %y = alloca %struct.EqA, align 4
|
||||
// CHECK:STDOUT: %agg.tmp = alloca %struct.EqA, align 4
|
||||
// CHECK:STDOUT: %agg.tmp2 = alloca %struct.EqA, align 4
|
||||
// CHECK:STDOUT: %coerce.dive = getelementptr inbounds nuw %struct.EqA, ptr %x, i32 0, i32 0
|
||||
// CHECK:STDOUT: store i32 %x.coerce, ptr %coerce.dive, align 4
|
||||
// CHECK:STDOUT: %coerce.dive1 = getelementptr inbounds nuw %struct.A, ptr %y, i32 0, i32 0
|
||||
// CHECK:STDOUT: %coerce.dive1 = getelementptr inbounds nuw %struct.EqA, ptr %y, i32 0, i32 0
|
||||
// CHECK:STDOUT: store i32 %y.coerce, ptr %coerce.dive1, align 4
|
||||
// CHECK:STDOUT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 %agg.tmp, ptr align 4 %x, i64 4, i1 false), !tbaa.struct !26
|
||||
// CHECK:STDOUT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 %agg.tmp2, ptr align 4 %y, i64 4, i1 false), !tbaa.struct !26
|
||||
// CHECK:STDOUT: %coerce.dive3 = getelementptr inbounds nuw %struct.A, ptr %agg.tmp, i32 0, i32 0
|
||||
// CHECK:STDOUT: %coerce.dive3 = getelementptr inbounds nuw %struct.EqA, ptr %agg.tmp, i32 0, i32 0
|
||||
// CHECK:STDOUT: %0 = load i32, ptr %coerce.dive3, align 4
|
||||
// CHECK:STDOUT: %coerce.dive4 = getelementptr inbounds nuw %struct.A, ptr %agg.tmp2, i32 0, i32 0
|
||||
// CHECK:STDOUT: %coerce.dive4 = getelementptr inbounds nuw %struct.EqA, ptr %agg.tmp2, i32 0, i32 0
|
||||
// CHECK:STDOUT: %1 = load i32, ptr %coerce.dive4, align 4
|
||||
// CHECK:STDOUT: %call = call noundef zeroext i1 @_Zeq1AS_(i32 %0, i32 %1)
|
||||
// CHECK:STDOUT: %call = call noundef zeroext i1 @_Zeq3EqAS_(i32 %0, i32 %1)
|
||||
// CHECK:STDOUT: %lnot = xor i1 %call, true
|
||||
// CHECK:STDOUT: ret i1 %lnot
|
||||
// CHECK:STDOUT: }
|
||||
@@ -254,7 +254,7 @@ fn Driver(x: Cpp.A, y: Cpp.A) {
|
||||
// CHECK:STDOUT: !19 = !DILocation(line: 24, column: 3, scope: !12)
|
||||
// CHECK:STDOUT: !20 = !DILocation(line: 23, column: 1, scope: !12)
|
||||
// CHECK:STDOUT: !21 = !{!22, !22, i64 0}
|
||||
// CHECK:STDOUT: !22 = !{!"p1 _ZTS1A", !23, i64 0}
|
||||
// CHECK:STDOUT: !22 = !{!"p1 _ZTS3EqA", !23, i64 0}
|
||||
// CHECK:STDOUT: !23 = !{!"any pointer", !10, i64 0}
|
||||
// CHECK:STDOUT: !24 = !{!25, !25, i64 0}
|
||||
// CHECK:STDOUT: !25 = !{!"p1 bool", !23, i64 0}
|
||||
@@ -262,19 +262,19 @@ fn Driver(x: Cpp.A, y: Cpp.A) {
|
||||
// CHECK:STDOUT: !27 = !{!9, !9, i64 0}
|
||||
// CHECK:STDOUT: !28 = !{!29, !29, i64 0}
|
||||
// CHECK:STDOUT: !29 = !{!"bool", !10, i64 0}
|
||||
// CHECK:STDOUT: !30 = distinct !DISubprogram(name: "Equal", linkageName: "_CEqual:thunk:EqWith.ffb401eeee8c4872.Core:Cpp", scope: null, file: !1, line: 8, type: !31, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !33)
|
||||
// CHECK:STDOUT: !30 = distinct !DISubprogram(name: "Equal", linkageName: "_CEqual:thunk:EqWith.c41e21bae407dec8.Core:Cpp", scope: null, file: !1, line: 8, type: !31, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !33)
|
||||
// CHECK:STDOUT: !31 = !DISubroutineType(types: !32)
|
||||
// CHECK:STDOUT: !32 = !{!15, !15, !15}
|
||||
// CHECK:STDOUT: !33 = !{!34, !35}
|
||||
// CHECK:STDOUT: !34 = !DILocalVariable(arg: 1, scope: !30, type: !15)
|
||||
// CHECK:STDOUT: !35 = !DILocalVariable(arg: 2, scope: !30, type: !15)
|
||||
// CHECK:STDOUT: !36 = !DILocation(line: 8, column: 15, scope: !30)
|
||||
// CHECK:STDOUT: !37 = distinct !DISubprogram(name: "NotEqual", linkageName: "_CNotEqual:thunk:EqWith.ffb401eeee8c4872.Core:Cpp", scope: null, file: !1, line: 12, type: !31, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !38)
|
||||
// CHECK:STDOUT: !37 = distinct !DISubprogram(name: "NotEqual", linkageName: "_CNotEqual:thunk:EqWith.c41e21bae407dec8.Core:Cpp", scope: null, file: !1, line: 12, type: !31, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !38)
|
||||
// CHECK:STDOUT: !38 = !{!39, !40}
|
||||
// CHECK:STDOUT: !39 = !DILocalVariable(arg: 1, scope: !37, type: !15)
|
||||
// CHECK:STDOUT: !40 = !DILocalVariable(arg: 2, scope: !37, type: !15)
|
||||
// CHECK:STDOUT: !41 = !DILocation(line: 12, column: 15, scope: !37)
|
||||
// CHECK:STDOUT: !42 = distinct !DISubprogram(name: "CheckEqWith", linkageName: "_CCheckEqWith.Main.bdef5a2ed02e32a1", scope: null, file: !1, line: 18, type: !13, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !43)
|
||||
// CHECK:STDOUT: !42 = distinct !DISubprogram(name: "CheckEqWith", linkageName: "_CCheckEqWith.Main.5d19350ce19a6fbd", scope: null, file: !1, line: 18, type: !13, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !43)
|
||||
// CHECK:STDOUT: !43 = !{!44, !45}
|
||||
// CHECK:STDOUT: !44 = !DILocalVariable(arg: 1, scope: !42, type: !15)
|
||||
// CHECK:STDOUT: !45 = !DILocalVariable(arg: 2, scope: !42, type: !15)
|
||||
@@ -282,7 +282,7 @@ fn Driver(x: Cpp.A, y: Cpp.A) {
|
||||
// CHECK:STDOUT: !47 = !DILocation(line: 20, column: 3, scope: !42)
|
||||
// CHECK:STDOUT: !48 = !DILocation(line: 18, column: 1, scope: !42)
|
||||
// CHECK:STDOUT: !49 = !{!50, !9, i64 0}
|
||||
// CHECK:STDOUT: !50 = !{!"_ZTS1A", !9, i64 0}
|
||||
// CHECK:STDOUT: !50 = !{!"_ZTS3EqA", !9, i64 0}
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; ---
|
||||
// CHECK:STDOUT: ; ModuleID = 'ordered_with.carbon'
|
||||
@@ -290,31 +290,31 @@ fn Driver(x: Cpp.A, y: Cpp.A) {
|
||||
// CHECK:STDOUT: target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
|
||||
// CHECK:STDOUT: target triple = "x86_64-unknown-linux-gnu"
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: %struct.A.4 = type { i32 }
|
||||
// CHECK:STDOUT: %struct.OrderedA = type { i32 }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: $_Zlt1AS_ = comdat any
|
||||
// CHECK:STDOUT: $_Zlt8OrderedAS_ = comdat any
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: $_Zle1AS_ = comdat any
|
||||
// CHECK:STDOUT: $_Zle8OrderedAS_ = comdat any
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: $_Zgt1AS_ = comdat any
|
||||
// CHECK:STDOUT: $_Zgt8OrderedAS_ = comdat any
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: $_Zge1AS_ = comdat any
|
||||
// CHECK:STDOUT: $_Zge8OrderedAS_ = comdat any
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define void @_CDriver.Main(ptr %x, ptr %y) #0 !dbg !12 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: call void @_CCheckOrderedWith.Main.c49adfa90bd18905(ptr %x, ptr %y), !dbg !19
|
||||
// CHECK:STDOUT: call void @_CCheckOrderedWith.Main.f3d1df67aae0c1db(ptr %x, ptr %y), !dbg !19
|
||||
// CHECK:STDOUT: ret void, !dbg !20
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: alwaysinline mustprogress uwtable
|
||||
// CHECK:STDOUT: define internal void @_Zlt1AS_.carbon_thunk.__(ptr noundef %x, ptr noundef %y, ptr noundef %return) #1 {
|
||||
// CHECK:STDOUT: define internal void @_Zlt8OrderedAS_.carbon_thunk.__(ptr noundef %x, ptr noundef %y, ptr noundef %return) #1 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %x.addr = alloca ptr, align 8
|
||||
// CHECK:STDOUT: %y.addr = alloca ptr, align 8
|
||||
// CHECK:STDOUT: %return.addr = alloca ptr, align 8
|
||||
// CHECK:STDOUT: %agg.tmp = alloca %struct.A.4, align 4
|
||||
// CHECK:STDOUT: %agg.tmp1 = alloca %struct.A.4, align 4
|
||||
// CHECK:STDOUT: %agg.tmp = alloca %struct.OrderedA, align 4
|
||||
// CHECK:STDOUT: %agg.tmp1 = alloca %struct.OrderedA, align 4
|
||||
// CHECK:STDOUT: store ptr %x, ptr %x.addr, align 8, !tbaa !21
|
||||
// CHECK:STDOUT: store ptr %y, ptr %y.addr, align 8, !tbaa !21
|
||||
// CHECK:STDOUT: store ptr %return, ptr %return.addr, align 8, !tbaa !24
|
||||
@@ -323,24 +323,24 @@ fn Driver(x: Cpp.A, y: Cpp.A) {
|
||||
// CHECK:STDOUT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 %agg.tmp, ptr align 4 %1, i64 4, i1 false), !tbaa.struct !26
|
||||
// CHECK:STDOUT: %2 = load ptr, ptr %y.addr, align 8, !tbaa !21
|
||||
// CHECK:STDOUT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 %agg.tmp1, ptr align 4 %2, i64 4, i1 false), !tbaa.struct !26
|
||||
// CHECK:STDOUT: %coerce.dive = getelementptr inbounds nuw %struct.A.4, ptr %agg.tmp, i32 0, i32 0
|
||||
// CHECK:STDOUT: %coerce.dive = getelementptr inbounds nuw %struct.OrderedA, ptr %agg.tmp, i32 0, i32 0
|
||||
// CHECK:STDOUT: %3 = load i32, ptr %coerce.dive, align 4
|
||||
// CHECK:STDOUT: %coerce.dive2 = getelementptr inbounds nuw %struct.A.4, ptr %agg.tmp1, i32 0, i32 0
|
||||
// CHECK:STDOUT: %coerce.dive2 = getelementptr inbounds nuw %struct.OrderedA, ptr %agg.tmp1, i32 0, i32 0
|
||||
// CHECK:STDOUT: %4 = load i32, ptr %coerce.dive2, align 4
|
||||
// CHECK:STDOUT: %call = call noundef zeroext i1 @_Zlt1AS_(i32 %3, i32 %4)
|
||||
// CHECK:STDOUT: %call = call noundef zeroext i1 @_Zlt8OrderedAS_(i32 %3, i32 %4)
|
||||
// CHECK:STDOUT: %storedv = zext i1 %call to i8
|
||||
// CHECK:STDOUT: store i8 %storedv, ptr %0, align 1, !tbaa !28
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: alwaysinline mustprogress uwtable
|
||||
// CHECK:STDOUT: define internal void @_Zle1AS_.carbon_thunk.__(ptr noundef %x, ptr noundef %y, ptr noundef %return) #1 {
|
||||
// CHECK:STDOUT: define internal void @_Zle8OrderedAS_.carbon_thunk.__(ptr noundef %x, ptr noundef %y, ptr noundef %return) #1 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %x.addr = alloca ptr, align 8
|
||||
// CHECK:STDOUT: %y.addr = alloca ptr, align 8
|
||||
// CHECK:STDOUT: %return.addr = alloca ptr, align 8
|
||||
// CHECK:STDOUT: %agg.tmp = alloca %struct.A.4, align 4
|
||||
// CHECK:STDOUT: %agg.tmp1 = alloca %struct.A.4, align 4
|
||||
// CHECK:STDOUT: %agg.tmp = alloca %struct.OrderedA, align 4
|
||||
// CHECK:STDOUT: %agg.tmp1 = alloca %struct.OrderedA, align 4
|
||||
// CHECK:STDOUT: store ptr %x, ptr %x.addr, align 8, !tbaa !21
|
||||
// CHECK:STDOUT: store ptr %y, ptr %y.addr, align 8, !tbaa !21
|
||||
// CHECK:STDOUT: store ptr %return, ptr %return.addr, align 8, !tbaa !24
|
||||
@@ -349,24 +349,24 @@ fn Driver(x: Cpp.A, y: Cpp.A) {
|
||||
// CHECK:STDOUT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 %agg.tmp, ptr align 4 %1, i64 4, i1 false), !tbaa.struct !26
|
||||
// CHECK:STDOUT: %2 = load ptr, ptr %y.addr, align 8, !tbaa !21
|
||||
// CHECK:STDOUT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 %agg.tmp1, ptr align 4 %2, i64 4, i1 false), !tbaa.struct !26
|
||||
// CHECK:STDOUT: %coerce.dive = getelementptr inbounds nuw %struct.A.4, ptr %agg.tmp, i32 0, i32 0
|
||||
// CHECK:STDOUT: %coerce.dive = getelementptr inbounds nuw %struct.OrderedA, ptr %agg.tmp, i32 0, i32 0
|
||||
// CHECK:STDOUT: %3 = load i32, ptr %coerce.dive, align 4
|
||||
// CHECK:STDOUT: %coerce.dive2 = getelementptr inbounds nuw %struct.A.4, ptr %agg.tmp1, i32 0, i32 0
|
||||
// CHECK:STDOUT: %coerce.dive2 = getelementptr inbounds nuw %struct.OrderedA, ptr %agg.tmp1, i32 0, i32 0
|
||||
// CHECK:STDOUT: %4 = load i32, ptr %coerce.dive2, align 4
|
||||
// CHECK:STDOUT: %call = call noundef zeroext i1 @_Zle1AS_(i32 %3, i32 %4)
|
||||
// CHECK:STDOUT: %call = call noundef zeroext i1 @_Zle8OrderedAS_(i32 %3, i32 %4)
|
||||
// CHECK:STDOUT: %storedv = zext i1 %call to i8
|
||||
// CHECK:STDOUT: store i8 %storedv, ptr %0, align 1, !tbaa !28
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: alwaysinline mustprogress uwtable
|
||||
// CHECK:STDOUT: define internal void @_Zgt1AS_.carbon_thunk.__(ptr noundef %x, ptr noundef %y, ptr noundef %return) #1 {
|
||||
// CHECK:STDOUT: define internal void @_Zgt8OrderedAS_.carbon_thunk.__(ptr noundef %x, ptr noundef %y, ptr noundef %return) #1 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %x.addr = alloca ptr, align 8
|
||||
// CHECK:STDOUT: %y.addr = alloca ptr, align 8
|
||||
// CHECK:STDOUT: %return.addr = alloca ptr, align 8
|
||||
// CHECK:STDOUT: %agg.tmp = alloca %struct.A.4, align 4
|
||||
// CHECK:STDOUT: %agg.tmp1 = alloca %struct.A.4, align 4
|
||||
// CHECK:STDOUT: %agg.tmp = alloca %struct.OrderedA, align 4
|
||||
// CHECK:STDOUT: %agg.tmp1 = alloca %struct.OrderedA, align 4
|
||||
// CHECK:STDOUT: store ptr %x, ptr %x.addr, align 8, !tbaa !21
|
||||
// CHECK:STDOUT: store ptr %y, ptr %y.addr, align 8, !tbaa !21
|
||||
// CHECK:STDOUT: store ptr %return, ptr %return.addr, align 8, !tbaa !24
|
||||
@@ -375,24 +375,24 @@ fn Driver(x: Cpp.A, y: Cpp.A) {
|
||||
// CHECK:STDOUT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 %agg.tmp, ptr align 4 %1, i64 4, i1 false), !tbaa.struct !26
|
||||
// CHECK:STDOUT: %2 = load ptr, ptr %y.addr, align 8, !tbaa !21
|
||||
// CHECK:STDOUT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 %agg.tmp1, ptr align 4 %2, i64 4, i1 false), !tbaa.struct !26
|
||||
// CHECK:STDOUT: %coerce.dive = getelementptr inbounds nuw %struct.A.4, ptr %agg.tmp, i32 0, i32 0
|
||||
// CHECK:STDOUT: %coerce.dive = getelementptr inbounds nuw %struct.OrderedA, ptr %agg.tmp, i32 0, i32 0
|
||||
// CHECK:STDOUT: %3 = load i32, ptr %coerce.dive, align 4
|
||||
// CHECK:STDOUT: %coerce.dive2 = getelementptr inbounds nuw %struct.A.4, ptr %agg.tmp1, i32 0, i32 0
|
||||
// CHECK:STDOUT: %coerce.dive2 = getelementptr inbounds nuw %struct.OrderedA, ptr %agg.tmp1, i32 0, i32 0
|
||||
// CHECK:STDOUT: %4 = load i32, ptr %coerce.dive2, align 4
|
||||
// CHECK:STDOUT: %call = call noundef zeroext i1 @_Zgt1AS_(i32 %3, i32 %4)
|
||||
// CHECK:STDOUT: %call = call noundef zeroext i1 @_Zgt8OrderedAS_(i32 %3, i32 %4)
|
||||
// CHECK:STDOUT: %storedv = zext i1 %call to i8
|
||||
// CHECK:STDOUT: store i8 %storedv, ptr %0, align 1, !tbaa !28
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: alwaysinline mustprogress uwtable
|
||||
// CHECK:STDOUT: define internal void @_Zge1AS_.carbon_thunk.__(ptr noundef %x, ptr noundef %y, ptr noundef %return) #1 {
|
||||
// CHECK:STDOUT: define internal void @_Zge8OrderedAS_.carbon_thunk.__(ptr noundef %x, ptr noundef %y, ptr noundef %return) #1 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %x.addr = alloca ptr, align 8
|
||||
// CHECK:STDOUT: %y.addr = alloca ptr, align 8
|
||||
// CHECK:STDOUT: %return.addr = alloca ptr, align 8
|
||||
// CHECK:STDOUT: %agg.tmp = alloca %struct.A.4, align 4
|
||||
// CHECK:STDOUT: %agg.tmp1 = alloca %struct.A.4, align 4
|
||||
// CHECK:STDOUT: %agg.tmp = alloca %struct.OrderedA, align 4
|
||||
// CHECK:STDOUT: %agg.tmp1 = alloca %struct.OrderedA, align 4
|
||||
// CHECK:STDOUT: store ptr %x, ptr %x.addr, align 8, !tbaa !21
|
||||
// CHECK:STDOUT: store ptr %y, ptr %y.addr, align 8, !tbaa !21
|
||||
// CHECK:STDOUT: store ptr %return, ptr %return.addr, align 8, !tbaa !24
|
||||
@@ -401,63 +401,63 @@ fn Driver(x: Cpp.A, y: Cpp.A) {
|
||||
// CHECK:STDOUT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 %agg.tmp, ptr align 4 %1, i64 4, i1 false), !tbaa.struct !26
|
||||
// CHECK:STDOUT: %2 = load ptr, ptr %y.addr, align 8, !tbaa !21
|
||||
// CHECK:STDOUT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 %agg.tmp1, ptr align 4 %2, i64 4, i1 false), !tbaa.struct !26
|
||||
// CHECK:STDOUT: %coerce.dive = getelementptr inbounds nuw %struct.A.4, ptr %agg.tmp, i32 0, i32 0
|
||||
// CHECK:STDOUT: %coerce.dive = getelementptr inbounds nuw %struct.OrderedA, ptr %agg.tmp, i32 0, i32 0
|
||||
// CHECK:STDOUT: %3 = load i32, ptr %coerce.dive, align 4
|
||||
// CHECK:STDOUT: %coerce.dive2 = getelementptr inbounds nuw %struct.A.4, ptr %agg.tmp1, i32 0, i32 0
|
||||
// CHECK:STDOUT: %coerce.dive2 = getelementptr inbounds nuw %struct.OrderedA, ptr %agg.tmp1, i32 0, i32 0
|
||||
// CHECK:STDOUT: %4 = load i32, ptr %coerce.dive2, align 4
|
||||
// CHECK:STDOUT: %call = call noundef zeroext i1 @_Zge1AS_(i32 %3, i32 %4)
|
||||
// CHECK:STDOUT: %call = call noundef zeroext i1 @_Zge8OrderedAS_(i32 %3, i32 %4)
|
||||
// CHECK:STDOUT: %storedv = zext i1 %call to i8
|
||||
// CHECK:STDOUT: store i8 %storedv, ptr %0, align 1, !tbaa !28
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: alwaysinline nounwind
|
||||
// CHECK:STDOUT: define weak_odr i1 @"_CLess:thunk:OrderedWith.92c0df05bd55f97a.Core:Cpp"(ptr %self, ptr %other) #2 !dbg !30 {
|
||||
// CHECK:STDOUT: define weak_odr i1 @"_CLess:thunk:OrderedWith.f150fc1157a5293b.Core:Cpp"(ptr %self, ptr %other) #2 !dbg !30 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %.6.temp = alloca i1, align 1, !dbg !36
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.6.temp), !dbg !36
|
||||
// CHECK:STDOUT: call void @_Zlt1AS_.carbon_thunk.__(ptr %self, ptr %other, ptr %.6.temp), !dbg !36
|
||||
// CHECK:STDOUT: call void @_Zlt8OrderedAS_.carbon_thunk.__(ptr %self, ptr %other, ptr %.6.temp), !dbg !36
|
||||
// CHECK:STDOUT: %0 = load i1, ptr %.6.temp, align 1, !dbg !36
|
||||
// CHECK:STDOUT: ret i1 %0, !dbg !36
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: alwaysinline nounwind
|
||||
// CHECK:STDOUT: define weak_odr i1 @"_CLessOrEquivalent:thunk:OrderedWith.92c0df05bd55f97a.Core:Cpp"(ptr %self, ptr %other) #2 !dbg !37 {
|
||||
// CHECK:STDOUT: define weak_odr i1 @"_CLessOrEquivalent:thunk:OrderedWith.f150fc1157a5293b.Core:Cpp"(ptr %self, ptr %other) #2 !dbg !37 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %.6.temp = alloca i1, align 1, !dbg !41
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.6.temp), !dbg !41
|
||||
// CHECK:STDOUT: call void @_Zle1AS_.carbon_thunk.__(ptr %self, ptr %other, ptr %.6.temp), !dbg !41
|
||||
// CHECK:STDOUT: call void @_Zle8OrderedAS_.carbon_thunk.__(ptr %self, ptr %other, ptr %.6.temp), !dbg !41
|
||||
// CHECK:STDOUT: %0 = load i1, ptr %.6.temp, align 1, !dbg !41
|
||||
// CHECK:STDOUT: ret i1 %0, !dbg !41
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: alwaysinline nounwind
|
||||
// CHECK:STDOUT: define weak_odr i1 @"_CGreater:thunk:OrderedWith.92c0df05bd55f97a.Core:Cpp"(ptr %self, ptr %other) #2 !dbg !42 {
|
||||
// CHECK:STDOUT: define weak_odr i1 @"_CGreater:thunk:OrderedWith.f150fc1157a5293b.Core:Cpp"(ptr %self, ptr %other) #2 !dbg !42 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %.6.temp = alloca i1, align 1, !dbg !46
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.6.temp), !dbg !46
|
||||
// CHECK:STDOUT: call void @_Zgt1AS_.carbon_thunk.__(ptr %self, ptr %other, ptr %.6.temp), !dbg !46
|
||||
// CHECK:STDOUT: call void @_Zgt8OrderedAS_.carbon_thunk.__(ptr %self, ptr %other, ptr %.6.temp), !dbg !46
|
||||
// CHECK:STDOUT: %0 = load i1, ptr %.6.temp, align 1, !dbg !46
|
||||
// CHECK:STDOUT: ret i1 %0, !dbg !46
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: alwaysinline nounwind
|
||||
// CHECK:STDOUT: define weak_odr i1 @"_CGreaterOrEquivalent:thunk:OrderedWith.92c0df05bd55f97a.Core:Cpp"(ptr %self, ptr %other) #2 !dbg !47 {
|
||||
// CHECK:STDOUT: define weak_odr i1 @"_CGreaterOrEquivalent:thunk:OrderedWith.f150fc1157a5293b.Core:Cpp"(ptr %self, ptr %other) #2 !dbg !47 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %.6.temp = alloca i1, align 1, !dbg !51
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.6.temp), !dbg !51
|
||||
// CHECK:STDOUT: call void @_Zge1AS_.carbon_thunk.__(ptr %self, ptr %other, ptr %.6.temp), !dbg !51
|
||||
// CHECK:STDOUT: call void @_Zge8OrderedAS_.carbon_thunk.__(ptr %self, ptr %other, ptr %.6.temp), !dbg !51
|
||||
// CHECK:STDOUT: %0 = load i1, ptr %.6.temp, align 1, !dbg !51
|
||||
// CHECK:STDOUT: ret i1 %0, !dbg !51
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define linkonce_odr void @_CCheckOrderedWith.Main.c49adfa90bd18905(ptr %x, ptr %y) #0 !dbg !52 {
|
||||
// CHECK:STDOUT: define linkonce_odr void @_CCheckOrderedWith.Main.f3d1df67aae0c1db(ptr %x, ptr %y) #0 !dbg !52 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %OrderedWith.WithSelf.Less.call = call i1 @"_CLess:thunk:OrderedWith.92c0df05bd55f97a.Core:Cpp"(ptr %x, ptr %y), !dbg !56
|
||||
// CHECK:STDOUT: %OrderedWith.WithSelf.Greater.call = call i1 @"_CGreater:thunk:OrderedWith.92c0df05bd55f97a.Core:Cpp"(ptr %x, ptr %y), !dbg !57
|
||||
// CHECK:STDOUT: %OrderedWith.WithSelf.LessOrEquivalent.call = call i1 @"_CLessOrEquivalent:thunk:OrderedWith.92c0df05bd55f97a.Core:Cpp"(ptr %x, ptr %y), !dbg !58
|
||||
// CHECK:STDOUT: %OrderedWith.WithSelf.GreaterOrEquivalent.call = call i1 @"_CGreaterOrEquivalent:thunk:OrderedWith.92c0df05bd55f97a.Core:Cpp"(ptr %x, ptr %y), !dbg !59
|
||||
// CHECK:STDOUT: %OrderedWith.WithSelf.Less.call = call i1 @"_CLess:thunk:OrderedWith.f150fc1157a5293b.Core:Cpp"(ptr %x, ptr %y), !dbg !56
|
||||
// CHECK:STDOUT: %OrderedWith.WithSelf.Greater.call = call i1 @"_CGreater:thunk:OrderedWith.f150fc1157a5293b.Core:Cpp"(ptr %x, ptr %y), !dbg !57
|
||||
// CHECK:STDOUT: %OrderedWith.WithSelf.LessOrEquivalent.call = call i1 @"_CLessOrEquivalent:thunk:OrderedWith.f150fc1157a5293b.Core:Cpp"(ptr %x, ptr %y), !dbg !58
|
||||
// CHECK:STDOUT: %OrderedWith.WithSelf.GreaterOrEquivalent.call = call i1 @"_CGreaterOrEquivalent:thunk:OrderedWith.f150fc1157a5293b.Core:Cpp"(ptr %x, ptr %y), !dbg !59
|
||||
// CHECK:STDOUT: ret void, !dbg !60
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
@@ -465,17 +465,17 @@ fn Driver(x: Cpp.A, y: Cpp.A) {
|
||||
// CHECK:STDOUT: declare void @llvm.lifetime.start.p0(ptr captures(none)) #3
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: mustprogress nounwind uwtable
|
||||
// CHECK:STDOUT: define linkonce_odr dso_local noundef zeroext i1 @_Zlt1AS_(i32 %x.coerce, i32 %y.coerce) #4 comdat {
|
||||
// CHECK:STDOUT: define linkonce_odr dso_local noundef zeroext i1 @_Zlt8OrderedAS_(i32 %x.coerce, i32 %y.coerce) #4 comdat {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %x = alloca %struct.A.4, align 4
|
||||
// CHECK:STDOUT: %y = alloca %struct.A.4, align 4
|
||||
// CHECK:STDOUT: %coerce.dive = getelementptr inbounds nuw %struct.A.4, ptr %x, i32 0, i32 0
|
||||
// CHECK:STDOUT: %x = alloca %struct.OrderedA, align 4
|
||||
// CHECK:STDOUT: %y = alloca %struct.OrderedA, align 4
|
||||
// CHECK:STDOUT: %coerce.dive = getelementptr inbounds nuw %struct.OrderedA, ptr %x, i32 0, i32 0
|
||||
// CHECK:STDOUT: store i32 %x.coerce, ptr %coerce.dive, align 4
|
||||
// CHECK:STDOUT: %coerce.dive1 = getelementptr inbounds nuw %struct.A.4, ptr %y, i32 0, i32 0
|
||||
// CHECK:STDOUT: %coerce.dive1 = getelementptr inbounds nuw %struct.OrderedA, ptr %y, i32 0, i32 0
|
||||
// CHECK:STDOUT: store i32 %y.coerce, ptr %coerce.dive1, align 4
|
||||
// CHECK:STDOUT: %value = getelementptr inbounds nuw %struct.A.4, ptr %x, i32 0, i32 0
|
||||
// CHECK:STDOUT: %value = getelementptr inbounds nuw %struct.OrderedA, ptr %x, i32 0, i32 0
|
||||
// CHECK:STDOUT: %0 = load i32, ptr %value, align 4, !tbaa !61
|
||||
// CHECK:STDOUT: %value2 = getelementptr inbounds nuw %struct.A.4, ptr %y, i32 0, i32 0
|
||||
// CHECK:STDOUT: %value2 = getelementptr inbounds nuw %struct.OrderedA, ptr %y, i32 0, i32 0
|
||||
// CHECK:STDOUT: %1 = load i32, ptr %value2, align 4, !tbaa !61
|
||||
// CHECK:STDOUT: %cmp = icmp slt i32 %0, %1
|
||||
// CHECK:STDOUT: ret i1 %cmp
|
||||
@@ -485,66 +485,66 @@ fn Driver(x: Cpp.A, y: Cpp.A) {
|
||||
// CHECK:STDOUT: declare void @llvm.memcpy.p0.p0.i64(ptr noalias writeonly captures(none), ptr noalias readonly captures(none), i64, i1 immarg) #3
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: mustprogress nounwind uwtable
|
||||
// CHECK:STDOUT: define linkonce_odr dso_local noundef zeroext i1 @_Zle1AS_(i32 %x.coerce, i32 %y.coerce) #4 comdat {
|
||||
// CHECK:STDOUT: define linkonce_odr dso_local noundef zeroext i1 @_Zle8OrderedAS_(i32 %x.coerce, i32 %y.coerce) #4 comdat {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %x = alloca %struct.A.4, align 4
|
||||
// CHECK:STDOUT: %y = alloca %struct.A.4, align 4
|
||||
// CHECK:STDOUT: %agg.tmp = alloca %struct.A.4, align 4
|
||||
// CHECK:STDOUT: %agg.tmp2 = alloca %struct.A.4, align 4
|
||||
// CHECK:STDOUT: %coerce.dive = getelementptr inbounds nuw %struct.A.4, ptr %x, i32 0, i32 0
|
||||
// CHECK:STDOUT: %x = alloca %struct.OrderedA, align 4
|
||||
// CHECK:STDOUT: %y = alloca %struct.OrderedA, align 4
|
||||
// CHECK:STDOUT: %agg.tmp = alloca %struct.OrderedA, align 4
|
||||
// CHECK:STDOUT: %agg.tmp2 = alloca %struct.OrderedA, align 4
|
||||
// CHECK:STDOUT: %coerce.dive = getelementptr inbounds nuw %struct.OrderedA, ptr %x, i32 0, i32 0
|
||||
// CHECK:STDOUT: store i32 %x.coerce, ptr %coerce.dive, align 4
|
||||
// CHECK:STDOUT: %coerce.dive1 = getelementptr inbounds nuw %struct.A.4, ptr %y, i32 0, i32 0
|
||||
// CHECK:STDOUT: %coerce.dive1 = getelementptr inbounds nuw %struct.OrderedA, ptr %y, i32 0, i32 0
|
||||
// CHECK:STDOUT: store i32 %y.coerce, ptr %coerce.dive1, align 4
|
||||
// CHECK:STDOUT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 %agg.tmp, ptr align 4 %y, i64 4, i1 false), !tbaa.struct !26
|
||||
// CHECK:STDOUT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 %agg.tmp2, ptr align 4 %x, i64 4, i1 false), !tbaa.struct !26
|
||||
// CHECK:STDOUT: %coerce.dive3 = getelementptr inbounds nuw %struct.A.4, ptr %agg.tmp, i32 0, i32 0
|
||||
// CHECK:STDOUT: %coerce.dive3 = getelementptr inbounds nuw %struct.OrderedA, ptr %agg.tmp, i32 0, i32 0
|
||||
// CHECK:STDOUT: %0 = load i32, ptr %coerce.dive3, align 4
|
||||
// CHECK:STDOUT: %coerce.dive4 = getelementptr inbounds nuw %struct.A.4, ptr %agg.tmp2, i32 0, i32 0
|
||||
// CHECK:STDOUT: %coerce.dive4 = getelementptr inbounds nuw %struct.OrderedA, ptr %agg.tmp2, i32 0, i32 0
|
||||
// CHECK:STDOUT: %1 = load i32, ptr %coerce.dive4, align 4
|
||||
// CHECK:STDOUT: %call = call noundef zeroext i1 @_Zlt1AS_(i32 %0, i32 %1)
|
||||
// CHECK:STDOUT: %call = call noundef zeroext i1 @_Zlt8OrderedAS_(i32 %0, i32 %1)
|
||||
// CHECK:STDOUT: %lnot = xor i1 %call, true
|
||||
// CHECK:STDOUT: ret i1 %lnot
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: mustprogress nounwind uwtable
|
||||
// CHECK:STDOUT: define linkonce_odr dso_local noundef zeroext i1 @_Zgt1AS_(i32 %x.coerce, i32 %y.coerce) #4 comdat {
|
||||
// CHECK:STDOUT: define linkonce_odr dso_local noundef zeroext i1 @_Zgt8OrderedAS_(i32 %x.coerce, i32 %y.coerce) #4 comdat {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %x = alloca %struct.A.4, align 4
|
||||
// CHECK:STDOUT: %y = alloca %struct.A.4, align 4
|
||||
// CHECK:STDOUT: %agg.tmp = alloca %struct.A.4, align 4
|
||||
// CHECK:STDOUT: %agg.tmp2 = alloca %struct.A.4, align 4
|
||||
// CHECK:STDOUT: %coerce.dive = getelementptr inbounds nuw %struct.A.4, ptr %x, i32 0, i32 0
|
||||
// CHECK:STDOUT: %x = alloca %struct.OrderedA, align 4
|
||||
// CHECK:STDOUT: %y = alloca %struct.OrderedA, align 4
|
||||
// CHECK:STDOUT: %agg.tmp = alloca %struct.OrderedA, align 4
|
||||
// CHECK:STDOUT: %agg.tmp2 = alloca %struct.OrderedA, align 4
|
||||
// CHECK:STDOUT: %coerce.dive = getelementptr inbounds nuw %struct.OrderedA, ptr %x, i32 0, i32 0
|
||||
// CHECK:STDOUT: store i32 %x.coerce, ptr %coerce.dive, align 4
|
||||
// CHECK:STDOUT: %coerce.dive1 = getelementptr inbounds nuw %struct.A.4, ptr %y, i32 0, i32 0
|
||||
// CHECK:STDOUT: %coerce.dive1 = getelementptr inbounds nuw %struct.OrderedA, ptr %y, i32 0, i32 0
|
||||
// CHECK:STDOUT: store i32 %y.coerce, ptr %coerce.dive1, align 4
|
||||
// CHECK:STDOUT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 %agg.tmp, ptr align 4 %y, i64 4, i1 false), !tbaa.struct !26
|
||||
// CHECK:STDOUT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 %agg.tmp2, ptr align 4 %x, i64 4, i1 false), !tbaa.struct !26
|
||||
// CHECK:STDOUT: %coerce.dive3 = getelementptr inbounds nuw %struct.A.4, ptr %agg.tmp, i32 0, i32 0
|
||||
// CHECK:STDOUT: %coerce.dive3 = getelementptr inbounds nuw %struct.OrderedA, ptr %agg.tmp, i32 0, i32 0
|
||||
// CHECK:STDOUT: %0 = load i32, ptr %coerce.dive3, align 4
|
||||
// CHECK:STDOUT: %coerce.dive4 = getelementptr inbounds nuw %struct.A.4, ptr %agg.tmp2, i32 0, i32 0
|
||||
// CHECK:STDOUT: %coerce.dive4 = getelementptr inbounds nuw %struct.OrderedA, ptr %agg.tmp2, i32 0, i32 0
|
||||
// CHECK:STDOUT: %1 = load i32, ptr %coerce.dive4, align 4
|
||||
// CHECK:STDOUT: %call = call noundef zeroext i1 @_Zlt1AS_(i32 %0, i32 %1)
|
||||
// CHECK:STDOUT: %call = call noundef zeroext i1 @_Zlt8OrderedAS_(i32 %0, i32 %1)
|
||||
// CHECK:STDOUT: ret i1 %call
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: mustprogress nounwind uwtable
|
||||
// CHECK:STDOUT: define linkonce_odr dso_local noundef zeroext i1 @_Zge1AS_(i32 %x.coerce, i32 %y.coerce) #4 comdat {
|
||||
// CHECK:STDOUT: define linkonce_odr dso_local noundef zeroext i1 @_Zge8OrderedAS_(i32 %x.coerce, i32 %y.coerce) #4 comdat {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %x = alloca %struct.A.4, align 4
|
||||
// CHECK:STDOUT: %y = alloca %struct.A.4, align 4
|
||||
// CHECK:STDOUT: %agg.tmp = alloca %struct.A.4, align 4
|
||||
// CHECK:STDOUT: %agg.tmp2 = alloca %struct.A.4, align 4
|
||||
// CHECK:STDOUT: %coerce.dive = getelementptr inbounds nuw %struct.A.4, ptr %x, i32 0, i32 0
|
||||
// CHECK:STDOUT: %x = alloca %struct.OrderedA, align 4
|
||||
// CHECK:STDOUT: %y = alloca %struct.OrderedA, align 4
|
||||
// CHECK:STDOUT: %agg.tmp = alloca %struct.OrderedA, align 4
|
||||
// CHECK:STDOUT: %agg.tmp2 = alloca %struct.OrderedA, align 4
|
||||
// CHECK:STDOUT: %coerce.dive = getelementptr inbounds nuw %struct.OrderedA, ptr %x, i32 0, i32 0
|
||||
// CHECK:STDOUT: store i32 %x.coerce, ptr %coerce.dive, align 4
|
||||
// CHECK:STDOUT: %coerce.dive1 = getelementptr inbounds nuw %struct.A.4, ptr %y, i32 0, i32 0
|
||||
// CHECK:STDOUT: %coerce.dive1 = getelementptr inbounds nuw %struct.OrderedA, ptr %y, i32 0, i32 0
|
||||
// CHECK:STDOUT: store i32 %y.coerce, ptr %coerce.dive1, align 4
|
||||
// CHECK:STDOUT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 %agg.tmp, ptr align 4 %x, i64 4, i1 false), !tbaa.struct !26
|
||||
// CHECK:STDOUT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 %agg.tmp2, ptr align 4 %y, i64 4, i1 false), !tbaa.struct !26
|
||||
// CHECK:STDOUT: %coerce.dive3 = getelementptr inbounds nuw %struct.A.4, ptr %agg.tmp, i32 0, i32 0
|
||||
// CHECK:STDOUT: %coerce.dive3 = getelementptr inbounds nuw %struct.OrderedA, ptr %agg.tmp, i32 0, i32 0
|
||||
// CHECK:STDOUT: %0 = load i32, ptr %coerce.dive3, align 4
|
||||
// CHECK:STDOUT: %coerce.dive4 = getelementptr inbounds nuw %struct.A.4, ptr %agg.tmp2, i32 0, i32 0
|
||||
// CHECK:STDOUT: %coerce.dive4 = getelementptr inbounds nuw %struct.OrderedA, ptr %agg.tmp2, i32 0, i32 0
|
||||
// CHECK:STDOUT: %1 = load i32, ptr %coerce.dive4, align 4
|
||||
// CHECK:STDOUT: %call = call noundef zeroext i1 @_Zlt1AS_(i32 %0, i32 %1)
|
||||
// CHECK:STDOUT: %call = call noundef zeroext i1 @_Zlt8OrderedAS_(i32 %0, i32 %1)
|
||||
// CHECK:STDOUT: %lnot = xor i1 %call, true
|
||||
// CHECK:STDOUT: ret i1 %lnot
|
||||
// CHECK:STDOUT: }
|
||||
@@ -585,7 +585,7 @@ fn Driver(x: Cpp.A, y: Cpp.A) {
|
||||
// CHECK:STDOUT: !19 = !DILocation(line: 34, column: 3, scope: !12)
|
||||
// CHECK:STDOUT: !20 = !DILocation(line: 33, column: 1, scope: !12)
|
||||
// CHECK:STDOUT: !21 = !{!22, !22, i64 0}
|
||||
// CHECK:STDOUT: !22 = !{!"p1 _ZTS1A", !23, i64 0}
|
||||
// CHECK:STDOUT: !22 = !{!"p1 _ZTS8OrderedA", !23, i64 0}
|
||||
// CHECK:STDOUT: !23 = !{!"any pointer", !10, i64 0}
|
||||
// CHECK:STDOUT: !24 = !{!25, !25, i64 0}
|
||||
// CHECK:STDOUT: !25 = !{!"p1 bool", !23, i64 0}
|
||||
@@ -593,29 +593,29 @@ fn Driver(x: Cpp.A, y: Cpp.A) {
|
||||
// CHECK:STDOUT: !27 = !{!9, !9, i64 0}
|
||||
// CHECK:STDOUT: !28 = !{!29, !29, i64 0}
|
||||
// CHECK:STDOUT: !29 = !{!"bool", !10, i64 0}
|
||||
// CHECK:STDOUT: !30 = distinct !DISubprogram(name: "Less", linkageName: "_CLess:thunk:OrderedWith.92c0df05bd55f97a.Core:Cpp", scope: null, file: !1, line: 8, type: !31, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !33)
|
||||
// CHECK:STDOUT: !30 = distinct !DISubprogram(name: "Less", linkageName: "_CLess:thunk:OrderedWith.f150fc1157a5293b.Core:Cpp", scope: null, file: !1, line: 8, type: !31, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !33)
|
||||
// CHECK:STDOUT: !31 = !DISubroutineType(types: !32)
|
||||
// CHECK:STDOUT: !32 = !{!15, !15, !15}
|
||||
// CHECK:STDOUT: !33 = !{!34, !35}
|
||||
// CHECK:STDOUT: !34 = !DILocalVariable(arg: 1, scope: !30, type: !15)
|
||||
// CHECK:STDOUT: !35 = !DILocalVariable(arg: 2, scope: !30, type: !15)
|
||||
// CHECK:STDOUT: !36 = !DILocation(line: 8, column: 15, scope: !30)
|
||||
// CHECK:STDOUT: !37 = distinct !DISubprogram(name: "LessOrEquivalent", linkageName: "_CLessOrEquivalent:thunk:OrderedWith.92c0df05bd55f97a.Core:Cpp", scope: null, file: !1, line: 16, type: !31, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !38)
|
||||
// CHECK:STDOUT: !37 = distinct !DISubprogram(name: "LessOrEquivalent", linkageName: "_CLessOrEquivalent:thunk:OrderedWith.f150fc1157a5293b.Core:Cpp", scope: null, file: !1, line: 16, type: !31, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !38)
|
||||
// CHECK:STDOUT: !38 = !{!39, !40}
|
||||
// CHECK:STDOUT: !39 = !DILocalVariable(arg: 1, scope: !37, type: !15)
|
||||
// CHECK:STDOUT: !40 = !DILocalVariable(arg: 2, scope: !37, type: !15)
|
||||
// CHECK:STDOUT: !41 = !DILocation(line: 16, column: 15, scope: !37)
|
||||
// CHECK:STDOUT: !42 = distinct !DISubprogram(name: "Greater", linkageName: "_CGreater:thunk:OrderedWith.92c0df05bd55f97a.Core:Cpp", scope: null, file: !1, line: 12, type: !31, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !43)
|
||||
// CHECK:STDOUT: !42 = distinct !DISubprogram(name: "Greater", linkageName: "_CGreater:thunk:OrderedWith.f150fc1157a5293b.Core:Cpp", scope: null, file: !1, line: 12, type: !31, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !43)
|
||||
// CHECK:STDOUT: !43 = !{!44, !45}
|
||||
// CHECK:STDOUT: !44 = !DILocalVariable(arg: 1, scope: !42, type: !15)
|
||||
// CHECK:STDOUT: !45 = !DILocalVariable(arg: 2, scope: !42, type: !15)
|
||||
// CHECK:STDOUT: !46 = !DILocation(line: 12, column: 15, scope: !42)
|
||||
// CHECK:STDOUT: !47 = distinct !DISubprogram(name: "GreaterOrEquivalent", linkageName: "_CGreaterOrEquivalent:thunk:OrderedWith.92c0df05bd55f97a.Core:Cpp", scope: null, file: !1, line: 20, type: !31, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !48)
|
||||
// CHECK:STDOUT: !47 = distinct !DISubprogram(name: "GreaterOrEquivalent", linkageName: "_CGreaterOrEquivalent:thunk:OrderedWith.f150fc1157a5293b.Core:Cpp", scope: null, file: !1, line: 20, type: !31, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !48)
|
||||
// CHECK:STDOUT: !48 = !{!49, !50}
|
||||
// CHECK:STDOUT: !49 = !DILocalVariable(arg: 1, scope: !47, type: !15)
|
||||
// CHECK:STDOUT: !50 = !DILocalVariable(arg: 2, scope: !47, type: !15)
|
||||
// CHECK:STDOUT: !51 = !DILocation(line: 20, column: 15, scope: !47)
|
||||
// CHECK:STDOUT: !52 = distinct !DISubprogram(name: "CheckOrderedWith", linkageName: "_CCheckOrderedWith.Main.c49adfa90bd18905", scope: null, file: !1, line: 26, type: !13, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !53)
|
||||
// CHECK:STDOUT: !52 = distinct !DISubprogram(name: "CheckOrderedWith", linkageName: "_CCheckOrderedWith.Main.f3d1df67aae0c1db", scope: null, file: !1, line: 26, type: !13, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !53)
|
||||
// CHECK:STDOUT: !53 = !{!54, !55}
|
||||
// CHECK:STDOUT: !54 = !DILocalVariable(arg: 1, scope: !52, type: !15)
|
||||
// CHECK:STDOUT: !55 = !DILocalVariable(arg: 2, scope: !52, type: !15)
|
||||
@@ -625,5 +625,5 @@ fn Driver(x: Cpp.A, y: Cpp.A) {
|
||||
// CHECK:STDOUT: !59 = !DILocation(line: 30, column: 3, scope: !52)
|
||||
// CHECK:STDOUT: !60 = !DILocation(line: 26, column: 1, scope: !52)
|
||||
// CHECK:STDOUT: !61 = !{!62, !9, i64 0}
|
||||
// CHECK:STDOUT: !62 = !{!"_ZTS1A", !9, i64 0}
|
||||
// CHECK:STDOUT: !62 = !{!"_ZTS8OrderedA", !9, i64 0}
|
||||
// CHECK:STDOUT:
|
||||
|
||||
+163
-161
@@ -19,29 +19,29 @@
|
||||
library "[[@TEST_NAME]]";
|
||||
|
||||
import Cpp inline '''
|
||||
class C {};
|
||||
class NonnullC {};
|
||||
|
||||
auto TakePtr(C* _Nonnull) -> void;
|
||||
auto ReturnPtr() -> C* _Nonnull;
|
||||
auto TakeNonnullPtr(NonnullC* _Nonnull) -> void;
|
||||
auto ReturnNonnullPtr() -> NonnullC* _Nonnull;
|
||||
|
||||
auto TakePtrWithThunk(C* _Nonnull, int = 0) -> void;
|
||||
auto ReturnPtrWithThunk(int = 0) -> C* _Nonnull;
|
||||
auto TakeNonnullPtrWithThunk(NonnullC* _Nonnull, int = 0) -> void;
|
||||
auto ReturnNonnullPtrWithThunk(int = 0) -> NonnullC* _Nonnull;
|
||||
''';
|
||||
|
||||
fn PassPtr(p: Cpp.C*) {
|
||||
Cpp.TakePtr(p);
|
||||
fn PassPtr(p: Cpp.NonnullC*) {
|
||||
Cpp.TakeNonnullPtr(p);
|
||||
}
|
||||
|
||||
fn ReturnPtr() -> Cpp.C* {
|
||||
return Cpp.ReturnPtr();
|
||||
fn ReturnPtr() -> Cpp.NonnullC* {
|
||||
return Cpp.ReturnNonnullPtr();
|
||||
}
|
||||
|
||||
fn PassPtrWithThunk(p: Cpp.C*) {
|
||||
Cpp.TakePtrWithThunk(p);
|
||||
fn PassPtrWithThunk(p: Cpp.NonnullC*) {
|
||||
Cpp.TakeNonnullPtrWithThunk(p);
|
||||
}
|
||||
|
||||
fn ReturnPtrWithThunk() -> Cpp.C* {
|
||||
return Cpp.ReturnPtrWithThunk();
|
||||
fn ReturnPtrWithThunk() -> Cpp.NonnullC* {
|
||||
return Cpp.ReturnNonnullPtrWithThunk();
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
@@ -53,49 +53,51 @@ fn ReturnPtrWithThunk() -> Cpp.C* {
|
||||
library "[[@TEST_NAME]]";
|
||||
|
||||
import Cpp inline '''
|
||||
class C {};
|
||||
class NullableC {};
|
||||
|
||||
auto TakePtr(C*) -> void;
|
||||
auto ReturnPtr() -> C*;
|
||||
auto TakeNullablePtr(NullableC*) -> void;
|
||||
auto ReturnNullablePtr() -> NullableC*;
|
||||
|
||||
auto TakePtrWithThunk(C*, int = 0) -> void;
|
||||
auto ReturnPtrWithThunk(int = 0) -> C*;
|
||||
auto TakeNullablePtrWithThunk(NullableC*, int = 0) -> void;
|
||||
auto ReturnNullablePtrWithThunk(int = 0) -> NullableC*;
|
||||
''';
|
||||
|
||||
fn PassPtr(_: Core.Optional(Cpp.C*)) {
|
||||
fn PassPtr(_: Core.Optional(Cpp.NullableC*)) {
|
||||
// TODO: Add support for passing an optional here.
|
||||
// Cpp.TakePtr(p);
|
||||
// Cpp.TakeNullablePtr(p);
|
||||
}
|
||||
|
||||
fn PassNonnullPtr(p: Cpp.C*) {
|
||||
fn PassNonnullPtr(p: Cpp.NullableC*) {
|
||||
// TODO: The `value_of_initializer` optimization doesn't get used here, so we
|
||||
// unnecessarily round-trip this value through memory.
|
||||
Cpp.TakePtr(p);
|
||||
Cpp.TakeNullablePtr(p);
|
||||
}
|
||||
|
||||
fn ReturnPtr() -> Core.Optional(Cpp.C*) {
|
||||
return Cpp.ReturnPtr();
|
||||
fn ReturnPtr() -> Core.Optional(Cpp.NullableC*) {
|
||||
return Cpp.ReturnNullablePtr();
|
||||
}
|
||||
|
||||
fn PassPtrWithThunk(_: Core.Optional(Cpp.C*)) {
|
||||
fn PassPtrWithThunk(_: Core.Optional(Cpp.NullableC*)) {
|
||||
// TODO: Add support for passing an optional here.
|
||||
// Cpp.TakePtrWithThunk(p);
|
||||
// Cpp.TakeNullablePtrWithThunk(p);
|
||||
}
|
||||
|
||||
fn PassNonnullPtrWithThunk(p: Cpp.C*) {
|
||||
Cpp.TakePtrWithThunk(p);
|
||||
fn PassNonnullPtrWithThunk(p: Cpp.NullableC*) {
|
||||
Cpp.TakeNullablePtrWithThunk(p);
|
||||
}
|
||||
|
||||
fn ReturnPtrWithThunk() -> Core.Optional(Cpp.C*) {
|
||||
return Cpp.ReturnPtrWithThunk();
|
||||
fn ReturnPtrWithThunk() -> Core.Optional(Cpp.NullableC*) {
|
||||
return Cpp.ReturnNullablePtrWithThunk();
|
||||
}
|
||||
|
||||
// --- add_const.carbon
|
||||
|
||||
library "[[@TEST_NAME]]";
|
||||
|
||||
import Cpp inline '''
|
||||
class C {};
|
||||
C *make();
|
||||
void take(const C*);
|
||||
class ConstC {};
|
||||
ConstC *make();
|
||||
void take(const ConstC*);
|
||||
''';
|
||||
|
||||
fn Convert() {
|
||||
@@ -111,55 +113,55 @@ fn Convert() {
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define void @_CPassPtr.Main(ptr %p) #0 !dbg !12 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: call void @_Z7TakePtrP1C(ptr %p), !dbg !18
|
||||
// CHECK:STDOUT: call void @_Z14TakeNonnullPtrP8NonnullC(ptr %p), !dbg !18
|
||||
// CHECK:STDOUT: ret void, !dbg !19
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: declare void @_Z7TakePtrP1C(ptr noundef) #1
|
||||
// CHECK:STDOUT: declare void @_Z14TakeNonnullPtrP8NonnullC(ptr noundef) #1
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define ptr @_CReturnPtr.Main() #0 !dbg !20 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %ReturnPtr.call = call ptr @_Z9ReturnPtrv(), !dbg !23
|
||||
// CHECK:STDOUT: ret ptr %ReturnPtr.call, !dbg !24
|
||||
// CHECK:STDOUT: %ReturnNonnullPtr.call = call ptr @_Z16ReturnNonnullPtrv(), !dbg !23
|
||||
// CHECK:STDOUT: ret ptr %ReturnNonnullPtr.call, !dbg !24
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: declare noundef ptr @_Z9ReturnPtrv() #1
|
||||
// CHECK:STDOUT: declare noundef ptr @_Z16ReturnNonnullPtrv() #1
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define void @_CPassPtrWithThunk.Main(ptr %p) #0 !dbg !25 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: call void @_Z16TakePtrWithThunkP1Ci.carbon_thunk._(ptr %p), !dbg !28
|
||||
// CHECK:STDOUT: call void @_Z23TakeNonnullPtrWithThunkP8NonnullCi.carbon_thunk._(ptr %p), !dbg !28
|
||||
// CHECK:STDOUT: ret void, !dbg !29
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: alwaysinline mustprogress uwtable
|
||||
// CHECK:STDOUT: define internal void @_Z16TakePtrWithThunkP1Ci.carbon_thunk._(ptr noundef %0) #2 {
|
||||
// CHECK:STDOUT: define internal void @_Z23TakeNonnullPtrWithThunkP8NonnullCi.carbon_thunk._(ptr noundef %0) #2 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %.addr = alloca ptr, align 8
|
||||
// CHECK:STDOUT: store ptr %0, ptr %.addr, align 8, !tbaa !30
|
||||
// CHECK:STDOUT: %1 = load ptr, ptr %.addr, align 8, !tbaa !30
|
||||
// CHECK:STDOUT: call void @_Z16TakePtrWithThunkP1Ci(ptr noundef %1, i32 noundef 0)
|
||||
// CHECK:STDOUT: call void @_Z23TakeNonnullPtrWithThunkP8NonnullCi(ptr noundef %1, i32 noundef 0)
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define ptr @_CReturnPtrWithThunk.Main() #0 !dbg !33 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %ReturnPtrWithThunk__carbon_thunk.call = call ptr @_Z18ReturnPtrWithThunki.carbon_thunk.(), !dbg !34
|
||||
// CHECK:STDOUT: ret ptr %ReturnPtrWithThunk__carbon_thunk.call, !dbg !35
|
||||
// CHECK:STDOUT: %ReturnNonnullPtrWithThunk__carbon_thunk.call = call ptr @_Z25ReturnNonnullPtrWithThunki.carbon_thunk.(), !dbg !34
|
||||
// CHECK:STDOUT: ret ptr %ReturnNonnullPtrWithThunk__carbon_thunk.call, !dbg !35
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: alwaysinline mustprogress uwtable
|
||||
// CHECK:STDOUT: define internal noundef ptr @_Z18ReturnPtrWithThunki.carbon_thunk.() #2 {
|
||||
// CHECK:STDOUT: define internal noundef ptr @_Z25ReturnNonnullPtrWithThunki.carbon_thunk.() #2 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %call = call noundef ptr @_Z18ReturnPtrWithThunki(i32 noundef 0)
|
||||
// CHECK:STDOUT: %call = call noundef ptr @_Z25ReturnNonnullPtrWithThunki(i32 noundef 0)
|
||||
// CHECK:STDOUT: ret ptr %call
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: declare void @_Z16TakePtrWithThunkP1Ci(ptr noundef, i32 noundef) #1
|
||||
// CHECK:STDOUT: declare void @_Z23TakeNonnullPtrWithThunkP8NonnullCi(ptr noundef, i32 noundef) #1
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: declare noundef ptr @_Z18ReturnPtrWithThunki(i32 noundef) #1
|
||||
// CHECK:STDOUT: declare noundef ptr @_Z25ReturnNonnullPtrWithThunki(i32 noundef) #1
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: attributes #0 = { nounwind }
|
||||
// CHECK:STDOUT: attributes #1 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
|
||||
@@ -200,7 +202,7 @@ fn Convert() {
|
||||
// CHECK:STDOUT: !28 = !DILocation(line: 23, column: 3, scope: !25)
|
||||
// CHECK:STDOUT: !29 = !DILocation(line: 22, column: 1, scope: !25)
|
||||
// CHECK:STDOUT: !30 = !{!31, !31, i64 0}
|
||||
// CHECK:STDOUT: !31 = !{!"p1 _ZTS1C", !32, i64 0}
|
||||
// CHECK:STDOUT: !31 = !{!"p1 _ZTS8NonnullC", !32, i64 0}
|
||||
// CHECK:STDOUT: !32 = !{!"any pointer", !10, i64 0}
|
||||
// CHECK:STDOUT: !33 = distinct !DISubprogram(name: "ReturnPtrWithThunk", linkageName: "_CReturnPtrWithThunk.Main", scope: null, file: !1, line: 26, type: !21, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !34 = !DILocation(line: 27, column: 10, scope: !33)
|
||||
@@ -221,32 +223,32 @@ fn Convert() {
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define void @_CPassNonnullPtr.Main(ptr %p) #0 !dbg !19 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %.loc22_15.2.temp = alloca ptr, align 8, !dbg !22
|
||||
// CHECK:STDOUT: %U.as_type.as.ImplicitAs.impl.Convert.call = call ptr @"_CConvert.538322f9fda4254f:ImplicitAs.a276ba298c70ba87.Core.331b8c91728880af"(ptr %p), !dbg !22
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc22_15.2.temp), !dbg !22
|
||||
// CHECK:STDOUT: store ptr %U.as_type.as.ImplicitAs.impl.Convert.call, ptr %.loc22_15.2.temp, align 8, !dbg !22
|
||||
// CHECK:STDOUT: %.loc22_15.4 = load ptr, ptr %.loc22_15.2.temp, align 8, !dbg !22
|
||||
// CHECK:STDOUT: call void @_Z7TakePtrP1C(ptr %.loc22_15.4), !dbg !23
|
||||
// CHECK:STDOUT: call void @"_COp.16b2729c97ad4472:core.Destroy.Core"(ptr %.loc22_15.2.temp), !dbg !22
|
||||
// CHECK:STDOUT: %.loc22_23.2.temp = alloca ptr, align 8, !dbg !22
|
||||
// CHECK:STDOUT: %U.as_type.as.ImplicitAs.impl.Convert.call = call ptr @"_CConvert.538322f9fda4254f:ImplicitAs.a276ba298c70ba87.Core.75a9143bcbb84fa5"(ptr %p), !dbg !22
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc22_23.2.temp), !dbg !22
|
||||
// CHECK:STDOUT: store ptr %U.as_type.as.ImplicitAs.impl.Convert.call, ptr %.loc22_23.2.temp, align 8, !dbg !22
|
||||
// CHECK:STDOUT: %.loc22_23.4 = load ptr, ptr %.loc22_23.2.temp, align 8, !dbg !22
|
||||
// CHECK:STDOUT: call void @_Z15TakeNullablePtrP9NullableC(ptr %.loc22_23.4), !dbg !23
|
||||
// CHECK:STDOUT: call void @"_COp.af4d0379a4c35228:core.Destroy.Core"(ptr %.loc22_23.2.temp), !dbg !22
|
||||
// CHECK:STDOUT: ret void, !dbg !24
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: declare void @_Z7TakePtrP1C(ptr noundef) #1
|
||||
// CHECK:STDOUT: declare void @_Z15TakeNullablePtrP9NullableC(ptr noundef) #1
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define weak_odr void @"_COp.930f6ffe20ad4a64:core.Destroy.Core"(ptr %self) #0 !dbg !25 {
|
||||
// CHECK:STDOUT: define weak_odr void @"_COp.c4feefb53715d971:core.Destroy.Core"(ptr %self) #0 !dbg !25 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: ret void, !dbg !28
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define weak_odr void @"_COp.52f3be89096e2220:core.Destroy.Core"(ptr %self) #0 !dbg !29 {
|
||||
// CHECK:STDOUT: define weak_odr void @"_COp.1a4db661cca0482a:core.Destroy.Core"(ptr %self) #0 !dbg !29 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: ret void, !dbg !32
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define weak_odr void @"_COp.16b2729c97ad4472:core.Destroy.Core"(ptr %self) #0 !dbg !33 {
|
||||
// CHECK:STDOUT: define weak_odr void @"_COp.af4d0379a4c35228:core.Destroy.Core"(ptr %self) #0 !dbg !33 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: ret void, !dbg !36
|
||||
// CHECK:STDOUT: }
|
||||
@@ -254,11 +256,11 @@ fn Convert() {
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define ptr @_CReturnPtr.Main() #0 !dbg !37 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %ReturnPtr.call = call ptr @_Z9ReturnPtrv(), !dbg !40
|
||||
// CHECK:STDOUT: ret ptr %ReturnPtr.call, !dbg !41
|
||||
// CHECK:STDOUT: %ReturnNullablePtr.call = call ptr @_Z17ReturnNullablePtrv(), !dbg !40
|
||||
// CHECK:STDOUT: ret ptr %ReturnNullablePtr.call, !dbg !41
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: declare noundef ptr @_Z9ReturnPtrv() #1
|
||||
// CHECK:STDOUT: declare noundef ptr @_Z17ReturnNullablePtrv() #1
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define void @_CPassPtrWithThunk.Main(ptr %_) #0 !dbg !42 {
|
||||
@@ -269,43 +271,43 @@ fn Convert() {
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define void @_CPassNonnullPtrWithThunk.Main(ptr %p) #0 !dbg !46 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %.loc35_24.2.temp = alloca ptr, align 8, !dbg !49
|
||||
// CHECK:STDOUT: %U.as_type.as.ImplicitAs.impl.Convert.call = call ptr @"_CConvert.538322f9fda4254f:ImplicitAs.a276ba298c70ba87.Core.331b8c91728880af"(ptr %p), !dbg !49
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc35_24.2.temp), !dbg !49
|
||||
// CHECK:STDOUT: store ptr %U.as_type.as.ImplicitAs.impl.Convert.call, ptr %.loc35_24.2.temp, align 8, !dbg !49
|
||||
// CHECK:STDOUT: %.loc35_24.4 = load ptr, ptr %.loc35_24.2.temp, align 8, !dbg !49
|
||||
// CHECK:STDOUT: call void @_Z16TakePtrWithThunkP1Ci.carbon_thunk._(ptr %.loc35_24.4), !dbg !50
|
||||
// CHECK:STDOUT: call void @"_COp.16b2729c97ad4472:core.Destroy.Core"(ptr %.loc35_24.2.temp), !dbg !49
|
||||
// CHECK:STDOUT: %.loc35_32.2.temp = alloca ptr, align 8, !dbg !49
|
||||
// CHECK:STDOUT: %U.as_type.as.ImplicitAs.impl.Convert.call = call ptr @"_CConvert.538322f9fda4254f:ImplicitAs.a276ba298c70ba87.Core.75a9143bcbb84fa5"(ptr %p), !dbg !49
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc35_32.2.temp), !dbg !49
|
||||
// CHECK:STDOUT: store ptr %U.as_type.as.ImplicitAs.impl.Convert.call, ptr %.loc35_32.2.temp, align 8, !dbg !49
|
||||
// CHECK:STDOUT: %.loc35_32.4 = load ptr, ptr %.loc35_32.2.temp, align 8, !dbg !49
|
||||
// CHECK:STDOUT: call void @_Z24TakeNullablePtrWithThunkP9NullableCi.carbon_thunk._(ptr %.loc35_32.4), !dbg !50
|
||||
// CHECK:STDOUT: call void @"_COp.af4d0379a4c35228:core.Destroy.Core"(ptr %.loc35_32.2.temp), !dbg !49
|
||||
// CHECK:STDOUT: ret void, !dbg !51
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: alwaysinline mustprogress uwtable
|
||||
// CHECK:STDOUT: define internal void @_Z16TakePtrWithThunkP1Ci.carbon_thunk._(ptr noundef %0) #2 {
|
||||
// CHECK:STDOUT: define internal void @_Z24TakeNullablePtrWithThunkP9NullableCi.carbon_thunk._(ptr noundef %0) #2 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %.addr = alloca ptr, align 8
|
||||
// CHECK:STDOUT: store ptr %0, ptr %.addr, align 8, !tbaa !52
|
||||
// CHECK:STDOUT: %1 = load ptr, ptr %.addr, align 8, !tbaa !52
|
||||
// CHECK:STDOUT: call void @_Z16TakePtrWithThunkP1Ci(ptr noundef %1, i32 noundef 0)
|
||||
// CHECK:STDOUT: call void @_Z24TakeNullablePtrWithThunkP9NullableCi(ptr noundef %1, i32 noundef 0)
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define ptr @_CReturnPtrWithThunk.Main() #0 !dbg !55 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %ReturnPtrWithThunk__carbon_thunk.call = call ptr @_Z18ReturnPtrWithThunki.carbon_thunk.(), !dbg !56
|
||||
// CHECK:STDOUT: ret ptr %ReturnPtrWithThunk__carbon_thunk.call, !dbg !57
|
||||
// CHECK:STDOUT: %ReturnNullablePtrWithThunk__carbon_thunk.call = call ptr @_Z26ReturnNullablePtrWithThunki.carbon_thunk.(), !dbg !56
|
||||
// CHECK:STDOUT: ret ptr %ReturnNullablePtrWithThunk__carbon_thunk.call, !dbg !57
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: alwaysinline mustprogress uwtable
|
||||
// CHECK:STDOUT: define internal noundef ptr @_Z18ReturnPtrWithThunki.carbon_thunk.() #2 {
|
||||
// CHECK:STDOUT: define internal noundef ptr @_Z26ReturnNullablePtrWithThunki.carbon_thunk.() #2 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %call = call noundef ptr @_Z18ReturnPtrWithThunki(i32 noundef 0)
|
||||
// CHECK:STDOUT: %call = call noundef ptr @_Z26ReturnNullablePtrWithThunki(i32 noundef 0)
|
||||
// CHECK:STDOUT: ret ptr %call
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define linkonce_odr ptr @"_CConvert.538322f9fda4254f:ImplicitAs.a276ba298c70ba87.Core.331b8c91728880af"(ptr %self) #0 !dbg !58 {
|
||||
// CHECK:STDOUT: %1 = call ptr @"_CConvert.9fdaf39d07a1dc4e:OptionalAs.24b7347a93330e68.Core.f65d494664285214"(ptr %self), !dbg !64
|
||||
// CHECK:STDOUT: define linkonce_odr ptr @"_CConvert.538322f9fda4254f:ImplicitAs.a276ba298c70ba87.Core.75a9143bcbb84fa5"(ptr %self) #0 !dbg !58 {
|
||||
// CHECK:STDOUT: %1 = call ptr @"_CConvert.9fdaf39d07a1dc4e:OptionalAs.24b7347a93330e68.Core.e83c25d1d2fd22c2"(ptr %self), !dbg !64
|
||||
// CHECK:STDOUT: ret ptr %1, !dbg !65
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
@@ -313,34 +315,34 @@ fn Convert() {
|
||||
// CHECK:STDOUT: declare void @llvm.lifetime.start.p0(ptr captures(none)) #3
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define linkonce_odr ptr @"_CConvert.9fdaf39d07a1dc4e:OptionalAs.24b7347a93330e68.Core.f65d494664285214"(ptr %self) #0 !dbg !66 {
|
||||
// CHECK:STDOUT: %1 = call ptr @_CSome.Optional.Core.f65d494664285214(ptr %self), !dbg !69
|
||||
// CHECK:STDOUT: define linkonce_odr ptr @"_CConvert.9fdaf39d07a1dc4e:OptionalAs.24b7347a93330e68.Core.e83c25d1d2fd22c2"(ptr %self) #0 !dbg !66 {
|
||||
// CHECK:STDOUT: %1 = call ptr @_CSome.Optional.Core.e83c25d1d2fd22c2(ptr %self), !dbg !69
|
||||
// CHECK:STDOUT: ret ptr %1, !dbg !70
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define linkonce_odr ptr @_CSome.Optional.Core.f65d494664285214(ptr %value) #0 !dbg !71 {
|
||||
// CHECK:STDOUT: %1 = call ptr @"_CSome.e8f8f92d3d08d149:OptionalStorage.Core.fc8b3e0dc71c345e"(ptr %value), !dbg !74
|
||||
// CHECK:STDOUT: define linkonce_odr ptr @_CSome.Optional.Core.e83c25d1d2fd22c2(ptr %value) #0 !dbg !71 {
|
||||
// CHECK:STDOUT: %1 = call ptr @"_CSome.e8f8f92d3d08d149:OptionalStorage.Core.77dd513e5db6ef8d"(ptr %value), !dbg !74
|
||||
// CHECK:STDOUT: ret ptr %1, !dbg !75
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define linkonce_odr ptr @"_CSome.e8f8f92d3d08d149:OptionalStorage.Core.fc8b3e0dc71c345e"(ptr %self) #0 !dbg !76 {
|
||||
// CHECK:STDOUT: define linkonce_odr ptr @"_CSome.e8f8f92d3d08d149:OptionalStorage.Core.77dd513e5db6ef8d"(ptr %self) #0 !dbg !76 {
|
||||
// CHECK:STDOUT: %1 = alloca ptr, align 8, !dbg !79
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %1), !dbg !79
|
||||
// CHECK:STDOUT: store ptr poison, ptr %1, align 8, !dbg !79
|
||||
// CHECK:STDOUT: store ptr %self, ptr %1, align 8, !dbg !80
|
||||
// CHECK:STDOUT: %2 = load ptr, ptr %1, align 8, !dbg !81
|
||||
// CHECK:STDOUT: call void @"_COp.52f3be89096e2220:core.Destroy.Core"(ptr %1), !dbg !79
|
||||
// CHECK:STDOUT: call void @"_COp.1a4db661cca0482a:core.Destroy.Core"(ptr %1), !dbg !79
|
||||
// CHECK:STDOUT: ret ptr %2, !dbg !82
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: declare void @_Z16TakePtrWithThunkP1Ci(ptr noundef, i32 noundef) #1
|
||||
// CHECK:STDOUT: declare void @_Z24TakeNullablePtrWithThunkP9NullableCi(ptr noundef, i32 noundef) #1
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: declare noundef ptr @_Z18ReturnPtrWithThunki(i32 noundef) #1
|
||||
// CHECK:STDOUT: declare noundef ptr @_Z26ReturnNullablePtrWithThunki(i32 noundef) #1
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; uselistorder directives
|
||||
// CHECK:STDOUT: uselistorder ptr @"_CConvert.538322f9fda4254f:ImplicitAs.a276ba298c70ba87.Core.331b8c91728880af", { 1, 0 }
|
||||
// CHECK:STDOUT: uselistorder ptr @"_CConvert.538322f9fda4254f:ImplicitAs.a276ba298c70ba87.Core.75a9143bcbb84fa5", { 1, 0 }
|
||||
// CHECK:STDOUT: uselistorder ptr @llvm.lifetime.start.p0, { 0, 2, 1 }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: attributes #0 = { nounwind }
|
||||
@@ -374,21 +376,21 @@ fn Convert() {
|
||||
// CHECK:STDOUT: !19 = distinct !DISubprogram(name: "PassNonnullPtr", linkageName: "_CPassNonnullPtr.Main", scope: null, file: !1, line: 19, type: !13, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !20)
|
||||
// CHECK:STDOUT: !20 = !{!21}
|
||||
// CHECK:STDOUT: !21 = !DILocalVariable(arg: 1, scope: !19, type: !15)
|
||||
// CHECK:STDOUT: !22 = !DILocation(line: 22, column: 15, scope: !19)
|
||||
// CHECK:STDOUT: !22 = !DILocation(line: 22, column: 23, scope: !19)
|
||||
// CHECK:STDOUT: !23 = !DILocation(line: 22, column: 3, scope: !19)
|
||||
// CHECK:STDOUT: !24 = !DILocation(line: 19, column: 1, scope: !19)
|
||||
// CHECK:STDOUT: !25 = distinct !DISubprogram(name: "Op", linkageName: "_COp.930f6ffe20ad4a64:core.Destroy.Core", scope: null, file: !1, line: 22, type: !13, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !26)
|
||||
// CHECK:STDOUT: !25 = distinct !DISubprogram(name: "Op", linkageName: "_COp.c4feefb53715d971:core.Destroy.Core", scope: null, file: !1, line: 22, type: !13, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !26)
|
||||
// CHECK:STDOUT: !26 = !{!27}
|
||||
// CHECK:STDOUT: !27 = !DILocalVariable(arg: 1, scope: !25, type: !15)
|
||||
// CHECK:STDOUT: !28 = !DILocation(line: 22, column: 15, scope: !25)
|
||||
// CHECK:STDOUT: !29 = distinct !DISubprogram(name: "Op", linkageName: "_COp.52f3be89096e2220:core.Destroy.Core", scope: null, file: !1, line: 22, type: !13, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !30)
|
||||
// CHECK:STDOUT: !28 = !DILocation(line: 22, column: 23, scope: !25)
|
||||
// CHECK:STDOUT: !29 = distinct !DISubprogram(name: "Op", linkageName: "_COp.1a4db661cca0482a:core.Destroy.Core", scope: null, file: !1, line: 22, type: !13, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !30)
|
||||
// CHECK:STDOUT: !30 = !{!31}
|
||||
// CHECK:STDOUT: !31 = !DILocalVariable(arg: 1, scope: !29, type: !15)
|
||||
// CHECK:STDOUT: !32 = !DILocation(line: 22, column: 15, scope: !29)
|
||||
// CHECK:STDOUT: !33 = distinct !DISubprogram(name: "Op", linkageName: "_COp.16b2729c97ad4472:core.Destroy.Core", scope: null, file: !1, line: 22, type: !13, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !34)
|
||||
// CHECK:STDOUT: !32 = !DILocation(line: 22, column: 23, scope: !29)
|
||||
// CHECK:STDOUT: !33 = distinct !DISubprogram(name: "Op", linkageName: "_COp.af4d0379a4c35228:core.Destroy.Core", scope: null, file: !1, line: 22, type: !13, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !34)
|
||||
// CHECK:STDOUT: !34 = !{!35}
|
||||
// CHECK:STDOUT: !35 = !DILocalVariable(arg: 1, scope: !33, type: !15)
|
||||
// CHECK:STDOUT: !36 = !DILocation(line: 22, column: 15, scope: !33)
|
||||
// CHECK:STDOUT: !36 = !DILocation(line: 22, column: 23, scope: !33)
|
||||
// CHECK:STDOUT: !37 = distinct !DISubprogram(name: "ReturnPtr", linkageName: "_CReturnPtr.Main", scope: null, file: !1, line: 25, type: !38, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !38 = !DISubroutineType(types: !39)
|
||||
// CHECK:STDOUT: !39 = !{!15}
|
||||
@@ -401,16 +403,16 @@ fn Convert() {
|
||||
// CHECK:STDOUT: !46 = distinct !DISubprogram(name: "PassNonnullPtrWithThunk", linkageName: "_CPassNonnullPtrWithThunk.Main", scope: null, file: !1, line: 34, type: !13, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !47)
|
||||
// CHECK:STDOUT: !47 = !{!48}
|
||||
// CHECK:STDOUT: !48 = !DILocalVariable(arg: 1, scope: !46, type: !15)
|
||||
// CHECK:STDOUT: !49 = !DILocation(line: 35, column: 24, scope: !46)
|
||||
// CHECK:STDOUT: !49 = !DILocation(line: 35, column: 32, scope: !46)
|
||||
// CHECK:STDOUT: !50 = !DILocation(line: 35, column: 3, scope: !46)
|
||||
// CHECK:STDOUT: !51 = !DILocation(line: 34, column: 1, scope: !46)
|
||||
// CHECK:STDOUT: !52 = !{!53, !53, i64 0}
|
||||
// CHECK:STDOUT: !53 = !{!"p1 _ZTS1C", !54, i64 0}
|
||||
// CHECK:STDOUT: !53 = !{!"p1 _ZTS9NullableC", !54, i64 0}
|
||||
// CHECK:STDOUT: !54 = !{!"any pointer", !10, i64 0}
|
||||
// CHECK:STDOUT: !55 = distinct !DISubprogram(name: "ReturnPtrWithThunk", linkageName: "_CReturnPtrWithThunk.Main", scope: null, file: !1, line: 38, type: !38, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !56 = !DILocation(line: 39, column: 10, scope: !55)
|
||||
// CHECK:STDOUT: !57 = !DILocation(line: 39, column: 3, scope: !55)
|
||||
// CHECK:STDOUT: !58 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.538322f9fda4254f:ImplicitAs.a276ba298c70ba87.Core.331b8c91728880af", scope: null, file: !59, line: 105, type: !60, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !62)
|
||||
// CHECK:STDOUT: !58 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.538322f9fda4254f:ImplicitAs.a276ba298c70ba87.Core.75a9143bcbb84fa5", scope: null, file: !59, line: 105, type: !60, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !62)
|
||||
// CHECK:STDOUT: !59 = !DIFile(filename: "{{.*}}/prelude/types/optional.carbon", directory: "")
|
||||
// CHECK:STDOUT: !60 = !DISubroutineType(types: !61)
|
||||
// CHECK:STDOUT: !61 = !{!15, !15}
|
||||
@@ -418,17 +420,17 @@ fn Convert() {
|
||||
// CHECK:STDOUT: !63 = !DILocalVariable(arg: 1, scope: !58, type: !15)
|
||||
// CHECK:STDOUT: !64 = !DILocation(line: 106, column: 12, scope: !58)
|
||||
// CHECK:STDOUT: !65 = !DILocation(line: 106, column: 5, scope: !58)
|
||||
// CHECK:STDOUT: !66 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.9fdaf39d07a1dc4e:OptionalAs.24b7347a93330e68.Core.f65d494664285214", scope: null, file: !59, line: 80, type: !60, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !67)
|
||||
// CHECK:STDOUT: !66 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.9fdaf39d07a1dc4e:OptionalAs.24b7347a93330e68.Core.e83c25d1d2fd22c2", scope: null, file: !59, line: 80, type: !60, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !67)
|
||||
// CHECK:STDOUT: !67 = !{!68}
|
||||
// CHECK:STDOUT: !68 = !DILocalVariable(arg: 1, scope: !66, type: !15)
|
||||
// CHECK:STDOUT: !69 = !DILocation(line: 81, column: 12, scope: !66)
|
||||
// CHECK:STDOUT: !70 = !DILocation(line: 81, column: 5, scope: !66)
|
||||
// CHECK:STDOUT: !71 = distinct !DISubprogram(name: "Some", linkageName: "_CSome.Optional.Core.f65d494664285214", scope: null, file: !59, line: 33, type: !60, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !72)
|
||||
// CHECK:STDOUT: !71 = distinct !DISubprogram(name: "Some", linkageName: "_CSome.Optional.Core.e83c25d1d2fd22c2", scope: null, file: !59, line: 33, type: !60, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !72)
|
||||
// CHECK:STDOUT: !72 = !{!73}
|
||||
// CHECK:STDOUT: !73 = !DILocalVariable(arg: 1, scope: !71, type: !15)
|
||||
// CHECK:STDOUT: !74 = !DILocation(line: 34, column: 12, scope: !71)
|
||||
// CHECK:STDOUT: !75 = !DILocation(line: 34, column: 5, scope: !71)
|
||||
// CHECK:STDOUT: !76 = distinct !DISubprogram(name: "Some", linkageName: "_CSome.e8f8f92d3d08d149:OptionalStorage.Core.fc8b3e0dc71c345e", scope: null, file: !59, line: 166, type: !60, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !77)
|
||||
// CHECK:STDOUT: !76 = distinct !DISubprogram(name: "Some", linkageName: "_CSome.e8f8f92d3d08d149:OptionalStorage.Core.77dd513e5db6ef8d", scope: null, file: !59, line: 166, type: !60, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !77)
|
||||
// CHECK:STDOUT: !77 = !{!78}
|
||||
// CHECK:STDOUT: !78 = !DILocalVariable(arg: 1, scope: !76, type: !15)
|
||||
// CHECK:STDOUT: !79 = !DILocation(line: 167, column: 14, scope: !76)
|
||||
@@ -445,58 +447,58 @@ fn Convert() {
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define void @_CConvert.Main() #0 !dbg !12 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %.loc9_21.1.temp = alloca ptr, align 8, !dbg !15
|
||||
// CHECK:STDOUT: %.loc9_21.5.temp = alloca ptr, align 8, !dbg !15
|
||||
// CHECK:STDOUT: %.loc11_21.1.temp = alloca ptr, align 8, !dbg !15
|
||||
// CHECK:STDOUT: %.loc11_21.5.temp = alloca ptr, align 8, !dbg !15
|
||||
// CHECK:STDOUT: %make.call = call ptr @_Z4makev(), !dbg !15
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc9_21.1.temp), !dbg !15
|
||||
// CHECK:STDOUT: store ptr %make.call, ptr %.loc9_21.1.temp, align 8, !dbg !15
|
||||
// CHECK:STDOUT: %.loc9_21.3 = load ptr, ptr %.loc9_21.1.temp, align 8, !dbg !15
|
||||
// CHECK:STDOUT: %U.as_type.as.ImplicitAs.impl.Convert.call = call ptr @"_CConvert.538322f9fda4254f:ImplicitAs.a276ba298c70ba87.Core.7a59268f02b553a8"(ptr %.loc9_21.3), !dbg !15
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc9_21.5.temp), !dbg !15
|
||||
// CHECK:STDOUT: store ptr %U.as_type.as.ImplicitAs.impl.Convert.call, ptr %.loc9_21.5.temp, align 8, !dbg !15
|
||||
// CHECK:STDOUT: %.loc9_21.7 = load ptr, ptr %.loc9_21.5.temp, align 8, !dbg !15
|
||||
// CHECK:STDOUT: call void @_Z4takePK1C(ptr %.loc9_21.7), !dbg !16
|
||||
// CHECK:STDOUT: call void @"_COp.d67a36d0f9ac97ca:core.Destroy.Core"(ptr %.loc9_21.5.temp), !dbg !15
|
||||
// CHECK:STDOUT: call void @"_COp.16b2729c97ad4472:core.Destroy.Core"(ptr %.loc9_21.1.temp), !dbg !15
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc11_21.1.temp), !dbg !15
|
||||
// CHECK:STDOUT: store ptr %make.call, ptr %.loc11_21.1.temp, align 8, !dbg !15
|
||||
// CHECK:STDOUT: %.loc11_21.3 = load ptr, ptr %.loc11_21.1.temp, align 8, !dbg !15
|
||||
// CHECK:STDOUT: %U.as_type.as.ImplicitAs.impl.Convert.call = call ptr @"_CConvert.538322f9fda4254f:ImplicitAs.a276ba298c70ba87.Core.f9fd89fc1ccb531f"(ptr %.loc11_21.3), !dbg !15
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc11_21.5.temp), !dbg !15
|
||||
// CHECK:STDOUT: store ptr %U.as_type.as.ImplicitAs.impl.Convert.call, ptr %.loc11_21.5.temp, align 8, !dbg !15
|
||||
// CHECK:STDOUT: %.loc11_21.7 = load ptr, ptr %.loc11_21.5.temp, align 8, !dbg !15
|
||||
// CHECK:STDOUT: call void @_Z4takePK6ConstC(ptr %.loc11_21.7), !dbg !16
|
||||
// CHECK:STDOUT: call void @"_COp.cde1f9fdf283467b:core.Destroy.Core"(ptr %.loc11_21.5.temp), !dbg !15
|
||||
// CHECK:STDOUT: call void @"_COp.a6ac3d473017b2cc:core.Destroy.Core"(ptr %.loc11_21.1.temp), !dbg !15
|
||||
// CHECK:STDOUT: ret void, !dbg !17
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: declare noundef ptr @_Z4makev() #1
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: declare void @_Z4takePK1C(ptr noundef) #1
|
||||
// CHECK:STDOUT: declare void @_Z4takePK6ConstC(ptr noundef) #1
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define weak_odr void @"_COp.bde6c3800c3f9965:core.Destroy.Core"(ptr %self) #0 !dbg !18 {
|
||||
// CHECK:STDOUT: define weak_odr void @"_COp.53a1c4a6a5cbb234:core.Destroy.Core"(ptr %self) #0 !dbg !18 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: ret void, !dbg !24
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define weak_odr void @"_COp.8ff81f4b50934d6f:core.Destroy.Core"(ptr %self) #0 !dbg !25 {
|
||||
// CHECK:STDOUT: define weak_odr void @"_COp.fd6b21bba6dfd55d:core.Destroy.Core"(ptr %self) #0 !dbg !25 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: ret void, !dbg !28
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define weak_odr void @"_COp.d67a36d0f9ac97ca:core.Destroy.Core"(ptr %self) #0 !dbg !29 {
|
||||
// CHECK:STDOUT: define weak_odr void @"_COp.cde1f9fdf283467b:core.Destroy.Core"(ptr %self) #0 !dbg !29 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: ret void, !dbg !32
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define weak_odr void @"_COp.930f6ffe20ad4a64:core.Destroy.Core"(ptr %self) #0 !dbg !33 {
|
||||
// CHECK:STDOUT: define weak_odr void @"_COp.fc86501cbc1f8185:core.Destroy.Core"(ptr %self) #0 !dbg !33 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: ret void, !dbg !36
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define weak_odr void @"_COp.52f3be89096e2220:core.Destroy.Core"(ptr %self) #0 !dbg !37 {
|
||||
// CHECK:STDOUT: define weak_odr void @"_COp.b682b9cd8310efa2:core.Destroy.Core"(ptr %self) #0 !dbg !37 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: ret void, !dbg !40
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define weak_odr void @"_COp.16b2729c97ad4472:core.Destroy.Core"(ptr %self) #0 !dbg !41 {
|
||||
// CHECK:STDOUT: define weak_odr void @"_COp.a6ac3d473017b2cc:core.Destroy.Core"(ptr %self) #0 !dbg !41 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: ret void, !dbg !44
|
||||
// CHECK:STDOUT: }
|
||||
@@ -505,77 +507,77 @@ fn Convert() {
|
||||
// CHECK:STDOUT: declare void @llvm.lifetime.start.p0(ptr captures(none)) #2
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define linkonce_odr ptr @"_CConvert.538322f9fda4254f:ImplicitAs.a276ba298c70ba87.Core.7a59268f02b553a8"(ptr %self) #0 !dbg !45 {
|
||||
// CHECK:STDOUT: %1 = call ptr @"_CConvert.Optional.c661605f12aa337a.Core:OptionalAs.1dac4564233fecd1.Core.703e8dd9cedc135a"(ptr %self), !dbg !51
|
||||
// CHECK:STDOUT: define linkonce_odr ptr @"_CConvert.538322f9fda4254f:ImplicitAs.a276ba298c70ba87.Core.f9fd89fc1ccb531f"(ptr %self) #0 !dbg !45 {
|
||||
// CHECK:STDOUT: %1 = call ptr @"_CConvert.Optional.c661605f12aa337a.Core:OptionalAs.1dac4564233fecd1.Core.3efc4c2a62f24739"(ptr %self), !dbg !51
|
||||
// CHECK:STDOUT: ret ptr %1, !dbg !52
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define linkonce_odr ptr @"_CConvert.Optional.c661605f12aa337a.Core:OptionalAs.1dac4564233fecd1.Core.703e8dd9cedc135a"(ptr %self) #0 !dbg !53 {
|
||||
// CHECK:STDOUT: define linkonce_odr ptr @"_CConvert.Optional.c661605f12aa337a.Core:OptionalAs.1dac4564233fecd1.Core.3efc4c2a62f24739"(ptr %self) #0 !dbg !53 {
|
||||
// CHECK:STDOUT: %temp = alloca ptr, align 8, !dbg !56
|
||||
// CHECK:STDOUT: %temp1 = alloca ptr, align 8, !dbg !56
|
||||
// CHECK:STDOUT: %1 = call i1 @_CHasValue.Optional.Core.f65d494664285214(ptr %self), !dbg !57
|
||||
// CHECK:STDOUT: %1 = call i1 @_CHasValue.Optional.Core.0c3518913b4fb338(ptr %self), !dbg !57
|
||||
// CHECK:STDOUT: br i1 %1, label %2, label %7, !dbg !58
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: 2: ; preds = %0
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %temp), !dbg !56
|
||||
// CHECK:STDOUT: %3 = call ptr @_CGet.Optional.Core.f65d494664285214(ptr %self), !dbg !56
|
||||
// CHECK:STDOUT: %3 = call ptr @_CGet.Optional.Core.0c3518913b4fb338(ptr %self), !dbg !56
|
||||
// CHECK:STDOUT: store ptr %3, ptr %temp, align 8, !dbg !56
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %temp1), !dbg !56
|
||||
// CHECK:STDOUT: %4 = load ptr, ptr %temp, align 8, !dbg !56
|
||||
// CHECK:STDOUT: store ptr %4, ptr %temp1, align 8, !dbg !56
|
||||
// CHECK:STDOUT: %5 = load ptr, ptr %temp1, align 8, !dbg !56
|
||||
// CHECK:STDOUT: %6 = call ptr @_CSome.Optional.Core.f04d7238fb50aa85(ptr %5), !dbg !59
|
||||
// CHECK:STDOUT: %6 = call ptr @_CSome.Optional.Core.305e266058820aa4(ptr %5), !dbg !59
|
||||
// CHECK:STDOUT: ret ptr %6, !dbg !60
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: 7: ; preds = %0
|
||||
// CHECK:STDOUT: %8 = call ptr @_CNone.Optional.Core.f04d7238fb50aa85(), !dbg !61
|
||||
// CHECK:STDOUT: %8 = call ptr @_CNone.Optional.Core.305e266058820aa4(), !dbg !61
|
||||
// CHECK:STDOUT: ret ptr %8, !dbg !62
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define linkonce_odr i1 @_CHasValue.Optional.Core.f65d494664285214(ptr %self) #0 !dbg !63 {
|
||||
// CHECK:STDOUT: %1 = call i1 @"_CHas.e8f8f92d3d08d149:OptionalStorage.Core.fc8b3e0dc71c345e"(ptr %self), !dbg !66
|
||||
// CHECK:STDOUT: define linkonce_odr i1 @_CHasValue.Optional.Core.0c3518913b4fb338(ptr %self) #0 !dbg !63 {
|
||||
// CHECK:STDOUT: %1 = call i1 @"_CHas.e8f8f92d3d08d149:OptionalStorage.Core.21c65d90918a10a4"(ptr %self), !dbg !66
|
||||
// CHECK:STDOUT: ret i1 %1, !dbg !67
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define linkonce_odr ptr @_CGet.Optional.Core.f65d494664285214(ptr %self) #0 !dbg !68 {
|
||||
// CHECK:STDOUT: %1 = call ptr @"_CGet.e8f8f92d3d08d149:OptionalStorage.Core.fc8b3e0dc71c345e"(ptr %self), !dbg !71
|
||||
// CHECK:STDOUT: define linkonce_odr ptr @_CGet.Optional.Core.0c3518913b4fb338(ptr %self) #0 !dbg !68 {
|
||||
// CHECK:STDOUT: %1 = call ptr @"_CGet.e8f8f92d3d08d149:OptionalStorage.Core.21c65d90918a10a4"(ptr %self), !dbg !71
|
||||
// CHECK:STDOUT: ret ptr %1, !dbg !72
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define linkonce_odr ptr @_CSome.Optional.Core.f04d7238fb50aa85(ptr %value) #0 !dbg !73 {
|
||||
// CHECK:STDOUT: %1 = call ptr @"_CSome.e8f8f92d3d08d149:OptionalStorage.Core.8753681fdb639539"(ptr %value), !dbg !76
|
||||
// CHECK:STDOUT: define linkonce_odr ptr @_CSome.Optional.Core.305e266058820aa4(ptr %value) #0 !dbg !73 {
|
||||
// CHECK:STDOUT: %1 = call ptr @"_CSome.e8f8f92d3d08d149:OptionalStorage.Core.35c29317da7de352"(ptr %value), !dbg !76
|
||||
// CHECK:STDOUT: ret ptr %1, !dbg !77
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define linkonce_odr ptr @_CNone.Optional.Core.f04d7238fb50aa85() #0 !dbg !78 {
|
||||
// CHECK:STDOUT: define linkonce_odr ptr @_CNone.Optional.Core.305e266058820aa4() #0 !dbg !78 {
|
||||
// CHECK:STDOUT: ret ptr null, !dbg !81
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define linkonce_odr i1 @"_CHas.e8f8f92d3d08d149:OptionalStorage.Core.fc8b3e0dc71c345e"(ptr %value) #0 !dbg !82 {
|
||||
// CHECK:STDOUT: define linkonce_odr i1 @"_CHas.e8f8f92d3d08d149:OptionalStorage.Core.21c65d90918a10a4"(ptr %value) #0 !dbg !82 {
|
||||
// CHECK:STDOUT: %1 = icmp eq ptr %value, null, !dbg !85
|
||||
// CHECK:STDOUT: %2 = xor i1 %1, true, !dbg !86
|
||||
// CHECK:STDOUT: ret i1 %2, !dbg !87
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define linkonce_odr ptr @"_CGet.e8f8f92d3d08d149:OptionalStorage.Core.fc8b3e0dc71c345e"(ptr %value) #0 !dbg !88 {
|
||||
// CHECK:STDOUT: define linkonce_odr ptr @"_CGet.e8f8f92d3d08d149:OptionalStorage.Core.21c65d90918a10a4"(ptr %value) #0 !dbg !88 {
|
||||
// CHECK:STDOUT: ret ptr %value, !dbg !91
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define linkonce_odr ptr @"_CSome.e8f8f92d3d08d149:OptionalStorage.Core.8753681fdb639539"(ptr %self) #0 !dbg !92 {
|
||||
// CHECK:STDOUT: define linkonce_odr ptr @"_CSome.e8f8f92d3d08d149:OptionalStorage.Core.35c29317da7de352"(ptr %self) #0 !dbg !92 {
|
||||
// CHECK:STDOUT: %1 = alloca ptr, align 8, !dbg !95
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %1), !dbg !95
|
||||
// CHECK:STDOUT: store ptr poison, ptr %1, align 8, !dbg !95
|
||||
// CHECK:STDOUT: store ptr %self, ptr %1, align 8, !dbg !96
|
||||
// CHECK:STDOUT: %2 = load ptr, ptr %1, align 8, !dbg !97
|
||||
// CHECK:STDOUT: call void @"_COp.8ff81f4b50934d6f:core.Destroy.Core"(ptr %1), !dbg !95
|
||||
// CHECK:STDOUT: call void @"_COp.fd6b21bba6dfd55d:core.Destroy.Core"(ptr %1), !dbg !95
|
||||
// CHECK:STDOUT: ret ptr %2, !dbg !98
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
@@ -602,40 +604,40 @@ fn Convert() {
|
||||
// CHECK:STDOUT: !9 = !{!"int", !10, i64 0}
|
||||
// CHECK:STDOUT: !10 = !{!"omnipotent char", !11, i64 0}
|
||||
// CHECK:STDOUT: !11 = !{!"Simple C++ TBAA"}
|
||||
// CHECK:STDOUT: !12 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.Main", scope: null, file: !1, line: 8, type: !13, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !12 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.Main", scope: null, file: !1, line: 10, type: !13, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !13 = !DISubroutineType(types: !14)
|
||||
// CHECK:STDOUT: !14 = !{null}
|
||||
// CHECK:STDOUT: !15 = !DILocation(line: 9, column: 12, scope: !12)
|
||||
// CHECK:STDOUT: !16 = !DILocation(line: 9, column: 3, scope: !12)
|
||||
// CHECK:STDOUT: !17 = !DILocation(line: 8, column: 1, scope: !12)
|
||||
// CHECK:STDOUT: !18 = distinct !DISubprogram(name: "Op", linkageName: "_COp.bde6c3800c3f9965:core.Destroy.Core", scope: null, file: !1, line: 9, type: !19, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !22)
|
||||
// CHECK:STDOUT: !15 = !DILocation(line: 11, column: 12, scope: !12)
|
||||
// CHECK:STDOUT: !16 = !DILocation(line: 11, column: 3, scope: !12)
|
||||
// CHECK:STDOUT: !17 = !DILocation(line: 10, column: 1, scope: !12)
|
||||
// CHECK:STDOUT: !18 = distinct !DISubprogram(name: "Op", linkageName: "_COp.53a1c4a6a5cbb234:core.Destroy.Core", scope: null, file: !1, line: 11, type: !19, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !22)
|
||||
// CHECK:STDOUT: !19 = !DISubroutineType(types: !20)
|
||||
// CHECK:STDOUT: !20 = !{null, !21}
|
||||
// CHECK:STDOUT: !21 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: null, size: 64)
|
||||
// CHECK:STDOUT: !22 = !{!23}
|
||||
// CHECK:STDOUT: !23 = !DILocalVariable(arg: 1, scope: !18, type: !21)
|
||||
// CHECK:STDOUT: !24 = !DILocation(line: 9, column: 12, scope: !18)
|
||||
// CHECK:STDOUT: !25 = distinct !DISubprogram(name: "Op", linkageName: "_COp.8ff81f4b50934d6f:core.Destroy.Core", scope: null, file: !1, line: 9, type: !19, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !26)
|
||||
// CHECK:STDOUT: !24 = !DILocation(line: 11, column: 12, scope: !18)
|
||||
// CHECK:STDOUT: !25 = distinct !DISubprogram(name: "Op", linkageName: "_COp.fd6b21bba6dfd55d:core.Destroy.Core", scope: null, file: !1, line: 11, type: !19, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !26)
|
||||
// CHECK:STDOUT: !26 = !{!27}
|
||||
// CHECK:STDOUT: !27 = !DILocalVariable(arg: 1, scope: !25, type: !21)
|
||||
// CHECK:STDOUT: !28 = !DILocation(line: 9, column: 12, scope: !25)
|
||||
// CHECK:STDOUT: !29 = distinct !DISubprogram(name: "Op", linkageName: "_COp.d67a36d0f9ac97ca:core.Destroy.Core", scope: null, file: !1, line: 9, type: !19, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !30)
|
||||
// CHECK:STDOUT: !28 = !DILocation(line: 11, column: 12, scope: !25)
|
||||
// CHECK:STDOUT: !29 = distinct !DISubprogram(name: "Op", linkageName: "_COp.cde1f9fdf283467b:core.Destroy.Core", scope: null, file: !1, line: 11, type: !19, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !30)
|
||||
// CHECK:STDOUT: !30 = !{!31}
|
||||
// CHECK:STDOUT: !31 = !DILocalVariable(arg: 1, scope: !29, type: !21)
|
||||
// CHECK:STDOUT: !32 = !DILocation(line: 9, column: 12, scope: !29)
|
||||
// CHECK:STDOUT: !33 = distinct !DISubprogram(name: "Op", linkageName: "_COp.930f6ffe20ad4a64:core.Destroy.Core", scope: null, file: !1, line: 9, type: !19, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !34)
|
||||
// CHECK:STDOUT: !32 = !DILocation(line: 11, column: 12, scope: !29)
|
||||
// CHECK:STDOUT: !33 = distinct !DISubprogram(name: "Op", linkageName: "_COp.fc86501cbc1f8185:core.Destroy.Core", scope: null, file: !1, line: 11, type: !19, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !34)
|
||||
// CHECK:STDOUT: !34 = !{!35}
|
||||
// CHECK:STDOUT: !35 = !DILocalVariable(arg: 1, scope: !33, type: !21)
|
||||
// CHECK:STDOUT: !36 = !DILocation(line: 9, column: 12, scope: !33)
|
||||
// CHECK:STDOUT: !37 = distinct !DISubprogram(name: "Op", linkageName: "_COp.52f3be89096e2220:core.Destroy.Core", scope: null, file: !1, line: 9, type: !19, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !38)
|
||||
// CHECK:STDOUT: !36 = !DILocation(line: 11, column: 12, scope: !33)
|
||||
// CHECK:STDOUT: !37 = distinct !DISubprogram(name: "Op", linkageName: "_COp.b682b9cd8310efa2:core.Destroy.Core", scope: null, file: !1, line: 11, type: !19, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !38)
|
||||
// CHECK:STDOUT: !38 = !{!39}
|
||||
// CHECK:STDOUT: !39 = !DILocalVariable(arg: 1, scope: !37, type: !21)
|
||||
// CHECK:STDOUT: !40 = !DILocation(line: 9, column: 12, scope: !37)
|
||||
// CHECK:STDOUT: !41 = distinct !DISubprogram(name: "Op", linkageName: "_COp.16b2729c97ad4472:core.Destroy.Core", scope: null, file: !1, line: 9, type: !19, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !42)
|
||||
// CHECK:STDOUT: !40 = !DILocation(line: 11, column: 12, scope: !37)
|
||||
// CHECK:STDOUT: !41 = distinct !DISubprogram(name: "Op", linkageName: "_COp.a6ac3d473017b2cc:core.Destroy.Core", scope: null, file: !1, line: 11, type: !19, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !42)
|
||||
// CHECK:STDOUT: !42 = !{!43}
|
||||
// CHECK:STDOUT: !43 = !DILocalVariable(arg: 1, scope: !41, type: !21)
|
||||
// CHECK:STDOUT: !44 = !DILocation(line: 9, column: 12, scope: !41)
|
||||
// CHECK:STDOUT: !45 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.538322f9fda4254f:ImplicitAs.a276ba298c70ba87.Core.7a59268f02b553a8", scope: null, file: !46, line: 105, type: !47, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !49)
|
||||
// CHECK:STDOUT: !44 = !DILocation(line: 11, column: 12, scope: !41)
|
||||
// CHECK:STDOUT: !45 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.538322f9fda4254f:ImplicitAs.a276ba298c70ba87.Core.f9fd89fc1ccb531f", scope: null, file: !46, line: 105, type: !47, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !49)
|
||||
// CHECK:STDOUT: !46 = !DIFile(filename: "{{.*}}/prelude/types/optional.carbon", directory: "")
|
||||
// CHECK:STDOUT: !47 = !DISubroutineType(types: !48)
|
||||
// CHECK:STDOUT: !48 = !{!21, !21}
|
||||
@@ -643,7 +645,7 @@ fn Convert() {
|
||||
// CHECK:STDOUT: !50 = !DILocalVariable(arg: 1, scope: !45, type: !21)
|
||||
// CHECK:STDOUT: !51 = !DILocation(line: 106, column: 12, scope: !45)
|
||||
// CHECK:STDOUT: !52 = !DILocation(line: 106, column: 5, scope: !45)
|
||||
// CHECK:STDOUT: !53 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.Optional.c661605f12aa337a.Core:OptionalAs.1dac4564233fecd1.Core.703e8dd9cedc135a", scope: null, file: !46, line: 95, type: !47, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !54)
|
||||
// CHECK:STDOUT: !53 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.Optional.c661605f12aa337a.Core:OptionalAs.1dac4564233fecd1.Core.3efc4c2a62f24739", scope: null, file: !46, line: 95, type: !47, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !54)
|
||||
// CHECK:STDOUT: !54 = !{!55}
|
||||
// CHECK:STDOUT: !55 = !DILocalVariable(arg: 1, scope: !53, type: !21)
|
||||
// CHECK:STDOUT: !56 = !DILocation(line: 97, column: 31, scope: !53)
|
||||
@@ -653,36 +655,36 @@ fn Convert() {
|
||||
// CHECK:STDOUT: !60 = !DILocation(line: 97, column: 7, scope: !53)
|
||||
// CHECK:STDOUT: !61 = !DILocation(line: 99, column: 12, scope: !53)
|
||||
// CHECK:STDOUT: !62 = !DILocation(line: 99, column: 5, scope: !53)
|
||||
// CHECK:STDOUT: !63 = distinct !DISubprogram(name: "HasValue", linkageName: "_CHasValue.Optional.Core.f65d494664285214", scope: null, file: !46, line: 36, type: !47, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !64)
|
||||
// CHECK:STDOUT: !63 = distinct !DISubprogram(name: "HasValue", linkageName: "_CHasValue.Optional.Core.0c3518913b4fb338", scope: null, file: !46, line: 36, type: !47, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !64)
|
||||
// CHECK:STDOUT: !64 = !{!65}
|
||||
// CHECK:STDOUT: !65 = !DILocalVariable(arg: 1, scope: !63, type: !21)
|
||||
// CHECK:STDOUT: !66 = !DILocation(line: 37, column: 12, scope: !63)
|
||||
// CHECK:STDOUT: !67 = !DILocation(line: 37, column: 5, scope: !63)
|
||||
// CHECK:STDOUT: !68 = distinct !DISubprogram(name: "Get", linkageName: "_CGet.Optional.Core.f65d494664285214", scope: null, file: !46, line: 39, type: !47, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !69)
|
||||
// CHECK:STDOUT: !68 = distinct !DISubprogram(name: "Get", linkageName: "_CGet.Optional.Core.0c3518913b4fb338", scope: null, file: !46, line: 39, type: !47, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !69)
|
||||
// CHECK:STDOUT: !69 = !{!70}
|
||||
// CHECK:STDOUT: !70 = !DILocalVariable(arg: 1, scope: !68, type: !21)
|
||||
// CHECK:STDOUT: !71 = !DILocation(line: 40, column: 12, scope: !68)
|
||||
// CHECK:STDOUT: !72 = !DILocation(line: 40, column: 5, scope: !68)
|
||||
// CHECK:STDOUT: !73 = distinct !DISubprogram(name: "Some", linkageName: "_CSome.Optional.Core.f04d7238fb50aa85", scope: null, file: !46, line: 33, type: !47, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !74)
|
||||
// CHECK:STDOUT: !73 = distinct !DISubprogram(name: "Some", linkageName: "_CSome.Optional.Core.305e266058820aa4", scope: null, file: !46, line: 33, type: !47, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !74)
|
||||
// CHECK:STDOUT: !74 = !{!75}
|
||||
// CHECK:STDOUT: !75 = !DILocalVariable(arg: 1, scope: !73, type: !21)
|
||||
// CHECK:STDOUT: !76 = !DILocation(line: 34, column: 12, scope: !73)
|
||||
// CHECK:STDOUT: !77 = !DILocation(line: 34, column: 5, scope: !73)
|
||||
// CHECK:STDOUT: !78 = distinct !DISubprogram(name: "None", linkageName: "_CNone.Optional.Core.f04d7238fb50aa85", scope: null, file: !46, line: 30, type: !79, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !78 = distinct !DISubprogram(name: "None", linkageName: "_CNone.Optional.Core.305e266058820aa4", scope: null, file: !46, line: 30, type: !79, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !79 = !DISubroutineType(types: !80)
|
||||
// CHECK:STDOUT: !80 = !{!21}
|
||||
// CHECK:STDOUT: !81 = !DILocation(line: 31, column: 5, scope: !78)
|
||||
// CHECK:STDOUT: !82 = distinct !DISubprogram(name: "Has", linkageName: "_CHas.e8f8f92d3d08d149:OptionalStorage.Core.fc8b3e0dc71c345e", scope: null, file: !46, line: 172, type: !47, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !83)
|
||||
// CHECK:STDOUT: !82 = distinct !DISubprogram(name: "Has", linkageName: "_CHas.e8f8f92d3d08d149:OptionalStorage.Core.21c65d90918a10a4", scope: null, file: !46, line: 172, type: !47, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !83)
|
||||
// CHECK:STDOUT: !83 = !{!84}
|
||||
// CHECK:STDOUT: !84 = !DILocalVariable(arg: 1, scope: !82, type: !21)
|
||||
// CHECK:STDOUT: !85 = !DILocation(line: 173, column: 16, scope: !82)
|
||||
// CHECK:STDOUT: !86 = !DILocation(line: 173, column: 12, scope: !82)
|
||||
// CHECK:STDOUT: !87 = !DILocation(line: 173, column: 5, scope: !82)
|
||||
// CHECK:STDOUT: !88 = distinct !DISubprogram(name: "Get", linkageName: "_CGet.e8f8f92d3d08d149:OptionalStorage.Core.fc8b3e0dc71c345e", scope: null, file: !46, line: 175, type: !47, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !89)
|
||||
// CHECK:STDOUT: !88 = distinct !DISubprogram(name: "Get", linkageName: "_CGet.e8f8f92d3d08d149:OptionalStorage.Core.21c65d90918a10a4", scope: null, file: !46, line: 175, type: !47, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !89)
|
||||
// CHECK:STDOUT: !89 = !{!90}
|
||||
// CHECK:STDOUT: !90 = !DILocalVariable(arg: 1, scope: !88, type: !21)
|
||||
// CHECK:STDOUT: !91 = !DILocation(line: 176, column: 5, scope: !88)
|
||||
// CHECK:STDOUT: !92 = distinct !DISubprogram(name: "Some", linkageName: "_CSome.e8f8f92d3d08d149:OptionalStorage.Core.8753681fdb639539", scope: null, file: !46, line: 166, type: !47, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !93)
|
||||
// CHECK:STDOUT: !92 = distinct !DISubprogram(name: "Some", linkageName: "_CSome.e8f8f92d3d08d149:OptionalStorage.Core.35c29317da7de352", scope: null, file: !46, line: 166, type: !47, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !93)
|
||||
// CHECK:STDOUT: !93 = !{!94}
|
||||
// CHECK:STDOUT: !94 = !DILocalVariable(arg: 1, scope: !92, type: !21)
|
||||
// CHECK:STDOUT: !95 = !DILocation(line: 167, column: 14, scope: !92)
|
||||
|
||||
+2
-301
@@ -6,9 +6,9 @@
|
||||
//
|
||||
// AUTOUPDATE
|
||||
// TIP: To test this file alone, run:
|
||||
// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/lower/testdata/interop/cpp/std_initializer_list.carbon
|
||||
// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/lower/testdata/interop/cpp/std_initializer_list_pointer_pointer.carbon
|
||||
// TIP: To dump output, run:
|
||||
// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/lower/testdata/interop/cpp/std_initializer_list.carbon
|
||||
// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/lower/testdata/interop/cpp/std_initializer_list_pointer_pointer.carbon
|
||||
|
||||
// --- initializer_list_pointer_pointer.h
|
||||
|
||||
@@ -30,26 +30,6 @@ struct vector_like {
|
||||
~vector_like() {}
|
||||
};
|
||||
|
||||
// --- initializer_list_pointer_size.h
|
||||
|
||||
namespace std {
|
||||
using size_t = decltype(sizeof(0));
|
||||
|
||||
template <typename T> class initializer_list {
|
||||
public:
|
||||
initializer_list() {}
|
||||
|
||||
private:
|
||||
T* begin_ = nullptr;
|
||||
size_t size_ = 0;
|
||||
};
|
||||
}
|
||||
|
||||
struct vector_like {
|
||||
vector_like(std::initializer_list<int> list) {}
|
||||
~vector_like() {}
|
||||
};
|
||||
|
||||
// --- nontrivial_dtor.h
|
||||
|
||||
struct nontrivial_dtor {
|
||||
@@ -84,33 +64,6 @@ fn InitNontrivialDtor() {
|
||||
WithinLifetime();
|
||||
}
|
||||
|
||||
// --- use_pointer_size.carbon
|
||||
|
||||
library "[[@TEST_NAME]]";
|
||||
|
||||
import Cpp library "initializer_list_pointer_size.h";
|
||||
import Cpp library "nontrivial_dtor.h";
|
||||
|
||||
// TODO: When we support more precise modeling of temporary lifetimes, ensure
|
||||
// that this is called *before* the elements of the underlying array are
|
||||
// destroyed in the non-vector-like cases.
|
||||
fn WithinLifetime();
|
||||
|
||||
fn InitDirectly() {
|
||||
var _: Cpp.std.initializer_list(i32) = (1, 2, 3);
|
||||
WithinLifetime();
|
||||
}
|
||||
|
||||
fn InitVectorLike() {
|
||||
var _: Cpp.vector_like = (1, 2, 3);
|
||||
WithinLifetime();
|
||||
}
|
||||
|
||||
fn InitNontrivialDtor() {
|
||||
var _: Cpp.std.initializer_list(Cpp.nontrivial_dtor) = ((), (), ());
|
||||
WithinLifetime();
|
||||
}
|
||||
|
||||
// CHECK:STDOUT: ; ---
|
||||
// CHECK:STDOUT: ; ModuleID = 'use_pointer_pointer.carbon'
|
||||
// CHECK:STDOUT: source_filename = "use_pointer_pointer.carbon"
|
||||
@@ -362,255 +315,3 @@ fn InitNontrivialDtor() {
|
||||
// CHECK:STDOUT: !55 = !DILocalVariable(arg: 1, scope: !53, type: !29)
|
||||
// CHECK:STDOUT: !56 = !DILocation(line: 23, column: 58, scope: !53)
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; ---
|
||||
// CHECK:STDOUT: ; ModuleID = 'use_pointer_size.carbon'
|
||||
// CHECK:STDOUT: source_filename = "use_pointer_size.carbon"
|
||||
// CHECK:STDOUT: target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
|
||||
// CHECK:STDOUT: target triple = "x86_64-unknown-linux-gnu"
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: %"class.std::initializer_list.6" = type { ptr, i64 }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: $_ZN11vector_likeD2Ev = comdat any
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: $_ZN15nontrivial_dtorD2Ev = comdat any
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: $_ZN11vector_likeC2ESt16initializer_listIiE = comdat any
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: $_ZN15nontrivial_dtorC2Ev = comdat any
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: @array = internal constant [3 x i32] [i32 1, i32 2, i32 3]
|
||||
// CHECK:STDOUT: @array.loc13_50.15 = internal constant [3 x i32] [i32 1, i32 2, i32 3]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: declare void @_CWithinLifetime.Main()
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define void @_CInitDirectly.Main() #0 !dbg !12 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %_.var = alloca [16 x i8], align 8, !dbg !15
|
||||
// CHECK:STDOUT: %.loc13_50.3.temp = alloca [3 x i32], align 4, !dbg !16
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %_.var), !dbg !15
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc13_50.3.temp), !dbg !16
|
||||
// CHECK:STDOUT: %.loc13_50.4.array.index = getelementptr inbounds [3 x i32], ptr %.loc13_50.3.temp, i32 0, i64 0, !dbg !16
|
||||
// CHECK:STDOUT: %.loc13_50.7.array.index = getelementptr inbounds [3 x i32], ptr %.loc13_50.3.temp, i32 0, i64 1, !dbg !16
|
||||
// CHECK:STDOUT: %.loc13_50.10.array.index = getelementptr inbounds [3 x i32], ptr %.loc13_50.3.temp, i32 0, i64 2, !dbg !16
|
||||
// CHECK:STDOUT: %initializer_list.initializer_list.call.init_list.begin = getelementptr inbounds nuw [16 x i8], ptr %_.var, i32 0, i32 0, !dbg !15
|
||||
// CHECK:STDOUT: store ptr @array.loc13_50.15, ptr %initializer_list.initializer_list.call.init_list.begin, align 8, !dbg !15
|
||||
// CHECK:STDOUT: %initializer_list.initializer_list.call.init_list.size = getelementptr inbounds nuw [16 x i8], ptr %_.var, i32 0, i32 8, !dbg !15
|
||||
// CHECK:STDOUT: store i64 3, ptr %initializer_list.initializer_list.call.init_list.size, align 8, !dbg !15
|
||||
// CHECK:STDOUT: call void @_CWithinLifetime.Main(), !dbg !17
|
||||
// CHECK:STDOUT: call void @"_COp.3bc428c96004ce87:core.Destroy.Core"(ptr @array), !dbg !16
|
||||
// CHECK:STDOUT: ret void, !dbg !18
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define weak_odr void @"_COp.70db2d92ffddbef7:core.Destroy.Core"(ptr %self) #0 !dbg !19 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: ret void, !dbg !25
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define weak_odr void @"_COp.3bc428c96004ce87:core.Destroy.Core"(ptr %self) #0 !dbg !26 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: ret void, !dbg !32
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define void @_CInitVectorLike.Main() #0 !dbg !33 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %_.var = alloca [1 x i8], align 1, !dbg !34
|
||||
// CHECK:STDOUT: %.loc18_36.2.temp = alloca [16 x i8], align 8, !dbg !35
|
||||
// CHECK:STDOUT: %.loc18_36.4.temp = alloca [3 x i32], align 4, !dbg !35
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %_.var), !dbg !34
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc18_36.2.temp), !dbg !35
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc18_36.4.temp), !dbg !35
|
||||
// CHECK:STDOUT: %.loc18_36.5.array.index = getelementptr inbounds [3 x i32], ptr %.loc18_36.4.temp, i32 0, i64 0, !dbg !35
|
||||
// CHECK:STDOUT: %.loc18_36.8.array.index = getelementptr inbounds [3 x i32], ptr %.loc18_36.4.temp, i32 0, i64 1, !dbg !35
|
||||
// CHECK:STDOUT: %.loc18_36.11.array.index = getelementptr inbounds [3 x i32], ptr %.loc18_36.4.temp, i32 0, i64 2, !dbg !35
|
||||
// CHECK:STDOUT: %initializer_list.initializer_list.call.init_list.begin = getelementptr inbounds nuw [16 x i8], ptr %.loc18_36.2.temp, i32 0, i32 0, !dbg !35
|
||||
// CHECK:STDOUT: store ptr @array.loc13_50.15, ptr %initializer_list.initializer_list.call.init_list.begin, align 8, !dbg !35
|
||||
// CHECK:STDOUT: %initializer_list.initializer_list.call.init_list.size = getelementptr inbounds nuw [16 x i8], ptr %.loc18_36.2.temp, i32 0, i32 8, !dbg !35
|
||||
// CHECK:STDOUT: store i64 3, ptr %initializer_list.initializer_list.call.init_list.size, align 8, !dbg !35
|
||||
// CHECK:STDOUT: call void @_ZN11vector_likeC1ESt16initializer_listIiE.carbon_thunk._(ptr %.loc18_36.2.temp, ptr %_.var), !dbg !34
|
||||
// CHECK:STDOUT: call void @_CWithinLifetime.Main(), !dbg !36
|
||||
// CHECK:STDOUT: call void @"_COp.3bc428c96004ce87:core.Destroy.Core"(ptr @array), !dbg !35
|
||||
// CHECK:STDOUT: call void @_ZN11vector_likeD2Ev(ptr %_.var), !dbg !34
|
||||
// CHECK:STDOUT: ret void, !dbg !37
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: alwaysinline mustprogress uwtable
|
||||
// CHECK:STDOUT: define internal void @_ZN11vector_likeC1ESt16initializer_listIiE.carbon_thunk._(ptr noundef %list, ptr noundef %return) #1 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %list.addr = alloca ptr, align 8
|
||||
// CHECK:STDOUT: %return.addr = alloca ptr, align 8
|
||||
// CHECK:STDOUT: %agg.tmp = alloca %"class.std::initializer_list.6", align 8
|
||||
// CHECK:STDOUT: store ptr %list, ptr %list.addr, align 8, !tbaa !38
|
||||
// CHECK:STDOUT: store ptr %return, ptr %return.addr, align 8, !tbaa !41
|
||||
// CHECK:STDOUT: %0 = load ptr, ptr %return.addr, align 8, !tbaa !41
|
||||
// CHECK:STDOUT: %1 = load ptr, ptr %list.addr, align 8, !tbaa !38
|
||||
// CHECK:STDOUT: call void @llvm.memcpy.p0.p0.i64(ptr align 8 %agg.tmp, ptr align 8 %1, i64 16, i1 false), !tbaa.struct !43
|
||||
// CHECK:STDOUT: %2 = getelementptr inbounds nuw { ptr, i64 }, ptr %agg.tmp, i32 0, i32 0
|
||||
// CHECK:STDOUT: %3 = load ptr, ptr %2, align 8
|
||||
// CHECK:STDOUT: %4 = getelementptr inbounds nuw { ptr, i64 }, ptr %agg.tmp, i32 0, i32 1
|
||||
// CHECK:STDOUT: %5 = load i64, ptr %4, align 8
|
||||
// CHECK:STDOUT: call void @_ZN11vector_likeC2ESt16initializer_listIiE(ptr noundef nonnull align 1 dereferenceable(1) %0, ptr %3, i64 %5)
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: mustprogress nounwind uwtable
|
||||
// CHECK:STDOUT: define linkonce_odr dso_local void @_ZN11vector_likeD2Ev(ptr noundef nonnull align 1 dereferenceable(1) %this) unnamed_addr #2 comdat align 2 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %this.addr = alloca ptr, align 8
|
||||
// CHECK:STDOUT: store ptr %this, ptr %this.addr, align 8, !tbaa !41
|
||||
// CHECK:STDOUT: %this1 = load ptr, ptr %this.addr, align 8
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define void @_CInitNontrivialDtor.Main() #0 !dbg !48 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %_.var = alloca [16 x i8], align 8, !dbg !49
|
||||
// CHECK:STDOUT: %.loc23_69.17.temp = alloca [3 x [1 x i8]], align 1, !dbg !50
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %_.var), !dbg !49
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc23_69.17.temp), !dbg !50
|
||||
// CHECK:STDOUT: %.loc23_69.18.array.index = getelementptr inbounds [3 x [1 x i8]], ptr %.loc23_69.17.temp, i32 0, i64 0, !dbg !50
|
||||
// CHECK:STDOUT: call void @_ZN15nontrivial_dtorC1Ev.carbon_thunk_tuple.(ptr %.loc23_69.18.array.index), !dbg !50
|
||||
// CHECK:STDOUT: %.loc23_69.16.array.index = getelementptr inbounds [3 x [1 x i8]], ptr %.loc23_69.17.temp, i32 0, i64 1, !dbg !50
|
||||
// CHECK:STDOUT: call void @_ZN15nontrivial_dtorC1Ev.carbon_thunk_tuple.(ptr %.loc23_69.16.array.index), !dbg !50
|
||||
// CHECK:STDOUT: %.loc23_69.15.array.index = getelementptr inbounds [3 x [1 x i8]], ptr %.loc23_69.17.temp, i32 0, i64 2, !dbg !50
|
||||
// CHECK:STDOUT: call void @_ZN15nontrivial_dtorC1Ev.carbon_thunk_tuple.(ptr %.loc23_69.15.array.index), !dbg !50
|
||||
// CHECK:STDOUT: %initializer_list.initializer_list.call.init_list.begin = getelementptr inbounds nuw [16 x i8], ptr %_.var, i32 0, i32 0, !dbg !49
|
||||
// CHECK:STDOUT: store ptr %.loc23_69.17.temp, ptr %initializer_list.initializer_list.call.init_list.begin, align 8, !dbg !49
|
||||
// CHECK:STDOUT: %initializer_list.initializer_list.call.init_list.size = getelementptr inbounds nuw [16 x i8], ptr %_.var, i32 0, i32 8, !dbg !49
|
||||
// CHECK:STDOUT: store i64 3, ptr %initializer_list.initializer_list.call.init_list.size, align 8, !dbg !49
|
||||
// CHECK:STDOUT: call void @_CWithinLifetime.Main(), !dbg !51
|
||||
// CHECK:STDOUT: call void @"_COp.baa51490b2bdaa96:core.Destroy.Core"(ptr %.loc23_69.17.temp), !dbg !50
|
||||
// CHECK:STDOUT: ret void, !dbg !52
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: alwaysinline mustprogress uwtable
|
||||
// CHECK:STDOUT: define internal void @_ZN15nontrivial_dtorC1Ev.carbon_thunk_tuple.(ptr noundef %return) #1 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %return.addr = alloca ptr, align 8
|
||||
// CHECK:STDOUT: store ptr %return, ptr %return.addr, align 8, !tbaa !53
|
||||
// CHECK:STDOUT: %0 = load ptr, ptr %return.addr, align 8, !tbaa !53
|
||||
// CHECK:STDOUT: call void @_ZN15nontrivial_dtorC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %0)
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: mustprogress nounwind uwtable
|
||||
// CHECK:STDOUT: define linkonce_odr dso_local void @_ZN15nontrivial_dtorD2Ev(ptr noundef nonnull align 1 dereferenceable(1) %this) unnamed_addr #2 comdat align 2 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %this.addr = alloca ptr, align 8
|
||||
// CHECK:STDOUT: store ptr %this, ptr %this.addr, align 8, !tbaa !53
|
||||
// CHECK:STDOUT: %this1 = load ptr, ptr %this.addr, align 8
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define weak_odr void @"_COp.baa51490b2bdaa96:core.Destroy.Core"(ptr %self) #0 !dbg !55 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: ret void, !dbg !58
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite)
|
||||
// CHECK:STDOUT: declare void @llvm.lifetime.start.p0(ptr captures(none)) #3
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite)
|
||||
// CHECK:STDOUT: declare void @llvm.memcpy.p0.p0.i64(ptr noalias writeonly captures(none), ptr noalias readonly captures(none), i64, i1 immarg) #3
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: mustprogress nounwind uwtable
|
||||
// CHECK:STDOUT: define linkonce_odr dso_local void @_ZN11vector_likeC2ESt16initializer_listIiE(ptr noundef nonnull align 1 dereferenceable(1) %this, ptr %list.coerce0, i64 %list.coerce1) unnamed_addr #2 comdat align 2 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %list = alloca %"class.std::initializer_list.6", align 8
|
||||
// CHECK:STDOUT: %this.addr = alloca ptr, align 8
|
||||
// CHECK:STDOUT: %0 = getelementptr inbounds nuw { ptr, i64 }, ptr %list, i32 0, i32 0
|
||||
// CHECK:STDOUT: store ptr %list.coerce0, ptr %0, align 8
|
||||
// CHECK:STDOUT: %1 = getelementptr inbounds nuw { ptr, i64 }, ptr %list, i32 0, i32 1
|
||||
// CHECK:STDOUT: store i64 %list.coerce1, ptr %1, align 8
|
||||
// CHECK:STDOUT: store ptr %this, ptr %this.addr, align 8, !tbaa !41
|
||||
// CHECK:STDOUT: %this1 = load ptr, ptr %this.addr, align 8
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: mustprogress nounwind uwtable
|
||||
// CHECK:STDOUT: define linkonce_odr dso_local void @_ZN15nontrivial_dtorC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %this) unnamed_addr #2 comdat align 2 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %this.addr = alloca ptr, align 8
|
||||
// CHECK:STDOUT: store ptr %this, ptr %this.addr, align 8, !tbaa !53
|
||||
// CHECK:STDOUT: %this1 = load ptr, ptr %this.addr, align 8
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; uselistorder directives
|
||||
// CHECK:STDOUT: uselistorder ptr @_ZN15nontrivial_dtorC1Ev.carbon_thunk_tuple., { 2, 1, 0 }
|
||||
// CHECK:STDOUT: uselistorder ptr @llvm.lifetime.start.p0, { 6, 5, 4, 3, 2, 1, 0 }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: attributes #0 = { nounwind }
|
||||
// CHECK:STDOUT: attributes #1 = { alwaysinline mustprogress uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
|
||||
// CHECK:STDOUT: attributes #2 = { mustprogress nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
|
||||
// CHECK:STDOUT: attributes #3 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: !llvm.dbg.cu = !{!0}
|
||||
// CHECK:STDOUT: !llvm.module.flags = !{!2, !3, !4, !5, !6}
|
||||
// CHECK:STDOUT: !llvm.errno.tbaa = !{!7}
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: !0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "carbon", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug)
|
||||
// CHECK:STDOUT: !1 = !DIFile(filename: "use_pointer_size.carbon", directory: "")
|
||||
// CHECK:STDOUT: !2 = !{i32 8, !"PIC Level", i32 2}
|
||||
// CHECK:STDOUT: !3 = !{i32 7, !"PIE Level", i32 2}
|
||||
// CHECK:STDOUT: !4 = !{i32 7, !"uwtable", i32 2}
|
||||
// CHECK:STDOUT: !5 = !{i32 7, !"Dwarf Version", i32 5}
|
||||
// CHECK:STDOUT: !6 = !{i32 2, !"Debug Info Version", i32 3}
|
||||
// CHECK:STDOUT: !7 = !{!8, !9, i64 0}
|
||||
// CHECK:STDOUT: !8 = !{!"__libc_errno", !9, i64 0}
|
||||
// CHECK:STDOUT: !9 = !{!"int", !10, i64 0}
|
||||
// CHECK:STDOUT: !10 = !{!"omnipotent char", !11, i64 0}
|
||||
// CHECK:STDOUT: !11 = !{!"Simple C++ TBAA"}
|
||||
// CHECK:STDOUT: !12 = distinct !DISubprogram(name: "InitDirectly", linkageName: "_CInitDirectly.Main", scope: null, file: !1, line: 12, type: !13, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !13 = !DISubroutineType(types: !14)
|
||||
// CHECK:STDOUT: !14 = !{null}
|
||||
// CHECK:STDOUT: !15 = !DILocation(line: 13, column: 3, scope: !12)
|
||||
// CHECK:STDOUT: !16 = !DILocation(line: 13, column: 42, scope: !12)
|
||||
// CHECK:STDOUT: !17 = !DILocation(line: 14, column: 3, scope: !12)
|
||||
// CHECK:STDOUT: !18 = !DILocation(line: 12, column: 1, scope: !12)
|
||||
// CHECK:STDOUT: !19 = distinct !DISubprogram(name: "Op", linkageName: "_COp.70db2d92ffddbef7:core.Destroy.Core", scope: null, file: !1, line: 13, type: !20, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !23)
|
||||
// CHECK:STDOUT: !20 = !DISubroutineType(types: !21)
|
||||
// CHECK:STDOUT: !21 = !{null, !22}
|
||||
// CHECK:STDOUT: !22 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
|
||||
// CHECK:STDOUT: !23 = !{!24}
|
||||
// CHECK:STDOUT: !24 = !DILocalVariable(arg: 1, scope: !19, type: !22)
|
||||
// CHECK:STDOUT: !25 = !DILocation(line: 13, column: 42, scope: !19)
|
||||
// CHECK:STDOUT: !26 = distinct !DISubprogram(name: "Op", linkageName: "_COp.3bc428c96004ce87:core.Destroy.Core", scope: null, file: !1, line: 13, type: !27, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !30)
|
||||
// CHECK:STDOUT: !27 = !DISubroutineType(types: !28)
|
||||
// CHECK:STDOUT: !28 = !{null, !29}
|
||||
// CHECK:STDOUT: !29 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: null, size: 64)
|
||||
// CHECK:STDOUT: !30 = !{!31}
|
||||
// CHECK:STDOUT: !31 = !DILocalVariable(arg: 1, scope: !26, type: !29)
|
||||
// CHECK:STDOUT: !32 = !DILocation(line: 13, column: 42, scope: !26)
|
||||
// CHECK:STDOUT: !33 = distinct !DISubprogram(name: "InitVectorLike", linkageName: "_CInitVectorLike.Main", scope: null, file: !1, line: 17, type: !13, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !34 = !DILocation(line: 18, column: 3, scope: !33)
|
||||
// CHECK:STDOUT: !35 = !DILocation(line: 18, column: 28, scope: !33)
|
||||
// CHECK:STDOUT: !36 = !DILocation(line: 19, column: 3, scope: !33)
|
||||
// CHECK:STDOUT: !37 = !DILocation(line: 17, column: 1, scope: !33)
|
||||
// CHECK:STDOUT: !38 = !{!39, !39, i64 0}
|
||||
// CHECK:STDOUT: !39 = !{!"p1 _ZTSSt16initializer_listIiE", !40, i64 0}
|
||||
// CHECK:STDOUT: !40 = !{!"any pointer", !10, i64 0}
|
||||
// CHECK:STDOUT: !41 = !{!42, !42, i64 0}
|
||||
// CHECK:STDOUT: !42 = !{!"p1 _ZTS11vector_like", !40, i64 0}
|
||||
// CHECK:STDOUT: !43 = !{i64 0, i64 8, !44, i64 8, i64 8, !46}
|
||||
// CHECK:STDOUT: !44 = !{!45, !45, i64 0}
|
||||
// CHECK:STDOUT: !45 = !{!"p1 int", !40, i64 0}
|
||||
// CHECK:STDOUT: !46 = !{!47, !47, i64 0}
|
||||
// CHECK:STDOUT: !47 = !{!"long", !10, i64 0}
|
||||
// CHECK:STDOUT: !48 = distinct !DISubprogram(name: "InitNontrivialDtor", linkageName: "_CInitNontrivialDtor.Main", scope: null, file: !1, line: 22, type: !13, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !49 = !DILocation(line: 23, column: 3, scope: !48)
|
||||
// CHECK:STDOUT: !50 = !DILocation(line: 23, column: 58, scope: !48)
|
||||
// CHECK:STDOUT: !51 = !DILocation(line: 24, column: 3, scope: !48)
|
||||
// CHECK:STDOUT: !52 = !DILocation(line: 22, column: 1, scope: !48)
|
||||
// CHECK:STDOUT: !53 = !{!54, !54, i64 0}
|
||||
// CHECK:STDOUT: !54 = !{!"p1 _ZTS15nontrivial_dtor", !40, i64 0}
|
||||
// CHECK:STDOUT: !55 = distinct !DISubprogram(name: "Op", linkageName: "_COp.baa51490b2bdaa96:core.Destroy.Core", scope: null, file: !1, line: 23, type: !27, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !56)
|
||||
// CHECK:STDOUT: !56 = !{!57}
|
||||
// CHECK:STDOUT: !57 = !DILocalVariable(arg: 1, scope: !55, type: !29)
|
||||
// CHECK:STDOUT: !58 = !DILocation(line: 23, column: 58, scope: !55)
|
||||
// CHECK:STDOUT:
|
||||
+318
@@ -0,0 +1,318 @@
|
||||
// Part of the Carbon Language project, under the Apache License v2.0 with LLVM
|
||||
// Exceptions. See /LICENSE for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
// INCLUDE-FILE: toolchain/testing/testdata/min_prelude/full.carbon
|
||||
//
|
||||
// AUTOUPDATE
|
||||
// TIP: To test this file alone, run:
|
||||
// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/lower/testdata/interop/cpp/std_initializer_list_pointer_size.carbon
|
||||
// TIP: To dump output, run:
|
||||
// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/lower/testdata/interop/cpp/std_initializer_list_pointer_size.carbon
|
||||
|
||||
// --- initializer_list_pointer_size.h
|
||||
|
||||
namespace std {
|
||||
using size_t = decltype(sizeof(0));
|
||||
|
||||
template <typename T> class initializer_list {
|
||||
public:
|
||||
initializer_list() {}
|
||||
|
||||
private:
|
||||
T* begin_ = nullptr;
|
||||
size_t size_ = 0;
|
||||
};
|
||||
}
|
||||
|
||||
struct vector_like {
|
||||
vector_like(std::initializer_list<int> list) {}
|
||||
~vector_like() {}
|
||||
};
|
||||
|
||||
// --- nontrivial_dtor.h
|
||||
|
||||
struct nontrivial_dtor {
|
||||
nontrivial_dtor() {}
|
||||
~nontrivial_dtor() {}
|
||||
};
|
||||
|
||||
// --- use_pointer_size.carbon
|
||||
|
||||
library "[[@TEST_NAME]]";
|
||||
|
||||
import Cpp library "initializer_list_pointer_size.h";
|
||||
import Cpp library "nontrivial_dtor.h";
|
||||
|
||||
// TODO: When we support more precise modeling of temporary lifetimes, ensure
|
||||
// that this is called *before* the elements of the underlying array are
|
||||
// destroyed in the non-vector-like cases.
|
||||
fn WithinLifetime();
|
||||
|
||||
fn InitDirectly() {
|
||||
var _: Cpp.std.initializer_list(i32) = (1, 2, 3);
|
||||
WithinLifetime();
|
||||
}
|
||||
|
||||
fn InitVectorLike() {
|
||||
var _: Cpp.vector_like = (1, 2, 3);
|
||||
WithinLifetime();
|
||||
}
|
||||
|
||||
fn InitNontrivialDtor() {
|
||||
var _: Cpp.std.initializer_list(Cpp.nontrivial_dtor) = ((), (), ());
|
||||
WithinLifetime();
|
||||
}
|
||||
|
||||
// CHECK:STDOUT: ; ---
|
||||
// CHECK:STDOUT: ; ModuleID = 'use_pointer_size.carbon'
|
||||
// CHECK:STDOUT: source_filename = "use_pointer_size.carbon"
|
||||
// CHECK:STDOUT: target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
|
||||
// CHECK:STDOUT: target triple = "x86_64-unknown-linux-gnu"
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: %"class.std::initializer_list" = type { ptr, i64 }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: $_ZN11vector_likeD2Ev = comdat any
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: $_ZN15nontrivial_dtorD2Ev = comdat any
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: $_ZN11vector_likeC2ESt16initializer_listIiE = comdat any
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: $_ZN15nontrivial_dtorC2Ev = comdat any
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: @array = internal constant [3 x i32] [i32 1, i32 2, i32 3]
|
||||
// CHECK:STDOUT: @array.loc13_50.15 = internal constant [3 x i32] [i32 1, i32 2, i32 3]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: declare void @_CWithinLifetime.Main()
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define void @_CInitDirectly.Main() #0 !dbg !12 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %_.var = alloca [16 x i8], align 8, !dbg !15
|
||||
// CHECK:STDOUT: %.loc13_50.3.temp = alloca [3 x i32], align 4, !dbg !16
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %_.var), !dbg !15
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc13_50.3.temp), !dbg !16
|
||||
// CHECK:STDOUT: %.loc13_50.4.array.index = getelementptr inbounds [3 x i32], ptr %.loc13_50.3.temp, i32 0, i64 0, !dbg !16
|
||||
// CHECK:STDOUT: %.loc13_50.7.array.index = getelementptr inbounds [3 x i32], ptr %.loc13_50.3.temp, i32 0, i64 1, !dbg !16
|
||||
// CHECK:STDOUT: %.loc13_50.10.array.index = getelementptr inbounds [3 x i32], ptr %.loc13_50.3.temp, i32 0, i64 2, !dbg !16
|
||||
// CHECK:STDOUT: %initializer_list.initializer_list.call.init_list.begin = getelementptr inbounds nuw [16 x i8], ptr %_.var, i32 0, i32 0, !dbg !15
|
||||
// CHECK:STDOUT: store ptr @array.loc13_50.15, ptr %initializer_list.initializer_list.call.init_list.begin, align 8, !dbg !15
|
||||
// CHECK:STDOUT: %initializer_list.initializer_list.call.init_list.size = getelementptr inbounds nuw [16 x i8], ptr %_.var, i32 0, i32 8, !dbg !15
|
||||
// CHECK:STDOUT: store i64 3, ptr %initializer_list.initializer_list.call.init_list.size, align 8, !dbg !15
|
||||
// CHECK:STDOUT: call void @_CWithinLifetime.Main(), !dbg !17
|
||||
// CHECK:STDOUT: call void @"_COp.3bc428c96004ce87:core.Destroy.Core"(ptr @array), !dbg !16
|
||||
// CHECK:STDOUT: ret void, !dbg !18
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define weak_odr void @"_COp.70db2d92ffddbef7:core.Destroy.Core"(ptr %self) #0 !dbg !19 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: ret void, !dbg !25
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define weak_odr void @"_COp.3bc428c96004ce87:core.Destroy.Core"(ptr %self) #0 !dbg !26 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: ret void, !dbg !32
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define void @_CInitVectorLike.Main() #0 !dbg !33 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %_.var = alloca [1 x i8], align 1, !dbg !34
|
||||
// CHECK:STDOUT: %.loc18_36.2.temp = alloca [16 x i8], align 8, !dbg !35
|
||||
// CHECK:STDOUT: %.loc18_36.4.temp = alloca [3 x i32], align 4, !dbg !35
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %_.var), !dbg !34
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc18_36.2.temp), !dbg !35
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc18_36.4.temp), !dbg !35
|
||||
// CHECK:STDOUT: %.loc18_36.5.array.index = getelementptr inbounds [3 x i32], ptr %.loc18_36.4.temp, i32 0, i64 0, !dbg !35
|
||||
// CHECK:STDOUT: %.loc18_36.8.array.index = getelementptr inbounds [3 x i32], ptr %.loc18_36.4.temp, i32 0, i64 1, !dbg !35
|
||||
// CHECK:STDOUT: %.loc18_36.11.array.index = getelementptr inbounds [3 x i32], ptr %.loc18_36.4.temp, i32 0, i64 2, !dbg !35
|
||||
// CHECK:STDOUT: %initializer_list.initializer_list.call.init_list.begin = getelementptr inbounds nuw [16 x i8], ptr %.loc18_36.2.temp, i32 0, i32 0, !dbg !35
|
||||
// CHECK:STDOUT: store ptr @array.loc13_50.15, ptr %initializer_list.initializer_list.call.init_list.begin, align 8, !dbg !35
|
||||
// CHECK:STDOUT: %initializer_list.initializer_list.call.init_list.size = getelementptr inbounds nuw [16 x i8], ptr %.loc18_36.2.temp, i32 0, i32 8, !dbg !35
|
||||
// CHECK:STDOUT: store i64 3, ptr %initializer_list.initializer_list.call.init_list.size, align 8, !dbg !35
|
||||
// CHECK:STDOUT: call void @_ZN11vector_likeC1ESt16initializer_listIiE.carbon_thunk._(ptr %.loc18_36.2.temp, ptr %_.var), !dbg !34
|
||||
// CHECK:STDOUT: call void @_CWithinLifetime.Main(), !dbg !36
|
||||
// CHECK:STDOUT: call void @"_COp.3bc428c96004ce87:core.Destroy.Core"(ptr @array), !dbg !35
|
||||
// CHECK:STDOUT: call void @_ZN11vector_likeD2Ev(ptr %_.var), !dbg !34
|
||||
// CHECK:STDOUT: ret void, !dbg !37
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: alwaysinline mustprogress uwtable
|
||||
// CHECK:STDOUT: define internal void @_ZN11vector_likeC1ESt16initializer_listIiE.carbon_thunk._(ptr noundef %list, ptr noundef %return) #1 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %list.addr = alloca ptr, align 8
|
||||
// CHECK:STDOUT: %return.addr = alloca ptr, align 8
|
||||
// CHECK:STDOUT: %agg.tmp = alloca %"class.std::initializer_list", align 8
|
||||
// CHECK:STDOUT: store ptr %list, ptr %list.addr, align 8, !tbaa !38
|
||||
// CHECK:STDOUT: store ptr %return, ptr %return.addr, align 8, !tbaa !41
|
||||
// CHECK:STDOUT: %0 = load ptr, ptr %return.addr, align 8, !tbaa !41
|
||||
// CHECK:STDOUT: %1 = load ptr, ptr %list.addr, align 8, !tbaa !38
|
||||
// CHECK:STDOUT: call void @llvm.memcpy.p0.p0.i64(ptr align 8 %agg.tmp, ptr align 8 %1, i64 16, i1 false), !tbaa.struct !43
|
||||
// CHECK:STDOUT: %2 = getelementptr inbounds nuw { ptr, i64 }, ptr %agg.tmp, i32 0, i32 0
|
||||
// CHECK:STDOUT: %3 = load ptr, ptr %2, align 8
|
||||
// CHECK:STDOUT: %4 = getelementptr inbounds nuw { ptr, i64 }, ptr %agg.tmp, i32 0, i32 1
|
||||
// CHECK:STDOUT: %5 = load i64, ptr %4, align 8
|
||||
// CHECK:STDOUT: call void @_ZN11vector_likeC2ESt16initializer_listIiE(ptr noundef nonnull align 1 dereferenceable(1) %0, ptr %3, i64 %5)
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: mustprogress nounwind uwtable
|
||||
// CHECK:STDOUT: define linkonce_odr dso_local void @_ZN11vector_likeD2Ev(ptr noundef nonnull align 1 dereferenceable(1) %this) unnamed_addr #2 comdat align 2 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %this.addr = alloca ptr, align 8
|
||||
// CHECK:STDOUT: store ptr %this, ptr %this.addr, align 8, !tbaa !41
|
||||
// CHECK:STDOUT: %this1 = load ptr, ptr %this.addr, align 8
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define void @_CInitNontrivialDtor.Main() #0 !dbg !48 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %_.var = alloca [16 x i8], align 8, !dbg !49
|
||||
// CHECK:STDOUT: %.loc23_69.17.temp = alloca [3 x [1 x i8]], align 1, !dbg !50
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %_.var), !dbg !49
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc23_69.17.temp), !dbg !50
|
||||
// CHECK:STDOUT: %.loc23_69.18.array.index = getelementptr inbounds [3 x [1 x i8]], ptr %.loc23_69.17.temp, i32 0, i64 0, !dbg !50
|
||||
// CHECK:STDOUT: call void @_ZN15nontrivial_dtorC1Ev.carbon_thunk_tuple.(ptr %.loc23_69.18.array.index), !dbg !50
|
||||
// CHECK:STDOUT: %.loc23_69.16.array.index = getelementptr inbounds [3 x [1 x i8]], ptr %.loc23_69.17.temp, i32 0, i64 1, !dbg !50
|
||||
// CHECK:STDOUT: call void @_ZN15nontrivial_dtorC1Ev.carbon_thunk_tuple.(ptr %.loc23_69.16.array.index), !dbg !50
|
||||
// CHECK:STDOUT: %.loc23_69.15.array.index = getelementptr inbounds [3 x [1 x i8]], ptr %.loc23_69.17.temp, i32 0, i64 2, !dbg !50
|
||||
// CHECK:STDOUT: call void @_ZN15nontrivial_dtorC1Ev.carbon_thunk_tuple.(ptr %.loc23_69.15.array.index), !dbg !50
|
||||
// CHECK:STDOUT: %initializer_list.initializer_list.call.init_list.begin = getelementptr inbounds nuw [16 x i8], ptr %_.var, i32 0, i32 0, !dbg !49
|
||||
// CHECK:STDOUT: store ptr %.loc23_69.17.temp, ptr %initializer_list.initializer_list.call.init_list.begin, align 8, !dbg !49
|
||||
// CHECK:STDOUT: %initializer_list.initializer_list.call.init_list.size = getelementptr inbounds nuw [16 x i8], ptr %_.var, i32 0, i32 8, !dbg !49
|
||||
// CHECK:STDOUT: store i64 3, ptr %initializer_list.initializer_list.call.init_list.size, align 8, !dbg !49
|
||||
// CHECK:STDOUT: call void @_CWithinLifetime.Main(), !dbg !51
|
||||
// CHECK:STDOUT: call void @"_COp.baa51490b2bdaa96:core.Destroy.Core"(ptr %.loc23_69.17.temp), !dbg !50
|
||||
// CHECK:STDOUT: ret void, !dbg !52
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: alwaysinline mustprogress uwtable
|
||||
// CHECK:STDOUT: define internal void @_ZN15nontrivial_dtorC1Ev.carbon_thunk_tuple.(ptr noundef %return) #1 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %return.addr = alloca ptr, align 8
|
||||
// CHECK:STDOUT: store ptr %return, ptr %return.addr, align 8, !tbaa !53
|
||||
// CHECK:STDOUT: %0 = load ptr, ptr %return.addr, align 8, !tbaa !53
|
||||
// CHECK:STDOUT: call void @_ZN15nontrivial_dtorC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %0)
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: mustprogress nounwind uwtable
|
||||
// CHECK:STDOUT: define linkonce_odr dso_local void @_ZN15nontrivial_dtorD2Ev(ptr noundef nonnull align 1 dereferenceable(1) %this) unnamed_addr #2 comdat align 2 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %this.addr = alloca ptr, align 8
|
||||
// CHECK:STDOUT: store ptr %this, ptr %this.addr, align 8, !tbaa !53
|
||||
// CHECK:STDOUT: %this1 = load ptr, ptr %this.addr, align 8
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define weak_odr void @"_COp.baa51490b2bdaa96:core.Destroy.Core"(ptr %self) #0 !dbg !55 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: ret void, !dbg !58
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite)
|
||||
// CHECK:STDOUT: declare void @llvm.lifetime.start.p0(ptr captures(none)) #3
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite)
|
||||
// CHECK:STDOUT: declare void @llvm.memcpy.p0.p0.i64(ptr noalias writeonly captures(none), ptr noalias readonly captures(none), i64, i1 immarg) #3
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: mustprogress nounwind uwtable
|
||||
// CHECK:STDOUT: define linkonce_odr dso_local void @_ZN11vector_likeC2ESt16initializer_listIiE(ptr noundef nonnull align 1 dereferenceable(1) %this, ptr %list.coerce0, i64 %list.coerce1) unnamed_addr #2 comdat align 2 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %list = alloca %"class.std::initializer_list", align 8
|
||||
// CHECK:STDOUT: %this.addr = alloca ptr, align 8
|
||||
// CHECK:STDOUT: %0 = getelementptr inbounds nuw { ptr, i64 }, ptr %list, i32 0, i32 0
|
||||
// CHECK:STDOUT: store ptr %list.coerce0, ptr %0, align 8
|
||||
// CHECK:STDOUT: %1 = getelementptr inbounds nuw { ptr, i64 }, ptr %list, i32 0, i32 1
|
||||
// CHECK:STDOUT: store i64 %list.coerce1, ptr %1, align 8
|
||||
// CHECK:STDOUT: store ptr %this, ptr %this.addr, align 8, !tbaa !41
|
||||
// CHECK:STDOUT: %this1 = load ptr, ptr %this.addr, align 8
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: mustprogress nounwind uwtable
|
||||
// CHECK:STDOUT: define linkonce_odr dso_local void @_ZN15nontrivial_dtorC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %this) unnamed_addr #2 comdat align 2 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %this.addr = alloca ptr, align 8
|
||||
// CHECK:STDOUT: store ptr %this, ptr %this.addr, align 8, !tbaa !53
|
||||
// CHECK:STDOUT: %this1 = load ptr, ptr %this.addr, align 8
|
||||
// CHECK:STDOUT: ret void
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; uselistorder directives
|
||||
// CHECK:STDOUT: uselistorder ptr @_ZN15nontrivial_dtorC1Ev.carbon_thunk_tuple., { 2, 1, 0 }
|
||||
// CHECK:STDOUT: uselistorder ptr @llvm.lifetime.start.p0, { 6, 5, 4, 3, 2, 1, 0 }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: attributes #0 = { nounwind }
|
||||
// CHECK:STDOUT: attributes #1 = { alwaysinline mustprogress uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
|
||||
// CHECK:STDOUT: attributes #2 = { mustprogress nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
|
||||
// CHECK:STDOUT: attributes #3 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: !llvm.dbg.cu = !{!0}
|
||||
// CHECK:STDOUT: !llvm.module.flags = !{!2, !3, !4, !5, !6}
|
||||
// CHECK:STDOUT: !llvm.errno.tbaa = !{!7}
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: !0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "carbon", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug)
|
||||
// CHECK:STDOUT: !1 = !DIFile(filename: "use_pointer_size.carbon", directory: "")
|
||||
// CHECK:STDOUT: !2 = !{i32 8, !"PIC Level", i32 2}
|
||||
// CHECK:STDOUT: !3 = !{i32 7, !"PIE Level", i32 2}
|
||||
// CHECK:STDOUT: !4 = !{i32 7, !"uwtable", i32 2}
|
||||
// CHECK:STDOUT: !5 = !{i32 7, !"Dwarf Version", i32 5}
|
||||
// CHECK:STDOUT: !6 = !{i32 2, !"Debug Info Version", i32 3}
|
||||
// CHECK:STDOUT: !7 = !{!8, !9, i64 0}
|
||||
// CHECK:STDOUT: !8 = !{!"__libc_errno", !9, i64 0}
|
||||
// CHECK:STDOUT: !9 = !{!"int", !10, i64 0}
|
||||
// CHECK:STDOUT: !10 = !{!"omnipotent char", !11, i64 0}
|
||||
// CHECK:STDOUT: !11 = !{!"Simple C++ TBAA"}
|
||||
// CHECK:STDOUT: !12 = distinct !DISubprogram(name: "InitDirectly", linkageName: "_CInitDirectly.Main", scope: null, file: !1, line: 12, type: !13, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !13 = !DISubroutineType(types: !14)
|
||||
// CHECK:STDOUT: !14 = !{null}
|
||||
// CHECK:STDOUT: !15 = !DILocation(line: 13, column: 3, scope: !12)
|
||||
// CHECK:STDOUT: !16 = !DILocation(line: 13, column: 42, scope: !12)
|
||||
// CHECK:STDOUT: !17 = !DILocation(line: 14, column: 3, scope: !12)
|
||||
// CHECK:STDOUT: !18 = !DILocation(line: 12, column: 1, scope: !12)
|
||||
// CHECK:STDOUT: !19 = distinct !DISubprogram(name: "Op", linkageName: "_COp.70db2d92ffddbef7:core.Destroy.Core", scope: null, file: !1, line: 13, type: !20, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !23)
|
||||
// CHECK:STDOUT: !20 = !DISubroutineType(types: !21)
|
||||
// CHECK:STDOUT: !21 = !{null, !22}
|
||||
// CHECK:STDOUT: !22 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
|
||||
// CHECK:STDOUT: !23 = !{!24}
|
||||
// CHECK:STDOUT: !24 = !DILocalVariable(arg: 1, scope: !19, type: !22)
|
||||
// CHECK:STDOUT: !25 = !DILocation(line: 13, column: 42, scope: !19)
|
||||
// CHECK:STDOUT: !26 = distinct !DISubprogram(name: "Op", linkageName: "_COp.3bc428c96004ce87:core.Destroy.Core", scope: null, file: !1, line: 13, type: !27, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !30)
|
||||
// CHECK:STDOUT: !27 = !DISubroutineType(types: !28)
|
||||
// CHECK:STDOUT: !28 = !{null, !29}
|
||||
// CHECK:STDOUT: !29 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: null, size: 64)
|
||||
// CHECK:STDOUT: !30 = !{!31}
|
||||
// CHECK:STDOUT: !31 = !DILocalVariable(arg: 1, scope: !26, type: !29)
|
||||
// CHECK:STDOUT: !32 = !DILocation(line: 13, column: 42, scope: !26)
|
||||
// CHECK:STDOUT: !33 = distinct !DISubprogram(name: "InitVectorLike", linkageName: "_CInitVectorLike.Main", scope: null, file: !1, line: 17, type: !13, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !34 = !DILocation(line: 18, column: 3, scope: !33)
|
||||
// CHECK:STDOUT: !35 = !DILocation(line: 18, column: 28, scope: !33)
|
||||
// CHECK:STDOUT: !36 = !DILocation(line: 19, column: 3, scope: !33)
|
||||
// CHECK:STDOUT: !37 = !DILocation(line: 17, column: 1, scope: !33)
|
||||
// CHECK:STDOUT: !38 = !{!39, !39, i64 0}
|
||||
// CHECK:STDOUT: !39 = !{!"p1 _ZTSSt16initializer_listIiE", !40, i64 0}
|
||||
// CHECK:STDOUT: !40 = !{!"any pointer", !10, i64 0}
|
||||
// CHECK:STDOUT: !41 = !{!42, !42, i64 0}
|
||||
// CHECK:STDOUT: !42 = !{!"p1 _ZTS11vector_like", !40, i64 0}
|
||||
// CHECK:STDOUT: !43 = !{i64 0, i64 8, !44, i64 8, i64 8, !46}
|
||||
// CHECK:STDOUT: !44 = !{!45, !45, i64 0}
|
||||
// CHECK:STDOUT: !45 = !{!"p1 int", !40, i64 0}
|
||||
// CHECK:STDOUT: !46 = !{!47, !47, i64 0}
|
||||
// CHECK:STDOUT: !47 = !{!"long", !10, i64 0}
|
||||
// CHECK:STDOUT: !48 = distinct !DISubprogram(name: "InitNontrivialDtor", linkageName: "_CInitNontrivialDtor.Main", scope: null, file: !1, line: 22, type: !13, spFlags: DISPFlagDefinition, unit: !0)
|
||||
// CHECK:STDOUT: !49 = !DILocation(line: 23, column: 3, scope: !48)
|
||||
// CHECK:STDOUT: !50 = !DILocation(line: 23, column: 58, scope: !48)
|
||||
// CHECK:STDOUT: !51 = !DILocation(line: 24, column: 3, scope: !48)
|
||||
// CHECK:STDOUT: !52 = !DILocation(line: 22, column: 1, scope: !48)
|
||||
// CHECK:STDOUT: !53 = !{!54, !54, i64 0}
|
||||
// CHECK:STDOUT: !54 = !{!"p1 _ZTS15nontrivial_dtor", !40, i64 0}
|
||||
// CHECK:STDOUT: !55 = distinct !DISubprogram(name: "Op", linkageName: "_COp.baa51490b2bdaa96:core.Destroy.Core", scope: null, file: !1, line: 23, type: !27, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !56)
|
||||
// CHECK:STDOUT: !56 = !{!57}
|
||||
// CHECK:STDOUT: !57 = !DILocalVariable(arg: 1, scope: !55, type: !29)
|
||||
// CHECK:STDOUT: !58 = !DILocation(line: 23, column: 58, scope: !55)
|
||||
// CHECK:STDOUT:
|
||||
Reference in New Issue
Block a user