Simplify importing of C++ global variables. (#6565)

Remove the unnecessary two-phase creation of variables in C++ import. We
don't need to create a placeholder and overwrite it here, so stop doing
so.

Also, add the patterns to the imports table and don't create a
NameBindingDecl. The NameBindingDecl would never be used for anything.
This matches what we do when importing a Carbon variable, and improves
the formatted SemIR output.
This commit is contained in:
Richard Smith
2026-01-09 00:16:27 +00:00
committed by GitHub
parent 11d407b4a0
commit ead7803d60
9 changed files with 82 additions and 51 deletions
@@ -1597,6 +1597,8 @@ fn Call(var instance: Cpp.PublicPrivate) {
// CHECK:STDOUT: import Cpp//...
// CHECK:STDOUT: }
// CHECK:STDOUT: %S.decl: type = class_decl @S [concrete = constants.%S] {} {}
// CHECK:STDOUT: %static_data.patt: %pattern_type.7ce = ref_binding_pattern static_data [concrete]
// CHECK:STDOUT: %static_data.var_patt: %pattern_type.7ce = var_pattern %static_data.patt [concrete]
// CHECK:STDOUT: %static_data.var: ref %i32 = var %static_data.var_patt
// CHECK:STDOUT: }
// CHECK:STDOUT:
@@ -1642,6 +1644,8 @@ fn Call(var instance: Cpp.PublicPrivate) {
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: imports {
// CHECK:STDOUT: %static_data.patt: %pattern_type.7ce = ref_binding_pattern static_data [concrete]
// CHECK:STDOUT: %static_data.var_patt: %pattern_type.7ce = var_pattern %static_data.patt [concrete]
// CHECK:STDOUT: %static_data.var: ref %i32 = var %static_data.var_patt
// CHECK:STDOUT: }
// CHECK:STDOUT:
@@ -1693,6 +1697,8 @@ fn Call(var instance: Cpp.PublicPrivate) {
// CHECK:STDOUT: import Cpp//...
// CHECK:STDOUT: }
// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {}
// CHECK:STDOUT: %static_data.patt: %pattern_type.7ce = ref_binding_pattern static_data [concrete]
// CHECK:STDOUT: %static_data.var_patt: %pattern_type.7ce = var_pattern %static_data.patt [concrete]
// CHECK:STDOUT: %static_data.var: ref %i32 = var %static_data.var_patt
// CHECK:STDOUT: }
// CHECK:STDOUT:
@@ -373,6 +373,8 @@ fn MyF(bar: Cpp.Bar(Cpp.X)*);
// CHECK:STDOUT: import Cpp//...
// CHECK:STDOUT: }
// CHECK:STDOUT: %Bar.decl: type = class_decl @Bar [concrete = constants.%Bar] {} {}
// CHECK:STDOUT: %foo.patt: %pattern_type = ref_binding_pattern foo [concrete]
// CHECK:STDOUT: %foo.var_patt: %pattern_type = var_pattern %foo.patt [concrete]
// CHECK:STDOUT: %foo.var: ref %ptr.f68 = var %foo.var_patt
// CHECK:STDOUT: }
// CHECK:STDOUT:
@@ -322,6 +322,8 @@ fn MyF(bar: Cpp.Bar(Cpp.X)*);
// CHECK:STDOUT: import Cpp//...
// CHECK:STDOUT: }
// CHECK:STDOUT: %Bar.decl: type = class_decl @Bar [concrete = constants.%Bar] {} {}
// CHECK:STDOUT: %foo.patt: %pattern_type = ref_binding_pattern foo [concrete]
// CHECK:STDOUT: %foo.var_patt: %pattern_type = var_pattern %foo.patt [concrete]
// CHECK:STDOUT: %foo.var: ref %ptr.f68 = var %foo.var_patt
// CHECK:STDOUT: }
// CHECK:STDOUT:
@@ -166,6 +166,7 @@ fn MyF(a: Cpp.X, b: Cpp.X) -> Cpp.X {
// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete]
// CHECK:STDOUT: %N: Core.IntLiteral = symbolic_binding N, 0 [symbolic]
// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete]
// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete]
// CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete]
// CHECK:STDOUT: %Copy.Op.type: type = fn_type @Copy.Op [concrete]
// CHECK:STDOUT: %Int.as.Copy.impl.Op.type.824: type = fn_type @Int.as.Copy.impl.Op, @Int.as.Copy.impl(%N) [symbolic]
@@ -183,6 +184,8 @@ fn MyF(a: Cpp.X, b: Cpp.X) -> Cpp.X {
// CHECK:STDOUT: .foo = %foo.var
// CHECK:STDOUT: import Cpp//...
// CHECK:STDOUT: }
// CHECK:STDOUT: %foo.patt: %pattern_type.7ce = ref_binding_pattern foo [concrete]
// CHECK:STDOUT: %foo.var_patt: %pattern_type.7ce = var_pattern %foo.patt [concrete]
// CHECK:STDOUT: %foo.var: ref %i32 = var %foo.var_patt [concrete]
// CHECK:STDOUT: %Core.import_ref.18d: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.824) = import_ref Core//prelude/parts/int, loc{{\d+_\d+}}, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.9b9)]
// CHECK:STDOUT: %Copy.impl_witness_table.e76 = impl_witness_table (%Core.import_ref.18d), @Int.as.Copy.impl [concrete]
+9
View File
@@ -102,6 +102,7 @@ fn MyF() {
// CHECK:STDOUT: %ptr.d9e: type = ptr_type %C [concrete]
// CHECK:STDOUT: %pattern_type.a31: type = pattern_type %ptr.d9e [concrete]
// CHECK:STDOUT: %const: type = const_type %ptr.d9e [concrete]
// CHECK:STDOUT: %pattern_type.8ca: type = pattern_type %const [concrete]
// CHECK:STDOUT: %global_ref.var: ref %ptr.d9e = var imports.%global_ref.var_patt [concrete]
// CHECK:STDOUT: }
// CHECK:STDOUT:
@@ -118,8 +119,14 @@ fn MyF() {
// CHECK:STDOUT: import Cpp//...
// CHECK:STDOUT: }
// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {}
// CHECK:STDOUT: %global.patt: %pattern_type.217 = ref_binding_pattern global [concrete]
// CHECK:STDOUT: %global.var_patt: %pattern_type.217 = var_pattern %global.patt [concrete]
// CHECK:STDOUT: %global.var: ref %C = var %global.var_patt [concrete]
// CHECK:STDOUT: %global_ptr.patt: %pattern_type.a31 = ref_binding_pattern global_ptr [concrete]
// CHECK:STDOUT: %global_ptr.var_patt: %pattern_type.a31 = var_pattern %global_ptr.patt [concrete]
// CHECK:STDOUT: %global_ptr.var: ref %ptr.d9e = var %global_ptr.var_patt [concrete]
// CHECK:STDOUT: %global_ref.patt: %pattern_type.8ca = ref_binding_pattern global_ref [concrete]
// CHECK:STDOUT: %global_ref.var_patt: %pattern_type.8ca = var_pattern %global_ref.patt [concrete]
// CHECK:STDOUT: %global_ref.var: ref %const = var %global_ref.var_patt [concrete]
// CHECK:STDOUT: }
// CHECK:STDOUT:
@@ -213,6 +220,8 @@ fn MyF() {
// CHECK:STDOUT: import Cpp//...
// CHECK:STDOUT: }
// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {}
// CHECK:STDOUT: %global.patt: %pattern_type = ref_binding_pattern global [concrete]
// CHECK:STDOUT: %global.var_patt: %pattern_type = var_pattern %global.patt [concrete]
// CHECK:STDOUT: %global.var: ref %C = var %global.var_patt [concrete]
// CHECK:STDOUT: }
// CHECK:STDOUT:
+2
View File
@@ -1023,6 +1023,8 @@ fn F() {
// CHECK:STDOUT: .n = %n.var
// CHECK:STDOUT: import Cpp//...
// CHECK:STDOUT: }
// CHECK:STDOUT: %n.patt: %pattern_type.201 = ref_binding_pattern n [concrete]
// CHECK:STDOUT: %n.var_patt: %pattern_type.201 = var_pattern %n.patt [concrete]
// CHECK:STDOUT: %n.var: ref %f32.97e = var %n.var_patt [concrete]
// CHECK:STDOUT: }
// CHECK:STDOUT:
@@ -42,10 +42,12 @@ let pwb: Cpp.B* = &Cpp.Wrap.r#var(Cpp.B);
// CHECK:STDOUT: %pattern_type.bcf: type = pattern_type %ptr.270 [concrete]
// CHECK:STDOUT: %var.type.230: type = cpp_type_template_type r#var [concrete]
// CHECK:STDOUT: %var.template.326: %var.type.230 = struct_value () [concrete]
// CHECK:STDOUT: %pattern_type.9de: type = pattern_type %A [concrete]
// CHECK:STDOUT: %addr.0b0: %ptr.270 = addr_of imports.%var.var.2f7 [concrete]
// CHECK:STDOUT: %B: type = class_type @B [concrete]
// CHECK:STDOUT: %ptr.a04: type = ptr_type %B [concrete]
// CHECK:STDOUT: %pattern_type.837: type = pattern_type %ptr.a04 [concrete]
// CHECK:STDOUT: %pattern_type.d0f: type = pattern_type %B [concrete]
// CHECK:STDOUT: %addr.324: %ptr.a04 = addr_of imports.%var.var.a15 [concrete]
// CHECK:STDOUT: %Wrap: type = class_type @Wrap [concrete]
// CHECK:STDOUT: %var.type.17b: type = cpp_type_template_type r#var [concrete]
@@ -62,12 +64,20 @@ let pwb: Cpp.B* = &Cpp.Wrap.r#var(Cpp.B);
// CHECK:STDOUT: }
// CHECK:STDOUT: %A.decl: type = class_decl @A [concrete = constants.%A] {} {}
// CHECK:STDOUT: %var.template.326: %var.type.230 = struct_value () [concrete = constants.%var.template.326]
// CHECK:STDOUT: %var.patt.5a2: %pattern_type.9de = ref_binding_pattern r#var [concrete]
// CHECK:STDOUT: %var.var_patt.093: %pattern_type.9de = var_pattern %var.patt.5a2 [concrete]
// CHECK:STDOUT: %var.var.2f7: ref %A = var %var.var_patt.093 [concrete]
// CHECK:STDOUT: %B.decl: type = class_decl @B [concrete = constants.%B] {} {}
// CHECK:STDOUT: %var.patt.7db: %pattern_type.d0f = ref_binding_pattern r#var [concrete]
// CHECK:STDOUT: %var.var_patt.56c: %pattern_type.d0f = var_pattern %var.patt.7db [concrete]
// CHECK:STDOUT: %var.var.a15: ref %B = var %var.var_patt.56c [concrete]
// CHECK:STDOUT: %Wrap.decl: type = class_decl @Wrap [concrete = constants.%Wrap] {} {}
// CHECK:STDOUT: %var.template.df3: %var.type.17b = struct_value () [concrete = constants.%var.template.df3]
// CHECK:STDOUT: %var.patt.022: %pattern_type.9de = ref_binding_pattern r#var [concrete]
// CHECK:STDOUT: %var.var_patt.0cb: %pattern_type.9de = var_pattern %var.patt.022 [concrete]
// CHECK:STDOUT: %var.var.2e6: ref %A = var %var.var_patt.0cb
// CHECK:STDOUT: %var.patt.605: %pattern_type.d0f = ref_binding_pattern r#var [concrete]
// CHECK:STDOUT: %var.var_patt.efb: %pattern_type.d0f = var_pattern %var.patt.605 [concrete]
// CHECK:STDOUT: %var.var.bab: ref %B = var %var.var_patt.efb
// CHECK:STDOUT: }
// CHECK:STDOUT: