Boaz Brickner
2025-03-03 19:25:55 +00:00
committed by GitHub
parent c44e688e5d
commit 28de6c9b7d
6 changed files with 12 additions and 2143 deletions
@@ -2,6 +2,8 @@
// Exceptions. See /LICENSE for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
// EXTRA-ARGS: --no-dump-sem-ir
//
// AUTOUPDATE
// TIP: To test this file alone, run:
// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/function/declaration/no_prelude/name_poisoning.carbon
@@ -222,403 +224,3 @@ fn F1() {
fn F2();
}
}
// CHECK:STDOUT: --- no_poison.carbon
// CHECK:STDOUT:
// CHECK:STDOUT: constants {
// CHECK:STDOUT: %C1: type = class_type @C1 [concrete]
// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete]
// CHECK:STDOUT: %complete_type: <witness> = complete_type_witness %empty_struct_type [concrete]
// CHECK:STDOUT: %C2: type = class_type @C2 [concrete]
// CHECK:STDOUT: %F1.type.75d: type = fn_type @F1.1 [concrete]
// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete]
// CHECK:STDOUT: %F1.afe: %F1.type.75d = struct_value () [concrete]
// CHECK:STDOUT: %F1.type.fe6: type = fn_type @F1.2 [concrete]
// CHECK:STDOUT: %F1.cc1: %F1.type.fe6 = struct_value () [concrete]
// CHECK:STDOUT: %TestCall.type: type = fn_type @TestCall [concrete]
// CHECK:STDOUT: %TestCall: %TestCall.type = struct_value () [concrete]
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: file {
// CHECK:STDOUT: package: <namespace> = namespace [concrete] {
// CHECK:STDOUT: .C1 = %C1.decl
// CHECK:STDOUT: .C2 = %C2.decl
// CHECK:STDOUT: .F1 = %F1.decl.loc7
// CHECK:STDOUT: .N = %N
// CHECK:STDOUT: .TestCall = %TestCall.decl
// CHECK:STDOUT: }
// CHECK:STDOUT: %C1.decl: type = class_decl @C1 [concrete = constants.%C1] {} {}
// CHECK:STDOUT: %C2.decl: type = class_decl @C2 [concrete = constants.%C2] {} {}
// CHECK:STDOUT: %F1.decl.loc7: %F1.type.75d = fn_decl @F1.1 [concrete = constants.%F1.afe] {
// CHECK:STDOUT: %x.patt: %C1 = binding_pattern x
// CHECK:STDOUT: %x.param_patt: %C1 = value_param_pattern %x.patt, runtime_param0
// CHECK:STDOUT: } {
// CHECK:STDOUT: %x.param: %C1 = value_param runtime_param0
// CHECK:STDOUT: %C1.ref: type = name_ref C1, file.%C1.decl [concrete = constants.%C1]
// CHECK:STDOUT: %x: %C1 = bind_name x, %x.param
// CHECK:STDOUT: }
// CHECK:STDOUT: %N: <namespace> = namespace [concrete] {
// CHECK:STDOUT: .C2 = <poisoned>
// CHECK:STDOUT: .F1 = %F1.decl.loc11
// CHECK:STDOUT: .F2 = %F2
// CHECK:STDOUT: }
// CHECK:STDOUT: %F1.decl.loc11: %F1.type.fe6 = fn_decl @F1.2 [concrete = constants.%F1.cc1] {
// CHECK:STDOUT: %x.patt: %C2 = binding_pattern x
// CHECK:STDOUT: %x.param_patt: %C2 = value_param_pattern %x.patt, runtime_param0
// CHECK:STDOUT: } {
// CHECK:STDOUT: %x.param: %C2 = value_param runtime_param0
// CHECK:STDOUT: %C2.ref: type = name_ref C2, file.%C2.decl [concrete = constants.%C2]
// CHECK:STDOUT: %x: %C2 = bind_name x, %x.param
// CHECK:STDOUT: }
// CHECK:STDOUT: %F1.ref: %F1.type.fe6 = name_ref F1, %F1.decl.loc11 [concrete = constants.%F1.cc1]
// CHECK:STDOUT: %F2: %F1.type.fe6 = bind_alias F2, %F1.decl.loc11 [concrete = constants.%F1.cc1]
// CHECK:STDOUT: %TestCall.decl: %TestCall.type = fn_decl @TestCall [concrete = constants.%TestCall] {
// CHECK:STDOUT: %x.patt: %C2 = binding_pattern x
// CHECK:STDOUT: %x.param_patt: %C2 = value_param_pattern %x.patt, runtime_param0
// CHECK:STDOUT: } {
// CHECK:STDOUT: %x.param: %C2 = value_param runtime_param0
// CHECK:STDOUT: %C2.ref: type = name_ref C2, file.%C2.decl [concrete = constants.%C2]
// CHECK:STDOUT: %x: %C2 = bind_name x, %x.param
// CHECK:STDOUT: }
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: class @C1 {
// CHECK:STDOUT: %complete_type: <witness> = complete_type_witness %empty_struct_type [concrete = constants.%complete_type]
// CHECK:STDOUT: complete_type_witness = %complete_type
// CHECK:STDOUT:
// CHECK:STDOUT: !members:
// CHECK:STDOUT: .Self = constants.%C1
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: class @C2 {
// CHECK:STDOUT: %complete_type: <witness> = complete_type_witness %empty_struct_type [concrete = constants.%complete_type]
// CHECK:STDOUT: complete_type_witness = %complete_type
// CHECK:STDOUT:
// CHECK:STDOUT: !members:
// CHECK:STDOUT: .Self = constants.%C2
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @F1.1(%x.param_patt: %C1);
// CHECK:STDOUT:
// CHECK:STDOUT: fn @F1.2(%x.param_patt: %C2);
// CHECK:STDOUT:
// CHECK:STDOUT: fn @TestCall(%x.param_patt: %C2) {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %N.ref: <namespace> = name_ref N, file.%N [concrete = file.%N]
// CHECK:STDOUT: %F2.ref: %F1.type.fe6 = name_ref F2, file.%F2 [concrete = constants.%F1.cc1]
// CHECK:STDOUT: %x.ref: %C2 = name_ref x, %x
// CHECK:STDOUT: %F1.call: init %empty_tuple.type = call %F2.ref(%x.ref)
// CHECK:STDOUT: return
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: --- poison.carbon
// CHECK:STDOUT:
// CHECK:STDOUT: constants {
// CHECK:STDOUT: %F1.type: type = fn_type @F1 [concrete]
// CHECK:STDOUT: %F1: %F1.type = struct_value () [concrete]
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: file {
// CHECK:STDOUT: package: <namespace> = namespace [concrete] {
// CHECK:STDOUT: .F1 = %F1.decl
// CHECK:STDOUT: .N = %N
// CHECK:STDOUT: }
// CHECK:STDOUT: %F1.decl: %F1.type = fn_decl @F1 [concrete = constants.%F1] {} {}
// CHECK:STDOUT: %N: <namespace> = namespace [concrete] {
// CHECK:STDOUT: .F1 = <poisoned>
// CHECK:STDOUT: .F2 = %F2
// CHECK:STDOUT: }
// CHECK:STDOUT: %F1.ref: %F1.type = name_ref F1, %F1.decl [concrete = constants.%F1]
// CHECK:STDOUT: %F2: %F1.type = bind_alias F2, %F1.decl [concrete = constants.%F1]
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @F1();
// CHECK:STDOUT:
// CHECK:STDOUT: --- fail_declare_after_poison.carbon
// CHECK:STDOUT:
// CHECK:STDOUT: constants {
// CHECK:STDOUT: %F1.type.75d: type = fn_type @F1.1 [concrete]
// CHECK:STDOUT: %F1.afe: %F1.type.75d = struct_value () [concrete]
// CHECK:STDOUT: %F1.type.fe6: type = fn_type @F1.2 [concrete]
// CHECK:STDOUT: %F1.cc1: %F1.type.fe6 = struct_value () [concrete]
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: file {
// CHECK:STDOUT: package: <namespace> = namespace [concrete] {
// CHECK:STDOUT: .F1 = %F1.decl.loc4
// CHECK:STDOUT: .N = %N
// CHECK:STDOUT: }
// CHECK:STDOUT: %F1.decl.loc4: %F1.type.75d = fn_decl @F1.1 [concrete = constants.%F1.afe] {} {}
// CHECK:STDOUT: %N: <namespace> = namespace [concrete] {
// CHECK:STDOUT: .F1 = <poisoned>
// CHECK:STDOUT: .F2 = %F2
// CHECK:STDOUT: }
// CHECK:STDOUT: %F1.ref: %F1.type.75d = name_ref F1, %F1.decl.loc4 [concrete = constants.%F1.afe]
// CHECK:STDOUT: %F2: %F1.type.75d = bind_alias F2, %F1.decl.loc4 [concrete = constants.%F1.afe]
// CHECK:STDOUT: %F1.decl.loc18: %F1.type.fe6 = fn_decl @F1.2 [concrete = constants.%F1.cc1] {} {}
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @F1.1();
// CHECK:STDOUT:
// CHECK:STDOUT: fn @F1.2();
// CHECK:STDOUT:
// CHECK:STDOUT: --- fail_use_poison.carbon
// CHECK:STDOUT:
// CHECK:STDOUT: constants {
// CHECK:STDOUT: %F1.type: type = fn_type @F1 [concrete]
// CHECK:STDOUT: %F1: %F1.type = struct_value () [concrete]
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: file {
// CHECK:STDOUT: package: <namespace> = namespace [concrete] {
// CHECK:STDOUT: .F1 = %F1.decl
// CHECK:STDOUT: .N = %N
// CHECK:STDOUT: }
// CHECK:STDOUT: %F1.decl: %F1.type = fn_decl @F1 [concrete = constants.%F1] {} {}
// CHECK:STDOUT: %N: <namespace> = namespace [concrete] {
// CHECK:STDOUT: .F1 = <poisoned>
// CHECK:STDOUT: .F2 = %F2
// CHECK:STDOUT: .N = <poisoned>
// CHECK:STDOUT: .F3 = %F3
// CHECK:STDOUT: }
// CHECK:STDOUT: %F1.ref.loc8: %F1.type = name_ref F1, %F1.decl [concrete = constants.%F1]
// CHECK:STDOUT: %F2: %F1.type = bind_alias F2, %F1.decl [concrete = constants.%F1]
// CHECK:STDOUT: %N.ref: <namespace> = name_ref N, %N [concrete = %N]
// CHECK:STDOUT: %F1.ref.loc14: <error> = name_ref F1, <error> [concrete = <error>]
// CHECK:STDOUT: %F3: <error> = bind_alias F3, <error> [concrete = <error>]
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @F1();
// CHECK:STDOUT:
// CHECK:STDOUT: --- fail_use_declaration_after_poison.carbon
// CHECK:STDOUT:
// CHECK:STDOUT: constants {
// CHECK:STDOUT: %F1.type.75d: type = fn_type @F1.1 [concrete]
// CHECK:STDOUT: %F1.afe: %F1.type.75d = struct_value () [concrete]
// CHECK:STDOUT: %F1.type.fe6: type = fn_type @F1.2 [concrete]
// CHECK:STDOUT: %F1.cc1: %F1.type.fe6 = struct_value () [concrete]
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: file {
// CHECK:STDOUT: package: <namespace> = namespace [concrete] {
// CHECK:STDOUT: .F1 = %F1.decl.loc4
// CHECK:STDOUT: .N = %N
// CHECK:STDOUT: }
// CHECK:STDOUT: %F1.decl.loc4: %F1.type.75d = fn_decl @F1.1 [concrete = constants.%F1.afe] {} {}
// CHECK:STDOUT: %N: <namespace> = namespace [concrete] {
// CHECK:STDOUT: .F1 = <poisoned>
// CHECK:STDOUT: .F2 = %F2
// CHECK:STDOUT: .N = <poisoned>
// CHECK:STDOUT: .F3 = %F3
// CHECK:STDOUT: }
// CHECK:STDOUT: %F1.ref.loc11: %F1.type.75d = name_ref F1, %F1.decl.loc4 [concrete = constants.%F1.afe]
// CHECK:STDOUT: %F2: %F1.type.75d = bind_alias F2, %F1.decl.loc4 [concrete = constants.%F1.afe]
// CHECK:STDOUT: %F1.decl.loc18: %F1.type.fe6 = fn_decl @F1.2 [concrete = constants.%F1.cc1] {} {}
// CHECK:STDOUT: %N.ref: <namespace> = name_ref N, %N [concrete = %N]
// CHECK:STDOUT: %F1.ref.loc26: <error> = name_ref F1, <error> [concrete = <error>]
// CHECK:STDOUT: %F3: <error> = bind_alias F3, <error> [concrete = <error>]
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @F1.1();
// CHECK:STDOUT:
// CHECK:STDOUT: fn @F1.2();
// CHECK:STDOUT:
// CHECK:STDOUT: --- fail_poison_multiple_scopes.carbon
// CHECK:STDOUT:
// CHECK:STDOUT: constants {
// CHECK:STDOUT: %F1.type.75d: type = fn_type @F1.1 [concrete]
// CHECK:STDOUT: %F1.afe: %F1.type.75d = struct_value () [concrete]
// CHECK:STDOUT: %F1.type.1f8: type = fn_type @F1.2 [concrete]
// CHECK:STDOUT: %F1.19a: %F1.type.1f8 = struct_value () [concrete]
// CHECK:STDOUT: %F1.type.73a: type = fn_type @F1.3 [concrete]
// CHECK:STDOUT: %F1.727: %F1.type.73a = struct_value () [concrete]
// CHECK:STDOUT: %F1.type.fe3: type = fn_type @F1.4 [concrete]
// CHECK:STDOUT: %F1.6a8: %F1.type.fe3 = struct_value () [concrete]
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: file {
// CHECK:STDOUT: package: <namespace> = namespace [concrete] {
// CHECK:STDOUT: .F1 = %F1.decl.loc4
// CHECK:STDOUT: .N1 = %N1
// CHECK:STDOUT: }
// CHECK:STDOUT: %F1.decl.loc4: %F1.type.75d = fn_decl @F1.1 [concrete = constants.%F1.afe] {} {}
// CHECK:STDOUT: %N1: <namespace> = namespace [concrete] {
// CHECK:STDOUT: .N2 = %N2
// CHECK:STDOUT: .F1 = <poisoned>
// CHECK:STDOUT: }
// CHECK:STDOUT: %N2: <namespace> = namespace [concrete] {
// CHECK:STDOUT: .N3 = %N3
// CHECK:STDOUT: .F1 = <poisoned>
// CHECK:STDOUT: }
// CHECK:STDOUT: %N3: <namespace> = namespace [concrete] {
// CHECK:STDOUT: .F1 = <poisoned>
// CHECK:STDOUT: .F2 = %F2
// CHECK:STDOUT: }
// CHECK:STDOUT: %F1.ref: %F1.type.75d = name_ref F1, %F1.decl.loc4 [concrete = constants.%F1.afe]
// CHECK:STDOUT: %F2: %F1.type.75d = bind_alias F2, %F1.decl.loc4 [concrete = constants.%F1.afe]
// CHECK:STDOUT: %F1.decl.loc25: %F1.type.1f8 = fn_decl @F1.2 [concrete = constants.%F1.19a] {} {}
// CHECK:STDOUT: %F1.decl.loc33: %F1.type.73a = fn_decl @F1.3 [concrete = constants.%F1.727] {} {}
// CHECK:STDOUT: %F1.decl.loc38: %F1.type.fe3 = fn_decl @F1.4 [concrete = constants.%F1.6a8] {} {}
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @F1.1();
// CHECK:STDOUT:
// CHECK:STDOUT: fn @F1.2();
// CHECK:STDOUT:
// CHECK:STDOUT: fn @F1.3();
// CHECK:STDOUT:
// CHECK:STDOUT: fn @F1.4();
// CHECK:STDOUT:
// CHECK:STDOUT: --- fail_alias.carbon
// CHECK:STDOUT:
// CHECK:STDOUT: constants {
// CHECK:STDOUT: %F.type: type = fn_type @F [concrete]
// CHECK:STDOUT: %F: %F.type = struct_value () [concrete]
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: file {
// CHECK:STDOUT: package: <namespace> = namespace [concrete] {
// CHECK:STDOUT: .F = %F.decl
// CHECK:STDOUT: .N = %N
// CHECK:STDOUT: }
// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] {} {}
// CHECK:STDOUT: %N: <namespace> = namespace [concrete] {
// CHECK:STDOUT: .F = <poisoned>
// CHECK:STDOUT: }
// CHECK:STDOUT: %F.ref: %F.type = name_ref F, %F.decl [concrete = constants.%F]
// CHECK:STDOUT: %F: %F.type = bind_alias F, %F.decl [concrete = constants.%F]
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @F();
// CHECK:STDOUT:
// CHECK:STDOUT: --- ignored_poison_in_import.carbon
// CHECK:STDOUT:
// CHECK:STDOUT: constants {
// CHECK:STDOUT: %F1.type: type = fn_type @F1 [concrete]
// CHECK:STDOUT: %F1: %F1.type = struct_value () [concrete]
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: imports {
// CHECK:STDOUT: %Main.F1 = import_ref Main//poison, F1, unloaded
// CHECK:STDOUT: %Main.N: <namespace> = import_ref Main//poison, N, loaded
// CHECK:STDOUT: %N: <namespace> = namespace %Main.N, [concrete] {
// CHECK:STDOUT: .F2 = %Main.F2
// CHECK:STDOUT: .F1 = file.%F1.decl
// CHECK:STDOUT: }
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: file {
// CHECK:STDOUT: package: <namespace> = namespace [concrete] {
// CHECK:STDOUT: .F1 = imports.%Main.F1
// CHECK:STDOUT: .N = imports.%N
// CHECK:STDOUT: }
// CHECK:STDOUT: %default.import = import <none>
// CHECK:STDOUT: %F1.decl: %F1.type = fn_decl @F1 [concrete = constants.%F1] {} {}
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @F1();
// CHECK:STDOUT:
// CHECK:STDOUT: --- poison.impl.carbon
// CHECK:STDOUT:
// CHECK:STDOUT: constants {
// CHECK:STDOUT: %F1.type: type = fn_type @F1 [concrete]
// CHECK:STDOUT: %F1: %F1.type = struct_value () [concrete]
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: imports {
// CHECK:STDOUT: %Main.F1 = import_ref Main//poison, F1, unloaded
// CHECK:STDOUT: %Main.N: <namespace> = import_ref Main//poison, N, loaded
// CHECK:STDOUT: %N: <namespace> = namespace %Main.N, [concrete] {
// CHECK:STDOUT: .F2 = %Main.F2
// CHECK:STDOUT: .F1 = file.%F1.decl
// CHECK:STDOUT: }
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: file {
// CHECK:STDOUT: package: <namespace> = namespace [concrete] {
// CHECK:STDOUT: .F1 = imports.%Main.F1
// CHECK:STDOUT: .N = imports.%N
// CHECK:STDOUT: }
// CHECK:STDOUT: %default.import.loc2_6.1 = import <none>
// CHECK:STDOUT: %default.import.loc2_6.2 = import <none>
// CHECK:STDOUT: %F1.decl: %F1.type = fn_decl @F1 [concrete = constants.%F1] {} {}
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @F1() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: return
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: --- fail_poison_when_lookup_fails.carbon
// CHECK:STDOUT:
// CHECK:STDOUT: constants {
// CHECK:STDOUT: %F1.type.75d: type = fn_type @F1.1 [concrete]
// CHECK:STDOUT: %F1.afe: %F1.type.75d = struct_value () [concrete]
// CHECK:STDOUT: %F1.type.fe6: type = fn_type @F1.2 [concrete]
// CHECK:STDOUT: %F1.cc1: %F1.type.fe6 = struct_value () [concrete]
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: file {
// CHECK:STDOUT: package: <namespace> = namespace [concrete] {
// CHECK:STDOUT: .N = %N
// CHECK:STDOUT: .F1 = <poisoned>
// CHECK:STDOUT: }
// CHECK:STDOUT: %N: <namespace> = namespace [concrete] {
// CHECK:STDOUT: .F1 = <poisoned>
// CHECK:STDOUT: .F2 = %F2
// CHECK:STDOUT: }
// CHECK:STDOUT: %F1.ref: <error> = name_ref F1, <error> [concrete = <error>]
// CHECK:STDOUT: %F2: <error> = bind_alias F2, <error> [concrete = <error>]
// CHECK:STDOUT: %F1.decl.loc23: %F1.type.75d = fn_decl @F1.1 [concrete = constants.%F1.afe] {} {}
// CHECK:STDOUT: %F1.decl.loc28: %F1.type.fe6 = fn_decl @F1.2 [concrete = constants.%F1.cc1] {} {}
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @F1.1();
// CHECK:STDOUT:
// CHECK:STDOUT: fn @F1.2();
// CHECK:STDOUT:
// CHECK:STDOUT: --- fail_poison_with_lexical_result.carbon
// CHECK:STDOUT:
// CHECK:STDOUT: constants {
// CHECK:STDOUT: %F1.type: type = fn_type @F1 [concrete]
// CHECK:STDOUT: %F1: %F1.type = struct_value () [concrete]
// CHECK:STDOUT: %F2.type.028: type = fn_type @F2.1 [concrete]
// CHECK:STDOUT: %F2.18a: %F2.type.028 = struct_value () [concrete]
// CHECK:STDOUT: %C: type = class_type @C [concrete]
// CHECK:STDOUT: %F2.type.c9e: type = fn_type @F2.2 [concrete]
// CHECK:STDOUT: %F2.c1c: %F2.type.c9e = struct_value () [concrete]
// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete]
// CHECK:STDOUT: %complete_type: <witness> = complete_type_witness %empty_struct_type [concrete]
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: file {
// CHECK:STDOUT: package: <namespace> = namespace [concrete] {
// CHECK:STDOUT: .F1 = %F1.decl
// CHECK:STDOUT: }
// CHECK:STDOUT: %F1.decl: %F1.type = fn_decl @F1 [concrete = constants.%F1] {} {}
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: class @C {
// CHECK:STDOUT: %F2.ref: %F2.type.028 = name_ref F2, @F1.%F2.decl [concrete = constants.%F2.18a]
// CHECK:STDOUT: %F3: %F2.type.028 = bind_alias F3, @F1.%F2.decl [concrete = constants.%F2.18a]
// CHECK:STDOUT: %F2.decl: %F2.type.c9e = fn_decl @F2.2 [concrete = constants.%F2.c1c] {} {}
// CHECK:STDOUT: %complete_type: <witness> = complete_type_witness %empty_struct_type [concrete = constants.%complete_type]
// CHECK:STDOUT: complete_type_witness = %complete_type
// CHECK:STDOUT:
// CHECK:STDOUT: !members:
// CHECK:STDOUT: .Self = constants.%C
// CHECK:STDOUT: .F2 = <poisoned>
// CHECK:STDOUT: .F3 = %F3
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @F1() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %F2.decl: %F2.type.028 = fn_decl @F2.1 [concrete = constants.%F2.18a] {} {}
// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {}
// CHECK:STDOUT: return
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @F2.1();
// CHECK:STDOUT:
// CHECK:STDOUT: fn @F2.2();
// CHECK:STDOUT: