Skip to content

Commit b88b53e

Browse files
authored
C++ interop: Add support for importing globals (#6005)
This supports importing globals in the global scope and within namespaces, and support for class static data members. C++ Interop Demo: ```c++ // my_global.h extern int my_global; void inc_my_global(); ``` ```c++ // my_global.cpp #include "my_global.h" int my_global = 5; void inc_my_global() { ++my_global; } ``` ```carbon // main.carbon library "Main"; import Core library "io"; import Cpp library "my_global.h"; fn Run() -> i32 { Core.Print(Cpp.my_global); Cpp.inc_my_global(); Core.Print(Cpp.my_global); return 0; } ``` ```shell $ clang -c my_global.cpp $ bazel-bin/toolchain/carbon compile main.carbon $ bazel-bin/toolchain/carbon link my_global.o main.o --output=demo $ ./demo 5 6 ``` Part of #6006.
1 parent 321891c commit b88b53e

File tree

14 files changed

+561
-131
lines changed

14 files changed

+561
-131
lines changed

toolchain/check/import_cpp.cpp

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#include "toolchain/base/kind_switch.h"
2929
#include "toolchain/check/class.h"
3030
#include "toolchain/check/context.h"
31+
#include "toolchain/check/control_flow.h"
3132
#include "toolchain/check/convert.h"
3233
#include "toolchain/check/cpp_custom_type_mapping.h"
3334
#include "toolchain/check/cpp_thunk.h"
@@ -1844,6 +1845,59 @@ static auto AddDependentUnimportedDecls(const Context& context,
18441845
}
18451846
}
18461847

1848+
static auto ImportVarDecl(Context& context, SemIR::LocId loc_id,
1849+
clang::VarDecl* var_decl) -> SemIR::InstId {
1850+
if (SemIR::InstId existing_inst_id = LookupClangDeclInstId(context, var_decl);
1851+
existing_inst_id.has_value()) {
1852+
return existing_inst_id;
1853+
}
1854+
1855+
// Extract type and name.
1856+
clang::QualType var_type = var_decl->getType();
1857+
SemIR::TypeId var_type_id = MapType(context, loc_id, var_type).type_id;
1858+
if (!var_type_id.has_value()) {
1859+
context.TODO(loc_id, llvm::formatv("Unsupported: var type: {0}",
1860+
var_type.getAsString()));
1861+
return SemIR::ErrorInst::InstId;
1862+
}
1863+
SemIR::NameId var_name_id = AddIdentifierName(context, var_decl->getName());
1864+
1865+
SemIR::VarStorage var_storage{.type_id = var_type_id,
1866+
.pattern_id = SemIR::InstId::None};
1867+
// We can't use the convenience for `AddPlaceholderInstInNoBlock()` with typed
1868+
// nodes because it doesn't support insts with cleanup.
1869+
SemIR::InstId var_storage_inst_id =
1870+
AddPlaceholderInstInNoBlock(context, {loc_id, var_storage});
1871+
1872+
auto clang_decl_id = context.sem_ir().clang_decls().Add(
1873+
{.decl = var_decl, .inst_id = var_storage_inst_id});
1874+
1875+
// Entity name referring to a Clang decl for mangling.
1876+
SemIR::EntityNameId entity_name_id =
1877+
context.entity_names().AddSymbolicBindingName(
1878+
var_name_id, GetParentNameScopeId(context, var_decl),
1879+
SemIR::CompileTimeBindIndex::None, false, clang_decl_id);
1880+
1881+
// Create `BindingPattern` and `VarPattern` in a `NameBindingDecl`.
1882+
context.pattern_block_stack().Push();
1883+
SemIR::TypeId pattern_type_id = GetPatternType(context, var_type_id);
1884+
SemIR::InstId binding_pattern_inst_id = AddPatternInst<SemIR::BindingPattern>(
1885+
context, loc_id,
1886+
{.type_id = pattern_type_id, .entity_name_id = entity_name_id});
1887+
var_storage.pattern_id = AddPatternInst<SemIR::VarPattern>(
1888+
context, Parse::VariablePatternId::None,
1889+
{.type_id = pattern_type_id, .subpattern_id = binding_pattern_inst_id});
1890+
context.imports().push_back(AddInstInNoBlock<SemIR::NameBindingDecl>(
1891+
context, loc_id,
1892+
{.pattern_block_id = context.pattern_block_stack().Pop()}));
1893+
1894+
// Finalize the `VarStorage` instruction.
1895+
ReplaceInstBeforeConstantUse(context, var_storage_inst_id, var_storage);
1896+
context.imports().push_back(var_storage_inst_id);
1897+
1898+
return var_storage_inst_id;
1899+
}
1900+
18471901
// Imports a declaration from Clang to Carbon. Returns the instruction for the
18481902
// new Carbon declaration, which will be an ErrorInst on failure. Assumes all
18491903
// dependencies have already been imported.
@@ -1883,6 +1937,9 @@ static auto ImportDeclAfterDependencies(Context& context, SemIR::LocId loc_id,
18831937
if (auto* enum_const_decl = dyn_cast<clang::EnumConstantDecl>(clang_decl)) {
18841938
return ImportEnumConstantDecl(context, enum_const_decl);
18851939
}
1940+
if (auto* var_decl = dyn_cast<clang::VarDecl>(clang_decl)) {
1941+
return ImportVarDecl(context, loc_id, var_decl);
1942+
}
18861943

18871944
context.TODO(AddImportIRInst(context.sem_ir(), clang_decl->getLocation()),
18881945
llvm::formatv("Unsupported: Declaration type {0}",

toolchain/check/testdata/basics/raw_sem_ir/multifile.carbon

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ fn B() {
9797
// CHECK:STDOUT: name_scope0: {inst: inst14, parent_scope: name_scope<none>, has_error: false, extended_scopes: [], names: {name1: inst16, name0: inst17}}
9898
// CHECK:STDOUT: name_scope1: {inst: inst16, parent_scope: name_scope0, has_error: false, extended_scopes: [], names: {name1: inst22}}
9999
// CHECK:STDOUT: entity_names:
100-
// CHECK:STDOUT: entity_name0: {name: name1, parent_scope: name_scope1, index: -1, is_template: 0}
100+
// CHECK:STDOUT: entity_name0: {name: name1, parent_scope: name_scope1, index: -1, is_template: 0, clang_decl_id: clang_decl_id<none>}
101101
// CHECK:STDOUT: functions:
102102
// CHECK:STDOUT: function0: {name: name0, parent_scope: name_scope0, call_params_id: inst_block_empty, body: [inst_block5]}
103103
// CHECK:STDOUT: function1: {name: name1, parent_scope: name_scope1}

toolchain/check/testdata/basics/raw_sem_ir/multifile_with_textual_ir.carbon

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ fn B() {
116116
// CHECK:STDOUT: name_scope0: {inst: inst14, parent_scope: name_scope<none>, has_error: false, extended_scopes: [], names: {name1: inst16, name0: inst17}}
117117
// CHECK:STDOUT: name_scope1: {inst: inst16, parent_scope: name_scope0, has_error: false, extended_scopes: [], names: {name1: inst22}}
118118
// CHECK:STDOUT: entity_names:
119-
// CHECK:STDOUT: entity_name0: {name: name1, parent_scope: name_scope1, index: -1, is_template: 0}
119+
// CHECK:STDOUT: entity_name0: {name: name1, parent_scope: name_scope1, index: -1, is_template: 0, clang_decl_id: clang_decl_id<none>}
120120
// CHECK:STDOUT: functions:
121121
// CHECK:STDOUT: function0: {name: name0, parent_scope: name_scope0, call_params_id: inst_block_empty, body: [inst_block5]}
122122
// CHECK:STDOUT: function1: {name: name1, parent_scope: name_scope1}

toolchain/check/testdata/basics/raw_sem_ir/one_file.carbon

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@ fn Foo[T:! type](n: T) -> (T, ()) {
2727
// CHECK:STDOUT: name_scopes:
2828
// CHECK:STDOUT: name_scope0: {inst: inst14, parent_scope: name_scope<none>, has_error: false, extended_scopes: [], names: {name0: inst45}}
2929
// CHECK:STDOUT: entity_names:
30-
// CHECK:STDOUT: entity_name0: {name: name(PeriodSelf), parent_scope: name_scope<none>, index: -1, is_template: 0}
31-
// CHECK:STDOUT: entity_name1: {name: name1, parent_scope: name_scope<none>, index: 0, is_template: 0}
32-
// CHECK:STDOUT: entity_name2: {name: name2, parent_scope: name_scope<none>, index: -1, is_template: 0}
30+
// CHECK:STDOUT: entity_name0: {name: name(PeriodSelf), parent_scope: name_scope<none>, index: -1, is_template: 0, clang_decl_id: clang_decl_id<none>}
31+
// CHECK:STDOUT: entity_name1: {name: name1, parent_scope: name_scope<none>, index: 0, is_template: 0, clang_decl_id: clang_decl_id<none>}
32+
// CHECK:STDOUT: entity_name2: {name: name2, parent_scope: name_scope<none>, index: -1, is_template: 0, clang_decl_id: clang_decl_id<none>}
3333
// CHECK:STDOUT: functions:
3434
// CHECK:STDOUT: function0: {name: name0, parent_scope: name_scope0, call_params_id: inst_block13, return_slot_pattern: inst41, body: [inst_block20]}
3535
// CHECK:STDOUT: classes: {}

toolchain/check/testdata/basics/raw_sem_ir/one_file_with_textual_ir.carbon

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ fn Foo(n: ()) -> ((), ()) {
2727
// CHECK:STDOUT: name_scopes:
2828
// CHECK:STDOUT: name_scope0: {inst: inst14, parent_scope: name_scope<none>, has_error: false, extended_scopes: [], names: {name0: inst37}}
2929
// CHECK:STDOUT: entity_names:
30-
// CHECK:STDOUT: entity_name0: {name: name1, parent_scope: name_scope<none>, index: -1, is_template: 0}
30+
// CHECK:STDOUT: entity_name0: {name: name1, parent_scope: name_scope<none>, index: -1, is_template: 0, clang_decl_id: clang_decl_id<none>}
3131
// CHECK:STDOUT: functions:
3232
// CHECK:STDOUT: function0: {name: name0, parent_scope: name_scope0, call_params_id: inst_block9, return_slot_pattern: inst32, body: [inst_block12]}
3333
// CHECK:STDOUT: classes: {}

toolchain/check/testdata/interop/cpp/class/class.carbon

Lines changed: 14 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -114,26 +114,18 @@ fn MyF() {
114114

115115
class Bar {
116116
public:
117-
static Bar* foo;
117+
static Bar* _Nonnull foo;
118118
};
119119

120-
// --- fail_todo_import_static_data_member.carbon
120+
// --- import_static_data_member.carbon
121121

122122
library "[[@TEST_NAME]]";
123123

124-
// CHECK:STDERR: fail_todo_import_static_data_member.carbon:[[@LINE+4]]:10: in file included here [InCppInclude]
125-
// CHECK:STDERR: ./static_data_member.h:4:15: error: semantics TODO: `Unsupported: Declaration type Var` [SemanticsTodo]
126-
// CHECK:STDERR: static Bar* foo;
127-
// CHECK:STDERR: ^
128124
import Cpp library "static_data_member.h";
129125

130126
fn MyF() {
131127
//@dump-sem-ir-begin
132-
// CHECK:STDERR: fail_todo_import_static_data_member.carbon:[[@LINE+4]]:23: note: in `Cpp` name lookup for `foo` [InCppNameLookup]
133-
// CHECK:STDERR: let bar: Cpp.Bar* = Cpp.Bar.foo();
134-
// CHECK:STDERR: ^~~~~~~~~~~
135-
// CHECK:STDERR:
136-
let bar: Cpp.Bar* = Cpp.Bar.foo();
128+
let bar: Cpp.Bar* = Cpp.Bar.foo;
137129
//@dump-sem-ir-end
138130
}
139131

@@ -367,7 +359,7 @@ fn MyF(bar: Cpp.Bar*);
367359
// CHECK:STDOUT: <elided>
368360
// CHECK:STDOUT: }
369361
// CHECK:STDOUT:
370-
// CHECK:STDOUT: --- fail_todo_import_static_data_member.carbon
362+
// CHECK:STDOUT: --- import_static_data_member.carbon
371363
// CHECK:STDOUT:
372364
// CHECK:STDOUT: constants {
373365
// CHECK:STDOUT: %Bar: type = class_type @Bar [concrete]
@@ -381,22 +373,24 @@ fn MyF(bar: Cpp.Bar*);
381373
// CHECK:STDOUT: import Cpp//...
382374
// CHECK:STDOUT: }
383375
// CHECK:STDOUT: %Bar.decl: type = class_decl @Bar [concrete = constants.%Bar] {} {}
376+
// CHECK:STDOUT: %foo.var: ref %ptr.f68 = var %foo.var_patt
384377
// CHECK:STDOUT: }
385378
// CHECK:STDOUT:
386379
// CHECK:STDOUT: fn @MyF() {
387380
// CHECK:STDOUT: !entry:
388381
// CHECK:STDOUT: name_binding_decl {
389382
// CHECK:STDOUT: %bar.patt: %pattern_type = binding_pattern bar [concrete]
390383
// CHECK:STDOUT: }
391-
// CHECK:STDOUT: %Cpp.ref.loc16_23: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
392-
// CHECK:STDOUT: %Bar.ref.loc16_26: type = name_ref Bar, imports.%Bar.decl [concrete = constants.%Bar]
393-
// CHECK:STDOUT: %foo.ref: <error> = name_ref foo, <error> [concrete = <error>]
394-
// CHECK:STDOUT: %.loc16: type = splice_block %ptr [concrete = constants.%ptr.f68] {
395-
// CHECK:STDOUT: %Cpp.ref.loc16_12: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
396-
// CHECK:STDOUT: %Bar.ref.loc16_15: type = name_ref Bar, imports.%Bar.decl [concrete = constants.%Bar]
397-
// CHECK:STDOUT: %ptr: type = ptr_type %Bar.ref.loc16_15 [concrete = constants.%ptr.f68]
384+
// CHECK:STDOUT: %Cpp.ref.loc8_23: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
385+
// CHECK:STDOUT: %Bar.ref.loc8_26: type = name_ref Bar, imports.%Bar.decl [concrete = constants.%Bar]
386+
// CHECK:STDOUT: %foo.ref: ref %ptr.f68 = name_ref foo, imports.%foo.var
387+
// CHECK:STDOUT: %.loc8_19: type = splice_block %ptr [concrete = constants.%ptr.f68] {
388+
// CHECK:STDOUT: %Cpp.ref.loc8_12: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
389+
// CHECK:STDOUT: %Bar.ref.loc8_15: type = name_ref Bar, imports.%Bar.decl [concrete = constants.%Bar]
390+
// CHECK:STDOUT: %ptr: type = ptr_type %Bar.ref.loc8_15 [concrete = constants.%ptr.f68]
398391
// CHECK:STDOUT: }
399-
// CHECK:STDOUT: %bar: %ptr.f68 = bind_name bar, <error> [concrete = <error>]
392+
// CHECK:STDOUT: %.loc8_30: %ptr.f68 = bind_value %foo.ref
393+
// CHECK:STDOUT: %bar: %ptr.f68 = bind_name bar, %.loc8_30
400394
// CHECK:STDOUT: <elided>
401395
// CHECK:STDOUT: }
402396
// CHECK:STDOUT:

toolchain/check/testdata/interop/cpp/class/struct.carbon

Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -115,23 +115,15 @@ struct Bar {
115115
static Bar* _Nonnull foo;
116116
};
117117

118-
// --- fail_todo_import_static_data_member.carbon
118+
// --- import_static_data_member.carbon
119119

120120
library "[[@TEST_NAME]]";
121121

122-
// CHECK:STDERR: fail_todo_import_static_data_member.carbon:[[@LINE+4]]:10: in file included here [InCppInclude]
123-
// CHECK:STDERR: ./static_data_member.h:3:24: error: semantics TODO: `Unsupported: Declaration type Var` [SemanticsTodo]
124-
// CHECK:STDERR: static Bar* _Nonnull foo;
125-
// CHECK:STDERR: ^
126122
import Cpp library "static_data_member.h";
127123

128124
fn MyF() {
129125
//@dump-sem-ir-begin
130-
// CHECK:STDERR: fail_todo_import_static_data_member.carbon:[[@LINE+4]]:23: note: in `Cpp` name lookup for `foo` [InCppNameLookup]
131-
// CHECK:STDERR: let bar: Cpp.Bar* = Cpp.Bar.foo();
132-
// CHECK:STDERR: ^~~~~~~~~~~
133-
// CHECK:STDERR:
134-
let bar: Cpp.Bar* = Cpp.Bar.foo();
126+
let bar: Cpp.Bar* = Cpp.Bar.foo;
135127
//@dump-sem-ir-end
136128
}
137129

@@ -355,7 +347,7 @@ fn MyF(bar: Cpp.Bar*);
355347
// CHECK:STDOUT: <elided>
356348
// CHECK:STDOUT: }
357349
// CHECK:STDOUT:
358-
// CHECK:STDOUT: --- fail_todo_import_static_data_member.carbon
350+
// CHECK:STDOUT: --- import_static_data_member.carbon
359351
// CHECK:STDOUT:
360352
// CHECK:STDOUT: constants {
361353
// CHECK:STDOUT: %Bar: type = class_type @Bar [concrete]
@@ -369,22 +361,24 @@ fn MyF(bar: Cpp.Bar*);
369361
// CHECK:STDOUT: import Cpp//...
370362
// CHECK:STDOUT: }
371363
// CHECK:STDOUT: %Bar.decl: type = class_decl @Bar [concrete = constants.%Bar] {} {}
364+
// CHECK:STDOUT: %foo.var: ref %ptr.f68 = var %foo.var_patt
372365
// CHECK:STDOUT: }
373366
// CHECK:STDOUT:
374367
// CHECK:STDOUT: fn @MyF() {
375368
// CHECK:STDOUT: !entry:
376369
// CHECK:STDOUT: name_binding_decl {
377370
// CHECK:STDOUT: %bar.patt: %pattern_type = binding_pattern bar [concrete]
378371
// CHECK:STDOUT: }
379-
// CHECK:STDOUT: %Cpp.ref.loc16_23: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
380-
// CHECK:STDOUT: %Bar.ref.loc16_26: type = name_ref Bar, imports.%Bar.decl [concrete = constants.%Bar]
381-
// CHECK:STDOUT: %foo.ref: <error> = name_ref foo, <error> [concrete = <error>]
382-
// CHECK:STDOUT: %.loc16: type = splice_block %ptr [concrete = constants.%ptr.f68] {
383-
// CHECK:STDOUT: %Cpp.ref.loc16_12: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
384-
// CHECK:STDOUT: %Bar.ref.loc16_15: type = name_ref Bar, imports.%Bar.decl [concrete = constants.%Bar]
385-
// CHECK:STDOUT: %ptr: type = ptr_type %Bar.ref.loc16_15 [concrete = constants.%ptr.f68]
372+
// CHECK:STDOUT: %Cpp.ref.loc8_23: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
373+
// CHECK:STDOUT: %Bar.ref.loc8_26: type = name_ref Bar, imports.%Bar.decl [concrete = constants.%Bar]
374+
// CHECK:STDOUT: %foo.ref: ref %ptr.f68 = name_ref foo, imports.%foo.var
375+
// CHECK:STDOUT: %.loc8_19: type = splice_block %ptr [concrete = constants.%ptr.f68] {
376+
// CHECK:STDOUT: %Cpp.ref.loc8_12: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
377+
// CHECK:STDOUT: %Bar.ref.loc8_15: type = name_ref Bar, imports.%Bar.decl [concrete = constants.%Bar]
378+
// CHECK:STDOUT: %ptr: type = ptr_type %Bar.ref.loc8_15 [concrete = constants.%ptr.f68]
386379
// CHECK:STDOUT: }
387-
// CHECK:STDOUT: %bar: %ptr.f68 = bind_name bar, <error> [concrete = <error>]
380+
// CHECK:STDOUT: %.loc8_30: %ptr.f68 = bind_value %foo.ref
381+
// CHECK:STDOUT: %bar: %ptr.f68 = bind_name bar, %.loc8_30
388382
// CHECK:STDOUT: <elided>
389383
// CHECK:STDOUT: }
390384
// CHECK:STDOUT:

toolchain/check/testdata/interop/cpp/class/union.carbon

Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -117,23 +117,15 @@ union Bar {
117117
static Bar* _Nonnull foo;
118118
};
119119

120-
// --- fail_todo_import_static_data_member.carbon
120+
// --- import_static_data_member.carbon
121121

122122
library "[[@TEST_NAME]]";
123123

124-
// CHECK:STDERR: fail_todo_import_static_data_member.carbon:[[@LINE+4]]:10: in file included here [InCppInclude]
125-
// CHECK:STDERR: ./static_data_member.h:4:24: error: semantics TODO: `Unsupported: Declaration type Var` [SemanticsTodo]
126-
// CHECK:STDERR: static Bar* _Nonnull foo;
127-
// CHECK:STDERR: ^
128124
import Cpp library "static_data_member.h";
129125

130126
fn MyF() {
131127
//@dump-sem-ir-begin
132-
// CHECK:STDERR: fail_todo_import_static_data_member.carbon:[[@LINE+4]]:23: note: in `Cpp` name lookup for `foo` [InCppNameLookup]
133-
// CHECK:STDERR: let bar: Cpp.Bar* = Cpp.Bar.foo();
134-
// CHECK:STDERR: ^~~~~~~~~~~
135-
// CHECK:STDERR:
136-
let bar: Cpp.Bar* = Cpp.Bar.foo();
128+
let bar: Cpp.Bar* = Cpp.Bar.foo;
137129
//@dump-sem-ir-end
138130
}
139131

@@ -319,7 +311,7 @@ fn MyF(bar: Cpp.Bar*);
319311
// CHECK:STDOUT: <elided>
320312
// CHECK:STDOUT: }
321313
// CHECK:STDOUT:
322-
// CHECK:STDOUT: --- fail_todo_import_static_data_member.carbon
314+
// CHECK:STDOUT: --- import_static_data_member.carbon
323315
// CHECK:STDOUT:
324316
// CHECK:STDOUT: constants {
325317
// CHECK:STDOUT: %Bar: type = class_type @Bar [concrete]
@@ -333,22 +325,24 @@ fn MyF(bar: Cpp.Bar*);
333325
// CHECK:STDOUT: import Cpp//...
334326
// CHECK:STDOUT: }
335327
// CHECK:STDOUT: %Bar.decl: type = class_decl @Bar [concrete = constants.%Bar] {} {}
328+
// CHECK:STDOUT: %foo.var: ref %ptr.f68 = var %foo.var_patt
336329
// CHECK:STDOUT: }
337330
// CHECK:STDOUT:
338331
// CHECK:STDOUT: fn @MyF() {
339332
// CHECK:STDOUT: !entry:
340333
// CHECK:STDOUT: name_binding_decl {
341334
// CHECK:STDOUT: %bar.patt: %pattern_type = binding_pattern bar [concrete]
342335
// CHECK:STDOUT: }
343-
// CHECK:STDOUT: %Cpp.ref.loc16_23: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
344-
// CHECK:STDOUT: %Bar.ref.loc16_26: type = name_ref Bar, imports.%Bar.decl [concrete = constants.%Bar]
345-
// CHECK:STDOUT: %foo.ref: <error> = name_ref foo, <error> [concrete = <error>]
346-
// CHECK:STDOUT: %.loc16: type = splice_block %ptr [concrete = constants.%ptr.f68] {
347-
// CHECK:STDOUT: %Cpp.ref.loc16_12: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
348-
// CHECK:STDOUT: %Bar.ref.loc16_15: type = name_ref Bar, imports.%Bar.decl [concrete = constants.%Bar]
349-
// CHECK:STDOUT: %ptr: type = ptr_type %Bar.ref.loc16_15 [concrete = constants.%ptr.f68]
336+
// CHECK:STDOUT: %Cpp.ref.loc8_23: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
337+
// CHECK:STDOUT: %Bar.ref.loc8_26: type = name_ref Bar, imports.%Bar.decl [concrete = constants.%Bar]
338+
// CHECK:STDOUT: %foo.ref: ref %ptr.f68 = name_ref foo, imports.%foo.var
339+
// CHECK:STDOUT: %.loc8_19: type = splice_block %ptr [concrete = constants.%ptr.f68] {
340+
// CHECK:STDOUT: %Cpp.ref.loc8_12: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
341+
// CHECK:STDOUT: %Bar.ref.loc8_15: type = name_ref Bar, imports.%Bar.decl [concrete = constants.%Bar]
342+
// CHECK:STDOUT: %ptr: type = ptr_type %Bar.ref.loc8_15 [concrete = constants.%ptr.f68]
350343
// CHECK:STDOUT: }
351-
// CHECK:STDOUT: %bar: %ptr.f68 = bind_name bar, <error> [concrete = <error>]
344+
// CHECK:STDOUT: %.loc8_30: %ptr.f68 = bind_value %foo.ref
345+
// CHECK:STDOUT: %bar: %ptr.f68 = bind_name bar, %.loc8_30
352346
// CHECK:STDOUT: <elided>
353347
// CHECK:STDOUT: }
354348
// CHECK:STDOUT:

0 commit comments

Comments
 (0)