mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-05 22:02:55 +01:00
Fix mangling collision for C++ class template specializations (#7269)
Carbon-side thunks (for example the `Copy`/`Destroy` witness thunks generated for imported C++ types) are mangled by Carbon, and their names incorporate a fingerprint of the involved types. The instruction fingerprinter identifies a class only by its name and parent scope, which is sufficient for Carbon classes but not for imported C++ classes: different specializations of one class template (and other cases such as types in anonymous namespaces) share a Carbon name and parent scope. As a result, the thunks for two distinct specializations could mangle to the same name, producing a single LLVM function with two definitions and failing `verifyModule` during lowering. When fingerprinting a class imported from C++, also include the Clang mangled name of its type. Test: toolchain/lower/testdata/interop/cpp/thunks.carbon gains a split with two specializations of one class template, each requiring a thunk; their thunks now get distinct mangled names instead of colliding. Assisted-by: Claude Code --------- Co-authored-by: Christopher Di Bella <cjdb.ns@gmail.com>
This commit is contained in:
co-authored by
Christopher Di Bella
parent
3ef128ac91
commit
8a59f2a76b
+85
-85
@@ -137,7 +137,7 @@ fn ConversionExplicit(s: Cpp.ConditionallyExplicitFalse) {
|
||||
// CHECK:STDOUT: %Dest: type = class_type @Dest [concrete]
|
||||
// CHECK:STDOUT: %Source.cpp_operator.type: type = fn_type @Source.cpp_operator [concrete]
|
||||
// CHECK:STDOUT: %Source.cpp_operator: %Source.cpp_operator.type = struct_value () [concrete]
|
||||
// CHECK:STDOUT: %ptr.7c0: type = ptr_type %Dest [concrete]
|
||||
// CHECK:STDOUT: %ptr.246: type = ptr_type %Dest [concrete]
|
||||
// CHECK:STDOUT: %Dest__carbon_thunk.type.2ffc11.1: type = fn_type @Dest__carbon_thunk.1 [concrete]
|
||||
// CHECK:STDOUT: %Dest__carbon_thunk.61ac37.1: %Dest__carbon_thunk.type.2ffc11.1 = struct_value () [concrete]
|
||||
// CHECK:STDOUT: %Dest.cpp_destructor.type: type = fn_type @Dest.cpp_destructor [concrete]
|
||||
@@ -146,8 +146,8 @@ fn ConversionExplicit(s: Cpp.ConditionallyExplicitFalse) {
|
||||
// CHECK:STDOUT: %Dest.Op: %Dest.Op.type = struct_value () [concrete]
|
||||
// CHECK:STDOUT: %Source2: type = class_type @Source2 [concrete]
|
||||
// CHECK:STDOUT: %Dest2: type = class_type @Dest2 [concrete]
|
||||
// CHECK:STDOUT: %ptr.96f: type = ptr_type %Source2 [concrete]
|
||||
// CHECK:STDOUT: %ptr.129: type = ptr_type %Dest2 [concrete]
|
||||
// CHECK:STDOUT: %ptr.692: type = ptr_type %Source2 [concrete]
|
||||
// CHECK:STDOUT: %ptr.a5d: type = ptr_type %Dest2 [concrete]
|
||||
// CHECK:STDOUT: %Dest2__carbon_thunk.type: type = fn_type @Dest2__carbon_thunk [concrete]
|
||||
// CHECK:STDOUT: %Dest2__carbon_thunk: %Dest2__carbon_thunk.type = struct_value () [concrete]
|
||||
// CHECK:STDOUT: %Dest2.cpp_destructor.type: type = fn_type @Dest2.cpp_destructor [concrete]
|
||||
@@ -155,8 +155,8 @@ fn ConversionExplicit(s: Cpp.ConditionallyExplicitFalse) {
|
||||
// CHECK:STDOUT: %Dest2.Op.type: type = fn_type @Dest2.Op [concrete]
|
||||
// CHECK:STDOUT: %Dest2.Op: %Dest2.Op.type = struct_value () [concrete]
|
||||
// CHECK:STDOUT: %ExplicitConstructor: type = class_type @ExplicitConstructor [concrete]
|
||||
// CHECK:STDOUT: %ptr.f95: type = ptr_type %Source [concrete]
|
||||
// CHECK:STDOUT: %ptr.5c4: type = ptr_type %ExplicitConstructor [concrete]
|
||||
// CHECK:STDOUT: %ptr.71b: type = ptr_type %Source [concrete]
|
||||
// CHECK:STDOUT: %ptr.207: type = ptr_type %ExplicitConstructor [concrete]
|
||||
// CHECK:STDOUT: %ExplicitConstructor__carbon_thunk.type: type = fn_type @ExplicitConstructor__carbon_thunk [concrete]
|
||||
// CHECK:STDOUT: %ExplicitConstructor__carbon_thunk: %ExplicitConstructor__carbon_thunk.type = struct_value () [concrete]
|
||||
// CHECK:STDOUT: %ExplicitConstructor.cpp_destructor.type: type = fn_type @ExplicitConstructor.cpp_destructor [concrete]
|
||||
@@ -240,7 +240,7 @@ fn ConversionExplicit(s: Cpp.ConditionallyExplicitFalse) {
|
||||
// CHECK:STDOUT: %Dest.ref: type = name_ref Dest, imports.%Dest.decl [concrete = constants.%Dest]
|
||||
// CHECK:STDOUT: %Source.cpp_operator.bound: <bound method> = bound_method %s.ref, imports.%Source.cpp_operator.decl
|
||||
// CHECK:STDOUT: %.loc8_5.1: ref %Dest = temporary_storage
|
||||
// CHECK:STDOUT: %addr: %ptr.7c0 = addr_of %.loc8_5.1
|
||||
// CHECK:STDOUT: %addr: %ptr.246 = addr_of %.loc8_5.1
|
||||
// CHECK:STDOUT: %Dest__carbon_thunk.call: init %empty_tuple.type = call imports.%Dest__carbon_thunk.decl.74d7b8.1(%s.ref, %addr)
|
||||
// CHECK:STDOUT: %.loc8_5.2: init %Dest to %.loc8_5.1 = mark_in_place_init %Dest__carbon_thunk.call
|
||||
// CHECK:STDOUT: %.loc8_5.3: init %Dest = converted %s.ref, %.loc8_5.2
|
||||
@@ -260,8 +260,8 @@ fn ConversionExplicit(s: Cpp.ConditionallyExplicitFalse) {
|
||||
// CHECK:STDOUT: %Dest2.ref: type = name_ref Dest2, imports.%Dest2.decl [concrete = constants.%Dest2]
|
||||
// CHECK:STDOUT: %.loc14_5.1: ref %Dest2 = temporary_storage
|
||||
// CHECK:STDOUT: %.loc14_3: ref %Source2 = value_as_ref %s.ref
|
||||
// CHECK:STDOUT: %addr.loc14_5.1: %ptr.96f = addr_of %.loc14_3
|
||||
// CHECK:STDOUT: %addr.loc14_5.2: %ptr.129 = addr_of %.loc14_5.1
|
||||
// CHECK:STDOUT: %addr.loc14_5.1: %ptr.692 = addr_of %.loc14_3
|
||||
// CHECK:STDOUT: %addr.loc14_5.2: %ptr.a5d = addr_of %.loc14_5.1
|
||||
// CHECK:STDOUT: %Dest2__carbon_thunk.call: init %empty_tuple.type = call imports.%Dest2__carbon_thunk.decl(%addr.loc14_5.1, %addr.loc14_5.2)
|
||||
// CHECK:STDOUT: %.loc14_5.2: init %Dest2 to %.loc14_5.1 = mark_in_place_init %Dest2__carbon_thunk.call
|
||||
// CHECK:STDOUT: %.loc14_5.3: init %Dest2 = converted %s.ref, %.loc14_5.2
|
||||
@@ -281,8 +281,8 @@ fn ConversionExplicit(s: Cpp.ConditionallyExplicitFalse) {
|
||||
// CHECK:STDOUT: %ExplicitConstructor.ref: type = name_ref ExplicitConstructor, imports.%ExplicitConstructor.decl [concrete = constants.%ExplicitConstructor]
|
||||
// CHECK:STDOUT: %.loc20_5.1: ref %ExplicitConstructor = temporary_storage
|
||||
// CHECK:STDOUT: %.loc20_3: ref %Source = value_as_ref %s.ref
|
||||
// CHECK:STDOUT: %addr.loc20_5.1: %ptr.f95 = addr_of %.loc20_3
|
||||
// CHECK:STDOUT: %addr.loc20_5.2: %ptr.5c4 = addr_of %.loc20_5.1
|
||||
// CHECK:STDOUT: %addr.loc20_5.1: %ptr.71b = addr_of %.loc20_3
|
||||
// CHECK:STDOUT: %addr.loc20_5.2: %ptr.207 = addr_of %.loc20_5.1
|
||||
// CHECK:STDOUT: %ExplicitConstructor__carbon_thunk.call: init %empty_tuple.type = call imports.%ExplicitConstructor__carbon_thunk.decl(%addr.loc20_5.1, %addr.loc20_5.2)
|
||||
// CHECK:STDOUT: %.loc20_5.2: init %ExplicitConstructor to %.loc20_5.1 = mark_in_place_init %ExplicitConstructor__carbon_thunk.call
|
||||
// CHECK:STDOUT: %.loc20_5.3: init %ExplicitConstructor = converted %s.ref, %.loc20_5.2
|
||||
@@ -302,7 +302,7 @@ fn ConversionExplicit(s: Cpp.ConditionallyExplicitFalse) {
|
||||
// CHECK:STDOUT: %Dest.ref: type = name_ref Dest, imports.%Dest.decl [concrete = constants.%Dest]
|
||||
// CHECK:STDOUT: %ExplicitConversion.cpp_operator.bound: <bound method> = bound_method %s.ref, imports.%ExplicitConversion.cpp_operator.decl
|
||||
// CHECK:STDOUT: %.loc26_5.1: ref %Dest = temporary_storage
|
||||
// CHECK:STDOUT: %addr: %ptr.7c0 = addr_of %.loc26_5.1
|
||||
// CHECK:STDOUT: %addr: %ptr.246 = addr_of %.loc26_5.1
|
||||
// CHECK:STDOUT: %Dest__carbon_thunk.call: init %empty_tuple.type = call imports.%Dest__carbon_thunk.decl.74d7b8.2(%s.ref, %addr)
|
||||
// CHECK:STDOUT: %.loc26_5.2: init %Dest to %.loc26_5.1 = mark_in_place_init %Dest__carbon_thunk.call
|
||||
// CHECK:STDOUT: %.loc26_5.3: init %Dest = converted %s.ref, %.loc26_5.2
|
||||
@@ -319,18 +319,18 @@ fn ConversionExplicit(s: Cpp.ConditionallyExplicitFalse) {
|
||||
// CHECK:STDOUT: constants {
|
||||
// CHECK:STDOUT: %Source: type = class_type @Source [concrete]
|
||||
// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete]
|
||||
// CHECK:STDOUT: %ConditionallyExplicit.6a9921.1: type = class_type @ConditionallyExplicit.1 [concrete]
|
||||
// CHECK:STDOUT: %pattern_type.dc5fb9.1: type = pattern_type %ConditionallyExplicit.6a9921.1 [concrete]
|
||||
// CHECK:STDOUT: %ptr.f95: type = ptr_type %Source [concrete]
|
||||
// CHECK:STDOUT: %ptr.d63e0a.1: type = ptr_type %ConditionallyExplicit.6a9921.1 [concrete]
|
||||
// CHECK:STDOUT: %ConditionallyExplicit.d2a: type = class_type @ConditionallyExplicit.1 [concrete]
|
||||
// CHECK:STDOUT: %pattern_type.e92: type = pattern_type %ConditionallyExplicit.d2a [concrete]
|
||||
// CHECK:STDOUT: %ptr.71b: type = ptr_type %Source [concrete]
|
||||
// CHECK:STDOUT: %ptr.c11: type = ptr_type %ConditionallyExplicit.d2a [concrete]
|
||||
// CHECK:STDOUT: %ConditionallyExplicit__carbon_thunk.type.c43f84.1: type = fn_type @ConditionallyExplicit__carbon_thunk.1 [concrete]
|
||||
// CHECK:STDOUT: %ConditionallyExplicit__carbon_thunk.379b04.1: %ConditionallyExplicit__carbon_thunk.type.c43f84.1 = struct_value () [concrete]
|
||||
// CHECK:STDOUT: %ConditionallyExplicit.cpp_destructor.type.6ce8c4.1: type = fn_type @ConditionallyExplicit.cpp_destructor.1 [concrete]
|
||||
// CHECK:STDOUT: %ConditionallyExplicit.cpp_destructor.1ad69a.1: %ConditionallyExplicit.cpp_destructor.type.6ce8c4.1 = struct_value () [concrete]
|
||||
// CHECK:STDOUT: %ConditionallyExplicit.Op.type.43d658.1: type = fn_type @ConditionallyExplicit.Op.1 [concrete]
|
||||
// CHECK:STDOUT: %ConditionallyExplicit.Op.cc70d5.1: %ConditionallyExplicit.Op.type.43d658.1 = struct_value () [concrete]
|
||||
// CHECK:STDOUT: %ConditionallyExplicit.6a9921.2: type = class_type @ConditionallyExplicit.2 [concrete]
|
||||
// CHECK:STDOUT: %ptr.d63e0a.2: type = ptr_type %ConditionallyExplicit.6a9921.2 [concrete]
|
||||
// CHECK:STDOUT: %ConditionallyExplicit.717: type = class_type @ConditionallyExplicit.2 [concrete]
|
||||
// CHECK:STDOUT: %ptr.6d5: type = ptr_type %ConditionallyExplicit.717 [concrete]
|
||||
// CHECK:STDOUT: %ConditionallyExplicit__carbon_thunk.type.c43f84.2: type = fn_type @ConditionallyExplicit__carbon_thunk.2 [concrete]
|
||||
// CHECK:STDOUT: %ConditionallyExplicit__carbon_thunk.379b04.2: %ConditionallyExplicit__carbon_thunk.type.c43f84.2 = struct_value () [concrete]
|
||||
// CHECK:STDOUT: %ConditionallyExplicit.cpp_destructor.type.6ce8c4.2: type = fn_type @ConditionallyExplicit.cpp_destructor.2 [concrete]
|
||||
@@ -338,10 +338,10 @@ fn ConversionExplicit(s: Cpp.ConditionallyExplicitFalse) {
|
||||
// CHECK:STDOUT: %ConditionallyExplicit.Op.type.43d658.2: type = fn_type @ConditionallyExplicit.Op.2 [concrete]
|
||||
// CHECK:STDOUT: %ConditionallyExplicit.Op.cc70d5.2: %ConditionallyExplicit.Op.type.43d658.2 = struct_value () [concrete]
|
||||
// CHECK:STDOUT: %Dest: type = class_type @Dest [concrete]
|
||||
// CHECK:STDOUT: %pattern_type.a9f: type = pattern_type %Dest [concrete]
|
||||
// CHECK:STDOUT: %pattern_type.56d: type = pattern_type %Dest [concrete]
|
||||
// CHECK:STDOUT: %ConditionallyExplicit.cpp_operator.type: type = fn_type @ConditionallyExplicit.cpp_operator [concrete]
|
||||
// CHECK:STDOUT: %ConditionallyExplicit.cpp_operator: %ConditionallyExplicit.cpp_operator.type = struct_value () [concrete]
|
||||
// CHECK:STDOUT: %ptr.7c0: type = ptr_type %Dest [concrete]
|
||||
// CHECK:STDOUT: %ptr.246: type = ptr_type %Dest [concrete]
|
||||
// CHECK:STDOUT: %Dest__carbon_thunk.type: type = fn_type @Dest__carbon_thunk [concrete]
|
||||
// CHECK:STDOUT: %Dest__carbon_thunk: %Dest__carbon_thunk.type = struct_value () [concrete]
|
||||
// CHECK:STDOUT: %Dest.cpp_destructor.type: type = fn_type @Dest.cpp_destructor [concrete]
|
||||
@@ -353,13 +353,13 @@ fn ConversionExplicit(s: Cpp.ConditionallyExplicitFalse) {
|
||||
// CHECK:STDOUT: imports {
|
||||
// CHECK:STDOUT: %Cpp: <namespace> = namespace file.%Cpp.import_cpp, [concrete] {
|
||||
// CHECK:STDOUT: .Source = %Source.decl
|
||||
// CHECK:STDOUT: .ConditionallyExplicitFalse = %ConditionallyExplicit.decl.7f9e91.1
|
||||
// CHECK:STDOUT: .ConditionallyExplicitTrue = %ConditionallyExplicit.decl.7f9e91.2
|
||||
// CHECK:STDOUT: .ConditionallyExplicitFalse = %ConditionallyExplicit.decl.6be
|
||||
// CHECK:STDOUT: .ConditionallyExplicitTrue = %ConditionallyExplicit.decl.80b
|
||||
// CHECK:STDOUT: .Dest = %Dest.decl
|
||||
// CHECK:STDOUT: import Cpp//...
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: %Source.decl: type = class_decl @Source [concrete = constants.%Source] {} {}
|
||||
// CHECK:STDOUT: %ConditionallyExplicit.decl.7f9e91.1: type = class_decl @ConditionallyExplicit.1 [concrete = constants.%ConditionallyExplicit.6a9921.1] {} {}
|
||||
// CHECK:STDOUT: %ConditionallyExplicit.decl.6be: type = class_decl @ConditionallyExplicit.1 [concrete = constants.%ConditionallyExplicit.d2a] {} {}
|
||||
// CHECK:STDOUT: %ConditionallyExplicit__carbon_thunk.decl.3d8900.1: %ConditionallyExplicit__carbon_thunk.type.c43f84.1 = fn_decl @ConditionallyExplicit__carbon_thunk.1 [concrete = constants.%ConditionallyExplicit__carbon_thunk.379b04.1] {
|
||||
// CHECK:STDOUT: <elided>
|
||||
// CHECK:STDOUT: } {
|
||||
@@ -370,7 +370,7 @@ fn ConversionExplicit(s: Cpp.ConditionallyExplicitFalse) {
|
||||
// CHECK:STDOUT: } {
|
||||
// CHECK:STDOUT: <elided>
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: %ConditionallyExplicit.decl.7f9e91.2: type = class_decl @ConditionallyExplicit.2 [concrete = constants.%ConditionallyExplicit.6a9921.2] {} {}
|
||||
// CHECK:STDOUT: %ConditionallyExplicit.decl.80b: type = class_decl @ConditionallyExplicit.2 [concrete = constants.%ConditionallyExplicit.717] {} {}
|
||||
// CHECK:STDOUT: %ConditionallyExplicit__carbon_thunk.decl.3d8900.2: %ConditionallyExplicit__carbon_thunk.type.c43f84.2 = fn_decl @ConditionallyExplicit__carbon_thunk.2 [concrete = constants.%ConditionallyExplicit__carbon_thunk.379b04.2] {
|
||||
// CHECK:STDOUT: <elided>
|
||||
// CHECK:STDOUT: } {
|
||||
@@ -402,34 +402,34 @@ fn ConversionExplicit(s: Cpp.ConditionallyExplicitFalse) {
|
||||
// CHECK:STDOUT: fn @ConstructorNotExplicit(%s.param: %Source) {
|
||||
// CHECK:STDOUT: !entry:
|
||||
// CHECK:STDOUT: name_binding_decl {
|
||||
// CHECK:STDOUT: %_.patt: %pattern_type.dc5fb9.1 = value_binding_pattern _ [concrete]
|
||||
// CHECK:STDOUT: %_.patt: %pattern_type.e92 = value_binding_pattern _ [concrete]
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: %s.ref.loc8: %Source = name_ref s, %s
|
||||
// CHECK:STDOUT: %.loc8_13: type = splice_block %ConditionallyExplicitFalse.ref.loc8 [concrete = constants.%ConditionallyExplicit.6a9921.1] {
|
||||
// CHECK:STDOUT: %.loc8_13: type = splice_block %ConditionallyExplicitFalse.ref.loc8 [concrete = constants.%ConditionallyExplicit.d2a] {
|
||||
// CHECK:STDOUT: %Cpp.ref.loc8: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
|
||||
// CHECK:STDOUT: %ConditionallyExplicitFalse.ref.loc8: type = name_ref ConditionallyExplicitFalse, imports.%ConditionallyExplicit.decl.7f9e91.1 [concrete = constants.%ConditionallyExplicit.6a9921.1]
|
||||
// CHECK:STDOUT: %ConditionallyExplicitFalse.ref.loc8: type = name_ref ConditionallyExplicitFalse, imports.%ConditionallyExplicit.decl.6be [concrete = constants.%ConditionallyExplicit.d2a]
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: %.loc8_43.1: ref %ConditionallyExplicit.6a9921.1 = temporary_storage
|
||||
// CHECK:STDOUT: %.loc8_43.1: ref %ConditionallyExplicit.d2a = temporary_storage
|
||||
// CHECK:STDOUT: %.loc8_43.2: ref %Source = value_as_ref %s.ref.loc8
|
||||
// CHECK:STDOUT: %addr.loc8_43.1: %ptr.f95 = addr_of %.loc8_43.2
|
||||
// CHECK:STDOUT: %addr.loc8_43.2: %ptr.d63e0a.1 = addr_of %.loc8_43.1
|
||||
// CHECK:STDOUT: %addr.loc8_43.1: %ptr.71b = addr_of %.loc8_43.2
|
||||
// CHECK:STDOUT: %addr.loc8_43.2: %ptr.c11 = addr_of %.loc8_43.1
|
||||
// CHECK:STDOUT: %ConditionallyExplicit__carbon_thunk.call.loc8: init %empty_tuple.type = call imports.%ConditionallyExplicit__carbon_thunk.decl.3d8900.1(%addr.loc8_43.1, %addr.loc8_43.2)
|
||||
// CHECK:STDOUT: %.loc8_43.3: init %ConditionallyExplicit.6a9921.1 to %.loc8_43.1 = mark_in_place_init %ConditionallyExplicit__carbon_thunk.call.loc8
|
||||
// CHECK:STDOUT: %.loc8_43.4: init %ConditionallyExplicit.6a9921.1 = converted %s.ref.loc8, %.loc8_43.3
|
||||
// CHECK:STDOUT: %.loc8_43.5: ref %ConditionallyExplicit.6a9921.1 = temporary %.loc8_43.1, %.loc8_43.4
|
||||
// CHECK:STDOUT: %.loc8_43.6: %ConditionallyExplicit.6a9921.1 = acquire_value %.loc8_43.5
|
||||
// CHECK:STDOUT: %_: %ConditionallyExplicit.6a9921.1 = value_binding _, %.loc8_43.6
|
||||
// CHECK:STDOUT: %.loc8_43.3: init %ConditionallyExplicit.d2a to %.loc8_43.1 = mark_in_place_init %ConditionallyExplicit__carbon_thunk.call.loc8
|
||||
// CHECK:STDOUT: %.loc8_43.4: init %ConditionallyExplicit.d2a = converted %s.ref.loc8, %.loc8_43.3
|
||||
// CHECK:STDOUT: %.loc8_43.5: ref %ConditionallyExplicit.d2a = temporary %.loc8_43.1, %.loc8_43.4
|
||||
// CHECK:STDOUT: %.loc8_43.6: %ConditionallyExplicit.d2a = acquire_value %.loc8_43.5
|
||||
// CHECK:STDOUT: %_: %ConditionallyExplicit.d2a = value_binding _, %.loc8_43.6
|
||||
// CHECK:STDOUT: %s.ref.loc9: %Source = name_ref s, %s
|
||||
// CHECK:STDOUT: %Cpp.ref.loc9: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
|
||||
// CHECK:STDOUT: %ConditionallyExplicitFalse.ref.loc9: type = name_ref ConditionallyExplicitFalse, imports.%ConditionallyExplicit.decl.7f9e91.1 [concrete = constants.%ConditionallyExplicit.6a9921.1]
|
||||
// CHECK:STDOUT: %.loc9_5.1: ref %ConditionallyExplicit.6a9921.1 = temporary_storage
|
||||
// CHECK:STDOUT: %ConditionallyExplicitFalse.ref.loc9: type = name_ref ConditionallyExplicitFalse, imports.%ConditionallyExplicit.decl.6be [concrete = constants.%ConditionallyExplicit.d2a]
|
||||
// CHECK:STDOUT: %.loc9_5.1: ref %ConditionallyExplicit.d2a = temporary_storage
|
||||
// CHECK:STDOUT: %.loc9_3: ref %Source = value_as_ref %s.ref.loc9
|
||||
// CHECK:STDOUT: %addr.loc9_5.1: %ptr.f95 = addr_of %.loc9_3
|
||||
// CHECK:STDOUT: %addr.loc9_5.2: %ptr.d63e0a.1 = addr_of %.loc9_5.1
|
||||
// CHECK:STDOUT: %addr.loc9_5.1: %ptr.71b = addr_of %.loc9_3
|
||||
// CHECK:STDOUT: %addr.loc9_5.2: %ptr.c11 = addr_of %.loc9_5.1
|
||||
// CHECK:STDOUT: %ConditionallyExplicit__carbon_thunk.call.loc9: init %empty_tuple.type = call imports.%ConditionallyExplicit__carbon_thunk.decl.3d8900.1(%addr.loc9_5.1, %addr.loc9_5.2)
|
||||
// CHECK:STDOUT: %.loc9_5.2: init %ConditionallyExplicit.6a9921.1 to %.loc9_5.1 = mark_in_place_init %ConditionallyExplicit__carbon_thunk.call.loc9
|
||||
// CHECK:STDOUT: %.loc9_5.3: init %ConditionallyExplicit.6a9921.1 = converted %s.ref.loc9, %.loc9_5.2
|
||||
// CHECK:STDOUT: %.loc9_5.4: ref %ConditionallyExplicit.6a9921.1 = temporary %.loc9_5.1, %.loc9_5.3
|
||||
// CHECK:STDOUT: %.loc9_5.2: init %ConditionallyExplicit.d2a to %.loc9_5.1 = mark_in_place_init %ConditionallyExplicit__carbon_thunk.call.loc9
|
||||
// CHECK:STDOUT: %.loc9_5.3: init %ConditionallyExplicit.d2a = converted %s.ref.loc9, %.loc9_5.2
|
||||
// CHECK:STDOUT: %.loc9_5.4: ref %ConditionallyExplicit.d2a = temporary %.loc9_5.1, %.loc9_5.3
|
||||
// CHECK:STDOUT: <elided>
|
||||
// CHECK:STDOUT: %ConditionallyExplicit.Op.bound.loc9: <bound method> = bound_method %.loc9_5.4, constants.%ConditionallyExplicit.Op.cc70d5.1
|
||||
// CHECK:STDOUT: %Op.ref.loc9: %ConditionallyExplicit.cpp_destructor.type.6ce8c4.1 = name_ref Op, imports.%ConditionallyExplicit.cpp_destructor.decl.6e607d.1 [concrete = constants.%ConditionallyExplicit.cpp_destructor.1ad69a.1]
|
||||
@@ -446,15 +446,15 @@ fn ConversionExplicit(s: Cpp.ConditionallyExplicitFalse) {
|
||||
// CHECK:STDOUT: !entry:
|
||||
// CHECK:STDOUT: %s.ref: %Source = name_ref s, %s
|
||||
// CHECK:STDOUT: %Cpp.ref.loc15: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
|
||||
// CHECK:STDOUT: %ConditionallyExplicitTrue.ref: type = name_ref ConditionallyExplicitTrue, imports.%ConditionallyExplicit.decl.7f9e91.2 [concrete = constants.%ConditionallyExplicit.6a9921.2]
|
||||
// CHECK:STDOUT: %.loc15_5.1: ref %ConditionallyExplicit.6a9921.2 = temporary_storage
|
||||
// CHECK:STDOUT: %ConditionallyExplicitTrue.ref: type = name_ref ConditionallyExplicitTrue, imports.%ConditionallyExplicit.decl.80b [concrete = constants.%ConditionallyExplicit.717]
|
||||
// CHECK:STDOUT: %.loc15_5.1: ref %ConditionallyExplicit.717 = temporary_storage
|
||||
// CHECK:STDOUT: %.loc15_3: ref %Source = value_as_ref %s.ref
|
||||
// CHECK:STDOUT: %addr.loc15_5.1: %ptr.f95 = addr_of %.loc15_3
|
||||
// CHECK:STDOUT: %addr.loc15_5.2: %ptr.d63e0a.2 = addr_of %.loc15_5.1
|
||||
// CHECK:STDOUT: %addr.loc15_5.1: %ptr.71b = addr_of %.loc15_3
|
||||
// CHECK:STDOUT: %addr.loc15_5.2: %ptr.6d5 = addr_of %.loc15_5.1
|
||||
// CHECK:STDOUT: %ConditionallyExplicit__carbon_thunk.call: init %empty_tuple.type = call imports.%ConditionallyExplicit__carbon_thunk.decl.3d8900.2(%addr.loc15_5.1, %addr.loc15_5.2)
|
||||
// CHECK:STDOUT: %.loc15_5.2: init %ConditionallyExplicit.6a9921.2 to %.loc15_5.1 = mark_in_place_init %ConditionallyExplicit__carbon_thunk.call
|
||||
// CHECK:STDOUT: %.loc15_5.3: init %ConditionallyExplicit.6a9921.2 = converted %s.ref, %.loc15_5.2
|
||||
// CHECK:STDOUT: %.loc15_5.4: ref %ConditionallyExplicit.6a9921.2 = temporary %.loc15_5.1, %.loc15_5.3
|
||||
// CHECK:STDOUT: %.loc15_5.2: init %ConditionallyExplicit.717 to %.loc15_5.1 = mark_in_place_init %ConditionallyExplicit__carbon_thunk.call
|
||||
// CHECK:STDOUT: %.loc15_5.3: init %ConditionallyExplicit.717 = converted %s.ref, %.loc15_5.2
|
||||
// CHECK:STDOUT: %.loc15_5.4: ref %ConditionallyExplicit.717 = temporary %.loc15_5.1, %.loc15_5.3
|
||||
// CHECK:STDOUT: <elided>
|
||||
// CHECK:STDOUT: %ConditionallyExplicit.Op.bound: <bound method> = bound_method %.loc15_5.4, constants.%ConditionallyExplicit.Op.cc70d5.2
|
||||
// CHECK:STDOUT: %Op.ref: %ConditionallyExplicit.cpp_destructor.type.6ce8c4.2 = name_ref Op, imports.%ConditionallyExplicit.cpp_destructor.decl.6e607d.2 [concrete = constants.%ConditionallyExplicit.cpp_destructor.1ad69a.2]
|
||||
@@ -463,31 +463,31 @@ fn ConversionExplicit(s: Cpp.ConditionallyExplicitFalse) {
|
||||
// CHECK:STDOUT: <elided>
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @ConversionNotExplicit(%s.param: %ConditionallyExplicit.6a9921.1) {
|
||||
// CHECK:STDOUT: fn @ConversionNotExplicit(%s.param: %ConditionallyExplicit.d2a) {
|
||||
// CHECK:STDOUT: !entry:
|
||||
// CHECK:STDOUT: name_binding_decl {
|
||||
// CHECK:STDOUT: %_.patt: %pattern_type.a9f = value_binding_pattern _ [concrete]
|
||||
// CHECK:STDOUT: %_.patt: %pattern_type.56d = value_binding_pattern _ [concrete]
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: %s.ref.loc21: %ConditionallyExplicit.6a9921.1 = name_ref s, %s
|
||||
// CHECK:STDOUT: %s.ref.loc21: %ConditionallyExplicit.d2a = name_ref s, %s
|
||||
// CHECK:STDOUT: %.loc21_13: type = splice_block %Dest.ref.loc21 [concrete = constants.%Dest] {
|
||||
// CHECK:STDOUT: %Cpp.ref.loc21: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
|
||||
// CHECK:STDOUT: %Dest.ref.loc21: type = name_ref Dest, imports.%Dest.decl [concrete = constants.%Dest]
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: %ConditionallyExplicit.cpp_operator.bound.loc21: <bound method> = bound_method %s.ref.loc21, imports.%ConditionallyExplicit.cpp_operator.decl
|
||||
// CHECK:STDOUT: %.loc21_21.1: ref %Dest = temporary_storage
|
||||
// CHECK:STDOUT: %addr.loc21: %ptr.7c0 = addr_of %.loc21_21.1
|
||||
// CHECK:STDOUT: %addr.loc21: %ptr.246 = addr_of %.loc21_21.1
|
||||
// CHECK:STDOUT: %Dest__carbon_thunk.call.loc21: init %empty_tuple.type = call imports.%Dest__carbon_thunk.decl(%s.ref.loc21, %addr.loc21)
|
||||
// CHECK:STDOUT: %.loc21_21.2: init %Dest to %.loc21_21.1 = mark_in_place_init %Dest__carbon_thunk.call.loc21
|
||||
// CHECK:STDOUT: %.loc21_21.3: init %Dest = converted %s.ref.loc21, %.loc21_21.2
|
||||
// CHECK:STDOUT: %.loc21_21.4: ref %Dest = temporary %.loc21_21.1, %.loc21_21.3
|
||||
// CHECK:STDOUT: %.loc21_21.5: %Dest = acquire_value %.loc21_21.4
|
||||
// CHECK:STDOUT: %_: %Dest = value_binding _, %.loc21_21.5
|
||||
// CHECK:STDOUT: %s.ref.loc22: %ConditionallyExplicit.6a9921.1 = name_ref s, %s
|
||||
// CHECK:STDOUT: %s.ref.loc22: %ConditionallyExplicit.d2a = name_ref s, %s
|
||||
// CHECK:STDOUT: %Cpp.ref.loc22: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
|
||||
// CHECK:STDOUT: %Dest.ref.loc22: type = name_ref Dest, imports.%Dest.decl [concrete = constants.%Dest]
|
||||
// CHECK:STDOUT: %ConditionallyExplicit.cpp_operator.bound.loc22: <bound method> = bound_method %s.ref.loc22, imports.%ConditionallyExplicit.cpp_operator.decl
|
||||
// CHECK:STDOUT: %.loc22_5.1: ref %Dest = temporary_storage
|
||||
// CHECK:STDOUT: %addr.loc22: %ptr.7c0 = addr_of %.loc22_5.1
|
||||
// CHECK:STDOUT: %addr.loc22: %ptr.246 = addr_of %.loc22_5.1
|
||||
// CHECK:STDOUT: %Dest__carbon_thunk.call.loc22: init %empty_tuple.type = call imports.%Dest__carbon_thunk.decl(%s.ref.loc22, %addr.loc22)
|
||||
// CHECK:STDOUT: %.loc22_5.2: init %Dest to %.loc22_5.1 = mark_in_place_init %Dest__carbon_thunk.call.loc22
|
||||
// CHECK:STDOUT: %.loc22_5.3: init %Dest = converted %s.ref.loc22, %.loc22_5.2
|
||||
@@ -504,14 +504,14 @@ fn ConversionExplicit(s: Cpp.ConditionallyExplicitFalse) {
|
||||
// CHECK:STDOUT: <elided>
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @ConversionExplicit(%s.param: %ConditionallyExplicit.6a9921.1) {
|
||||
// CHECK:STDOUT: fn @ConversionExplicit(%s.param: %ConditionallyExplicit.d2a) {
|
||||
// CHECK:STDOUT: !entry:
|
||||
// CHECK:STDOUT: %s.ref: %ConditionallyExplicit.6a9921.1 = name_ref s, %s
|
||||
// CHECK:STDOUT: %s.ref: %ConditionallyExplicit.d2a = name_ref s, %s
|
||||
// CHECK:STDOUT: %Cpp.ref.loc28: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
|
||||
// CHECK:STDOUT: %Dest.ref: type = name_ref Dest, imports.%Dest.decl [concrete = constants.%Dest]
|
||||
// CHECK:STDOUT: %ConditionallyExplicit.cpp_operator.bound: <bound method> = bound_method %s.ref, imports.%ConditionallyExplicit.cpp_operator.decl
|
||||
// CHECK:STDOUT: %.loc28_5.1: ref %Dest = temporary_storage
|
||||
// CHECK:STDOUT: %addr: %ptr.7c0 = addr_of %.loc28_5.1
|
||||
// CHECK:STDOUT: %addr: %ptr.246 = addr_of %.loc28_5.1
|
||||
// CHECK:STDOUT: %Dest__carbon_thunk.call: init %empty_tuple.type = call imports.%Dest__carbon_thunk.decl(%s.ref, %addr)
|
||||
// CHECK:STDOUT: %.loc28_5.2: init %Dest to %.loc28_5.1 = mark_in_place_init %Dest__carbon_thunk.call
|
||||
// CHECK:STDOUT: %.loc28_5.3: init %Dest = converted %s.ref, %.loc28_5.2
|
||||
@@ -528,14 +528,14 @@ fn ConversionExplicit(s: Cpp.ConditionallyExplicitFalse) {
|
||||
// CHECK:STDOUT: constants {
|
||||
// CHECK:STDOUT: %Source: type = class_type @Source [concrete]
|
||||
// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete]
|
||||
// CHECK:STDOUT: %ConditionallyExplicit.6a9921.1: type = class_type @ConditionallyExplicit.1 [concrete]
|
||||
// CHECK:STDOUT: %pattern_type.dc5fb9.1: type = pattern_type %ConditionallyExplicit.6a9921.1 [concrete]
|
||||
// CHECK:STDOUT: %ConditionallyExplicit.6a9921.2: type = class_type @ConditionallyExplicit.2 [concrete]
|
||||
// CHECK:STDOUT: %Dest.058: type = class_type @Dest [concrete]
|
||||
// CHECK:STDOUT: %pattern_type.a9f: type = pattern_type %Dest.058 [concrete]
|
||||
// CHECK:STDOUT: %ConditionallyExplicit.717: type = class_type @ConditionallyExplicit.1 [concrete]
|
||||
// CHECK:STDOUT: %pattern_type.e0f: type = pattern_type %ConditionallyExplicit.717 [concrete]
|
||||
// CHECK:STDOUT: %ConditionallyExplicit.d2a: type = class_type @ConditionallyExplicit.2 [concrete]
|
||||
// CHECK:STDOUT: %Dest.b15: type = class_type @Dest [concrete]
|
||||
// CHECK:STDOUT: %pattern_type.56d: type = pattern_type %Dest.b15 [concrete]
|
||||
// CHECK:STDOUT: %ConditionallyExplicit.cpp_operator.type: type = fn_type @ConditionallyExplicit.cpp_operator [concrete]
|
||||
// CHECK:STDOUT: %ConditionallyExplicit.cpp_operator: %ConditionallyExplicit.cpp_operator.type = struct_value () [concrete]
|
||||
// CHECK:STDOUT: %ptr.7c0: type = ptr_type %Dest.058 [concrete]
|
||||
// CHECK:STDOUT: %ptr.246: type = ptr_type %Dest.b15 [concrete]
|
||||
// CHECK:STDOUT: %Dest__carbon_thunk.type: type = fn_type @Dest__carbon_thunk [concrete]
|
||||
// CHECK:STDOUT: %Dest__carbon_thunk: %Dest__carbon_thunk.type = struct_value () [concrete]
|
||||
// CHECK:STDOUT: %Dest.cpp_destructor.type: type = fn_type @Dest.cpp_destructor [concrete]
|
||||
@@ -547,15 +547,15 @@ fn ConversionExplicit(s: Cpp.ConditionallyExplicitFalse) {
|
||||
// CHECK:STDOUT: imports {
|
||||
// CHECK:STDOUT: %Cpp: <namespace> = namespace file.%Cpp.import_cpp, [concrete] {
|
||||
// CHECK:STDOUT: .Source = %Source.decl
|
||||
// CHECK:STDOUT: .ConditionallyExplicitTrue = %ConditionallyExplicit.decl.7f9e91.1
|
||||
// CHECK:STDOUT: .ConditionallyExplicitFalse = %ConditionallyExplicit.decl.7f9e91.2
|
||||
// CHECK:STDOUT: .ConditionallyExplicitTrue = %ConditionallyExplicit.decl.80b
|
||||
// CHECK:STDOUT: .ConditionallyExplicitFalse = %ConditionallyExplicit.decl.6be
|
||||
// CHECK:STDOUT: .Dest = %Dest.decl
|
||||
// CHECK:STDOUT: import Cpp//...
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: %Source.decl: type = class_decl @Source [concrete = constants.%Source] {} {}
|
||||
// CHECK:STDOUT: %ConditionallyExplicit.decl.7f9e91.1: type = class_decl @ConditionallyExplicit.1 [concrete = constants.%ConditionallyExplicit.6a9921.1] {} {}
|
||||
// CHECK:STDOUT: %ConditionallyExplicit.decl.7f9e91.2: type = class_decl @ConditionallyExplicit.2 [concrete = constants.%ConditionallyExplicit.6a9921.2] {} {}
|
||||
// CHECK:STDOUT: %Dest.decl: type = class_decl @Dest [concrete = constants.%Dest.058] {} {}
|
||||
// CHECK:STDOUT: %ConditionallyExplicit.decl.80b: type = class_decl @ConditionallyExplicit.1 [concrete = constants.%ConditionallyExplicit.717] {} {}
|
||||
// CHECK:STDOUT: %ConditionallyExplicit.decl.6be: type = class_decl @ConditionallyExplicit.2 [concrete = constants.%ConditionallyExplicit.d2a] {} {}
|
||||
// CHECK:STDOUT: %Dest.decl: type = class_decl @Dest [concrete = constants.%Dest.b15] {} {}
|
||||
// CHECK:STDOUT: %ConditionallyExplicit.cpp_operator.decl: %ConditionallyExplicit.cpp_operator.type = fn_decl @ConditionallyExplicit.cpp_operator [concrete = constants.%ConditionallyExplicit.cpp_operator] {
|
||||
// CHECK:STDOUT: <elided>
|
||||
// CHECK:STDOUT: } {
|
||||
@@ -576,37 +576,37 @@ fn ConversionExplicit(s: Cpp.ConditionallyExplicitFalse) {
|
||||
// CHECK:STDOUT: fn @ConstructorExplicit(%s.param: %Source) {
|
||||
// CHECK:STDOUT: !entry:
|
||||
// CHECK:STDOUT: name_binding_decl {
|
||||
// CHECK:STDOUT: %_.patt: %pattern_type.dc5fb9.1 = value_binding_pattern _ [concrete]
|
||||
// CHECK:STDOUT: %_.patt: %pattern_type.e0f = value_binding_pattern _ [concrete]
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: %s.ref: %Source = name_ref s, %s
|
||||
// CHECK:STDOUT: %.loc15_13: type = splice_block %ConditionallyExplicitTrue.ref [concrete = constants.%ConditionallyExplicit.6a9921.1] {
|
||||
// CHECK:STDOUT: %.loc15_13: type = splice_block %ConditionallyExplicitTrue.ref [concrete = constants.%ConditionallyExplicit.717] {
|
||||
// CHECK:STDOUT: %Cpp.ref.loc15: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
|
||||
// CHECK:STDOUT: %ConditionallyExplicitTrue.ref: type = name_ref ConditionallyExplicitTrue, imports.%ConditionallyExplicit.decl.7f9e91.1 [concrete = constants.%ConditionallyExplicit.6a9921.1]
|
||||
// CHECK:STDOUT: %ConditionallyExplicitTrue.ref: type = name_ref ConditionallyExplicitTrue, imports.%ConditionallyExplicit.decl.80b [concrete = constants.%ConditionallyExplicit.717]
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: %.loc15_42: %ConditionallyExplicit.6a9921.1 = converted %s.ref, <error> [concrete = <error>]
|
||||
// CHECK:STDOUT: %_: %ConditionallyExplicit.6a9921.1 = value_binding _, <error> [concrete = <error>]
|
||||
// CHECK:STDOUT: %.loc15_42: %ConditionallyExplicit.717 = converted %s.ref, <error> [concrete = <error>]
|
||||
// CHECK:STDOUT: %_: %ConditionallyExplicit.717 = value_binding _, <error> [concrete = <error>]
|
||||
// CHECK:STDOUT: <elided>
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @ConversionExplicit(%s.param: %ConditionallyExplicit.6a9921.2) {
|
||||
// CHECK:STDOUT: fn @ConversionExplicit(%s.param: %ConditionallyExplicit.d2a) {
|
||||
// CHECK:STDOUT: !entry:
|
||||
// CHECK:STDOUT: name_binding_decl {
|
||||
// CHECK:STDOUT: %_.patt: %pattern_type.a9f = value_binding_pattern _ [concrete]
|
||||
// CHECK:STDOUT: %_.patt: %pattern_type.56d = value_binding_pattern _ [concrete]
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: %s.ref: %ConditionallyExplicit.6a9921.2 = name_ref s, %s
|
||||
// CHECK:STDOUT: %.loc21_13: type = splice_block %Dest.ref [concrete = constants.%Dest.058] {
|
||||
// CHECK:STDOUT: %s.ref: %ConditionallyExplicit.d2a = name_ref s, %s
|
||||
// CHECK:STDOUT: %.loc21_13: type = splice_block %Dest.ref [concrete = constants.%Dest.b15] {
|
||||
// CHECK:STDOUT: %Cpp.ref.loc21: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
|
||||
// CHECK:STDOUT: %Dest.ref: type = name_ref Dest, imports.%Dest.decl [concrete = constants.%Dest.058]
|
||||
// CHECK:STDOUT: %Dest.ref: type = name_ref Dest, imports.%Dest.decl [concrete = constants.%Dest.b15]
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: %ConditionallyExplicit.cpp_operator.bound: <bound method> = bound_method %s.ref, imports.%ConditionallyExplicit.cpp_operator.decl
|
||||
// CHECK:STDOUT: %.loc21_21.1: ref %Dest.058 = temporary_storage
|
||||
// CHECK:STDOUT: %addr: %ptr.7c0 = addr_of %.loc21_21.1
|
||||
// CHECK:STDOUT: %.loc21_21.1: ref %Dest.b15 = temporary_storage
|
||||
// CHECK:STDOUT: %addr: %ptr.246 = addr_of %.loc21_21.1
|
||||
// CHECK:STDOUT: %Dest__carbon_thunk.call: init %empty_tuple.type = call imports.%Dest__carbon_thunk.decl(%s.ref, %addr)
|
||||
// CHECK:STDOUT: %.loc21_21.2: init %Dest.058 to %.loc21_21.1 = mark_in_place_init %Dest__carbon_thunk.call
|
||||
// CHECK:STDOUT: %.loc21_21.3: init %Dest.058 = converted %s.ref, %.loc21_21.2
|
||||
// CHECK:STDOUT: %.loc21_21.4: ref %Dest.058 = temporary %.loc21_21.1, %.loc21_21.3
|
||||
// CHECK:STDOUT: %.loc21_21.5: %Dest.058 = acquire_value %.loc21_21.4
|
||||
// CHECK:STDOUT: %_: %Dest.058 = value_binding _, %.loc21_21.5
|
||||
// CHECK:STDOUT: %.loc21_21.2: init %Dest.b15 to %.loc21_21.1 = mark_in_place_init %Dest__carbon_thunk.call
|
||||
// CHECK:STDOUT: %.loc21_21.3: init %Dest.b15 = converted %s.ref, %.loc21_21.2
|
||||
// CHECK:STDOUT: %.loc21_21.4: ref %Dest.b15 = temporary %.loc21_21.1, %.loc21_21.3
|
||||
// CHECK:STDOUT: %.loc21_21.5: %Dest.b15 = acquire_value %.loc21_21.4
|
||||
// CHECK:STDOUT: %_: %Dest.b15 = value_binding _, %.loc21_21.5
|
||||
// CHECK:STDOUT: <elided>
|
||||
// CHECK:STDOUT: %Dest.Op.bound: <bound method> = bound_method %.loc21_21.4, constants.%Dest.Op
|
||||
// CHECK:STDOUT: %Op.ref: %Dest.cpp_destructor.type = name_ref Op, imports.%Dest.cpp_destructor.decl [concrete = constants.%Dest.cpp_destructor]
|
||||
|
||||
Reference in New Issue
Block a user