Lower CppOverloadSetValue (#6101)

Following up on comments from
[#5891](https://github.com/carbon-language/carbon-lang/pull/5891) ([
1](https://github.com/carbon-language/carbon-lang/pull/5891#discussion_r2317244981),
[2](https://github.com/carbon-language/carbon-lang/pull/5891#discussion_r2317266756)).

Lowering `CppOverloadSetValue` as an empty struct value, using
`context.GetLiteralAsValue()`. Also changed its constant kind to
`InstConstantKind::Always`.

Part of https://github.com/carbon-language/carbon-lang/issues/5915
This commit is contained in:
Ivana Ivanovska
2025-10-01 16:25:05 +00:00
committed by GitHub
parent 4a6376cf59
commit a24598f069
40 changed files with 838 additions and 698 deletions
@@ -117,7 +117,7 @@ fn Call() {
// CHECK:STDOUT: constants {
// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete]
// CHECK:STDOUT: %.490: type = cpp_overload_set_type @Int.as.ImplicitAs.impl.Convert [concrete]
// CHECK:STDOUT: %empty_struct.a89: %.490 = struct_value () [concrete]
// CHECK:STDOUT: %.7c0: %.490 = cpp_overload_set_value @Int.as.ImplicitAs.impl.Convert [concrete]
// CHECK:STDOUT: %int_1.5b8: Core.IntLiteral = int_value 1 [concrete]
// CHECK:STDOUT: %int_2.ecc: Core.IntLiteral = int_value 2 [concrete]
// CHECK:STDOUT: %int_3.1ba: Core.IntLiteral = int_value 3 [concrete]
@@ -153,16 +153,16 @@ fn Call() {
// CHECK:STDOUT: %X: type = class_type @X [concrete]
// CHECK:STDOUT: %X.val: %X = struct_value () [concrete]
// CHECK:STDOUT: %.ed9: type = cpp_overload_set_type @X.B [concrete]
// CHECK:STDOUT: %empty_struct.61d: %.ed9 = struct_value () [concrete]
// CHECK:STDOUT: %.8ab: %.ed9 = cpp_overload_set_value @X.B [concrete]
// CHECK:STDOUT: %ptr.1f9: type = ptr_type %X [concrete]
// CHECK:STDOUT: %X.B.type: type = fn_type @X.B [concrete]
// CHECK:STDOUT: %X.B: %X.B.type = struct_value () [concrete]
// CHECK:STDOUT: %.ce5: type = cpp_overload_set_type @X.C [concrete]
// CHECK:STDOUT: %empty_struct.a7d: %.ce5 = struct_value () [concrete]
// CHECK:STDOUT: %.7af: %.ce5 = cpp_overload_set_value @X.C [concrete]
// CHECK:STDOUT: %X.C.type: type = fn_type @X.C [concrete]
// CHECK:STDOUT: %X.C: %X.C.type = struct_value () [concrete]
// CHECK:STDOUT: %.c13: type = cpp_overload_set_type @X.D [concrete]
// CHECK:STDOUT: %empty_struct.576: %.c13 = struct_value () [concrete]
// CHECK:STDOUT: %.7b7: %.c13 = cpp_overload_set_value @X.D [concrete]
// CHECK:STDOUT: %D__carbon_thunk.type: type = fn_type @D__carbon_thunk [concrete]
// CHECK:STDOUT: %D__carbon_thunk: %D__carbon_thunk.type = struct_value () [concrete]
// CHECK:STDOUT: %type_where: type = facet_type <type where .Self impls <CanDestroy>> [concrete]
@@ -177,7 +177,7 @@ fn Call() {
// CHECK:STDOUT: .X = %X.decl
// CHECK:STDOUT: import Cpp//...
// CHECK:STDOUT: }
// CHECK:STDOUT: %.7c0: %.490 = cpp_overload_set_value @Int.as.ImplicitAs.impl.Convert [concrete = constants.%empty_struct.a89]
// CHECK:STDOUT: %.7c0: %.490 = cpp_overload_set_value @Int.as.ImplicitAs.impl.Convert [concrete = constants.%.7c0]
// CHECK:STDOUT: %A.decl: %A.type = fn_decl @A [concrete = constants.%A] {
// CHECK:STDOUT: <elided>
// CHECK:STDOUT: } {
@@ -186,19 +186,19 @@ fn Call() {
// CHECK:STDOUT: %Core.import_ref.ee7: @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert.type (%Core.IntLiteral.as.ImplicitAs.impl.Convert.type.340) = import_ref Core//prelude/parts/int, loc{{\d+_\d+}}, loaded [symbolic = @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert (constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.1c0)]
// CHECK:STDOUT: %ImplicitAs.impl_witness_table.9e9 = impl_witness_table (%Core.import_ref.ee7), @Core.IntLiteral.as.ImplicitAs.impl [concrete]
// CHECK:STDOUT: %X.decl: type = class_decl @X [concrete = constants.%X] {} {}
// CHECK:STDOUT: %.8ab: %.ed9 = cpp_overload_set_value @X.B [concrete = constants.%empty_struct.61d]
// CHECK:STDOUT: %.8ab: %.ed9 = cpp_overload_set_value @X.B [concrete = constants.%.8ab]
// CHECK:STDOUT: %X.B.decl: %X.B.type = fn_decl @X.B [concrete = constants.%X.B] {
// CHECK:STDOUT: <elided>
// CHECK:STDOUT: } {
// CHECK:STDOUT: <elided>
// CHECK:STDOUT: }
// CHECK:STDOUT: %.7af: %.ce5 = cpp_overload_set_value @X.C [concrete = constants.%empty_struct.a7d]
// CHECK:STDOUT: %.7af: %.ce5 = cpp_overload_set_value @X.C [concrete = constants.%.7af]
// CHECK:STDOUT: %X.C.decl: %X.C.type = fn_decl @X.C [concrete = constants.%X.C] {
// CHECK:STDOUT: <elided>
// CHECK:STDOUT: } {
// CHECK:STDOUT: <elided>
// CHECK:STDOUT: }
// CHECK:STDOUT: %.7b7: %.c13 = cpp_overload_set_value @X.D [concrete = constants.%empty_struct.576]
// CHECK:STDOUT: %.7b7: %.c13 = cpp_overload_set_value @X.D [concrete = constants.%.7b7]
// CHECK:STDOUT: %D__carbon_thunk.decl: %D__carbon_thunk.type = fn_decl @D__carbon_thunk [concrete = constants.%D__carbon_thunk] {
// CHECK:STDOUT: <elided>
// CHECK:STDOUT: } {
@@ -209,7 +209,7 @@ fn Call() {
// CHECK:STDOUT: fn @Call() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %Cpp.ref.loc8: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
// CHECK:STDOUT: %A.ref: %.490 = name_ref A, imports.%.7c0 [concrete = constants.%empty_struct.a89]
// CHECK:STDOUT: %A.ref: %.490 = name_ref A, imports.%.7c0 [concrete = constants.%.7c0]
// CHECK:STDOUT: %int_1.loc8: Core.IntLiteral = int_value 1 [concrete = constants.%int_1.5b8]
// CHECK:STDOUT: %int_2.loc8: Core.IntLiteral = int_value 2 [concrete = constants.%int_2.ecc]
// CHECK:STDOUT: %int_3: Core.IntLiteral = int_value 3 [concrete = constants.%int_3.1ba]
@@ -250,7 +250,7 @@ fn Call() {
// CHECK:STDOUT: %.loc9_5.3: init %X = class_init (), %.loc9_5.2 [concrete = constants.%X.val]
// CHECK:STDOUT: %.loc9_5.4: ref %X = temporary %.loc9_5.2, %.loc9_5.3
// CHECK:STDOUT: %.loc9_7: ref %X = converted %.loc9_5.1, %.loc9_5.4
// CHECK:STDOUT: %B.ref: %.ed9 = name_ref B, imports.%.8ab [concrete = constants.%empty_struct.61d]
// CHECK:STDOUT: %B.ref: %.ed9 = name_ref B, imports.%.8ab [concrete = constants.%.8ab]
// CHECK:STDOUT: %bound_method.loc9_16: <bound method> = bound_method %.loc9_7, %B.ref
// CHECK:STDOUT: %int_1.loc9: Core.IntLiteral = int_value 1 [concrete = constants.%int_1.5b8]
// CHECK:STDOUT: %int_2.loc9: Core.IntLiteral = int_value 2 [concrete = constants.%int_2.ecc]
@@ -272,7 +272,7 @@ fn Call() {
// CHECK:STDOUT: %X.B.call: init %empty_tuple.type = call imports.%X.B.decl(%addr.loc9_7, %.loc9_19.2, %.loc9_22.2)
// CHECK:STDOUT: %Cpp.ref.loc10: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
// CHECK:STDOUT: %X.ref.loc10: type = name_ref X, imports.%X.decl [concrete = constants.%X]
// CHECK:STDOUT: %C.ref: %.ce5 = name_ref C, imports.%.7af [concrete = constants.%empty_struct.a7d]
// CHECK:STDOUT: %C.ref: %.ce5 = name_ref C, imports.%.7af [concrete = constants.%.7af]
// CHECK:STDOUT: %int_1.loc10: Core.IntLiteral = int_value 1 [concrete = constants.%int_1.5b8]
// CHECK:STDOUT: %int_2.loc10: Core.IntLiteral = int_value 2 [concrete = constants.%int_2.ecc]
// CHECK:STDOUT: %impl.elem0.loc10_11: %.1df = impl_witness_access constants.%ImplicitAs.impl_witness.204, element0 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.0f0]
@@ -297,7 +297,7 @@ fn Call() {
// CHECK:STDOUT: %.loc11_5.3: init %X = class_init (), %.loc11_5.2 [concrete = constants.%X.val]
// CHECK:STDOUT: %.loc11_5.4: ref %X = temporary %.loc11_5.2, %.loc11_5.3
// CHECK:STDOUT: %.loc11_7.1: ref %X = converted %.loc11_5.1, %.loc11_5.4
// CHECK:STDOUT: %D.ref: %.c13 = name_ref D, imports.%.7b7 [concrete = constants.%empty_struct.576]
// CHECK:STDOUT: %D.ref: %.c13 = name_ref D, imports.%.7b7 [concrete = constants.%.7b7]
// CHECK:STDOUT: %bound_method.loc11_16: <bound method> = bound_method %.loc11_7.1, %D.ref
// CHECK:STDOUT: %int_1.loc11: Core.IntLiteral = int_value 1 [concrete = constants.%int_1.5b8]
// CHECK:STDOUT: %int_2.loc11: Core.IntLiteral = int_value 2 [concrete = constants.%int_2.ecc]
@@ -343,7 +343,7 @@ fn Call() {
// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete]
// CHECK:STDOUT: %Call: %Call.type = struct_value () [concrete]
// CHECK:STDOUT: %.490: type = cpp_overload_set_type @Core.IntLiteral.as.ImplicitAs.impl.Convert [concrete]
// CHECK:STDOUT: %empty_struct.a89: %.490 = struct_value () [concrete]
// CHECK:STDOUT: %.7c0: %.490 = cpp_overload_set_value @Core.IntLiteral.as.ImplicitAs.impl.Convert [concrete]
// CHECK:STDOUT: %int_1.5b8: Core.IntLiteral = int_value 1 [concrete]
// CHECK:STDOUT: %int_2.ecc: Core.IntLiteral = int_value 2 [concrete]
// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete]
@@ -383,17 +383,17 @@ fn Call() {
// CHECK:STDOUT: %complete_type.357: <witness> = complete_type_witness %empty_struct_type [concrete]
// CHECK:STDOUT: %X.val: %X = struct_value () [concrete]
// CHECK:STDOUT: %.ed9: type = cpp_overload_set_type @Int.as.ImplicitAs.impl.Convert [concrete]
// CHECK:STDOUT: %empty_struct.61d: %.ed9 = struct_value () [concrete]
// CHECK:STDOUT: %.8ab: %.ed9 = cpp_overload_set_value @Int.as.ImplicitAs.impl.Convert [concrete]
// CHECK:STDOUT: %ptr.1f9: type = ptr_type %X [concrete]
// CHECK:STDOUT: %pattern_type.45c: type = pattern_type %ptr.1f9 [concrete]
// CHECK:STDOUT: %B__carbon_thunk.type: type = fn_type @B__carbon_thunk [concrete]
// CHECK:STDOUT: %B__carbon_thunk: %B__carbon_thunk.type = struct_value () [concrete]
// CHECK:STDOUT: %.ce5: type = cpp_overload_set_type @A.2 [concrete]
// CHECK:STDOUT: %empty_struct.a7d: %.ce5 = struct_value () [concrete]
// CHECK:STDOUT: %.7af: %.ce5 = cpp_overload_set_value @A.2 [concrete]
// CHECK:STDOUT: %C__carbon_thunk.type: type = fn_type @C__carbon_thunk [concrete]
// CHECK:STDOUT: %C__carbon_thunk: %C__carbon_thunk.type = struct_value () [concrete]
// CHECK:STDOUT: %.c13: type = cpp_overload_set_type @A__carbon_thunk.2 [concrete]
// CHECK:STDOUT: %empty_struct.576: %.c13 = struct_value () [concrete]
// CHECK:STDOUT: %.7b7: %.c13 = cpp_overload_set_value @A__carbon_thunk.2 [concrete]
// CHECK:STDOUT: %D__carbon_thunk.type: type = fn_type @D__carbon_thunk [concrete]
// CHECK:STDOUT: %D__carbon_thunk: %D__carbon_thunk.type = struct_value () [concrete]
// CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete]
@@ -417,7 +417,7 @@ fn Call() {
// CHECK:STDOUT: .X = %X.decl
// CHECK:STDOUT: import Cpp//...
// CHECK:STDOUT: }
// CHECK:STDOUT: %.7c0: %.490 = cpp_overload_set_value @Core.IntLiteral.as.ImplicitAs.impl.Convert [concrete = constants.%empty_struct.a89]
// CHECK:STDOUT: %.7c0: %.490 = cpp_overload_set_value @Core.IntLiteral.as.ImplicitAs.impl.Convert [concrete = constants.%.7c0]
// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/parts/int, Int, loaded [concrete = constants.%Int.generic]
// CHECK:STDOUT: %A__carbon_thunk.decl.713db8.1: %A__carbon_thunk.type.f1e093.1 = fn_decl @A__carbon_thunk.1 [concrete = constants.%A__carbon_thunk.8f654e.1] {
// CHECK:STDOUT: %a.patt: %pattern_type.7ce = binding_pattern a [concrete]
@@ -469,7 +469,7 @@ fn Call() {
// CHECK:STDOUT: %c: %i32 = bind_name c, %c.param
// CHECK:STDOUT: }
// CHECK:STDOUT: %X.decl: type = class_decl @X [concrete = constants.%X] {} {}
// CHECK:STDOUT: %.8ab: %.ed9 = cpp_overload_set_value @Int.as.ImplicitAs.impl.Convert [concrete = constants.%empty_struct.61d]
// CHECK:STDOUT: %.8ab: %.ed9 = cpp_overload_set_value @Int.as.ImplicitAs.impl.Convert [concrete = constants.%.8ab]
// CHECK:STDOUT: %B__carbon_thunk.decl: %B__carbon_thunk.type = fn_decl @B__carbon_thunk [concrete = constants.%B__carbon_thunk] {
// CHECK:STDOUT: %this.patt: %pattern_type.45c = binding_pattern this [concrete]
// CHECK:STDOUT: %this.param_patt: %pattern_type.45c = value_param_pattern %this.patt, call_param0 [concrete]
@@ -485,7 +485,7 @@ fn Call() {
// CHECK:STDOUT: }
// CHECK:STDOUT: %a: %i32 = bind_name a, %a.param
// CHECK:STDOUT: }
// CHECK:STDOUT: %.7af: %.ce5 = cpp_overload_set_value @A.2 [concrete = constants.%empty_struct.a7d]
// CHECK:STDOUT: %.7af: %.ce5 = cpp_overload_set_value @A.2 [concrete = constants.%.7af]
// CHECK:STDOUT: %C__carbon_thunk.decl: %C__carbon_thunk.type = fn_decl @C__carbon_thunk [concrete = constants.%C__carbon_thunk] {
// CHECK:STDOUT: %a.patt: %pattern_type.7ce = binding_pattern a [concrete]
// CHECK:STDOUT: %a.param_patt: %pattern_type.7ce = value_param_pattern %a.patt, call_param0 [concrete]
@@ -497,7 +497,7 @@ fn Call() {
// CHECK:STDOUT: }
// CHECK:STDOUT: %a: %i32 = bind_name a, %a.param
// CHECK:STDOUT: }
// CHECK:STDOUT: %.7b7: %.c13 = cpp_overload_set_value @A__carbon_thunk.2 [concrete = constants.%empty_struct.576]
// CHECK:STDOUT: %.7b7: %.c13 = cpp_overload_set_value @A__carbon_thunk.2 [concrete = constants.%.7b7]
// CHECK:STDOUT: %D__carbon_thunk.decl: %D__carbon_thunk.type = fn_decl @D__carbon_thunk [concrete = constants.%D__carbon_thunk] {
// CHECK:STDOUT: %_.patt: %pattern_type.45c = binding_pattern _ [concrete]
// CHECK:STDOUT: %_.param_patt: %pattern_type.45c = value_param_pattern %_.patt, call_param0 [concrete]
@@ -544,7 +544,7 @@ fn Call() {
// CHECK:STDOUT: fn @Call() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %Cpp.ref.loc8: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
// CHECK:STDOUT: %A.ref.loc8: %.490 = name_ref A, imports.%.7c0 [concrete = constants.%empty_struct.a89]
// CHECK:STDOUT: %A.ref.loc8: %.490 = name_ref A, imports.%.7c0 [concrete = constants.%.7c0]
// CHECK:STDOUT: %int_1.loc8: Core.IntLiteral = int_value 1 [concrete = constants.%int_1.5b8]
// CHECK:STDOUT: %int_2.loc8: Core.IntLiteral = int_value 2 [concrete = constants.%int_2.ecc]
// CHECK:STDOUT: %impl.elem0.loc8_9: %.1df = impl_witness_access constants.%ImplicitAs.impl_witness.204, element0 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.0f0]
@@ -563,7 +563,7 @@ fn Call() {
// CHECK:STDOUT: %.loc8_12.2: %i32 = converted %int_2.loc8, %.loc8_12.1 [concrete = constants.%int_2.ef8]
// CHECK:STDOUT: %A__carbon_thunk.call.loc8: init %empty_tuple.type = call imports.%A__carbon_thunk.decl.713db8.1(%.loc8_9.2, %.loc8_12.2)
// CHECK:STDOUT: %Cpp.ref.loc9: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
// CHECK:STDOUT: %A.ref.loc9: %.490 = name_ref A, imports.%.7c0 [concrete = constants.%empty_struct.a89]
// CHECK:STDOUT: %A.ref.loc9: %.490 = name_ref A, imports.%.7c0 [concrete = constants.%.7c0]
// CHECK:STDOUT: %int_1.loc9: Core.IntLiteral = int_value 1 [concrete = constants.%int_1.5b8]
// CHECK:STDOUT: %int_2.loc9: Core.IntLiteral = int_value 2 [concrete = constants.%int_2.ecc]
// CHECK:STDOUT: %int_3: Core.IntLiteral = int_value 3 [concrete = constants.%int_3.1ba]
@@ -596,7 +596,7 @@ fn Call() {
// CHECK:STDOUT: %.loc10_5.3: init %X = class_init (), %.loc10_5.2 [concrete = constants.%X.val]
// CHECK:STDOUT: %.loc10_5.4: ref %X = temporary %.loc10_5.2, %.loc10_5.3
// CHECK:STDOUT: %.loc10_7: ref %X = converted %.loc10_5.1, %.loc10_5.4
// CHECK:STDOUT: %B.ref: %.ed9 = name_ref B, imports.%.8ab [concrete = constants.%empty_struct.61d]
// CHECK:STDOUT: %B.ref: %.ed9 = name_ref B, imports.%.8ab [concrete = constants.%.8ab]
// CHECK:STDOUT: %bound_method.loc10_16: <bound method> = bound_method %.loc10_7, %B.ref
// CHECK:STDOUT: %int_1.loc10: Core.IntLiteral = int_value 1 [concrete = constants.%int_1.5b8]
// CHECK:STDOUT: %addr.loc10_7: %ptr.1f9 = addr_of %.loc10_7
@@ -610,7 +610,7 @@ fn Call() {
// CHECK:STDOUT: %B__carbon_thunk.call: init %empty_tuple.type = call imports.%B__carbon_thunk.decl(%addr.loc10_7, %.loc10_19.2)
// CHECK:STDOUT: %Cpp.ref.loc11: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
// CHECK:STDOUT: %X.ref.loc11: type = name_ref X, imports.%X.decl [concrete = constants.%X]
// CHECK:STDOUT: %C.ref: %.ce5 = name_ref C, imports.%.7af [concrete = constants.%empty_struct.a7d]
// CHECK:STDOUT: %C.ref: %.ce5 = name_ref C, imports.%.7af [concrete = constants.%.7af]
// CHECK:STDOUT: %int_1.loc11: Core.IntLiteral = int_value 1 [concrete = constants.%int_1.5b8]
// CHECK:STDOUT: %impl.elem0.loc11: %.1df = impl_witness_access constants.%ImplicitAs.impl_witness.204, element0 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.0f0]
// CHECK:STDOUT: %bound_method.loc11_11.1: <bound method> = bound_method %int_1.loc11, %impl.elem0.loc11 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.bound.abf]
@@ -627,7 +627,7 @@ fn Call() {
// CHECK:STDOUT: %.loc12_5.3: init %X = class_init (), %.loc12_5.2 [concrete = constants.%X.val]
// CHECK:STDOUT: %.loc12_5.4: ref %X = temporary %.loc12_5.2, %.loc12_5.3
// CHECK:STDOUT: %.loc12_7.1: ref %X = converted %.loc12_5.1, %.loc12_5.4
// CHECK:STDOUT: %D.ref: %.c13 = name_ref D, imports.%.7b7 [concrete = constants.%empty_struct.576]
// CHECK:STDOUT: %D.ref: %.c13 = name_ref D, imports.%.7b7 [concrete = constants.%.7b7]
// CHECK:STDOUT: %bound_method.loc12_16: <bound method> = bound_method %.loc12_7.1, %D.ref
// CHECK:STDOUT: %int_1.loc12: Core.IntLiteral = int_value 1 [concrete = constants.%int_1.5b8]
// CHECK:STDOUT: %.loc12_7.2: %X = bind_value %.loc12_7.1
@@ -683,17 +683,17 @@ fn Call() {
// CHECK:STDOUT: constants {
// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete]
// CHECK:STDOUT: %.490: type = cpp_overload_set_type @<null name> [concrete]
// CHECK:STDOUT: %empty_struct.a89: %.490 = struct_value () [concrete]
// CHECK:STDOUT: %.7c0: %.490 = cpp_overload_set_value @<null name> [concrete]
// CHECK:STDOUT: %int_1: Core.IntLiteral = int_value 1 [concrete]
// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete]
// CHECK:STDOUT: %X: type = class_type @X [concrete]
// CHECK:STDOUT: %X.val: %X = struct_value () [concrete]
// CHECK:STDOUT: %.ed9: type = cpp_overload_set_type @<null name> [concrete]
// CHECK:STDOUT: %empty_struct.61d: %.ed9 = struct_value () [concrete]
// CHECK:STDOUT: %.8ab: %.ed9 = cpp_overload_set_value @<null name> [concrete]
// CHECK:STDOUT: %.ce5: type = cpp_overload_set_type @<null name> [concrete]
// CHECK:STDOUT: %empty_struct.a7d: %.ce5 = struct_value () [concrete]
// CHECK:STDOUT: %.7af: %.ce5 = cpp_overload_set_value @<null name> [concrete]
// CHECK:STDOUT: %.c13: type = cpp_overload_set_type @X [concrete]
// CHECK:STDOUT: %empty_struct.576: %.c13 = struct_value () [concrete]
// CHECK:STDOUT: %.7b7: %.c13 = cpp_overload_set_value @X [concrete]
// CHECK:STDOUT: %type_where: type = facet_type <type where .Self impls <CanDestroy>> [concrete]
// CHECK:STDOUT: %facet_value: %type_where = facet_value %X, () [concrete]
// CHECK:STDOUT: %DestroyT.as_type.as.Destroy.impl.Op.type.d91: type = fn_type @DestroyT.as_type.as.Destroy.impl.Op, @DestroyT.as_type.as.Destroy.impl(%facet_value) [concrete]
@@ -707,20 +707,20 @@ fn Call() {
// CHECK:STDOUT: .X = %X.decl
// CHECK:STDOUT: import Cpp//...
// CHECK:STDOUT: }
// CHECK:STDOUT: %.7c0: %.490 = cpp_overload_set_value @<null name> [concrete = constants.%empty_struct.a89]
// CHECK:STDOUT: %.7c0: %.490 = cpp_overload_set_value @<null name> [concrete = constants.%.7c0]
// CHECK:STDOUT: %X.decl: type = class_decl @X [concrete = constants.%X] {} {}
// CHECK:STDOUT: %.8ab: %.ed9 = cpp_overload_set_value @<null name> [concrete = constants.%empty_struct.61d]
// CHECK:STDOUT: %.7af: %.ce5 = cpp_overload_set_value @<null name> [concrete = constants.%empty_struct.a7d]
// CHECK:STDOUT: %.7b7: %.c13 = cpp_overload_set_value @X [concrete = constants.%empty_struct.576]
// CHECK:STDOUT: %.8ab: %.ed9 = cpp_overload_set_value @<null name> [concrete = constants.%.8ab]
// CHECK:STDOUT: %.7af: %.ce5 = cpp_overload_set_value @<null name> [concrete = constants.%.7af]
// CHECK:STDOUT: %.7b7: %.c13 = cpp_overload_set_value @X [concrete = constants.%.7b7]
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Call() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %Cpp.ref.loc16: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
// CHECK:STDOUT: %A.ref.loc16: %.490 = name_ref A, imports.%.7c0 [concrete = constants.%empty_struct.a89]
// CHECK:STDOUT: %A.ref.loc16: %.490 = name_ref A, imports.%.7c0 [concrete = constants.%.7c0]
// CHECK:STDOUT: %int_1: Core.IntLiteral = int_value 1 [concrete = constants.%int_1]
// CHECK:STDOUT: %Cpp.ref.loc26: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
// CHECK:STDOUT: %A.ref.loc26: %.490 = name_ref A, imports.%.7c0 [concrete = constants.%empty_struct.a89]
// CHECK:STDOUT: %A.ref.loc26: %.490 = name_ref A, imports.%.7c0 [concrete = constants.%.7c0]
// CHECK:STDOUT: %.loc36_5.1: %empty_struct_type = struct_literal ()
// CHECK:STDOUT: %Cpp.ref.loc36: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
// CHECK:STDOUT: %X.ref.loc36: type = name_ref X, imports.%X.decl [concrete = constants.%X]
@@ -728,11 +728,11 @@ fn Call() {
// CHECK:STDOUT: %.loc36_5.3: init %X = class_init (), %.loc36_5.2 [concrete = constants.%X.val]
// CHECK:STDOUT: %.loc36_5.4: ref %X = temporary %.loc36_5.2, %.loc36_5.3
// CHECK:STDOUT: %.loc36_7: ref %X = converted %.loc36_5.1, %.loc36_5.4
// CHECK:STDOUT: %B.ref: %.ed9 = name_ref B, imports.%.8ab [concrete = constants.%empty_struct.61d]
// CHECK:STDOUT: %B.ref: %.ed9 = name_ref B, imports.%.8ab [concrete = constants.%.8ab]
// CHECK:STDOUT: %bound_method.loc36_16: <bound method> = bound_method %.loc36_7, %B.ref
// CHECK:STDOUT: %Cpp.ref.loc46: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
// CHECK:STDOUT: %X.ref.loc46: type = name_ref X, imports.%X.decl [concrete = constants.%X]
// CHECK:STDOUT: %C.ref: %.ce5 = name_ref C, imports.%.7af [concrete = constants.%empty_struct.a7d]
// CHECK:STDOUT: %C.ref: %.ce5 = name_ref C, imports.%.7af [concrete = constants.%.7af]
// CHECK:STDOUT: %.loc56_5.1: %empty_struct_type = struct_literal ()
// CHECK:STDOUT: %Cpp.ref.loc56: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
// CHECK:STDOUT: %X.ref.loc56: type = name_ref X, imports.%X.decl [concrete = constants.%X]
@@ -740,7 +740,7 @@ fn Call() {
// CHECK:STDOUT: %.loc56_5.3: init %X = class_init (), %.loc56_5.2 [concrete = constants.%X.val]
// CHECK:STDOUT: %.loc56_5.4: ref %X = temporary %.loc56_5.2, %.loc56_5.3
// CHECK:STDOUT: %.loc56_7: ref %X = converted %.loc56_5.1, %.loc56_5.4
// CHECK:STDOUT: %D.ref: %.c13 = name_ref D, imports.%.7b7 [concrete = constants.%empty_struct.576]
// CHECK:STDOUT: %D.ref: %.c13 = name_ref D, imports.%.7b7 [concrete = constants.%.7b7]
// CHECK:STDOUT: %bound_method.loc56_16: <bound method> = bound_method %.loc56_7, %D.ref
// CHECK:STDOUT: %facet_value.loc56: %type_where = facet_value constants.%X, () [concrete = constants.%facet_value]
// CHECK:STDOUT: %.loc56_5.5: %type_where = converted constants.%X, %facet_value.loc56 [concrete = constants.%facet_value]