From 2817729d4732ff6b9cc9e9b8538bad159099aff7 Mon Sep 17 00:00:00 2001 From: jonmeow Date: Fri, 23 May 2025 15:59:50 -0700 Subject: [PATCH 1/6] Fix formatting of forward declared generics --- toolchain/sem_ir/formatter.cpp | 31 +++++++++++++++++++++---------- toolchain/sem_ir/formatter.h | 5 ++--- 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/toolchain/sem_ir/formatter.cpp b/toolchain/sem_ir/formatter.cpp index a2cbd1e3b0a3c..cdd539f06f63c 100644 --- a/toolchain/sem_ir/formatter.cpp +++ b/toolchain/sem_ir/formatter.cpp @@ -168,8 +168,23 @@ auto Formatter::ShouldIncludeInstByIR(InstId inst_id) -> bool { return include_ir_in_dumps_[import_ir->check_ir_id().index]; } -auto Formatter::ShouldFormatEntity(InstId decl_id, bool is_definition_start) - -> bool { +// Returns true for a `DefinitionStart` node. +static auto IsDefinitionStart(Parse::NodeKind node_kind) -> bool { + switch (node_kind) { + case Parse::NodeKind::BuiltinFunctionDefinitionStart: + case Parse::NodeKind::ChoiceDefinitionStart: + case Parse::NodeKind::ClassDefinitionStart: + case Parse::NodeKind::FunctionDefinitionStart: + case Parse::NodeKind::ImplDefinitionStart: + case Parse::NodeKind::InterfaceDefinitionStart: + case Parse::NodeKind::NamedConstraintDefinitionStart: + return true; + default: + return false; + } +} + +auto Formatter::ShouldFormatEntity(InstId decl_id) -> bool { if (!decl_id.has_value()) { return true; } @@ -201,7 +216,7 @@ auto Formatter::ShouldFormatEntity(InstId decl_id, bool is_definition_start) // to find the `Definition`, giving a range that includes the definition's // body. auto end_node_id = loc_id.node_id(); - if (is_definition_start) { + if (IsDefinitionStart(sem_ir_->parse_tree().node_kind(end_node_id))) { end_node_id = node_parents_[end_node_id.index]; } @@ -212,8 +227,7 @@ auto Formatter::ShouldFormatEntity(InstId decl_id, bool is_definition_start) } auto Formatter::ShouldFormatEntity(const EntityWithParamsBase& entity) -> bool { - return ShouldFormatEntity(entity.latest_decl_id(), - entity.definition_id.has_value()); + return ShouldFormatEntity(entity.latest_decl_id()); } auto Formatter::ShouldFormatInst(InstId inst_id) -> bool { @@ -379,8 +393,7 @@ auto Formatter::FormatInterface(InterfaceId id) -> void { auto Formatter::FormatAssociatedConstant(AssociatedConstantId id) -> void { const AssociatedConstant& assoc_const = sem_ir_->associated_constants().Get(id); - if (!ShouldFormatEntity(assoc_const.decl_id, - /*is_definition_start=*/false)) { + if (!ShouldFormatEntity(assoc_const.decl_id)) { return; } @@ -538,9 +551,7 @@ auto Formatter::FormatSpecificRegion(const Generic& generic, auto Formatter::FormatSpecific(SpecificId id) -> void { const auto& specific = sem_ir_->specifics().Get(id); const auto& generic = sem_ir_->generics().Get(specific.generic_id); - if (!ShouldFormatEntity( - generic.decl_id, - /*is_definition_start=*/generic.definition_block_id.has_value())) { + if (!ShouldFormatEntity(generic.decl_id)) { // Omit specifics if we also omitted the generic. return; } diff --git a/toolchain/sem_ir/formatter.h b/toolchain/sem_ir/formatter.h index 3d84688811e27..87844c6e07bda 100644 --- a/toolchain/sem_ir/formatter.h +++ b/toolchain/sem_ir/formatter.h @@ -113,9 +113,8 @@ class Formatter { auto ShouldIncludeInstByIR(InstId inst_id) -> bool; // Determines whether the specified entity should be included in the formatted - // output. `is_definition_start` should indicate whether, if `decl_id`'s - // `LocId` is a `NodeId`, it is expected to be a `DefinitionStart` kind. - auto ShouldFormatEntity(InstId decl_id, bool is_definition_start) -> bool; + // output. + auto ShouldFormatEntity(InstId decl_id) -> bool; auto ShouldFormatEntity(const EntityWithParamsBase& entity) -> bool; From 92105b4545c85a2f758e6b779809554f8d27300e Mon Sep 17 00:00:00 2001 From: jonmeow Date: Thu, 22 May 2025 16:12:16 -0700 Subject: [PATCH 2/6] Update class tests for ranges, preludes, and splits --- .../testdata/class/access_modifers.carbon | 808 ------ .../check/testdata/class/adapter/adapt.carbon | 169 +- .../testdata/class/adapter/adapt_copy.carbon | 669 +---- .../class/adapter/extend_adapt.carbon | 521 +--- .../class/adapter/fail_adapt_bad_decl.carbon | 232 +- .../class/adapter/fail_adapt_bad_type.carbon | 41 +- .../class/adapter/fail_adapt_modifiers.carbon | 2 +- .../class/adapter/fail_adapt_with_base.carbon | 63 +- .../adapter/fail_adapt_with_subobjects.carbon | 193 +- .../testdata/class/adapter/init_adapt.carbon | 369 +-- toolchain/check/testdata/class/base.carbon | 294 -- .../check/testdata/class/base_field.carbon | 146 - .../class/base_function_unqualified.carbon | 109 - .../check/testdata/class/base_method.carbon | 193 -- .../class/base_method_qualified.carbon | 301 -- .../testdata/class/base_method_shadow.carbon | 259 -- toolchain/check/testdata/class/basic.carbon | 195 -- .../class/complete_in_member_fn.carbon | 89 - .../testdata/class/compound_field.carbon | 248 -- .../class/cross_package_import.carbon | 417 --- .../testdata/class/derived_to_base.carbon | 383 --- .../testdata/class/fail_addr_not_self.carbon | 99 - .../testdata/class/fail_addr_self.carbon | 152 -- .../class/fail_base_as_declared_name.carbon | 24 - .../testdata/class/fail_base_bad_type.carbon | 959 ------- .../class/fail_base_method_define.carbon | 128 - .../testdata/class/fail_base_misplaced.carbon | 103 - .../testdata/class/fail_base_modifiers.carbon | 52 - .../testdata/class/fail_base_no_extend.carbon | 72 - .../testdata/class/fail_base_repeated.carbon | 126 - .../testdata/class/fail_base_unbound.carbon | 89 - .../class/fail_compound_type_mismatch.carbon | 125 - .../class/fail_convert_to_invalid.carbon | 79 - .../class/fail_derived_to_base.carbon | 200 -- .../testdata/class/fail_extend_cycle.carbon | 110 - .../class/fail_field_modifiers.carbon | 145 - .../testdata/class/fail_generic_method.carbon | 178 -- .../testdata/class/fail_import_misuses.carbon | 142 - .../testdata/class/fail_incomplete.carbon | 518 ---- .../check/testdata/class/fail_init.carbon | 145 - .../class/fail_init_as_inplace.carbon | 170 -- .../class/fail_memaccess_category.carbon | 157 -- .../testdata/class/fail_member_of_let.carbon | 102 - .../check/testdata/class/fail_method.carbon | 142 - .../class/fail_method_modifiers.carbon | 183 -- .../class/fail_method_redefinition.carbon | 72 - .../testdata/class/fail_modifiers.carbon | 246 -- .../class/fail_out_of_line_decl.carbon | 60 - .../class/fail_redeclaration_scope.carbon | 127 - .../testdata/class/fail_redefinition.carbon | 156 -- .../check/testdata/class/fail_scope.carbon | 129 - .../check/testdata/class/fail_self.carbon | 202 -- .../testdata/class/fail_self_param.carbon | 74 - .../class/fail_self_type_member.carbon | 55 - .../class/fail_todo_field_initializer.carbon | 64 - .../testdata/class/fail_unbound_field.carbon | 111 - .../testdata/class/fail_unknown_member.carbon | 94 - .../check/testdata/class/field_access.carbon | 166 -- .../class/field_access_in_value.carbon | 173 -- .../testdata/class/forward_declared.carbon | 66 - toolchain/check/testdata/class/generic.carbon | 37 - .../check/testdata/class/generic/adapt.carbon | 763 +----- .../class/generic/base_is_generic.carbon | 747 +---- .../check/testdata/class/generic/basic.carbon | 233 -- .../testdata/class/generic/basics.carbon | 460 ++++ .../check/testdata/class/generic/call.carbon | 693 +---- .../generic/complete_in_conversion.carbon | 276 -- .../check/testdata/class/generic/field.carbon | 274 -- .../testdata/class/generic/import.carbon | 691 +---- .../check/testdata/class/generic/init.carbon | 337 +-- .../class/generic/member_access.carbon | 481 +--- .../class/generic/member_inline.carbon | 193 +- .../class/generic/member_lookup.carbon | 599 +--- .../class/generic/member_out_of_line.carbon | 629 +---- .../testdata/class/generic/member_type.carbon | 577 +--- .../class/generic/method_deduce.carbon | 326 +-- .../testdata/class/generic/redeclare.carbon | 404 +-- .../check/testdata/class/generic/self.carbon | 232 -- .../testdata/class/generic/stringify.carbon | 543 +--- .../syntactic_merge_literal.carbon | 4 +- .../testdata/class/generic_method.carbon | 152 -- toolchain/check/testdata/class/import.carbon | 389 --- .../check/testdata/class/import_base.carbon | 300 -- .../testdata/class/import_forward_decl.carbon | 82 - .../testdata/class/import_indirect.carbon | 587 ---- .../testdata/class/import_member_cycle.carbon | 125 - .../testdata/class/import_struct_cyle.carbon | 151 - .../testdata/class/inheritance_access.carbon | 1364 ---------- toolchain/check/testdata/class/init.carbon | 160 -- toolchain/check/testdata/class/init_as.carbon | 139 - .../check/testdata/class/init_nested.carbon | 136 - toolchain/check/testdata/class/local.carbon | 167 -- toolchain/check/testdata/class/method.carbon | 456 ---- .../class/min_prelude/abstract.carbon | 284 ++ .../min_prelude/abstract_in_tuple.carbon | 156 ++ .../class/min_prelude/bad_conversions.carbon | 86 + .../class/min_prelude/base_bad_type.carbon | 190 ++ .../class/min_prelude/derived_to_base.carbon | 305 +++ .../class/min_prelude/destroy_calls.carbon | 655 +---- .../class/min_prelude/destroy_decl.carbon | 137 +- .../class/min_prelude/fail_abstract.carbon | 810 ------ .../min_prelude/fail_abstract_in_tuple.carbon | 560 ---- .../testdata/class/min_prelude/init.carbon | 228 ++ .../testdata/class/min_prelude/self.carbon | 143 + .../class/min_prelude/self_type.carbon | 86 + .../min_prelude/virtual_modifiers.carbon | 658 +++++ toolchain/check/testdata/class/nested.carbon | 287 -- .../check/testdata/class/nested_name.carbon | 140 - .../no_prelude/abstract_in_struct.carbon | 141 + .../no_prelude/access_inheritance.carbon | 230 ++ .../class/no_prelude/access_modifers.carbon | 175 ++ .../testdata/class/no_prelude/base.carbon | 589 ++++ .../class/no_prelude/base_function.carbon | 374 +++ .../testdata/class/no_prelude/basic.carbon | 220 ++ .../class/no_prelude/comp_time_field.carbon | 54 +- .../no_prelude/cross_package_import.carbon | 145 + .../class/no_prelude/error_recovery.carbon | 27 + .../class/no_prelude/export_name.carbon | 82 +- .../testdata/class/no_prelude/extern.carbon | 361 +-- .../class/no_prelude/extern_library.carbon | 18 +- .../no_prelude/fail_abstract_in_struct.carbon | 435 --- .../no_prelude/fail_error_recovery.carbon | 120 - .../class/no_prelude/fail_modifiers.carbon | 154 ++ .../testdata/class/no_prelude/fields.carbon | 222 ++ .../class/no_prelude/generic_method.carbon | 176 ++ .../class/no_prelude/generic_vs_params.carbon | 270 +- .../class/no_prelude/implicit_import.carbon | 194 +- .../testdata/class/no_prelude/import.carbon | 242 ++ .../class/no_prelude/import_access.carbon | 441 +-- .../class/no_prelude/import_base.carbon | 39 + .../class/no_prelude/import_indirect.carbon | 103 + .../no_prelude/import_member_cycle.carbon | 29 + .../no_prelude/import_struct_cyle.carbon | 34 + .../class/no_prelude/incomplete.carbon | 225 ++ .../no_prelude/indirect_import_member.carbon | 458 +--- .../testdata/class/no_prelude/local.carbon | 129 + .../class/no_prelude/member_functions.carbon | 677 +++++ .../class/no_prelude/method_access.carbon | 85 - .../class/no_prelude/name_poisoning.carbon | 2 +- .../testdata/class/no_prelude/nested.carbon | 207 ++ .../no_definition_in_impl_file.carbon | 155 +- .../testdata/class/no_prelude/raw_self.carbon | 46 + .../class/no_prelude/redeclaration.carbon | 208 ++ .../testdata/class/no_prelude/reorder.carbon | 65 + .../testdata/class/no_prelude/scope.carbon | 63 + .../class/no_prelude/syntactic_merge.carbon | 955 +------ .../check/testdata/class/raw_self.carbon | 202 -- .../check/testdata/class/raw_self_type.carbon | 152 -- .../check/testdata/class/redeclaration.carbon | 100 - .../class/redeclaration_introducer.carbon | 78 - .../check/testdata/class/reenter_scope.carbon | 107 - toolchain/check/testdata/class/reorder.carbon | 129 - .../testdata/class/reorder_qualified.carbon | 334 --- toolchain/check/testdata/class/scope.carbon | 201 -- toolchain/check/testdata/class/self.carbon | 239 -- .../testdata/class/self_conversion.carbon | 257 -- .../check/testdata/class/self_type.carbon | 149 - .../check/testdata/class/static_method.carbon | 105 - .../class/todo_access_modifiers.carbon | 81 - .../testdata/class/virtual_modifiers.carbon | 2424 ----------------- 160 files changed, 8063 insertions(+), 33773 deletions(-) delete mode 100644 toolchain/check/testdata/class/access_modifers.carbon delete mode 100644 toolchain/check/testdata/class/base.carbon delete mode 100644 toolchain/check/testdata/class/base_field.carbon delete mode 100644 toolchain/check/testdata/class/base_function_unqualified.carbon delete mode 100644 toolchain/check/testdata/class/base_method.carbon delete mode 100644 toolchain/check/testdata/class/base_method_qualified.carbon delete mode 100644 toolchain/check/testdata/class/base_method_shadow.carbon delete mode 100644 toolchain/check/testdata/class/basic.carbon delete mode 100644 toolchain/check/testdata/class/complete_in_member_fn.carbon delete mode 100644 toolchain/check/testdata/class/compound_field.carbon delete mode 100644 toolchain/check/testdata/class/cross_package_import.carbon delete mode 100644 toolchain/check/testdata/class/derived_to_base.carbon delete mode 100644 toolchain/check/testdata/class/fail_addr_not_self.carbon delete mode 100644 toolchain/check/testdata/class/fail_addr_self.carbon delete mode 100644 toolchain/check/testdata/class/fail_base_as_declared_name.carbon delete mode 100644 toolchain/check/testdata/class/fail_base_bad_type.carbon delete mode 100644 toolchain/check/testdata/class/fail_base_method_define.carbon delete mode 100644 toolchain/check/testdata/class/fail_base_misplaced.carbon delete mode 100644 toolchain/check/testdata/class/fail_base_modifiers.carbon delete mode 100644 toolchain/check/testdata/class/fail_base_no_extend.carbon delete mode 100644 toolchain/check/testdata/class/fail_base_repeated.carbon delete mode 100644 toolchain/check/testdata/class/fail_base_unbound.carbon delete mode 100644 toolchain/check/testdata/class/fail_compound_type_mismatch.carbon delete mode 100644 toolchain/check/testdata/class/fail_convert_to_invalid.carbon delete mode 100644 toolchain/check/testdata/class/fail_derived_to_base.carbon delete mode 100644 toolchain/check/testdata/class/fail_extend_cycle.carbon delete mode 100644 toolchain/check/testdata/class/fail_field_modifiers.carbon delete mode 100644 toolchain/check/testdata/class/fail_generic_method.carbon delete mode 100644 toolchain/check/testdata/class/fail_import_misuses.carbon delete mode 100644 toolchain/check/testdata/class/fail_incomplete.carbon delete mode 100644 toolchain/check/testdata/class/fail_init.carbon delete mode 100644 toolchain/check/testdata/class/fail_init_as_inplace.carbon delete mode 100644 toolchain/check/testdata/class/fail_memaccess_category.carbon delete mode 100644 toolchain/check/testdata/class/fail_member_of_let.carbon delete mode 100644 toolchain/check/testdata/class/fail_method.carbon delete mode 100644 toolchain/check/testdata/class/fail_method_modifiers.carbon delete mode 100644 toolchain/check/testdata/class/fail_method_redefinition.carbon delete mode 100644 toolchain/check/testdata/class/fail_modifiers.carbon delete mode 100644 toolchain/check/testdata/class/fail_out_of_line_decl.carbon delete mode 100644 toolchain/check/testdata/class/fail_redeclaration_scope.carbon delete mode 100644 toolchain/check/testdata/class/fail_redefinition.carbon delete mode 100644 toolchain/check/testdata/class/fail_scope.carbon delete mode 100644 toolchain/check/testdata/class/fail_self.carbon delete mode 100644 toolchain/check/testdata/class/fail_self_param.carbon delete mode 100644 toolchain/check/testdata/class/fail_self_type_member.carbon delete mode 100644 toolchain/check/testdata/class/fail_todo_field_initializer.carbon delete mode 100644 toolchain/check/testdata/class/fail_unbound_field.carbon delete mode 100644 toolchain/check/testdata/class/fail_unknown_member.carbon delete mode 100644 toolchain/check/testdata/class/field_access.carbon delete mode 100644 toolchain/check/testdata/class/field_access_in_value.carbon delete mode 100644 toolchain/check/testdata/class/forward_declared.carbon delete mode 100644 toolchain/check/testdata/class/generic.carbon delete mode 100644 toolchain/check/testdata/class/generic/basic.carbon create mode 100644 toolchain/check/testdata/class/generic/basics.carbon delete mode 100644 toolchain/check/testdata/class/generic/complete_in_conversion.carbon delete mode 100644 toolchain/check/testdata/class/generic/field.carbon delete mode 100644 toolchain/check/testdata/class/generic/self.carbon rename toolchain/check/testdata/class/{ => generic}/syntactic_merge_literal.carbon (99%) delete mode 100644 toolchain/check/testdata/class/generic_method.carbon delete mode 100644 toolchain/check/testdata/class/import.carbon delete mode 100644 toolchain/check/testdata/class/import_base.carbon delete mode 100644 toolchain/check/testdata/class/import_forward_decl.carbon delete mode 100644 toolchain/check/testdata/class/import_indirect.carbon delete mode 100644 toolchain/check/testdata/class/import_member_cycle.carbon delete mode 100644 toolchain/check/testdata/class/import_struct_cyle.carbon delete mode 100644 toolchain/check/testdata/class/inheritance_access.carbon delete mode 100644 toolchain/check/testdata/class/init.carbon delete mode 100644 toolchain/check/testdata/class/init_as.carbon delete mode 100644 toolchain/check/testdata/class/init_nested.carbon delete mode 100644 toolchain/check/testdata/class/local.carbon delete mode 100644 toolchain/check/testdata/class/method.carbon create mode 100644 toolchain/check/testdata/class/min_prelude/abstract.carbon create mode 100644 toolchain/check/testdata/class/min_prelude/abstract_in_tuple.carbon create mode 100644 toolchain/check/testdata/class/min_prelude/bad_conversions.carbon create mode 100644 toolchain/check/testdata/class/min_prelude/base_bad_type.carbon create mode 100644 toolchain/check/testdata/class/min_prelude/derived_to_base.carbon delete mode 100644 toolchain/check/testdata/class/min_prelude/fail_abstract.carbon delete mode 100644 toolchain/check/testdata/class/min_prelude/fail_abstract_in_tuple.carbon create mode 100644 toolchain/check/testdata/class/min_prelude/init.carbon create mode 100644 toolchain/check/testdata/class/min_prelude/self.carbon create mode 100644 toolchain/check/testdata/class/min_prelude/self_type.carbon create mode 100644 toolchain/check/testdata/class/min_prelude/virtual_modifiers.carbon delete mode 100644 toolchain/check/testdata/class/nested.carbon delete mode 100644 toolchain/check/testdata/class/nested_name.carbon create mode 100644 toolchain/check/testdata/class/no_prelude/abstract_in_struct.carbon create mode 100644 toolchain/check/testdata/class/no_prelude/access_inheritance.carbon create mode 100644 toolchain/check/testdata/class/no_prelude/access_modifers.carbon create mode 100644 toolchain/check/testdata/class/no_prelude/base.carbon create mode 100644 toolchain/check/testdata/class/no_prelude/base_function.carbon create mode 100644 toolchain/check/testdata/class/no_prelude/basic.carbon create mode 100644 toolchain/check/testdata/class/no_prelude/cross_package_import.carbon create mode 100644 toolchain/check/testdata/class/no_prelude/error_recovery.carbon delete mode 100644 toolchain/check/testdata/class/no_prelude/fail_abstract_in_struct.carbon delete mode 100644 toolchain/check/testdata/class/no_prelude/fail_error_recovery.carbon create mode 100644 toolchain/check/testdata/class/no_prelude/fail_modifiers.carbon create mode 100644 toolchain/check/testdata/class/no_prelude/fields.carbon create mode 100644 toolchain/check/testdata/class/no_prelude/generic_method.carbon create mode 100644 toolchain/check/testdata/class/no_prelude/import.carbon create mode 100644 toolchain/check/testdata/class/no_prelude/import_base.carbon create mode 100644 toolchain/check/testdata/class/no_prelude/import_indirect.carbon create mode 100644 toolchain/check/testdata/class/no_prelude/import_member_cycle.carbon create mode 100644 toolchain/check/testdata/class/no_prelude/import_struct_cyle.carbon create mode 100644 toolchain/check/testdata/class/no_prelude/incomplete.carbon create mode 100644 toolchain/check/testdata/class/no_prelude/local.carbon create mode 100644 toolchain/check/testdata/class/no_prelude/member_functions.carbon delete mode 100644 toolchain/check/testdata/class/no_prelude/method_access.carbon create mode 100644 toolchain/check/testdata/class/no_prelude/nested.carbon create mode 100644 toolchain/check/testdata/class/no_prelude/raw_self.carbon create mode 100644 toolchain/check/testdata/class/no_prelude/redeclaration.carbon create mode 100644 toolchain/check/testdata/class/no_prelude/reorder.carbon create mode 100644 toolchain/check/testdata/class/no_prelude/scope.carbon delete mode 100644 toolchain/check/testdata/class/raw_self.carbon delete mode 100644 toolchain/check/testdata/class/raw_self_type.carbon delete mode 100644 toolchain/check/testdata/class/redeclaration.carbon delete mode 100644 toolchain/check/testdata/class/redeclaration_introducer.carbon delete mode 100644 toolchain/check/testdata/class/reenter_scope.carbon delete mode 100644 toolchain/check/testdata/class/reorder.carbon delete mode 100644 toolchain/check/testdata/class/reorder_qualified.carbon delete mode 100644 toolchain/check/testdata/class/scope.carbon delete mode 100644 toolchain/check/testdata/class/self.carbon delete mode 100644 toolchain/check/testdata/class/self_conversion.carbon delete mode 100644 toolchain/check/testdata/class/self_type.carbon delete mode 100644 toolchain/check/testdata/class/static_method.carbon delete mode 100644 toolchain/check/testdata/class/todo_access_modifiers.carbon delete mode 100644 toolchain/check/testdata/class/virtual_modifiers.carbon diff --git a/toolchain/check/testdata/class/access_modifers.carbon b/toolchain/check/testdata/class/access_modifers.carbon deleted file mode 100644 index ed92910d44e42..0000000000000 --- a/toolchain/check/testdata/class/access_modifers.carbon +++ /dev/null @@ -1,808 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/access_modifers.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/access_modifers.carbon - -// --- fail_private_field_access.carbon - -library "[[@TEST_NAME]]"; - -class Circle { - private var radius: i32; - private let SOME_INTERNAL_CONSTANT: i32 = 5; - - private fn SomeInternalFunction() -> i32 { - return 0; - } - - fn Make() -> Self { - return {.radius = 5}; - } -} - -fn Run() { - let circle: Circle = Circle.Make(); - // CHECK:STDERR: fail_private_field_access.carbon:[[@LINE+7]]:21: error: cannot access private member `radius` of type `Circle` [ClassInvalidMemberAccess] - // CHECK:STDERR: let radius: i32 = circle.radius; - // CHECK:STDERR: ^~~~~~~~~~~~~ - // CHECK:STDERR: fail_private_field_access.carbon:[[@LINE-17]]:15: note: declared here [ClassMemberDeclaration] - // CHECK:STDERR: private var radius: i32; - // CHECK:STDERR: ^~~~~~~~~~~ - // CHECK:STDERR: - let radius: i32 = circle.radius; - // CHECK:STDERR: fail_private_field_access.carbon:[[@LINE+7]]:3: error: cannot access private member `radius` of type `Circle` [ClassInvalidMemberAccess] - // CHECK:STDERR: circle.radius = 5; - // CHECK:STDERR: ^~~~~~~~~~~~~ - // CHECK:STDERR: fail_private_field_access.carbon:[[@LINE-25]]:15: note: declared here [ClassMemberDeclaration] - // CHECK:STDERR: private var radius: i32; - // CHECK:STDERR: ^~~~~~~~~~~ - // CHECK:STDERR: - circle.radius = 5; - // CHECK:STDERR: fail_private_field_access.carbon:[[@LINE+7]]:3: error: cannot access private member `SOME_INTERNAL_CONSTANT` of type `Circle` [ClassInvalidMemberAccess] - // CHECK:STDERR: circle.SOME_INTERNAL_CONSTANT; - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_private_field_access.carbon:[[@LINE-32]]:15: note: declared here [ClassMemberDeclaration] - // CHECK:STDERR: private let SOME_INTERNAL_CONSTANT: i32 = 5; - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: - circle.SOME_INTERNAL_CONSTANT; - - // CHECK:STDERR: fail_private_field_access.carbon:[[@LINE+7]]:3: error: cannot access private member `SomeInternalFunction` of type `Circle` [ClassInvalidMemberAccess] - // CHECK:STDERR: circle.SomeInternalFunction(); - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_private_field_access.carbon:[[@LINE-39]]:3: note: declared here [ClassMemberDeclaration] - // CHECK:STDERR: private fn SomeInternalFunction() -> i32 { - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: - circle.SomeInternalFunction(); -} - -// --- fail_protected_field_access.carbon - -library "[[@TEST_NAME]]"; - -class A { - protected var x: i32; -} - -fn Run() { - // CHECK:STDERR: fail_protected_field_access.carbon:[[@LINE+7]]:16: error: cannot access protected member `x` of type `A` [ClassInvalidMemberAccess] - // CHECK:STDERR: let x: i32 = A.x; - // CHECK:STDERR: ^~~ - // CHECK:STDERR: fail_protected_field_access.carbon:[[@LINE-7]]:17: note: declared here [ClassMemberDeclaration] - // CHECK:STDERR: protected var x: i32; - // CHECK:STDERR: ^~~~~~ - // CHECK:STDERR: - let x: i32 = A.x; -} - -// --- instance_private_field_access_on_self.carbon - -library "[[@TEST_NAME]]"; - -class Circle { - private var radius: i32; - - fn GetRadius[self: Self]() -> i32 { - return self.radius; - } - - private fn SomeInternalFunction() -> i32 { - return 0; - } - - fn Compute[self: Self]() -> i32 { - return self.SomeInternalFunction(); - } -} - -// --- public_global_access.carbon - -library "[[@TEST_NAME]]"; - -class A { - let x: i32 = 5; -} - -let x: i32 = A.x; - -// --- fail_global_access.carbon - -library "[[@TEST_NAME]]"; - -class A { - protected let x: i32 = 5; - private let y: i32 = 5; -} - -// CHECK:STDERR: fail_global_access.carbon:[[@LINE+7]]:14: error: cannot access protected member `x` of type `A` [ClassInvalidMemberAccess] -// CHECK:STDERR: let x: i32 = A.x; -// CHECK:STDERR: ^~~ -// CHECK:STDERR: fail_global_access.carbon:[[@LINE-7]]:17: note: declared here [ClassMemberDeclaration] -// CHECK:STDERR: protected let x: i32 = 5; -// CHECK:STDERR: ^ -// CHECK:STDERR: -let x: i32 = A.x; -// CHECK:STDERR: fail_global_access.carbon:[[@LINE+7]]:14: error: cannot access private member `y` of type `A` [ClassInvalidMemberAccess] -// CHECK:STDERR: let y: i32 = A.y; -// CHECK:STDERR: ^~~ -// CHECK:STDERR: fail_global_access.carbon:[[@LINE-14]]:15: note: declared here [ClassMemberDeclaration] -// CHECK:STDERR: private let y: i32 = 5; -// CHECK:STDERR: ^ -// CHECK:STDERR: -let y: i32 = A.y; - -// --- self_access.carbon - -library "[[@TEST_NAME]]"; - -class A { - private fn F() {} - private fn G() { Self.F(); } -} - -// CHECK:STDOUT: --- fail_private_field_access.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Circle: type = class_type @Circle [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %Circle.elem: type = unbound_element_type %Circle, %i32 [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %int_5.64b: Core.IntLiteral = int_value 5 [concrete] -// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.type.205: type = facet_type <@ImplicitAs, @ImplicitAs(%i32)> [concrete] -// CHECK:STDOUT: %Convert.type.1b6: type = fn_type @Convert.1, @ImplicitAs(%i32) [concrete] -// CHECK:STDOUT: %To.c80: Core.IntLiteral = bind_symbolic_name To, 0 [symbolic] -// CHECK:STDOUT: %Convert.type.0f9: type = fn_type @Convert.2, @impl.4f9(%To.c80) [symbolic] -// CHECK:STDOUT: %Convert.f06: %Convert.type.0f9 = struct_value () [symbolic] -// CHECK:STDOUT: %ImplicitAs.impl_witness.c75: = impl_witness imports.%ImplicitAs.impl_witness_table.a2f, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.type.035: type = fn_type @Convert.2, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.956: %Convert.type.035 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.facet: %ImplicitAs.type.205 = facet_value Core.IntLiteral, (%ImplicitAs.impl_witness.c75) [concrete] -// CHECK:STDOUT: %.9c3: type = fn_type_with_self_type %Convert.type.1b6, %ImplicitAs.facet [concrete] -// CHECK:STDOUT: %Convert.bound.4e6: = bound_method %int_5.64b, %Convert.956 [concrete] -// CHECK:STDOUT: %Convert.specific_fn: = specific_function %Convert.956, @Convert.2(%int_32) [concrete] -// CHECK:STDOUT: %bound_method.a25: = bound_method %int_5.64b, %Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_5.0f6: %i32 = int_value 5 [concrete] -// CHECK:STDOUT: %SomeInternalFunction.type: type = fn_type @SomeInternalFunction [concrete] -// CHECK:STDOUT: %SomeInternalFunction: %SomeInternalFunction.type = struct_value () [concrete] -// CHECK:STDOUT: %pattern_type.ce2: type = pattern_type %Circle [concrete] -// CHECK:STDOUT: %Make.type: type = fn_type @Make [concrete] -// CHECK:STDOUT: %Make: %Make.type = struct_value () [concrete] -// CHECK:STDOUT: %struct_type.radius.251: type = struct_type {.radius: %i32} [concrete] -// CHECK:STDOUT: %complete_type.5a5: = complete_type_witness %struct_type.radius.251 [concrete] -// CHECK:STDOUT: %int_0.5c6: Core.IntLiteral = int_value 0 [concrete] -// CHECK:STDOUT: %Convert.bound.d04: = bound_method %int_0.5c6, %Convert.956 [concrete] -// CHECK:STDOUT: %bound_method.b6e: = bound_method %int_0.5c6, %Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_0.6a9: %i32 = int_value 0 [concrete] -// CHECK:STDOUT: %struct_type.radius.f47: type = struct_type {.radius: Core.IntLiteral} [concrete] -// CHECK:STDOUT: %Circle.val: %Circle = struct_value (%int_5.0f6) [concrete] -// CHECK:STDOUT: %Run.type: type = fn_type @Run [concrete] -// CHECK:STDOUT: %Run: %Run.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/operators/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] -// CHECK:STDOUT: %Core.import_ref.a5b: @impl.4f9.%Convert.type (%Convert.type.0f9) = import_ref Core//prelude/types/int, loc19_39, loaded [symbolic = @impl.4f9.%Convert (constants.%Convert.f06)] -// CHECK:STDOUT: %ImplicitAs.impl_witness_table.a2f = impl_witness_table (%Core.import_ref.a5b), @impl.4f9 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Circle = %Circle.decl -// CHECK:STDOUT: .Run = %Run.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Circle.decl: type = class_decl @Circle [concrete = constants.%Circle] {} {} -// CHECK:STDOUT: %Run.decl: %Run.type = fn_decl @Run [concrete = constants.%Run] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Circle { -// CHECK:STDOUT: %int_32.loc5: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc5: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc5: %Circle.elem = field_decl radius, element0 [concrete] -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %SOME_INTERNAL_CONSTANT.patt: %pattern_type.7ce = binding_pattern SOME_INTERNAL_CONSTANT [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %int_5: Core.IntLiteral = int_value 5 [concrete = constants.%int_5.64b] -// CHECK:STDOUT: %.loc6_39: type = splice_block %i32.loc6 [concrete = constants.%i32] { -// CHECK:STDOUT: %int_32.loc6: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc6: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: } -// CHECK:STDOUT: %impl.elem0: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc6_45.1: = bound_method %int_5, %impl.elem0 [concrete = constants.%Convert.bound.4e6] -// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc6_45.2: = bound_method %int_5, %specific_fn [concrete = constants.%bound_method.a25] -// CHECK:STDOUT: %int.convert_checked: init %i32 = call %bound_method.loc6_45.2(%int_5) [concrete = constants.%int_5.0f6] -// CHECK:STDOUT: %.loc6_45.1: %i32 = value_of_initializer %int.convert_checked [concrete = constants.%int_5.0f6] -// CHECK:STDOUT: %.loc6_45.2: %i32 = converted %int_5, %.loc6_45.1 [concrete = constants.%int_5.0f6] -// CHECK:STDOUT: %SOME_INTERNAL_CONSTANT: %i32 = bind_name SOME_INTERNAL_CONSTANT, %.loc6_45.2 -// CHECK:STDOUT: %SomeInternalFunction.decl: %SomeInternalFunction.type = fn_decl @SomeInternalFunction [concrete = constants.%SomeInternalFunction] { -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param0 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %Make.decl: %Make.type = fn_decl @Make [concrete = constants.%Make] { -// CHECK:STDOUT: %return.patt: %pattern_type.ce2 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.ce2 = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Circle [concrete = constants.%Circle] -// CHECK:STDOUT: %return.param: ref %Circle = out_param call_param0 -// CHECK:STDOUT: %return: ref %Circle = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %struct_type.radius: type = struct_type {.radius: %i32} [concrete = constants.%struct_type.radius.251] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.radius [concrete = constants.%complete_type.5a5] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Circle -// CHECK:STDOUT: .radius [private] = %.loc5 -// CHECK:STDOUT: .SOME_INTERNAL_CONSTANT [private] = %SOME_INTERNAL_CONSTANT -// CHECK:STDOUT: .SomeInternalFunction [private] = %SomeInternalFunction.decl -// CHECK:STDOUT: .Make = %Make.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @SomeInternalFunction() -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %int_0: Core.IntLiteral = int_value 0 [concrete = constants.%int_0.5c6] -// CHECK:STDOUT: %impl.elem0: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc9_13.1: = bound_method %int_0, %impl.elem0 [concrete = constants.%Convert.bound.d04] -// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc9_13.2: = bound_method %int_0, %specific_fn [concrete = constants.%bound_method.b6e] -// CHECK:STDOUT: %int.convert_checked: init %i32 = call %bound_method.loc9_13.2(%int_0) [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %.loc9_13.1: %i32 = value_of_initializer %int.convert_checked [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %.loc9_13.2: %i32 = converted %int_0, %.loc9_13.1 [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: return %.loc9_13.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Make() -> %return.param: %Circle { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %int_5: Core.IntLiteral = int_value 5 [concrete = constants.%int_5.64b] -// CHECK:STDOUT: %.loc13_24.1: %struct_type.radius.f47 = struct_literal (%int_5) -// CHECK:STDOUT: %impl.elem0: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc13_24.1: = bound_method %int_5, %impl.elem0 [concrete = constants.%Convert.bound.4e6] -// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc13_24.2: = bound_method %int_5, %specific_fn [concrete = constants.%bound_method.a25] -// CHECK:STDOUT: %int.convert_checked: init %i32 = call %bound_method.loc13_24.2(%int_5) [concrete = constants.%int_5.0f6] -// CHECK:STDOUT: %.loc13_24.2: init %i32 = converted %int_5, %int.convert_checked [concrete = constants.%int_5.0f6] -// CHECK:STDOUT: %.loc13_24.3: ref %i32 = class_element_access %return, element0 -// CHECK:STDOUT: %.loc13_24.4: init %i32 = initialize_from %.loc13_24.2 to %.loc13_24.3 [concrete = constants.%int_5.0f6] -// CHECK:STDOUT: %.loc13_24.5: init %Circle = class_init (%.loc13_24.4), %return [concrete = constants.%Circle.val] -// CHECK:STDOUT: %.loc13_25: init %Circle = converted %.loc13_24.1, %.loc13_24.5 [concrete = constants.%Circle.val] -// CHECK:STDOUT: return %.loc13_25 to %return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Run() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %circle.patt: %pattern_type.ce2 = binding_pattern circle [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %Circle.ref.loc18_24: type = name_ref Circle, file.%Circle.decl [concrete = constants.%Circle] -// CHECK:STDOUT: %Make.ref: %Make.type = name_ref Make, @Circle.%Make.decl [concrete = constants.%Make] -// CHECK:STDOUT: %.loc18_36.1: ref %Circle = temporary_storage -// CHECK:STDOUT: %Make.call: init %Circle = call %Make.ref() to %.loc18_36.1 -// CHECK:STDOUT: %Circle.ref.loc18_15: type = name_ref Circle, file.%Circle.decl [concrete = constants.%Circle] -// CHECK:STDOUT: %.loc18_36.2: ref %Circle = temporary %.loc18_36.1, %Make.call -// CHECK:STDOUT: %circle: ref %Circle = bind_name circle, %.loc18_36.2 -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %radius.patt: %pattern_type.7ce = binding_pattern radius [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %circle.ref.loc26: ref %Circle = name_ref circle, %circle -// CHECK:STDOUT: %radius.ref.loc26: = name_ref radius, [concrete = ] -// CHECK:STDOUT: %.loc26: type = splice_block %i32 [concrete = constants.%i32] { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: } -// CHECK:STDOUT: %radius: %i32 = bind_name radius, -// CHECK:STDOUT: %circle.ref.loc34: ref %Circle = name_ref circle, %circle -// CHECK:STDOUT: %radius.ref.loc34: = name_ref radius, [concrete = ] -// CHECK:STDOUT: %int_5: Core.IntLiteral = int_value 5 [concrete = constants.%int_5.64b] -// CHECK:STDOUT: assign %radius.ref.loc34, -// CHECK:STDOUT: %circle.ref.loc42: ref %Circle = name_ref circle, %circle -// CHECK:STDOUT: %SOME_INTERNAL_CONSTANT.ref: = name_ref SOME_INTERNAL_CONSTANT, [concrete = ] -// CHECK:STDOUT: %circle.ref.loc51: ref %Circle = name_ref circle, %circle -// CHECK:STDOUT: %SomeInternalFunction.ref: = name_ref SomeInternalFunction, [concrete = ] -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_protected_field_access.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %A: type = class_type @A [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %A.elem: type = unbound_element_type %A, %i32 [concrete] -// CHECK:STDOUT: %struct_type.x: type = struct_type {.x: %i32} [concrete] -// CHECK:STDOUT: %complete_type.1ec: = complete_type_witness %struct_type.x [concrete] -// CHECK:STDOUT: %Run.type: type = fn_type @Run [concrete] -// CHECK:STDOUT: %Run: %Run.type = struct_value () [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .A = %A.decl -// CHECK:STDOUT: .Run = %Run.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %A.decl: type = class_decl @A [concrete = constants.%A] {} {} -// CHECK:STDOUT: %Run.decl: %Run.type = fn_decl @Run [concrete = constants.%Run] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @A { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc5: %A.elem = field_decl x, element0 [concrete] -// CHECK:STDOUT: %struct_type.x: type = struct_type {.x: %i32} [concrete = constants.%struct_type.x] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.x [concrete = constants.%complete_type.1ec] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%A -// CHECK:STDOUT: .x [protected] = %.loc5 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Run() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %x.patt: %pattern_type.7ce = binding_pattern x [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %A.ref: type = name_ref A, file.%A.decl [concrete = constants.%A] -// CHECK:STDOUT: %x.ref: = name_ref x, [concrete = ] -// CHECK:STDOUT: %.loc16: type = splice_block %i32 [concrete = constants.%i32] { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: } -// CHECK:STDOUT: %x: %i32 = bind_name x, -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- instance_private_field_access_on_self.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Circle: type = class_type @Circle [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %Circle.elem: type = unbound_element_type %Circle, %i32 [concrete] -// CHECK:STDOUT: %pattern_type.ce2: type = pattern_type %Circle [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %GetRadius.type: type = fn_type @GetRadius [concrete] -// CHECK:STDOUT: %GetRadius: %GetRadius.type = struct_value () [concrete] -// CHECK:STDOUT: %SomeInternalFunction.type: type = fn_type @SomeInternalFunction [concrete] -// CHECK:STDOUT: %SomeInternalFunction: %SomeInternalFunction.type = struct_value () [concrete] -// CHECK:STDOUT: %Compute.type: type = fn_type @Compute [concrete] -// CHECK:STDOUT: %Compute: %Compute.type = struct_value () [concrete] -// CHECK:STDOUT: %struct_type.radius: type = struct_type {.radius: %i32} [concrete] -// CHECK:STDOUT: %complete_type.5a5: = complete_type_witness %struct_type.radius [concrete] -// CHECK:STDOUT: %int_0.5c6: Core.IntLiteral = int_value 0 [concrete] -// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.type.205: type = facet_type <@ImplicitAs, @ImplicitAs(%i32)> [concrete] -// CHECK:STDOUT: %Convert.type.1b6: type = fn_type @Convert.1, @ImplicitAs(%i32) [concrete] -// CHECK:STDOUT: %To.c80: Core.IntLiteral = bind_symbolic_name To, 0 [symbolic] -// CHECK:STDOUT: %Convert.type.0f9: type = fn_type @Convert.2, @impl.4f9(%To.c80) [symbolic] -// CHECK:STDOUT: %Convert.f06: %Convert.type.0f9 = struct_value () [symbolic] -// CHECK:STDOUT: %ImplicitAs.impl_witness.c75: = impl_witness imports.%ImplicitAs.impl_witness_table.a2f, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.type.035: type = fn_type @Convert.2, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.956: %Convert.type.035 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.facet: %ImplicitAs.type.205 = facet_value Core.IntLiteral, (%ImplicitAs.impl_witness.c75) [concrete] -// CHECK:STDOUT: %.9c3: type = fn_type_with_self_type %Convert.type.1b6, %ImplicitAs.facet [concrete] -// CHECK:STDOUT: %Convert.bound: = bound_method %int_0.5c6, %Convert.956 [concrete] -// CHECK:STDOUT: %Convert.specific_fn: = specific_function %Convert.956, @Convert.2(%int_32) [concrete] -// CHECK:STDOUT: %bound_method: = bound_method %int_0.5c6, %Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_0.6a9: %i32 = int_value 0 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/operators/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] -// CHECK:STDOUT: %Core.import_ref.a5b: @impl.4f9.%Convert.type (%Convert.type.0f9) = import_ref Core//prelude/types/int, loc19_39, loaded [symbolic = @impl.4f9.%Convert (constants.%Convert.f06)] -// CHECK:STDOUT: %ImplicitAs.impl_witness_table.a2f = impl_witness_table (%Core.import_ref.a5b), @impl.4f9 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Circle = %Circle.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Circle.decl: type = class_decl @Circle [concrete = constants.%Circle] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Circle { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc5: %Circle.elem = field_decl radius, element0 [concrete] -// CHECK:STDOUT: %GetRadius.decl: %GetRadius.type = fn_decl @GetRadius [concrete = constants.%GetRadius] { -// CHECK:STDOUT: %self.patt: %pattern_type.ce2 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.ce2 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %self.param: %Circle = value_param call_param0 -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Circle [concrete = constants.%Circle] -// CHECK:STDOUT: %self: %Circle = bind_name self, %self.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %SomeInternalFunction.decl: %SomeInternalFunction.type = fn_decl @SomeInternalFunction [concrete = constants.%SomeInternalFunction] { -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param0 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %Compute.decl: %Compute.type = fn_decl @Compute [concrete = constants.%Compute] { -// CHECK:STDOUT: %self.patt: %pattern_type.ce2 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.ce2 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %self.param: %Circle = value_param call_param0 -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Circle [concrete = constants.%Circle] -// CHECK:STDOUT: %self: %Circle = bind_name self, %self.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %struct_type.radius: type = struct_type {.radius: %i32} [concrete = constants.%struct_type.radius] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.radius [concrete = constants.%complete_type.5a5] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Circle -// CHECK:STDOUT: .radius [private] = %.loc5 -// CHECK:STDOUT: .GetRadius = %GetRadius.decl -// CHECK:STDOUT: .SomeInternalFunction [private] = %SomeInternalFunction.decl -// CHECK:STDOUT: .Compute = %Compute.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @GetRadius(%self.param: %Circle) -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %self.ref: %Circle = name_ref self, %self -// CHECK:STDOUT: %radius.ref: %Circle.elem = name_ref radius, @Circle.%.loc5 [concrete = @Circle.%.loc5] -// CHECK:STDOUT: %.loc8_16.1: ref %i32 = class_element_access %self.ref, element0 -// CHECK:STDOUT: %.loc8_16.2: %i32 = bind_value %.loc8_16.1 -// CHECK:STDOUT: return %.loc8_16.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @SomeInternalFunction() -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %int_0: Core.IntLiteral = int_value 0 [concrete = constants.%int_0.5c6] -// CHECK:STDOUT: %impl.elem0: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc12_13.1: = bound_method %int_0, %impl.elem0 [concrete = constants.%Convert.bound] -// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc12_13.2: = bound_method %int_0, %specific_fn [concrete = constants.%bound_method] -// CHECK:STDOUT: %int.convert_checked: init %i32 = call %bound_method.loc12_13.2(%int_0) [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %.loc12_13.1: %i32 = value_of_initializer %int.convert_checked [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %.loc12_13.2: %i32 = converted %int_0, %.loc12_13.1 [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: return %.loc12_13.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Compute(%self.param: %Circle) -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %self.ref: %Circle = name_ref self, %self -// CHECK:STDOUT: %SomeInternalFunction.ref: %SomeInternalFunction.type = name_ref SomeInternalFunction, @Circle.%SomeInternalFunction.decl [concrete = constants.%SomeInternalFunction] -// CHECK:STDOUT: %SomeInternalFunction.call: init %i32 = call %SomeInternalFunction.ref() -// CHECK:STDOUT: %.loc16_39.1: %i32 = value_of_initializer %SomeInternalFunction.call -// CHECK:STDOUT: %.loc16_39.2: %i32 = converted %SomeInternalFunction.call, %.loc16_39.1 -// CHECK:STDOUT: return %.loc16_39.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- public_global_access.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %A: type = class_type @A [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %int_5.64b: Core.IntLiteral = int_value 5 [concrete] -// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.type.205: type = facet_type <@ImplicitAs, @ImplicitAs(%i32)> [concrete] -// CHECK:STDOUT: %Convert.type.1b6: type = fn_type @Convert.1, @ImplicitAs(%i32) [concrete] -// CHECK:STDOUT: %To.c80: Core.IntLiteral = bind_symbolic_name To, 0 [symbolic] -// CHECK:STDOUT: %Convert.type.0f9: type = fn_type @Convert.2, @impl.4f9(%To.c80) [symbolic] -// CHECK:STDOUT: %Convert.f06: %Convert.type.0f9 = struct_value () [symbolic] -// CHECK:STDOUT: %ImplicitAs.impl_witness.c75: = impl_witness imports.%ImplicitAs.impl_witness_table.a2f, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.type.035: type = fn_type @Convert.2, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.956: %Convert.type.035 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.facet: %ImplicitAs.type.205 = facet_value Core.IntLiteral, (%ImplicitAs.impl_witness.c75) [concrete] -// CHECK:STDOUT: %.9c3: type = fn_type_with_self_type %Convert.type.1b6, %ImplicitAs.facet [concrete] -// CHECK:STDOUT: %Convert.bound: = bound_method %int_5.64b, %Convert.956 [concrete] -// CHECK:STDOUT: %Convert.specific_fn: = specific_function %Convert.956, @Convert.2(%int_32) [concrete] -// CHECK:STDOUT: %bound_method: = bound_method %int_5.64b, %Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_5.0f6: %i32 = int_value 5 [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/operators/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] -// CHECK:STDOUT: %Core.import_ref.a5b: @impl.4f9.%Convert.type (%Convert.type.0f9) = import_ref Core//prelude/types/int, loc19_39, loaded [symbolic = @impl.4f9.%Convert (constants.%Convert.f06)] -// CHECK:STDOUT: %ImplicitAs.impl_witness_table.a2f = impl_witness_table (%Core.import_ref.a5b), @impl.4f9 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .A = %A.decl -// CHECK:STDOUT: .x = %x -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %A.decl: type = class_decl @A [concrete = constants.%A] {} {} -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %x.patt: %pattern_type.7ce = binding_pattern x [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %.loc8: type = splice_block %i32 [concrete = constants.%i32] { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: } -// CHECK:STDOUT: %x: %i32 = bind_name x, @__global_init.%x.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @A { -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %x.patt: %pattern_type.7ce = binding_pattern x [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %int_5: Core.IntLiteral = int_value 5 [concrete = constants.%int_5.64b] -// CHECK:STDOUT: %.loc5_10: type = splice_block %i32 [concrete = constants.%i32] { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: } -// CHECK:STDOUT: %impl.elem0: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc5_16.1: = bound_method %int_5, %impl.elem0 [concrete = constants.%Convert.bound] -// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc5_16.2: = bound_method %int_5, %specific_fn [concrete = constants.%bound_method] -// CHECK:STDOUT: %int.convert_checked: init %i32 = call %bound_method.loc5_16.2(%int_5) [concrete = constants.%int_5.0f6] -// CHECK:STDOUT: %.loc5_16.1: %i32 = value_of_initializer %int.convert_checked [concrete = constants.%int_5.0f6] -// CHECK:STDOUT: %.loc5_16.2: %i32 = converted %int_5, %.loc5_16.1 [concrete = constants.%int_5.0f6] -// CHECK:STDOUT: %x: %i32 = bind_name x, %.loc5_16.2 -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%A -// CHECK:STDOUT: .x = %x -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @__global_init() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %A.ref: type = name_ref A, file.%A.decl [concrete = constants.%A] -// CHECK:STDOUT: %x.ref: %i32 = name_ref x, @A.%x -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_global_access.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %A: type = class_type @A [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %int_5.64b: Core.IntLiteral = int_value 5 [concrete] -// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.type.205: type = facet_type <@ImplicitAs, @ImplicitAs(%i32)> [concrete] -// CHECK:STDOUT: %Convert.type.1b6: type = fn_type @Convert.1, @ImplicitAs(%i32) [concrete] -// CHECK:STDOUT: %To.c80: Core.IntLiteral = bind_symbolic_name To, 0 [symbolic] -// CHECK:STDOUT: %Convert.type.0f9: type = fn_type @Convert.2, @impl.4f9(%To.c80) [symbolic] -// CHECK:STDOUT: %Convert.f06: %Convert.type.0f9 = struct_value () [symbolic] -// CHECK:STDOUT: %ImplicitAs.impl_witness.c75: = impl_witness imports.%ImplicitAs.impl_witness_table.a2f, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.type.035: type = fn_type @Convert.2, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.956: %Convert.type.035 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.facet: %ImplicitAs.type.205 = facet_value Core.IntLiteral, (%ImplicitAs.impl_witness.c75) [concrete] -// CHECK:STDOUT: %.9c3: type = fn_type_with_self_type %Convert.type.1b6, %ImplicitAs.facet [concrete] -// CHECK:STDOUT: %Convert.bound: = bound_method %int_5.64b, %Convert.956 [concrete] -// CHECK:STDOUT: %Convert.specific_fn: = specific_function %Convert.956, @Convert.2(%int_32) [concrete] -// CHECK:STDOUT: %bound_method: = bound_method %int_5.64b, %Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_5.0f6: %i32 = int_value 5 [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/operators/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] -// CHECK:STDOUT: %Core.import_ref.a5b: @impl.4f9.%Convert.type (%Convert.type.0f9) = import_ref Core//prelude/types/int, loc19_39, loaded [symbolic = @impl.4f9.%Convert (constants.%Convert.f06)] -// CHECK:STDOUT: %ImplicitAs.impl_witness_table.a2f = impl_witness_table (%Core.import_ref.a5b), @impl.4f9 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .A = %A.decl -// CHECK:STDOUT: .x = %x -// CHECK:STDOUT: .y = %y -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %A.decl: type = class_decl @A [concrete = constants.%A] {} {} -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %x.patt: %pattern_type.7ce = binding_pattern x [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %.loc16: type = splice_block %i32.loc16 [concrete = constants.%i32] { -// CHECK:STDOUT: %int_32.loc16: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc16: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: } -// CHECK:STDOUT: %x: %i32 = bind_name x, -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %y.patt: %pattern_type.7ce = binding_pattern y [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %.loc24: type = splice_block %i32.loc24 [concrete = constants.%i32] { -// CHECK:STDOUT: %int_32.loc24: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc24: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: } -// CHECK:STDOUT: %y: %i32 = bind_name y, -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @A { -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %x.patt: %pattern_type.7ce = binding_pattern x [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %int_5.loc5: Core.IntLiteral = int_value 5 [concrete = constants.%int_5.64b] -// CHECK:STDOUT: %.loc5_20: type = splice_block %i32.loc5 [concrete = constants.%i32] { -// CHECK:STDOUT: %int_32.loc5: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc5: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: } -// CHECK:STDOUT: %impl.elem0.loc5: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc5_26.1: = bound_method %int_5.loc5, %impl.elem0.loc5 [concrete = constants.%Convert.bound] -// CHECK:STDOUT: %specific_fn.loc5: = specific_function %impl.elem0.loc5, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc5_26.2: = bound_method %int_5.loc5, %specific_fn.loc5 [concrete = constants.%bound_method] -// CHECK:STDOUT: %int.convert_checked.loc5: init %i32 = call %bound_method.loc5_26.2(%int_5.loc5) [concrete = constants.%int_5.0f6] -// CHECK:STDOUT: %.loc5_26.1: %i32 = value_of_initializer %int.convert_checked.loc5 [concrete = constants.%int_5.0f6] -// CHECK:STDOUT: %.loc5_26.2: %i32 = converted %int_5.loc5, %.loc5_26.1 [concrete = constants.%int_5.0f6] -// CHECK:STDOUT: %x: %i32 = bind_name x, %.loc5_26.2 -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %y.patt: %pattern_type.7ce = binding_pattern y [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %int_5.loc6: Core.IntLiteral = int_value 5 [concrete = constants.%int_5.64b] -// CHECK:STDOUT: %.loc6_18: type = splice_block %i32.loc6 [concrete = constants.%i32] { -// CHECK:STDOUT: %int_32.loc6: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc6: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: } -// CHECK:STDOUT: %impl.elem0.loc6: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc6_24.1: = bound_method %int_5.loc6, %impl.elem0.loc6 [concrete = constants.%Convert.bound] -// CHECK:STDOUT: %specific_fn.loc6: = specific_function %impl.elem0.loc6, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc6_24.2: = bound_method %int_5.loc6, %specific_fn.loc6 [concrete = constants.%bound_method] -// CHECK:STDOUT: %int.convert_checked.loc6: init %i32 = call %bound_method.loc6_24.2(%int_5.loc6) [concrete = constants.%int_5.0f6] -// CHECK:STDOUT: %.loc6_24.1: %i32 = value_of_initializer %int.convert_checked.loc6 [concrete = constants.%int_5.0f6] -// CHECK:STDOUT: %.loc6_24.2: %i32 = converted %int_5.loc6, %.loc6_24.1 [concrete = constants.%int_5.0f6] -// CHECK:STDOUT: %y: %i32 = bind_name y, %.loc6_24.2 -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%A -// CHECK:STDOUT: .x [protected] = %x -// CHECK:STDOUT: .y [private] = %y -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @__global_init() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %A.ref.loc16: type = name_ref A, file.%A.decl [concrete = constants.%A] -// CHECK:STDOUT: %x.ref: = name_ref x, [concrete = ] -// CHECK:STDOUT: %A.ref.loc24: type = name_ref A, file.%A.decl [concrete = constants.%A] -// CHECK:STDOUT: %y.ref: = name_ref y, [concrete = ] -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- self_access.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %A: type = class_type @A [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %G.type: type = fn_type @G [concrete] -// CHECK:STDOUT: %G: %G.type = struct_value () [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .A = %A.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %A.decl: type = class_decl @A [concrete = constants.%A] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @A { -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] {} {} -// CHECK:STDOUT: %G.decl: %G.type = fn_decl @G [concrete = constants.%G] {} {} -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%A -// CHECK:STDOUT: .F [private] = %F.decl -// CHECK:STDOUT: .G [private] = %G.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @G() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%A [concrete = constants.%A] -// CHECK:STDOUT: %F.ref: %F.type = name_ref F, @A.%F.decl [concrete = constants.%F] -// CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.ref() -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/adapter/adapt.carbon b/toolchain/check/testdata/class/adapter/adapt.carbon index 6e61f5978c356..498c2cafef00d 100644 --- a/toolchain/check/testdata/class/adapter/adapt.carbon +++ b/toolchain/check/testdata/class/adapter/adapt.carbon @@ -2,6 +2,8 @@ // Exceptions. See /LICENSE for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// // AUTOUPDATE // TIP: To test this file alone, run: // TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/adapter/adapt.carbon @@ -17,6 +19,7 @@ class SomeClass { var b: i32; } +//@dump-sem-ir-begin class SomeClassAdapter { adapt SomeClass; } @@ -24,6 +27,7 @@ class SomeClassAdapter { class StructAdapter { adapt {.a: i32, .b: i32}; } +//@dump-sem-ir-end // --- fail_not_extend.carbon @@ -69,10 +73,7 @@ interface I { // CHECK:STDOUT: constants { // CHECK:STDOUT: %SomeClass: type = class_type @SomeClass [concrete] // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %SomeClass.elem: type = unbound_element_type %SomeClass, %i32 [concrete] // CHECK:STDOUT: %struct_type.a.b: type = struct_type {.a: %i32, .b: %i32} [concrete] // CHECK:STDOUT: %complete_type.705: = complete_type_witness %struct_type.a.b [concrete] // CHECK:STDOUT: %SomeClassAdapter: type = class_type @SomeClassAdapter [concrete] @@ -80,44 +81,13 @@ interface I { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .SomeClass = %SomeClass.decl -// CHECK:STDOUT: .SomeClassAdapter = %SomeClassAdapter.decl -// CHECK:STDOUT: .StructAdapter = %StructAdapter.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %SomeClass.decl: type = class_decl @SomeClass [concrete = constants.%SomeClass] {} {} // CHECK:STDOUT: %SomeClassAdapter.decl: type = class_decl @SomeClassAdapter [concrete = constants.%SomeClassAdapter] {} {} // CHECK:STDOUT: %StructAdapter.decl: type = class_decl @StructAdapter [concrete = constants.%StructAdapter] {} {} // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: class @SomeClass { -// CHECK:STDOUT: %int_32.loc5: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc5: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc5: %SomeClass.elem = field_decl a, element0 [concrete] -// CHECK:STDOUT: %int_32.loc6: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc6: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc6: %SomeClass.elem = field_decl b, element1 [concrete] -// CHECK:STDOUT: %struct_type.a.b: type = struct_type {.a: %i32, .b: %i32} [concrete = constants.%struct_type.a.b] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.a.b [concrete = constants.%complete_type.705] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%SomeClass -// CHECK:STDOUT: .a = %.loc5 -// CHECK:STDOUT: .b = %.loc6 -// CHECK:STDOUT: } -// CHECK:STDOUT: // CHECK:STDOUT: class @SomeClassAdapter { // CHECK:STDOUT: %SomeClass.ref: type = name_ref SomeClass, file.%SomeClass.decl [concrete = constants.%SomeClass] // CHECK:STDOUT: adapt_decl %SomeClass.ref [concrete] @@ -130,10 +100,10 @@ interface I { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: class @StructAdapter { -// CHECK:STDOUT: %int_32.loc14_14: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc14_14: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %int_32.loc14_23: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc14_23: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] +// CHECK:STDOUT: %int_32.loc15_14: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] +// CHECK:STDOUT: %i32.loc15_14: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] +// CHECK:STDOUT: %int_32.loc15_23: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] +// CHECK:STDOUT: %i32.loc15_23: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] // CHECK:STDOUT: %struct_type.a.b: type = struct_type {.a: %i32, .b: %i32} [concrete = constants.%struct_type.a.b] // CHECK:STDOUT: adapt_decl %struct_type.a.b [concrete] // CHECK:STDOUT: %complete_type: = complete_type_witness constants.%struct_type.a.b [concrete = constants.%complete_type.705] @@ -143,126 +113,3 @@ interface I { // CHECK:STDOUT: .Self = constants.%StructAdapter // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: --- fail_not_extend.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Adapted: type = class_type @Adapted [concrete] -// CHECK:STDOUT: %F.type.967: type = fn_type @F.1 [concrete] -// CHECK:STDOUT: %F.9eb: %F.type.967 = struct_value () [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %AdaptNotExtend: type = class_type @AdaptNotExtend [concrete] -// CHECK:STDOUT: %pattern_type: type = pattern_type %AdaptNotExtend [concrete] -// CHECK:STDOUT: %F.type.b25: type = fn_type @F.2 [concrete] -// CHECK:STDOUT: %F.c41: %F.type.b25 = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Adapted = %Adapted.decl -// CHECK:STDOUT: .AdaptNotExtend = %AdaptNotExtend.decl -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Adapted.decl: type = class_decl @Adapted [concrete = constants.%Adapted] {} {} -// CHECK:STDOUT: %AdaptNotExtend.decl: type = class_decl @AdaptNotExtend [concrete = constants.%AdaptNotExtend] {} {} -// CHECK:STDOUT: %F.decl: %F.type.b25 = fn_decl @F.2 [concrete = constants.%F.c41] { -// CHECK:STDOUT: %a.patt: %pattern_type = binding_pattern a [concrete] -// CHECK:STDOUT: %a.param_patt: %pattern_type = value_param_pattern %a.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %a.param: %AdaptNotExtend = value_param call_param0 -// CHECK:STDOUT: %AdaptNotExtend.ref: type = name_ref AdaptNotExtend, file.%AdaptNotExtend.decl [concrete = constants.%AdaptNotExtend] -// CHECK:STDOUT: %a: %AdaptNotExtend = bind_name a, %a.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Adapted { -// CHECK:STDOUT: %F.decl: %F.type.967 = fn_decl @F.1 [concrete = constants.%F.9eb] {} {} -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Adapted -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @AdaptNotExtend { -// CHECK:STDOUT: %Adapted.ref: type = name_ref Adapted, file.%Adapted.decl [concrete = constants.%Adapted] -// CHECK:STDOUT: adapt_decl %Adapted.ref [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness constants.%empty_struct_type [concrete = constants.%complete_type] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%AdaptNotExtend -// CHECK:STDOUT: .Adapted = -// CHECK:STDOUT: .F = -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F.1(); -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F.2(%a.param: %AdaptNotExtend) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %a.ref: %AdaptNotExtend = name_ref a, %a -// CHECK:STDOUT: %F.ref: = name_ref F, [concrete = ] -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_misplaced.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: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %I.type: type = facet_type <@I> [concrete] -// CHECK:STDOUT: %Self: %I.type = bind_symbolic_name Self, 0 [symbolic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: .I = %I.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] {} {} -// CHECK:STDOUT: %I.decl: type = interface_decl @I [concrete = constants.%I.type] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: interface @I { -// CHECK:STDOUT: %Self: %I.type = bind_symbolic_name Self, 0 [symbolic = constants.%Self] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = %Self -// CHECK:STDOUT: witness = () -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/adapter/adapt_copy.carbon b/toolchain/check/testdata/class/adapter/adapt_copy.carbon index 2456272ec1c57..e82cad677f98a 100644 --- a/toolchain/check/testdata/class/adapter/adapt_copy.carbon +++ b/toolchain/check/testdata/class/adapter/adapt_copy.carbon @@ -2,6 +2,8 @@ // Exceptions. See /LICENSE for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// // AUTOUPDATE // TIP: To test this file alone, run: // TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/adapter/adapt_copy.carbon @@ -12,15 +14,19 @@ library "[[@TEST_NAME]]"; +//@dump-sem-ir-begin class AdaptCopyable { adapt i32; } +//@dump-sem-ir-end // We can copy an adapter by copying its value if its initializing // representation is a copy of its value representation. fn F(c: AdaptCopyable) -> AdaptCopyable { + //@dump-sem-ir-begin var d: AdaptCopyable = c; return d; + //@dump-sem-ir-end } fn InTuple(c: (AdaptCopyable, u32)) -> (AdaptCopyable, u32) { @@ -32,9 +38,11 @@ fn InTuple(c: (AdaptCopyable, u32)) -> (AdaptCopyable, u32) { library "[[@TEST_NAME]]"; +//@dump-sem-ir-begin class AdaptTuple { adapt (i32, i32); } +//@dump-sem-ir-end fn F(c: AdaptTuple) -> AdaptTuple { var d: AdaptTuple = c; @@ -106,13 +114,17 @@ fn H(a: AdaptNoncopyableIndirect) -> AdaptNoncopyableIndirect { library "[[@TEST_NAME]]"; +//@dump-sem-ir-begin class AdaptStruct { adapt {.e: i32, .f: i32}; } +//@dump-sem-ir-end fn I(g: AdaptStruct) -> AdaptStruct { + //@dump-sem-ir-begin var h: AdaptStruct = g; return h; + //@dump-sem-ir-end } fn InTuple(c: (AdaptStruct, u32)) -> (AdaptStruct, u32) { @@ -125,80 +137,17 @@ fn InTuple(c: (AdaptStruct, u32)) -> (AdaptStruct, u32) { // CHECK:STDOUT: constants { // CHECK:STDOUT: %AdaptCopyable: type = class_type @AdaptCopyable [concrete] // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %i32.builtin: type = int_type signed, %int_32 [concrete] // CHECK:STDOUT: %complete_type.f8a: = complete_type_witness %i32.builtin [concrete] // CHECK:STDOUT: %pattern_type.cdf: type = pattern_type %AdaptCopyable [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %UInt.type: type = generic_class_type @UInt [concrete] -// CHECK:STDOUT: %UInt.generic: %UInt.type = struct_value () [concrete] -// CHECK:STDOUT: %u32: type = class_type @UInt, @UInt(%int_32) [concrete] -// CHECK:STDOUT: %tuple.type.24b: type = tuple_type (type, type) [concrete] -// CHECK:STDOUT: %tuple.type.2a3: type = tuple_type (%AdaptCopyable, %u32) [concrete] -// CHECK:STDOUT: %pattern_type.813: type = pattern_type %tuple.type.2a3 [concrete] -// CHECK:STDOUT: %InTuple.type: type = fn_type @InTuple [concrete] -// CHECK:STDOUT: %InTuple: %InTuple.type = struct_value () [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: .UInt = %Core.UInt -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: %Core.UInt: %UInt.type = import_ref Core//prelude/types/uint, UInt, loaded [concrete = constants.%UInt.generic] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .AdaptCopyable = %AdaptCopyable.decl -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: .InTuple = %InTuple.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core // CHECK:STDOUT: %AdaptCopyable.decl: type = class_decl @AdaptCopyable [concrete = constants.%AdaptCopyable] {} {} -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %c.patt: %pattern_type.cdf = binding_pattern c [concrete] -// CHECK:STDOUT: %c.param_patt: %pattern_type.cdf = value_param_pattern %c.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.cdf = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.cdf = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %AdaptCopyable.ref.loc10_27: type = name_ref AdaptCopyable, file.%AdaptCopyable.decl [concrete = constants.%AdaptCopyable] -// CHECK:STDOUT: %c.param: %AdaptCopyable = value_param call_param0 -// CHECK:STDOUT: %AdaptCopyable.ref.loc10_9: type = name_ref AdaptCopyable, file.%AdaptCopyable.decl [concrete = constants.%AdaptCopyable] -// CHECK:STDOUT: %c: %AdaptCopyable = bind_name c, %c.param -// CHECK:STDOUT: %return.param: ref %AdaptCopyable = out_param call_param1 -// CHECK:STDOUT: %return: ref %AdaptCopyable = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %InTuple.decl: %InTuple.type = fn_decl @InTuple [concrete = constants.%InTuple] { -// CHECK:STDOUT: %c.patt: %pattern_type.813 = binding_pattern c [concrete] -// CHECK:STDOUT: %c.param_patt: %pattern_type.813 = value_param_pattern %c.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.813 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.813 = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %AdaptCopyable.ref.loc15_41: type = name_ref AdaptCopyable, file.%AdaptCopyable.decl [concrete = constants.%AdaptCopyable] -// CHECK:STDOUT: %int_32.loc15_56: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %u32.loc15_56: type = class_type @UInt, @UInt(constants.%int_32) [concrete = constants.%u32] -// CHECK:STDOUT: %.loc15_59.1: %tuple.type.24b = tuple_literal (%AdaptCopyable.ref.loc15_41, %u32.loc15_56) -// CHECK:STDOUT: %.loc15_59.2: type = converted %.loc15_59.1, constants.%tuple.type.2a3 [concrete = constants.%tuple.type.2a3] -// CHECK:STDOUT: %c.param: %tuple.type.2a3 = value_param call_param0 -// CHECK:STDOUT: %.loc15_34.1: type = splice_block %.loc15_34.3 [concrete = constants.%tuple.type.2a3] { -// CHECK:STDOUT: %AdaptCopyable.ref.loc15_16: type = name_ref AdaptCopyable, file.%AdaptCopyable.decl [concrete = constants.%AdaptCopyable] -// CHECK:STDOUT: %int_32.loc15_31: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %u32.loc15_31: type = class_type @UInt, @UInt(constants.%int_32) [concrete = constants.%u32] -// CHECK:STDOUT: %.loc15_34.2: %tuple.type.24b = tuple_literal (%AdaptCopyable.ref.loc15_16, %u32.loc15_31) -// CHECK:STDOUT: %.loc15_34.3: type = converted %.loc15_34.2, constants.%tuple.type.2a3 [concrete = constants.%tuple.type.2a3] -// CHECK:STDOUT: } -// CHECK:STDOUT: %c: %tuple.type.2a3 = bind_name c, %c.param -// CHECK:STDOUT: %return.param: ref %tuple.type.2a3 = out_param call_param1 -// CHECK:STDOUT: %return: ref %tuple.type.2a3 = return_slot %return.param -// CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: class @AdaptCopyable { @@ -221,50 +170,11 @@ fn InTuple(c: (AdaptStruct, u32)) -> (AdaptStruct, u32) { // CHECK:STDOUT: %d.var: ref %AdaptCopyable = var %d.var_patt // CHECK:STDOUT: %c.ref: %AdaptCopyable = name_ref c, %c // CHECK:STDOUT: assign %d.var, %c.ref -// CHECK:STDOUT: %AdaptCopyable.ref.loc11: type = name_ref AdaptCopyable, file.%AdaptCopyable.decl [concrete = constants.%AdaptCopyable] +// CHECK:STDOUT: %AdaptCopyable.ref.loc14: type = name_ref AdaptCopyable, file.%AdaptCopyable.decl [concrete = constants.%AdaptCopyable] // CHECK:STDOUT: %d: ref %AdaptCopyable = bind_name d, %d.var // CHECK:STDOUT: %d.ref: ref %AdaptCopyable = name_ref d, %d -// CHECK:STDOUT: %.loc12: %AdaptCopyable = bind_value %d.ref -// CHECK:STDOUT: return %.loc12 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @InTuple(%c.param: %tuple.type.2a3) -> %return.param: %tuple.type.2a3 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %d.patt: %pattern_type.813 = binding_pattern d [concrete] -// CHECK:STDOUT: %d.var_patt: %pattern_type.813 = var_pattern %d.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %d.var: ref %tuple.type.2a3 = var %d.var_patt -// CHECK:STDOUT: %c.ref: %tuple.type.2a3 = name_ref c, %c -// CHECK:STDOUT: %tuple.elem0.loc16_33.1: %AdaptCopyable = tuple_access %c.ref, element0 -// CHECK:STDOUT: %tuple.elem0.loc16_33.2: ref %AdaptCopyable = tuple_access %d.var, element0 -// CHECK:STDOUT: %.loc16_33.1: init %AdaptCopyable = initialize_from %tuple.elem0.loc16_33.1 to %tuple.elem0.loc16_33.2 -// CHECK:STDOUT: %tuple.elem1.loc16_33.1: %u32 = tuple_access %c.ref, element1 -// CHECK:STDOUT: %tuple.elem1.loc16_33.2: ref %u32 = tuple_access %d.var, element1 -// CHECK:STDOUT: %.loc16_33.2: init %u32 = initialize_from %tuple.elem1.loc16_33.1 to %tuple.elem1.loc16_33.2 -// CHECK:STDOUT: %.loc16_33.3: init %tuple.type.2a3 = tuple_init (%.loc16_33.1, %.loc16_33.2) to %d.var -// CHECK:STDOUT: %.loc16_3: init %tuple.type.2a3 = converted %c.ref, %.loc16_33.3 -// CHECK:STDOUT: assign %d.var, %.loc16_3 -// CHECK:STDOUT: %.loc16_29.1: type = splice_block %.loc16_29.3 [concrete = constants.%tuple.type.2a3] { -// CHECK:STDOUT: %AdaptCopyable.ref.loc16: type = name_ref AdaptCopyable, file.%AdaptCopyable.decl [concrete = constants.%AdaptCopyable] -// CHECK:STDOUT: %int_32.loc16: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %u32.loc16: type = class_type @UInt, @UInt(constants.%int_32) [concrete = constants.%u32] -// CHECK:STDOUT: %.loc16_29.2: %tuple.type.24b = tuple_literal (%AdaptCopyable.ref.loc16, %u32.loc16) -// CHECK:STDOUT: %.loc16_29.3: type = converted %.loc16_29.2, constants.%tuple.type.2a3 [concrete = constants.%tuple.type.2a3] -// CHECK:STDOUT: } -// CHECK:STDOUT: %d: ref %tuple.type.2a3 = bind_name d, %d.var -// CHECK:STDOUT: %d.ref: ref %tuple.type.2a3 = name_ref d, %d -// CHECK:STDOUT: %tuple.elem0.loc17_10.1: ref %AdaptCopyable = tuple_access %d.ref, element0 -// CHECK:STDOUT: %.loc17_10.1: %AdaptCopyable = bind_value %tuple.elem0.loc17_10.1 -// CHECK:STDOUT: %tuple.elem0.loc17_10.2: ref %AdaptCopyable = tuple_access %return, element0 -// CHECK:STDOUT: %.loc17_10.2: init %AdaptCopyable = initialize_from %.loc17_10.1 to %tuple.elem0.loc17_10.2 -// CHECK:STDOUT: %tuple.elem1.loc17_10.1: ref %u32 = tuple_access %d.ref, element1 -// CHECK:STDOUT: %.loc17_10.3: %u32 = bind_value %tuple.elem1.loc17_10.1 -// CHECK:STDOUT: %tuple.elem1.loc17_10.2: ref %u32 = tuple_access %return, element1 -// CHECK:STDOUT: %.loc17_10.4: init %u32 = initialize_from %.loc17_10.3 to %tuple.elem1.loc17_10.2 -// CHECK:STDOUT: %.loc17_10.5: init %tuple.type.2a3 = tuple_init (%.loc17_10.2, %.loc17_10.4) to %return -// CHECK:STDOUT: %.loc17_11: init %tuple.type.2a3 = converted %d.ref, %.loc17_10.5 -// CHECK:STDOUT: return %.loc17_11 to %return +// CHECK:STDOUT: %.loc15: %AdaptCopyable = bind_value %d.ref +// CHECK:STDOUT: return %.loc15 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- adapt_copyable_tuple.carbon @@ -272,90 +182,27 @@ fn InTuple(c: (AdaptStruct, u32)) -> (AdaptStruct, u32) { // CHECK:STDOUT: constants { // CHECK:STDOUT: %AdaptTuple: type = class_type @AdaptTuple [concrete] // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %tuple.type.24b: type = tuple_type (type, type) [concrete] // CHECK:STDOUT: %tuple.type.d07: type = tuple_type (%i32, %i32) [concrete] // CHECK:STDOUT: %complete_type.65d: = complete_type_witness %tuple.type.d07 [concrete] -// CHECK:STDOUT: %pattern_type.562: type = pattern_type %AdaptTuple [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %UInt.type: type = generic_class_type @UInt [concrete] -// CHECK:STDOUT: %UInt.generic: %UInt.type = struct_value () [concrete] -// CHECK:STDOUT: %u32: type = class_type @UInt, @UInt(%int_32) [concrete] -// CHECK:STDOUT: %tuple.type.f69: type = tuple_type (%AdaptTuple, %u32) [concrete] -// CHECK:STDOUT: %pattern_type.c9e: type = pattern_type %tuple.type.f69 [concrete] -// CHECK:STDOUT: %InTuple.type: type = fn_type @InTuple [concrete] -// CHECK:STDOUT: %InTuple: %InTuple.type = struct_value () [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: .UInt = %Core.UInt -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: %Core.UInt: %UInt.type = import_ref Core//prelude/types/uint, UInt, loaded [concrete = constants.%UInt.generic] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .AdaptTuple = %AdaptTuple.decl -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: .InTuple = %InTuple.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core // CHECK:STDOUT: %AdaptTuple.decl: type = class_decl @AdaptTuple [concrete = constants.%AdaptTuple] {} {} -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %c.patt: %pattern_type.562 = binding_pattern c [concrete] -// CHECK:STDOUT: %c.param_patt: %pattern_type.562 = value_param_pattern %c.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.562 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.562 = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %AdaptTuple.ref.loc8_24: type = name_ref AdaptTuple, file.%AdaptTuple.decl [concrete = constants.%AdaptTuple] -// CHECK:STDOUT: %c.param: %AdaptTuple = value_param call_param0 -// CHECK:STDOUT: %AdaptTuple.ref.loc8_9: type = name_ref AdaptTuple, file.%AdaptTuple.decl [concrete = constants.%AdaptTuple] -// CHECK:STDOUT: %c: %AdaptTuple = bind_name c, %c.param -// CHECK:STDOUT: %return.param: ref %AdaptTuple = out_param call_param1 -// CHECK:STDOUT: %return: ref %AdaptTuple = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %InTuple.decl: %InTuple.type = fn_decl @InTuple [concrete = constants.%InTuple] { -// CHECK:STDOUT: %c.patt: %pattern_type.c9e = binding_pattern c [concrete] -// CHECK:STDOUT: %c.param_patt: %pattern_type.c9e = value_param_pattern %c.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.c9e = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.c9e = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %AdaptTuple.ref.loc13_38: type = name_ref AdaptTuple, file.%AdaptTuple.decl [concrete = constants.%AdaptTuple] -// CHECK:STDOUT: %int_32.loc13_50: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %u32.loc13_50: type = class_type @UInt, @UInt(constants.%int_32) [concrete = constants.%u32] -// CHECK:STDOUT: %.loc13_53.1: %tuple.type.24b = tuple_literal (%AdaptTuple.ref.loc13_38, %u32.loc13_50) -// CHECK:STDOUT: %.loc13_53.2: type = converted %.loc13_53.1, constants.%tuple.type.f69 [concrete = constants.%tuple.type.f69] -// CHECK:STDOUT: %c.param: %tuple.type.f69 = value_param call_param0 -// CHECK:STDOUT: %.loc13_31.1: type = splice_block %.loc13_31.3 [concrete = constants.%tuple.type.f69] { -// CHECK:STDOUT: %AdaptTuple.ref.loc13_16: type = name_ref AdaptTuple, file.%AdaptTuple.decl [concrete = constants.%AdaptTuple] -// CHECK:STDOUT: %int_32.loc13_28: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %u32.loc13_28: type = class_type @UInt, @UInt(constants.%int_32) [concrete = constants.%u32] -// CHECK:STDOUT: %.loc13_31.2: %tuple.type.24b = tuple_literal (%AdaptTuple.ref.loc13_16, %u32.loc13_28) -// CHECK:STDOUT: %.loc13_31.3: type = converted %.loc13_31.2, constants.%tuple.type.f69 [concrete = constants.%tuple.type.f69] -// CHECK:STDOUT: } -// CHECK:STDOUT: %c: %tuple.type.f69 = bind_name c, %c.param -// CHECK:STDOUT: %return.param: ref %tuple.type.f69 = out_param call_param1 -// CHECK:STDOUT: %return: ref %tuple.type.f69 = return_slot %return.param -// CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: class @AdaptTuple { -// CHECK:STDOUT: %int_32.loc5_10: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc5_10: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %int_32.loc5_15: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc5_15: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc5_18: %tuple.type.24b = tuple_literal (%i32.loc5_10, %i32.loc5_15) -// CHECK:STDOUT: %.loc5_19: type = converted %.loc5_18, constants.%tuple.type.d07 [concrete = constants.%tuple.type.d07] -// CHECK:STDOUT: adapt_decl %.loc5_19 [concrete] +// CHECK:STDOUT: %int_32.loc6_10: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] +// CHECK:STDOUT: %i32.loc6_10: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] +// CHECK:STDOUT: %int_32.loc6_15: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] +// CHECK:STDOUT: %i32.loc6_15: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] +// CHECK:STDOUT: %.loc6_18: %tuple.type.24b = tuple_literal (%i32.loc6_10, %i32.loc6_15) +// CHECK:STDOUT: %.loc6_19: type = converted %.loc6_18, constants.%tuple.type.d07 [concrete = constants.%tuple.type.d07] +// CHECK:STDOUT: adapt_decl %.loc6_19 [concrete] // CHECK:STDOUT: %complete_type: = complete_type_witness constants.%tuple.type.d07 [concrete = constants.%complete_type.65d] // CHECK:STDOUT: complete_type_witness = %complete_type // CHECK:STDOUT: @@ -363,379 +210,29 @@ fn InTuple(c: (AdaptStruct, u32)) -> (AdaptStruct, u32) { // CHECK:STDOUT: .Self = constants.%AdaptTuple // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: fn @F(%c.param: %AdaptTuple) -> %return.param: %AdaptTuple { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %d.patt: %pattern_type.562 = binding_pattern d [concrete] -// CHECK:STDOUT: %d.var_patt: %pattern_type.562 = var_pattern %d.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %d.var: ref %AdaptTuple = var %d.var_patt -// CHECK:STDOUT: %c.ref: %AdaptTuple = name_ref c, %c -// CHECK:STDOUT: %.loc9_3.1: %tuple.type.d07 = as_compatible %c.ref -// CHECK:STDOUT: %tuple.elem0.loc9_3.1: %i32 = tuple_access %.loc9_3.1, element0 -// CHECK:STDOUT: %.loc9_3.2: ref %tuple.type.d07 = as_compatible %d.var -// CHECK:STDOUT: %tuple.elem0.loc9_3.2: ref %i32 = tuple_access %.loc9_3.2, element0 -// CHECK:STDOUT: %.loc9_3.3: init %i32 = initialize_from %tuple.elem0.loc9_3.1 to %tuple.elem0.loc9_3.2 -// CHECK:STDOUT: %tuple.elem1.loc9_3.1: %i32 = tuple_access %.loc9_3.1, element1 -// CHECK:STDOUT: %tuple.elem1.loc9_3.2: ref %i32 = tuple_access %.loc9_3.2, element1 -// CHECK:STDOUT: %.loc9_3.4: init %i32 = initialize_from %tuple.elem1.loc9_3.1 to %tuple.elem1.loc9_3.2 -// CHECK:STDOUT: %.loc9_3.5: init %tuple.type.d07 = tuple_init (%.loc9_3.3, %.loc9_3.4) to %.loc9_3.2 -// CHECK:STDOUT: %.loc9_3.6: init %AdaptTuple = as_compatible %.loc9_3.5 -// CHECK:STDOUT: %.loc9_3.7: init %AdaptTuple = converted %c.ref, %.loc9_3.6 -// CHECK:STDOUT: assign %d.var, %.loc9_3.7 -// CHECK:STDOUT: %AdaptTuple.ref.loc9: type = name_ref AdaptTuple, file.%AdaptTuple.decl [concrete = constants.%AdaptTuple] -// CHECK:STDOUT: %d: ref %AdaptTuple = bind_name d, %d.var -// CHECK:STDOUT: %d.ref: ref %AdaptTuple = name_ref d, %d -// CHECK:STDOUT: %.loc10_11.1: ref %tuple.type.d07 = as_compatible %d.ref -// CHECK:STDOUT: %tuple.elem0.loc10_11.1: ref %i32 = tuple_access %.loc10_11.1, element0 -// CHECK:STDOUT: %.loc10_11.2: %i32 = bind_value %tuple.elem0.loc10_11.1 -// CHECK:STDOUT: %.loc10_11.3: ref %tuple.type.d07 = as_compatible %return -// CHECK:STDOUT: %tuple.elem0.loc10_11.2: ref %i32 = tuple_access %.loc10_11.3, element0 -// CHECK:STDOUT: %.loc10_11.4: init %i32 = initialize_from %.loc10_11.2 to %tuple.elem0.loc10_11.2 -// CHECK:STDOUT: %tuple.elem1.loc10_11.1: ref %i32 = tuple_access %.loc10_11.1, element1 -// CHECK:STDOUT: %.loc10_11.5: %i32 = bind_value %tuple.elem1.loc10_11.1 -// CHECK:STDOUT: %tuple.elem1.loc10_11.2: ref %i32 = tuple_access %.loc10_11.3, element1 -// CHECK:STDOUT: %.loc10_11.6: init %i32 = initialize_from %.loc10_11.5 to %tuple.elem1.loc10_11.2 -// CHECK:STDOUT: %.loc10_11.7: init %tuple.type.d07 = tuple_init (%.loc10_11.4, %.loc10_11.6) to %.loc10_11.3 -// CHECK:STDOUT: %.loc10_11.8: init %AdaptTuple = as_compatible %.loc10_11.7 -// CHECK:STDOUT: %.loc10_11.9: init %AdaptTuple = converted %d.ref, %.loc10_11.8 -// CHECK:STDOUT: return %.loc10_11.9 to %return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @InTuple(%c.param: %tuple.type.f69) -> %return.param: %tuple.type.f69 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %d.patt: %pattern_type.c9e = binding_pattern d [concrete] -// CHECK:STDOUT: %d.var_patt: %pattern_type.c9e = var_pattern %d.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %d.var: ref %tuple.type.f69 = var %d.var_patt -// CHECK:STDOUT: %c.ref: %tuple.type.f69 = name_ref c, %c -// CHECK:STDOUT: %tuple.elem0.loc14_30.1: %AdaptTuple = tuple_access %c.ref, element0 -// CHECK:STDOUT: %.loc14_30.1: %tuple.type.d07 = as_compatible %tuple.elem0.loc14_30.1 -// CHECK:STDOUT: %tuple.elem0.loc14_30.2: %i32 = tuple_access %.loc14_30.1, element0 -// CHECK:STDOUT: %tuple.elem0.loc14_30.3: ref %AdaptTuple = tuple_access %d.var, element0 -// CHECK:STDOUT: %.loc14_30.2: ref %tuple.type.d07 = as_compatible %tuple.elem0.loc14_30.3 -// CHECK:STDOUT: %tuple.elem0.loc14_30.4: ref %i32 = tuple_access %.loc14_30.2, element0 -// CHECK:STDOUT: %.loc14_30.3: init %i32 = initialize_from %tuple.elem0.loc14_30.2 to %tuple.elem0.loc14_30.4 -// CHECK:STDOUT: %tuple.elem1.loc14_30.1: %i32 = tuple_access %.loc14_30.1, element1 -// CHECK:STDOUT: %tuple.elem1.loc14_30.2: ref %i32 = tuple_access %.loc14_30.2, element1 -// CHECK:STDOUT: %.loc14_30.4: init %i32 = initialize_from %tuple.elem1.loc14_30.1 to %tuple.elem1.loc14_30.2 -// CHECK:STDOUT: %.loc14_30.5: init %tuple.type.d07 = tuple_init (%.loc14_30.3, %.loc14_30.4) to %.loc14_30.2 -// CHECK:STDOUT: %.loc14_30.6: init %AdaptTuple = as_compatible %.loc14_30.5 -// CHECK:STDOUT: %.loc14_30.7: init %AdaptTuple = converted %tuple.elem0.loc14_30.1, %.loc14_30.6 -// CHECK:STDOUT: %tuple.elem1.loc14_30.3: %u32 = tuple_access %c.ref, element1 -// CHECK:STDOUT: %tuple.elem1.loc14_30.4: ref %u32 = tuple_access %d.var, element1 -// CHECK:STDOUT: %.loc14_30.8: init %u32 = initialize_from %tuple.elem1.loc14_30.3 to %tuple.elem1.loc14_30.4 -// CHECK:STDOUT: %.loc14_30.9: init %tuple.type.f69 = tuple_init (%.loc14_30.7, %.loc14_30.8) to %d.var -// CHECK:STDOUT: %.loc14_3: init %tuple.type.f69 = converted %c.ref, %.loc14_30.9 -// CHECK:STDOUT: assign %d.var, %.loc14_3 -// CHECK:STDOUT: %.loc14_26.1: type = splice_block %.loc14_26.3 [concrete = constants.%tuple.type.f69] { -// CHECK:STDOUT: %AdaptTuple.ref.loc14: type = name_ref AdaptTuple, file.%AdaptTuple.decl [concrete = constants.%AdaptTuple] -// CHECK:STDOUT: %int_32.loc14: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %u32.loc14: type = class_type @UInt, @UInt(constants.%int_32) [concrete = constants.%u32] -// CHECK:STDOUT: %.loc14_26.2: %tuple.type.24b = tuple_literal (%AdaptTuple.ref.loc14, %u32.loc14) -// CHECK:STDOUT: %.loc14_26.3: type = converted %.loc14_26.2, constants.%tuple.type.f69 [concrete = constants.%tuple.type.f69] -// CHECK:STDOUT: } -// CHECK:STDOUT: %d: ref %tuple.type.f69 = bind_name d, %d.var -// CHECK:STDOUT: %d.ref: ref %tuple.type.f69 = name_ref d, %d -// CHECK:STDOUT: %tuple.elem0.loc15_10.1: ref %AdaptTuple = tuple_access %d.ref, element0 -// CHECK:STDOUT: %.loc15_10.1: ref %tuple.type.d07 = as_compatible %tuple.elem0.loc15_10.1 -// CHECK:STDOUT: %tuple.elem0.loc15_10.2: ref %i32 = tuple_access %.loc15_10.1, element0 -// CHECK:STDOUT: %.loc15_10.2: %i32 = bind_value %tuple.elem0.loc15_10.2 -// CHECK:STDOUT: %tuple.elem0.loc15_10.3: ref %AdaptTuple = tuple_access %return, element0 -// CHECK:STDOUT: %.loc15_10.3: ref %tuple.type.d07 = as_compatible %tuple.elem0.loc15_10.3 -// CHECK:STDOUT: %tuple.elem0.loc15_10.4: ref %i32 = tuple_access %.loc15_10.3, element0 -// CHECK:STDOUT: %.loc15_10.4: init %i32 = initialize_from %.loc15_10.2 to %tuple.elem0.loc15_10.4 -// CHECK:STDOUT: %tuple.elem1.loc15_10.1: ref %i32 = tuple_access %.loc15_10.1, element1 -// CHECK:STDOUT: %.loc15_10.5: %i32 = bind_value %tuple.elem1.loc15_10.1 -// CHECK:STDOUT: %tuple.elem1.loc15_10.2: ref %i32 = tuple_access %.loc15_10.3, element1 -// CHECK:STDOUT: %.loc15_10.6: init %i32 = initialize_from %.loc15_10.5 to %tuple.elem1.loc15_10.2 -// CHECK:STDOUT: %.loc15_10.7: init %tuple.type.d07 = tuple_init (%.loc15_10.4, %.loc15_10.6) to %.loc15_10.3 -// CHECK:STDOUT: %.loc15_10.8: init %AdaptTuple = as_compatible %.loc15_10.7 -// CHECK:STDOUT: %.loc15_10.9: init %AdaptTuple = converted %tuple.elem0.loc15_10.1, %.loc15_10.8 -// CHECK:STDOUT: %tuple.elem1.loc15_10.3: ref %u32 = tuple_access %d.ref, element1 -// CHECK:STDOUT: %.loc15_10.10: %u32 = bind_value %tuple.elem1.loc15_10.3 -// CHECK:STDOUT: %tuple.elem1.loc15_10.4: ref %u32 = tuple_access %return, element1 -// CHECK:STDOUT: %.loc15_10.11: init %u32 = initialize_from %.loc15_10.10 to %tuple.elem1.loc15_10.4 -// CHECK:STDOUT: %.loc15_10.12: init %tuple.type.f69 = tuple_init (%.loc15_10.9, %.loc15_10.11) to %return -// CHECK:STDOUT: %.loc15_11: init %tuple.type.f69 = converted %d.ref, %.loc15_10.12 -// CHECK:STDOUT: return %.loc15_11 to %return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_adapt_not_copyable.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Noncopyable: type = class_type @Noncopyable [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %AdaptNoncopyable: type = class_type @AdaptNoncopyable [concrete] -// CHECK:STDOUT: %pattern_type: type = pattern_type %AdaptNoncopyable [concrete] -// CHECK:STDOUT: %G.type: type = fn_type @G [concrete] -// CHECK:STDOUT: %G: %G.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Noncopyable = %Noncopyable.decl -// CHECK:STDOUT: .AdaptNoncopyable = %AdaptNoncopyable.decl -// CHECK:STDOUT: .G = %G.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Noncopyable.decl: type = class_decl @Noncopyable [concrete = constants.%Noncopyable] {} {} -// CHECK:STDOUT: %AdaptNoncopyable.decl: type = class_decl @AdaptNoncopyable [concrete = constants.%AdaptNoncopyable] {} {} -// CHECK:STDOUT: %G.decl: %G.type = fn_decl @G [concrete = constants.%G] { -// CHECK:STDOUT: %a.patt: %pattern_type = binding_pattern a [concrete] -// CHECK:STDOUT: %a.param_patt: %pattern_type = value_param_pattern %a.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %AdaptNoncopyable.ref.loc12_30: type = name_ref AdaptNoncopyable, file.%AdaptNoncopyable.decl [concrete = constants.%AdaptNoncopyable] -// CHECK:STDOUT: %a.param: %AdaptNoncopyable = value_param call_param0 -// CHECK:STDOUT: %AdaptNoncopyable.ref.loc12_9: type = name_ref AdaptNoncopyable, file.%AdaptNoncopyable.decl [concrete = constants.%AdaptNoncopyable] -// CHECK:STDOUT: %a: %AdaptNoncopyable = bind_name a, %a.param -// CHECK:STDOUT: %return.param: ref %AdaptNoncopyable = out_param call_param1 -// CHECK:STDOUT: %return: ref %AdaptNoncopyable = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Noncopyable { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Noncopyable -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @AdaptNoncopyable { -// CHECK:STDOUT: %Noncopyable.ref: type = name_ref Noncopyable, file.%Noncopyable.decl [concrete = constants.%Noncopyable] -// CHECK:STDOUT: adapt_decl %Noncopyable.ref [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness constants.%empty_struct_type [concrete = constants.%complete_type] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%AdaptNoncopyable -// CHECK:STDOUT: .Noncopyable = -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @G(%a.param: %AdaptNoncopyable) -> %return.param: %AdaptNoncopyable { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %b.patt: %pattern_type = binding_pattern b [concrete] -// CHECK:STDOUT: %b.var_patt: %pattern_type = var_pattern %b.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %b.var: ref %AdaptNoncopyable = var %b.var_patt -// CHECK:STDOUT: %a.ref: %AdaptNoncopyable = name_ref a, %a -// CHECK:STDOUT: assign %b.var, -// CHECK:STDOUT: %AdaptNoncopyable.ref.loc17: type = name_ref AdaptNoncopyable, file.%AdaptNoncopyable.decl [concrete = constants.%AdaptNoncopyable] -// CHECK:STDOUT: %b: ref %AdaptNoncopyable = bind_name b, %b.var -// CHECK:STDOUT: %b.ref: ref %AdaptNoncopyable = name_ref b, %b -// CHECK:STDOUT: %.loc22: %AdaptNoncopyable = bind_value %b.ref -// CHECK:STDOUT: return to %return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_adapt_not_copyable_indirect.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Noncopyable: type = class_type @Noncopyable [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %AdaptNoncopyableIndirect: type = class_type @AdaptNoncopyableIndirect [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %tuple.type.ff9: type = tuple_type (type, type, type) [concrete] -// CHECK:STDOUT: %tuple.type.c9a: type = tuple_type (%i32, %Noncopyable, %i32) [concrete] -// CHECK:STDOUT: %complete_type.201: = complete_type_witness %tuple.type.c9a [concrete] -// CHECK:STDOUT: %pattern_type.7e5: type = pattern_type %AdaptNoncopyableIndirect [concrete] -// CHECK:STDOUT: %H.type: type = fn_type @H [concrete] -// CHECK:STDOUT: %H: %H.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Noncopyable = %Noncopyable.decl -// CHECK:STDOUT: .AdaptNoncopyableIndirect = %AdaptNoncopyableIndirect.decl -// CHECK:STDOUT: .H = %H.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Noncopyable.decl: type = class_decl @Noncopyable [concrete = constants.%Noncopyable] {} {} -// CHECK:STDOUT: %AdaptNoncopyableIndirect.decl: type = class_decl @AdaptNoncopyableIndirect [concrete = constants.%AdaptNoncopyableIndirect] {} {} -// CHECK:STDOUT: %H.decl: %H.type = fn_decl @H [concrete = constants.%H] { -// CHECK:STDOUT: %a.patt: %pattern_type.7e5 = binding_pattern a [concrete] -// CHECK:STDOUT: %a.param_patt: %pattern_type.7e5 = value_param_pattern %a.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7e5 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7e5 = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %AdaptNoncopyableIndirect.ref.loc12_38: type = name_ref AdaptNoncopyableIndirect, file.%AdaptNoncopyableIndirect.decl [concrete = constants.%AdaptNoncopyableIndirect] -// CHECK:STDOUT: %a.param: %AdaptNoncopyableIndirect = value_param call_param0 -// CHECK:STDOUT: %AdaptNoncopyableIndirect.ref.loc12_9: type = name_ref AdaptNoncopyableIndirect, file.%AdaptNoncopyableIndirect.decl [concrete = constants.%AdaptNoncopyableIndirect] -// CHECK:STDOUT: %a: %AdaptNoncopyableIndirect = bind_name a, %a.param -// CHECK:STDOUT: %return.param: ref %AdaptNoncopyableIndirect = out_param call_param1 -// CHECK:STDOUT: %return: ref %AdaptNoncopyableIndirect = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Noncopyable { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Noncopyable -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @AdaptNoncopyableIndirect { -// CHECK:STDOUT: %int_32.loc9_10: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc9_10: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %Noncopyable.ref: type = name_ref Noncopyable, file.%Noncopyable.decl [concrete = constants.%Noncopyable] -// CHECK:STDOUT: %int_32.loc9_28: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc9_28: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc9_31: %tuple.type.ff9 = tuple_literal (%i32.loc9_10, %Noncopyable.ref, %i32.loc9_28) -// CHECK:STDOUT: %.loc9_32: type = converted %.loc9_31, constants.%tuple.type.c9a [concrete = constants.%tuple.type.c9a] -// CHECK:STDOUT: adapt_decl %.loc9_32 [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness constants.%tuple.type.c9a [concrete = constants.%complete_type.201] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%AdaptNoncopyableIndirect -// CHECK:STDOUT: .Noncopyable = -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @H(%a.param: %AdaptNoncopyableIndirect) -> %return.param: %AdaptNoncopyableIndirect { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %b.patt: %pattern_type.7e5 = binding_pattern b [concrete] -// CHECK:STDOUT: %b.var_patt: %pattern_type.7e5 = var_pattern %b.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %b.var: ref %AdaptNoncopyableIndirect = var %b.var_patt -// CHECK:STDOUT: %a.ref: %AdaptNoncopyableIndirect = name_ref a, %a -// CHECK:STDOUT: %.loc20_3.1: %tuple.type.c9a = as_compatible %a.ref -// CHECK:STDOUT: %tuple.elem0.loc20_3.1: %i32 = tuple_access %.loc20_3.1, element0 -// CHECK:STDOUT: %.loc20_3.2: ref %tuple.type.c9a = as_compatible %b.var -// CHECK:STDOUT: %tuple.elem0.loc20_3.2: ref %i32 = tuple_access %.loc20_3.2, element0 -// CHECK:STDOUT: %.loc20_3.3: init %i32 = initialize_from %tuple.elem0.loc20_3.1 to %tuple.elem0.loc20_3.2 -// CHECK:STDOUT: %tuple.elem1.loc20: %Noncopyable = tuple_access %.loc20_3.1, element1 -// CHECK:STDOUT: assign %b.var, -// CHECK:STDOUT: %AdaptNoncopyableIndirect.ref.loc20: type = name_ref AdaptNoncopyableIndirect, file.%AdaptNoncopyableIndirect.decl [concrete = constants.%AdaptNoncopyableIndirect] -// CHECK:STDOUT: %b: ref %AdaptNoncopyableIndirect = bind_name b, %b.var -// CHECK:STDOUT: %b.ref: ref %AdaptNoncopyableIndirect = name_ref b, %b -// CHECK:STDOUT: %.loc28_11.1: ref %tuple.type.c9a = as_compatible %b.ref -// CHECK:STDOUT: %tuple.elem0.loc28_11.1: ref %i32 = tuple_access %.loc28_11.1, element0 -// CHECK:STDOUT: %.loc28_11.2: %i32 = bind_value %tuple.elem0.loc28_11.1 -// CHECK:STDOUT: %.loc28_11.3: ref %tuple.type.c9a = as_compatible %return -// CHECK:STDOUT: %tuple.elem0.loc28_11.2: ref %i32 = tuple_access %.loc28_11.3, element0 -// CHECK:STDOUT: %.loc28_11.4: init %i32 = initialize_from %.loc28_11.2 to %tuple.elem0.loc28_11.2 -// CHECK:STDOUT: %tuple.elem1.loc28: ref %Noncopyable = tuple_access %.loc28_11.1, element1 -// CHECK:STDOUT: %.loc28_11.5: %Noncopyable = bind_value %tuple.elem1.loc28 -// CHECK:STDOUT: return to %return -// CHECK:STDOUT: } -// CHECK:STDOUT: // CHECK:STDOUT: --- adapt_copyable_struct.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { // CHECK:STDOUT: %AdaptStruct: type = class_type @AdaptStruct [concrete] // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %struct_type.e.f: type = struct_type {.e: %i32, .f: %i32} [concrete] // CHECK:STDOUT: %complete_type.511: = complete_type_witness %struct_type.e.f [concrete] // CHECK:STDOUT: %pattern_type.f45: type = pattern_type %AdaptStruct [concrete] -// CHECK:STDOUT: %I.type: type = fn_type @I [concrete] -// CHECK:STDOUT: %I: %I.type = struct_value () [concrete] -// CHECK:STDOUT: %UInt.type: type = generic_class_type @UInt [concrete] -// CHECK:STDOUT: %UInt.generic: %UInt.type = struct_value () [concrete] -// CHECK:STDOUT: %u32: type = class_type @UInt, @UInt(%int_32) [concrete] -// CHECK:STDOUT: %tuple.type.24b: type = tuple_type (type, type) [concrete] -// CHECK:STDOUT: %tuple.type.80b: type = tuple_type (%AdaptStruct, %u32) [concrete] -// CHECK:STDOUT: %pattern_type.31d: type = pattern_type %tuple.type.80b [concrete] -// CHECK:STDOUT: %InTuple.type: type = fn_type @InTuple [concrete] -// CHECK:STDOUT: %InTuple: %InTuple.type = struct_value () [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: .UInt = %Core.UInt -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: %Core.UInt: %UInt.type = import_ref Core//prelude/types/uint, UInt, loaded [concrete = constants.%UInt.generic] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .AdaptStruct = %AdaptStruct.decl -// CHECK:STDOUT: .I = %I.decl -// CHECK:STDOUT: .InTuple = %InTuple.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core // CHECK:STDOUT: %AdaptStruct.decl: type = class_decl @AdaptStruct [concrete = constants.%AdaptStruct] {} {} -// CHECK:STDOUT: %I.decl: %I.type = fn_decl @I [concrete = constants.%I] { -// CHECK:STDOUT: %g.patt: %pattern_type.f45 = binding_pattern g [concrete] -// CHECK:STDOUT: %g.param_patt: %pattern_type.f45 = value_param_pattern %g.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.f45 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.f45 = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %AdaptStruct.ref.loc8_25: type = name_ref AdaptStruct, file.%AdaptStruct.decl [concrete = constants.%AdaptStruct] -// CHECK:STDOUT: %g.param: %AdaptStruct = value_param call_param0 -// CHECK:STDOUT: %AdaptStruct.ref.loc8_9: type = name_ref AdaptStruct, file.%AdaptStruct.decl [concrete = constants.%AdaptStruct] -// CHECK:STDOUT: %g: %AdaptStruct = bind_name g, %g.param -// CHECK:STDOUT: %return.param: ref %AdaptStruct = out_param call_param1 -// CHECK:STDOUT: %return: ref %AdaptStruct = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %InTuple.decl: %InTuple.type = fn_decl @InTuple [concrete = constants.%InTuple] { -// CHECK:STDOUT: %c.patt: %pattern_type.31d = binding_pattern c [concrete] -// CHECK:STDOUT: %c.param_patt: %pattern_type.31d = value_param_pattern %c.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.31d = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.31d = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %AdaptStruct.ref.loc13_39: type = name_ref AdaptStruct, file.%AdaptStruct.decl [concrete = constants.%AdaptStruct] -// CHECK:STDOUT: %int_32.loc13_52: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %u32.loc13_52: type = class_type @UInt, @UInt(constants.%int_32) [concrete = constants.%u32] -// CHECK:STDOUT: %.loc13_55.1: %tuple.type.24b = tuple_literal (%AdaptStruct.ref.loc13_39, %u32.loc13_52) -// CHECK:STDOUT: %.loc13_55.2: type = converted %.loc13_55.1, constants.%tuple.type.80b [concrete = constants.%tuple.type.80b] -// CHECK:STDOUT: %c.param: %tuple.type.80b = value_param call_param0 -// CHECK:STDOUT: %.loc13_32.1: type = splice_block %.loc13_32.3 [concrete = constants.%tuple.type.80b] { -// CHECK:STDOUT: %AdaptStruct.ref.loc13_16: type = name_ref AdaptStruct, file.%AdaptStruct.decl [concrete = constants.%AdaptStruct] -// CHECK:STDOUT: %int_32.loc13_29: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %u32.loc13_29: type = class_type @UInt, @UInt(constants.%int_32) [concrete = constants.%u32] -// CHECK:STDOUT: %.loc13_32.2: %tuple.type.24b = tuple_literal (%AdaptStruct.ref.loc13_16, %u32.loc13_29) -// CHECK:STDOUT: %.loc13_32.3: type = converted %.loc13_32.2, constants.%tuple.type.80b [concrete = constants.%tuple.type.80b] -// CHECK:STDOUT: } -// CHECK:STDOUT: %c: %tuple.type.80b = bind_name c, %c.param -// CHECK:STDOUT: %return.param: ref %tuple.type.80b = out_param call_param1 -// CHECK:STDOUT: %return: ref %tuple.type.80b = return_slot %return.param -// CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: class @AdaptStruct { -// CHECK:STDOUT: %int_32.loc5_14: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc5_14: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %int_32.loc5_23: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc5_23: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] +// CHECK:STDOUT: %int_32.loc6_14: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] +// CHECK:STDOUT: %i32.loc6_14: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] +// CHECK:STDOUT: %int_32.loc6_23: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] +// CHECK:STDOUT: %i32.loc6_23: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] // CHECK:STDOUT: %struct_type.e.f: type = struct_type {.e: %i32, .f: %i32} [concrete = constants.%struct_type.e.f] // CHECK:STDOUT: adapt_decl %struct_type.e.f [concrete] // CHECK:STDOUT: %complete_type: = complete_type_witness constants.%struct_type.e.f [concrete = constants.%complete_type.511] @@ -753,94 +250,34 @@ fn InTuple(c: (AdaptStruct, u32)) -> (AdaptStruct, u32) { // CHECK:STDOUT: } // CHECK:STDOUT: %h.var: ref %AdaptStruct = var %h.var_patt // CHECK:STDOUT: %g.ref: %AdaptStruct = name_ref g, %g -// CHECK:STDOUT: %.loc9_3.1: %struct_type.e.f = as_compatible %g.ref -// CHECK:STDOUT: %.loc9_3.2: %i32 = struct_access %.loc9_3.1, element0 -// CHECK:STDOUT: %.loc9_3.3: ref %struct_type.e.f = as_compatible %h.var -// CHECK:STDOUT: %.loc9_3.4: ref %i32 = struct_access %.loc9_3.3, element0 -// CHECK:STDOUT: %.loc9_3.5: init %i32 = initialize_from %.loc9_3.2 to %.loc9_3.4 -// CHECK:STDOUT: %.loc9_3.6: %i32 = struct_access %.loc9_3.1, element1 -// CHECK:STDOUT: %.loc9_3.7: ref %i32 = struct_access %.loc9_3.3, element1 -// CHECK:STDOUT: %.loc9_3.8: init %i32 = initialize_from %.loc9_3.6 to %.loc9_3.7 -// CHECK:STDOUT: %.loc9_3.9: init %struct_type.e.f = struct_init (%.loc9_3.5, %.loc9_3.8) to %.loc9_3.3 -// CHECK:STDOUT: %.loc9_3.10: init %AdaptStruct = as_compatible %.loc9_3.9 -// CHECK:STDOUT: %.loc9_3.11: init %AdaptStruct = converted %g.ref, %.loc9_3.10 -// CHECK:STDOUT: assign %h.var, %.loc9_3.11 -// CHECK:STDOUT: %AdaptStruct.ref.loc9: type = name_ref AdaptStruct, file.%AdaptStruct.decl [concrete = constants.%AdaptStruct] +// CHECK:STDOUT: %.loc12_3.1: %struct_type.e.f = as_compatible %g.ref +// CHECK:STDOUT: %.loc12_3.2: %i32 = struct_access %.loc12_3.1, element0 +// CHECK:STDOUT: %.loc12_3.3: ref %struct_type.e.f = as_compatible %h.var +// CHECK:STDOUT: %.loc12_3.4: ref %i32 = struct_access %.loc12_3.3, element0 +// CHECK:STDOUT: %.loc12_3.5: init %i32 = initialize_from %.loc12_3.2 to %.loc12_3.4 +// CHECK:STDOUT: %.loc12_3.6: %i32 = struct_access %.loc12_3.1, element1 +// CHECK:STDOUT: %.loc12_3.7: ref %i32 = struct_access %.loc12_3.3, element1 +// CHECK:STDOUT: %.loc12_3.8: init %i32 = initialize_from %.loc12_3.6 to %.loc12_3.7 +// CHECK:STDOUT: %.loc12_3.9: init %struct_type.e.f = struct_init (%.loc12_3.5, %.loc12_3.8) to %.loc12_3.3 +// CHECK:STDOUT: %.loc12_3.10: init %AdaptStruct = as_compatible %.loc12_3.9 +// CHECK:STDOUT: %.loc12_3.11: init %AdaptStruct = converted %g.ref, %.loc12_3.10 +// CHECK:STDOUT: assign %h.var, %.loc12_3.11 +// CHECK:STDOUT: %AdaptStruct.ref.loc12: type = name_ref AdaptStruct, file.%AdaptStruct.decl [concrete = constants.%AdaptStruct] // CHECK:STDOUT: %h: ref %AdaptStruct = bind_name h, %h.var // CHECK:STDOUT: %h.ref: ref %AdaptStruct = name_ref h, %h -// CHECK:STDOUT: %.loc10_11.1: ref %struct_type.e.f = as_compatible %h.ref -// CHECK:STDOUT: %.loc10_11.2: ref %i32 = struct_access %.loc10_11.1, element0 -// CHECK:STDOUT: %.loc10_11.3: %i32 = bind_value %.loc10_11.2 -// CHECK:STDOUT: %.loc10_11.4: ref %struct_type.e.f = as_compatible %return -// CHECK:STDOUT: %.loc10_11.5: ref %i32 = struct_access %.loc10_11.4, element0 -// CHECK:STDOUT: %.loc10_11.6: init %i32 = initialize_from %.loc10_11.3 to %.loc10_11.5 -// CHECK:STDOUT: %.loc10_11.7: ref %i32 = struct_access %.loc10_11.1, element1 -// CHECK:STDOUT: %.loc10_11.8: %i32 = bind_value %.loc10_11.7 -// CHECK:STDOUT: %.loc10_11.9: ref %i32 = struct_access %.loc10_11.4, element1 -// CHECK:STDOUT: %.loc10_11.10: init %i32 = initialize_from %.loc10_11.8 to %.loc10_11.9 -// CHECK:STDOUT: %.loc10_11.11: init %struct_type.e.f = struct_init (%.loc10_11.6, %.loc10_11.10) to %.loc10_11.4 -// CHECK:STDOUT: %.loc10_11.12: init %AdaptStruct = as_compatible %.loc10_11.11 -// CHECK:STDOUT: %.loc10_11.13: init %AdaptStruct = converted %h.ref, %.loc10_11.12 -// CHECK:STDOUT: return %.loc10_11.13 to %return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @InTuple(%c.param: %tuple.type.80b) -> %return.param: %tuple.type.80b { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %d.patt: %pattern_type.31d = binding_pattern d [concrete] -// CHECK:STDOUT: %d.var_patt: %pattern_type.31d = var_pattern %d.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %d.var: ref %tuple.type.80b = var %d.var_patt -// CHECK:STDOUT: %c.ref: %tuple.type.80b = name_ref c, %c -// CHECK:STDOUT: %tuple.elem0.loc14_31.1: %AdaptStruct = tuple_access %c.ref, element0 -// CHECK:STDOUT: %.loc14_31.1: %struct_type.e.f = as_compatible %tuple.elem0.loc14_31.1 -// CHECK:STDOUT: %.loc14_31.2: %i32 = struct_access %.loc14_31.1, element0 -// CHECK:STDOUT: %tuple.elem0.loc14_31.2: ref %AdaptStruct = tuple_access %d.var, element0 -// CHECK:STDOUT: %.loc14_31.3: ref %struct_type.e.f = as_compatible %tuple.elem0.loc14_31.2 -// CHECK:STDOUT: %.loc14_31.4: ref %i32 = struct_access %.loc14_31.3, element0 -// CHECK:STDOUT: %.loc14_31.5: init %i32 = initialize_from %.loc14_31.2 to %.loc14_31.4 -// CHECK:STDOUT: %.loc14_31.6: %i32 = struct_access %.loc14_31.1, element1 -// CHECK:STDOUT: %.loc14_31.7: ref %i32 = struct_access %.loc14_31.3, element1 -// CHECK:STDOUT: %.loc14_31.8: init %i32 = initialize_from %.loc14_31.6 to %.loc14_31.7 -// CHECK:STDOUT: %.loc14_31.9: init %struct_type.e.f = struct_init (%.loc14_31.5, %.loc14_31.8) to %.loc14_31.3 -// CHECK:STDOUT: %.loc14_31.10: init %AdaptStruct = as_compatible %.loc14_31.9 -// CHECK:STDOUT: %.loc14_31.11: init %AdaptStruct = converted %tuple.elem0.loc14_31.1, %.loc14_31.10 -// CHECK:STDOUT: %tuple.elem1.loc14_31.1: %u32 = tuple_access %c.ref, element1 -// CHECK:STDOUT: %tuple.elem1.loc14_31.2: ref %u32 = tuple_access %d.var, element1 -// CHECK:STDOUT: %.loc14_31.12: init %u32 = initialize_from %tuple.elem1.loc14_31.1 to %tuple.elem1.loc14_31.2 -// CHECK:STDOUT: %.loc14_31.13: init %tuple.type.80b = tuple_init (%.loc14_31.11, %.loc14_31.12) to %d.var -// CHECK:STDOUT: %.loc14_3: init %tuple.type.80b = converted %c.ref, %.loc14_31.13 -// CHECK:STDOUT: assign %d.var, %.loc14_3 -// CHECK:STDOUT: %.loc14_27.1: type = splice_block %.loc14_27.3 [concrete = constants.%tuple.type.80b] { -// CHECK:STDOUT: %AdaptStruct.ref.loc14: type = name_ref AdaptStruct, file.%AdaptStruct.decl [concrete = constants.%AdaptStruct] -// CHECK:STDOUT: %int_32.loc14: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %u32.loc14: type = class_type @UInt, @UInt(constants.%int_32) [concrete = constants.%u32] -// CHECK:STDOUT: %.loc14_27.2: %tuple.type.24b = tuple_literal (%AdaptStruct.ref.loc14, %u32.loc14) -// CHECK:STDOUT: %.loc14_27.3: type = converted %.loc14_27.2, constants.%tuple.type.80b [concrete = constants.%tuple.type.80b] -// CHECK:STDOUT: } -// CHECK:STDOUT: %d: ref %tuple.type.80b = bind_name d, %d.var -// CHECK:STDOUT: %d.ref: ref %tuple.type.80b = name_ref d, %d -// CHECK:STDOUT: %tuple.elem0.loc15_10.1: ref %AdaptStruct = tuple_access %d.ref, element0 -// CHECK:STDOUT: %.loc15_10.1: ref %struct_type.e.f = as_compatible %tuple.elem0.loc15_10.1 -// CHECK:STDOUT: %.loc15_10.2: ref %i32 = struct_access %.loc15_10.1, element0 -// CHECK:STDOUT: %.loc15_10.3: %i32 = bind_value %.loc15_10.2 -// CHECK:STDOUT: %tuple.elem0.loc15_10.2: ref %AdaptStruct = tuple_access %return, element0 -// CHECK:STDOUT: %.loc15_10.4: ref %struct_type.e.f = as_compatible %tuple.elem0.loc15_10.2 -// CHECK:STDOUT: %.loc15_10.5: ref %i32 = struct_access %.loc15_10.4, element0 -// CHECK:STDOUT: %.loc15_10.6: init %i32 = initialize_from %.loc15_10.3 to %.loc15_10.5 -// CHECK:STDOUT: %.loc15_10.7: ref %i32 = struct_access %.loc15_10.1, element1 -// CHECK:STDOUT: %.loc15_10.8: %i32 = bind_value %.loc15_10.7 -// CHECK:STDOUT: %.loc15_10.9: ref %i32 = struct_access %.loc15_10.4, element1 -// CHECK:STDOUT: %.loc15_10.10: init %i32 = initialize_from %.loc15_10.8 to %.loc15_10.9 -// CHECK:STDOUT: %.loc15_10.11: init %struct_type.e.f = struct_init (%.loc15_10.6, %.loc15_10.10) to %.loc15_10.4 -// CHECK:STDOUT: %.loc15_10.12: init %AdaptStruct = as_compatible %.loc15_10.11 -// CHECK:STDOUT: %.loc15_10.13: init %AdaptStruct = converted %tuple.elem0.loc15_10.1, %.loc15_10.12 -// CHECK:STDOUT: %tuple.elem1.loc15_10.1: ref %u32 = tuple_access %d.ref, element1 -// CHECK:STDOUT: %.loc15_10.14: %u32 = bind_value %tuple.elem1.loc15_10.1 -// CHECK:STDOUT: %tuple.elem1.loc15_10.2: ref %u32 = tuple_access %return, element1 -// CHECK:STDOUT: %.loc15_10.15: init %u32 = initialize_from %.loc15_10.14 to %tuple.elem1.loc15_10.2 -// CHECK:STDOUT: %.loc15_10.16: init %tuple.type.80b = tuple_init (%.loc15_10.13, %.loc15_10.15) to %return -// CHECK:STDOUT: %.loc15_11: init %tuple.type.80b = converted %d.ref, %.loc15_10.16 -// CHECK:STDOUT: return %.loc15_11 to %return +// CHECK:STDOUT: %.loc13_11.1: ref %struct_type.e.f = as_compatible %h.ref +// CHECK:STDOUT: %.loc13_11.2: ref %i32 = struct_access %.loc13_11.1, element0 +// CHECK:STDOUT: %.loc13_11.3: %i32 = bind_value %.loc13_11.2 +// CHECK:STDOUT: %.loc13_11.4: ref %struct_type.e.f = as_compatible %return +// CHECK:STDOUT: %.loc13_11.5: ref %i32 = struct_access %.loc13_11.4, element0 +// CHECK:STDOUT: %.loc13_11.6: init %i32 = initialize_from %.loc13_11.3 to %.loc13_11.5 +// CHECK:STDOUT: %.loc13_11.7: ref %i32 = struct_access %.loc13_11.1, element1 +// CHECK:STDOUT: %.loc13_11.8: %i32 = bind_value %.loc13_11.7 +// CHECK:STDOUT: %.loc13_11.9: ref %i32 = struct_access %.loc13_11.4, element1 +// CHECK:STDOUT: %.loc13_11.10: init %i32 = initialize_from %.loc13_11.8 to %.loc13_11.9 +// CHECK:STDOUT: %.loc13_11.11: init %struct_type.e.f = struct_init (%.loc13_11.6, %.loc13_11.10) to %.loc13_11.4 +// CHECK:STDOUT: %.loc13_11.12: init %AdaptStruct = as_compatible %.loc13_11.11 +// CHECK:STDOUT: %.loc13_11.13: init %AdaptStruct = converted %h.ref, %.loc13_11.12 +// CHECK:STDOUT: return %.loc13_11.13 to %return // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/adapter/extend_adapt.carbon b/toolchain/check/testdata/class/adapter/extend_adapt.carbon index 48f9f6fe2714c..e376aaff42520 100644 --- a/toolchain/check/testdata/class/adapter/extend_adapt.carbon +++ b/toolchain/check/testdata/class/adapter/extend_adapt.carbon @@ -2,6 +2,8 @@ // Exceptions. See /LICENSE for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// // AUTOUPDATE // TIP: To test this file alone, run: // TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/adapter/extend_adapt.carbon @@ -23,16 +25,22 @@ class SomeClass { fn AdapterMethod[self: SomeClassAdapter](); } +//@dump-sem-ir-begin class SomeClassAdapter { extend adapt SomeClass; } +//@dump-sem-ir-end fn TestStaticMemberFunction(a: SomeClassAdapter) { + //@dump-sem-ir-begin a.StaticMemberFunction(); + //@dump-sem-ir-end } fn TestAdapterMethod(a: SomeClassAdapter) { + //@dump-sem-ir-begin a.AdapterMethod(); + //@dump-sem-ir-end } // --- fail_todo_method_access.carbon @@ -144,61 +152,21 @@ fn F(a: IntAdapter) -> i32 { // CHECK:STDOUT: %SomeClassAdapter: type = class_type @SomeClassAdapter [concrete] // CHECK:STDOUT: %SomeClass: type = class_type @SomeClass [concrete] // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] // CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %SomeClass.elem: type = unbound_element_type %SomeClass, %i32 [concrete] // CHECK:STDOUT: %StaticMemberFunction.type: type = fn_type @StaticMemberFunction [concrete] // CHECK:STDOUT: %StaticMemberFunction: %StaticMemberFunction.type = struct_value () [concrete] -// CHECK:STDOUT: %pattern_type.080: type = pattern_type %SomeClassAdapter [concrete] // CHECK:STDOUT: %AdapterMethod.type: type = fn_type @AdapterMethod [concrete] // CHECK:STDOUT: %AdapterMethod: %AdapterMethod.type = struct_value () [concrete] // CHECK:STDOUT: %struct_type.a.b: type = struct_type {.a: %i32, .b: %i32} [concrete] // CHECK:STDOUT: %complete_type.705: = complete_type_witness %struct_type.a.b [concrete] -// CHECK:STDOUT: %TestStaticMemberFunction.type: type = fn_type @TestStaticMemberFunction [concrete] -// CHECK:STDOUT: %TestStaticMemberFunction: %TestStaticMemberFunction.type = struct_value () [concrete] -// CHECK:STDOUT: %TestAdapterMethod.type: type = fn_type @TestAdapterMethod [concrete] -// CHECK:STDOUT: %TestAdapterMethod: %TestAdapterMethod.type = struct_value () [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .SomeClassAdapter = %SomeClassAdapter.decl.loc4 -// CHECK:STDOUT: .SomeClass = %SomeClass.decl -// CHECK:STDOUT: .TestStaticMemberFunction = %TestStaticMemberFunction.decl -// CHECK:STDOUT: .TestAdapterMethod = %TestAdapterMethod.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %SomeClassAdapter.decl.loc4: type = class_decl @SomeClassAdapter [concrete = constants.%SomeClassAdapter] {} {} -// CHECK:STDOUT: %SomeClass.decl: type = class_decl @SomeClass [concrete = constants.%SomeClass] {} {} -// CHECK:STDOUT: %SomeClassAdapter.decl.loc15: type = class_decl @SomeClassAdapter [concrete = constants.%SomeClassAdapter] {} {} -// CHECK:STDOUT: %TestStaticMemberFunction.decl: %TestStaticMemberFunction.type = fn_decl @TestStaticMemberFunction [concrete = constants.%TestStaticMemberFunction] { -// CHECK:STDOUT: %a.patt: %pattern_type.080 = binding_pattern a [concrete] -// CHECK:STDOUT: %a.param_patt: %pattern_type.080 = value_param_pattern %a.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %a.param: %SomeClassAdapter = value_param call_param0 -// CHECK:STDOUT: %SomeClassAdapter.ref: type = name_ref SomeClassAdapter, file.%SomeClassAdapter.decl.loc4 [concrete = constants.%SomeClassAdapter] -// CHECK:STDOUT: %a: %SomeClassAdapter = bind_name a, %a.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %TestAdapterMethod.decl: %TestAdapterMethod.type = fn_decl @TestAdapterMethod [concrete = constants.%TestAdapterMethod] { -// CHECK:STDOUT: %a.patt: %pattern_type.080 = binding_pattern a [concrete] -// CHECK:STDOUT: %a.param_patt: %pattern_type.080 = value_param_pattern %a.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %a.param: %SomeClassAdapter = value_param call_param0 -// CHECK:STDOUT: %SomeClassAdapter.ref: type = name_ref SomeClassAdapter, file.%SomeClassAdapter.decl.loc4 [concrete = constants.%SomeClassAdapter] -// CHECK:STDOUT: %a: %SomeClassAdapter = bind_name a, %a.param -// CHECK:STDOUT: } +// CHECK:STDOUT: %SomeClassAdapter.decl.loc16: type = class_decl @SomeClassAdapter [concrete = constants.%SomeClassAdapter] {} {} // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: class @SomeClassAdapter { @@ -215,45 +183,12 @@ fn F(a: IntAdapter) -> i32 { // CHECK:STDOUT: extend %SomeClass.ref // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: class @SomeClass { -// CHECK:STDOUT: %int_32.loc7: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc7: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc7: %SomeClass.elem = field_decl a, element0 [concrete] -// CHECK:STDOUT: %int_32.loc8: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc8: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc8: %SomeClass.elem = field_decl b, element1 [concrete] -// CHECK:STDOUT: %StaticMemberFunction.decl: %StaticMemberFunction.type = fn_decl @StaticMemberFunction [concrete = constants.%StaticMemberFunction] {} {} -// CHECK:STDOUT: %AdapterMethod.decl: %AdapterMethod.type = fn_decl @AdapterMethod [concrete = constants.%AdapterMethod] { -// CHECK:STDOUT: %self.patt: %pattern_type.080 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.080 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %SomeClassAdapter = value_param call_param0 -// CHECK:STDOUT: %SomeClassAdapter.ref: type = name_ref SomeClassAdapter, file.%SomeClassAdapter.decl.loc4 [concrete = constants.%SomeClassAdapter] -// CHECK:STDOUT: %self: %SomeClassAdapter = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %struct_type.a.b: type = struct_type {.a: %i32, .b: %i32} [concrete = constants.%struct_type.a.b] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.a.b [concrete = constants.%complete_type.705] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%SomeClass -// CHECK:STDOUT: .a = %.loc7 -// CHECK:STDOUT: .b = %.loc8 -// CHECK:STDOUT: .StaticMemberFunction = %StaticMemberFunction.decl -// CHECK:STDOUT: .SomeClassAdapter = -// CHECK:STDOUT: .AdapterMethod = %AdapterMethod.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @StaticMemberFunction(); -// CHECK:STDOUT: -// CHECK:STDOUT: fn @AdapterMethod(%self.param: %SomeClassAdapter); -// CHECK:STDOUT: // CHECK:STDOUT: fn @TestStaticMemberFunction(%a.param: %SomeClassAdapter) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %a.ref: %SomeClassAdapter = name_ref a, %a // CHECK:STDOUT: %StaticMemberFunction.ref: %StaticMemberFunction.type = name_ref StaticMemberFunction, @SomeClass.%StaticMemberFunction.decl [concrete = constants.%StaticMemberFunction] // CHECK:STDOUT: %StaticMemberFunction.call: init %empty_tuple.type = call %StaticMemberFunction.ref() -// CHECK:STDOUT: return +// CHECK:STDOUT: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @TestAdapterMethod(%a.param: %SomeClassAdapter) { @@ -262,440 +197,6 @@ fn F(a: IntAdapter) -> i32 { // CHECK:STDOUT: %AdapterMethod.ref: %AdapterMethod.type = name_ref AdapterMethod, @SomeClass.%AdapterMethod.decl [concrete = constants.%AdapterMethod] // CHECK:STDOUT: %AdapterMethod.bound: = bound_method %a.ref, %AdapterMethod.ref // CHECK:STDOUT: %AdapterMethod.call: init %empty_tuple.type = call %AdapterMethod.bound(%a.ref) -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_todo_method_access.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %SomeClass: type = class_type @SomeClass [concrete] -// CHECK:STDOUT: %pattern_type.3eb: type = pattern_type %SomeClass [concrete] -// CHECK:STDOUT: %F.type.633: type = fn_type @F.1 [concrete] -// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] -// CHECK:STDOUT: %F.e19: %F.type.633 = struct_value () [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %SomeClassAdapter: type = class_type @SomeClassAdapter [concrete] -// CHECK:STDOUT: %pattern_type.080: type = pattern_type %SomeClassAdapter [concrete] -// CHECK:STDOUT: %F.type.b25: type = fn_type @F.2 [concrete] -// CHECK:STDOUT: %F.c41: %F.type.b25 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/operators/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .SomeClass = %SomeClass.decl -// CHECK:STDOUT: .SomeClassAdapter = %SomeClassAdapter.decl -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %SomeClass.decl: type = class_decl @SomeClass [concrete = constants.%SomeClass] {} {} -// CHECK:STDOUT: %SomeClassAdapter.decl: type = class_decl @SomeClassAdapter [concrete = constants.%SomeClassAdapter] {} {} -// CHECK:STDOUT: %F.decl: %F.type.b25 = fn_decl @F.2 [concrete = constants.%F.c41] { -// CHECK:STDOUT: %a.patt: %pattern_type.080 = binding_pattern a [concrete] -// CHECK:STDOUT: %a.param_patt: %pattern_type.080 = value_param_pattern %a.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %a.param: %SomeClassAdapter = value_param call_param0 -// CHECK:STDOUT: %SomeClassAdapter.ref: type = name_ref SomeClassAdapter, file.%SomeClassAdapter.decl [concrete = constants.%SomeClassAdapter] -// CHECK:STDOUT: %a: %SomeClassAdapter = bind_name a, %a.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @SomeClass { -// CHECK:STDOUT: %F.decl: %F.type.633 = fn_decl @F.1 [concrete = constants.%F.e19] { -// CHECK:STDOUT: %self.patt: %pattern_type.3eb = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.3eb = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %SomeClass = value_param call_param0 -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%SomeClass [concrete = constants.%SomeClass] -// CHECK:STDOUT: %self: %SomeClass = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%SomeClass -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @SomeClassAdapter { -// CHECK:STDOUT: %SomeClass.ref: type = name_ref SomeClass, file.%SomeClass.decl [concrete = constants.%SomeClass] -// CHECK:STDOUT: adapt_decl %SomeClass.ref [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness constants.%empty_struct_type [concrete = constants.%complete_type] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%SomeClassAdapter -// CHECK:STDOUT: .SomeClass = -// CHECK:STDOUT: .F = -// CHECK:STDOUT: extend %SomeClass.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F.1(%self.param: %SomeClass); -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F.2(%a.param: %SomeClassAdapter) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %a.ref: %SomeClassAdapter = name_ref a, %a -// CHECK:STDOUT: %F.ref: %F.type.633 = name_ref F, @SomeClass.%F.decl [concrete = constants.%F.e19] -// CHECK:STDOUT: %F.bound: = bound_method %a.ref, %F.ref -// CHECK:STDOUT: %.loc23: %SomeClass = converted %a.ref, [concrete = ] -// CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.bound() -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_todo_field_access.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %SomeClass: type = class_type @SomeClass [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %SomeClass.elem: type = unbound_element_type %SomeClass, %i32 [concrete] -// CHECK:STDOUT: %struct_type.a.b: type = struct_type {.a: %i32, .b: %i32} [concrete] -// CHECK:STDOUT: %complete_type.705: = complete_type_witness %struct_type.a.b [concrete] -// CHECK:STDOUT: %SomeClassAdapter: type = class_type @SomeClassAdapter [concrete] -// CHECK:STDOUT: %pattern_type.080: type = pattern_type %SomeClassAdapter [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/operators/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .SomeClass = %SomeClass.decl -// CHECK:STDOUT: .SomeClassAdapter = %SomeClassAdapter.decl -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %SomeClass.decl: type = class_decl @SomeClass [concrete = constants.%SomeClass] {} {} -// CHECK:STDOUT: %SomeClassAdapter.decl: type = class_decl @SomeClassAdapter [concrete = constants.%SomeClassAdapter] {} {} -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %a.patt: %pattern_type.080 = binding_pattern a [concrete] -// CHECK:STDOUT: %a.param_patt: %pattern_type.080 = value_param_pattern %a.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %a.param: %SomeClassAdapter = value_param call_param0 -// CHECK:STDOUT: %SomeClassAdapter.ref: type = name_ref SomeClassAdapter, file.%SomeClassAdapter.decl [concrete = constants.%SomeClassAdapter] -// CHECK:STDOUT: %a: %SomeClassAdapter = bind_name a, %a.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @SomeClass { -// CHECK:STDOUT: %int_32.loc5: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc5: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc5: %SomeClass.elem = field_decl a, element0 [concrete] -// CHECK:STDOUT: %int_32.loc6: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc6: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc6: %SomeClass.elem = field_decl b, element1 [concrete] -// CHECK:STDOUT: %struct_type.a.b: type = struct_type {.a: %i32, .b: %i32} [concrete = constants.%struct_type.a.b] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.a.b [concrete = constants.%complete_type.705] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%SomeClass -// CHECK:STDOUT: .a = %.loc5 -// CHECK:STDOUT: .b = %.loc6 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @SomeClassAdapter { -// CHECK:STDOUT: %SomeClass.ref: type = name_ref SomeClass, file.%SomeClass.decl [concrete = constants.%SomeClass] -// CHECK:STDOUT: adapt_decl %SomeClass.ref [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness constants.%struct_type.a.b [concrete = constants.%complete_type.705] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%SomeClassAdapter -// CHECK:STDOUT: .SomeClass = -// CHECK:STDOUT: .b = -// CHECK:STDOUT: extend %SomeClass.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F(%a.param: %SomeClassAdapter) -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %a.ref: %SomeClassAdapter = name_ref a, %a -// CHECK:STDOUT: %b.ref: %SomeClass.elem = name_ref b, @SomeClass.%.loc6 [concrete = @SomeClass.%.loc6] -// CHECK:STDOUT: %.loc21_11.1: %SomeClass = converted %a.ref, [concrete = ] -// CHECK:STDOUT: %.loc21_11.2: %i32 = class_element_access , element1 [concrete = ] -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_todo_adapt_struct.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %StructAdapter: type = class_type @StructAdapter [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %struct_type.a.b: type = struct_type {.a: %i32, .b: %i32} [concrete] -// CHECK:STDOUT: %complete_type.705: = complete_type_witness %struct_type.a.b [concrete] -// CHECK:STDOUT: %pattern_type.016: type = pattern_type %StructAdapter [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .StructAdapter = %StructAdapter.decl -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %StructAdapter.decl: type = class_decl @StructAdapter [concrete = constants.%StructAdapter] {} {} -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %a.patt: %pattern_type.016 = binding_pattern a [concrete] -// CHECK:STDOUT: %a.param_patt: %pattern_type.016 = value_param_pattern %a.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %a.param: %StructAdapter = value_param call_param0 -// CHECK:STDOUT: %StructAdapter.ref: type = name_ref StructAdapter, file.%StructAdapter.decl [concrete = constants.%StructAdapter] -// CHECK:STDOUT: %a: %StructAdapter = bind_name a, %a.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @StructAdapter { -// CHECK:STDOUT: %int_32.loc5_21: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc5_21: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %int_32.loc5_30: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc5_30: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %struct_type.a.b: type = struct_type {.a: %i32, .b: %i32} [concrete = constants.%struct_type.a.b] -// CHECK:STDOUT: adapt_decl %struct_type.a.b [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness constants.%struct_type.a.b [concrete = constants.%complete_type.705] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%StructAdapter -// CHECK:STDOUT: .b = -// CHECK:STDOUT: extend %struct_type.a.b -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F(%a.param: %StructAdapter) -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %a.ref: %StructAdapter = name_ref a, %a -// CHECK:STDOUT: %b.ref: = name_ref b, [concrete = ] -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_todo_adapt_tuple.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %TupleAdapter: type = class_type @TupleAdapter [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %tuple.type.24b: type = tuple_type (type, type) [concrete] -// CHECK:STDOUT: %tuple.type.d07: type = tuple_type (%i32, %i32) [concrete] -// CHECK:STDOUT: %complete_type.65d: = complete_type_witness %tuple.type.d07 [concrete] -// CHECK:STDOUT: %pattern_type.ee1: type = pattern_type %TupleAdapter [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %int_1: Core.IntLiteral = int_value 1 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .TupleAdapter = %TupleAdapter.decl -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %TupleAdapter.decl: type = class_decl @TupleAdapter [concrete = constants.%TupleAdapter] {} {} -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %a.patt: %pattern_type.ee1 = binding_pattern a [concrete] -// CHECK:STDOUT: %a.param_patt: %pattern_type.ee1 = value_param_pattern %a.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %a.param: %TupleAdapter = value_param call_param0 -// CHECK:STDOUT: %TupleAdapter.ref: type = name_ref TupleAdapter, file.%TupleAdapter.decl [concrete = constants.%TupleAdapter] -// CHECK:STDOUT: %a: %TupleAdapter = bind_name a, %a.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @TupleAdapter { -// CHECK:STDOUT: %int_32.loc5_17: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc5_17: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %int_32.loc5_22: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc5_22: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc5_25: %tuple.type.24b = tuple_literal (%i32.loc5_17, %i32.loc5_22) -// CHECK:STDOUT: %.loc5_26: type = converted %.loc5_25, constants.%tuple.type.d07 [concrete = constants.%tuple.type.d07] -// CHECK:STDOUT: adapt_decl %.loc5_26 [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness constants.%tuple.type.d07 [concrete = constants.%complete_type.65d] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%TupleAdapter -// CHECK:STDOUT: extend %.loc5_26 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F(%a.param: %TupleAdapter) -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %a.ref: %TupleAdapter = name_ref a, %a -// CHECK:STDOUT: %int_1: Core.IntLiteral = int_value 1 [concrete = constants.%int_1] -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_adapt_builtin.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %IntLiteral.type: type = fn_type @IntLiteral [concrete] -// CHECK:STDOUT: %IntLiteral: %IntLiteral.type = struct_value () [concrete] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] -// CHECK:STDOUT: %pattern_type.dc0: type = pattern_type Core.IntLiteral [concrete] -// CHECK:STDOUT: %MakeInt.type: type = fn_type @MakeInt [concrete] -// CHECK:STDOUT: %MakeInt: %MakeInt.type = struct_value () [concrete] -// CHECK:STDOUT: %IntAdapter: type = class_type @IntAdapter [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %i32.builtin: type = int_type signed, %int_32 [concrete] -// CHECK:STDOUT: %complete_type.f8a: = complete_type_witness %i32.builtin [concrete] -// CHECK:STDOUT: %pattern_type.90a: type = pattern_type %IntAdapter [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .IntLiteral = %Core.IntLiteral -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.IntLiteral: %IntLiteral.type = import_ref Core//prelude/types/int_literal, IntLiteral, loaded [concrete = constants.%IntLiteral] -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .MakeInt = %MakeInt.decl -// CHECK:STDOUT: .IntAdapter = %IntAdapter.decl -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %MakeInt.decl: %MakeInt.type = fn_decl @MakeInt [concrete = constants.%MakeInt] { -// CHECK:STDOUT: %N.patt: %pattern_type.dc0 = binding_pattern N [concrete] -// CHECK:STDOUT: %N.param_patt: %pattern_type.dc0 = value_param_pattern %N.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.98f = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.98f = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %N.param: Core.IntLiteral = value_param call_param0 -// CHECK:STDOUT: %.loc4_31.1: type = splice_block %.loc4_31.3 [concrete = Core.IntLiteral] { -// CHECK:STDOUT: %Core.ref: = name_ref Core, imports.%Core [concrete = imports.%Core] -// CHECK:STDOUT: %IntLiteral.ref: %IntLiteral.type = name_ref IntLiteral, imports.%Core.IntLiteral [concrete = constants.%IntLiteral] -// CHECK:STDOUT: %int_literal.make_type: init type = call %IntLiteral.ref() [concrete = Core.IntLiteral] -// CHECK:STDOUT: %.loc4_31.2: type = value_of_initializer %int_literal.make_type [concrete = Core.IntLiteral] -// CHECK:STDOUT: %.loc4_31.3: type = converted %int_literal.make_type, %.loc4_31.2 [concrete = Core.IntLiteral] -// CHECK:STDOUT: } -// CHECK:STDOUT: %N: Core.IntLiteral = bind_name N, %N.param -// CHECK:STDOUT: %return.param: ref type = out_param call_param1 -// CHECK:STDOUT: %return: ref type = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %IntAdapter.decl: type = class_decl @IntAdapter [concrete = constants.%IntAdapter] {} {} -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %a.patt: %pattern_type.90a = binding_pattern a [concrete] -// CHECK:STDOUT: %a.param_patt: %pattern_type.90a = value_param_pattern %a.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %a.param: %IntAdapter = value_param call_param0 -// CHECK:STDOUT: %IntAdapter.ref: type = name_ref IntAdapter, file.%IntAdapter.decl [concrete = constants.%IntAdapter] -// CHECK:STDOUT: %a: %IntAdapter = bind_name a, %a.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @IntAdapter { -// CHECK:STDOUT: %MakeInt.ref: %MakeInt.type = name_ref MakeInt, file.%MakeInt.decl [concrete = constants.%MakeInt] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %int.make_type_signed: init type = call %MakeInt.ref(%int_32) [concrete = constants.%i32.builtin] -// CHECK:STDOUT: %.loc7_27.1: type = value_of_initializer %int.make_type_signed [concrete = constants.%i32.builtin] -// CHECK:STDOUT: %.loc7_27.2: type = converted %int.make_type_signed, %.loc7_27.1 [concrete = constants.%i32.builtin] -// CHECK:STDOUT: adapt_decl %.loc7_27.2 [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness constants.%i32.builtin [concrete = constants.%complete_type.f8a] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%IntAdapter -// CHECK:STDOUT: .MakeInt = -// CHECK:STDOUT: .foo = -// CHECK:STDOUT: extend %.loc7_27.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @MakeInt(%N.param: Core.IntLiteral) -> type = "int.make_type_signed"; -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F(%a.param: %IntAdapter) -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %a.ref: %IntAdapter = name_ref a, %a -// CHECK:STDOUT: %foo.ref: = name_ref foo, [concrete = ] -// CHECK:STDOUT: return +// CHECK:STDOUT: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/adapter/fail_adapt_bad_decl.carbon b/toolchain/check/testdata/class/adapter/fail_adapt_bad_decl.carbon index 76d3816741042..5c8af43ef75f6 100644 --- a/toolchain/check/testdata/class/adapter/fail_adapt_bad_decl.carbon +++ b/toolchain/check/testdata/class/adapter/fail_adapt_bad_decl.carbon @@ -2,6 +2,8 @@ // Exceptions. See /LICENSE for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// // AUTOUPDATE // TIP: To test this file alone, run: // TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/adapter/fail_adapt_bad_decl.carbon @@ -102,233 +104,3 @@ class C { adapt {}; } } - -// CHECK:STDOUT: --- fail_not_type.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Bad: type = class_type @Bad [concrete] -// CHECK:STDOUT: %int_100: Core.IntLiteral = int_value 100 [concrete] -// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] -// CHECK:STDOUT: %pattern_type.fc4: type = pattern_type %Bad [concrete] -// CHECK:STDOUT: %Use.type: type = fn_type @Use [concrete] -// CHECK:STDOUT: %Use: %Use.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/operators/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Bad = %Bad.decl -// CHECK:STDOUT: .Use = %Use.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Bad.decl: type = class_decl @Bad [concrete = constants.%Bad] {} {} -// CHECK:STDOUT: %Use.decl: %Use.type = fn_decl @Use [concrete = constants.%Use] { -// CHECK:STDOUT: %b.patt: %pattern_type.fc4 = binding_pattern b [concrete] -// CHECK:STDOUT: %b.param_patt: %pattern_type.fc4 = value_param_pattern %b.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %b.param: %Bad = value_param call_param0 -// CHECK:STDOUT: %Bad.ref: type = name_ref Bad, file.%Bad.decl [concrete = constants.%Bad] -// CHECK:STDOUT: %b: %Bad = bind_name b, %b.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Bad { -// CHECK:STDOUT: %int_100: Core.IntLiteral = int_value 100 [concrete = constants.%int_100] -// CHECK:STDOUT: %.loc12: type = converted %int_100, [concrete = ] -// CHECK:STDOUT: adapt_decl [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness [concrete = ] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Bad -// CHECK:STDOUT: .F = -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Use(%b.param: %Bad) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %b.ref: %Bad = name_ref b, %b -// CHECK:STDOUT: %F.ref: = name_ref F, [concrete = ] -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_extend_not_type.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Bad: type = class_type @Bad [concrete] -// CHECK:STDOUT: %int_100: Core.IntLiteral = int_value 100 [concrete] -// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] -// CHECK:STDOUT: %pattern_type.fc4: type = pattern_type %Bad [concrete] -// CHECK:STDOUT: %Use.type: type = fn_type @Use [concrete] -// CHECK:STDOUT: %Use: %Use.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/operators/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Bad = %Bad.decl -// CHECK:STDOUT: .Use = %Use.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Bad.decl: type = class_decl @Bad [concrete = constants.%Bad] {} {} -// CHECK:STDOUT: %Use.decl: %Use.type = fn_decl @Use [concrete = constants.%Use] { -// CHECK:STDOUT: %b.patt: %pattern_type.fc4 = binding_pattern b [concrete] -// CHECK:STDOUT: %b.param_patt: %pattern_type.fc4 = value_param_pattern %b.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %b.param: %Bad = value_param call_param0 -// CHECK:STDOUT: %Bad.ref: type = name_ref Bad, file.%Bad.decl [concrete = constants.%Bad] -// CHECK:STDOUT: %b: %Bad = bind_name b, %b.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Bad { -// CHECK:STDOUT: %int_100: Core.IntLiteral = int_value 100 [concrete = constants.%int_100] -// CHECK:STDOUT: %.loc12: type = converted %int_100, [concrete = ] -// CHECK:STDOUT: adapt_decl [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness [concrete = ] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Bad -// CHECK:STDOUT: .F = -// CHECK:STDOUT: extend -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Use(%b.param: %Bad) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %b.ref: %Bad = name_ref b, %b -// CHECK:STDOUT: %F.ref: = name_ref F, [concrete = ] -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_repeated.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %MultipleAdapts: type = class_type @MultipleAdapts [concrete] -// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_tuple.type [concrete] -// CHECK:STDOUT: %MultipleAdaptsSameType: type = class_type @MultipleAdaptsSameType [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .MultipleAdapts = %MultipleAdapts.decl -// CHECK:STDOUT: .MultipleAdaptsSameType = %MultipleAdaptsSameType.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %MultipleAdapts.decl: type = class_decl @MultipleAdapts [concrete = constants.%MultipleAdapts] {} {} -// CHECK:STDOUT: %MultipleAdaptsSameType.decl: type = class_decl @MultipleAdaptsSameType [concrete = constants.%MultipleAdaptsSameType] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @MultipleAdapts { -// CHECK:STDOUT: %.loc5_10: %empty_tuple.type = tuple_literal () -// CHECK:STDOUT: %.loc5_11: type = converted %.loc5_10, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] -// CHECK:STDOUT: adapt_decl %.loc5_11 [concrete] -// CHECK:STDOUT: %.loc13: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %complete_type: = complete_type_witness constants.%empty_tuple.type [concrete = constants.%complete_type] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%MultipleAdapts -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @MultipleAdaptsSameType { -// CHECK:STDOUT: %.loc17_10: %empty_tuple.type = tuple_literal () -// CHECK:STDOUT: %.loc17_11: type = converted %.loc17_10, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] -// CHECK:STDOUT: adapt_decl %.loc17_11 [concrete] -// CHECK:STDOUT: %.loc25: %empty_tuple.type = tuple_literal () -// CHECK:STDOUT: %complete_type: = complete_type_witness constants.%empty_tuple.type [concrete = constants.%complete_type] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%MultipleAdaptsSameType -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_bad_scope.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %I.type.733: type = facet_type <@I.1> [concrete] -// CHECK:STDOUT: %Self.826: %I.type.733 = bind_symbolic_name Self, 0 [symbolic] -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %I.type.e30: type = facet_type <@I.2> [concrete] -// CHECK:STDOUT: %Self.6ef: %I.type.e30 = bind_symbolic_name Self, 0 [symbolic] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .I = %I.decl -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %.loc8: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %I.decl: type = interface_decl @I.1 [concrete = constants.%I.type.733] {} {} -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: interface @I.1 { -// CHECK:STDOUT: %Self: %I.type.733 = bind_symbolic_name Self, 0 [symbolic = constants.%Self.826] -// CHECK:STDOUT: %.loc15: %empty_struct_type = struct_literal () -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = %Self -// CHECK:STDOUT: witness = () -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: interface @I.2 { -// CHECK:STDOUT: %Self: %I.type.e30 = bind_symbolic_name Self, 0 [symbolic = constants.%Self.6ef] -// CHECK:STDOUT: %.loc24: %empty_struct_type = struct_literal () -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = %Self -// CHECK:STDOUT: witness = () -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C { -// CHECK:STDOUT: %I.decl: type = interface_decl @I.2 [concrete = constants.%I.type.e30] {} {} -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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: .I = %I.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/adapter/fail_adapt_bad_type.carbon b/toolchain/check/testdata/class/adapter/fail_adapt_bad_type.carbon index 9f4a03c54b953..3416345be939b 100644 --- a/toolchain/check/testdata/class/adapter/fail_adapt_bad_type.carbon +++ b/toolchain/check/testdata/class/adapter/fail_adapt_bad_type.carbon @@ -2,6 +2,8 @@ // Exceptions. See /LICENSE for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// // AUTOUPDATE // TIP: To test this file alone, run: // TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/adapter/fail_adapt_bad_type.carbon @@ -24,42 +26,3 @@ class AdaptIncomplete { // CHECK:STDERR: adapt Incomplete; } - -// CHECK:STDOUT: --- fail_incomplete_type.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Incomplete: type = class_type @Incomplete [concrete] -// CHECK:STDOUT: %AdaptIncomplete: type = class_type @AdaptIncomplete [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Incomplete = %Incomplete.decl -// CHECK:STDOUT: .AdaptIncomplete = %AdaptIncomplete.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Incomplete.decl: type = class_decl @Incomplete [concrete = constants.%Incomplete] {} {} -// CHECK:STDOUT: %AdaptIncomplete.decl: type = class_decl @AdaptIncomplete [concrete = constants.%AdaptIncomplete] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Incomplete; -// CHECK:STDOUT: -// CHECK:STDOUT: class @AdaptIncomplete { -// CHECK:STDOUT: %Incomplete.ref: type = name_ref Incomplete, file.%Incomplete.decl [concrete = constants.%Incomplete] -// CHECK:STDOUT: adapt_decl [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness [concrete = ] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%AdaptIncomplete -// CHECK:STDOUT: .Incomplete = -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/adapter/fail_adapt_modifiers.carbon b/toolchain/check/testdata/class/adapter/fail_adapt_modifiers.carbon index 1fb0bf871cd5b..aa1ce44971133 100644 --- a/toolchain/check/testdata/class/adapter/fail_adapt_modifiers.carbon +++ b/toolchain/check/testdata/class/adapter/fail_adapt_modifiers.carbon @@ -2,7 +2,7 @@ // Exceptions. See /LICENSE for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // -// EXTRA-ARGS: --no-dump-sem-ir +// EXTRA-ARGS: --dump-sem-ir-ranges=only // // AUTOUPDATE // TIP: To test this file alone, run: diff --git a/toolchain/check/testdata/class/adapter/fail_adapt_with_base.carbon b/toolchain/check/testdata/class/adapter/fail_adapt_with_base.carbon index 46a47e40f7b7f..3122643fc84b9 100644 --- a/toolchain/check/testdata/class/adapter/fail_adapt_with_base.carbon +++ b/toolchain/check/testdata/class/adapter/fail_adapt_with_base.carbon @@ -2,6 +2,8 @@ // Exceptions. See /LICENSE for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// // AUTOUPDATE // TIP: To test this file alone, run: // TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/adapter/fail_adapt_with_base.carbon @@ -19,64 +21,3 @@ base class AdaptWithVirtual { // CHECK:STDERR: adapt Simple; } - -// CHECK:STDOUT: --- fail_adapt_with_base.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Simple: type = class_type @Simple [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %AdaptWithVirtual: type = class_type @AdaptWithVirtual [concrete] -// CHECK:STDOUT: %pattern_type: type = pattern_type %AdaptWithVirtual [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Simple = %Simple.decl -// CHECK:STDOUT: .AdaptWithVirtual = %AdaptWithVirtual.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Simple.decl: type = class_decl @Simple [concrete = constants.%Simple] {} {} -// CHECK:STDOUT: %AdaptWithVirtual.decl: type = class_decl @AdaptWithVirtual [concrete = constants.%AdaptWithVirtual] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Simple { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Simple -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @AdaptWithVirtual { -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %self.patt: %pattern_type = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %AdaptWithVirtual = value_param call_param0 -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%AdaptWithVirtual [concrete = constants.%AdaptWithVirtual] -// CHECK:STDOUT: %self: %AdaptWithVirtual = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %Simple.ref: type = name_ref Simple, file.%Simple.decl [concrete = constants.%Simple] -// CHECK:STDOUT: adapt_decl %Simple.ref [concrete] -// CHECK:STDOUT: complete_type_witness = -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%AdaptWithVirtual -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: .Simple = -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: virtual fn @F(%self.param: %AdaptWithVirtual); -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/adapter/fail_adapt_with_subobjects.carbon b/toolchain/check/testdata/class/adapter/fail_adapt_with_subobjects.carbon index 98457f6572c02..524337a394f81 100644 --- a/toolchain/check/testdata/class/adapter/fail_adapt_with_subobjects.carbon +++ b/toolchain/check/testdata/class/adapter/fail_adapt_with_subobjects.carbon @@ -2,6 +2,8 @@ // Exceptions. See /LICENSE for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// // AUTOUPDATE // TIP: To test this file alone, run: // TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/adapter/fail_adapt_with_subobjects.carbon @@ -74,194 +76,3 @@ class AdaptWithBaseAndFields { // CHECK:STDERR: adapt {}; } - -// CHECK:STDOUT: --- fail_adapt_with_base.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Base: type = class_type @Base [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %AdaptWithBase: type = class_type @AdaptWithBase [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %AdaptWithBase.elem: type = unbound_element_type %AdaptWithBase, %Base [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Base = %Base.decl -// CHECK:STDOUT: .AdaptWithBase = %AdaptWithBase.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Base.decl: type = class_decl @Base [concrete = constants.%Base] {} {} -// CHECK:STDOUT: %AdaptWithBase.decl: type = class_decl @AdaptWithBase [concrete = constants.%AdaptWithBase] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Base { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Base -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @AdaptWithBase { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: adapt_decl %i32 [concrete] -// CHECK:STDOUT: %Base.ref: type = name_ref Base, file.%Base.decl [concrete = constants.%Base] -// CHECK:STDOUT: %.loc15: %AdaptWithBase.elem = base_decl %Base.ref, element [concrete] -// CHECK:STDOUT: complete_type_witness = -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%AdaptWithBase -// CHECK:STDOUT: .Base = -// CHECK:STDOUT: .base = %.loc15 -// CHECK:STDOUT: extend %Base.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_adapt_with_fields.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %AdaptWithField: type = class_type @AdaptWithField [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %AdaptWithField.elem: type = unbound_element_type %AdaptWithField, %i32 [concrete] -// CHECK:STDOUT: %AdaptWithFields: type = class_type @AdaptWithFields [concrete] -// CHECK:STDOUT: %AdaptWithFields.elem: type = unbound_element_type %AdaptWithFields, %i32 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .AdaptWithField = %AdaptWithField.decl -// CHECK:STDOUT: .AdaptWithFields = %AdaptWithFields.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %AdaptWithField.decl: type = class_decl @AdaptWithField [concrete = constants.%AdaptWithField] {} {} -// CHECK:STDOUT: %AdaptWithFields.decl: type = class_decl @AdaptWithFields [concrete = constants.%AdaptWithFields] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @AdaptWithField { -// CHECK:STDOUT: %int_32.loc8: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc8: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: adapt_decl %i32.loc8 [concrete] -// CHECK:STDOUT: %int_32.loc13: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc13: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc13: %AdaptWithField.elem = field_decl n, element [concrete] -// CHECK:STDOUT: complete_type_witness = -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%AdaptWithField -// CHECK:STDOUT: .n = %.loc13 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @AdaptWithFields { -// CHECK:STDOUT: %int_32.loc20: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc20: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: adapt_decl %i32.loc20 [concrete] -// CHECK:STDOUT: %int_32.loc25: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc25: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc25: %AdaptWithFields.elem = field_decl a, element [concrete] -// CHECK:STDOUT: %int_32.loc26: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc26: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc26: %AdaptWithFields.elem = field_decl b, element [concrete] -// CHECK:STDOUT: %int_32.loc27: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc27: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc27: %AdaptWithFields.elem = field_decl c, element [concrete] -// CHECK:STDOUT: complete_type_witness = -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%AdaptWithFields -// CHECK:STDOUT: .a = %.loc25 -// CHECK:STDOUT: .b = %.loc26 -// CHECK:STDOUT: .c = %.loc27 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_adapt_with_base_and_fields.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Base: type = class_type @Base [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %AdaptWithBaseAndFields: type = class_type @AdaptWithBaseAndFields [concrete] -// CHECK:STDOUT: %AdaptWithBaseAndFields.elem.767: type = unbound_element_type %AdaptWithBaseAndFields, %Base [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %AdaptWithBaseAndFields.elem.ddf: type = unbound_element_type %AdaptWithBaseAndFields, %i32 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Base = %Base.decl -// CHECK:STDOUT: .AdaptWithBaseAndFields = %AdaptWithBaseAndFields.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Base.decl: type = class_decl @Base [concrete = constants.%Base] {} {} -// CHECK:STDOUT: %AdaptWithBaseAndFields.decl: type = class_decl @AdaptWithBaseAndFields [concrete = constants.%AdaptWithBaseAndFields] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Base { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Base -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @AdaptWithBaseAndFields { -// CHECK:STDOUT: %Base.ref: type = name_ref Base, file.%Base.decl [concrete = constants.%Base] -// CHECK:STDOUT: %.loc7: %AdaptWithBaseAndFields.elem.767 = base_decl %Base.ref, element [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc8: %AdaptWithBaseAndFields.elem.ddf = field_decl n, element [concrete] -// CHECK:STDOUT: %.loc16_10: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %.loc16_11: type = converted %.loc16_10, constants.%empty_struct_type [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: adapt_decl %.loc16_11 [concrete] -// CHECK:STDOUT: complete_type_witness = -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%AdaptWithBaseAndFields -// CHECK:STDOUT: .Base = -// CHECK:STDOUT: .base = %.loc7 -// CHECK:STDOUT: .n = %.loc8 -// CHECK:STDOUT: extend %Base.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/adapter/init_adapt.carbon b/toolchain/check/testdata/class/adapter/init_adapt.carbon index 4cfdc1e9baa56..7932db548f5d4 100644 --- a/toolchain/check/testdata/class/adapter/init_adapt.carbon +++ b/toolchain/check/testdata/class/adapter/init_adapt.carbon @@ -2,6 +2,8 @@ // Exceptions. See /LICENSE for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// // AUTOUPDATE // TIP: To test this file alone, run: // TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/adapter/init_adapt.carbon @@ -17,13 +19,17 @@ class C { var b: i32; } +//@dump-sem-ir-begin class AdaptC { adapt C; } +//@dump-sem-ir-end let a: C = {.a = 1, .b = 2}; +//@dump-sem-ir-begin let b: AdaptC = a as AdaptC; +//@dump-sem-ir-end let c: C = b as C; @@ -97,358 +103,23 @@ var e: C = MakeAdaptC(); // CHECK:STDOUT: constants { // CHECK:STDOUT: %C: type = class_type @C [concrete] // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %C.elem: type = unbound_element_type %C, %i32 [concrete] -// CHECK:STDOUT: %struct_type.a.b.501: type = struct_type {.a: %i32, .b: %i32} [concrete] -// CHECK:STDOUT: %complete_type.705: = complete_type_witness %struct_type.a.b.501 [concrete] -// CHECK:STDOUT: %AdaptC: type = class_type @AdaptC [concrete] -// CHECK:STDOUT: %pattern_type.c48: type = pattern_type %C [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: %struct_type.a.b.cfd: type = struct_type {.a: Core.IntLiteral, .b: Core.IntLiteral} [concrete] -// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.type.205: type = facet_type <@ImplicitAs, @ImplicitAs(%i32)> [concrete] -// CHECK:STDOUT: %Convert.type.1b6: type = fn_type @Convert.1, @ImplicitAs(%i32) [concrete] -// CHECK:STDOUT: %To.c80: Core.IntLiteral = bind_symbolic_name To, 0 [symbolic] -// CHECK:STDOUT: %Convert.type.0f9: type = fn_type @Convert.2, @impl.4f9(%To.c80) [symbolic] -// CHECK:STDOUT: %Convert.f06: %Convert.type.0f9 = struct_value () [symbolic] -// CHECK:STDOUT: %ImplicitAs.impl_witness.c75: = impl_witness imports.%ImplicitAs.impl_witness_table.a2f, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.type.035: type = fn_type @Convert.2, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.956: %Convert.type.035 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.facet: %ImplicitAs.type.205 = facet_value Core.IntLiteral, (%ImplicitAs.impl_witness.c75) [concrete] -// CHECK:STDOUT: %.9c3: type = fn_type_with_self_type %Convert.type.1b6, %ImplicitAs.facet [concrete] -// CHECK:STDOUT: %Convert.bound.ab5: = bound_method %int_1.5b8, %Convert.956 [concrete] -// CHECK:STDOUT: %Convert.specific_fn: = specific_function %Convert.956, @Convert.2(%int_32) [concrete] -// CHECK:STDOUT: %bound_method.9a1: = bound_method %int_1.5b8, %Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_1.5d2: %i32 = int_value 1 [concrete] -// CHECK:STDOUT: %Convert.bound.ef9: = bound_method %int_2.ecc, %Convert.956 [concrete] -// CHECK:STDOUT: %bound_method.b92: = bound_method %int_2.ecc, %Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_2.ef8: %i32 = int_value 2 [concrete] -// CHECK:STDOUT: %C.val: %C = struct_value (%int_1.5d2, %int_2.ef8) [concrete] -// CHECK:STDOUT: %pattern_type.a1a: type = pattern_type %AdaptC [concrete] -// CHECK:STDOUT: %MakeC.type: type = fn_type @MakeC [concrete] -// CHECK:STDOUT: %MakeC: %MakeC.type = struct_value () [concrete] -// CHECK:STDOUT: %MakeAdaptC.type: type = fn_type @MakeAdaptC [concrete] -// CHECK:STDOUT: %MakeAdaptC: %MakeAdaptC.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/operators/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] -// CHECK:STDOUT: %Core.import_ref.a5b: @impl.4f9.%Convert.type (%Convert.type.0f9) = import_ref Core//prelude/types/int, loc19_39, loaded [symbolic = @impl.4f9.%Convert (constants.%Convert.f06)] -// CHECK:STDOUT: %ImplicitAs.impl_witness_table.a2f = impl_witness_table (%Core.import_ref.a5b), @impl.4f9 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: .AdaptC = %AdaptC.decl -// CHECK:STDOUT: .a = %a -// CHECK:STDOUT: .b = %b -// CHECK:STDOUT: .c = %c -// CHECK:STDOUT: .MakeC = %MakeC.decl -// CHECK:STDOUT: .MakeAdaptC = %MakeAdaptC.decl -// CHECK:STDOUT: .d = %d -// CHECK:STDOUT: .e = %e -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: %AdaptC.decl: type = class_decl @AdaptC [concrete = constants.%AdaptC] {} {} -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %a.patt: %pattern_type.c48 = binding_pattern a [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %C.ref.loc13: type = name_ref C, %C.decl [concrete = constants.%C] -// CHECK:STDOUT: %impl.elem0.loc13_27.1: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc13_27.1: = bound_method @__global_init.%int_1, %impl.elem0.loc13_27.1 [concrete = constants.%Convert.bound.ab5] -// CHECK:STDOUT: %specific_fn.loc13_27.1: = specific_function %impl.elem0.loc13_27.1, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc13_27.2: = bound_method @__global_init.%int_1, %specific_fn.loc13_27.1 [concrete = constants.%bound_method.9a1] -// CHECK:STDOUT: %int.convert_checked.loc13_27.1: init %i32 = call %bound_method.loc13_27.2(@__global_init.%int_1) [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %.loc13_27.1: init %i32 = converted @__global_init.%int_1, %int.convert_checked.loc13_27.1 [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %.loc13_27.2: ref %C = temporary_storage -// CHECK:STDOUT: %.loc13_27.3: ref %i32 = class_element_access %.loc13_27.2, element0 -// CHECK:STDOUT: %.loc13_27.4: init %i32 = initialize_from %.loc13_27.1 to %.loc13_27.3 [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %impl.elem0.loc13_27.2: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc13_27.3: = bound_method @__global_init.%int_2, %impl.elem0.loc13_27.2 [concrete = constants.%Convert.bound.ef9] -// CHECK:STDOUT: %specific_fn.loc13_27.2: = specific_function %impl.elem0.loc13_27.2, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc13_27.4: = bound_method @__global_init.%int_2, %specific_fn.loc13_27.2 [concrete = constants.%bound_method.b92] -// CHECK:STDOUT: %int.convert_checked.loc13_27.2: init %i32 = call %bound_method.loc13_27.4(@__global_init.%int_2) [concrete = constants.%int_2.ef8] -// CHECK:STDOUT: %.loc13_27.5: init %i32 = converted @__global_init.%int_2, %int.convert_checked.loc13_27.2 [concrete = constants.%int_2.ef8] -// CHECK:STDOUT: %.loc13_27.6: ref %i32 = class_element_access %.loc13_27.2, element1 -// CHECK:STDOUT: %.loc13_27.7: init %i32 = initialize_from %.loc13_27.5 to %.loc13_27.6 [concrete = constants.%int_2.ef8] -// CHECK:STDOUT: %.loc13_27.8: init %C = class_init (%.loc13_27.4, %.loc13_27.7), %.loc13_27.2 [concrete = constants.%C.val] -// CHECK:STDOUT: %.loc13_27.9: ref %C = temporary %.loc13_27.2, %.loc13_27.8 -// CHECK:STDOUT: %.loc13_27.10: ref %C = converted @__global_init.%.loc13, %.loc13_27.9 -// CHECK:STDOUT: %a: ref %C = bind_name a, %.loc13_27.10 -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %b.patt: %pattern_type.a1a = binding_pattern b [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %AdaptC.ref.loc15: type = name_ref AdaptC, %AdaptC.decl [concrete = constants.%AdaptC] -// CHECK:STDOUT: %b: ref %AdaptC = bind_name b, @__global_init.%.loc15_19.2 -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %c.patt: %pattern_type.c48 = binding_pattern c [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %C.ref.loc17: type = name_ref C, %C.decl [concrete = constants.%C] -// CHECK:STDOUT: %c: ref %C = bind_name c, @__global_init.%.loc17_14.2 -// CHECK:STDOUT: %MakeC.decl: %MakeC.type = fn_decl @MakeC [concrete = constants.%MakeC] { -// CHECK:STDOUT: %return.patt: %pattern_type.c48 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.c48 = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %C.ref: type = name_ref C, file.%C.decl [concrete = constants.%C] -// CHECK:STDOUT: %return.param: ref %C = out_param call_param0 -// CHECK:STDOUT: %return: ref %C = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %MakeAdaptC.decl: %MakeAdaptC.type = fn_decl @MakeAdaptC [concrete = constants.%MakeAdaptC] { -// CHECK:STDOUT: %return.patt: %pattern_type.a1a = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.a1a = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %AdaptC.ref: type = name_ref AdaptC, file.%AdaptC.decl [concrete = constants.%AdaptC] -// CHECK:STDOUT: %return.param: ref %AdaptC = out_param call_param0 -// CHECK:STDOUT: %return: ref %AdaptC = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %d.patt: %pattern_type.a1a = binding_pattern d [concrete] -// CHECK:STDOUT: %d.var_patt: %pattern_type.a1a = var_pattern %d.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %d.var: ref %AdaptC = var %d.var_patt [concrete] -// CHECK:STDOUT: %AdaptC.ref.loc23: type = name_ref AdaptC, %AdaptC.decl [concrete = constants.%AdaptC] -// CHECK:STDOUT: %d: ref %AdaptC = bind_name d, %d.var -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %e.patt: %pattern_type.c48 = binding_pattern e [concrete] -// CHECK:STDOUT: %e.var_patt: %pattern_type.c48 = var_pattern %e.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %e.var: ref %C = var %e.var_patt [concrete] -// CHECK:STDOUT: %C.ref.loc25: type = name_ref C, %C.decl [concrete = constants.%C] -// CHECK:STDOUT: %e: ref %C = bind_name e, %e.var -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C { -// CHECK:STDOUT: %int_32.loc5: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc5: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc5: %C.elem = field_decl a, element0 [concrete] -// CHECK:STDOUT: %int_32.loc6: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc6: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc6: %C.elem = field_decl b, element1 [concrete] -// CHECK:STDOUT: %struct_type.a.b: type = struct_type {.a: %i32, .b: %i32} [concrete = constants.%struct_type.a.b.501] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.a.b [concrete = constants.%complete_type.705] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%C -// CHECK:STDOUT: .a = %.loc5 -// CHECK:STDOUT: .b = %.loc6 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @AdaptC { -// CHECK:STDOUT: %C.ref: type = name_ref C, file.%C.decl [concrete = constants.%C] -// CHECK:STDOUT: adapt_decl %C.ref [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness constants.%struct_type.a.b.501 [concrete = constants.%complete_type.705] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%AdaptC -// CHECK:STDOUT: .C = -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @MakeC() -> %return.param: %C; -// CHECK:STDOUT: -// CHECK:STDOUT: fn @MakeAdaptC() -> %return.param: %AdaptC; -// CHECK:STDOUT: -// CHECK:STDOUT: fn @__global_init() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %int_1: Core.IntLiteral = int_value 1 [concrete = constants.%int_1.5b8] -// CHECK:STDOUT: %int_2: Core.IntLiteral = int_value 2 [concrete = constants.%int_2.ecc] -// CHECK:STDOUT: %.loc13: %struct_type.a.b.cfd = struct_literal (%int_1, %int_2) -// CHECK:STDOUT: %a.ref: ref %C = name_ref a, file.%a -// CHECK:STDOUT: %AdaptC.ref.loc15: type = name_ref AdaptC, file.%AdaptC.decl [concrete = constants.%AdaptC] -// CHECK:STDOUT: %.loc15_19.1: ref %AdaptC = as_compatible %a.ref -// CHECK:STDOUT: %.loc15_19.2: ref %AdaptC = converted %a.ref, %.loc15_19.1 -// CHECK:STDOUT: %b.ref: ref %AdaptC = name_ref b, file.%b -// CHECK:STDOUT: %C.ref.loc17: type = name_ref C, file.%C.decl [concrete = constants.%C] -// CHECK:STDOUT: %.loc17_14.1: ref %C = as_compatible %b.ref -// CHECK:STDOUT: %.loc17_14.2: ref %C = converted %b.ref, %.loc17_14.1 -// CHECK:STDOUT: %MakeC.ref: %MakeC.type = name_ref MakeC, file.%MakeC.decl [concrete = constants.%MakeC] -// CHECK:STDOUT: %.loc23_1: ref %AdaptC = splice_block file.%d.var [concrete = file.%d.var] {} -// CHECK:STDOUT: %MakeC.call: init %C = call %MakeC.ref() to %.loc23_1 -// CHECK:STDOUT: %AdaptC.ref.loc23: type = name_ref AdaptC, file.%AdaptC.decl [concrete = constants.%AdaptC] -// CHECK:STDOUT: %.loc23_25.1: init %AdaptC = as_compatible %MakeC.call -// CHECK:STDOUT: %.loc23_25.2: init %AdaptC = converted %MakeC.call, %.loc23_25.1 -// CHECK:STDOUT: assign file.%d.var, %.loc23_25.2 -// CHECK:STDOUT: %MakeAdaptC.ref: %MakeAdaptC.type = name_ref MakeAdaptC, file.%MakeAdaptC.decl [concrete = constants.%MakeAdaptC] -// CHECK:STDOUT: %.loc25_1: ref %C = splice_block file.%e.var [concrete = file.%e.var] {} -// CHECK:STDOUT: %MakeAdaptC.call: init %AdaptC = call %MakeAdaptC.ref() to %.loc25_1 -// CHECK:STDOUT: %C.ref.loc25: type = name_ref C, file.%C.decl [concrete = constants.%C] -// CHECK:STDOUT: %.loc25_25.1: init %C = as_compatible %MakeAdaptC.call -// CHECK:STDOUT: %.loc25_25.2: init %C = converted %MakeAdaptC.call, %.loc25_25.1 -// CHECK:STDOUT: assign file.%e.var, %.loc25_25.2 -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_not_implicit.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %C.elem: type = unbound_element_type %C, %i32 [concrete] // CHECK:STDOUT: %struct_type.a.b.501: type = struct_type {.a: %i32, .b: %i32} [concrete] // CHECK:STDOUT: %complete_type.705: = complete_type_witness %struct_type.a.b.501 [concrete] // CHECK:STDOUT: %AdaptC: type = class_type @AdaptC [concrete] -// CHECK:STDOUT: %pattern_type.c48: type = pattern_type %C [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: %struct_type.a.b.cfd: type = struct_type {.a: Core.IntLiteral, .b: Core.IntLiteral} [concrete] -// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.type.205: type = facet_type <@ImplicitAs, @ImplicitAs(%i32)> [concrete] -// CHECK:STDOUT: %Convert.type.1b6: type = fn_type @Convert.1, @ImplicitAs(%i32) [concrete] -// CHECK:STDOUT: %To.c80: Core.IntLiteral = bind_symbolic_name To, 0 [symbolic] -// CHECK:STDOUT: %Convert.type.0f9: type = fn_type @Convert.2, @impl.4f9(%To.c80) [symbolic] -// CHECK:STDOUT: %Convert.f06: %Convert.type.0f9 = struct_value () [symbolic] -// CHECK:STDOUT: %ImplicitAs.impl_witness.c75: = impl_witness imports.%ImplicitAs.impl_witness_table.a2f, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.type.035: type = fn_type @Convert.2, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.956: %Convert.type.035 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.facet: %ImplicitAs.type.205 = facet_value Core.IntLiteral, (%ImplicitAs.impl_witness.c75) [concrete] -// CHECK:STDOUT: %.9c3: type = fn_type_with_self_type %Convert.type.1b6, %ImplicitAs.facet [concrete] -// CHECK:STDOUT: %Convert.bound.ab5: = bound_method %int_1.5b8, %Convert.956 [concrete] -// CHECK:STDOUT: %Convert.specific_fn: = specific_function %Convert.956, @Convert.2(%int_32) [concrete] -// CHECK:STDOUT: %bound_method.9a1: = bound_method %int_1.5b8, %Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_1.5d2: %i32 = int_value 1 [concrete] -// CHECK:STDOUT: %Convert.bound.ef9: = bound_method %int_2.ecc, %Convert.956 [concrete] -// CHECK:STDOUT: %bound_method.b92: = bound_method %int_2.ecc, %Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_2.ef8: %i32 = int_value 2 [concrete] -// CHECK:STDOUT: %C.val: %C = struct_value (%int_1.5d2, %int_2.ef8) [concrete] // CHECK:STDOUT: %pattern_type.a1a: type = pattern_type %AdaptC [concrete] -// CHECK:STDOUT: %MakeC.type: type = fn_type @MakeC [concrete] -// CHECK:STDOUT: %MakeC: %MakeC.type = struct_value () [concrete] -// CHECK:STDOUT: %MakeAdaptC.type: type = fn_type @MakeAdaptC [concrete] -// CHECK:STDOUT: %MakeAdaptC: %MakeAdaptC.type = struct_value () [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/operators/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] -// CHECK:STDOUT: %Core.import_ref.a5b: @impl.4f9.%Convert.type (%Convert.type.0f9) = import_ref Core//prelude/types/int, loc19_39, loaded [symbolic = @impl.4f9.%Convert (constants.%Convert.f06)] -// CHECK:STDOUT: %ImplicitAs.impl_witness_table.a2f = impl_witness_table (%Core.import_ref.a5b), @impl.4f9 [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: .AdaptC = %AdaptC.decl -// CHECK:STDOUT: .a = %a -// CHECK:STDOUT: .b = %b -// CHECK:STDOUT: .c = %c -// CHECK:STDOUT: .MakeC = %MakeC.decl -// CHECK:STDOUT: .MakeAdaptC = %MakeAdaptC.decl -// CHECK:STDOUT: .d = %d -// CHECK:STDOUT: .e = %e -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} // CHECK:STDOUT: %AdaptC.decl: type = class_decl @AdaptC [concrete = constants.%AdaptC] {} {} // CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %a.patt: %pattern_type.c48 = binding_pattern a [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %C.ref.loc13: type = name_ref C, %C.decl [concrete = constants.%C] -// CHECK:STDOUT: %impl.elem0.loc13_27.1: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc13_27.1: = bound_method @__global_init.%int_1, %impl.elem0.loc13_27.1 [concrete = constants.%Convert.bound.ab5] -// CHECK:STDOUT: %specific_fn.loc13_27.1: = specific_function %impl.elem0.loc13_27.1, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc13_27.2: = bound_method @__global_init.%int_1, %specific_fn.loc13_27.1 [concrete = constants.%bound_method.9a1] -// CHECK:STDOUT: %int.convert_checked.loc13_27.1: init %i32 = call %bound_method.loc13_27.2(@__global_init.%int_1) [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %.loc13_27.1: init %i32 = converted @__global_init.%int_1, %int.convert_checked.loc13_27.1 [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %.loc13_27.2: ref %C = temporary_storage -// CHECK:STDOUT: %.loc13_27.3: ref %i32 = class_element_access %.loc13_27.2, element0 -// CHECK:STDOUT: %.loc13_27.4: init %i32 = initialize_from %.loc13_27.1 to %.loc13_27.3 [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %impl.elem0.loc13_27.2: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc13_27.3: = bound_method @__global_init.%int_2, %impl.elem0.loc13_27.2 [concrete = constants.%Convert.bound.ef9] -// CHECK:STDOUT: %specific_fn.loc13_27.2: = specific_function %impl.elem0.loc13_27.2, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc13_27.4: = bound_method @__global_init.%int_2, %specific_fn.loc13_27.2 [concrete = constants.%bound_method.b92] -// CHECK:STDOUT: %int.convert_checked.loc13_27.2: init %i32 = call %bound_method.loc13_27.4(@__global_init.%int_2) [concrete = constants.%int_2.ef8] -// CHECK:STDOUT: %.loc13_27.5: init %i32 = converted @__global_init.%int_2, %int.convert_checked.loc13_27.2 [concrete = constants.%int_2.ef8] -// CHECK:STDOUT: %.loc13_27.6: ref %i32 = class_element_access %.loc13_27.2, element1 -// CHECK:STDOUT: %.loc13_27.7: init %i32 = initialize_from %.loc13_27.5 to %.loc13_27.6 [concrete = constants.%int_2.ef8] -// CHECK:STDOUT: %.loc13_27.8: init %C = class_init (%.loc13_27.4, %.loc13_27.7), %.loc13_27.2 [concrete = constants.%C.val] -// CHECK:STDOUT: %.loc13_27.9: ref %C = temporary %.loc13_27.2, %.loc13_27.8 -// CHECK:STDOUT: %.loc13_27.10: ref %C = converted @__global_init.%.loc13, %.loc13_27.9 -// CHECK:STDOUT: %a: ref %C = bind_name a, %.loc13_27.10 -// CHECK:STDOUT: name_binding_decl { // CHECK:STDOUT: %b.patt: %pattern_type.a1a = binding_pattern b [concrete] // CHECK:STDOUT: } -// CHECK:STDOUT: %AdaptC.ref.loc24: type = name_ref AdaptC, %AdaptC.decl [concrete = constants.%AdaptC] -// CHECK:STDOUT: %.loc24: %AdaptC = converted @__global_init.%a.ref, [concrete = ] -// CHECK:STDOUT: %b: %AdaptC = bind_name b, -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %c.patt: %pattern_type.c48 = binding_pattern c [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %C.ref.loc33: type = name_ref C, %C.decl [concrete = constants.%C] -// CHECK:STDOUT: %.loc33: %C = converted @__global_init.%b.ref, [concrete = ] -// CHECK:STDOUT: %c: %C = bind_name c, -// CHECK:STDOUT: %MakeC.decl: %MakeC.type = fn_decl @MakeC [concrete = constants.%MakeC] { -// CHECK:STDOUT: %return.patt: %pattern_type.c48 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.c48 = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %C.ref: type = name_ref C, file.%C.decl [concrete = constants.%C] -// CHECK:STDOUT: %return.param: ref %C = out_param call_param0 -// CHECK:STDOUT: %return: ref %C = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %MakeAdaptC.decl: %MakeAdaptC.type = fn_decl @MakeAdaptC [concrete = constants.%MakeAdaptC] { -// CHECK:STDOUT: %return.patt: %pattern_type.a1a = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.a1a = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %AdaptC.ref: type = name_ref AdaptC, file.%AdaptC.decl [concrete = constants.%AdaptC] -// CHECK:STDOUT: %return.param: ref %AdaptC = out_param call_param0 -// CHECK:STDOUT: %return: ref %AdaptC = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %d.patt: %pattern_type.a1a = binding_pattern d [concrete] -// CHECK:STDOUT: %d.var_patt: %pattern_type.a1a = var_pattern %d.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %d.var: ref %AdaptC = var %d.var_patt [concrete] -// CHECK:STDOUT: %AdaptC.ref.loc46: type = name_ref AdaptC, %AdaptC.decl [concrete = constants.%AdaptC] -// CHECK:STDOUT: %d: ref %AdaptC = bind_name d, %d.var -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %e.patt: %pattern_type.c48 = binding_pattern e [concrete] -// CHECK:STDOUT: %e.var_patt: %pattern_type.c48 = var_pattern %e.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %e.var: ref %C = var %e.var_patt [concrete] -// CHECK:STDOUT: %C.ref.loc55: type = name_ref C, %C.decl [concrete = constants.%C] -// CHECK:STDOUT: %e: ref %C = bind_name e, %e.var -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C { -// CHECK:STDOUT: %int_32.loc5: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc5: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc5: %C.elem = field_decl a, element0 [concrete] -// CHECK:STDOUT: %int_32.loc6: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc6: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc6: %C.elem = field_decl b, element1 [concrete] -// CHECK:STDOUT: %struct_type.a.b: type = struct_type {.a: %i32, .b: %i32} [concrete = constants.%struct_type.a.b.501] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.a.b [concrete = constants.%complete_type.705] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%C -// CHECK:STDOUT: .a = %.loc5 -// CHECK:STDOUT: .b = %.loc6 +// CHECK:STDOUT: %AdaptC.ref.loc18: type = name_ref AdaptC, %AdaptC.decl [concrete = constants.%AdaptC] +// CHECK:STDOUT: %b: ref %AdaptC = bind_name b, @__global_init.%.loc18_19.2 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: class @AdaptC { @@ -462,27 +133,13 @@ var e: C = MakeAdaptC(); // CHECK:STDOUT: .C = // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: fn @MakeC() -> %return.param: %C; -// CHECK:STDOUT: -// CHECK:STDOUT: fn @MakeAdaptC() -> %return.param: %AdaptC; -// CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %int_1: Core.IntLiteral = int_value 1 [concrete = constants.%int_1.5b8] -// CHECK:STDOUT: %int_2: Core.IntLiteral = int_value 2 [concrete = constants.%int_2.ecc] -// CHECK:STDOUT: %.loc13: %struct_type.a.b.cfd = struct_literal (%int_1, %int_2) +// CHECK:STDOUT: // CHECK:STDOUT: %a.ref: ref %C = name_ref a, file.%a -// CHECK:STDOUT: %b.ref: %AdaptC = name_ref b, file.%b -// CHECK:STDOUT: %MakeC.ref: %MakeC.type = name_ref MakeC, file.%MakeC.decl [concrete = constants.%MakeC] -// CHECK:STDOUT: %.loc46_23: ref %C = temporary_storage -// CHECK:STDOUT: %MakeC.call: init %C = call %MakeC.ref() to %.loc46_23 -// CHECK:STDOUT: %.loc46_1: %AdaptC = converted %MakeC.call, [concrete = ] -// CHECK:STDOUT: assign file.%d.var, -// CHECK:STDOUT: %MakeAdaptC.ref: %MakeAdaptC.type = name_ref MakeAdaptC, file.%MakeAdaptC.decl [concrete = constants.%MakeAdaptC] -// CHECK:STDOUT: %.loc55_23: ref %AdaptC = temporary_storage -// CHECK:STDOUT: %MakeAdaptC.call: init %AdaptC = call %MakeAdaptC.ref() to %.loc55_23 -// CHECK:STDOUT: %.loc55_1: %C = converted %MakeAdaptC.call, [concrete = ] -// CHECK:STDOUT: assign file.%e.var, -// CHECK:STDOUT: return +// CHECK:STDOUT: %AdaptC.ref.loc18: type = name_ref AdaptC, file.%AdaptC.decl [concrete = constants.%AdaptC] +// CHECK:STDOUT: %.loc18_19.1: ref %AdaptC = as_compatible %a.ref +// CHECK:STDOUT: %.loc18_19.2: ref %AdaptC = converted %a.ref, %.loc18_19.1 +// CHECK:STDOUT: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/base.carbon b/toolchain/check/testdata/class/base.carbon deleted file mode 100644 index 7ce0e41458c85..0000000000000 --- a/toolchain/check/testdata/class/base.carbon +++ /dev/null @@ -1,294 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/base.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/base.carbon - -// --- base.carbon -package Base; - -base class Base { - var b: i32; -} - -class Derived { - extend base: Base; - - var d: i32; -} - -fn Make() -> Derived { - return {.base = {.b = 4}, .d = 7}; -} - -fn Access(d: Derived) -> (i32, i32) { - return (d.d, d.base.b); -} - -// --- fail_base_after_field.carbon -package BaseAfterField; - -base class Base { -} - -class Derived { - var d: i32; - - // CHECK:STDERR: fail_base_after_field.carbon:[[@LINE+4]]:3: error: `base` declaration must appear before field declarations [BaseDeclAfterFieldDecl] - // CHECK:STDERR: extend base: Base; - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: - extend base: Base; -} - -// CHECK:STDOUT: --- base.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Base: type = class_type @Base [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %Base.elem: type = unbound_element_type %Base, %i32 [concrete] -// CHECK:STDOUT: %struct_type.b.0a3: type = struct_type {.b: %i32} [concrete] -// CHECK:STDOUT: %complete_type.ba8: = complete_type_witness %struct_type.b.0a3 [concrete] -// CHECK:STDOUT: %Derived: type = class_type @Derived [concrete] -// CHECK:STDOUT: %Derived.elem.69e: type = unbound_element_type %Derived, %Base [concrete] -// CHECK:STDOUT: %Derived.elem.344: type = unbound_element_type %Derived, %i32 [concrete] -// CHECK:STDOUT: %struct_type.base.d.f8f: type = struct_type {.base: %Base, .d: %i32} [concrete] -// CHECK:STDOUT: %complete_type.da6: = complete_type_witness %struct_type.base.d.f8f [concrete] -// CHECK:STDOUT: %pattern_type.fb9: type = pattern_type %Derived [concrete] -// CHECK:STDOUT: %Make.type: type = fn_type @Make [concrete] -// CHECK:STDOUT: %Make: %Make.type = struct_value () [concrete] -// CHECK:STDOUT: %int_4.0c1: Core.IntLiteral = int_value 4 [concrete] -// CHECK:STDOUT: %struct_type.b.a15: type = struct_type {.b: Core.IntLiteral} [concrete] -// CHECK:STDOUT: %int_7.29f: Core.IntLiteral = int_value 7 [concrete] -// CHECK:STDOUT: %struct_type.base.d.a20: type = struct_type {.base: %struct_type.b.a15, .d: Core.IntLiteral} [concrete] -// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.type.205: type = facet_type <@ImplicitAs, @ImplicitAs(%i32)> [concrete] -// CHECK:STDOUT: %Convert.type.1b6: type = fn_type @Convert.1, @ImplicitAs(%i32) [concrete] -// CHECK:STDOUT: %To.c80: Core.IntLiteral = bind_symbolic_name To, 0 [symbolic] -// CHECK:STDOUT: %Convert.type.0f9: type = fn_type @Convert.2, @impl.4f9(%To.c80) [symbolic] -// CHECK:STDOUT: %Convert.f06: %Convert.type.0f9 = struct_value () [symbolic] -// CHECK:STDOUT: %ImplicitAs.impl_witness.c75: = impl_witness imports.%ImplicitAs.impl_witness_table.a2f, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.type.035: type = fn_type @Convert.2, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.956: %Convert.type.035 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.facet: %ImplicitAs.type.205 = facet_value Core.IntLiteral, (%ImplicitAs.impl_witness.c75) [concrete] -// CHECK:STDOUT: %.9c3: type = fn_type_with_self_type %Convert.type.1b6, %ImplicitAs.facet [concrete] -// CHECK:STDOUT: %Convert.bound.ac3: = bound_method %int_4.0c1, %Convert.956 [concrete] -// CHECK:STDOUT: %Convert.specific_fn: = specific_function %Convert.956, @Convert.2(%int_32) [concrete] -// CHECK:STDOUT: %bound_method.1da: = bound_method %int_4.0c1, %Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_4.940: %i32 = int_value 4 [concrete] -// CHECK:STDOUT: %Base.val: %Base = struct_value (%int_4.940) [concrete] -// CHECK:STDOUT: %Convert.bound.208: = bound_method %int_7.29f, %Convert.956 [concrete] -// CHECK:STDOUT: %bound_method.3bd: = bound_method %int_7.29f, %Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_7.0b1: %i32 = int_value 7 [concrete] -// CHECK:STDOUT: %Derived.val: %Derived = struct_value (%Base.val, %int_7.0b1) [concrete] -// CHECK:STDOUT: %tuple.type.24b: type = tuple_type (type, type) [concrete] -// CHECK:STDOUT: %tuple.type.d07: type = tuple_type (%i32, %i32) [concrete] -// CHECK:STDOUT: %pattern_type.511: type = pattern_type %tuple.type.d07 [concrete] -// CHECK:STDOUT: %Access.type: type = fn_type @Access [concrete] -// CHECK:STDOUT: %Access: %Access.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/operators/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] -// CHECK:STDOUT: %Core.import_ref.a5b: @impl.4f9.%Convert.type (%Convert.type.0f9) = import_ref Core//prelude/types/int, loc19_39, loaded [symbolic = @impl.4f9.%Convert (constants.%Convert.f06)] -// CHECK:STDOUT: %ImplicitAs.impl_witness_table.a2f = impl_witness_table (%Core.import_ref.a5b), @impl.4f9 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Base = %Base.decl -// CHECK:STDOUT: .Derived = %Derived.decl -// CHECK:STDOUT: .Make = %Make.decl -// CHECK:STDOUT: .Access = %Access.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Base.decl: type = class_decl @Base [concrete = constants.%Base] {} {} -// CHECK:STDOUT: %Derived.decl: type = class_decl @Derived [concrete = constants.%Derived] {} {} -// CHECK:STDOUT: %Make.decl: %Make.type = fn_decl @Make [concrete = constants.%Make] { -// CHECK:STDOUT: %return.patt: %pattern_type.fb9 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.fb9 = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %Derived.ref: type = name_ref Derived, file.%Derived.decl [concrete = constants.%Derived] -// CHECK:STDOUT: %return.param: ref %Derived = out_param call_param0 -// CHECK:STDOUT: %return: ref %Derived = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %Access.decl: %Access.type = fn_decl @Access [concrete = constants.%Access] { -// CHECK:STDOUT: %d.patt: %pattern_type.fb9 = binding_pattern d [concrete] -// CHECK:STDOUT: %d.param_patt: %pattern_type.fb9 = value_param_pattern %d.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.511 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.511 = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32.loc17_27: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc17_27: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %int_32.loc17_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc17_32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc17_35.1: %tuple.type.24b = tuple_literal (%i32.loc17_27, %i32.loc17_32) -// CHECK:STDOUT: %.loc17_35.2: type = converted %.loc17_35.1, constants.%tuple.type.d07 [concrete = constants.%tuple.type.d07] -// CHECK:STDOUT: %d.param: %Derived = value_param call_param0 -// CHECK:STDOUT: %Derived.ref: type = name_ref Derived, file.%Derived.decl [concrete = constants.%Derived] -// CHECK:STDOUT: %d: %Derived = bind_name d, %d.param -// CHECK:STDOUT: %return.param: ref %tuple.type.d07 = out_param call_param1 -// CHECK:STDOUT: %return: ref %tuple.type.d07 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Base { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc4: %Base.elem = field_decl b, element0 [concrete] -// CHECK:STDOUT: %struct_type.b: type = struct_type {.b: %i32} [concrete = constants.%struct_type.b.0a3] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.b [concrete = constants.%complete_type.ba8] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Base -// CHECK:STDOUT: .b = %.loc4 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Derived { -// CHECK:STDOUT: %Base.ref: type = name_ref Base, file.%Base.decl [concrete = constants.%Base] -// CHECK:STDOUT: %.loc8: %Derived.elem.69e = base_decl %Base.ref, element0 [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc10: %Derived.elem.344 = field_decl d, element1 [concrete] -// CHECK:STDOUT: %struct_type.base.d: type = struct_type {.base: %Base, .d: %i32} [concrete = constants.%struct_type.base.d.f8f] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base.d [concrete = constants.%complete_type.da6] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Derived -// CHECK:STDOUT: .Base = -// CHECK:STDOUT: .base = %.loc8 -// CHECK:STDOUT: .d = %.loc10 -// CHECK:STDOUT: extend %Base.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Make() -> %return.param: %Derived { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %int_4: Core.IntLiteral = int_value 4 [concrete = constants.%int_4.0c1] -// CHECK:STDOUT: %.loc14_26.1: %struct_type.b.a15 = struct_literal (%int_4) -// CHECK:STDOUT: %int_7: Core.IntLiteral = int_value 7 [concrete = constants.%int_7.29f] -// CHECK:STDOUT: %.loc14_35.1: %struct_type.base.d.a20 = struct_literal (%.loc14_26.1, %int_7) -// CHECK:STDOUT: %impl.elem0.loc14_26: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc14_26.1: = bound_method %int_4, %impl.elem0.loc14_26 [concrete = constants.%Convert.bound.ac3] -// CHECK:STDOUT: %specific_fn.loc14_26: = specific_function %impl.elem0.loc14_26, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc14_26.2: = bound_method %int_4, %specific_fn.loc14_26 [concrete = constants.%bound_method.1da] -// CHECK:STDOUT: %int.convert_checked.loc14_26: init %i32 = call %bound_method.loc14_26.2(%int_4) [concrete = constants.%int_4.940] -// CHECK:STDOUT: %.loc14_26.2: init %i32 = converted %int_4, %int.convert_checked.loc14_26 [concrete = constants.%int_4.940] -// CHECK:STDOUT: %.loc14_35.2: ref %Base = class_element_access %return, element0 -// CHECK:STDOUT: %.loc14_26.3: ref %i32 = class_element_access %.loc14_35.2, element0 -// CHECK:STDOUT: %.loc14_26.4: init %i32 = initialize_from %.loc14_26.2 to %.loc14_26.3 [concrete = constants.%int_4.940] -// CHECK:STDOUT: %.loc14_26.5: init %Base = class_init (%.loc14_26.4), %.loc14_35.2 [concrete = constants.%Base.val] -// CHECK:STDOUT: %.loc14_35.3: init %Base = converted %.loc14_26.1, %.loc14_26.5 [concrete = constants.%Base.val] -// CHECK:STDOUT: %impl.elem0.loc14_35: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc14_35.1: = bound_method %int_7, %impl.elem0.loc14_35 [concrete = constants.%Convert.bound.208] -// CHECK:STDOUT: %specific_fn.loc14_35: = specific_function %impl.elem0.loc14_35, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc14_35.2: = bound_method %int_7, %specific_fn.loc14_35 [concrete = constants.%bound_method.3bd] -// CHECK:STDOUT: %int.convert_checked.loc14_35: init %i32 = call %bound_method.loc14_35.2(%int_7) [concrete = constants.%int_7.0b1] -// CHECK:STDOUT: %.loc14_35.4: init %i32 = converted %int_7, %int.convert_checked.loc14_35 [concrete = constants.%int_7.0b1] -// CHECK:STDOUT: %.loc14_35.5: ref %i32 = class_element_access %return, element1 -// CHECK:STDOUT: %.loc14_35.6: init %i32 = initialize_from %.loc14_35.4 to %.loc14_35.5 [concrete = constants.%int_7.0b1] -// CHECK:STDOUT: %.loc14_35.7: init %Derived = class_init (%.loc14_35.3, %.loc14_35.6), %return [concrete = constants.%Derived.val] -// CHECK:STDOUT: %.loc14_36: init %Derived = converted %.loc14_35.1, %.loc14_35.7 [concrete = constants.%Derived.val] -// CHECK:STDOUT: return %.loc14_36 to %return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Access(%d.param: %Derived) -> %return.param: %tuple.type.d07 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %d.ref.loc18_11: %Derived = name_ref d, %d -// CHECK:STDOUT: %d.ref.loc18_12: %Derived.elem.344 = name_ref d, @Derived.%.loc10 [concrete = @Derived.%.loc10] -// CHECK:STDOUT: %.loc18_12.1: ref %i32 = class_element_access %d.ref.loc18_11, element1 -// CHECK:STDOUT: %.loc18_12.2: %i32 = bind_value %.loc18_12.1 -// CHECK:STDOUT: %d.ref.loc18_16: %Derived = name_ref d, %d -// CHECK:STDOUT: %base.ref: %Derived.elem.69e = name_ref base, @Derived.%.loc8 [concrete = @Derived.%.loc8] -// CHECK:STDOUT: %.loc18_17.1: ref %Base = class_element_access %d.ref.loc18_16, element0 -// CHECK:STDOUT: %.loc18_17.2: %Base = bind_value %.loc18_17.1 -// CHECK:STDOUT: %b.ref: %Base.elem = name_ref b, @Base.%.loc4 [concrete = @Base.%.loc4] -// CHECK:STDOUT: %.loc18_22.1: ref %i32 = class_element_access %.loc18_17.2, element0 -// CHECK:STDOUT: %.loc18_22.2: %i32 = bind_value %.loc18_22.1 -// CHECK:STDOUT: %.loc18_24.1: %tuple.type.d07 = tuple_literal (%.loc18_12.2, %.loc18_22.2) -// CHECK:STDOUT: %tuple.elem0: ref %i32 = tuple_access %return, element0 -// CHECK:STDOUT: %.loc18_24.2: init %i32 = initialize_from %.loc18_12.2 to %tuple.elem0 -// CHECK:STDOUT: %tuple.elem1: ref %i32 = tuple_access %return, element1 -// CHECK:STDOUT: %.loc18_24.3: init %i32 = initialize_from %.loc18_22.2 to %tuple.elem1 -// CHECK:STDOUT: %.loc18_24.4: init %tuple.type.d07 = tuple_init (%.loc18_24.2, %.loc18_24.3) to %return -// CHECK:STDOUT: %.loc18_25: init %tuple.type.d07 = converted %.loc18_24.1, %.loc18_24.4 -// CHECK:STDOUT: return %.loc18_25 to %return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_base_after_field.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Base: type = class_type @Base [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %Derived: type = class_type @Derived [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %Derived.elem: type = unbound_element_type %Derived, %i32 [concrete] -// CHECK:STDOUT: %struct_type.d: type = struct_type {.d: %i32} [concrete] -// CHECK:STDOUT: %complete_type.860: = complete_type_witness %struct_type.d [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Base = %Base.decl -// CHECK:STDOUT: .Derived = %Derived.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Base.decl: type = class_decl @Base [concrete = constants.%Base] {} {} -// CHECK:STDOUT: %Derived.decl: type = class_decl @Derived [concrete = constants.%Derived] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Base { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Base -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Derived { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc7: %Derived.elem = field_decl d, element0 [concrete] -// CHECK:STDOUT: %Base.ref: type = name_ref Base, file.%Base.decl [concrete = constants.%Base] -// CHECK:STDOUT: %struct_type.d: type = struct_type {.d: %i32} [concrete = constants.%struct_type.d] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.d [concrete = constants.%complete_type.860] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Derived -// CHECK:STDOUT: .d = %.loc7 -// CHECK:STDOUT: .Base = -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/base_field.carbon b/toolchain/check/testdata/class/base_field.carbon deleted file mode 100644 index 23c0dc5f4d179..0000000000000 --- a/toolchain/check/testdata/class/base_field.carbon +++ /dev/null @@ -1,146 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/base_field.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/base_field.carbon - -base class Base { - var a: i32; - var b: i32; - var c: i32; -} - -class Derived { - extend base: Base; - - var d: i32; - var e: i32; -} - -fn Access(p: Derived*) -> i32* { - return &(*p).c; -} - -// CHECK:STDOUT: --- base_field.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Base: type = class_type @Base [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %Base.elem: type = unbound_element_type %Base, %i32 [concrete] -// CHECK:STDOUT: %struct_type.a.b.c: type = struct_type {.a: %i32, .b: %i32, .c: %i32} [concrete] -// CHECK:STDOUT: %complete_type.ebc: = complete_type_witness %struct_type.a.b.c [concrete] -// CHECK:STDOUT: %Derived: type = class_type @Derived [concrete] -// CHECK:STDOUT: %Derived.elem.69e: type = unbound_element_type %Derived, %Base [concrete] -// CHECK:STDOUT: %Derived.elem.344: type = unbound_element_type %Derived, %i32 [concrete] -// CHECK:STDOUT: %struct_type.base.d.e.6a7: type = struct_type {.base: %Base, .d: %i32, .e: %i32} [concrete] -// CHECK:STDOUT: %complete_type.401: = complete_type_witness %struct_type.base.d.e.6a7 [concrete] -// CHECK:STDOUT: %ptr.404: type = ptr_type %Derived [concrete] -// CHECK:STDOUT: %pattern_type.605: type = pattern_type %ptr.404 [concrete] -// CHECK:STDOUT: %ptr.235: type = ptr_type %i32 [concrete] -// CHECK:STDOUT: %pattern_type.fe8: type = pattern_type %ptr.235 [concrete] -// CHECK:STDOUT: %Access.type: type = fn_type @Access [concrete] -// CHECK:STDOUT: %Access: %Access.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Base = %Base.decl -// CHECK:STDOUT: .Derived = %Derived.decl -// CHECK:STDOUT: .Access = %Access.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Base.decl: type = class_decl @Base [concrete = constants.%Base] {} {} -// CHECK:STDOUT: %Derived.decl: type = class_decl @Derived [concrete = constants.%Derived] {} {} -// CHECK:STDOUT: %Access.decl: %Access.type = fn_decl @Access [concrete = constants.%Access] { -// CHECK:STDOUT: %p.patt: %pattern_type.605 = binding_pattern p [concrete] -// CHECK:STDOUT: %p.param_patt: %pattern_type.605 = value_param_pattern %p.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.fe8 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.fe8 = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %ptr.loc24_30: type = ptr_type %i32 [concrete = constants.%ptr.235] -// CHECK:STDOUT: %p.param: %ptr.404 = value_param call_param0 -// CHECK:STDOUT: %.loc24: type = splice_block %ptr.loc24_21 [concrete = constants.%ptr.404] { -// CHECK:STDOUT: %Derived.ref: type = name_ref Derived, file.%Derived.decl [concrete = constants.%Derived] -// CHECK:STDOUT: %ptr.loc24_21: type = ptr_type %Derived.ref [concrete = constants.%ptr.404] -// CHECK:STDOUT: } -// CHECK:STDOUT: %p: %ptr.404 = bind_name p, %p.param -// CHECK:STDOUT: %return.param: ref %ptr.235 = out_param call_param1 -// CHECK:STDOUT: %return: ref %ptr.235 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Base { -// CHECK:STDOUT: %int_32.loc12: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc12: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc12: %Base.elem = field_decl a, element0 [concrete] -// CHECK:STDOUT: %int_32.loc13: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc13: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc13: %Base.elem = field_decl b, element1 [concrete] -// CHECK:STDOUT: %int_32.loc14: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc14: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc14: %Base.elem = field_decl c, element2 [concrete] -// CHECK:STDOUT: %struct_type.a.b.c: type = struct_type {.a: %i32, .b: %i32, .c: %i32} [concrete = constants.%struct_type.a.b.c] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.a.b.c [concrete = constants.%complete_type.ebc] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Base -// CHECK:STDOUT: .a = %.loc12 -// CHECK:STDOUT: .b = %.loc13 -// CHECK:STDOUT: .c = %.loc14 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Derived { -// CHECK:STDOUT: %Base.ref: type = name_ref Base, file.%Base.decl [concrete = constants.%Base] -// CHECK:STDOUT: %.loc18: %Derived.elem.69e = base_decl %Base.ref, element0 [concrete] -// CHECK:STDOUT: %int_32.loc20: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc20: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc20: %Derived.elem.344 = field_decl d, element1 [concrete] -// CHECK:STDOUT: %int_32.loc21: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc21: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc21: %Derived.elem.344 = field_decl e, element2 [concrete] -// CHECK:STDOUT: %struct_type.base.d.e: type = struct_type {.base: %Base, .d: %i32, .e: %i32} [concrete = constants.%struct_type.base.d.e.6a7] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base.d.e [concrete = constants.%complete_type.401] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Derived -// CHECK:STDOUT: .Base = -// CHECK:STDOUT: .base = %.loc18 -// CHECK:STDOUT: .d = %.loc20 -// CHECK:STDOUT: .e = %.loc21 -// CHECK:STDOUT: .c = -// CHECK:STDOUT: extend %Base.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Access(%p.param: %ptr.404) -> %ptr.235 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %p.ref: %ptr.404 = name_ref p, %p -// CHECK:STDOUT: %.loc25_12: ref %Derived = deref %p.ref -// CHECK:STDOUT: %c.ref: %Base.elem = name_ref c, @Base.%.loc14 [concrete = @Base.%.loc14] -// CHECK:STDOUT: %.loc25_15.1: ref %Base = class_element_access %.loc25_12, element0 -// CHECK:STDOUT: %.loc25_15.2: ref %Base = converted %.loc25_12, %.loc25_15.1 -// CHECK:STDOUT: %.loc25_15.3: ref %i32 = class_element_access %.loc25_15.2, element2 -// CHECK:STDOUT: %addr: %ptr.235 = addr_of %.loc25_15.3 -// CHECK:STDOUT: return %addr -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/base_function_unqualified.carbon b/toolchain/check/testdata/class/base_function_unqualified.carbon deleted file mode 100644 index d23d28afc0ebe..0000000000000 --- a/toolchain/check/testdata/class/base_function_unqualified.carbon +++ /dev/null @@ -1,109 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/base_function_unqualified.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/base_function_unqualified.carbon - -base class Base { - fn F(); -} - -class Derived { - extend base: Base; - - fn G() { F(); } - fn H(); -} - -fn Derived.H() { - F(); -} - -// CHECK:STDOUT: --- base_function_unqualified.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Base: type = class_type @Base [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %Derived: type = class_type @Derived [concrete] -// CHECK:STDOUT: %Derived.elem: type = unbound_element_type %Derived, %Base [concrete] -// CHECK:STDOUT: %G.type: type = fn_type @G [concrete] -// CHECK:STDOUT: %G: %G.type = struct_value () [concrete] -// CHECK:STDOUT: %H.type: type = fn_type @H [concrete] -// CHECK:STDOUT: %H: %H.type = struct_value () [concrete] -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %Base} [concrete] -// CHECK:STDOUT: %complete_type.15c: = complete_type_witness %struct_type.base [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Base = %Base.decl -// CHECK:STDOUT: .Derived = %Derived.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Base.decl: type = class_decl @Base [concrete = constants.%Base] {} {} -// CHECK:STDOUT: %Derived.decl: type = class_decl @Derived [concrete = constants.%Derived] {} {} -// CHECK:STDOUT: %H.decl: %H.type = fn_decl @H [concrete = constants.%H] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Base { -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] {} {} -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Base -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Derived { -// CHECK:STDOUT: %Base.ref: type = name_ref Base, file.%Base.decl [concrete = constants.%Base] -// CHECK:STDOUT: %.loc16: %Derived.elem = base_decl %Base.ref, element0 [concrete] -// CHECK:STDOUT: %G.decl: %G.type = fn_decl @G [concrete = constants.%G] {} {} -// CHECK:STDOUT: %H.decl: %H.type = fn_decl @H [concrete = constants.%H] {} {} -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %Base} [concrete = constants.%struct_type.base] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base [concrete = constants.%complete_type.15c] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Derived -// CHECK:STDOUT: .Base = -// CHECK:STDOUT: .base = %.loc16 -// CHECK:STDOUT: .G = %G.decl -// CHECK:STDOUT: .H = %H.decl -// CHECK:STDOUT: .F = -// CHECK:STDOUT: extend %Base.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F(); -// CHECK:STDOUT: -// CHECK:STDOUT: fn @G() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %F.ref: %F.type = name_ref F, @Base.%F.decl [concrete = constants.%F] -// CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.ref() -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @H() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %F.ref: %F.type = name_ref F, @Base.%F.decl [concrete = constants.%F] -// CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.ref() -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/base_method.carbon b/toolchain/check/testdata/class/base_method.carbon deleted file mode 100644 index 54e4dcf28779b..0000000000000 --- a/toolchain/check/testdata/class/base_method.carbon +++ /dev/null @@ -1,193 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/base_method.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/base_method.carbon - -base class Base { - var a: i32; - - fn F[addr self: Self*](); -} - -fn Base.F[addr self: Self*]() { - (*self).a = 1; -} - -class Derived { - extend base: Base; -} - -fn Call(p: Derived*) { - (*p).F(); -} - -// CHECK:STDOUT: --- base_method.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Base: type = class_type @Base [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %Base.elem: type = unbound_element_type %Base, %i32 [concrete] -// CHECK:STDOUT: %ptr.11f: type = ptr_type %Base [concrete] -// CHECK:STDOUT: %pattern_type.1b9: type = pattern_type %ptr.11f [concrete] -// CHECK:STDOUT: %pattern_type.f6d: type = pattern_type auto [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %struct_type.a: type = struct_type {.a: %i32} [concrete] -// CHECK:STDOUT: %complete_type.fd7: = complete_type_witness %struct_type.a [concrete] -// CHECK:STDOUT: %int_1.5b8: Core.IntLiteral = int_value 1 [concrete] -// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.type.205: type = facet_type <@ImplicitAs, @ImplicitAs(%i32)> [concrete] -// CHECK:STDOUT: %Convert.type.1b6: type = fn_type @Convert.1, @ImplicitAs(%i32) [concrete] -// CHECK:STDOUT: %To.c80: Core.IntLiteral = bind_symbolic_name To, 0 [symbolic] -// CHECK:STDOUT: %Convert.type.0f9: type = fn_type @Convert.2, @impl.4f9(%To.c80) [symbolic] -// CHECK:STDOUT: %Convert.f06: %Convert.type.0f9 = struct_value () [symbolic] -// CHECK:STDOUT: %ImplicitAs.impl_witness.c75: = impl_witness imports.%ImplicitAs.impl_witness_table.a2f, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.type.035: type = fn_type @Convert.2, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.956: %Convert.type.035 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.facet: %ImplicitAs.type.205 = facet_value Core.IntLiteral, (%ImplicitAs.impl_witness.c75) [concrete] -// CHECK:STDOUT: %.9c3: type = fn_type_with_self_type %Convert.type.1b6, %ImplicitAs.facet [concrete] -// CHECK:STDOUT: %Convert.bound: = bound_method %int_1.5b8, %Convert.956 [concrete] -// CHECK:STDOUT: %Convert.specific_fn: = specific_function %Convert.956, @Convert.2(%int_32) [concrete] -// CHECK:STDOUT: %bound_method: = bound_method %int_1.5b8, %Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_1.5d2: %i32 = int_value 1 [concrete] -// CHECK:STDOUT: %Derived: type = class_type @Derived [concrete] -// CHECK:STDOUT: %Derived.elem: type = unbound_element_type %Derived, %Base [concrete] -// CHECK:STDOUT: %struct_type.base.b1e: type = struct_type {.base: %Base} [concrete] -// CHECK:STDOUT: %complete_type.15c: = complete_type_witness %struct_type.base.b1e [concrete] -// CHECK:STDOUT: %ptr.404: type = ptr_type %Derived [concrete] -// CHECK:STDOUT: %pattern_type.605: type = pattern_type %ptr.404 [concrete] -// CHECK:STDOUT: %Call.type: type = fn_type @Call [concrete] -// CHECK:STDOUT: %Call: %Call.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/operators/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] -// CHECK:STDOUT: %Core.import_ref.a5b: @impl.4f9.%Convert.type (%Convert.type.0f9) = import_ref Core//prelude/types/int, loc19_39, loaded [symbolic = @impl.4f9.%Convert (constants.%Convert.f06)] -// CHECK:STDOUT: %ImplicitAs.impl_witness_table.a2f = impl_witness_table (%Core.import_ref.a5b), @impl.4f9 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Base = %Base.decl -// CHECK:STDOUT: .Derived = %Derived.decl -// CHECK:STDOUT: .Call = %Call.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Base.decl: type = class_decl @Base [concrete = constants.%Base] {} {} -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %self.patt: %pattern_type.1b9 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.1b9 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc17_11: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param.loc17: %ptr.11f = value_param call_param0 -// CHECK:STDOUT: %.loc17_26: type = splice_block %ptr.loc17 [concrete = constants.%ptr.11f] { -// CHECK:STDOUT: %Self.ref.loc17: type = name_ref Self, constants.%Base [concrete = constants.%Base] -// CHECK:STDOUT: %ptr.loc17: type = ptr_type %Self.ref.loc17 [concrete = constants.%ptr.11f] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self.loc17: %ptr.11f = bind_name self, %self.param.loc17 -// CHECK:STDOUT: } -// CHECK:STDOUT: %Derived.decl: type = class_decl @Derived [concrete = constants.%Derived] {} {} -// CHECK:STDOUT: %Call.decl: %Call.type = fn_decl @Call [concrete = constants.%Call] { -// CHECK:STDOUT: %p.patt: %pattern_type.605 = binding_pattern p [concrete] -// CHECK:STDOUT: %p.param_patt: %pattern_type.605 = value_param_pattern %p.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %p.param: %ptr.404 = value_param call_param0 -// CHECK:STDOUT: %.loc25: type = splice_block %ptr [concrete = constants.%ptr.404] { -// CHECK:STDOUT: %Derived.ref: type = name_ref Derived, file.%Derived.decl [concrete = constants.%Derived] -// CHECK:STDOUT: %ptr: type = ptr_type %Derived.ref [concrete = constants.%ptr.404] -// CHECK:STDOUT: } -// CHECK:STDOUT: %p: %ptr.404 = bind_name p, %p.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Base { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc12: %Base.elem = field_decl a, element0 [concrete] -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %self.patt: %pattern_type.1b9 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.1b9 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc17_11: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param.loc14: %ptr.11f = value_param call_param0 -// CHECK:STDOUT: %.loc14: type = splice_block %ptr.loc14 [concrete = constants.%ptr.11f] { -// CHECK:STDOUT: %Self.ref.loc14: type = name_ref Self, constants.%Base [concrete = constants.%Base] -// CHECK:STDOUT: %ptr.loc14: type = ptr_type %Self.ref.loc14 [concrete = constants.%ptr.11f] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self.loc14: %ptr.11f = bind_name self, %self.param.loc14 -// CHECK:STDOUT: } -// CHECK:STDOUT: %struct_type.a: type = struct_type {.a: %i32} [concrete = constants.%struct_type.a] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.a [concrete = constants.%complete_type.fd7] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Base -// CHECK:STDOUT: .a = %.loc12 -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Derived { -// CHECK:STDOUT: %Base.ref: type = name_ref Base, file.%Base.decl [concrete = constants.%Base] -// CHECK:STDOUT: %.loc22: %Derived.elem = base_decl %Base.ref, element0 [concrete] -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %Base} [concrete = constants.%struct_type.base.b1e] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base [concrete = constants.%complete_type.15c] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Derived -// CHECK:STDOUT: .Base = -// CHECK:STDOUT: .base = %.loc22 -// CHECK:STDOUT: .F = -// CHECK:STDOUT: extend %Base.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F(%self.param.loc17: %ptr.11f) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %self.ref: %ptr.11f = name_ref self, %self.loc17 -// CHECK:STDOUT: %.loc18_4: ref %Base = deref %self.ref -// CHECK:STDOUT: %a.ref: %Base.elem = name_ref a, @Base.%.loc12 [concrete = @Base.%.loc12] -// CHECK:STDOUT: %.loc18_10: ref %i32 = class_element_access %.loc18_4, element0 -// CHECK:STDOUT: %int_1: Core.IntLiteral = int_value 1 [concrete = constants.%int_1.5b8] -// CHECK:STDOUT: %impl.elem0: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc18_13.1: = bound_method %int_1, %impl.elem0 [concrete = constants.%Convert.bound] -// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc18_13.2: = bound_method %int_1, %specific_fn [concrete = constants.%bound_method] -// CHECK:STDOUT: %int.convert_checked: init %i32 = call %bound_method.loc18_13.2(%int_1) [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %.loc18_13: init %i32 = converted %int_1, %int.convert_checked [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: assign %.loc18_10, %.loc18_13 -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Call(%p.param: %ptr.404) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %p.ref: %ptr.404 = name_ref p, %p -// CHECK:STDOUT: %.loc26_4.1: ref %Derived = deref %p.ref -// CHECK:STDOUT: %F.ref: %F.type = name_ref F, @Base.%F.decl [concrete = constants.%F] -// CHECK:STDOUT: %F.bound: = bound_method %.loc26_4.1, %F.ref -// CHECK:STDOUT: %addr.loc26_4.1: %ptr.404 = addr_of %.loc26_4.1 -// CHECK:STDOUT: %.loc26_4.2: ref %Derived = deref %addr.loc26_4.1 -// CHECK:STDOUT: %.loc26_4.3: ref %Base = class_element_access %.loc26_4.2, element0 -// CHECK:STDOUT: %addr.loc26_4.2: %ptr.11f = addr_of %.loc26_4.3 -// CHECK:STDOUT: %.loc26_4.4: %ptr.11f = converted %addr.loc26_4.1, %addr.loc26_4.2 -// CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.bound(%.loc26_4.4) -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/base_method_qualified.carbon b/toolchain/check/testdata/class/base_method_qualified.carbon deleted file mode 100644 index af533a7f7ded5..0000000000000 --- a/toolchain/check/testdata/class/base_method_qualified.carbon +++ /dev/null @@ -1,301 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/base_method_qualified.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/base_method_qualified.carbon - -class Derived; - -base class Base { - fn F[self: Self]() -> i32; - fn G[self: Derived]() -> i32; -} - -class Derived { - extend base: Base; - - fn F[self: Self](); - fn G[self: Self](); -} - -fn Call(a: Derived) -> i32 { - return a.(Base.F)(); -} - -fn CallIndirect(p: Derived*) -> i32 { - return p->(Base.F)(); -} - -fn PassDerivedToBase(a: Derived) -> i32 { - return a.(Base.G)(); -} - -fn PassDerivedToBaseIndirect(p: Derived*) -> i32 { - return p->(Base.G)(); -} - -// CHECK:STDOUT: --- base_method_qualified.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Derived: type = class_type @Derived [concrete] -// CHECK:STDOUT: %Base: type = class_type @Base [concrete] -// CHECK:STDOUT: %pattern_type.bcc: type = pattern_type %Base [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %F.type.7c6: type = fn_type @F.1 [concrete] -// CHECK:STDOUT: %F.d17: %F.type.7c6 = struct_value () [concrete] -// CHECK:STDOUT: %pattern_type.fb9: type = pattern_type %Derived [concrete] -// CHECK:STDOUT: %G.type.6ee: type = fn_type @G.1 [concrete] -// CHECK:STDOUT: %G.663: %G.type.6ee = struct_value () [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %Derived.elem: type = unbound_element_type %Derived, %Base [concrete] -// CHECK:STDOUT: %F.type.5da: type = fn_type @F.2 [concrete] -// CHECK:STDOUT: %F.fa3: %F.type.5da = struct_value () [concrete] -// CHECK:STDOUT: %G.type.04c: type = fn_type @G.2 [concrete] -// CHECK:STDOUT: %G.07e: %G.type.04c = struct_value () [concrete] -// CHECK:STDOUT: %struct_type.base.b1e: type = struct_type {.base: %Base} [concrete] -// CHECK:STDOUT: %complete_type.15c: = complete_type_witness %struct_type.base.b1e [concrete] -// CHECK:STDOUT: %Call.type: type = fn_type @Call [concrete] -// CHECK:STDOUT: %Call: %Call.type = struct_value () [concrete] -// CHECK:STDOUT: %ptr.404: type = ptr_type %Derived [concrete] -// CHECK:STDOUT: %pattern_type.605: type = pattern_type %ptr.404 [concrete] -// CHECK:STDOUT: %CallIndirect.type: type = fn_type @CallIndirect [concrete] -// CHECK:STDOUT: %CallIndirect: %CallIndirect.type = struct_value () [concrete] -// CHECK:STDOUT: %PassDerivedToBase.type: type = fn_type @PassDerivedToBase [concrete] -// CHECK:STDOUT: %PassDerivedToBase: %PassDerivedToBase.type = struct_value () [concrete] -// CHECK:STDOUT: %PassDerivedToBaseIndirect.type: type = fn_type @PassDerivedToBaseIndirect [concrete] -// CHECK:STDOUT: %PassDerivedToBaseIndirect: %PassDerivedToBaseIndirect.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Derived = %Derived.decl.loc11 -// CHECK:STDOUT: .Base = %Base.decl -// CHECK:STDOUT: .Call = %Call.decl -// CHECK:STDOUT: .CallIndirect = %CallIndirect.decl -// CHECK:STDOUT: .PassDerivedToBase = %PassDerivedToBase.decl -// CHECK:STDOUT: .PassDerivedToBaseIndirect = %PassDerivedToBaseIndirect.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Derived.decl.loc11: type = class_decl @Derived [concrete = constants.%Derived] {} {} -// CHECK:STDOUT: %Base.decl: type = class_decl @Base [concrete = constants.%Base] {} {} -// CHECK:STDOUT: %Derived.decl.loc18: type = class_decl @Derived [concrete = constants.%Derived] {} {} -// CHECK:STDOUT: %Call.decl: %Call.type = fn_decl @Call [concrete = constants.%Call] { -// CHECK:STDOUT: %a.patt: %pattern_type.fb9 = binding_pattern a [concrete] -// CHECK:STDOUT: %a.param_patt: %pattern_type.fb9 = value_param_pattern %a.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %a.param: %Derived = value_param call_param0 -// CHECK:STDOUT: %Derived.ref: type = name_ref Derived, file.%Derived.decl.loc11 [concrete = constants.%Derived] -// CHECK:STDOUT: %a: %Derived = bind_name a, %a.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %CallIndirect.decl: %CallIndirect.type = fn_decl @CallIndirect [concrete = constants.%CallIndirect] { -// CHECK:STDOUT: %p.patt: %pattern_type.605 = binding_pattern p [concrete] -// CHECK:STDOUT: %p.param_patt: %pattern_type.605 = value_param_pattern %p.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %p.param: %ptr.404 = value_param call_param0 -// CHECK:STDOUT: %.loc29: type = splice_block %ptr [concrete = constants.%ptr.404] { -// CHECK:STDOUT: %Derived.ref: type = name_ref Derived, file.%Derived.decl.loc11 [concrete = constants.%Derived] -// CHECK:STDOUT: %ptr: type = ptr_type %Derived.ref [concrete = constants.%ptr.404] -// CHECK:STDOUT: } -// CHECK:STDOUT: %p: %ptr.404 = bind_name p, %p.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %PassDerivedToBase.decl: %PassDerivedToBase.type = fn_decl @PassDerivedToBase [concrete = constants.%PassDerivedToBase] { -// CHECK:STDOUT: %a.patt: %pattern_type.fb9 = binding_pattern a [concrete] -// CHECK:STDOUT: %a.param_patt: %pattern_type.fb9 = value_param_pattern %a.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %a.param: %Derived = value_param call_param0 -// CHECK:STDOUT: %Derived.ref: type = name_ref Derived, file.%Derived.decl.loc11 [concrete = constants.%Derived] -// CHECK:STDOUT: %a: %Derived = bind_name a, %a.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %PassDerivedToBaseIndirect.decl: %PassDerivedToBaseIndirect.type = fn_decl @PassDerivedToBaseIndirect [concrete = constants.%PassDerivedToBaseIndirect] { -// CHECK:STDOUT: %p.patt: %pattern_type.605 = binding_pattern p [concrete] -// CHECK:STDOUT: %p.param_patt: %pattern_type.605 = value_param_pattern %p.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %p.param: %ptr.404 = value_param call_param0 -// CHECK:STDOUT: %.loc37: type = splice_block %ptr [concrete = constants.%ptr.404] { -// CHECK:STDOUT: %Derived.ref: type = name_ref Derived, file.%Derived.decl.loc11 [concrete = constants.%Derived] -// CHECK:STDOUT: %ptr: type = ptr_type %Derived.ref [concrete = constants.%ptr.404] -// CHECK:STDOUT: } -// CHECK:STDOUT: %p: %ptr.404 = bind_name p, %p.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Derived { -// CHECK:STDOUT: %Base.ref: type = name_ref Base, file.%Base.decl [concrete = constants.%Base] -// CHECK:STDOUT: %.loc19: %Derived.elem = base_decl %Base.ref, element0 [concrete] -// CHECK:STDOUT: %F.decl: %F.type.5da = fn_decl @F.2 [concrete = constants.%F.fa3] { -// CHECK:STDOUT: %self.patt: %pattern_type.fb9 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.fb9 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %Derived = value_param call_param0 -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Derived [concrete = constants.%Derived] -// CHECK:STDOUT: %self: %Derived = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %G.decl: %G.type.04c = fn_decl @G.2 [concrete = constants.%G.07e] { -// CHECK:STDOUT: %self.patt: %pattern_type.fb9 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.fb9 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %Derived = value_param call_param0 -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Derived [concrete = constants.%Derived] -// CHECK:STDOUT: %self: %Derived = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %Base} [concrete = constants.%struct_type.base.b1e] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base [concrete = constants.%complete_type.15c] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Derived -// CHECK:STDOUT: .Base = -// CHECK:STDOUT: .base = %.loc19 -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: .G = %G.decl -// CHECK:STDOUT: extend %Base.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Base { -// CHECK:STDOUT: %F.decl: %F.type.7c6 = fn_decl @F.1 [concrete = constants.%F.d17] { -// CHECK:STDOUT: %self.patt: %pattern_type.bcc = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.bcc = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %self.param: %Base = value_param call_param0 -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Base [concrete = constants.%Base] -// CHECK:STDOUT: %self: %Base = bind_name self, %self.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %G.decl: %G.type.6ee = fn_decl @G.1 [concrete = constants.%G.663] { -// CHECK:STDOUT: %self.patt: %pattern_type.fb9 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.fb9 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %self.param: %Derived = value_param call_param0 -// CHECK:STDOUT: %Derived.ref: type = name_ref Derived, file.%Derived.decl.loc11 [concrete = constants.%Derived] -// CHECK:STDOUT: %self: %Derived = bind_name self, %self.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Base -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: .Derived = -// CHECK:STDOUT: .G = %G.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F.1(%self.param: %Base) -> %i32; -// CHECK:STDOUT: -// CHECK:STDOUT: fn @G.1(%self.param: %Derived) -> %i32; -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F.2(%self.param: %Derived); -// CHECK:STDOUT: -// CHECK:STDOUT: fn @G.2(%self.param: %Derived); -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Call(%a.param: %Derived) -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %a.ref: %Derived = name_ref a, %a -// CHECK:STDOUT: %Base.ref: type = name_ref Base, file.%Base.decl [concrete = constants.%Base] -// CHECK:STDOUT: %F.ref: %F.type.7c6 = name_ref F, @Base.%F.decl [concrete = constants.%F.d17] -// CHECK:STDOUT: %F.bound: = bound_method %a.ref, %F.ref -// CHECK:STDOUT: %.loc26_10.1: ref %Base = class_element_access %a.ref, element0 -// CHECK:STDOUT: %.loc26_10.2: ref %Base = converted %a.ref, %.loc26_10.1 -// CHECK:STDOUT: %.loc26_10.3: %Base = bind_value %.loc26_10.2 -// CHECK:STDOUT: %F.call: init %i32 = call %F.bound(%.loc26_10.3) -// CHECK:STDOUT: %.loc26_22.1: %i32 = value_of_initializer %F.call -// CHECK:STDOUT: %.loc26_22.2: %i32 = converted %F.call, %.loc26_22.1 -// CHECK:STDOUT: return %.loc26_22.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @CallIndirect(%p.param: %ptr.404) -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %p.ref: %ptr.404 = name_ref p, %p -// CHECK:STDOUT: %Base.ref: type = name_ref Base, file.%Base.decl [concrete = constants.%Base] -// CHECK:STDOUT: %F.ref: %F.type.7c6 = name_ref F, @Base.%F.decl [concrete = constants.%F.d17] -// CHECK:STDOUT: %.loc30_11.1: ref %Derived = deref %p.ref -// CHECK:STDOUT: %F.bound: = bound_method %.loc30_11.1, %F.ref -// CHECK:STDOUT: %.loc30_11.2: ref %Base = class_element_access %.loc30_11.1, element0 -// CHECK:STDOUT: %.loc30_11.3: ref %Base = converted %.loc30_11.1, %.loc30_11.2 -// CHECK:STDOUT: %.loc30_11.4: %Base = bind_value %.loc30_11.3 -// CHECK:STDOUT: %F.call: init %i32 = call %F.bound(%.loc30_11.4) -// CHECK:STDOUT: %.loc30_23.1: %i32 = value_of_initializer %F.call -// CHECK:STDOUT: %.loc30_23.2: %i32 = converted %F.call, %.loc30_23.1 -// CHECK:STDOUT: return %.loc30_23.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @PassDerivedToBase(%a.param: %Derived) -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %a.ref: %Derived = name_ref a, %a -// CHECK:STDOUT: %Base.ref: type = name_ref Base, file.%Base.decl [concrete = constants.%Base] -// CHECK:STDOUT: %G.ref: %G.type.6ee = name_ref G, @Base.%G.decl [concrete = constants.%G.663] -// CHECK:STDOUT: %G.bound: = bound_method %a.ref, %G.ref -// CHECK:STDOUT: %G.call: init %i32 = call %G.bound(%a.ref) -// CHECK:STDOUT: %.loc34_22.1: %i32 = value_of_initializer %G.call -// CHECK:STDOUT: %.loc34_22.2: %i32 = converted %G.call, %.loc34_22.1 -// CHECK:STDOUT: return %.loc34_22.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @PassDerivedToBaseIndirect(%p.param: %ptr.404) -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %p.ref: %ptr.404 = name_ref p, %p -// CHECK:STDOUT: %Base.ref: type = name_ref Base, file.%Base.decl [concrete = constants.%Base] -// CHECK:STDOUT: %G.ref: %G.type.6ee = name_ref G, @Base.%G.decl [concrete = constants.%G.663] -// CHECK:STDOUT: %.loc38_11.1: ref %Derived = deref %p.ref -// CHECK:STDOUT: %G.bound: = bound_method %.loc38_11.1, %G.ref -// CHECK:STDOUT: %.loc38_11.2: %Derived = bind_value %.loc38_11.1 -// CHECK:STDOUT: %G.call: init %i32 = call %G.bound(%.loc38_11.2) -// CHECK:STDOUT: %.loc38_23.1: %i32 = value_of_initializer %G.call -// CHECK:STDOUT: %.loc38_23.2: %i32 = converted %G.call, %.loc38_23.1 -// CHECK:STDOUT: return %.loc38_23.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/base_method_shadow.carbon b/toolchain/check/testdata/class/base_method_shadow.carbon deleted file mode 100644 index 957ea8ef89c69..0000000000000 --- a/toolchain/check/testdata/class/base_method_shadow.carbon +++ /dev/null @@ -1,259 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/base_method_shadow.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/base_method_shadow.carbon - -base class A { - fn F[addr self: Self*](); -} - -base class B { - extend base: A; - fn F[addr self: Self*](); -} - -class C { - extend base: B; - fn F[addr self: Self*](); -} - -class D { - extend base: B; -} - -fn Call(a: A*, b: B*, c: C*, d: D*) { - (*a).F(); - (*b).F(); - (*c).F(); - (*d).F(); -} - -// CHECK:STDOUT: --- base_method_shadow.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %A: type = class_type @A [concrete] -// CHECK:STDOUT: %ptr.6db: type = ptr_type %A [concrete] -// CHECK:STDOUT: %pattern_type.5f8: type = pattern_type %ptr.6db [concrete] -// CHECK:STDOUT: %pattern_type.f6d: type = pattern_type auto [concrete] -// CHECK:STDOUT: %F.type.649: type = fn_type @F.1 [concrete] -// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] -// CHECK:STDOUT: %F.485: %F.type.649 = struct_value () [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %B: type = class_type @B [concrete] -// CHECK:STDOUT: %B.elem: type = unbound_element_type %B, %A [concrete] -// CHECK:STDOUT: %ptr.e79: type = ptr_type %B [concrete] -// CHECK:STDOUT: %pattern_type.960: type = pattern_type %ptr.e79 [concrete] -// CHECK:STDOUT: %F.type.8c6: type = fn_type @F.2 [concrete] -// CHECK:STDOUT: %F.92a: %F.type.8c6 = struct_value () [concrete] -// CHECK:STDOUT: %struct_type.base.953: type = struct_type {.base: %A} [concrete] -// CHECK:STDOUT: %complete_type.020: = complete_type_witness %struct_type.base.953 [concrete] -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %C.elem: type = unbound_element_type %C, %B [concrete] -// CHECK:STDOUT: %ptr.019: type = ptr_type %C [concrete] -// CHECK:STDOUT: %pattern_type.44a: type = pattern_type %ptr.019 [concrete] -// CHECK:STDOUT: %F.type.c29: type = fn_type @F.3 [concrete] -// CHECK:STDOUT: %F.437: %F.type.c29 = struct_value () [concrete] -// CHECK:STDOUT: %struct_type.base.0ff: type = struct_type {.base: %B} [concrete] -// CHECK:STDOUT: %complete_type.98e: = complete_type_witness %struct_type.base.0ff [concrete] -// CHECK:STDOUT: %D: type = class_type @D [concrete] -// CHECK:STDOUT: %D.elem: type = unbound_element_type %D, %B [concrete] -// CHECK:STDOUT: %ptr.19c: type = ptr_type %D [concrete] -// CHECK:STDOUT: %pattern_type.a94: type = pattern_type %ptr.19c [concrete] -// CHECK:STDOUT: %Call.type: type = fn_type @Call [concrete] -// CHECK:STDOUT: %Call: %Call.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .A = %A.decl -// CHECK:STDOUT: .B = %B.decl -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: .D = %D.decl -// CHECK:STDOUT: .Call = %Call.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %A.decl: type = class_decl @A [concrete = constants.%A] {} {} -// CHECK:STDOUT: %B.decl: type = class_decl @B [concrete = constants.%B] {} {} -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: %D.decl: type = class_decl @D [concrete = constants.%D] {} {} -// CHECK:STDOUT: %Call.decl: %Call.type = fn_decl @Call [concrete = constants.%Call] { -// CHECK:STDOUT: %a.patt: %pattern_type.5f8 = binding_pattern a [concrete] -// CHECK:STDOUT: %a.param_patt: %pattern_type.5f8 = value_param_pattern %a.patt, call_param0 [concrete] -// CHECK:STDOUT: %b.patt: %pattern_type.960 = binding_pattern b [concrete] -// CHECK:STDOUT: %b.param_patt: %pattern_type.960 = value_param_pattern %b.patt, call_param1 [concrete] -// CHECK:STDOUT: %c.patt: %pattern_type.44a = binding_pattern c [concrete] -// CHECK:STDOUT: %c.param_patt: %pattern_type.44a = value_param_pattern %c.patt, call_param2 [concrete] -// CHECK:STDOUT: %d.patt: %pattern_type.a94 = binding_pattern d [concrete] -// CHECK:STDOUT: %d.param_patt: %pattern_type.a94 = value_param_pattern %d.patt, call_param3 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %a.param: %ptr.6db = value_param call_param0 -// CHECK:STDOUT: %.loc29_13: type = splice_block %ptr.loc29_13 [concrete = constants.%ptr.6db] { -// CHECK:STDOUT: %A.ref: type = name_ref A, file.%A.decl [concrete = constants.%A] -// CHECK:STDOUT: %ptr.loc29_13: type = ptr_type %A.ref [concrete = constants.%ptr.6db] -// CHECK:STDOUT: } -// CHECK:STDOUT: %a: %ptr.6db = bind_name a, %a.param -// CHECK:STDOUT: %b.param: %ptr.e79 = value_param call_param1 -// CHECK:STDOUT: %.loc29_20: type = splice_block %ptr.loc29_20 [concrete = constants.%ptr.e79] { -// CHECK:STDOUT: %B.ref: type = name_ref B, file.%B.decl [concrete = constants.%B] -// CHECK:STDOUT: %ptr.loc29_20: type = ptr_type %B.ref [concrete = constants.%ptr.e79] -// CHECK:STDOUT: } -// CHECK:STDOUT: %b: %ptr.e79 = bind_name b, %b.param -// CHECK:STDOUT: %c.param: %ptr.019 = value_param call_param2 -// CHECK:STDOUT: %.loc29_27: type = splice_block %ptr.loc29_27 [concrete = constants.%ptr.019] { -// CHECK:STDOUT: %C.ref: type = name_ref C, file.%C.decl [concrete = constants.%C] -// CHECK:STDOUT: %ptr.loc29_27: type = ptr_type %C.ref [concrete = constants.%ptr.019] -// CHECK:STDOUT: } -// CHECK:STDOUT: %c: %ptr.019 = bind_name c, %c.param -// CHECK:STDOUT: %d.param: %ptr.19c = value_param call_param3 -// CHECK:STDOUT: %.loc29_34: type = splice_block %ptr.loc29_34 [concrete = constants.%ptr.19c] { -// CHECK:STDOUT: %D.ref: type = name_ref D, file.%D.decl [concrete = constants.%D] -// CHECK:STDOUT: %ptr.loc29_34: type = ptr_type %D.ref [concrete = constants.%ptr.19c] -// CHECK:STDOUT: } -// CHECK:STDOUT: %d: %ptr.19c = bind_name d, %d.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @A { -// CHECK:STDOUT: %F.decl: %F.type.649 = fn_decl @F.1 [concrete = constants.%F.485] { -// CHECK:STDOUT: %self.patt: %pattern_type.5f8 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.5f8 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc12_8: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %ptr.6db = value_param call_param0 -// CHECK:STDOUT: %.loc12_23: type = splice_block %ptr [concrete = constants.%ptr.6db] { -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%A [concrete = constants.%A] -// CHECK:STDOUT: %ptr: type = ptr_type %Self.ref [concrete = constants.%ptr.6db] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self: %ptr.6db = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%A -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @B { -// CHECK:STDOUT: %A.ref: type = name_ref A, file.%A.decl [concrete = constants.%A] -// CHECK:STDOUT: %.loc16: %B.elem = base_decl %A.ref, element0 [concrete] -// CHECK:STDOUT: %F.decl: %F.type.8c6 = fn_decl @F.2 [concrete = constants.%F.92a] { -// CHECK:STDOUT: %self.patt: %pattern_type.960 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.960 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc17_8: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %ptr.e79 = value_param call_param0 -// CHECK:STDOUT: %.loc17_23: type = splice_block %ptr [concrete = constants.%ptr.e79] { -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%B [concrete = constants.%B] -// CHECK:STDOUT: %ptr: type = ptr_type %Self.ref [concrete = constants.%ptr.e79] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self: %ptr.e79 = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %A} [concrete = constants.%struct_type.base.953] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base [concrete = constants.%complete_type.020] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%B -// CHECK:STDOUT: .A = -// CHECK:STDOUT: .base = %.loc16 -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: extend %A.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C { -// CHECK:STDOUT: %B.ref: type = name_ref B, file.%B.decl [concrete = constants.%B] -// CHECK:STDOUT: %.loc21: %C.elem = base_decl %B.ref, element0 [concrete] -// CHECK:STDOUT: %F.decl: %F.type.c29 = fn_decl @F.3 [concrete = constants.%F.437] { -// CHECK:STDOUT: %self.patt: %pattern_type.44a = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.44a = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc22_8: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %ptr.019 = value_param call_param0 -// CHECK:STDOUT: %.loc22_23: type = splice_block %ptr [concrete = constants.%ptr.019] { -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%C [concrete = constants.%C] -// CHECK:STDOUT: %ptr: type = ptr_type %Self.ref [concrete = constants.%ptr.019] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self: %ptr.019 = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %B} [concrete = constants.%struct_type.base.0ff] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base [concrete = constants.%complete_type.98e] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%C -// CHECK:STDOUT: .B = -// CHECK:STDOUT: .base = %.loc21 -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: extend %B.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @D { -// CHECK:STDOUT: %B.ref: type = name_ref B, file.%B.decl [concrete = constants.%B] -// CHECK:STDOUT: %.loc26: %D.elem = base_decl %B.ref, element0 [concrete] -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %B} [concrete = constants.%struct_type.base.0ff] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base [concrete = constants.%complete_type.98e] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%D -// CHECK:STDOUT: .B = -// CHECK:STDOUT: .base = %.loc26 -// CHECK:STDOUT: .F = -// CHECK:STDOUT: extend %B.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F.1(%self.param: %ptr.6db); -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F.2(%self.param: %ptr.e79); -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F.3(%self.param: %ptr.019); -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Call(%a.param: %ptr.6db, %b.param: %ptr.e79, %c.param: %ptr.019, %d.param: %ptr.19c) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %a.ref: %ptr.6db = name_ref a, %a -// CHECK:STDOUT: %.loc30: ref %A = deref %a.ref -// CHECK:STDOUT: %F.ref.loc30: %F.type.649 = name_ref F, @A.%F.decl [concrete = constants.%F.485] -// CHECK:STDOUT: %F.bound.loc30: = bound_method %.loc30, %F.ref.loc30 -// CHECK:STDOUT: %addr.loc30: %ptr.6db = addr_of %.loc30 -// CHECK:STDOUT: %F.call.loc30: init %empty_tuple.type = call %F.bound.loc30(%addr.loc30) -// CHECK:STDOUT: %b.ref: %ptr.e79 = name_ref b, %b -// CHECK:STDOUT: %.loc31: ref %B = deref %b.ref -// CHECK:STDOUT: %F.ref.loc31: %F.type.8c6 = name_ref F, @B.%F.decl [concrete = constants.%F.92a] -// CHECK:STDOUT: %F.bound.loc31: = bound_method %.loc31, %F.ref.loc31 -// CHECK:STDOUT: %addr.loc31: %ptr.e79 = addr_of %.loc31 -// CHECK:STDOUT: %F.call.loc31: init %empty_tuple.type = call %F.bound.loc31(%addr.loc31) -// CHECK:STDOUT: %c.ref: %ptr.019 = name_ref c, %c -// CHECK:STDOUT: %.loc32: ref %C = deref %c.ref -// CHECK:STDOUT: %F.ref.loc32: %F.type.c29 = name_ref F, @C.%F.decl [concrete = constants.%F.437] -// CHECK:STDOUT: %F.bound.loc32: = bound_method %.loc32, %F.ref.loc32 -// CHECK:STDOUT: %addr.loc32: %ptr.019 = addr_of %.loc32 -// CHECK:STDOUT: %F.call.loc32: init %empty_tuple.type = call %F.bound.loc32(%addr.loc32) -// CHECK:STDOUT: %d.ref: %ptr.19c = name_ref d, %d -// CHECK:STDOUT: %.loc33_4.1: ref %D = deref %d.ref -// CHECK:STDOUT: %F.ref.loc33: %F.type.8c6 = name_ref F, @B.%F.decl [concrete = constants.%F.92a] -// CHECK:STDOUT: %F.bound.loc33: = bound_method %.loc33_4.1, %F.ref.loc33 -// CHECK:STDOUT: %addr.loc33_4.1: %ptr.19c = addr_of %.loc33_4.1 -// CHECK:STDOUT: %.loc33_4.2: ref %D = deref %addr.loc33_4.1 -// CHECK:STDOUT: %.loc33_4.3: ref %B = class_element_access %.loc33_4.2, element0 -// CHECK:STDOUT: %addr.loc33_4.2: %ptr.e79 = addr_of %.loc33_4.3 -// CHECK:STDOUT: %.loc33_4.4: %ptr.e79 = converted %addr.loc33_4.1, %addr.loc33_4.2 -// CHECK:STDOUT: %F.call.loc33: init %empty_tuple.type = call %F.bound.loc33(%.loc33_4.4) -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/basic.carbon b/toolchain/check/testdata/class/basic.carbon deleted file mode 100644 index 6b9547d063960..0000000000000 --- a/toolchain/check/testdata/class/basic.carbon +++ /dev/null @@ -1,195 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/basic.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/basic.carbon - -class Class { - fn F(n: i32) -> i32 { - return n; - } - - fn G(n: i32) -> i32; - - var k: i32; -} - -fn Class.G(n: i32) -> i32 { - return n; -} - -fn Run() -> i32 { - return Class.F(4); -} - -// CHECK:STDOUT: --- basic.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Class: type = class_type @Class [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %G.type: type = fn_type @G [concrete] -// CHECK:STDOUT: %G: %G.type = struct_value () [concrete] -// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %i32 [concrete] -// CHECK:STDOUT: %struct_type.k: type = struct_type {.k: %i32} [concrete] -// CHECK:STDOUT: %complete_type.954: = complete_type_witness %struct_type.k [concrete] -// CHECK:STDOUT: %Run.type: type = fn_type @Run [concrete] -// CHECK:STDOUT: %Run: %Run.type = struct_value () [concrete] -// CHECK:STDOUT: %int_4.0c1: Core.IntLiteral = int_value 4 [concrete] -// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.type.205: type = facet_type <@ImplicitAs, @ImplicitAs(%i32)> [concrete] -// CHECK:STDOUT: %Convert.type.1b6: type = fn_type @Convert.1, @ImplicitAs(%i32) [concrete] -// CHECK:STDOUT: %To.c80: Core.IntLiteral = bind_symbolic_name To, 0 [symbolic] -// CHECK:STDOUT: %Convert.type.0f9: type = fn_type @Convert.2, @impl.4f9(%To.c80) [symbolic] -// CHECK:STDOUT: %Convert.f06: %Convert.type.0f9 = struct_value () [symbolic] -// CHECK:STDOUT: %ImplicitAs.impl_witness.c75: = impl_witness imports.%ImplicitAs.impl_witness_table.a2f, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.type.035: type = fn_type @Convert.2, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.956: %Convert.type.035 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.facet: %ImplicitAs.type.205 = facet_value Core.IntLiteral, (%ImplicitAs.impl_witness.c75) [concrete] -// CHECK:STDOUT: %.9c3: type = fn_type_with_self_type %Convert.type.1b6, %ImplicitAs.facet [concrete] -// CHECK:STDOUT: %Convert.bound: = bound_method %int_4.0c1, %Convert.956 [concrete] -// CHECK:STDOUT: %Convert.specific_fn: = specific_function %Convert.956, @Convert.2(%int_32) [concrete] -// CHECK:STDOUT: %bound_method: = bound_method %int_4.0c1, %Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_4.940: %i32 = int_value 4 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/operators/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] -// CHECK:STDOUT: %Core.import_ref.a5b: @impl.4f9.%Convert.type (%Convert.type.0f9) = import_ref Core//prelude/types/int, loc19_39, loaded [symbolic = @impl.4f9.%Convert (constants.%Convert.f06)] -// CHECK:STDOUT: %ImplicitAs.impl_witness_table.a2f = impl_witness_table (%Core.import_ref.a5b), @impl.4f9 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Class = %Class.decl -// CHECK:STDOUT: .Run = %Run.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Class.decl: type = class_decl @Class [concrete = constants.%Class] {} {} -// CHECK:STDOUT: %G.decl: %G.type = fn_decl @G [concrete = constants.%G] { -// CHECK:STDOUT: %n.patt: %pattern_type.7ce = binding_pattern n [concrete] -// CHECK:STDOUT: %n.param_patt: %pattern_type.7ce = value_param_pattern %n.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32.loc21_23: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc21_23: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %n.param.loc21: %i32 = value_param call_param0 -// CHECK:STDOUT: %.loc21: type = splice_block %i32.loc21_15 [concrete = constants.%i32] { -// CHECK:STDOUT: %int_32.loc21_15: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc21_15: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: } -// CHECK:STDOUT: %n.loc21: %i32 = bind_name n, %n.param.loc21 -// CHECK:STDOUT: %return.param.loc21: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return.loc21: ref %i32 = return_slot %return.param.loc21 -// CHECK:STDOUT: } -// CHECK:STDOUT: %Run.decl: %Run.type = fn_decl @Run [concrete = constants.%Run] { -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param0 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Class { -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %n.patt: %pattern_type.7ce = binding_pattern n [concrete] -// CHECK:STDOUT: %n.param_patt: %pattern_type.7ce = value_param_pattern %n.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32.loc12_19: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc12_19: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %n.param: %i32 = value_param call_param0 -// CHECK:STDOUT: %.loc12: type = splice_block %i32.loc12_11 [concrete = constants.%i32] { -// CHECK:STDOUT: %int_32.loc12_11: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc12_11: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: } -// CHECK:STDOUT: %n: %i32 = bind_name n, %n.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %G.decl: %G.type = fn_decl @G [concrete = constants.%G] { -// CHECK:STDOUT: %n.patt: %pattern_type.7ce = binding_pattern n [concrete] -// CHECK:STDOUT: %n.param_patt: %pattern_type.7ce = value_param_pattern %n.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32.loc16_19: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc16_19: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %n.param.loc16: %i32 = value_param call_param0 -// CHECK:STDOUT: %.loc16: type = splice_block %i32.loc16_11 [concrete = constants.%i32] { -// CHECK:STDOUT: %int_32.loc16_11: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc16_11: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: } -// CHECK:STDOUT: %n.loc16: %i32 = bind_name n, %n.param.loc16 -// CHECK:STDOUT: %return.param.loc16: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return.loc16: ref %i32 = return_slot %return.param.loc16 -// CHECK:STDOUT: } -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc18: %Class.elem = field_decl k, element0 [concrete] -// CHECK:STDOUT: %struct_type.k: type = struct_type {.k: %i32} [concrete = constants.%struct_type.k] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.k [concrete = constants.%complete_type.954] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Class -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: .G = %G.decl -// CHECK:STDOUT: .k = %.loc18 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F(%n.param: %i32) -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %n.ref: %i32 = name_ref n, %n -// CHECK:STDOUT: return %n.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @G(%n.param.loc21: %i32) -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %n.ref: %i32 = name_ref n, %n.loc21 -// CHECK:STDOUT: return %n.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Run() -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %Class.ref: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %F.ref: %F.type = name_ref F, @Class.%F.decl [concrete = constants.%F] -// CHECK:STDOUT: %int_4: Core.IntLiteral = int_value 4 [concrete = constants.%int_4.0c1] -// CHECK:STDOUT: %impl.elem0: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc26_18.1: = bound_method %int_4, %impl.elem0 [concrete = constants.%Convert.bound] -// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc26_18.2: = bound_method %int_4, %specific_fn [concrete = constants.%bound_method] -// CHECK:STDOUT: %int.convert_checked: init %i32 = call %bound_method.loc26_18.2(%int_4) [concrete = constants.%int_4.940] -// CHECK:STDOUT: %.loc26_18.1: %i32 = value_of_initializer %int.convert_checked [concrete = constants.%int_4.940] -// CHECK:STDOUT: %.loc26_18.2: %i32 = converted %int_4, %.loc26_18.1 [concrete = constants.%int_4.940] -// CHECK:STDOUT: %F.call: init %i32 = call %F.ref(%.loc26_18.2) -// CHECK:STDOUT: %.loc26_20.1: %i32 = value_of_initializer %F.call -// CHECK:STDOUT: %.loc26_20.2: %i32 = converted %F.call, %.loc26_20.1 -// CHECK:STDOUT: return %.loc26_20.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/complete_in_member_fn.carbon b/toolchain/check/testdata/class/complete_in_member_fn.carbon deleted file mode 100644 index 1c4df5b47c32c..0000000000000 --- a/toolchain/check/testdata/class/complete_in_member_fn.carbon +++ /dev/null @@ -1,89 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/complete_in_member_fn.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/complete_in_member_fn.carbon - -class C { - fn F(c: C) -> i32 { return c.a; } - - var a: i32; -} - -// CHECK:STDOUT: --- complete_in_member_fn.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %pattern_type.c48: type = pattern_type %C [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %C.elem: type = unbound_element_type %C, %i32 [concrete] -// CHECK:STDOUT: %struct_type.a: type = struct_type {.a: %i32} [concrete] -// CHECK:STDOUT: %complete_type.fd7: = complete_type_witness %struct_type.a [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C { -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %c.patt: %pattern_type.c48 = binding_pattern c [concrete] -// CHECK:STDOUT: %c.param_patt: %pattern_type.c48 = value_param_pattern %c.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %c.param: %C = value_param call_param0 -// CHECK:STDOUT: %C.ref: type = name_ref C, file.%C.decl [concrete = constants.%C] -// CHECK:STDOUT: %c: %C = bind_name c, %c.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc14: %C.elem = field_decl a, element0 [concrete] -// CHECK:STDOUT: %struct_type.a: type = struct_type {.a: %i32} [concrete = constants.%struct_type.a] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.a [concrete = constants.%complete_type.fd7] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%C -// CHECK:STDOUT: .C = -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: .a = %.loc14 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F(%c.param: %C) -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %c.ref: %C = name_ref c, %c -// CHECK:STDOUT: %a.ref: %C.elem = name_ref a, @C.%.loc14 [concrete = @C.%.loc14] -// CHECK:STDOUT: %.loc12_31.1: ref %i32 = class_element_access %c.ref, element0 -// CHECK:STDOUT: %.loc12_31.2: %i32 = bind_value %.loc12_31.1 -// CHECK:STDOUT: return %.loc12_31.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/compound_field.carbon b/toolchain/check/testdata/class/compound_field.carbon deleted file mode 100644 index fdf3c9382ce75..0000000000000 --- a/toolchain/check/testdata/class/compound_field.carbon +++ /dev/null @@ -1,248 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/compound_field.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/compound_field.carbon - -base class Base { - var a: i32; - var b: i32; - var c: i32; -} - -class Derived { - extend base: Base; - - var d: i32; - var e: i32; -} - -fn AccessDerived(d: Derived) -> i32 { - return d.(Derived.d); -} - -fn AccessBase(d: Derived) -> i32 { - return d.(Base.b); -} - -fn AccessDerivedIndirect(p: Derived*) -> i32* { - return &p->(Derived.d); -} - -fn AccessBaseIndirect(p: Derived*) -> i32* { - return &p->(Base.b); -} - -// CHECK:STDOUT: --- compound_field.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Base: type = class_type @Base [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %Base.elem: type = unbound_element_type %Base, %i32 [concrete] -// CHECK:STDOUT: %struct_type.a.b.c: type = struct_type {.a: %i32, .b: %i32, .c: %i32} [concrete] -// CHECK:STDOUT: %complete_type.ebc: = complete_type_witness %struct_type.a.b.c [concrete] -// CHECK:STDOUT: %Derived: type = class_type @Derived [concrete] -// CHECK:STDOUT: %Derived.elem.69e: type = unbound_element_type %Derived, %Base [concrete] -// CHECK:STDOUT: %Derived.elem.344: type = unbound_element_type %Derived, %i32 [concrete] -// CHECK:STDOUT: %struct_type.base.d.e.6a7: type = struct_type {.base: %Base, .d: %i32, .e: %i32} [concrete] -// CHECK:STDOUT: %complete_type.401: = complete_type_witness %struct_type.base.d.e.6a7 [concrete] -// CHECK:STDOUT: %pattern_type.fb9: type = pattern_type %Derived [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %AccessDerived.type: type = fn_type @AccessDerived [concrete] -// CHECK:STDOUT: %AccessDerived: %AccessDerived.type = struct_value () [concrete] -// CHECK:STDOUT: %AccessBase.type: type = fn_type @AccessBase [concrete] -// CHECK:STDOUT: %AccessBase: %AccessBase.type = struct_value () [concrete] -// CHECK:STDOUT: %ptr.404: type = ptr_type %Derived [concrete] -// CHECK:STDOUT: %pattern_type.605: type = pattern_type %ptr.404 [concrete] -// CHECK:STDOUT: %ptr.235: type = ptr_type %i32 [concrete] -// CHECK:STDOUT: %pattern_type.fe8: type = pattern_type %ptr.235 [concrete] -// CHECK:STDOUT: %AccessDerivedIndirect.type: type = fn_type @AccessDerivedIndirect [concrete] -// CHECK:STDOUT: %AccessDerivedIndirect: %AccessDerivedIndirect.type = struct_value () [concrete] -// CHECK:STDOUT: %AccessBaseIndirect.type: type = fn_type @AccessBaseIndirect [concrete] -// CHECK:STDOUT: %AccessBaseIndirect: %AccessBaseIndirect.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Base = %Base.decl -// CHECK:STDOUT: .Derived = %Derived.decl -// CHECK:STDOUT: .AccessDerived = %AccessDerived.decl -// CHECK:STDOUT: .AccessBase = %AccessBase.decl -// CHECK:STDOUT: .AccessDerivedIndirect = %AccessDerivedIndirect.decl -// CHECK:STDOUT: .AccessBaseIndirect = %AccessBaseIndirect.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Base.decl: type = class_decl @Base [concrete = constants.%Base] {} {} -// CHECK:STDOUT: %Derived.decl: type = class_decl @Derived [concrete = constants.%Derived] {} {} -// CHECK:STDOUT: %AccessDerived.decl: %AccessDerived.type = fn_decl @AccessDerived [concrete = constants.%AccessDerived] { -// CHECK:STDOUT: %d.patt: %pattern_type.fb9 = binding_pattern d [concrete] -// CHECK:STDOUT: %d.param_patt: %pattern_type.fb9 = value_param_pattern %d.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %d.param: %Derived = value_param call_param0 -// CHECK:STDOUT: %Derived.ref.loc24: type = name_ref Derived, file.%Derived.decl [concrete = constants.%Derived] -// CHECK:STDOUT: %d: %Derived = bind_name d, %d.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %AccessBase.decl: %AccessBase.type = fn_decl @AccessBase [concrete = constants.%AccessBase] { -// CHECK:STDOUT: %d.patt: %pattern_type.fb9 = binding_pattern d [concrete] -// CHECK:STDOUT: %d.param_patt: %pattern_type.fb9 = value_param_pattern %d.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %d.param: %Derived = value_param call_param0 -// CHECK:STDOUT: %Derived.ref: type = name_ref Derived, file.%Derived.decl [concrete = constants.%Derived] -// CHECK:STDOUT: %d: %Derived = bind_name d, %d.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %AccessDerivedIndirect.decl: %AccessDerivedIndirect.type = fn_decl @AccessDerivedIndirect [concrete = constants.%AccessDerivedIndirect] { -// CHECK:STDOUT: %p.patt: %pattern_type.605 = binding_pattern p [concrete] -// CHECK:STDOUT: %p.param_patt: %pattern_type.605 = value_param_pattern %p.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.fe8 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.fe8 = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %ptr.loc32_45: type = ptr_type %i32 [concrete = constants.%ptr.235] -// CHECK:STDOUT: %p.param: %ptr.404 = value_param call_param0 -// CHECK:STDOUT: %.loc32: type = splice_block %ptr.loc32_36 [concrete = constants.%ptr.404] { -// CHECK:STDOUT: %Derived.ref.loc32: type = name_ref Derived, file.%Derived.decl [concrete = constants.%Derived] -// CHECK:STDOUT: %ptr.loc32_36: type = ptr_type %Derived.ref.loc32 [concrete = constants.%ptr.404] -// CHECK:STDOUT: } -// CHECK:STDOUT: %p: %ptr.404 = bind_name p, %p.param -// CHECK:STDOUT: %return.param: ref %ptr.235 = out_param call_param1 -// CHECK:STDOUT: %return: ref %ptr.235 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %AccessBaseIndirect.decl: %AccessBaseIndirect.type = fn_decl @AccessBaseIndirect [concrete = constants.%AccessBaseIndirect] { -// CHECK:STDOUT: %p.patt: %pattern_type.605 = binding_pattern p [concrete] -// CHECK:STDOUT: %p.param_patt: %pattern_type.605 = value_param_pattern %p.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.fe8 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.fe8 = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %ptr.loc36_42: type = ptr_type %i32 [concrete = constants.%ptr.235] -// CHECK:STDOUT: %p.param: %ptr.404 = value_param call_param0 -// CHECK:STDOUT: %.loc36: type = splice_block %ptr.loc36_33 [concrete = constants.%ptr.404] { -// CHECK:STDOUT: %Derived.ref: type = name_ref Derived, file.%Derived.decl [concrete = constants.%Derived] -// CHECK:STDOUT: %ptr.loc36_33: type = ptr_type %Derived.ref [concrete = constants.%ptr.404] -// CHECK:STDOUT: } -// CHECK:STDOUT: %p: %ptr.404 = bind_name p, %p.param -// CHECK:STDOUT: %return.param: ref %ptr.235 = out_param call_param1 -// CHECK:STDOUT: %return: ref %ptr.235 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Base { -// CHECK:STDOUT: %int_32.loc12: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc12: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc12: %Base.elem = field_decl a, element0 [concrete] -// CHECK:STDOUT: %int_32.loc13: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc13: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc13: %Base.elem = field_decl b, element1 [concrete] -// CHECK:STDOUT: %int_32.loc14: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc14: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc14: %Base.elem = field_decl c, element2 [concrete] -// CHECK:STDOUT: %struct_type.a.b.c: type = struct_type {.a: %i32, .b: %i32, .c: %i32} [concrete = constants.%struct_type.a.b.c] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.a.b.c [concrete = constants.%complete_type.ebc] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Base -// CHECK:STDOUT: .a = %.loc12 -// CHECK:STDOUT: .b = %.loc13 -// CHECK:STDOUT: .c = %.loc14 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Derived { -// CHECK:STDOUT: %Base.ref: type = name_ref Base, file.%Base.decl [concrete = constants.%Base] -// CHECK:STDOUT: %.loc18: %Derived.elem.69e = base_decl %Base.ref, element0 [concrete] -// CHECK:STDOUT: %int_32.loc20: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc20: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc20: %Derived.elem.344 = field_decl d, element1 [concrete] -// CHECK:STDOUT: %int_32.loc21: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc21: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc21: %Derived.elem.344 = field_decl e, element2 [concrete] -// CHECK:STDOUT: %struct_type.base.d.e: type = struct_type {.base: %Base, .d: %i32, .e: %i32} [concrete = constants.%struct_type.base.d.e.6a7] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base.d.e [concrete = constants.%complete_type.401] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Derived -// CHECK:STDOUT: .Base = -// CHECK:STDOUT: .base = %.loc18 -// CHECK:STDOUT: .d = %.loc20 -// CHECK:STDOUT: .e = %.loc21 -// CHECK:STDOUT: extend %Base.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @AccessDerived(%d.param: %Derived) -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %d.ref.loc25_10: %Derived = name_ref d, %d -// CHECK:STDOUT: %Derived.ref.loc25: type = name_ref Derived, file.%Derived.decl [concrete = constants.%Derived] -// CHECK:STDOUT: %d.ref.loc25_20: %Derived.elem.344 = name_ref d, @Derived.%.loc20 [concrete = @Derived.%.loc20] -// CHECK:STDOUT: %.loc25_11.1: ref %i32 = class_element_access %d.ref.loc25_10, element1 -// CHECK:STDOUT: %.loc25_11.2: %i32 = bind_value %.loc25_11.1 -// CHECK:STDOUT: return %.loc25_11.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @AccessBase(%d.param: %Derived) -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %d.ref: %Derived = name_ref d, %d -// CHECK:STDOUT: %Base.ref: type = name_ref Base, file.%Base.decl [concrete = constants.%Base] -// CHECK:STDOUT: %b.ref: %Base.elem = name_ref b, @Base.%.loc13 [concrete = @Base.%.loc13] -// CHECK:STDOUT: %.loc29_11.1: ref %Base = class_element_access %d.ref, element0 -// CHECK:STDOUT: %.loc29_11.2: ref %Base = converted %d.ref, %.loc29_11.1 -// CHECK:STDOUT: %.loc29_11.3: ref %i32 = class_element_access %.loc29_11.2, element1 -// CHECK:STDOUT: %.loc29_11.4: %i32 = bind_value %.loc29_11.3 -// CHECK:STDOUT: return %.loc29_11.4 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @AccessDerivedIndirect(%p.param: %ptr.404) -> %ptr.235 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %p.ref: %ptr.404 = name_ref p, %p -// CHECK:STDOUT: %Derived.ref.loc33: type = name_ref Derived, file.%Derived.decl [concrete = constants.%Derived] -// CHECK:STDOUT: %d.ref: %Derived.elem.344 = name_ref d, @Derived.%.loc20 [concrete = @Derived.%.loc20] -// CHECK:STDOUT: %.loc33_12.1: ref %Derived = deref %p.ref -// CHECK:STDOUT: %.loc33_12.2: ref %i32 = class_element_access %.loc33_12.1, element1 -// CHECK:STDOUT: %addr: %ptr.235 = addr_of %.loc33_12.2 -// CHECK:STDOUT: return %addr -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @AccessBaseIndirect(%p.param: %ptr.404) -> %ptr.235 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %p.ref: %ptr.404 = name_ref p, %p -// CHECK:STDOUT: %Base.ref: type = name_ref Base, file.%Base.decl [concrete = constants.%Base] -// CHECK:STDOUT: %b.ref: %Base.elem = name_ref b, @Base.%.loc13 [concrete = @Base.%.loc13] -// CHECK:STDOUT: %.loc37_12.1: ref %Derived = deref %p.ref -// CHECK:STDOUT: %.loc37_12.2: ref %Base = class_element_access %.loc37_12.1, element0 -// CHECK:STDOUT: %.loc37_12.3: ref %Base = converted %.loc37_12.1, %.loc37_12.2 -// CHECK:STDOUT: %.loc37_12.4: ref %i32 = class_element_access %.loc37_12.3, element1 -// CHECK:STDOUT: %addr: %ptr.235 = addr_of %.loc37_12.4 -// CHECK:STDOUT: return %addr -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/cross_package_import.carbon b/toolchain/check/testdata/class/cross_package_import.carbon deleted file mode 100644 index c0172d3fa3db8..0000000000000 --- a/toolchain/check/testdata/class/cross_package_import.carbon +++ /dev/null @@ -1,417 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/cross_package_import.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/cross_package_import.carbon - -// ============================================================================ -// Setup files -// ============================================================================ - -// --- other_define.carbon - -package Other library "[[@TEST_NAME]]"; - -class C {} - -// --- other_extern.carbon - -package Other library "[[@TEST_NAME]]"; - -extern class C; - -// --- other_conflict.carbon - -package Other library "[[@TEST_NAME]]"; - -fn C() {} - -// ============================================================================ -// Test files -// ============================================================================ - -// --- define.carbon - -library "[[@TEST_NAME]]"; - -import Other library "other_define"; - -var c: Other.C = {}; - -// --- fail_extern.carbon - -library "[[@TEST_NAME]]"; - -import Other library "other_extern"; - -// CHECK:STDERR: fail_extern.carbon:[[@LINE+8]]:8: error: binding pattern has incomplete type `C` in name binding declaration [IncompleteTypeInBindingDecl] -// CHECK:STDERR: var c: Other.C = {}; -// CHECK:STDERR: ^~~~~~~ -// CHECK:STDERR: fail_extern.carbon:[[@LINE-5]]:1: in import [InImport] -// CHECK:STDERR: other_extern.carbon:4:1: note: class was forward declared here [ClassForwardDeclaredHere] -// CHECK:STDERR: extern class C; -// CHECK:STDERR: ^~~~~~~~~~~~~~~ -// CHECK:STDERR: -var c: Other.C = {}; - -// --- fail_todo_merge_define_extern.carbon - -library "[[@TEST_NAME]]"; - -// CHECK:STDERR: fail_todo_merge_define_extern.carbon:[[@LINE+8]]:1: in import [InImport] -// CHECK:STDERR: other_extern.carbon:4:1: error: duplicate name `C` being declared in the same scope [NameDeclDuplicate] -// CHECK:STDERR: extern class C; -// CHECK:STDERR: ^~~~~~~~~~~~~~~ -// CHECK:STDERR: fail_todo_merge_define_extern.carbon:[[@LINE+4]]:1: in import [InImport] -// CHECK:STDERR: other_define.carbon:4:1: note: name is previously declared here [NameDeclPrevious] -// CHECK:STDERR: class C {} -// CHECK:STDERR: ^~~~~~~~~ -import Other library "other_define"; -import Other library "other_extern"; - -// CHECK:STDERR: fail_todo_merge_define_extern.carbon:[[@LINE+4]]:8: note: in name lookup for `C` [InNameLookup] -// CHECK:STDERR: var c: Other.C = {}; -// CHECK:STDERR: ^~~~~~~ -// CHECK:STDERR: -var c: Other.C = {}; - -// --- fail_conflict.carbon - -library "[[@TEST_NAME]]"; - -// CHECK:STDERR: fail_conflict.carbon:[[@LINE+8]]:1: in import [InImport] -// CHECK:STDERR: other_conflict.carbon:4:1: error: duplicate name `C` being declared in the same scope [NameDeclDuplicate] -// CHECK:STDERR: fn C() {} -// CHECK:STDERR: ^~~~~~~~ -// CHECK:STDERR: fail_conflict.carbon:[[@LINE+4]]:1: in import [InImport] -// CHECK:STDERR: other_define.carbon:4:1: note: name is previously declared here [NameDeclPrevious] -// CHECK:STDERR: class C {} -// CHECK:STDERR: ^~~~~~~~~ -import Other library "other_define"; -import Other library "other_conflict"; - -// CHECK:STDERR: fail_conflict.carbon:[[@LINE+4]]:8: note: in name lookup for `C` [InNameLookup] -// CHECK:STDERR: var c: Other.C = {}; -// CHECK:STDERR: ^~~~~~~ -// CHECK:STDERR: -var c: Other.C = {}; - -// CHECK:STDOUT: --- other_define.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- other_extern.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C; -// CHECK:STDOUT: -// CHECK:STDOUT: --- other_conflict.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C.type: type = fn_type @C [concrete] -// CHECK:STDOUT: %C: %C.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %C.decl: %C.type = fn_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @C() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- define.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %pattern_type: type = pattern_type %C [concrete] -// CHECK:STDOUT: %C.val: %C = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Other: = namespace file.%Other.import, [concrete] { -// CHECK:STDOUT: .C = %Other.C -// CHECK:STDOUT: import Other//other_define -// CHECK:STDOUT: } -// CHECK:STDOUT: %Other.C: type = import_ref Other//other_define, C, loaded [concrete = constants.%C] -// CHECK:STDOUT: %Other.import_ref.8f2: = import_ref Other//other_define, loc4_10, loaded [concrete = constants.%complete_type] -// CHECK:STDOUT: %Other.import_ref.2c4 = import_ref Other//other_define, inst18 [no loc], unloaded -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Other = imports.%Other -// CHECK:STDOUT: .c = %c -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Other.import = import Other -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %c.patt: %pattern_type = binding_pattern c [concrete] -// CHECK:STDOUT: %c.var_patt: %pattern_type = var_pattern %c.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %c.var: ref %C = var %c.var_patt [concrete] -// CHECK:STDOUT: %.loc6: type = splice_block %C.ref [concrete = constants.%C] { -// CHECK:STDOUT: %Other.ref: = name_ref Other, imports.%Other [concrete = imports.%Other] -// CHECK:STDOUT: %C.ref: type = name_ref C, imports.%Other.C [concrete = constants.%C] -// CHECK:STDOUT: } -// CHECK:STDOUT: %c: ref %C = bind_name c, %c.var -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C [from "other_define.carbon"] { -// CHECK:STDOUT: complete_type_witness = imports.%Other.import_ref.8f2 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Other.import_ref.2c4 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @__global_init() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %.loc6_19.1: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %.loc6_19.2: init %C = class_init (), file.%c.var [concrete = constants.%C.val] -// CHECK:STDOUT: %.loc6_1: init %C = converted %.loc6_19.1, %.loc6_19.2 [concrete = constants.%C.val] -// CHECK:STDOUT: assign file.%c.var, %.loc6_1 -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_extern.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Other: = namespace file.%Other.import, [concrete] { -// CHECK:STDOUT: .C = %Other.C -// CHECK:STDOUT: import Other//other_extern -// CHECK:STDOUT: } -// CHECK:STDOUT: %Other.C: type = import_ref Other//other_extern, C, loaded [concrete = constants.%C] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Other = imports.%Other -// CHECK:STDOUT: .c = %c -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Other.import = import Other -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %c.patt: = binding_pattern c [concrete] -// CHECK:STDOUT: %c.var_patt: = var_pattern %c.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %c.var: ref = var %c.var_patt [concrete = ] -// CHECK:STDOUT: %.loc14: type = splice_block %C.ref [concrete = constants.%C] { -// CHECK:STDOUT: %Other.ref: = name_ref Other, imports.%Other [concrete = imports.%Other] -// CHECK:STDOUT: %C.ref: type = name_ref C, imports.%Other.C [concrete = constants.%C] -// CHECK:STDOUT: } -// CHECK:STDOUT: %c: = bind_name c, -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C [from "other_extern.carbon"]; -// CHECK:STDOUT: -// CHECK:STDOUT: fn @__global_init() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %.loc14: %empty_struct_type = struct_literal () -// CHECK:STDOUT: assign file.%c.var, -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_todo_merge_define_extern.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %pattern_type: type = pattern_type %C [concrete] -// CHECK:STDOUT: %C.val: %C = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Other: = namespace file.%Other.import, [concrete] { -// CHECK:STDOUT: .C = %Other.C -// CHECK:STDOUT: import Other//other_define -// CHECK:STDOUT: import Other//other_extern -// CHECK:STDOUT: } -// CHECK:STDOUT: %Other.C: type = import_ref Other//other_define, C, loaded [concrete = constants.%C] -// CHECK:STDOUT: %Other.import_ref.8f2: = import_ref Other//other_define, loc4_10, loaded [concrete = constants.%complete_type] -// CHECK:STDOUT: %Other.import_ref.2c4 = import_ref Other//other_define, inst18 [no loc], unloaded -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Other = imports.%Other -// CHECK:STDOUT: .c = %c -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Other.import = import Other -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %c.patt: %pattern_type = binding_pattern c [concrete] -// CHECK:STDOUT: %c.var_patt: %pattern_type = var_pattern %c.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %c.var: ref %C = var %c.var_patt [concrete] -// CHECK:STDOUT: %.loc19: type = splice_block %C.ref [concrete = constants.%C] { -// CHECK:STDOUT: %Other.ref: = name_ref Other, imports.%Other [concrete = imports.%Other] -// CHECK:STDOUT: %C.ref: type = name_ref C, imports.%Other.C [concrete = constants.%C] -// CHECK:STDOUT: } -// CHECK:STDOUT: %c: ref %C = bind_name c, %c.var -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C [from "other_define.carbon"] { -// CHECK:STDOUT: complete_type_witness = imports.%Other.import_ref.8f2 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Other.import_ref.2c4 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @__global_init() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %.loc19_19.1: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %.loc19_19.2: init %C = class_init (), file.%c.var [concrete = constants.%C.val] -// CHECK:STDOUT: %.loc19_1: init %C = converted %.loc19_19.1, %.loc19_19.2 [concrete = constants.%C.val] -// CHECK:STDOUT: assign file.%c.var, %.loc19_1 -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_conflict.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %pattern_type: type = pattern_type %C [concrete] -// CHECK:STDOUT: %C.val: %C = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Other: = namespace file.%Other.import, [concrete] { -// CHECK:STDOUT: .C = %Other.C -// CHECK:STDOUT: import Other//other_define -// CHECK:STDOUT: import Other//other_conflict -// CHECK:STDOUT: } -// CHECK:STDOUT: %Other.C: type = import_ref Other//other_define, C, loaded [concrete = constants.%C] -// CHECK:STDOUT: %Other.import_ref.8f2: = import_ref Other//other_define, loc4_10, loaded [concrete = constants.%complete_type] -// CHECK:STDOUT: %Other.import_ref.2c4 = import_ref Other//other_define, inst18 [no loc], unloaded -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Other = imports.%Other -// CHECK:STDOUT: .c = %c -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Other.import = import Other -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %c.patt: %pattern_type = binding_pattern c [concrete] -// CHECK:STDOUT: %c.var_patt: %pattern_type = var_pattern %c.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %c.var: ref %C = var %c.var_patt [concrete] -// CHECK:STDOUT: %.loc19: type = splice_block %C.ref [concrete = constants.%C] { -// CHECK:STDOUT: %Other.ref: = name_ref Other, imports.%Other [concrete = imports.%Other] -// CHECK:STDOUT: %C.ref: type = name_ref C, imports.%Other.C [concrete = constants.%C] -// CHECK:STDOUT: } -// CHECK:STDOUT: %c: ref %C = bind_name c, %c.var -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C [from "other_define.carbon"] { -// CHECK:STDOUT: complete_type_witness = imports.%Other.import_ref.8f2 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Other.import_ref.2c4 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @__global_init() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %.loc19_19.1: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %.loc19_19.2: init %C = class_init (), file.%c.var [concrete = constants.%C.val] -// CHECK:STDOUT: %.loc19_1: init %C = converted %.loc19_19.1, %.loc19_19.2 [concrete = constants.%C.val] -// CHECK:STDOUT: assign file.%c.var, %.loc19_1 -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/derived_to_base.carbon b/toolchain/check/testdata/class/derived_to_base.carbon deleted file mode 100644 index e2f82d37b2ecf..0000000000000 --- a/toolchain/check/testdata/class/derived_to_base.carbon +++ /dev/null @@ -1,383 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/derived_to_base.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/derived_to_base.carbon - -base class A { - var a: i32; -} - -base class B { - extend base: A; - var b: i32; -} - -class C { - extend base: B; - var c: i32; -} - -fn ConvertCToB(p: C*) -> B* { return p; } -fn ConvertBToA(p: B*) -> A* { return p; } -fn ConvertCToA(p: C*) -> A* { return p; } - -fn ConvertValue(c: C) { - let a: A = c; -} - -fn ConvertRef(c: C*) -> A* { - return &(*c as A); -} - -fn ConvertInit() { - let a: A = {.base = {.base = {.a = 1}, .b = 2}, .c = 3} as C; -} - -// CHECK:STDOUT: --- derived_to_base.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %A: type = class_type @A [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %A.elem: type = unbound_element_type %A, %i32 [concrete] -// CHECK:STDOUT: %struct_type.a.ba9: type = struct_type {.a: %i32} [concrete] -// CHECK:STDOUT: %complete_type.fd7: = complete_type_witness %struct_type.a.ba9 [concrete] -// CHECK:STDOUT: %B: type = class_type @B [concrete] -// CHECK:STDOUT: %B.elem.e38: type = unbound_element_type %B, %A [concrete] -// CHECK:STDOUT: %B.elem.5c3: type = unbound_element_type %B, %i32 [concrete] -// CHECK:STDOUT: %struct_type.base.b.b44: type = struct_type {.base: %A, .b: %i32} [concrete] -// CHECK:STDOUT: %complete_type.725: = complete_type_witness %struct_type.base.b.b44 [concrete] -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %C.elem.f0c: type = unbound_element_type %C, %B [concrete] -// CHECK:STDOUT: %C.elem.646: type = unbound_element_type %C, %i32 [concrete] -// CHECK:STDOUT: %struct_type.base.c.8e2: type = struct_type {.base: %B, .c: %i32} [concrete] -// CHECK:STDOUT: %complete_type.58a: = complete_type_witness %struct_type.base.c.8e2 [concrete] -// CHECK:STDOUT: %ptr.019: type = ptr_type %C [concrete] -// CHECK:STDOUT: %pattern_type.44a: type = pattern_type %ptr.019 [concrete] -// CHECK:STDOUT: %ptr.e79: type = ptr_type %B [concrete] -// CHECK:STDOUT: %pattern_type.960: type = pattern_type %ptr.e79 [concrete] -// CHECK:STDOUT: %ConvertCToB.type: type = fn_type @ConvertCToB [concrete] -// CHECK:STDOUT: %ConvertCToB: %ConvertCToB.type = struct_value () [concrete] -// CHECK:STDOUT: %ptr.6db: type = ptr_type %A [concrete] -// CHECK:STDOUT: %pattern_type.5f8: type = pattern_type %ptr.6db [concrete] -// CHECK:STDOUT: %ConvertBToA.type: type = fn_type @ConvertBToA [concrete] -// CHECK:STDOUT: %ConvertBToA: %ConvertBToA.type = struct_value () [concrete] -// CHECK:STDOUT: %ConvertCToA.type: type = fn_type @ConvertCToA [concrete] -// CHECK:STDOUT: %ConvertCToA: %ConvertCToA.type = struct_value () [concrete] -// CHECK:STDOUT: %pattern_type.c48: type = pattern_type %C [concrete] -// CHECK:STDOUT: %ConvertValue.type: type = fn_type @ConvertValue [concrete] -// CHECK:STDOUT: %ConvertValue: %ConvertValue.type = struct_value () [concrete] -// CHECK:STDOUT: %pattern_type.c10: type = pattern_type %A [concrete] -// CHECK:STDOUT: %ConvertRef.type: type = fn_type @ConvertRef [concrete] -// CHECK:STDOUT: %ConvertRef: %ConvertRef.type = struct_value () [concrete] -// CHECK:STDOUT: %ConvertInit.type: type = fn_type @ConvertInit [concrete] -// CHECK:STDOUT: %ConvertInit: %ConvertInit.type = struct_value () [concrete] -// CHECK:STDOUT: %int_1.5b8: Core.IntLiteral = int_value 1 [concrete] -// CHECK:STDOUT: %struct_type.a.a6c: type = struct_type {.a: Core.IntLiteral} [concrete] -// CHECK:STDOUT: %int_2.ecc: Core.IntLiteral = int_value 2 [concrete] -// CHECK:STDOUT: %struct_type.base.b.bf0: type = struct_type {.base: %struct_type.a.a6c, .b: Core.IntLiteral} [concrete] -// CHECK:STDOUT: %int_3.1ba: Core.IntLiteral = int_value 3 [concrete] -// CHECK:STDOUT: %struct_type.base.c.136: type = struct_type {.base: %struct_type.base.b.bf0, .c: Core.IntLiteral} [concrete] -// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.type.205: type = facet_type <@ImplicitAs, @ImplicitAs(%i32)> [concrete] -// CHECK:STDOUT: %Convert.type.1b6: type = fn_type @Convert.1, @ImplicitAs(%i32) [concrete] -// CHECK:STDOUT: %To.c80: Core.IntLiteral = bind_symbolic_name To, 0 [symbolic] -// CHECK:STDOUT: %Convert.type.0f9: type = fn_type @Convert.2, @impl.4f9(%To.c80) [symbolic] -// CHECK:STDOUT: %Convert.f06: %Convert.type.0f9 = struct_value () [symbolic] -// CHECK:STDOUT: %ImplicitAs.impl_witness.c75: = impl_witness imports.%ImplicitAs.impl_witness_table.a2f, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.type.035: type = fn_type @Convert.2, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.956: %Convert.type.035 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.facet: %ImplicitAs.type.205 = facet_value Core.IntLiteral, (%ImplicitAs.impl_witness.c75) [concrete] -// CHECK:STDOUT: %.9c3: type = fn_type_with_self_type %Convert.type.1b6, %ImplicitAs.facet [concrete] -// CHECK:STDOUT: %Convert.bound.ab5: = bound_method %int_1.5b8, %Convert.956 [concrete] -// CHECK:STDOUT: %Convert.specific_fn: = specific_function %Convert.956, @Convert.2(%int_32) [concrete] -// CHECK:STDOUT: %bound_method.9a1: = bound_method %int_1.5b8, %Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_1.5d2: %i32 = int_value 1 [concrete] -// CHECK:STDOUT: %A.val: %A = struct_value (%int_1.5d2) [concrete] -// CHECK:STDOUT: %Convert.bound.ef9: = bound_method %int_2.ecc, %Convert.956 [concrete] -// CHECK:STDOUT: %bound_method.b92: = bound_method %int_2.ecc, %Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_2.ef8: %i32 = int_value 2 [concrete] -// CHECK:STDOUT: %B.val: %B = struct_value (%A.val, %int_2.ef8) [concrete] -// CHECK:STDOUT: %Convert.bound.b30: = bound_method %int_3.1ba, %Convert.956 [concrete] -// CHECK:STDOUT: %bound_method.047: = bound_method %int_3.1ba, %Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_3.822: %i32 = int_value 3 [concrete] -// CHECK:STDOUT: %C.val: %C = struct_value (%B.val, %int_3.822) [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/operators/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] -// CHECK:STDOUT: %Core.import_ref.a5b: @impl.4f9.%Convert.type (%Convert.type.0f9) = import_ref Core//prelude/types/int, loc19_39, loaded [symbolic = @impl.4f9.%Convert (constants.%Convert.f06)] -// CHECK:STDOUT: %ImplicitAs.impl_witness_table.a2f = impl_witness_table (%Core.import_ref.a5b), @impl.4f9 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .A = %A.decl -// CHECK:STDOUT: .B = %B.decl -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: .ConvertCToB = %ConvertCToB.decl -// CHECK:STDOUT: .ConvertBToA = %ConvertBToA.decl -// CHECK:STDOUT: .ConvertCToA = %ConvertCToA.decl -// CHECK:STDOUT: .ConvertValue = %ConvertValue.decl -// CHECK:STDOUT: .ConvertRef = %ConvertRef.decl -// CHECK:STDOUT: .ConvertInit = %ConvertInit.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %A.decl: type = class_decl @A [concrete = constants.%A] {} {} -// CHECK:STDOUT: %B.decl: type = class_decl @B [concrete = constants.%B] {} {} -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: %ConvertCToB.decl: %ConvertCToB.type = fn_decl @ConvertCToB [concrete = constants.%ConvertCToB] { -// CHECK:STDOUT: %p.patt: %pattern_type.44a = binding_pattern p [concrete] -// CHECK:STDOUT: %p.param_patt: %pattern_type.44a = value_param_pattern %p.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.960 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.960 = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %B.ref: type = name_ref B, file.%B.decl [concrete = constants.%B] -// CHECK:STDOUT: %ptr.loc25_27: type = ptr_type %B.ref [concrete = constants.%ptr.e79] -// CHECK:STDOUT: %p.param: %ptr.019 = value_param call_param0 -// CHECK:STDOUT: %.loc25_20: type = splice_block %ptr.loc25_20 [concrete = constants.%ptr.019] { -// CHECK:STDOUT: %C.ref: type = name_ref C, file.%C.decl [concrete = constants.%C] -// CHECK:STDOUT: %ptr.loc25_20: type = ptr_type %C.ref [concrete = constants.%ptr.019] -// CHECK:STDOUT: } -// CHECK:STDOUT: %p: %ptr.019 = bind_name p, %p.param -// CHECK:STDOUT: %return.param: ref %ptr.e79 = out_param call_param1 -// CHECK:STDOUT: %return: ref %ptr.e79 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %ConvertBToA.decl: %ConvertBToA.type = fn_decl @ConvertBToA [concrete = constants.%ConvertBToA] { -// CHECK:STDOUT: %p.patt: %pattern_type.960 = binding_pattern p [concrete] -// CHECK:STDOUT: %p.param_patt: %pattern_type.960 = value_param_pattern %p.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.5f8 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.5f8 = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %A.ref: type = name_ref A, file.%A.decl [concrete = constants.%A] -// CHECK:STDOUT: %ptr.loc26_27: type = ptr_type %A.ref [concrete = constants.%ptr.6db] -// CHECK:STDOUT: %p.param: %ptr.e79 = value_param call_param0 -// CHECK:STDOUT: %.loc26_20: type = splice_block %ptr.loc26_20 [concrete = constants.%ptr.e79] { -// CHECK:STDOUT: %B.ref: type = name_ref B, file.%B.decl [concrete = constants.%B] -// CHECK:STDOUT: %ptr.loc26_20: type = ptr_type %B.ref [concrete = constants.%ptr.e79] -// CHECK:STDOUT: } -// CHECK:STDOUT: %p: %ptr.e79 = bind_name p, %p.param -// CHECK:STDOUT: %return.param: ref %ptr.6db = out_param call_param1 -// CHECK:STDOUT: %return: ref %ptr.6db = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %ConvertCToA.decl: %ConvertCToA.type = fn_decl @ConvertCToA [concrete = constants.%ConvertCToA] { -// CHECK:STDOUT: %p.patt: %pattern_type.44a = binding_pattern p [concrete] -// CHECK:STDOUT: %p.param_patt: %pattern_type.44a = value_param_pattern %p.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.5f8 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.5f8 = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %A.ref: type = name_ref A, file.%A.decl [concrete = constants.%A] -// CHECK:STDOUT: %ptr.loc27_27: type = ptr_type %A.ref [concrete = constants.%ptr.6db] -// CHECK:STDOUT: %p.param: %ptr.019 = value_param call_param0 -// CHECK:STDOUT: %.loc27_20: type = splice_block %ptr.loc27_20 [concrete = constants.%ptr.019] { -// CHECK:STDOUT: %C.ref: type = name_ref C, file.%C.decl [concrete = constants.%C] -// CHECK:STDOUT: %ptr.loc27_20: type = ptr_type %C.ref [concrete = constants.%ptr.019] -// CHECK:STDOUT: } -// CHECK:STDOUT: %p: %ptr.019 = bind_name p, %p.param -// CHECK:STDOUT: %return.param: ref %ptr.6db = out_param call_param1 -// CHECK:STDOUT: %return: ref %ptr.6db = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %ConvertValue.decl: %ConvertValue.type = fn_decl @ConvertValue [concrete = constants.%ConvertValue] { -// CHECK:STDOUT: %c.patt: %pattern_type.c48 = binding_pattern c [concrete] -// CHECK:STDOUT: %c.param_patt: %pattern_type.c48 = value_param_pattern %c.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %c.param: %C = value_param call_param0 -// CHECK:STDOUT: %C.ref: type = name_ref C, file.%C.decl [concrete = constants.%C] -// CHECK:STDOUT: %c: %C = bind_name c, %c.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %ConvertRef.decl: %ConvertRef.type = fn_decl @ConvertRef [concrete = constants.%ConvertRef] { -// CHECK:STDOUT: %c.patt: %pattern_type.44a = binding_pattern c [concrete] -// CHECK:STDOUT: %c.param_patt: %pattern_type.44a = value_param_pattern %c.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.5f8 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.5f8 = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %A.ref.loc33: type = name_ref A, file.%A.decl [concrete = constants.%A] -// CHECK:STDOUT: %ptr.loc33_26: type = ptr_type %A.ref.loc33 [concrete = constants.%ptr.6db] -// CHECK:STDOUT: %c.param: %ptr.019 = value_param call_param0 -// CHECK:STDOUT: %.loc33: type = splice_block %ptr.loc33_19 [concrete = constants.%ptr.019] { -// CHECK:STDOUT: %C.ref: type = name_ref C, file.%C.decl [concrete = constants.%C] -// CHECK:STDOUT: %ptr.loc33_19: type = ptr_type %C.ref [concrete = constants.%ptr.019] -// CHECK:STDOUT: } -// CHECK:STDOUT: %c: %ptr.019 = bind_name c, %c.param -// CHECK:STDOUT: %return.param: ref %ptr.6db = out_param call_param1 -// CHECK:STDOUT: %return: ref %ptr.6db = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %ConvertInit.decl: %ConvertInit.type = fn_decl @ConvertInit [concrete = constants.%ConvertInit] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @A { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc12: %A.elem = field_decl a, element0 [concrete] -// CHECK:STDOUT: %struct_type.a: type = struct_type {.a: %i32} [concrete = constants.%struct_type.a.ba9] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.a [concrete = constants.%complete_type.fd7] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%A -// CHECK:STDOUT: .a = %.loc12 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @B { -// CHECK:STDOUT: %A.ref: type = name_ref A, file.%A.decl [concrete = constants.%A] -// CHECK:STDOUT: %.loc16: %B.elem.e38 = base_decl %A.ref, element0 [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc17: %B.elem.5c3 = field_decl b, element1 [concrete] -// CHECK:STDOUT: %struct_type.base.b: type = struct_type {.base: %A, .b: %i32} [concrete = constants.%struct_type.base.b.b44] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base.b [concrete = constants.%complete_type.725] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%B -// CHECK:STDOUT: .A = -// CHECK:STDOUT: .base = %.loc16 -// CHECK:STDOUT: .b = %.loc17 -// CHECK:STDOUT: extend %A.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C { -// CHECK:STDOUT: %B.ref: type = name_ref B, file.%B.decl [concrete = constants.%B] -// CHECK:STDOUT: %.loc21: %C.elem.f0c = base_decl %B.ref, element0 [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc22: %C.elem.646 = field_decl c, element1 [concrete] -// CHECK:STDOUT: %struct_type.base.c: type = struct_type {.base: %B, .c: %i32} [concrete = constants.%struct_type.base.c.8e2] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base.c [concrete = constants.%complete_type.58a] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%C -// CHECK:STDOUT: .B = -// CHECK:STDOUT: .base = %.loc21 -// CHECK:STDOUT: .c = %.loc22 -// CHECK:STDOUT: extend %B.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @ConvertCToB(%p.param: %ptr.019) -> %ptr.e79 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %p.ref: %ptr.019 = name_ref p, %p -// CHECK:STDOUT: %.loc25_39.1: ref %C = deref %p.ref -// CHECK:STDOUT: %.loc25_39.2: ref %B = class_element_access %.loc25_39.1, element0 -// CHECK:STDOUT: %addr: %ptr.e79 = addr_of %.loc25_39.2 -// CHECK:STDOUT: %.loc25_39.3: %ptr.e79 = converted %p.ref, %addr -// CHECK:STDOUT: return %.loc25_39.3 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @ConvertBToA(%p.param: %ptr.e79) -> %ptr.6db { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %p.ref: %ptr.e79 = name_ref p, %p -// CHECK:STDOUT: %.loc26_39.1: ref %B = deref %p.ref -// CHECK:STDOUT: %.loc26_39.2: ref %A = class_element_access %.loc26_39.1, element0 -// CHECK:STDOUT: %addr: %ptr.6db = addr_of %.loc26_39.2 -// CHECK:STDOUT: %.loc26_39.3: %ptr.6db = converted %p.ref, %addr -// CHECK:STDOUT: return %.loc26_39.3 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @ConvertCToA(%p.param: %ptr.019) -> %ptr.6db { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %p.ref: %ptr.019 = name_ref p, %p -// CHECK:STDOUT: %.loc27_39.1: ref %C = deref %p.ref -// CHECK:STDOUT: %.loc27_39.2: ref %B = class_element_access %.loc27_39.1, element0 -// CHECK:STDOUT: %.loc27_39.3: ref %A = class_element_access %.loc27_39.2, element0 -// CHECK:STDOUT: %addr: %ptr.6db = addr_of %.loc27_39.3 -// CHECK:STDOUT: %.loc27_39.4: %ptr.6db = converted %p.ref, %addr -// CHECK:STDOUT: return %.loc27_39.4 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @ConvertValue(%c.param: %C) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %a.patt: %pattern_type.c10 = binding_pattern a [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %c.ref: %C = name_ref c, %c -// CHECK:STDOUT: %A.ref: type = name_ref A, file.%A.decl [concrete = constants.%A] -// CHECK:STDOUT: %.loc30_14.1: ref %B = class_element_access %c.ref, element0 -// CHECK:STDOUT: %.loc30_14.2: ref %A = class_element_access %.loc30_14.1, element0 -// CHECK:STDOUT: %.loc30_14.3: ref %A = converted %c.ref, %.loc30_14.2 -// CHECK:STDOUT: %a: ref %A = bind_name a, %.loc30_14.3 -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @ConvertRef(%c.param: %ptr.019) -> %ptr.6db { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %c.ref: %ptr.019 = name_ref c, %c -// CHECK:STDOUT: %.loc34_12: ref %C = deref %c.ref -// CHECK:STDOUT: %A.ref.loc34: type = name_ref A, file.%A.decl [concrete = constants.%A] -// CHECK:STDOUT: %.loc34_15.1: ref %B = class_element_access %.loc34_12, element0 -// CHECK:STDOUT: %.loc34_15.2: ref %A = class_element_access %.loc34_15.1, element0 -// CHECK:STDOUT: %.loc34_15.3: ref %A = converted %.loc34_12, %.loc34_15.2 -// CHECK:STDOUT: %addr: %ptr.6db = addr_of %.loc34_15.3 -// CHECK:STDOUT: return %addr -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @ConvertInit() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %a.patt: %pattern_type.c10 = binding_pattern a [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %int_1: Core.IntLiteral = int_value 1 [concrete = constants.%int_1.5b8] -// CHECK:STDOUT: %.loc38_39.1: %struct_type.a.a6c = struct_literal (%int_1) -// CHECK:STDOUT: %int_2: Core.IntLiteral = int_value 2 [concrete = constants.%int_2.ecc] -// CHECK:STDOUT: %.loc38_48.1: %struct_type.base.b.bf0 = struct_literal (%.loc38_39.1, %int_2) -// CHECK:STDOUT: %int_3: Core.IntLiteral = int_value 3 [concrete = constants.%int_3.1ba] -// CHECK:STDOUT: %.loc38_57.1: %struct_type.base.c.136 = struct_literal (%.loc38_48.1, %int_3) -// CHECK:STDOUT: %C.ref: type = name_ref C, file.%C.decl [concrete = constants.%C] -// CHECK:STDOUT: %impl.elem0.loc38_39: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc38_39.1: = bound_method %int_1, %impl.elem0.loc38_39 [concrete = constants.%Convert.bound.ab5] -// CHECK:STDOUT: %specific_fn.loc38_39: = specific_function %impl.elem0.loc38_39, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc38_39.2: = bound_method %int_1, %specific_fn.loc38_39 [concrete = constants.%bound_method.9a1] -// CHECK:STDOUT: %int.convert_checked.loc38_39: init %i32 = call %bound_method.loc38_39.2(%int_1) [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %.loc38_39.2: init %i32 = converted %int_1, %int.convert_checked.loc38_39 [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %.loc38_57.2: ref %C = temporary_storage -// CHECK:STDOUT: %.loc38_57.3: ref %B = class_element_access %.loc38_57.2, element0 -// CHECK:STDOUT: %.loc38_48.2: ref %A = class_element_access %.loc38_57.3, element0 -// CHECK:STDOUT: %.loc38_39.3: ref %i32 = class_element_access %.loc38_48.2, element0 -// CHECK:STDOUT: %.loc38_39.4: init %i32 = initialize_from %.loc38_39.2 to %.loc38_39.3 [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %.loc38_39.5: init %A = class_init (%.loc38_39.4), %.loc38_48.2 [concrete = constants.%A.val] -// CHECK:STDOUT: %.loc38_48.3: init %A = converted %.loc38_39.1, %.loc38_39.5 [concrete = constants.%A.val] -// CHECK:STDOUT: %impl.elem0.loc38_48: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc38_48.1: = bound_method %int_2, %impl.elem0.loc38_48 [concrete = constants.%Convert.bound.ef9] -// CHECK:STDOUT: %specific_fn.loc38_48: = specific_function %impl.elem0.loc38_48, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc38_48.2: = bound_method %int_2, %specific_fn.loc38_48 [concrete = constants.%bound_method.b92] -// CHECK:STDOUT: %int.convert_checked.loc38_48: init %i32 = call %bound_method.loc38_48.2(%int_2) [concrete = constants.%int_2.ef8] -// CHECK:STDOUT: %.loc38_48.4: init %i32 = converted %int_2, %int.convert_checked.loc38_48 [concrete = constants.%int_2.ef8] -// CHECK:STDOUT: %.loc38_48.5: ref %i32 = class_element_access %.loc38_57.3, element1 -// CHECK:STDOUT: %.loc38_48.6: init %i32 = initialize_from %.loc38_48.4 to %.loc38_48.5 [concrete = constants.%int_2.ef8] -// CHECK:STDOUT: %.loc38_48.7: init %B = class_init (%.loc38_48.3, %.loc38_48.6), %.loc38_57.3 [concrete = constants.%B.val] -// CHECK:STDOUT: %.loc38_57.4: init %B = converted %.loc38_48.1, %.loc38_48.7 [concrete = constants.%B.val] -// CHECK:STDOUT: %impl.elem0.loc38_57: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc38_57.1: = bound_method %int_3, %impl.elem0.loc38_57 [concrete = constants.%Convert.bound.b30] -// CHECK:STDOUT: %specific_fn.loc38_57: = specific_function %impl.elem0.loc38_57, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc38_57.2: = bound_method %int_3, %specific_fn.loc38_57 [concrete = constants.%bound_method.047] -// CHECK:STDOUT: %int.convert_checked.loc38_57: init %i32 = call %bound_method.loc38_57.2(%int_3) [concrete = constants.%int_3.822] -// CHECK:STDOUT: %.loc38_57.5: init %i32 = converted %int_3, %int.convert_checked.loc38_57 [concrete = constants.%int_3.822] -// CHECK:STDOUT: %.loc38_57.6: ref %i32 = class_element_access %.loc38_57.2, element1 -// CHECK:STDOUT: %.loc38_57.7: init %i32 = initialize_from %.loc38_57.5 to %.loc38_57.6 [concrete = constants.%int_3.822] -// CHECK:STDOUT: %.loc38_57.8: init %C = class_init (%.loc38_57.4, %.loc38_57.7), %.loc38_57.2 [concrete = constants.%C.val] -// CHECK:STDOUT: %.loc38_57.9: ref %C = temporary %.loc38_57.2, %.loc38_57.8 -// CHECK:STDOUT: %.loc38_59.1: ref %C = converted %.loc38_57.1, %.loc38_57.9 -// CHECK:STDOUT: %A.ref: type = name_ref A, file.%A.decl [concrete = constants.%A] -// CHECK:STDOUT: %.loc38_59.2: ref %B = class_element_access %.loc38_59.1, element0 -// CHECK:STDOUT: %.loc38_59.3: ref %A = class_element_access %.loc38_59.2, element0 -// CHECK:STDOUT: %.loc38_59.4: ref %A = converted %.loc38_59.1, %.loc38_59.3 -// CHECK:STDOUT: %a: ref %A = bind_name a, %.loc38_59.4 -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/fail_addr_not_self.carbon b/toolchain/check/testdata/class/fail_addr_not_self.carbon deleted file mode 100644 index f5dea5fc6c008..0000000000000 --- a/toolchain/check/testdata/class/fail_addr_not_self.carbon +++ /dev/null @@ -1,99 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/fail_addr_not_self.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/fail_addr_not_self.carbon - -class Class { - // CHECK:STDERR: fail_addr_not_self.carbon:[[@LINE+4]]:8: error: `addr` can only be applied to a `self` parameter [AddrOnNonSelfParam] - // CHECK:STDERR: fn F[addr a:! Class*](); - // CHECK:STDERR: ^~~~ - // CHECK:STDERR: - fn F[addr a:! Class*](); - - // CHECK:STDERR: fail_addr_not_self.carbon:[[@LINE+4]]:8: error: `addr` can only be applied to a `self` parameter [AddrOnNonSelfParam] - // CHECK:STDERR: fn G(addr b: Class*); - // CHECK:STDERR: ^~~~ - // CHECK:STDERR: - fn G(addr b: Class*); -} - -// CHECK:STDOUT: --- fail_addr_not_self.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Class: type = class_type @Class [concrete] -// CHECK:STDOUT: %ptr: type = ptr_type %Class [concrete] -// CHECK:STDOUT: %a: %ptr = bind_symbolic_name a, 0 [symbolic] -// CHECK:STDOUT: %pattern_type: type = pattern_type %ptr [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %G.type: type = fn_type @G [concrete] -// CHECK:STDOUT: %G: %G.type = struct_value () [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Class = %Class.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Class.decl: type = class_decl @Class [concrete = constants.%Class] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Class { -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %a.patt: %pattern_type = symbolic_binding_pattern a, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %.loc16: type = splice_block %ptr [concrete = constants.%ptr] { -// CHECK:STDOUT: %Class.ref: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %ptr: type = ptr_type %Class.ref [concrete = constants.%ptr] -// CHECK:STDOUT: } -// CHECK:STDOUT: %a.loc16_13.2: %ptr = bind_symbolic_name a, 0 [symbolic = %a.loc16_13.1 (constants.%a)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %G.decl: %G.type = fn_decl @G [concrete = constants.%G] { -// CHECK:STDOUT: %b.patt: %pattern_type = binding_pattern b [concrete] -// CHECK:STDOUT: %b.param_patt: %pattern_type = value_param_pattern %b.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %b.param: %ptr = value_param call_param0 -// CHECK:STDOUT: %.loc22: type = splice_block %ptr [concrete = constants.%ptr] { -// CHECK:STDOUT: %Class.ref: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %ptr: type = ptr_type %Class.ref [concrete = constants.%ptr] -// CHECK:STDOUT: } -// CHECK:STDOUT: %b: %ptr = bind_name b, %b.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Class -// CHECK:STDOUT: .Class = -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: .G = %G.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @F(%a.loc16_13.2: %ptr) { -// CHECK:STDOUT: %a.loc16_13.1: %ptr = bind_symbolic_name a, 0 [symbolic = %a.loc16_13.1 (constants.%a)] -// CHECK:STDOUT: -// CHECK:STDOUT: fn(); -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @G(%b.param: %ptr); -// CHECK:STDOUT: -// CHECK:STDOUT: specific @F(constants.%a) { -// CHECK:STDOUT: %a.loc16_13.1 => constants.%a -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/fail_addr_self.carbon b/toolchain/check/testdata/class/fail_addr_self.carbon deleted file mode 100644 index 92c6fca0ce821..0000000000000 --- a/toolchain/check/testdata/class/fail_addr_self.carbon +++ /dev/null @@ -1,152 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/fail_addr_self.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/fail_addr_self.carbon - -class Class { - fn F[addr self: Class*](); - // CHECK:STDERR: fail_addr_self.carbon:[[@LINE+4]]:8: error: `addr` can only be applied to a binding with a pointer type [AddrOnNonPointerType] - // CHECK:STDERR: fn G[addr self: Class](); - // CHECK:STDERR: ^~~~~~~~~~~~~~~~ - // CHECK:STDERR: - fn G[addr self: Class](); -} - -fn F(c: Class, p: Class*) { - // CHECK:STDERR: fail_addr_self.carbon:[[@LINE+7]]:3: error: `addr self` method cannot be invoked on a value [AddrSelfIsNonRef] - // CHECK:STDERR: c.F(); - // CHECK:STDERR: ^ - // CHECK:STDERR: fail_addr_self.carbon:[[@LINE-12]]:8: note: initializing function parameter [InCallToFunctionParam] - // CHECK:STDERR: fn F[addr self: Class*](); - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~ - // CHECK:STDERR: - c.F(); - - c.G(); - - // This call is OK. - (*p).F(); - - (*p).G(); -} - -// CHECK:STDOUT: --- fail_addr_self.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Class: type = class_type @Class [concrete] -// CHECK:STDOUT: %ptr.e71: type = ptr_type %Class [concrete] -// CHECK:STDOUT: %pattern_type.796: type = pattern_type %ptr.e71 [concrete] -// CHECK:STDOUT: %pattern_type.f6d: type = pattern_type auto [concrete] -// CHECK:STDOUT: %F.type.f1b: type = fn_type @F.1 [concrete] -// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] -// CHECK:STDOUT: %F.1f2: %F.type.f1b = struct_value () [concrete] -// CHECK:STDOUT: %pattern_type.761: type = pattern_type %Class [concrete] -// CHECK:STDOUT: %G.type: type = fn_type @G [concrete] -// CHECK:STDOUT: %G: %G.type = struct_value () [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %F.type.b25: type = fn_type @F.2 [concrete] -// CHECK:STDOUT: %F.c41: %F.type.b25 = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Class = %Class.decl -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Class.decl: type = class_decl @Class [concrete = constants.%Class] {} {} -// CHECK:STDOUT: %F.decl: %F.type.b25 = fn_decl @F.2 [concrete = constants.%F.c41] { -// CHECK:STDOUT: %c.patt: %pattern_type.761 = binding_pattern c [concrete] -// CHECK:STDOUT: %c.param_patt: %pattern_type.761 = value_param_pattern %c.patt, call_param0 [concrete] -// CHECK:STDOUT: %p.patt: %pattern_type.796 = binding_pattern p [concrete] -// CHECK:STDOUT: %p.param_patt: %pattern_type.796 = value_param_pattern %p.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %c.param: %Class = value_param call_param0 -// CHECK:STDOUT: %Class.ref.loc20_9: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %c: %Class = bind_name c, %c.param -// CHECK:STDOUT: %p.param: %ptr.e71 = value_param call_param1 -// CHECK:STDOUT: %.loc20: type = splice_block %ptr [concrete = constants.%ptr.e71] { -// CHECK:STDOUT: %Class.ref.loc20_19: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %ptr: type = ptr_type %Class.ref.loc20_19 [concrete = constants.%ptr.e71] -// CHECK:STDOUT: } -// CHECK:STDOUT: %p: %ptr.e71 = bind_name p, %p.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Class { -// CHECK:STDOUT: %F.decl: %F.type.f1b = fn_decl @F.1 [concrete = constants.%F.1f2] { -// CHECK:STDOUT: %self.patt: %pattern_type.796 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.796 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc12_8: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %ptr.e71 = value_param call_param0 -// CHECK:STDOUT: %.loc12_24: type = splice_block %ptr [concrete = constants.%ptr.e71] { -// CHECK:STDOUT: %Class.ref: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %ptr: type = ptr_type %Class.ref [concrete = constants.%ptr.e71] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self: %ptr.e71 = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %G.decl: %G.type = fn_decl @G [concrete = constants.%G] { -// CHECK:STDOUT: %self.patt: %pattern_type.761 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.761 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %Class = value_param call_param0 -// CHECK:STDOUT: %Class.ref: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %self: %Class = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Class -// CHECK:STDOUT: .Class = -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: .G = %G.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F.1(%self.param: %ptr.e71); -// CHECK:STDOUT: -// CHECK:STDOUT: fn @G(%self.param: %Class); -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F.2(%c.param: %Class, %p.param: %ptr.e71) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %c.ref.loc28: %Class = name_ref c, %c -// CHECK:STDOUT: %F.ref.loc28: %F.type.f1b = name_ref F, @Class.%F.decl [concrete = constants.%F.1f2] -// CHECK:STDOUT: %F.bound.loc28: = bound_method %c.ref.loc28, %F.ref.loc28 -// CHECK:STDOUT: %.loc28: ref %Class = temporary_storage -// CHECK:STDOUT: %addr.loc28: %ptr.e71 = addr_of %.loc28 -// CHECK:STDOUT: %F.call.loc28: init %empty_tuple.type = call %F.bound.loc28(%addr.loc28) -// CHECK:STDOUT: %c.ref.loc30: %Class = name_ref c, %c -// CHECK:STDOUT: %G.ref.loc30: %G.type = name_ref G, @Class.%G.decl [concrete = constants.%G] -// CHECK:STDOUT: %G.bound.loc30: = bound_method %c.ref.loc30, %G.ref.loc30 -// CHECK:STDOUT: %G.call.loc30: init %empty_tuple.type = call %G.bound.loc30(%c.ref.loc30) -// CHECK:STDOUT: %p.ref.loc33: %ptr.e71 = name_ref p, %p -// CHECK:STDOUT: %.loc33: ref %Class = deref %p.ref.loc33 -// CHECK:STDOUT: %F.ref.loc33: %F.type.f1b = name_ref F, @Class.%F.decl [concrete = constants.%F.1f2] -// CHECK:STDOUT: %F.bound.loc33: = bound_method %.loc33, %F.ref.loc33 -// CHECK:STDOUT: %addr.loc33: %ptr.e71 = addr_of %.loc33 -// CHECK:STDOUT: %F.call.loc33: init %empty_tuple.type = call %F.bound.loc33(%addr.loc33) -// CHECK:STDOUT: %p.ref.loc35: %ptr.e71 = name_ref p, %p -// CHECK:STDOUT: %.loc35_4.1: ref %Class = deref %p.ref.loc35 -// CHECK:STDOUT: %G.ref.loc35: %G.type = name_ref G, @Class.%G.decl [concrete = constants.%G] -// CHECK:STDOUT: %G.bound.loc35: = bound_method %.loc35_4.1, %G.ref.loc35 -// CHECK:STDOUT: %.loc35_4.2: %Class = bind_value %.loc35_4.1 -// CHECK:STDOUT: %G.call.loc35: init %empty_tuple.type = call %G.bound.loc35(%.loc35_4.2) -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/fail_base_as_declared_name.carbon b/toolchain/check/testdata/class/fail_base_as_declared_name.carbon deleted file mode 100644 index 910054c794a2f..0000000000000 --- a/toolchain/check/testdata/class/fail_base_as_declared_name.carbon +++ /dev/null @@ -1,24 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/fail_base_as_declared_name.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/fail_base_as_declared_name.carbon - -namespace N; - -// CHECK:STDERR: fail_base_as_declared_name.carbon:[[@LINE+8]]:6: error: `.` should be followed by a name [ExpectedDeclNameAfterPeriod] -// CHECK:STDERR: fn N.base() {} -// CHECK:STDERR: ^~~~ -// CHECK:STDERR: -// CHECK:STDERR: fail_base_as_declared_name.carbon:[[@LINE+4]]:6: error: semantics TODO: `handle invalid parse trees in `check`` [SemanticsTodo] -// CHECK:STDERR: fn N.base() {} -// CHECK:STDERR: ^~~~ -// CHECK:STDERR: -fn N.base() {} - -// CHECK:STDOUT: --- fail_base_as_declared_name.carbon -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/fail_base_bad_type.carbon b/toolchain/check/testdata/class/fail_base_bad_type.carbon deleted file mode 100644 index 832ecdc48baf9..0000000000000 --- a/toolchain/check/testdata/class/fail_base_bad_type.carbon +++ /dev/null @@ -1,959 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/fail_base_bad_type.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/fail_base_bad_type.carbon - -// --- fail_derive_from_error.carbon - -library "[[@TEST_NAME]]"; - -class DeriveFromError { - // CHECK:STDERR: fail_derive_from_error.carbon:[[@LINE+4]]:16: error: name `error` not found [NameNotFound] - // CHECK:STDERR: extend base: error; - // CHECK:STDERR: ^~~~~ - // CHECK:STDERR: - extend base: error; -} - -// This should not produce an error. -fn AccessMemberWithInvalidBaseError(p: DeriveFromError*) -> i32 { return (*p).n; } - -// --- fail_derive_from_non_type.carbon - -library "[[@TEST_NAME]]"; - -class DeriveFromNonType { - // CHECK:STDERR: fail_derive_from_non_type.carbon:[[@LINE+7]]:16: error: cannot implicitly convert non-type value of type `Core.IntLiteral` to `type` [ConversionFailureNonTypeToFacet] - // CHECK:STDERR: extend base: 32; - // CHECK:STDERR: ^~ - // CHECK:STDERR: fail_derive_from_non_type.carbon:[[@LINE+4]]:16: note: type `Core.IntLiteral` does not implement interface `Core.ImplicitAs(type)` [MissingImplInMemberAccessNote] - // CHECK:STDERR: extend base: 32; - // CHECK:STDERR: ^~ - // CHECK:STDERR: - extend base: 32; -} - -fn AccessMemberWithInvalidBasNonType(p: DeriveFromNonType*) -> i32 { return (*p).n; } - -// --- fail_derive_from_i32.carbon - -library "[[@TEST_NAME]]"; - -class DeriveFromi32 { - // CHECK:STDERR: fail_derive_from_i32.carbon:[[@LINE+4]]:16: error: deriving from final type `i32`; base type must be an `abstract` or `base` class [BaseIsFinal] - // CHECK:STDERR: extend base: i32; - // CHECK:STDERR: ^~~ - // CHECK:STDERR: - extend base: i32; -} - -// It's not really important whether this conversion produces an error or not, -// but it shouldn't crash. -fn ConvertToBadBasei32(p: DeriveFromi32*) -> i32* { return p; } - -// CHECK:STDERR: fail_derive_from_i32.carbon:[[@LINE+4]]:70: error: member name `n` not found in `DeriveFromi32` [MemberNameNotFoundInInstScope] -// CHECK:STDERR: fn AccessMemberWithInvalidBasei32(p: DeriveFromi32*) -> i32 { return (*p).n; } -// CHECK:STDERR: ^~~~~~ -// CHECK:STDERR: -fn AccessMemberWithInvalidBasei32(p: DeriveFromi32*) -> i32 { return (*p).n; } - -// --- fail_derive_from_tuple.carbon - -library "[[@TEST_NAME]]"; - -base class Base {} - -class DeriveFromTuple { - // CHECK:STDERR: fail_derive_from_tuple.carbon:[[@LINE+4]]:16: error: deriving from final type `(Base,)`; base type must be an `abstract` or `base` class [BaseIsFinal] - // CHECK:STDERR: extend base: (Base,); - // CHECK:STDERR: ^~~~~~~ - // CHECK:STDERR: - extend base: (Base,); -} - -// CHECK:STDERR: fail_derive_from_tuple.carbon:[[@LINE+7]]:61: error: cannot implicitly convert expression of type `DeriveFromTuple*` to `(Base,)*` [ConversionFailure] -// CHECK:STDERR: fn ConvertToBadBaseTuple(p: DeriveFromTuple*) -> (Base,)* { return p; } -// CHECK:STDERR: ^~~~~~~~~ -// CHECK:STDERR: fail_derive_from_tuple.carbon:[[@LINE+4]]:61: note: type `DeriveFromTuple*` does not implement interface `Core.ImplicitAs((Base,)*)` [MissingImplInMemberAccessNote] -// CHECK:STDERR: fn ConvertToBadBaseTuple(p: DeriveFromTuple*) -> (Base,)* { return p; } -// CHECK:STDERR: ^~~~~~~~~ -// CHECK:STDERR: -fn ConvertToBadBaseTuple(p: DeriveFromTuple*) -> (Base,)* { return p; } - -fn AccessMemberWithInvalidBaseTuple(p: DeriveFromTuple*) -> i32 { return (*p).n; } - -// --- fail_derive_from_struct.carbon - -library "[[@TEST_NAME]]"; - -// TODO: Should we allow this? -// We do allow `{.base = {.a: i32, .b: i32}}`. -class DeriveFromStruct { - // CHECK:STDERR: fail_derive_from_struct.carbon:[[@LINE+4]]:16: error: deriving from final type `{.a: i32, .b: i32}`; base type must be an `abstract` or `base` class [BaseIsFinal] - // CHECK:STDERR: extend base: {.a: i32, .b: i32}; - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: - extend base: {.a: i32, .b: i32}; -} - -// CHECK:STDERR: fail_derive_from_struct.carbon:[[@LINE+7]]:74: error: cannot implicitly convert expression of type `DeriveFromStruct*` to `{.a: i32, .b: i32}*` [ConversionFailure] -// CHECK:STDERR: fn ConvertToBadBaseStruct(p: DeriveFromStruct*) -> {.a: i32, .b: i32}* { return p; } -// CHECK:STDERR: ^~~~~~~~~ -// CHECK:STDERR: fail_derive_from_struct.carbon:[[@LINE+4]]:74: note: type `DeriveFromStruct*` does not implement interface `Core.ImplicitAs({.a: i32, .b: i32}*)` [MissingImplInMemberAccessNote] -// CHECK:STDERR: fn ConvertToBadBaseStruct(p: DeriveFromStruct*) -> {.a: i32, .b: i32}* { return p; } -// CHECK:STDERR: ^~~~~~~~~ -// CHECK:STDERR: -fn ConvertToBadBaseStruct(p: DeriveFromStruct*) -> {.a: i32, .b: i32}* { return p; } - -// It would be OK to reject this if we start actually looking in the struct type. -fn AccessMemberWithInvalidBaseStruct(p: DeriveFromStruct*) -> i32 { return (*p).n; } - -// --- fail_derive_from_incomplete.carbon - -library "[[@TEST_NAME]]"; - -// CHECK:STDERR: fail_derive_from_incomplete.carbon:[[@LINE+4]]:1: error: `base` not allowed on `class` forward declaration, only definition [ModifierOnlyAllowedOnDefinition] -// CHECK:STDERR: base class Incomplete; -// CHECK:STDERR: ^~~~ -// CHECK:STDERR: -base class Incomplete; - -class DeriveFromIncomplete { - // CHECK:STDERR: fail_derive_from_incomplete.carbon:[[@LINE+7]]:16: error: base `Incomplete` is an incomplete type [IncompleteTypeInBaseDecl] - // CHECK:STDERR: extend base: Incomplete; - // CHECK:STDERR: ^~~~~~~~~~ - // CHECK:STDERR: fail_derive_from_incomplete.carbon:[[@LINE-6]]:1: note: class was forward declared here [ClassForwardDeclaredHere] - // CHECK:STDERR: base class Incomplete; - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: - extend base: Incomplete; -} - -// CHECK:STDERR: fail_derive_from_incomplete.carbon:[[@LINE+7]]:74: error: cannot implicitly convert expression of type `DeriveFromIncomplete*` to `Incomplete*` [ConversionFailure] -// CHECK:STDERR: fn ConvertToBadBaseIncomplete(p: DeriveFromIncomplete*) -> Incomplete* { return p; } -// CHECK:STDERR: ^~~~~~~~~ -// CHECK:STDERR: fail_derive_from_incomplete.carbon:[[@LINE+4]]:74: note: type `DeriveFromIncomplete*` does not implement interface `Core.ImplicitAs(Incomplete*)` [MissingImplInMemberAccessNote] -// CHECK:STDERR: fn ConvertToBadBaseIncomplete(p: DeriveFromIncomplete*) -> Incomplete* { return p; } -// CHECK:STDERR: ^~~~~~~~~ -// CHECK:STDERR: -fn ConvertToBadBaseIncomplete(p: DeriveFromIncomplete*) -> Incomplete* { return p; } - -fn AccessMemberWithInvalidBaseIncomplete(p: DeriveFromIncomplete*) -> i32 { return (*p).n; } - -// --- fail_derive_from_final.carbon - -library "[[@TEST_NAME]]"; - -class Final { - var a: i32; -} - -class DeriveFromFinal { - // CHECK:STDERR: fail_derive_from_final.carbon:[[@LINE+4]]:16: error: deriving from final type `Final`; base type must be an `abstract` or `base` class [BaseIsFinal] - // CHECK:STDERR: extend base: Final; - // CHECK:STDERR: ^~~~~ - // CHECK:STDERR: - extend base: Final; -} - -// For error recovery purposes, we derive from the final type anyway. -fn ConvertToBadBaseFinal(p: DeriveFromFinal*) -> Final* { - return p; -} - -fn AccessMemberWithInvalidBaseFinal_WithMember(p: DeriveFromFinal*) -> i32 { - return (*p).a; -} - -fn AccessMemberWithInvalidBaseFinal_NoMember(p: DeriveFromFinal*) -> i32 { - // CHECK:STDERR: fail_derive_from_final.carbon:[[@LINE+4]]:10: error: member name `b` not found in `DeriveFromFinal` [MemberNameNotFoundInInstScope] - // CHECK:STDERR: return (*p).b; - // CHECK:STDERR: ^~~~~~ - // CHECK:STDERR: - return (*p).b; -} - -// CHECK:STDOUT: --- fail_derive_from_error.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %DeriveFromError: type = class_type @DeriveFromError [concrete] -// CHECK:STDOUT: %ptr: type = ptr_type %DeriveFromError [concrete] -// CHECK:STDOUT: %pattern_type.928: type = pattern_type %ptr [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %AccessMemberWithInvalidBaseError.type: type = fn_type @AccessMemberWithInvalidBaseError [concrete] -// CHECK:STDOUT: %AccessMemberWithInvalidBaseError: %AccessMemberWithInvalidBaseError.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .DeriveFromError = %DeriveFromError.decl -// CHECK:STDOUT: .error = -// CHECK:STDOUT: .AccessMemberWithInvalidBaseError = %AccessMemberWithInvalidBaseError.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %DeriveFromError.decl: type = class_decl @DeriveFromError [concrete = constants.%DeriveFromError] {} {} -// CHECK:STDOUT: %AccessMemberWithInvalidBaseError.decl: %AccessMemberWithInvalidBaseError.type = fn_decl @AccessMemberWithInvalidBaseError [concrete = constants.%AccessMemberWithInvalidBaseError] { -// CHECK:STDOUT: %p.patt: %pattern_type.928 = binding_pattern p [concrete] -// CHECK:STDOUT: %p.param_patt: %pattern_type.928 = value_param_pattern %p.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %p.param: %ptr = value_param call_param0 -// CHECK:STDOUT: %.loc13_55: type = splice_block %ptr [concrete = constants.%ptr] { -// CHECK:STDOUT: %DeriveFromError.ref: type = name_ref DeriveFromError, file.%DeriveFromError.decl [concrete = constants.%DeriveFromError] -// CHECK:STDOUT: %ptr: type = ptr_type %DeriveFromError.ref [concrete = constants.%ptr] -// CHECK:STDOUT: } -// CHECK:STDOUT: %p: %ptr = bind_name p, %p.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @DeriveFromError { -// CHECK:STDOUT: %error.ref: = name_ref error, [concrete = ] -// CHECK:STDOUT: %.loc9: = base_decl , element0 [concrete] -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: } [concrete = ] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base [concrete = ] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%DeriveFromError -// CHECK:STDOUT: .error = -// CHECK:STDOUT: .base = %.loc9 -// CHECK:STDOUT: .n = -// CHECK:STDOUT: has_error -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @AccessMemberWithInvalidBaseError(%p.param: %ptr) -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %p.ref: %ptr = name_ref p, %p -// CHECK:STDOUT: %.loc13_75: ref %DeriveFromError = deref %p.ref -// CHECK:STDOUT: %n.ref: = name_ref n, [concrete = ] -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_derive_from_non_type.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %DeriveFromNonType: type = class_type @DeriveFromNonType [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] -// CHECK:STDOUT: %ptr: type = ptr_type %DeriveFromNonType [concrete] -// CHECK:STDOUT: %pattern_type.ffe: type = pattern_type %ptr [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %AccessMemberWithInvalidBasNonType.type: type = fn_type @AccessMemberWithInvalidBasNonType [concrete] -// CHECK:STDOUT: %AccessMemberWithInvalidBasNonType: %AccessMemberWithInvalidBasNonType.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/operators/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .DeriveFromNonType = %DeriveFromNonType.decl -// CHECK:STDOUT: .AccessMemberWithInvalidBasNonType = %AccessMemberWithInvalidBasNonType.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %DeriveFromNonType.decl: type = class_decl @DeriveFromNonType [concrete = constants.%DeriveFromNonType] {} {} -// CHECK:STDOUT: %AccessMemberWithInvalidBasNonType.decl: %AccessMemberWithInvalidBasNonType.type = fn_decl @AccessMemberWithInvalidBasNonType [concrete = constants.%AccessMemberWithInvalidBasNonType] { -// CHECK:STDOUT: %p.patt: %pattern_type.ffe = binding_pattern p [concrete] -// CHECK:STDOUT: %p.param_patt: %pattern_type.ffe = value_param_pattern %p.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %p.param: %ptr = value_param call_param0 -// CHECK:STDOUT: %.loc15_58: type = splice_block %ptr [concrete = constants.%ptr] { -// CHECK:STDOUT: %DeriveFromNonType.ref: type = name_ref DeriveFromNonType, file.%DeriveFromNonType.decl [concrete = constants.%DeriveFromNonType] -// CHECK:STDOUT: %ptr: type = ptr_type %DeriveFromNonType.ref [concrete = constants.%ptr] -// CHECK:STDOUT: } -// CHECK:STDOUT: %p: %ptr = bind_name p, %p.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @DeriveFromNonType { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %.loc12_16: type = converted %int_32, [concrete = ] -// CHECK:STDOUT: %.loc12_18: = base_decl , element0 [concrete] -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: } [concrete = ] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base [concrete = ] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%DeriveFromNonType -// CHECK:STDOUT: .base = %.loc12_18 -// CHECK:STDOUT: .n = -// CHECK:STDOUT: has_error -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @AccessMemberWithInvalidBasNonType(%p.param: %ptr) -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %p.ref: %ptr = name_ref p, %p -// CHECK:STDOUT: %.loc15_78: ref %DeriveFromNonType = deref %p.ref -// CHECK:STDOUT: %n.ref: = name_ref n, [concrete = ] -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_derive_from_i32.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %DeriveFromi32: type = class_type @DeriveFromi32 [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %DeriveFromi32.elem: type = unbound_element_type %DeriveFromi32, %i32 [concrete] -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %i32} [concrete] -// CHECK:STDOUT: %complete_type.386: = complete_type_witness %struct_type.base [concrete] -// CHECK:STDOUT: %ptr.45c: type = ptr_type %DeriveFromi32 [concrete] -// CHECK:STDOUT: %pattern_type.b82: type = pattern_type %ptr.45c [concrete] -// CHECK:STDOUT: %ptr.235: type = ptr_type %i32 [concrete] -// CHECK:STDOUT: %pattern_type.fe8: type = pattern_type %ptr.235 [concrete] -// CHECK:STDOUT: %ConvertToBadBasei32.type: type = fn_type @ConvertToBadBasei32 [concrete] -// CHECK:STDOUT: %ConvertToBadBasei32: %ConvertToBadBasei32.type = struct_value () [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %AccessMemberWithInvalidBasei32.type: type = fn_type @AccessMemberWithInvalidBasei32 [concrete] -// CHECK:STDOUT: %AccessMemberWithInvalidBasei32: %AccessMemberWithInvalidBasei32.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .DeriveFromi32 = %DeriveFromi32.decl -// CHECK:STDOUT: .ConvertToBadBasei32 = %ConvertToBadBasei32.decl -// CHECK:STDOUT: .AccessMemberWithInvalidBasei32 = %AccessMemberWithInvalidBasei32.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %DeriveFromi32.decl: type = class_decl @DeriveFromi32 [concrete = constants.%DeriveFromi32] {} {} -// CHECK:STDOUT: %ConvertToBadBasei32.decl: %ConvertToBadBasei32.type = fn_decl @ConvertToBadBasei32 [concrete = constants.%ConvertToBadBasei32] { -// CHECK:STDOUT: %p.patt: %pattern_type.b82 = binding_pattern p [concrete] -// CHECK:STDOUT: %p.param_patt: %pattern_type.b82 = value_param_pattern %p.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.fe8 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.fe8 = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %ptr.loc14_49: type = ptr_type %i32 [concrete = constants.%ptr.235] -// CHECK:STDOUT: %p.param: %ptr.45c = value_param call_param0 -// CHECK:STDOUT: %.loc14_40: type = splice_block %ptr.loc14_40 [concrete = constants.%ptr.45c] { -// CHECK:STDOUT: %DeriveFromi32.ref: type = name_ref DeriveFromi32, file.%DeriveFromi32.decl [concrete = constants.%DeriveFromi32] -// CHECK:STDOUT: %ptr.loc14_40: type = ptr_type %DeriveFromi32.ref [concrete = constants.%ptr.45c] -// CHECK:STDOUT: } -// CHECK:STDOUT: %p: %ptr.45c = bind_name p, %p.param -// CHECK:STDOUT: %return.param: ref %ptr.235 = out_param call_param1 -// CHECK:STDOUT: %return: ref %ptr.235 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %AccessMemberWithInvalidBasei32.decl: %AccessMemberWithInvalidBasei32.type = fn_decl @AccessMemberWithInvalidBasei32 [concrete = constants.%AccessMemberWithInvalidBasei32] { -// CHECK:STDOUT: %p.patt: %pattern_type.b82 = binding_pattern p [concrete] -// CHECK:STDOUT: %p.param_patt: %pattern_type.b82 = value_param_pattern %p.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %p.param: %ptr.45c = value_param call_param0 -// CHECK:STDOUT: %.loc20_51: type = splice_block %ptr [concrete = constants.%ptr.45c] { -// CHECK:STDOUT: %DeriveFromi32.ref: type = name_ref DeriveFromi32, file.%DeriveFromi32.decl [concrete = constants.%DeriveFromi32] -// CHECK:STDOUT: %ptr: type = ptr_type %DeriveFromi32.ref [concrete = constants.%ptr.45c] -// CHECK:STDOUT: } -// CHECK:STDOUT: %p: %ptr.45c = bind_name p, %p.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @DeriveFromi32 { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc9: %DeriveFromi32.elem = base_decl %i32, element0 [concrete] -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %i32} [concrete = constants.%struct_type.base] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base [concrete = constants.%complete_type.386] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%DeriveFromi32 -// CHECK:STDOUT: .base = %.loc9 -// CHECK:STDOUT: .n = -// CHECK:STDOUT: extend %i32 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @ConvertToBadBasei32(%p.param: %ptr.45c) -> %ptr.235 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %p.ref: %ptr.45c = name_ref p, %p -// CHECK:STDOUT: %.loc14_61.1: ref %DeriveFromi32 = deref %p.ref -// CHECK:STDOUT: %.loc14_61.2: ref %i32 = class_element_access %.loc14_61.1, element0 -// CHECK:STDOUT: %addr: %ptr.235 = addr_of %.loc14_61.2 -// CHECK:STDOUT: %.loc14_61.3: %ptr.235 = converted %p.ref, %addr -// CHECK:STDOUT: return %.loc14_61.3 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @AccessMemberWithInvalidBasei32(%p.param: %ptr.45c) -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %p.ref: %ptr.45c = name_ref p, %p -// CHECK:STDOUT: %.loc20_71: ref %DeriveFromi32 = deref %p.ref -// CHECK:STDOUT: %n.ref: = name_ref n, [concrete = ] -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_derive_from_tuple.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Base: type = class_type @Base [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %DeriveFromTuple: type = class_type @DeriveFromTuple [concrete] -// CHECK:STDOUT: %tuple.type.85c: type = tuple_type (type) [concrete] -// CHECK:STDOUT: %tuple.type.469: type = tuple_type (%Base) [concrete] -// CHECK:STDOUT: %ptr.340: type = ptr_type %DeriveFromTuple [concrete] -// CHECK:STDOUT: %pattern_type.195: type = pattern_type %ptr.340 [concrete] -// CHECK:STDOUT: %ptr.1ab: type = ptr_type %tuple.type.469 [concrete] -// CHECK:STDOUT: %pattern_type.600: type = pattern_type %ptr.1ab [concrete] -// CHECK:STDOUT: %ConvertToBadBaseTuple.type: type = fn_type @ConvertToBadBaseTuple [concrete] -// CHECK:STDOUT: %ConvertToBadBaseTuple: %ConvertToBadBaseTuple.type = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %AccessMemberWithInvalidBaseTuple.type: type = fn_type @AccessMemberWithInvalidBaseTuple [concrete] -// CHECK:STDOUT: %AccessMemberWithInvalidBaseTuple: %AccessMemberWithInvalidBaseTuple.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/operators/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Base = %Base.decl -// CHECK:STDOUT: .DeriveFromTuple = %DeriveFromTuple.decl -// CHECK:STDOUT: .ConvertToBadBaseTuple = %ConvertToBadBaseTuple.decl -// CHECK:STDOUT: .AccessMemberWithInvalidBaseTuple = %AccessMemberWithInvalidBaseTuple.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Base.decl: type = class_decl @Base [concrete = constants.%Base] {} {} -// CHECK:STDOUT: %DeriveFromTuple.decl: type = class_decl @DeriveFromTuple [concrete = constants.%DeriveFromTuple] {} {} -// CHECK:STDOUT: %ConvertToBadBaseTuple.decl: %ConvertToBadBaseTuple.type = fn_decl @ConvertToBadBaseTuple [concrete = constants.%ConvertToBadBaseTuple] { -// CHECK:STDOUT: %p.patt: %pattern_type.195 = binding_pattern p [concrete] -// CHECK:STDOUT: %p.param_patt: %pattern_type.195 = value_param_pattern %p.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.600 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.600 = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %Base.ref: type = name_ref Base, file.%Base.decl [concrete = constants.%Base] -// CHECK:STDOUT: %.loc21_56: %tuple.type.85c = tuple_literal (%Base.ref) -// CHECK:STDOUT: %.loc21_57: type = converted %.loc21_56, constants.%tuple.type.469 [concrete = constants.%tuple.type.469] -// CHECK:STDOUT: %ptr.loc21_57: type = ptr_type %.loc21_57 [concrete = constants.%ptr.1ab] -// CHECK:STDOUT: %p.param: %ptr.340 = value_param call_param0 -// CHECK:STDOUT: %.loc21_44: type = splice_block %ptr.loc21_44 [concrete = constants.%ptr.340] { -// CHECK:STDOUT: %DeriveFromTuple.ref: type = name_ref DeriveFromTuple, file.%DeriveFromTuple.decl [concrete = constants.%DeriveFromTuple] -// CHECK:STDOUT: %ptr.loc21_44: type = ptr_type %DeriveFromTuple.ref [concrete = constants.%ptr.340] -// CHECK:STDOUT: } -// CHECK:STDOUT: %p: %ptr.340 = bind_name p, %p.param -// CHECK:STDOUT: %return.param: ref %ptr.1ab = out_param call_param1 -// CHECK:STDOUT: %return: ref %ptr.1ab = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %AccessMemberWithInvalidBaseTuple.decl: %AccessMemberWithInvalidBaseTuple.type = fn_decl @AccessMemberWithInvalidBaseTuple [concrete = constants.%AccessMemberWithInvalidBaseTuple] { -// CHECK:STDOUT: %p.patt: %pattern_type.195 = binding_pattern p [concrete] -// CHECK:STDOUT: %p.param_patt: %pattern_type.195 = value_param_pattern %p.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %p.param: %ptr.340 = value_param call_param0 -// CHECK:STDOUT: %.loc23_55: type = splice_block %ptr [concrete = constants.%ptr.340] { -// CHECK:STDOUT: %DeriveFromTuple.ref: type = name_ref DeriveFromTuple, file.%DeriveFromTuple.decl [concrete = constants.%DeriveFromTuple] -// CHECK:STDOUT: %ptr: type = ptr_type %DeriveFromTuple.ref [concrete = constants.%ptr.340] -// CHECK:STDOUT: } -// CHECK:STDOUT: %p: %ptr.340 = bind_name p, %p.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Base { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Base -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @DeriveFromTuple { -// CHECK:STDOUT: %Base.ref: type = name_ref Base, file.%Base.decl [concrete = constants.%Base] -// CHECK:STDOUT: %.loc11_22.1: %tuple.type.85c = tuple_literal (%Base.ref) -// CHECK:STDOUT: %.loc11_22.2: type = converted %.loc11_22.1, constants.%tuple.type.469 [concrete = constants.%tuple.type.469] -// CHECK:STDOUT: %.loc11_23: = base_decl , element0 [concrete] -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: } [concrete = ] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base [concrete = ] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%DeriveFromTuple -// CHECK:STDOUT: .Base = -// CHECK:STDOUT: .base = %.loc11_23 -// CHECK:STDOUT: .n = -// CHECK:STDOUT: has_error -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @ConvertToBadBaseTuple(%p.param: %ptr.340) -> %ptr.1ab { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %p.ref: %ptr.340 = name_ref p, %p -// CHECK:STDOUT: %.loc21_69: %ptr.1ab = converted %p.ref, [concrete = ] -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @AccessMemberWithInvalidBaseTuple(%p.param: %ptr.340) -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %p.ref: %ptr.340 = name_ref p, %p -// CHECK:STDOUT: %.loc23_75: ref %DeriveFromTuple = deref %p.ref -// CHECK:STDOUT: %n.ref: = name_ref n, [concrete = ] -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_derive_from_struct.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %DeriveFromStruct: type = class_type @DeriveFromStruct [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %struct_type.a.b: type = struct_type {.a: %i32, .b: %i32} [concrete] -// CHECK:STDOUT: %ptr.3ee: type = ptr_type %struct_type.a.b [concrete] -// CHECK:STDOUT: %ptr.df0: type = ptr_type %DeriveFromStruct [concrete] -// CHECK:STDOUT: %pattern_type.00f: type = pattern_type %ptr.df0 [concrete] -// CHECK:STDOUT: %pattern_type.8dd: type = pattern_type %ptr.3ee [concrete] -// CHECK:STDOUT: %ConvertToBadBaseStruct.type: type = fn_type @ConvertToBadBaseStruct [concrete] -// CHECK:STDOUT: %ConvertToBadBaseStruct: %ConvertToBadBaseStruct.type = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %AccessMemberWithInvalidBaseStruct.type: type = fn_type @AccessMemberWithInvalidBaseStruct [concrete] -// CHECK:STDOUT: %AccessMemberWithInvalidBaseStruct: %AccessMemberWithInvalidBaseStruct.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/operators/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .DeriveFromStruct = %DeriveFromStruct.decl -// CHECK:STDOUT: .ConvertToBadBaseStruct = %ConvertToBadBaseStruct.decl -// CHECK:STDOUT: .AccessMemberWithInvalidBaseStruct = %AccessMemberWithInvalidBaseStruct.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %DeriveFromStruct.decl: type = class_decl @DeriveFromStruct [concrete = constants.%DeriveFromStruct] {} {} -// CHECK:STDOUT: %ConvertToBadBaseStruct.decl: %ConvertToBadBaseStruct.type = fn_decl @ConvertToBadBaseStruct [concrete = constants.%ConvertToBadBaseStruct] { -// CHECK:STDOUT: %p.patt: %pattern_type.00f = binding_pattern p [concrete] -// CHECK:STDOUT: %p.param_patt: %pattern_type.00f = value_param_pattern %p.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.8dd = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.8dd = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32.loc21_57: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc21_57: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %int_32.loc21_66: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc21_66: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %struct_type.a.b: type = struct_type {.a: %i32, .b: %i32} [concrete = constants.%struct_type.a.b] -// CHECK:STDOUT: %ptr.loc21_70: type = ptr_type %struct_type.a.b [concrete = constants.%ptr.3ee] -// CHECK:STDOUT: %p.param: %ptr.df0 = value_param call_param0 -// CHECK:STDOUT: %.loc21_46: type = splice_block %ptr.loc21_46 [concrete = constants.%ptr.df0] { -// CHECK:STDOUT: %DeriveFromStruct.ref: type = name_ref DeriveFromStruct, file.%DeriveFromStruct.decl [concrete = constants.%DeriveFromStruct] -// CHECK:STDOUT: %ptr.loc21_46: type = ptr_type %DeriveFromStruct.ref [concrete = constants.%ptr.df0] -// CHECK:STDOUT: } -// CHECK:STDOUT: %p: %ptr.df0 = bind_name p, %p.param -// CHECK:STDOUT: %return.param: ref %ptr.3ee = out_param call_param1 -// CHECK:STDOUT: %return: ref %ptr.3ee = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %AccessMemberWithInvalidBaseStruct.decl: %AccessMemberWithInvalidBaseStruct.type = fn_decl @AccessMemberWithInvalidBaseStruct [concrete = constants.%AccessMemberWithInvalidBaseStruct] { -// CHECK:STDOUT: %p.patt: %pattern_type.00f = binding_pattern p [concrete] -// CHECK:STDOUT: %p.param_patt: %pattern_type.00f = value_param_pattern %p.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %p.param: %ptr.df0 = value_param call_param0 -// CHECK:STDOUT: %.loc24_57: type = splice_block %ptr [concrete = constants.%ptr.df0] { -// CHECK:STDOUT: %DeriveFromStruct.ref: type = name_ref DeriveFromStruct, file.%DeriveFromStruct.decl [concrete = constants.%DeriveFromStruct] -// CHECK:STDOUT: %ptr: type = ptr_type %DeriveFromStruct.ref [concrete = constants.%ptr.df0] -// CHECK:STDOUT: } -// CHECK:STDOUT: %p: %ptr.df0 = bind_name p, %p.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @DeriveFromStruct { -// CHECK:STDOUT: %int_32.loc11_21: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc11_21: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %int_32.loc11_30: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc11_30: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %struct_type.a.b: type = struct_type {.a: %i32, .b: %i32} [concrete = constants.%struct_type.a.b] -// CHECK:STDOUT: %.loc11: = base_decl , element0 [concrete] -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: } [concrete = ] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base [concrete = ] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%DeriveFromStruct -// CHECK:STDOUT: .base = %.loc11 -// CHECK:STDOUT: .n = -// CHECK:STDOUT: has_error -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @ConvertToBadBaseStruct(%p.param: %ptr.df0) -> %ptr.3ee { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %p.ref: %ptr.df0 = name_ref p, %p -// CHECK:STDOUT: %.loc21_82: %ptr.3ee = converted %p.ref, [concrete = ] -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @AccessMemberWithInvalidBaseStruct(%p.param: %ptr.df0) -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %p.ref: %ptr.df0 = name_ref p, %p -// CHECK:STDOUT: %.loc24_77: ref %DeriveFromStruct = deref %p.ref -// CHECK:STDOUT: %n.ref: = name_ref n, [concrete = ] -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_derive_from_incomplete.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Incomplete: type = class_type @Incomplete [concrete] -// CHECK:STDOUT: %DeriveFromIncomplete: type = class_type @DeriveFromIncomplete [concrete] -// CHECK:STDOUT: %ptr.089: type = ptr_type %DeriveFromIncomplete [concrete] -// CHECK:STDOUT: %pattern_type.3d0: type = pattern_type %ptr.089 [concrete] -// CHECK:STDOUT: %ptr.c62: type = ptr_type %Incomplete [concrete] -// CHECK:STDOUT: %pattern_type.275: type = pattern_type %ptr.c62 [concrete] -// CHECK:STDOUT: %ConvertToBadBaseIncomplete.type: type = fn_type @ConvertToBadBaseIncomplete [concrete] -// CHECK:STDOUT: %ConvertToBadBaseIncomplete: %ConvertToBadBaseIncomplete.type = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %AccessMemberWithInvalidBaseIncomplete.type: type = fn_type @AccessMemberWithInvalidBaseIncomplete [concrete] -// CHECK:STDOUT: %AccessMemberWithInvalidBaseIncomplete: %AccessMemberWithInvalidBaseIncomplete.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/operators/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Incomplete = %Incomplete.decl -// CHECK:STDOUT: .DeriveFromIncomplete = %DeriveFromIncomplete.decl -// CHECK:STDOUT: .ConvertToBadBaseIncomplete = %ConvertToBadBaseIncomplete.decl -// CHECK:STDOUT: .AccessMemberWithInvalidBaseIncomplete = %AccessMemberWithInvalidBaseIncomplete.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Incomplete.decl: type = class_decl @Incomplete [concrete = constants.%Incomplete] {} {} -// CHECK:STDOUT: %DeriveFromIncomplete.decl: type = class_decl @DeriveFromIncomplete [concrete = constants.%DeriveFromIncomplete] {} {} -// CHECK:STDOUT: %ConvertToBadBaseIncomplete.decl: %ConvertToBadBaseIncomplete.type = fn_decl @ConvertToBadBaseIncomplete [concrete = constants.%ConvertToBadBaseIncomplete] { -// CHECK:STDOUT: %p.patt: %pattern_type.3d0 = binding_pattern p [concrete] -// CHECK:STDOUT: %p.param_patt: %pattern_type.3d0 = value_param_pattern %p.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.275 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.275 = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %Incomplete.ref: type = name_ref Incomplete, file.%Incomplete.decl [concrete = constants.%Incomplete] -// CHECK:STDOUT: %ptr.loc28_70: type = ptr_type %Incomplete.ref [concrete = constants.%ptr.c62] -// CHECK:STDOUT: %p.param: %ptr.089 = value_param call_param0 -// CHECK:STDOUT: %.loc28_54: type = splice_block %ptr.loc28_54 [concrete = constants.%ptr.089] { -// CHECK:STDOUT: %DeriveFromIncomplete.ref: type = name_ref DeriveFromIncomplete, file.%DeriveFromIncomplete.decl [concrete = constants.%DeriveFromIncomplete] -// CHECK:STDOUT: %ptr.loc28_54: type = ptr_type %DeriveFromIncomplete.ref [concrete = constants.%ptr.089] -// CHECK:STDOUT: } -// CHECK:STDOUT: %p: %ptr.089 = bind_name p, %p.param -// CHECK:STDOUT: %return.param: ref %ptr.c62 = out_param call_param1 -// CHECK:STDOUT: %return: ref %ptr.c62 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %AccessMemberWithInvalidBaseIncomplete.decl: %AccessMemberWithInvalidBaseIncomplete.type = fn_decl @AccessMemberWithInvalidBaseIncomplete [concrete = constants.%AccessMemberWithInvalidBaseIncomplete] { -// CHECK:STDOUT: %p.patt: %pattern_type.3d0 = binding_pattern p [concrete] -// CHECK:STDOUT: %p.param_patt: %pattern_type.3d0 = value_param_pattern %p.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %p.param: %ptr.089 = value_param call_param0 -// CHECK:STDOUT: %.loc30_65: type = splice_block %ptr [concrete = constants.%ptr.089] { -// CHECK:STDOUT: %DeriveFromIncomplete.ref: type = name_ref DeriveFromIncomplete, file.%DeriveFromIncomplete.decl [concrete = constants.%DeriveFromIncomplete] -// CHECK:STDOUT: %ptr: type = ptr_type %DeriveFromIncomplete.ref [concrete = constants.%ptr.089] -// CHECK:STDOUT: } -// CHECK:STDOUT: %p: %ptr.089 = bind_name p, %p.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Incomplete; -// CHECK:STDOUT: -// CHECK:STDOUT: class @DeriveFromIncomplete { -// CHECK:STDOUT: %Incomplete.ref: type = name_ref Incomplete, file.%Incomplete.decl [concrete = constants.%Incomplete] -// CHECK:STDOUT: %.loc18: = base_decl , element0 [concrete] -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: } [concrete = ] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base [concrete = ] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%DeriveFromIncomplete -// CHECK:STDOUT: .Incomplete = -// CHECK:STDOUT: .base = %.loc18 -// CHECK:STDOUT: .n = -// CHECK:STDOUT: has_error -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @ConvertToBadBaseIncomplete(%p.param: %ptr.089) -> %ptr.c62 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %p.ref: %ptr.089 = name_ref p, %p -// CHECK:STDOUT: %.loc28_82: %ptr.c62 = converted %p.ref, [concrete = ] -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @AccessMemberWithInvalidBaseIncomplete(%p.param: %ptr.089) -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %p.ref: %ptr.089 = name_ref p, %p -// CHECK:STDOUT: %.loc30_85: ref %DeriveFromIncomplete = deref %p.ref -// CHECK:STDOUT: %n.ref: = name_ref n, [concrete = ] -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_derive_from_final.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Final: type = class_type @Final [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %Final.elem: type = unbound_element_type %Final, %i32 [concrete] -// CHECK:STDOUT: %struct_type.a: type = struct_type {.a: %i32} [concrete] -// CHECK:STDOUT: %complete_type.fd7: = complete_type_witness %struct_type.a [concrete] -// CHECK:STDOUT: %DeriveFromFinal: type = class_type @DeriveFromFinal [concrete] -// CHECK:STDOUT: %DeriveFromFinal.elem: type = unbound_element_type %DeriveFromFinal, %Final [concrete] -// CHECK:STDOUT: %struct_type.base.dae: type = struct_type {.base: %Final} [concrete] -// CHECK:STDOUT: %complete_type.970: = complete_type_witness %struct_type.base.dae [concrete] -// CHECK:STDOUT: %ptr.160: type = ptr_type %DeriveFromFinal [concrete] -// CHECK:STDOUT: %pattern_type.982: type = pattern_type %ptr.160 [concrete] -// CHECK:STDOUT: %ptr.5f6: type = ptr_type %Final [concrete] -// CHECK:STDOUT: %pattern_type.0a2: type = pattern_type %ptr.5f6 [concrete] -// CHECK:STDOUT: %ConvertToBadBaseFinal.type: type = fn_type @ConvertToBadBaseFinal [concrete] -// CHECK:STDOUT: %ConvertToBadBaseFinal: %ConvertToBadBaseFinal.type = struct_value () [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %AccessMemberWithInvalidBaseFinal_WithMember.type: type = fn_type @AccessMemberWithInvalidBaseFinal_WithMember [concrete] -// CHECK:STDOUT: %AccessMemberWithInvalidBaseFinal_WithMember: %AccessMemberWithInvalidBaseFinal_WithMember.type = struct_value () [concrete] -// CHECK:STDOUT: %AccessMemberWithInvalidBaseFinal_NoMember.type: type = fn_type @AccessMemberWithInvalidBaseFinal_NoMember [concrete] -// CHECK:STDOUT: %AccessMemberWithInvalidBaseFinal_NoMember: %AccessMemberWithInvalidBaseFinal_NoMember.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Final = %Final.decl -// CHECK:STDOUT: .DeriveFromFinal = %DeriveFromFinal.decl -// CHECK:STDOUT: .ConvertToBadBaseFinal = %ConvertToBadBaseFinal.decl -// CHECK:STDOUT: .AccessMemberWithInvalidBaseFinal_WithMember = %AccessMemberWithInvalidBaseFinal_WithMember.decl -// CHECK:STDOUT: .AccessMemberWithInvalidBaseFinal_NoMember = %AccessMemberWithInvalidBaseFinal_NoMember.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Final.decl: type = class_decl @Final [concrete = constants.%Final] {} {} -// CHECK:STDOUT: %DeriveFromFinal.decl: type = class_decl @DeriveFromFinal [concrete = constants.%DeriveFromFinal] {} {} -// CHECK:STDOUT: %ConvertToBadBaseFinal.decl: %ConvertToBadBaseFinal.type = fn_decl @ConvertToBadBaseFinal [concrete = constants.%ConvertToBadBaseFinal] { -// CHECK:STDOUT: %p.patt: %pattern_type.982 = binding_pattern p [concrete] -// CHECK:STDOUT: %p.param_patt: %pattern_type.982 = value_param_pattern %p.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.0a2 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.0a2 = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %Final.ref: type = name_ref Final, file.%Final.decl [concrete = constants.%Final] -// CHECK:STDOUT: %ptr.loc17_55: type = ptr_type %Final.ref [concrete = constants.%ptr.5f6] -// CHECK:STDOUT: %p.param: %ptr.160 = value_param call_param0 -// CHECK:STDOUT: %.loc17: type = splice_block %ptr.loc17_44 [concrete = constants.%ptr.160] { -// CHECK:STDOUT: %DeriveFromFinal.ref: type = name_ref DeriveFromFinal, file.%DeriveFromFinal.decl [concrete = constants.%DeriveFromFinal] -// CHECK:STDOUT: %ptr.loc17_44: type = ptr_type %DeriveFromFinal.ref [concrete = constants.%ptr.160] -// CHECK:STDOUT: } -// CHECK:STDOUT: %p: %ptr.160 = bind_name p, %p.param -// CHECK:STDOUT: %return.param: ref %ptr.5f6 = out_param call_param1 -// CHECK:STDOUT: %return: ref %ptr.5f6 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %AccessMemberWithInvalidBaseFinal_WithMember.decl: %AccessMemberWithInvalidBaseFinal_WithMember.type = fn_decl @AccessMemberWithInvalidBaseFinal_WithMember [concrete = constants.%AccessMemberWithInvalidBaseFinal_WithMember] { -// CHECK:STDOUT: %p.patt: %pattern_type.982 = binding_pattern p [concrete] -// CHECK:STDOUT: %p.param_patt: %pattern_type.982 = value_param_pattern %p.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %p.param: %ptr.160 = value_param call_param0 -// CHECK:STDOUT: %.loc21: type = splice_block %ptr [concrete = constants.%ptr.160] { -// CHECK:STDOUT: %DeriveFromFinal.ref: type = name_ref DeriveFromFinal, file.%DeriveFromFinal.decl [concrete = constants.%DeriveFromFinal] -// CHECK:STDOUT: %ptr: type = ptr_type %DeriveFromFinal.ref [concrete = constants.%ptr.160] -// CHECK:STDOUT: } -// CHECK:STDOUT: %p: %ptr.160 = bind_name p, %p.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %AccessMemberWithInvalidBaseFinal_NoMember.decl: %AccessMemberWithInvalidBaseFinal_NoMember.type = fn_decl @AccessMemberWithInvalidBaseFinal_NoMember [concrete = constants.%AccessMemberWithInvalidBaseFinal_NoMember] { -// CHECK:STDOUT: %p.patt: %pattern_type.982 = binding_pattern p [concrete] -// CHECK:STDOUT: %p.param_patt: %pattern_type.982 = value_param_pattern %p.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %p.param: %ptr.160 = value_param call_param0 -// CHECK:STDOUT: %.loc25: type = splice_block %ptr [concrete = constants.%ptr.160] { -// CHECK:STDOUT: %DeriveFromFinal.ref: type = name_ref DeriveFromFinal, file.%DeriveFromFinal.decl [concrete = constants.%DeriveFromFinal] -// CHECK:STDOUT: %ptr: type = ptr_type %DeriveFromFinal.ref [concrete = constants.%ptr.160] -// CHECK:STDOUT: } -// CHECK:STDOUT: %p: %ptr.160 = bind_name p, %p.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Final { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc5: %Final.elem = field_decl a, element0 [concrete] -// CHECK:STDOUT: %struct_type.a: type = struct_type {.a: %i32} [concrete = constants.%struct_type.a] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.a [concrete = constants.%complete_type.fd7] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Final -// CHECK:STDOUT: .a = %.loc5 -// CHECK:STDOUT: .b = -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @DeriveFromFinal { -// CHECK:STDOUT: %Final.ref: type = name_ref Final, file.%Final.decl [concrete = constants.%Final] -// CHECK:STDOUT: %.loc13: %DeriveFromFinal.elem = base_decl %Final.ref, element0 [concrete] -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %Final} [concrete = constants.%struct_type.base.dae] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base [concrete = constants.%complete_type.970] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%DeriveFromFinal -// CHECK:STDOUT: .Final = -// CHECK:STDOUT: .base = %.loc13 -// CHECK:STDOUT: .a = -// CHECK:STDOUT: .b = -// CHECK:STDOUT: extend %Final.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @ConvertToBadBaseFinal(%p.param: %ptr.160) -> %ptr.5f6 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %p.ref: %ptr.160 = name_ref p, %p -// CHECK:STDOUT: %.loc18_11.1: ref %DeriveFromFinal = deref %p.ref -// CHECK:STDOUT: %.loc18_11.2: ref %Final = class_element_access %.loc18_11.1, element0 -// CHECK:STDOUT: %addr: %ptr.5f6 = addr_of %.loc18_11.2 -// CHECK:STDOUT: %.loc18_11.3: %ptr.5f6 = converted %p.ref, %addr -// CHECK:STDOUT: return %.loc18_11.3 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @AccessMemberWithInvalidBaseFinal_WithMember(%p.param: %ptr.160) -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %p.ref: %ptr.160 = name_ref p, %p -// CHECK:STDOUT: %.loc22_11: ref %DeriveFromFinal = deref %p.ref -// CHECK:STDOUT: %a.ref: %Final.elem = name_ref a, @Final.%.loc5 [concrete = @Final.%.loc5] -// CHECK:STDOUT: %.loc22_14.1: ref %Final = class_element_access %.loc22_11, element0 -// CHECK:STDOUT: %.loc22_14.2: ref %Final = converted %.loc22_11, %.loc22_14.1 -// CHECK:STDOUT: %.loc22_14.3: ref %i32 = class_element_access %.loc22_14.2, element0 -// CHECK:STDOUT: %.loc22_14.4: %i32 = bind_value %.loc22_14.3 -// CHECK:STDOUT: return %.loc22_14.4 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @AccessMemberWithInvalidBaseFinal_NoMember(%p.param: %ptr.160) -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %p.ref: %ptr.160 = name_ref p, %p -// CHECK:STDOUT: %.loc30: ref %DeriveFromFinal = deref %p.ref -// CHECK:STDOUT: %b.ref: = name_ref b, [concrete = ] -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/fail_base_method_define.carbon b/toolchain/check/testdata/class/fail_base_method_define.carbon deleted file mode 100644 index 344b210ee80ed..0000000000000 --- a/toolchain/check/testdata/class/fail_base_method_define.carbon +++ /dev/null @@ -1,128 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/fail_base_method_define.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/fail_base_method_define.carbon - -base class B { - fn F(); - - class C { - fn F(); - } -} - -class D { - extend base: B; -} - -// CHECK:STDERR: fail_base_method_define.carbon:[[@LINE+4]]:6: error: out-of-line declaration requires a declaration in scoped entity [QualifiedDeclOutsideScopeEntity] -// CHECK:STDERR: fn D.F() {} -// CHECK:STDERR: ^ -// CHECK:STDERR: -fn D.F() {} - -// CHECK:STDERR: fail_base_method_define.carbon:[[@LINE+4]]:6: error: name `C` not found [NameNotFound] -// CHECK:STDERR: fn D.C.F() {} -// CHECK:STDERR: ^ -// CHECK:STDERR: -fn D.C.F() {} - -// CHECK:STDOUT: --- fail_base_method_define.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %B: type = class_type @B [concrete] -// CHECK:STDOUT: %F.type.8c6: type = fn_type @F.1 [concrete] -// CHECK:STDOUT: %F.92a: %F.type.8c6 = struct_value () [concrete] -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %F.type.b77: type = fn_type @F.2 [concrete] -// CHECK:STDOUT: %F.a5f: %F.type.b77 = struct_value () [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %D: type = class_type @D [concrete] -// CHECK:STDOUT: %D.elem: type = unbound_element_type %D, %B [concrete] -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %B} [concrete] -// CHECK:STDOUT: %complete_type.98e: = complete_type_witness %struct_type.base [concrete] -// CHECK:STDOUT: %F.type.31906b.1: type = fn_type @F.3 [concrete] -// CHECK:STDOUT: %F.34b733.1: %F.type.31906b.1 = struct_value () [concrete] -// CHECK:STDOUT: %F.type.31906b.2: type = fn_type @F.4 [concrete] -// CHECK:STDOUT: %F.34b733.2: %F.type.31906b.2 = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .B = %B.decl -// CHECK:STDOUT: .D = %D.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %B.decl: type = class_decl @B [concrete = constants.%B] {} {} -// CHECK:STDOUT: %D.decl: type = class_decl @D [concrete = constants.%D] {} {} -// CHECK:STDOUT: %F.decl.loc27: %F.type.31906b.1 = fn_decl @F.3 [concrete = constants.%F.34b733.1] {} {} -// CHECK:STDOUT: %F.decl.loc33: %F.type.31906b.2 = fn_decl @F.4 [concrete = constants.%F.34b733.2] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @B { -// CHECK:STDOUT: %F.decl: %F.type.8c6 = fn_decl @F.1 [concrete = constants.%F.92a] {} {} -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%B -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C { -// CHECK:STDOUT: %F.decl: %F.type.b77 = fn_decl @F.2 [concrete = constants.%F.a5f] {} {} -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%C -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @D { -// CHECK:STDOUT: %B.ref: type = name_ref B, file.%B.decl [concrete = constants.%B] -// CHECK:STDOUT: %.loc20: %D.elem = base_decl %B.ref, element0 [concrete] -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %B} [concrete = constants.%struct_type.base] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base [concrete = constants.%complete_type.98e] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%D -// CHECK:STDOUT: .B = -// CHECK:STDOUT: .base = %.loc20 -// CHECK:STDOUT: .F = file.%F.decl.loc27 -// CHECK:STDOUT: extend %B.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F.1(); -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F.2(); -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F.3() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F.4() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/fail_base_misplaced.carbon b/toolchain/check/testdata/class/fail_base_misplaced.carbon deleted file mode 100644 index 0c9e764370c57..0000000000000 --- a/toolchain/check/testdata/class/fail_base_misplaced.carbon +++ /dev/null @@ -1,103 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/fail_base_misplaced.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/fail_base_misplaced.carbon - -base class B {} - -// CHECK:STDERR: fail_base_misplaced.carbon:[[@LINE+4]]:1: error: `base` declaration outside class [ClassSpecificDeclOutsideClass] -// CHECK:STDERR: extend base: B; -// CHECK:STDERR: ^~~~~~~~~~~~~~~ -// CHECK:STDERR: -extend base: B; - -fn F() { - // CHECK:STDERR: fail_base_misplaced.carbon:[[@LINE+4]]:3: error: `base` declaration outside class [ClassSpecificDeclOutsideClass] - // CHECK:STDERR: extend base: B; - // CHECK:STDERR: ^~~~~~~~~~~~~~~ - // CHECK:STDERR: - extend base: B; -} - -class C { - fn F() { - // CHECK:STDERR: fail_base_misplaced.carbon:[[@LINE+4]]:5: error: `base` declaration outside class [ClassSpecificDeclOutsideClass] - // CHECK:STDERR: extend base: B; - // CHECK:STDERR: ^~~~~~~~~~~~~~~ - // CHECK:STDERR: - extend base: B; - } -} - -// CHECK:STDOUT: --- fail_base_misplaced.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %B: type = class_type @B [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %F.type.b25: type = fn_type @F.1 [concrete] -// CHECK:STDOUT: %F.c41: %F.type.b25 = struct_value () [concrete] -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %F.type.c29: type = fn_type @F.2 [concrete] -// CHECK:STDOUT: %F.437: %F.type.c29 = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .B = %B.decl -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %B.decl: type = class_decl @B [concrete = constants.%B] {} {} -// CHECK:STDOUT: %B.ref: type = name_ref B, %B.decl [concrete = constants.%B] -// CHECK:STDOUT: %F.decl: %F.type.b25 = fn_decl @F.1 [concrete = constants.%F.c41] {} {} -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @B { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%B -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C { -// CHECK:STDOUT: %F.decl: %F.type.c29 = fn_decl @F.2 [concrete = constants.%F.437] {} {} -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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: .F = %F.decl -// CHECK:STDOUT: .B = -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F.1() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %B.ref: type = name_ref B, file.%B.decl [concrete = constants.%B] -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F.2() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %B.ref: type = name_ref B, file.%B.decl [concrete = constants.%B] -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/fail_base_modifiers.carbon b/toolchain/check/testdata/class/fail_base_modifiers.carbon deleted file mode 100644 index 1d281142682a5..0000000000000 --- a/toolchain/check/testdata/class/fail_base_modifiers.carbon +++ /dev/null @@ -1,52 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// 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/class/fail_base_modifiers.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/fail_base_modifiers.carbon - -base class B {} - -class C1 { - // CHECK:STDERR: fail_base_modifiers.carbon:[[@LINE+4]]:3: error: `private` not allowed on `base` declaration [ModifierNotAllowedOnDeclaration] - // CHECK:STDERR: private extend base: B; - // CHECK:STDERR: ^~~~~~~ - // CHECK:STDERR: - private extend base: B; -} - -class C2 { - // CHECK:STDERR: fail_base_modifiers.carbon:[[@LINE+8]]:3: error: `abstract` not allowed on `base` declaration [ModifierNotAllowedOnDeclaration] - // CHECK:STDERR: abstract base: B; - // CHECK:STDERR: ^~~~~~~~ - // CHECK:STDERR: - // CHECK:STDERR: fail_base_modifiers.carbon:[[@LINE+4]]:3: error: missing `extend` before `base` declaration [BaseMissingExtend] - // CHECK:STDERR: abstract base: B; - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~ - // CHECK:STDERR: - abstract base: B; -} - -class C3 { - // CHECK:STDERR: fail_base_modifiers.carbon:[[@LINE+4]]:10: error: `default` not allowed on `base` declaration [ModifierNotAllowedOnDeclaration] - // CHECK:STDERR: extend default base: B; - // CHECK:STDERR: ^~~~~~~ - // CHECK:STDERR: - extend default base: B; -} - -class C4 { - // CHECK:STDERR: fail_base_modifiers.carbon:[[@LINE+7]]:10: error: `extend` repeated on declaration [ModifierRepeated] - // CHECK:STDERR: extend extend base: B; - // CHECK:STDERR: ^~~~~~ - // CHECK:STDERR: fail_base_modifiers.carbon:[[@LINE+4]]:3: note: `extend` previously appeared here [ModifierPrevious] - // CHECK:STDERR: extend extend base: B; - // CHECK:STDERR: ^~~~~~ - // CHECK:STDERR: - extend extend base: B; -} diff --git a/toolchain/check/testdata/class/fail_base_no_extend.carbon b/toolchain/check/testdata/class/fail_base_no_extend.carbon deleted file mode 100644 index 8355d395c98f3..0000000000000 --- a/toolchain/check/testdata/class/fail_base_no_extend.carbon +++ /dev/null @@ -1,72 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/fail_base_no_extend.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/fail_base_no_extend.carbon - -base class B {} - -class C { - // CHECK:STDERR: fail_base_no_extend.carbon:[[@LINE+4]]:3: error: missing `extend` before `base` declaration [BaseMissingExtend] - // CHECK:STDERR: base: B; - // CHECK:STDERR: ^~~~~~~~ - // CHECK:STDERR: - base: B; -} - -// CHECK:STDOUT: --- fail_base_no_extend.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %B: type = class_type @B [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %C.elem: type = unbound_element_type %C, %B [concrete] -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %B} [concrete] -// CHECK:STDOUT: %complete_type.98e: = complete_type_witness %struct_type.base [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .B = %B.decl -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %B.decl: type = class_decl @B [concrete = constants.%B] {} {} -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @B { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%B -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C { -// CHECK:STDOUT: %B.ref: type = name_ref B, file.%B.decl [concrete = constants.%B] -// CHECK:STDOUT: %.loc18: %C.elem = base_decl %B.ref, element0 [concrete] -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %B} [concrete = constants.%struct_type.base] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base [concrete = constants.%complete_type.98e] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%C -// CHECK:STDOUT: .B = -// CHECK:STDOUT: .base = %.loc18 -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/fail_base_repeated.carbon b/toolchain/check/testdata/class/fail_base_repeated.carbon deleted file mode 100644 index 2cefc991cee82..0000000000000 --- a/toolchain/check/testdata/class/fail_base_repeated.carbon +++ /dev/null @@ -1,126 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/fail_base_repeated.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/fail_base_repeated.carbon - -base class B1 {} -base class B2 {} - -class C { - extend base: B1; - // CHECK:STDERR: fail_base_repeated.carbon:[[@LINE+7]]:3: error: multiple `base` declarations in class; multiple inheritance is not permitted [BaseDeclRepeated] - // CHECK:STDERR: extend base: B2; - // CHECK:STDERR: ^~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_repeated.carbon:[[@LINE-4]]:3: note: previous `base` declaration is here [ClassSpecificDeclPrevious] - // CHECK:STDERR: extend base: B1; - // CHECK:STDERR: ^~~~~~~~~~~~~~~~ - // CHECK:STDERR: - extend base: B2; -} - -class D { - // TODO: Consider adding a custom diagnostic for this case. - extend base: B1; - // CHECK:STDERR: fail_base_repeated.carbon:[[@LINE+7]]:3: error: multiple `base` declarations in class; multiple inheritance is not permitted [BaseDeclRepeated] - // CHECK:STDERR: extend base: B1; - // CHECK:STDERR: ^~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_repeated.carbon:[[@LINE-4]]:3: note: previous `base` declaration is here [ClassSpecificDeclPrevious] - // CHECK:STDERR: extend base: B1; - // CHECK:STDERR: ^~~~~~~~~~~~~~~~ - // CHECK:STDERR: - extend base: B1; -} - -// CHECK:STDOUT: --- fail_base_repeated.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %B1: type = class_type @B1 [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %B2: type = class_type @B2 [concrete] -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %C.elem: type = unbound_element_type %C, %B1 [concrete] -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %B1} [concrete] -// CHECK:STDOUT: %complete_type.5ac: = complete_type_witness %struct_type.base [concrete] -// CHECK:STDOUT: %D: type = class_type @D [concrete] -// CHECK:STDOUT: %D.elem: type = unbound_element_type %D, %B1 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .B1 = %B1.decl -// CHECK:STDOUT: .B2 = %B2.decl -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: .D = %D.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %B1.decl: type = class_decl @B1 [concrete = constants.%B1] {} {} -// CHECK:STDOUT: %B2.decl: type = class_decl @B2 [concrete = constants.%B2] {} {} -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: %D.decl: type = class_decl @D [concrete = constants.%D] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @B1 { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%B1 -// CHECK:STDOUT: .B2 = -// CHECK:STDOUT: .B1 = -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @B2 { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%B2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C { -// CHECK:STDOUT: %B1.ref: type = name_ref B1, file.%B1.decl [concrete = constants.%B1] -// CHECK:STDOUT: %.loc15: %C.elem = base_decl %B1.ref, element0 [concrete] -// CHECK:STDOUT: %B2.ref: type = name_ref B2, file.%B2.decl [concrete = constants.%B2] -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %B1} [concrete = constants.%struct_type.base] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base [concrete = constants.%complete_type.5ac] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%C -// CHECK:STDOUT: .B1 = -// CHECK:STDOUT: .base = %.loc15 -// CHECK:STDOUT: .B2 = -// CHECK:STDOUT: extend %B1.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @D { -// CHECK:STDOUT: %B1.ref.loc28: type = name_ref B1, file.%B1.decl [concrete = constants.%B1] -// CHECK:STDOUT: %.loc28: %D.elem = base_decl %B1.ref.loc28, element0 [concrete] -// CHECK:STDOUT: %B1.ref.loc36: type = name_ref B1, file.%B1.decl [concrete = constants.%B1] -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %B1} [concrete = constants.%struct_type.base] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base [concrete = constants.%complete_type.5ac] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%D -// CHECK:STDOUT: .B1 = -// CHECK:STDOUT: .base = %.loc28 -// CHECK:STDOUT: extend %B1.ref.loc28 -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/fail_base_unbound.carbon b/toolchain/check/testdata/class/fail_base_unbound.carbon deleted file mode 100644 index 17895808169c7..0000000000000 --- a/toolchain/check/testdata/class/fail_base_unbound.carbon +++ /dev/null @@ -1,89 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/fail_base_unbound.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/fail_base_unbound.carbon - -base class B {} - -class C { - extend base: B; -} - -// CHECK:STDERR: fail_base_unbound.carbon:[[@LINE+4]]:12: error: expression cannot be used as a value [UseOfNonExprAsValue] -// CHECK:STDERR: let b: B = C.base; -// CHECK:STDERR: ^~~~~~ -// CHECK:STDERR: -let b: B = C.base; - -// CHECK:STDOUT: --- fail_base_unbound.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %B: type = class_type @B [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %C.elem: type = unbound_element_type %C, %B [concrete] -// CHECK:STDOUT: %struct_type.base.0ff: type = struct_type {.base: %B} [concrete] -// CHECK:STDOUT: %complete_type.98e: = complete_type_witness %struct_type.base.0ff [concrete] -// CHECK:STDOUT: %pattern_type: type = pattern_type %B [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .B = %B.decl -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: .b = %b -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %B.decl: type = class_decl @B [concrete = constants.%B] {} {} -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %b.patt: %pattern_type = binding_pattern b [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %B.ref: type = name_ref B, %B.decl [concrete = constants.%B] -// CHECK:STDOUT: %b: %B = bind_name b, -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @B { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%B -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C { -// CHECK:STDOUT: %B.ref: type = name_ref B, file.%B.decl [concrete = constants.%B] -// CHECK:STDOUT: %.loc14: %C.elem = base_decl %B.ref, element0 [concrete] -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %B} [concrete = constants.%struct_type.base.0ff] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base [concrete = constants.%complete_type.98e] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%C -// CHECK:STDOUT: .B = -// CHECK:STDOUT: .base = %.loc14 -// CHECK:STDOUT: extend %B.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @__global_init() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %C.ref: type = name_ref C, file.%C.decl [concrete = constants.%C] -// CHECK:STDOUT: %base.ref: %C.elem = name_ref base, @C.%.loc14 [concrete = @C.%.loc14] -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/fail_compound_type_mismatch.carbon b/toolchain/check/testdata/class/fail_compound_type_mismatch.carbon deleted file mode 100644 index f87630c4e8406..0000000000000 --- a/toolchain/check/testdata/class/fail_compound_type_mismatch.carbon +++ /dev/null @@ -1,125 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/fail_compound_type_mismatch.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/fail_compound_type_mismatch.carbon - -class A { - var a: i32; -} - -class B { - var b: i32; -} - -fn AccessBInA(a: A) -> i32 { - // CHECK:STDERR: fail_compound_type_mismatch.carbon:[[@LINE+7]]:10: error: cannot implicitly convert expression of type `A` to `B` [ConversionFailure] - // CHECK:STDERR: return a.(B.b); - // CHECK:STDERR: ^~~~~~~ - // CHECK:STDERR: fail_compound_type_mismatch.carbon:[[@LINE+4]]:10: note: type `A` does not implement interface `Core.ImplicitAs(B)` [MissingImplInMemberAccessNote] - // CHECK:STDERR: return a.(B.b); - // CHECK:STDERR: ^~~~~~~ - // CHECK:STDERR: - return a.(B.b); -} - -// CHECK:STDOUT: --- fail_compound_type_mismatch.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %A: type = class_type @A [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %A.elem: type = unbound_element_type %A, %i32 [concrete] -// CHECK:STDOUT: %struct_type.a: type = struct_type {.a: %i32} [concrete] -// CHECK:STDOUT: %complete_type.fd7: = complete_type_witness %struct_type.a [concrete] -// CHECK:STDOUT: %B: type = class_type @B [concrete] -// CHECK:STDOUT: %B.elem: type = unbound_element_type %B, %i32 [concrete] -// CHECK:STDOUT: %struct_type.b: type = struct_type {.b: %i32} [concrete] -// CHECK:STDOUT: %complete_type.ba8: = complete_type_witness %struct_type.b [concrete] -// CHECK:STDOUT: %pattern_type.c10: type = pattern_type %A [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %AccessBInA.type: type = fn_type @AccessBInA [concrete] -// CHECK:STDOUT: %AccessBInA: %AccessBInA.type = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/operators/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .A = %A.decl -// CHECK:STDOUT: .B = %B.decl -// CHECK:STDOUT: .AccessBInA = %AccessBInA.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %A.decl: type = class_decl @A [concrete = constants.%A] {} {} -// CHECK:STDOUT: %B.decl: type = class_decl @B [concrete = constants.%B] {} {} -// CHECK:STDOUT: %AccessBInA.decl: %AccessBInA.type = fn_decl @AccessBInA [concrete = constants.%AccessBInA] { -// CHECK:STDOUT: %a.patt: %pattern_type.c10 = binding_pattern a [concrete] -// CHECK:STDOUT: %a.param_patt: %pattern_type.c10 = value_param_pattern %a.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %a.param: %A = value_param call_param0 -// CHECK:STDOUT: %A.ref: type = name_ref A, file.%A.decl [concrete = constants.%A] -// CHECK:STDOUT: %a: %A = bind_name a, %a.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @A { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc12: %A.elem = field_decl a, element0 [concrete] -// CHECK:STDOUT: %struct_type.a: type = struct_type {.a: %i32} [concrete = constants.%struct_type.a] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.a [concrete = constants.%complete_type.fd7] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%A -// CHECK:STDOUT: .a = %.loc12 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @B { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc16: %B.elem = field_decl b, element0 [concrete] -// CHECK:STDOUT: %struct_type.b: type = struct_type {.b: %i32} [concrete = constants.%struct_type.b] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.b [concrete = constants.%complete_type.ba8] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%B -// CHECK:STDOUT: .b = %.loc16 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @AccessBInA(%a.param: %A) -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %a.ref: %A = name_ref a, %a -// CHECK:STDOUT: %B.ref: type = name_ref B, file.%B.decl [concrete = constants.%B] -// CHECK:STDOUT: %b.ref: %B.elem = name_ref b, @B.%.loc16 [concrete = @B.%.loc16] -// CHECK:STDOUT: %.loc27_11.1: %B = converted %a.ref, [concrete = ] -// CHECK:STDOUT: %.loc27_11.2: %i32 = class_element_access , element0 [concrete = ] -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/fail_convert_to_invalid.carbon b/toolchain/check/testdata/class/fail_convert_to_invalid.carbon deleted file mode 100644 index 84ca25226a6b0..0000000000000 --- a/toolchain/check/testdata/class/fail_convert_to_invalid.carbon +++ /dev/null @@ -1,79 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/fail_convert_to_invalid.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/fail_convert_to_invalid.carbon - -class C { - // CHECK:STDERR: fail_convert_to_invalid.carbon:[[@LINE+4]]:10: error: name `NoSuchType` not found [NameNotFound] - // CHECK:STDERR: var a: NoSuchType; - // CHECK:STDERR: ^~~~~~~~~~ - // CHECK:STDERR: - var a: NoSuchType; -} - -fn Make() -> C { - return {.a = 123}; -} - -// CHECK:STDOUT: --- fail_convert_to_invalid.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %pattern_type: type = pattern_type %C [concrete] -// CHECK:STDOUT: %Make.type: type = fn_type @Make [concrete] -// CHECK:STDOUT: %Make: %Make.type = struct_value () [concrete] -// CHECK:STDOUT: %int_123: Core.IntLiteral = int_value 123 [concrete] -// CHECK:STDOUT: %struct_type.a: type = struct_type {.a: Core.IntLiteral} [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: .NoSuchType = -// CHECK:STDOUT: .Make = %Make.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: %Make.decl: %Make.type = fn_decl @Make [concrete = constants.%Make] { -// CHECK:STDOUT: %return.patt: %pattern_type = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %C.ref: type = name_ref C, file.%C.decl [concrete = constants.%C] -// CHECK:STDOUT: %return.param: ref %C = out_param call_param0 -// CHECK:STDOUT: %return: ref %C = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C { -// CHECK:STDOUT: %NoSuchType.ref: = name_ref NoSuchType, [concrete = ] -// CHECK:STDOUT: %.loc16: = field_decl a, element0 [concrete] -// CHECK:STDOUT: %struct_type.a: type = struct_type {.a: } [concrete = ] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.a [concrete = ] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%C -// CHECK:STDOUT: .NoSuchType = -// CHECK:STDOUT: .a = %.loc16 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Make() -> %return.param: %C { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %int_123: Core.IntLiteral = int_value 123 [concrete = constants.%int_123] -// CHECK:STDOUT: %.loc20: %struct_type.a = struct_literal (%int_123) -// CHECK:STDOUT: return to %return -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/fail_derived_to_base.carbon b/toolchain/check/testdata/class/fail_derived_to_base.carbon deleted file mode 100644 index fadae5bf72777..0000000000000 --- a/toolchain/check/testdata/class/fail_derived_to_base.carbon +++ /dev/null @@ -1,200 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/fail_derived_to_base.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/fail_derived_to_base.carbon - -base class A1 { - var a: i32; -} - -base class A2 { - var a: i32; -} - -class B2 { - extend base: A2; - var b: i32; -} - -// CHECK:STDERR: fail_derived_to_base.carbon:[[@LINE+7]]:38: error: cannot implicitly convert expression of type `B2*` to `A1*` [ConversionFailure] -// CHECK:STDERR: fn ConvertUnrelated(p: B2*) -> A1* { return p; } -// CHECK:STDERR: ^~~~~~~~~ -// CHECK:STDERR: fail_derived_to_base.carbon:[[@LINE+4]]:38: note: type `B2*` does not implement interface `Core.ImplicitAs(A1*)` [MissingImplInMemberAccessNote] -// CHECK:STDERR: fn ConvertUnrelated(p: B2*) -> A1* { return p; } -// CHECK:STDERR: ^~~~~~~~~ -// CHECK:STDERR: -fn ConvertUnrelated(p: B2*) -> A1* { return p; } - -class Incomplete; - -// CHECK:STDERR: fail_derived_to_base.carbon:[[@LINE+7]]:47: error: cannot implicitly convert expression of type `Incomplete*` to `A2*` [ConversionFailure] -// CHECK:STDERR: fn ConvertIncomplete(p: Incomplete*) -> A2* { return p; } -// CHECK:STDERR: ^~~~~~~~~ -// CHECK:STDERR: fail_derived_to_base.carbon:[[@LINE+4]]:47: note: type `Incomplete*` does not implement interface `Core.ImplicitAs(A2*)` [MissingImplInMemberAccessNote] -// CHECK:STDERR: fn ConvertIncomplete(p: Incomplete*) -> A2* { return p; } -// CHECK:STDERR: ^~~~~~~~~ -// CHECK:STDERR: -fn ConvertIncomplete(p: Incomplete*) -> A2* { return p; } - -// CHECK:STDOUT: --- fail_derived_to_base.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %A1: type = class_type @A1 [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %A1.elem: type = unbound_element_type %A1, %i32 [concrete] -// CHECK:STDOUT: %struct_type.a: type = struct_type {.a: %i32} [concrete] -// CHECK:STDOUT: %complete_type.fd7: = complete_type_witness %struct_type.a [concrete] -// CHECK:STDOUT: %A2: type = class_type @A2 [concrete] -// CHECK:STDOUT: %A2.elem: type = unbound_element_type %A2, %i32 [concrete] -// CHECK:STDOUT: %B2: type = class_type @B2 [concrete] -// CHECK:STDOUT: %B2.elem.a92: type = unbound_element_type %B2, %A2 [concrete] -// CHECK:STDOUT: %B2.elem.4b2: type = unbound_element_type %B2, %i32 [concrete] -// CHECK:STDOUT: %struct_type.base.b.618: type = struct_type {.base: %A2, .b: %i32} [concrete] -// CHECK:STDOUT: %complete_type.92f: = complete_type_witness %struct_type.base.b.618 [concrete] -// CHECK:STDOUT: %ptr.afe: type = ptr_type %B2 [concrete] -// CHECK:STDOUT: %pattern_type.98e: type = pattern_type %ptr.afe [concrete] -// CHECK:STDOUT: %ptr.678: type = ptr_type %A1 [concrete] -// CHECK:STDOUT: %pattern_type.d72: type = pattern_type %ptr.678 [concrete] -// CHECK:STDOUT: %ConvertUnrelated.type: type = fn_type @ConvertUnrelated [concrete] -// CHECK:STDOUT: %ConvertUnrelated: %ConvertUnrelated.type = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] -// CHECK:STDOUT: %Incomplete: type = class_type @Incomplete [concrete] -// CHECK:STDOUT: %ptr.c62: type = ptr_type %Incomplete [concrete] -// CHECK:STDOUT: %pattern_type.275: type = pattern_type %ptr.c62 [concrete] -// CHECK:STDOUT: %ptr.590: type = ptr_type %A2 [concrete] -// CHECK:STDOUT: %pattern_type.2c5: type = pattern_type %ptr.590 [concrete] -// CHECK:STDOUT: %ConvertIncomplete.type: type = fn_type @ConvertIncomplete [concrete] -// CHECK:STDOUT: %ConvertIncomplete: %ConvertIncomplete.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/operators/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .A1 = %A1.decl -// CHECK:STDOUT: .A2 = %A2.decl -// CHECK:STDOUT: .B2 = %B2.decl -// CHECK:STDOUT: .ConvertUnrelated = %ConvertUnrelated.decl -// CHECK:STDOUT: .Incomplete = %Incomplete.decl -// CHECK:STDOUT: .ConvertIncomplete = %ConvertIncomplete.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %A1.decl: type = class_decl @A1 [concrete = constants.%A1] {} {} -// CHECK:STDOUT: %A2.decl: type = class_decl @A2 [concrete = constants.%A2] {} {} -// CHECK:STDOUT: %B2.decl: type = class_decl @B2 [concrete = constants.%B2] {} {} -// CHECK:STDOUT: %ConvertUnrelated.decl: %ConvertUnrelated.type = fn_decl @ConvertUnrelated [concrete = constants.%ConvertUnrelated] { -// CHECK:STDOUT: %p.patt: %pattern_type.98e = binding_pattern p [concrete] -// CHECK:STDOUT: %p.param_patt: %pattern_type.98e = value_param_pattern %p.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.d72 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.d72 = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %A1.ref: type = name_ref A1, file.%A1.decl [concrete = constants.%A1] -// CHECK:STDOUT: %ptr.loc31_34: type = ptr_type %A1.ref [concrete = constants.%ptr.678] -// CHECK:STDOUT: %p.param: %ptr.afe = value_param call_param0 -// CHECK:STDOUT: %.loc31_26: type = splice_block %ptr.loc31_26 [concrete = constants.%ptr.afe] { -// CHECK:STDOUT: %B2.ref: type = name_ref B2, file.%B2.decl [concrete = constants.%B2] -// CHECK:STDOUT: %ptr.loc31_26: type = ptr_type %B2.ref [concrete = constants.%ptr.afe] -// CHECK:STDOUT: } -// CHECK:STDOUT: %p: %ptr.afe = bind_name p, %p.param -// CHECK:STDOUT: %return.param: ref %ptr.678 = out_param call_param1 -// CHECK:STDOUT: %return: ref %ptr.678 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %Incomplete.decl: type = class_decl @Incomplete [concrete = constants.%Incomplete] {} {} -// CHECK:STDOUT: %ConvertIncomplete.decl: %ConvertIncomplete.type = fn_decl @ConvertIncomplete [concrete = constants.%ConvertIncomplete] { -// CHECK:STDOUT: %p.patt: %pattern_type.275 = binding_pattern p [concrete] -// CHECK:STDOUT: %p.param_patt: %pattern_type.275 = value_param_pattern %p.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.2c5 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.2c5 = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %A2.ref: type = name_ref A2, file.%A2.decl [concrete = constants.%A2] -// CHECK:STDOUT: %ptr.loc42_43: type = ptr_type %A2.ref [concrete = constants.%ptr.590] -// CHECK:STDOUT: %p.param: %ptr.c62 = value_param call_param0 -// CHECK:STDOUT: %.loc42_35: type = splice_block %ptr.loc42_35 [concrete = constants.%ptr.c62] { -// CHECK:STDOUT: %Incomplete.ref: type = name_ref Incomplete, file.%Incomplete.decl [concrete = constants.%Incomplete] -// CHECK:STDOUT: %ptr.loc42_35: type = ptr_type %Incomplete.ref [concrete = constants.%ptr.c62] -// CHECK:STDOUT: } -// CHECK:STDOUT: %p: %ptr.c62 = bind_name p, %p.param -// CHECK:STDOUT: %return.param: ref %ptr.590 = out_param call_param1 -// CHECK:STDOUT: %return: ref %ptr.590 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @A1 { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc12: %A1.elem = field_decl a, element0 [concrete] -// CHECK:STDOUT: %struct_type.a: type = struct_type {.a: %i32} [concrete = constants.%struct_type.a] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.a [concrete = constants.%complete_type.fd7] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%A1 -// CHECK:STDOUT: .a = %.loc12 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @A2 { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc16: %A2.elem = field_decl a, element0 [concrete] -// CHECK:STDOUT: %struct_type.a: type = struct_type {.a: %i32} [concrete = constants.%struct_type.a] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.a [concrete = constants.%complete_type.fd7] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%A2 -// CHECK:STDOUT: .a = %.loc16 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @B2 { -// CHECK:STDOUT: %A2.ref: type = name_ref A2, file.%A2.decl [concrete = constants.%A2] -// CHECK:STDOUT: %.loc20: %B2.elem.a92 = base_decl %A2.ref, element0 [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc21: %B2.elem.4b2 = field_decl b, element1 [concrete] -// CHECK:STDOUT: %struct_type.base.b: type = struct_type {.base: %A2, .b: %i32} [concrete = constants.%struct_type.base.b.618] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base.b [concrete = constants.%complete_type.92f] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%B2 -// CHECK:STDOUT: .A2 = -// CHECK:STDOUT: .base = %.loc20 -// CHECK:STDOUT: .b = %.loc21 -// CHECK:STDOUT: extend %A2.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Incomplete; -// CHECK:STDOUT: -// CHECK:STDOUT: fn @ConvertUnrelated(%p.param: %ptr.afe) -> %ptr.678 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %p.ref: %ptr.afe = name_ref p, %p -// CHECK:STDOUT: %.loc31_46: %ptr.678 = converted %p.ref, [concrete = ] -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @ConvertIncomplete(%p.param: %ptr.c62) -> %ptr.590 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %p.ref: %ptr.c62 = name_ref p, %p -// CHECK:STDOUT: %.loc42_55: %ptr.590 = converted %p.ref, [concrete = ] -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/fail_extend_cycle.carbon b/toolchain/check/testdata/class/fail_extend_cycle.carbon deleted file mode 100644 index bf50e3fcd72fe..0000000000000 --- a/toolchain/check/testdata/class/fail_extend_cycle.carbon +++ /dev/null @@ -1,110 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/fail_extend_cycle.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/fail_extend_cycle.carbon - -base class A { -} - -base class B { - // This ensures that the compiler treats A as complete. - extend base: A; -} - -// CHECK:STDERR: fail_extend_cycle.carbon:[[@LINE+7]]:1: error: redefinition of `class A` [RedeclRedef] -// CHECK:STDERR: base class A { -// CHECK:STDERR: ^~~~~~~~~~~~~~ -// CHECK:STDERR: fail_extend_cycle.carbon:[[@LINE-11]]:1: note: previously defined here [RedeclPrevDef] -// CHECK:STDERR: base class A { -// CHECK:STDERR: ^~~~~~~~~~~~~~ -// CHECK:STDERR: -base class A { - extend base: A; - // CHECK:STDERR: fail_extend_cycle.carbon:[[@LINE+4]]:10: error: name `C` not found [NameNotFound] - // CHECK:STDERR: var c: C; - // CHECK:STDERR: ^ - // CHECK:STDERR: - var c: C; -} - -// CHECK:STDOUT: --- fail_extend_cycle.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %A.466950.1: type = class_type @A.1 [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %B: type = class_type @B [concrete] -// CHECK:STDOUT: %B.elem: type = unbound_element_type %B, %A.466950.1 [concrete] -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %A.466950.1} [concrete] -// CHECK:STDOUT: %complete_type.020: = complete_type_witness %struct_type.base [concrete] -// CHECK:STDOUT: %A.466950.2: type = class_type @A.2 [concrete] -// CHECK:STDOUT: %A.elem: type = unbound_element_type %A.466950.2, %A.466950.1 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .A = %A.decl.loc11 -// CHECK:STDOUT: .B = %B.decl -// CHECK:STDOUT: .C = -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %A.decl.loc11: type = class_decl @A.1 [concrete = constants.%A.466950.1] {} {} -// CHECK:STDOUT: %B.decl: type = class_decl @B [concrete = constants.%B] {} {} -// CHECK:STDOUT: %A.decl.loc26: type = class_decl @A.2 [concrete = constants.%A.466950.2] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @A.1 { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%A.466950.1 -// CHECK:STDOUT: .C = -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @B { -// CHECK:STDOUT: %A.ref: type = name_ref A, file.%A.decl.loc11 [concrete = constants.%A.466950.1] -// CHECK:STDOUT: %.loc16: %B.elem = base_decl %A.ref, element0 [concrete] -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %A.466950.1} [concrete = constants.%struct_type.base] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base [concrete = constants.%complete_type.020] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%B -// CHECK:STDOUT: .A = -// CHECK:STDOUT: .base = %.loc16 -// CHECK:STDOUT: extend %A.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @A.2 { -// CHECK:STDOUT: %A.ref: type = name_ref A, file.%A.decl.loc11 [concrete = constants.%A.466950.1] -// CHECK:STDOUT: %.loc27: %A.elem = base_decl %A.ref, element0 [concrete] -// CHECK:STDOUT: %C.ref: = name_ref C, [concrete = ] -// CHECK:STDOUT: %.loc32: = field_decl c, element1 [concrete] -// CHECK:STDOUT: %struct_type.base.c: type = struct_type {.base: %A.466950.1, .c: } [concrete = ] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base.c [concrete = ] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%A.466950.2 -// CHECK:STDOUT: .A = -// CHECK:STDOUT: .base = %.loc27 -// CHECK:STDOUT: .C = -// CHECK:STDOUT: .c = %.loc32 -// CHECK:STDOUT: extend %A.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/fail_field_modifiers.carbon b/toolchain/check/testdata/class/fail_field_modifiers.carbon deleted file mode 100644 index d9a2bf212383d..0000000000000 --- a/toolchain/check/testdata/class/fail_field_modifiers.carbon +++ /dev/null @@ -1,145 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/fail_field_modifiers.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/fail_field_modifiers.carbon - -class Class { - - // CHECK:STDERR: fail_field_modifiers.carbon:[[@LINE+4]]:3: error: `default` not allowed on `var` declaration [ModifierNotAllowedOnDeclaration] - // CHECK:STDERR: default var j: i32; - // CHECK:STDERR: ^~~~~~~ - // CHECK:STDERR: - default var j: i32; - - // CHECK:STDERR: fail_field_modifiers.carbon:[[@LINE+4]]:3: error: `final` not allowed on `var` declaration [ModifierNotAllowedOnDeclaration] - // CHECK:STDERR: final var k: i32; - // CHECK:STDERR: ^~~~~ - // CHECK:STDERR: - final var k: i32; - - // CHECK:STDERR: fail_field_modifiers.carbon:[[@LINE+4]]:3: error: `default` not allowed; requires interface scope [ModifierRequiresInterface] - // CHECK:STDERR: default let l: i32 = 0; - // CHECK:STDERR: ^~~~~~~ - // CHECK:STDERR: - default let l: i32 = 0; - - // CHECK:STDERR: fail_field_modifiers.carbon:[[@LINE+4]]:3: error: `final` not allowed; requires interface scope [ModifierRequiresInterface] - // CHECK:STDERR: final let m: i32 = 1; - // CHECK:STDERR: ^~~~~ - // CHECK:STDERR: - final let m: i32 = 1; -} - -// CHECK:STDOUT: --- fail_field_modifiers.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Class: type = class_type @Class [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %i32 [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %int_0.5c6: Core.IntLiteral = int_value 0 [concrete] -// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.type.205: type = facet_type <@ImplicitAs, @ImplicitAs(%i32)> [concrete] -// CHECK:STDOUT: %Convert.type.1b6: type = fn_type @Convert.1, @ImplicitAs(%i32) [concrete] -// CHECK:STDOUT: %To.c80: Core.IntLiteral = bind_symbolic_name To, 0 [symbolic] -// CHECK:STDOUT: %Convert.type.0f9: type = fn_type @Convert.2, @impl.4f9(%To.c80) [symbolic] -// CHECK:STDOUT: %Convert.f06: %Convert.type.0f9 = struct_value () [symbolic] -// CHECK:STDOUT: %ImplicitAs.impl_witness.c75: = impl_witness imports.%ImplicitAs.impl_witness_table.a2f, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.type.035: type = fn_type @Convert.2, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.956: %Convert.type.035 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.facet: %ImplicitAs.type.205 = facet_value Core.IntLiteral, (%ImplicitAs.impl_witness.c75) [concrete] -// CHECK:STDOUT: %.9c3: type = fn_type_with_self_type %Convert.type.1b6, %ImplicitAs.facet [concrete] -// CHECK:STDOUT: %Convert.bound.d04: = bound_method %int_0.5c6, %Convert.956 [concrete] -// CHECK:STDOUT: %Convert.specific_fn: = specific_function %Convert.956, @Convert.2(%int_32) [concrete] -// CHECK:STDOUT: %bound_method.b6e: = bound_method %int_0.5c6, %Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_0.6a9: %i32 = int_value 0 [concrete] -// CHECK:STDOUT: %int_1.5b8: Core.IntLiteral = int_value 1 [concrete] -// CHECK:STDOUT: %Convert.bound.ab5: = bound_method %int_1.5b8, %Convert.956 [concrete] -// CHECK:STDOUT: %bound_method.9a1: = bound_method %int_1.5b8, %Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_1.5d2: %i32 = int_value 1 [concrete] -// CHECK:STDOUT: %struct_type.j.k: type = struct_type {.j: %i32, .k: %i32} [concrete] -// CHECK:STDOUT: %complete_type.cf7: = complete_type_witness %struct_type.j.k [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/operators/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] -// CHECK:STDOUT: %Core.import_ref.a5b: @impl.4f9.%Convert.type (%Convert.type.0f9) = import_ref Core//prelude/types/int, loc19_39, loaded [symbolic = @impl.4f9.%Convert (constants.%Convert.f06)] -// CHECK:STDOUT: %ImplicitAs.impl_witness_table.a2f = impl_witness_table (%Core.import_ref.a5b), @impl.4f9 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Class = %Class.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Class.decl: type = class_decl @Class [concrete = constants.%Class] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Class { -// CHECK:STDOUT: %int_32.loc17: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc17: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc17: %Class.elem = field_decl j, element0 [concrete] -// CHECK:STDOUT: %int_32.loc23: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc23: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc23: %Class.elem = field_decl k, element1 [concrete] -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %l.patt: %pattern_type.7ce = binding_pattern l [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %int_0: Core.IntLiteral = int_value 0 [concrete = constants.%int_0.5c6] -// CHECK:STDOUT: %.loc29_18: type = splice_block %i32.loc29 [concrete = constants.%i32] { -// CHECK:STDOUT: %int_32.loc29: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc29: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: } -// CHECK:STDOUT: %impl.elem0.loc29: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc29_24.1: = bound_method %int_0, %impl.elem0.loc29 [concrete = constants.%Convert.bound.d04] -// CHECK:STDOUT: %specific_fn.loc29: = specific_function %impl.elem0.loc29, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc29_24.2: = bound_method %int_0, %specific_fn.loc29 [concrete = constants.%bound_method.b6e] -// CHECK:STDOUT: %int.convert_checked.loc29: init %i32 = call %bound_method.loc29_24.2(%int_0) [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %.loc29_24.1: %i32 = value_of_initializer %int.convert_checked.loc29 [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %.loc29_24.2: %i32 = converted %int_0, %.loc29_24.1 [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %l: %i32 = bind_name l, %.loc29_24.2 -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %m.patt: %pattern_type.7ce = binding_pattern m [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %int_1: Core.IntLiteral = int_value 1 [concrete = constants.%int_1.5b8] -// CHECK:STDOUT: %.loc35_16: type = splice_block %i32.loc35 [concrete = constants.%i32] { -// CHECK:STDOUT: %int_32.loc35: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc35: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: } -// CHECK:STDOUT: %impl.elem0.loc35: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc35_22.1: = bound_method %int_1, %impl.elem0.loc35 [concrete = constants.%Convert.bound.ab5] -// CHECK:STDOUT: %specific_fn.loc35: = specific_function %impl.elem0.loc35, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc35_22.2: = bound_method %int_1, %specific_fn.loc35 [concrete = constants.%bound_method.9a1] -// CHECK:STDOUT: %int.convert_checked.loc35: init %i32 = call %bound_method.loc35_22.2(%int_1) [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %.loc35_22.1: %i32 = value_of_initializer %int.convert_checked.loc35 [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %.loc35_22.2: %i32 = converted %int_1, %.loc35_22.1 [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %m: %i32 = bind_name m, %.loc35_22.2 -// CHECK:STDOUT: %struct_type.j.k: type = struct_type {.j: %i32, .k: %i32} [concrete = constants.%struct_type.j.k] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.j.k [concrete = constants.%complete_type.cf7] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Class -// CHECK:STDOUT: .j = %.loc17 -// CHECK:STDOUT: .k = %.loc23 -// CHECK:STDOUT: .l = %l -// CHECK:STDOUT: .m = %m -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/fail_generic_method.carbon b/toolchain/check/testdata/class/fail_generic_method.carbon deleted file mode 100644 index 2db275ac5af01..0000000000000 --- a/toolchain/check/testdata/class/fail_generic_method.carbon +++ /dev/null @@ -1,178 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/fail_generic_method.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/fail_generic_method.carbon - -class Class(T:! type) { - var a: T; - fn F[self: Self](n: T); -} - -// TODO: The follow-on errors here aren't great. Investigate whether we can -// enter the scope anyway if the parameters don't match. -// CHECK:STDERR: fail_generic_method.carbon:[[@LINE+15]]:10: error: type `` of parameter 1 in redeclaration differs from previous parameter type `` [RedeclParamDiffersType] -// CHECK:STDERR: fn Class(N:! i32).F[self: Self](n: T) {} -// CHECK:STDERR: ^ -// CHECK:STDERR: fail_generic_method.carbon:[[@LINE-10]]:13: note: previous declaration's corresponding parameter here [RedeclParamPrevious] -// CHECK:STDERR: class Class(T:! type) { -// CHECK:STDERR: ^ -// CHECK:STDERR: -// CHECK:STDERR: fail_generic_method.carbon:[[@LINE+8]]:27: error: name `Self` not found [NameNotFound] -// CHECK:STDERR: fn Class(N:! i32).F[self: Self](n: T) {} -// CHECK:STDERR: ^~~~ -// CHECK:STDERR: -// CHECK:STDERR: fail_generic_method.carbon:[[@LINE+4]]:36: error: name `T` not found [NameNotFound] -// CHECK:STDERR: fn Class(N:! i32).F[self: Self](n: T) {} -// CHECK:STDERR: ^ -// CHECK:STDERR: -fn Class(N:! i32).F[self: Self](n: T) {} - -// CHECK:STDOUT: --- fail_generic_method.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] -// CHECK:STDOUT: %Class.type: type = generic_class_type @Class [concrete] -// CHECK:STDOUT: %Class.generic: %Class.type = struct_value () [concrete] -// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T) [symbolic] -// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T [symbolic] -// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %T [symbolic] -// CHECK:STDOUT: %pattern_type.3c1: type = pattern_type %Class [symbolic] -// CHECK:STDOUT: %pattern_type.7dc: type = pattern_type %T [symbolic] -// CHECK:STDOUT: %F.type.6d6: type = fn_type @F.1, @Class(%T) [symbolic] -// CHECK:STDOUT: %F.cca: %F.type.6d6 = struct_value () [symbolic] -// CHECK:STDOUT: %struct_type.a: type = struct_type {.a: %T} [symbolic] -// CHECK:STDOUT: %complete_type.f1b: = complete_type_witness %struct_type.a [symbolic] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %N.51e: %i32 = bind_symbolic_name N, 0 [symbolic] -// CHECK:STDOUT: %F.type.b25: type = fn_type @F.2 [concrete] -// CHECK:STDOUT: %F.c41: %F.type.b25 = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Class = %Class.decl -// CHECK:STDOUT: .T = -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Class.decl: %Class.type = class_decl @Class [concrete = constants.%Class.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc11_13.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc11_13.2 (constants.%T)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %F.decl: %F.type.b25 = fn_decl @F.2 [concrete = constants.%F.c41] { -// CHECK:STDOUT: %self.patt: = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %n.patt: = binding_pattern n [concrete] -// CHECK:STDOUT: %n.param_patt: = value_param_pattern %n.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %.loc33: type = splice_block %i32 [concrete = constants.%i32] { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: } -// CHECK:STDOUT: %N.loc33_10.1: %i32 = bind_symbolic_name N, 0 [symbolic = %N.loc33_10.2 (constants.%N.51e)] -// CHECK:STDOUT: %self.param: = value_param call_param0 -// CHECK:STDOUT: %Self.ref: = name_ref Self, [concrete = ] -// CHECK:STDOUT: %self: = bind_name self, %self.param -// CHECK:STDOUT: %n.param: = value_param call_param1 -// CHECK:STDOUT: %T.ref: = name_ref T, [concrete = ] -// CHECK:STDOUT: %n: = bind_name n, %n.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Class(%T.loc11_13.1: type) { -// CHECK:STDOUT: %T.loc11_13.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc11_13.2 (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %T.loc11_13.2 [symbolic = %require_complete (constants.%require_complete.4ae)] -// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T.loc11_13.2) [symbolic = %Class (constants.%Class)] -// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %T.loc11_13.2 [symbolic = %Class.elem (constants.%Class.elem)] -// CHECK:STDOUT: %F.type: type = fn_type @F.1, @Class(%T.loc11_13.2) [symbolic = %F.type (constants.%F.type.6d6)] -// CHECK:STDOUT: %F: @Class.%F.type (%F.type.6d6) = struct_value () [symbolic = %F (constants.%F.cca)] -// CHECK:STDOUT: %struct_type.a.loc14_1.2: type = struct_type {.a: @Class.%T.loc11_13.2 (%T)} [symbolic = %struct_type.a.loc14_1.2 (constants.%struct_type.a)] -// CHECK:STDOUT: %complete_type.loc14_1.2: = complete_type_witness %struct_type.a.loc14_1.2 [symbolic = %complete_type.loc14_1.2 (constants.%complete_type.f1b)] -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc11_13.1 [symbolic = %T.loc11_13.2 (constants.%T)] -// CHECK:STDOUT: %.loc12: @Class.%Class.elem (%Class.elem) = field_decl a, element0 [concrete] -// CHECK:STDOUT: %F.decl: @Class.%F.type (%F.type.6d6) = fn_decl @F.1 [symbolic = @Class.%F (constants.%F.cca)] { -// CHECK:STDOUT: %self.patt: @F.1.%pattern_type.loc13_8 (%pattern_type.3c1) = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: @F.1.%pattern_type.loc13_8 (%pattern_type.3c1) = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %n.patt: @F.1.%pattern_type.loc13_20 (%pattern_type.7dc) = binding_pattern n [concrete] -// CHECK:STDOUT: %n.param_patt: @F.1.%pattern_type.loc13_20 (%pattern_type.7dc) = value_param_pattern %n.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: @F.1.%Class (%Class) = value_param call_param0 -// CHECK:STDOUT: %.loc13_14.1: type = splice_block %Self.ref [symbolic = %Class (constants.%Class)] { -// CHECK:STDOUT: %.loc13_14.2: type = specific_constant constants.%Class, @Class(constants.%T) [symbolic = %Class (constants.%Class)] -// CHECK:STDOUT: %Self.ref: type = name_ref Self, %.loc13_14.2 [symbolic = %Class (constants.%Class)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self: @F.1.%Class (%Class) = bind_name self, %self.param -// CHECK:STDOUT: %n.param: @F.1.%T (%T) = value_param call_param1 -// CHECK:STDOUT: %T.ref: type = name_ref T, @Class.%T.loc11_13.1 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %n: @F.1.%T (%T) = bind_name n, %n.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %struct_type.a.loc14_1.1: type = struct_type {.a: %T} [symbolic = %struct_type.a.loc14_1.2 (constants.%struct_type.a)] -// CHECK:STDOUT: %complete_type.loc14_1.1: = complete_type_witness %struct_type.a.loc14_1.1 [symbolic = %complete_type.loc14_1.2 (constants.%complete_type.f1b)] -// CHECK:STDOUT: complete_type_witness = %complete_type.loc14_1.1 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Class -// CHECK:STDOUT: .T = -// CHECK:STDOUT: .a = %.loc12 -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @F.1(@Class.%T.loc11_13.1: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T) [symbolic = %Class (constants.%Class)] -// CHECK:STDOUT: %pattern_type.loc13_8: type = pattern_type %Class [symbolic = %pattern_type.loc13_8 (constants.%pattern_type.3c1)] -// CHECK:STDOUT: %pattern_type.loc13_20: type = pattern_type %T [symbolic = %pattern_type.loc13_20 (constants.%pattern_type.7dc)] -// CHECK:STDOUT: -// CHECK:STDOUT: fn(%self.param: @F.1.%Class (%Class), %n.param: @F.1.%T (%T)); -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @F.2(%N.loc33_10.1: %i32) { -// CHECK:STDOUT: %N.loc33_10.2: %i32 = bind_symbolic_name N, 0 [symbolic = %N.loc33_10.2 (constants.%N.51e)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: -// CHECK:STDOUT: fn(%self.param: , %n.param: ) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Class(constants.%T) { -// CHECK:STDOUT: %T.loc11_13.2 => constants.%T -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @F.1(constants.%T) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %Class => constants.%Class -// CHECK:STDOUT: %pattern_type.loc13_8 => constants.%pattern_type.3c1 -// CHECK:STDOUT: %pattern_type.loc13_20 => constants.%pattern_type.7dc -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @F.2(constants.%N.51e) { -// CHECK:STDOUT: %N.loc33_10.2 => constants.%N.51e -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/fail_import_misuses.carbon b/toolchain/check/testdata/class/fail_import_misuses.carbon deleted file mode 100644 index 44c04c1d7378a..0000000000000 --- a/toolchain/check/testdata/class/fail_import_misuses.carbon +++ /dev/null @@ -1,142 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/fail_import_misuses.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/fail_import_misuses.carbon - -// --- a.carbon - -library "[[@TEST_NAME]]"; - -class Empty { -} - -class Incomplete; - -// --- fail_b.carbon - -library "[[@TEST_NAME]]"; - -import library "a"; - -// CHECK:STDERR: fail_b.carbon:[[@LINE+8]]:1: error: redeclaration of `class Empty` is redundant [RedeclRedundant] -// CHECK:STDERR: class Empty { -// CHECK:STDERR: ^~~~~~~~~~~~~ -// CHECK:STDERR: fail_b.carbon:[[@LINE-5]]:1: in import [InImport] -// CHECK:STDERR: a.carbon:4:1: note: previously declared here [RedeclPrevDecl] -// CHECK:STDERR: class Empty { -// CHECK:STDERR: ^~~~~~~~~~~~~ -// CHECK:STDERR: -class Empty { -} - -// CHECK:STDERR: fail_b.carbon:[[@LINE+8]]:8: error: binding pattern has incomplete type `Incomplete` in name binding declaration [IncompleteTypeInBindingDecl] -// CHECK:STDERR: var a: Incomplete; -// CHECK:STDERR: ^~~~~~~~~~ -// CHECK:STDERR: fail_b.carbon:[[@LINE-16]]:1: in import [InImport] -// CHECK:STDERR: a.carbon:7:1: note: class was forward declared here [ClassForwardDeclaredHere] -// CHECK:STDERR: class Incomplete; -// CHECK:STDERR: ^~~~~~~~~~~~~~~~~ -// CHECK:STDERR: -var a: Incomplete; - -// CHECK:STDOUT: --- a.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Empty: type = class_type @Empty [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %Incomplete: type = class_type @Incomplete [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Empty = %Empty.decl -// CHECK:STDOUT: .Incomplete = %Incomplete.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Empty.decl: type = class_decl @Empty [concrete = constants.%Empty] {} {} -// CHECK:STDOUT: %Incomplete.decl: type = class_decl @Incomplete [concrete = constants.%Incomplete] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Empty { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Empty -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Incomplete; -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_b.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Empty.f48899.1: type = class_type @Empty.1 [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %Empty.f48899.2: type = class_type @Empty.2 [concrete] -// CHECK:STDOUT: %Incomplete: type = class_type @Incomplete [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Main.Empty: type = import_ref Main//a, Empty, loaded [concrete = constants.%Empty.f48899.1] -// CHECK:STDOUT: %Main.Incomplete: type = import_ref Main//a, Incomplete, loaded [concrete = constants.%Incomplete] -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Main.import_ref.8f2: = import_ref Main//a, loc5_1, loaded [concrete = constants.%complete_type] -// CHECK:STDOUT: %Main.import_ref.fd7 = import_ref Main//a, inst18 [no loc], unloaded -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Empty = imports.%Main.Empty -// CHECK:STDOUT: .Incomplete = imports.%Main.Incomplete -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .a = %a -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %default.import = import -// CHECK:STDOUT: %Empty.decl: type = class_decl @Empty.2 [concrete = constants.%Empty.f48899.2] {} {} -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %a.patt: = binding_pattern a [concrete] -// CHECK:STDOUT: %a.var_patt: = var_pattern %a.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %a.var: ref = var %a.var_patt [concrete = ] -// CHECK:STDOUT: %Incomplete.ref: type = name_ref Incomplete, imports.%Main.Incomplete [concrete = constants.%Incomplete] -// CHECK:STDOUT: %a: = bind_name a, -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Empty.1 [from "a.carbon"] { -// CHECK:STDOUT: complete_type_witness = imports.%Main.import_ref.8f2 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Main.import_ref.fd7 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Empty.2 { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Empty.f48899.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Incomplete [from "a.carbon"]; -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/fail_incomplete.carbon b/toolchain/check/testdata/class/fail_incomplete.carbon deleted file mode 100644 index 9b638201ecd99..0000000000000 --- a/toolchain/check/testdata/class/fail_incomplete.carbon +++ /dev/null @@ -1,518 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/fail_incomplete.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/fail_incomplete.carbon - -// --- fail_forward_decl.carbon - -library "[[@TEST_NAME]]"; - -class Class; - -// CHECK:STDERR: fail_forward_decl.carbon:[[@LINE+7]]:4: error: cannot declare a member of incomplete class `Class` [QualifiedDeclInIncompleteClassScope] -// CHECK:STDERR: fn Class.Function() {} -// CHECK:STDERR: ^~~~~ -// CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-5]]:1: note: class was forward declared here [ClassForwardDeclaredHere] -// CHECK:STDERR: class Class; -// CHECK:STDERR: ^~~~~~~~~~~~ -// CHECK:STDERR: -fn Class.Function() {} - -fn CallClassFunction() { - // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE+7]]:3: error: member access into incomplete class `Class` [QualifiedExprInIncompleteClassScope] - // CHECK:STDERR: Class.Function(); - // CHECK:STDERR: ^~~~~~~~~~~~~~ - // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-15]]:1: note: class was forward declared here [ClassForwardDeclaredHere] - // CHECK:STDERR: class Class; - // CHECK:STDERR: ^~~~~~~~~~~~ - // CHECK:STDERR: - Class.Function(); -} - -// CHECK:STDERR: fail_forward_decl.carbon:[[@LINE+7]]:17: error: binding pattern has incomplete type `Class` in name binding declaration [IncompleteTypeInBindingDecl] -// CHECK:STDERR: var global_var: Class; -// CHECK:STDERR: ^~~~~ -// CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-25]]:1: note: class was forward declared here [ClassForwardDeclaredHere] -// CHECK:STDERR: class Class; -// CHECK:STDERR: ^~~~~~~~~~~~ -// CHECK:STDERR: -var global_var: Class; - -// CHECK:STDERR: fail_forward_decl.carbon:[[@LINE+7]]:24: error: function returns incomplete type `Class` [IncompleteTypeInFunctionReturnType] -// CHECK:STDERR: fn ConvertFromStruct() -> Class { return {}; } -// CHECK:STDERR: ^~~~~~~~ -// CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-34]]:1: note: class was forward declared here [ClassForwardDeclaredHere] -// CHECK:STDERR: class Class; -// CHECK:STDERR: ^~~~~~~~~~~~ -// CHECK:STDERR: -fn ConvertFromStruct() -> Class { return {}; } - -fn G(p: Class*) -> i32 { - // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE+7]]:10: error: member access into object of incomplete type `Class` [IncompleteTypeInMemberAccess] - // CHECK:STDERR: return p->n; - // CHECK:STDERR: ^~~~ - // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-44]]:1: note: class was forward declared here [ClassForwardDeclaredHere] - // CHECK:STDERR: class Class; - // CHECK:STDERR: ^~~~~~~~~~~~ - // CHECK:STDERR: - return p->n; -} - -fn MemberAccess(p: Class*) -> i32 { - // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE+7]]:11: error: member access into object of incomplete type `Class` [IncompleteTypeInMemberAccess] - // CHECK:STDERR: return (*p).n; - // CHECK:STDERR: ^~ - // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-55]]:1: note: class was forward declared here [ClassForwardDeclaredHere] - // CHECK:STDERR: class Class; - // CHECK:STDERR: ^~~~~~~~~~~~ - // CHECK:STDERR: - return (*p).n; -} - -// CHECK:STDERR: fail_forward_decl.carbon:[[@LINE+7]]:20: error: function returns incomplete type `Class` [IncompleteTypeInFunctionReturnType] -// CHECK:STDERR: fn Copy(p: Class*) -> Class { -// CHECK:STDERR: ^~~~~~~~ -// CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-65]]:1: note: class was forward declared here [ClassForwardDeclaredHere] -// CHECK:STDERR: class Class; -// CHECK:STDERR: ^~~~~~~~~~~~ -// CHECK:STDERR: -fn Copy(p: Class*) -> Class { - return *p; -} - -fn Let(p: Class*) { - // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE+7]]:10: error: binding pattern has incomplete type `Class` in name binding declaration [IncompleteTypeInBindingDecl] - // CHECK:STDERR: let c: Class = *p; - // CHECK:STDERR: ^~~~~ - // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-77]]:1: note: class was forward declared here [ClassForwardDeclaredHere] - // CHECK:STDERR: class Class; - // CHECK:STDERR: ^~~~~~~~~~~~ - // CHECK:STDERR: - let c: Class = *p; -} - -fn TakeIncomplete(c: Class); - -fn ReturnIncomplete() -> Class; - -fn CallTakeIncomplete(p: Class*) { - // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE+10]]:18: error: forming value of incomplete type `Class` [IncompleteTypeInValueConversion] - // CHECK:STDERR: TakeIncomplete(*p); - // CHECK:STDERR: ^~ - // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-92]]:1: note: class was forward declared here [ClassForwardDeclaredHere] - // CHECK:STDERR: class Class; - // CHECK:STDERR: ^~~~~~~~~~~~ - // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-11]]:19: note: initializing function parameter [InCallToFunctionParam] - // CHECK:STDERR: fn TakeIncomplete(c: Class); - // CHECK:STDERR: ^~~~~~~~ - // CHECK:STDERR: - TakeIncomplete(*p); - - // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE+10]]:18: error: forming value of incomplete type `Class` [IncompleteTypeInValueConversion] - // CHECK:STDERR: TakeIncomplete({}); - // CHECK:STDERR: ^~ - // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-104]]:1: note: class was forward declared here [ClassForwardDeclaredHere] - // CHECK:STDERR: class Class; - // CHECK:STDERR: ^~~~~~~~~~~~ - // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-23]]:19: note: initializing function parameter [InCallToFunctionParam] - // CHECK:STDERR: fn TakeIncomplete(c: Class); - // CHECK:STDERR: ^~~~~~~~ - // CHECK:STDERR: - TakeIncomplete({}); -} - -fn CallReturnIncomplete() { - // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE+10]]:3: error: function returns incomplete type `Class` [IncompleteTypeInFunctionReturnType] - // CHECK:STDERR: ReturnIncomplete(); - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-118]]:1: note: class was forward declared here [ClassForwardDeclaredHere] - // CHECK:STDERR: class Class; - // CHECK:STDERR: ^~~~~~~~~~~~ - // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-35]]:23: note: return type declared here [IncompleteReturnTypeHere] - // CHECK:STDERR: fn ReturnIncomplete() -> Class; - // CHECK:STDERR: ^~~~~~~~ - // CHECK:STDERR: - ReturnIncomplete(); -} - -class IncompleteAddrSelf { - fn F[addr self: Class*](); -} - -fn CallIncompleteAddrSelf(p: Class*) { - // TODO: Should this be valid? - // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE+10]]:3: error: invalid use of incomplete type `Class` [IncompleteTypeInConversion] - // CHECK:STDERR: p->(IncompleteAddrSelf.F)(); - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-137]]:1: note: class was forward declared here [ClassForwardDeclaredHere] - // CHECK:STDERR: class Class; - // CHECK:STDERR: ^~~~~~~~~~~~ - // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-11]]:8: note: initializing function parameter [InCallToFunctionParam] - // CHECK:STDERR: fn F[addr self: Class*](); - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~ - // CHECK:STDERR: - p->(IncompleteAddrSelf.F)(); -} - -// --- fail_in_definition.carbon - -library "[[@TEST_NAME]]"; - -class C { - // CHECK:STDERR: fail_in_definition.carbon:[[@LINE+7]]:10: error: field has incomplete type `C` [IncompleteTypeInFieldDecl] - // CHECK:STDERR: var c: C; - // CHECK:STDERR: ^ - // CHECK:STDERR: fail_in_definition.carbon:[[@LINE-4]]:1: note: class is incomplete within its definition [ClassIncompleteWithinDefinition] - // CHECK:STDERR: class C { - // CHECK:STDERR: ^~~~~~~~~ - // CHECK:STDERR: - var c: C; -} - -// CHECK:STDOUT: --- fail_forward_decl.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Class: type = class_type @Class [concrete] -// CHECK:STDOUT: %Function.type: type = fn_type @Function [concrete] -// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] -// CHECK:STDOUT: %Function: %Function.type = struct_value () [concrete] -// CHECK:STDOUT: %CallClassFunction.type: type = fn_type @CallClassFunction [concrete] -// CHECK:STDOUT: %CallClassFunction: %CallClassFunction.type = struct_value () [concrete] -// CHECK:STDOUT: %pattern_type.761: type = pattern_type %Class [concrete] -// CHECK:STDOUT: %ConvertFromStruct.type: type = fn_type @ConvertFromStruct [concrete] -// CHECK:STDOUT: %ConvertFromStruct: %ConvertFromStruct.type = struct_value () [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %ptr.e71: type = ptr_type %Class [concrete] -// CHECK:STDOUT: %pattern_type.796: type = pattern_type %ptr.e71 [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %G.type: type = fn_type @G [concrete] -// CHECK:STDOUT: %G: %G.type = struct_value () [concrete] -// CHECK:STDOUT: %MemberAccess.type: type = fn_type @MemberAccess [concrete] -// CHECK:STDOUT: %MemberAccess: %MemberAccess.type = struct_value () [concrete] -// CHECK:STDOUT: %Copy.type: type = fn_type @Copy [concrete] -// CHECK:STDOUT: %Copy: %Copy.type = struct_value () [concrete] -// CHECK:STDOUT: %Let.type: type = fn_type @Let [concrete] -// CHECK:STDOUT: %Let: %Let.type = struct_value () [concrete] -// CHECK:STDOUT: %TakeIncomplete.type: type = fn_type @TakeIncomplete [concrete] -// CHECK:STDOUT: %TakeIncomplete: %TakeIncomplete.type = struct_value () [concrete] -// CHECK:STDOUT: %ReturnIncomplete.type: type = fn_type @ReturnIncomplete [concrete] -// CHECK:STDOUT: %ReturnIncomplete: %ReturnIncomplete.type = struct_value () [concrete] -// CHECK:STDOUT: %CallTakeIncomplete.type: type = fn_type @CallTakeIncomplete [concrete] -// CHECK:STDOUT: %CallTakeIncomplete: %CallTakeIncomplete.type = struct_value () [concrete] -// CHECK:STDOUT: %CallReturnIncomplete.type: type = fn_type @CallReturnIncomplete [concrete] -// CHECK:STDOUT: %CallReturnIncomplete: %CallReturnIncomplete.type = struct_value () [concrete] -// CHECK:STDOUT: %IncompleteAddrSelf: type = class_type @IncompleteAddrSelf [concrete] -// CHECK:STDOUT: %pattern_type.f6d: type = pattern_type auto [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %CallIncompleteAddrSelf.type: type = fn_type @CallIncompleteAddrSelf [concrete] -// CHECK:STDOUT: %CallIncompleteAddrSelf: %CallIncompleteAddrSelf.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Class = %Class.decl -// CHECK:STDOUT: .CallClassFunction = %CallClassFunction.decl -// CHECK:STDOUT: .global_var = %global_var -// CHECK:STDOUT: .ConvertFromStruct = %ConvertFromStruct.decl -// CHECK:STDOUT: .G = %G.decl -// CHECK:STDOUT: .MemberAccess = %MemberAccess.decl -// CHECK:STDOUT: .Copy = %Copy.decl -// CHECK:STDOUT: .Let = %Let.decl -// CHECK:STDOUT: .TakeIncomplete = %TakeIncomplete.decl -// CHECK:STDOUT: .ReturnIncomplete = %ReturnIncomplete.decl -// CHECK:STDOUT: .CallTakeIncomplete = %CallTakeIncomplete.decl -// CHECK:STDOUT: .CallReturnIncomplete = %CallReturnIncomplete.decl -// CHECK:STDOUT: .IncompleteAddrSelf = %IncompleteAddrSelf.decl -// CHECK:STDOUT: .CallIncompleteAddrSelf = %CallIncompleteAddrSelf.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Class.decl: type = class_decl @Class [concrete = constants.%Class] {} {} -// CHECK:STDOUT: %Function.decl: %Function.type = fn_decl @Function [concrete = constants.%Function] {} {} -// CHECK:STDOUT: %CallClassFunction.decl: %CallClassFunction.type = fn_decl @CallClassFunction [concrete = constants.%CallClassFunction] {} {} -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %global_var.patt: = binding_pattern global_var [concrete] -// CHECK:STDOUT: %global_var.var_patt: = var_pattern %global_var.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %global_var.var: ref = var %global_var.var_patt [concrete = ] -// CHECK:STDOUT: %Class.ref: type = name_ref Class, %Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %global_var: = bind_name global_var, -// CHECK:STDOUT: %ConvertFromStruct.decl: %ConvertFromStruct.type = fn_decl @ConvertFromStruct [concrete = constants.%ConvertFromStruct] { -// CHECK:STDOUT: %return.patt: %pattern_type.761 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.761 = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %Class.ref: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %return.param: ref %Class = out_param call_param0 -// CHECK:STDOUT: %return: ref %Class = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %G.decl: %G.type = fn_decl @G [concrete = constants.%G] { -// CHECK:STDOUT: %p.patt: %pattern_type.796 = binding_pattern p [concrete] -// CHECK:STDOUT: %p.param_patt: %pattern_type.796 = value_param_pattern %p.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %p.param: %ptr.e71 = value_param call_param0 -// CHECK:STDOUT: %.loc44: type = splice_block %ptr [concrete = constants.%ptr.e71] { -// CHECK:STDOUT: %Class.ref: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %ptr: type = ptr_type %Class.ref [concrete = constants.%ptr.e71] -// CHECK:STDOUT: } -// CHECK:STDOUT: %p: %ptr.e71 = bind_name p, %p.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %MemberAccess.decl: %MemberAccess.type = fn_decl @MemberAccess [concrete = constants.%MemberAccess] { -// CHECK:STDOUT: %p.patt: %pattern_type.796 = binding_pattern p [concrete] -// CHECK:STDOUT: %p.param_patt: %pattern_type.796 = value_param_pattern %p.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %p.param: %ptr.e71 = value_param call_param0 -// CHECK:STDOUT: %.loc55: type = splice_block %ptr [concrete = constants.%ptr.e71] { -// CHECK:STDOUT: %Class.ref: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %ptr: type = ptr_type %Class.ref [concrete = constants.%ptr.e71] -// CHECK:STDOUT: } -// CHECK:STDOUT: %p: %ptr.e71 = bind_name p, %p.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %Copy.decl: %Copy.type = fn_decl @Copy [concrete = constants.%Copy] { -// CHECK:STDOUT: %p.patt: %pattern_type.796 = binding_pattern p [concrete] -// CHECK:STDOUT: %p.param_patt: %pattern_type.796 = value_param_pattern %p.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.761 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.761 = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %Class.ref.loc73_23: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %p.param: %ptr.e71 = value_param call_param0 -// CHECK:STDOUT: %.loc73: type = splice_block %ptr [concrete = constants.%ptr.e71] { -// CHECK:STDOUT: %Class.ref.loc73_12: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %ptr: type = ptr_type %Class.ref.loc73_12 [concrete = constants.%ptr.e71] -// CHECK:STDOUT: } -// CHECK:STDOUT: %p: %ptr.e71 = bind_name p, %p.param -// CHECK:STDOUT: %return.param: ref %Class = out_param call_param1 -// CHECK:STDOUT: %return: ref %Class = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %Let.decl: %Let.type = fn_decl @Let [concrete = constants.%Let] { -// CHECK:STDOUT: %p.patt: %pattern_type.796 = binding_pattern p [concrete] -// CHECK:STDOUT: %p.param_patt: %pattern_type.796 = value_param_pattern %p.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %p.param: %ptr.e71 = value_param call_param0 -// CHECK:STDOUT: %.loc77: type = splice_block %ptr [concrete = constants.%ptr.e71] { -// CHECK:STDOUT: %Class.ref.loc77: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %ptr: type = ptr_type %Class.ref.loc77 [concrete = constants.%ptr.e71] -// CHECK:STDOUT: } -// CHECK:STDOUT: %p: %ptr.e71 = bind_name p, %p.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %TakeIncomplete.decl: %TakeIncomplete.type = fn_decl @TakeIncomplete [concrete = constants.%TakeIncomplete] { -// CHECK:STDOUT: %c.patt: %pattern_type.761 = binding_pattern c [concrete] -// CHECK:STDOUT: %c.param_patt: %pattern_type.761 = value_param_pattern %c.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %c.param: %Class = value_param call_param0 -// CHECK:STDOUT: %Class.ref: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %c: %Class = bind_name c, %c.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %ReturnIncomplete.decl: %ReturnIncomplete.type = fn_decl @ReturnIncomplete [concrete = constants.%ReturnIncomplete] { -// CHECK:STDOUT: %return.patt: %pattern_type.761 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.761 = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %Class.ref: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %return.param: ref %Class = out_param call_param0 -// CHECK:STDOUT: %return: ref %Class = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %CallTakeIncomplete.decl: %CallTakeIncomplete.type = fn_decl @CallTakeIncomplete [concrete = constants.%CallTakeIncomplete] { -// CHECK:STDOUT: %p.patt: %pattern_type.796 = binding_pattern p [concrete] -// CHECK:STDOUT: %p.param_patt: %pattern_type.796 = value_param_pattern %p.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %p.param: %ptr.e71 = value_param call_param0 -// CHECK:STDOUT: %.loc92: type = splice_block %ptr [concrete = constants.%ptr.e71] { -// CHECK:STDOUT: %Class.ref: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %ptr: type = ptr_type %Class.ref [concrete = constants.%ptr.e71] -// CHECK:STDOUT: } -// CHECK:STDOUT: %p: %ptr.e71 = bind_name p, %p.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %CallReturnIncomplete.decl: %CallReturnIncomplete.type = fn_decl @CallReturnIncomplete [concrete = constants.%CallReturnIncomplete] {} {} -// CHECK:STDOUT: %IncompleteAddrSelf.decl: type = class_decl @IncompleteAddrSelf [concrete = constants.%IncompleteAddrSelf] {} {} -// CHECK:STDOUT: %CallIncompleteAddrSelf.decl: %CallIncompleteAddrSelf.type = fn_decl @CallIncompleteAddrSelf [concrete = constants.%CallIncompleteAddrSelf] { -// CHECK:STDOUT: %p.patt: %pattern_type.796 = binding_pattern p [concrete] -// CHECK:STDOUT: %p.param_patt: %pattern_type.796 = value_param_pattern %p.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %p.param: %ptr.e71 = value_param call_param0 -// CHECK:STDOUT: %.loc136: type = splice_block %ptr [concrete = constants.%ptr.e71] { -// CHECK:STDOUT: %Class.ref: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %ptr: type = ptr_type %Class.ref [concrete = constants.%ptr.e71] -// CHECK:STDOUT: } -// CHECK:STDOUT: %p: %ptr.e71 = bind_name p, %p.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Class; -// CHECK:STDOUT: -// CHECK:STDOUT: class @IncompleteAddrSelf { -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %self.patt: %pattern_type.796 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.796 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc133_8: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %ptr.e71 = value_param call_param0 -// CHECK:STDOUT: %.loc133_24: type = splice_block %ptr [concrete = constants.%ptr.e71] { -// CHECK:STDOUT: %Class.ref: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %ptr: type = ptr_type %Class.ref [concrete = constants.%ptr.e71] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self: %ptr.e71 = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%IncompleteAddrSelf -// CHECK:STDOUT: .Class = -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Function() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @CallClassFunction() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %Class.ref: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %Function.ref: = name_ref Function, [concrete = ] -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @ConvertFromStruct() -> %Class { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %.loc42: %empty_struct_type = struct_literal () -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @G(%p.param: %ptr.e71) -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %p.ref: %ptr.e71 = name_ref p, %p -// CHECK:STDOUT: %.loc52: ref %Class = deref %p.ref -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @MemberAccess(%p.param: %ptr.e71) -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %p.ref: %ptr.e71 = name_ref p, %p -// CHECK:STDOUT: %.loc63: ref %Class = deref %p.ref -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Copy(%p.param: %ptr.e71) -> %Class { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %p.ref: %ptr.e71 = name_ref p, %p -// CHECK:STDOUT: %.loc74: ref %Class = deref %p.ref -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Let(%p.param: %ptr.e71) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %c.patt: = binding_pattern c [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %p.ref: %ptr.e71 = name_ref p, %p -// CHECK:STDOUT: %.loc85: ref %Class = deref %p.ref -// CHECK:STDOUT: %Class.ref.loc85: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %c: = bind_name c, -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @TakeIncomplete(%c.param: %Class); -// CHECK:STDOUT: -// CHECK:STDOUT: fn @ReturnIncomplete() -> %Class; -// CHECK:STDOUT: -// CHECK:STDOUT: fn @CallTakeIncomplete(%p.param: %ptr.e71) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %TakeIncomplete.ref.loc103: %TakeIncomplete.type = name_ref TakeIncomplete, file.%TakeIncomplete.decl [concrete = constants.%TakeIncomplete] -// CHECK:STDOUT: %p.ref: %ptr.e71 = name_ref p, %p -// CHECK:STDOUT: %.loc103: ref %Class = deref %p.ref -// CHECK:STDOUT: %TakeIncomplete.call.loc103: init %empty_tuple.type = call %TakeIncomplete.ref.loc103() -// CHECK:STDOUT: %TakeIncomplete.ref.loc115: %TakeIncomplete.type = name_ref TakeIncomplete, file.%TakeIncomplete.decl [concrete = constants.%TakeIncomplete] -// CHECK:STDOUT: %.loc115: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %TakeIncomplete.call.loc115: init %empty_tuple.type = call %TakeIncomplete.ref.loc115() -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @CallReturnIncomplete() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %ReturnIncomplete.ref: %ReturnIncomplete.type = name_ref ReturnIncomplete, file.%ReturnIncomplete.decl [concrete = constants.%ReturnIncomplete] -// CHECK:STDOUT: %ReturnIncomplete.call: init = call %ReturnIncomplete.ref() -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F(%self.param: %ptr.e71); -// CHECK:STDOUT: -// CHECK:STDOUT: fn @CallIncompleteAddrSelf(%p.param: %ptr.e71) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %p.ref: %ptr.e71 = name_ref p, %p -// CHECK:STDOUT: %IncompleteAddrSelf.ref: type = name_ref IncompleteAddrSelf, file.%IncompleteAddrSelf.decl [concrete = constants.%IncompleteAddrSelf] -// CHECK:STDOUT: %F.ref: %F.type = name_ref F, @IncompleteAddrSelf.%F.decl [concrete = constants.%F] -// CHECK:STDOUT: %.loc148: ref %Class = deref %p.ref -// CHECK:STDOUT: %F.bound: = bound_method %.loc148, %F.ref -// CHECK:STDOUT: %addr: = addr_of [concrete = ] -// CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.bound() -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_in_definition.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C { -// CHECK:STDOUT: %C.ref: type = name_ref C, file.%C.decl [concrete = constants.%C] -// CHECK:STDOUT: %.loc12: = field_decl c, element0 [concrete] -// CHECK:STDOUT: %struct_type.c: type = struct_type {.c: } [concrete = ] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.c [concrete = ] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%C -// CHECK:STDOUT: .C = -// CHECK:STDOUT: .c = %.loc12 -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/fail_init.carbon b/toolchain/check/testdata/class/fail_init.carbon deleted file mode 100644 index af3ef3028fe49..0000000000000 --- a/toolchain/check/testdata/class/fail_init.carbon +++ /dev/null @@ -1,145 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/fail_init.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/fail_init.carbon - -class Class { - var a: i32; - var b: i32; -} - -fn F() { - // CHECK:STDERR: fail_init.carbon:[[@LINE+4]]:3: error: cannot initialize class with 2 fields from struct with 1 field [StructInitElementCountMismatch] - // CHECK:STDERR: {.a = 1} as Class; - // CHECK:STDERR: ^~~~~~~~ - // CHECK:STDERR: - {.a = 1} as Class; - // CHECK:STDERR: fail_init.carbon:[[@LINE+4]]:3: error: missing value for field `b` in struct initialization [StructInitMissingFieldInLiteral] - // CHECK:STDERR: {.a = 1, .c = 2} as Class; - // CHECK:STDERR: ^~~~~~~~~~~~~~~~ - // CHECK:STDERR: - {.a = 1, .c = 2} as Class; - // CHECK:STDERR: fail_init.carbon:[[@LINE+4]]:3: error: cannot initialize class with 2 fields from struct with 3 fields [StructInitElementCountMismatch] - // CHECK:STDERR: {.a = 1, .b = 2, .c = 3} as Class; - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: - {.a = 1, .b = 2, .c = 3} as Class; -} - -// CHECK:STDOUT: --- fail_init.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Class: type = class_type @Class [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %i32 [concrete] -// CHECK:STDOUT: %struct_type.a.b: type = struct_type {.a: %i32, .b: %i32} [concrete] -// CHECK:STDOUT: %complete_type.705: = complete_type_witness %struct_type.a.b [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %int_1.5b8: Core.IntLiteral = int_value 1 [concrete] -// CHECK:STDOUT: %struct_type.a: type = struct_type {.a: Core.IntLiteral} [concrete] -// CHECK:STDOUT: %int_2: Core.IntLiteral = int_value 2 [concrete] -// CHECK:STDOUT: %struct_type.a.c: type = struct_type {.a: Core.IntLiteral, .c: Core.IntLiteral} [concrete] -// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.type.205: type = facet_type <@ImplicitAs, @ImplicitAs(%i32)> [concrete] -// CHECK:STDOUT: %Convert.type.1b6: type = fn_type @Convert.1, @ImplicitAs(%i32) [concrete] -// CHECK:STDOUT: %To.c80: Core.IntLiteral = bind_symbolic_name To, 0 [symbolic] -// CHECK:STDOUT: %Convert.type.0f9: type = fn_type @Convert.2, @impl.4f9(%To.c80) [symbolic] -// CHECK:STDOUT: %Convert.f06: %Convert.type.0f9 = struct_value () [symbolic] -// CHECK:STDOUT: %ImplicitAs.impl_witness.c75: = impl_witness imports.%ImplicitAs.impl_witness_table.a2f, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.type.035: type = fn_type @Convert.2, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.956: %Convert.type.035 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.facet: %ImplicitAs.type.205 = facet_value Core.IntLiteral, (%ImplicitAs.impl_witness.c75) [concrete] -// CHECK:STDOUT: %.9c3: type = fn_type_with_self_type %Convert.type.1b6, %ImplicitAs.facet [concrete] -// CHECK:STDOUT: %Convert.bound: = bound_method %int_1.5b8, %Convert.956 [concrete] -// CHECK:STDOUT: %Convert.specific_fn: = specific_function %Convert.956, @Convert.2(%int_32) [concrete] -// CHECK:STDOUT: %bound_method: = bound_method %int_1.5b8, %Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_1.5d2: %i32 = int_value 1 [concrete] -// CHECK:STDOUT: %int_3: Core.IntLiteral = int_value 3 [concrete] -// CHECK:STDOUT: %struct_type.a.b.c: type = struct_type {.a: Core.IntLiteral, .b: Core.IntLiteral, .c: Core.IntLiteral} [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/operators/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] -// CHECK:STDOUT: %Core.import_ref.a5b: @impl.4f9.%Convert.type (%Convert.type.0f9) = import_ref Core//prelude/types/int, loc19_39, loaded [symbolic = @impl.4f9.%Convert (constants.%Convert.f06)] -// CHECK:STDOUT: %ImplicitAs.impl_witness_table.a2f = impl_witness_table (%Core.import_ref.a5b), @impl.4f9 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Class = %Class.decl -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Class.decl: type = class_decl @Class [concrete = constants.%Class] {} {} -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Class { -// CHECK:STDOUT: %int_32.loc12: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc12: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc12: %Class.elem = field_decl a, element0 [concrete] -// CHECK:STDOUT: %int_32.loc13: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc13: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc13: %Class.elem = field_decl b, element1 [concrete] -// CHECK:STDOUT: %struct_type.a.b: type = struct_type {.a: %i32, .b: %i32} [concrete = constants.%struct_type.a.b] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.a.b [concrete = constants.%complete_type.705] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Class -// CHECK:STDOUT: .a = %.loc12 -// CHECK:STDOUT: .b = %.loc13 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %int_1.loc21: Core.IntLiteral = int_value 1 [concrete = constants.%int_1.5b8] -// CHECK:STDOUT: %.loc21_10.1: %struct_type.a = struct_literal (%int_1.loc21) -// CHECK:STDOUT: %Class.ref.loc21: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %.loc21_10.2: ref %Class = temporary_storage -// CHECK:STDOUT: %.loc21_10.3: ref %Class = temporary %.loc21_10.2, [concrete = ] -// CHECK:STDOUT: %.loc21_12: ref %Class = converted %.loc21_10.1, %.loc21_10.3 [concrete = ] -// CHECK:STDOUT: %int_1.loc26: Core.IntLiteral = int_value 1 [concrete = constants.%int_1.5b8] -// CHECK:STDOUT: %int_2.loc26: Core.IntLiteral = int_value 2 [concrete = constants.%int_2] -// CHECK:STDOUT: %.loc26_18.1: %struct_type.a.c = struct_literal (%int_1.loc26, %int_2.loc26) -// CHECK:STDOUT: %Class.ref.loc26: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %impl.elem0: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc26_18.1: = bound_method %int_1.loc26, %impl.elem0 [concrete = constants.%Convert.bound] -// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc26_18.2: = bound_method %int_1.loc26, %specific_fn [concrete = constants.%bound_method] -// CHECK:STDOUT: %int.convert_checked: init %i32 = call %bound_method.loc26_18.2(%int_1.loc26) [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %.loc26_18.2: init %i32 = converted %int_1.loc26, %int.convert_checked [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %.loc26_18.3: ref %Class = temporary_storage -// CHECK:STDOUT: %.loc26_18.4: ref %i32 = class_element_access %.loc26_18.3, element0 -// CHECK:STDOUT: %.loc26_18.5: init %i32 = initialize_from %.loc26_18.2 to %.loc26_18.4 [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %.loc26_18.6: ref %Class = temporary %.loc26_18.3, [concrete = ] -// CHECK:STDOUT: %.loc26_20: ref %Class = converted %.loc26_18.1, %.loc26_18.6 [concrete = ] -// CHECK:STDOUT: %int_1.loc31: Core.IntLiteral = int_value 1 [concrete = constants.%int_1.5b8] -// CHECK:STDOUT: %int_2.loc31: Core.IntLiteral = int_value 2 [concrete = constants.%int_2] -// CHECK:STDOUT: %int_3: Core.IntLiteral = int_value 3 [concrete = constants.%int_3] -// CHECK:STDOUT: %.loc31_26.1: %struct_type.a.b.c = struct_literal (%int_1.loc31, %int_2.loc31, %int_3) -// CHECK:STDOUT: %Class.ref.loc31: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %.loc31_26.2: ref %Class = temporary_storage -// CHECK:STDOUT: %.loc31_26.3: ref %Class = temporary %.loc31_26.2, [concrete = ] -// CHECK:STDOUT: %.loc31_28: ref %Class = converted %.loc31_26.1, %.loc31_26.3 [concrete = ] -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/fail_init_as_inplace.carbon b/toolchain/check/testdata/class/fail_init_as_inplace.carbon deleted file mode 100644 index b60d6f3041ea2..0000000000000 --- a/toolchain/check/testdata/class/fail_init_as_inplace.carbon +++ /dev/null @@ -1,170 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/fail_init_as_inplace.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/fail_init_as_inplace.carbon - -class Class { - var a: i32; - var b: i32; -} - -fn G(p: Class*); - -fn F() { - // TODO: This case should presumably work: `{...} as Class` should be an - // initializing expression, not a value expression. - // - // CHECK:STDERR: fail_init_as_inplace.carbon:[[@LINE+4]]:18: error: cannot copy value of type `Class` [CopyOfUncopyableType] - // CHECK:STDERR: var c: Class = {.a = 1, .b = 2} as Class; - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: - var c: Class = {.a = 1, .b = 2} as Class; - G(&c); -} - -// CHECK:STDOUT: --- fail_init_as_inplace.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Class: type = class_type @Class [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %i32 [concrete] -// CHECK:STDOUT: %struct_type.a.b.501: type = struct_type {.a: %i32, .b: %i32} [concrete] -// CHECK:STDOUT: %complete_type.705: = complete_type_witness %struct_type.a.b.501 [concrete] -// CHECK:STDOUT: %ptr.e71: type = ptr_type %Class [concrete] -// CHECK:STDOUT: %pattern_type.796: type = pattern_type %ptr.e71 [concrete] -// CHECK:STDOUT: %G.type: type = fn_type @G [concrete] -// CHECK:STDOUT: %G: %G.type = struct_value () [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %pattern_type.761: type = pattern_type %Class [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: %struct_type.a.b.cfd: type = struct_type {.a: Core.IntLiteral, .b: Core.IntLiteral} [concrete] -// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.type.205: type = facet_type <@ImplicitAs, @ImplicitAs(%i32)> [concrete] -// CHECK:STDOUT: %Convert.type.1b6: type = fn_type @Convert.1, @ImplicitAs(%i32) [concrete] -// CHECK:STDOUT: %To.c80: Core.IntLiteral = bind_symbolic_name To, 0 [symbolic] -// CHECK:STDOUT: %Convert.type.0f9: type = fn_type @Convert.2, @impl.4f9(%To.c80) [symbolic] -// CHECK:STDOUT: %Convert.f06: %Convert.type.0f9 = struct_value () [symbolic] -// CHECK:STDOUT: %ImplicitAs.impl_witness.c75: = impl_witness imports.%ImplicitAs.impl_witness_table.a2f, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.type.035: type = fn_type @Convert.2, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.956: %Convert.type.035 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.facet: %ImplicitAs.type.205 = facet_value Core.IntLiteral, (%ImplicitAs.impl_witness.c75) [concrete] -// CHECK:STDOUT: %.9c3: type = fn_type_with_self_type %Convert.type.1b6, %ImplicitAs.facet [concrete] -// CHECK:STDOUT: %Convert.bound.ab5: = bound_method %int_1.5b8, %Convert.956 [concrete] -// CHECK:STDOUT: %Convert.specific_fn: = specific_function %Convert.956, @Convert.2(%int_32) [concrete] -// CHECK:STDOUT: %bound_method.9a1: = bound_method %int_1.5b8, %Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_1.5d2: %i32 = int_value 1 [concrete] -// CHECK:STDOUT: %Convert.bound.ef9: = bound_method %int_2.ecc, %Convert.956 [concrete] -// CHECK:STDOUT: %bound_method.b92: = bound_method %int_2.ecc, %Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_2.ef8: %i32 = int_value 2 [concrete] -// CHECK:STDOUT: %Class.val: %Class = struct_value (%int_1.5d2, %int_2.ef8) [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/operators/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] -// CHECK:STDOUT: %Core.import_ref.a5b: @impl.4f9.%Convert.type (%Convert.type.0f9) = import_ref Core//prelude/types/int, loc19_39, loaded [symbolic = @impl.4f9.%Convert (constants.%Convert.f06)] -// CHECK:STDOUT: %ImplicitAs.impl_witness_table.a2f = impl_witness_table (%Core.import_ref.a5b), @impl.4f9 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Class = %Class.decl -// CHECK:STDOUT: .G = %G.decl -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Class.decl: type = class_decl @Class [concrete = constants.%Class] {} {} -// CHECK:STDOUT: %G.decl: %G.type = fn_decl @G [concrete = constants.%G] { -// CHECK:STDOUT: %p.patt: %pattern_type.796 = binding_pattern p [concrete] -// CHECK:STDOUT: %p.param_patt: %pattern_type.796 = value_param_pattern %p.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %p.param: %ptr.e71 = value_param call_param0 -// CHECK:STDOUT: %.loc16: type = splice_block %ptr [concrete = constants.%ptr.e71] { -// CHECK:STDOUT: %Class.ref: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %ptr: type = ptr_type %Class.ref [concrete = constants.%ptr.e71] -// CHECK:STDOUT: } -// CHECK:STDOUT: %p: %ptr.e71 = bind_name p, %p.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Class { -// CHECK:STDOUT: %int_32.loc12: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc12: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc12: %Class.elem = field_decl a, element0 [concrete] -// CHECK:STDOUT: %int_32.loc13: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc13: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc13: %Class.elem = field_decl b, element1 [concrete] -// CHECK:STDOUT: %struct_type.a.b: type = struct_type {.a: %i32, .b: %i32} [concrete = constants.%struct_type.a.b.501] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.a.b [concrete = constants.%complete_type.705] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Class -// CHECK:STDOUT: .a = %.loc12 -// CHECK:STDOUT: .b = %.loc13 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @G(%p.param: %ptr.e71); -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %c.patt: %pattern_type.761 = binding_pattern c [concrete] -// CHECK:STDOUT: %c.var_patt: %pattern_type.761 = var_pattern %c.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %c.var: ref %Class = var %c.var_patt -// CHECK:STDOUT: %int_1: Core.IntLiteral = int_value 1 [concrete = constants.%int_1.5b8] -// CHECK:STDOUT: %int_2: Core.IntLiteral = int_value 2 [concrete = constants.%int_2.ecc] -// CHECK:STDOUT: %.loc26_33.1: %struct_type.a.b.cfd = struct_literal (%int_1, %int_2) -// CHECK:STDOUT: %Class.ref.loc26_38: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %impl.elem0.loc26_33.1: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc26_33.1: = bound_method %int_1, %impl.elem0.loc26_33.1 [concrete = constants.%Convert.bound.ab5] -// CHECK:STDOUT: %specific_fn.loc26_33.1: = specific_function %impl.elem0.loc26_33.1, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc26_33.2: = bound_method %int_1, %specific_fn.loc26_33.1 [concrete = constants.%bound_method.9a1] -// CHECK:STDOUT: %int.convert_checked.loc26_33.1: init %i32 = call %bound_method.loc26_33.2(%int_1) [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %.loc26_33.2: init %i32 = converted %int_1, %int.convert_checked.loc26_33.1 [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %.loc26_33.3: ref %Class = temporary_storage -// CHECK:STDOUT: %.loc26_33.4: ref %i32 = class_element_access %.loc26_33.3, element0 -// CHECK:STDOUT: %.loc26_33.5: init %i32 = initialize_from %.loc26_33.2 to %.loc26_33.4 [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %impl.elem0.loc26_33.2: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc26_33.3: = bound_method %int_2, %impl.elem0.loc26_33.2 [concrete = constants.%Convert.bound.ef9] -// CHECK:STDOUT: %specific_fn.loc26_33.2: = specific_function %impl.elem0.loc26_33.2, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc26_33.4: = bound_method %int_2, %specific_fn.loc26_33.2 [concrete = constants.%bound_method.b92] -// CHECK:STDOUT: %int.convert_checked.loc26_33.2: init %i32 = call %bound_method.loc26_33.4(%int_2) [concrete = constants.%int_2.ef8] -// CHECK:STDOUT: %.loc26_33.6: init %i32 = converted %int_2, %int.convert_checked.loc26_33.2 [concrete = constants.%int_2.ef8] -// CHECK:STDOUT: %.loc26_33.7: ref %i32 = class_element_access %.loc26_33.3, element1 -// CHECK:STDOUT: %.loc26_33.8: init %i32 = initialize_from %.loc26_33.6 to %.loc26_33.7 [concrete = constants.%int_2.ef8] -// CHECK:STDOUT: %.loc26_33.9: init %Class = class_init (%.loc26_33.5, %.loc26_33.8), %.loc26_33.3 [concrete = constants.%Class.val] -// CHECK:STDOUT: %.loc26_33.10: ref %Class = temporary %.loc26_33.3, %.loc26_33.9 -// CHECK:STDOUT: %.loc26_35.1: ref %Class = converted %.loc26_33.1, %.loc26_33.10 -// CHECK:STDOUT: %.loc26_35.2: %Class = bind_value %.loc26_35.1 -// CHECK:STDOUT: assign %c.var, -// CHECK:STDOUT: %Class.ref.loc26_10: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %c: ref %Class = bind_name c, %c.var -// CHECK:STDOUT: %G.ref: %G.type = name_ref G, file.%G.decl [concrete = constants.%G] -// CHECK:STDOUT: %c.ref: ref %Class = name_ref c, %c -// CHECK:STDOUT: %addr: %ptr.e71 = addr_of %c.ref -// CHECK:STDOUT: %G.call: init %empty_tuple.type = call %G.ref(%addr) -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/fail_memaccess_category.carbon b/toolchain/check/testdata/class/fail_memaccess_category.carbon deleted file mode 100644 index 6c55a5f42b4da..0000000000000 --- a/toolchain/check/testdata/class/fail_memaccess_category.carbon +++ /dev/null @@ -1,157 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/fail_memaccess_category.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/fail_memaccess_category.carbon - -class A { - fn F[addr self: A*](); -} - -class B { - var a: A; -} - -fn F(s: {.a: A}, b: B) { - // `s` has only a value representation, so this must be invalid. - // CHECK:STDERR: fail_memaccess_category.carbon:[[@LINE+7]]:3: error: `addr self` method cannot be invoked on a value [AddrSelfIsNonRef] - // CHECK:STDERR: s.a.F(); - // CHECK:STDERR: ^~~ - // CHECK:STDERR: fail_memaccess_category.carbon:[[@LINE-12]]:8: note: initializing function parameter [InCallToFunctionParam] - // CHECK:STDERR: fn F[addr self: A*](); - // CHECK:STDERR: ^~~~~~~~~~~~~ - // CHECK:STDERR: - s.a.F(); - - // `b` has an object representation for `A`, but this is still invalid for - // consistency. - // CHECK:STDERR: fail_memaccess_category.carbon:[[@LINE+7]]:3: error: `addr self` method cannot be invoked on a value [AddrSelfIsNonRef] - // CHECK:STDERR: b.a.F(); - // CHECK:STDERR: ^~~ - // CHECK:STDERR: fail_memaccess_category.carbon:[[@LINE-23]]:8: note: initializing function parameter [InCallToFunctionParam] - // CHECK:STDERR: fn F[addr self: A*](); - // CHECK:STDERR: ^~~~~~~~~~~~~ - // CHECK:STDERR: - b.a.F(); -} - -// CHECK:STDOUT: --- fail_memaccess_category.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %A: type = class_type @A [concrete] -// CHECK:STDOUT: %ptr.6db: type = ptr_type %A [concrete] -// CHECK:STDOUT: %pattern_type.5f8: type = pattern_type %ptr.6db [concrete] -// CHECK:STDOUT: %pattern_type.f6d: type = pattern_type auto [concrete] -// CHECK:STDOUT: %F.type.649: type = fn_type @F.1 [concrete] -// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] -// CHECK:STDOUT: %F.485: %F.type.649 = struct_value () [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %B: type = class_type @B [concrete] -// CHECK:STDOUT: %B.elem: type = unbound_element_type %B, %A [concrete] -// CHECK:STDOUT: %struct_type.a.72c: type = struct_type {.a: %A} [concrete] -// CHECK:STDOUT: %complete_type.2b9: = complete_type_witness %struct_type.a.72c [concrete] -// CHECK:STDOUT: %pattern_type.c19: type = pattern_type %struct_type.a.72c [concrete] -// CHECK:STDOUT: %pattern_type.049: type = pattern_type %B [concrete] -// CHECK:STDOUT: %F.type.b25: type = fn_type @F.2 [concrete] -// CHECK:STDOUT: %F.c41: %F.type.b25 = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .A = %A.decl -// CHECK:STDOUT: .B = %B.decl -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %A.decl: type = class_decl @A [concrete = constants.%A] {} {} -// CHECK:STDOUT: %B.decl: type = class_decl @B [concrete = constants.%B] {} {} -// CHECK:STDOUT: %F.decl: %F.type.b25 = fn_decl @F.2 [concrete = constants.%F.c41] { -// CHECK:STDOUT: %s.patt: %pattern_type.c19 = binding_pattern s [concrete] -// CHECK:STDOUT: %s.param_patt: %pattern_type.c19 = value_param_pattern %s.patt, call_param0 [concrete] -// CHECK:STDOUT: %b.patt: %pattern_type.049 = binding_pattern b [concrete] -// CHECK:STDOUT: %b.param_patt: %pattern_type.049 = value_param_pattern %b.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %s.param: %struct_type.a.72c = value_param call_param0 -// CHECK:STDOUT: %.loc19: type = splice_block %struct_type.a [concrete = constants.%struct_type.a.72c] { -// CHECK:STDOUT: %A.ref: type = name_ref A, file.%A.decl [concrete = constants.%A] -// CHECK:STDOUT: %struct_type.a: type = struct_type {.a: %A} [concrete = constants.%struct_type.a.72c] -// CHECK:STDOUT: } -// CHECK:STDOUT: %s: %struct_type.a.72c = bind_name s, %s.param -// CHECK:STDOUT: %b.param: %B = value_param call_param1 -// CHECK:STDOUT: %B.ref: type = name_ref B, file.%B.decl [concrete = constants.%B] -// CHECK:STDOUT: %b: %B = bind_name b, %b.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @A { -// CHECK:STDOUT: %F.decl: %F.type.649 = fn_decl @F.1 [concrete = constants.%F.485] { -// CHECK:STDOUT: %self.patt: %pattern_type.5f8 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.5f8 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc12_8: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %ptr.6db = value_param call_param0 -// CHECK:STDOUT: %.loc12_20: type = splice_block %ptr [concrete = constants.%ptr.6db] { -// CHECK:STDOUT: %A.ref: type = name_ref A, file.%A.decl [concrete = constants.%A] -// CHECK:STDOUT: %ptr: type = ptr_type %A.ref [concrete = constants.%ptr.6db] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self: %ptr.6db = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%A -// CHECK:STDOUT: .A = -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @B { -// CHECK:STDOUT: %A.ref: type = name_ref A, file.%A.decl [concrete = constants.%A] -// CHECK:STDOUT: %.loc16: %B.elem = field_decl a, element0 [concrete] -// CHECK:STDOUT: %struct_type.a: type = struct_type {.a: %A} [concrete = constants.%struct_type.a.72c] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.a [concrete = constants.%complete_type.2b9] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%B -// CHECK:STDOUT: .A = -// CHECK:STDOUT: .a = %.loc16 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F.1(%self.param: %ptr.6db); -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F.2(%s.param: %struct_type.a.72c, %b.param: %B) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %s.ref: %struct_type.a.72c = name_ref s, %s -// CHECK:STDOUT: %.loc28_4.1: %A = struct_access %s.ref, element0 -// CHECK:STDOUT: %F.ref.loc28: %F.type.649 = name_ref F, @A.%F.decl [concrete = constants.%F.485] -// CHECK:STDOUT: %F.bound.loc28: = bound_method %.loc28_4.1, %F.ref.loc28 -// CHECK:STDOUT: %.loc28_4.2: ref %A = temporary_storage -// CHECK:STDOUT: %addr.loc28: %ptr.6db = addr_of %.loc28_4.2 -// CHECK:STDOUT: %F.call.loc28: init %empty_tuple.type = call %F.bound.loc28(%addr.loc28) -// CHECK:STDOUT: %b.ref: %B = name_ref b, %b -// CHECK:STDOUT: %a.ref: %B.elem = name_ref a, @B.%.loc16 [concrete = @B.%.loc16] -// CHECK:STDOUT: %.loc39_4.1: ref %A = class_element_access %b.ref, element0 -// CHECK:STDOUT: %.loc39_4.2: %A = bind_value %.loc39_4.1 -// CHECK:STDOUT: %F.ref.loc39: %F.type.649 = name_ref F, @A.%F.decl [concrete = constants.%F.485] -// CHECK:STDOUT: %F.bound.loc39: = bound_method %.loc39_4.2, %F.ref.loc39 -// CHECK:STDOUT: %.loc39_4.3: ref %A = temporary_storage -// CHECK:STDOUT: %addr.loc39: %ptr.6db = addr_of %.loc39_4.3 -// CHECK:STDOUT: %F.call.loc39: init %empty_tuple.type = call %F.bound.loc39(%addr.loc39) -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/fail_member_of_let.carbon b/toolchain/check/testdata/class/fail_member_of_let.carbon deleted file mode 100644 index e619c03dc13bf..0000000000000 --- a/toolchain/check/testdata/class/fail_member_of_let.carbon +++ /dev/null @@ -1,102 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/fail_member_of_let.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/fail_member_of_let.carbon - -class Class { - fn F() -> i32; -} - -// TODO: Use `:!` here once it is available. -let T: type = Class; - -// The class name is required to be written in the same way as in the class -// declaration. An expression that evaluates to the class name is not accepted. -// CHECK:STDERR: fail_member_of_let.carbon:[[@LINE+7]]:4: error: name qualifiers are only allowed for entities that provide a scope [QualifiedNameInNonScope] -// CHECK:STDERR: fn T.F() {} -// CHECK:STDERR: ^ -// CHECK:STDERR: fail_member_of_let.carbon:[[@LINE-7]]:5: note: referenced non-scope entity declared here [QualifiedNameNonScopeEntity] -// CHECK:STDERR: let T: type = Class; -// CHECK:STDERR: ^ -// CHECK:STDERR: -fn T.F() {} - -// CHECK:STDOUT: --- fail_member_of_let.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Class: type = class_type @Class [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %F.type.f1b: type = fn_type @F.1 [concrete] -// CHECK:STDOUT: %F.1f2: %F.type.f1b = struct_value () [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] -// CHECK:STDOUT: %F.type.b25: type = fn_type @F.2 [concrete] -// CHECK:STDOUT: %F.c41: %F.type.b25 = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Class = %Class.decl -// CHECK:STDOUT: .T = %T -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Class.decl: type = class_decl @Class [concrete = constants.%Class] {} {} -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = binding_pattern T [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %T: type = bind_name T, @__global_init.%Class.ref -// CHECK:STDOUT: %F.decl: %F.type.b25 = fn_decl @F.2 [concrete = constants.%F.c41] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Class { -// CHECK:STDOUT: %F.decl: %F.type.f1b = fn_decl @F.1 [concrete = constants.%F.1f2] { -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param0 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Class -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F.1() -> %i32; -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F.2() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @__global_init() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %Class.ref: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/fail_method.carbon b/toolchain/check/testdata/class/fail_method.carbon deleted file mode 100644 index 662bc9c7cd3ca..0000000000000 --- a/toolchain/check/testdata/class/fail_method.carbon +++ /dev/null @@ -1,142 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/fail_method.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/fail_method.carbon - -class Class { - fn NoSelf(); - fn WithSelf[self: Class](); -} - -alias A = Class.WithSelf; - -fn F(c: Class) { - c.NoSelf(); - c.WithSelf(); - - Class.NoSelf(); - // CHECK:STDERR: fail_method.carbon:[[@LINE+7]]:3: error: missing object argument in method call [MissingObjectInMethodCall] - // CHECK:STDERR: Class.WithSelf(); - // CHECK:STDERR: ^~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_method.carbon:[[@LINE-13]]:3: note: calling function declared here [InCallToFunction] - // CHECK:STDERR: fn WithSelf[self: Class](); - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: - Class.WithSelf(); - // CHECK:STDERR: fail_method.carbon:[[@LINE+7]]:3: error: 1 argument passed to function expecting 0 arguments [CallArgCountMismatch] - // CHECK:STDERR: Class.WithSelf(c); - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_method.carbon:[[@LINE-21]]:3: note: calling function declared here [InCallToEntity] - // CHECK:STDERR: fn WithSelf[self: Class](); - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: - Class.WithSelf(c); - - // CHECK:STDERR: fail_method.carbon:[[@LINE+7]]:3: error: missing object argument in method call [MissingObjectInMethodCall] - // CHECK:STDERR: A(); - // CHECK:STDERR: ^~~ - // CHECK:STDERR: fail_method.carbon:[[@LINE-30]]:3: note: calling function declared here [InCallToFunction] - // CHECK:STDERR: fn WithSelf[self: Class](); - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: - A(); -} - -// CHECK:STDOUT: --- fail_method.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Class: type = class_type @Class [concrete] -// CHECK:STDOUT: %NoSelf.type: type = fn_type @NoSelf [concrete] -// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] -// CHECK:STDOUT: %NoSelf: %NoSelf.type = struct_value () [concrete] -// CHECK:STDOUT: %pattern_type: type = pattern_type %Class [concrete] -// CHECK:STDOUT: %WithSelf.type: type = fn_type @WithSelf [concrete] -// CHECK:STDOUT: %WithSelf: %WithSelf.type = struct_value () [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Class = %Class.decl -// CHECK:STDOUT: .A = %A -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Class.decl: type = class_decl @Class [concrete = constants.%Class] {} {} -// CHECK:STDOUT: %Class.ref: type = name_ref Class, %Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %WithSelf.ref: %WithSelf.type = name_ref WithSelf, @Class.%WithSelf.decl [concrete = constants.%WithSelf] -// CHECK:STDOUT: %A: %WithSelf.type = bind_alias A, @Class.%WithSelf.decl [concrete = constants.%WithSelf] -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %c.patt: %pattern_type = binding_pattern c [concrete] -// CHECK:STDOUT: %c.param_patt: %pattern_type = value_param_pattern %c.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %c.param: %Class = value_param call_param0 -// CHECK:STDOUT: %Class.ref.loc18: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %c: %Class = bind_name c, %c.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Class { -// CHECK:STDOUT: %NoSelf.decl: %NoSelf.type = fn_decl @NoSelf [concrete = constants.%NoSelf] {} {} -// CHECK:STDOUT: %WithSelf.decl: %WithSelf.type = fn_decl @WithSelf [concrete = constants.%WithSelf] { -// CHECK:STDOUT: %self.patt: %pattern_type = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %Class = value_param call_param0 -// CHECK:STDOUT: %Class.ref: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %self: %Class = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Class -// CHECK:STDOUT: .NoSelf = %NoSelf.decl -// CHECK:STDOUT: .Class = -// CHECK:STDOUT: .WithSelf = %WithSelf.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @NoSelf(); -// CHECK:STDOUT: -// CHECK:STDOUT: fn @WithSelf(%self.param: %Class); -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F(%c.param: %Class) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %c.ref.loc19: %Class = name_ref c, %c -// CHECK:STDOUT: %NoSelf.ref.loc19: %NoSelf.type = name_ref NoSelf, @Class.%NoSelf.decl [concrete = constants.%NoSelf] -// CHECK:STDOUT: %NoSelf.call.loc19: init %empty_tuple.type = call %NoSelf.ref.loc19() -// CHECK:STDOUT: %c.ref.loc20: %Class = name_ref c, %c -// CHECK:STDOUT: %WithSelf.ref.loc20: %WithSelf.type = name_ref WithSelf, @Class.%WithSelf.decl [concrete = constants.%WithSelf] -// CHECK:STDOUT: %WithSelf.bound: = bound_method %c.ref.loc20, %WithSelf.ref.loc20 -// CHECK:STDOUT: %WithSelf.call.loc20: init %empty_tuple.type = call %WithSelf.bound(%c.ref.loc20) -// CHECK:STDOUT: %Class.ref.loc22: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %NoSelf.ref.loc22: %NoSelf.type = name_ref NoSelf, @Class.%NoSelf.decl [concrete = constants.%NoSelf] -// CHECK:STDOUT: %NoSelf.call.loc22: init %empty_tuple.type = call %NoSelf.ref.loc22() -// CHECK:STDOUT: %Class.ref.loc30: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %WithSelf.ref.loc30: %WithSelf.type = name_ref WithSelf, @Class.%WithSelf.decl [concrete = constants.%WithSelf] -// CHECK:STDOUT: %WithSelf.call.loc30: init %empty_tuple.type = call %WithSelf.ref.loc30() -// CHECK:STDOUT: %Class.ref.loc38: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %WithSelf.ref.loc38: %WithSelf.type = name_ref WithSelf, @Class.%WithSelf.decl [concrete = constants.%WithSelf] -// CHECK:STDOUT: %c.ref.loc38: %Class = name_ref c, %c -// CHECK:STDOUT: %A.ref: %WithSelf.type = name_ref A, file.%A [concrete = constants.%WithSelf] -// CHECK:STDOUT: %WithSelf.call.loc47: init %empty_tuple.type = call %A.ref() -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/fail_method_modifiers.carbon b/toolchain/check/testdata/class/fail_method_modifiers.carbon deleted file mode 100644 index d1d3a1df99759..0000000000000 --- a/toolchain/check/testdata/class/fail_method_modifiers.carbon +++ /dev/null @@ -1,183 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/fail_method_modifiers.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/fail_method_modifiers.carbon - -class FinalClass { - - // CHECK:STDERR: fail_method_modifiers.carbon:[[@LINE+7]]:3: error: `abstract` not allowed; requires `abstract` class scope [ModifierAbstractNotAllowed] - // CHECK:STDERR: abstract fn Abstract[self: Self](); - // CHECK:STDERR: ^~~~~~~~ - // CHECK:STDERR: fail_method_modifiers.carbon:[[@LINE-5]]:1: note: containing definition here [ModifierNotInContext] - // CHECK:STDERR: class FinalClass { - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: - abstract fn Abstract[self: Self](); - - // CHECK:STDERR: fail_method_modifiers.carbon:[[@LINE+7]]:3: error: `virtual` not allowed; requires `abstract` or `base` class scope [ModifierVirtualNotAllowed] - // CHECK:STDERR: virtual fn Virtual[self: Self](); - // CHECK:STDERR: ^~~~~~~ - // CHECK:STDERR: fail_method_modifiers.carbon:[[@LINE-14]]:1: note: containing definition here [ModifierNotInContext] - // CHECK:STDERR: class FinalClass { - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: - virtual fn Virtual[self: Self](); -} - -abstract class AbstractClass { - - // CHECK:STDERR: fail_method_modifiers.carbon:[[@LINE+4]]:3: error: `default` not allowed; requires interface scope [ModifierRequiresInterface] - // CHECK:STDERR: default fn Default[self: Self](); - // CHECK:STDERR: ^~~~~~~ - // CHECK:STDERR: - default fn Default[self: Self](); - - // CHECK:STDERR: fail_method_modifiers.carbon:[[@LINE+4]]:3: error: `final` not allowed; requires interface scope [ModifierRequiresInterface] - // CHECK:STDERR: final fn Final[self: Self](); - // CHECK:STDERR: ^~~~~ - // CHECK:STDERR: - final fn Final[self: Self](); -} - -base class BaseClass { - - // CHECK:STDERR: fail_method_modifiers.carbon:[[@LINE+7]]:3: error: `abstract` not allowed; requires `abstract` class scope [ModifierAbstractNotAllowed] - // CHECK:STDERR: abstract fn Abstract[self: Self](); - // CHECK:STDERR: ^~~~~~~~ - // CHECK:STDERR: fail_method_modifiers.carbon:[[@LINE-5]]:1: note: containing definition here [ModifierNotInContext] - // CHECK:STDERR: base class BaseClass { - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: - abstract fn Abstract[self: Self](); -} - -// CHECK:STDOUT: --- fail_method_modifiers.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %FinalClass: type = class_type @FinalClass [concrete] -// CHECK:STDOUT: %pattern_type.c62: type = pattern_type %FinalClass [concrete] -// CHECK:STDOUT: %Abstract.type.c3e: type = fn_type @Abstract.1 [concrete] -// CHECK:STDOUT: %Abstract.d21: %Abstract.type.c3e = struct_value () [concrete] -// CHECK:STDOUT: %Virtual.type: type = fn_type @Virtual [concrete] -// CHECK:STDOUT: %Virtual: %Virtual.type = struct_value () [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %AbstractClass: type = class_type @AbstractClass [concrete] -// CHECK:STDOUT: %pattern_type.8b7: type = pattern_type %AbstractClass [concrete] -// CHECK:STDOUT: %Default.type: type = fn_type @Default [concrete] -// CHECK:STDOUT: %Default: %Default.type = struct_value () [concrete] -// CHECK:STDOUT: %Final.type: type = fn_type @Final [concrete] -// CHECK:STDOUT: %Final: %Final.type = struct_value () [concrete] -// CHECK:STDOUT: %BaseClass: type = class_type @BaseClass [concrete] -// CHECK:STDOUT: %pattern_type.cd0: type = pattern_type %BaseClass [concrete] -// CHECK:STDOUT: %Abstract.type.de1: type = fn_type @Abstract.2 [concrete] -// CHECK:STDOUT: %Abstract.af0: %Abstract.type.de1 = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .FinalClass = %FinalClass.decl -// CHECK:STDOUT: .AbstractClass = %AbstractClass.decl -// CHECK:STDOUT: .BaseClass = %BaseClass.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %FinalClass.decl: type = class_decl @FinalClass [concrete = constants.%FinalClass] {} {} -// CHECK:STDOUT: %AbstractClass.decl: type = class_decl @AbstractClass [concrete = constants.%AbstractClass] {} {} -// CHECK:STDOUT: %BaseClass.decl: type = class_decl @BaseClass [concrete = constants.%BaseClass] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @FinalClass { -// CHECK:STDOUT: %Abstract.decl: %Abstract.type.c3e = fn_decl @Abstract.1 [concrete = constants.%Abstract.d21] { -// CHECK:STDOUT: %self.patt: %pattern_type.c62 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.c62 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %FinalClass = value_param call_param0 -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%FinalClass [concrete = constants.%FinalClass] -// CHECK:STDOUT: %self: %FinalClass = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %Virtual.decl: %Virtual.type = fn_decl @Virtual [concrete = constants.%Virtual] { -// CHECK:STDOUT: %self.patt: %pattern_type.c62 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.c62 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %FinalClass = value_param call_param0 -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%FinalClass [concrete = constants.%FinalClass] -// CHECK:STDOUT: %self: %FinalClass = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%FinalClass -// CHECK:STDOUT: .Abstract = %Abstract.decl -// CHECK:STDOUT: .Virtual = %Virtual.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @AbstractClass { -// CHECK:STDOUT: %Default.decl: %Default.type = fn_decl @Default [concrete = constants.%Default] { -// CHECK:STDOUT: %self.patt: %pattern_type.8b7 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.8b7 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %AbstractClass = value_param call_param0 -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%AbstractClass [concrete = constants.%AbstractClass] -// CHECK:STDOUT: %self: %AbstractClass = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %Final.decl: %Final.type = fn_decl @Final [concrete = constants.%Final] { -// CHECK:STDOUT: %self.patt: %pattern_type.8b7 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.8b7 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %AbstractClass = value_param call_param0 -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%AbstractClass [concrete = constants.%AbstractClass] -// CHECK:STDOUT: %self: %AbstractClass = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%AbstractClass -// CHECK:STDOUT: .Default = %Default.decl -// CHECK:STDOUT: .Final = %Final.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @BaseClass { -// CHECK:STDOUT: %Abstract.decl: %Abstract.type.de1 = fn_decl @Abstract.2 [concrete = constants.%Abstract.af0] { -// CHECK:STDOUT: %self.patt: %pattern_type.cd0 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.cd0 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %BaseClass = value_param call_param0 -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%BaseClass [concrete = constants.%BaseClass] -// CHECK:STDOUT: %self: %BaseClass = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%BaseClass -// CHECK:STDOUT: .Abstract = %Abstract.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Abstract.1(%self.param: %FinalClass); -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Virtual(%self.param: %FinalClass); -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Default(%self.param: %AbstractClass); -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Final(%self.param: %AbstractClass); -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Abstract.2(%self.param: %BaseClass); -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/fail_method_redefinition.carbon b/toolchain/check/testdata/class/fail_method_redefinition.carbon deleted file mode 100644 index ea256cd7e0eac..0000000000000 --- a/toolchain/check/testdata/class/fail_method_redefinition.carbon +++ /dev/null @@ -1,72 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/fail_method_redefinition.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/fail_method_redefinition.carbon - -class Class { - fn F() {} - // CHECK:STDERR: fail_method_redefinition.carbon:[[@LINE+7]]:3: error: redefinition of `fn F` [RedeclRedef] - // CHECK:STDERR: fn F() {} - // CHECK:STDERR: ^~~~~~~~ - // CHECK:STDERR: fail_method_redefinition.carbon:[[@LINE-4]]:3: note: previously defined here [RedeclPrevDef] - // CHECK:STDERR: fn F() {} - // CHECK:STDERR: ^~~~~~~~ - // CHECK:STDERR: - fn F() {} -} - -// CHECK:STDOUT: --- fail_method_redefinition.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Class: type = class_type @Class [concrete] -// CHECK:STDOUT: %F.type.f1baa3.1: type = fn_type @F.1 [concrete] -// CHECK:STDOUT: %F.1f2582.1: %F.type.f1baa3.1 = struct_value () [concrete] -// CHECK:STDOUT: %F.type.f1baa3.2: type = fn_type @F.2 [concrete] -// CHECK:STDOUT: %F.1f2582.2: %F.type.f1baa3.2 = struct_value () [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Class = %Class.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Class.decl: type = class_decl @Class [concrete = constants.%Class] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Class { -// CHECK:STDOUT: %F.decl.loc12: %F.type.f1baa3.1 = fn_decl @F.1 [concrete = constants.%F.1f2582.1] {} {} -// CHECK:STDOUT: %F.decl.loc20: %F.type.f1baa3.2 = fn_decl @F.2 [concrete = constants.%F.1f2582.2] {} {} -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Class -// CHECK:STDOUT: .F = %F.decl.loc12 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F.1() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F.2() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/fail_modifiers.carbon b/toolchain/check/testdata/class/fail_modifiers.carbon deleted file mode 100644 index aceb574ca1a6a..0000000000000 --- a/toolchain/check/testdata/class/fail_modifiers.carbon +++ /dev/null @@ -1,246 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/fail_modifiers.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/fail_modifiers.carbon - -// CHECK:STDERR: fail_modifiers.carbon:[[@LINE+7]]:9: error: `private` repeated on declaration [ModifierRepeated] -// CHECK:STDERR: private private class DuplicatePrivate; -// CHECK:STDERR: ^~~~~~~ -// CHECK:STDERR: fail_modifiers.carbon:[[@LINE+4]]:1: note: `private` previously appeared here [ModifierPrevious] -// CHECK:STDERR: private private class DuplicatePrivate; -// CHECK:STDERR: ^~~~~~~ -// CHECK:STDERR: -private private class DuplicatePrivate; - -// CHECK:STDERR: fail_modifiers.carbon:[[@LINE+4]]:1: error: `abstract` not allowed on `class` forward declaration, only definition [ModifierOnlyAllowedOnDefinition] -// CHECK:STDERR: abstract class AbstractDecl; -// CHECK:STDERR: ^~~~~~~~ -// CHECK:STDERR: -abstract class AbstractDecl; - -// CHECK:STDERR: fail_modifiers.carbon:[[@LINE+7]]:9: error: `protected` not allowed on declaration with `private` [ModifierNotAllowedWith] -// CHECK:STDERR: private protected class TwoAccess; -// CHECK:STDERR: ^~~~~~~~~ -// CHECK:STDERR: fail_modifiers.carbon:[[@LINE+4]]:1: note: `private` previously appeared here [ModifierPrevious] -// CHECK:STDERR: private protected class TwoAccess; -// CHECK:STDERR: ^~~~~~~ -// CHECK:STDERR: -private protected class TwoAccess; - -// CHECK:STDERR: fail_modifiers.carbon:[[@LINE+4]]:1: error: `base` not allowed on `class` forward declaration, only definition [ModifierOnlyAllowedOnDefinition] -// CHECK:STDERR: base class BaseDecl; -// CHECK:STDERR: ^~~~ -// CHECK:STDERR: -base class BaseDecl; - -// CHECK:STDERR: fail_modifiers.carbon:[[@LINE+7]]:10: error: `abstract` repeated on declaration [ModifierRepeated] -// CHECK:STDERR: abstract abstract class TwoAbstract { } -// CHECK:STDERR: ^~~~~~~~ -// CHECK:STDERR: fail_modifiers.carbon:[[@LINE+4]]:1: note: `abstract` previously appeared here [ModifierPrevious] -// CHECK:STDERR: abstract abstract class TwoAbstract { } -// CHECK:STDERR: ^~~~~~~~ -// CHECK:STDERR: -abstract abstract class TwoAbstract { } - -// CHECK:STDERR: fail_modifiers.carbon:[[@LINE+15]]:19: error: `base` not allowed on declaration with `virtual` [ModifierNotAllowedWith] -// CHECK:STDERR: protected virtual base class Virtual {} -// CHECK:STDERR: ^~~~ -// CHECK:STDERR: fail_modifiers.carbon:[[@LINE+12]]:11: note: `virtual` previously appeared here [ModifierPrevious] -// CHECK:STDERR: protected virtual base class Virtual {} -// CHECK:STDERR: ^~~~~~~ -// CHECK:STDERR: -// CHECK:STDERR: fail_modifiers.carbon:[[@LINE+8]]:1: error: `protected` not allowed; requires class scope [ModifierProtectedNotAllowed] -// CHECK:STDERR: protected virtual base class Virtual {} -// CHECK:STDERR: ^~~~~~~~~ -// CHECK:STDERR: -// CHECK:STDERR: fail_modifiers.carbon:[[@LINE+4]]:11: error: `virtual` not allowed on `class` declaration [ModifierNotAllowedOnDeclaration] -// CHECK:STDERR: protected virtual base class Virtual {} -// CHECK:STDERR: ^~~~~~~ -// CHECK:STDERR: -protected virtual base class Virtual {} - -// CHECK:STDERR: fail_modifiers.carbon:[[@LINE+7]]:10: error: `protected` must appear before `abstract` [ModifierMustAppearBefore] -// CHECK:STDERR: abstract protected class WrongOrder { } -// CHECK:STDERR: ^~~~~~~~~ -// CHECK:STDERR: fail_modifiers.carbon:[[@LINE+4]]:1: note: `abstract` previously appeared here [ModifierPrevious] -// CHECK:STDERR: abstract protected class WrongOrder { } -// CHECK:STDERR: ^~~~~~~~ -// CHECK:STDERR: -abstract protected class WrongOrder { } - -// CHECK:STDERR: fail_modifiers.carbon:[[@LINE+7]]:10: error: `base` not allowed on declaration with `abstract` [ModifierNotAllowedWith] -// CHECK:STDERR: abstract base class AbstractAndBase {} -// CHECK:STDERR: ^~~~ -// CHECK:STDERR: fail_modifiers.carbon:[[@LINE+4]]:1: note: `abstract` previously appeared here [ModifierPrevious] -// CHECK:STDERR: abstract base class AbstractAndBase {} -// CHECK:STDERR: ^~~~~~~~ -// CHECK:STDERR: -abstract base class AbstractAndBase {} - -abstract class AbstractWithDefinition { - // CHECK:STDERR: fail_modifiers.carbon:[[@LINE+4]]:31: error: definition of `abstract` function [DefinedAbstractFunction] - // CHECK:STDERR: abstract fn F[self: Self]() {} - // CHECK:STDERR: ^ - // CHECK:STDERR: - abstract fn F[self: Self]() {} - abstract fn G[self: Self](); -} -// CHECK:STDERR: fail_modifiers.carbon:[[@LINE+4]]:43: error: definition of `abstract` function [DefinedAbstractFunction] -// CHECK:STDERR: fn AbstractWithDefinition.G[self: Self]() { -// CHECK:STDERR: ^ -// CHECK:STDERR: -fn AbstractWithDefinition.G[self: Self]() { -} - -// CHECK:STDOUT: --- fail_modifiers.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %DuplicatePrivate: type = class_type @DuplicatePrivate [concrete] -// CHECK:STDOUT: %AbstractDecl: type = class_type @AbstractDecl [concrete] -// CHECK:STDOUT: %TwoAccess: type = class_type @TwoAccess [concrete] -// CHECK:STDOUT: %BaseDecl: type = class_type @BaseDecl [concrete] -// CHECK:STDOUT: %TwoAbstract: type = class_type @TwoAbstract [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %Virtual: type = class_type @Virtual [concrete] -// CHECK:STDOUT: %WrongOrder: type = class_type @WrongOrder [concrete] -// CHECK:STDOUT: %AbstractAndBase: type = class_type @AbstractAndBase [concrete] -// CHECK:STDOUT: %AbstractWithDefinition: type = class_type @AbstractWithDefinition [concrete] -// CHECK:STDOUT: %pattern_type: type = pattern_type %AbstractWithDefinition [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %G.type: type = fn_type @G [concrete] -// CHECK:STDOUT: %G: %G.type = struct_value () [concrete] -// CHECK:STDOUT: %ptr.454: type = ptr_type [concrete] -// CHECK:STDOUT: %.9a5: = vtable (%F, %G) [concrete] -// CHECK:STDOUT: %struct_type.vptr: type = struct_type {.: %ptr.454} [concrete] -// CHECK:STDOUT: %complete_type.513: = complete_type_witness %struct_type.vptr [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .DuplicatePrivate [private] = %DuplicatePrivate.decl -// CHECK:STDOUT: .AbstractDecl = %AbstractDecl.decl -// CHECK:STDOUT: .TwoAccess [private] = %TwoAccess.decl -// CHECK:STDOUT: .BaseDecl = %BaseDecl.decl -// CHECK:STDOUT: .TwoAbstract = %TwoAbstract.decl -// CHECK:STDOUT: .Virtual = %Virtual.decl -// CHECK:STDOUT: .WrongOrder = %WrongOrder.decl -// CHECK:STDOUT: .AbstractAndBase = %AbstractAndBase.decl -// CHECK:STDOUT: .AbstractWithDefinition = %AbstractWithDefinition.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %DuplicatePrivate.decl: type = class_decl @DuplicatePrivate [concrete = constants.%DuplicatePrivate] {} {} -// CHECK:STDOUT: %AbstractDecl.decl: type = class_decl @AbstractDecl [concrete = constants.%AbstractDecl] {} {} -// CHECK:STDOUT: %TwoAccess.decl: type = class_decl @TwoAccess [concrete = constants.%TwoAccess] {} {} -// CHECK:STDOUT: %BaseDecl.decl: type = class_decl @BaseDecl [concrete = constants.%BaseDecl] {} {} -// CHECK:STDOUT: %TwoAbstract.decl: type = class_decl @TwoAbstract [concrete = constants.%TwoAbstract] {} {} -// CHECK:STDOUT: %Virtual.decl: type = class_decl @Virtual [concrete = constants.%Virtual] {} {} -// CHECK:STDOUT: %WrongOrder.decl: type = class_decl @WrongOrder [concrete = constants.%WrongOrder] {} {} -// CHECK:STDOUT: %AbstractAndBase.decl: type = class_decl @AbstractAndBase [concrete = constants.%AbstractAndBase] {} {} -// CHECK:STDOUT: %AbstractWithDefinition.decl: type = class_decl @AbstractWithDefinition [concrete = constants.%AbstractWithDefinition] {} {} -// CHECK:STDOUT: %G.decl: %G.type = fn_decl @G [concrete = constants.%G] { -// CHECK:STDOUT: %self.patt: %pattern_type = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param.loc97: %AbstractWithDefinition = value_param call_param0 -// CHECK:STDOUT: %Self.ref.loc97: type = name_ref Self, constants.%AbstractWithDefinition [concrete = constants.%AbstractWithDefinition] -// CHECK:STDOUT: %self.loc97: %AbstractWithDefinition = bind_name self, %self.param.loc97 -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @DuplicatePrivate; -// CHECK:STDOUT: -// CHECK:STDOUT: class @AbstractDecl; -// CHECK:STDOUT: -// CHECK:STDOUT: class @TwoAccess; -// CHECK:STDOUT: -// CHECK:STDOUT: class @BaseDecl; -// CHECK:STDOUT: -// CHECK:STDOUT: class @TwoAbstract { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%TwoAbstract -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Virtual { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Virtual -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @WrongOrder { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%WrongOrder -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @AbstractAndBase { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%AbstractAndBase -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @AbstractWithDefinition { -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %self.patt: %pattern_type = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %AbstractWithDefinition = value_param call_param0 -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%AbstractWithDefinition [concrete = constants.%AbstractWithDefinition] -// CHECK:STDOUT: %self: %AbstractWithDefinition = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %G.decl: %G.type = fn_decl @G [concrete = constants.%G] { -// CHECK:STDOUT: %self.patt: %pattern_type = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param.loc91: %AbstractWithDefinition = value_param call_param0 -// CHECK:STDOUT: %Self.ref.loc91: type = name_ref Self, constants.%AbstractWithDefinition [concrete = constants.%AbstractWithDefinition] -// CHECK:STDOUT: %self.loc91: %AbstractWithDefinition = bind_name self, %self.param.loc91 -// CHECK:STDOUT: } -// CHECK:STDOUT: %.loc92: = vtable (%F.decl, %G.decl) [concrete = constants.%.9a5] -// CHECK:STDOUT: %struct_type.vptr: type = struct_type {.: %ptr.454} [concrete = constants.%struct_type.vptr] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.vptr [concrete = constants.%complete_type.513] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%AbstractWithDefinition -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: .G = %G.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: abstract fn @F(%self.param: %AbstractWithDefinition) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: abstract fn @G(%self.param.loc97: %AbstractWithDefinition) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/fail_out_of_line_decl.carbon b/toolchain/check/testdata/class/fail_out_of_line_decl.carbon deleted file mode 100644 index 85b7d642a6429..0000000000000 --- a/toolchain/check/testdata/class/fail_out_of_line_decl.carbon +++ /dev/null @@ -1,60 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/fail_out_of_line_decl.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/fail_out_of_line_decl.carbon - -class C {} - -// CHECK:STDERR: fail_out_of_line_decl.carbon:[[@LINE+4]]:6: error: out-of-line declaration requires a declaration in scoped entity [QualifiedDeclOutsideScopeEntity] -// CHECK:STDERR: fn C.F() {} -// CHECK:STDERR: ^ -// CHECK:STDERR: -fn C.F() {} - -// CHECK:STDOUT: --- fail_out_of_line_decl.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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: .F = file.%F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/fail_redeclaration_scope.carbon b/toolchain/check/testdata/class/fail_redeclaration_scope.carbon deleted file mode 100644 index e2b2cd3ee1caa..0000000000000 --- a/toolchain/check/testdata/class/fail_redeclaration_scope.carbon +++ /dev/null @@ -1,127 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/fail_redeclaration_scope.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/fail_redeclaration_scope.carbon - -class A; - -class X { - // OK, a different A. - class A { class B; } - class A.B {} -} - -class A { class B; } - -class Y { - // CHECK:STDERR: fail_redeclaration_scope.carbon:[[@LINE+4]]:9: error: name `A` not found [NameNotFound] - // CHECK:STDERR: class A.B {} - // CHECK:STDERR: ^ - // CHECK:STDERR: - class A.B {} -} - -// CHECK:STDOUT: --- fail_redeclaration_scope.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %A.466: type = class_type @A.1 [concrete] -// CHECK:STDOUT: %X: type = class_type @X [concrete] -// CHECK:STDOUT: %A.197: type = class_type @A.2 [concrete] -// CHECK:STDOUT: %B.d5b: type = class_type @B.1 [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %B.29a: type = class_type @B.2 [concrete] -// CHECK:STDOUT: %Y: type = class_type @Y [concrete] -// CHECK:STDOUT: %B.768: type = class_type @B.3 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .A = %A.decl.loc11 -// CHECK:STDOUT: .X = %X.decl -// CHECK:STDOUT: .Y = %Y.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %A.decl.loc11: type = class_decl @A.1 [concrete = constants.%A.466] {} {} -// CHECK:STDOUT: %X.decl: type = class_decl @X [concrete = constants.%X] {} {} -// CHECK:STDOUT: %A.decl.loc19: type = class_decl @A.1 [concrete = constants.%A.466] {} {} -// CHECK:STDOUT: %Y.decl: type = class_decl @Y [concrete = constants.%Y] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @A.1 { -// CHECK:STDOUT: %B.decl: type = class_decl @B.2 [concrete = constants.%B.29a] {} {} -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%A.466 -// CHECK:STDOUT: .B = %B.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @X { -// CHECK:STDOUT: %A.decl: type = class_decl @A.2 [concrete = constants.%A.197] {} {} -// CHECK:STDOUT: %B.decl: type = class_decl @B.1 [concrete = constants.%B.d5b] {} {} -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%X -// CHECK:STDOUT: .A = %A.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @A.2 { -// CHECK:STDOUT: %B.decl: type = class_decl @B.1 [concrete = constants.%B.d5b] {} {} -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%A.197 -// CHECK:STDOUT: .B = %B.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @B.1 { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%B.d5b -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @B.2; -// CHECK:STDOUT: -// CHECK:STDOUT: class @Y { -// CHECK:STDOUT: %B.decl: type = class_decl @B.3 [concrete = constants.%B.768] {} {} -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Y -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @B.3 { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%B.768 -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/fail_redefinition.carbon b/toolchain/check/testdata/class/fail_redefinition.carbon deleted file mode 100644 index 1a1acdd9fe186..0000000000000 --- a/toolchain/check/testdata/class/fail_redefinition.carbon +++ /dev/null @@ -1,156 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/fail_redefinition.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/fail_redefinition.carbon - -class Class { - fn F(); - fn H(); - fn I() {} -} - -// CHECK:STDERR: fail_redefinition.carbon:[[@LINE+7]]:1: error: redefinition of `class Class` [RedeclRedef] -// CHECK:STDERR: class Class { -// CHECK:STDERR: ^~~~~~~~~~~~~ -// CHECK:STDERR: fail_redefinition.carbon:[[@LINE-9]]:1: note: previously defined here [RedeclPrevDef] -// CHECK:STDERR: class Class { -// CHECK:STDERR: ^~~~~~~~~~~~~ -// CHECK:STDERR: -class Class { - fn G(); - fn H(); - fn I() {} -} - -fn Class.F() {} -// CHECK:STDERR: fail_redefinition.carbon:[[@LINE+4]]:10: error: out-of-line declaration requires a declaration in scoped entity [QualifiedDeclOutsideScopeEntity] -// CHECK:STDERR: fn Class.G() {} -// CHECK:STDERR: ^ -// CHECK:STDERR: -fn Class.G() {} -fn Class.H() {} -// CHECK:STDERR: fail_redefinition.carbon:[[@LINE+7]]:1: error: redefinition of `fn I` [RedeclRedef] -// CHECK:STDERR: fn Class.I() {} -// CHECK:STDERR: ^~~~~~~~~~~~~~ -// CHECK:STDERR: fail_redefinition.carbon:[[@LINE-26]]:3: note: previously defined here [RedeclPrevDef] -// CHECK:STDERR: fn I() {} -// CHECK:STDERR: ^~~~~~~~ -// CHECK:STDERR: -fn Class.I() {} - -// CHECK:STDOUT: --- fail_redefinition.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Class.301e72.1: type = class_type @Class.1 [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %H.type.91d18a.1: type = fn_type @H.1 [concrete] -// CHECK:STDOUT: %H.d38c33.1: %H.type.91d18a.1 = struct_value () [concrete] -// CHECK:STDOUT: %I.type.2b6c8d.1: type = fn_type @I.1 [concrete] -// CHECK:STDOUT: %I.c9aec9.1: %I.type.2b6c8d.1 = struct_value () [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %Class.301e72.2: type = class_type @Class.2 [concrete] -// CHECK:STDOUT: %G.type.621c12.1: type = fn_type @G.1 [concrete] -// CHECK:STDOUT: %G.f0cac0.1: %G.type.621c12.1 = struct_value () [concrete] -// CHECK:STDOUT: %H.type.91d18a.2: type = fn_type @H.2 [concrete] -// CHECK:STDOUT: %H.d38c33.2: %H.type.91d18a.2 = struct_value () [concrete] -// CHECK:STDOUT: %I.type.2b6c8d.2: type = fn_type @I.2 [concrete] -// CHECK:STDOUT: %I.c9aec9.2: %I.type.2b6c8d.2 = struct_value () [concrete] -// CHECK:STDOUT: %G.type.621c12.2: type = fn_type @G.2 [concrete] -// CHECK:STDOUT: %G.f0cac0.2: %G.type.621c12.2 = struct_value () [concrete] -// CHECK:STDOUT: %I.type.2b6c8d.3: type = fn_type @I.3 [concrete] -// CHECK:STDOUT: %I.c9aec9.3: %I.type.2b6c8d.3 = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Class = %Class.decl.loc11 -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Class.decl.loc11: type = class_decl @Class.1 [concrete = constants.%Class.301e72.1] {} {} -// CHECK:STDOUT: %Class.decl.loc24: type = class_decl @Class.2 [concrete = constants.%Class.301e72.2] {} {} -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] {} {} -// CHECK:STDOUT: %G.decl: %G.type.621c12.2 = fn_decl @G.2 [concrete = constants.%G.f0cac0.2] {} {} -// CHECK:STDOUT: %H.decl: %H.type.91d18a.1 = fn_decl @H.1 [concrete = constants.%H.d38c33.1] {} {} -// CHECK:STDOUT: %I.decl: %I.type.2b6c8d.3 = fn_decl @I.3 [concrete = constants.%I.c9aec9.3] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Class.1 { -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] {} {} -// CHECK:STDOUT: %H.decl: %H.type.91d18a.1 = fn_decl @H.1 [concrete = constants.%H.d38c33.1] {} {} -// CHECK:STDOUT: %I.decl: %I.type.2b6c8d.1 = fn_decl @I.1 [concrete = constants.%I.c9aec9.1] {} {} -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Class.301e72.1 -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: .H = %H.decl -// CHECK:STDOUT: .I = %I.decl -// CHECK:STDOUT: .G = file.%G.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Class.2 { -// CHECK:STDOUT: %G.decl: %G.type.621c12.1 = fn_decl @G.1 [concrete = constants.%G.f0cac0.1] {} {} -// CHECK:STDOUT: %H.decl: %H.type.91d18a.2 = fn_decl @H.2 [concrete = constants.%H.d38c33.2] {} {} -// CHECK:STDOUT: %I.decl: %I.type.2b6c8d.2 = fn_decl @I.2 [concrete = constants.%I.c9aec9.2] {} {} -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Class.301e72.2 -// CHECK:STDOUT: .G = %G.decl -// CHECK:STDOUT: .H = %H.decl -// CHECK:STDOUT: .I = %I.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @H.1() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @I.1() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @G.1(); -// CHECK:STDOUT: -// CHECK:STDOUT: fn @H.2(); -// CHECK:STDOUT: -// CHECK:STDOUT: fn @I.2() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @G.2() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @I.3() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/fail_scope.carbon b/toolchain/check/testdata/class/fail_scope.carbon deleted file mode 100644 index 05081244ae96e..0000000000000 --- a/toolchain/check/testdata/class/fail_scope.carbon +++ /dev/null @@ -1,129 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/fail_scope.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/fail_scope.carbon - -class Class { - fn F() -> i32 { - return 1; - } -} - -fn G() -> i32 { - // CHECK:STDERR: fail_scope.carbon:[[@LINE+4]]:10: error: name `F` not found [NameNotFound] - // CHECK:STDERR: return F(); - // CHECK:STDERR: ^ - // CHECK:STDERR: - return F(); -} - -// CHECK:STDOUT: --- fail_scope.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Class: type = class_type @Class [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %int_1.5b8: Core.IntLiteral = int_value 1 [concrete] -// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.type.205: type = facet_type <@ImplicitAs, @ImplicitAs(%i32)> [concrete] -// CHECK:STDOUT: %Convert.type.1b6: type = fn_type @Convert.1, @ImplicitAs(%i32) [concrete] -// CHECK:STDOUT: %To.c80: Core.IntLiteral = bind_symbolic_name To, 0 [symbolic] -// CHECK:STDOUT: %Convert.type.0f9: type = fn_type @Convert.2, @impl.4f9(%To.c80) [symbolic] -// CHECK:STDOUT: %Convert.f06: %Convert.type.0f9 = struct_value () [symbolic] -// CHECK:STDOUT: %ImplicitAs.impl_witness.c75: = impl_witness imports.%ImplicitAs.impl_witness_table.a2f, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.type.035: type = fn_type @Convert.2, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.956: %Convert.type.035 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.facet: %ImplicitAs.type.205 = facet_value Core.IntLiteral, (%ImplicitAs.impl_witness.c75) [concrete] -// CHECK:STDOUT: %.9c3: type = fn_type_with_self_type %Convert.type.1b6, %ImplicitAs.facet [concrete] -// CHECK:STDOUT: %Convert.bound: = bound_method %int_1.5b8, %Convert.956 [concrete] -// CHECK:STDOUT: %Convert.specific_fn: = specific_function %Convert.956, @Convert.2(%int_32) [concrete] -// CHECK:STDOUT: %bound_method: = bound_method %int_1.5b8, %Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_1.5d2: %i32 = int_value 1 [concrete] -// CHECK:STDOUT: %G.type: type = fn_type @G [concrete] -// CHECK:STDOUT: %G: %G.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/operators/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] -// CHECK:STDOUT: %Core.import_ref.a5b: @impl.4f9.%Convert.type (%Convert.type.0f9) = import_ref Core//prelude/types/int, loc19_39, loaded [symbolic = @impl.4f9.%Convert (constants.%Convert.f06)] -// CHECK:STDOUT: %ImplicitAs.impl_witness_table.a2f = impl_witness_table (%Core.import_ref.a5b), @impl.4f9 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Class = %Class.decl -// CHECK:STDOUT: .G = %G.decl -// CHECK:STDOUT: .F = -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Class.decl: type = class_decl @Class [concrete = constants.%Class] {} {} -// CHECK:STDOUT: %G.decl: %G.type = fn_decl @G [concrete = constants.%G] { -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param0 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Class { -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param0 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Class -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F() -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %int_1: Core.IntLiteral = int_value 1 [concrete = constants.%int_1.5b8] -// CHECK:STDOUT: %impl.elem0: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc13_13.1: = bound_method %int_1, %impl.elem0 [concrete = constants.%Convert.bound] -// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc13_13.2: = bound_method %int_1, %specific_fn [concrete = constants.%bound_method] -// CHECK:STDOUT: %int.convert_checked: init %i32 = call %bound_method.loc13_13.2(%int_1) [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %.loc13_13.1: %i32 = value_of_initializer %int.convert_checked [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %.loc13_13.2: %i32 = converted %int_1, %.loc13_13.1 [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: return %.loc13_13.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @G() -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %F.ref: = name_ref F, [concrete = ] -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/fail_self.carbon b/toolchain/check/testdata/class/fail_self.carbon deleted file mode 100644 index 2b878ea0b7a4c..0000000000000 --- a/toolchain/check/testdata/class/fail_self.carbon +++ /dev/null @@ -1,202 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/fail_self.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/fail_self.carbon - -class Class { - // CHECK:STDERR: fail_self.carbon:[[@LINE+4]]:8: error: `self` can only be declared in an implicit parameter list [SelfOutsideImplicitParamList] - // CHECK:STDERR: fn F(self: Self); - // CHECK:STDERR: ^~~~~~~~~~ - // CHECK:STDERR: - fn F(self: Self); - - fn G() -> Self; -} - -// CHECK:STDERR: fail_self.carbon:[[@LINE+4]]:12: error: `self` can only be declared in an implicit parameter list [SelfOutsideImplicitParamList] -// CHECK:STDERR: fn Class.F(self: Self) { -// CHECK:STDERR: ^~~~~~~~~~ -// CHECK:STDERR: -fn Class.F(self: Self) { -} - -fn Class.G() -> Self { - // CHECK:STDERR: fail_self.carbon:[[@LINE+4]]:7: error: `self` can only be declared in an implicit parameter list [SelfOutsideImplicitParamList] - // CHECK:STDERR: var self: Self; - // CHECK:STDERR: ^~~~~~~~~~ - // CHECK:STDERR: - var self: Self; - // CHECK:STDERR: fail_self.carbon:[[@LINE+4]]:10: error: cannot copy value of type `Class` [CopyOfUncopyableType] - // CHECK:STDERR: return self; - // CHECK:STDERR: ^~~~ - // CHECK:STDERR: - return self; -} - -class WrongSelf { - fn F[self: Class](); -} - -fn CallWrongSelf(ws: WrongSelf) { - // CHECK:STDERR: fail_self.carbon:[[@LINE+10]]:3: error: cannot implicitly convert expression of type `WrongSelf` to `Class` [ConversionFailure] - // CHECK:STDERR: ws.F(); - // CHECK:STDERR: ^~ - // CHECK:STDERR: fail_self.carbon:[[@LINE+7]]:3: note: type `WrongSelf` does not implement interface `Core.ImplicitAs(Class)` [MissingImplInMemberAccessNote] - // CHECK:STDERR: ws.F(); - // CHECK:STDERR: ^~ - // CHECK:STDERR: fail_self.carbon:[[@LINE-10]]:8: note: initializing function parameter [InCallToFunctionParam] - // CHECK:STDERR: fn F[self: Class](); - // CHECK:STDERR: ^~~~~~~~~~~ - // CHECK:STDERR: - ws.F(); -} - -// CHECK:STDOUT: --- fail_self.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Class: type = class_type @Class [concrete] -// CHECK:STDOUT: %pattern_type.761: type = pattern_type %Class [concrete] -// CHECK:STDOUT: %F.type.f1b: type = fn_type @F.1 [concrete] -// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] -// CHECK:STDOUT: %F.1f2: %F.type.f1b = struct_value () [concrete] -// CHECK:STDOUT: %G.type: type = fn_type @G [concrete] -// CHECK:STDOUT: %G: %G.type = struct_value () [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %WrongSelf: type = class_type @WrongSelf [concrete] -// CHECK:STDOUT: %F.type.25f: type = fn_type @F.2 [concrete] -// CHECK:STDOUT: %F.3a3: %F.type.25f = struct_value () [concrete] -// CHECK:STDOUT: %pattern_type.381: type = pattern_type %WrongSelf [concrete] -// CHECK:STDOUT: %CallWrongSelf.type: type = fn_type @CallWrongSelf [concrete] -// CHECK:STDOUT: %CallWrongSelf: %CallWrongSelf.type = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/operators/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Class = %Class.decl -// CHECK:STDOUT: .WrongSelf = %WrongSelf.decl -// CHECK:STDOUT: .CallWrongSelf = %CallWrongSelf.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Class.decl: type = class_decl @Class [concrete = constants.%Class] {} {} -// CHECK:STDOUT: %F.decl: %F.type.f1b = fn_decl @F.1 [concrete = constants.%F.1f2] { -// CHECK:STDOUT: %self.patt: %pattern_type.761 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.761 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param.loc25: %Class = value_param call_param0 -// CHECK:STDOUT: %Self.ref.loc25: type = name_ref Self, constants.%Class [concrete = constants.%Class] -// CHECK:STDOUT: %self.loc25: %Class = bind_name self, %self.param.loc25 -// CHECK:STDOUT: } -// CHECK:STDOUT: %G.decl: %G.type = fn_decl @G [concrete = constants.%G] { -// CHECK:STDOUT: %return.patt: %pattern_type.761 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.761 = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %Self.ref.loc28: type = name_ref Self, constants.%Class [concrete = constants.%Class] -// CHECK:STDOUT: %return.param.loc28: ref %Class = out_param call_param0 -// CHECK:STDOUT: %return.loc28: ref %Class = return_slot %return.param.loc28 -// CHECK:STDOUT: } -// CHECK:STDOUT: %WrongSelf.decl: type = class_decl @WrongSelf [concrete = constants.%WrongSelf] {} {} -// CHECK:STDOUT: %CallWrongSelf.decl: %CallWrongSelf.type = fn_decl @CallWrongSelf [concrete = constants.%CallWrongSelf] { -// CHECK:STDOUT: %ws.patt: %pattern_type.381 = binding_pattern ws [concrete] -// CHECK:STDOUT: %ws.param_patt: %pattern_type.381 = value_param_pattern %ws.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %ws.param: %WrongSelf = value_param call_param0 -// CHECK:STDOUT: %WrongSelf.ref: type = name_ref WrongSelf, file.%WrongSelf.decl [concrete = constants.%WrongSelf] -// CHECK:STDOUT: %ws: %WrongSelf = bind_name ws, %ws.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Class { -// CHECK:STDOUT: %F.decl: %F.type.f1b = fn_decl @F.1 [concrete = constants.%F.1f2] { -// CHECK:STDOUT: %self.patt: %pattern_type.761 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.761 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param.loc16: %Class = value_param call_param0 -// CHECK:STDOUT: %Self.ref.loc16: type = name_ref Self, constants.%Class [concrete = constants.%Class] -// CHECK:STDOUT: %self.loc16: %Class = bind_name self, %self.param.loc16 -// CHECK:STDOUT: } -// CHECK:STDOUT: %G.decl: %G.type = fn_decl @G [concrete = constants.%G] { -// CHECK:STDOUT: %return.patt: %pattern_type.761 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.761 = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %Self.ref.loc18: type = name_ref Self, constants.%Class [concrete = constants.%Class] -// CHECK:STDOUT: %return.param.loc18: ref %Class = out_param call_param0 -// CHECK:STDOUT: %return.loc18: ref %Class = return_slot %return.param.loc18 -// CHECK:STDOUT: } -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Class -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: .G = %G.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @WrongSelf { -// CHECK:STDOUT: %F.decl: %F.type.25f = fn_decl @F.2 [concrete = constants.%F.3a3] { -// CHECK:STDOUT: %self.patt: %pattern_type.761 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.761 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %Class = value_param call_param0 -// CHECK:STDOUT: %Class.ref: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %self: %Class = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%WrongSelf -// CHECK:STDOUT: .Class = -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F.1(%self.param.loc25: %Class) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @G() -> %return.param.loc28: %Class { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %self.patt: %pattern_type.761 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.var_patt: %pattern_type.761 = var_pattern %self.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self.var: ref %Class = var %self.var_patt -// CHECK:STDOUT: %Self.ref.loc33: type = name_ref Self, constants.%Class [concrete = constants.%Class] -// CHECK:STDOUT: %self: ref %Class = bind_name self, %self.var -// CHECK:STDOUT: %self.ref: ref %Class = name_ref self, %self -// CHECK:STDOUT: %.loc38: %Class = bind_value %self.ref -// CHECK:STDOUT: return to %return.loc28 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F.2(%self.param: %Class); -// CHECK:STDOUT: -// CHECK:STDOUT: fn @CallWrongSelf(%ws.param: %WrongSelf) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %ws.ref: %WrongSelf = name_ref ws, %ws -// CHECK:STDOUT: %F.ref: %F.type.25f = name_ref F, @WrongSelf.%F.decl [concrete = constants.%F.3a3] -// CHECK:STDOUT: %F.bound: = bound_method %ws.ref, %F.ref -// CHECK:STDOUT: %.loc56: %Class = converted %ws.ref, [concrete = ] -// CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.bound() -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/fail_self_param.carbon b/toolchain/check/testdata/class/fail_self_param.carbon deleted file mode 100644 index 66daf0e6d2cfb..0000000000000 --- a/toolchain/check/testdata/class/fail_self_param.carbon +++ /dev/null @@ -1,74 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/fail_self_param.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/fail_self_param.carbon - -// CHECK:STDERR: fail_self_param.carbon:[[@LINE+4]]:9: error: `self` parameter only allowed on functions [SelfParameterNotAllowed] -// CHECK:STDERR: class C[self:! type](x:! self) {} -// CHECK:STDERR: ^~~~~~~~~~~ -// CHECK:STDERR: -class C[self:! type](x:! self) {} -var v: C(0); - -// CHECK:STDOUT: --- fail_self_param.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C.type: type = generic_class_type @C [concrete] -// CHECK:STDOUT: %C.generic: %C.type = struct_value () [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %int_0: Core.IntLiteral = int_value 0 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: .v = %v -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %C.decl: %C.type = class_decl @C [concrete = constants.%C.generic] { -// CHECK:STDOUT: %x.patt: = symbolic_binding_pattern x, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.ref: = name_ref self, [concrete = ] -// CHECK:STDOUT: %x: = bind_symbolic_name x, 0 [concrete = ] -// CHECK:STDOUT: } -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %v.patt: = binding_pattern v [concrete] -// CHECK:STDOUT: %v.var_patt: = var_pattern %v.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %v.var: ref = var %v.var_patt [concrete = ] -// CHECK:STDOUT: %.1: = splice_block [concrete = ] { -// CHECK:STDOUT: %C.ref: %C.type = name_ref C, %C.decl [concrete = constants.%C.generic] -// CHECK:STDOUT: %int_0: Core.IntLiteral = int_value 0 [concrete = constants.%int_0] -// CHECK:STDOUT: } -// CHECK:STDOUT: %v: = bind_name v, -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @C(%x: ) { -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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 = -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @C() {} -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/fail_self_type_member.carbon b/toolchain/check/testdata/class/fail_self_type_member.carbon deleted file mode 100644 index 3f1a0026ab3f0..0000000000000 --- a/toolchain/check/testdata/class/fail_self_type_member.carbon +++ /dev/null @@ -1,55 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/fail_self_type_member.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/fail_self_type_member.carbon - -class Class { - var b: bool; -} - -fn F() -> bool { - var c1: Class = {.b = true}; - // CHECK:STDERR: fail_self_type_member.carbon:[[@LINE+8]]:17: error: expected identifier after `.` [ExpectedIdentifierAfterPeriodOrArrow] - // CHECK:STDERR: var c2: Class.Self = c1; - // CHECK:STDERR: ^~~~ - // CHECK:STDERR: - // CHECK:STDERR: fail_self_type_member.carbon:[[@LINE+4]]:17: error: semantics TODO: `handle invalid parse trees in `check`` [SemanticsTodo] - // CHECK:STDERR: var c2: Class.Self = c1; - // CHECK:STDERR: ^~~~ - // CHECK:STDERR: - var c2: Class.Self = c1; - return c2.b; -} - -// CHECK:STDOUT: --- fail_self_type_member.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Class: type = class_type @Class [concrete] -// CHECK:STDOUT: %Bool.type: type = fn_type @Bool [concrete] -// CHECK:STDOUT: %Bool: %Bool.type = struct_value () [concrete] -// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, bool [concrete] -// CHECK:STDOUT: %struct_type.b: type = struct_type {.b: bool} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.b [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Class { -// CHECK:STDOUT: %bool.make_type: init type = call constants.%Bool() [concrete = bool] -// CHECK:STDOUT: %.loc12_10.1: type = value_of_initializer %bool.make_type [concrete = bool] -// CHECK:STDOUT: %.loc12_10.2: type = converted %bool.make_type, %.loc12_10.1 [concrete = bool] -// CHECK:STDOUT: %.loc12_8: %Class.elem = field_decl b, element0 [concrete] -// CHECK:STDOUT: %struct_type.b: type = struct_type {.b: bool} [concrete = constants.%struct_type.b] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.b [concrete = constants.%complete_type] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Class -// CHECK:STDOUT: .b = %.loc12_8 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F() -> bool; -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/fail_todo_field_initializer.carbon b/toolchain/check/testdata/class/fail_todo_field_initializer.carbon deleted file mode 100644 index 4e3e2f62f08fb..0000000000000 --- a/toolchain/check/testdata/class/fail_todo_field_initializer.carbon +++ /dev/null @@ -1,64 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/fail_todo_field_initializer.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/fail_todo_field_initializer.carbon - -class Class { - // CHECK:STDERR: fail_todo_field_initializer.carbon:[[@LINE+4]]:3: error: semantics TODO: `Field initializer` [SemanticsTodo] - // CHECK:STDERR: var field: i32 = 0; - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: - var field: i32 = 0; -} - -// CHECK:STDOUT: --- fail_todo_field_initializer.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Class: type = class_type @Class [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %i32 [concrete] -// CHECK:STDOUT: %int_0: Core.IntLiteral = int_value 0 [concrete] -// CHECK:STDOUT: %struct_type.field: type = struct_type {.field: %i32} [concrete] -// CHECK:STDOUT: %complete_type.d48: = complete_type_witness %struct_type.field [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Class = %Class.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Class.decl: type = class_decl @Class [concrete = constants.%Class] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Class { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc16: %Class.elem = field_decl field, element0 [concrete] -// CHECK:STDOUT: %int_0: Core.IntLiteral = int_value 0 [concrete = constants.%int_0] -// CHECK:STDOUT: %struct_type.field: type = struct_type {.field: %i32} [concrete = constants.%struct_type.field] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.field [concrete = constants.%complete_type.d48] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Class -// CHECK:STDOUT: .field = %.loc16 -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/fail_unbound_field.carbon b/toolchain/check/testdata/class/fail_unbound_field.carbon deleted file mode 100644 index 149fa42232e23..0000000000000 --- a/toolchain/check/testdata/class/fail_unbound_field.carbon +++ /dev/null @@ -1,111 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/fail_unbound_field.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/fail_unbound_field.carbon - -class Class { - var field: i32; - fn F() -> i32 { - // CHECK:STDERR: fail_unbound_field.carbon:[[@LINE+4]]:12: error: expression cannot be used as a value [UseOfNonExprAsValue] - // CHECK:STDERR: return field; - // CHECK:STDERR: ^~~~~ - // CHECK:STDERR: - return field; - } -} - -fn G() -> i32 { - // CHECK:STDERR: fail_unbound_field.carbon:[[@LINE+4]]:10: error: expression cannot be used as a value [UseOfNonExprAsValue] - // CHECK:STDERR: return Class.field; - // CHECK:STDERR: ^~~~~~~~~~~ - // CHECK:STDERR: - return Class.field; -} - -// CHECK:STDOUT: --- fail_unbound_field.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Class: type = class_type @Class [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %i32 [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %struct_type.field: type = struct_type {.field: %i32} [concrete] -// CHECK:STDOUT: %complete_type.d48: = complete_type_witness %struct_type.field [concrete] -// CHECK:STDOUT: %G.type: type = fn_type @G [concrete] -// CHECK:STDOUT: %G: %G.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Class = %Class.decl -// CHECK:STDOUT: .G = %G.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Class.decl: type = class_decl @Class [concrete = constants.%Class] {} {} -// CHECK:STDOUT: %G.decl: %G.type = fn_decl @G [concrete = constants.%G] { -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param0 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Class { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc12: %Class.elem = field_decl field, element0 [concrete] -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param0 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %struct_type.field: type = struct_type {.field: %i32} [concrete = constants.%struct_type.field] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.field [concrete = constants.%complete_type.d48] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Class -// CHECK:STDOUT: .field = %.loc12 -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F() -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %field.ref: %Class.elem = name_ref field, @Class.%.loc12 [concrete = @Class.%.loc12] -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @G() -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %Class.ref: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %field.ref: %Class.elem = name_ref field, @Class.%.loc12 [concrete = @Class.%.loc12] -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/fail_unknown_member.carbon b/toolchain/check/testdata/class/fail_unknown_member.carbon deleted file mode 100644 index 7d0338fef48da..0000000000000 --- a/toolchain/check/testdata/class/fail_unknown_member.carbon +++ /dev/null @@ -1,94 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/fail_unknown_member.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/fail_unknown_member.carbon - -class Class { - var n: i32; -} - -fn G(c: Class) -> i32 { - // TODO: Mention the scope in which we looked for the name. - // CHECK:STDERR: fail_unknown_member.carbon:[[@LINE+4]]:10: error: member name `something` not found in `Class` [MemberNameNotFoundInInstScope] - // CHECK:STDERR: return c.something; - // CHECK:STDERR: ^~~~~~~~~~~ - // CHECK:STDERR: - return c.something; -} - -// CHECK:STDOUT: --- fail_unknown_member.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Class: type = class_type @Class [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %i32 [concrete] -// CHECK:STDOUT: %struct_type.n: type = struct_type {.n: %i32} [concrete] -// CHECK:STDOUT: %complete_type.54b: = complete_type_witness %struct_type.n [concrete] -// CHECK:STDOUT: %pattern_type.761: type = pattern_type %Class [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %G.type: type = fn_type @G [concrete] -// CHECK:STDOUT: %G: %G.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Class = %Class.decl -// CHECK:STDOUT: .G = %G.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Class.decl: type = class_decl @Class [concrete = constants.%Class] {} {} -// CHECK:STDOUT: %G.decl: %G.type = fn_decl @G [concrete = constants.%G] { -// CHECK:STDOUT: %c.patt: %pattern_type.761 = binding_pattern c [concrete] -// CHECK:STDOUT: %c.param_patt: %pattern_type.761 = value_param_pattern %c.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %c.param: %Class = value_param call_param0 -// CHECK:STDOUT: %Class.ref: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %c: %Class = bind_name c, %c.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Class { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc12: %Class.elem = field_decl n, element0 [concrete] -// CHECK:STDOUT: %struct_type.n: type = struct_type {.n: %i32} [concrete = constants.%struct_type.n] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.n [concrete = constants.%complete_type.54b] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Class -// CHECK:STDOUT: .n = %.loc12 -// CHECK:STDOUT: .something = -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @G(%c.param: %Class) -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %c.ref: %Class = name_ref c, %c -// CHECK:STDOUT: %something.ref: = name_ref something, [concrete = ] -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/field_access.carbon b/toolchain/check/testdata/class/field_access.carbon deleted file mode 100644 index 0c8f4edcca46d..0000000000000 --- a/toolchain/check/testdata/class/field_access.carbon +++ /dev/null @@ -1,166 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/field_access.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/field_access.carbon - -class Class { - var j: i32; - var k: i32; -} - -fn Run() { - var c: Class; - c.j = 1; - c.k = 2; - var cj: i32 = c.j; - var ck: i32 = c.k; -} - -// CHECK:STDOUT: --- field_access.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Class: type = class_type @Class [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %i32 [concrete] -// CHECK:STDOUT: %struct_type.j.k: type = struct_type {.j: %i32, .k: %i32} [concrete] -// CHECK:STDOUT: %complete_type.cf7: = complete_type_witness %struct_type.j.k [concrete] -// CHECK:STDOUT: %Run.type: type = fn_type @Run [concrete] -// CHECK:STDOUT: %Run: %Run.type = struct_value () [concrete] -// CHECK:STDOUT: %pattern_type.761: type = pattern_type %Class [concrete] -// CHECK:STDOUT: %int_1.5b8: Core.IntLiteral = int_value 1 [concrete] -// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.type.205: type = facet_type <@ImplicitAs, @ImplicitAs(%i32)> [concrete] -// CHECK:STDOUT: %Convert.type.1b6: type = fn_type @Convert.1, @ImplicitAs(%i32) [concrete] -// CHECK:STDOUT: %To.c80: Core.IntLiteral = bind_symbolic_name To, 0 [symbolic] -// CHECK:STDOUT: %Convert.type.0f9: type = fn_type @Convert.2, @impl.4f9(%To.c80) [symbolic] -// CHECK:STDOUT: %Convert.f06: %Convert.type.0f9 = struct_value () [symbolic] -// CHECK:STDOUT: %ImplicitAs.impl_witness.c75: = impl_witness imports.%ImplicitAs.impl_witness_table.a2f, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.type.035: type = fn_type @Convert.2, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.956: %Convert.type.035 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.facet: %ImplicitAs.type.205 = facet_value Core.IntLiteral, (%ImplicitAs.impl_witness.c75) [concrete] -// CHECK:STDOUT: %.9c3: type = fn_type_with_self_type %Convert.type.1b6, %ImplicitAs.facet [concrete] -// CHECK:STDOUT: %Convert.bound.ab5: = bound_method %int_1.5b8, %Convert.956 [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %Convert.specific_fn: = specific_function %Convert.956, @Convert.2(%int_32) [concrete] -// CHECK:STDOUT: %bound_method.9a1: = bound_method %int_1.5b8, %Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_1.5d2: %i32 = int_value 1 [concrete] -// CHECK:STDOUT: %int_2.ecc: Core.IntLiteral = int_value 2 [concrete] -// CHECK:STDOUT: %Convert.bound.ef9: = bound_method %int_2.ecc, %Convert.956 [concrete] -// CHECK:STDOUT: %bound_method.b92: = bound_method %int_2.ecc, %Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_2.ef8: %i32 = int_value 2 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/operators/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] -// CHECK:STDOUT: %Core.import_ref.a5b: @impl.4f9.%Convert.type (%Convert.type.0f9) = import_ref Core//prelude/types/int, loc19_39, loaded [symbolic = @impl.4f9.%Convert (constants.%Convert.f06)] -// CHECK:STDOUT: %ImplicitAs.impl_witness_table.a2f = impl_witness_table (%Core.import_ref.a5b), @impl.4f9 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Class = %Class.decl -// CHECK:STDOUT: .Run = %Run.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Class.decl: type = class_decl @Class [concrete = constants.%Class] {} {} -// CHECK:STDOUT: %Run.decl: %Run.type = fn_decl @Run [concrete = constants.%Run] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Class { -// CHECK:STDOUT: %int_32.loc12: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc12: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc12: %Class.elem = field_decl j, element0 [concrete] -// CHECK:STDOUT: %int_32.loc13: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc13: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc13: %Class.elem = field_decl k, element1 [concrete] -// CHECK:STDOUT: %struct_type.j.k: type = struct_type {.j: %i32, .k: %i32} [concrete = constants.%struct_type.j.k] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.j.k [concrete = constants.%complete_type.cf7] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Class -// CHECK:STDOUT: .j = %.loc12 -// CHECK:STDOUT: .k = %.loc13 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Run() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %c.patt: %pattern_type.761 = binding_pattern c [concrete] -// CHECK:STDOUT: %c.var_patt: %pattern_type.761 = var_pattern %c.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %c.var: ref %Class = var %c.var_patt -// CHECK:STDOUT: %Class.ref: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %c: ref %Class = bind_name c, %c.var -// CHECK:STDOUT: %c.ref.loc18: ref %Class = name_ref c, %c -// CHECK:STDOUT: %j.ref.loc18: %Class.elem = name_ref j, @Class.%.loc12 [concrete = @Class.%.loc12] -// CHECK:STDOUT: %.loc18_4: ref %i32 = class_element_access %c.ref.loc18, element0 -// CHECK:STDOUT: %int_1: Core.IntLiteral = int_value 1 [concrete = constants.%int_1.5b8] -// CHECK:STDOUT: %impl.elem0.loc18: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc18_7.1: = bound_method %int_1, %impl.elem0.loc18 [concrete = constants.%Convert.bound.ab5] -// CHECK:STDOUT: %specific_fn.loc18: = specific_function %impl.elem0.loc18, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc18_7.2: = bound_method %int_1, %specific_fn.loc18 [concrete = constants.%bound_method.9a1] -// CHECK:STDOUT: %int.convert_checked.loc18: init %i32 = call %bound_method.loc18_7.2(%int_1) [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %.loc18_7: init %i32 = converted %int_1, %int.convert_checked.loc18 [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: assign %.loc18_4, %.loc18_7 -// CHECK:STDOUT: %c.ref.loc19: ref %Class = name_ref c, %c -// CHECK:STDOUT: %k.ref.loc19: %Class.elem = name_ref k, @Class.%.loc13 [concrete = @Class.%.loc13] -// CHECK:STDOUT: %.loc19_4: ref %i32 = class_element_access %c.ref.loc19, element1 -// CHECK:STDOUT: %int_2: Core.IntLiteral = int_value 2 [concrete = constants.%int_2.ecc] -// CHECK:STDOUT: %impl.elem0.loc19: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc19_7.1: = bound_method %int_2, %impl.elem0.loc19 [concrete = constants.%Convert.bound.ef9] -// CHECK:STDOUT: %specific_fn.loc19: = specific_function %impl.elem0.loc19, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc19_7.2: = bound_method %int_2, %specific_fn.loc19 [concrete = constants.%bound_method.b92] -// CHECK:STDOUT: %int.convert_checked.loc19: init %i32 = call %bound_method.loc19_7.2(%int_2) [concrete = constants.%int_2.ef8] -// CHECK:STDOUT: %.loc19_7: init %i32 = converted %int_2, %int.convert_checked.loc19 [concrete = constants.%int_2.ef8] -// CHECK:STDOUT: assign %.loc19_4, %.loc19_7 -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %cj.patt: %pattern_type.7ce = binding_pattern cj [concrete] -// CHECK:STDOUT: %cj.var_patt: %pattern_type.7ce = var_pattern %cj.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %cj.var: ref %i32 = var %cj.var_patt -// CHECK:STDOUT: %c.ref.loc20: ref %Class = name_ref c, %c -// CHECK:STDOUT: %j.ref.loc20: %Class.elem = name_ref j, @Class.%.loc12 [concrete = @Class.%.loc12] -// CHECK:STDOUT: %.loc20_18.1: ref %i32 = class_element_access %c.ref.loc20, element0 -// CHECK:STDOUT: %.loc20_18.2: %i32 = bind_value %.loc20_18.1 -// CHECK:STDOUT: assign %cj.var, %.loc20_18.2 -// CHECK:STDOUT: %.loc20_11: type = splice_block %i32.loc20 [concrete = constants.%i32] { -// CHECK:STDOUT: %int_32.loc20: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc20: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: } -// CHECK:STDOUT: %cj: ref %i32 = bind_name cj, %cj.var -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %ck.patt: %pattern_type.7ce = binding_pattern ck [concrete] -// CHECK:STDOUT: %ck.var_patt: %pattern_type.7ce = var_pattern %ck.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %ck.var: ref %i32 = var %ck.var_patt -// CHECK:STDOUT: %c.ref.loc21: ref %Class = name_ref c, %c -// CHECK:STDOUT: %k.ref.loc21: %Class.elem = name_ref k, @Class.%.loc13 [concrete = @Class.%.loc13] -// CHECK:STDOUT: %.loc21_18.1: ref %i32 = class_element_access %c.ref.loc21, element1 -// CHECK:STDOUT: %.loc21_18.2: %i32 = bind_value %.loc21_18.1 -// CHECK:STDOUT: assign %ck.var, %.loc21_18.2 -// CHECK:STDOUT: %.loc21_11: type = splice_block %i32.loc21 [concrete = constants.%i32] { -// CHECK:STDOUT: %int_32.loc21: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc21: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: } -// CHECK:STDOUT: %ck: ref %i32 = bind_name ck, %ck.var -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/field_access_in_value.carbon b/toolchain/check/testdata/class/field_access_in_value.carbon deleted file mode 100644 index 726aff3f8ae72..0000000000000 --- a/toolchain/check/testdata/class/field_access_in_value.carbon +++ /dev/null @@ -1,173 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/field_access_in_value.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/field_access_in_value.carbon - -class Class { - var j: i32; - var k: i32; -} - -fn Test() { - var cv: Class; - cv.j = 1; - cv.k = 2; - let c: Class = cv; - var cj: i32 = c.j; - var ck: i32 = c.k; -} - -// CHECK:STDOUT: --- field_access_in_value.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Class: type = class_type @Class [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %i32 [concrete] -// CHECK:STDOUT: %struct_type.j.k: type = struct_type {.j: %i32, .k: %i32} [concrete] -// CHECK:STDOUT: %complete_type.cf7: = complete_type_witness %struct_type.j.k [concrete] -// CHECK:STDOUT: %Test.type: type = fn_type @Test [concrete] -// CHECK:STDOUT: %Test: %Test.type = struct_value () [concrete] -// CHECK:STDOUT: %pattern_type.761: type = pattern_type %Class [concrete] -// CHECK:STDOUT: %int_1.5b8: Core.IntLiteral = int_value 1 [concrete] -// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.type.205: type = facet_type <@ImplicitAs, @ImplicitAs(%i32)> [concrete] -// CHECK:STDOUT: %Convert.type.1b6: type = fn_type @Convert.1, @ImplicitAs(%i32) [concrete] -// CHECK:STDOUT: %To.c80: Core.IntLiteral = bind_symbolic_name To, 0 [symbolic] -// CHECK:STDOUT: %Convert.type.0f9: type = fn_type @Convert.2, @impl.4f9(%To.c80) [symbolic] -// CHECK:STDOUT: %Convert.f06: %Convert.type.0f9 = struct_value () [symbolic] -// CHECK:STDOUT: %ImplicitAs.impl_witness.c75: = impl_witness imports.%ImplicitAs.impl_witness_table.a2f, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.type.035: type = fn_type @Convert.2, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.956: %Convert.type.035 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.facet: %ImplicitAs.type.205 = facet_value Core.IntLiteral, (%ImplicitAs.impl_witness.c75) [concrete] -// CHECK:STDOUT: %.9c3: type = fn_type_with_self_type %Convert.type.1b6, %ImplicitAs.facet [concrete] -// CHECK:STDOUT: %Convert.bound.ab5: = bound_method %int_1.5b8, %Convert.956 [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %Convert.specific_fn: = specific_function %Convert.956, @Convert.2(%int_32) [concrete] -// CHECK:STDOUT: %bound_method.9a1: = bound_method %int_1.5b8, %Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_1.5d2: %i32 = int_value 1 [concrete] -// CHECK:STDOUT: %int_2.ecc: Core.IntLiteral = int_value 2 [concrete] -// CHECK:STDOUT: %Convert.bound.ef9: = bound_method %int_2.ecc, %Convert.956 [concrete] -// CHECK:STDOUT: %bound_method.b92: = bound_method %int_2.ecc, %Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_2.ef8: %i32 = int_value 2 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/operators/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] -// CHECK:STDOUT: %Core.import_ref.a5b: @impl.4f9.%Convert.type (%Convert.type.0f9) = import_ref Core//prelude/types/int, loc19_39, loaded [symbolic = @impl.4f9.%Convert (constants.%Convert.f06)] -// CHECK:STDOUT: %ImplicitAs.impl_witness_table.a2f = impl_witness_table (%Core.import_ref.a5b), @impl.4f9 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Class = %Class.decl -// CHECK:STDOUT: .Test = %Test.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Class.decl: type = class_decl @Class [concrete = constants.%Class] {} {} -// CHECK:STDOUT: %Test.decl: %Test.type = fn_decl @Test [concrete = constants.%Test] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Class { -// CHECK:STDOUT: %int_32.loc12: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc12: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc12: %Class.elem = field_decl j, element0 [concrete] -// CHECK:STDOUT: %int_32.loc13: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc13: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc13: %Class.elem = field_decl k, element1 [concrete] -// CHECK:STDOUT: %struct_type.j.k: type = struct_type {.j: %i32, .k: %i32} [concrete = constants.%struct_type.j.k] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.j.k [concrete = constants.%complete_type.cf7] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Class -// CHECK:STDOUT: .j = %.loc12 -// CHECK:STDOUT: .k = %.loc13 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Test() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %cv.patt: %pattern_type.761 = binding_pattern cv [concrete] -// CHECK:STDOUT: %cv.var_patt: %pattern_type.761 = var_pattern %cv.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %cv.var: ref %Class = var %cv.var_patt -// CHECK:STDOUT: %Class.ref.loc17: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %cv: ref %Class = bind_name cv, %cv.var -// CHECK:STDOUT: %cv.ref.loc18: ref %Class = name_ref cv, %cv -// CHECK:STDOUT: %j.ref.loc18: %Class.elem = name_ref j, @Class.%.loc12 [concrete = @Class.%.loc12] -// CHECK:STDOUT: %.loc18_5: ref %i32 = class_element_access %cv.ref.loc18, element0 -// CHECK:STDOUT: %int_1: Core.IntLiteral = int_value 1 [concrete = constants.%int_1.5b8] -// CHECK:STDOUT: %impl.elem0.loc18: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc18_8.1: = bound_method %int_1, %impl.elem0.loc18 [concrete = constants.%Convert.bound.ab5] -// CHECK:STDOUT: %specific_fn.loc18: = specific_function %impl.elem0.loc18, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc18_8.2: = bound_method %int_1, %specific_fn.loc18 [concrete = constants.%bound_method.9a1] -// CHECK:STDOUT: %int.convert_checked.loc18: init %i32 = call %bound_method.loc18_8.2(%int_1) [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %.loc18_8: init %i32 = converted %int_1, %int.convert_checked.loc18 [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: assign %.loc18_5, %.loc18_8 -// CHECK:STDOUT: %cv.ref.loc19: ref %Class = name_ref cv, %cv -// CHECK:STDOUT: %k.ref.loc19: %Class.elem = name_ref k, @Class.%.loc13 [concrete = @Class.%.loc13] -// CHECK:STDOUT: %.loc19_5: ref %i32 = class_element_access %cv.ref.loc19, element1 -// CHECK:STDOUT: %int_2: Core.IntLiteral = int_value 2 [concrete = constants.%int_2.ecc] -// CHECK:STDOUT: %impl.elem0.loc19: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc19_8.1: = bound_method %int_2, %impl.elem0.loc19 [concrete = constants.%Convert.bound.ef9] -// CHECK:STDOUT: %specific_fn.loc19: = specific_function %impl.elem0.loc19, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc19_8.2: = bound_method %int_2, %specific_fn.loc19 [concrete = constants.%bound_method.b92] -// CHECK:STDOUT: %int.convert_checked.loc19: init %i32 = call %bound_method.loc19_8.2(%int_2) [concrete = constants.%int_2.ef8] -// CHECK:STDOUT: %.loc19_8: init %i32 = converted %int_2, %int.convert_checked.loc19 [concrete = constants.%int_2.ef8] -// CHECK:STDOUT: assign %.loc19_5, %.loc19_8 -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %c.patt: %pattern_type.761 = binding_pattern c [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %cv.ref.loc20: ref %Class = name_ref cv, %cv -// CHECK:STDOUT: %Class.ref.loc20: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %c: ref %Class = bind_name c, %cv.ref.loc20 -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %cj.patt: %pattern_type.7ce = binding_pattern cj [concrete] -// CHECK:STDOUT: %cj.var_patt: %pattern_type.7ce = var_pattern %cj.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %cj.var: ref %i32 = var %cj.var_patt -// CHECK:STDOUT: %c.ref.loc21: ref %Class = name_ref c, %c -// CHECK:STDOUT: %j.ref.loc21: %Class.elem = name_ref j, @Class.%.loc12 [concrete = @Class.%.loc12] -// CHECK:STDOUT: %.loc21_18.1: ref %i32 = class_element_access %c.ref.loc21, element0 -// CHECK:STDOUT: %.loc21_18.2: %i32 = bind_value %.loc21_18.1 -// CHECK:STDOUT: assign %cj.var, %.loc21_18.2 -// CHECK:STDOUT: %.loc21_11: type = splice_block %i32.loc21 [concrete = constants.%i32] { -// CHECK:STDOUT: %int_32.loc21: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc21: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: } -// CHECK:STDOUT: %cj: ref %i32 = bind_name cj, %cj.var -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %ck.patt: %pattern_type.7ce = binding_pattern ck [concrete] -// CHECK:STDOUT: %ck.var_patt: %pattern_type.7ce = var_pattern %ck.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %ck.var: ref %i32 = var %ck.var_patt -// CHECK:STDOUT: %c.ref.loc22: ref %Class = name_ref c, %c -// CHECK:STDOUT: %k.ref.loc22: %Class.elem = name_ref k, @Class.%.loc13 [concrete = @Class.%.loc13] -// CHECK:STDOUT: %.loc22_18.1: ref %i32 = class_element_access %c.ref.loc22, element1 -// CHECK:STDOUT: %.loc22_18.2: %i32 = bind_value %.loc22_18.1 -// CHECK:STDOUT: assign %ck.var, %.loc22_18.2 -// CHECK:STDOUT: %.loc22_11: type = splice_block %i32.loc22 [concrete = constants.%i32] { -// CHECK:STDOUT: %int_32.loc22: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc22: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: } -// CHECK:STDOUT: %ck: ref %i32 = bind_name ck, %ck.var -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/forward_declared.carbon b/toolchain/check/testdata/class/forward_declared.carbon deleted file mode 100644 index 8f3b15c5300ee..0000000000000 --- a/toolchain/check/testdata/class/forward_declared.carbon +++ /dev/null @@ -1,66 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/forward_declared.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/forward_declared.carbon - -class Class; - -fn F(p: Class*) -> Class* { return p; } - -// CHECK:STDOUT: --- forward_declared.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Class: type = class_type @Class [concrete] -// CHECK:STDOUT: %ptr: type = ptr_type %Class [concrete] -// CHECK:STDOUT: %pattern_type: type = pattern_type %ptr [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Class = %Class.decl -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Class.decl: type = class_decl @Class [concrete = constants.%Class] {} {} -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %p.patt: %pattern_type = binding_pattern p [concrete] -// CHECK:STDOUT: %p.param_patt: %pattern_type = value_param_pattern %p.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %Class.ref.loc13_20: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %ptr.loc13_25: type = ptr_type %Class.ref.loc13_20 [concrete = constants.%ptr] -// CHECK:STDOUT: %p.param: %ptr = value_param call_param0 -// CHECK:STDOUT: %.loc13: type = splice_block %ptr.loc13_14 [concrete = constants.%ptr] { -// CHECK:STDOUT: %Class.ref.loc13_9: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %ptr.loc13_14: type = ptr_type %Class.ref.loc13_9 [concrete = constants.%ptr] -// CHECK:STDOUT: } -// CHECK:STDOUT: %p: %ptr = bind_name p, %p.param -// CHECK:STDOUT: %return.param: ref %ptr = out_param call_param1 -// CHECK:STDOUT: %return: ref %ptr = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Class; -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F(%p.param: %ptr) -> %ptr { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %p.ref: %ptr = name_ref p, %p -// CHECK:STDOUT: return %p.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/generic.carbon b/toolchain/check/testdata/class/generic.carbon deleted file mode 100644 index 0e35dd26f3e4f..0000000000000 --- a/toolchain/check/testdata/class/generic.carbon +++ /dev/null @@ -1,37 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/generic.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/generic.carbon - -class C[](); - -// CHECK:STDOUT: --- generic.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C.type: type = generic_class_type @C [concrete] -// CHECK:STDOUT: %C.generic: %C.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %C.decl: %C.type = class_decl @C [concrete = constants.%C.generic] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C; -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/generic/adapt.carbon b/toolchain/check/testdata/class/generic/adapt.carbon index 7039d2a7ad354..1ad6b23a632fa 100644 --- a/toolchain/check/testdata/class/generic/adapt.carbon +++ b/toolchain/check/testdata/class/generic/adapt.carbon @@ -2,6 +2,8 @@ // Exceptions. See /LICENSE for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// // AUTOUPDATE // TIP: To test this file alone, run: // TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/generic/adapt.carbon @@ -16,12 +18,16 @@ class C(T:! type) { var x: T; } +//@dump-sem-ir-begin class Adapter { adapt C(i32); } +//@dump-sem-ir-end fn Access(a: Adapter) -> i32 { + //@dump-sem-ir-begin return (a as C(i32)).x; + //@dump-sem-ir-end } // --- import_adapt_specific_type.carbon @@ -31,7 +37,9 @@ library "[[@TEST_NAME]]"; import library "adapt_specific_type"; fn ImportedAccess(a: Adapter) -> i32 { + //@dump-sem-ir-begin return (a as C(i32)).x; + //@dump-sem-ir-end } // --- fail_todo_extend_adapt_specific_type.carbon @@ -69,9 +77,11 @@ class C(T:! type) { var x: T; } +//@dump-sem-ir-begin class Adapter { extend adapt C(i32); } +//@dump-sem-ir-end // --- fail_todo_import_extend_adapt_specific_type.carbon @@ -95,6 +105,7 @@ fn ImportedAccess(a: Adapter) -> i32 { library "[[@TEST_NAME]]"; +//@dump-sem-ir-begin class Adapter(T:! type) { adapt T; } @@ -102,6 +113,7 @@ class Adapter(T:! type) { fn Convert(a: Adapter(i32)) -> i32 { return a as i32; } +//@dump-sem-ir-end // --- import_adapt_generic_type.carbon @@ -110,7 +122,9 @@ library "[[@TEST_NAME]]"; import library "adapt_generic_type"; fn ImportedConvert(a: Adapter(i32)) -> i32 { + //@dump-sem-ir-begin return a as i32; + //@dump-sem-ir-end } class C { @@ -118,99 +132,30 @@ class C { } fn ImportedConvertLocal(a: Adapter(C)) -> i32 { + //@dump-sem-ir-begin return (a as C).n; + //@dump-sem-ir-end } // CHECK:STDOUT: --- adapt_specific_type.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] // CHECK:STDOUT: %C.type: type = generic_class_type @C [concrete] // CHECK:STDOUT: %C.generic: %C.type = struct_value () [concrete] -// CHECK:STDOUT: %C.f2e: type = class_type @C, @C(%T) [symbolic] -// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T [symbolic] -// CHECK:STDOUT: %C.elem.66c: type = unbound_element_type %C.f2e, %T [symbolic] -// CHECK:STDOUT: %struct_type.x.2ac: type = struct_type {.x: %T} [symbolic] -// CHECK:STDOUT: %complete_type.433: = complete_type_witness %struct_type.x.2ac [symbolic] // CHECK:STDOUT: %Adapter: type = class_type @Adapter [concrete] // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %C.98a: type = class_type @C, @C(%i32) [concrete] -// CHECK:STDOUT: %i32.builtin: type = int_type signed, %int_32 [concrete] -// CHECK:STDOUT: %complete_type.f8a: = complete_type_witness %i32.builtin [concrete] // CHECK:STDOUT: %C.elem.476: type = unbound_element_type %C.98a, %i32 [concrete] // CHECK:STDOUT: %struct_type.x.ed6: type = struct_type {.x: %i32} [concrete] // CHECK:STDOUT: %complete_type.1ec: = complete_type_witness %struct_type.x.ed6 [concrete] -// CHECK:STDOUT: %pattern_type.27e: type = pattern_type %Adapter [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %Access.type: type = fn_type @Access [concrete] -// CHECK:STDOUT: %Access: %Access.type = struct_value () [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: .Adapter = %Adapter.decl -// CHECK:STDOUT: .Access = %Access.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %C.decl: %C.type = class_decl @C [concrete = constants.%C.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc4_9.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_9.2 (constants.%T)] -// CHECK:STDOUT: } // CHECK:STDOUT: %Adapter.decl: type = class_decl @Adapter [concrete = constants.%Adapter] {} {} -// CHECK:STDOUT: %Access.decl: %Access.type = fn_decl @Access [concrete = constants.%Access] { -// CHECK:STDOUT: %a.patt: %pattern_type.27e = binding_pattern a [concrete] -// CHECK:STDOUT: %a.param_patt: %pattern_type.27e = value_param_pattern %a.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32.loc12: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc12: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %a.param: %Adapter = value_param call_param0 -// CHECK:STDOUT: %Adapter.ref: type = name_ref Adapter, file.%Adapter.decl [concrete = constants.%Adapter] -// CHECK:STDOUT: %a: %Adapter = bind_name a, %a.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @C(%T.loc4_9.1: type) { -// CHECK:STDOUT: %T.loc4_9.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_9.2 (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %T.loc4_9.2 [symbolic = %require_complete (constants.%require_complete.4ae)] -// CHECK:STDOUT: %C: type = class_type @C, @C(%T.loc4_9.2) [symbolic = %C (constants.%C.f2e)] -// CHECK:STDOUT: %C.elem: type = unbound_element_type %C, %T.loc4_9.2 [symbolic = %C.elem (constants.%C.elem.66c)] -// CHECK:STDOUT: %struct_type.x.loc6_1.2: type = struct_type {.x: @C.%T.loc4_9.2 (%T)} [symbolic = %struct_type.x.loc6_1.2 (constants.%struct_type.x.2ac)] -// CHECK:STDOUT: %complete_type.loc6_1.2: = complete_type_witness %struct_type.x.loc6_1.2 [symbolic = %complete_type.loc6_1.2 (constants.%complete_type.433)] -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc4_9.1 [symbolic = %T.loc4_9.2 (constants.%T)] -// CHECK:STDOUT: %.loc5: @C.%C.elem (%C.elem.66c) = field_decl x, element0 [concrete] -// CHECK:STDOUT: %struct_type.x.loc6_1.1: type = struct_type {.x: %T} [symbolic = %struct_type.x.loc6_1.2 (constants.%struct_type.x.2ac)] -// CHECK:STDOUT: %complete_type.loc6_1.1: = complete_type_witness %struct_type.x.loc6_1.1 [symbolic = %complete_type.loc6_1.2 (constants.%complete_type.433)] -// CHECK:STDOUT: complete_type_witness = %complete_type.loc6_1.1 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%C.f2e -// CHECK:STDOUT: .T = -// CHECK:STDOUT: .x = %.loc5 -// CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: class @Adapter { @@ -231,30 +176,15 @@ fn ImportedConvertLocal(a: Adapter(C)) -> i32 { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %a.ref: %Adapter = name_ref a, %a // CHECK:STDOUT: %C.ref: %C.type = name_ref C, file.%C.decl [concrete = constants.%C.generic] -// CHECK:STDOUT: %int_32.loc13: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc13: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] +// CHECK:STDOUT: %int_32.loc16: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] +// CHECK:STDOUT: %i32.loc16: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] // CHECK:STDOUT: %C: type = class_type @C, @C(constants.%i32) [concrete = constants.%C.98a] -// CHECK:STDOUT: %.loc13_13.1: %C.98a = as_compatible %a.ref -// CHECK:STDOUT: %.loc13_13.2: %C.98a = converted %a.ref, %.loc13_13.1 +// CHECK:STDOUT: %.loc16_13.1: %C.98a = as_compatible %a.ref +// CHECK:STDOUT: %.loc16_13.2: %C.98a = converted %a.ref, %.loc16_13.1 // CHECK:STDOUT: %x.ref: %C.elem.476 = name_ref x, @C.%.loc5 [concrete = @C.%.loc5] -// CHECK:STDOUT: %.loc13_23.1: ref %i32 = class_element_access %.loc13_13.2, element0 -// CHECK:STDOUT: %.loc13_23.2: %i32 = bind_value %.loc13_23.1 -// CHECK:STDOUT: return %.loc13_23.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @C(constants.%T) { -// CHECK:STDOUT: %T.loc4_9.2 => constants.%T -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @C(constants.%i32) { -// CHECK:STDOUT: %T.loc4_9.2 => constants.%i32 -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%complete_type.f8a -// CHECK:STDOUT: %C => constants.%C.98a -// CHECK:STDOUT: %C.elem => constants.%C.elem.476 -// CHECK:STDOUT: %struct_type.x.loc6_1.2 => constants.%struct_type.x.ed6 -// CHECK:STDOUT: %complete_type.loc6_1.2 => constants.%complete_type.1ec +// CHECK:STDOUT: %.loc16_23.1: ref %i32 = class_element_access %.loc16_13.2, element0 +// CHECK:STDOUT: %.loc16_23.2: %i32 = bind_value %.loc16_23.1 +// CHECK:STDOUT: return %.loc16_23.2 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_adapt_specific_type.carbon @@ -262,339 +192,57 @@ fn ImportedConvertLocal(a: Adapter(C)) -> i32 { // CHECK:STDOUT: constants { // CHECK:STDOUT: %Adapter: type = class_type @Adapter [concrete] // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %C.type: type = generic_class_type @C [concrete] // CHECK:STDOUT: %C.generic: %C.type = struct_value () [concrete] // CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %struct_type.x.2ac: type = struct_type {.x: %T} [symbolic] -// CHECK:STDOUT: %complete_type.433: = complete_type_witness %struct_type.x.2ac [symbolic] // CHECK:STDOUT: %C.f2e: type = class_type @C, @C(%T) [symbolic] // CHECK:STDOUT: %C.239: type = class_type @C, @C(%i32) [concrete] -// CHECK:STDOUT: %struct_type.x.767: type = struct_type {.x: %i32} [concrete] -// CHECK:STDOUT: %complete_type.c07: = complete_type_witness %struct_type.x.767 [concrete] -// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T [symbolic] // CHECK:STDOUT: %C.elem.66c: type = unbound_element_type %C.f2e, %T [symbolic] -// CHECK:STDOUT: %i32.builtin: type = int_type signed, %int_32 [concrete] -// CHECK:STDOUT: %complete_type.f8a: = complete_type_witness %i32.builtin [concrete] // CHECK:STDOUT: %C.elem.ed6: type = unbound_element_type %C.239, %i32 [concrete] -// CHECK:STDOUT: %pattern_type.27e: type = pattern_type %Adapter [concrete] -// CHECK:STDOUT: %pattern_type.501: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %ImportedAccess.type: type = fn_type @ImportedAccess [concrete] -// CHECK:STDOUT: %ImportedAccess: %ImportedAccess.type = struct_value () [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { // CHECK:STDOUT: %Main.C: %C.type = import_ref Main//adapt_specific_type, C, loaded [concrete = constants.%C.generic] -// CHECK:STDOUT: %Main.Adapter: type = import_ref Main//adapt_specific_type, Adapter, loaded [concrete = constants.%Adapter] -// CHECK:STDOUT: %Main.Access = import_ref Main//adapt_specific_type, Access, unloaded -// CHECK:STDOUT: %Core.ece: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Main.import_ref.5ab: type = import_ref Main//adapt_specific_type, loc4_9, loaded [symbolic = @C.%T (constants.%T)] -// CHECK:STDOUT: %Main.import_ref.b5f: = import_ref Main//adapt_specific_type, loc6_1, loaded [symbolic = @C.%complete_type (constants.%complete_type.433)] -// CHECK:STDOUT: %Main.import_ref.4c0 = import_ref Main//adapt_specific_type, inst26 [no loc], unloaded // CHECK:STDOUT: %Main.import_ref.262: @C.%C.elem (%C.elem.66c) = import_ref Main//adapt_specific_type, loc5_8, loaded [concrete = %.22b] -// CHECK:STDOUT: %Main.import_ref.709: = import_ref Main//adapt_specific_type, loc10_1, loaded [concrete = constants.%complete_type.c07] -// CHECK:STDOUT: %Main.import_ref.feb = import_ref Main//adapt_specific_type, inst42 [no loc], unloaded -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] // CHECK:STDOUT: %.22b: @C.%C.elem (%C.elem.66c) = field_decl x, element0 [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .C = imports.%Main.C -// CHECK:STDOUT: .Adapter = imports.%Main.Adapter -// CHECK:STDOUT: .Access = imports.%Main.Access -// CHECK:STDOUT: .Core = imports.%Core.ece -// CHECK:STDOUT: .ImportedAccess = %ImportedAccess.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %default.import = import -// CHECK:STDOUT: %ImportedAccess.decl: %ImportedAccess.type = fn_decl @ImportedAccess [concrete = constants.%ImportedAccess] { -// CHECK:STDOUT: %a.patt: %pattern_type.27e = binding_pattern a [concrete] -// CHECK:STDOUT: %a.param_patt: %pattern_type.27e = value_param_pattern %a.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.501 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.501 = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32.loc6: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc6: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %a.param: %Adapter = value_param call_param0 -// CHECK:STDOUT: %Adapter.ref: type = name_ref Adapter, imports.%Main.Adapter [concrete = constants.%Adapter] -// CHECK:STDOUT: %a: %Adapter = bind_name a, %a.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Adapter [from "adapt_specific_type.carbon"] { -// CHECK:STDOUT: complete_type_witness = imports.%Main.import_ref.709 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Main.import_ref.feb -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @C(imports.%Main.import_ref.5ab: type) [from "adapt_specific_type.carbon"] { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %T [symbolic = %require_complete (constants.%require_complete.4ae)] -// CHECK:STDOUT: %C: type = class_type @C, @C(%T) [symbolic = %C (constants.%C.f2e)] -// CHECK:STDOUT: %C.elem: type = unbound_element_type %C, %T [symbolic = %C.elem (constants.%C.elem.66c)] -// CHECK:STDOUT: %struct_type.x: type = struct_type {.x: @C.%T (%T)} [symbolic = %struct_type.x (constants.%struct_type.x.2ac)] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.x [symbolic = %complete_type (constants.%complete_type.433)] -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: complete_type_witness = imports.%Main.import_ref.b5f -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Main.import_ref.4c0 -// CHECK:STDOUT: .x = imports.%Main.import_ref.262 -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: // CHECK:STDOUT: fn @ImportedAccess(%a.param: %Adapter) -> %i32 { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %a.ref: %Adapter = name_ref a, %a // CHECK:STDOUT: %C.ref: %C.type = name_ref C, imports.%Main.C [concrete = constants.%C.generic] -// CHECK:STDOUT: %int_32.loc7: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc7: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] +// CHECK:STDOUT: %int_32.loc8: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] +// CHECK:STDOUT: %i32.loc8: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] // CHECK:STDOUT: %C: type = class_type @C, @C(constants.%i32) [concrete = constants.%C.239] -// CHECK:STDOUT: %.loc7_13.1: %C.239 = as_compatible %a.ref -// CHECK:STDOUT: %.loc7_13.2: %C.239 = converted %a.ref, %.loc7_13.1 +// CHECK:STDOUT: %.loc8_13.1: %C.239 = as_compatible %a.ref +// CHECK:STDOUT: %.loc8_13.2: %C.239 = converted %a.ref, %.loc8_13.1 // CHECK:STDOUT: %x.ref: %C.elem.ed6 = name_ref x, imports.%Main.import_ref.262 [concrete = imports.%.22b] -// CHECK:STDOUT: %.loc7_23.1: ref %i32 = class_element_access %.loc7_13.2, element0 -// CHECK:STDOUT: %.loc7_23.2: %i32 = bind_value %.loc7_23.1 -// CHECK:STDOUT: return %.loc7_23.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @C(constants.%T) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @C(constants.%i32) { -// CHECK:STDOUT: %T => constants.%i32 -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%complete_type.f8a -// CHECK:STDOUT: %C => constants.%C.239 -// CHECK:STDOUT: %C.elem => constants.%C.elem.ed6 -// CHECK:STDOUT: %struct_type.x => constants.%struct_type.x.767 -// CHECK:STDOUT: %complete_type => constants.%complete_type.c07 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_todo_extend_adapt_specific_type.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] -// CHECK:STDOUT: %C.type: type = generic_class_type @C [concrete] -// CHECK:STDOUT: %C.generic: %C.type = struct_value () [concrete] -// CHECK:STDOUT: %C.f2e: type = class_type @C, @C(%T) [symbolic] -// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T [symbolic] -// CHECK:STDOUT: %C.elem.66c: type = unbound_element_type %C.f2e, %T [symbolic] -// CHECK:STDOUT: %struct_type.x.2ac: type = struct_type {.x: %T} [symbolic] -// CHECK:STDOUT: %complete_type.433: = complete_type_witness %struct_type.x.2ac [symbolic] -// CHECK:STDOUT: %Adapter: type = class_type @Adapter [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %C.98a: type = class_type @C, @C(%i32) [concrete] -// CHECK:STDOUT: %i32.builtin: type = int_type signed, %int_32 [concrete] -// CHECK:STDOUT: %complete_type.f8a: = complete_type_witness %i32.builtin [concrete] -// CHECK:STDOUT: %C.elem.476: type = unbound_element_type %C.98a, %i32 [concrete] -// CHECK:STDOUT: %struct_type.x.ed6: type = struct_type {.x: %i32} [concrete] -// CHECK:STDOUT: %complete_type.1ec: = complete_type_witness %struct_type.x.ed6 [concrete] -// CHECK:STDOUT: %pattern_type.27e: type = pattern_type %Adapter [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %Access.type: type = fn_type @Access [concrete] -// CHECK:STDOUT: %Access: %Access.type = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/operators/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: .Adapter = %Adapter.decl -// CHECK:STDOUT: .Access = %Access.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %C.decl: %C.type = class_decl @C [concrete = constants.%C.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc4_9.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_9.2 (constants.%T)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %Adapter.decl: type = class_decl @Adapter [concrete = constants.%Adapter] {} {} -// CHECK:STDOUT: %Access.decl: %Access.type = fn_decl @Access [concrete = constants.%Access] { -// CHECK:STDOUT: %a.patt: %pattern_type.27e = binding_pattern a [concrete] -// CHECK:STDOUT: %a.param_patt: %pattern_type.27e = value_param_pattern %a.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %a.param: %Adapter = value_param call_param0 -// CHECK:STDOUT: %Adapter.ref: type = name_ref Adapter, file.%Adapter.decl [concrete = constants.%Adapter] -// CHECK:STDOUT: %a: %Adapter = bind_name a, %a.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @C(%T.loc4_9.1: type) { -// CHECK:STDOUT: %T.loc4_9.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_9.2 (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %T.loc4_9.2 [symbolic = %require_complete (constants.%require_complete.4ae)] -// CHECK:STDOUT: %C: type = class_type @C, @C(%T.loc4_9.2) [symbolic = %C (constants.%C.f2e)] -// CHECK:STDOUT: %C.elem: type = unbound_element_type %C, %T.loc4_9.2 [symbolic = %C.elem (constants.%C.elem.66c)] -// CHECK:STDOUT: %struct_type.x.loc6_1.2: type = struct_type {.x: @C.%T.loc4_9.2 (%T)} [symbolic = %struct_type.x.loc6_1.2 (constants.%struct_type.x.2ac)] -// CHECK:STDOUT: %complete_type.loc6_1.2: = complete_type_witness %struct_type.x.loc6_1.2 [symbolic = %complete_type.loc6_1.2 (constants.%complete_type.433)] -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc4_9.1 [symbolic = %T.loc4_9.2 (constants.%T)] -// CHECK:STDOUT: %.loc5: @C.%C.elem (%C.elem.66c) = field_decl x, element0 [concrete] -// CHECK:STDOUT: %struct_type.x.loc6_1.1: type = struct_type {.x: %T} [symbolic = %struct_type.x.loc6_1.2 (constants.%struct_type.x.2ac)] -// CHECK:STDOUT: %complete_type.loc6_1.1: = complete_type_witness %struct_type.x.loc6_1.1 [symbolic = %complete_type.loc6_1.2 (constants.%complete_type.433)] -// CHECK:STDOUT: complete_type_witness = %complete_type.loc6_1.1 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%C.f2e -// CHECK:STDOUT: .T = -// CHECK:STDOUT: .x = %.loc5 -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Adapter { -// CHECK:STDOUT: %C.ref: %C.type = name_ref C, file.%C.decl [concrete = constants.%C.generic] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %C: type = class_type @C, @C(constants.%i32) [concrete = constants.%C.98a] -// CHECK:STDOUT: adapt_decl %C [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness constants.%struct_type.x.ed6 [concrete = constants.%complete_type.1ec] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Adapter -// CHECK:STDOUT: .C = -// CHECK:STDOUT: .x = -// CHECK:STDOUT: extend %C -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Access(%a.param: %Adapter) -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %a.ref: %Adapter = name_ref a, %a -// CHECK:STDOUT: %x.ref: %C.elem.476 = name_ref x, @C.%.loc5 [concrete = @C.%.loc5] -// CHECK:STDOUT: %.loc21_11.1: %C.98a = converted %a.ref, [concrete = ] -// CHECK:STDOUT: %.loc21_11.2: %i32 = class_element_access , element0 [concrete = ] -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @C(constants.%T) { -// CHECK:STDOUT: %T.loc4_9.2 => constants.%T -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @C(constants.%i32) { -// CHECK:STDOUT: %T.loc4_9.2 => constants.%i32 -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%complete_type.f8a -// CHECK:STDOUT: %C => constants.%C.98a -// CHECK:STDOUT: %C.elem => constants.%C.elem.476 -// CHECK:STDOUT: %struct_type.x.loc6_1.2 => constants.%struct_type.x.ed6 -// CHECK:STDOUT: %complete_type.loc6_1.2 => constants.%complete_type.1ec +// CHECK:STDOUT: %.loc8_23.1: ref %i32 = class_element_access %.loc8_13.2, element0 +// CHECK:STDOUT: %.loc8_23.2: %i32 = bind_value %.loc8_23.1 +// CHECK:STDOUT: return %.loc8_23.2 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- extend_adapt_specific_type_library.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] // CHECK:STDOUT: %C.type: type = generic_class_type @C [concrete] // CHECK:STDOUT: %C.generic: %C.type = struct_value () [concrete] -// CHECK:STDOUT: %C.f2e: type = class_type @C, @C(%T) [symbolic] -// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T [symbolic] -// CHECK:STDOUT: %C.elem.66c: type = unbound_element_type %C.f2e, %T [symbolic] -// CHECK:STDOUT: %struct_type.x.2ac: type = struct_type {.x: %T} [symbolic] -// CHECK:STDOUT: %complete_type.433: = complete_type_witness %struct_type.x.2ac [symbolic] // CHECK:STDOUT: %Adapter: type = class_type @Adapter [concrete] // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %C.98a: type = class_type @C, @C(%i32) [concrete] -// CHECK:STDOUT: %i32.builtin: type = int_type signed, %int_32 [concrete] -// CHECK:STDOUT: %complete_type.f8a: = complete_type_witness %i32.builtin [concrete] -// CHECK:STDOUT: %C.elem.476: type = unbound_element_type %C.98a, %i32 [concrete] // CHECK:STDOUT: %struct_type.x.ed6: type = struct_type {.x: %i32} [concrete] // CHECK:STDOUT: %complete_type.1ec: = complete_type_witness %struct_type.x.ed6 [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: .Adapter = %Adapter.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %C.decl: %C.type = class_decl @C [concrete = constants.%C.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc7_9.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc7_9.2 (constants.%T)] -// CHECK:STDOUT: } // CHECK:STDOUT: %Adapter.decl: type = class_decl @Adapter [concrete = constants.%Adapter] {} {} // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic class @C(%T.loc7_9.1: type) { -// CHECK:STDOUT: %T.loc7_9.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc7_9.2 (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %T.loc7_9.2 [symbolic = %require_complete (constants.%require_complete.4ae)] -// CHECK:STDOUT: %C: type = class_type @C, @C(%T.loc7_9.2) [symbolic = %C (constants.%C.f2e)] -// CHECK:STDOUT: %C.elem: type = unbound_element_type %C, %T.loc7_9.2 [symbolic = %C.elem (constants.%C.elem.66c)] -// CHECK:STDOUT: %struct_type.x.loc9_1.2: type = struct_type {.x: @C.%T.loc7_9.2 (%T)} [symbolic = %struct_type.x.loc9_1.2 (constants.%struct_type.x.2ac)] -// CHECK:STDOUT: %complete_type.loc9_1.2: = complete_type_witness %struct_type.x.loc9_1.2 [symbolic = %complete_type.loc9_1.2 (constants.%complete_type.433)] -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc7_9.1 [symbolic = %T.loc7_9.2 (constants.%T)] -// CHECK:STDOUT: %.loc8: @C.%C.elem (%C.elem.66c) = field_decl x, element0 [concrete] -// CHECK:STDOUT: %struct_type.x.loc9_1.1: type = struct_type {.x: %T} [symbolic = %struct_type.x.loc9_1.2 (constants.%struct_type.x.2ac)] -// CHECK:STDOUT: %complete_type.loc9_1.1: = complete_type_witness %struct_type.x.loc9_1.1 [symbolic = %complete_type.loc9_1.2 (constants.%complete_type.433)] -// CHECK:STDOUT: complete_type_witness = %complete_type.loc9_1.1 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%C.f2e -// CHECK:STDOUT: .T = -// CHECK:STDOUT: .x = %.loc8 -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: // CHECK:STDOUT: class @Adapter { // CHECK:STDOUT: %C.ref: %C.type = name_ref C, file.%C.decl [concrete = constants.%C.generic] // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] @@ -610,147 +258,6 @@ fn ImportedConvertLocal(a: Adapter(C)) -> i32 { // CHECK:STDOUT: extend %C // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @C(constants.%T) { -// CHECK:STDOUT: %T.loc7_9.2 => constants.%T -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @C(constants.%i32) { -// CHECK:STDOUT: %T.loc7_9.2 => constants.%i32 -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%complete_type.f8a -// CHECK:STDOUT: %C => constants.%C.98a -// CHECK:STDOUT: %C.elem => constants.%C.elem.476 -// CHECK:STDOUT: %struct_type.x.loc9_1.2 => constants.%struct_type.x.ed6 -// CHECK:STDOUT: %complete_type.loc9_1.2 => constants.%complete_type.1ec -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_todo_import_extend_adapt_specific_type.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Adapter: type = class_type @Adapter [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %struct_type.x.2ac: type = struct_type {.x: %T} [symbolic] -// CHECK:STDOUT: %complete_type.433: = complete_type_witness %struct_type.x.2ac [symbolic] -// CHECK:STDOUT: %C.f2e: type = class_type @C, @C(%T) [symbolic] -// CHECK:STDOUT: %C.239: type = class_type @C, @C(%i32) [concrete] -// CHECK:STDOUT: %struct_type.x.767: type = struct_type {.x: %i32} [concrete] -// CHECK:STDOUT: %complete_type.c07: = complete_type_witness %struct_type.x.767 [concrete] -// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T [symbolic] -// CHECK:STDOUT: %C.elem.66c: type = unbound_element_type %C.f2e, %T [symbolic] -// CHECK:STDOUT: %i32.builtin: type = int_type signed, %int_32 [concrete] -// CHECK:STDOUT: %complete_type.f8a: = complete_type_witness %i32.builtin [concrete] -// CHECK:STDOUT: %C.elem.ed6: type = unbound_element_type %C.239, %i32 [concrete] -// CHECK:STDOUT: %pattern_type.27e: type = pattern_type %Adapter [concrete] -// CHECK:STDOUT: %pattern_type.501: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %ImportedAccess.type: type = fn_type @ImportedAccess [concrete] -// CHECK:STDOUT: %ImportedAccess: %ImportedAccess.type = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Main.C = import_ref Main//extend_adapt_specific_type_library, C, unloaded -// CHECK:STDOUT: %Main.Adapter: type = import_ref Main//extend_adapt_specific_type_library, Adapter, loaded [concrete = constants.%Adapter] -// CHECK:STDOUT: %Core.ece: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Main.import_ref.5ab: type = import_ref Main//extend_adapt_specific_type_library, loc7_9, loaded [symbolic = @C.%T (constants.%T)] -// CHECK:STDOUT: %Main.import_ref.b5f: = import_ref Main//extend_adapt_specific_type_library, loc9_1, loaded [symbolic = @C.%complete_type (constants.%complete_type.433)] -// CHECK:STDOUT: %Main.import_ref.4c0 = import_ref Main//extend_adapt_specific_type_library, inst26 [no loc], unloaded -// CHECK:STDOUT: %Main.import_ref.262: @C.%C.elem (%C.elem.66c) = import_ref Main//extend_adapt_specific_type_library, loc8_8, loaded [concrete = %.22b] -// CHECK:STDOUT: %Main.import_ref.709: = import_ref Main//extend_adapt_specific_type_library, loc13_1, loaded [concrete = constants.%complete_type.c07] -// CHECK:STDOUT: %Main.import_ref.feb = import_ref Main//extend_adapt_specific_type_library, inst42 [no loc], unloaded -// CHECK:STDOUT: %Main.import_ref.19d12e.2: type = import_ref Main//extend_adapt_specific_type_library, loc12_21, loaded [concrete = constants.%C.239] -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: %.22b: @C.%C.elem (%C.elem.66c) = field_decl x, element0 [concrete] -// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/operators/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .C = imports.%Main.C -// CHECK:STDOUT: .Adapter = imports.%Main.Adapter -// CHECK:STDOUT: .Core = imports.%Core.ece -// CHECK:STDOUT: .ImportedAccess = %ImportedAccess.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %default.import = import -// CHECK:STDOUT: %ImportedAccess.decl: %ImportedAccess.type = fn_decl @ImportedAccess [concrete = constants.%ImportedAccess] { -// CHECK:STDOUT: %a.patt: %pattern_type.27e = binding_pattern a [concrete] -// CHECK:STDOUT: %a.param_patt: %pattern_type.27e = value_param_pattern %a.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.501 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.501 = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %a.param: %Adapter = value_param call_param0 -// CHECK:STDOUT: %Adapter.ref: type = name_ref Adapter, imports.%Main.Adapter [concrete = constants.%Adapter] -// CHECK:STDOUT: %a: %Adapter = bind_name a, %a.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Adapter [from "extend_adapt_specific_type_library.carbon"] { -// CHECK:STDOUT: complete_type_witness = imports.%Main.import_ref.709 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Main.import_ref.feb -// CHECK:STDOUT: .x = -// CHECK:STDOUT: extend imports.%Main.import_ref.19d12e.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @C(imports.%Main.import_ref.5ab: type) [from "extend_adapt_specific_type_library.carbon"] { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %T [symbolic = %require_complete (constants.%require_complete.4ae)] -// CHECK:STDOUT: %C: type = class_type @C, @C(%T) [symbolic = %C (constants.%C.f2e)] -// CHECK:STDOUT: %C.elem: type = unbound_element_type %C, %T [symbolic = %C.elem (constants.%C.elem.66c)] -// CHECK:STDOUT: %struct_type.x: type = struct_type {.x: @C.%T (%T)} [symbolic = %struct_type.x (constants.%struct_type.x.2ac)] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.x [symbolic = %complete_type (constants.%complete_type.433)] -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: complete_type_witness = imports.%Main.import_ref.b5f -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Main.import_ref.4c0 -// CHECK:STDOUT: .x = imports.%Main.import_ref.262 -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @ImportedAccess(%a.param: %Adapter) -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %a.ref: %Adapter = name_ref a, %a -// CHECK:STDOUT: %x.ref: %C.elem.ed6 = name_ref x, imports.%Main.import_ref.262 [concrete = imports.%.22b] -// CHECK:STDOUT: %.loc15_11.1: %C.239 = converted %a.ref, [concrete = ] -// CHECK:STDOUT: %.loc15_11.2: %i32 = class_element_access , element0 [concrete = ] -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @C(constants.%T) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @C(constants.%i32) { -// CHECK:STDOUT: %T => constants.%i32 -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%complete_type.f8a -// CHECK:STDOUT: %C => constants.%C.239 -// CHECK:STDOUT: %C.elem => constants.%C.elem.ed6 -// CHECK:STDOUT: %struct_type.x => constants.%struct_type.x.767 -// CHECK:STDOUT: %complete_type => constants.%complete_type.c07 -// CHECK:STDOUT: } -// CHECK:STDOUT: // CHECK:STDOUT: --- adapt_generic_type.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { @@ -762,8 +269,6 @@ fn ImportedConvertLocal(a: Adapter(C)) -> i32 { // CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T [symbolic] // CHECK:STDOUT: %complete_type.f87: = complete_type_witness %T [symbolic] // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %Adapter.e4c: type = class_type @Adapter, @Adapter(%i32) [concrete] // CHECK:STDOUT: %pattern_type.5a0: type = pattern_type %Adapter.e4c [concrete] @@ -776,25 +281,13 @@ fn ImportedConvertLocal(a: Adapter(C)) -> i32 { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Adapter = %Adapter.decl -// CHECK:STDOUT: .Convert = %Convert.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core // CHECK:STDOUT: %Adapter.decl: %Adapter.type = class_decl @Adapter [concrete = constants.%Adapter.generic] { // CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc4_15.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_15.2 (constants.%T)] +// CHECK:STDOUT: %T.loc5_15.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc5_15.2 (constants.%T)] // CHECK:STDOUT: } // CHECK:STDOUT: %Convert.decl: %Convert.type = fn_decl @Convert [concrete = constants.%Convert] { // CHECK:STDOUT: %a.patt: %pattern_type.5a0 = binding_pattern a [concrete] @@ -802,13 +295,13 @@ fn ImportedConvertLocal(a: Adapter(C)) -> i32 { // CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] // CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32.loc8_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc8_32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] +// CHECK:STDOUT: %int_32.loc9_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] +// CHECK:STDOUT: %i32.loc9_32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] // CHECK:STDOUT: %a.param: %Adapter.e4c = value_param call_param0 -// CHECK:STDOUT: %.loc8: type = splice_block %Adapter [concrete = constants.%Adapter.e4c] { +// CHECK:STDOUT: %.loc9: type = splice_block %Adapter [concrete = constants.%Adapter.e4c] { // CHECK:STDOUT: %Adapter.ref: %Adapter.type = name_ref Adapter, file.%Adapter.decl [concrete = constants.%Adapter.generic] -// CHECK:STDOUT: %int_32.loc8_23: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc8_23: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] +// CHECK:STDOUT: %int_32.loc9_23: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] +// CHECK:STDOUT: %i32.loc9_23: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] // CHECK:STDOUT: %Adapter: type = class_type @Adapter, @Adapter(constants.%i32) [concrete = constants.%Adapter.e4c] // CHECK:STDOUT: } // CHECK:STDOUT: %a: %Adapter.e4c = bind_name a, %a.param @@ -817,18 +310,18 @@ fn ImportedConvertLocal(a: Adapter(C)) -> i32 { // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic class @Adapter(%T.loc4_15.1: type) { -// CHECK:STDOUT: %T.loc4_15.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_15.2 (constants.%T)] +// CHECK:STDOUT: generic class @Adapter(%T.loc5_15.1: type) { +// CHECK:STDOUT: %T.loc5_15.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc5_15.2 (constants.%T)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %T.loc4_15.2 [symbolic = %require_complete (constants.%require_complete.4ae)] -// CHECK:STDOUT: %complete_type.loc6_1.2: = complete_type_witness %T.loc4_15.2 [symbolic = %complete_type.loc6_1.2 (constants.%complete_type.f87)] +// CHECK:STDOUT: %require_complete: = require_complete_type %T.loc5_15.2 [symbolic = %require_complete (constants.%require_complete.4ae)] +// CHECK:STDOUT: %complete_type.loc7_1.2: = complete_type_witness %T.loc5_15.2 [symbolic = %complete_type.loc7_1.2 (constants.%complete_type.f87)] // CHECK:STDOUT: // CHECK:STDOUT: class { -// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc4_15.1 [symbolic = %T.loc4_15.2 (constants.%T)] +// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc5_15.1 [symbolic = %T.loc5_15.2 (constants.%T)] // CHECK:STDOUT: adapt_decl %T.ref [concrete] -// CHECK:STDOUT: %complete_type.loc6_1.1: = complete_type_witness constants.%T [symbolic = %complete_type.loc6_1.2 (constants.%complete_type.f87)] -// CHECK:STDOUT: complete_type_witness = %complete_type.loc6_1.1 +// CHECK:STDOUT: %complete_type.loc7_1.1: = complete_type_witness constants.%T [symbolic = %complete_type.loc7_1.2 (constants.%complete_type.f87)] +// CHECK:STDOUT: complete_type_witness = %complete_type.loc7_1.1 // CHECK:STDOUT: // CHECK:STDOUT: !members: // CHECK:STDOUT: .Self = constants.%Adapter.0e3 @@ -839,188 +332,58 @@ fn ImportedConvertLocal(a: Adapter(C)) -> i32 { // CHECK:STDOUT: fn @Convert(%a.param: %Adapter.e4c) -> %i32 { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %a.ref: %Adapter.e4c = name_ref a, %a -// CHECK:STDOUT: %int_32.loc9: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc9: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc9_12.1: %i32 = as_compatible %a.ref -// CHECK:STDOUT: %.loc9_12.2: %i32 = converted %a.ref, %.loc9_12.1 -// CHECK:STDOUT: return %.loc9_12.2 +// CHECK:STDOUT: %int_32.loc10: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] +// CHECK:STDOUT: %i32.loc10: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] +// CHECK:STDOUT: %.loc10_12.1: %i32 = as_compatible %a.ref +// CHECK:STDOUT: %.loc10_12.2: %i32 = converted %a.ref, %.loc10_12.1 +// CHECK:STDOUT: return %.loc10_12.2 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Adapter(constants.%T) { -// CHECK:STDOUT: %T.loc4_15.2 => constants.%T +// CHECK:STDOUT: %T.loc5_15.2 => constants.%T // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Adapter(constants.%i32) { -// CHECK:STDOUT: %T.loc4_15.2 => constants.%i32 +// CHECK:STDOUT: %T.loc5_15.2 => constants.%i32 // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete => constants.%complete_type.f8a -// CHECK:STDOUT: %complete_type.loc6_1.2 => constants.%complete_type.1eb +// CHECK:STDOUT: %complete_type.loc7_1.2 => constants.%complete_type.1eb // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_adapt_generic_type.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { -// CHECK:STDOUT: %Adapter.type: type = generic_class_type @Adapter [concrete] -// CHECK:STDOUT: %Adapter.generic: %Adapter.type = struct_value () [concrete] -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %complete_type.f87: = complete_type_witness %T [symbolic] -// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T [symbolic] // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %Adapter.e4c: type = class_type @Adapter, @Adapter(%i32) [concrete] -// CHECK:STDOUT: %pattern_type.5a0: type = pattern_type %Adapter.e4c [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %ImportedConvert.type: type = fn_type @ImportedConvert [concrete] -// CHECK:STDOUT: %ImportedConvert: %ImportedConvert.type = struct_value () [concrete] -// CHECK:STDOUT: %i32.builtin: type = int_type signed, %int_32 [concrete] -// CHECK:STDOUT: %complete_type.f8a: = complete_type_witness %i32.builtin [concrete] -// CHECK:STDOUT: %complete_type.1eb: = complete_type_witness %i32 [concrete] // CHECK:STDOUT: %C: type = class_type @C [concrete] // CHECK:STDOUT: %C.elem: type = unbound_element_type %C, %i32 [concrete] -// CHECK:STDOUT: %struct_type.n: type = struct_type {.n: %i32} [concrete] -// CHECK:STDOUT: %complete_type.54b: = complete_type_witness %struct_type.n [concrete] // CHECK:STDOUT: %Adapter.58f: type = class_type @Adapter, @Adapter(%C) [concrete] -// CHECK:STDOUT: %pattern_type.5f8: type = pattern_type %Adapter.58f [concrete] -// CHECK:STDOUT: %ImportedConvertLocal.type: type = fn_type @ImportedConvertLocal [concrete] -// CHECK:STDOUT: %ImportedConvertLocal: %ImportedConvertLocal.type = struct_value () [concrete] -// CHECK:STDOUT: %complete_type.af2: = complete_type_witness %C [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { -// CHECK:STDOUT: %Main.Adapter: %Adapter.type = import_ref Main//adapt_generic_type, Adapter, loaded [concrete = constants.%Adapter.generic] -// CHECK:STDOUT: %Main.Convert = import_ref Main//adapt_generic_type, Convert, unloaded -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Main.import_ref.5ab: type = import_ref Main//adapt_generic_type, loc4_15, loaded [symbolic = @Adapter.%T (constants.%T)] -// CHECK:STDOUT: %Main.import_ref.fb3: = import_ref Main//adapt_generic_type, loc6_1, loaded [symbolic = @Adapter.%complete_type (constants.%complete_type.f87)] -// CHECK:STDOUT: %Main.import_ref.9a3 = import_ref Main//adapt_generic_type, inst26 [no loc], unloaded -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Adapter = imports.%Main.Adapter -// CHECK:STDOUT: .Convert = imports.%Main.Convert -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .ImportedConvert = %ImportedConvert.decl -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: .ImportedConvertLocal = %ImportedConvertLocal.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %default.import = import -// CHECK:STDOUT: %ImportedConvert.decl: %ImportedConvert.type = fn_decl @ImportedConvert [concrete = constants.%ImportedConvert] { -// CHECK:STDOUT: %a.patt: %pattern_type.5a0 = binding_pattern a [concrete] -// CHECK:STDOUT: %a.param_patt: %pattern_type.5a0 = value_param_pattern %a.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32.loc6_40: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc6_40: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %a.param: %Adapter.e4c = value_param call_param0 -// CHECK:STDOUT: %.loc6: type = splice_block %Adapter [concrete = constants.%Adapter.e4c] { -// CHECK:STDOUT: %Adapter.ref: %Adapter.type = name_ref Adapter, imports.%Main.Adapter [concrete = constants.%Adapter.generic] -// CHECK:STDOUT: %int_32.loc6_31: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc6_31: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %Adapter: type = class_type @Adapter, @Adapter(constants.%i32) [concrete = constants.%Adapter.e4c] -// CHECK:STDOUT: } -// CHECK:STDOUT: %a: %Adapter.e4c = bind_name a, %a.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: %ImportedConvertLocal.decl: %ImportedConvertLocal.type = fn_decl @ImportedConvertLocal [concrete = constants.%ImportedConvertLocal] { -// CHECK:STDOUT: %a.patt: %pattern_type.5f8 = binding_pattern a [concrete] -// CHECK:STDOUT: %a.param_patt: %pattern_type.5f8 = value_param_pattern %a.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %a.param: %Adapter.58f = value_param call_param0 -// CHECK:STDOUT: %.loc14: type = splice_block %Adapter [concrete = constants.%Adapter.58f] { -// CHECK:STDOUT: %Adapter.ref: %Adapter.type = name_ref Adapter, imports.%Main.Adapter [concrete = constants.%Adapter.generic] -// CHECK:STDOUT: %C.ref.loc14: type = name_ref C, file.%C.decl [concrete = constants.%C] -// CHECK:STDOUT: %Adapter: type = class_type @Adapter, @Adapter(constants.%C) [concrete = constants.%Adapter.58f] -// CHECK:STDOUT: } -// CHECK:STDOUT: %a: %Adapter.58f = bind_name a, %a.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Adapter(imports.%Main.import_ref.5ab: type) [from "adapt_generic_type.carbon"] { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %T [symbolic = %require_complete (constants.%require_complete.4ae)] -// CHECK:STDOUT: %complete_type: = complete_type_witness %T [symbolic = %complete_type (constants.%complete_type.f87)] -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: complete_type_witness = imports.%Main.import_ref.fb3 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Main.import_ref.9a3 -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc11: %C.elem = field_decl n, element0 [concrete] -// CHECK:STDOUT: %struct_type.n: type = struct_type {.n: %i32} [concrete = constants.%struct_type.n] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.n [concrete = constants.%complete_type.54b] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%C -// CHECK:STDOUT: .n = %.loc11 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @ImportedConvert(%a.param: %Adapter.e4c) -> %i32 { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %a.ref: %Adapter.e4c = name_ref a, %a -// CHECK:STDOUT: %int_32.loc7: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc7: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc7_12.1: %i32 = as_compatible %a.ref -// CHECK:STDOUT: %.loc7_12.2: %i32 = converted %a.ref, %.loc7_12.1 -// CHECK:STDOUT: return %.loc7_12.2 +// CHECK:STDOUT: %int_32.loc8: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] +// CHECK:STDOUT: %i32.loc8: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] +// CHECK:STDOUT: %.loc8_12.1: %i32 = as_compatible %a.ref +// CHECK:STDOUT: %.loc8_12.2: %i32 = converted %a.ref, %.loc8_12.1 +// CHECK:STDOUT: return %.loc8_12.2 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @ImportedConvertLocal(%a.param: %Adapter.58f) -> %i32 { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %a.ref: %Adapter.58f = name_ref a, %a -// CHECK:STDOUT: %C.ref.loc15: type = name_ref C, file.%C.decl [concrete = constants.%C] -// CHECK:STDOUT: %.loc15_13.1: %C = as_compatible %a.ref -// CHECK:STDOUT: %.loc15_13.2: %C = converted %a.ref, %.loc15_13.1 -// CHECK:STDOUT: %n.ref: %C.elem = name_ref n, @C.%.loc11 [concrete = @C.%.loc11] -// CHECK:STDOUT: %.loc15_18.1: ref %i32 = class_element_access %.loc15_13.2, element0 -// CHECK:STDOUT: %.loc15_18.2: %i32 = bind_value %.loc15_18.1 -// CHECK:STDOUT: return %.loc15_18.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Adapter(constants.%T) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Adapter(constants.%i32) { -// CHECK:STDOUT: %T => constants.%i32 -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%complete_type.f8a -// CHECK:STDOUT: %complete_type => constants.%complete_type.1eb -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Adapter(constants.%C) { -// CHECK:STDOUT: %T => constants.%C -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%complete_type.54b -// CHECK:STDOUT: %complete_type => constants.%complete_type.af2 +// CHECK:STDOUT: %C.ref.loc18: type = name_ref C, file.%C.decl [concrete = constants.%C] +// CHECK:STDOUT: %.loc18_13.1: %C = as_compatible %a.ref +// CHECK:STDOUT: %.loc18_13.2: %C = converted %a.ref, %.loc18_13.1 +// CHECK:STDOUT: %n.ref: %C.elem = name_ref n, @C.%.loc13 [concrete = @C.%.loc13] +// CHECK:STDOUT: %.loc18_18.1: ref %i32 = class_element_access %.loc18_13.2, element0 +// CHECK:STDOUT: %.loc18_18.2: %i32 = bind_value %.loc18_18.1 +// CHECK:STDOUT: return %.loc18_18.2 // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/generic/base_is_generic.carbon b/toolchain/check/testdata/class/generic/base_is_generic.carbon index f302f62fb33a9..05e58fbdc439c 100644 --- a/toolchain/check/testdata/class/generic/base_is_generic.carbon +++ b/toolchain/check/testdata/class/generic/base_is_generic.carbon @@ -2,6 +2,8 @@ // Exceptions. See /LICENSE for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// // AUTOUPDATE // TIP: To test this file alone, run: // TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/generic/base_is_generic.carbon @@ -20,12 +22,16 @@ class Param { var y: i32; } +//@dump-sem-ir-begin class Derived { extend base: Base(Param); } +//@dump-sem-ir-end fn DoubleFieldAccess(d: Derived) -> i32 { + //@dump-sem-ir-begin return d.x.y; + //@dump-sem-ir-end } // --- import.carbon @@ -35,7 +41,9 @@ library "[[@TEST_NAME]]"; import library "extend_generic_base"; fn ImportedDoubleFieldAccess(d: Derived) -> i32 { + //@dump-sem-ir-begin return d.x.y; + //@dump-sem-ir-end } // --- fail_todo_extend_symbolic_base.carbon @@ -66,12 +74,16 @@ base class X(U:! type) { fn G() -> U { return G(); } } +//@dump-sem-ir-begin class C(T:! type) { extend base: X(T); } +//@dump-sem-ir-end fn F() { + //@dump-sem-ir-begin let i: i32 = C(i32).G(); + //@dump-sem-ir-end } @@ -82,126 +94,40 @@ library "[[@TEST_NAME]]"; import library "extend_generic_symbolic_base"; fn H() { - let j: i32 = C(i32).G(); + //@dump-sem-ir-begin + let i: i32 = C(i32).G(); + //@dump-sem-ir-end } // CHECK:STDOUT: --- extend_generic_base.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] // CHECK:STDOUT: %Base.type: type = generic_class_type @Base [concrete] // CHECK:STDOUT: %Base.generic: %Base.type = struct_value () [concrete] -// CHECK:STDOUT: %Base.370: type = class_type @Base, @Base(%T) [symbolic] -// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T [symbolic] -// CHECK:STDOUT: %Base.elem.9af: type = unbound_element_type %Base.370, %T [symbolic] -// CHECK:STDOUT: %struct_type.x.2ac: type = struct_type {.x: %T} [symbolic] -// CHECK:STDOUT: %complete_type.433: = complete_type_witness %struct_type.x.2ac [symbolic] // CHECK:STDOUT: %Param: type = class_type @Param [concrete] // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %Param.elem: type = unbound_element_type %Param, %i32 [concrete] -// CHECK:STDOUT: %struct_type.y: type = struct_type {.y: %i32} [concrete] -// CHECK:STDOUT: %complete_type.0f9: = complete_type_witness %struct_type.y [concrete] // CHECK:STDOUT: %Derived: type = class_type @Derived [concrete] // CHECK:STDOUT: %Base.7a8: type = class_type @Base, @Base(%Param) [concrete] // CHECK:STDOUT: %Base.elem.d1f: type = unbound_element_type %Base.7a8, %Param [concrete] -// CHECK:STDOUT: %struct_type.x.975: type = struct_type {.x: %Param} [concrete] -// CHECK:STDOUT: %complete_type.db3: = complete_type_witness %struct_type.x.975 [concrete] // CHECK:STDOUT: %Derived.elem: type = unbound_element_type %Derived, %Base.7a8 [concrete] // CHECK:STDOUT: %struct_type.base.8bc: type = struct_type {.base: %Base.7a8} [concrete] // CHECK:STDOUT: %complete_type.b07: = complete_type_witness %struct_type.base.8bc [concrete] -// CHECK:STDOUT: %pattern_type.fb9: type = pattern_type %Derived [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %DoubleFieldAccess.type: type = fn_type @DoubleFieldAccess [concrete] -// CHECK:STDOUT: %DoubleFieldAccess: %DoubleFieldAccess.type = struct_value () [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Base = %Base.decl -// CHECK:STDOUT: .Param = %Param.decl -// CHECK:STDOUT: .Derived = %Derived.decl -// CHECK:STDOUT: .DoubleFieldAccess = %DoubleFieldAccess.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Base.decl: %Base.type = class_decl @Base [concrete = constants.%Base.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc4_17.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_17.2 (constants.%T)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %Param.decl: type = class_decl @Param [concrete = constants.%Param] {} {} // CHECK:STDOUT: %Derived.decl: type = class_decl @Derived [concrete = constants.%Derived] {} {} -// CHECK:STDOUT: %DoubleFieldAccess.decl: %DoubleFieldAccess.type = fn_decl @DoubleFieldAccess [concrete = constants.%DoubleFieldAccess] { -// CHECK:STDOUT: %d.patt: %pattern_type.fb9 = binding_pattern d [concrete] -// CHECK:STDOUT: %d.param_patt: %pattern_type.fb9 = value_param_pattern %d.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %d.param: %Derived = value_param call_param0 -// CHECK:STDOUT: %Derived.ref: type = name_ref Derived, file.%Derived.decl [concrete = constants.%Derived] -// CHECK:STDOUT: %d: %Derived = bind_name d, %d.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Base(%T.loc4_17.1: type) { -// CHECK:STDOUT: %T.loc4_17.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_17.2 (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %T.loc4_17.2 [symbolic = %require_complete (constants.%require_complete.4ae)] -// CHECK:STDOUT: %Base: type = class_type @Base, @Base(%T.loc4_17.2) [symbolic = %Base (constants.%Base.370)] -// CHECK:STDOUT: %Base.elem: type = unbound_element_type %Base, %T.loc4_17.2 [symbolic = %Base.elem (constants.%Base.elem.9af)] -// CHECK:STDOUT: %struct_type.x.loc6_1.2: type = struct_type {.x: @Base.%T.loc4_17.2 (%T)} [symbolic = %struct_type.x.loc6_1.2 (constants.%struct_type.x.2ac)] -// CHECK:STDOUT: %complete_type.loc6_1.2: = complete_type_witness %struct_type.x.loc6_1.2 [symbolic = %complete_type.loc6_1.2 (constants.%complete_type.433)] -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc4_17.1 [symbolic = %T.loc4_17.2 (constants.%T)] -// CHECK:STDOUT: %.loc5: @Base.%Base.elem (%Base.elem.9af) = field_decl x, element0 [concrete] -// CHECK:STDOUT: %struct_type.x.loc6_1.1: type = struct_type {.x: %T} [symbolic = %struct_type.x.loc6_1.2 (constants.%struct_type.x.2ac)] -// CHECK:STDOUT: %complete_type.loc6_1.1: = complete_type_witness %struct_type.x.loc6_1.1 [symbolic = %complete_type.loc6_1.2 (constants.%complete_type.433)] -// CHECK:STDOUT: complete_type_witness = %complete_type.loc6_1.1 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Base.370 -// CHECK:STDOUT: .T = -// CHECK:STDOUT: .x = %.loc5 -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Param { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc9: %Param.elem = field_decl y, element0 [concrete] -// CHECK:STDOUT: %struct_type.y: type = struct_type {.y: %i32} [concrete = constants.%struct_type.y] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.y [concrete = constants.%complete_type.0f9] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Param -// CHECK:STDOUT: .y = %.loc9 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: class @Derived { // CHECK:STDOUT: %Base.ref: %Base.type = name_ref Base, file.%Base.decl [concrete = constants.%Base.generic] // CHECK:STDOUT: %Param.ref: type = name_ref Param, file.%Param.decl [concrete = constants.%Param] // CHECK:STDOUT: %Base: type = class_type @Base, @Base(constants.%Param) [concrete = constants.%Base.7a8] -// CHECK:STDOUT: %.loc13: %Derived.elem = base_decl %Base, element0 [concrete] +// CHECK:STDOUT: %.loc14: %Derived.elem = base_decl %Base, element0 [concrete] // CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %Base.7a8} [concrete = constants.%struct_type.base.8bc] // CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base [concrete = constants.%complete_type.b07] // CHECK:STDOUT: complete_type_witness = %complete_type @@ -210,7 +136,7 @@ fn H() { // CHECK:STDOUT: .Self = constants.%Derived // CHECK:STDOUT: .Base = // CHECK:STDOUT: .Param = -// CHECK:STDOUT: .base = %.loc13 +// CHECK:STDOUT: .base = %.loc14 // CHECK:STDOUT: .x = // CHECK:STDOUT: extend %Base // CHECK:STDOUT: } @@ -219,28 +145,13 @@ fn H() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %d.ref: %Derived = name_ref d, %d // CHECK:STDOUT: %x.ref: %Base.elem.d1f = name_ref x, @Base.%.loc5 [concrete = @Base.%.loc5] -// CHECK:STDOUT: %.loc17_11.1: ref %Base.7a8 = class_element_access %d.ref, element0 -// CHECK:STDOUT: %.loc17_11.2: ref %Base.7a8 = converted %d.ref, %.loc17_11.1 -// CHECK:STDOUT: %.loc17_11.3: ref %Param = class_element_access %.loc17_11.2, element0 +// CHECK:STDOUT: %.loc20_11.1: ref %Base.7a8 = class_element_access %d.ref, element0 +// CHECK:STDOUT: %.loc20_11.2: ref %Base.7a8 = converted %d.ref, %.loc20_11.1 +// CHECK:STDOUT: %.loc20_11.3: ref %Param = class_element_access %.loc20_11.2, element0 // CHECK:STDOUT: %y.ref: %Param.elem = name_ref y, @Param.%.loc9 [concrete = @Param.%.loc9] -// CHECK:STDOUT: %.loc17_13.1: ref %i32 = class_element_access %.loc17_11.3, element0 -// CHECK:STDOUT: %.loc17_13.2: %i32 = bind_value %.loc17_13.1 -// CHECK:STDOUT: return %.loc17_13.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Base(constants.%T) { -// CHECK:STDOUT: %T.loc4_17.2 => constants.%T -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Base(constants.%Param) { -// CHECK:STDOUT: %T.loc4_17.2 => constants.%Param -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%complete_type.0f9 -// CHECK:STDOUT: %Base => constants.%Base.7a8 -// CHECK:STDOUT: %Base.elem => constants.%Base.elem.d1f -// CHECK:STDOUT: %struct_type.x.loc6_1.2 => constants.%struct_type.x.975 -// CHECK:STDOUT: %complete_type.loc6_1.2 => constants.%complete_type.db3 +// CHECK:STDOUT: %.loc20_13.1: ref %i32 = class_element_access %.loc20_11.3, element0 +// CHECK:STDOUT: %.loc20_13.2: %i32 = bind_value %.loc20_13.1 +// CHECK:STDOUT: return %.loc20_13.2 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import.carbon @@ -249,283 +160,54 @@ fn H() { // CHECK:STDOUT: %Derived: type = class_type @Derived [concrete] // CHECK:STDOUT: %Param: type = class_type @Param [concrete] // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %struct_type.y: type = struct_type {.y: %i32} [concrete] -// CHECK:STDOUT: %complete_type.09d: = complete_type_witness %struct_type.y [concrete] // CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %struct_type.x.2ac: type = struct_type {.x: %T} [symbolic] -// CHECK:STDOUT: %complete_type.433: = complete_type_witness %struct_type.x.2ac [symbolic] // CHECK:STDOUT: %Base.370: type = class_type @Base, @Base(%T) [symbolic] // CHECK:STDOUT: %Base.7a8: type = class_type @Base, @Base(%Param) [concrete] -// CHECK:STDOUT: %struct_type.base.8bc: type = struct_type {.base: %Base.7a8} [concrete] -// CHECK:STDOUT: %complete_type.b07: = complete_type_witness %struct_type.base.8bc [concrete] -// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T [symbolic] // CHECK:STDOUT: %Base.elem.9af: type = unbound_element_type %Base.370, %T [symbolic] // CHECK:STDOUT: %Base.elem.d1f: type = unbound_element_type %Base.7a8, %Param [concrete] -// CHECK:STDOUT: %struct_type.x.975: type = struct_type {.x: %Param} [concrete] -// CHECK:STDOUT: %complete_type.db3: = complete_type_witness %struct_type.x.975 [concrete] -// CHECK:STDOUT: %pattern_type.fb9: type = pattern_type %Derived [concrete] -// CHECK:STDOUT: %pattern_type.501: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %ImportedDoubleFieldAccess.type: type = fn_type @ImportedDoubleFieldAccess [concrete] -// CHECK:STDOUT: %ImportedDoubleFieldAccess: %ImportedDoubleFieldAccess.type = struct_value () [concrete] // CHECK:STDOUT: %Param.elem: type = unbound_element_type %Param, %i32 [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { -// CHECK:STDOUT: %Main.Base = import_ref Main//extend_generic_base, Base, unloaded -// CHECK:STDOUT: %Main.Param = import_ref Main//extend_generic_base, Param, unloaded -// CHECK:STDOUT: %Main.Derived: type = import_ref Main//extend_generic_base, Derived, loaded [concrete = constants.%Derived] -// CHECK:STDOUT: %Main.DoubleFieldAccess = import_ref Main//extend_generic_base, DoubleFieldAccess, unloaded -// CHECK:STDOUT: %Core.ece: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Main.import_ref.e8d: = import_ref Main//extend_generic_base, loc10_1, loaded [concrete = constants.%complete_type.09d] -// CHECK:STDOUT: %Main.import_ref.446 = import_ref Main//extend_generic_base, inst42 [no loc], unloaded // CHECK:STDOUT: %Main.import_ref.a92: %Param.elem = import_ref Main//extend_generic_base, loc9_8, loaded [concrete = %.be7] -// CHECK:STDOUT: %Main.import_ref.5ab: type = import_ref Main//extend_generic_base, loc4_17, loaded [symbolic = @Base.%T (constants.%T)] -// CHECK:STDOUT: %Main.import_ref.b5f: = import_ref Main//extend_generic_base, loc6_1, loaded [symbolic = @Base.%complete_type (constants.%complete_type.433)] -// CHECK:STDOUT: %Main.import_ref.8e0 = import_ref Main//extend_generic_base, inst26 [no loc], unloaded // CHECK:STDOUT: %Main.import_ref.7f7: @Base.%Base.elem (%Base.elem.9af) = import_ref Main//extend_generic_base, loc5_8, loaded [concrete = %.e66] -// CHECK:STDOUT: %Main.import_ref.bd0: = import_ref Main//extend_generic_base, loc14_1, loaded [concrete = constants.%complete_type.b07] -// CHECK:STDOUT: %Main.import_ref.f6c = import_ref Main//extend_generic_base, inst76 [no loc], unloaded -// CHECK:STDOUT: %Main.import_ref.d24 = import_ref Main//extend_generic_base, loc13_27, unloaded -// CHECK:STDOUT: %Main.import_ref.77a301.2: type = import_ref Main//extend_generic_base, loc13_26, loaded [concrete = constants.%Base.7a8] -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] // CHECK:STDOUT: %.e66: @Base.%Base.elem (%Base.elem.9af) = field_decl x, element0 [concrete] // CHECK:STDOUT: %.be7: %Param.elem = field_decl y, element0 [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Base = imports.%Main.Base -// CHECK:STDOUT: .Param = imports.%Main.Param -// CHECK:STDOUT: .Derived = imports.%Main.Derived -// CHECK:STDOUT: .DoubleFieldAccess = imports.%Main.DoubleFieldAccess -// CHECK:STDOUT: .Core = imports.%Core.ece -// CHECK:STDOUT: .ImportedDoubleFieldAccess = %ImportedDoubleFieldAccess.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %default.import = import -// CHECK:STDOUT: %ImportedDoubleFieldAccess.decl: %ImportedDoubleFieldAccess.type = fn_decl @ImportedDoubleFieldAccess [concrete = constants.%ImportedDoubleFieldAccess] { -// CHECK:STDOUT: %d.patt: %pattern_type.fb9 = binding_pattern d [concrete] -// CHECK:STDOUT: %d.param_patt: %pattern_type.fb9 = value_param_pattern %d.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.501 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.501 = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %d.param: %Derived = value_param call_param0 -// CHECK:STDOUT: %Derived.ref: type = name_ref Derived, imports.%Main.Derived [concrete = constants.%Derived] -// CHECK:STDOUT: %d: %Derived = bind_name d, %d.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Derived [from "extend_generic_base.carbon"] { -// CHECK:STDOUT: complete_type_witness = imports.%Main.import_ref.bd0 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Main.import_ref.f6c -// CHECK:STDOUT: .base = imports.%Main.import_ref.d24 -// CHECK:STDOUT: .x = -// CHECK:STDOUT: extend imports.%Main.import_ref.77a301.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Param [from "extend_generic_base.carbon"] { -// CHECK:STDOUT: complete_type_witness = imports.%Main.import_ref.e8d -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Main.import_ref.446 -// CHECK:STDOUT: .y = imports.%Main.import_ref.a92 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Base(imports.%Main.import_ref.5ab: type) [from "extend_generic_base.carbon"] { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %T [symbolic = %require_complete (constants.%require_complete.4ae)] -// CHECK:STDOUT: %Base: type = class_type @Base, @Base(%T) [symbolic = %Base (constants.%Base.370)] -// CHECK:STDOUT: %Base.elem: type = unbound_element_type %Base, %T [symbolic = %Base.elem (constants.%Base.elem.9af)] -// CHECK:STDOUT: %struct_type.x: type = struct_type {.x: @Base.%T (%T)} [symbolic = %struct_type.x (constants.%struct_type.x.2ac)] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.x [symbolic = %complete_type (constants.%complete_type.433)] -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: complete_type_witness = imports.%Main.import_ref.b5f -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Main.import_ref.8e0 -// CHECK:STDOUT: .x = imports.%Main.import_ref.7f7 -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: // CHECK:STDOUT: fn @ImportedDoubleFieldAccess(%d.param: %Derived) -> %i32 { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %d.ref: %Derived = name_ref d, %d // CHECK:STDOUT: %x.ref: %Base.elem.d1f = name_ref x, imports.%Main.import_ref.7f7 [concrete = imports.%.e66] -// CHECK:STDOUT: %.loc7_11.1: ref %Base.7a8 = class_element_access %d.ref, element0 -// CHECK:STDOUT: %.loc7_11.2: ref %Base.7a8 = converted %d.ref, %.loc7_11.1 -// CHECK:STDOUT: %.loc7_11.3: ref %Param = class_element_access %.loc7_11.2, element0 +// CHECK:STDOUT: %.loc8_11.1: ref %Base.7a8 = class_element_access %d.ref, element0 +// CHECK:STDOUT: %.loc8_11.2: ref %Base.7a8 = converted %d.ref, %.loc8_11.1 +// CHECK:STDOUT: %.loc8_11.3: ref %Param = class_element_access %.loc8_11.2, element0 // CHECK:STDOUT: %y.ref: %Param.elem = name_ref y, imports.%Main.import_ref.a92 [concrete = imports.%.be7] -// CHECK:STDOUT: %.loc7_13.1: ref %i32 = class_element_access %.loc7_11.3, element0 -// CHECK:STDOUT: %.loc7_13.2: %i32 = bind_value %.loc7_13.1 -// CHECK:STDOUT: return %.loc7_13.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Base(constants.%T) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Base(constants.%Param) { -// CHECK:STDOUT: %T => constants.%Param -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%complete_type.09d -// CHECK:STDOUT: %Base => constants.%Base.7a8 -// CHECK:STDOUT: %Base.elem => constants.%Base.elem.d1f -// CHECK:STDOUT: %struct_type.x => constants.%struct_type.x.975 -// CHECK:STDOUT: %complete_type => constants.%complete_type.db3 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_todo_extend_symbolic_base.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type: type = pattern_type type [concrete] -// CHECK:STDOUT: %C.type: type = generic_class_type @C [concrete] -// CHECK:STDOUT: %C.generic: %C.type = struct_value () [concrete] -// CHECK:STDOUT: %C.f2e: type = class_type @C, @C(%T) [symbolic] -// CHECK:STDOUT: %require_complete: = require_complete_type %T [symbolic] -// CHECK:STDOUT: %X: type = class_type @X [concrete] -// CHECK:STDOUT: %G.type: type = fn_type @G [concrete] -// CHECK:STDOUT: %G: %G.type = struct_value () [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %C.fac: type = class_type @C, @C(%X) [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: .X = %X.decl -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %C.decl: %C.type = class_decl @C [concrete = constants.%C.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc4_9.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_9.2 (constants.%T)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %X.decl: type = class_decl @X [concrete = constants.%X] {} {} -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @C(%T.loc4_9.1: type) { -// CHECK:STDOUT: %T.loc4_9.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_9.2 (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %T.loc4_9.2 [symbolic = %require_complete (constants.%require_complete)] -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc4_9.1 [symbolic = %T.loc4_9.2 (constants.%T)] -// CHECK:STDOUT: %.loc9: = base_decl , element0 [concrete] -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: } [concrete = ] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base [concrete = ] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%C.f2e -// CHECK:STDOUT: .T = -// CHECK:STDOUT: .base = %.loc9 -// CHECK:STDOUT: .G = -// CHECK:STDOUT: has_error -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @X { -// CHECK:STDOUT: %G.decl: %G.type = fn_decl @G [concrete = constants.%G] {} {} -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%X -// CHECK:STDOUT: .G = %G.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @G() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %C.ref: %C.type = name_ref C, file.%C.decl [concrete = constants.%C.generic] -// CHECK:STDOUT: %X.ref: type = name_ref X, file.%X.decl [concrete = constants.%X] -// CHECK:STDOUT: %C: type = class_type @C, @C(constants.%X) [concrete = constants.%C.fac] -// CHECK:STDOUT: %G.ref: = name_ref G, [concrete = ] -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @C(constants.%T) { -// CHECK:STDOUT: %T.loc4_9.2 => constants.%T -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @C(constants.%X) { -// CHECK:STDOUT: %T.loc4_9.2 => constants.%X -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%complete_type +// CHECK:STDOUT: %.loc8_13.1: ref %i32 = class_element_access %.loc8_11.3, element0 +// CHECK:STDOUT: %.loc8_13.2: %i32 = bind_value %.loc8_13.1 +// CHECK:STDOUT: return %.loc8_13.2 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- extend_generic_symbolic_base.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { -// CHECK:STDOUT: %U: type = bind_symbolic_name U, 0 [symbolic] // CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] // CHECK:STDOUT: %X.type: type = generic_class_type @X [concrete] // CHECK:STDOUT: %X.generic: %X.type = struct_value () [concrete] -// CHECK:STDOUT: %X.75b6d8.1: type = class_type @X, @X(%U) [symbolic] -// CHECK:STDOUT: %pattern_type.7dc: type = pattern_type %U [symbolic] -// CHECK:STDOUT: %G.type.56f312.1: type = fn_type @G, @X(%U) [symbolic] -// CHECK:STDOUT: %G.b504c4.1: %G.type.56f312.1 = struct_value () [symbolic] // CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] // CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %U [symbolic] -// CHECK:STDOUT: %G.specific_fn.169: = specific_function %G.b504c4.1, @G(%U) [symbolic] // CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] // CHECK:STDOUT: %C.type: type = generic_class_type @C [concrete] // CHECK:STDOUT: %C.generic: %C.type = struct_value () [concrete] // CHECK:STDOUT: %C.f2e: type = class_type @C, @C(%T) [symbolic] // CHECK:STDOUT: %X.75b6d8.2: type = class_type @X, @X(%T) [symbolic] -// CHECK:STDOUT: %G.type.56f312.2: type = fn_type @G, @X(%T) [symbolic] -// CHECK:STDOUT: %G.b504c4.2: %G.type.56f312.2 = struct_value () [symbolic] // CHECK:STDOUT: %require_complete.441: = require_complete_type %X.75b6d8.2 [symbolic] // CHECK:STDOUT: %C.elem.3f4: type = unbound_element_type %C.f2e, %X.75b6d8.2 [symbolic] // CHECK:STDOUT: %struct_type.base.f5f: type = struct_type {.base: %X.75b6d8.2} [symbolic] // CHECK:STDOUT: %complete_type.768: = complete_type_witness %struct_type.base.f5f [symbolic] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %i32.builtin: type = int_type signed, %int_32 [concrete] -// CHECK:STDOUT: %complete_type.f8a: = complete_type_witness %i32.builtin [concrete] // CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] // CHECK:STDOUT: %C.98a: type = class_type @C, @C(%i32) [concrete] // CHECK:STDOUT: %X.448: type = class_type @X, @X(%i32) [concrete] @@ -538,111 +220,43 @@ fn H() { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .X = %X.decl -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %X.decl: %X.type = class_decl @X [concrete = constants.%X.generic] { -// CHECK:STDOUT: %U.patt: %pattern_type.98f = symbolic_binding_pattern U, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %U.loc4_14.1: type = bind_symbolic_name U, 0 [symbolic = %U.loc4_14.2 (constants.%U)] -// CHECK:STDOUT: } // CHECK:STDOUT: %C.decl: %C.type = class_decl @C [concrete = constants.%C.generic] { // CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc8_9.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc8_9.2 (constants.%T)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @X(%U.loc4_14.1: type) { -// CHECK:STDOUT: %U.loc4_14.2: type = bind_symbolic_name U, 0 [symbolic = %U.loc4_14.2 (constants.%U)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %G.type: type = fn_type @G, @X(%U.loc4_14.2) [symbolic = %G.type (constants.%G.type.56f312.1)] -// CHECK:STDOUT: %G: @X.%G.type (%G.type.56f312.1) = struct_value () [symbolic = %G (constants.%G.b504c4.1)] -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %G.decl: @X.%G.type (%G.type.56f312.1) = fn_decl @G [symbolic = @X.%G (constants.%G.b504c4.1)] { -// CHECK:STDOUT: %return.patt: @G.%pattern_type (%pattern_type.7dc) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @G.%pattern_type (%pattern_type.7dc) = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %U.ref: type = name_ref U, @X.%U.loc4_14.1 [symbolic = %U (constants.%U)] -// CHECK:STDOUT: %return.param: ref @G.%U (%U) = out_param call_param0 -// CHECK:STDOUT: %return: ref @G.%U (%U) = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%X.75b6d8.1 -// CHECK:STDOUT: .U = -// CHECK:STDOUT: .G = %G.decl +// CHECK:STDOUT: %T.loc9_9.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc9_9.2 (constants.%T)] // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic class @C(%T.loc8_9.1: type) { -// CHECK:STDOUT: %T.loc8_9.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc8_9.2 (constants.%T)] +// CHECK:STDOUT: generic class @C(%T.loc9_9.1: type) { +// CHECK:STDOUT: %T.loc9_9.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc9_9.2 (constants.%T)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %X.loc9_19.2: type = class_type @X, @X(%T.loc8_9.2) [symbolic = %X.loc9_19.2 (constants.%X.75b6d8.2)] -// CHECK:STDOUT: %require_complete: = require_complete_type %X.loc9_19.2 [symbolic = %require_complete (constants.%require_complete.441)] -// CHECK:STDOUT: %C: type = class_type @C, @C(%T.loc8_9.2) [symbolic = %C (constants.%C.f2e)] -// CHECK:STDOUT: %C.elem: type = unbound_element_type %C, %X.loc9_19.2 [symbolic = %C.elem (constants.%C.elem.3f4)] -// CHECK:STDOUT: %struct_type.base.loc10_1.2: type = struct_type {.base: @C.%X.loc9_19.2 (%X.75b6d8.2)} [symbolic = %struct_type.base.loc10_1.2 (constants.%struct_type.base.f5f)] -// CHECK:STDOUT: %complete_type.loc10_1.2: = complete_type_witness %struct_type.base.loc10_1.2 [symbolic = %complete_type.loc10_1.2 (constants.%complete_type.768)] +// CHECK:STDOUT: %X.loc10_19.2: type = class_type @X, @X(%T.loc9_9.2) [symbolic = %X.loc10_19.2 (constants.%X.75b6d8.2)] +// CHECK:STDOUT: %require_complete: = require_complete_type %X.loc10_19.2 [symbolic = %require_complete (constants.%require_complete.441)] +// CHECK:STDOUT: %C: type = class_type @C, @C(%T.loc9_9.2) [symbolic = %C (constants.%C.f2e)] +// CHECK:STDOUT: %C.elem: type = unbound_element_type %C, %X.loc10_19.2 [symbolic = %C.elem (constants.%C.elem.3f4)] +// CHECK:STDOUT: %struct_type.base.loc11_1.2: type = struct_type {.base: @C.%X.loc10_19.2 (%X.75b6d8.2)} [symbolic = %struct_type.base.loc11_1.2 (constants.%struct_type.base.f5f)] +// CHECK:STDOUT: %complete_type.loc11_1.2: = complete_type_witness %struct_type.base.loc11_1.2 [symbolic = %complete_type.loc11_1.2 (constants.%complete_type.768)] // CHECK:STDOUT: // CHECK:STDOUT: class { // CHECK:STDOUT: %X.ref: %X.type = name_ref X, file.%X.decl [concrete = constants.%X.generic] -// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc8_9.1 [symbolic = %T.loc8_9.2 (constants.%T)] -// CHECK:STDOUT: %X.loc9_19.1: type = class_type @X, @X(constants.%T) [symbolic = %X.loc9_19.2 (constants.%X.75b6d8.2)] -// CHECK:STDOUT: %.loc9: @C.%C.elem (%C.elem.3f4) = base_decl %X.loc9_19.1, element0 [concrete] -// CHECK:STDOUT: %struct_type.base.loc10_1.1: type = struct_type {.base: %X.75b6d8.2} [symbolic = %struct_type.base.loc10_1.2 (constants.%struct_type.base.f5f)] -// CHECK:STDOUT: %complete_type.loc10_1.1: = complete_type_witness %struct_type.base.loc10_1.1 [symbolic = %complete_type.loc10_1.2 (constants.%complete_type.768)] -// CHECK:STDOUT: complete_type_witness = %complete_type.loc10_1.1 +// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc9_9.1 [symbolic = %T.loc9_9.2 (constants.%T)] +// CHECK:STDOUT: %X.loc10_19.1: type = class_type @X, @X(constants.%T) [symbolic = %X.loc10_19.2 (constants.%X.75b6d8.2)] +// CHECK:STDOUT: %.loc10: @C.%C.elem (%C.elem.3f4) = base_decl %X.loc10_19.1, element0 [concrete] +// CHECK:STDOUT: %struct_type.base.loc11_1.1: type = struct_type {.base: %X.75b6d8.2} [symbolic = %struct_type.base.loc11_1.2 (constants.%struct_type.base.f5f)] +// CHECK:STDOUT: %complete_type.loc11_1.1: = complete_type_witness %struct_type.base.loc11_1.1 [symbolic = %complete_type.loc11_1.2 (constants.%complete_type.768)] +// CHECK:STDOUT: complete_type_witness = %complete_type.loc11_1.1 // CHECK:STDOUT: // CHECK:STDOUT: !members: // CHECK:STDOUT: .Self = constants.%C.f2e // CHECK:STDOUT: .X = // CHECK:STDOUT: .T = -// CHECK:STDOUT: .base = %.loc9 +// CHECK:STDOUT: .base = %.loc10 // CHECK:STDOUT: .G = -// CHECK:STDOUT: extend %X.loc9_19.1 -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @G(@X.%U.loc4_14.1: type) { -// CHECK:STDOUT: %U: type = bind_symbolic_name U, 0 [symbolic = %U (constants.%U)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %U [symbolic = %pattern_type (constants.%pattern_type.7dc)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %U [symbolic = %require_complete (constants.%require_complete.4ae)] -// CHECK:STDOUT: %G.type: type = fn_type @G, @X(%U) [symbolic = %G.type (constants.%G.type.56f312.1)] -// CHECK:STDOUT: %G: @G.%G.type (%G.type.56f312.1) = struct_value () [symbolic = %G (constants.%G.b504c4.1)] -// CHECK:STDOUT: %G.specific_fn.loc5_24.2: = specific_function %G, @G(%U) [symbolic = %G.specific_fn.loc5_24.2 (constants.%G.specific_fn.169)] -// CHECK:STDOUT: -// CHECK:STDOUT: fn() -> @G.%U (%U) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %.loc5_24: @G.%G.type (%G.type.56f312.1) = specific_constant @X.%G.decl, @X(constants.%U) [symbolic = %G (constants.%G.b504c4.1)] -// CHECK:STDOUT: %G.ref: @G.%G.type (%G.type.56f312.1) = name_ref G, %.loc5_24 [symbolic = %G (constants.%G.b504c4.1)] -// CHECK:STDOUT: %G.specific_fn.loc5_24.1: = specific_function %G.ref, @G(constants.%U) [symbolic = %G.specific_fn.loc5_24.2 (constants.%G.specific_fn.169)] -// CHECK:STDOUT: %G.call: init @G.%U (%U) = call %G.specific_fn.loc5_24.1() -// CHECK:STDOUT: %.loc5_27.1: @G.%U (%U) = value_of_initializer %G.call -// CHECK:STDOUT: %.loc5_27.2: @G.%U (%U) = converted %G.call, %.loc5_27.1 -// CHECK:STDOUT: return %.loc5_27.2 +// CHECK:STDOUT: extend %X.loc10_19.1 // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -652,294 +266,81 @@ fn H() { // CHECK:STDOUT: %i.patt: %pattern_type.7ce = binding_pattern i [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: %C.ref: %C.type = name_ref C, file.%C.decl [concrete = constants.%C.generic] -// CHECK:STDOUT: %int_32.loc13_18: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc13_18: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] +// CHECK:STDOUT: %int_32.loc16_18: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] +// CHECK:STDOUT: %i32.loc16_18: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] // CHECK:STDOUT: %C: type = class_type @C, @C(constants.%i32) [concrete = constants.%C.98a] -// CHECK:STDOUT: %.loc13_22: %G.type.862 = specific_constant @X.%G.decl, @X(constants.%i32) [concrete = constants.%G.d5e] -// CHECK:STDOUT: %G.ref: %G.type.862 = name_ref G, %.loc13_22 [concrete = constants.%G.d5e] +// CHECK:STDOUT: %.loc16_22: %G.type.862 = specific_constant @X.%G.decl, @X(constants.%i32) [concrete = constants.%G.d5e] +// CHECK:STDOUT: %G.ref: %G.type.862 = name_ref G, %.loc16_22 [concrete = constants.%G.d5e] // CHECK:STDOUT: %G.specific_fn: = specific_function %G.ref, @G(constants.%i32) [concrete = constants.%G.specific_fn.7a3] // CHECK:STDOUT: %G.call: init %i32 = call %G.specific_fn() -// CHECK:STDOUT: %.loc13_10: type = splice_block %i32.loc13_10 [concrete = constants.%i32] { -// CHECK:STDOUT: %int_32.loc13_10: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc13_10: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] +// CHECK:STDOUT: %.loc16_10: type = splice_block %i32.loc16_10 [concrete = constants.%i32] { +// CHECK:STDOUT: %int_32.loc16_10: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] +// CHECK:STDOUT: %i32.loc16_10: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] // CHECK:STDOUT: } -// CHECK:STDOUT: %.loc13_25.1: ref %i32 = temporary_storage -// CHECK:STDOUT: %.loc13_25.2: ref %i32 = temporary %.loc13_25.1, %G.call -// CHECK:STDOUT: %i: ref %i32 = bind_name i, %.loc13_25.2 -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @X(constants.%U) { -// CHECK:STDOUT: %U.loc4_14.2 => constants.%U -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %G.type => constants.%G.type.56f312.1 -// CHECK:STDOUT: %G => constants.%G.b504c4.1 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @G(constants.%U) { -// CHECK:STDOUT: %U => constants.%U -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.7dc -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%require_complete.4ae -// CHECK:STDOUT: %G.type => constants.%G.type.56f312.1 -// CHECK:STDOUT: %G => constants.%G.b504c4.1 -// CHECK:STDOUT: %G.specific_fn.loc5_24.2 => constants.%G.specific_fn.169 +// CHECK:STDOUT: %.loc16_25.1: ref %i32 = temporary_storage +// CHECK:STDOUT: %.loc16_25.2: ref %i32 = temporary %.loc16_25.1, %G.call +// CHECK:STDOUT: %i: ref %i32 = bind_name i, %.loc16_25.2 +// CHECK:STDOUT: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @C(constants.%T) { -// CHECK:STDOUT: %T.loc8_9.2 => constants.%T -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @X(constants.%T) { -// CHECK:STDOUT: %U.loc4_14.2 => constants.%T -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %G.type => constants.%G.type.56f312.2 -// CHECK:STDOUT: %G => constants.%G.b504c4.2 +// CHECK:STDOUT: %T.loc9_9.2 => constants.%T // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @C(constants.%i32) { -// CHECK:STDOUT: %T.loc8_9.2 => constants.%i32 +// CHECK:STDOUT: %T.loc9_9.2 => constants.%i32 // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %X.loc9_19.2 => constants.%X.448 +// CHECK:STDOUT: %X.loc10_19.2 => constants.%X.448 // CHECK:STDOUT: %require_complete => constants.%complete_type.357 // CHECK:STDOUT: %C => constants.%C.98a // CHECK:STDOUT: %C.elem => constants.%C.elem.494 -// CHECK:STDOUT: %struct_type.base.loc10_1.2 => constants.%struct_type.base.d41 -// CHECK:STDOUT: %complete_type.loc10_1.2 => constants.%complete_type.146 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @X(constants.%i32) { -// CHECK:STDOUT: %U.loc4_14.2 => constants.%i32 -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %G.type => constants.%G.type.862 -// CHECK:STDOUT: %G => constants.%G.d5e -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @G(constants.%i32) { -// CHECK:STDOUT: %U => constants.%i32 -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.7ce -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%complete_type.f8a -// CHECK:STDOUT: %G.type => constants.%G.type.862 -// CHECK:STDOUT: %G => constants.%G.d5e -// CHECK:STDOUT: %G.specific_fn.loc5_24.2 => constants.%G.specific_fn.7a3 +// CHECK:STDOUT: %struct_type.base.loc11_1.2 => constants.%struct_type.base.d41 +// CHECK:STDOUT: %complete_type.loc11_1.2 => constants.%complete_type.146 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- import_extend_generic_symbolic_base.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { -// CHECK:STDOUT: %H.type: type = fn_type @H [concrete] -// CHECK:STDOUT: %H: %H.type = struct_value () [concrete] // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %i32.builtin: type = int_type signed, %int_32 [concrete] -// CHECK:STDOUT: %complete_type.f8a: = complete_type_witness %i32.builtin [concrete] // CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] // CHECK:STDOUT: %C.type: type = generic_class_type @C [concrete] // CHECK:STDOUT: %C.generic: %C.type = struct_value () [concrete] -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] // CHECK:STDOUT: %U: type = bind_symbolic_name U, 0 [symbolic] -// CHECK:STDOUT: %X.75b6d8.2: type = class_type @X, @X(%T) [symbolic] -// CHECK:STDOUT: %C.f2e: type = class_type @C, @C(%T) [symbolic] -// CHECK:STDOUT: %C.elem.3f4: type = unbound_element_type %C.f2e, %X.75b6d8.2 [symbolic] -// CHECK:STDOUT: %struct_type.base.f5f: type = struct_type {.base: %X.75b6d8.2} [symbolic] -// CHECK:STDOUT: %complete_type.768: = complete_type_witness %struct_type.base.f5f [symbolic] // CHECK:STDOUT: %G.type.56f312.1: type = fn_type @G, @X(%U) [symbolic] // CHECK:STDOUT: %G.b504c4.1: %G.type.56f312.1 = struct_value () [symbolic] -// CHECK:STDOUT: %pattern_type.7dc: type = pattern_type %U [symbolic] -// CHECK:STDOUT: %require_complete.441: = require_complete_type %X.75b6d8.2 [symbolic] -// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %U [symbolic] -// CHECK:STDOUT: %G.specific_fn.169: = specific_function %G.b504c4.1, @G(%U) [symbolic] -// CHECK:STDOUT: %G.type.56f312.2: type = fn_type @G, @X(%T) [symbolic] -// CHECK:STDOUT: %G.b504c4.2: %G.type.56f312.2 = struct_value () [symbolic] // CHECK:STDOUT: %C.98a: type = class_type @C, @C(%i32) [concrete] -// CHECK:STDOUT: %X.448: type = class_type @X, @X(%i32) [concrete] // CHECK:STDOUT: %G.type.862: type = fn_type @G, @X(%i32) [concrete] // CHECK:STDOUT: %G.d5e: %G.type.862 = struct_value () [concrete] -// CHECK:STDOUT: %C.elem.494: type = unbound_element_type %C.98a, %X.448 [concrete] -// CHECK:STDOUT: %struct_type.base.d41: type = struct_type {.base: %X.448} [concrete] -// CHECK:STDOUT: %complete_type.146: = complete_type_witness %struct_type.base.d41 [concrete] // CHECK:STDOUT: %G.specific_fn.7a3: = specific_function %G.d5e, @G(%i32) [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { -// CHECK:STDOUT: %Main.X = import_ref Main//extend_generic_symbolic_base, X, unloaded // CHECK:STDOUT: %Main.C: %C.type = import_ref Main//extend_generic_symbolic_base, C, loaded [concrete = constants.%C.generic] -// CHECK:STDOUT: %Main.F = import_ref Main//extend_generic_symbolic_base, F, unloaded -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: %Main.import_ref.5ab3ec.1: type = import_ref Main//extend_generic_symbolic_base, loc4_14, loaded [symbolic = @X.%U (constants.%U)] -// CHECK:STDOUT: %Main.import_ref.8f2: = import_ref Main//extend_generic_symbolic_base, loc6_1, loaded [concrete = constants.%complete_type.357] -// CHECK:STDOUT: %Main.import_ref.e8e = import_ref Main//extend_generic_symbolic_base, inst26 [no loc], unloaded // CHECK:STDOUT: %Main.import_ref.b8a: @X.%G.type (%G.type.56f312.1) = import_ref Main//extend_generic_symbolic_base, loc5_15, loaded [symbolic = @X.%G (constants.%G.b504c4.1)] -// CHECK:STDOUT: %Main.import_ref.5ab3ec.2: type = import_ref Main//extend_generic_symbolic_base, loc8_9, loaded [symbolic = @C.%T (constants.%T)] -// CHECK:STDOUT: %Main.import_ref.93f: = import_ref Main//extend_generic_symbolic_base, loc10_1, loaded [symbolic = @C.%complete_type (constants.%complete_type.768)] -// CHECK:STDOUT: %Main.import_ref.4c0 = import_ref Main//extend_generic_symbolic_base, inst66 [no loc], unloaded -// CHECK:STDOUT: %Main.import_ref.65d = import_ref Main//extend_generic_symbolic_base, loc9_20, unloaded -// CHECK:STDOUT: %Main.import_ref.561eb2.2: type = import_ref Main//extend_generic_symbolic_base, loc9_19, loaded [symbolic = @C.%X (constants.%X.75b6d8.2)] -// CHECK:STDOUT: %Main.import_ref.5ab3ec.3: type = import_ref Main//extend_generic_symbolic_base, loc4_14, loaded [symbolic = @X.%U (constants.%U)] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .X = imports.%Main.X -// CHECK:STDOUT: .C = imports.%Main.C -// CHECK:STDOUT: .F = imports.%Main.F -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .H = %H.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %default.import = import -// CHECK:STDOUT: %H.decl: %H.type = fn_decl @H [concrete = constants.%H] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @C(imports.%Main.import_ref.5ab3ec.2: type) [from "extend_generic_symbolic_base.carbon"] { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %X: type = class_type @X, @X(%T) [symbolic = %X (constants.%X.75b6d8.2)] -// CHECK:STDOUT: %require_complete: = require_complete_type %X [symbolic = %require_complete (constants.%require_complete.441)] -// CHECK:STDOUT: %C: type = class_type @C, @C(%T) [symbolic = %C (constants.%C.f2e)] -// CHECK:STDOUT: %C.elem: type = unbound_element_type %C, %X [symbolic = %C.elem (constants.%C.elem.3f4)] -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: @C.%X (%X.75b6d8.2)} [symbolic = %struct_type.base (constants.%struct_type.base.f5f)] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base [symbolic = %complete_type (constants.%complete_type.768)] -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: complete_type_witness = imports.%Main.import_ref.93f -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Main.import_ref.4c0 -// CHECK:STDOUT: .base = imports.%Main.import_ref.65d -// CHECK:STDOUT: .G = -// CHECK:STDOUT: extend imports.%Main.import_ref.561eb2.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @X(imports.%Main.import_ref.5ab3ec.1: type) [from "extend_generic_symbolic_base.carbon"] { -// CHECK:STDOUT: %U: type = bind_symbolic_name U, 0 [symbolic = %U (constants.%U)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %G.type: type = fn_type @G, @X(%U) [symbolic = %G.type (constants.%G.type.56f312.1)] -// CHECK:STDOUT: %G: @X.%G.type (%G.type.56f312.1) = struct_value () [symbolic = %G (constants.%G.b504c4.1)] -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: complete_type_witness = imports.%Main.import_ref.8f2 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Main.import_ref.e8e -// CHECK:STDOUT: .G = imports.%Main.import_ref.b8a -// CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @H() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %j.patt: %pattern_type.7ce = binding_pattern j [concrete] +// CHECK:STDOUT: %i.patt: %pattern_type.7ce = binding_pattern i [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: %C.ref: %C.type = name_ref C, imports.%Main.C [concrete = constants.%C.generic] -// CHECK:STDOUT: %int_32.loc7_18: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc7_18: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] +// CHECK:STDOUT: %int_32.loc8_18: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] +// CHECK:STDOUT: %i32.loc8_18: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] // CHECK:STDOUT: %C: type = class_type @C, @C(constants.%i32) [concrete = constants.%C.98a] -// CHECK:STDOUT: %.loc7_22: %G.type.862 = specific_constant imports.%Main.import_ref.b8a, @X(constants.%i32) [concrete = constants.%G.d5e] -// CHECK:STDOUT: %G.ref: %G.type.862 = name_ref G, %.loc7_22 [concrete = constants.%G.d5e] +// CHECK:STDOUT: %.loc8_22: %G.type.862 = specific_constant imports.%Main.import_ref.b8a, @X(constants.%i32) [concrete = constants.%G.d5e] +// CHECK:STDOUT: %G.ref: %G.type.862 = name_ref G, %.loc8_22 [concrete = constants.%G.d5e] // CHECK:STDOUT: %G.specific_fn: = specific_function %G.ref, @G(constants.%i32) [concrete = constants.%G.specific_fn.7a3] // CHECK:STDOUT: %G.call: init %i32 = call %G.specific_fn() -// CHECK:STDOUT: %.loc7_10: type = splice_block %i32.loc7_10 [concrete = constants.%i32] { -// CHECK:STDOUT: %int_32.loc7_10: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc7_10: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] +// CHECK:STDOUT: %.loc8_10: type = splice_block %i32.loc8_10 [concrete = constants.%i32] { +// CHECK:STDOUT: %int_32.loc8_10: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] +// CHECK:STDOUT: %i32.loc8_10: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] // CHECK:STDOUT: } -// CHECK:STDOUT: %.loc7_25.1: ref %i32 = temporary_storage -// CHECK:STDOUT: %.loc7_25.2: ref %i32 = temporary %.loc7_25.1, %G.call -// CHECK:STDOUT: %j: ref %i32 = bind_name j, %.loc7_25.2 -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @G(imports.%Main.import_ref.5ab3ec.3: type) [from "extend_generic_symbolic_base.carbon"] { -// CHECK:STDOUT: %U: type = bind_symbolic_name U, 0 [symbolic = %U (constants.%U)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %U [symbolic = %pattern_type (constants.%pattern_type.7dc)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %U [symbolic = %require_complete (constants.%require_complete.4ae)] -// CHECK:STDOUT: %G.type: type = fn_type @G, @X(%U) [symbolic = %G.type (constants.%G.type.56f312.1)] -// CHECK:STDOUT: %G: @G.%G.type (%G.type.56f312.1) = struct_value () [symbolic = %G (constants.%G.b504c4.1)] -// CHECK:STDOUT: %G.specific_fn: = specific_function %G, @G(%U) [symbolic = %G.specific_fn (constants.%G.specific_fn.169)] -// CHECK:STDOUT: -// CHECK:STDOUT: fn; -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @X(constants.%U) { -// CHECK:STDOUT: %U => constants.%U -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %G.type => constants.%G.type.56f312.1 -// CHECK:STDOUT: %G => constants.%G.b504c4.1 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @X(constants.%T) { -// CHECK:STDOUT: %U => constants.%T -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %G.type => constants.%G.type.56f312.2 -// CHECK:STDOUT: %G => constants.%G.b504c4.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @C(constants.%T) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @G(constants.%U) { -// CHECK:STDOUT: %U => constants.%U -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.7dc -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%require_complete.4ae -// CHECK:STDOUT: %G.type => constants.%G.type.56f312.1 -// CHECK:STDOUT: %G => constants.%G.b504c4.1 -// CHECK:STDOUT: %G.specific_fn => constants.%G.specific_fn.169 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @C(constants.%i32) { -// CHECK:STDOUT: %T => constants.%i32 -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %X => constants.%X.448 -// CHECK:STDOUT: %require_complete => constants.%complete_type.357 -// CHECK:STDOUT: %C => constants.%C.98a -// CHECK:STDOUT: %C.elem => constants.%C.elem.494 -// CHECK:STDOUT: %struct_type.base => constants.%struct_type.base.d41 -// CHECK:STDOUT: %complete_type => constants.%complete_type.146 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @X(constants.%i32) { -// CHECK:STDOUT: %U => constants.%i32 -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %G.type => constants.%G.type.862 -// CHECK:STDOUT: %G => constants.%G.d5e -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @G(constants.%i32) { -// CHECK:STDOUT: %U => constants.%i32 -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.7ce -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%complete_type.f8a -// CHECK:STDOUT: %G.type => constants.%G.type.862 -// CHECK:STDOUT: %G => constants.%G.d5e -// CHECK:STDOUT: %G.specific_fn => constants.%G.specific_fn.7a3 +// CHECK:STDOUT: %.loc8_25.1: ref %i32 = temporary_storage +// CHECK:STDOUT: %.loc8_25.2: ref %i32 = temporary %.loc8_25.1, %G.call +// CHECK:STDOUT: %i: ref %i32 = bind_name i, %.loc8_25.2 +// CHECK:STDOUT: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/generic/basic.carbon b/toolchain/check/testdata/class/generic/basic.carbon deleted file mode 100644 index 3c619bcea5a21..0000000000000 --- a/toolchain/check/testdata/class/generic/basic.carbon +++ /dev/null @@ -1,233 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/generic/basic.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/generic/basic.carbon - -class Class(T:! type) { - fn GetAddr[addr self: Self*]() -> T* { - return &self->k; - } - - // TODO: Should this work? T is not necessarily copyable. - fn GetValue[self: Self]() -> T { - return self.k; - } - - var k: T; -} - -class Declaration(T:! type); - -// CHECK:STDOUT: --- basic.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] -// CHECK:STDOUT: %Class.type: type = generic_class_type @Class [concrete] -// CHECK:STDOUT: %Class.generic: %Class.type = struct_value () [concrete] -// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T) [symbolic] -// CHECK:STDOUT: %ptr.955: type = ptr_type %Class [symbolic] -// CHECK:STDOUT: %pattern_type.9e0: type = pattern_type %ptr.955 [symbolic] -// CHECK:STDOUT: %pattern_type.f6d: type = pattern_type auto [concrete] -// CHECK:STDOUT: %ptr.79f: type = ptr_type %T [symbolic] -// CHECK:STDOUT: %pattern_type.afe: type = pattern_type %ptr.79f [symbolic] -// CHECK:STDOUT: %GetAddr.type: type = fn_type @GetAddr, @Class(%T) [symbolic] -// CHECK:STDOUT: %GetAddr: %GetAddr.type = struct_value () [symbolic] -// CHECK:STDOUT: %pattern_type.3c1: type = pattern_type %Class [symbolic] -// CHECK:STDOUT: %pattern_type.7dc: type = pattern_type %T [symbolic] -// CHECK:STDOUT: %GetValue.type: type = fn_type @GetValue, @Class(%T) [symbolic] -// CHECK:STDOUT: %GetValue: %GetValue.type = struct_value () [symbolic] -// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T [symbolic] -// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %T [symbolic] -// CHECK:STDOUT: %struct_type.k: type = struct_type {.k: %T} [symbolic] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.k [symbolic] -// CHECK:STDOUT: %require_complete.6e5: = require_complete_type %ptr.79f [symbolic] -// CHECK:STDOUT: %require_complete.2ae: = require_complete_type %ptr.955 [symbolic] -// CHECK:STDOUT: %require_complete.4f8: = require_complete_type %Class [symbolic] -// CHECK:STDOUT: %Declaration.type: type = generic_class_type @Declaration [concrete] -// CHECK:STDOUT: %Declaration.generic: %Declaration.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Class = %Class.decl -// CHECK:STDOUT: .Declaration = %Declaration.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Class.decl: %Class.type = class_decl @Class [concrete = constants.%Class.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc11_13.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc11_13.2 (constants.%T)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %Declaration.decl: %Declaration.type = class_decl @Declaration [concrete = constants.%Declaration.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc24_19.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc24_19.2 (constants.%T)] -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Class(%T.loc11_13.1: type) { -// CHECK:STDOUT: %T.loc11_13.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc11_13.2 (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %GetAddr.type: type = fn_type @GetAddr, @Class(%T.loc11_13.2) [symbolic = %GetAddr.type (constants.%GetAddr.type)] -// CHECK:STDOUT: %GetAddr: @Class.%GetAddr.type (%GetAddr.type) = struct_value () [symbolic = %GetAddr (constants.%GetAddr)] -// CHECK:STDOUT: %GetValue.type: type = fn_type @GetValue, @Class(%T.loc11_13.2) [symbolic = %GetValue.type (constants.%GetValue.type)] -// CHECK:STDOUT: %GetValue: @Class.%GetValue.type (%GetValue.type) = struct_value () [symbolic = %GetValue (constants.%GetValue)] -// CHECK:STDOUT: %require_complete: = require_complete_type %T.loc11_13.2 [symbolic = %require_complete (constants.%require_complete.4ae)] -// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T.loc11_13.2) [symbolic = %Class (constants.%Class)] -// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %T.loc11_13.2 [symbolic = %Class.elem (constants.%Class.elem)] -// CHECK:STDOUT: %struct_type.k.loc22_1.2: type = struct_type {.k: @Class.%T.loc11_13.2 (%T)} [symbolic = %struct_type.k.loc22_1.2 (constants.%struct_type.k)] -// CHECK:STDOUT: %complete_type.loc22_1.2: = complete_type_witness %struct_type.k.loc22_1.2 [symbolic = %complete_type.loc22_1.2 (constants.%complete_type)] -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %GetAddr.decl: @Class.%GetAddr.type (%GetAddr.type) = fn_decl @GetAddr [symbolic = @Class.%GetAddr (constants.%GetAddr)] { -// CHECK:STDOUT: %self.patt: @GetAddr.%pattern_type.loc12_19 (%pattern_type.9e0) = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: @GetAddr.%pattern_type.loc12_19 (%pattern_type.9e0) = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc12_14: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] -// CHECK:STDOUT: %return.patt: @GetAddr.%pattern_type.loc12_34 (%pattern_type.afe) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @GetAddr.%pattern_type.loc12_34 (%pattern_type.afe) = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref: type = name_ref T, @Class.%T.loc11_13.1 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %ptr.loc12_38.2: type = ptr_type %T.ref [symbolic = %ptr.loc12_38.1 (constants.%ptr.79f)] -// CHECK:STDOUT: %self.param: @GetAddr.%ptr.loc12_29.1 (%ptr.955) = value_param call_param0 -// CHECK:STDOUT: %.loc12_29: type = splice_block %ptr.loc12_29.2 [symbolic = %ptr.loc12_29.1 (constants.%ptr.955)] { -// CHECK:STDOUT: %.loc12_25: type = specific_constant constants.%Class, @Class(constants.%T) [symbolic = %Class (constants.%Class)] -// CHECK:STDOUT: %Self.ref: type = name_ref Self, %.loc12_25 [symbolic = %Class (constants.%Class)] -// CHECK:STDOUT: %ptr.loc12_29.2: type = ptr_type %Self.ref [symbolic = %ptr.loc12_29.1 (constants.%ptr.955)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self: @GetAddr.%ptr.loc12_29.1 (%ptr.955) = bind_name self, %self.param -// CHECK:STDOUT: %return.param: ref @GetAddr.%ptr.loc12_38.1 (%ptr.79f) = out_param call_param1 -// CHECK:STDOUT: %return: ref @GetAddr.%ptr.loc12_38.1 (%ptr.79f) = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %GetValue.decl: @Class.%GetValue.type (%GetValue.type) = fn_decl @GetValue [symbolic = @Class.%GetValue (constants.%GetValue)] { -// CHECK:STDOUT: %self.patt: @GetValue.%pattern_type.loc17_15 (%pattern_type.3c1) = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: @GetValue.%pattern_type.loc17_15 (%pattern_type.3c1) = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: @GetValue.%pattern_type.loc17_29 (%pattern_type.7dc) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @GetValue.%pattern_type.loc17_29 (%pattern_type.7dc) = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref: type = name_ref T, @Class.%T.loc11_13.1 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %self.param: @GetValue.%Class (%Class) = value_param call_param0 -// CHECK:STDOUT: %.loc17_21.1: type = splice_block %Self.ref [symbolic = %Class (constants.%Class)] { -// CHECK:STDOUT: %.loc17_21.2: type = specific_constant constants.%Class, @Class(constants.%T) [symbolic = %Class (constants.%Class)] -// CHECK:STDOUT: %Self.ref: type = name_ref Self, %.loc17_21.2 [symbolic = %Class (constants.%Class)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self: @GetValue.%Class (%Class) = bind_name self, %self.param -// CHECK:STDOUT: %return.param: ref @GetValue.%T (%T) = out_param call_param1 -// CHECK:STDOUT: %return: ref @GetValue.%T (%T) = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc11_13.1 [symbolic = %T.loc11_13.2 (constants.%T)] -// CHECK:STDOUT: %.loc21: @Class.%Class.elem (%Class.elem) = field_decl k, element0 [concrete] -// CHECK:STDOUT: %struct_type.k.loc22_1.1: type = struct_type {.k: %T} [symbolic = %struct_type.k.loc22_1.2 (constants.%struct_type.k)] -// CHECK:STDOUT: %complete_type.loc22_1.1: = complete_type_witness %struct_type.k.loc22_1.1 [symbolic = %complete_type.loc22_1.2 (constants.%complete_type)] -// CHECK:STDOUT: complete_type_witness = %complete_type.loc22_1.1 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Class -// CHECK:STDOUT: .T = -// CHECK:STDOUT: .GetAddr = %GetAddr.decl -// CHECK:STDOUT: .GetValue = %GetValue.decl -// CHECK:STDOUT: .k = %.loc21 -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Declaration(%T.loc24_19.1: type) { -// CHECK:STDOUT: %T.loc24_19.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc24_19.2 (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: class; -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @GetAddr(@Class.%T.loc11_13.1: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T) [symbolic = %Class (constants.%Class)] -// CHECK:STDOUT: %ptr.loc12_29.1: type = ptr_type %Class [symbolic = %ptr.loc12_29.1 (constants.%ptr.955)] -// CHECK:STDOUT: %pattern_type.loc12_19: type = pattern_type %ptr.loc12_29.1 [symbolic = %pattern_type.loc12_19 (constants.%pattern_type.9e0)] -// CHECK:STDOUT: %ptr.loc12_38.1: type = ptr_type %T [symbolic = %ptr.loc12_38.1 (constants.%ptr.79f)] -// CHECK:STDOUT: %pattern_type.loc12_34: type = pattern_type %ptr.loc12_38.1 [symbolic = %pattern_type.loc12_34 (constants.%pattern_type.afe)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete.loc12_34: = require_complete_type %ptr.loc12_38.1 [symbolic = %require_complete.loc12_34 (constants.%require_complete.6e5)] -// CHECK:STDOUT: %require_complete.loc12_23: = require_complete_type %ptr.loc12_29.1 [symbolic = %require_complete.loc12_23 (constants.%require_complete.2ae)] -// CHECK:STDOUT: %require_complete.loc13: = require_complete_type %Class [symbolic = %require_complete.loc13 (constants.%require_complete.4f8)] -// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %T [symbolic = %Class.elem (constants.%Class.elem)] -// CHECK:STDOUT: -// CHECK:STDOUT: fn(%self.param: @GetAddr.%ptr.loc12_29.1 (%ptr.955)) -> @GetAddr.%ptr.loc12_38.1 (%ptr.79f) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %self.ref: @GetAddr.%ptr.loc12_29.1 (%ptr.955) = name_ref self, %self -// CHECK:STDOUT: %.loc13_17.1: ref @GetAddr.%Class (%Class) = deref %self.ref -// CHECK:STDOUT: %k.ref: @GetAddr.%Class.elem (%Class.elem) = name_ref k, @Class.%.loc21 [concrete = @Class.%.loc21] -// CHECK:STDOUT: %.loc13_17.2: ref @GetAddr.%T (%T) = class_element_access %.loc13_17.1, element0 -// CHECK:STDOUT: %addr: @GetAddr.%ptr.loc12_38.1 (%ptr.79f) = addr_of %.loc13_17.2 -// CHECK:STDOUT: return %addr -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @GetValue(@Class.%T.loc11_13.1: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T) [symbolic = %Class (constants.%Class)] -// CHECK:STDOUT: %pattern_type.loc17_15: type = pattern_type %Class [symbolic = %pattern_type.loc17_15 (constants.%pattern_type.3c1)] -// CHECK:STDOUT: %pattern_type.loc17_29: type = pattern_type %T [symbolic = %pattern_type.loc17_29 (constants.%pattern_type.7dc)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete.loc17: = require_complete_type %Class [symbolic = %require_complete.loc17 (constants.%require_complete.4f8)] -// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %T [symbolic = %Class.elem (constants.%Class.elem)] -// CHECK:STDOUT: %require_complete.loc18: = require_complete_type %T [symbolic = %require_complete.loc18 (constants.%require_complete.4ae)] -// CHECK:STDOUT: -// CHECK:STDOUT: fn(%self.param: @GetValue.%Class (%Class)) -> @GetValue.%T (%T) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %self.ref: @GetValue.%Class (%Class) = name_ref self, %self -// CHECK:STDOUT: %k.ref: @GetValue.%Class.elem (%Class.elem) = name_ref k, @Class.%.loc21 [concrete = @Class.%.loc21] -// CHECK:STDOUT: %.loc18_16.1: ref @GetValue.%T (%T) = class_element_access %self.ref, element0 -// CHECK:STDOUT: %.loc18_16.2: @GetValue.%T (%T) = bind_value %.loc18_16.1 -// CHECK:STDOUT: return %.loc18_16.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Class(constants.%T) { -// CHECK:STDOUT: %T.loc11_13.2 => constants.%T -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %GetAddr.type => constants.%GetAddr.type -// CHECK:STDOUT: %GetAddr => constants.%GetAddr -// CHECK:STDOUT: %GetValue.type => constants.%GetValue.type -// CHECK:STDOUT: %GetValue => constants.%GetValue -// CHECK:STDOUT: %require_complete => constants.%require_complete.4ae -// CHECK:STDOUT: %Class => constants.%Class -// CHECK:STDOUT: %Class.elem => constants.%Class.elem -// CHECK:STDOUT: %struct_type.k.loc22_1.2 => constants.%struct_type.k -// CHECK:STDOUT: %complete_type.loc22_1.2 => constants.%complete_type -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @GetAddr(constants.%T) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %Class => constants.%Class -// CHECK:STDOUT: %ptr.loc12_29.1 => constants.%ptr.955 -// CHECK:STDOUT: %pattern_type.loc12_19 => constants.%pattern_type.9e0 -// CHECK:STDOUT: %ptr.loc12_38.1 => constants.%ptr.79f -// CHECK:STDOUT: %pattern_type.loc12_34 => constants.%pattern_type.afe -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @GetValue(constants.%T) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %Class => constants.%Class -// CHECK:STDOUT: %pattern_type.loc17_15 => constants.%pattern_type.3c1 -// CHECK:STDOUT: %pattern_type.loc17_29 => constants.%pattern_type.7dc -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Declaration(constants.%T) { -// CHECK:STDOUT: %T.loc24_19.2 => constants.%T -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/generic/basics.carbon b/toolchain/check/testdata/class/generic/basics.carbon new file mode 100644 index 0000000000000..5e1ccd3c5da6e --- /dev/null +++ b/toolchain/check/testdata/class/generic/basics.carbon @@ -0,0 +1,460 @@ +// Part of the Carbon Language project, under the Apache License v2.0 with LLVM +// Exceptions. See /LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// +// AUTOUPDATE +// TIP: To test this file alone, run: +// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/generic/basics.carbon +// TIP: To dump output, run: +// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/generic/basics.carbon + +// --- forward_decl.carbon + +library "[[@TEST_NAME]]"; + +//@dump-sem-ir-begin +class C[](); +//@dump-sem-ir-end + +// --- class.carbon + +library "[[@TEST_NAME]]"; + +//@dump-sem-ir-begin +class Class(T:! type) { + fn GetAddr[addr self: Self*]() -> T* { + return &self->k; + } + + // TODO: Should this work? T is not necessarily copyable. + fn GetValue[self: Self]() -> T { + return self.k; + } + + var k: T; +} + +class Declaration(T:! type); +//@dump-sem-ir-end + +// --- self_type.carbon + +library "[[@TEST_NAME]]"; + +class Class(T:! type) { + // `Self` is the same as `Class(T)` here. + // TODO: Find a better way to test two types are the same. + fn MakeSelf() -> Self { return {}; } + fn MakeClass() -> Class(T) { return {}; } + + fn F() { + //@dump-sem-ir-begin + var c: Class(T) = MakeSelf(); + var s: Self = MakeClass(); + //@dump-sem-ir-end + } +} + +// --- field.carbon + +library "[[@TEST_NAME]]"; + +class Class(T:! type) { + var x: T; +} + +fn F(c: Class(i32)) -> i32 { + //@dump-sem-ir-begin + return c.x; + //@dump-sem-ir-end +} + +fn G(T:! type, c: Class(T)) -> T { + return c.x; +} + +fn H(U:! type, c: Class(U)) -> U { + return c.x; +} + +// --- fail_derived_to_base.carbon + +library "[[@TEST_NAME]]"; + +fn Int(N: Core.IntLiteral()) -> type = "int.make_type_signed"; + +base class B {} + +class A(N:! i32) { + extend base: B; + + // CHECK:STDERR: fail_derived_to_base.carbon:[[@LINE+3]]:10: error: integer type width of 0 is not positive [IntWidthNotPositive] + // CHECK:STDERR: var n: Int(N); + // CHECK:STDERR: ^~~~~~ + var n: Int(N); +} + +fn F(a: A(0)*) { + // CHECK:STDERR: fail_derived_to_base.carbon:[[@LINE+4]]:15: note: in `A(0)` used here [ResolvingSpecificHere] + // CHECK:STDERR: let b: B* = a; + // CHECK:STDERR: ^ + // CHECK:STDERR: + let b: B* = a; +} + +// --- fail_self_param.carbon + +library "[[@TEST_NAME]]"; + +// CHECK:STDERR: fail_self_param.carbon:[[@LINE+4]]:9: error: `self` parameter only allowed on functions [SelfParameterNotAllowed] +// CHECK:STDERR: class C[self:! type](x:! self) {} +// CHECK:STDERR: ^~~~~~~~~~~ +// CHECK:STDERR: +class C[self:! type](x:! self) {} +var v: C(0); + +// CHECK:STDOUT: --- forward_decl.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %C.type: type = generic_class_type @C [concrete] +// CHECK:STDOUT: %C.generic: %C.type = struct_value () [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: file { +// CHECK:STDOUT: %C.decl: %C.type = class_decl @C [concrete = constants.%C.generic] {} {} +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: class @C; +// CHECK:STDOUT: +// CHECK:STDOUT: --- class.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] +// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] +// CHECK:STDOUT: %Class.type: type = generic_class_type @Class [concrete] +// CHECK:STDOUT: %Class.generic: %Class.type = struct_value () [concrete] +// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T) [symbolic] +// CHECK:STDOUT: %ptr.955: type = ptr_type %Class [symbolic] +// CHECK:STDOUT: %pattern_type.9e0: type = pattern_type %ptr.955 [symbolic] +// CHECK:STDOUT: %pattern_type.f6d: type = pattern_type auto [concrete] +// CHECK:STDOUT: %ptr.79f: type = ptr_type %T [symbolic] +// CHECK:STDOUT: %pattern_type.afe: type = pattern_type %ptr.79f [symbolic] +// CHECK:STDOUT: %GetAddr.type: type = fn_type @GetAddr, @Class(%T) [symbolic] +// CHECK:STDOUT: %GetAddr: %GetAddr.type = struct_value () [symbolic] +// CHECK:STDOUT: %pattern_type.3c1: type = pattern_type %Class [symbolic] +// CHECK:STDOUT: %pattern_type.7dc: type = pattern_type %T [symbolic] +// CHECK:STDOUT: %GetValue.type: type = fn_type @GetValue, @Class(%T) [symbolic] +// CHECK:STDOUT: %GetValue: %GetValue.type = struct_value () [symbolic] +// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T [symbolic] +// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %T [symbolic] +// CHECK:STDOUT: %struct_type.k: type = struct_type {.k: %T} [symbolic] +// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.k [symbolic] +// CHECK:STDOUT: %require_complete.6e5: = require_complete_type %ptr.79f [symbolic] +// CHECK:STDOUT: %require_complete.2ae: = require_complete_type %ptr.955 [symbolic] +// CHECK:STDOUT: %require_complete.4f8: = require_complete_type %Class [symbolic] +// CHECK:STDOUT: %Declaration.type: type = generic_class_type @Declaration [concrete] +// CHECK:STDOUT: %Declaration.generic: %Declaration.type = struct_value () [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: file { +// CHECK:STDOUT: %Class.decl: %Class.type = class_decl @Class [concrete = constants.%Class.generic] { +// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %T.loc5_13.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc5_13.2 (constants.%T)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %Declaration.decl: %Declaration.type = class_decl @Declaration [concrete = constants.%Declaration.generic] { +// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %T.loc18_19.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc18_19.2 (constants.%T)] +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic class @Class(%T.loc5_13.1: type) { +// CHECK:STDOUT: %T.loc5_13.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc5_13.2 (constants.%T)] +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %GetAddr.type: type = fn_type @GetAddr, @Class(%T.loc5_13.2) [symbolic = %GetAddr.type (constants.%GetAddr.type)] +// CHECK:STDOUT: %GetAddr: @Class.%GetAddr.type (%GetAddr.type) = struct_value () [symbolic = %GetAddr (constants.%GetAddr)] +// CHECK:STDOUT: %GetValue.type: type = fn_type @GetValue, @Class(%T.loc5_13.2) [symbolic = %GetValue.type (constants.%GetValue.type)] +// CHECK:STDOUT: %GetValue: @Class.%GetValue.type (%GetValue.type) = struct_value () [symbolic = %GetValue (constants.%GetValue)] +// CHECK:STDOUT: %require_complete: = require_complete_type %T.loc5_13.2 [symbolic = %require_complete (constants.%require_complete.4ae)] +// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T.loc5_13.2) [symbolic = %Class (constants.%Class)] +// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %T.loc5_13.2 [symbolic = %Class.elem (constants.%Class.elem)] +// CHECK:STDOUT: %struct_type.k.loc16_1.2: type = struct_type {.k: @Class.%T.loc5_13.2 (%T)} [symbolic = %struct_type.k.loc16_1.2 (constants.%struct_type.k)] +// CHECK:STDOUT: %complete_type.loc16_1.2: = complete_type_witness %struct_type.k.loc16_1.2 [symbolic = %complete_type.loc16_1.2 (constants.%complete_type)] +// CHECK:STDOUT: +// CHECK:STDOUT: class { +// CHECK:STDOUT: %GetAddr.decl: @Class.%GetAddr.type (%GetAddr.type) = fn_decl @GetAddr [symbolic = @Class.%GetAddr (constants.%GetAddr)] { +// CHECK:STDOUT: %self.patt: @GetAddr.%pattern_type.loc6_19 (%pattern_type.9e0) = binding_pattern self [concrete] +// CHECK:STDOUT: %self.param_patt: @GetAddr.%pattern_type.loc6_19 (%pattern_type.9e0) = value_param_pattern %self.patt, call_param0 [concrete] +// CHECK:STDOUT: %.loc6_14: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] +// CHECK:STDOUT: %return.patt: @GetAddr.%pattern_type.loc6_34 (%pattern_type.afe) = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: @GetAddr.%pattern_type.loc6_34 (%pattern_type.afe) = out_param_pattern %return.patt, call_param1 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %T.ref: type = name_ref T, @Class.%T.loc5_13.1 [symbolic = %T (constants.%T)] +// CHECK:STDOUT: %ptr.loc6_38.2: type = ptr_type %T.ref [symbolic = %ptr.loc6_38.1 (constants.%ptr.79f)] +// CHECK:STDOUT: %self.param: @GetAddr.%ptr.loc6_29.1 (%ptr.955) = value_param call_param0 +// CHECK:STDOUT: %.loc6_29: type = splice_block %ptr.loc6_29.2 [symbolic = %ptr.loc6_29.1 (constants.%ptr.955)] { +// CHECK:STDOUT: %.loc6_25: type = specific_constant constants.%Class, @Class(constants.%T) [symbolic = %Class (constants.%Class)] +// CHECK:STDOUT: %Self.ref: type = name_ref Self, %.loc6_25 [symbolic = %Class (constants.%Class)] +// CHECK:STDOUT: %ptr.loc6_29.2: type = ptr_type %Self.ref [symbolic = %ptr.loc6_29.1 (constants.%ptr.955)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %self: @GetAddr.%ptr.loc6_29.1 (%ptr.955) = bind_name self, %self.param +// CHECK:STDOUT: %return.param: ref @GetAddr.%ptr.loc6_38.1 (%ptr.79f) = out_param call_param1 +// CHECK:STDOUT: %return: ref @GetAddr.%ptr.loc6_38.1 (%ptr.79f) = return_slot %return.param +// CHECK:STDOUT: } +// CHECK:STDOUT: %GetValue.decl: @Class.%GetValue.type (%GetValue.type) = fn_decl @GetValue [symbolic = @Class.%GetValue (constants.%GetValue)] { +// CHECK:STDOUT: %self.patt: @GetValue.%pattern_type.loc11_15 (%pattern_type.3c1) = binding_pattern self [concrete] +// CHECK:STDOUT: %self.param_patt: @GetValue.%pattern_type.loc11_15 (%pattern_type.3c1) = value_param_pattern %self.patt, call_param0 [concrete] +// CHECK:STDOUT: %return.patt: @GetValue.%pattern_type.loc11_29 (%pattern_type.7dc) = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: @GetValue.%pattern_type.loc11_29 (%pattern_type.7dc) = out_param_pattern %return.patt, call_param1 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %T.ref: type = name_ref T, @Class.%T.loc5_13.1 [symbolic = %T (constants.%T)] +// CHECK:STDOUT: %self.param: @GetValue.%Class (%Class) = value_param call_param0 +// CHECK:STDOUT: %.loc11_21.1: type = splice_block %Self.ref [symbolic = %Class (constants.%Class)] { +// CHECK:STDOUT: %.loc11_21.2: type = specific_constant constants.%Class, @Class(constants.%T) [symbolic = %Class (constants.%Class)] +// CHECK:STDOUT: %Self.ref: type = name_ref Self, %.loc11_21.2 [symbolic = %Class (constants.%Class)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %self: @GetValue.%Class (%Class) = bind_name self, %self.param +// CHECK:STDOUT: %return.param: ref @GetValue.%T (%T) = out_param call_param1 +// CHECK:STDOUT: %return: ref @GetValue.%T (%T) = return_slot %return.param +// CHECK:STDOUT: } +// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc5_13.1 [symbolic = %T.loc5_13.2 (constants.%T)] +// CHECK:STDOUT: %.loc15: @Class.%Class.elem (%Class.elem) = field_decl k, element0 [concrete] +// CHECK:STDOUT: %struct_type.k.loc16_1.1: type = struct_type {.k: %T} [symbolic = %struct_type.k.loc16_1.2 (constants.%struct_type.k)] +// CHECK:STDOUT: %complete_type.loc16_1.1: = complete_type_witness %struct_type.k.loc16_1.1 [symbolic = %complete_type.loc16_1.2 (constants.%complete_type)] +// CHECK:STDOUT: complete_type_witness = %complete_type.loc16_1.1 +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = constants.%Class +// CHECK:STDOUT: .T = +// CHECK:STDOUT: .GetAddr = %GetAddr.decl +// CHECK:STDOUT: .GetValue = %GetValue.decl +// CHECK:STDOUT: .k = %.loc15 +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic class @Declaration(%T.loc18_19.1: type) { +// CHECK:STDOUT: %T.loc18_19.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc18_19.2 (constants.%T)] +// CHECK:STDOUT: +// CHECK:STDOUT: class; +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @GetAddr(@Class.%T.loc5_13.1: type) { +// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] +// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T) [symbolic = %Class (constants.%Class)] +// CHECK:STDOUT: %ptr.loc6_29.1: type = ptr_type %Class [symbolic = %ptr.loc6_29.1 (constants.%ptr.955)] +// CHECK:STDOUT: %pattern_type.loc6_19: type = pattern_type %ptr.loc6_29.1 [symbolic = %pattern_type.loc6_19 (constants.%pattern_type.9e0)] +// CHECK:STDOUT: %ptr.loc6_38.1: type = ptr_type %T [symbolic = %ptr.loc6_38.1 (constants.%ptr.79f)] +// CHECK:STDOUT: %pattern_type.loc6_34: type = pattern_type %ptr.loc6_38.1 [symbolic = %pattern_type.loc6_34 (constants.%pattern_type.afe)] +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %require_complete.loc6_34: = require_complete_type %ptr.loc6_38.1 [symbolic = %require_complete.loc6_34 (constants.%require_complete.6e5)] +// CHECK:STDOUT: %require_complete.loc6_23: = require_complete_type %ptr.loc6_29.1 [symbolic = %require_complete.loc6_23 (constants.%require_complete.2ae)] +// CHECK:STDOUT: %require_complete.loc7: = require_complete_type %Class [symbolic = %require_complete.loc7 (constants.%require_complete.4f8)] +// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %T [symbolic = %Class.elem (constants.%Class.elem)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn(%self.param: @GetAddr.%ptr.loc6_29.1 (%ptr.955)) -> @GetAddr.%ptr.loc6_38.1 (%ptr.79f) { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %self.ref: @GetAddr.%ptr.loc6_29.1 (%ptr.955) = name_ref self, %self +// CHECK:STDOUT: %.loc7_17.1: ref @GetAddr.%Class (%Class) = deref %self.ref +// CHECK:STDOUT: %k.ref: @GetAddr.%Class.elem (%Class.elem) = name_ref k, @Class.%.loc15 [concrete = @Class.%.loc15] +// CHECK:STDOUT: %.loc7_17.2: ref @GetAddr.%T (%T) = class_element_access %.loc7_17.1, element0 +// CHECK:STDOUT: %addr: @GetAddr.%ptr.loc6_38.1 (%ptr.79f) = addr_of %.loc7_17.2 +// CHECK:STDOUT: return %addr +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @GetValue(@Class.%T.loc5_13.1: type) { +// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] +// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T) [symbolic = %Class (constants.%Class)] +// CHECK:STDOUT: %pattern_type.loc11_15: type = pattern_type %Class [symbolic = %pattern_type.loc11_15 (constants.%pattern_type.3c1)] +// CHECK:STDOUT: %pattern_type.loc11_29: type = pattern_type %T [symbolic = %pattern_type.loc11_29 (constants.%pattern_type.7dc)] +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %require_complete.loc11: = require_complete_type %Class [symbolic = %require_complete.loc11 (constants.%require_complete.4f8)] +// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %T [symbolic = %Class.elem (constants.%Class.elem)] +// CHECK:STDOUT: %require_complete.loc12: = require_complete_type %T [symbolic = %require_complete.loc12 (constants.%require_complete.4ae)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn(%self.param: @GetValue.%Class (%Class)) -> @GetValue.%T (%T) { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %self.ref: @GetValue.%Class (%Class) = name_ref self, %self +// CHECK:STDOUT: %k.ref: @GetValue.%Class.elem (%Class.elem) = name_ref k, @Class.%.loc15 [concrete = @Class.%.loc15] +// CHECK:STDOUT: %.loc12_16.1: ref @GetValue.%T (%T) = class_element_access %self.ref, element0 +// CHECK:STDOUT: %.loc12_16.2: @GetValue.%T (%T) = bind_value %.loc12_16.1 +// CHECK:STDOUT: return %.loc12_16.2 +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @Class(constants.%T) { +// CHECK:STDOUT: %T.loc5_13.2 => constants.%T +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %GetAddr.type => constants.%GetAddr.type +// CHECK:STDOUT: %GetAddr => constants.%GetAddr +// CHECK:STDOUT: %GetValue.type => constants.%GetValue.type +// CHECK:STDOUT: %GetValue => constants.%GetValue +// CHECK:STDOUT: %require_complete => constants.%require_complete.4ae +// CHECK:STDOUT: %Class => constants.%Class +// CHECK:STDOUT: %Class.elem => constants.%Class.elem +// CHECK:STDOUT: %struct_type.k.loc16_1.2 => constants.%struct_type.k +// CHECK:STDOUT: %complete_type.loc16_1.2 => constants.%complete_type +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @GetAddr(constants.%T) { +// CHECK:STDOUT: %T => constants.%T +// CHECK:STDOUT: %Class => constants.%Class +// CHECK:STDOUT: %ptr.loc6_29.1 => constants.%ptr.955 +// CHECK:STDOUT: %pattern_type.loc6_19 => constants.%pattern_type.9e0 +// CHECK:STDOUT: %ptr.loc6_38.1 => constants.%ptr.79f +// CHECK:STDOUT: %pattern_type.loc6_34 => constants.%pattern_type.afe +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @GetValue(constants.%T) { +// CHECK:STDOUT: %T => constants.%T +// CHECK:STDOUT: %Class => constants.%Class +// CHECK:STDOUT: %pattern_type.loc11_15 => constants.%pattern_type.3c1 +// CHECK:STDOUT: %pattern_type.loc11_29 => constants.%pattern_type.7dc +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @Declaration(constants.%T) { +// CHECK:STDOUT: %T.loc18_19.2 => constants.%T +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: --- self_type.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] +// CHECK:STDOUT: %Class.type: type = generic_class_type @Class [concrete] +// CHECK:STDOUT: %Class.generic: %Class.type = struct_value () [concrete] +// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T) [symbolic] +// CHECK:STDOUT: %pattern_type.3c1: type = pattern_type %Class [symbolic] +// CHECK:STDOUT: %MakeSelf.type: type = fn_type @MakeSelf, @Class(%T) [symbolic] +// CHECK:STDOUT: %MakeSelf: %MakeSelf.type = struct_value () [symbolic] +// CHECK:STDOUT: %MakeClass.type: type = fn_type @MakeClass, @Class(%T) [symbolic] +// CHECK:STDOUT: %MakeClass: %MakeClass.type = struct_value () [symbolic] +// CHECK:STDOUT: %F.type: type = fn_type @F, @Class(%T) [symbolic] +// CHECK:STDOUT: %F: %F.type = struct_value () [symbolic] +// CHECK:STDOUT: %require_complete: = require_complete_type %Class [symbolic] +// CHECK:STDOUT: %MakeSelf.specific_fn: = specific_function %MakeSelf, @MakeSelf(%T) [symbolic] +// CHECK:STDOUT: %MakeClass.specific_fn: = specific_function %MakeClass, @MakeClass(%T) [symbolic] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic class @Class(%T.loc4_13.1: type) { +// CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: class { +// CHECK:STDOUT: +// CHECK:STDOUT: complete_type_witness = %complete_type +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = constants.%Class +// CHECK:STDOUT: .MakeSelf = %MakeSelf.decl +// CHECK:STDOUT: .Class = +// CHECK:STDOUT: .T = +// CHECK:STDOUT: .MakeClass = %MakeClass.decl +// CHECK:STDOUT: .F = %F.decl +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @F(@Class.%T.loc4_13.1: type) { +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] +// CHECK:STDOUT: %Class.loc12_19.2: type = class_type @Class, @Class(%T) [symbolic = %Class.loc12_19.2 (constants.%Class)] +// CHECK:STDOUT: %require_complete: = require_complete_type %Class.loc12_19.2 [symbolic = %require_complete (constants.%require_complete)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %Class.loc12_19.2 [symbolic = %pattern_type (constants.%pattern_type.3c1)] +// CHECK:STDOUT: %MakeSelf.type: type = fn_type @MakeSelf, @Class(%T) [symbolic = %MakeSelf.type (constants.%MakeSelf.type)] +// CHECK:STDOUT: %MakeSelf: @F.%MakeSelf.type (%MakeSelf.type) = struct_value () [symbolic = %MakeSelf (constants.%MakeSelf)] +// CHECK:STDOUT: %MakeSelf.specific_fn.loc12_23.2: = specific_function %MakeSelf, @MakeSelf(%T) [symbolic = %MakeSelf.specific_fn.loc12_23.2 (constants.%MakeSelf.specific_fn)] +// CHECK:STDOUT: %MakeClass.type: type = fn_type @MakeClass, @Class(%T) [symbolic = %MakeClass.type (constants.%MakeClass.type)] +// CHECK:STDOUT: %MakeClass: @F.%MakeClass.type (%MakeClass.type) = struct_value () [symbolic = %MakeClass (constants.%MakeClass)] +// CHECK:STDOUT: %MakeClass.specific_fn.loc13_19.2: = specific_function %MakeClass, @MakeClass(%T) [symbolic = %MakeClass.specific_fn.loc13_19.2 (constants.%MakeClass.specific_fn)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn() { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %c.patt: @F.%pattern_type (%pattern_type.3c1) = binding_pattern c [concrete] +// CHECK:STDOUT: %c.var_patt: @F.%pattern_type (%pattern_type.3c1) = var_pattern %c.patt [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: %c.var: ref @F.%Class.loc12_19.2 (%Class) = var %c.var_patt +// CHECK:STDOUT: %.loc12_23: @F.%MakeSelf.type (%MakeSelf.type) = specific_constant @Class.%MakeSelf.decl, @Class(constants.%T) [symbolic = %MakeSelf (constants.%MakeSelf)] +// CHECK:STDOUT: %MakeSelf.ref: @F.%MakeSelf.type (%MakeSelf.type) = name_ref MakeSelf, %.loc12_23 [symbolic = %MakeSelf (constants.%MakeSelf)] +// CHECK:STDOUT: %MakeSelf.specific_fn.loc12_23.1: = specific_function %MakeSelf.ref, @MakeSelf(constants.%T) [symbolic = %MakeSelf.specific_fn.loc12_23.2 (constants.%MakeSelf.specific_fn)] +// CHECK:STDOUT: %.loc12_5: ref @F.%Class.loc12_19.2 (%Class) = splice_block %c.var {} +// CHECK:STDOUT: %MakeSelf.call: init @F.%Class.loc12_19.2 (%Class) = call %MakeSelf.specific_fn.loc12_23.1() to %.loc12_5 +// CHECK:STDOUT: assign %c.var, %MakeSelf.call +// CHECK:STDOUT: %.loc12_19: type = splice_block %Class.loc12_19.1 [symbolic = %Class.loc12_19.2 (constants.%Class)] { +// CHECK:STDOUT: %Class.ref: %Class.type = name_ref Class, file.%Class.decl [concrete = constants.%Class.generic] +// CHECK:STDOUT: %T.ref: type = name_ref T, @Class.%T.loc4_13.1 [symbolic = %T (constants.%T)] +// CHECK:STDOUT: %Class.loc12_19.1: type = class_type @Class, @Class(constants.%T) [symbolic = %Class.loc12_19.2 (constants.%Class)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %c: ref @F.%Class.loc12_19.2 (%Class) = bind_name c, %c.var +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %s.patt: @F.%pattern_type (%pattern_type.3c1) = binding_pattern s [concrete] +// CHECK:STDOUT: %s.var_patt: @F.%pattern_type (%pattern_type.3c1) = var_pattern %s.patt [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: %s.var: ref @F.%Class.loc12_19.2 (%Class) = var %s.var_patt +// CHECK:STDOUT: %.loc13_19: @F.%MakeClass.type (%MakeClass.type) = specific_constant @Class.%MakeClass.decl, @Class(constants.%T) [symbolic = %MakeClass (constants.%MakeClass)] +// CHECK:STDOUT: %MakeClass.ref: @F.%MakeClass.type (%MakeClass.type) = name_ref MakeClass, %.loc13_19 [symbolic = %MakeClass (constants.%MakeClass)] +// CHECK:STDOUT: %MakeClass.specific_fn.loc13_19.1: = specific_function %MakeClass.ref, @MakeClass(constants.%T) [symbolic = %MakeClass.specific_fn.loc13_19.2 (constants.%MakeClass.specific_fn)] +// CHECK:STDOUT: %.loc13_5: ref @F.%Class.loc12_19.2 (%Class) = splice_block %s.var {} +// CHECK:STDOUT: %MakeClass.call: init @F.%Class.loc12_19.2 (%Class) = call %MakeClass.specific_fn.loc13_19.1() to %.loc13_5 +// CHECK:STDOUT: assign %s.var, %MakeClass.call +// CHECK:STDOUT: %.loc13_12.1: type = splice_block %Self.ref [symbolic = %Class.loc12_19.2 (constants.%Class)] { +// CHECK:STDOUT: %.loc13_12.2: type = specific_constant constants.%Class, @Class(constants.%T) [symbolic = %Class.loc12_19.2 (constants.%Class)] +// CHECK:STDOUT: %Self.ref: type = name_ref Self, %.loc13_12.2 [symbolic = %Class.loc12_19.2 (constants.%Class)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %s: ref @F.%Class.loc12_19.2 (%Class) = bind_name s, %s.var +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @Class(constants.%T) { +// CHECK:STDOUT: %T.loc4_13.2 => constants.%T +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %MakeSelf.type => constants.%MakeSelf.type +// CHECK:STDOUT: %MakeSelf => constants.%MakeSelf +// CHECK:STDOUT: %MakeClass.type => constants.%MakeClass.type +// CHECK:STDOUT: %MakeClass => constants.%MakeClass +// CHECK:STDOUT: %F.type => constants.%F.type +// CHECK:STDOUT: %F => constants.%F +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @F(constants.%T) {} +// CHECK:STDOUT: +// CHECK:STDOUT: --- field.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] +// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] +// CHECK:STDOUT: %Class.247: type = class_type @Class, @Class(%i32) [concrete] +// CHECK:STDOUT: %Class.elem.2d8: type = unbound_element_type %Class.247, %i32 [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @F(%c.param: %Class.247) -> %i32 { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %c.ref: %Class.247 = name_ref c, %c +// CHECK:STDOUT: %x.ref: %Class.elem.2d8 = name_ref x, @Class.%.loc5 [concrete = @Class.%.loc5] +// CHECK:STDOUT: %.loc10_11.1: ref %i32 = class_element_access %c.ref, element0 +// CHECK:STDOUT: %.loc10_11.2: %i32 = bind_value %.loc10_11.1 +// CHECK:STDOUT: return %.loc10_11.2 +// CHECK:STDOUT: } +// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/generic/call.carbon b/toolchain/check/testdata/class/generic/call.carbon index 5ea8e7acade1a..313d93f2b3489 100644 --- a/toolchain/check/testdata/class/generic/call.carbon +++ b/toolchain/check/testdata/class/generic/call.carbon @@ -2,6 +2,8 @@ // Exceptions. See /LICENSE for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// // AUTOUPDATE // TIP: To test this file alone, run: // TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/generic/call.carbon @@ -14,10 +16,12 @@ library "[[@TEST_NAME]]"; class Class(T:! type, N:! i32) {} +//@dump-sem-ir-begin var a: Class(i32*, 5); // Requires an implicit conversion to type `type`. var b: Class((), 0); +//@dump-sem-ir-end // --- fail_too_few.carbon @@ -89,24 +93,13 @@ class Outer(T:! type) { // CHECK:STDOUT: --- call.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] // CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %N.356: %i32 = bind_symbolic_name N, 1 [symbolic] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] // CHECK:STDOUT: %Class.type: type = generic_class_type @Class [concrete] // CHECK:STDOUT: %Class.generic: %Class.type = struct_value () [concrete] -// CHECK:STDOUT: %Class.ab2: type = class_type @Class, @Class(%T, %N.356) [symbolic] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] // CHECK:STDOUT: %ptr.235: type = ptr_type %i32 [concrete] // CHECK:STDOUT: %int_5.64b: Core.IntLiteral = int_value 5 [concrete] -// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] // CHECK:STDOUT: %ImplicitAs.type.205: type = facet_type <@ImplicitAs, @ImplicitAs(%i32)> [concrete] // CHECK:STDOUT: %Convert.type.1b6: type = fn_type @Convert.1, @ImplicitAs(%i32) [concrete] // CHECK:STDOUT: %To.c80: Core.IntLiteral = bind_symbolic_name To, 0 [symbolic] @@ -132,56 +125,30 @@ class Outer(T:! type) { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/operators/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] // CHECK:STDOUT: %Core.import_ref.a5b: @impl.4f9.%Convert.type (%Convert.type.0f9) = import_ref Core//prelude/types/int, loc19_39, loaded [symbolic = @impl.4f9.%Convert (constants.%Convert.f06)] // CHECK:STDOUT: %ImplicitAs.impl_witness_table.a2f = impl_witness_table (%Core.import_ref.a5b), @impl.4f9 [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Class = %Class.decl -// CHECK:STDOUT: .a = %a -// CHECK:STDOUT: .b = %b -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Class.decl: %Class.type = class_decl @Class [concrete = constants.%Class.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: %N.patt: %pattern_type.7ce = symbolic_binding_pattern N, 1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc4_13.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_13.2 (constants.%T)] -// CHECK:STDOUT: %.loc4: type = splice_block %i32 [concrete = constants.%i32] { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: } -// CHECK:STDOUT: %N.loc4_23.1: %i32 = bind_symbolic_name N, 1 [symbolic = %N.loc4_23.2 (constants.%N.356)] -// CHECK:STDOUT: } // CHECK:STDOUT: name_binding_decl { // CHECK:STDOUT: %a.patt: %pattern_type.d51 = binding_pattern a [concrete] // CHECK:STDOUT: %a.var_patt: %pattern_type.d51 = var_pattern %a.patt [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: %a.var: ref %Class.f29 = var %a.var_patt [concrete] -// CHECK:STDOUT: %.loc6_21.1: type = splice_block %Class.loc6 [concrete = constants.%Class.f29] { -// CHECK:STDOUT: %Class.ref.loc6: %Class.type = name_ref Class, %Class.decl [concrete = constants.%Class.generic] +// CHECK:STDOUT: %.loc7_21.1: type = splice_block %Class.loc7 [concrete = constants.%Class.f29] { +// CHECK:STDOUT: %Class.ref.loc7: %Class.type = name_ref Class, %Class.decl [concrete = constants.%Class.generic] // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] // CHECK:STDOUT: %ptr: type = ptr_type %i32 [concrete = constants.%ptr.235] // CHECK:STDOUT: %int_5: Core.IntLiteral = int_value 5 [concrete = constants.%int_5.64b] -// CHECK:STDOUT: %impl.elem0.loc6: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc6_21.1: = bound_method %int_5, %impl.elem0.loc6 [concrete = constants.%Convert.bound.4e6] -// CHECK:STDOUT: %specific_fn.loc6: = specific_function %impl.elem0.loc6, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc6_21.2: = bound_method %int_5, %specific_fn.loc6 [concrete = constants.%bound_method.a25] -// CHECK:STDOUT: %int.convert_checked.loc6: init %i32 = call %bound_method.loc6_21.2(%int_5) [concrete = constants.%int_5.0f6] -// CHECK:STDOUT: %.loc6_21.2: %i32 = value_of_initializer %int.convert_checked.loc6 [concrete = constants.%int_5.0f6] -// CHECK:STDOUT: %.loc6_21.3: %i32 = converted %int_5, %.loc6_21.2 [concrete = constants.%int_5.0f6] -// CHECK:STDOUT: %Class.loc6: type = class_type @Class, @Class(constants.%ptr.235, constants.%int_5.0f6) [concrete = constants.%Class.f29] +// CHECK:STDOUT: %impl.elem0.loc7: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] +// CHECK:STDOUT: %bound_method.loc7_21.1: = bound_method %int_5, %impl.elem0.loc7 [concrete = constants.%Convert.bound.4e6] +// CHECK:STDOUT: %specific_fn.loc7: = specific_function %impl.elem0.loc7, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] +// CHECK:STDOUT: %bound_method.loc7_21.2: = bound_method %int_5, %specific_fn.loc7 [concrete = constants.%bound_method.a25] +// CHECK:STDOUT: %int.convert_checked.loc7: init %i32 = call %bound_method.loc7_21.2(%int_5) [concrete = constants.%int_5.0f6] +// CHECK:STDOUT: %.loc7_21.2: %i32 = value_of_initializer %int.convert_checked.loc7 [concrete = constants.%int_5.0f6] +// CHECK:STDOUT: %.loc7_21.3: %i32 = converted %int_5, %.loc7_21.2 [concrete = constants.%int_5.0f6] +// CHECK:STDOUT: %Class.loc7: type = class_type @Class, @Class(constants.%ptr.235, constants.%int_5.0f6) [concrete = constants.%Class.f29] // CHECK:STDOUT: } // CHECK:STDOUT: %a: ref %Class.f29 = bind_name a, %a.var // CHECK:STDOUT: name_binding_decl { @@ -189,628 +156,20 @@ class Outer(T:! type) { // CHECK:STDOUT: %b.var_patt: %pattern_type.c73 = var_pattern %b.patt [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: %b.var: ref %Class.dd4 = var %b.var_patt [concrete] -// CHECK:STDOUT: %.loc9_19.1: type = splice_block %Class.loc9 [concrete = constants.%Class.dd4] { -// CHECK:STDOUT: %Class.ref.loc9: %Class.type = name_ref Class, %Class.decl [concrete = constants.%Class.generic] -// CHECK:STDOUT: %.loc9_15: %empty_tuple.type = tuple_literal () +// CHECK:STDOUT: %.loc10_19.1: type = splice_block %Class.loc10 [concrete = constants.%Class.dd4] { +// CHECK:STDOUT: %Class.ref.loc10: %Class.type = name_ref Class, %Class.decl [concrete = constants.%Class.generic] +// CHECK:STDOUT: %.loc10_15: %empty_tuple.type = tuple_literal () // CHECK:STDOUT: %int_0: Core.IntLiteral = int_value 0 [concrete = constants.%int_0.5c6] -// CHECK:STDOUT: %.loc9_19.2: type = converted %.loc9_15, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] -// CHECK:STDOUT: %impl.elem0.loc9: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc9_19.1: = bound_method %int_0, %impl.elem0.loc9 [concrete = constants.%Convert.bound.d04] -// CHECK:STDOUT: %specific_fn.loc9: = specific_function %impl.elem0.loc9, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc9_19.2: = bound_method %int_0, %specific_fn.loc9 [concrete = constants.%bound_method.b6e] -// CHECK:STDOUT: %int.convert_checked.loc9: init %i32 = call %bound_method.loc9_19.2(%int_0) [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %.loc9_19.3: %i32 = value_of_initializer %int.convert_checked.loc9 [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %.loc9_19.4: %i32 = converted %int_0, %.loc9_19.3 [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %Class.loc9: type = class_type @Class, @Class(constants.%empty_tuple.type, constants.%int_0.6a9) [concrete = constants.%Class.dd4] +// CHECK:STDOUT: %.loc10_19.2: type = converted %.loc10_15, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] +// CHECK:STDOUT: %impl.elem0.loc10: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] +// CHECK:STDOUT: %bound_method.loc10_19.1: = bound_method %int_0, %impl.elem0.loc10 [concrete = constants.%Convert.bound.d04] +// CHECK:STDOUT: %specific_fn.loc10: = specific_function %impl.elem0.loc10, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] +// CHECK:STDOUT: %bound_method.loc10_19.2: = bound_method %int_0, %specific_fn.loc10 [concrete = constants.%bound_method.b6e] +// CHECK:STDOUT: %int.convert_checked.loc10: init %i32 = call %bound_method.loc10_19.2(%int_0) [concrete = constants.%int_0.6a9] +// CHECK:STDOUT: %.loc10_19.3: %i32 = value_of_initializer %int.convert_checked.loc10 [concrete = constants.%int_0.6a9] +// CHECK:STDOUT: %.loc10_19.4: %i32 = converted %int_0, %.loc10_19.3 [concrete = constants.%int_0.6a9] +// CHECK:STDOUT: %Class.loc10: type = class_type @Class, @Class(constants.%empty_tuple.type, constants.%int_0.6a9) [concrete = constants.%Class.dd4] // CHECK:STDOUT: } // CHECK:STDOUT: %b: ref %Class.dd4 = bind_name b, %b.var // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic class @Class(%T.loc4_13.1: type, %N.loc4_23.1: %i32) { -// CHECK:STDOUT: %T.loc4_13.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_13.2 (constants.%T)] -// CHECK:STDOUT: %N.loc4_23.2: %i32 = bind_symbolic_name N, 1 [symbolic = %N.loc4_23.2 (constants.%N.356)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Class.ab2 -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Class(constants.%T, constants.%N.356) { -// CHECK:STDOUT: %T.loc4_13.2 => constants.%T -// CHECK:STDOUT: %N.loc4_23.2 => constants.%N.356 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Class(constants.%ptr.235, constants.%int_5.0f6) { -// CHECK:STDOUT: %T.loc4_13.2 => constants.%ptr.235 -// CHECK:STDOUT: %N.loc4_23.2 => constants.%int_5.0f6 -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Class(constants.%empty_tuple.type, constants.%int_0.6a9) { -// CHECK:STDOUT: %T.loc4_13.2 => constants.%empty_tuple.type -// CHECK:STDOUT: %N.loc4_23.2 => constants.%int_0.6a9 -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_too_few.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %N.356: %i32 = bind_symbolic_name N, 1 [symbolic] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %Class.type: type = generic_class_type @Class [concrete] -// CHECK:STDOUT: %Class.generic: %Class.type = struct_value () [concrete] -// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T, %N.356) [symbolic] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %ptr: type = ptr_type %i32 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Class = %Class.decl -// CHECK:STDOUT: .a = %a -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Class.decl: %Class.type = class_decl @Class [concrete = constants.%Class.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: %N.patt: %pattern_type.7ce = symbolic_binding_pattern N, 1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc4_13.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_13.2 (constants.%T)] -// CHECK:STDOUT: %.loc4: type = splice_block %i32 [concrete = constants.%i32] { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: } -// CHECK:STDOUT: %N.loc4_23.1: %i32 = bind_symbolic_name N, 1 [symbolic = %N.loc4_23.2 (constants.%N.356)] -// CHECK:STDOUT: } -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %a.patt: = binding_pattern a [concrete] -// CHECK:STDOUT: %a.var_patt: = var_pattern %a.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %a.var: ref = var %a.var_patt [concrete = ] -// CHECK:STDOUT: %.1: = splice_block [concrete = ] { -// CHECK:STDOUT: %Class.ref: %Class.type = name_ref Class, %Class.decl [concrete = constants.%Class.generic] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %ptr: type = ptr_type %i32 [concrete = constants.%ptr] -// CHECK:STDOUT: } -// CHECK:STDOUT: %a: = bind_name a, -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Class(%T.loc4_13.1: type, %N.loc4_23.1: %i32) { -// CHECK:STDOUT: %T.loc4_13.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_13.2 (constants.%T)] -// CHECK:STDOUT: %N.loc4_23.2: %i32 = bind_symbolic_name N, 1 [symbolic = %N.loc4_23.2 (constants.%N.356)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Class -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Class(constants.%T, constants.%N.356) { -// CHECK:STDOUT: %T.loc4_13.2 => constants.%T -// CHECK:STDOUT: %N.loc4_23.2 => constants.%N.356 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_too_many.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %N.356: %i32 = bind_symbolic_name N, 1 [symbolic] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %Class.type: type = generic_class_type @Class [concrete] -// CHECK:STDOUT: %Class.generic: %Class.type = struct_value () [concrete] -// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T, %N.356) [symbolic] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %ptr: type = ptr_type %i32 [concrete] -// CHECK:STDOUT: %int_1: Core.IntLiteral = int_value 1 [concrete] -// CHECK:STDOUT: %int_2: Core.IntLiteral = int_value 2 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Class = %Class.decl -// CHECK:STDOUT: .a = %a -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Class.decl: %Class.type = class_decl @Class [concrete = constants.%Class.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: %N.patt: %pattern_type.7ce = symbolic_binding_pattern N, 1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc4_13.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_13.2 (constants.%T)] -// CHECK:STDOUT: %.loc4: type = splice_block %i32 [concrete = constants.%i32] { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: } -// CHECK:STDOUT: %N.loc4_23.1: %i32 = bind_symbolic_name N, 1 [symbolic = %N.loc4_23.2 (constants.%N.356)] -// CHECK:STDOUT: } -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %a.patt: = binding_pattern a [concrete] -// CHECK:STDOUT: %a.var_patt: = var_pattern %a.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %a.var: ref = var %a.var_patt [concrete = ] -// CHECK:STDOUT: %.1: = splice_block [concrete = ] { -// CHECK:STDOUT: %Class.ref: %Class.type = name_ref Class, %Class.decl [concrete = constants.%Class.generic] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %ptr: type = ptr_type %i32 [concrete = constants.%ptr] -// CHECK:STDOUT: %int_1: Core.IntLiteral = int_value 1 [concrete = constants.%int_1] -// CHECK:STDOUT: %int_2: Core.IntLiteral = int_value 2 [concrete = constants.%int_2] -// CHECK:STDOUT: } -// CHECK:STDOUT: %a: = bind_name a, -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Class(%T.loc4_13.1: type, %N.loc4_23.1: %i32) { -// CHECK:STDOUT: %T.loc4_13.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_13.2 (constants.%T)] -// CHECK:STDOUT: %N.loc4_23.2: %i32 = bind_symbolic_name N, 1 [symbolic = %N.loc4_23.2 (constants.%N.356)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Class -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Class(constants.%T, constants.%N.356) { -// CHECK:STDOUT: %T.loc4_13.2 => constants.%T -// CHECK:STDOUT: %N.loc4_23.2 => constants.%N.356 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_no_conversion.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %N.356: %i32 = bind_symbolic_name N, 1 [symbolic] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %Class.type: type = generic_class_type @Class [concrete] -// CHECK:STDOUT: %Class.generic: %Class.type = struct_value () [concrete] -// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T, %N.356) [symbolic] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %int_5: Core.IntLiteral = int_value 5 [concrete] -// CHECK:STDOUT: %ptr: type = ptr_type %i32 [concrete] -// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/operators/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Class = %Class.decl -// CHECK:STDOUT: .a = %a -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Class.decl: %Class.type = class_decl @Class [concrete = constants.%Class.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: %N.patt: %pattern_type.7ce = symbolic_binding_pattern N, 1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc4_13.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_13.2 (constants.%T)] -// CHECK:STDOUT: %.loc4: type = splice_block %i32 [concrete = constants.%i32] { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: } -// CHECK:STDOUT: %N.loc4_23.1: %i32 = bind_symbolic_name N, 1 [symbolic = %N.loc4_23.2 (constants.%N.356)] -// CHECK:STDOUT: } -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %a.patt: = binding_pattern a [concrete] -// CHECK:STDOUT: %a.var_patt: = var_pattern %a.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %a.var: ref = var %a.var_patt [concrete = ] -// CHECK:STDOUT: %.1: = splice_block [concrete = ] { -// CHECK:STDOUT: %Class.ref: %Class.type = name_ref Class, %Class.decl [concrete = constants.%Class.generic] -// CHECK:STDOUT: %int_5: Core.IntLiteral = int_value 5 [concrete = constants.%int_5] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %ptr: type = ptr_type %i32 [concrete = constants.%ptr] -// CHECK:STDOUT: %.loc16: type = converted %int_5, [concrete = ] -// CHECK:STDOUT: } -// CHECK:STDOUT: %a: = bind_name a, -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Class(%T.loc4_13.1: type, %N.loc4_23.1: %i32) { -// CHECK:STDOUT: %T.loc4_13.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_13.2 (constants.%T)] -// CHECK:STDOUT: %N.loc4_23.2: %i32 = bind_symbolic_name N, 1 [symbolic = %N.loc4_23.2 (constants.%N.356)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Class -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Class(constants.%T, constants.%N.356) { -// CHECK:STDOUT: %T.loc4_13.2 => constants.%T -// CHECK:STDOUT: %N.loc4_23.2 => constants.%N.356 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- call_in_nested_return_type.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] -// CHECK:STDOUT: %Outer.type: type = generic_class_type @Outer [concrete] -// CHECK:STDOUT: %Outer.generic: %Outer.type = struct_value () [concrete] -// CHECK:STDOUT: %Outer.9d6: type = class_type @Outer, @Outer(%T) [symbolic] -// CHECK:STDOUT: %U: type = bind_symbolic_name U, 1 [symbolic] -// CHECK:STDOUT: %Inner.type.eae: type = generic_class_type @Inner, @Outer(%T) [symbolic] -// CHECK:STDOUT: %Inner.generic.137: %Inner.type.eae = struct_value () [symbolic] -// CHECK:STDOUT: %Inner.c71: type = class_type @Inner, @Inner(%T, %U) [symbolic] -// CHECK:STDOUT: %pattern_type.e86: type = pattern_type %Outer.9d6 [symbolic] -// CHECK:STDOUT: %A.type.8d7: type = fn_type @A, @Inner(%T, %U) [symbolic] -// CHECK:STDOUT: %A.d0e: %A.type.8d7 = struct_value () [symbolic] -// CHECK:STDOUT: %Outer.99f: type = class_type @Outer, @Outer(%U) [symbolic] -// CHECK:STDOUT: %pattern_type.089: type = pattern_type %Outer.99f [symbolic] -// CHECK:STDOUT: %B.type.880: type = fn_type @B, @Inner(%T, %U) [symbolic] -// CHECK:STDOUT: %B.c7b: %B.type.880 = struct_value () [symbolic] -// CHECK:STDOUT: %Inner.13a: type = class_type @Inner, @Inner(%T, %T) [symbolic] -// CHECK:STDOUT: %pattern_type.a60: type = pattern_type %Inner.13a [symbolic] -// CHECK:STDOUT: %C.type.714: type = fn_type @C, @Inner(%T, %U) [symbolic] -// CHECK:STDOUT: %C.e62: %C.type.714 = struct_value () [symbolic] -// CHECK:STDOUT: %pattern_type.372: type = pattern_type %Inner.c71 [symbolic] -// CHECK:STDOUT: %D.type.102: type = fn_type @D, @Inner(%T, %U) [symbolic] -// CHECK:STDOUT: %D.d85: %D.type.102 = struct_value () [symbolic] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %require_complete.127: = require_complete_type %Outer.9d6 [symbolic] -// CHECK:STDOUT: %Outer.val.234: %Outer.9d6 = struct_value () [symbolic] -// CHECK:STDOUT: %Inner.type.a71: type = generic_class_type @Inner, @Outer(%U) [symbolic] -// CHECK:STDOUT: %Inner.generic.e3b: %Inner.type.a71 = struct_value () [symbolic] -// CHECK:STDOUT: %require_complete.964: = require_complete_type %Outer.99f [symbolic] -// CHECK:STDOUT: %Outer.val.a2f: %Outer.99f = struct_value () [symbolic] -// CHECK:STDOUT: %A.type.5c8: type = fn_type @A, @Inner(%T, %T) [symbolic] -// CHECK:STDOUT: %A.7e2: %A.type.5c8 = struct_value () [symbolic] -// CHECK:STDOUT: %B.type.ec0: type = fn_type @B, @Inner(%T, %T) [symbolic] -// CHECK:STDOUT: %B.051: %B.type.ec0 = struct_value () [symbolic] -// CHECK:STDOUT: %C.type.1cf: type = fn_type @C, @Inner(%T, %T) [symbolic] -// CHECK:STDOUT: %C.cf5: %C.type.1cf = struct_value () [symbolic] -// CHECK:STDOUT: %D.type.7bc: type = fn_type @D, @Inner(%T, %T) [symbolic] -// CHECK:STDOUT: %D.aa3: %D.type.7bc = struct_value () [symbolic] -// CHECK:STDOUT: %require_complete.7b1: = require_complete_type %Inner.13a [symbolic] -// CHECK:STDOUT: %Inner.val.69d: %Inner.13a = struct_value () [symbolic] -// CHECK:STDOUT: %require_complete.e7e: = require_complete_type %Inner.c71 [symbolic] -// CHECK:STDOUT: %Inner.val.dfa: %Inner.c71 = struct_value () [symbolic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Outer = %Outer.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Outer.decl: %Outer.type = class_decl @Outer [concrete = constants.%Outer.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc2_13.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc2_13.2 (constants.%T)] -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Outer(%T.loc2_13.1: type) { -// CHECK:STDOUT: %T.loc2_13.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc2_13.2 (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %Inner.type: type = generic_class_type @Inner, @Outer(%T.loc2_13.2) [symbolic = %Inner.type (constants.%Inner.type.eae)] -// CHECK:STDOUT: %Inner.generic: @Outer.%Inner.type (%Inner.type.eae) = struct_value () [symbolic = %Inner.generic (constants.%Inner.generic.137)] -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %Inner.decl: @Outer.%Inner.type (%Inner.type.eae) = class_decl @Inner [symbolic = @Outer.%Inner.generic (constants.%Inner.generic.137)] { -// CHECK:STDOUT: %U.patt: %pattern_type.98f = symbolic_binding_pattern U, 1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %U.loc3_15.1: type = bind_symbolic_name U, 1 [symbolic = %U.loc3_15.2 (constants.%U)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Outer.9d6 -// CHECK:STDOUT: .Inner = %Inner.decl -// CHECK:STDOUT: .Outer = -// CHECK:STDOUT: .T = -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Inner(@Outer.%T.loc2_13.1: type, %U.loc3_15.1: type) { -// CHECK:STDOUT: %U.loc3_15.2: type = bind_symbolic_name U, 1 [symbolic = %U.loc3_15.2 (constants.%U)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %A.type: type = fn_type @A, @Inner(%T, %U.loc3_15.2) [symbolic = %A.type (constants.%A.type.8d7)] -// CHECK:STDOUT: %A: @Inner.%A.type (%A.type.8d7) = struct_value () [symbolic = %A (constants.%A.d0e)] -// CHECK:STDOUT: %B.type: type = fn_type @B, @Inner(%T, %U.loc3_15.2) [symbolic = %B.type (constants.%B.type.880)] -// CHECK:STDOUT: %B: @Inner.%B.type (%B.type.880) = struct_value () [symbolic = %B (constants.%B.c7b)] -// CHECK:STDOUT: %C.type: type = fn_type @C, @Inner(%T, %U.loc3_15.2) [symbolic = %C.type (constants.%C.type.714)] -// CHECK:STDOUT: %C: @Inner.%C.type (%C.type.714) = struct_value () [symbolic = %C (constants.%C.e62)] -// CHECK:STDOUT: %D.type: type = fn_type @D, @Inner(%T, %U.loc3_15.2) [symbolic = %D.type (constants.%D.type.102)] -// CHECK:STDOUT: %D: @Inner.%D.type (%D.type.102) = struct_value () [symbolic = %D (constants.%D.d85)] -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %A.decl: @Inner.%A.type (%A.type.8d7) = fn_decl @A [symbolic = @Inner.%A (constants.%A.d0e)] { -// CHECK:STDOUT: %return.patt: @A.%pattern_type (%pattern_type.e86) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @A.%pattern_type (%pattern_type.e86) = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %Outer.ref: %Outer.type = name_ref Outer, file.%Outer.decl [concrete = constants.%Outer.generic] -// CHECK:STDOUT: %T.ref: type = name_ref T, @Outer.%T.loc2_13.1 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %Outer.loc4_22.2: type = class_type @Outer, @Outer(constants.%T) [symbolic = %Outer.loc4_22.1 (constants.%Outer.9d6)] -// CHECK:STDOUT: %return.param: ref @A.%Outer.loc4_22.1 (%Outer.9d6) = out_param call_param0 -// CHECK:STDOUT: %return: ref @A.%Outer.loc4_22.1 (%Outer.9d6) = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %B.decl: @Inner.%B.type (%B.type.880) = fn_decl @B [symbolic = @Inner.%B (constants.%B.c7b)] { -// CHECK:STDOUT: %return.patt: @B.%pattern_type (%pattern_type.089) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @B.%pattern_type (%pattern_type.089) = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %Outer.ref: %Outer.type = name_ref Outer, file.%Outer.decl [concrete = constants.%Outer.generic] -// CHECK:STDOUT: %U.ref: type = name_ref U, @Inner.%U.loc3_15.1 [symbolic = %U (constants.%U)] -// CHECK:STDOUT: %Outer.loc7_22.2: type = class_type @Outer, @Outer(constants.%U) [symbolic = %Outer.loc7_22.1 (constants.%Outer.99f)] -// CHECK:STDOUT: %return.param: ref @B.%Outer.loc7_22.1 (%Outer.99f) = out_param call_param0 -// CHECK:STDOUT: %return: ref @B.%Outer.loc7_22.1 (%Outer.99f) = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %C.decl: @Inner.%C.type (%C.type.714) = fn_decl @C [symbolic = @Inner.%C (constants.%C.e62)] { -// CHECK:STDOUT: %return.patt: @C.%pattern_type (%pattern_type.a60) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @C.%pattern_type (%pattern_type.a60) = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %.loc10: @C.%Inner.type (%Inner.type.eae) = specific_constant @Outer.%Inner.decl, @Outer(constants.%T) [symbolic = %Inner.generic (constants.%Inner.generic.137)] -// CHECK:STDOUT: %Inner.ref: @C.%Inner.type (%Inner.type.eae) = name_ref Inner, %.loc10 [symbolic = %Inner.generic (constants.%Inner.generic.137)] -// CHECK:STDOUT: %T.ref: type = name_ref T, @Outer.%T.loc2_13.1 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %Inner.loc10_22.2: type = class_type @Inner, @Inner(constants.%T, constants.%T) [symbolic = %Inner.loc10_22.1 (constants.%Inner.13a)] -// CHECK:STDOUT: %return.param: ref @C.%Inner.loc10_22.1 (%Inner.13a) = out_param call_param0 -// CHECK:STDOUT: %return: ref @C.%Inner.loc10_22.1 (%Inner.13a) = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %D.decl: @Inner.%D.type (%D.type.102) = fn_decl @D [symbolic = @Inner.%D (constants.%D.d85)] { -// CHECK:STDOUT: %return.patt: @D.%pattern_type (%pattern_type.372) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @D.%pattern_type (%pattern_type.372) = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %.loc13: @D.%Inner.type (%Inner.type.eae) = specific_constant @Outer.%Inner.decl, @Outer(constants.%T) [symbolic = %Inner.generic (constants.%Inner.generic.137)] -// CHECK:STDOUT: %Inner.ref: @D.%Inner.type (%Inner.type.eae) = name_ref Inner, %.loc13 [symbolic = %Inner.generic (constants.%Inner.generic.137)] -// CHECK:STDOUT: %U.ref: type = name_ref U, @Inner.%U.loc3_15.1 [symbolic = %U (constants.%U)] -// CHECK:STDOUT: %Inner.loc13_22.2: type = class_type @Inner, @Inner(constants.%T, constants.%U) [symbolic = %Inner.loc13_22.1 (constants.%Inner.c71)] -// CHECK:STDOUT: %return.param: ref @D.%Inner.loc13_22.1 (%Inner.c71) = out_param call_param0 -// CHECK:STDOUT: %return: ref @D.%Inner.loc13_22.1 (%Inner.c71) = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Inner.c71 -// CHECK:STDOUT: .Outer = -// CHECK:STDOUT: .T = -// CHECK:STDOUT: .A = %A.decl -// CHECK:STDOUT: .U = -// CHECK:STDOUT: .B = %B.decl -// CHECK:STDOUT: .Inner = -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: .D = %D.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @A(@Outer.%T.loc2_13.1: type, @Inner.%U.loc3_15.1: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %Outer.loc4_22.1: type = class_type @Outer, @Outer(%T) [symbolic = %Outer.loc4_22.1 (constants.%Outer.9d6)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %Outer.loc4_22.1 [symbolic = %pattern_type (constants.%pattern_type.e86)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %Outer.loc4_22.1 [symbolic = %require_complete (constants.%require_complete.127)] -// CHECK:STDOUT: %Outer.val: @A.%Outer.loc4_22.1 (%Outer.9d6) = struct_value () [symbolic = %Outer.val (constants.%Outer.val.234)] -// CHECK:STDOUT: -// CHECK:STDOUT: fn() -> %return.param: @A.%Outer.loc4_22.1 (%Outer.9d6) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %.loc5_15.1: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %.loc5_15.2: init @A.%Outer.loc4_22.1 (%Outer.9d6) = class_init (), %return [symbolic = %Outer.val (constants.%Outer.val.234)] -// CHECK:STDOUT: %.loc5_16: init @A.%Outer.loc4_22.1 (%Outer.9d6) = converted %.loc5_15.1, %.loc5_15.2 [symbolic = %Outer.val (constants.%Outer.val.234)] -// CHECK:STDOUT: return %.loc5_16 to %return -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @B(@Outer.%T.loc2_13.1: type, @Inner.%U.loc3_15.1: type) { -// CHECK:STDOUT: %U: type = bind_symbolic_name U, 1 [symbolic = %U (constants.%U)] -// CHECK:STDOUT: %Outer.loc7_22.1: type = class_type @Outer, @Outer(%U) [symbolic = %Outer.loc7_22.1 (constants.%Outer.99f)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %Outer.loc7_22.1 [symbolic = %pattern_type (constants.%pattern_type.089)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %Outer.loc7_22.1 [symbolic = %require_complete (constants.%require_complete.964)] -// CHECK:STDOUT: %Outer.val: @B.%Outer.loc7_22.1 (%Outer.99f) = struct_value () [symbolic = %Outer.val (constants.%Outer.val.a2f)] -// CHECK:STDOUT: -// CHECK:STDOUT: fn() -> %return.param: @B.%Outer.loc7_22.1 (%Outer.99f) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %.loc8_15.1: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %.loc8_15.2: init @B.%Outer.loc7_22.1 (%Outer.99f) = class_init (), %return [symbolic = %Outer.val (constants.%Outer.val.a2f)] -// CHECK:STDOUT: %.loc8_16: init @B.%Outer.loc7_22.1 (%Outer.99f) = converted %.loc8_15.1, %.loc8_15.2 [symbolic = %Outer.val (constants.%Outer.val.a2f)] -// CHECK:STDOUT: return %.loc8_16 to %return -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @C(@Outer.%T.loc2_13.1: type, @Inner.%U.loc3_15.1: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %Inner.type: type = generic_class_type @Inner, @Outer(%T) [symbolic = %Inner.type (constants.%Inner.type.eae)] -// CHECK:STDOUT: %Inner.generic: @C.%Inner.type (%Inner.type.eae) = struct_value () [symbolic = %Inner.generic (constants.%Inner.generic.137)] -// CHECK:STDOUT: %Inner.loc10_22.1: type = class_type @Inner, @Inner(%T, %T) [symbolic = %Inner.loc10_22.1 (constants.%Inner.13a)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %Inner.loc10_22.1 [symbolic = %pattern_type (constants.%pattern_type.a60)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %Inner.loc10_22.1 [symbolic = %require_complete (constants.%require_complete.7b1)] -// CHECK:STDOUT: %Inner.val: @C.%Inner.loc10_22.1 (%Inner.13a) = struct_value () [symbolic = %Inner.val (constants.%Inner.val.69d)] -// CHECK:STDOUT: -// CHECK:STDOUT: fn() -> %return.param: @C.%Inner.loc10_22.1 (%Inner.13a) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %.loc11_15.1: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %.loc11_15.2: init @C.%Inner.loc10_22.1 (%Inner.13a) = class_init (), %return [symbolic = %Inner.val (constants.%Inner.val.69d)] -// CHECK:STDOUT: %.loc11_16: init @C.%Inner.loc10_22.1 (%Inner.13a) = converted %.loc11_15.1, %.loc11_15.2 [symbolic = %Inner.val (constants.%Inner.val.69d)] -// CHECK:STDOUT: return %.loc11_16 to %return -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @D(@Outer.%T.loc2_13.1: type, @Inner.%U.loc3_15.1: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %Inner.type: type = generic_class_type @Inner, @Outer(%T) [symbolic = %Inner.type (constants.%Inner.type.eae)] -// CHECK:STDOUT: %Inner.generic: @D.%Inner.type (%Inner.type.eae) = struct_value () [symbolic = %Inner.generic (constants.%Inner.generic.137)] -// CHECK:STDOUT: %U: type = bind_symbolic_name U, 1 [symbolic = %U (constants.%U)] -// CHECK:STDOUT: %Inner.loc13_22.1: type = class_type @Inner, @Inner(%T, %U) [symbolic = %Inner.loc13_22.1 (constants.%Inner.c71)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %Inner.loc13_22.1 [symbolic = %pattern_type (constants.%pattern_type.372)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %Inner.loc13_22.1 [symbolic = %require_complete (constants.%require_complete.e7e)] -// CHECK:STDOUT: %Inner.val: @D.%Inner.loc13_22.1 (%Inner.c71) = struct_value () [symbolic = %Inner.val (constants.%Inner.val.dfa)] -// CHECK:STDOUT: -// CHECK:STDOUT: fn() -> %return.param: @D.%Inner.loc13_22.1 (%Inner.c71) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %.loc14_15.1: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %.loc14_15.2: init @D.%Inner.loc13_22.1 (%Inner.c71) = class_init (), %return [symbolic = %Inner.val (constants.%Inner.val.dfa)] -// CHECK:STDOUT: %.loc14_16: init @D.%Inner.loc13_22.1 (%Inner.c71) = converted %.loc14_15.1, %.loc14_15.2 [symbolic = %Inner.val (constants.%Inner.val.dfa)] -// CHECK:STDOUT: return %.loc14_16 to %return -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Outer(constants.%T) { -// CHECK:STDOUT: %T.loc2_13.2 => constants.%T -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %Inner.type => constants.%Inner.type.eae -// CHECK:STDOUT: %Inner.generic => constants.%Inner.generic.137 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Inner(constants.%T, constants.%U) { -// CHECK:STDOUT: %U.loc3_15.2 => constants.%U -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %A.type => constants.%A.type.8d7 -// CHECK:STDOUT: %A => constants.%A.d0e -// CHECK:STDOUT: %B.type => constants.%B.type.880 -// CHECK:STDOUT: %B => constants.%B.c7b -// CHECK:STDOUT: %C.type => constants.%C.type.714 -// CHECK:STDOUT: %C => constants.%C.e62 -// CHECK:STDOUT: %D.type => constants.%D.type.102 -// CHECK:STDOUT: %D => constants.%D.d85 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @A(constants.%T, constants.%U) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %Outer.loc4_22.1 => constants.%Outer.9d6 -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.e86 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Outer(constants.%U) { -// CHECK:STDOUT: %T.loc2_13.2 => constants.%U -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %Inner.type => constants.%Inner.type.a71 -// CHECK:STDOUT: %Inner.generic => constants.%Inner.generic.e3b -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @B(constants.%T, constants.%U) { -// CHECK:STDOUT: %U => constants.%U -// CHECK:STDOUT: %Outer.loc7_22.1 => constants.%Outer.99f -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.089 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Inner(constants.%T, constants.%T) { -// CHECK:STDOUT: %U.loc3_15.2 => constants.%T -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %A.type => constants.%A.type.5c8 -// CHECK:STDOUT: %A => constants.%A.7e2 -// CHECK:STDOUT: %B.type => constants.%B.type.ec0 -// CHECK:STDOUT: %B => constants.%B.051 -// CHECK:STDOUT: %C.type => constants.%C.type.1cf -// CHECK:STDOUT: %C => constants.%C.cf5 -// CHECK:STDOUT: %D.type => constants.%D.type.7bc -// CHECK:STDOUT: %D => constants.%D.aa3 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @C(constants.%T, constants.%U) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %Inner.type => constants.%Inner.type.eae -// CHECK:STDOUT: %Inner.generic => constants.%Inner.generic.137 -// CHECK:STDOUT: %Inner.loc10_22.1 => constants.%Inner.13a -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.a60 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @D(constants.%T, constants.%U) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %Inner.type => constants.%Inner.type.eae -// CHECK:STDOUT: %Inner.generic => constants.%Inner.generic.137 -// CHECK:STDOUT: %U => constants.%U -// CHECK:STDOUT: %Inner.loc13_22.1 => constants.%Inner.c71 -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.372 -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/generic/complete_in_conversion.carbon b/toolchain/check/testdata/class/generic/complete_in_conversion.carbon deleted file mode 100644 index 5da02c51ff0cf..0000000000000 --- a/toolchain/check/testdata/class/generic/complete_in_conversion.carbon +++ /dev/null @@ -1,276 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/generic/complete_in_conversion.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/generic/complete_in_conversion.carbon - -// --- fail_derived_to_base.carbon - -fn Int(N: Core.IntLiteral()) -> type = "int.make_type_signed"; - -base class B {} - -class A(N:! i32) { - extend base: B; - - // CHECK:STDERR: fail_derived_to_base.carbon:[[@LINE+3]]:10: error: integer type width of 0 is not positive [IntWidthNotPositive] - // CHECK:STDERR: var n: Int(N); - // CHECK:STDERR: ^~~~~~ - var n: Int(N); -} - -fn F(a: A(0)*) { - // CHECK:STDERR: fail_derived_to_base.carbon:[[@LINE+4]]:15: note: in `A(0)` used here [ResolvingSpecificHere] - // CHECK:STDERR: let b: B* = a; - // CHECK:STDERR: ^ - // CHECK:STDERR: - let b: B* = a; -} - -// CHECK:STDOUT: --- fail_derived_to_base.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %IntLiteral.type: type = fn_type @IntLiteral [concrete] -// CHECK:STDOUT: %IntLiteral: %IntLiteral.type = struct_value () [concrete] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] -// CHECK:STDOUT: %pattern_type.dc0: type = pattern_type Core.IntLiteral [concrete] -// CHECK:STDOUT: %Int.type.913: type = fn_type @Int.1 [concrete] -// CHECK:STDOUT: %Int.779: %Int.type.913 = struct_value () [concrete] -// CHECK:STDOUT: %B: type = class_type @B [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type.878: type = generic_class_type @Int.2 [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type.878 = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int.2, @Int.2(%int_32) [concrete] -// CHECK:STDOUT: %N.51e: %i32 = bind_symbolic_name N, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %A.type: type = generic_class_type @A [concrete] -// CHECK:STDOUT: %A.generic: %A.type = struct_value () [concrete] -// CHECK:STDOUT: %A.dd3: type = class_type @A, @A(%N.51e) [symbolic] -// CHECK:STDOUT: %A.elem.500: type = unbound_element_type %A.dd3, %B [symbolic] -// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.type.2fd: type = facet_type <@ImplicitAs, @ImplicitAs(Core.IntLiteral)> [concrete] -// CHECK:STDOUT: %Convert.type.71e: type = fn_type @Convert.1, @ImplicitAs(Core.IntLiteral) [concrete] -// CHECK:STDOUT: %To.c80: Core.IntLiteral = bind_symbolic_name To, 0 [symbolic] -// CHECK:STDOUT: %Convert.type.0f9: type = fn_type @Convert.2, @impl.4f9(%To.c80) [symbolic] -// CHECK:STDOUT: %Convert.f06: %Convert.type.0f9 = struct_value () [symbolic] -// CHECK:STDOUT: %From: Core.IntLiteral = bind_symbolic_name From, 0 [symbolic] -// CHECK:STDOUT: %Convert.type.708: type = fn_type @Convert.3, @impl.971(%From) [symbolic] -// CHECK:STDOUT: %Convert.c68: %Convert.type.708 = struct_value () [symbolic] -// CHECK:STDOUT: %ImplicitAs.impl_witness.a11: = impl_witness imports.%ImplicitAs.impl_witness_table.1d9, @impl.971(%int_32) [concrete] -// CHECK:STDOUT: %Convert.type.4ad: type = fn_type @Convert.3, @impl.971(%int_32) [concrete] -// CHECK:STDOUT: %Convert.960: %Convert.type.4ad = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.facet.f49: %ImplicitAs.type.2fd = facet_value %i32, (%ImplicitAs.impl_witness.a11) [concrete] -// CHECK:STDOUT: %.0ea: type = fn_type_with_self_type %Convert.type.71e, %ImplicitAs.facet.f49 [concrete] -// CHECK:STDOUT: %Convert.bound.588: = bound_method %N.51e, %Convert.960 [symbolic] -// CHECK:STDOUT: %Convert.specific_fn.8a8: = specific_function %Convert.960, @Convert.3(%int_32) [concrete] -// CHECK:STDOUT: %bound_method.f9c: = bound_method %N.51e, %Convert.specific_fn.8a8 [symbolic] -// CHECK:STDOUT: %int.convert_checked: init Core.IntLiteral = call %bound_method.f9c(%N.51e) [symbolic] -// CHECK:STDOUT: %iN.builtin.8fe: type = int_type signed, %int.convert_checked [symbolic] -// CHECK:STDOUT: %require_complete.e34: = require_complete_type %iN.builtin.8fe [symbolic] -// CHECK:STDOUT: %A.elem.07f: type = unbound_element_type %A.dd3, %iN.builtin.8fe [symbolic] -// CHECK:STDOUT: %struct_type.base.n: type = struct_type {.base: %B, .n: %iN.builtin.8fe} [symbolic] -// CHECK:STDOUT: %complete_type.beb: = complete_type_witness %struct_type.base.n [symbolic] -// CHECK:STDOUT: %int_0.5c6: Core.IntLiteral = int_value 0 [concrete] -// CHECK:STDOUT: %ImplicitAs.type.205: type = facet_type <@ImplicitAs, @ImplicitAs(%i32)> [concrete] -// CHECK:STDOUT: %Convert.type.1b6: type = fn_type @Convert.1, @ImplicitAs(%i32) [concrete] -// CHECK:STDOUT: %ImplicitAs.impl_witness.c75: = impl_witness imports.%ImplicitAs.impl_witness_table.a2f, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.type.035: type = fn_type @Convert.2, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.956: %Convert.type.035 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.facet.921: %ImplicitAs.type.205 = facet_value Core.IntLiteral, (%ImplicitAs.impl_witness.c75) [concrete] -// CHECK:STDOUT: %.9c3: type = fn_type_with_self_type %Convert.type.1b6, %ImplicitAs.facet.921 [concrete] -// CHECK:STDOUT: %Convert.bound.d04: = bound_method %int_0.5c6, %Convert.956 [concrete] -// CHECK:STDOUT: %Convert.specific_fn.b6f: = specific_function %Convert.956, @Convert.2(%int_32) [concrete] -// CHECK:STDOUT: %bound_method.b6e: = bound_method %int_0.5c6, %Convert.specific_fn.b6f [concrete] -// CHECK:STDOUT: %int_0.6a9: %i32 = int_value 0 [concrete] -// CHECK:STDOUT: %A.6fc: type = class_type @A, @A(%int_0.6a9) [concrete] -// CHECK:STDOUT: %ptr.b65: type = ptr_type %A.6fc [concrete] -// CHECK:STDOUT: %pattern_type.213: type = pattern_type %ptr.b65 [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %ptr.e79: type = ptr_type %B [concrete] -// CHECK:STDOUT: %pattern_type.960: type = pattern_type %ptr.e79 [concrete] -// CHECK:STDOUT: %A.elem.d81: type = unbound_element_type %A.6fc, %B [concrete] -// CHECK:STDOUT: %Convert.bound.0fd: = bound_method %int_0.6a9, %Convert.960 [concrete] -// CHECK:STDOUT: %bound_method.4b5: = bound_method %int_0.6a9, %Convert.specific_fn.8a8 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .IntLiteral = %Core.IntLiteral -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.IntLiteral: %IntLiteral.type = import_ref Core//prelude/types/int_literal, IntLiteral, loaded [concrete = constants.%IntLiteral] -// CHECK:STDOUT: %Core.Int: %Int.type.878 = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/operators/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] -// CHECK:STDOUT: %Core.import_ref.a5b: @impl.4f9.%Convert.type (%Convert.type.0f9) = import_ref Core//prelude/types/int, loc19_39, loaded [symbolic = @impl.4f9.%Convert (constants.%Convert.f06)] -// CHECK:STDOUT: %ImplicitAs.impl_witness_table.a2f = impl_witness_table (%Core.import_ref.a5b), @impl.4f9 [concrete] -// CHECK:STDOUT: %Core.import_ref.85c: @impl.971.%Convert.type (%Convert.type.708) = import_ref Core//prelude/types/int, loc23_44, loaded [symbolic = @impl.971.%Convert (constants.%Convert.c68)] -// CHECK:STDOUT: %ImplicitAs.impl_witness_table.1d9 = impl_witness_table (%Core.import_ref.85c), @impl.971 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Int = %Int.decl -// CHECK:STDOUT: .B = %B.decl -// CHECK:STDOUT: .A = %A.decl -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Int.decl: %Int.type.913 = fn_decl @Int.1 [concrete = constants.%Int.779] { -// CHECK:STDOUT: %N.patt: %pattern_type.dc0 = binding_pattern N [concrete] -// CHECK:STDOUT: %N.param_patt: %pattern_type.dc0 = value_param_pattern %N.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.98f = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.98f = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %N.param: Core.IntLiteral = value_param call_param0 -// CHECK:STDOUT: %.loc2_27.1: type = splice_block %.loc2_27.3 [concrete = Core.IntLiteral] { -// CHECK:STDOUT: %Core.ref: = name_ref Core, imports.%Core [concrete = imports.%Core] -// CHECK:STDOUT: %IntLiteral.ref: %IntLiteral.type = name_ref IntLiteral, imports.%Core.IntLiteral [concrete = constants.%IntLiteral] -// CHECK:STDOUT: %int_literal.make_type: init type = call %IntLiteral.ref() [concrete = Core.IntLiteral] -// CHECK:STDOUT: %.loc2_27.2: type = value_of_initializer %int_literal.make_type [concrete = Core.IntLiteral] -// CHECK:STDOUT: %.loc2_27.3: type = converted %int_literal.make_type, %.loc2_27.2 [concrete = Core.IntLiteral] -// CHECK:STDOUT: } -// CHECK:STDOUT: %N: Core.IntLiteral = bind_name N, %N.param -// CHECK:STDOUT: %return.param: ref type = out_param call_param1 -// CHECK:STDOUT: %return: ref type = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %B.decl: type = class_decl @B [concrete = constants.%B] {} {} -// CHECK:STDOUT: %A.decl: %A.type = class_decl @A [concrete = constants.%A.generic] { -// CHECK:STDOUT: %N.patt: %pattern_type.7ce = symbolic_binding_pattern N, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %.loc6: type = splice_block %i32 [concrete = constants.%i32] { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int.2, @Int.2(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: } -// CHECK:STDOUT: %N.loc6_9.1: %i32 = bind_symbolic_name N, 0 [symbolic = %N.loc6_9.2 (constants.%N.51e)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %a.patt: %pattern_type.213 = binding_pattern a [concrete] -// CHECK:STDOUT: %a.param_patt: %pattern_type.213 = value_param_pattern %a.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %a.param: %ptr.b65 = value_param call_param0 -// CHECK:STDOUT: %.loc15_13: type = splice_block %ptr.loc15 [concrete = constants.%ptr.b65] { -// CHECK:STDOUT: %A.ref: %A.type = name_ref A, file.%A.decl [concrete = constants.%A.generic] -// CHECK:STDOUT: %int_0: Core.IntLiteral = int_value 0 [concrete = constants.%int_0.5c6] -// CHECK:STDOUT: %impl.elem0: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc15_12.1: = bound_method %int_0, %impl.elem0 [concrete = constants.%Convert.bound.d04] -// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn.b6f] -// CHECK:STDOUT: %bound_method.loc15_12.2: = bound_method %int_0, %specific_fn [concrete = constants.%bound_method.b6e] -// CHECK:STDOUT: %int.convert_checked: init %i32 = call %bound_method.loc15_12.2(%int_0) [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %.loc15_12.1: %i32 = value_of_initializer %int.convert_checked [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %.loc15_12.2: %i32 = converted %int_0, %.loc15_12.1 [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %A: type = class_type @A, @A(constants.%int_0.6a9) [concrete = constants.%A.6fc] -// CHECK:STDOUT: %ptr.loc15: type = ptr_type %A [concrete = constants.%ptr.b65] -// CHECK:STDOUT: } -// CHECK:STDOUT: %a: %ptr.b65 = bind_name a, %a.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @B { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%B -// CHECK:STDOUT: .Int = -// CHECK:STDOUT: .N = -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @A(%N.loc6_9.1: %i32) { -// CHECK:STDOUT: %N.loc6_9.2: %i32 = bind_symbolic_name N, 0 [symbolic = %N.loc6_9.2 (constants.%N.51e)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %A: type = class_type @A, @A(%N.loc6_9.2) [symbolic = %A (constants.%A.dd3)] -// CHECK:STDOUT: %A.elem.loc7: type = unbound_element_type %A, constants.%B [symbolic = %A.elem.loc7 (constants.%A.elem.500)] -// CHECK:STDOUT: %Convert.bound: = bound_method %N.loc6_9.2, constants.%Convert.960 [symbolic = %Convert.bound (constants.%Convert.bound.588)] -// CHECK:STDOUT: %bound_method.loc12_14.3: = bound_method %N.loc6_9.2, constants.%Convert.specific_fn.8a8 [symbolic = %bound_method.loc12_14.3 (constants.%bound_method.f9c)] -// CHECK:STDOUT: %int.convert_checked.loc12_14.2: init Core.IntLiteral = call %bound_method.loc12_14.3(%N.loc6_9.2) [symbolic = %int.convert_checked.loc12_14.2 (constants.%int.convert_checked)] -// CHECK:STDOUT: %iN.builtin: type = int_type signed, %int.convert_checked.loc12_14.2 [symbolic = %iN.builtin (constants.%iN.builtin.8fe)] -// CHECK:STDOUT: %require_complete: = require_complete_type %iN.builtin [symbolic = %require_complete (constants.%require_complete.e34)] -// CHECK:STDOUT: %A.elem.loc12: type = unbound_element_type %A, %iN.builtin [symbolic = %A.elem.loc12 (constants.%A.elem.07f)] -// CHECK:STDOUT: %struct_type.base.n.loc13_1.2: type = struct_type {.base: %B, .n: @A.%iN.builtin (%iN.builtin.8fe)} [symbolic = %struct_type.base.n.loc13_1.2 (constants.%struct_type.base.n)] -// CHECK:STDOUT: %complete_type.loc13_1.2: = complete_type_witness %struct_type.base.n.loc13_1.2 [symbolic = %complete_type.loc13_1.2 (constants.%complete_type.beb)] -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %B.ref: type = name_ref B, file.%B.decl [concrete = constants.%B] -// CHECK:STDOUT: %.loc7: @A.%A.elem.loc7 (%A.elem.500) = base_decl %B.ref, element0 [concrete] -// CHECK:STDOUT: %Int.ref: %Int.type.913 = name_ref Int, file.%Int.decl [concrete = constants.%Int.779] -// CHECK:STDOUT: %N.ref: %i32 = name_ref N, %N.loc6_9.1 [symbolic = %N.loc6_9.2 (constants.%N.51e)] -// CHECK:STDOUT: %impl.elem0: %.0ea = impl_witness_access constants.%ImplicitAs.impl_witness.a11, element0 [concrete = constants.%Convert.960] -// CHECK:STDOUT: %bound_method.loc12_14.1: = bound_method %N.ref, %impl.elem0 [symbolic = %Convert.bound (constants.%Convert.bound.588)] -// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Convert.3(constants.%int_32) [concrete = constants.%Convert.specific_fn.8a8] -// CHECK:STDOUT: %bound_method.loc12_14.2: = bound_method %N.ref, %specific_fn [symbolic = %bound_method.loc12_14.3 (constants.%bound_method.f9c)] -// CHECK:STDOUT: %int.convert_checked.loc12_14.1: init Core.IntLiteral = call %bound_method.loc12_14.2(%N.ref) [symbolic = %int.convert_checked.loc12_14.2 (constants.%int.convert_checked)] -// CHECK:STDOUT: %.loc12_14.1: Core.IntLiteral = value_of_initializer %int.convert_checked.loc12_14.1 [symbolic = %int.convert_checked.loc12_14.2 (constants.%int.convert_checked)] -// CHECK:STDOUT: %.loc12_14.2: Core.IntLiteral = converted %N.ref, %.loc12_14.1 [symbolic = %int.convert_checked.loc12_14.2 (constants.%int.convert_checked)] -// CHECK:STDOUT: %int.make_type_signed: init type = call %Int.ref(%.loc12_14.2) [symbolic = %iN.builtin (constants.%iN.builtin.8fe)] -// CHECK:STDOUT: %.loc12_15.1: type = value_of_initializer %int.make_type_signed [symbolic = %iN.builtin (constants.%iN.builtin.8fe)] -// CHECK:STDOUT: %.loc12_15.2: type = converted %int.make_type_signed, %.loc12_15.1 [symbolic = %iN.builtin (constants.%iN.builtin.8fe)] -// CHECK:STDOUT: %.loc12_8: @A.%A.elem.loc12 (%A.elem.07f) = field_decl n, element1 [concrete] -// CHECK:STDOUT: %struct_type.base.n.loc13_1.1: type = struct_type {.base: %B, .n: %iN.builtin.8fe} [symbolic = %struct_type.base.n.loc13_1.2 (constants.%struct_type.base.n)] -// CHECK:STDOUT: %complete_type.loc13_1.1: = complete_type_witness %struct_type.base.n.loc13_1.1 [symbolic = %complete_type.loc13_1.2 (constants.%complete_type.beb)] -// CHECK:STDOUT: complete_type_witness = %complete_type.loc13_1.1 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%A.dd3 -// CHECK:STDOUT: .B = -// CHECK:STDOUT: .base = %.loc7 -// CHECK:STDOUT: .Int = -// CHECK:STDOUT: .N = -// CHECK:STDOUT: .n = %.loc12_8 -// CHECK:STDOUT: extend %B.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Int.1(%N.param: Core.IntLiteral) -> type = "int.make_type_signed"; -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F(%a.param: %ptr.b65) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %b.patt: %pattern_type.960 = binding_pattern b [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %a.ref: %ptr.b65 = name_ref a, %a -// CHECK:STDOUT: %.loc20_11: type = splice_block %ptr.loc20 [concrete = constants.%ptr.e79] { -// CHECK:STDOUT: %B.ref: type = name_ref B, file.%B.decl [concrete = constants.%B] -// CHECK:STDOUT: %ptr.loc20: type = ptr_type %B.ref [concrete = constants.%ptr.e79] -// CHECK:STDOUT: } -// CHECK:STDOUT: %.loc20_15.1: ref %A.6fc = deref %a.ref -// CHECK:STDOUT: %.loc20_15.2: ref %B = class_element_access %.loc20_15.1, element0 -// CHECK:STDOUT: %addr: %ptr.e79 = addr_of %.loc20_15.2 -// CHECK:STDOUT: %.loc20_15.3: %ptr.e79 = converted %a.ref, %addr -// CHECK:STDOUT: %b: %ptr.e79 = bind_name b, %.loc20_15.3 -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @A(constants.%N.51e) { -// CHECK:STDOUT: %N.loc6_9.2 => constants.%N.51e -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @A(constants.%int_0.6a9) { -// CHECK:STDOUT: %N.loc6_9.2 => constants.%int_0.6a9 -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %A => constants.%A.6fc -// CHECK:STDOUT: %A.elem.loc7 => constants.%A.elem.d81 -// CHECK:STDOUT: %Convert.bound => constants.%Convert.bound.0fd -// CHECK:STDOUT: %bound_method.loc12_14.3 => constants.%bound_method.4b5 -// CHECK:STDOUT: %int.convert_checked.loc12_14.2 => constants.%int_0.5c6 -// CHECK:STDOUT: %iN.builtin => -// CHECK:STDOUT: %require_complete => -// CHECK:STDOUT: %A.elem.loc12 => -// CHECK:STDOUT: %struct_type.base.n.loc13_1.2 => -// CHECK:STDOUT: %complete_type.loc13_1.2 => -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/generic/field.carbon b/toolchain/check/testdata/class/generic/field.carbon deleted file mode 100644 index f72d89619f3a7..0000000000000 --- a/toolchain/check/testdata/class/generic/field.carbon +++ /dev/null @@ -1,274 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/generic/field.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/generic/field.carbon - -class Class(T:! type) { - var x: T; -} - -fn F(c: Class(i32)) -> i32 { - return c.x; -} - -fn G(T:! type, c: Class(T)) -> T { - return c.x; -} - -fn H(U:! type, c: Class(U)) -> U { - return c.x; -} - -// CHECK:STDOUT: --- field.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] -// CHECK:STDOUT: %Class.type: type = generic_class_type @Class [concrete] -// CHECK:STDOUT: %Class.generic: %Class.type = struct_value () [concrete] -// CHECK:STDOUT: %Class.fe1b2d.1: type = class_type @Class, @Class(%T) [symbolic] -// CHECK:STDOUT: %require_complete.4aeca8.1: = require_complete_type %T [symbolic] -// CHECK:STDOUT: %Class.elem.e262de.1: type = unbound_element_type %Class.fe1b2d.1, %T [symbolic] -// CHECK:STDOUT: %struct_type.x.2ac3f0.1: type = struct_type {.x: %T} [symbolic] -// CHECK:STDOUT: %complete_type.4339b3.1: = complete_type_witness %struct_type.x.2ac3f0.1 [symbolic] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %Class.247: type = class_type @Class, @Class(%i32) [concrete] -// CHECK:STDOUT: %pattern_type.0fa: type = pattern_type %Class.247 [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %i32.builtin: type = int_type signed, %int_32 [concrete] -// CHECK:STDOUT: %complete_type.f8a: = complete_type_witness %i32.builtin [concrete] -// CHECK:STDOUT: %Class.elem.2d8: type = unbound_element_type %Class.247, %i32 [concrete] -// CHECK:STDOUT: %struct_type.x.ed6: type = struct_type {.x: %i32} [concrete] -// CHECK:STDOUT: %complete_type.1ec: = complete_type_witness %struct_type.x.ed6 [concrete] -// CHECK:STDOUT: %pattern_type.3c18fb.1: type = pattern_type %Class.fe1b2d.1 [symbolic] -// CHECK:STDOUT: %pattern_type.7dcd0a.1: type = pattern_type %T [symbolic] -// CHECK:STDOUT: %G.type: type = fn_type @G [concrete] -// CHECK:STDOUT: %G: %G.type = struct_value () [concrete] -// CHECK:STDOUT: %require_complete.4f8a42.1: = require_complete_type %Class.fe1b2d.1 [symbolic] -// CHECK:STDOUT: %U: type = bind_symbolic_name U, 0 [symbolic] -// CHECK:STDOUT: %Class.fe1b2d.2: type = class_type @Class, @Class(%U) [symbolic] -// CHECK:STDOUT: %pattern_type.3c18fb.2: type = pattern_type %Class.fe1b2d.2 [symbolic] -// CHECK:STDOUT: %pattern_type.7dcd0a.2: type = pattern_type %U [symbolic] -// CHECK:STDOUT: %H.type: type = fn_type @H [concrete] -// CHECK:STDOUT: %H: %H.type = struct_value () [concrete] -// CHECK:STDOUT: %require_complete.4aeca8.2: = require_complete_type %U [symbolic] -// CHECK:STDOUT: %Class.elem.e262de.2: type = unbound_element_type %Class.fe1b2d.2, %U [symbolic] -// CHECK:STDOUT: %struct_type.x.2ac3f0.2: type = struct_type {.x: %U} [symbolic] -// CHECK:STDOUT: %complete_type.4339b3.2: = complete_type_witness %struct_type.x.2ac3f0.2 [symbolic] -// CHECK:STDOUT: %require_complete.4f8a42.2: = require_complete_type %Class.fe1b2d.2 [symbolic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Class = %Class.decl -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: .G = %G.decl -// CHECK:STDOUT: .H = %H.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Class.decl: %Class.type = class_decl @Class [concrete = constants.%Class.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc11_13.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc11_13.2 (constants.%T)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %c.patt: %pattern_type.0fa = binding_pattern c [concrete] -// CHECK:STDOUT: %c.param_patt: %pattern_type.0fa = value_param_pattern %c.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32.loc15_24: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc15_24: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %c.param: %Class.247 = value_param call_param0 -// CHECK:STDOUT: %.loc15: type = splice_block %Class [concrete = constants.%Class.247] { -// CHECK:STDOUT: %Class.ref: %Class.type = name_ref Class, file.%Class.decl [concrete = constants.%Class.generic] -// CHECK:STDOUT: %int_32.loc15_15: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc15_15: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %Class: type = class_type @Class, @Class(constants.%i32) [concrete = constants.%Class.247] -// CHECK:STDOUT: } -// CHECK:STDOUT: %c: %Class.247 = bind_name c, %c.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %G.decl: %G.type = fn_decl @G [concrete = constants.%G] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: %c.patt: @G.%pattern_type.loc19_16 (%pattern_type.3c18fb.1) = binding_pattern c [concrete] -// CHECK:STDOUT: %c.param_patt: @G.%pattern_type.loc19_16 (%pattern_type.3c18fb.1) = value_param_pattern %c.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: @G.%pattern_type.loc19_29 (%pattern_type.7dcd0a.1) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @G.%pattern_type.loc19_29 (%pattern_type.7dcd0a.1) = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref.loc19_32: type = name_ref T, %T.loc19_6.1 [symbolic = %T.loc19_6.2 (constants.%T)] -// CHECK:STDOUT: %T.loc19_6.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc19_6.2 (constants.%T)] -// CHECK:STDOUT: %c.param: @G.%Class.loc19_26.2 (%Class.fe1b2d.1) = value_param call_param0 -// CHECK:STDOUT: %.loc19: type = splice_block %Class.loc19_26.1 [symbolic = %Class.loc19_26.2 (constants.%Class.fe1b2d.1)] { -// CHECK:STDOUT: %Class.ref: %Class.type = name_ref Class, file.%Class.decl [concrete = constants.%Class.generic] -// CHECK:STDOUT: %T.ref.loc19_25: type = name_ref T, %T.loc19_6.1 [symbolic = %T.loc19_6.2 (constants.%T)] -// CHECK:STDOUT: %Class.loc19_26.1: type = class_type @Class, @Class(constants.%T) [symbolic = %Class.loc19_26.2 (constants.%Class.fe1b2d.1)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %c: @G.%Class.loc19_26.2 (%Class.fe1b2d.1) = bind_name c, %c.param -// CHECK:STDOUT: %return.param: ref @G.%T.loc19_6.2 (%T) = out_param call_param1 -// CHECK:STDOUT: %return: ref @G.%T.loc19_6.2 (%T) = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %H.decl: %H.type = fn_decl @H [concrete = constants.%H] { -// CHECK:STDOUT: %U.patt: %pattern_type.98f = symbolic_binding_pattern U, 0 [concrete] -// CHECK:STDOUT: %c.patt: @H.%pattern_type.loc23_16 (%pattern_type.3c18fb.2) = binding_pattern c [concrete] -// CHECK:STDOUT: %c.param_patt: @H.%pattern_type.loc23_16 (%pattern_type.3c18fb.2) = value_param_pattern %c.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: @H.%pattern_type.loc23_29 (%pattern_type.7dcd0a.2) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @H.%pattern_type.loc23_29 (%pattern_type.7dcd0a.2) = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %U.ref.loc23_32: type = name_ref U, %U.loc23_6.1 [symbolic = %U.loc23_6.2 (constants.%U)] -// CHECK:STDOUT: %U.loc23_6.1: type = bind_symbolic_name U, 0 [symbolic = %U.loc23_6.2 (constants.%U)] -// CHECK:STDOUT: %c.param: @H.%Class.loc23_26.2 (%Class.fe1b2d.2) = value_param call_param0 -// CHECK:STDOUT: %.loc23: type = splice_block %Class.loc23_26.1 [symbolic = %Class.loc23_26.2 (constants.%Class.fe1b2d.2)] { -// CHECK:STDOUT: %Class.ref: %Class.type = name_ref Class, file.%Class.decl [concrete = constants.%Class.generic] -// CHECK:STDOUT: %U.ref.loc23_25: type = name_ref U, %U.loc23_6.1 [symbolic = %U.loc23_6.2 (constants.%U)] -// CHECK:STDOUT: %Class.loc23_26.1: type = class_type @Class, @Class(constants.%U) [symbolic = %Class.loc23_26.2 (constants.%Class.fe1b2d.2)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %c: @H.%Class.loc23_26.2 (%Class.fe1b2d.2) = bind_name c, %c.param -// CHECK:STDOUT: %return.param: ref @H.%U.loc23_6.2 (%U) = out_param call_param1 -// CHECK:STDOUT: %return: ref @H.%U.loc23_6.2 (%U) = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Class(%T.loc11_13.1: type) { -// CHECK:STDOUT: %T.loc11_13.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc11_13.2 (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %T.loc11_13.2 [symbolic = %require_complete (constants.%require_complete.4aeca8.1)] -// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T.loc11_13.2) [symbolic = %Class (constants.%Class.fe1b2d.1)] -// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %T.loc11_13.2 [symbolic = %Class.elem (constants.%Class.elem.e262de.1)] -// CHECK:STDOUT: %struct_type.x.loc13_1.2: type = struct_type {.x: @Class.%T.loc11_13.2 (%T)} [symbolic = %struct_type.x.loc13_1.2 (constants.%struct_type.x.2ac3f0.1)] -// CHECK:STDOUT: %complete_type.loc13_1.2: = complete_type_witness %struct_type.x.loc13_1.2 [symbolic = %complete_type.loc13_1.2 (constants.%complete_type.4339b3.1)] -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc11_13.1 [symbolic = %T.loc11_13.2 (constants.%T)] -// CHECK:STDOUT: %.loc12: @Class.%Class.elem (%Class.elem.e262de.1) = field_decl x, element0 [concrete] -// CHECK:STDOUT: %struct_type.x.loc13_1.1: type = struct_type {.x: %T} [symbolic = %struct_type.x.loc13_1.2 (constants.%struct_type.x.2ac3f0.1)] -// CHECK:STDOUT: %complete_type.loc13_1.1: = complete_type_witness %struct_type.x.loc13_1.1 [symbolic = %complete_type.loc13_1.2 (constants.%complete_type.4339b3.1)] -// CHECK:STDOUT: complete_type_witness = %complete_type.loc13_1.1 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Class.fe1b2d.1 -// CHECK:STDOUT: .T = -// CHECK:STDOUT: .x = %.loc12 -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F(%c.param: %Class.247) -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %c.ref: %Class.247 = name_ref c, %c -// CHECK:STDOUT: %x.ref: %Class.elem.2d8 = name_ref x, @Class.%.loc12 [concrete = @Class.%.loc12] -// CHECK:STDOUT: %.loc16_11.1: ref %i32 = class_element_access %c.ref, element0 -// CHECK:STDOUT: %.loc16_11.2: %i32 = bind_value %.loc16_11.1 -// CHECK:STDOUT: return %.loc16_11.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @G(%T.loc19_6.1: type) { -// CHECK:STDOUT: %T.loc19_6.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc19_6.2 (constants.%T)] -// CHECK:STDOUT: %Class.loc19_26.2: type = class_type @Class, @Class(%T.loc19_6.2) [symbolic = %Class.loc19_26.2 (constants.%Class.fe1b2d.1)] -// CHECK:STDOUT: %pattern_type.loc19_16: type = pattern_type %Class.loc19_26.2 [symbolic = %pattern_type.loc19_16 (constants.%pattern_type.3c18fb.1)] -// CHECK:STDOUT: %pattern_type.loc19_29: type = pattern_type %T.loc19_6.2 [symbolic = %pattern_type.loc19_29 (constants.%pattern_type.7dcd0a.1)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete.loc19: = require_complete_type %Class.loc19_26.2 [symbolic = %require_complete.loc19 (constants.%require_complete.4f8a42.1)] -// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class.loc19_26.2, %T.loc19_6.2 [symbolic = %Class.elem (constants.%Class.elem.e262de.1)] -// CHECK:STDOUT: %require_complete.loc20: = require_complete_type %T.loc19_6.2 [symbolic = %require_complete.loc20 (constants.%require_complete.4aeca8.1)] -// CHECK:STDOUT: -// CHECK:STDOUT: fn(%c.param: @G.%Class.loc19_26.2 (%Class.fe1b2d.1)) -> @G.%T.loc19_6.2 (%T) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %c.ref: @G.%Class.loc19_26.2 (%Class.fe1b2d.1) = name_ref c, %c -// CHECK:STDOUT: %x.ref: @G.%Class.elem (%Class.elem.e262de.1) = name_ref x, @Class.%.loc12 [concrete = @Class.%.loc12] -// CHECK:STDOUT: %.loc20_11.1: ref @G.%T.loc19_6.2 (%T) = class_element_access %c.ref, element0 -// CHECK:STDOUT: %.loc20_11.2: @G.%T.loc19_6.2 (%T) = bind_value %.loc20_11.1 -// CHECK:STDOUT: return %.loc20_11.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @H(%U.loc23_6.1: type) { -// CHECK:STDOUT: %U.loc23_6.2: type = bind_symbolic_name U, 0 [symbolic = %U.loc23_6.2 (constants.%U)] -// CHECK:STDOUT: %Class.loc23_26.2: type = class_type @Class, @Class(%U.loc23_6.2) [symbolic = %Class.loc23_26.2 (constants.%Class.fe1b2d.2)] -// CHECK:STDOUT: %pattern_type.loc23_16: type = pattern_type %Class.loc23_26.2 [symbolic = %pattern_type.loc23_16 (constants.%pattern_type.3c18fb.2)] -// CHECK:STDOUT: %pattern_type.loc23_29: type = pattern_type %U.loc23_6.2 [symbolic = %pattern_type.loc23_29 (constants.%pattern_type.7dcd0a.2)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete.loc23_29: = require_complete_type %U.loc23_6.2 [symbolic = %require_complete.loc23_29 (constants.%require_complete.4aeca8.2)] -// CHECK:STDOUT: %require_complete.loc23_17: = require_complete_type %Class.loc23_26.2 [symbolic = %require_complete.loc23_17 (constants.%require_complete.4f8a42.2)] -// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class.loc23_26.2, %U.loc23_6.2 [symbolic = %Class.elem (constants.%Class.elem.e262de.2)] -// CHECK:STDOUT: -// CHECK:STDOUT: fn(%c.param: @H.%Class.loc23_26.2 (%Class.fe1b2d.2)) -> @H.%U.loc23_6.2 (%U) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %c.ref: @H.%Class.loc23_26.2 (%Class.fe1b2d.2) = name_ref c, %c -// CHECK:STDOUT: %x.ref: @H.%Class.elem (%Class.elem.e262de.2) = name_ref x, @Class.%.loc12 [concrete = @Class.%.loc12] -// CHECK:STDOUT: %.loc24_11.1: ref @H.%U.loc23_6.2 (%U) = class_element_access %c.ref, element0 -// CHECK:STDOUT: %.loc24_11.2: @H.%U.loc23_6.2 (%U) = bind_value %.loc24_11.1 -// CHECK:STDOUT: return %.loc24_11.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Class(constants.%T) { -// CHECK:STDOUT: %T.loc11_13.2 => constants.%T -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%require_complete.4aeca8.1 -// CHECK:STDOUT: %Class => constants.%Class.fe1b2d.1 -// CHECK:STDOUT: %Class.elem => constants.%Class.elem.e262de.1 -// CHECK:STDOUT: %struct_type.x.loc13_1.2 => constants.%struct_type.x.2ac3f0.1 -// CHECK:STDOUT: %complete_type.loc13_1.2 => constants.%complete_type.4339b3.1 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Class(constants.%i32) { -// CHECK:STDOUT: %T.loc11_13.2 => constants.%i32 -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%complete_type.f8a -// CHECK:STDOUT: %Class => constants.%Class.247 -// CHECK:STDOUT: %Class.elem => constants.%Class.elem.2d8 -// CHECK:STDOUT: %struct_type.x.loc13_1.2 => constants.%struct_type.x.ed6 -// CHECK:STDOUT: %complete_type.loc13_1.2 => constants.%complete_type.1ec -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @G(constants.%T) { -// CHECK:STDOUT: %T.loc19_6.2 => constants.%T -// CHECK:STDOUT: %Class.loc19_26.2 => constants.%Class.fe1b2d.1 -// CHECK:STDOUT: %pattern_type.loc19_16 => constants.%pattern_type.3c18fb.1 -// CHECK:STDOUT: %pattern_type.loc19_29 => constants.%pattern_type.7dcd0a.1 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Class(constants.%U) { -// CHECK:STDOUT: %T.loc11_13.2 => constants.%U -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%require_complete.4aeca8.2 -// CHECK:STDOUT: %Class => constants.%Class.fe1b2d.2 -// CHECK:STDOUT: %Class.elem => constants.%Class.elem.e262de.2 -// CHECK:STDOUT: %struct_type.x.loc13_1.2 => constants.%struct_type.x.2ac3f0.2 -// CHECK:STDOUT: %complete_type.loc13_1.2 => constants.%complete_type.4339b3.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @H(constants.%U) { -// CHECK:STDOUT: %U.loc23_6.2 => constants.%U -// CHECK:STDOUT: %Class.loc23_26.2 => constants.%Class.fe1b2d.2 -// CHECK:STDOUT: %pattern_type.loc23_16 => constants.%pattern_type.3c18fb.2 -// CHECK:STDOUT: %pattern_type.loc23_29 => constants.%pattern_type.7dcd0a.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/generic/import.carbon b/toolchain/check/testdata/class/generic/import.carbon index 5b8ed0f923b95..7b0fc1fc2ea04 100644 --- a/toolchain/check/testdata/class/generic/import.carbon +++ b/toolchain/check/testdata/class/generic/import.carbon @@ -2,6 +2,8 @@ // Exceptions. See /LICENSE for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// // AUTOUPDATE // TIP: To test this file alone, run: // TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/generic/import.carbon @@ -29,9 +31,11 @@ class Class(T:! type) { var x: T; } +//@dump-sem-ir-begin fn F() -> CompleteClass(i32) { return {.n = 1}; } +//@dump-sem-ir-end // --- use_foo.carbon @@ -39,13 +43,17 @@ library "[[@TEST_NAME]]"; import library "foo"; fn UseMethod() -> i32 { + //@dump-sem-ir-begin var v: CompleteClass(i32) = F(); return v.F(); + //@dump-sem-ir-end } fn UseField() -> i32 { + //@dump-sem-ir-begin var v: CompleteClass(i32) = F(); return v.n; + //@dump-sem-ir-end } // --- fail_generic_arg_mismatch.carbon @@ -85,207 +93,20 @@ class Class(U:! type) { var x: T; } -// CHECK:STDOUT: --- foo.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] -// CHECK:STDOUT: %Class.type: type = generic_class_type @Class [concrete] -// CHECK:STDOUT: %Class.generic: %Class.type = struct_value () [concrete] -// CHECK:STDOUT: %CompleteClass.type: type = generic_class_type @CompleteClass [concrete] -// CHECK:STDOUT: %CompleteClass.generic: %CompleteClass.type = struct_value () [concrete] -// CHECK:STDOUT: %CompleteClass.f97: type = class_type @CompleteClass, @CompleteClass(%T) [symbolic] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %CompleteClass.elem: type = unbound_element_type %CompleteClass.f97, %i32 [symbolic] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %F.type.14f: type = fn_type @F.1, @CompleteClass(%T) [symbolic] -// CHECK:STDOUT: %F.874: %F.type.14f = struct_value () [symbolic] -// CHECK:STDOUT: %struct_type.n: type = struct_type {.n: %i32} [concrete] -// CHECK:STDOUT: %complete_type.54b: = complete_type_witness %struct_type.n [concrete] -// CHECK:STDOUT: %int_0.5c6: Core.IntLiteral = int_value 0 [concrete] -// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.type.205: type = facet_type <@ImplicitAs, @ImplicitAs(%i32)> [concrete] -// CHECK:STDOUT: %Convert.type.1b6: type = fn_type @Convert.1, @ImplicitAs(%i32) [concrete] -// CHECK:STDOUT: %To.c80: Core.IntLiteral = bind_symbolic_name To, 0 [symbolic] -// CHECK:STDOUT: %Convert.type.0f9: type = fn_type @Convert.2, @impl.4f9(%To.c80) [symbolic] -// CHECK:STDOUT: %Convert.f06: %Convert.type.0f9 = struct_value () [symbolic] -// CHECK:STDOUT: %ImplicitAs.impl_witness.c75: = impl_witness imports.%ImplicitAs.impl_witness_table.a2f, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.type.035: type = fn_type @Convert.2, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.956: %Convert.type.035 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.facet: %ImplicitAs.type.205 = facet_value Core.IntLiteral, (%ImplicitAs.impl_witness.c75) [concrete] -// CHECK:STDOUT: %.9c3: type = fn_type_with_self_type %Convert.type.1b6, %ImplicitAs.facet [concrete] -// CHECK:STDOUT: %Convert.bound: = bound_method %int_0.5c6, %Convert.956 [concrete] -// CHECK:STDOUT: %Convert.specific_fn: = specific_function %Convert.956, @Convert.2(%int_32) [concrete] -// CHECK:STDOUT: %bound_method: = bound_method %int_0.5c6, %Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_0.6a9: %i32 = int_value 0 [concrete] -// CHECK:STDOUT: %CompleteClass.e9e: type = class_type @CompleteClass, @CompleteClass(%i32) [concrete] -// CHECK:STDOUT: %pattern_type.0b0: type = pattern_type %CompleteClass.e9e [concrete] -// CHECK:STDOUT: %F.type.b25: type = fn_type @F.2 [concrete] -// CHECK:STDOUT: %F.c41: %F.type.b25 = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/operators/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] -// CHECK:STDOUT: %Core.import_ref.a5b: @impl.4f9.%Convert.type (%Convert.type.0f9) = import_ref Core//prelude/types/int, loc19_39, loaded [symbolic = @impl.4f9.%Convert (constants.%Convert.f06)] -// CHECK:STDOUT: %ImplicitAs.impl_witness_table.a2f = impl_witness_table (%Core.import_ref.a5b), @impl.4f9 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Class = %Class.decl -// CHECK:STDOUT: .CompleteClass = %CompleteClass.decl -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Class.decl: %Class.type = class_decl @Class [concrete = constants.%Class.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc4_13.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_13.2 (constants.%T)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %CompleteClass.decl: %CompleteClass.type = class_decl @CompleteClass [concrete = constants.%CompleteClass.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc6_21.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc6_21.2 (constants.%T)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %F.decl: %F.type.b25 = fn_decl @F.2 [concrete = constants.%F.c41] { -// CHECK:STDOUT: %return.patt: %pattern_type.0b0 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.0b0 = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %CompleteClass.ref: %CompleteClass.type = name_ref CompleteClass, file.%CompleteClass.decl [concrete = constants.%CompleteClass.generic] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %CompleteClass: type = class_type @CompleteClass, @CompleteClass(constants.%i32) [concrete = constants.%CompleteClass.e9e] -// CHECK:STDOUT: %return.param: ref %CompleteClass.e9e = out_param call_param0 -// CHECK:STDOUT: %return: ref %CompleteClass.e9e = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Class(%T.loc4_13.1: type) { -// CHECK:STDOUT: %T.loc4_13.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_13.2 (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: class; -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @CompleteClass(%T.loc6_21.1: type) { -// CHECK:STDOUT: %T.loc6_21.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc6_21.2 (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %CompleteClass: type = class_type @CompleteClass, @CompleteClass(%T.loc6_21.2) [symbolic = %CompleteClass (constants.%CompleteClass.f97)] -// CHECK:STDOUT: %CompleteClass.elem: type = unbound_element_type %CompleteClass, constants.%i32 [symbolic = %CompleteClass.elem (constants.%CompleteClass.elem)] -// CHECK:STDOUT: %F.type: type = fn_type @F.1, @CompleteClass(%T.loc6_21.2) [symbolic = %F.type (constants.%F.type.14f)] -// CHECK:STDOUT: %F: @CompleteClass.%F.type (%F.type.14f) = struct_value () [symbolic = %F (constants.%F.874)] -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc7: @CompleteClass.%CompleteClass.elem (%CompleteClass.elem) = field_decl n, element0 [concrete] -// CHECK:STDOUT: %F.decl: @CompleteClass.%F.type (%F.type.14f) = fn_decl @F.1 [symbolic = @CompleteClass.%F (constants.%F.874)] { -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param0 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %struct_type.n: type = struct_type {.n: %i32} [concrete = constants.%struct_type.n] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.n [concrete = constants.%complete_type.54b] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%CompleteClass.f97 -// CHECK:STDOUT: .n = %.loc7 -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @F.1(@CompleteClass.%T.loc6_21.1: type) { -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: -// CHECK:STDOUT: fn() -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %int_0: Core.IntLiteral = int_value 0 [concrete = constants.%int_0.5c6] -// CHECK:STDOUT: %impl.elem0: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc8_27.1: = bound_method %int_0, %impl.elem0 [concrete = constants.%Convert.bound] -// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc8_27.2: = bound_method %int_0, %specific_fn [concrete = constants.%bound_method] -// CHECK:STDOUT: %int.convert_checked: init %i32 = call %bound_method.loc8_27.2(%int_0) [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %.loc8_27.1: %i32 = value_of_initializer %int.convert_checked [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: %.loc8_27.2: %i32 = converted %int_0, %.loc8_27.1 [concrete = constants.%int_0.6a9] -// CHECK:STDOUT: return %.loc8_27.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F.2() -> %CompleteClass.e9e; -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Class(constants.%T) { -// CHECK:STDOUT: %T.loc4_13.2 => constants.%T -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @CompleteClass(constants.%T) { -// CHECK:STDOUT: %T.loc6_21.2 => constants.%T -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %CompleteClass => constants.%CompleteClass.f97 -// CHECK:STDOUT: %CompleteClass.elem => constants.%CompleteClass.elem -// CHECK:STDOUT: %F.type => constants.%F.type.14f -// CHECK:STDOUT: %F => constants.%F.874 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @F.1(constants.%T) {} -// CHECK:STDOUT: -// CHECK:STDOUT: specific @CompleteClass(constants.%i32) { -// CHECK:STDOUT: %T.loc6_21.2 => constants.%i32 -// CHECK:STDOUT: } -// CHECK:STDOUT: // CHECK:STDOUT: --- foo.impl.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { // CHECK:STDOUT: %To.c80: Core.IntLiteral = bind_symbolic_name To, 0 [symbolic] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.type.595: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.595 = struct_value () [concrete] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] // CHECK:STDOUT: %Convert.type.9a6: type = fn_type @Convert.2, @impl.a8d(%To.c80) [symbolic] // CHECK:STDOUT: %Convert.458: %Convert.type.9a6 = struct_value () [symbolic] // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %Class.type: type = generic_class_type @Class [concrete] -// CHECK:STDOUT: %Class.generic: %Class.type = struct_value () [concrete] -// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T) [symbolic] -// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T [symbolic] -// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %T [symbolic] -// CHECK:STDOUT: %struct_type.x: type = struct_type {.x: %T} [symbolic] -// CHECK:STDOUT: %complete_type.433: = complete_type_witness %struct_type.x [symbolic] // CHECK:STDOUT: %CompleteClass.type: type = generic_class_type @CompleteClass [concrete] // CHECK:STDOUT: %CompleteClass.generic: %CompleteClass.type = struct_value () [concrete] -// CHECK:STDOUT: %struct_type.n.4d6: type = struct_type {.n: %i32} [concrete] -// CHECK:STDOUT: %complete_type.a68: = complete_type_witness %struct_type.n.4d6 [concrete] -// CHECK:STDOUT: %CompleteClass.f97: type = class_type @CompleteClass, @CompleteClass(%T) [symbolic] -// CHECK:STDOUT: %CompleteClass.elem.9ef: type = unbound_element_type %CompleteClass.f97, %i32 [symbolic] -// CHECK:STDOUT: %F.type.14f: type = fn_type @F.1, @CompleteClass(%T) [symbolic] -// CHECK:STDOUT: %F.874: %F.type.14f = struct_value () [symbolic] // CHECK:STDOUT: %CompleteClass.a06: type = class_type @CompleteClass, @CompleteClass(%i32) [concrete] // CHECK:STDOUT: %pattern_type.84b: type = pattern_type %CompleteClass.a06 [concrete] // CHECK:STDOUT: %F.type.b25: type = fn_type @F.2 [concrete] // CHECK:STDOUT: %F.c41: %F.type.b25 = struct_value () [concrete] -// CHECK:STDOUT: %CompleteClass.elem.426: type = unbound_element_type %CompleteClass.a06, %i32 [concrete] -// CHECK:STDOUT: %F.type.0aa: type = fn_type @F.1, @CompleteClass(%i32) [concrete] -// CHECK:STDOUT: %F.971: %F.type.0aa = struct_value () [concrete] // CHECK:STDOUT: %int_1.5b8: Core.IntLiteral = int_value 1 [concrete] // CHECK:STDOUT: %struct_type.n.44a: type = struct_type {.n: Core.IntLiteral} [concrete] // CHECK:STDOUT: %ImplicitAs.type.b9e: type = facet_type <@ImplicitAs, @ImplicitAs(%i32)> [concrete] @@ -304,40 +125,11 @@ class Class(U:! type) { // CHECK:STDOUT: // CHECK:STDOUT: imports { // CHECK:STDOUT: %Main.CompleteClass: %CompleteClass.type = import_ref Main//foo, CompleteClass, loaded [concrete = constants.%CompleteClass.generic] -// CHECK:STDOUT: %Core.ece: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } // CHECK:STDOUT: %Main.import_ref.773: @impl.a8d.%Convert.type (%Convert.type.9a6) = import_ref Main//foo, inst140 [indirect], loaded [symbolic = @impl.a8d.%Convert (constants.%Convert.458)] // CHECK:STDOUT: %ImplicitAs.impl_witness_table.1ad = impl_witness_table (%Main.import_ref.773), @impl.a8d [concrete] -// CHECK:STDOUT: %Main.import_ref.5ab3ec.1: type = import_ref Main//foo, loc4_13, loaded [symbolic = @Class.%T.1 (constants.%T)] -// CHECK:STDOUT: %Main.import_ref.5ab3ec.2: type = import_ref Main//foo, loc6_21, loaded [symbolic = @CompleteClass.%T (constants.%T)] -// CHECK:STDOUT: %Main.import_ref.eb1: = import_ref Main//foo, loc9_1, loaded [concrete = constants.%complete_type.a68] -// CHECK:STDOUT: %Main.import_ref.3c0 = import_ref Main//foo, inst33 [no loc], unloaded -// CHECK:STDOUT: %Main.import_ref.051 = import_ref Main//foo, loc7_8, unloaded -// CHECK:STDOUT: %Main.import_ref.570 = import_ref Main//foo, loc8_17, unloaded -// CHECK:STDOUT: %Main.import_ref.5ab3ec.3: type = import_ref Main//foo, loc6_21, loaded [symbolic = @CompleteClass.%T (constants.%T)] -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.595 = import_ref Core//prelude/operators/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Class = %Class.decl -// CHECK:STDOUT: .CompleteClass = imports.%Main.CompleteClass -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: .Core = imports.%Core.ece -// CHECK:STDOUT: } -// CHECK:STDOUT: %default.import.loc2_19.1 = import -// CHECK:STDOUT: %default.import.loc2_19.2 = import -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Class.decl: %Class.type = class_decl @Class [concrete = constants.%Class.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc4: type = bind_symbolic_name T, 0 [symbolic = %T.1 (constants.%T)] -// CHECK:STDOUT: } // CHECK:STDOUT: %F.decl: %F.type.b25 = fn_decl @F.2 [concrete = constants.%F.c41] { // CHECK:STDOUT: %return.patt: %pattern_type.84b = return_slot_pattern [concrete] // CHECK:STDOUT: %return.param_patt: %pattern_type.84b = out_param_pattern %return.patt, call_param0 [concrete] @@ -351,112 +143,30 @@ class Class(U:! type) { // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic class @Class(imports.%Main.import_ref.5ab3ec.1: type) { -// CHECK:STDOUT: %T.1: type = bind_symbolic_name T, 0 [symbolic = %T.1 (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %T.1 [symbolic = %require_complete (constants.%require_complete.4ae)] -// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T.1) [symbolic = %Class (constants.%Class)] -// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %T.1 [symbolic = %Class.elem (constants.%Class.elem)] -// CHECK:STDOUT: %struct_type.x.loc6_1.2: type = struct_type {.x: @Class.%T.1 (%T)} [symbolic = %struct_type.x.loc6_1.2 (constants.%struct_type.x)] -// CHECK:STDOUT: %complete_type.loc6_1.2: = complete_type_witness %struct_type.x.loc6_1.2 [symbolic = %complete_type.loc6_1.2 (constants.%complete_type.433)] -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc4 [symbolic = %T.1 (constants.%T)] -// CHECK:STDOUT: %.loc5: @Class.%Class.elem (%Class.elem) = field_decl x, element0 [concrete] -// CHECK:STDOUT: %struct_type.x.loc6_1.1: type = struct_type {.x: %T} [symbolic = %struct_type.x.loc6_1.2 (constants.%struct_type.x)] -// CHECK:STDOUT: %complete_type.loc6_1.1: = complete_type_witness %struct_type.x.loc6_1.1 [symbolic = %complete_type.loc6_1.2 (constants.%complete_type.433)] -// CHECK:STDOUT: complete_type_witness = %complete_type.loc6_1.1 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Class -// CHECK:STDOUT: .T = -// CHECK:STDOUT: .x = %.loc5 -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @CompleteClass(imports.%Main.import_ref.5ab3ec.2: type) [from "foo.carbon"] { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %CompleteClass: type = class_type @CompleteClass, @CompleteClass(%T) [symbolic = %CompleteClass (constants.%CompleteClass.f97)] -// CHECK:STDOUT: %CompleteClass.elem: type = unbound_element_type %CompleteClass, constants.%i32 [symbolic = %CompleteClass.elem (constants.%CompleteClass.elem.9ef)] -// CHECK:STDOUT: %F.type: type = fn_type @F.1, @CompleteClass(%T) [symbolic = %F.type (constants.%F.type.14f)] -// CHECK:STDOUT: %F: @CompleteClass.%F.type (%F.type.14f) = struct_value () [symbolic = %F (constants.%F.874)] -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: complete_type_witness = imports.%Main.import_ref.eb1 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Main.import_ref.3c0 -// CHECK:STDOUT: .n = imports.%Main.import_ref.051 -// CHECK:STDOUT: .F = imports.%Main.import_ref.570 -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @F.1(imports.%Main.import_ref.5ab3ec.3: type) [from "foo.carbon"] { -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: -// CHECK:STDOUT: fn; -// CHECK:STDOUT: } -// CHECK:STDOUT: // CHECK:STDOUT: fn @F.2() -> %return.param: %CompleteClass.a06 [from "foo.carbon"] { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %int_1: Core.IntLiteral = int_value 1 [concrete = constants.%int_1.5b8] -// CHECK:STDOUT: %.loc9_17.1: %struct_type.n.44a = struct_literal (%int_1) +// CHECK:STDOUT: %.loc10_17.1: %struct_type.n.44a = struct_literal (%int_1) // CHECK:STDOUT: %impl.elem0: %.940 = impl_witness_access constants.%ImplicitAs.impl_witness.2ce, element0 [concrete = constants.%Convert.4cb] -// CHECK:STDOUT: %bound_method.loc9_17.1: = bound_method %int_1, %impl.elem0 [concrete = constants.%Convert.bound] +// CHECK:STDOUT: %bound_method.loc10_17.1: = bound_method %int_1, %impl.elem0 [concrete = constants.%Convert.bound] // CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc9_17.2: = bound_method %int_1, %specific_fn [concrete = constants.%bound_method] -// CHECK:STDOUT: %int.convert_checked: init %i32 = call %bound_method.loc9_17.2(%int_1) [concrete = constants.%int_1.47b] -// CHECK:STDOUT: %.loc9_17.2: init %i32 = converted %int_1, %int.convert_checked [concrete = constants.%int_1.47b] -// CHECK:STDOUT: %.loc9_17.3: ref %i32 = class_element_access %return, element0 -// CHECK:STDOUT: %.loc9_17.4: init %i32 = initialize_from %.loc9_17.2 to %.loc9_17.3 [concrete = constants.%int_1.47b] -// CHECK:STDOUT: %.loc9_17.5: init %CompleteClass.a06 = class_init (%.loc9_17.4), %return [concrete = constants.%CompleteClass.val] -// CHECK:STDOUT: %.loc9_18: init %CompleteClass.a06 = converted %.loc9_17.1, %.loc9_17.5 [concrete = constants.%CompleteClass.val] -// CHECK:STDOUT: return %.loc9_18 to %return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Class(constants.%T) { -// CHECK:STDOUT: %T.1 => constants.%T -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @CompleteClass(constants.%T) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %CompleteClass => constants.%CompleteClass.f97 -// CHECK:STDOUT: %CompleteClass.elem => constants.%CompleteClass.elem.9ef -// CHECK:STDOUT: %F.type => constants.%F.type.14f -// CHECK:STDOUT: %F => constants.%F.874 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @F.1(constants.%T) {} -// CHECK:STDOUT: -// CHECK:STDOUT: specific @CompleteClass(constants.%i32) { -// CHECK:STDOUT: %T => constants.%i32 -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %CompleteClass => constants.%CompleteClass.a06 -// CHECK:STDOUT: %CompleteClass.elem => constants.%CompleteClass.elem.426 -// CHECK:STDOUT: %F.type => constants.%F.type.0aa -// CHECK:STDOUT: %F => constants.%F.971 +// CHECK:STDOUT: %bound_method.loc10_17.2: = bound_method %int_1, %specific_fn [concrete = constants.%bound_method] +// CHECK:STDOUT: %int.convert_checked: init %i32 = call %bound_method.loc10_17.2(%int_1) [concrete = constants.%int_1.47b] +// CHECK:STDOUT: %.loc10_17.2: init %i32 = converted %int_1, %int.convert_checked [concrete = constants.%int_1.47b] +// CHECK:STDOUT: %.loc10_17.3: ref %i32 = class_element_access %return, element0 +// CHECK:STDOUT: %.loc10_17.4: init %i32 = initialize_from %.loc10_17.2 to %.loc10_17.3 [concrete = constants.%int_1.47b] +// CHECK:STDOUT: %.loc10_17.5: init %CompleteClass.a06 = class_init (%.loc10_17.4), %return [concrete = constants.%CompleteClass.val] +// CHECK:STDOUT: %.loc10_18: init %CompleteClass.a06 = converted %.loc10_17.1, %.loc10_17.5 [concrete = constants.%CompleteClass.val] +// CHECK:STDOUT: return %.loc10_18 to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- use_foo.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %UseMethod.type: type = fn_type @UseMethod [concrete] -// CHECK:STDOUT: %UseMethod: %UseMethod.type = struct_value () [concrete] // CHECK:STDOUT: %CompleteClass.type: type = generic_class_type @CompleteClass [concrete] // CHECK:STDOUT: %CompleteClass.generic: %CompleteClass.type = struct_value () [concrete] -// CHECK:STDOUT: %struct_type.n: type = struct_type {.n: %i32} [concrete] -// CHECK:STDOUT: %complete_type.54b: = complete_type_witness %struct_type.n [concrete] // CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] // CHECK:STDOUT: %CompleteClass.f97: type = class_type @CompleteClass, @CompleteClass(%T) [symbolic] // CHECK:STDOUT: %CompleteClass.elem.28a: type = unbound_element_type %CompleteClass.f97, %i32 [symbolic] @@ -470,79 +180,16 @@ class Class(U:! type) { // CHECK:STDOUT: %F.type.b25: type = fn_type @F.2 [concrete] // CHECK:STDOUT: %F.c41: %F.type.b25 = struct_value () [concrete] // CHECK:STDOUT: %F.specific_fn: = specific_function %F.f7c, @F.1(%i32) [concrete] -// CHECK:STDOUT: %UseField.type: type = fn_type @UseField [concrete] -// CHECK:STDOUT: %UseField: %UseField.type = struct_value () [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { -// CHECK:STDOUT: %Main.Class = import_ref Main//foo, Class, unloaded // CHECK:STDOUT: %Main.CompleteClass: %CompleteClass.type = import_ref Main//foo, CompleteClass, loaded [concrete = constants.%CompleteClass.generic] // CHECK:STDOUT: %Main.F: %F.type.b25 = import_ref Main//foo, F, loaded [concrete = constants.%F.c41] -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: %Main.import_ref.5ab3ec.1: type = import_ref Main//foo, loc6_21, loaded [symbolic = @CompleteClass.%T (constants.%T)] -// CHECK:STDOUT: %Main.import_ref.eb1: = import_ref Main//foo, loc9_1, loaded [concrete = constants.%complete_type.54b] -// CHECK:STDOUT: %Main.import_ref.3c0 = import_ref Main//foo, inst33 [no loc], unloaded // CHECK:STDOUT: %Main.import_ref.e76: @CompleteClass.%CompleteClass.elem (%CompleteClass.elem.28a) = import_ref Main//foo, loc7_8, loaded [concrete = %.364] // CHECK:STDOUT: %Main.import_ref.a52: @CompleteClass.%F.type (%F.type.14f) = import_ref Main//foo, loc8_17, loaded [symbolic = @CompleteClass.%F (constants.%F.874)] -// CHECK:STDOUT: %Main.import_ref.5ab3ec.2: type = import_ref Main//foo, loc6_21, loaded [symbolic = @CompleteClass.%T (constants.%T)] // CHECK:STDOUT: %.364: @CompleteClass.%CompleteClass.elem (%CompleteClass.elem.28a) = field_decl n, element0 [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Class = imports.%Main.Class -// CHECK:STDOUT: .CompleteClass = imports.%Main.CompleteClass -// CHECK:STDOUT: .F = imports.%Main.F -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .UseMethod = %UseMethod.decl -// CHECK:STDOUT: .UseField = %UseField.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %default.import = import -// CHECK:STDOUT: %UseMethod.decl: %UseMethod.type = fn_decl @UseMethod [concrete = constants.%UseMethod] { -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32.loc5: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc5: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param0 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %UseField.decl: %UseField.type = fn_decl @UseField [concrete = constants.%UseField] { -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32.loc10: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc10: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param0 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @CompleteClass(imports.%Main.import_ref.5ab3ec.1: type) [from "foo.carbon"] { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %CompleteClass: type = class_type @CompleteClass, @CompleteClass(%T) [symbolic = %CompleteClass (constants.%CompleteClass.f97)] -// CHECK:STDOUT: %CompleteClass.elem: type = unbound_element_type %CompleteClass, constants.%i32 [symbolic = %CompleteClass.elem (constants.%CompleteClass.elem.28a)] -// CHECK:STDOUT: %F.type: type = fn_type @F.1, @CompleteClass(%T) [symbolic = %F.type (constants.%F.type.14f)] -// CHECK:STDOUT: %F: @CompleteClass.%F.type (%F.type.14f) = struct_value () [symbolic = %F (constants.%F.874)] -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: complete_type_witness = imports.%Main.import_ref.eb1 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Main.import_ref.3c0 -// CHECK:STDOUT: .n = imports.%Main.import_ref.e76 -// CHECK:STDOUT: .F = imports.%Main.import_ref.a52 -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: // CHECK:STDOUT: fn @UseMethod() -> %i32 { // CHECK:STDOUT: !entry: // CHECK:STDOUT: name_binding_decl { @@ -550,35 +197,27 @@ class Class(U:! type) { // CHECK:STDOUT: %v.var_patt: %pattern_type.0b0 = var_pattern %v.patt [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: %v.var: ref %CompleteClass.e9e = var %v.var_patt -// CHECK:STDOUT: %F.ref.loc6: %F.type.b25 = name_ref F, imports.%Main.F [concrete = constants.%F.c41] -// CHECK:STDOUT: %.loc6_3: ref %CompleteClass.e9e = splice_block %v.var {} -// CHECK:STDOUT: %F.call.loc6: init %CompleteClass.e9e = call %F.ref.loc6() to %.loc6_3 -// CHECK:STDOUT: assign %v.var, %F.call.loc6 -// CHECK:STDOUT: %.loc6_27: type = splice_block %CompleteClass [concrete = constants.%CompleteClass.e9e] { +// CHECK:STDOUT: %F.ref.loc7: %F.type.b25 = name_ref F, imports.%Main.F [concrete = constants.%F.c41] +// CHECK:STDOUT: %.loc7_3: ref %CompleteClass.e9e = splice_block %v.var {} +// CHECK:STDOUT: %F.call.loc7: init %CompleteClass.e9e = call %F.ref.loc7() to %.loc7_3 +// CHECK:STDOUT: assign %v.var, %F.call.loc7 +// CHECK:STDOUT: %.loc7_27: type = splice_block %CompleteClass [concrete = constants.%CompleteClass.e9e] { // CHECK:STDOUT: %CompleteClass.ref: %CompleteClass.type = name_ref CompleteClass, imports.%Main.CompleteClass [concrete = constants.%CompleteClass.generic] -// CHECK:STDOUT: %int_32.loc6: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc6: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] +// CHECK:STDOUT: %int_32.loc7: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] +// CHECK:STDOUT: %i32.loc7: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] // CHECK:STDOUT: %CompleteClass: type = class_type @CompleteClass, @CompleteClass(constants.%i32) [concrete = constants.%CompleteClass.e9e] // CHECK:STDOUT: } // CHECK:STDOUT: %v: ref %CompleteClass.e9e = bind_name v, %v.var // CHECK:STDOUT: %v.ref: ref %CompleteClass.e9e = name_ref v, %v -// CHECK:STDOUT: %.loc7_11: %F.type.1bc = specific_constant imports.%Main.import_ref.a52, @CompleteClass(constants.%i32) [concrete = constants.%F.f7c] -// CHECK:STDOUT: %F.ref.loc7: %F.type.1bc = name_ref F, %.loc7_11 [concrete = constants.%F.f7c] -// CHECK:STDOUT: %F.specific_fn: = specific_function %F.ref.loc7, @F.1(constants.%i32) [concrete = constants.%F.specific_fn] -// CHECK:STDOUT: %F.call.loc7: init %i32 = call %F.specific_fn() -// CHECK:STDOUT: %.loc7_15.1: %i32 = value_of_initializer %F.call.loc7 -// CHECK:STDOUT: %.loc7_15.2: %i32 = converted %F.call.loc7, %.loc7_15.1 -// CHECK:STDOUT: return %.loc7_15.2 +// CHECK:STDOUT: %.loc8_11: %F.type.1bc = specific_constant imports.%Main.import_ref.a52, @CompleteClass(constants.%i32) [concrete = constants.%F.f7c] +// CHECK:STDOUT: %F.ref.loc8: %F.type.1bc = name_ref F, %.loc8_11 [concrete = constants.%F.f7c] +// CHECK:STDOUT: %F.specific_fn: = specific_function %F.ref.loc8, @F.1(constants.%i32) [concrete = constants.%F.specific_fn] +// CHECK:STDOUT: %F.call.loc8: init %i32 = call %F.specific_fn() +// CHECK:STDOUT: %.loc8_15.1: %i32 = value_of_initializer %F.call.loc8 +// CHECK:STDOUT: %.loc8_15.2: %i32 = converted %F.call.loc8, %.loc8_15.1 +// CHECK:STDOUT: return %.loc8_15.2 // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic fn @F.1(imports.%Main.import_ref.5ab3ec.2: type) [from "foo.carbon"] { -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: -// CHECK:STDOUT: fn; -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F.2 [from "foo.carbon"]; -// CHECK:STDOUT: // CHECK:STDOUT: fn @UseField() -> %i32 { // CHECK:STDOUT: !entry: // CHECK:STDOUT: name_binding_decl { @@ -587,270 +226,20 @@ class Class(U:! type) { // CHECK:STDOUT: } // CHECK:STDOUT: %v.var: ref %CompleteClass.e9e = var %v.var_patt // CHECK:STDOUT: %F.ref: %F.type.b25 = name_ref F, imports.%Main.F [concrete = constants.%F.c41] -// CHECK:STDOUT: %.loc11_3: ref %CompleteClass.e9e = splice_block %v.var {} -// CHECK:STDOUT: %F.call: init %CompleteClass.e9e = call %F.ref() to %.loc11_3 +// CHECK:STDOUT: %.loc14_3: ref %CompleteClass.e9e = splice_block %v.var {} +// CHECK:STDOUT: %F.call: init %CompleteClass.e9e = call %F.ref() to %.loc14_3 // CHECK:STDOUT: assign %v.var, %F.call -// CHECK:STDOUT: %.loc11_27: type = splice_block %CompleteClass [concrete = constants.%CompleteClass.e9e] { +// CHECK:STDOUT: %.loc14_27: type = splice_block %CompleteClass [concrete = constants.%CompleteClass.e9e] { // CHECK:STDOUT: %CompleteClass.ref: %CompleteClass.type = name_ref CompleteClass, imports.%Main.CompleteClass [concrete = constants.%CompleteClass.generic] -// CHECK:STDOUT: %int_32.loc11: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc11: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] +// CHECK:STDOUT: %int_32.loc14: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] +// CHECK:STDOUT: %i32.loc14: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] // CHECK:STDOUT: %CompleteClass: type = class_type @CompleteClass, @CompleteClass(constants.%i32) [concrete = constants.%CompleteClass.e9e] // CHECK:STDOUT: } // CHECK:STDOUT: %v: ref %CompleteClass.e9e = bind_name v, %v.var // CHECK:STDOUT: %v.ref: ref %CompleteClass.e9e = name_ref v, %v // CHECK:STDOUT: %n.ref: %CompleteClass.elem.7fc = name_ref n, imports.%Main.import_ref.e76 [concrete = imports.%.364] -// CHECK:STDOUT: %.loc12_11.1: ref %i32 = class_element_access %v.ref, element0 -// CHECK:STDOUT: %.loc12_11.2: %i32 = bind_value %.loc12_11.1 -// CHECK:STDOUT: return %.loc12_11.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @CompleteClass(constants.%T) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %CompleteClass => constants.%CompleteClass.f97 -// CHECK:STDOUT: %CompleteClass.elem => constants.%CompleteClass.elem.28a -// CHECK:STDOUT: %F.type => constants.%F.type.14f -// CHECK:STDOUT: %F => constants.%F.874 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @F.1(constants.%T) {} -// CHECK:STDOUT: -// CHECK:STDOUT: specific @CompleteClass(constants.%i32) { -// CHECK:STDOUT: %T => constants.%i32 -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %CompleteClass => constants.%CompleteClass.e9e -// CHECK:STDOUT: %CompleteClass.elem => constants.%CompleteClass.elem.7fc -// CHECK:STDOUT: %F.type => constants.%F.type.1bc -// CHECK:STDOUT: %F => constants.%F.f7c -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @F.1(constants.%i32) { -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_generic_arg_mismatch.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Use.type: type = fn_type @Use [concrete] -// CHECK:STDOUT: %Use: %Use.type = struct_value () [concrete] -// CHECK:STDOUT: %CompleteClass.type: type = generic_class_type @CompleteClass [concrete] -// CHECK:STDOUT: %CompleteClass.generic: %CompleteClass.type = struct_value () [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %struct_type.n: type = struct_type {.n: %i32} [concrete] -// CHECK:STDOUT: %complete_type.a68: = complete_type_witness %struct_type.n [concrete] -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %CompleteClass.f97: type = class_type @CompleteClass, @CompleteClass(%T) [symbolic] -// CHECK:STDOUT: %CompleteClass.elem.9ef: type = unbound_element_type %CompleteClass.f97, %i32 [symbolic] -// CHECK:STDOUT: %F.type.14f: type = fn_type @F.1, @CompleteClass(%T) [symbolic] -// CHECK:STDOUT: %F.874: %F.type.14f = struct_value () [symbolic] -// CHECK:STDOUT: %ptr.9e1: type = ptr_type %i32 [concrete] -// CHECK:STDOUT: %CompleteClass.0fe: type = class_type @CompleteClass, @CompleteClass(%ptr.9e1) [concrete] -// CHECK:STDOUT: %CompleteClass.elem.d29: type = unbound_element_type %CompleteClass.0fe, %i32 [concrete] -// CHECK:STDOUT: %F.type.8cf: type = fn_type @F.1, @CompleteClass(%ptr.9e1) [concrete] -// CHECK:STDOUT: %F.012: %F.type.8cf = struct_value () [concrete] -// CHECK:STDOUT: %pattern_type.062: type = pattern_type %CompleteClass.0fe [concrete] -// CHECK:STDOUT: %F.type.b25: type = fn_type @F.2 [concrete] -// CHECK:STDOUT: %F.c41: %F.type.b25 = struct_value () [concrete] -// CHECK:STDOUT: %CompleteClass.a06: type = class_type @CompleteClass, @CompleteClass(%i32) [concrete] -// CHECK:STDOUT: %CompleteClass.elem.426: type = unbound_element_type %CompleteClass.a06, %i32 [concrete] -// CHECK:STDOUT: %F.type.0aa: type = fn_type @F.1, @CompleteClass(%i32) [concrete] -// CHECK:STDOUT: %F.971: %F.type.0aa = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Main.Class = import_ref Main//foo, Class, unloaded -// CHECK:STDOUT: %Main.CompleteClass: %CompleteClass.type = import_ref Main//foo, CompleteClass, loaded [concrete = constants.%CompleteClass.generic] -// CHECK:STDOUT: %Main.F: %F.type.b25 = import_ref Main//foo, F, loaded [concrete = constants.%F.c41] -// CHECK:STDOUT: %Core.ece: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Main.import_ref.5ab3ec.1: type = import_ref Main//foo, loc6_21, loaded [symbolic = @CompleteClass.%T (constants.%T)] -// CHECK:STDOUT: %Main.import_ref.eb1: = import_ref Main//foo, loc9_1, loaded [concrete = constants.%complete_type.a68] -// CHECK:STDOUT: %Main.import_ref.3c0 = import_ref Main//foo, inst33 [no loc], unloaded -// CHECK:STDOUT: %Main.import_ref.051 = import_ref Main//foo, loc7_8, unloaded -// CHECK:STDOUT: %Main.import_ref.570 = import_ref Main//foo, loc8_17, unloaded -// CHECK:STDOUT: %Main.import_ref.5ab3ec.2: type = import_ref Main//foo, loc6_21, loaded [symbolic = @CompleteClass.%T (constants.%T)] -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/operators/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Class = imports.%Main.Class -// CHECK:STDOUT: .CompleteClass = imports.%Main.CompleteClass -// CHECK:STDOUT: .F = imports.%Main.F -// CHECK:STDOUT: .Core = imports.%Core.ece -// CHECK:STDOUT: .Use = %Use.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %default.import = import -// CHECK:STDOUT: %Use.decl: %Use.type = fn_decl @Use [concrete = constants.%Use] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @CompleteClass(imports.%Main.import_ref.5ab3ec.1: type) [from "foo.carbon"] { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %CompleteClass: type = class_type @CompleteClass, @CompleteClass(%T) [symbolic = %CompleteClass (constants.%CompleteClass.f97)] -// CHECK:STDOUT: %CompleteClass.elem: type = unbound_element_type %CompleteClass, constants.%i32 [symbolic = %CompleteClass.elem (constants.%CompleteClass.elem.9ef)] -// CHECK:STDOUT: %F.type: type = fn_type @F.1, @CompleteClass(%T) [symbolic = %F.type (constants.%F.type.14f)] -// CHECK:STDOUT: %F: @CompleteClass.%F.type (%F.type.14f) = struct_value () [symbolic = %F (constants.%F.874)] -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: complete_type_witness = imports.%Main.import_ref.eb1 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Main.import_ref.3c0 -// CHECK:STDOUT: .n = imports.%Main.import_ref.051 -// CHECK:STDOUT: .F = imports.%Main.import_ref.570 -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Use() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %v.patt: %pattern_type.062 = binding_pattern v [concrete] -// CHECK:STDOUT: %v.var_patt: %pattern_type.062 = var_pattern %v.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %v.var: ref %CompleteClass.0fe = var %v.var_patt -// CHECK:STDOUT: %F.ref: %F.type.b25 = name_ref F, imports.%Main.F [concrete = constants.%F.c41] -// CHECK:STDOUT: %.loc14_34: ref %CompleteClass.a06 = temporary_storage -// CHECK:STDOUT: %F.call: init %CompleteClass.a06 = call %F.ref() to %.loc14_34 -// CHECK:STDOUT: %.loc14_3: %CompleteClass.0fe = converted %F.call, [concrete = ] -// CHECK:STDOUT: assign %v.var, -// CHECK:STDOUT: %.loc14_28: type = splice_block %CompleteClass [concrete = constants.%CompleteClass.0fe] { -// CHECK:STDOUT: %CompleteClass.ref: %CompleteClass.type = name_ref CompleteClass, imports.%Main.CompleteClass [concrete = constants.%CompleteClass.generic] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %ptr: type = ptr_type %i32 [concrete = constants.%ptr.9e1] -// CHECK:STDOUT: %CompleteClass: type = class_type @CompleteClass, @CompleteClass(constants.%ptr.9e1) [concrete = constants.%CompleteClass.0fe] -// CHECK:STDOUT: } -// CHECK:STDOUT: %v: ref %CompleteClass.0fe = bind_name v, %v.var -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @F.1(imports.%Main.import_ref.5ab3ec.2: type) [from "foo.carbon"] { -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: -// CHECK:STDOUT: fn; -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F.2 [from "foo.carbon"]; -// CHECK:STDOUT: -// CHECK:STDOUT: specific @CompleteClass(constants.%T) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %CompleteClass => constants.%CompleteClass.f97 -// CHECK:STDOUT: %CompleteClass.elem => constants.%CompleteClass.elem.9ef -// CHECK:STDOUT: %F.type => constants.%F.type.14f -// CHECK:STDOUT: %F => constants.%F.874 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @F.1(constants.%T) {} -// CHECK:STDOUT: -// CHECK:STDOUT: specific @CompleteClass(constants.%ptr.9e1) { -// CHECK:STDOUT: %T => constants.%ptr.9e1 -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %CompleteClass => constants.%CompleteClass.0fe -// CHECK:STDOUT: %CompleteClass.elem => constants.%CompleteClass.elem.d29 -// CHECK:STDOUT: %F.type => constants.%F.type.8cf -// CHECK:STDOUT: %F => constants.%F.012 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @CompleteClass(constants.%i32) { -// CHECK:STDOUT: %T => constants.%i32 -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %CompleteClass => constants.%CompleteClass.a06 -// CHECK:STDOUT: %CompleteClass.elem => constants.%CompleteClass.elem.426 -// CHECK:STDOUT: %F.type => constants.%F.type.0aa -// CHECK:STDOUT: %F => constants.%F.971 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_foo.impl.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] -// CHECK:STDOUT: %U: type = bind_symbolic_name U, 0 [symbolic] -// CHECK:STDOUT: %Class.type.cf06d9.1: type = generic_class_type @Class.1 [concrete] -// CHECK:STDOUT: %Class.generic.9545f5.1: %Class.type.cf06d9.1 = struct_value () [concrete] -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %Class.type.cf06d9.2: type = generic_class_type @Class.2 [concrete] -// CHECK:STDOUT: %Class.generic.9545f5.2: %Class.type.cf06d9.2 = struct_value () [concrete] -// CHECK:STDOUT: %Class.fe1b2d.2: type = class_type @Class.2, @Class.2(%U) [symbolic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Main.Class: %Class.type.cf06d9.1 = import_ref Main//foo, Class, loaded [concrete = constants.%Class.generic.9545f5.1] -// CHECK:STDOUT: %Main.CompleteClass = import_ref Main//foo, CompleteClass, unloaded -// CHECK:STDOUT: %Main.F = import_ref Main//foo, F, unloaded -// CHECK:STDOUT: %Core.ece: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Main.import_ref.5ab: type = import_ref Main//foo, loc4_13, loaded [symbolic = @Class.1.%T (constants.%T)] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Class = imports.%Main.Class -// CHECK:STDOUT: .CompleteClass = imports.%Main.CompleteClass -// CHECK:STDOUT: .F = imports.%Main.F -// CHECK:STDOUT: .Core = imports.%Core.ece -// CHECK:STDOUT: .T = -// CHECK:STDOUT: } -// CHECK:STDOUT: %default.import.loc2_19.1 = import -// CHECK:STDOUT: %default.import.loc2_19.2 = import -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Class.decl: %Class.type.cf06d9.2 = class_decl @Class.2 [concrete = constants.%Class.generic.9545f5.2] { -// CHECK:STDOUT: %U.patt: %pattern_type.98f = symbolic_binding_pattern U, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %U.loc12_13.1: type = bind_symbolic_name U, 0 [symbolic = %U.loc12_13.2 (constants.%U)] -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Class.1(imports.%Main.import_ref.5ab: type) [from "foo.carbon"] { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: class; -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Class.2(%U.loc12_13.1: type) { -// CHECK:STDOUT: %U.loc12_13.2: type = bind_symbolic_name U, 0 [symbolic = %U.loc12_13.2 (constants.%U)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %T.ref: = name_ref T, [concrete = ] -// CHECK:STDOUT: %.loc17: = field_decl x, element0 [concrete] -// CHECK:STDOUT: %struct_type.x: type = struct_type {.x: } [concrete = ] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.x [concrete = ] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Class.fe1b2d.2 -// CHECK:STDOUT: .T = -// CHECK:STDOUT: .x = %.loc17 -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Class.1(constants.%T) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Class.2(constants.%U) { -// CHECK:STDOUT: %U.loc12_13.2 => constants.%U +// CHECK:STDOUT: %.loc15_11.1: ref %i32 = class_element_access %v.ref, element0 +// CHECK:STDOUT: %.loc15_11.2: %i32 = bind_value %.loc15_11.1 +// CHECK:STDOUT: return %.loc15_11.2 // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/generic/init.carbon b/toolchain/check/testdata/class/generic/init.carbon index 966b12914a818..9043ed00610e5 100644 --- a/toolchain/check/testdata/class/generic/init.carbon +++ b/toolchain/check/testdata/class/generic/init.carbon @@ -2,6 +2,8 @@ // Exceptions. See /LICENSE for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// // AUTOUPDATE // TIP: To test this file alone, run: // TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/generic/init.carbon @@ -17,12 +19,16 @@ class Class(T:! type) { } fn InitFromStructGeneric(T:! type, x: T) -> T { + //@dump-sem-ir-begin var v: Class(T) = {.k = x}; + //@dump-sem-ir-end return v.k; } fn InitFromStructSpecific(x: i32) -> i32 { + //@dump-sem-ir-begin var v: Class(i32) = {.k = x}; + //@dump-sem-ir-end return v.k; } @@ -35,163 +41,70 @@ class Adapt(T:! type) { } fn InitFromAdaptedGeneric(T:! type, x: T) -> T { + //@dump-sem-ir-begin return (x as Adapt(T)) as T; + //@dump-sem-ir-end } fn InitFromAdaptedSpecific(x: i32) -> i32 { + //@dump-sem-ir-begin return (x as Adapt(i32)) as i32; + //@dump-sem-ir-end } // CHECK:STDOUT: --- from_struct.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { // CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] // CHECK:STDOUT: %Class.type: type = generic_class_type @Class [concrete] // CHECK:STDOUT: %Class.generic: %Class.type = struct_value () [concrete] // CHECK:STDOUT: %Class.fe1: type = class_type @Class, @Class(%T) [symbolic] -// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T [symbolic] -// CHECK:STDOUT: %Class.elem.e26: type = unbound_element_type %Class.fe1, %T [symbolic] // CHECK:STDOUT: %struct_type.k.b21: type = struct_type {.k: %T} [symbolic] -// CHECK:STDOUT: %complete_type.b9e: = complete_type_witness %struct_type.k.b21 [symbolic] // CHECK:STDOUT: %pattern_type.7dc: type = pattern_type %T [symbolic] -// CHECK:STDOUT: %InitFromStructGeneric.type: type = fn_type @InitFromStructGeneric [concrete] -// CHECK:STDOUT: %InitFromStructGeneric: %InitFromStructGeneric.type = struct_value () [concrete] // CHECK:STDOUT: %require_complete.4f8: = require_complete_type %Class.fe1 [symbolic] // CHECK:STDOUT: %pattern_type.3c1: type = pattern_type %Class.fe1 [symbolic] // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %InitFromStructSpecific.type: type = fn_type @InitFromStructSpecific [concrete] -// CHECK:STDOUT: %InitFromStructSpecific: %InitFromStructSpecific.type = struct_value () [concrete] -// CHECK:STDOUT: %i32.builtin: type = int_type signed, %int_32 [concrete] -// CHECK:STDOUT: %complete_type.f8a: = complete_type_witness %i32.builtin [concrete] // CHECK:STDOUT: %Class.247: type = class_type @Class, @Class(%i32) [concrete] -// CHECK:STDOUT: %Class.elem.2d8: type = unbound_element_type %Class.247, %i32 [concrete] // CHECK:STDOUT: %struct_type.k.0bf: type = struct_type {.k: %i32} [concrete] -// CHECK:STDOUT: %complete_type.954: = complete_type_witness %struct_type.k.0bf [concrete] // CHECK:STDOUT: %pattern_type.0fa: type = pattern_type %Class.247 [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Class = %Class.decl -// CHECK:STDOUT: .InitFromStructGeneric = %InitFromStructGeneric.decl -// CHECK:STDOUT: .InitFromStructSpecific = %InitFromStructSpecific.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Class.decl: %Class.type = class_decl @Class [concrete = constants.%Class.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc4_13.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_13.2 (constants.%T)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %InitFromStructGeneric.decl: %InitFromStructGeneric.type = fn_decl @InitFromStructGeneric [concrete = constants.%InitFromStructGeneric] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: %x.patt: @InitFromStructGeneric.%pattern_type.loc8 (%pattern_type.7dc) = binding_pattern x [concrete] -// CHECK:STDOUT: %x.param_patt: @InitFromStructGeneric.%pattern_type.loc8 (%pattern_type.7dc) = value_param_pattern %x.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: @InitFromStructGeneric.%pattern_type.loc8 (%pattern_type.7dc) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @InitFromStructGeneric.%pattern_type.loc8 (%pattern_type.7dc) = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref.loc8_45: type = name_ref T, %T.loc8_26.1 [symbolic = %T.loc8_26.2 (constants.%T)] -// CHECK:STDOUT: %T.loc8_26.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc8_26.2 (constants.%T)] -// CHECK:STDOUT: %x.param: @InitFromStructGeneric.%T.loc8_26.2 (%T) = value_param call_param0 -// CHECK:STDOUT: %T.ref.loc8_39: type = name_ref T, %T.loc8_26.1 [symbolic = %T.loc8_26.2 (constants.%T)] -// CHECK:STDOUT: %x: @InitFromStructGeneric.%T.loc8_26.2 (%T) = bind_name x, %x.param -// CHECK:STDOUT: %return.param: ref @InitFromStructGeneric.%T.loc8_26.2 (%T) = out_param call_param1 -// CHECK:STDOUT: %return: ref @InitFromStructGeneric.%T.loc8_26.2 (%T) = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %InitFromStructSpecific.decl: %InitFromStructSpecific.type = fn_decl @InitFromStructSpecific [concrete = constants.%InitFromStructSpecific] { -// CHECK:STDOUT: %x.patt: %pattern_type.7ce = binding_pattern x [concrete] -// CHECK:STDOUT: %x.param_patt: %pattern_type.7ce = value_param_pattern %x.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32.loc13_38: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc13_38: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %x.param: %i32 = value_param call_param0 -// CHECK:STDOUT: %.loc13: type = splice_block %i32.loc13_30 [concrete = constants.%i32] { -// CHECK:STDOUT: %int_32.loc13_30: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc13_30: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: } -// CHECK:STDOUT: %x: %i32 = bind_name x, %x.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Class(%T.loc4_13.1: type) { -// CHECK:STDOUT: %T.loc4_13.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_13.2 (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %T.loc4_13.2 [symbolic = %require_complete (constants.%require_complete.4ae)] -// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T.loc4_13.2) [symbolic = %Class (constants.%Class.fe1)] -// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %T.loc4_13.2 [symbolic = %Class.elem (constants.%Class.elem.e26)] -// CHECK:STDOUT: %struct_type.k.loc6_1.2: type = struct_type {.k: @Class.%T.loc4_13.2 (%T)} [symbolic = %struct_type.k.loc6_1.2 (constants.%struct_type.k.b21)] -// CHECK:STDOUT: %complete_type.loc6_1.2: = complete_type_witness %struct_type.k.loc6_1.2 [symbolic = %complete_type.loc6_1.2 (constants.%complete_type.b9e)] -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc4_13.1 [symbolic = %T.loc4_13.2 (constants.%T)] -// CHECK:STDOUT: %.loc5: @Class.%Class.elem (%Class.elem.e26) = field_decl k, element0 [concrete] -// CHECK:STDOUT: %struct_type.k.loc6_1.1: type = struct_type {.k: %T} [symbolic = %struct_type.k.loc6_1.2 (constants.%struct_type.k.b21)] -// CHECK:STDOUT: %complete_type.loc6_1.1: = complete_type_witness %struct_type.k.loc6_1.1 [symbolic = %complete_type.loc6_1.2 (constants.%complete_type.b9e)] -// CHECK:STDOUT: complete_type_witness = %complete_type.loc6_1.1 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Class.fe1 -// CHECK:STDOUT: .T = -// CHECK:STDOUT: .k = %.loc5 -// CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @InitFromStructGeneric(%T.loc8_26.1: type) { -// CHECK:STDOUT: %T.loc8_26.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc8_26.2 (constants.%T)] -// CHECK:STDOUT: %pattern_type.loc8: type = pattern_type %T.loc8_26.2 [symbolic = %pattern_type.loc8 (constants.%pattern_type.7dc)] +// CHECK:STDOUT: // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete.loc8: = require_complete_type %T.loc8_26.2 [symbolic = %require_complete.loc8 (constants.%require_complete.4ae)] -// CHECK:STDOUT: %Class.loc9_17.2: type = class_type @Class, @Class(%T.loc8_26.2) [symbolic = %Class.loc9_17.2 (constants.%Class.fe1)] -// CHECK:STDOUT: %require_complete.loc9: = require_complete_type %Class.loc9_17.2 [symbolic = %require_complete.loc9 (constants.%require_complete.4f8)] -// CHECK:STDOUT: %pattern_type.loc9: type = pattern_type %Class.loc9_17.2 [symbolic = %pattern_type.loc9 (constants.%pattern_type.3c1)] +// CHECK:STDOUT: +// CHECK:STDOUT: %Class.loc10_17.2: type = class_type @Class, @Class(%T.loc8_26.2) [symbolic = %Class.loc10_17.2 (constants.%Class.fe1)] +// CHECK:STDOUT: %require_complete.loc10: = require_complete_type %Class.loc10_17.2 [symbolic = %require_complete.loc10 (constants.%require_complete.4f8)] +// CHECK:STDOUT: %pattern_type.loc10: type = pattern_type %Class.loc10_17.2 [symbolic = %pattern_type.loc10 (constants.%pattern_type.3c1)] // CHECK:STDOUT: %struct_type.k: type = struct_type {.k: @InitFromStructGeneric.%T.loc8_26.2 (%T)} [symbolic = %struct_type.k (constants.%struct_type.k.b21)] -// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class.loc9_17.2, %T.loc8_26.2 [symbolic = %Class.elem (constants.%Class.elem.e26)] +// CHECK:STDOUT: // CHECK:STDOUT: // CHECK:STDOUT: fn(%x.param: @InitFromStructGeneric.%T.loc8_26.2 (%T)) -> @InitFromStructGeneric.%T.loc8_26.2 (%T) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %v.patt: @InitFromStructGeneric.%pattern_type.loc9 (%pattern_type.3c1) = binding_pattern v [concrete] -// CHECK:STDOUT: %v.var_patt: @InitFromStructGeneric.%pattern_type.loc9 (%pattern_type.3c1) = var_pattern %v.patt [concrete] +// CHECK:STDOUT: %v.patt: @InitFromStructGeneric.%pattern_type.loc10 (%pattern_type.3c1) = binding_pattern v [concrete] +// CHECK:STDOUT: %v.var_patt: @InitFromStructGeneric.%pattern_type.loc10 (%pattern_type.3c1) = var_pattern %v.patt [concrete] // CHECK:STDOUT: } -// CHECK:STDOUT: %v.var: ref @InitFromStructGeneric.%Class.loc9_17.2 (%Class.fe1) = var %v.var_patt +// CHECK:STDOUT: %v.var: ref @InitFromStructGeneric.%Class.loc10_17.2 (%Class.fe1) = var %v.var_patt // CHECK:STDOUT: %x.ref: @InitFromStructGeneric.%T.loc8_26.2 (%T) = name_ref x, %x -// CHECK:STDOUT: %.loc9_28.1: @InitFromStructGeneric.%struct_type.k (%struct_type.k.b21) = struct_literal (%x.ref) -// CHECK:STDOUT: %.loc9_28.2: ref @InitFromStructGeneric.%T.loc8_26.2 (%T) = class_element_access %v.var, element0 -// CHECK:STDOUT: %.loc9_28.3: init @InitFromStructGeneric.%T.loc8_26.2 (%T) = initialize_from %x.ref to %.loc9_28.2 -// CHECK:STDOUT: %.loc9_28.4: init @InitFromStructGeneric.%Class.loc9_17.2 (%Class.fe1) = class_init (%.loc9_28.3), %v.var -// CHECK:STDOUT: %.loc9_3: init @InitFromStructGeneric.%Class.loc9_17.2 (%Class.fe1) = converted %.loc9_28.1, %.loc9_28.4 -// CHECK:STDOUT: assign %v.var, %.loc9_3 -// CHECK:STDOUT: %.loc9_17: type = splice_block %Class.loc9_17.1 [symbolic = %Class.loc9_17.2 (constants.%Class.fe1)] { +// CHECK:STDOUT: %.loc10_28.1: @InitFromStructGeneric.%struct_type.k (%struct_type.k.b21) = struct_literal (%x.ref) +// CHECK:STDOUT: %.loc10_28.2: ref @InitFromStructGeneric.%T.loc8_26.2 (%T) = class_element_access %v.var, element0 +// CHECK:STDOUT: %.loc10_28.3: init @InitFromStructGeneric.%T.loc8_26.2 (%T) = initialize_from %x.ref to %.loc10_28.2 +// CHECK:STDOUT: %.loc10_28.4: init @InitFromStructGeneric.%Class.loc10_17.2 (%Class.fe1) = class_init (%.loc10_28.3), %v.var +// CHECK:STDOUT: %.loc10_3: init @InitFromStructGeneric.%Class.loc10_17.2 (%Class.fe1) = converted %.loc10_28.1, %.loc10_28.4 +// CHECK:STDOUT: assign %v.var, %.loc10_3 +// CHECK:STDOUT: %.loc10_17: type = splice_block %Class.loc10_17.1 [symbolic = %Class.loc10_17.2 (constants.%Class.fe1)] { // CHECK:STDOUT: %Class.ref: %Class.type = name_ref Class, file.%Class.decl [concrete = constants.%Class.generic] -// CHECK:STDOUT: %T.ref.loc9: type = name_ref T, %T.loc8_26.1 [symbolic = %T.loc8_26.2 (constants.%T)] -// CHECK:STDOUT: %Class.loc9_17.1: type = class_type @Class, @Class(constants.%T) [symbolic = %Class.loc9_17.2 (constants.%Class.fe1)] +// CHECK:STDOUT: %T.ref.loc10: type = name_ref T, %T.loc8_26.1 [symbolic = %T.loc8_26.2 (constants.%T)] +// CHECK:STDOUT: %Class.loc10_17.1: type = class_type @Class, @Class(constants.%T) [symbolic = %Class.loc10_17.2 (constants.%Class.fe1)] // CHECK:STDOUT: } -// CHECK:STDOUT: %v: ref @InitFromStructGeneric.%Class.loc9_17.2 (%Class.fe1) = bind_name v, %v.var -// CHECK:STDOUT: %v.ref: ref @InitFromStructGeneric.%Class.loc9_17.2 (%Class.fe1) = name_ref v, %v -// CHECK:STDOUT: %k.ref: @InitFromStructGeneric.%Class.elem (%Class.elem.e26) = name_ref k, @Class.%.loc5 [concrete = @Class.%.loc5] -// CHECK:STDOUT: %.loc10_11.1: ref @InitFromStructGeneric.%T.loc8_26.2 (%T) = class_element_access %v.ref, element0 -// CHECK:STDOUT: %.loc10_11.2: @InitFromStructGeneric.%T.loc8_26.2 (%T) = bind_value %.loc10_11.1 -// CHECK:STDOUT: return %.loc10_11.2 +// CHECK:STDOUT: %v: ref @InitFromStructGeneric.%Class.loc10_17.2 (%Class.fe1) = bind_name v, %v.var +// CHECK:STDOUT: // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -203,35 +116,20 @@ fn InitFromAdaptedSpecific(x: i32) -> i32 { // CHECK:STDOUT: } // CHECK:STDOUT: %v.var: ref %Class.247 = var %v.var_patt // CHECK:STDOUT: %x.ref: %i32 = name_ref x, %x -// CHECK:STDOUT: %.loc14_30.1: %struct_type.k.0bf = struct_literal (%x.ref) -// CHECK:STDOUT: %.loc14_30.2: ref %i32 = class_element_access %v.var, element0 -// CHECK:STDOUT: %.loc14_30.3: init %i32 = initialize_from %x.ref to %.loc14_30.2 -// CHECK:STDOUT: %.loc14_30.4: init %Class.247 = class_init (%.loc14_30.3), %v.var -// CHECK:STDOUT: %.loc14_3: init %Class.247 = converted %.loc14_30.1, %.loc14_30.4 -// CHECK:STDOUT: assign %v.var, %.loc14_3 -// CHECK:STDOUT: %.loc14_19: type = splice_block %Class [concrete = constants.%Class.247] { +// CHECK:STDOUT: %.loc17_30.1: %struct_type.k.0bf = struct_literal (%x.ref) +// CHECK:STDOUT: %.loc17_30.2: ref %i32 = class_element_access %v.var, element0 +// CHECK:STDOUT: %.loc17_30.3: init %i32 = initialize_from %x.ref to %.loc17_30.2 +// CHECK:STDOUT: %.loc17_30.4: init %Class.247 = class_init (%.loc17_30.3), %v.var +// CHECK:STDOUT: %.loc17_3: init %Class.247 = converted %.loc17_30.1, %.loc17_30.4 +// CHECK:STDOUT: assign %v.var, %.loc17_3 +// CHECK:STDOUT: %.loc17_19: type = splice_block %Class [concrete = constants.%Class.247] { // CHECK:STDOUT: %Class.ref: %Class.type = name_ref Class, file.%Class.decl [concrete = constants.%Class.generic] -// CHECK:STDOUT: %int_32.loc14: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc14: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] +// CHECK:STDOUT: %int_32.loc17: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] +// CHECK:STDOUT: %i32.loc17: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] // CHECK:STDOUT: %Class: type = class_type @Class, @Class(constants.%i32) [concrete = constants.%Class.247] // CHECK:STDOUT: } // CHECK:STDOUT: %v: ref %Class.247 = bind_name v, %v.var -// CHECK:STDOUT: %v.ref: ref %Class.247 = name_ref v, %v -// CHECK:STDOUT: %k.ref: %Class.elem.2d8 = name_ref k, @Class.%.loc5 [concrete = @Class.%.loc5] -// CHECK:STDOUT: %.loc15_11.1: ref %i32 = class_element_access %v.ref, element0 -// CHECK:STDOUT: %.loc15_11.2: %i32 = bind_value %.loc15_11.1 -// CHECK:STDOUT: return %.loc15_11.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Class(constants.%T) { -// CHECK:STDOUT: %T.loc4_13.2 => constants.%T -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%require_complete.4ae -// CHECK:STDOUT: %Class => constants.%Class.fe1 -// CHECK:STDOUT: %Class.elem => constants.%Class.elem.e26 -// CHECK:STDOUT: %struct_type.k.loc6_1.2 => constants.%struct_type.k.b21 -// CHECK:STDOUT: %complete_type.loc6_1.2 => constants.%complete_type.b9e +// CHECK:STDOUT: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @InitFromStructGeneric(constants.%T) { @@ -239,140 +137,43 @@ fn InitFromAdaptedSpecific(x: i32) -> i32 { // CHECK:STDOUT: %pattern_type.loc8 => constants.%pattern_type.7dc // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Class(constants.%i32) { -// CHECK:STDOUT: %T.loc4_13.2 => constants.%i32 -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%complete_type.f8a -// CHECK:STDOUT: %Class => constants.%Class.247 -// CHECK:STDOUT: %Class.elem => constants.%Class.elem.2d8 -// CHECK:STDOUT: %struct_type.k.loc6_1.2 => constants.%struct_type.k.0bf -// CHECK:STDOUT: %complete_type.loc6_1.2 => constants.%complete_type.954 -// CHECK:STDOUT: } -// CHECK:STDOUT: // CHECK:STDOUT: --- adapt.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { // CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] // CHECK:STDOUT: %Adapt.type: type = generic_class_type @Adapt [concrete] // CHECK:STDOUT: %Adapt.generic: %Adapt.type = struct_value () [concrete] // CHECK:STDOUT: %Adapt.2e4: type = class_type @Adapt, @Adapt(%T) [symbolic] -// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T [symbolic] -// CHECK:STDOUT: %complete_type.f87: = complete_type_witness %T [symbolic] // CHECK:STDOUT: %pattern_type.7dc: type = pattern_type %T [symbolic] -// CHECK:STDOUT: %InitFromAdaptedGeneric.type: type = fn_type @InitFromAdaptedGeneric [concrete] -// CHECK:STDOUT: %InitFromAdaptedGeneric: %InitFromAdaptedGeneric.type = struct_value () [concrete] // CHECK:STDOUT: %require_complete.26c: = require_complete_type %Adapt.2e4 [symbolic] // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %InitFromAdaptedSpecific.type: type = fn_type @InitFromAdaptedSpecific [concrete] -// CHECK:STDOUT: %InitFromAdaptedSpecific: %InitFromAdaptedSpecific.type = struct_value () [concrete] -// CHECK:STDOUT: %i32.builtin: type = int_type signed, %int_32 [concrete] -// CHECK:STDOUT: %complete_type.f8a: = complete_type_witness %i32.builtin [concrete] // CHECK:STDOUT: %Adapt.526: type = class_type @Adapt, @Adapt(%i32) [concrete] -// CHECK:STDOUT: %complete_type.1eb: = complete_type_witness %i32 [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Adapt = %Adapt.decl -// CHECK:STDOUT: .InitFromAdaptedGeneric = %InitFromAdaptedGeneric.decl -// CHECK:STDOUT: .InitFromAdaptedSpecific = %InitFromAdaptedSpecific.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Adapt.decl: %Adapt.type = class_decl @Adapt [concrete = constants.%Adapt.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc4_13.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_13.2 (constants.%T)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %InitFromAdaptedGeneric.decl: %InitFromAdaptedGeneric.type = fn_decl @InitFromAdaptedGeneric [concrete = constants.%InitFromAdaptedGeneric] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: %x.patt: @InitFromAdaptedGeneric.%pattern_type (%pattern_type.7dc) = binding_pattern x [concrete] -// CHECK:STDOUT: %x.param_patt: @InitFromAdaptedGeneric.%pattern_type (%pattern_type.7dc) = value_param_pattern %x.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: @InitFromAdaptedGeneric.%pattern_type (%pattern_type.7dc) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @InitFromAdaptedGeneric.%pattern_type (%pattern_type.7dc) = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref.loc8_46: type = name_ref T, %T.loc8_27.1 [symbolic = %T.loc8_27.2 (constants.%T)] -// CHECK:STDOUT: %T.loc8_27.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc8_27.2 (constants.%T)] -// CHECK:STDOUT: %x.param: @InitFromAdaptedGeneric.%T.loc8_27.2 (%T) = value_param call_param0 -// CHECK:STDOUT: %T.ref.loc8_40: type = name_ref T, %T.loc8_27.1 [symbolic = %T.loc8_27.2 (constants.%T)] -// CHECK:STDOUT: %x: @InitFromAdaptedGeneric.%T.loc8_27.2 (%T) = bind_name x, %x.param -// CHECK:STDOUT: %return.param: ref @InitFromAdaptedGeneric.%T.loc8_27.2 (%T) = out_param call_param1 -// CHECK:STDOUT: %return: ref @InitFromAdaptedGeneric.%T.loc8_27.2 (%T) = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %InitFromAdaptedSpecific.decl: %InitFromAdaptedSpecific.type = fn_decl @InitFromAdaptedSpecific [concrete = constants.%InitFromAdaptedSpecific] { -// CHECK:STDOUT: %x.patt: %pattern_type.7ce = binding_pattern x [concrete] -// CHECK:STDOUT: %x.param_patt: %pattern_type.7ce = value_param_pattern %x.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32.loc12_39: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc12_39: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %x.param: %i32 = value_param call_param0 -// CHECK:STDOUT: %.loc12: type = splice_block %i32.loc12_31 [concrete = constants.%i32] { -// CHECK:STDOUT: %int_32.loc12_31: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc12_31: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: } -// CHECK:STDOUT: %x: %i32 = bind_name x, %x.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Adapt(%T.loc4_13.1: type) { -// CHECK:STDOUT: %T.loc4_13.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_13.2 (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %T.loc4_13.2 [symbolic = %require_complete (constants.%require_complete.4ae)] -// CHECK:STDOUT: %complete_type.loc6_1.2: = complete_type_witness %T.loc4_13.2 [symbolic = %complete_type.loc6_1.2 (constants.%complete_type.f87)] -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc4_13.1 [symbolic = %T.loc4_13.2 (constants.%T)] -// CHECK:STDOUT: adapt_decl %T.ref [concrete] -// CHECK:STDOUT: %complete_type.loc6_1.1: = complete_type_witness constants.%T [symbolic = %complete_type.loc6_1.2 (constants.%complete_type.f87)] -// CHECK:STDOUT: complete_type_witness = %complete_type.loc6_1.1 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Adapt.2e4 -// CHECK:STDOUT: .T = -// CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @InitFromAdaptedGeneric(%T.loc8_27.1: type) { -// CHECK:STDOUT: %T.loc8_27.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc8_27.2 (constants.%T)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %T.loc8_27.2 [symbolic = %pattern_type (constants.%pattern_type.7dc)] +// CHECK:STDOUT: // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete.loc8: = require_complete_type %T.loc8_27.2 [symbolic = %require_complete.loc8 (constants.%require_complete.4ae)] -// CHECK:STDOUT: %Adapt.loc9_23.2: type = class_type @Adapt, @Adapt(%T.loc8_27.2) [symbolic = %Adapt.loc9_23.2 (constants.%Adapt.2e4)] -// CHECK:STDOUT: %require_complete.loc9: = require_complete_type %Adapt.loc9_23.2 [symbolic = %require_complete.loc9 (constants.%require_complete.26c)] +// CHECK:STDOUT: +// CHECK:STDOUT: %Adapt.loc10_23.2: type = class_type @Adapt, @Adapt(%T.loc8_27.2) [symbolic = %Adapt.loc10_23.2 (constants.%Adapt.2e4)] +// CHECK:STDOUT: %require_complete.loc10: = require_complete_type %Adapt.loc10_23.2 [symbolic = %require_complete.loc10 (constants.%require_complete.26c)] // CHECK:STDOUT: // CHECK:STDOUT: fn(%x.param: @InitFromAdaptedGeneric.%T.loc8_27.2 (%T)) -> @InitFromAdaptedGeneric.%T.loc8_27.2 (%T) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %x.ref: @InitFromAdaptedGeneric.%T.loc8_27.2 (%T) = name_ref x, %x // CHECK:STDOUT: %Adapt.ref: %Adapt.type = name_ref Adapt, file.%Adapt.decl [concrete = constants.%Adapt.generic] -// CHECK:STDOUT: %T.ref.loc9_22: type = name_ref T, %T.loc8_27.1 [symbolic = %T.loc8_27.2 (constants.%T)] -// CHECK:STDOUT: %Adapt.loc9_23.1: type = class_type @Adapt, @Adapt(constants.%T) [symbolic = %Adapt.loc9_23.2 (constants.%Adapt.2e4)] -// CHECK:STDOUT: %.loc9_13.1: @InitFromAdaptedGeneric.%Adapt.loc9_23.2 (%Adapt.2e4) = as_compatible %x.ref -// CHECK:STDOUT: %.loc9_13.2: @InitFromAdaptedGeneric.%Adapt.loc9_23.2 (%Adapt.2e4) = converted %x.ref, %.loc9_13.1 -// CHECK:STDOUT: %T.ref.loc9_29: type = name_ref T, %T.loc8_27.1 [symbolic = %T.loc8_27.2 (constants.%T)] -// CHECK:STDOUT: %.loc9_26.1: @InitFromAdaptedGeneric.%T.loc8_27.2 (%T) = as_compatible %.loc9_13.2 -// CHECK:STDOUT: %.loc9_26.2: @InitFromAdaptedGeneric.%T.loc8_27.2 (%T) = converted %.loc9_13.2, %.loc9_26.1 -// CHECK:STDOUT: return %.loc9_26.2 +// CHECK:STDOUT: %T.ref.loc10_22: type = name_ref T, %T.loc8_27.1 [symbolic = %T.loc8_27.2 (constants.%T)] +// CHECK:STDOUT: %Adapt.loc10_23.1: type = class_type @Adapt, @Adapt(constants.%T) [symbolic = %Adapt.loc10_23.2 (constants.%Adapt.2e4)] +// CHECK:STDOUT: %.loc10_13.1: @InitFromAdaptedGeneric.%Adapt.loc10_23.2 (%Adapt.2e4) = as_compatible %x.ref +// CHECK:STDOUT: %.loc10_13.2: @InitFromAdaptedGeneric.%Adapt.loc10_23.2 (%Adapt.2e4) = converted %x.ref, %.loc10_13.1 +// CHECK:STDOUT: %T.ref.loc10_29: type = name_ref T, %T.loc8_27.1 [symbolic = %T.loc8_27.2 (constants.%T)] +// CHECK:STDOUT: %.loc10_26.1: @InitFromAdaptedGeneric.%T.loc8_27.2 (%T) = as_compatible %.loc10_13.2 +// CHECK:STDOUT: %.loc10_26.2: @InitFromAdaptedGeneric.%T.loc8_27.2 (%T) = converted %.loc10_13.2, %.loc10_26.1 +// CHECK:STDOUT: return %.loc10_26.2 // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -380,24 +181,16 @@ fn InitFromAdaptedSpecific(x: i32) -> i32 { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %x.ref: %i32 = name_ref x, %x // CHECK:STDOUT: %Adapt.ref: %Adapt.type = name_ref Adapt, file.%Adapt.decl [concrete = constants.%Adapt.generic] -// CHECK:STDOUT: %int_32.loc13_22: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc13_22: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] +// CHECK:STDOUT: %int_32.loc16_22: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] +// CHECK:STDOUT: %i32.loc16_22: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] // CHECK:STDOUT: %Adapt: type = class_type @Adapt, @Adapt(constants.%i32) [concrete = constants.%Adapt.526] -// CHECK:STDOUT: %.loc13_13.1: %Adapt.526 = as_compatible %x.ref -// CHECK:STDOUT: %.loc13_13.2: %Adapt.526 = converted %x.ref, %.loc13_13.1 -// CHECK:STDOUT: %int_32.loc13_31: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc13_31: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc13_28.1: %i32 = as_compatible %.loc13_13.2 -// CHECK:STDOUT: %.loc13_28.2: %i32 = converted %.loc13_13.2, %.loc13_28.1 -// CHECK:STDOUT: return %.loc13_28.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Adapt(constants.%T) { -// CHECK:STDOUT: %T.loc4_13.2 => constants.%T -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%require_complete.4ae -// CHECK:STDOUT: %complete_type.loc6_1.2 => constants.%complete_type.f87 +// CHECK:STDOUT: %.loc16_13.1: %Adapt.526 = as_compatible %x.ref +// CHECK:STDOUT: %.loc16_13.2: %Adapt.526 = converted %x.ref, %.loc16_13.1 +// CHECK:STDOUT: %int_32.loc16_31: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] +// CHECK:STDOUT: %i32.loc16_31: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] +// CHECK:STDOUT: %.loc16_28.1: %i32 = as_compatible %.loc16_13.2 +// CHECK:STDOUT: %.loc16_28.2: %i32 = converted %.loc16_13.2, %.loc16_28.1 +// CHECK:STDOUT: return %.loc16_28.2 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @InitFromAdaptedGeneric(constants.%T) { @@ -405,11 +198,3 @@ fn InitFromAdaptedSpecific(x: i32) -> i32 { // CHECK:STDOUT: %pattern_type => constants.%pattern_type.7dc // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Adapt(constants.%i32) { -// CHECK:STDOUT: %T.loc4_13.2 => constants.%i32 -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%complete_type.f8a -// CHECK:STDOUT: %complete_type.loc6_1.2 => constants.%complete_type.1eb -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/generic/member_access.carbon b/toolchain/check/testdata/class/generic/member_access.carbon index 77a245c8fa769..534db7b577d6c 100644 --- a/toolchain/check/testdata/class/generic/member_access.carbon +++ b/toolchain/check/testdata/class/generic/member_access.carbon @@ -2,6 +2,8 @@ // Exceptions. See /LICENSE for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// // AUTOUPDATE // TIP: To test this file alone, run: // TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/generic/member_access.carbon @@ -19,15 +21,21 @@ class Class(T:! type) { } fn DirectFieldAccess(x: Class(i32)) -> i32 { + //@dump-sem-ir-begin return x.x; + //@dump-sem-ir-end } fn MethodCall(x: Class(i32)) -> i32 { + //@dump-sem-ir-begin return x.Get(); + //@dump-sem-ir-end } fn AddrMethodCall(p: Class(i32)*) -> i32 { + //@dump-sem-ir-begin return *p->GetAddr(); + //@dump-sem-ir-end } // --- static_member_fn_call.carbon @@ -39,519 +47,112 @@ class Class(T:! type) { } fn StaticMemberFunctionCall(T:! type) -> Class(T) { + //@dump-sem-ir-begin return Class(T).Make(); + //@dump-sem-ir-end } // CHECK:STDOUT: --- member_access.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] -// CHECK:STDOUT: %Class.type: type = generic_class_type @Class [concrete] -// CHECK:STDOUT: %Class.generic: %Class.type = struct_value () [concrete] -// CHECK:STDOUT: %Class.fe1: type = class_type @Class, @Class(%T) [symbolic] -// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T [symbolic] -// CHECK:STDOUT: %Class.elem.e26: type = unbound_element_type %Class.fe1, %T [symbolic] -// CHECK:STDOUT: %pattern_type.3c1: type = pattern_type %Class.fe1 [symbolic] -// CHECK:STDOUT: %pattern_type.7dc: type = pattern_type %T [symbolic] -// CHECK:STDOUT: %Get.type.fd9: type = fn_type @Get, @Class(%T) [symbolic] -// CHECK:STDOUT: %Get.cf9: %Get.type.fd9 = struct_value () [symbolic] -// CHECK:STDOUT: %ptr.955: type = ptr_type %Class.fe1 [symbolic] -// CHECK:STDOUT: %pattern_type.9e0: type = pattern_type %ptr.955 [symbolic] -// CHECK:STDOUT: %pattern_type.f6d: type = pattern_type auto [concrete] -// CHECK:STDOUT: %ptr.79f: type = ptr_type %T [symbolic] -// CHECK:STDOUT: %pattern_type.afe: type = pattern_type %ptr.79f [symbolic] -// CHECK:STDOUT: %GetAddr.type.402: type = fn_type @GetAddr, @Class(%T) [symbolic] -// CHECK:STDOUT: %GetAddr.102: %GetAddr.type.402 = struct_value () [symbolic] -// CHECK:STDOUT: %struct_type.x.2ac: type = struct_type {.x: %T} [symbolic] -// CHECK:STDOUT: %complete_type.433: = complete_type_witness %struct_type.x.2ac [symbolic] -// CHECK:STDOUT: %require_complete.4f8: = require_complete_type %Class.fe1 [symbolic] -// CHECK:STDOUT: %require_complete.6e5: = require_complete_type %ptr.79f [symbolic] -// CHECK:STDOUT: %require_complete.2ae: = require_complete_type %ptr.955 [symbolic] // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %Class.247: type = class_type @Class, @Class(%i32) [concrete] -// CHECK:STDOUT: %pattern_type.0fa: type = pattern_type %Class.247 [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %DirectFieldAccess.type: type = fn_type @DirectFieldAccess [concrete] -// CHECK:STDOUT: %DirectFieldAccess: %DirectFieldAccess.type = struct_value () [concrete] -// CHECK:STDOUT: %i32.builtin: type = int_type signed, %int_32 [concrete] -// CHECK:STDOUT: %complete_type.f8a: = complete_type_witness %i32.builtin [concrete] // CHECK:STDOUT: %Class.elem.2d8: type = unbound_element_type %Class.247, %i32 [concrete] // CHECK:STDOUT: %Get.type.59d: type = fn_type @Get, @Class(%i32) [concrete] // CHECK:STDOUT: %Get.a40: %Get.type.59d = struct_value () [concrete] // CHECK:STDOUT: %GetAddr.type.be7: type = fn_type @GetAddr, @Class(%i32) [concrete] // CHECK:STDOUT: %GetAddr.909: %GetAddr.type.be7 = struct_value () [concrete] -// CHECK:STDOUT: %struct_type.x.ed6: type = struct_type {.x: %i32} [concrete] -// CHECK:STDOUT: %complete_type.1ec: = complete_type_witness %struct_type.x.ed6 [concrete] -// CHECK:STDOUT: %MethodCall.type: type = fn_type @MethodCall [concrete] -// CHECK:STDOUT: %MethodCall: %MethodCall.type = struct_value () [concrete] // CHECK:STDOUT: %Get.specific_fn: = specific_function %Get.a40, @Get(%i32) [concrete] // CHECK:STDOUT: %ptr.f7c: type = ptr_type %Class.247 [concrete] -// CHECK:STDOUT: %pattern_type.14a: type = pattern_type %ptr.f7c [concrete] -// CHECK:STDOUT: %AddrMethodCall.type: type = fn_type @AddrMethodCall [concrete] -// CHECK:STDOUT: %AddrMethodCall: %AddrMethodCall.type = struct_value () [concrete] // CHECK:STDOUT: %ptr.235: type = ptr_type %i32 [concrete] -// CHECK:STDOUT: %pattern_type.fe8: type = pattern_type %ptr.235 [concrete] // CHECK:STDOUT: %GetAddr.specific_fn: = specific_function %GetAddr.909, @GetAddr(%i32) [concrete] -// CHECK:STDOUT: %complete_type.3d0: = complete_type_witness %ptr.235 [concrete] -// CHECK:STDOUT: %complete_type.6ee: = complete_type_witness %ptr.f7c [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Class = %Class.decl -// CHECK:STDOUT: .DirectFieldAccess = %DirectFieldAccess.decl -// CHECK:STDOUT: .MethodCall = %MethodCall.decl -// CHECK:STDOUT: .AddrMethodCall = %AddrMethodCall.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Class.decl: %Class.type = class_decl @Class [concrete = constants.%Class.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc2_13.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc2_13.2 (constants.%T)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %DirectFieldAccess.decl: %DirectFieldAccess.type = fn_decl @DirectFieldAccess [concrete = constants.%DirectFieldAccess] { -// CHECK:STDOUT: %x.patt: %pattern_type.0fa = binding_pattern x [concrete] -// CHECK:STDOUT: %x.param_patt: %pattern_type.0fa = value_param_pattern %x.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32.loc10_40: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc10_40: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %x.param: %Class.247 = value_param call_param0 -// CHECK:STDOUT: %.loc10: type = splice_block %Class [concrete = constants.%Class.247] { -// CHECK:STDOUT: %Class.ref: %Class.type = name_ref Class, file.%Class.decl [concrete = constants.%Class.generic] -// CHECK:STDOUT: %int_32.loc10_31: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc10_31: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %Class: type = class_type @Class, @Class(constants.%i32) [concrete = constants.%Class.247] -// CHECK:STDOUT: } -// CHECK:STDOUT: %x: %Class.247 = bind_name x, %x.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %MethodCall.decl: %MethodCall.type = fn_decl @MethodCall [concrete = constants.%MethodCall] { -// CHECK:STDOUT: %x.patt: %pattern_type.0fa = binding_pattern x [concrete] -// CHECK:STDOUT: %x.param_patt: %pattern_type.0fa = value_param_pattern %x.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32.loc14_33: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc14_33: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %x.param: %Class.247 = value_param call_param0 -// CHECK:STDOUT: %.loc14: type = splice_block %Class [concrete = constants.%Class.247] { -// CHECK:STDOUT: %Class.ref: %Class.type = name_ref Class, file.%Class.decl [concrete = constants.%Class.generic] -// CHECK:STDOUT: %int_32.loc14_24: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc14_24: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %Class: type = class_type @Class, @Class(constants.%i32) [concrete = constants.%Class.247] -// CHECK:STDOUT: } -// CHECK:STDOUT: %x: %Class.247 = bind_name x, %x.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %AddrMethodCall.decl: %AddrMethodCall.type = fn_decl @AddrMethodCall [concrete = constants.%AddrMethodCall] { -// CHECK:STDOUT: %p.patt: %pattern_type.14a = binding_pattern p [concrete] -// CHECK:STDOUT: %p.param_patt: %pattern_type.14a = value_param_pattern %p.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32.loc18_38: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc18_38: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %p.param: %ptr.f7c = value_param call_param0 -// CHECK:STDOUT: %.loc18: type = splice_block %ptr [concrete = constants.%ptr.f7c] { -// CHECK:STDOUT: %Class.ref: %Class.type = name_ref Class, file.%Class.decl [concrete = constants.%Class.generic] -// CHECK:STDOUT: %int_32.loc18_28: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc18_28: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %Class: type = class_type @Class, @Class(constants.%i32) [concrete = constants.%Class.247] -// CHECK:STDOUT: %ptr: type = ptr_type %Class [concrete = constants.%ptr.f7c] -// CHECK:STDOUT: } -// CHECK:STDOUT: %p: %ptr.f7c = bind_name p, %p.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Class(%T.loc2_13.1: type) { -// CHECK:STDOUT: %T.loc2_13.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc2_13.2 (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %T.loc2_13.2 [symbolic = %require_complete (constants.%require_complete.4ae)] -// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T.loc2_13.2) [symbolic = %Class (constants.%Class.fe1)] -// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %T.loc2_13.2 [symbolic = %Class.elem (constants.%Class.elem.e26)] -// CHECK:STDOUT: %Get.type: type = fn_type @Get, @Class(%T.loc2_13.2) [symbolic = %Get.type (constants.%Get.type.fd9)] -// CHECK:STDOUT: %Get: @Class.%Get.type (%Get.type.fd9) = struct_value () [symbolic = %Get (constants.%Get.cf9)] -// CHECK:STDOUT: %GetAddr.type: type = fn_type @GetAddr, @Class(%T.loc2_13.2) [symbolic = %GetAddr.type (constants.%GetAddr.type.402)] -// CHECK:STDOUT: %GetAddr: @Class.%GetAddr.type (%GetAddr.type.402) = struct_value () [symbolic = %GetAddr (constants.%GetAddr.102)] -// CHECK:STDOUT: %struct_type.x.loc8_1.2: type = struct_type {.x: @Class.%T.loc2_13.2 (%T)} [symbolic = %struct_type.x.loc8_1.2 (constants.%struct_type.x.2ac)] -// CHECK:STDOUT: %complete_type.loc8_1.2: = complete_type_witness %struct_type.x.loc8_1.2 [symbolic = %complete_type.loc8_1.2 (constants.%complete_type.433)] -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc2_13.1 [symbolic = %T.loc2_13.2 (constants.%T)] -// CHECK:STDOUT: %.loc3: @Class.%Class.elem (%Class.elem.e26) = field_decl x, element0 [concrete] -// CHECK:STDOUT: %Get.decl: @Class.%Get.type (%Get.type.fd9) = fn_decl @Get [symbolic = @Class.%Get (constants.%Get.cf9)] { -// CHECK:STDOUT: %self.patt: @Get.%pattern_type.loc5_10 (%pattern_type.3c1) = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: @Get.%pattern_type.loc5_10 (%pattern_type.3c1) = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: @Get.%pattern_type.loc5_24 (%pattern_type.7dc) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @Get.%pattern_type.loc5_24 (%pattern_type.7dc) = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref: type = name_ref T, @Class.%T.loc2_13.1 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %self.param: @Get.%Class (%Class.fe1) = value_param call_param0 -// CHECK:STDOUT: %.loc5_16.1: type = splice_block %Self.ref [symbolic = %Class (constants.%Class.fe1)] { -// CHECK:STDOUT: %.loc5_16.2: type = specific_constant constants.%Class.fe1, @Class(constants.%T) [symbolic = %Class (constants.%Class.fe1)] -// CHECK:STDOUT: %Self.ref: type = name_ref Self, %.loc5_16.2 [symbolic = %Class (constants.%Class.fe1)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self: @Get.%Class (%Class.fe1) = bind_name self, %self.param -// CHECK:STDOUT: %return.param: ref @Get.%T (%T) = out_param call_param1 -// CHECK:STDOUT: %return: ref @Get.%T (%T) = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %GetAddr.decl: @Class.%GetAddr.type (%GetAddr.type.402) = fn_decl @GetAddr [symbolic = @Class.%GetAddr (constants.%GetAddr.102)] { -// CHECK:STDOUT: %self.patt: @GetAddr.%pattern_type.loc7_19 (%pattern_type.9e0) = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: @GetAddr.%pattern_type.loc7_19 (%pattern_type.9e0) = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc7_14: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] -// CHECK:STDOUT: %return.patt: @GetAddr.%pattern_type.loc7_34 (%pattern_type.afe) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @GetAddr.%pattern_type.loc7_34 (%pattern_type.afe) = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref: type = name_ref T, @Class.%T.loc2_13.1 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %ptr.loc7_38.2: type = ptr_type %T.ref [symbolic = %ptr.loc7_38.1 (constants.%ptr.79f)] -// CHECK:STDOUT: %self.param: @GetAddr.%ptr.loc7_29.1 (%ptr.955) = value_param call_param0 -// CHECK:STDOUT: %.loc7_29: type = splice_block %ptr.loc7_29.2 [symbolic = %ptr.loc7_29.1 (constants.%ptr.955)] { -// CHECK:STDOUT: %.loc7_25: type = specific_constant constants.%Class.fe1, @Class(constants.%T) [symbolic = %Class (constants.%Class.fe1)] -// CHECK:STDOUT: %Self.ref: type = name_ref Self, %.loc7_25 [symbolic = %Class (constants.%Class.fe1)] -// CHECK:STDOUT: %ptr.loc7_29.2: type = ptr_type %Self.ref [symbolic = %ptr.loc7_29.1 (constants.%ptr.955)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self: @GetAddr.%ptr.loc7_29.1 (%ptr.955) = bind_name self, %self.param -// CHECK:STDOUT: %return.param: ref @GetAddr.%ptr.loc7_38.1 (%ptr.79f) = out_param call_param1 -// CHECK:STDOUT: %return: ref @GetAddr.%ptr.loc7_38.1 (%ptr.79f) = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %struct_type.x.loc8_1.1: type = struct_type {.x: %T} [symbolic = %struct_type.x.loc8_1.2 (constants.%struct_type.x.2ac)] -// CHECK:STDOUT: %complete_type.loc8_1.1: = complete_type_witness %struct_type.x.loc8_1.1 [symbolic = %complete_type.loc8_1.2 (constants.%complete_type.433)] -// CHECK:STDOUT: complete_type_witness = %complete_type.loc8_1.1 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Class.fe1 -// CHECK:STDOUT: .T = -// CHECK:STDOUT: .x = %.loc3 -// CHECK:STDOUT: .Get = %Get.decl -// CHECK:STDOUT: .GetAddr = %GetAddr.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @Get(@Class.%T.loc2_13.1: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T) [symbolic = %Class (constants.%Class.fe1)] -// CHECK:STDOUT: %pattern_type.loc5_10: type = pattern_type %Class [symbolic = %pattern_type.loc5_10 (constants.%pattern_type.3c1)] -// CHECK:STDOUT: %pattern_type.loc5_24: type = pattern_type %T [symbolic = %pattern_type.loc5_24 (constants.%pattern_type.7dc)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete.loc5_14: = require_complete_type %Class [symbolic = %require_complete.loc5_14 (constants.%require_complete.4f8)] -// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %T [symbolic = %Class.elem (constants.%Class.elem.e26)] -// CHECK:STDOUT: %require_complete.loc5_42: = require_complete_type %T [symbolic = %require_complete.loc5_42 (constants.%require_complete.4ae)] -// CHECK:STDOUT: -// CHECK:STDOUT: fn(%self.param: @Get.%Class (%Class.fe1)) -> @Get.%T (%T) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %self.ref: @Get.%Class (%Class.fe1) = name_ref self, %self -// CHECK:STDOUT: %x.ref: @Get.%Class.elem (%Class.elem.e26) = name_ref x, @Class.%.loc3 [concrete = @Class.%.loc3] -// CHECK:STDOUT: %.loc5_42.1: ref @Get.%T (%T) = class_element_access %self.ref, element0 -// CHECK:STDOUT: %.loc5_42.2: @Get.%T (%T) = bind_value %.loc5_42.1 -// CHECK:STDOUT: return %.loc5_42.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @GetAddr(@Class.%T.loc2_13.1: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T) [symbolic = %Class (constants.%Class.fe1)] -// CHECK:STDOUT: %ptr.loc7_29.1: type = ptr_type %Class [symbolic = %ptr.loc7_29.1 (constants.%ptr.955)] -// CHECK:STDOUT: %pattern_type.loc7_19: type = pattern_type %ptr.loc7_29.1 [symbolic = %pattern_type.loc7_19 (constants.%pattern_type.9e0)] -// CHECK:STDOUT: %ptr.loc7_38.1: type = ptr_type %T [symbolic = %ptr.loc7_38.1 (constants.%ptr.79f)] -// CHECK:STDOUT: %pattern_type.loc7_34: type = pattern_type %ptr.loc7_38.1 [symbolic = %pattern_type.loc7_34 (constants.%pattern_type.afe)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete.loc7_34: = require_complete_type %ptr.loc7_38.1 [symbolic = %require_complete.loc7_34 (constants.%require_complete.6e5)] -// CHECK:STDOUT: %require_complete.loc7_23: = require_complete_type %ptr.loc7_29.1 [symbolic = %require_complete.loc7_23 (constants.%require_complete.2ae)] -// CHECK:STDOUT: %require_complete.loc7_54: = require_complete_type %Class [symbolic = %require_complete.loc7_54 (constants.%require_complete.4f8)] -// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %T [symbolic = %Class.elem (constants.%Class.elem.e26)] -// CHECK:STDOUT: -// CHECK:STDOUT: fn(%self.param: @GetAddr.%ptr.loc7_29.1 (%ptr.955)) -> @GetAddr.%ptr.loc7_38.1 (%ptr.79f) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %self.ref: @GetAddr.%ptr.loc7_29.1 (%ptr.955) = name_ref self, %self -// CHECK:STDOUT: %.loc7_54.1: ref @GetAddr.%Class (%Class.fe1) = deref %self.ref -// CHECK:STDOUT: %x.ref: @GetAddr.%Class.elem (%Class.elem.e26) = name_ref x, @Class.%.loc3 [concrete = @Class.%.loc3] -// CHECK:STDOUT: %.loc7_54.2: ref @GetAddr.%T (%T) = class_element_access %.loc7_54.1, element0 -// CHECK:STDOUT: %addr: @GetAddr.%ptr.loc7_38.1 (%ptr.79f) = addr_of %.loc7_54.2 -// CHECK:STDOUT: return %addr -// CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @DirectFieldAccess(%x.param: %Class.247) -> %i32 { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %x.ref.loc11_10: %Class.247 = name_ref x, %x -// CHECK:STDOUT: %x.ref.loc11_11: %Class.elem.2d8 = name_ref x, @Class.%.loc3 [concrete = @Class.%.loc3] -// CHECK:STDOUT: %.loc11_11.1: ref %i32 = class_element_access %x.ref.loc11_10, element0 -// CHECK:STDOUT: %.loc11_11.2: %i32 = bind_value %.loc11_11.1 -// CHECK:STDOUT: return %.loc11_11.2 +// CHECK:STDOUT: %x.ref.loc12_10: %Class.247 = name_ref x, %x +// CHECK:STDOUT: %x.ref.loc12_11: %Class.elem.2d8 = name_ref x, @Class.%.loc3 [concrete = @Class.%.loc3] +// CHECK:STDOUT: %.loc12_11.1: ref %i32 = class_element_access %x.ref.loc12_10, element0 +// CHECK:STDOUT: %.loc12_11.2: %i32 = bind_value %.loc12_11.1 +// CHECK:STDOUT: return %.loc12_11.2 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @MethodCall(%x.param: %Class.247) -> %i32 { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %x.ref: %Class.247 = name_ref x, %x -// CHECK:STDOUT: %.loc15_11: %Get.type.59d = specific_constant @Class.%Get.decl, @Class(constants.%i32) [concrete = constants.%Get.a40] -// CHECK:STDOUT: %Get.ref: %Get.type.59d = name_ref Get, %.loc15_11 [concrete = constants.%Get.a40] +// CHECK:STDOUT: %.loc18_11: %Get.type.59d = specific_constant @Class.%Get.decl, @Class(constants.%i32) [concrete = constants.%Get.a40] +// CHECK:STDOUT: %Get.ref: %Get.type.59d = name_ref Get, %.loc18_11 [concrete = constants.%Get.a40] // CHECK:STDOUT: %Get.bound: = bound_method %x.ref, %Get.ref // CHECK:STDOUT: %Get.specific_fn: = specific_function %Get.ref, @Get(constants.%i32) [concrete = constants.%Get.specific_fn] // CHECK:STDOUT: %bound_method: = bound_method %x.ref, %Get.specific_fn // CHECK:STDOUT: %Get.call: init %i32 = call %bound_method(%x.ref) -// CHECK:STDOUT: %.loc15_17.1: %i32 = value_of_initializer %Get.call -// CHECK:STDOUT: %.loc15_17.2: %i32 = converted %Get.call, %.loc15_17.1 -// CHECK:STDOUT: return %.loc15_17.2 +// CHECK:STDOUT: %.loc18_17.1: %i32 = value_of_initializer %Get.call +// CHECK:STDOUT: %.loc18_17.2: %i32 = converted %Get.call, %.loc18_17.1 +// CHECK:STDOUT: return %.loc18_17.2 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @AddrMethodCall(%p.param: %ptr.f7c) -> %i32 { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %p.ref: %ptr.f7c = name_ref p, %p -// CHECK:STDOUT: %.loc19_12.1: ref %Class.247 = deref %p.ref -// CHECK:STDOUT: %.loc19_12.2: %GetAddr.type.be7 = specific_constant @Class.%GetAddr.decl, @Class(constants.%i32) [concrete = constants.%GetAddr.909] -// CHECK:STDOUT: %GetAddr.ref: %GetAddr.type.be7 = name_ref GetAddr, %.loc19_12.2 [concrete = constants.%GetAddr.909] -// CHECK:STDOUT: %GetAddr.bound: = bound_method %.loc19_12.1, %GetAddr.ref +// CHECK:STDOUT: %.loc24_12.1: ref %Class.247 = deref %p.ref +// CHECK:STDOUT: %.loc24_12.2: %GetAddr.type.be7 = specific_constant @Class.%GetAddr.decl, @Class(constants.%i32) [concrete = constants.%GetAddr.909] +// CHECK:STDOUT: %GetAddr.ref: %GetAddr.type.be7 = name_ref GetAddr, %.loc24_12.2 [concrete = constants.%GetAddr.909] +// CHECK:STDOUT: %GetAddr.bound: = bound_method %.loc24_12.1, %GetAddr.ref // CHECK:STDOUT: %GetAddr.specific_fn: = specific_function %GetAddr.ref, @GetAddr(constants.%i32) [concrete = constants.%GetAddr.specific_fn] -// CHECK:STDOUT: %bound_method: = bound_method %.loc19_12.1, %GetAddr.specific_fn -// CHECK:STDOUT: %addr: %ptr.f7c = addr_of %.loc19_12.1 +// CHECK:STDOUT: %bound_method: = bound_method %.loc24_12.1, %GetAddr.specific_fn +// CHECK:STDOUT: %addr: %ptr.f7c = addr_of %.loc24_12.1 // CHECK:STDOUT: %GetAddr.call: init %ptr.235 = call %bound_method(%addr) -// CHECK:STDOUT: %.loc19_22.1: %ptr.235 = value_of_initializer %GetAddr.call -// CHECK:STDOUT: %.loc19_22.2: %ptr.235 = converted %GetAddr.call, %.loc19_22.1 -// CHECK:STDOUT: %.loc19_10.1: ref %i32 = deref %.loc19_22.2 -// CHECK:STDOUT: %.loc19_10.2: %i32 = bind_value %.loc19_10.1 -// CHECK:STDOUT: return %.loc19_10.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Class(constants.%T) { -// CHECK:STDOUT: %T.loc2_13.2 => constants.%T -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%require_complete.4ae -// CHECK:STDOUT: %Class => constants.%Class.fe1 -// CHECK:STDOUT: %Class.elem => constants.%Class.elem.e26 -// CHECK:STDOUT: %Get.type => constants.%Get.type.fd9 -// CHECK:STDOUT: %Get => constants.%Get.cf9 -// CHECK:STDOUT: %GetAddr.type => constants.%GetAddr.type.402 -// CHECK:STDOUT: %GetAddr => constants.%GetAddr.102 -// CHECK:STDOUT: %struct_type.x.loc8_1.2 => constants.%struct_type.x.2ac -// CHECK:STDOUT: %complete_type.loc8_1.2 => constants.%complete_type.433 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Get(constants.%T) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %Class => constants.%Class.fe1 -// CHECK:STDOUT: %pattern_type.loc5_10 => constants.%pattern_type.3c1 -// CHECK:STDOUT: %pattern_type.loc5_24 => constants.%pattern_type.7dc -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @GetAddr(constants.%T) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %Class => constants.%Class.fe1 -// CHECK:STDOUT: %ptr.loc7_29.1 => constants.%ptr.955 -// CHECK:STDOUT: %pattern_type.loc7_19 => constants.%pattern_type.9e0 -// CHECK:STDOUT: %ptr.loc7_38.1 => constants.%ptr.79f -// CHECK:STDOUT: %pattern_type.loc7_34 => constants.%pattern_type.afe -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Class(constants.%i32) { -// CHECK:STDOUT: %T.loc2_13.2 => constants.%i32 -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%complete_type.f8a -// CHECK:STDOUT: %Class => constants.%Class.247 -// CHECK:STDOUT: %Class.elem => constants.%Class.elem.2d8 -// CHECK:STDOUT: %Get.type => constants.%Get.type.59d -// CHECK:STDOUT: %Get => constants.%Get.a40 -// CHECK:STDOUT: %GetAddr.type => constants.%GetAddr.type.be7 -// CHECK:STDOUT: %GetAddr => constants.%GetAddr.909 -// CHECK:STDOUT: %struct_type.x.loc8_1.2 => constants.%struct_type.x.ed6 -// CHECK:STDOUT: %complete_type.loc8_1.2 => constants.%complete_type.1ec -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Get(constants.%i32) { -// CHECK:STDOUT: %T => constants.%i32 -// CHECK:STDOUT: %Class => constants.%Class.247 -// CHECK:STDOUT: %pattern_type.loc5_10 => constants.%pattern_type.0fa -// CHECK:STDOUT: %pattern_type.loc5_24 => constants.%pattern_type.7ce -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete.loc5_14 => constants.%complete_type.1ec -// CHECK:STDOUT: %Class.elem => constants.%Class.elem.2d8 -// CHECK:STDOUT: %require_complete.loc5_42 => constants.%complete_type.f8a -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @GetAddr(constants.%i32) { -// CHECK:STDOUT: %T => constants.%i32 -// CHECK:STDOUT: %Class => constants.%Class.247 -// CHECK:STDOUT: %ptr.loc7_29.1 => constants.%ptr.f7c -// CHECK:STDOUT: %pattern_type.loc7_19 => constants.%pattern_type.14a -// CHECK:STDOUT: %ptr.loc7_38.1 => constants.%ptr.235 -// CHECK:STDOUT: %pattern_type.loc7_34 => constants.%pattern_type.fe8 -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete.loc7_34 => constants.%complete_type.3d0 -// CHECK:STDOUT: %require_complete.loc7_23 => constants.%complete_type.6ee -// CHECK:STDOUT: %require_complete.loc7_54 => constants.%complete_type.1ec -// CHECK:STDOUT: %Class.elem => constants.%Class.elem.2d8 +// CHECK:STDOUT: %.loc24_22.1: %ptr.235 = value_of_initializer %GetAddr.call +// CHECK:STDOUT: %.loc24_22.2: %ptr.235 = converted %GetAddr.call, %.loc24_22.1 +// CHECK:STDOUT: %.loc24_10.1: ref %i32 = deref %.loc24_22.2 +// CHECK:STDOUT: %.loc24_10.2: %i32 = bind_value %.loc24_10.1 +// CHECK:STDOUT: return %.loc24_10.2 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- static_member_fn_call.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { // CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] // CHECK:STDOUT: %Class.type: type = generic_class_type @Class [concrete] // CHECK:STDOUT: %Class.generic: %Class.type = struct_value () [concrete] // CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T) [symbolic] // CHECK:STDOUT: %pattern_type.3c1: type = pattern_type %Class [symbolic] // CHECK:STDOUT: %Make.type: type = fn_type @Make, @Class(%T) [symbolic] // CHECK:STDOUT: %Make: %Make.type = struct_value () [symbolic] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] // CHECK:STDOUT: %require_complete: = require_complete_type %Class [symbolic] -// CHECK:STDOUT: %Class.val: %Class = struct_value () [symbolic] -// CHECK:STDOUT: %StaticMemberFunctionCall.type: type = fn_type @StaticMemberFunctionCall [concrete] -// CHECK:STDOUT: %StaticMemberFunctionCall: %StaticMemberFunctionCall.type = struct_value () [concrete] // CHECK:STDOUT: %Make.specific_fn: = specific_function %Make, @Make(%T) [symbolic] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Class = %Class.decl -// CHECK:STDOUT: .StaticMemberFunctionCall = %StaticMemberFunctionCall.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Class.decl: %Class.type = class_decl @Class [concrete = constants.%Class.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc4_13.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_13.2 (constants.%T)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %StaticMemberFunctionCall.decl: %StaticMemberFunctionCall.type = fn_decl @StaticMemberFunctionCall [concrete = constants.%StaticMemberFunctionCall] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: %return.patt: @StaticMemberFunctionCall.%pattern_type (%pattern_type.3c1) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @StaticMemberFunctionCall.%pattern_type (%pattern_type.3c1) = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %Class.ref.loc8: %Class.type = name_ref Class, file.%Class.decl [concrete = constants.%Class.generic] -// CHECK:STDOUT: %T.ref.loc8: type = name_ref T, %T.loc8_29.1 [symbolic = %T.loc8_29.2 (constants.%T)] -// CHECK:STDOUT: %Class.loc8_49.1: type = class_type @Class, @Class(constants.%T) [symbolic = %Class.loc8_49.2 (constants.%Class)] -// CHECK:STDOUT: %T.loc8_29.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc8_29.2 (constants.%T)] -// CHECK:STDOUT: %return.param: ref @StaticMemberFunctionCall.%Class.loc8_49.2 (%Class) = out_param call_param0 -// CHECK:STDOUT: %return: ref @StaticMemberFunctionCall.%Class.loc8_49.2 (%Class) = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Class(%T.loc4_13.1: type) { -// CHECK:STDOUT: %T.loc4_13.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_13.2 (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %Make.type: type = fn_type @Make, @Class(%T.loc4_13.2) [symbolic = %Make.type (constants.%Make.type)] -// CHECK:STDOUT: %Make: @Class.%Make.type (%Make.type) = struct_value () [symbolic = %Make (constants.%Make)] -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %Make.decl: @Class.%Make.type (%Make.type) = fn_decl @Make [symbolic = @Class.%Make (constants.%Make)] { -// CHECK:STDOUT: %return.patt: @Make.%pattern_type (%pattern_type.3c1) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @Make.%pattern_type (%pattern_type.3c1) = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %Class.ref: %Class.type = name_ref Class, file.%Class.decl [concrete = constants.%Class.generic] -// CHECK:STDOUT: %T.ref: type = name_ref T, @Class.%T.loc4_13.1 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %Class.loc5_23.2: type = class_type @Class, @Class(constants.%T) [symbolic = %Class.loc5_23.1 (constants.%Class)] -// CHECK:STDOUT: %return.param: ref @Make.%Class.loc5_23.1 (%Class) = out_param call_param0 -// CHECK:STDOUT: %return: ref @Make.%Class.loc5_23.1 (%Class) = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Class -// CHECK:STDOUT: .Class = -// CHECK:STDOUT: .T = -// CHECK:STDOUT: .Make = %Make.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @Make(@Class.%T.loc4_13.1: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %Class.loc5_23.1: type = class_type @Class, @Class(%T) [symbolic = %Class.loc5_23.1 (constants.%Class)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %Class.loc5_23.1 [symbolic = %pattern_type (constants.%pattern_type.3c1)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %Class.loc5_23.1 [symbolic = %require_complete (constants.%require_complete)] -// CHECK:STDOUT: %Class.val: @Make.%Class.loc5_23.1 (%Class) = struct_value () [symbolic = %Class.val (constants.%Class.val)] -// CHECK:STDOUT: -// CHECK:STDOUT: fn() -> %return.param: @Make.%Class.loc5_23.1 (%Class) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %.loc5_35.1: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %.loc5_35.2: init @Make.%Class.loc5_23.1 (%Class) = class_init (), %return [symbolic = %Class.val (constants.%Class.val)] -// CHECK:STDOUT: %.loc5_36: init @Make.%Class.loc5_23.1 (%Class) = converted %.loc5_35.1, %.loc5_35.2 [symbolic = %Class.val (constants.%Class.val)] -// CHECK:STDOUT: return %.loc5_36 to %return -// CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @StaticMemberFunctionCall(%T.loc8_29.1: type) { -// CHECK:STDOUT: %T.loc8_29.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc8_29.2 (constants.%T)] -// CHECK:STDOUT: %Class.loc8_49.2: type = class_type @Class, @Class(%T.loc8_29.2) [symbolic = %Class.loc8_49.2 (constants.%Class)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %Class.loc8_49.2 [symbolic = %pattern_type (constants.%pattern_type.3c1)] +// CHECK:STDOUT: // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %require_complete: = require_complete_type %Class.loc8_49.2 [symbolic = %require_complete (constants.%require_complete)] // CHECK:STDOUT: %Make.type: type = fn_type @Make, @Class(%T.loc8_29.2) [symbolic = %Make.type (constants.%Make.type)] // CHECK:STDOUT: %Make: @StaticMemberFunctionCall.%Make.type (%Make.type) = struct_value () [symbolic = %Make (constants.%Make)] -// CHECK:STDOUT: %Make.specific_fn.loc9_18.2: = specific_function %Make, @Make(%T.loc8_29.2) [symbolic = %Make.specific_fn.loc9_18.2 (constants.%Make.specific_fn)] +// CHECK:STDOUT: %Make.specific_fn.loc10_18.2: = specific_function %Make, @Make(%T.loc8_29.2) [symbolic = %Make.specific_fn.loc10_18.2 (constants.%Make.specific_fn)] // CHECK:STDOUT: // CHECK:STDOUT: fn() -> %return.param: @StaticMemberFunctionCall.%Class.loc8_49.2 (%Class) { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %Class.ref.loc9: %Class.type = name_ref Class, file.%Class.decl [concrete = constants.%Class.generic] -// CHECK:STDOUT: %T.ref.loc9: type = name_ref T, %T.loc8_29.1 [symbolic = %T.loc8_29.2 (constants.%T)] -// CHECK:STDOUT: %Class.loc9: type = class_type @Class, @Class(constants.%T) [symbolic = %Class.loc8_49.2 (constants.%Class)] -// CHECK:STDOUT: %.loc9: @StaticMemberFunctionCall.%Make.type (%Make.type) = specific_constant @Class.%Make.decl, @Class(constants.%T) [symbolic = %Make (constants.%Make)] -// CHECK:STDOUT: %Make.ref: @StaticMemberFunctionCall.%Make.type (%Make.type) = name_ref Make, %.loc9 [symbolic = %Make (constants.%Make)] -// CHECK:STDOUT: %Make.specific_fn.loc9_18.1: = specific_function %Make.ref, @Make(constants.%T) [symbolic = %Make.specific_fn.loc9_18.2 (constants.%Make.specific_fn)] -// CHECK:STDOUT: %.loc8: ref @StaticMemberFunctionCall.%Class.loc8_49.2 (%Class) = splice_block %return {} -// CHECK:STDOUT: %Make.call: init @StaticMemberFunctionCall.%Class.loc8_49.2 (%Class) = call %Make.specific_fn.loc9_18.1() to %.loc8 +// CHECK:STDOUT: %Class.ref.loc10: %Class.type = name_ref Class, file.%Class.decl [concrete = constants.%Class.generic] +// CHECK:STDOUT: %T.ref.loc10: type = name_ref T, %T.loc8_29.1 [symbolic = %T.loc8_29.2 (constants.%T)] +// CHECK:STDOUT: %Class.loc10: type = class_type @Class, @Class(constants.%T) [symbolic = %Class.loc8_49.2 (constants.%Class)] +// CHECK:STDOUT: %.loc10: @StaticMemberFunctionCall.%Make.type (%Make.type) = specific_constant @Class.%Make.decl, @Class(constants.%T) [symbolic = %Make (constants.%Make)] +// CHECK:STDOUT: %Make.ref: @StaticMemberFunctionCall.%Make.type (%Make.type) = name_ref Make, %.loc10 [symbolic = %Make (constants.%Make)] +// CHECK:STDOUT: %Make.specific_fn.loc10_18.1: = specific_function %Make.ref, @Make(constants.%T) [symbolic = %Make.specific_fn.loc10_18.2 (constants.%Make.specific_fn)] +// CHECK:STDOUT: +// CHECK:STDOUT: %Make.call: init @StaticMemberFunctionCall.%Class.loc8_49.2 (%Class) = call %Make.specific_fn.loc10_18.1() to %.loc8 // CHECK:STDOUT: return %Make.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Class(constants.%T) { -// CHECK:STDOUT: %T.loc4_13.2 => constants.%T -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %Make.type => constants.%Make.type -// CHECK:STDOUT: %Make => constants.%Make -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Make(constants.%T) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %Class.loc5_23.1 => constants.%Class -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.3c1 -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%require_complete -// CHECK:STDOUT: %Class.val => constants.%Class.val -// CHECK:STDOUT: } -// CHECK:STDOUT: // CHECK:STDOUT: specific @StaticMemberFunctionCall(constants.%T) { // CHECK:STDOUT: %T.loc8_29.2 => constants.%T // CHECK:STDOUT: %Class.loc8_49.2 => constants.%Class diff --git a/toolchain/check/testdata/class/generic/member_inline.carbon b/toolchain/check/testdata/class/generic/member_inline.carbon index b03ac704bc204..7acf422e3dec1 100644 --- a/toolchain/check/testdata/class/generic/member_inline.carbon +++ b/toolchain/check/testdata/class/generic/member_inline.carbon @@ -2,6 +2,8 @@ // Exceptions. See /LICENSE for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// // AUTOUPDATE // TIP: To test this file alone, run: // TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/generic/member_inline.carbon @@ -14,11 +16,15 @@ library "member_inline.carbon"; class Class(T:! type) { fn F(n: T) -> T { + //@dump-sem-ir-begin return n; + //@dump-sem-ir-end } fn G[self: Self]() -> T { + //@dump-sem-ir-begin return self.n; + //@dump-sem-ir-end } var n: T; @@ -43,9 +49,6 @@ class C(T:! type) { // CHECK:STDOUT: // CHECK:STDOUT: constants { // CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] -// CHECK:STDOUT: %Class.type: type = generic_class_type @Class [concrete] -// CHECK:STDOUT: %Class.generic: %Class.type = struct_value () [concrete] // CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T) [symbolic] // CHECK:STDOUT: %pattern_type.7dc: type = pattern_type %T [symbolic] // CHECK:STDOUT: %F.type: type = fn_type @F, @Class(%T) [symbolic] @@ -57,94 +60,35 @@ class C(T:! type) { // CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %T [symbolic] // CHECK:STDOUT: %struct_type.n: type = struct_type {.n: %T} [symbolic] // CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.n [symbolic] -// CHECK:STDOUT: %require_complete.4f8: = require_complete_type %Class [symbolic] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Class = %Class.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Class.decl: %Class.type = class_decl @Class [concrete = constants.%Class.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc4_13.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_13.2 (constants.%T)] -// CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic class @Class(%T.loc4_13.1: type) { -// CHECK:STDOUT: %T.loc4_13.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_13.2 (constants.%T)] +// CHECK:STDOUT: // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %F.type: type = fn_type @F, @Class(%T.loc4_13.2) [symbolic = %F.type (constants.%F.type)] -// CHECK:STDOUT: %F: @Class.%F.type (%F.type) = struct_value () [symbolic = %F (constants.%F)] -// CHECK:STDOUT: %G.type: type = fn_type @G, @Class(%T.loc4_13.2) [symbolic = %G.type (constants.%G.type)] -// CHECK:STDOUT: %G: @Class.%G.type (%G.type) = struct_value () [symbolic = %G (constants.%G)] -// CHECK:STDOUT: %require_complete: = require_complete_type %T.loc4_13.2 [symbolic = %require_complete (constants.%require_complete.4ae)] -// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T.loc4_13.2) [symbolic = %Class (constants.%Class)] -// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %T.loc4_13.2 [symbolic = %Class.elem (constants.%Class.elem)] -// CHECK:STDOUT: %struct_type.n.loc14_1.2: type = struct_type {.n: @Class.%T.loc4_13.2 (%T)} [symbolic = %struct_type.n.loc14_1.2 (constants.%struct_type.n)] -// CHECK:STDOUT: %complete_type.loc14_1.2: = complete_type_witness %struct_type.n.loc14_1.2 [symbolic = %complete_type.loc14_1.2 (constants.%complete_type)] +// CHECK:STDOUT: // CHECK:STDOUT: // CHECK:STDOUT: class { -// CHECK:STDOUT: %F.decl: @Class.%F.type (%F.type) = fn_decl @F [symbolic = @Class.%F (constants.%F)] { -// CHECK:STDOUT: %n.patt: @F.%pattern_type (%pattern_type.7dc) = binding_pattern n [concrete] -// CHECK:STDOUT: %n.param_patt: @F.%pattern_type (%pattern_type.7dc) = value_param_pattern %n.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: @F.%pattern_type (%pattern_type.7dc) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @F.%pattern_type (%pattern_type.7dc) = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref.loc5_17: type = name_ref T, @Class.%T.loc4_13.1 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %n.param: @F.%T (%T) = value_param call_param0 -// CHECK:STDOUT: %T.ref.loc5_11: type = name_ref T, @Class.%T.loc4_13.1 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %n: @F.%T (%T) = bind_name n, %n.param -// CHECK:STDOUT: %return.param: ref @F.%T (%T) = out_param call_param1 -// CHECK:STDOUT: %return: ref @F.%T (%T) = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %G.decl: @Class.%G.type (%G.type) = fn_decl @G [symbolic = @Class.%G (constants.%G)] { -// CHECK:STDOUT: %self.patt: @G.%pattern_type.loc9_8 (%pattern_type.3c1) = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: @G.%pattern_type.loc9_8 (%pattern_type.3c1) = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: @G.%pattern_type.loc9_22 (%pattern_type.7dc) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @G.%pattern_type.loc9_22 (%pattern_type.7dc) = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref: type = name_ref T, @Class.%T.loc4_13.1 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %self.param: @G.%Class (%Class) = value_param call_param0 -// CHECK:STDOUT: %.loc9_14.1: type = splice_block %Self.ref [symbolic = %Class (constants.%Class)] { -// CHECK:STDOUT: %.loc9_14.2: type = specific_constant constants.%Class, @Class(constants.%T) [symbolic = %Class (constants.%Class)] -// CHECK:STDOUT: %Self.ref: type = name_ref Self, %.loc9_14.2 [symbolic = %Class (constants.%Class)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self: @G.%Class (%Class) = bind_name self, %self.param -// CHECK:STDOUT: %return.param: ref @G.%T (%T) = out_param call_param1 -// CHECK:STDOUT: %return: ref @G.%T (%T) = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc4_13.1 [symbolic = %T.loc4_13.2 (constants.%T)] -// CHECK:STDOUT: %.loc13: @Class.%Class.elem (%Class.elem) = field_decl n, element0 [concrete] -// CHECK:STDOUT: %struct_type.n.loc14_1.1: type = struct_type {.n: %T} [symbolic = %struct_type.n.loc14_1.2 (constants.%struct_type.n)] -// CHECK:STDOUT: %complete_type.loc14_1.1: = complete_type_witness %struct_type.n.loc14_1.1 [symbolic = %complete_type.loc14_1.2 (constants.%complete_type)] -// CHECK:STDOUT: complete_type_witness = %complete_type.loc14_1.1 +// CHECK:STDOUT: +// CHECK:STDOUT: complete_type_witness = %complete_type.loc18_1.1 // CHECK:STDOUT: // CHECK:STDOUT: !members: // CHECK:STDOUT: .Self = constants.%Class // CHECK:STDOUT: .T = // CHECK:STDOUT: .F = %F.decl // CHECK:STDOUT: .G = %G.decl -// CHECK:STDOUT: .n = %.loc13 +// CHECK:STDOUT: .n = %.loc17 // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @F(@Class.%T.loc4_13.1: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %T [symbolic = %pattern_type (constants.%pattern_type.7dc)] +// CHECK:STDOUT: // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %T [symbolic = %require_complete (constants.%require_complete.4ae)] +// CHECK:STDOUT: // CHECK:STDOUT: // CHECK:STDOUT: fn(%n.param: @F.%T (%T)) -> @F.%T (%T) { // CHECK:STDOUT: !entry: @@ -154,23 +98,20 @@ class C(T:! type) { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @G(@Class.%T.loc4_13.1: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T) [symbolic = %Class (constants.%Class)] -// CHECK:STDOUT: %pattern_type.loc9_8: type = pattern_type %Class [symbolic = %pattern_type.loc9_8 (constants.%pattern_type.3c1)] -// CHECK:STDOUT: %pattern_type.loc9_22: type = pattern_type %T [symbolic = %pattern_type.loc9_22 (constants.%pattern_type.7dc)] +// CHECK:STDOUT: // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete.loc9: = require_complete_type %Class [symbolic = %require_complete.loc9 (constants.%require_complete.4f8)] +// CHECK:STDOUT: // CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %T [symbolic = %Class.elem (constants.%Class.elem)] -// CHECK:STDOUT: %require_complete.loc10: = require_complete_type %T [symbolic = %require_complete.loc10 (constants.%require_complete.4ae)] +// CHECK:STDOUT: %require_complete.loc13: = require_complete_type %T [symbolic = %require_complete.loc13 (constants.%require_complete.4ae)] // CHECK:STDOUT: // CHECK:STDOUT: fn(%self.param: @G.%Class (%Class)) -> @G.%T (%T) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %self.ref: @G.%Class (%Class) = name_ref self, %self -// CHECK:STDOUT: %n.ref: @G.%Class.elem (%Class.elem) = name_ref n, @Class.%.loc13 [concrete = @Class.%.loc13] -// CHECK:STDOUT: %.loc10_16.1: ref @G.%T (%T) = class_element_access %self.ref, element0 -// CHECK:STDOUT: %.loc10_16.2: @G.%T (%T) = bind_value %.loc10_16.1 -// CHECK:STDOUT: return %.loc10_16.2 +// CHECK:STDOUT: %n.ref: @G.%Class.elem (%Class.elem) = name_ref n, @Class.%.loc17 [concrete = @Class.%.loc17] +// CHECK:STDOUT: %.loc13_16.1: ref @G.%T (%T) = class_element_access %self.ref, element0 +// CHECK:STDOUT: %.loc13_16.2: @G.%T (%T) = bind_value %.loc13_16.1 +// CHECK:STDOUT: return %.loc13_16.2 // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -185,8 +126,8 @@ class C(T:! type) { // CHECK:STDOUT: %require_complete => constants.%require_complete.4ae // CHECK:STDOUT: %Class => constants.%Class // CHECK:STDOUT: %Class.elem => constants.%Class.elem -// CHECK:STDOUT: %struct_type.n.loc14_1.2 => constants.%struct_type.n -// CHECK:STDOUT: %complete_type.loc14_1.2 => constants.%complete_type +// CHECK:STDOUT: %struct_type.n.loc18_1.2 => constants.%struct_type.n +// CHECK:STDOUT: %complete_type.loc18_1.2 => constants.%complete_type // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @F(constants.%T) { @@ -197,93 +138,7 @@ class C(T:! type) { // CHECK:STDOUT: specific @G(constants.%T) { // CHECK:STDOUT: %T => constants.%T // CHECK:STDOUT: %Class => constants.%Class -// CHECK:STDOUT: %pattern_type.loc9_8 => constants.%pattern_type.3c1 -// CHECK:STDOUT: %pattern_type.loc9_22 => constants.%pattern_type.7dc -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_member_inline.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type: type = pattern_type type [concrete] -// CHECK:STDOUT: %C.type: type = generic_class_type @C [concrete] -// CHECK:STDOUT: %C.generic: %C.type = struct_value () [concrete] -// CHECK:STDOUT: %C: type = class_type @C, @C(%T) [symbolic] -// CHECK:STDOUT: %F.type: type = fn_type @F, @C(%T) [symbolic] -// CHECK:STDOUT: %F: %F.type = struct_value () [symbolic] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %C.elem: type = unbound_element_type %C, %empty_struct_type [symbolic] -// CHECK:STDOUT: %struct_type.data: type = struct_type {.data: %empty_struct_type} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.data [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } +// CHECK:STDOUT: %pattern_type.loc11_8 => constants.%pattern_type.3c1 +// CHECK:STDOUT: %pattern_type.loc11_22 => constants.%pattern_type.7dc // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %C.decl: %C.type = class_decl @C [concrete = constants.%C.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc4_9.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_9.2 (constants.%T)] -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @C(%T.loc4_9.1: type) { -// CHECK:STDOUT: %T.loc4_9.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_9.2 (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %F.type: type = fn_type @F, @C(%T.loc4_9.2) [symbolic = %F.type (constants.%F.type)] -// CHECK:STDOUT: %F: @C.%F.type (%F.type) = struct_value () [symbolic = %F (constants.%F)] -// CHECK:STDOUT: %C: type = class_type @C, @C(%T.loc4_9.2) [symbolic = %C (constants.%C)] -// CHECK:STDOUT: %C.elem: type = unbound_element_type %C, constants.%empty_struct_type [symbolic = %C.elem (constants.%C.elem)] -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %F.decl: @C.%F.type (%F.type) = fn_decl @F [symbolic = @C.%F (constants.%F)] {} {} -// CHECK:STDOUT: %.loc12_14.1: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %.loc12_14.2: type = converted %.loc12_14.1, constants.%empty_struct_type [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %.loc12_11: @C.%C.elem (%C.elem) = field_decl data, element0 [concrete] -// CHECK:STDOUT: %struct_type.data: type = struct_type {.data: %empty_struct_type} [concrete = constants.%struct_type.data] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.data [concrete = constants.%complete_type] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%C -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: .data = %.loc12_11 -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @F(@C.%T.loc4_9.1: type) { -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %C: type = class_type @C, @C(%T) [symbolic = %C (constants.%C)] -// CHECK:STDOUT: %C.elem: type = unbound_element_type %C, constants.%empty_struct_type [symbolic = %C.elem (constants.%C.elem)] -// CHECK:STDOUT: -// CHECK:STDOUT: fn() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %data.ref: @F.%C.elem (%C.elem) = name_ref data, @C.%.loc12_11 [concrete = @C.%.loc12_11] -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @C(constants.%T) { -// CHECK:STDOUT: %T.loc4_9.2 => constants.%T -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %F.type => constants.%F.type -// CHECK:STDOUT: %F => constants.%F -// CHECK:STDOUT: %C => constants.%C -// CHECK:STDOUT: %C.elem => constants.%C.elem -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @F(constants.%T) {} -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/generic/member_lookup.carbon b/toolchain/check/testdata/class/generic/member_lookup.carbon index 7e8ae966be890..b669365597922 100644 --- a/toolchain/check/testdata/class/generic/member_lookup.carbon +++ b/toolchain/check/testdata/class/generic/member_lookup.carbon @@ -2,6 +2,8 @@ // Exceptions. See /LICENSE for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// // AUTOUPDATE // TIP: To test this file alone, run: // TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/generic/member_lookup.carbon @@ -22,15 +24,21 @@ class Derived(T:! type) { } fn AccessDerived[T:! type](x: Derived(T)) -> T { + //@dump-sem-ir-begin return x.d; + //@dump-sem-ir-end } fn AccessBase[T:! type](x: Derived(T)) -> T { + //@dump-sem-ir-begin return x.b; + //@dump-sem-ir-end } fn AccessConcrete(x: Derived(i32)) -> i32 { + //@dump-sem-ir-begin return x.b; + //@dump-sem-ir-end } // --- fail_no_member.carbon @@ -74,240 +82,61 @@ fn AccessMissingConcrete(x: Derived(i32)) -> i32 { // CHECK:STDOUT: // CHECK:STDOUT: constants { // CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] -// CHECK:STDOUT: %Base.type: type = generic_class_type @Base [concrete] -// CHECK:STDOUT: %Base.generic: %Base.type = struct_value () [concrete] // CHECK:STDOUT: %Base.370: type = class_type @Base, @Base(%T) [symbolic] // CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T [symbolic] // CHECK:STDOUT: %Base.elem.9af: type = unbound_element_type %Base.370, %T [symbolic] -// CHECK:STDOUT: %struct_type.b.f69: type = struct_type {.b: %T} [symbolic] -// CHECK:STDOUT: %complete_type.eaf: = complete_type_witness %struct_type.b.f69 [symbolic] -// CHECK:STDOUT: %Derived.type: type = generic_class_type @Derived [concrete] -// CHECK:STDOUT: %Derived.generic: %Derived.type = struct_value () [concrete] // CHECK:STDOUT: %Derived.85c: type = class_type @Derived, @Derived(%T) [symbolic] // CHECK:STDOUT: %require_complete.97d: = require_complete_type %Base.370 [symbolic] -// CHECK:STDOUT: %Derived.elem.8b3: type = unbound_element_type %Derived.85c, %Base.370 [symbolic] // CHECK:STDOUT: %Derived.elem.6d2: type = unbound_element_type %Derived.85c, %T [symbolic] -// CHECK:STDOUT: %struct_type.base.d.37c: type = struct_type {.base: %Base.370, .d: %T} [symbolic] -// CHECK:STDOUT: %complete_type.8ad: = complete_type_witness %struct_type.base.d.37c [symbolic] // CHECK:STDOUT: %pattern_type.423: type = pattern_type %Derived.85c [symbolic] // CHECK:STDOUT: %pattern_type.7dc: type = pattern_type %T [symbolic] -// CHECK:STDOUT: %AccessDerived.type: type = fn_type @AccessDerived [concrete] -// CHECK:STDOUT: %AccessDerived: %AccessDerived.type = struct_value () [concrete] -// CHECK:STDOUT: %require_complete.5f4: = require_complete_type %Derived.85c [symbolic] -// CHECK:STDOUT: %AccessBase.type: type = fn_type @AccessBase [concrete] -// CHECK:STDOUT: %AccessBase: %AccessBase.type = struct_value () [concrete] // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %Derived.115: type = class_type @Derived, @Derived(%i32) [concrete] -// CHECK:STDOUT: %pattern_type.9c5: type = pattern_type %Derived.115 [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %AccessConcrete.type: type = fn_type @AccessConcrete [concrete] -// CHECK:STDOUT: %AccessConcrete: %AccessConcrete.type = struct_value () [concrete] -// CHECK:STDOUT: %i32.builtin: type = int_type signed, %int_32 [concrete] -// CHECK:STDOUT: %complete_type.f8a: = complete_type_witness %i32.builtin [concrete] // CHECK:STDOUT: %Base.10a: type = class_type @Base, @Base(%i32) [concrete] // CHECK:STDOUT: %Base.elem.a98: type = unbound_element_type %Base.10a, %i32 [concrete] -// CHECK:STDOUT: %struct_type.b.0a3: type = struct_type {.b: %i32} [concrete] -// CHECK:STDOUT: %complete_type.ba8: = complete_type_witness %struct_type.b.0a3 [concrete] -// CHECK:STDOUT: %Derived.elem.0c4: type = unbound_element_type %Derived.115, %Base.10a [concrete] -// CHECK:STDOUT: %Derived.elem.b58: type = unbound_element_type %Derived.115, %i32 [concrete] -// CHECK:STDOUT: %struct_type.base.d.ffa: type = struct_type {.base: %Base.10a, .d: %i32} [concrete] -// CHECK:STDOUT: %complete_type.544: = complete_type_witness %struct_type.base.d.ffa [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Base = %Base.decl -// CHECK:STDOUT: .Derived = %Derived.decl -// CHECK:STDOUT: .AccessDerived = %AccessDerived.decl -// CHECK:STDOUT: .AccessBase = %AccessBase.decl -// CHECK:STDOUT: .AccessConcrete = %AccessConcrete.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Base.decl: %Base.type = class_decl @Base [concrete = constants.%Base.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc4_17.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_17.2 (constants.%T)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %Derived.decl: %Derived.type = class_decl @Derived [concrete = constants.%Derived.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc8_15.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc8_15.2 (constants.%T)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %AccessDerived.decl: %AccessDerived.type = fn_decl @AccessDerived [concrete = constants.%AccessDerived] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: %x.patt: @AccessDerived.%pattern_type.loc13_28 (%pattern_type.423) = binding_pattern x [concrete] -// CHECK:STDOUT: %x.param_patt: @AccessDerived.%pattern_type.loc13_28 (%pattern_type.423) = value_param_pattern %x.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: @AccessDerived.%pattern_type.loc13_43 (%pattern_type.7dc) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @AccessDerived.%pattern_type.loc13_43 (%pattern_type.7dc) = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref.loc13_46: type = name_ref T, %T.loc13_18.1 [symbolic = %T.loc13_18.2 (constants.%T)] -// CHECK:STDOUT: %T.loc13_18.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc13_18.2 (constants.%T)] -// CHECK:STDOUT: %x.param: @AccessDerived.%Derived.loc13_40.2 (%Derived.85c) = value_param call_param0 -// CHECK:STDOUT: %.loc13: type = splice_block %Derived.loc13_40.1 [symbolic = %Derived.loc13_40.2 (constants.%Derived.85c)] { -// CHECK:STDOUT: %Derived.ref: %Derived.type = name_ref Derived, file.%Derived.decl [concrete = constants.%Derived.generic] -// CHECK:STDOUT: %T.ref.loc13_39: type = name_ref T, %T.loc13_18.1 [symbolic = %T.loc13_18.2 (constants.%T)] -// CHECK:STDOUT: %Derived.loc13_40.1: type = class_type @Derived, @Derived(constants.%T) [symbolic = %Derived.loc13_40.2 (constants.%Derived.85c)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %x: @AccessDerived.%Derived.loc13_40.2 (%Derived.85c) = bind_name x, %x.param -// CHECK:STDOUT: %return.param: ref @AccessDerived.%T.loc13_18.2 (%T) = out_param call_param1 -// CHECK:STDOUT: %return: ref @AccessDerived.%T.loc13_18.2 (%T) = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %AccessBase.decl: %AccessBase.type = fn_decl @AccessBase [concrete = constants.%AccessBase] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: %x.patt: @AccessBase.%pattern_type.loc17_25 (%pattern_type.423) = binding_pattern x [concrete] -// CHECK:STDOUT: %x.param_patt: @AccessBase.%pattern_type.loc17_25 (%pattern_type.423) = value_param_pattern %x.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: @AccessBase.%pattern_type.loc17_40 (%pattern_type.7dc) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @AccessBase.%pattern_type.loc17_40 (%pattern_type.7dc) = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref.loc17_43: type = name_ref T, %T.loc17_15.1 [symbolic = %T.loc17_15.2 (constants.%T)] -// CHECK:STDOUT: %T.loc17_15.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc17_15.2 (constants.%T)] -// CHECK:STDOUT: %x.param: @AccessBase.%Derived.loc17_37.2 (%Derived.85c) = value_param call_param0 -// CHECK:STDOUT: %.loc17: type = splice_block %Derived.loc17_37.1 [symbolic = %Derived.loc17_37.2 (constants.%Derived.85c)] { -// CHECK:STDOUT: %Derived.ref: %Derived.type = name_ref Derived, file.%Derived.decl [concrete = constants.%Derived.generic] -// CHECK:STDOUT: %T.ref.loc17_36: type = name_ref T, %T.loc17_15.1 [symbolic = %T.loc17_15.2 (constants.%T)] -// CHECK:STDOUT: %Derived.loc17_37.1: type = class_type @Derived, @Derived(constants.%T) [symbolic = %Derived.loc17_37.2 (constants.%Derived.85c)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %x: @AccessBase.%Derived.loc17_37.2 (%Derived.85c) = bind_name x, %x.param -// CHECK:STDOUT: %return.param: ref @AccessBase.%T.loc17_15.2 (%T) = out_param call_param1 -// CHECK:STDOUT: %return: ref @AccessBase.%T.loc17_15.2 (%T) = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %AccessConcrete.decl: %AccessConcrete.type = fn_decl @AccessConcrete [concrete = constants.%AccessConcrete] { -// CHECK:STDOUT: %x.patt: %pattern_type.9c5 = binding_pattern x [concrete] -// CHECK:STDOUT: %x.param_patt: %pattern_type.9c5 = value_param_pattern %x.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32.loc21_39: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc21_39: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %x.param: %Derived.115 = value_param call_param0 -// CHECK:STDOUT: %.loc21: type = splice_block %Derived [concrete = constants.%Derived.115] { -// CHECK:STDOUT: %Derived.ref: %Derived.type = name_ref Derived, file.%Derived.decl [concrete = constants.%Derived.generic] -// CHECK:STDOUT: %int_32.loc21_30: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc21_30: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %Derived: type = class_type @Derived, @Derived(constants.%i32) [concrete = constants.%Derived.115] -// CHECK:STDOUT: } -// CHECK:STDOUT: %x: %Derived.115 = bind_name x, %x.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Base(%T.loc4_17.1: type) { -// CHECK:STDOUT: %T.loc4_17.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_17.2 (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %T.loc4_17.2 [symbolic = %require_complete (constants.%require_complete.4ae)] -// CHECK:STDOUT: %Base: type = class_type @Base, @Base(%T.loc4_17.2) [symbolic = %Base (constants.%Base.370)] -// CHECK:STDOUT: %Base.elem: type = unbound_element_type %Base, %T.loc4_17.2 [symbolic = %Base.elem (constants.%Base.elem.9af)] -// CHECK:STDOUT: %struct_type.b.loc6_1.2: type = struct_type {.b: @Base.%T.loc4_17.2 (%T)} [symbolic = %struct_type.b.loc6_1.2 (constants.%struct_type.b.f69)] -// CHECK:STDOUT: %complete_type.loc6_1.2: = complete_type_witness %struct_type.b.loc6_1.2 [symbolic = %complete_type.loc6_1.2 (constants.%complete_type.eaf)] -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc4_17.1 [symbolic = %T.loc4_17.2 (constants.%T)] -// CHECK:STDOUT: %.loc5: @Base.%Base.elem (%Base.elem.9af) = field_decl b, element0 [concrete] -// CHECK:STDOUT: %struct_type.b.loc6_1.1: type = struct_type {.b: %T} [symbolic = %struct_type.b.loc6_1.2 (constants.%struct_type.b.f69)] -// CHECK:STDOUT: %complete_type.loc6_1.1: = complete_type_witness %struct_type.b.loc6_1.1 [symbolic = %complete_type.loc6_1.2 (constants.%complete_type.eaf)] -// CHECK:STDOUT: complete_type_witness = %complete_type.loc6_1.1 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Base.370 -// CHECK:STDOUT: .T = -// CHECK:STDOUT: .b = %.loc5 -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Derived(%T.loc8_15.1: type) { -// CHECK:STDOUT: %T.loc8_15.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc8_15.2 (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %Base.loc9_22.2: type = class_type @Base, @Base(%T.loc8_15.2) [symbolic = %Base.loc9_22.2 (constants.%Base.370)] -// CHECK:STDOUT: %require_complete.loc9: = require_complete_type %Base.loc9_22.2 [symbolic = %require_complete.loc9 (constants.%require_complete.97d)] -// CHECK:STDOUT: %Derived: type = class_type @Derived, @Derived(%T.loc8_15.2) [symbolic = %Derived (constants.%Derived.85c)] -// CHECK:STDOUT: %Derived.elem.loc9: type = unbound_element_type %Derived, %Base.loc9_22.2 [symbolic = %Derived.elem.loc9 (constants.%Derived.elem.8b3)] -// CHECK:STDOUT: %require_complete.loc10: = require_complete_type %T.loc8_15.2 [symbolic = %require_complete.loc10 (constants.%require_complete.4ae)] -// CHECK:STDOUT: %Derived.elem.loc10: type = unbound_element_type %Derived, %T.loc8_15.2 [symbolic = %Derived.elem.loc10 (constants.%Derived.elem.6d2)] -// CHECK:STDOUT: %struct_type.base.d.loc11_1.2: type = struct_type {.base: @Derived.%Base.loc9_22.2 (%Base.370), .d: @Derived.%T.loc8_15.2 (%T)} [symbolic = %struct_type.base.d.loc11_1.2 (constants.%struct_type.base.d.37c)] -// CHECK:STDOUT: %complete_type.loc11_1.2: = complete_type_witness %struct_type.base.d.loc11_1.2 [symbolic = %complete_type.loc11_1.2 (constants.%complete_type.8ad)] -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %Base.ref: %Base.type = name_ref Base, file.%Base.decl [concrete = constants.%Base.generic] -// CHECK:STDOUT: %T.ref.loc9: type = name_ref T, %T.loc8_15.1 [symbolic = %T.loc8_15.2 (constants.%T)] -// CHECK:STDOUT: %Base.loc9_22.1: type = class_type @Base, @Base(constants.%T) [symbolic = %Base.loc9_22.2 (constants.%Base.370)] -// CHECK:STDOUT: %.loc9: @Derived.%Derived.elem.loc9 (%Derived.elem.8b3) = base_decl %Base.loc9_22.1, element0 [concrete] -// CHECK:STDOUT: %T.ref.loc10: type = name_ref T, %T.loc8_15.1 [symbolic = %T.loc8_15.2 (constants.%T)] -// CHECK:STDOUT: %.loc10: @Derived.%Derived.elem.loc10 (%Derived.elem.6d2) = field_decl d, element1 [concrete] -// CHECK:STDOUT: %struct_type.base.d.loc11_1.1: type = struct_type {.base: %Base.370, .d: %T} [symbolic = %struct_type.base.d.loc11_1.2 (constants.%struct_type.base.d.37c)] -// CHECK:STDOUT: %complete_type.loc11_1.1: = complete_type_witness %struct_type.base.d.loc11_1.1 [symbolic = %complete_type.loc11_1.2 (constants.%complete_type.8ad)] -// CHECK:STDOUT: complete_type_witness = %complete_type.loc11_1.1 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Derived.85c -// CHECK:STDOUT: .Base = -// CHECK:STDOUT: .T = -// CHECK:STDOUT: .base = %.loc9 -// CHECK:STDOUT: .d = %.loc10 -// CHECK:STDOUT: .b = -// CHECK:STDOUT: extend %Base.loc9_22.1 -// CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @AccessDerived(%T.loc13_18.1: type) { -// CHECK:STDOUT: %T.loc13_18.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc13_18.2 (constants.%T)] -// CHECK:STDOUT: %Derived.loc13_40.2: type = class_type @Derived, @Derived(%T.loc13_18.2) [symbolic = %Derived.loc13_40.2 (constants.%Derived.85c)] -// CHECK:STDOUT: %pattern_type.loc13_28: type = pattern_type %Derived.loc13_40.2 [symbolic = %pattern_type.loc13_28 (constants.%pattern_type.423)] -// CHECK:STDOUT: %pattern_type.loc13_43: type = pattern_type %T.loc13_18.2 [symbolic = %pattern_type.loc13_43 (constants.%pattern_type.7dc)] +// CHECK:STDOUT: // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete.loc13: = require_complete_type %Derived.loc13_40.2 [symbolic = %require_complete.loc13 (constants.%require_complete.5f4)] +// CHECK:STDOUT: // CHECK:STDOUT: %Derived.elem: type = unbound_element_type %Derived.loc13_40.2, %T.loc13_18.2 [symbolic = %Derived.elem (constants.%Derived.elem.6d2)] -// CHECK:STDOUT: %require_complete.loc14: = require_complete_type %T.loc13_18.2 [symbolic = %require_complete.loc14 (constants.%require_complete.4ae)] +// CHECK:STDOUT: %require_complete.loc15: = require_complete_type %T.loc13_18.2 [symbolic = %require_complete.loc15 (constants.%require_complete.4ae)] // CHECK:STDOUT: // CHECK:STDOUT: fn(%x.param: @AccessDerived.%Derived.loc13_40.2 (%Derived.85c)) -> @AccessDerived.%T.loc13_18.2 (%T) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %x.ref: @AccessDerived.%Derived.loc13_40.2 (%Derived.85c) = name_ref x, %x // CHECK:STDOUT: %d.ref: @AccessDerived.%Derived.elem (%Derived.elem.6d2) = name_ref d, @Derived.%.loc10 [concrete = @Derived.%.loc10] -// CHECK:STDOUT: %.loc14_11.1: ref @AccessDerived.%T.loc13_18.2 (%T) = class_element_access %x.ref, element1 -// CHECK:STDOUT: %.loc14_11.2: @AccessDerived.%T.loc13_18.2 (%T) = bind_value %.loc14_11.1 -// CHECK:STDOUT: return %.loc14_11.2 +// CHECK:STDOUT: %.loc15_11.1: ref @AccessDerived.%T.loc13_18.2 (%T) = class_element_access %x.ref, element1 +// CHECK:STDOUT: %.loc15_11.2: @AccessDerived.%T.loc13_18.2 (%T) = bind_value %.loc15_11.1 +// CHECK:STDOUT: return %.loc15_11.2 // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic fn @AccessBase(%T.loc17_15.1: type) { -// CHECK:STDOUT: %T.loc17_15.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc17_15.2 (constants.%T)] -// CHECK:STDOUT: %Derived.loc17_37.2: type = class_type @Derived, @Derived(%T.loc17_15.2) [symbolic = %Derived.loc17_37.2 (constants.%Derived.85c)] -// CHECK:STDOUT: %pattern_type.loc17_25: type = pattern_type %Derived.loc17_37.2 [symbolic = %pattern_type.loc17_25 (constants.%pattern_type.423)] -// CHECK:STDOUT: %pattern_type.loc17_40: type = pattern_type %T.loc17_15.2 [symbolic = %pattern_type.loc17_40 (constants.%pattern_type.7dc)] +// CHECK:STDOUT: generic fn @AccessBase(%T.loc19_15.1: type) { +// CHECK:STDOUT: // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete.loc17: = require_complete_type %Derived.loc17_37.2 [symbolic = %require_complete.loc17 (constants.%require_complete.5f4)] -// CHECK:STDOUT: %Base: type = class_type @Base, @Base(%T.loc17_15.2) [symbolic = %Base (constants.%Base.370)] -// CHECK:STDOUT: %require_complete.loc18_11: = require_complete_type %Base [symbolic = %require_complete.loc18_11 (constants.%require_complete.97d)] -// CHECK:STDOUT: %Base.elem: type = unbound_element_type %Base, %T.loc17_15.2 [symbolic = %Base.elem (constants.%Base.elem.9af)] -// CHECK:STDOUT: %require_complete.loc18_13: = require_complete_type %T.loc17_15.2 [symbolic = %require_complete.loc18_13 (constants.%require_complete.4ae)] +// CHECK:STDOUT: +// CHECK:STDOUT: %Base: type = class_type @Base, @Base(%T.loc19_15.2) [symbolic = %Base (constants.%Base.370)] +// CHECK:STDOUT: %require_complete.loc21_11: = require_complete_type %Base [symbolic = %require_complete.loc21_11 (constants.%require_complete.97d)] +// CHECK:STDOUT: %Base.elem: type = unbound_element_type %Base, %T.loc19_15.2 [symbolic = %Base.elem (constants.%Base.elem.9af)] +// CHECK:STDOUT: %require_complete.loc21_13: = require_complete_type %T.loc19_15.2 [symbolic = %require_complete.loc21_13 (constants.%require_complete.4ae)] // CHECK:STDOUT: -// CHECK:STDOUT: fn(%x.param: @AccessBase.%Derived.loc17_37.2 (%Derived.85c)) -> @AccessBase.%T.loc17_15.2 (%T) { +// CHECK:STDOUT: fn(%x.param: @AccessBase.%Derived.loc19_37.2 (%Derived.85c)) -> @AccessBase.%T.loc19_15.2 (%T) { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %x.ref: @AccessBase.%Derived.loc17_37.2 (%Derived.85c) = name_ref x, %x +// CHECK:STDOUT: %x.ref: @AccessBase.%Derived.loc19_37.2 (%Derived.85c) = name_ref x, %x // CHECK:STDOUT: %b.ref: @AccessBase.%Base.elem (%Base.elem.9af) = name_ref b, @Base.%.loc5 [concrete = @Base.%.loc5] -// CHECK:STDOUT: %.loc18_11.1: ref @AccessBase.%Base (%Base.370) = class_element_access %x.ref, element0 -// CHECK:STDOUT: %.loc18_11.2: ref @AccessBase.%Base (%Base.370) = converted %x.ref, %.loc18_11.1 -// CHECK:STDOUT: %.loc18_11.3: ref @AccessBase.%T.loc17_15.2 (%T) = class_element_access %.loc18_11.2, element0 -// CHECK:STDOUT: %.loc18_11.4: @AccessBase.%T.loc17_15.2 (%T) = bind_value %.loc18_11.3 -// CHECK:STDOUT: return %.loc18_11.4 +// CHECK:STDOUT: %.loc21_11.1: ref @AccessBase.%Base (%Base.370) = class_element_access %x.ref, element0 +// CHECK:STDOUT: %.loc21_11.2: ref @AccessBase.%Base (%Base.370) = converted %x.ref, %.loc21_11.1 +// CHECK:STDOUT: %.loc21_11.3: ref @AccessBase.%T.loc19_15.2 (%T) = class_element_access %.loc21_11.2, element0 +// CHECK:STDOUT: %.loc21_11.4: @AccessBase.%T.loc19_15.2 (%T) = bind_value %.loc21_11.3 +// CHECK:STDOUT: return %.loc21_11.4 // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -315,36 +144,11 @@ fn AccessMissingConcrete(x: Derived(i32)) -> i32 { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %x.ref: %Derived.115 = name_ref x, %x // CHECK:STDOUT: %b.ref: %Base.elem.a98 = name_ref b, @Base.%.loc5 [concrete = @Base.%.loc5] -// CHECK:STDOUT: %.loc22_11.1: ref %Base.10a = class_element_access %x.ref, element0 -// CHECK:STDOUT: %.loc22_11.2: ref %Base.10a = converted %x.ref, %.loc22_11.1 -// CHECK:STDOUT: %.loc22_11.3: ref %i32 = class_element_access %.loc22_11.2, element0 -// CHECK:STDOUT: %.loc22_11.4: %i32 = bind_value %.loc22_11.3 -// CHECK:STDOUT: return %.loc22_11.4 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Base(constants.%T) { -// CHECK:STDOUT: %T.loc4_17.2 => constants.%T -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%require_complete.4ae -// CHECK:STDOUT: %Base => constants.%Base.370 -// CHECK:STDOUT: %Base.elem => constants.%Base.elem.9af -// CHECK:STDOUT: %struct_type.b.loc6_1.2 => constants.%struct_type.b.f69 -// CHECK:STDOUT: %complete_type.loc6_1.2 => constants.%complete_type.eaf -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Derived(constants.%T) { -// CHECK:STDOUT: %T.loc8_15.2 => constants.%T -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %Base.loc9_22.2 => constants.%Base.370 -// CHECK:STDOUT: %require_complete.loc9 => constants.%require_complete.97d -// CHECK:STDOUT: %Derived => constants.%Derived.85c -// CHECK:STDOUT: %Derived.elem.loc9 => constants.%Derived.elem.8b3 -// CHECK:STDOUT: %require_complete.loc10 => constants.%require_complete.4ae -// CHECK:STDOUT: %Derived.elem.loc10 => constants.%Derived.elem.6d2 -// CHECK:STDOUT: %struct_type.base.d.loc11_1.2 => constants.%struct_type.base.d.37c -// CHECK:STDOUT: %complete_type.loc11_1.2 => constants.%complete_type.8ad +// CHECK:STDOUT: %.loc27_11.1: ref %Base.10a = class_element_access %x.ref, element0 +// CHECK:STDOUT: %.loc27_11.2: ref %Base.10a = converted %x.ref, %.loc27_11.1 +// CHECK:STDOUT: %.loc27_11.3: ref %i32 = class_element_access %.loc27_11.2, element0 +// CHECK:STDOUT: %.loc27_11.4: %i32 = bind_value %.loc27_11.3 +// CHECK:STDOUT: return %.loc27_11.4 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @AccessDerived(constants.%T) { @@ -355,338 +159,9 @@ fn AccessMissingConcrete(x: Derived(i32)) -> i32 { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @AccessBase(constants.%T) { -// CHECK:STDOUT: %T.loc17_15.2 => constants.%T -// CHECK:STDOUT: %Derived.loc17_37.2 => constants.%Derived.85c -// CHECK:STDOUT: %pattern_type.loc17_25 => constants.%pattern_type.423 -// CHECK:STDOUT: %pattern_type.loc17_40 => constants.%pattern_type.7dc -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Derived(constants.%i32) { -// CHECK:STDOUT: %T.loc8_15.2 => constants.%i32 -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %Base.loc9_22.2 => constants.%Base.10a -// CHECK:STDOUT: %require_complete.loc9 => constants.%complete_type.ba8 -// CHECK:STDOUT: %Derived => constants.%Derived.115 -// CHECK:STDOUT: %Derived.elem.loc9 => constants.%Derived.elem.0c4 -// CHECK:STDOUT: %require_complete.loc10 => constants.%complete_type.f8a -// CHECK:STDOUT: %Derived.elem.loc10 => constants.%Derived.elem.b58 -// CHECK:STDOUT: %struct_type.base.d.loc11_1.2 => constants.%struct_type.base.d.ffa -// CHECK:STDOUT: %complete_type.loc11_1.2 => constants.%complete_type.544 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Base(constants.%i32) { -// CHECK:STDOUT: %T.loc4_17.2 => constants.%i32 -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%complete_type.f8a -// CHECK:STDOUT: %Base => constants.%Base.10a -// CHECK:STDOUT: %Base.elem => constants.%Base.elem.a98 -// CHECK:STDOUT: %struct_type.b.loc6_1.2 => constants.%struct_type.b.0a3 -// CHECK:STDOUT: %complete_type.loc6_1.2 => constants.%complete_type.ba8 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_no_member.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] -// CHECK:STDOUT: %Base.type: type = generic_class_type @Base [concrete] -// CHECK:STDOUT: %Base.generic: %Base.type = struct_value () [concrete] -// CHECK:STDOUT: %Base.370: type = class_type @Base, @Base(%T) [symbolic] -// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T [symbolic] -// CHECK:STDOUT: %Base.elem.9af: type = unbound_element_type %Base.370, %T [symbolic] -// CHECK:STDOUT: %struct_type.b.f69: type = struct_type {.b: %T} [symbolic] -// CHECK:STDOUT: %complete_type.eaf: = complete_type_witness %struct_type.b.f69 [symbolic] -// CHECK:STDOUT: %Derived.type: type = generic_class_type @Derived [concrete] -// CHECK:STDOUT: %Derived.generic: %Derived.type = struct_value () [concrete] -// CHECK:STDOUT: %Derived.85c: type = class_type @Derived, @Derived(%T) [symbolic] -// CHECK:STDOUT: %require_complete.97d: = require_complete_type %Base.370 [symbolic] -// CHECK:STDOUT: %Derived.elem.8b3: type = unbound_element_type %Derived.85c, %Base.370 [symbolic] -// CHECK:STDOUT: %Derived.elem.6d2: type = unbound_element_type %Derived.85c, %T [symbolic] -// CHECK:STDOUT: %struct_type.base.d.37c: type = struct_type {.base: %Base.370, .d: %T} [symbolic] -// CHECK:STDOUT: %complete_type.8ad: = complete_type_witness %struct_type.base.d.37c [symbolic] -// CHECK:STDOUT: %pattern_type.9f7: type = pattern_type %Base.370 [symbolic] -// CHECK:STDOUT: %pattern_type.7dc: type = pattern_type %T [symbolic] -// CHECK:STDOUT: %AccessMissingBase.type: type = fn_type @AccessMissingBase [concrete] -// CHECK:STDOUT: %AccessMissingBase: %AccessMissingBase.type = struct_value () [concrete] -// CHECK:STDOUT: %pattern_type.423: type = pattern_type %Derived.85c [symbolic] -// CHECK:STDOUT: %AccessMissingDerived.type: type = fn_type @AccessMissingDerived [concrete] -// CHECK:STDOUT: %AccessMissingDerived: %AccessMissingDerived.type = struct_value () [concrete] -// CHECK:STDOUT: %require_complete.5f4: = require_complete_type %Derived.85c [symbolic] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %Derived.115: type = class_type @Derived, @Derived(%i32) [concrete] -// CHECK:STDOUT: %pattern_type.9c5: type = pattern_type %Derived.115 [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %AccessMissingConcrete.type: type = fn_type @AccessMissingConcrete [concrete] -// CHECK:STDOUT: %AccessMissingConcrete: %AccessMissingConcrete.type = struct_value () [concrete] -// CHECK:STDOUT: %i32.builtin: type = int_type signed, %int_32 [concrete] -// CHECK:STDOUT: %complete_type.f8a: = complete_type_witness %i32.builtin [concrete] -// CHECK:STDOUT: %Base.10a: type = class_type @Base, @Base(%i32) [concrete] -// CHECK:STDOUT: %Base.elem.a98: type = unbound_element_type %Base.10a, %i32 [concrete] -// CHECK:STDOUT: %struct_type.b.0a3: type = struct_type {.b: %i32} [concrete] -// CHECK:STDOUT: %complete_type.ba8: = complete_type_witness %struct_type.b.0a3 [concrete] -// CHECK:STDOUT: %Derived.elem.0c4: type = unbound_element_type %Derived.115, %Base.10a [concrete] -// CHECK:STDOUT: %Derived.elem.b58: type = unbound_element_type %Derived.115, %i32 [concrete] -// CHECK:STDOUT: %struct_type.base.d.ffa: type = struct_type {.base: %Base.10a, .d: %i32} [concrete] -// CHECK:STDOUT: %complete_type.544: = complete_type_witness %struct_type.base.d.ffa [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Base = %Base.decl -// CHECK:STDOUT: .Derived = %Derived.decl -// CHECK:STDOUT: .AccessMissingBase = %AccessMissingBase.decl -// CHECK:STDOUT: .AccessMissingDerived = %AccessMissingDerived.decl -// CHECK:STDOUT: .AccessMissingConcrete = %AccessMissingConcrete.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Base.decl: %Base.type = class_decl @Base [concrete = constants.%Base.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc4_17.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_17.2 (constants.%T)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %Derived.decl: %Derived.type = class_decl @Derived [concrete = constants.%Derived.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc8_15.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc8_15.2 (constants.%T)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %AccessMissingBase.decl: %AccessMissingBase.type = fn_decl @AccessMissingBase [concrete = constants.%AccessMissingBase] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: %x.patt: @AccessMissingBase.%pattern_type.loc13_32 (%pattern_type.9f7) = binding_pattern x [concrete] -// CHECK:STDOUT: %x.param_patt: @AccessMissingBase.%pattern_type.loc13_32 (%pattern_type.9f7) = value_param_pattern %x.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: @AccessMissingBase.%pattern_type.loc13_44 (%pattern_type.7dc) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @AccessMissingBase.%pattern_type.loc13_44 (%pattern_type.7dc) = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref.loc13_47: type = name_ref T, %T.loc13_22.1 [symbolic = %T.loc13_22.2 (constants.%T)] -// CHECK:STDOUT: %T.loc13_22.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc13_22.2 (constants.%T)] -// CHECK:STDOUT: %x.param: @AccessMissingBase.%Base.loc13_41.2 (%Base.370) = value_param call_param0 -// CHECK:STDOUT: %.loc13: type = splice_block %Base.loc13_41.1 [symbolic = %Base.loc13_41.2 (constants.%Base.370)] { -// CHECK:STDOUT: %Base.ref: %Base.type = name_ref Base, file.%Base.decl [concrete = constants.%Base.generic] -// CHECK:STDOUT: %T.ref.loc13_40: type = name_ref T, %T.loc13_22.1 [symbolic = %T.loc13_22.2 (constants.%T)] -// CHECK:STDOUT: %Base.loc13_41.1: type = class_type @Base, @Base(constants.%T) [symbolic = %Base.loc13_41.2 (constants.%Base.370)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %x: @AccessMissingBase.%Base.loc13_41.2 (%Base.370) = bind_name x, %x.param -// CHECK:STDOUT: %return.param: ref @AccessMissingBase.%T.loc13_22.2 (%T) = out_param call_param1 -// CHECK:STDOUT: %return: ref @AccessMissingBase.%T.loc13_22.2 (%T) = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %AccessMissingDerived.decl: %AccessMissingDerived.type = fn_decl @AccessMissingDerived [concrete = constants.%AccessMissingDerived] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: %x.patt: @AccessMissingDerived.%pattern_type.loc21_35 (%pattern_type.423) = binding_pattern x [concrete] -// CHECK:STDOUT: %x.param_patt: @AccessMissingDerived.%pattern_type.loc21_35 (%pattern_type.423) = value_param_pattern %x.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: @AccessMissingDerived.%pattern_type.loc21_50 (%pattern_type.7dc) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @AccessMissingDerived.%pattern_type.loc21_50 (%pattern_type.7dc) = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref.loc21_53: type = name_ref T, %T.loc21_25.1 [symbolic = %T.loc21_25.2 (constants.%T)] -// CHECK:STDOUT: %T.loc21_25.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc21_25.2 (constants.%T)] -// CHECK:STDOUT: %x.param: @AccessMissingDerived.%Derived.loc21_47.2 (%Derived.85c) = value_param call_param0 -// CHECK:STDOUT: %.loc21: type = splice_block %Derived.loc21_47.1 [symbolic = %Derived.loc21_47.2 (constants.%Derived.85c)] { -// CHECK:STDOUT: %Derived.ref: %Derived.type = name_ref Derived, file.%Derived.decl [concrete = constants.%Derived.generic] -// CHECK:STDOUT: %T.ref.loc21_46: type = name_ref T, %T.loc21_25.1 [symbolic = %T.loc21_25.2 (constants.%T)] -// CHECK:STDOUT: %Derived.loc21_47.1: type = class_type @Derived, @Derived(constants.%T) [symbolic = %Derived.loc21_47.2 (constants.%Derived.85c)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %x: @AccessMissingDerived.%Derived.loc21_47.2 (%Derived.85c) = bind_name x, %x.param -// CHECK:STDOUT: %return.param: ref @AccessMissingDerived.%T.loc21_25.2 (%T) = out_param call_param1 -// CHECK:STDOUT: %return: ref @AccessMissingDerived.%T.loc21_25.2 (%T) = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %AccessMissingConcrete.decl: %AccessMissingConcrete.type = fn_decl @AccessMissingConcrete [concrete = constants.%AccessMissingConcrete] { -// CHECK:STDOUT: %x.patt: %pattern_type.9c5 = binding_pattern x [concrete] -// CHECK:STDOUT: %x.param_patt: %pattern_type.9c5 = value_param_pattern %x.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32.loc29_46: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc29_46: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %x.param: %Derived.115 = value_param call_param0 -// CHECK:STDOUT: %.loc29: type = splice_block %Derived [concrete = constants.%Derived.115] { -// CHECK:STDOUT: %Derived.ref: %Derived.type = name_ref Derived, file.%Derived.decl [concrete = constants.%Derived.generic] -// CHECK:STDOUT: %int_32.loc29_37: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc29_37: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %Derived: type = class_type @Derived, @Derived(constants.%i32) [concrete = constants.%Derived.115] -// CHECK:STDOUT: } -// CHECK:STDOUT: %x: %Derived.115 = bind_name x, %x.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Base(%T.loc4_17.1: type) { -// CHECK:STDOUT: %T.loc4_17.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_17.2 (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %T.loc4_17.2 [symbolic = %require_complete (constants.%require_complete.4ae)] -// CHECK:STDOUT: %Base: type = class_type @Base, @Base(%T.loc4_17.2) [symbolic = %Base (constants.%Base.370)] -// CHECK:STDOUT: %Base.elem: type = unbound_element_type %Base, %T.loc4_17.2 [symbolic = %Base.elem (constants.%Base.elem.9af)] -// CHECK:STDOUT: %struct_type.b.loc6_1.2: type = struct_type {.b: @Base.%T.loc4_17.2 (%T)} [symbolic = %struct_type.b.loc6_1.2 (constants.%struct_type.b.f69)] -// CHECK:STDOUT: %complete_type.loc6_1.2: = complete_type_witness %struct_type.b.loc6_1.2 [symbolic = %complete_type.loc6_1.2 (constants.%complete_type.eaf)] -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc4_17.1 [symbolic = %T.loc4_17.2 (constants.%T)] -// CHECK:STDOUT: %.loc5: @Base.%Base.elem (%Base.elem.9af) = field_decl b, element0 [concrete] -// CHECK:STDOUT: %struct_type.b.loc6_1.1: type = struct_type {.b: %T} [symbolic = %struct_type.b.loc6_1.2 (constants.%struct_type.b.f69)] -// CHECK:STDOUT: %complete_type.loc6_1.1: = complete_type_witness %struct_type.b.loc6_1.1 [symbolic = %complete_type.loc6_1.2 (constants.%complete_type.eaf)] -// CHECK:STDOUT: complete_type_witness = %complete_type.loc6_1.1 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Base.370 -// CHECK:STDOUT: .T = -// CHECK:STDOUT: .b = %.loc5 -// CHECK:STDOUT: .nonesuch = -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Derived(%T.loc8_15.1: type) { -// CHECK:STDOUT: %T.loc8_15.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc8_15.2 (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %Base.loc9_22.2: type = class_type @Base, @Base(%T.loc8_15.2) [symbolic = %Base.loc9_22.2 (constants.%Base.370)] -// CHECK:STDOUT: %require_complete.loc9: = require_complete_type %Base.loc9_22.2 [symbolic = %require_complete.loc9 (constants.%require_complete.97d)] -// CHECK:STDOUT: %Derived: type = class_type @Derived, @Derived(%T.loc8_15.2) [symbolic = %Derived (constants.%Derived.85c)] -// CHECK:STDOUT: %Derived.elem.loc9: type = unbound_element_type %Derived, %Base.loc9_22.2 [symbolic = %Derived.elem.loc9 (constants.%Derived.elem.8b3)] -// CHECK:STDOUT: %require_complete.loc10: = require_complete_type %T.loc8_15.2 [symbolic = %require_complete.loc10 (constants.%require_complete.4ae)] -// CHECK:STDOUT: %Derived.elem.loc10: type = unbound_element_type %Derived, %T.loc8_15.2 [symbolic = %Derived.elem.loc10 (constants.%Derived.elem.6d2)] -// CHECK:STDOUT: %struct_type.base.d.loc11_1.2: type = struct_type {.base: @Derived.%Base.loc9_22.2 (%Base.370), .d: @Derived.%T.loc8_15.2 (%T)} [symbolic = %struct_type.base.d.loc11_1.2 (constants.%struct_type.base.d.37c)] -// CHECK:STDOUT: %complete_type.loc11_1.2: = complete_type_witness %struct_type.base.d.loc11_1.2 [symbolic = %complete_type.loc11_1.2 (constants.%complete_type.8ad)] -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %Base.ref: %Base.type = name_ref Base, file.%Base.decl [concrete = constants.%Base.generic] -// CHECK:STDOUT: %T.ref.loc9: type = name_ref T, %T.loc8_15.1 [symbolic = %T.loc8_15.2 (constants.%T)] -// CHECK:STDOUT: %Base.loc9_22.1: type = class_type @Base, @Base(constants.%T) [symbolic = %Base.loc9_22.2 (constants.%Base.370)] -// CHECK:STDOUT: %.loc9: @Derived.%Derived.elem.loc9 (%Derived.elem.8b3) = base_decl %Base.loc9_22.1, element0 [concrete] -// CHECK:STDOUT: %T.ref.loc10: type = name_ref T, %T.loc8_15.1 [symbolic = %T.loc8_15.2 (constants.%T)] -// CHECK:STDOUT: %.loc10: @Derived.%Derived.elem.loc10 (%Derived.elem.6d2) = field_decl d, element1 [concrete] -// CHECK:STDOUT: %struct_type.base.d.loc11_1.1: type = struct_type {.base: %Base.370, .d: %T} [symbolic = %struct_type.base.d.loc11_1.2 (constants.%struct_type.base.d.37c)] -// CHECK:STDOUT: %complete_type.loc11_1.1: = complete_type_witness %struct_type.base.d.loc11_1.1 [symbolic = %complete_type.loc11_1.2 (constants.%complete_type.8ad)] -// CHECK:STDOUT: complete_type_witness = %complete_type.loc11_1.1 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Derived.85c -// CHECK:STDOUT: .Base = -// CHECK:STDOUT: .T = -// CHECK:STDOUT: .base = %.loc9 -// CHECK:STDOUT: .d = %.loc10 -// CHECK:STDOUT: .nonesuch = -// CHECK:STDOUT: extend %Base.loc9_22.1 -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @AccessMissingBase(%T.loc13_22.1: type) { -// CHECK:STDOUT: %T.loc13_22.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc13_22.2 (constants.%T)] -// CHECK:STDOUT: %Base.loc13_41.2: type = class_type @Base, @Base(%T.loc13_22.2) [symbolic = %Base.loc13_41.2 (constants.%Base.370)] -// CHECK:STDOUT: %pattern_type.loc13_32: type = pattern_type %Base.loc13_41.2 [symbolic = %pattern_type.loc13_32 (constants.%pattern_type.9f7)] -// CHECK:STDOUT: %pattern_type.loc13_44: type = pattern_type %T.loc13_22.2 [symbolic = %pattern_type.loc13_44 (constants.%pattern_type.7dc)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %Base.loc13_41.2 [symbolic = %require_complete (constants.%require_complete.97d)] -// CHECK:STDOUT: -// CHECK:STDOUT: fn(%x.param: @AccessMissingBase.%Base.loc13_41.2 (%Base.370)) -> @AccessMissingBase.%T.loc13_22.2 (%T) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %x.ref: @AccessMissingBase.%Base.loc13_41.2 (%Base.370) = name_ref x, %x -// CHECK:STDOUT: %nonesuch.ref: = name_ref nonesuch, [concrete = ] -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @AccessMissingDerived(%T.loc21_25.1: type) { -// CHECK:STDOUT: %T.loc21_25.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc21_25.2 (constants.%T)] -// CHECK:STDOUT: %Derived.loc21_47.2: type = class_type @Derived, @Derived(%T.loc21_25.2) [symbolic = %Derived.loc21_47.2 (constants.%Derived.85c)] -// CHECK:STDOUT: %pattern_type.loc21_35: type = pattern_type %Derived.loc21_47.2 [symbolic = %pattern_type.loc21_35 (constants.%pattern_type.423)] -// CHECK:STDOUT: %pattern_type.loc21_50: type = pattern_type %T.loc21_25.2 [symbolic = %pattern_type.loc21_50 (constants.%pattern_type.7dc)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete.loc21: = require_complete_type %Derived.loc21_47.2 [symbolic = %require_complete.loc21 (constants.%require_complete.5f4)] -// CHECK:STDOUT: %Base: type = class_type @Base, @Base(%T.loc21_25.2) [symbolic = %Base (constants.%Base.370)] -// CHECK:STDOUT: %require_complete.loc26: = require_complete_type %Base [symbolic = %require_complete.loc26 (constants.%require_complete.97d)] -// CHECK:STDOUT: -// CHECK:STDOUT: fn(%x.param: @AccessMissingDerived.%Derived.loc21_47.2 (%Derived.85c)) -> @AccessMissingDerived.%T.loc21_25.2 (%T) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %x.ref: @AccessMissingDerived.%Derived.loc21_47.2 (%Derived.85c) = name_ref x, %x -// CHECK:STDOUT: %nonesuch.ref: = name_ref nonesuch, [concrete = ] -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @AccessMissingConcrete(%x.param: %Derived.115) -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %x.ref: %Derived.115 = name_ref x, %x -// CHECK:STDOUT: %nonesuch.ref: = name_ref nonesuch, [concrete = ] -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Base(constants.%T) { -// CHECK:STDOUT: %T.loc4_17.2 => constants.%T -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%require_complete.4ae -// CHECK:STDOUT: %Base => constants.%Base.370 -// CHECK:STDOUT: %Base.elem => constants.%Base.elem.9af -// CHECK:STDOUT: %struct_type.b.loc6_1.2 => constants.%struct_type.b.f69 -// CHECK:STDOUT: %complete_type.loc6_1.2 => constants.%complete_type.eaf -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Derived(constants.%T) { -// CHECK:STDOUT: %T.loc8_15.2 => constants.%T -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %Base.loc9_22.2 => constants.%Base.370 -// CHECK:STDOUT: %require_complete.loc9 => constants.%require_complete.97d -// CHECK:STDOUT: %Derived => constants.%Derived.85c -// CHECK:STDOUT: %Derived.elem.loc9 => constants.%Derived.elem.8b3 -// CHECK:STDOUT: %require_complete.loc10 => constants.%require_complete.4ae -// CHECK:STDOUT: %Derived.elem.loc10 => constants.%Derived.elem.6d2 -// CHECK:STDOUT: %struct_type.base.d.loc11_1.2 => constants.%struct_type.base.d.37c -// CHECK:STDOUT: %complete_type.loc11_1.2 => constants.%complete_type.8ad -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @AccessMissingBase(constants.%T) { -// CHECK:STDOUT: %T.loc13_22.2 => constants.%T -// CHECK:STDOUT: %Base.loc13_41.2 => constants.%Base.370 -// CHECK:STDOUT: %pattern_type.loc13_32 => constants.%pattern_type.9f7 -// CHECK:STDOUT: %pattern_type.loc13_44 => constants.%pattern_type.7dc -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @AccessMissingDerived(constants.%T) { -// CHECK:STDOUT: %T.loc21_25.2 => constants.%T -// CHECK:STDOUT: %Derived.loc21_47.2 => constants.%Derived.85c -// CHECK:STDOUT: %pattern_type.loc21_35 => constants.%pattern_type.423 -// CHECK:STDOUT: %pattern_type.loc21_50 => constants.%pattern_type.7dc -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Derived(constants.%i32) { -// CHECK:STDOUT: %T.loc8_15.2 => constants.%i32 -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %Base.loc9_22.2 => constants.%Base.10a -// CHECK:STDOUT: %require_complete.loc9 => constants.%complete_type.ba8 -// CHECK:STDOUT: %Derived => constants.%Derived.115 -// CHECK:STDOUT: %Derived.elem.loc9 => constants.%Derived.elem.0c4 -// CHECK:STDOUT: %require_complete.loc10 => constants.%complete_type.f8a -// CHECK:STDOUT: %Derived.elem.loc10 => constants.%Derived.elem.b58 -// CHECK:STDOUT: %struct_type.base.d.loc11_1.2 => constants.%struct_type.base.d.ffa -// CHECK:STDOUT: %complete_type.loc11_1.2 => constants.%complete_type.544 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Base(constants.%i32) { -// CHECK:STDOUT: %T.loc4_17.2 => constants.%i32 -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%complete_type.f8a -// CHECK:STDOUT: %Base => constants.%Base.10a -// CHECK:STDOUT: %Base.elem => constants.%Base.elem.a98 -// CHECK:STDOUT: %struct_type.b.loc6_1.2 => constants.%struct_type.b.0a3 -// CHECK:STDOUT: %complete_type.loc6_1.2 => constants.%complete_type.ba8 +// CHECK:STDOUT: %T.loc19_15.2 => constants.%T +// CHECK:STDOUT: %Derived.loc19_37.2 => constants.%Derived.85c +// CHECK:STDOUT: %pattern_type.loc19_25 => constants.%pattern_type.423 +// CHECK:STDOUT: %pattern_type.loc19_40 => constants.%pattern_type.7dc // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/generic/member_out_of_line.carbon b/toolchain/check/testdata/class/generic/member_out_of_line.carbon index 9891972b935f5..8778cf3dfc3f4 100644 --- a/toolchain/check/testdata/class/generic/member_out_of_line.carbon +++ b/toolchain/check/testdata/class/generic/member_out_of_line.carbon @@ -2,6 +2,8 @@ // Exceptions. See /LICENSE for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// // AUTOUPDATE // TIP: To test this file alone, run: // TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/generic/member_out_of_line.carbon @@ -19,11 +21,15 @@ class Class(T:! type) { } fn Class(T:! type).F(n: T) -> T { + //@dump-sem-ir-begin return n; + //@dump-sem-ir-end } fn Class(T:! type).G[self: Self]() -> T { + //@dump-sem-ir-begin return self.n; + //@dump-sem-ir-end } // --- nested.carbon @@ -36,7 +42,9 @@ class A(T:! type) { } } +//@dump-sem-ir-begin fn A(T:! type).B(N:! T).F[self: Self](a: T) {} +//@dump-sem-ir-end // --- fail_mismatched_not_generic_vs_generic.carbon @@ -110,139 +118,19 @@ fn Generic(T:! ()).WrongType() {} // CHECK:STDOUT: // CHECK:STDOUT: constants { // CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] -// CHECK:STDOUT: %Class.type: type = generic_class_type @Class [concrete] -// CHECK:STDOUT: %Class.generic: %Class.type = struct_value () [concrete] // CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T) [symbolic] -// CHECK:STDOUT: %pattern_type.7dc: type = pattern_type %T [symbolic] -// CHECK:STDOUT: %F.type: type = fn_type @F, @Class(%T) [symbolic] -// CHECK:STDOUT: %F: %F.type = struct_value () [symbolic] -// CHECK:STDOUT: %pattern_type.3c1: type = pattern_type %Class [symbolic] -// CHECK:STDOUT: %G.type: type = fn_type @G, @Class(%T) [symbolic] -// CHECK:STDOUT: %G: %G.type = struct_value () [symbolic] // CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T [symbolic] // CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %T [symbolic] -// CHECK:STDOUT: %struct_type.n: type = struct_type {.n: %T} [symbolic] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.n [symbolic] -// CHECK:STDOUT: %require_complete.4f8: = require_complete_type %Class [symbolic] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Class = %Class.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Class.decl: %Class.type = class_decl @Class [concrete = constants.%Class.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc4_13.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_13.2 (constants.%T)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [symbolic = constants.%F] { -// CHECK:STDOUT: %n.patt: @F.%pattern_type (%pattern_type.7dc) = binding_pattern n [concrete] -// CHECK:STDOUT: %n.param_patt: @F.%pattern_type (%pattern_type.7dc) = value_param_pattern %n.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: @F.%pattern_type (%pattern_type.7dc) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @F.%pattern_type (%pattern_type.7dc) = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc10: type = bind_symbolic_name T, 0 [symbolic = @Class.%T.loc4_13.2 (constants.%T)] -// CHECK:STDOUT: %T.ref.loc10_31: type = name_ref T, %T.loc10 [symbolic = %T.loc5 (constants.%T)] -// CHECK:STDOUT: %n.param.loc10: @F.%T.loc5 (%T) = value_param call_param0 -// CHECK:STDOUT: %T.ref.loc10_25: type = name_ref T, %T.loc10 [symbolic = %T.loc5 (constants.%T)] -// CHECK:STDOUT: %n.loc10: @F.%T.loc5 (%T) = bind_name n, %n.param.loc10 -// CHECK:STDOUT: %return.param.loc10: ref @F.%T.loc5 (%T) = out_param call_param1 -// CHECK:STDOUT: %return.loc10: ref @F.%T.loc5 (%T) = return_slot %return.param.loc10 -// CHECK:STDOUT: } -// CHECK:STDOUT: %G.decl: %G.type = fn_decl @G [symbolic = constants.%G] { -// CHECK:STDOUT: %self.patt: @G.%pattern_type.loc6_8 (%pattern_type.3c1) = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: @G.%pattern_type.loc6_8 (%pattern_type.3c1) = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: @G.%pattern_type.loc6_22 (%pattern_type.7dc) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @G.%pattern_type.loc6_22 (%pattern_type.7dc) = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc14: type = bind_symbolic_name T, 0 [symbolic = @Class.%T.loc4_13.2 (constants.%T)] -// CHECK:STDOUT: %T.ref.loc14: type = name_ref T, %T.loc14 [symbolic = %T.loc6 (constants.%T)] -// CHECK:STDOUT: %self.param.loc14: @G.%Class (%Class) = value_param call_param0 -// CHECK:STDOUT: %.loc14_28.1: type = splice_block %Self.ref.loc14 [symbolic = %Class (constants.%Class)] { -// CHECK:STDOUT: %.loc14_28.2: type = specific_constant constants.%Class, @Class(constants.%T) [symbolic = %Class (constants.%Class)] -// CHECK:STDOUT: %Self.ref.loc14: type = name_ref Self, %.loc14_28.2 [symbolic = %Class (constants.%Class)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self.loc14: @G.%Class (%Class) = bind_name self, %self.param.loc14 -// CHECK:STDOUT: %return.param.loc14: ref @G.%T.loc6 (%T) = out_param call_param1 -// CHECK:STDOUT: %return.loc14: ref @G.%T.loc6 (%T) = return_slot %return.param.loc14 -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Class(%T.loc4_13.1: type) { -// CHECK:STDOUT: %T.loc4_13.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_13.2 (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %F.type: type = fn_type @F, @Class(%T.loc4_13.2) [symbolic = %F.type (constants.%F.type)] -// CHECK:STDOUT: %F: @Class.%F.type (%F.type) = struct_value () [symbolic = %F (constants.%F)] -// CHECK:STDOUT: %G.type: type = fn_type @G, @Class(%T.loc4_13.2) [symbolic = %G.type (constants.%G.type)] -// CHECK:STDOUT: %G: @Class.%G.type (%G.type) = struct_value () [symbolic = %G (constants.%G)] -// CHECK:STDOUT: %require_complete: = require_complete_type %T.loc4_13.2 [symbolic = %require_complete (constants.%require_complete.4ae)] -// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T.loc4_13.2) [symbolic = %Class (constants.%Class)] -// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %T.loc4_13.2 [symbolic = %Class.elem (constants.%Class.elem)] -// CHECK:STDOUT: %struct_type.n.loc8_1.2: type = struct_type {.n: @Class.%T.loc4_13.2 (%T)} [symbolic = %struct_type.n.loc8_1.2 (constants.%struct_type.n)] -// CHECK:STDOUT: %complete_type.loc8_1.2: = complete_type_witness %struct_type.n.loc8_1.2 [symbolic = %complete_type.loc8_1.2 (constants.%complete_type)] -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %F.decl: @Class.%F.type (%F.type) = fn_decl @F [symbolic = @Class.%F (constants.%F)] { -// CHECK:STDOUT: %n.patt: @F.%pattern_type (%pattern_type.7dc) = binding_pattern n [concrete] -// CHECK:STDOUT: %n.param_patt: @F.%pattern_type (%pattern_type.7dc) = value_param_pattern %n.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: @F.%pattern_type (%pattern_type.7dc) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @F.%pattern_type (%pattern_type.7dc) = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref.loc5_17: type = name_ref T, @Class.%T.loc4_13.1 [symbolic = %T.loc5 (constants.%T)] -// CHECK:STDOUT: %n.param.loc5: @F.%T.loc5 (%T) = value_param call_param0 -// CHECK:STDOUT: %T.ref.loc5_11: type = name_ref T, @Class.%T.loc4_13.1 [symbolic = %T.loc5 (constants.%T)] -// CHECK:STDOUT: %n.loc5: @F.%T.loc5 (%T) = bind_name n, %n.param.loc5 -// CHECK:STDOUT: %return.param.loc5: ref @F.%T.loc5 (%T) = out_param call_param1 -// CHECK:STDOUT: %return.loc5: ref @F.%T.loc5 (%T) = return_slot %return.param.loc5 -// CHECK:STDOUT: } -// CHECK:STDOUT: %G.decl: @Class.%G.type (%G.type) = fn_decl @G [symbolic = @Class.%G (constants.%G)] { -// CHECK:STDOUT: %self.patt: @G.%pattern_type.loc6_8 (%pattern_type.3c1) = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: @G.%pattern_type.loc6_8 (%pattern_type.3c1) = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: @G.%pattern_type.loc6_22 (%pattern_type.7dc) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @G.%pattern_type.loc6_22 (%pattern_type.7dc) = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref.loc6: type = name_ref T, @Class.%T.loc4_13.1 [symbolic = %T.loc6 (constants.%T)] -// CHECK:STDOUT: %self.param.loc6: @G.%Class (%Class) = value_param call_param0 -// CHECK:STDOUT: %.loc6_14.1: type = splice_block %Self.ref.loc6 [symbolic = %Class (constants.%Class)] { -// CHECK:STDOUT: %.loc6_14.2: type = specific_constant constants.%Class, @Class(constants.%T) [symbolic = %Class (constants.%Class)] -// CHECK:STDOUT: %Self.ref.loc6: type = name_ref Self, %.loc6_14.2 [symbolic = %Class (constants.%Class)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self.loc6: @G.%Class (%Class) = bind_name self, %self.param.loc6 -// CHECK:STDOUT: %return.param.loc6: ref @G.%T.loc6 (%T) = out_param call_param1 -// CHECK:STDOUT: %return.loc6: ref @G.%T.loc6 (%T) = return_slot %return.param.loc6 -// CHECK:STDOUT: } -// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc4_13.1 [symbolic = %T.loc4_13.2 (constants.%T)] -// CHECK:STDOUT: %.loc7: @Class.%Class.elem (%Class.elem) = field_decl n, element0 [concrete] -// CHECK:STDOUT: %struct_type.n.loc8_1.1: type = struct_type {.n: %T} [symbolic = %struct_type.n.loc8_1.2 (constants.%struct_type.n)] -// CHECK:STDOUT: %complete_type.loc8_1.1: = complete_type_witness %struct_type.n.loc8_1.1 [symbolic = %complete_type.loc8_1.2 (constants.%complete_type)] -// CHECK:STDOUT: complete_type_witness = %complete_type.loc8_1.1 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Class -// CHECK:STDOUT: .T = -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: .G = %G.decl -// CHECK:STDOUT: .n = %.loc7 -// CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @F(@Class.%T.loc4_13.1: type) { -// CHECK:STDOUT: %T.loc5: type = bind_symbolic_name T, 0 [symbolic = %T.loc5 (constants.%T)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %T.loc5 [symbolic = %pattern_type (constants.%pattern_type.7dc)] +// CHECK:STDOUT: // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %T.loc5 [symbolic = %require_complete (constants.%require_complete.4ae)] +// CHECK:STDOUT: // CHECK:STDOUT: // CHECK:STDOUT: fn(%n.param.loc10: @F.%T.loc5 (%T)) -> @F.%T.loc5 (%T) { // CHECK:STDOUT: !entry: @@ -252,523 +140,72 @@ fn Generic(T:! ()).WrongType() {} // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @G(@Class.%T.loc4_13.1: type) { -// CHECK:STDOUT: %T.loc6: type = bind_symbolic_name T, 0 [symbolic = %T.loc6 (constants.%T)] -// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T.loc6) [symbolic = %Class (constants.%Class)] -// CHECK:STDOUT: %pattern_type.loc6_8: type = pattern_type %Class [symbolic = %pattern_type.loc6_8 (constants.%pattern_type.3c1)] -// CHECK:STDOUT: %pattern_type.loc6_22: type = pattern_type %T.loc6 [symbolic = %pattern_type.loc6_22 (constants.%pattern_type.7dc)] +// CHECK:STDOUT: // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete.loc14: = require_complete_type %Class [symbolic = %require_complete.loc14 (constants.%require_complete.4f8)] +// CHECK:STDOUT: // CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %T.loc6 [symbolic = %Class.elem (constants.%Class.elem)] -// CHECK:STDOUT: %require_complete.loc15: = require_complete_type %T.loc6 [symbolic = %require_complete.loc15 (constants.%require_complete.4ae)] +// CHECK:STDOUT: %require_complete.loc18: = require_complete_type %T.loc6 [symbolic = %require_complete.loc18 (constants.%require_complete.4ae)] // CHECK:STDOUT: -// CHECK:STDOUT: fn(%self.param.loc14: @G.%Class (%Class)) -> @G.%T.loc6 (%T) { +// CHECK:STDOUT: fn(%self.param.loc16: @G.%Class (%Class)) -> @G.%T.loc6 (%T) { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %self.ref: @G.%Class (%Class) = name_ref self, %self.loc14 +// CHECK:STDOUT: %self.ref: @G.%Class (%Class) = name_ref self, %self.loc16 // CHECK:STDOUT: %n.ref: @G.%Class.elem (%Class.elem) = name_ref n, @Class.%.loc7 [concrete = @Class.%.loc7] -// CHECK:STDOUT: %.loc15_14.1: ref @G.%T.loc6 (%T) = class_element_access %self.ref, element0 -// CHECK:STDOUT: %.loc15_14.2: @G.%T.loc6 (%T) = bind_value %.loc15_14.1 -// CHECK:STDOUT: return %.loc15_14.2 +// CHECK:STDOUT: %.loc18_14.1: ref @G.%T.loc6 (%T) = class_element_access %self.ref, element0 +// CHECK:STDOUT: %.loc18_14.2: @G.%T.loc6 (%T) = bind_value %.loc18_14.1 +// CHECK:STDOUT: return %.loc18_14.2 // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Class(constants.%T) { -// CHECK:STDOUT: %T.loc4_13.2 => constants.%T -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %F.type => constants.%F.type -// CHECK:STDOUT: %F => constants.%F -// CHECK:STDOUT: %G.type => constants.%G.type -// CHECK:STDOUT: %G => constants.%G -// CHECK:STDOUT: %require_complete => constants.%require_complete.4ae -// CHECK:STDOUT: %Class => constants.%Class -// CHECK:STDOUT: %Class.elem => constants.%Class.elem -// CHECK:STDOUT: %struct_type.n.loc8_1.2 => constants.%struct_type.n -// CHECK:STDOUT: %complete_type.loc8_1.2 => constants.%complete_type -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @F(constants.%T) { -// CHECK:STDOUT: %T.loc5 => constants.%T -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.7dc -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @G(constants.%T) { -// CHECK:STDOUT: %T.loc6 => constants.%T -// CHECK:STDOUT: %Class => constants.%Class -// CHECK:STDOUT: %pattern_type.loc6_8 => constants.%pattern_type.3c1 -// CHECK:STDOUT: %pattern_type.loc6_22 => constants.%pattern_type.7dc -// CHECK:STDOUT: } -// CHECK:STDOUT: // CHECK:STDOUT: --- nested.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { // CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] -// CHECK:STDOUT: %A.type: type = generic_class_type @A [concrete] -// CHECK:STDOUT: %A.generic: %A.type = struct_value () [concrete] -// CHECK:STDOUT: %A: type = class_type @A, @A(%T) [symbolic] // CHECK:STDOUT: %N: %T = bind_symbolic_name N, 1 [symbolic] // CHECK:STDOUT: %pattern_type.7dc: type = pattern_type %T [symbolic] -// CHECK:STDOUT: %B.type: type = generic_class_type @B, @A(%T) [symbolic] -// CHECK:STDOUT: %B.generic: %B.type = struct_value () [symbolic] // CHECK:STDOUT: %B: type = class_type @B, @B(%T, %N) [symbolic] // CHECK:STDOUT: %pattern_type.13e: type = pattern_type %B [symbolic] // CHECK:STDOUT: %F.type: type = fn_type @F, @B(%T, %N) [symbolic] // CHECK:STDOUT: %F: %F.type = struct_value () [symbolic] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] // CHECK:STDOUT: %require_complete.fca: = require_complete_type %B [symbolic] // CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T [symbolic] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .A = %A.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %A.decl: %A.type = class_decl @A [concrete = constants.%A.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc4_9.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_9.2 (constants.%T)] -// CHECK:STDOUT: } // CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [symbolic = constants.%F] { // CHECK:STDOUT: %self.patt: @F.%pattern_type.loc6_10 (%pattern_type.13e) = binding_pattern self [concrete] // CHECK:STDOUT: %self.param_patt: @F.%pattern_type.loc6_10 (%pattern_type.13e) = value_param_pattern %self.patt, call_param0 [concrete] // CHECK:STDOUT: %a.patt: @F.%pattern_type.loc6_22 (%pattern_type.7dc) = binding_pattern a [concrete] // CHECK:STDOUT: %a.param_patt: @F.%pattern_type.loc6_22 (%pattern_type.7dc) = value_param_pattern %a.patt, call_param1 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc10: type = bind_symbolic_name T, 0 [symbolic = @A.%T.loc4_9.2 (constants.%T)] -// CHECK:STDOUT: %T.ref.loc10_22: type = name_ref T, %T.loc10 [symbolic = @B.%T (constants.%T)] -// CHECK:STDOUT: %N.loc10: @B.%T (%T) = bind_symbolic_name N, 1 [symbolic = @B.%N.loc5_11.2 (constants.%N)] -// CHECK:STDOUT: %self.param.loc10: @F.%B (%B) = value_param call_param0 -// CHECK:STDOUT: %.loc10_33.1: type = splice_block %Self.ref.loc10 [symbolic = %B (constants.%B)] { -// CHECK:STDOUT: %.loc10_33.2: type = specific_constant constants.%B, @B(constants.%T, constants.%N) [symbolic = %B (constants.%B)] -// CHECK:STDOUT: %Self.ref.loc10: type = name_ref Self, %.loc10_33.2 [symbolic = %B (constants.%B)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self.loc10: @F.%B (%B) = bind_name self, %self.param.loc10 -// CHECK:STDOUT: %a.param.loc10: @F.%T.loc6 (%T) = value_param call_param1 -// CHECK:STDOUT: %T.ref.loc10_42: type = name_ref T, %T.loc10 [symbolic = %T.loc6 (constants.%T)] -// CHECK:STDOUT: %a.loc10: @F.%T.loc6 (%T) = bind_name a, %a.param.loc10 -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @A(%T.loc4_9.1: type) { -// CHECK:STDOUT: %T.loc4_9.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_9.2 (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %B.type: type = generic_class_type @B, @A(%T.loc4_9.2) [symbolic = %B.type (constants.%B.type)] -// CHECK:STDOUT: %B.generic: @A.%B.type (%B.type) = struct_value () [symbolic = %B.generic (constants.%B.generic)] -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %B.decl: @A.%B.type (%B.type) = class_decl @B [symbolic = @A.%B.generic (constants.%B.generic)] { -// CHECK:STDOUT: %N.patt: @B.%pattern_type (%pattern_type.7dc) = symbolic_binding_pattern N, 1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref: type = name_ref T, @A.%T.loc4_9.1 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %N.loc5_11.1: @B.%T (%T) = bind_symbolic_name N, 1 [symbolic = %N.loc5_11.2 (constants.%N)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%A -// CHECK:STDOUT: .T = -// CHECK:STDOUT: .B = %B.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @B(@A.%T.loc4_9.1: type, %N.loc5_11.1: @B.%T (%T)) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %N.loc5_11.2: @B.%T (%T) = bind_symbolic_name N, 1 [symbolic = %N.loc5_11.2 (constants.%N)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %T [symbolic = %pattern_type (constants.%pattern_type.7dc)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %F.type: type = fn_type @F, @B(%T, %N.loc5_11.2) [symbolic = %F.type (constants.%F.type)] -// CHECK:STDOUT: %F: @B.%F.type (%F.type) = struct_value () [symbolic = %F (constants.%F)] -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %F.decl: @B.%F.type (%F.type) = fn_decl @F [symbolic = @B.%F (constants.%F)] { -// CHECK:STDOUT: %self.patt: @F.%pattern_type.loc6_10 (%pattern_type.13e) = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: @F.%pattern_type.loc6_10 (%pattern_type.13e) = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %a.patt: @F.%pattern_type.loc6_22 (%pattern_type.7dc) = binding_pattern a [concrete] -// CHECK:STDOUT: %a.param_patt: @F.%pattern_type.loc6_22 (%pattern_type.7dc) = value_param_pattern %a.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param.loc6: @F.%B (%B) = value_param call_param0 -// CHECK:STDOUT: %.loc6_16.1: type = splice_block %Self.ref.loc6 [symbolic = %B (constants.%B)] { -// CHECK:STDOUT: %.loc6_16.2: type = specific_constant constants.%B, @B(constants.%T, constants.%N) [symbolic = %B (constants.%B)] -// CHECK:STDOUT: %Self.ref.loc6: type = name_ref Self, %.loc6_16.2 [symbolic = %B (constants.%B)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self.loc6: @F.%B (%B) = bind_name self, %self.param.loc6 -// CHECK:STDOUT: %a.param.loc6: @F.%T.loc6 (%T) = value_param call_param1 -// CHECK:STDOUT: %T.ref.loc6: type = name_ref T, @A.%T.loc4_9.1 [symbolic = %T.loc6 (constants.%T)] -// CHECK:STDOUT: %a.loc6: @F.%T.loc6 (%T) = bind_name a, %a.param.loc6 +// CHECK:STDOUT: %T.loc11: type = bind_symbolic_name T, 0 [symbolic = @A.%T.loc4_9.2 (constants.%T)] +// CHECK:STDOUT: %T.ref.loc11_22: type = name_ref T, %T.loc11 [symbolic = @B.%T (constants.%T)] +// CHECK:STDOUT: %N.loc11: @B.%T (%T) = bind_symbolic_name N, 1 [symbolic = @B.%N.loc5_11.2 (constants.%N)] +// CHECK:STDOUT: %self.param.loc11: @F.%B (%B) = value_param call_param0 +// CHECK:STDOUT: %.loc11_33.1: type = splice_block %Self.ref.loc11 [symbolic = %B (constants.%B)] { +// CHECK:STDOUT: %.loc11_33.2: type = specific_constant constants.%B, @B(constants.%T, constants.%N) [symbolic = %B (constants.%B)] +// CHECK:STDOUT: %Self.ref.loc11: type = name_ref Self, %.loc11_33.2 [symbolic = %B (constants.%B)] // CHECK:STDOUT: } -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%B -// CHECK:STDOUT: .T = -// CHECK:STDOUT: .F = %F.decl +// CHECK:STDOUT: %self.loc11: @F.%B (%B) = bind_name self, %self.param.loc11 +// CHECK:STDOUT: %a.param.loc11: @F.%T.loc6 (%T) = value_param call_param1 +// CHECK:STDOUT: %T.ref.loc11_42: type = name_ref T, %T.loc11 [symbolic = %T.loc6 (constants.%T)] +// CHECK:STDOUT: %a.loc11: @F.%T.loc6 (%T) = bind_name a, %a.param.loc11 // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic fn @F(@A.%T.loc4_9.1: type, @B.%N.loc5_11.1: @B.%T (%T)) { -// CHECK:STDOUT: %T.loc6: type = bind_symbolic_name T, 0 [symbolic = %T.loc6 (constants.%T)] -// CHECK:STDOUT: %N.loc6: @F.%T.loc6 (%T) = bind_symbolic_name N, 1 [symbolic = %N.loc6 (constants.%N)] -// CHECK:STDOUT: %B: type = class_type @B, @B(%T.loc6, %N.loc6) [symbolic = %B (constants.%B)] -// CHECK:STDOUT: %pattern_type.loc6_10: type = pattern_type %B [symbolic = %pattern_type.loc6_10 (constants.%pattern_type.13e)] -// CHECK:STDOUT: %pattern_type.loc6_22: type = pattern_type %T.loc6 [symbolic = %pattern_type.loc6_22 (constants.%pattern_type.7dc)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete.loc10_31: = require_complete_type %B [symbolic = %require_complete.loc10_31 (constants.%require_complete.fca)] -// CHECK:STDOUT: %require_complete.loc10_40: = require_complete_type %T.loc6 [symbolic = %require_complete.loc10_40 (constants.%require_complete.4ae)] -// CHECK:STDOUT: -// CHECK:STDOUT: fn(%self.param.loc10: @F.%B (%B), %a.param.loc10: @F.%T.loc6 (%T)) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @A(constants.%T) { -// CHECK:STDOUT: %T.loc4_9.2 => constants.%T -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %B.type => constants.%B.type -// CHECK:STDOUT: %B.generic => constants.%B.generic -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @B(constants.%T, constants.%N) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %N.loc5_11.2 => constants.%N -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.7dc -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %F.type => constants.%F.type -// CHECK:STDOUT: %F => constants.%F -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @F(constants.%T, constants.%N) { -// CHECK:STDOUT: %T.loc6 => constants.%T -// CHECK:STDOUT: %N.loc6 => constants.%N -// CHECK:STDOUT: %B => constants.%B -// CHECK:STDOUT: %pattern_type.loc6_10 => constants.%pattern_type.13e -// CHECK:STDOUT: %pattern_type.loc6_22 => constants.%pattern_type.7dc -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_mismatched_not_generic_vs_generic.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %NotGeneric: type = class_type @NotGeneric [concrete] -// CHECK:STDOUT: %F.type.065: type = fn_type @F.1 [concrete] -// CHECK:STDOUT: %F.fdb: %F.type.065 = struct_value () [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %F.type.b25: type = fn_type @F.2 [concrete] -// CHECK:STDOUT: %F.c41: %F.type.b25 = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .NotGeneric = %NotGeneric.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %NotGeneric.decl: type = class_decl @NotGeneric [concrete = constants.%NotGeneric] {} {} -// CHECK:STDOUT: %F.decl: %F.type.b25 = fn_decl @F.2 [concrete = constants.%F.c41] {} { -// CHECK:STDOUT: %T.loc15_15.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc15_15.2 (constants.%T)] -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @NotGeneric { -// CHECK:STDOUT: %F.decl: %F.type.065 = fn_decl @F.1 [concrete = constants.%F.fdb] {} {} -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%NotGeneric -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F.1(); -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @F.2(%T.loc15_15.1: type) { -// CHECK:STDOUT: %T.loc15_15.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc15_15.2 (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: -// CHECK:STDOUT: fn() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @F.2(constants.%T) { -// CHECK:STDOUT: %T.loc15_15.2 => constants.%T -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_mismatched_too_few_args.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type: type = pattern_type type [concrete] -// CHECK:STDOUT: %Generic.type: type = generic_class_type @Generic [concrete] -// CHECK:STDOUT: %Generic.generic: %Generic.type = struct_value () [concrete] -// CHECK:STDOUT: %Generic: type = class_type @Generic, @Generic(%T) [symbolic] -// CHECK:STDOUT: %TooFew.type.dac: type = fn_type @TooFew.1, @Generic(%T) [symbolic] -// CHECK:STDOUT: %TooFew.840: %TooFew.type.dac = struct_value () [symbolic] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %TooFew.type.e89: type = fn_type @TooFew.2 [concrete] -// CHECK:STDOUT: %TooFew.7c3: %TooFew.type.e89 = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Generic = %Generic.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Generic.decl: %Generic.type = class_decl @Generic [concrete = constants.%Generic.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc4_15.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_15.2 (constants.%T)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %TooFew.decl: %TooFew.type.e89 = fn_decl @TooFew.2 [concrete = constants.%TooFew.7c3] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Generic(%T.loc4_15.1: type) { -// CHECK:STDOUT: %T.loc4_15.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_15.2 (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %TooFew.type: type = fn_type @TooFew.1, @Generic(%T.loc4_15.2) [symbolic = %TooFew.type (constants.%TooFew.type.dac)] -// CHECK:STDOUT: %TooFew: @Generic.%TooFew.type (%TooFew.type.dac) = struct_value () [symbolic = %TooFew (constants.%TooFew.840)] -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %TooFew.decl: @Generic.%TooFew.type (%TooFew.type.dac) = fn_decl @TooFew.1 [symbolic = @Generic.%TooFew (constants.%TooFew.840)] {} {} -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Generic -// CHECK:STDOUT: .TooFew = %TooFew.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @TooFew.1(@Generic.%T.loc4_15.1: type) { -// CHECK:STDOUT: fn(); -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @TooFew.2() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Generic(constants.%T) { -// CHECK:STDOUT: %T.loc4_15.2 => constants.%T -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @TooFew.1(constants.%T) {} -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_mismatched_too_many_args.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type: type = pattern_type type [concrete] -// CHECK:STDOUT: %Generic.type: type = generic_class_type @Generic [concrete] -// CHECK:STDOUT: %Generic.generic: %Generic.type = struct_value () [concrete] -// CHECK:STDOUT: %Generic: type = class_type @Generic, @Generic(%T) [symbolic] -// CHECK:STDOUT: %TooMany.type.cc8: type = fn_type @TooMany.1, @Generic(%T) [symbolic] -// CHECK:STDOUT: %TooMany.dc4: %TooMany.type.cc8 = struct_value () [symbolic] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %U: type = bind_symbolic_name U, 1 [symbolic] -// CHECK:STDOUT: %TooMany.type.c84: type = fn_type @TooMany.2 [concrete] -// CHECK:STDOUT: %TooMany.1dc: %TooMany.type.c84 = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Generic = %Generic.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Generic.decl: %Generic.type = class_decl @Generic [concrete = constants.%Generic.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc4_15.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_15.2 (constants.%T)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %TooMany.decl: %TooMany.type.c84 = fn_decl @TooMany.2 [concrete = constants.%TooMany.1dc] {} { -// CHECK:STDOUT: %T.loc15_12.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc15_12.2 (constants.%T)] -// CHECK:STDOUT: %U.loc15_22.1: type = bind_symbolic_name U, 1 [symbolic = %U.loc15_22.2 (constants.%U)] -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Generic(%T.loc4_15.1: type) { -// CHECK:STDOUT: %T.loc4_15.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_15.2 (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %TooMany.type: type = fn_type @TooMany.1, @Generic(%T.loc4_15.2) [symbolic = %TooMany.type (constants.%TooMany.type.cc8)] -// CHECK:STDOUT: %TooMany: @Generic.%TooMany.type (%TooMany.type.cc8) = struct_value () [symbolic = %TooMany (constants.%TooMany.dc4)] -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %TooMany.decl: @Generic.%TooMany.type (%TooMany.type.cc8) = fn_decl @TooMany.1 [symbolic = @Generic.%TooMany (constants.%TooMany.dc4)] {} {} -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Generic -// CHECK:STDOUT: .TooMany = %TooMany.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @TooMany.1(@Generic.%T.loc4_15.1: type) { -// CHECK:STDOUT: fn(); -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @TooMany.2(%T.loc15_12.1: type, %U.loc15_22.1: type) { -// CHECK:STDOUT: %T.loc15_12.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc15_12.2 (constants.%T)] -// CHECK:STDOUT: %U.loc15_22.2: type = bind_symbolic_name U, 1 [symbolic = %U.loc15_22.2 (constants.%U)] +// CHECK:STDOUT: // CHECK:STDOUT: // CHECK:STDOUT: !definition: +// CHECK:STDOUT: %require_complete.loc11_31: = require_complete_type %B [symbolic = %require_complete.loc11_31 (constants.%require_complete.fca)] +// CHECK:STDOUT: %require_complete.loc11_40: = require_complete_type %T.loc6 [symbolic = %require_complete.loc11_40 (constants.%require_complete.4ae)] // CHECK:STDOUT: -// CHECK:STDOUT: fn() { +// CHECK:STDOUT: fn(%self.param.loc11: @F.%B (%B), %a.param.loc11: @F.%T.loc6 (%T)) { // CHECK:STDOUT: !entry: // CHECK:STDOUT: return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Generic(constants.%T) { -// CHECK:STDOUT: %T.loc4_15.2 => constants.%T -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @TooMany.1(constants.%T) {} -// CHECK:STDOUT: -// CHECK:STDOUT: specific @TooMany.2(constants.%T, constants.%U) { -// CHECK:STDOUT: %T.loc15_12.2 => constants.%T -// CHECK:STDOUT: %U.loc15_22.2 => constants.%U -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_mismatched_wrong_arg_type.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %T.8b3: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] -// CHECK:STDOUT: %Generic.type: type = generic_class_type @Generic [concrete] -// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] -// CHECK:STDOUT: %Generic.generic: %Generic.type = struct_value () [concrete] -// CHECK:STDOUT: %Generic: type = class_type @Generic, @Generic(%T.8b3) [symbolic] -// CHECK:STDOUT: %WrongType.type.c41: type = fn_type @WrongType.1, @Generic(%T.8b3) [symbolic] -// CHECK:STDOUT: %WrongType.408: %WrongType.type.c41 = struct_value () [symbolic] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %T.7a6: %empty_tuple.type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %WrongType.type.edf: type = fn_type @WrongType.2 [concrete] -// CHECK:STDOUT: %WrongType.131: %WrongType.type.edf = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Generic = %Generic.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Generic.decl: %Generic.type = class_decl @Generic [concrete = constants.%Generic.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc4_15.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_15.2 (constants.%T.8b3)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %WrongType.decl: %WrongType.type.edf = fn_decl @WrongType.2 [concrete = constants.%WrongType.131] {} { -// CHECK:STDOUT: %.loc15_17.1: type = splice_block %.loc15_17.3 [concrete = constants.%empty_tuple.type] { -// CHECK:STDOUT: %.loc15_17.2: %empty_tuple.type = tuple_literal () -// CHECK:STDOUT: %.loc15_17.3: type = converted %.loc15_17.2, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] -// CHECK:STDOUT: } -// CHECK:STDOUT: %T.loc15_12.1: %empty_tuple.type = bind_symbolic_name T, 0 [symbolic = %T.loc15_12.2 (constants.%T.7a6)] -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Generic(%T.loc4_15.1: type) { -// CHECK:STDOUT: %T.loc4_15.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_15.2 (constants.%T.8b3)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %WrongType.type: type = fn_type @WrongType.1, @Generic(%T.loc4_15.2) [symbolic = %WrongType.type (constants.%WrongType.type.c41)] -// CHECK:STDOUT: %WrongType: @Generic.%WrongType.type (%WrongType.type.c41) = struct_value () [symbolic = %WrongType (constants.%WrongType.408)] -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %WrongType.decl: @Generic.%WrongType.type (%WrongType.type.c41) = fn_decl @WrongType.1 [symbolic = @Generic.%WrongType (constants.%WrongType.408)] {} {} -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Generic -// CHECK:STDOUT: .WrongType = %WrongType.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @WrongType.1(@Generic.%T.loc4_15.1: type) { -// CHECK:STDOUT: fn(); -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @WrongType.2(%T.loc15_12.1: %empty_tuple.type) { -// CHECK:STDOUT: %T.loc15_12.2: %empty_tuple.type = bind_symbolic_name T, 0 [symbolic = %T.loc15_12.2 (constants.%T.7a6)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: -// CHECK:STDOUT: fn() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Generic(constants.%T.8b3) { -// CHECK:STDOUT: %T.loc4_15.2 => constants.%T.8b3 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @WrongType.1(constants.%T.8b3) {} -// CHECK:STDOUT: -// CHECK:STDOUT: specific @WrongType.2(constants.%T.7a6) { -// CHECK:STDOUT: %T.loc15_12.2 => constants.%T.7a6 -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/generic/member_type.carbon b/toolchain/check/testdata/class/generic/member_type.carbon index 9c4bf81801f68..8237b733cfa9f 100644 --- a/toolchain/check/testdata/class/generic/member_type.carbon +++ b/toolchain/check/testdata/class/generic/member_type.carbon @@ -2,6 +2,8 @@ // Exceptions. See /LICENSE for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// // AUTOUPDATE // TIP: To test this file alone, run: // TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/generic/member_type.carbon @@ -13,15 +15,19 @@ library "[[@TEST_NAME]]"; class Outer(T:! type) { + //@dump-sem-ir-begin class Inner { var n: T; } + //@dump-sem-ir-end fn F(n: T) -> Inner { return {.n = n}; } } fn Test() -> i32 { + //@dump-sem-ir-begin var c: Outer(i32).Inner = Outer(i32).F(1); + //@dump-sem-ir-end return c.n; } @@ -30,9 +36,11 @@ fn Test() -> i32 { library "[[@TEST_NAME]]"; class Outer(T:! type) { + //@dump-sem-ir-begin interface Inner { fn F[self: Self]() -> T; } + //@dump-sem-ir-end class C { impl as Inner { @@ -48,15 +56,16 @@ class D { } fn Test() -> i32 { + //@dump-sem-ir-begin var c: Outer(i32).C = {}; return c.(Outer(i32).Inner.F)(); + //@dump-sem-ir-end } // CHECK:STDOUT: --- class.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { // CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] // CHECK:STDOUT: %Outer.type: type = generic_class_type @Outer [concrete] // CHECK:STDOUT: %Outer.generic: %Outer.type = struct_value () [concrete] // CHECK:STDOUT: %Outer.9d6: type = class_type @Outer, @Outer(%T) [symbolic] @@ -65,20 +74,10 @@ fn Test() -> i32 { // CHECK:STDOUT: %Inner.elem.310: type = unbound_element_type %Inner.51b, %T [symbolic] // CHECK:STDOUT: %struct_type.n.848: type = struct_type {.n: %T} [symbolic] // CHECK:STDOUT: %complete_type.84b: = complete_type_witness %struct_type.n.848 [symbolic] -// CHECK:STDOUT: %pattern_type.7dcd0a.1: type = pattern_type %T [symbolic] -// CHECK:STDOUT: %pattern_type.253: type = pattern_type %Inner.51b [symbolic] // CHECK:STDOUT: %F.type.2ee: type = fn_type @F, @Outer(%T) [symbolic] // CHECK:STDOUT: %F.384: %F.type.2ee = struct_value () [symbolic] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %require_complete.561: = require_complete_type %Inner.51b [symbolic] // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %Test.type: type = fn_type @Test [concrete] -// CHECK:STDOUT: %Test: %Test.type = struct_value () [concrete] // CHECK:STDOUT: %i32.builtin: type = int_type signed, %int_32 [concrete] // CHECK:STDOUT: %complete_type.f8a: = complete_type_witness %i32.builtin [concrete] // CHECK:STDOUT: %Outer.545: type = class_type @Outer, @Outer(%i32) [concrete] @@ -91,8 +90,6 @@ fn Test() -> i32 { // CHECK:STDOUT: %pattern_type.c22: type = pattern_type %Inner.721 [concrete] // CHECK:STDOUT: %int_1.5b8: Core.IntLiteral = int_value 1 [concrete] // CHECK:STDOUT: %F.specific_fn: = specific_function %F.c88, @F(%i32) [concrete] -// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] // CHECK:STDOUT: %ImplicitAs.type.205: type = facet_type <@ImplicitAs, @ImplicitAs(%i32)> [concrete] // CHECK:STDOUT: %Convert.type.1b6: type = fn_type @Convert.1, @ImplicitAs(%i32) [concrete] // CHECK:STDOUT: %To.c80: Core.IntLiteral = bind_symbolic_name To, 0 [symbolic] @@ -110,67 +107,20 @@ fn Test() -> i32 { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/operators/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] // CHECK:STDOUT: %Core.import_ref.a5b: @impl.4f9.%Convert.type (%Convert.type.0f9) = import_ref Core//prelude/types/int, loc19_39, loaded [symbolic = @impl.4f9.%Convert (constants.%Convert.f06)] // CHECK:STDOUT: %ImplicitAs.impl_witness_table.a2f = impl_witness_table (%Core.import_ref.a5b), @impl.4f9 [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Outer = %Outer.decl -// CHECK:STDOUT: .Test = %Test.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Outer.decl: %Outer.type = class_decl @Outer [concrete = constants.%Outer.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc4_13.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_13.2 (constants.%T)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %Test.decl: %Test.type = fn_decl @Test [concrete = constants.%Test] { -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32.loc12: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc12: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param0 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: // CHECK:STDOUT: generic class @Outer(%T.loc4_13.1: type) { -// CHECK:STDOUT: %T.loc4_13.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_13.2 (constants.%T)] +// CHECK:STDOUT: // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %Inner: type = class_type @Inner, @Inner(%T.loc4_13.2) [symbolic = %Inner (constants.%Inner.51b)] -// CHECK:STDOUT: %F.type: type = fn_type @F, @Outer(%T.loc4_13.2) [symbolic = %F.type (constants.%F.type.2ee)] -// CHECK:STDOUT: %F: @Outer.%F.type (%F.type.2ee) = struct_value () [symbolic = %F (constants.%F.384)] +// CHECK:STDOUT: // CHECK:STDOUT: // CHECK:STDOUT: class { // CHECK:STDOUT: %Inner.decl: type = class_decl @Inner [symbolic = @Outer.%Inner (constants.%Inner.51b)] {} {} -// CHECK:STDOUT: %F.decl: @Outer.%F.type (%F.type.2ee) = fn_decl @F [symbolic = @Outer.%F (constants.%F.384)] { -// CHECK:STDOUT: %n.patt: @F.%pattern_type.loc9_8 (%pattern_type.7dcd0a.1) = binding_pattern n [concrete] -// CHECK:STDOUT: %n.param_patt: @F.%pattern_type.loc9_8 (%pattern_type.7dcd0a.1) = value_param_pattern %n.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: @F.%pattern_type.loc9_14 (%pattern_type.253) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @F.%pattern_type.loc9_14 (%pattern_type.253) = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %.loc9_17: type = specific_constant @Outer.%Inner.decl, @Outer(constants.%T) [symbolic = %Inner (constants.%Inner.51b)] -// CHECK:STDOUT: %Inner.ref: type = name_ref Inner, %.loc9_17 [symbolic = %Inner (constants.%Inner.51b)] -// CHECK:STDOUT: %n.param: @F.%T (%T) = value_param call_param0 -// CHECK:STDOUT: %T.ref: type = name_ref T, @Outer.%T.loc4_13.1 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %n: @F.%T (%T) = bind_name n, %n.param -// CHECK:STDOUT: %return.param: ref @F.%Inner (%Inner.51b) = out_param call_param1 -// CHECK:STDOUT: %return: ref @F.%Inner (%Inner.51b) = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] +// CHECK:STDOUT: // CHECK:STDOUT: complete_type_witness = %complete_type // CHECK:STDOUT: // CHECK:STDOUT: !members: @@ -187,43 +137,20 @@ fn Test() -> i32 { // CHECK:STDOUT: %require_complete: = require_complete_type %T [symbolic = %require_complete (constants.%require_complete.4ae)] // CHECK:STDOUT: %Inner: type = class_type @Inner, @Inner(%T) [symbolic = %Inner (constants.%Inner.51b)] // CHECK:STDOUT: %Inner.elem: type = unbound_element_type %Inner, %T [symbolic = %Inner.elem (constants.%Inner.elem.310)] -// CHECK:STDOUT: %struct_type.n.loc7_3.2: type = struct_type {.n: @Inner.%T (%T)} [symbolic = %struct_type.n.loc7_3.2 (constants.%struct_type.n.848)] -// CHECK:STDOUT: %complete_type.loc7_3.2: = complete_type_witness %struct_type.n.loc7_3.2 [symbolic = %complete_type.loc7_3.2 (constants.%complete_type.84b)] +// CHECK:STDOUT: %struct_type.n.loc8_3.2: type = struct_type {.n: @Inner.%T (%T)} [symbolic = %struct_type.n.loc8_3.2 (constants.%struct_type.n.848)] +// CHECK:STDOUT: %complete_type.loc8_3.2: = complete_type_witness %struct_type.n.loc8_3.2 [symbolic = %complete_type.loc8_3.2 (constants.%complete_type.84b)] // CHECK:STDOUT: // CHECK:STDOUT: class { // CHECK:STDOUT: %T.ref: type = name_ref T, @Outer.%T.loc4_13.1 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %.loc6: @Inner.%Inner.elem (%Inner.elem.310) = field_decl n, element0 [concrete] -// CHECK:STDOUT: %struct_type.n.loc7_3.1: type = struct_type {.n: %T} [symbolic = %struct_type.n.loc7_3.2 (constants.%struct_type.n.848)] -// CHECK:STDOUT: %complete_type.loc7_3.1: = complete_type_witness %struct_type.n.loc7_3.1 [symbolic = %complete_type.loc7_3.2 (constants.%complete_type.84b)] -// CHECK:STDOUT: complete_type_witness = %complete_type.loc7_3.1 +// CHECK:STDOUT: %.loc7: @Inner.%Inner.elem (%Inner.elem.310) = field_decl n, element0 [concrete] +// CHECK:STDOUT: %struct_type.n.loc8_3.1: type = struct_type {.n: %T} [symbolic = %struct_type.n.loc8_3.2 (constants.%struct_type.n.848)] +// CHECK:STDOUT: %complete_type.loc8_3.1: = complete_type_witness %struct_type.n.loc8_3.1 [symbolic = %complete_type.loc8_3.2 (constants.%complete_type.84b)] +// CHECK:STDOUT: complete_type_witness = %complete_type.loc8_3.1 // CHECK:STDOUT: // CHECK:STDOUT: !members: // CHECK:STDOUT: .Self = constants.%Inner.51b // CHECK:STDOUT: .T = -// CHECK:STDOUT: .n = %.loc6 -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @F(@Outer.%T.loc4_13.1: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %pattern_type.loc9_8: type = pattern_type %T [symbolic = %pattern_type.loc9_8 (constants.%pattern_type.7dcd0a.1)] -// CHECK:STDOUT: %Inner: type = class_type @Inner, @Inner(%T) [symbolic = %Inner (constants.%Inner.51b)] -// CHECK:STDOUT: %pattern_type.loc9_14: type = pattern_type %Inner [symbolic = %pattern_type.loc9_14 (constants.%pattern_type.253)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete.loc9_14: = require_complete_type %Inner [symbolic = %require_complete.loc9_14 (constants.%require_complete.561)] -// CHECK:STDOUT: %require_complete.loc9_9: = require_complete_type %T [symbolic = %require_complete.loc9_9 (constants.%require_complete.4ae)] -// CHECK:STDOUT: %struct_type.n: type = struct_type {.n: @F.%T (%T)} [symbolic = %struct_type.n (constants.%struct_type.n.848)] -// CHECK:STDOUT: -// CHECK:STDOUT: fn(%n.param: @F.%T (%T)) -> %return.param: @F.%Inner (%Inner.51b) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %n.ref: @F.%T (%T) = name_ref n, %n -// CHECK:STDOUT: %.loc9_39.1: @F.%struct_type.n (%struct_type.n.848) = struct_literal (%n.ref) -// CHECK:STDOUT: %.loc9_39.2: ref @F.%T (%T) = class_element_access %return, element0 -// CHECK:STDOUT: %.loc9_39.3: init @F.%T (%T) = initialize_from %n.ref to %.loc9_39.2 -// CHECK:STDOUT: %.loc9_39.4: init @F.%Inner (%Inner.51b) = class_init (%.loc9_39.3), %return -// CHECK:STDOUT: %.loc9_40: init @F.%Inner (%Inner.51b) = converted %.loc9_39.1, %.loc9_39.4 -// CHECK:STDOUT: return %.loc9_40 to %return +// CHECK:STDOUT: .n = %.loc7 // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: @@ -234,38 +161,34 @@ fn Test() -> i32 { // CHECK:STDOUT: %c.var_patt: %pattern_type.c22 = var_pattern %c.patt [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: %c.var: ref %Inner.721 = var %c.var_patt -// CHECK:STDOUT: %Outer.ref.loc13_29: %Outer.type = name_ref Outer, file.%Outer.decl [concrete = constants.%Outer.generic] -// CHECK:STDOUT: %int_32.loc13_35: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc13_35: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %Outer.loc13_38: type = class_type @Outer, @Outer(constants.%i32) [concrete = constants.%Outer.545] -// CHECK:STDOUT: %.loc13_39: %F.type.9d7 = specific_constant @Outer.%F.decl, @Outer(constants.%i32) [concrete = constants.%F.c88] -// CHECK:STDOUT: %F.ref: %F.type.9d7 = name_ref F, %.loc13_39 [concrete = constants.%F.c88] +// CHECK:STDOUT: %Outer.ref.loc16_29: %Outer.type = name_ref Outer, file.%Outer.decl [concrete = constants.%Outer.generic] +// CHECK:STDOUT: %int_32.loc16_35: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] +// CHECK:STDOUT: %i32.loc16_35: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] +// CHECK:STDOUT: %Outer.loc16_38: type = class_type @Outer, @Outer(constants.%i32) [concrete = constants.%Outer.545] +// CHECK:STDOUT: %.loc16_39: %F.type.9d7 = specific_constant @Outer.%F.decl, @Outer(constants.%i32) [concrete = constants.%F.c88] +// CHECK:STDOUT: %F.ref: %F.type.9d7 = name_ref F, %.loc16_39 [concrete = constants.%F.c88] // CHECK:STDOUT: %int_1: Core.IntLiteral = int_value 1 [concrete = constants.%int_1.5b8] // CHECK:STDOUT: %F.specific_fn: = specific_function %F.ref, @F(constants.%i32) [concrete = constants.%F.specific_fn] -// CHECK:STDOUT: %.loc13_3: ref %Inner.721 = splice_block %c.var {} +// CHECK:STDOUT: %.loc16_3: ref %Inner.721 = splice_block %c.var {} // CHECK:STDOUT: %impl.elem0: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc13_42.1: = bound_method %int_1, %impl.elem0 [concrete = constants.%Convert.bound] +// CHECK:STDOUT: %bound_method.loc16_42.1: = bound_method %int_1, %impl.elem0 [concrete = constants.%Convert.bound] // CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc13_42.2: = bound_method %int_1, %specific_fn [concrete = constants.%bound_method] -// CHECK:STDOUT: %int.convert_checked: init %i32 = call %bound_method.loc13_42.2(%int_1) [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %.loc13_42.1: %i32 = value_of_initializer %int.convert_checked [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %.loc13_42.2: %i32 = converted %int_1, %.loc13_42.1 [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %F.call: init %Inner.721 = call %F.specific_fn(%.loc13_42.2) to %.loc13_3 +// CHECK:STDOUT: %bound_method.loc16_42.2: = bound_method %int_1, %specific_fn [concrete = constants.%bound_method] +// CHECK:STDOUT: %int.convert_checked: init %i32 = call %bound_method.loc16_42.2(%int_1) [concrete = constants.%int_1.5d2] +// CHECK:STDOUT: %.loc16_42.1: %i32 = value_of_initializer %int.convert_checked [concrete = constants.%int_1.5d2] +// CHECK:STDOUT: %.loc16_42.2: %i32 = converted %int_1, %.loc16_42.1 [concrete = constants.%int_1.5d2] +// CHECK:STDOUT: %F.call: init %Inner.721 = call %F.specific_fn(%.loc16_42.2) to %.loc16_3 // CHECK:STDOUT: assign %c.var, %F.call -// CHECK:STDOUT: %.loc13_20.1: type = splice_block %Inner.ref [concrete = constants.%Inner.721] { -// CHECK:STDOUT: %Outer.ref.loc13_10: %Outer.type = name_ref Outer, file.%Outer.decl [concrete = constants.%Outer.generic] -// CHECK:STDOUT: %int_32.loc13_16: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc13_16: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %Outer.loc13_19: type = class_type @Outer, @Outer(constants.%i32) [concrete = constants.%Outer.545] -// CHECK:STDOUT: %.loc13_20.2: type = specific_constant @Outer.%Inner.decl, @Outer(constants.%i32) [concrete = constants.%Inner.721] -// CHECK:STDOUT: %Inner.ref: type = name_ref Inner, %.loc13_20.2 [concrete = constants.%Inner.721] +// CHECK:STDOUT: %.loc16_20.1: type = splice_block %Inner.ref [concrete = constants.%Inner.721] { +// CHECK:STDOUT: %Outer.ref.loc16_10: %Outer.type = name_ref Outer, file.%Outer.decl [concrete = constants.%Outer.generic] +// CHECK:STDOUT: %int_32.loc16_16: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] +// CHECK:STDOUT: %i32.loc16_16: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] +// CHECK:STDOUT: %Outer.loc16_19: type = class_type @Outer, @Outer(constants.%i32) [concrete = constants.%Outer.545] +// CHECK:STDOUT: %.loc16_20.2: type = specific_constant @Outer.%Inner.decl, @Outer(constants.%i32) [concrete = constants.%Inner.721] +// CHECK:STDOUT: %Inner.ref: type = name_ref Inner, %.loc16_20.2 [concrete = constants.%Inner.721] // CHECK:STDOUT: } // CHECK:STDOUT: %c: ref %Inner.721 = bind_name c, %c.var -// CHECK:STDOUT: %c.ref: ref %Inner.721 = name_ref c, %c -// CHECK:STDOUT: %n.ref: %Inner.elem.6c2 = name_ref n, @Inner.%.loc6 [concrete = @Inner.%.loc6] -// CHECK:STDOUT: %.loc14_11.1: ref %i32 = class_element_access %c.ref, element0 -// CHECK:STDOUT: %.loc14_11.2: %i32 = bind_value %.loc14_11.1 -// CHECK:STDOUT: return %.loc14_11.2 +// CHECK:STDOUT: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Outer(constants.%T) { @@ -283,15 +206,8 @@ fn Test() -> i32 { // CHECK:STDOUT: %require_complete => constants.%require_complete.4ae // CHECK:STDOUT: %Inner => constants.%Inner.51b // CHECK:STDOUT: %Inner.elem => constants.%Inner.elem.310 -// CHECK:STDOUT: %struct_type.n.loc7_3.2 => constants.%struct_type.n.848 -// CHECK:STDOUT: %complete_type.loc7_3.2 => constants.%complete_type.84b -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @F(constants.%T) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %pattern_type.loc9_8 => constants.%pattern_type.7dcd0a.1 -// CHECK:STDOUT: %Inner => constants.%Inner.51b -// CHECK:STDOUT: %pattern_type.loc9_14 => constants.%pattern_type.253 +// CHECK:STDOUT: %struct_type.n.loc8_3.2 => constants.%struct_type.n.848 +// CHECK:STDOUT: %complete_type.loc8_3.2 => constants.%complete_type.84b // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Outer(constants.%i32) { @@ -309,27 +225,14 @@ fn Test() -> i32 { // CHECK:STDOUT: %require_complete => constants.%complete_type.f8a // CHECK:STDOUT: %Inner => constants.%Inner.721 // CHECK:STDOUT: %Inner.elem => constants.%Inner.elem.6c2 -// CHECK:STDOUT: %struct_type.n.loc7_3.2 => constants.%struct_type.n.033 -// CHECK:STDOUT: %complete_type.loc7_3.2 => constants.%complete_type.54b -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @F(constants.%i32) { -// CHECK:STDOUT: %T => constants.%i32 -// CHECK:STDOUT: %pattern_type.loc9_8 => constants.%pattern_type.7ce -// CHECK:STDOUT: %Inner => constants.%Inner.721 -// CHECK:STDOUT: %pattern_type.loc9_14 => constants.%pattern_type.c22 -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete.loc9_14 => constants.%complete_type.54b -// CHECK:STDOUT: %require_complete.loc9_9 => constants.%complete_type.f8a -// CHECK:STDOUT: %struct_type.n => constants.%struct_type.n.033 +// CHECK:STDOUT: %struct_type.n.loc8_3.2 => constants.%struct_type.n.033 +// CHECK:STDOUT: %complete_type.loc8_3.2 => constants.%complete_type.54b // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- interface.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { // CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] // CHECK:STDOUT: %Outer.type: type = generic_class_type @Outer [concrete] // CHECK:STDOUT: %Outer.generic: %Outer.type = struct_value () [concrete] // CHECK:STDOUT: %Outer.9d6: type = class_type @Outer, @Outer(%T) [symbolic] @@ -343,25 +246,14 @@ fn Test() -> i32 { // CHECK:STDOUT: %Inner.assoc_type.115: type = assoc_entity_type @Inner, @Inner(%T) [symbolic] // CHECK:STDOUT: %assoc0.95e: %Inner.assoc_type.115 = assoc_entity element0, @Inner.%F.decl [symbolic] // CHECK:STDOUT: %C.390: type = class_type @C, @C(%T) [symbolic] -// CHECK:STDOUT: %require_complete.8fa: = require_complete_type %Inner.type.392 [symbolic] // CHECK:STDOUT: %Inner.impl_witness.b15: = impl_witness @C.%Inner.impl_witness_table, @impl.eed(%T) [symbolic] // CHECK:STDOUT: %pattern_type.e59: type = pattern_type %C.390 [symbolic] -// CHECK:STDOUT: %F.type.77b: type = fn_type @F.2, @impl.eed(%T) [symbolic] -// CHECK:STDOUT: %F.ed9: %F.type.77b = struct_value () [symbolic] // CHECK:STDOUT: %Inner.facet.9a3: %Inner.type.392 = facet_value %C.390, (%Inner.impl_witness.b15) [symbolic] // CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T [symbolic] -// CHECK:STDOUT: %require_complete.930: = require_complete_type %C.390 [symbolic] // CHECK:STDOUT: %Inner.lookup_impl_witness: = lookup_impl_witness %C.390, @Inner, @Inner(%T) [symbolic] // CHECK:STDOUT: %Inner.facet.c18: %Inner.type.392 = facet_value %C.390, (%Inner.lookup_impl_witness) [symbolic] -// CHECK:STDOUT: %.692: type = fn_type_with_self_type %F.type.0f3, %Inner.facet.c18 [symbolic] -// CHECK:STDOUT: %impl.elem0: %.692 = impl_witness_access %Inner.lookup_impl_witness, element0 [symbolic] -// CHECK:STDOUT: %specific_impl_fn: = specific_impl_function %impl.elem0, @F.1(%T, %Inner.facet.c18) [symbolic] // CHECK:STDOUT: %D: type = class_type @D [concrete] // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %Outer.545: type = class_type @Outer, @Outer(%i32) [concrete] // CHECK:STDOUT: %Inner.type.52d: type = facet_type <@Inner, @Inner(%i32)> [concrete] @@ -374,16 +266,9 @@ fn Test() -> i32 { // CHECK:STDOUT: %Inner.impl_witness.1dc: = impl_witness @D.%Inner.impl_witness_table [concrete] // CHECK:STDOUT: %pattern_type.510: type = pattern_type %D [concrete] // CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %F.type.a78: type = fn_type @F.3 [concrete] -// CHECK:STDOUT: %F.a24: %F.type.a78 = struct_value () [concrete] // CHECK:STDOUT: %Inner.facet.edc: %Inner.type.52d = facet_value %D, (%Inner.impl_witness.1dc) [concrete] -// CHECK:STDOUT: %Test.type: type = fn_type @Test [concrete] -// CHECK:STDOUT: %Test: %Test.type = struct_value () [concrete] -// CHECK:STDOUT: %i32.builtin: type = int_type signed, %int_32 [concrete] -// CHECK:STDOUT: %complete_type.f8a: = complete_type_witness %i32.builtin [concrete] // CHECK:STDOUT: %pattern_type.de9: type = pattern_type %C.70f [concrete] // CHECK:STDOUT: %C.val: %C.70f = struct_value () [concrete] -// CHECK:STDOUT: %complete_type.9fa: = complete_type_witness %Inner.type.52d [concrete] // CHECK:STDOUT: %Inner.impl_witness.47d: = impl_witness @C.%Inner.impl_witness_table, @impl.eed(%i32) [concrete] // CHECK:STDOUT: %F.type.f11: type = fn_type @F.2, @impl.eed(%i32) [concrete] // CHECK:STDOUT: %F.e75: %F.type.f11 = struct_value () [concrete] @@ -393,151 +278,56 @@ fn Test() -> i32 { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Outer = %Outer.decl -// CHECK:STDOUT: .D = %D.decl -// CHECK:STDOUT: .Test = %Test.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Outer.decl: %Outer.type = class_decl @Outer [concrete = constants.%Outer.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc4_13.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_13.2 (constants.%T)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %D.decl: type = class_decl @D [concrete = constants.%D] {} {} -// CHECK:STDOUT: %Test.decl: %Test.type = fn_decl @Test [concrete = constants.%Test] { -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32.loc22: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc22: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param0 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic interface @Inner(@Outer.%T.loc4_13.1: type) { // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %Inner.type: type = facet_type <@Inner, @Inner(%T)> [symbolic = %Inner.type (constants.%Inner.type.392)] -// CHECK:STDOUT: %Self.2: @Inner.%Inner.type (%Inner.type.392) = bind_symbolic_name Self, 1 [symbolic = %Self.2 (constants.%Self.770)] +// CHECK:STDOUT: // CHECK:STDOUT: %F.type: type = fn_type @F.1, @Inner(%T) [symbolic = %F.type (constants.%F.type.0f3)] // CHECK:STDOUT: %F: @Inner.%F.type (%F.type.0f3) = struct_value () [symbolic = %F (constants.%F.db9)] // CHECK:STDOUT: %Inner.assoc_type: type = assoc_entity_type @Inner, @Inner(%T) [symbolic = %Inner.assoc_type (constants.%Inner.assoc_type.115)] -// CHECK:STDOUT: %assoc0.loc6_28.2: @Inner.%Inner.assoc_type (%Inner.assoc_type.115) = assoc_entity element0, %F.decl [symbolic = %assoc0.loc6_28.2 (constants.%assoc0.95e)] +// CHECK:STDOUT: %assoc0.loc7_28.2: @Inner.%Inner.assoc_type (%Inner.assoc_type.115) = assoc_entity element0, %F.decl [symbolic = %assoc0.loc7_28.2 (constants.%assoc0.95e)] // CHECK:STDOUT: // CHECK:STDOUT: interface { -// CHECK:STDOUT: %Self.1: @Inner.%Inner.type (%Inner.type.392) = bind_symbolic_name Self, 1 [symbolic = %Self.2 (constants.%Self.770)] +// CHECK:STDOUT: // CHECK:STDOUT: %F.decl: @Inner.%F.type (%F.type.0f3) = fn_decl @F.1 [symbolic = @Inner.%F (constants.%F.db9)] { -// CHECK:STDOUT: %self.patt: @F.1.%pattern_type.loc6_10 (%pattern_type.81e) = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: @F.1.%pattern_type.loc6_10 (%pattern_type.81e) = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: @F.1.%pattern_type.loc6_24 (%pattern_type.7dcd0a.1) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @F.1.%pattern_type.loc6_24 (%pattern_type.7dcd0a.1) = out_param_pattern %return.patt, call_param1 [concrete] +// CHECK:STDOUT: %self.patt: @F.1.%pattern_type.loc7_10 (%pattern_type.81e) = binding_pattern self [concrete] +// CHECK:STDOUT: %self.param_patt: @F.1.%pattern_type.loc7_10 (%pattern_type.81e) = value_param_pattern %self.patt, call_param0 [concrete] +// CHECK:STDOUT: %return.patt: @F.1.%pattern_type.loc7_24 (%pattern_type.7dcd0a.1) = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: @F.1.%pattern_type.loc7_24 (%pattern_type.7dcd0a.1) = out_param_pattern %return.patt, call_param1 [concrete] // CHECK:STDOUT: } { // CHECK:STDOUT: %T.ref: type = name_ref T, @Outer.%T.loc4_13.1 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %self.param: @F.1.%Self.as_type.loc6_16.1 (%Self.as_type.ea1) = value_param call_param0 -// CHECK:STDOUT: %.loc6_16.1: type = splice_block %.loc6_16.3 [symbolic = %Self.as_type.loc6_16.1 (constants.%Self.as_type.ea1)] { -// CHECK:STDOUT: %.loc6_16.2: @F.1.%Inner.type (%Inner.type.392) = specific_constant @Inner.%Self.1, @Inner(constants.%T) [symbolic = %Self (constants.%Self.770)] -// CHECK:STDOUT: %Self.ref: @F.1.%Inner.type (%Inner.type.392) = name_ref Self, %.loc6_16.2 [symbolic = %Self (constants.%Self.770)] -// CHECK:STDOUT: %Self.as_type.loc6_16.2: type = facet_access_type %Self.ref [symbolic = %Self.as_type.loc6_16.1 (constants.%Self.as_type.ea1)] -// CHECK:STDOUT: %.loc6_16.3: type = converted %Self.ref, %Self.as_type.loc6_16.2 [symbolic = %Self.as_type.loc6_16.1 (constants.%Self.as_type.ea1)] +// CHECK:STDOUT: %self.param: @F.1.%Self.as_type.loc7_16.1 (%Self.as_type.ea1) = value_param call_param0 +// CHECK:STDOUT: %.loc7_16.1: type = splice_block %.loc7_16.3 [symbolic = %Self.as_type.loc7_16.1 (constants.%Self.as_type.ea1)] { +// CHECK:STDOUT: %.loc7_16.2: @F.1.%Inner.type (%Inner.type.392) = specific_constant @Inner.%Self.1, @Inner(constants.%T) [symbolic = %Self (constants.%Self.770)] +// CHECK:STDOUT: %Self.ref: @F.1.%Inner.type (%Inner.type.392) = name_ref Self, %.loc7_16.2 [symbolic = %Self (constants.%Self.770)] +// CHECK:STDOUT: %Self.as_type.loc7_16.2: type = facet_access_type %Self.ref [symbolic = %Self.as_type.loc7_16.1 (constants.%Self.as_type.ea1)] +// CHECK:STDOUT: %.loc7_16.3: type = converted %Self.ref, %Self.as_type.loc7_16.2 [symbolic = %Self.as_type.loc7_16.1 (constants.%Self.as_type.ea1)] // CHECK:STDOUT: } -// CHECK:STDOUT: %self: @F.1.%Self.as_type.loc6_16.1 (%Self.as_type.ea1) = bind_name self, %self.param +// CHECK:STDOUT: %self: @F.1.%Self.as_type.loc7_16.1 (%Self.as_type.ea1) = bind_name self, %self.param // CHECK:STDOUT: %return.param: ref @F.1.%T (%T) = out_param call_param1 // CHECK:STDOUT: %return: ref @F.1.%T (%T) = return_slot %return.param // CHECK:STDOUT: } -// CHECK:STDOUT: %assoc0.loc6_28.1: @Inner.%Inner.assoc_type (%Inner.assoc_type.115) = assoc_entity element0, %F.decl [symbolic = %assoc0.loc6_28.2 (constants.%assoc0.95e)] +// CHECK:STDOUT: %assoc0.loc7_28.1: @Inner.%Inner.assoc_type (%Inner.assoc_type.115) = assoc_entity element0, %F.decl [symbolic = %assoc0.loc7_28.2 (constants.%assoc0.95e)] // CHECK:STDOUT: // CHECK:STDOUT: !members: // CHECK:STDOUT: .Self = %Self.1 // CHECK:STDOUT: .T = -// CHECK:STDOUT: .F = %assoc0.loc6_28.1 +// CHECK:STDOUT: .F = %assoc0.loc7_28.1 // CHECK:STDOUT: witness = (%F.decl) // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic impl @impl.eed(@Outer.%T.loc4_13.1: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %C: type = class_type @C, @C(%T) [symbolic = %C (constants.%C.390)] -// CHECK:STDOUT: %Inner.type: type = facet_type <@Inner, @Inner(%T)> [symbolic = %Inner.type (constants.%Inner.type.392)] -// CHECK:STDOUT: %require_complete: = require_complete_type %Inner.type [symbolic = %require_complete (constants.%require_complete.8fa)] -// CHECK:STDOUT: %Inner.impl_witness: = impl_witness @C.%Inner.impl_witness_table, @impl.eed(%T) [symbolic = %Inner.impl_witness (constants.%Inner.impl_witness.b15)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %F.type: type = fn_type @F.2, @impl.eed(%T) [symbolic = %F.type (constants.%F.type.77b)] -// CHECK:STDOUT: %F: @impl.eed.%F.type (%F.type.77b) = struct_value () [symbolic = %F (constants.%F.ed9)] -// CHECK:STDOUT: -// CHECK:STDOUT: impl: %Self.ref as %Inner.ref { -// CHECK:STDOUT: %F.decl: @impl.eed.%F.type (%F.type.77b) = fn_decl @F.2 [symbolic = @impl.eed.%F (constants.%F.ed9)] { -// CHECK:STDOUT: %self.patt: @F.2.%pattern_type.loc11_12 (%pattern_type.e59) = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: @F.2.%pattern_type.loc11_12 (%pattern_type.e59) = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: @F.2.%pattern_type.loc11_23 (%pattern_type.7dcd0a.1) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @F.2.%pattern_type.loc11_23 (%pattern_type.7dcd0a.1) = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref: type = name_ref T, @Outer.%T.loc4_13.1 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %self.param: @F.2.%C (%C.390) = value_param call_param0 -// CHECK:STDOUT: %.loc11_18.1: type = splice_block %C.ref [symbolic = %C (constants.%C.390)] { -// CHECK:STDOUT: %.loc11_18.2: type = specific_constant @Outer.%C.decl, @Outer(constants.%T) [symbolic = %C (constants.%C.390)] -// CHECK:STDOUT: %C.ref: type = name_ref C, %.loc11_18.2 [symbolic = %C (constants.%C.390)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self: @F.2.%C (%C.390) = bind_name self, %self.param -// CHECK:STDOUT: %return.param: ref @F.2.%T (%T) = out_param call_param1 -// CHECK:STDOUT: %return: ref @F.2.%T (%T) = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .C = -// CHECK:STDOUT: .T = -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: .Inner = -// CHECK:STDOUT: witness = @C.%Inner.impl_witness -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: impl @impl.a83: %Self.ref as %Inner.ref { -// CHECK:STDOUT: %F.decl: %F.type.a78 = fn_decl @F.3 [concrete = constants.%F.a24] { -// CHECK:STDOUT: %self.patt: %pattern_type.510 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.510 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %self.param: %D = value_param call_param0 -// CHECK:STDOUT: %D.ref: type = name_ref D, file.%D.decl [concrete = constants.%D] -// CHECK:STDOUT: %self: %D = bind_name self, %self.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .D = -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: witness = @D.%Inner.impl_witness -// CHECK:STDOUT: } -// CHECK:STDOUT: // CHECK:STDOUT: generic class @Outer(%T.loc4_13.1: type) { -// CHECK:STDOUT: %T.loc4_13.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_13.2 (constants.%T)] +// CHECK:STDOUT: // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %Inner.type: type = facet_type <@Inner, @Inner(%T.loc4_13.2)> [symbolic = %Inner.type (constants.%Inner.type.392)] -// CHECK:STDOUT: %C: type = class_type @C, @C(%T.loc4_13.2) [symbolic = %C (constants.%C.390)] +// CHECK:STDOUT: // CHECK:STDOUT: // CHECK:STDOUT: class { // CHECK:STDOUT: %Inner.decl: type = interface_decl @Inner [symbolic = @Outer.%Inner.type (constants.%Inner.type.392)] {} {} -// CHECK:STDOUT: %C.decl: type = class_decl @C [symbolic = @Outer.%C (constants.%C.390)] {} {} -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] +// CHECK:STDOUT: // CHECK:STDOUT: complete_type_witness = %complete_type // CHECK:STDOUT: // CHECK:STDOUT: !members: @@ -548,102 +338,17 @@ fn Test() -> i32 { // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic class @C(@Outer.%T.loc4_13.1: type) { -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: impl_decl @impl.eed [concrete] {} { -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%C.390 [symbolic = %C (constants.%C.390)] -// CHECK:STDOUT: %.loc10: type = specific_constant @Outer.%Inner.decl, @Outer(constants.%T) [symbolic = %Inner.type (constants.%Inner.type.392)] -// CHECK:STDOUT: %Inner.ref: type = name_ref Inner, %.loc10 [symbolic = %Inner.type (constants.%Inner.type.392)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %Inner.impl_witness_table = impl_witness_table (@impl.eed.%F.decl), @impl.eed [concrete] -// CHECK:STDOUT: %Inner.impl_witness: = impl_witness %Inner.impl_witness_table, @impl.eed(constants.%T) [symbolic = @impl.eed.%Inner.impl_witness (constants.%Inner.impl_witness.b15)] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%C.390 -// CHECK:STDOUT: .Inner = -// CHECK:STDOUT: .C = -// CHECK:STDOUT: .T = -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @D { -// CHECK:STDOUT: impl_decl @impl.a83 [concrete] {} { -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%D [concrete = constants.%D] -// CHECK:STDOUT: %Outer.ref: %Outer.type = name_ref Outer, file.%Outer.decl [concrete = constants.%Outer.generic] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %Outer: type = class_type @Outer, @Outer(constants.%i32) [concrete = constants.%Outer.545] -// CHECK:STDOUT: %.loc17: type = specific_constant @Outer.%Inner.decl, @Outer(constants.%i32) [concrete = constants.%Inner.type.52d] -// CHECK:STDOUT: %Inner.ref: type = name_ref Inner, %.loc17 [concrete = constants.%Inner.type.52d] -// CHECK:STDOUT: } -// CHECK:STDOUT: %Inner.impl_witness_table = impl_witness_table (@impl.a83.%F.decl), @impl.a83 [concrete] -// CHECK:STDOUT: %Inner.impl_witness: = impl_witness %Inner.impl_witness_table [concrete = constants.%Inner.impl_witness.1dc] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%D -// CHECK:STDOUT: .Outer = -// CHECK:STDOUT: .D = -// CHECK:STDOUT: } -// CHECK:STDOUT: // CHECK:STDOUT: generic fn @F.1(@Outer.%T.loc4_13.1: type, @Inner.%Self.1: @Inner.%Inner.type (%Inner.type.392)) { // CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] // CHECK:STDOUT: %Inner.type: type = facet_type <@Inner, @Inner(%T)> [symbolic = %Inner.type (constants.%Inner.type.392)] // CHECK:STDOUT: %Self: @F.1.%Inner.type (%Inner.type.392) = bind_symbolic_name Self, 1 [symbolic = %Self (constants.%Self.770)] -// CHECK:STDOUT: %Self.as_type.loc6_16.1: type = facet_access_type %Self [symbolic = %Self.as_type.loc6_16.1 (constants.%Self.as_type.ea1)] -// CHECK:STDOUT: %pattern_type.loc6_10: type = pattern_type %Self.as_type.loc6_16.1 [symbolic = %pattern_type.loc6_10 (constants.%pattern_type.81e)] -// CHECK:STDOUT: %pattern_type.loc6_24: type = pattern_type %T [symbolic = %pattern_type.loc6_24 (constants.%pattern_type.7dcd0a.1)] +// CHECK:STDOUT: %Self.as_type.loc7_16.1: type = facet_access_type %Self [symbolic = %Self.as_type.loc7_16.1 (constants.%Self.as_type.ea1)] +// CHECK:STDOUT: %pattern_type.loc7_10: type = pattern_type %Self.as_type.loc7_16.1 [symbolic = %pattern_type.loc7_10 (constants.%pattern_type.81e)] +// CHECK:STDOUT: %pattern_type.loc7_24: type = pattern_type %T [symbolic = %pattern_type.loc7_24 (constants.%pattern_type.7dcd0a.1)] // CHECK:STDOUT: -// CHECK:STDOUT: fn(%self.param: @F.1.%Self.as_type.loc6_16.1 (%Self.as_type.ea1)) -> @F.1.%T (%T); +// CHECK:STDOUT: fn(%self.param: @F.1.%Self.as_type.loc7_16.1 (%Self.as_type.ea1)) -> @F.1.%T (%T); // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic fn @F.2(@Outer.%T.loc4_13.1: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %C: type = class_type @C, @C(%T) [symbolic = %C (constants.%C.390)] -// CHECK:STDOUT: %pattern_type.loc11_12: type = pattern_type %C [symbolic = %pattern_type.loc11_12 (constants.%pattern_type.e59)] -// CHECK:STDOUT: %pattern_type.loc11_23: type = pattern_type %T [symbolic = %pattern_type.loc11_23 (constants.%pattern_type.7dcd0a.1)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete.loc11_23: = require_complete_type %T [symbolic = %require_complete.loc11_23 (constants.%require_complete.4ae)] -// CHECK:STDOUT: %require_complete.loc11_16: = require_complete_type %C [symbolic = %require_complete.loc11_16 (constants.%require_complete.930)] -// CHECK:STDOUT: %Inner.type: type = facet_type <@Inner, @Inner(%T)> [symbolic = %Inner.type (constants.%Inner.type.392)] -// CHECK:STDOUT: %require_complete.loc11_48: = require_complete_type %Inner.type [symbolic = %require_complete.loc11_48 (constants.%require_complete.8fa)] -// CHECK:STDOUT: %Inner.assoc_type: type = assoc_entity_type @Inner, @Inner(%T) [symbolic = %Inner.assoc_type (constants.%Inner.assoc_type.115)] -// CHECK:STDOUT: %assoc0: @F.2.%Inner.assoc_type (%Inner.assoc_type.115) = assoc_entity element0, @Inner.%F.decl [symbolic = %assoc0 (constants.%assoc0.95e)] -// CHECK:STDOUT: %Inner.lookup_impl_witness: = lookup_impl_witness %C, @Inner, @Inner(%T) [symbolic = %Inner.lookup_impl_witness (constants.%Inner.lookup_impl_witness)] -// CHECK:STDOUT: %F.type: type = fn_type @F.1, @Inner(%T) [symbolic = %F.type (constants.%F.type.0f3)] -// CHECK:STDOUT: %Inner.facet: @F.2.%Inner.type (%Inner.type.392) = facet_value %C, (%Inner.lookup_impl_witness) [symbolic = %Inner.facet (constants.%Inner.facet.c18)] -// CHECK:STDOUT: %.loc11_41: type = fn_type_with_self_type %F.type, %Inner.facet [symbolic = %.loc11_41 (constants.%.692)] -// CHECK:STDOUT: %impl.elem0.loc11_41.2: @F.2.%.loc11_41 (%.692) = impl_witness_access %Inner.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc11_41.2 (constants.%impl.elem0)] -// CHECK:STDOUT: %specific_impl_fn.loc11_41.2: = specific_impl_function %impl.elem0.loc11_41.2, @F.1(%T, %Inner.facet) [symbolic = %specific_impl_fn.loc11_41.2 (constants.%specific_impl_fn)] -// CHECK:STDOUT: -// CHECK:STDOUT: fn(%self.param: @F.2.%C (%C.390)) -> @F.2.%T (%T) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %self.ref: @F.2.%C (%C.390) = name_ref self, %self -// CHECK:STDOUT: %.loc11_43: type = specific_constant @Outer.%Inner.decl, @Outer(constants.%T) [symbolic = %Inner.type (constants.%Inner.type.392)] -// CHECK:STDOUT: %Inner.ref: type = name_ref Inner, %.loc11_43 [symbolic = %Inner.type (constants.%Inner.type.392)] -// CHECK:STDOUT: %.loc11_48: @F.2.%Inner.assoc_type (%Inner.assoc_type.115) = specific_constant @Inner.%assoc0.loc6_28.1, @Inner(constants.%T) [symbolic = %assoc0 (constants.%assoc0.95e)] -// CHECK:STDOUT: %F.ref: @F.2.%Inner.assoc_type (%Inner.assoc_type.115) = name_ref F, %.loc11_48 [symbolic = %assoc0 (constants.%assoc0.95e)] -// CHECK:STDOUT: %impl.elem0.loc11_41.1: @F.2.%.loc11_41 (%.692) = impl_witness_access constants.%Inner.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc11_41.2 (constants.%impl.elem0)] -// CHECK:STDOUT: %bound_method.loc11_41: = bound_method %self.ref, %impl.elem0.loc11_41.1 -// CHECK:STDOUT: %specific_impl_fn.loc11_41.1: = specific_impl_function %impl.elem0.loc11_41.1, @F.1(constants.%T, constants.%Inner.facet.c18) [symbolic = %specific_impl_fn.loc11_41.2 (constants.%specific_impl_fn)] -// CHECK:STDOUT: %bound_method.loc11_52: = bound_method %self.ref, %specific_impl_fn.loc11_41.1 -// CHECK:STDOUT: %.loc11_52: init @F.2.%T (%T) = call %bound_method.loc11_52(%self.ref) -// CHECK:STDOUT: %.loc11_53.1: @F.2.%T (%T) = value_of_initializer %.loc11_52 -// CHECK:STDOUT: %.loc11_53.2: @F.2.%T (%T) = converted %.loc11_52, %.loc11_53.1 -// CHECK:STDOUT: return %.loc11_53.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F.3(%self.param: %D) -> %i32; -// CHECK:STDOUT: // CHECK:STDOUT: fn @Test() -> %i32 { // CHECK:STDOUT: !entry: // CHECK:STDOUT: name_binding_decl { @@ -651,37 +356,37 @@ fn Test() -> i32 { // CHECK:STDOUT: %c.var_patt: %pattern_type.de9 = var_pattern %c.patt [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: %c.var: ref %C.70f = var %c.var_patt -// CHECK:STDOUT: %.loc23_26.1: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %.loc23_26.2: init %C.70f = class_init (), %c.var [concrete = constants.%C.val] -// CHECK:STDOUT: %.loc23_3: init %C.70f = converted %.loc23_26.1, %.loc23_26.2 [concrete = constants.%C.val] -// CHECK:STDOUT: assign %c.var, %.loc23_3 -// CHECK:STDOUT: %.loc23_20.1: type = splice_block %C.ref [concrete = constants.%C.70f] { -// CHECK:STDOUT: %Outer.ref.loc23: %Outer.type = name_ref Outer, file.%Outer.decl [concrete = constants.%Outer.generic] -// CHECK:STDOUT: %int_32.loc23: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc23: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %Outer.loc23: type = class_type @Outer, @Outer(constants.%i32) [concrete = constants.%Outer.545] -// CHECK:STDOUT: %.loc23_20.2: type = specific_constant @Outer.%C.decl, @Outer(constants.%i32) [concrete = constants.%C.70f] -// CHECK:STDOUT: %C.ref: type = name_ref C, %.loc23_20.2 [concrete = constants.%C.70f] +// CHECK:STDOUT: %.loc26_26.1: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc26_26.2: init %C.70f = class_init (), %c.var [concrete = constants.%C.val] +// CHECK:STDOUT: %.loc26_3: init %C.70f = converted %.loc26_26.1, %.loc26_26.2 [concrete = constants.%C.val] +// CHECK:STDOUT: assign %c.var, %.loc26_3 +// CHECK:STDOUT: %.loc26_20.1: type = splice_block %C.ref [concrete = constants.%C.70f] { +// CHECK:STDOUT: %Outer.ref.loc26: %Outer.type = name_ref Outer, file.%Outer.decl [concrete = constants.%Outer.generic] +// CHECK:STDOUT: %int_32.loc26: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] +// CHECK:STDOUT: %i32.loc26: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] +// CHECK:STDOUT: %Outer.loc26: type = class_type @Outer, @Outer(constants.%i32) [concrete = constants.%Outer.545] +// CHECK:STDOUT: %.loc26_20.2: type = specific_constant @Outer.%C.decl, @Outer(constants.%i32) [concrete = constants.%C.70f] +// CHECK:STDOUT: %C.ref: type = name_ref C, %.loc26_20.2 [concrete = constants.%C.70f] // CHECK:STDOUT: } // CHECK:STDOUT: %c: ref %C.70f = bind_name c, %c.var // CHECK:STDOUT: %c.ref: ref %C.70f = name_ref c, %c -// CHECK:STDOUT: %Outer.ref.loc24: %Outer.type = name_ref Outer, file.%Outer.decl [concrete = constants.%Outer.generic] -// CHECK:STDOUT: %int_32.loc24: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc24: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %Outer.loc24: type = class_type @Outer, @Outer(constants.%i32) [concrete = constants.%Outer.545] -// CHECK:STDOUT: %.loc24_23: type = specific_constant @Outer.%Inner.decl, @Outer(constants.%i32) [concrete = constants.%Inner.type.52d] -// CHECK:STDOUT: %Inner.ref: type = name_ref Inner, %.loc24_23 [concrete = constants.%Inner.type.52d] -// CHECK:STDOUT: %.loc24_29: %Inner.assoc_type.215 = specific_constant @Inner.%assoc0.loc6_28.1, @Inner(constants.%i32) [concrete = constants.%assoc0.e80] -// CHECK:STDOUT: %F.ref: %Inner.assoc_type.215 = name_ref F, %.loc24_29 [concrete = constants.%assoc0.e80] +// CHECK:STDOUT: %Outer.ref.loc27: %Outer.type = name_ref Outer, file.%Outer.decl [concrete = constants.%Outer.generic] +// CHECK:STDOUT: %int_32.loc27: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] +// CHECK:STDOUT: %i32.loc27: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] +// CHECK:STDOUT: %Outer.loc27: type = class_type @Outer, @Outer(constants.%i32) [concrete = constants.%Outer.545] +// CHECK:STDOUT: %.loc27_23: type = specific_constant @Outer.%Inner.decl, @Outer(constants.%i32) [concrete = constants.%Inner.type.52d] +// CHECK:STDOUT: %Inner.ref: type = name_ref Inner, %.loc27_23 [concrete = constants.%Inner.type.52d] +// CHECK:STDOUT: %.loc27_29: %Inner.assoc_type.215 = specific_constant @Inner.%assoc0.loc7_28.1, @Inner(constants.%i32) [concrete = constants.%assoc0.e80] +// CHECK:STDOUT: %F.ref: %Inner.assoc_type.215 = name_ref F, %.loc27_29 [concrete = constants.%assoc0.e80] // CHECK:STDOUT: %impl.elem0: %.b10 = impl_witness_access constants.%Inner.impl_witness.47d, element0 [concrete = constants.%F.e75] -// CHECK:STDOUT: %bound_method.loc24_11: = bound_method %c.ref, %impl.elem0 +// CHECK:STDOUT: %bound_method.loc27_11: = bound_method %c.ref, %impl.elem0 // CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @F.2(constants.%i32) [concrete = constants.%F.specific_fn] -// CHECK:STDOUT: %bound_method.loc24_33: = bound_method %c.ref, %specific_fn -// CHECK:STDOUT: %.loc24_10: %C.70f = bind_value %c.ref -// CHECK:STDOUT: %F.call: init %i32 = call %bound_method.loc24_33(%.loc24_10) -// CHECK:STDOUT: %.loc24_34.1: %i32 = value_of_initializer %F.call -// CHECK:STDOUT: %.loc24_34.2: %i32 = converted %F.call, %.loc24_34.1 -// CHECK:STDOUT: return %.loc24_34.2 +// CHECK:STDOUT: %bound_method.loc27_33: = bound_method %c.ref, %specific_fn +// CHECK:STDOUT: %.loc27_10: %C.70f = bind_value %c.ref +// CHECK:STDOUT: %F.call: init %i32 = call %bound_method.loc27_33(%.loc27_10) +// CHECK:STDOUT: %.loc27_34.1: %i32 = value_of_initializer %F.call +// CHECK:STDOUT: %.loc27_34.2: %i32 = converted %F.call, %.loc27_34.1 +// CHECK:STDOUT: return %.loc27_34.2 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Outer(constants.%T) { @@ -700,57 +405,34 @@ fn Test() -> i32 { // CHECK:STDOUT: %F.type => constants.%F.type.0f3 // CHECK:STDOUT: %F => constants.%F.db9 // CHECK:STDOUT: %Inner.assoc_type => constants.%Inner.assoc_type.115 -// CHECK:STDOUT: %assoc0.loc6_28.2 => constants.%assoc0.95e +// CHECK:STDOUT: %assoc0.loc7_28.2 => constants.%assoc0.95e // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @F.1(constants.%T, constants.%Self.770) { // CHECK:STDOUT: %T => constants.%T // CHECK:STDOUT: %Inner.type => constants.%Inner.type.392 // CHECK:STDOUT: %Self => constants.%Self.770 -// CHECK:STDOUT: %Self.as_type.loc6_16.1 => constants.%Self.as_type.ea1 -// CHECK:STDOUT: %pattern_type.loc6_10 => constants.%pattern_type.81e -// CHECK:STDOUT: %pattern_type.loc6_24 => constants.%pattern_type.7dcd0a.1 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @C(constants.%T) { -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @impl.eed(constants.%T) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %C => constants.%C.390 -// CHECK:STDOUT: %Inner.type => constants.%Inner.type.392 -// CHECK:STDOUT: %require_complete => constants.%require_complete.8fa -// CHECK:STDOUT: %Inner.impl_witness => constants.%Inner.impl_witness.b15 -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %F.type => constants.%F.type.77b -// CHECK:STDOUT: %F => constants.%F.ed9 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @F.2(constants.%T) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %C => constants.%C.390 -// CHECK:STDOUT: %pattern_type.loc11_12 => constants.%pattern_type.e59 -// CHECK:STDOUT: %pattern_type.loc11_23 => constants.%pattern_type.7dcd0a.1 +// CHECK:STDOUT: %Self.as_type.loc7_16.1 => constants.%Self.as_type.ea1 +// CHECK:STDOUT: %pattern_type.loc7_10 => constants.%pattern_type.81e +// CHECK:STDOUT: %pattern_type.loc7_24 => constants.%pattern_type.7dcd0a.1 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @F.1(constants.%T, constants.%Inner.facet.9a3) { // CHECK:STDOUT: %T => constants.%T // CHECK:STDOUT: %Inner.type => constants.%Inner.type.392 // CHECK:STDOUT: %Self => constants.%Inner.facet.9a3 -// CHECK:STDOUT: %Self.as_type.loc6_16.1 => constants.%C.390 -// CHECK:STDOUT: %pattern_type.loc6_10 => constants.%pattern_type.e59 -// CHECK:STDOUT: %pattern_type.loc6_24 => constants.%pattern_type.7dcd0a.1 +// CHECK:STDOUT: %Self.as_type.loc7_16.1 => constants.%C.390 +// CHECK:STDOUT: %pattern_type.loc7_10 => constants.%pattern_type.e59 +// CHECK:STDOUT: %pattern_type.loc7_24 => constants.%pattern_type.7dcd0a.1 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @F.1(constants.%T, constants.%Inner.facet.c18) { // CHECK:STDOUT: %T => constants.%T // CHECK:STDOUT: %Inner.type => constants.%Inner.type.392 // CHECK:STDOUT: %Self => constants.%Inner.facet.c18 -// CHECK:STDOUT: %Self.as_type.loc6_16.1 => constants.%C.390 -// CHECK:STDOUT: %pattern_type.loc6_10 => constants.%pattern_type.e59 -// CHECK:STDOUT: %pattern_type.loc6_24 => constants.%pattern_type.7dcd0a.1 +// CHECK:STDOUT: %Self.as_type.loc7_16.1 => constants.%C.390 +// CHECK:STDOUT: %pattern_type.loc7_10 => constants.%pattern_type.e59 +// CHECK:STDOUT: %pattern_type.loc7_24 => constants.%pattern_type.7dcd0a.1 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Outer(constants.%i32) { @@ -769,61 +451,24 @@ fn Test() -> i32 { // CHECK:STDOUT: %F.type => constants.%F.type.86e // CHECK:STDOUT: %F => constants.%F.11d // CHECK:STDOUT: %Inner.assoc_type => constants.%Inner.assoc_type.215 -// CHECK:STDOUT: %assoc0.loc6_28.2 => constants.%assoc0.e80 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @C(constants.%i32) { -// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %assoc0.loc7_28.2 => constants.%assoc0.e80 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @F.1(constants.%i32, constants.%Inner.facet.edc) { // CHECK:STDOUT: %T => constants.%i32 // CHECK:STDOUT: %Inner.type => constants.%Inner.type.52d // CHECK:STDOUT: %Self => constants.%Inner.facet.edc -// CHECK:STDOUT: %Self.as_type.loc6_16.1 => constants.%D -// CHECK:STDOUT: %pattern_type.loc6_10 => constants.%pattern_type.510 -// CHECK:STDOUT: %pattern_type.loc6_24 => constants.%pattern_type.7ce -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @impl.eed(constants.%i32) { -// CHECK:STDOUT: %T => constants.%i32 -// CHECK:STDOUT: %C => constants.%C.70f -// CHECK:STDOUT: %Inner.type => constants.%Inner.type.52d -// CHECK:STDOUT: %require_complete => constants.%complete_type.9fa -// CHECK:STDOUT: %Inner.impl_witness => constants.%Inner.impl_witness.47d -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %F.type => constants.%F.type.f11 -// CHECK:STDOUT: %F => constants.%F.e75 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @F.2(constants.%i32) { -// CHECK:STDOUT: %T => constants.%i32 -// CHECK:STDOUT: %C => constants.%C.70f -// CHECK:STDOUT: %pattern_type.loc11_12 => constants.%pattern_type.de9 -// CHECK:STDOUT: %pattern_type.loc11_23 => constants.%pattern_type.7ce -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete.loc11_23 => constants.%complete_type.f8a -// CHECK:STDOUT: %require_complete.loc11_16 => constants.%complete_type.357 -// CHECK:STDOUT: %Inner.type => constants.%Inner.type.52d -// CHECK:STDOUT: %require_complete.loc11_48 => constants.%complete_type.9fa -// CHECK:STDOUT: %Inner.assoc_type => constants.%Inner.assoc_type.215 -// CHECK:STDOUT: %assoc0 => constants.%assoc0.e80 -// CHECK:STDOUT: %Inner.lookup_impl_witness => constants.%Inner.impl_witness.47d -// CHECK:STDOUT: %F.type => constants.%F.type.86e -// CHECK:STDOUT: %Inner.facet => constants.%Inner.facet.840 -// CHECK:STDOUT: %.loc11_41 => constants.%.b10 -// CHECK:STDOUT: %impl.elem0.loc11_41.2 => constants.%F.e75 -// CHECK:STDOUT: %specific_impl_fn.loc11_41.2 => constants.%F.specific_fn +// CHECK:STDOUT: %Self.as_type.loc7_16.1 => constants.%D +// CHECK:STDOUT: %pattern_type.loc7_10 => constants.%pattern_type.510 +// CHECK:STDOUT: %pattern_type.loc7_24 => constants.%pattern_type.7ce // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @F.1(constants.%i32, constants.%Inner.facet.840) { // CHECK:STDOUT: %T => constants.%i32 // CHECK:STDOUT: %Inner.type => constants.%Inner.type.52d // CHECK:STDOUT: %Self => constants.%Inner.facet.840 -// CHECK:STDOUT: %Self.as_type.loc6_16.1 => constants.%C.70f -// CHECK:STDOUT: %pattern_type.loc6_10 => constants.%pattern_type.de9 -// CHECK:STDOUT: %pattern_type.loc6_24 => constants.%pattern_type.7ce +// CHECK:STDOUT: %Self.as_type.loc7_16.1 => constants.%C.70f +// CHECK:STDOUT: %pattern_type.loc7_10 => constants.%pattern_type.de9 +// CHECK:STDOUT: %pattern_type.loc7_24 => constants.%pattern_type.7ce // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/generic/method_deduce.carbon b/toolchain/check/testdata/class/generic/method_deduce.carbon index 017003b3c86cf..9a0ff666519da 100644 --- a/toolchain/check/testdata/class/generic/method_deduce.carbon +++ b/toolchain/check/testdata/class/generic/method_deduce.carbon @@ -2,6 +2,8 @@ // Exceptions. See /LICENSE for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// // AUTOUPDATE // TIP: To test this file alone, run: // TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/generic/method_deduce.carbon @@ -17,11 +19,15 @@ class Class(T:! type) { } fn CallGenericMethod(c: Class(A)) -> (A, B) { + //@dump-sem-ir-begin return c.Get(B); + //@dump-sem-ir-end } fn CallGenericMethodWithNonDeducedParam(c: Class(A)) -> (A, B) { + //@dump-sem-ir-begin return c.GetNoDeduce({}, B); + //@dump-sem-ir-end } // CHECK:STDOUT: --- method_deduce.carbon @@ -29,336 +35,48 @@ fn CallGenericMethodWithNonDeducedParam(c: Class(A)) -> (A, B) { // CHECK:STDOUT: constants { // CHECK:STDOUT: %A: type = class_type @A [concrete] // CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] // CHECK:STDOUT: %B: type = class_type @B [concrete] -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] -// CHECK:STDOUT: %Class.type: type = generic_class_type @Class [concrete] -// CHECK:STDOUT: %Class.generic: %Class.type = struct_value () [concrete] -// CHECK:STDOUT: %Class.fe1: type = class_type @Class, @Class(%T) [symbolic] -// CHECK:STDOUT: %U: type = bind_symbolic_name U, 1 [symbolic] -// CHECK:STDOUT: %tuple.type.24b: type = tuple_type (type, type) [concrete] -// CHECK:STDOUT: %tuple.type.30b: type = tuple_type (%T, %U) [symbolic] -// CHECK:STDOUT: %pattern_type.65c: type = pattern_type %tuple.type.30b [symbolic] -// CHECK:STDOUT: %Get.type.fd9: type = fn_type @Get, @Class(%T) [symbolic] -// CHECK:STDOUT: %Get.cf9: %Get.type.fd9 = struct_value () [symbolic] -// CHECK:STDOUT: %pattern_type.7dc: type = pattern_type %T [symbolic] -// CHECK:STDOUT: %GetNoDeduce.type.766: type = fn_type @GetNoDeduce, @Class(%T) [symbolic] -// CHECK:STDOUT: %GetNoDeduce.c9a: %GetNoDeduce.type.766 = struct_value () [symbolic] -// CHECK:STDOUT: %require_complete.fe1: = require_complete_type %tuple.type.30b [symbolic] -// CHECK:STDOUT: %Get.specific_fn.f73: = specific_function %Get.cf9, @Get(%T, %U) [symbolic] -// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T [symbolic] -// CHECK:STDOUT: %GetNoDeduce.specific_fn.536: = specific_function %GetNoDeduce.c9a, @GetNoDeduce(%T, %U) [symbolic] // CHECK:STDOUT: %Class.480: type = class_type @Class, @Class(%A) [concrete] -// CHECK:STDOUT: %pattern_type.827: type = pattern_type %Class.480 [concrete] // CHECK:STDOUT: %tuple.type.cc6: type = tuple_type (%A, %B) [concrete] -// CHECK:STDOUT: %pattern_type.edc: type = pattern_type %tuple.type.cc6 [concrete] -// CHECK:STDOUT: %CallGenericMethod.type: type = fn_type @CallGenericMethod [concrete] -// CHECK:STDOUT: %CallGenericMethod: %CallGenericMethod.type = struct_value () [concrete] // CHECK:STDOUT: %Get.type.501: type = fn_type @Get, @Class(%A) [concrete] // CHECK:STDOUT: %Get.f37: %Get.type.501 = struct_value () [concrete] // CHECK:STDOUT: %GetNoDeduce.type.5d6: type = fn_type @GetNoDeduce, @Class(%A) [concrete] // CHECK:STDOUT: %GetNoDeduce.162: %GetNoDeduce.type.5d6 = struct_value () [concrete] // CHECK:STDOUT: %Get.specific_fn.213: = specific_function %Get.f37, @Get(%A, %B) [concrete] -// CHECK:STDOUT: %CallGenericMethodWithNonDeducedParam.type: type = fn_type @CallGenericMethodWithNonDeducedParam [concrete] -// CHECK:STDOUT: %CallGenericMethodWithNonDeducedParam: %CallGenericMethodWithNonDeducedParam.type = struct_value () [concrete] -// CHECK:STDOUT: %pattern_type.c10: type = pattern_type %A [concrete] // CHECK:STDOUT: %GetNoDeduce.specific_fn.438: = specific_function %GetNoDeduce.162, @GetNoDeduce(%A, %B) [concrete] // CHECK:STDOUT: %A.val: %A = struct_value () [concrete] -// CHECK:STDOUT: %complete_type.56a: = complete_type_witness %tuple.type.cc6 [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .A = %A.decl -// CHECK:STDOUT: .B = %B.decl -// CHECK:STDOUT: .Class = %Class.decl -// CHECK:STDOUT: .CallGenericMethod = %CallGenericMethod.decl -// CHECK:STDOUT: .CallGenericMethodWithNonDeducedParam = %CallGenericMethodWithNonDeducedParam.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %A.decl: type = class_decl @A [concrete = constants.%A] {} {} -// CHECK:STDOUT: %B.decl: type = class_decl @B [concrete = constants.%B] {} {} -// CHECK:STDOUT: %Class.decl: %Class.type = class_decl @Class [concrete = constants.%Class.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc14_13.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc14_13.2 (constants.%T)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %CallGenericMethod.decl: %CallGenericMethod.type = fn_decl @CallGenericMethod [concrete = constants.%CallGenericMethod] { -// CHECK:STDOUT: %c.patt: %pattern_type.827 = binding_pattern c [concrete] -// CHECK:STDOUT: %c.param_patt: %pattern_type.827 = value_param_pattern %c.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.edc = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.edc = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %A.ref.loc19_39: type = name_ref A, file.%A.decl [concrete = constants.%A] -// CHECK:STDOUT: %B.ref.loc19: type = name_ref B, file.%B.decl [concrete = constants.%B] -// CHECK:STDOUT: %.loc19_43.1: %tuple.type.24b = tuple_literal (%A.ref.loc19_39, %B.ref.loc19) -// CHECK:STDOUT: %.loc19_43.2: type = converted %.loc19_43.1, constants.%tuple.type.cc6 [concrete = constants.%tuple.type.cc6] -// CHECK:STDOUT: %c.param: %Class.480 = value_param call_param0 -// CHECK:STDOUT: %.loc19_32: type = splice_block %Class [concrete = constants.%Class.480] { -// CHECK:STDOUT: %Class.ref: %Class.type = name_ref Class, file.%Class.decl [concrete = constants.%Class.generic] -// CHECK:STDOUT: %A.ref.loc19_31: type = name_ref A, file.%A.decl [concrete = constants.%A] -// CHECK:STDOUT: %Class: type = class_type @Class, @Class(constants.%A) [concrete = constants.%Class.480] -// CHECK:STDOUT: } -// CHECK:STDOUT: %c: %Class.480 = bind_name c, %c.param -// CHECK:STDOUT: %return.param: ref %tuple.type.cc6 = out_param call_param1 -// CHECK:STDOUT: %return: ref %tuple.type.cc6 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %CallGenericMethodWithNonDeducedParam.decl: %CallGenericMethodWithNonDeducedParam.type = fn_decl @CallGenericMethodWithNonDeducedParam [concrete = constants.%CallGenericMethodWithNonDeducedParam] { -// CHECK:STDOUT: %c.patt: %pattern_type.827 = binding_pattern c [concrete] -// CHECK:STDOUT: %c.param_patt: %pattern_type.827 = value_param_pattern %c.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.edc = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.edc = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %A.ref.loc23_58: type = name_ref A, file.%A.decl [concrete = constants.%A] -// CHECK:STDOUT: %B.ref.loc23: type = name_ref B, file.%B.decl [concrete = constants.%B] -// CHECK:STDOUT: %.loc23_62.1: %tuple.type.24b = tuple_literal (%A.ref.loc23_58, %B.ref.loc23) -// CHECK:STDOUT: %.loc23_62.2: type = converted %.loc23_62.1, constants.%tuple.type.cc6 [concrete = constants.%tuple.type.cc6] -// CHECK:STDOUT: %c.param: %Class.480 = value_param call_param0 -// CHECK:STDOUT: %.loc23_51: type = splice_block %Class [concrete = constants.%Class.480] { -// CHECK:STDOUT: %Class.ref: %Class.type = name_ref Class, file.%Class.decl [concrete = constants.%Class.generic] -// CHECK:STDOUT: %A.ref.loc23_50: type = name_ref A, file.%A.decl [concrete = constants.%A] -// CHECK:STDOUT: %Class: type = class_type @Class, @Class(constants.%A) [concrete = constants.%Class.480] -// CHECK:STDOUT: } -// CHECK:STDOUT: %c: %Class.480 = bind_name c, %c.param -// CHECK:STDOUT: %return.param: ref %tuple.type.cc6 = out_param call_param1 -// CHECK:STDOUT: %return: ref %tuple.type.cc6 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @A { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%A -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @B { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%B -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Class(%T.loc14_13.1: type) { -// CHECK:STDOUT: %T.loc14_13.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc14_13.2 (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %Get.type: type = fn_type @Get, @Class(%T.loc14_13.2) [symbolic = %Get.type (constants.%Get.type.fd9)] -// CHECK:STDOUT: %Get: @Class.%Get.type (%Get.type.fd9) = struct_value () [symbolic = %Get (constants.%Get.cf9)] -// CHECK:STDOUT: %GetNoDeduce.type: type = fn_type @GetNoDeduce, @Class(%T.loc14_13.2) [symbolic = %GetNoDeduce.type (constants.%GetNoDeduce.type.766)] -// CHECK:STDOUT: %GetNoDeduce: @Class.%GetNoDeduce.type (%GetNoDeduce.type.766) = struct_value () [symbolic = %GetNoDeduce (constants.%GetNoDeduce.c9a)] -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %Get.decl: @Class.%Get.type (%Get.type.fd9) = fn_decl @Get [symbolic = @Class.%Get (constants.%Get.cf9)] { -// CHECK:STDOUT: %U.patt: %pattern_type.98f = symbolic_binding_pattern U, 1 [concrete] -// CHECK:STDOUT: %return.patt: @Get.%pattern_type (%pattern_type.65c) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @Get.%pattern_type (%pattern_type.65c) = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref: type = name_ref T, @Class.%T.loc14_13.1 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %U.ref.loc15_27: type = name_ref U, %U.loc15_10.2 [symbolic = %U.loc15_10.1 (constants.%U)] -// CHECK:STDOUT: %.loc15_28.1: %tuple.type.24b = tuple_literal (%T.ref, %U.ref.loc15_27) -// CHECK:STDOUT: %.loc15_28.2: type = converted %.loc15_28.1, constants.%tuple.type.30b [symbolic = %tuple.type (constants.%tuple.type.30b)] -// CHECK:STDOUT: %U.loc15_10.2: type = bind_symbolic_name U, 1 [symbolic = %U.loc15_10.1 (constants.%U)] -// CHECK:STDOUT: %return.param: ref @Get.%tuple.type (%tuple.type.30b) = out_param call_param0 -// CHECK:STDOUT: %return: ref @Get.%tuple.type (%tuple.type.30b) = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %GetNoDeduce.decl: @Class.%GetNoDeduce.type (%GetNoDeduce.type.766) = fn_decl @GetNoDeduce [symbolic = @Class.%GetNoDeduce (constants.%GetNoDeduce.c9a)] { -// CHECK:STDOUT: %x.patt: @GetNoDeduce.%pattern_type.loc16_18 (%pattern_type.7dc) = binding_pattern x [concrete] -// CHECK:STDOUT: %x.param_patt: @GetNoDeduce.%pattern_type.loc16_18 (%pattern_type.7dc) = value_param_pattern %x.patt, call_param0 [concrete] -// CHECK:STDOUT: %U.patt: %pattern_type.98f = symbolic_binding_pattern U, 1 [concrete] -// CHECK:STDOUT: %return.patt: @GetNoDeduce.%pattern_type.loc16_34 (%pattern_type.65c) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @GetNoDeduce.%pattern_type.loc16_34 (%pattern_type.65c) = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref.loc16_38: type = name_ref T, @Class.%T.loc14_13.1 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %U.ref.loc16_41: type = name_ref U, %U.loc16_24.2 [symbolic = %U.loc16_24.1 (constants.%U)] -// CHECK:STDOUT: %.loc16_42.1: %tuple.type.24b = tuple_literal (%T.ref.loc16_38, %U.ref.loc16_41) -// CHECK:STDOUT: %.loc16_42.2: type = converted %.loc16_42.1, constants.%tuple.type.30b [symbolic = %tuple.type (constants.%tuple.type.30b)] -// CHECK:STDOUT: %x.param: @GetNoDeduce.%T (%T) = value_param call_param0 -// CHECK:STDOUT: %T.ref.loc16_21: type = name_ref T, @Class.%T.loc14_13.1 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %x: @GetNoDeduce.%T (%T) = bind_name x, %x.param -// CHECK:STDOUT: %U.loc16_24.2: type = bind_symbolic_name U, 1 [symbolic = %U.loc16_24.1 (constants.%U)] -// CHECK:STDOUT: %return.param: ref @GetNoDeduce.%tuple.type (%tuple.type.30b) = out_param call_param1 -// CHECK:STDOUT: %return: ref @GetNoDeduce.%tuple.type (%tuple.type.30b) = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Class.fe1 -// CHECK:STDOUT: .T = -// CHECK:STDOUT: .Get = %Get.decl -// CHECK:STDOUT: .GetNoDeduce = %GetNoDeduce.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @Get(@Class.%T.loc14_13.1: type, %U.loc15_10.2: type) { -// CHECK:STDOUT: %U.loc15_10.1: type = bind_symbolic_name U, 1 [symbolic = %U.loc15_10.1 (constants.%U)] -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %tuple.type: type = tuple_type (%T, %U.loc15_10.1) [symbolic = %tuple.type (constants.%tuple.type.30b)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %tuple.type [symbolic = %pattern_type (constants.%pattern_type.65c)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %tuple.type [symbolic = %require_complete (constants.%require_complete.fe1)] -// CHECK:STDOUT: %Get.type: type = fn_type @Get, @Class(%T) [symbolic = %Get.type (constants.%Get.type.fd9)] -// CHECK:STDOUT: %Get: @Get.%Get.type (%Get.type.fd9) = struct_value () [symbolic = %Get (constants.%Get.cf9)] -// CHECK:STDOUT: %Get.specific_fn.loc15_39.2: = specific_function %Get, @Get(%T, %U.loc15_10.1) [symbolic = %Get.specific_fn.loc15_39.2 (constants.%Get.specific_fn.f73)] -// CHECK:STDOUT: -// CHECK:STDOUT: fn() -> %return.param: @Get.%tuple.type (%tuple.type.30b) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %.loc15_39: @Get.%Get.type (%Get.type.fd9) = specific_constant @Class.%Get.decl, @Class(constants.%T) [symbolic = %Get (constants.%Get.cf9)] -// CHECK:STDOUT: %Get.ref: @Get.%Get.type (%Get.type.fd9) = name_ref Get, %.loc15_39 [symbolic = %Get (constants.%Get.cf9)] -// CHECK:STDOUT: %U.ref.loc15_43: type = name_ref U, %U.loc15_10.2 [symbolic = %U.loc15_10.1 (constants.%U)] -// CHECK:STDOUT: %Get.specific_fn.loc15_39.1: = specific_function %Get.ref, @Get(constants.%T, constants.%U) [symbolic = %Get.specific_fn.loc15_39.2 (constants.%Get.specific_fn.f73)] -// CHECK:STDOUT: %.loc15_20: ref @Get.%tuple.type (%tuple.type.30b) = splice_block %return {} -// CHECK:STDOUT: %Get.call: init @Get.%tuple.type (%tuple.type.30b) = call %Get.specific_fn.loc15_39.1() to %.loc15_20 -// CHECK:STDOUT: return %Get.call to %return -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @GetNoDeduce(@Class.%T.loc14_13.1: type, %U.loc16_24.2: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %pattern_type.loc16_18: type = pattern_type %T [symbolic = %pattern_type.loc16_18 (constants.%pattern_type.7dc)] -// CHECK:STDOUT: %U.loc16_24.1: type = bind_symbolic_name U, 1 [symbolic = %U.loc16_24.1 (constants.%U)] -// CHECK:STDOUT: %tuple.type: type = tuple_type (%T, %U.loc16_24.1) [symbolic = %tuple.type (constants.%tuple.type.30b)] -// CHECK:STDOUT: %pattern_type.loc16_34: type = pattern_type %tuple.type [symbolic = %pattern_type.loc16_34 (constants.%pattern_type.65c)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete.loc16_19: = require_complete_type %T [symbolic = %require_complete.loc16_19 (constants.%require_complete.4ae)] -// CHECK:STDOUT: %GetNoDeduce.type: type = fn_type @GetNoDeduce, @Class(%T) [symbolic = %GetNoDeduce.type (constants.%GetNoDeduce.type.766)] -// CHECK:STDOUT: %GetNoDeduce: @GetNoDeduce.%GetNoDeduce.type (%GetNoDeduce.type.766) = struct_value () [symbolic = %GetNoDeduce (constants.%GetNoDeduce.c9a)] -// CHECK:STDOUT: %GetNoDeduce.specific_fn.loc16_53.2: = specific_function %GetNoDeduce, @GetNoDeduce(%T, %U.loc16_24.1) [symbolic = %GetNoDeduce.specific_fn.loc16_53.2 (constants.%GetNoDeduce.specific_fn.536)] -// CHECK:STDOUT: %require_complete.loc16_70: = require_complete_type %tuple.type [symbolic = %require_complete.loc16_70 (constants.%require_complete.fe1)] -// CHECK:STDOUT: -// CHECK:STDOUT: fn(%x.param: @GetNoDeduce.%T (%T)) -> %return.param: @GetNoDeduce.%tuple.type (%tuple.type.30b) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %.loc16_53: @GetNoDeduce.%GetNoDeduce.type (%GetNoDeduce.type.766) = specific_constant @Class.%GetNoDeduce.decl, @Class(constants.%T) [symbolic = %GetNoDeduce (constants.%GetNoDeduce.c9a)] -// CHECK:STDOUT: %GetNoDeduce.ref: @GetNoDeduce.%GetNoDeduce.type (%GetNoDeduce.type.766) = name_ref GetNoDeduce, %.loc16_53 [symbolic = %GetNoDeduce (constants.%GetNoDeduce.c9a)] -// CHECK:STDOUT: %x.ref: @GetNoDeduce.%T (%T) = name_ref x, %x -// CHECK:STDOUT: %U.ref.loc16_68: type = name_ref U, %U.loc16_24.2 [symbolic = %U.loc16_24.1 (constants.%U)] -// CHECK:STDOUT: %GetNoDeduce.specific_fn.loc16_53.1: = specific_function %GetNoDeduce.ref, @GetNoDeduce(constants.%T, constants.%U) [symbolic = %GetNoDeduce.specific_fn.loc16_53.2 (constants.%GetNoDeduce.specific_fn.536)] -// CHECK:STDOUT: %.loc16_34: ref @GetNoDeduce.%tuple.type (%tuple.type.30b) = splice_block %return {} -// CHECK:STDOUT: %GetNoDeduce.call: init @GetNoDeduce.%tuple.type (%tuple.type.30b) = call %GetNoDeduce.specific_fn.loc16_53.1(%x.ref) to %.loc16_34 -// CHECK:STDOUT: return %GetNoDeduce.call to %return -// CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @CallGenericMethod(%c.param: %Class.480) -> %return.param: %tuple.type.cc6 { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %c.ref: %Class.480 = name_ref c, %c -// CHECK:STDOUT: %.loc20: %Get.type.501 = specific_constant @Class.%Get.decl, @Class(constants.%A) [concrete = constants.%Get.f37] -// CHECK:STDOUT: %Get.ref: %Get.type.501 = name_ref Get, %.loc20 [concrete = constants.%Get.f37] -// CHECK:STDOUT: %B.ref.loc20: type = name_ref B, file.%B.decl [concrete = constants.%B] +// CHECK:STDOUT: %.loc23: %Get.type.501 = specific_constant @Class.%Get.decl, @Class(constants.%A) [concrete = constants.%Get.f37] +// CHECK:STDOUT: %Get.ref: %Get.type.501 = name_ref Get, %.loc23 [concrete = constants.%Get.f37] +// CHECK:STDOUT: %B.ref.loc23: type = name_ref B, file.%B.decl [concrete = constants.%B] // CHECK:STDOUT: %Get.specific_fn: = specific_function %Get.ref, @Get(constants.%A, constants.%B) [concrete = constants.%Get.specific_fn.213] -// CHECK:STDOUT: %.loc19_35: ref %tuple.type.cc6 = splice_block %return {} -// CHECK:STDOUT: %Get.call: init %tuple.type.cc6 = call %Get.specific_fn() to %.loc19_35 +// CHECK:STDOUT: +// CHECK:STDOUT: %Get.call: init %tuple.type.cc6 = call %Get.specific_fn() to %.loc21_35 // CHECK:STDOUT: return %Get.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @CallGenericMethodWithNonDeducedParam(%c.param: %Class.480) -> %return.param: %tuple.type.cc6 { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %c.ref: %Class.480 = name_ref c, %c -// CHECK:STDOUT: %.loc24_11: %GetNoDeduce.type.5d6 = specific_constant @Class.%GetNoDeduce.decl, @Class(constants.%A) [concrete = constants.%GetNoDeduce.162] -// CHECK:STDOUT: %GetNoDeduce.ref: %GetNoDeduce.type.5d6 = name_ref GetNoDeduce, %.loc24_11 [concrete = constants.%GetNoDeduce.162] -// CHECK:STDOUT: %.loc24_25.1: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %B.ref.loc24: type = name_ref B, file.%B.decl [concrete = constants.%B] +// CHECK:STDOUT: %.loc29_11: %GetNoDeduce.type.5d6 = specific_constant @Class.%GetNoDeduce.decl, @Class(constants.%A) [concrete = constants.%GetNoDeduce.162] +// CHECK:STDOUT: %GetNoDeduce.ref: %GetNoDeduce.type.5d6 = name_ref GetNoDeduce, %.loc29_11 [concrete = constants.%GetNoDeduce.162] +// CHECK:STDOUT: %.loc29_25.1: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %B.ref.loc29: type = name_ref B, file.%B.decl [concrete = constants.%B] // CHECK:STDOUT: %GetNoDeduce.specific_fn: = specific_function %GetNoDeduce.ref, @GetNoDeduce(constants.%A, constants.%B) [concrete = constants.%GetNoDeduce.specific_fn.438] -// CHECK:STDOUT: %.loc23_54: ref %tuple.type.cc6 = splice_block %return {} -// CHECK:STDOUT: %.loc24_25.2: ref %A = temporary_storage -// CHECK:STDOUT: %.loc24_25.3: init %A = class_init (), %.loc24_25.2 [concrete = constants.%A.val] -// CHECK:STDOUT: %.loc24_25.4: ref %A = temporary %.loc24_25.2, %.loc24_25.3 -// CHECK:STDOUT: %.loc24_25.5: ref %A = converted %.loc24_25.1, %.loc24_25.4 -// CHECK:STDOUT: %.loc24_25.6: %A = bind_value %.loc24_25.5 -// CHECK:STDOUT: %GetNoDeduce.call: init %tuple.type.cc6 = call %GetNoDeduce.specific_fn(%.loc24_25.6) to %.loc23_54 +// CHECK:STDOUT: +// CHECK:STDOUT: %.loc29_25.2: ref %A = temporary_storage +// CHECK:STDOUT: %.loc29_25.3: init %A = class_init (), %.loc29_25.2 [concrete = constants.%A.val] +// CHECK:STDOUT: %.loc29_25.4: ref %A = temporary %.loc29_25.2, %.loc29_25.3 +// CHECK:STDOUT: %.loc29_25.5: ref %A = converted %.loc29_25.1, %.loc29_25.4 +// CHECK:STDOUT: %.loc29_25.6: %A = bind_value %.loc29_25.5 +// CHECK:STDOUT: %GetNoDeduce.call: init %tuple.type.cc6 = call %GetNoDeduce.specific_fn(%.loc29_25.6) to %.loc27_54 // CHECK:STDOUT: return %GetNoDeduce.call to %return // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @Class(constants.%T) { -// CHECK:STDOUT: %T.loc14_13.2 => constants.%T -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %Get.type => constants.%Get.type.fd9 -// CHECK:STDOUT: %Get => constants.%Get.cf9 -// CHECK:STDOUT: %GetNoDeduce.type => constants.%GetNoDeduce.type.766 -// CHECK:STDOUT: %GetNoDeduce => constants.%GetNoDeduce.c9a -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Get(constants.%T, constants.%U) { -// CHECK:STDOUT: %U.loc15_10.1 => constants.%U -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %tuple.type => constants.%tuple.type.30b -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.65c -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%require_complete.fe1 -// CHECK:STDOUT: %Get.type => constants.%Get.type.fd9 -// CHECK:STDOUT: %Get => constants.%Get.cf9 -// CHECK:STDOUT: %Get.specific_fn.loc15_39.2 => constants.%Get.specific_fn.f73 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @GetNoDeduce(constants.%T, constants.%U) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %pattern_type.loc16_18 => constants.%pattern_type.7dc -// CHECK:STDOUT: %U.loc16_24.1 => constants.%U -// CHECK:STDOUT: %tuple.type => constants.%tuple.type.30b -// CHECK:STDOUT: %pattern_type.loc16_34 => constants.%pattern_type.65c -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete.loc16_19 => constants.%require_complete.4ae -// CHECK:STDOUT: %GetNoDeduce.type => constants.%GetNoDeduce.type.766 -// CHECK:STDOUT: %GetNoDeduce => constants.%GetNoDeduce.c9a -// CHECK:STDOUT: %GetNoDeduce.specific_fn.loc16_53.2 => constants.%GetNoDeduce.specific_fn.536 -// CHECK:STDOUT: %require_complete.loc16_70 => constants.%require_complete.fe1 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Class(constants.%A) { -// CHECK:STDOUT: %T.loc14_13.2 => constants.%A -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %Get.type => constants.%Get.type.501 -// CHECK:STDOUT: %Get => constants.%Get.f37 -// CHECK:STDOUT: %GetNoDeduce.type => constants.%GetNoDeduce.type.5d6 -// CHECK:STDOUT: %GetNoDeduce => constants.%GetNoDeduce.162 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Get(constants.%A, constants.%B) { -// CHECK:STDOUT: %U.loc15_10.1 => constants.%B -// CHECK:STDOUT: %T => constants.%A -// CHECK:STDOUT: %tuple.type => constants.%tuple.type.cc6 -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.edc -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%complete_type.56a -// CHECK:STDOUT: %Get.type => constants.%Get.type.501 -// CHECK:STDOUT: %Get => constants.%Get.f37 -// CHECK:STDOUT: %Get.specific_fn.loc15_39.2 => constants.%Get.specific_fn.213 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @GetNoDeduce(constants.%A, constants.%B) { -// CHECK:STDOUT: %T => constants.%A -// CHECK:STDOUT: %pattern_type.loc16_18 => constants.%pattern_type.c10 -// CHECK:STDOUT: %U.loc16_24.1 => constants.%B -// CHECK:STDOUT: %tuple.type => constants.%tuple.type.cc6 -// CHECK:STDOUT: %pattern_type.loc16_34 => constants.%pattern_type.edc -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete.loc16_19 => constants.%complete_type.357 -// CHECK:STDOUT: %GetNoDeduce.type => constants.%GetNoDeduce.type.5d6 -// CHECK:STDOUT: %GetNoDeduce => constants.%GetNoDeduce.162 -// CHECK:STDOUT: %GetNoDeduce.specific_fn.loc16_53.2 => constants.%GetNoDeduce.specific_fn.438 -// CHECK:STDOUT: %require_complete.loc16_70 => constants.%complete_type.56a -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/generic/redeclare.carbon b/toolchain/check/testdata/class/generic/redeclare.carbon index 1109a38480737..394a1fddf0930 100644 --- a/toolchain/check/testdata/class/generic/redeclare.carbon +++ b/toolchain/check/testdata/class/generic/redeclare.carbon @@ -2,6 +2,8 @@ // Exceptions. See /LICENSE for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// // AUTOUPDATE // TIP: To test this file alone, run: // TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/generic/redeclare.carbon @@ -12,10 +14,12 @@ library "[[@TEST_NAME]]"; +//@dump-sem-ir-begin class Generic(T:! type); class Generic(T:! type) { } +//@dump-sem-ir-end // --- fail_mismatch_param_list.carbon @@ -100,32 +104,23 @@ class E(U:! type) {} // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Generic = %Generic.decl.loc4 -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Generic.decl.loc4: %Generic.type = class_decl @Generic [concrete = constants.%Generic.generic] { +// CHECK:STDOUT: %Generic.decl.loc5: %Generic.type = class_decl @Generic [concrete = constants.%Generic.generic] { // CHECK:STDOUT: %T.patt: %pattern_type = symbolic_binding_pattern T, 0 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc4_15.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_15.2 (constants.%T)] +// CHECK:STDOUT: %T.loc5_15.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc5_15.2 (constants.%T)] // CHECK:STDOUT: } -// CHECK:STDOUT: %Generic.decl.loc6: %Generic.type = class_decl @Generic [concrete = constants.%Generic.generic] { +// CHECK:STDOUT: %Generic.decl.loc7: %Generic.type = class_decl @Generic [concrete = constants.%Generic.generic] { // CHECK:STDOUT: %T.patt: %pattern_type = symbolic_binding_pattern T, 0 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc6: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_15.2 (constants.%T)] +// CHECK:STDOUT: %T.loc7: type = bind_symbolic_name T, 0 [symbolic = %T.loc5_15.2 (constants.%T)] // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic class @Generic(%T.loc4_15.1: type) { -// CHECK:STDOUT: %T.loc4_15.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_15.2 (constants.%T)] +// CHECK:STDOUT: generic class @Generic(%T.loc5_15.1: type) { +// CHECK:STDOUT: %T.loc5_15.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc5_15.2 (constants.%T)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: @@ -140,383 +135,6 @@ class E(U:! type) {} // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Generic(constants.%T) { -// CHECK:STDOUT: %T.loc4_15.2 => constants.%T -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_mismatch_param_list.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %A.466: type = class_type @A.1 [concrete] -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type: type = pattern_type type [concrete] -// CHECK:STDOUT: %A.type: type = generic_class_type @A.2 [concrete] -// CHECK:STDOUT: %A.generic: %A.type = struct_value () [concrete] -// CHECK:STDOUT: %A.130: type = class_type @A.2, @A.2(%T) [symbolic] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .A = %A.decl.loc4 -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %A.decl.loc4: type = class_decl @A.1 [concrete = constants.%A.466] {} {} -// CHECK:STDOUT: %A.decl.loc12: %A.type = class_decl @A.2 [concrete = constants.%A.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc12_9.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc12_9.2 (constants.%T)] -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @A.1; -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @A.2(%T.loc12_9.1: type) { -// CHECK:STDOUT: %T.loc12_9.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc12_9.2 (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%A.130 -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @A.2(constants.%T) { -// CHECK:STDOUT: %T.loc12_9.2 => constants.%T -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_mismatch_implicit_param_list.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %N.51e: %i32 = bind_symbolic_name N, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %B.type.844c0f.1: type = generic_class_type @B.1 [concrete] -// CHECK:STDOUT: %B.generic.ba299b.1: %B.type.844c0f.1 = struct_value () [concrete] -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] -// CHECK:STDOUT: %N.f22: %T = bind_symbolic_name N, 1 [symbolic] -// CHECK:STDOUT: %pattern_type.7dc: type = pattern_type %T [symbolic] -// CHECK:STDOUT: %B.type.844c0f.2: type = generic_class_type @B.2 [concrete] -// CHECK:STDOUT: %B.generic.ba299b.2: %B.type.844c0f.2 = struct_value () [concrete] -// CHECK:STDOUT: %B.828: type = class_type @B.2, @B.2(%T, %N.f22) [symbolic] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .B = %B.decl.loc4 -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %B.decl.loc4: %B.type.844c0f.1 = class_decl @B.1 [concrete = constants.%B.generic.ba299b.1] { -// CHECK:STDOUT: %N.patt: %pattern_type.7ce = symbolic_binding_pattern N, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %.loc4: type = splice_block %i32 [concrete = constants.%i32] { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: } -// CHECK:STDOUT: %N.loc4_9.1: %i32 = bind_symbolic_name N, 0 [symbolic = %N.loc4_9.2 (constants.%N.51e)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %B.decl.loc12: %B.type.844c0f.2 = class_decl @B.2 [concrete = constants.%B.generic.ba299b.2] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: %N.patt: @B.2.%pattern_type (%pattern_type.7dc) = symbolic_binding_pattern N, 1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc12_9.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc12_9.2 (constants.%T)] -// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc12_9.1 [symbolic = %T.loc12_9.2 (constants.%T)] -// CHECK:STDOUT: %N.loc12_19.1: @B.2.%T.loc12_9.2 (%T) = bind_symbolic_name N, 1 [symbolic = %N.loc12_19.2 (constants.%N.f22)] -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @B.1(%N.loc4_9.1: %i32) { -// CHECK:STDOUT: %N.loc4_9.2: %i32 = bind_symbolic_name N, 0 [symbolic = %N.loc4_9.2 (constants.%N.51e)] -// CHECK:STDOUT: -// CHECK:STDOUT: class; -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @B.2(%T.loc12_9.1: type, %N.loc12_19.1: @B.2.%T.loc12_9.2 (%T)) { -// CHECK:STDOUT: %T.loc12_9.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc12_9.2 (constants.%T)] -// CHECK:STDOUT: %N.loc12_19.2: @B.2.%T.loc12_9.2 (%T) = bind_symbolic_name N, 1 [symbolic = %N.loc12_19.2 (constants.%N.f22)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %T.loc12_9.2 [symbolic = %pattern_type (constants.%pattern_type.7dc)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%B.828 -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @B.1(constants.%N.51e) { -// CHECK:STDOUT: %N.loc4_9.2 => constants.%N.51e -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @B.2(constants.%T, constants.%N.f22) { -// CHECK:STDOUT: %T.loc12_9.2 => constants.%T -// CHECK:STDOUT: %N.loc12_19.2 => constants.%N.f22 -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.7dc -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_mismatch_param_count.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] -// CHECK:STDOUT: %C.type.e6e560.1: type = generic_class_type @C.1 [concrete] -// CHECK:STDOUT: %C.generic.965b12.1: %C.type.e6e560.1 = struct_value () [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %U: %i32 = bind_symbolic_name U, 1 [symbolic] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %C.type.e6e560.2: type = generic_class_type @C.2 [concrete] -// CHECK:STDOUT: %C.generic.965b12.2: %C.type.e6e560.2 = struct_value () [concrete] -// CHECK:STDOUT: %C.9d5: type = class_type @C.2, @C.2(%T, %U) [symbolic] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .C = %C.decl.loc4 -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %C.decl.loc4: %C.type.e6e560.1 = class_decl @C.1 [concrete = constants.%C.generic.965b12.1] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc4_9.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_9.2 (constants.%T)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %C.decl.loc12: %C.type.e6e560.2 = class_decl @C.2 [concrete = constants.%C.generic.965b12.2] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: %U.patt: %pattern_type.7ce = symbolic_binding_pattern U, 1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc12_9.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc12_9.2 (constants.%T)] -// CHECK:STDOUT: %.loc12: type = splice_block %i32 [concrete = constants.%i32] { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: } -// CHECK:STDOUT: %U.loc12_19.1: %i32 = bind_symbolic_name U, 1 [symbolic = %U.loc12_19.2 (constants.%U)] -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @C.1(%T.loc4_9.1: type) { -// CHECK:STDOUT: %T.loc4_9.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_9.2 (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: class; -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @C.2(%T.loc12_9.1: type, %U.loc12_19.1: %i32) { -// CHECK:STDOUT: %T.loc12_9.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc12_9.2 (constants.%T)] -// CHECK:STDOUT: %U.loc12_19.2: %i32 = bind_symbolic_name U, 1 [symbolic = %U.loc12_19.2 (constants.%U)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%C.9d5 -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @C.1(constants.%T) { -// CHECK:STDOUT: %T.loc4_9.2 => constants.%T -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @C.2(constants.%T, constants.%U) { -// CHECK:STDOUT: %T.loc12_9.2 => constants.%T -// CHECK:STDOUT: %U.loc12_19.2 => constants.%U -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_mismatch_param_type.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %T.8b3: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] -// CHECK:STDOUT: %D.type.bbd080.1: type = generic_class_type @D.1 [concrete] -// CHECK:STDOUT: %D.generic.4e2319.1: %D.type.bbd080.1 = struct_value () [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %T.51e: %i32 = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %D.type.bbd080.2: type = generic_class_type @D.2 [concrete] -// CHECK:STDOUT: %D.generic.4e2319.2: %D.type.bbd080.2 = struct_value () [concrete] -// CHECK:STDOUT: %D.022: type = class_type @D.2, @D.2(%T.51e) [symbolic] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .D = %D.decl.loc4 -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %D.decl.loc4: %D.type.bbd080.1 = class_decl @D.1 [concrete = constants.%D.generic.4e2319.1] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc4_9.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_9.2 (constants.%T.8b3)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %D.decl.loc12: %D.type.bbd080.2 = class_decl @D.2 [concrete = constants.%D.generic.4e2319.2] { -// CHECK:STDOUT: %T.patt: %pattern_type.7ce = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %.loc12: type = splice_block %i32 [concrete = constants.%i32] { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: } -// CHECK:STDOUT: %T.loc12_9.1: %i32 = bind_symbolic_name T, 0 [symbolic = %T.loc12_9.2 (constants.%T.51e)] -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @D.1(%T.loc4_9.1: type) { -// CHECK:STDOUT: %T.loc4_9.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_9.2 (constants.%T.8b3)] -// CHECK:STDOUT: -// CHECK:STDOUT: class; -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @D.2(%T.loc12_9.1: %i32) { -// CHECK:STDOUT: %T.loc12_9.2: %i32 = bind_symbolic_name T, 0 [symbolic = %T.loc12_9.2 (constants.%T.51e)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%D.022 -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @D.1(constants.%T.8b3) { -// CHECK:STDOUT: %T.loc4_9.2 => constants.%T.8b3 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @D.2(constants.%T.51e) { -// CHECK:STDOUT: %T.loc12_9.2 => constants.%T.51e -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_mismatch_param_name.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type: type = pattern_type type [concrete] -// CHECK:STDOUT: %E.type.b0f8dc.1: type = generic_class_type @E.1 [concrete] -// CHECK:STDOUT: %E.generic.f281ba.1: %E.type.b0f8dc.1 = struct_value () [concrete] -// CHECK:STDOUT: %U: type = bind_symbolic_name U, 0 [symbolic] -// CHECK:STDOUT: %E.type.b0f8dc.2: type = generic_class_type @E.2 [concrete] -// CHECK:STDOUT: %E.generic.f281ba.2: %E.type.b0f8dc.2 = struct_value () [concrete] -// CHECK:STDOUT: %E.ec9c10.2: type = class_type @E.2, @E.2(%U) [symbolic] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .E = %E.decl.loc4 -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %E.decl.loc4: %E.type.b0f8dc.1 = class_decl @E.1 [concrete = constants.%E.generic.f281ba.1] { -// CHECK:STDOUT: %T.patt: %pattern_type = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc4_9.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_9.2 (constants.%T)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %E.decl.loc12: %E.type.b0f8dc.2 = class_decl @E.2 [concrete = constants.%E.generic.f281ba.2] { -// CHECK:STDOUT: %U.patt: %pattern_type = symbolic_binding_pattern U, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %U.loc12_9.1: type = bind_symbolic_name U, 0 [symbolic = %U.loc12_9.2 (constants.%U)] -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @E.1(%T.loc4_9.1: type) { -// CHECK:STDOUT: %T.loc4_9.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_9.2 (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: class; -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @E.2(%U.loc12_9.1: type) { -// CHECK:STDOUT: %U.loc12_9.2: type = bind_symbolic_name U, 0 [symbolic = %U.loc12_9.2 (constants.%U)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%E.ec9c10.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @E.1(constants.%T) { -// CHECK:STDOUT: %T.loc4_9.2 => constants.%T -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @E.2(constants.%U) { -// CHECK:STDOUT: %U.loc12_9.2 => constants.%U +// CHECK:STDOUT: %T.loc5_15.2 => constants.%T // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/generic/self.carbon b/toolchain/check/testdata/class/generic/self.carbon deleted file mode 100644 index 1a7a673455746..0000000000000 --- a/toolchain/check/testdata/class/generic/self.carbon +++ /dev/null @@ -1,232 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/generic/self.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/generic/self.carbon - -class Class(T:! type) { - // `Self` is the same as `Class(T)` here. - // TODO: Find a better way to test two types are the same. - fn MakeSelf() -> Self { return {}; } - fn MakeClass() -> Class(T) { return {}; } - fn F() { - var c: Class(T) = MakeSelf(); - var s: Self = MakeClass(); - } -} - -// CHECK:STDOUT: --- self.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] -// CHECK:STDOUT: %Class.type: type = generic_class_type @Class [concrete] -// CHECK:STDOUT: %Class.generic: %Class.type = struct_value () [concrete] -// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T) [symbolic] -// CHECK:STDOUT: %pattern_type.3c1: type = pattern_type %Class [symbolic] -// CHECK:STDOUT: %MakeSelf.type: type = fn_type @MakeSelf, @Class(%T) [symbolic] -// CHECK:STDOUT: %MakeSelf: %MakeSelf.type = struct_value () [symbolic] -// CHECK:STDOUT: %MakeClass.type: type = fn_type @MakeClass, @Class(%T) [symbolic] -// CHECK:STDOUT: %MakeClass: %MakeClass.type = struct_value () [symbolic] -// CHECK:STDOUT: %F.type: type = fn_type @F, @Class(%T) [symbolic] -// CHECK:STDOUT: %F: %F.type = struct_value () [symbolic] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %require_complete: = require_complete_type %Class [symbolic] -// CHECK:STDOUT: %Class.val: %Class = struct_value () [symbolic] -// CHECK:STDOUT: %MakeSelf.specific_fn: = specific_function %MakeSelf, @MakeSelf(%T) [symbolic] -// CHECK:STDOUT: %MakeClass.specific_fn: = specific_function %MakeClass, @MakeClass(%T) [symbolic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Class = %Class.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Class.decl: %Class.type = class_decl @Class [concrete = constants.%Class.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc11_13.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc11_13.2 (constants.%T)] -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Class(%T.loc11_13.1: type) { -// CHECK:STDOUT: %T.loc11_13.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc11_13.2 (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %MakeSelf.type: type = fn_type @MakeSelf, @Class(%T.loc11_13.2) [symbolic = %MakeSelf.type (constants.%MakeSelf.type)] -// CHECK:STDOUT: %MakeSelf: @Class.%MakeSelf.type (%MakeSelf.type) = struct_value () [symbolic = %MakeSelf (constants.%MakeSelf)] -// CHECK:STDOUT: %MakeClass.type: type = fn_type @MakeClass, @Class(%T.loc11_13.2) [symbolic = %MakeClass.type (constants.%MakeClass.type)] -// CHECK:STDOUT: %MakeClass: @Class.%MakeClass.type (%MakeClass.type) = struct_value () [symbolic = %MakeClass (constants.%MakeClass)] -// CHECK:STDOUT: %F.type: type = fn_type @F, @Class(%T.loc11_13.2) [symbolic = %F.type (constants.%F.type)] -// CHECK:STDOUT: %F: @Class.%F.type (%F.type) = struct_value () [symbolic = %F (constants.%F)] -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %MakeSelf.decl: @Class.%MakeSelf.type (%MakeSelf.type) = fn_decl @MakeSelf [symbolic = @Class.%MakeSelf (constants.%MakeSelf)] { -// CHECK:STDOUT: %return.patt: @MakeSelf.%pattern_type (%pattern_type.3c1) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @MakeSelf.%pattern_type (%pattern_type.3c1) = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %.loc14_20: type = specific_constant constants.%Class, @Class(constants.%T) [symbolic = %Class (constants.%Class)] -// CHECK:STDOUT: %Self.ref: type = name_ref Self, %.loc14_20 [symbolic = %Class (constants.%Class)] -// CHECK:STDOUT: %return.param: ref @MakeSelf.%Class (%Class) = out_param call_param0 -// CHECK:STDOUT: %return: ref @MakeSelf.%Class (%Class) = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %MakeClass.decl: @Class.%MakeClass.type (%MakeClass.type) = fn_decl @MakeClass [symbolic = @Class.%MakeClass (constants.%MakeClass)] { -// CHECK:STDOUT: %return.patt: @MakeClass.%pattern_type (%pattern_type.3c1) = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: @MakeClass.%pattern_type (%pattern_type.3c1) = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %Class.ref: %Class.type = name_ref Class, file.%Class.decl [concrete = constants.%Class.generic] -// CHECK:STDOUT: %T.ref: type = name_ref T, @Class.%T.loc11_13.1 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %Class.loc15_28.2: type = class_type @Class, @Class(constants.%T) [symbolic = %Class.loc15_28.1 (constants.%Class)] -// CHECK:STDOUT: %return.param: ref @MakeClass.%Class.loc15_28.1 (%Class) = out_param call_param0 -// CHECK:STDOUT: %return: ref @MakeClass.%Class.loc15_28.1 (%Class) = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %F.decl: @Class.%F.type (%F.type) = fn_decl @F [symbolic = @Class.%F (constants.%F)] {} {} -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Class -// CHECK:STDOUT: .MakeSelf = %MakeSelf.decl -// CHECK:STDOUT: .Class = -// CHECK:STDOUT: .T = -// CHECK:STDOUT: .MakeClass = %MakeClass.decl -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @MakeSelf(@Class.%T.loc11_13.1: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T) [symbolic = %Class (constants.%Class)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %Class [symbolic = %pattern_type (constants.%pattern_type.3c1)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %Class [symbolic = %require_complete (constants.%require_complete)] -// CHECK:STDOUT: %Class.val: @MakeSelf.%Class (%Class) = struct_value () [symbolic = %Class.val (constants.%Class.val)] -// CHECK:STDOUT: -// CHECK:STDOUT: fn() -> %return.param: @MakeSelf.%Class (%Class) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %.loc14_35.1: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %.loc14_35.2: init @MakeSelf.%Class (%Class) = class_init (), %return [symbolic = %Class.val (constants.%Class.val)] -// CHECK:STDOUT: %.loc14_36: init @MakeSelf.%Class (%Class) = converted %.loc14_35.1, %.loc14_35.2 [symbolic = %Class.val (constants.%Class.val)] -// CHECK:STDOUT: return %.loc14_36 to %return -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @MakeClass(@Class.%T.loc11_13.1: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %Class.loc15_28.1: type = class_type @Class, @Class(%T) [symbolic = %Class.loc15_28.1 (constants.%Class)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %Class.loc15_28.1 [symbolic = %pattern_type (constants.%pattern_type.3c1)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %Class.loc15_28.1 [symbolic = %require_complete (constants.%require_complete)] -// CHECK:STDOUT: %Class.val: @MakeClass.%Class.loc15_28.1 (%Class) = struct_value () [symbolic = %Class.val (constants.%Class.val)] -// CHECK:STDOUT: -// CHECK:STDOUT: fn() -> %return.param: @MakeClass.%Class.loc15_28.1 (%Class) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %.loc15_40.1: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %.loc15_40.2: init @MakeClass.%Class.loc15_28.1 (%Class) = class_init (), %return [symbolic = %Class.val (constants.%Class.val)] -// CHECK:STDOUT: %.loc15_41: init @MakeClass.%Class.loc15_28.1 (%Class) = converted %.loc15_40.1, %.loc15_40.2 [symbolic = %Class.val (constants.%Class.val)] -// CHECK:STDOUT: return %.loc15_41 to %return -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @F(@Class.%T.loc11_13.1: type) { -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %Class.loc17_19.2: type = class_type @Class, @Class(%T) [symbolic = %Class.loc17_19.2 (constants.%Class)] -// CHECK:STDOUT: %require_complete: = require_complete_type %Class.loc17_19.2 [symbolic = %require_complete (constants.%require_complete)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %Class.loc17_19.2 [symbolic = %pattern_type (constants.%pattern_type.3c1)] -// CHECK:STDOUT: %MakeSelf.type: type = fn_type @MakeSelf, @Class(%T) [symbolic = %MakeSelf.type (constants.%MakeSelf.type)] -// CHECK:STDOUT: %MakeSelf: @F.%MakeSelf.type (%MakeSelf.type) = struct_value () [symbolic = %MakeSelf (constants.%MakeSelf)] -// CHECK:STDOUT: %MakeSelf.specific_fn.loc17_23.2: = specific_function %MakeSelf, @MakeSelf(%T) [symbolic = %MakeSelf.specific_fn.loc17_23.2 (constants.%MakeSelf.specific_fn)] -// CHECK:STDOUT: %MakeClass.type: type = fn_type @MakeClass, @Class(%T) [symbolic = %MakeClass.type (constants.%MakeClass.type)] -// CHECK:STDOUT: %MakeClass: @F.%MakeClass.type (%MakeClass.type) = struct_value () [symbolic = %MakeClass (constants.%MakeClass)] -// CHECK:STDOUT: %MakeClass.specific_fn.loc18_19.2: = specific_function %MakeClass, @MakeClass(%T) [symbolic = %MakeClass.specific_fn.loc18_19.2 (constants.%MakeClass.specific_fn)] -// CHECK:STDOUT: -// CHECK:STDOUT: fn() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %c.patt: @F.%pattern_type (%pattern_type.3c1) = binding_pattern c [concrete] -// CHECK:STDOUT: %c.var_patt: @F.%pattern_type (%pattern_type.3c1) = var_pattern %c.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %c.var: ref @F.%Class.loc17_19.2 (%Class) = var %c.var_patt -// CHECK:STDOUT: %.loc17_23: @F.%MakeSelf.type (%MakeSelf.type) = specific_constant @Class.%MakeSelf.decl, @Class(constants.%T) [symbolic = %MakeSelf (constants.%MakeSelf)] -// CHECK:STDOUT: %MakeSelf.ref: @F.%MakeSelf.type (%MakeSelf.type) = name_ref MakeSelf, %.loc17_23 [symbolic = %MakeSelf (constants.%MakeSelf)] -// CHECK:STDOUT: %MakeSelf.specific_fn.loc17_23.1: = specific_function %MakeSelf.ref, @MakeSelf(constants.%T) [symbolic = %MakeSelf.specific_fn.loc17_23.2 (constants.%MakeSelf.specific_fn)] -// CHECK:STDOUT: %.loc17_5: ref @F.%Class.loc17_19.2 (%Class) = splice_block %c.var {} -// CHECK:STDOUT: %MakeSelf.call: init @F.%Class.loc17_19.2 (%Class) = call %MakeSelf.specific_fn.loc17_23.1() to %.loc17_5 -// CHECK:STDOUT: assign %c.var, %MakeSelf.call -// CHECK:STDOUT: %.loc17_19: type = splice_block %Class.loc17_19.1 [symbolic = %Class.loc17_19.2 (constants.%Class)] { -// CHECK:STDOUT: %Class.ref: %Class.type = name_ref Class, file.%Class.decl [concrete = constants.%Class.generic] -// CHECK:STDOUT: %T.ref: type = name_ref T, @Class.%T.loc11_13.1 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %Class.loc17_19.1: type = class_type @Class, @Class(constants.%T) [symbolic = %Class.loc17_19.2 (constants.%Class)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %c: ref @F.%Class.loc17_19.2 (%Class) = bind_name c, %c.var -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %s.patt: @F.%pattern_type (%pattern_type.3c1) = binding_pattern s [concrete] -// CHECK:STDOUT: %s.var_patt: @F.%pattern_type (%pattern_type.3c1) = var_pattern %s.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %s.var: ref @F.%Class.loc17_19.2 (%Class) = var %s.var_patt -// CHECK:STDOUT: %.loc18_19: @F.%MakeClass.type (%MakeClass.type) = specific_constant @Class.%MakeClass.decl, @Class(constants.%T) [symbolic = %MakeClass (constants.%MakeClass)] -// CHECK:STDOUT: %MakeClass.ref: @F.%MakeClass.type (%MakeClass.type) = name_ref MakeClass, %.loc18_19 [symbolic = %MakeClass (constants.%MakeClass)] -// CHECK:STDOUT: %MakeClass.specific_fn.loc18_19.1: = specific_function %MakeClass.ref, @MakeClass(constants.%T) [symbolic = %MakeClass.specific_fn.loc18_19.2 (constants.%MakeClass.specific_fn)] -// CHECK:STDOUT: %.loc18_5: ref @F.%Class.loc17_19.2 (%Class) = splice_block %s.var {} -// CHECK:STDOUT: %MakeClass.call: init @F.%Class.loc17_19.2 (%Class) = call %MakeClass.specific_fn.loc18_19.1() to %.loc18_5 -// CHECK:STDOUT: assign %s.var, %MakeClass.call -// CHECK:STDOUT: %.loc18_12.1: type = splice_block %Self.ref [symbolic = %Class.loc17_19.2 (constants.%Class)] { -// CHECK:STDOUT: %.loc18_12.2: type = specific_constant constants.%Class, @Class(constants.%T) [symbolic = %Class.loc17_19.2 (constants.%Class)] -// CHECK:STDOUT: %Self.ref: type = name_ref Self, %.loc18_12.2 [symbolic = %Class.loc17_19.2 (constants.%Class)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %s: ref @F.%Class.loc17_19.2 (%Class) = bind_name s, %s.var -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Class(constants.%T) { -// CHECK:STDOUT: %T.loc11_13.2 => constants.%T -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %MakeSelf.type => constants.%MakeSelf.type -// CHECK:STDOUT: %MakeSelf => constants.%MakeSelf -// CHECK:STDOUT: %MakeClass.type => constants.%MakeClass.type -// CHECK:STDOUT: %MakeClass => constants.%MakeClass -// CHECK:STDOUT: %F.type => constants.%F.type -// CHECK:STDOUT: %F => constants.%F -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @MakeSelf(constants.%T) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %Class => constants.%Class -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.3c1 -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%require_complete -// CHECK:STDOUT: %Class.val => constants.%Class.val -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @MakeClass(constants.%T) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %Class.loc15_28.1 => constants.%Class -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.3c1 -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%require_complete -// CHECK:STDOUT: %Class.val => constants.%Class.val -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @F(constants.%T) {} -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/generic/stringify.carbon b/toolchain/check/testdata/class/generic/stringify.carbon index 5e281f5ba4b3f..4db6fbd352ab3 100644 --- a/toolchain/check/testdata/class/generic/stringify.carbon +++ b/toolchain/check/testdata/class/generic/stringify.carbon @@ -2,6 +2,8 @@ // Exceptions. See /LICENSE for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// // AUTOUPDATE // TIP: To test this file alone, run: // TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/generic/stringify.carbon @@ -87,544 +89,3 @@ class E(F:! D) {} // CHECK:STDERR: ^ // CHECK:STDERR: var g: E({.a = 1, .b = 2}) = {} as E({.a = 3, .b = 4} as D); - -// CHECK:STDOUT: --- fail_empty_params.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %NoParams: type = class_type @NoParams [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %EmptyParams.type: type = generic_class_type @EmptyParams [concrete] -// CHECK:STDOUT: %EmptyParams.generic: %EmptyParams.type = struct_value () [concrete] -// CHECK:STDOUT: %EmptyParams: type = class_type @EmptyParams [concrete] -// CHECK:STDOUT: %pattern_type.32d: type = pattern_type %NoParams [concrete] -// CHECK:STDOUT: %pattern_type.71c: type = pattern_type %EmptyParams [concrete] -// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/operators/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .NoParams = %NoParams.decl -// CHECK:STDOUT: .EmptyParams = %EmptyParams.decl -// CHECK:STDOUT: .v = %v -// CHECK:STDOUT: .w = %w -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %NoParams.decl: type = class_decl @NoParams [concrete = constants.%NoParams] {} {} -// CHECK:STDOUT: %EmptyParams.decl: %EmptyParams.type = class_decl @EmptyParams [concrete = constants.%EmptyParams.generic] {} {} -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %v.patt: %pattern_type.32d = binding_pattern v [concrete] -// CHECK:STDOUT: %v.var_patt: %pattern_type.32d = var_pattern %v.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %v.var: ref %NoParams = var %v.var_patt [concrete] -// CHECK:STDOUT: %NoParams.ref: type = name_ref NoParams, %NoParams.decl [concrete = constants.%NoParams] -// CHECK:STDOUT: %v: ref %NoParams = bind_name v, %v.var -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %w.patt: %pattern_type.71c = binding_pattern w [concrete] -// CHECK:STDOUT: %w.var_patt: %pattern_type.71c = var_pattern %w.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %w.var: ref %EmptyParams = var %w.var_patt [concrete] -// CHECK:STDOUT: %.loc15: type = splice_block %EmptyParams [concrete = constants.%EmptyParams] { -// CHECK:STDOUT: %EmptyParams.ref: %EmptyParams.type = name_ref EmptyParams, %EmptyParams.decl [concrete = constants.%EmptyParams.generic] -// CHECK:STDOUT: %EmptyParams: type = class_type @EmptyParams [concrete = constants.%EmptyParams] -// CHECK:STDOUT: } -// CHECK:STDOUT: %w: ref %EmptyParams = bind_name w, %w.var -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @NoParams { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%NoParams -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @EmptyParams { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%EmptyParams -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @__global_init() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %v.ref: ref %NoParams = name_ref v, file.%v -// CHECK:STDOUT: %.loc15: %EmptyParams = converted %v.ref, [concrete = ] -// CHECK:STDOUT: assign file.%w.var, -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_nested.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] -// CHECK:STDOUT: %Outer.type: type = generic_class_type @Outer [concrete] -// CHECK:STDOUT: %Outer.generic: %Outer.type = struct_value () [concrete] -// CHECK:STDOUT: %Outer.9d6: type = class_type @Outer, @Outer(%T) [symbolic] -// CHECK:STDOUT: %U: type = bind_symbolic_name U, 1 [symbolic] -// CHECK:STDOUT: %Inner.type.eae: type = generic_class_type @Inner, @Outer(%T) [symbolic] -// CHECK:STDOUT: %Inner.generic.137: %Inner.type.eae = struct_value () [symbolic] -// CHECK:STDOUT: %Inner.c71: type = class_type @Inner, @Inner(%T, %U) [symbolic] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %ptr.c28: type = ptr_type %empty_struct_type [concrete] -// CHECK:STDOUT: %Outer.614: type = class_type @Outer, @Outer(%ptr.c28) [concrete] -// CHECK:STDOUT: %Inner.type.5d2: type = generic_class_type @Inner, @Outer(%ptr.c28) [concrete] -// CHECK:STDOUT: %Inner.generic.8e6: %Inner.type.5d2 = struct_value () [concrete] -// CHECK:STDOUT: %pattern_type.828: type = pattern_type %Outer.614 [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %struct_type.a: type = struct_type {.a: %i32} [concrete] -// CHECK:STDOUT: %ptr.1bb: type = ptr_type %struct_type.a [concrete] -// CHECK:STDOUT: %Inner.277: type = class_type @Inner, @Inner(%ptr.c28, %ptr.1bb) [concrete] -// CHECK:STDOUT: %pattern_type.5fa: type = pattern_type %Inner.277 [concrete] -// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/operators/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Outer = %Outer.decl -// CHECK:STDOUT: .v = %v -// CHECK:STDOUT: .w = %w -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Outer.decl: %Outer.type = class_decl @Outer [concrete = constants.%Outer.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc4_13.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_13.2 (constants.%T)] -// CHECK:STDOUT: } -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %v.patt: %pattern_type.828 = binding_pattern v [concrete] -// CHECK:STDOUT: %v.var_patt: %pattern_type.828 = var_pattern %v.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %v.var: ref %Outer.614 = var %v.var_patt [concrete] -// CHECK:STDOUT: %.loc9_17: type = splice_block %Outer.loc9 [concrete = constants.%Outer.614] { -// CHECK:STDOUT: %Outer.ref.loc9: %Outer.type = name_ref Outer, %Outer.decl [concrete = constants.%Outer.generic] -// CHECK:STDOUT: %.loc9_15: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %.loc9_16: type = converted %.loc9_15, constants.%empty_struct_type [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %ptr.loc9: type = ptr_type %.loc9_16 [concrete = constants.%ptr.c28] -// CHECK:STDOUT: %Outer.loc9: type = class_type @Outer, @Outer(constants.%ptr.c28) [concrete = constants.%Outer.614] -// CHECK:STDOUT: } -// CHECK:STDOUT: %v: ref %Outer.614 = bind_name v, %v.var -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %w.patt: %pattern_type.5fa = binding_pattern w [concrete] -// CHECK:STDOUT: %w.var_patt: %pattern_type.5fa = var_pattern %w.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %w.var: ref %Inner.277 = var %w.var_patt [concrete] -// CHECK:STDOUT: %.loc19_35: type = splice_block %Inner [concrete = constants.%Inner.277] { -// CHECK:STDOUT: %Outer.ref.loc19: %Outer.type = name_ref Outer, %Outer.decl [concrete = constants.%Outer.generic] -// CHECK:STDOUT: %.loc19_15: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %.loc19_16: type = converted %.loc19_15, constants.%empty_struct_type [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %ptr.loc19_16: type = ptr_type %.loc19_16 [concrete = constants.%ptr.c28] -// CHECK:STDOUT: %Outer.loc19: type = class_type @Outer, @Outer(constants.%ptr.c28) [concrete = constants.%Outer.614] -// CHECK:STDOUT: %.loc19_18: %Inner.type.5d2 = specific_constant @Outer.%Inner.decl, @Outer(constants.%ptr.c28) [concrete = constants.%Inner.generic.8e6] -// CHECK:STDOUT: %Inner.ref: %Inner.type.5d2 = name_ref Inner, %.loc19_18 [concrete = constants.%Inner.generic.8e6] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %struct_type.a: type = struct_type {.a: %i32} [concrete = constants.%struct_type.a] -// CHECK:STDOUT: %ptr.loc19_34: type = ptr_type %struct_type.a [concrete = constants.%ptr.1bb] -// CHECK:STDOUT: %Inner: type = class_type @Inner, @Inner(constants.%ptr.c28, constants.%ptr.1bb) [concrete = constants.%Inner.277] -// CHECK:STDOUT: } -// CHECK:STDOUT: %w: ref %Inner.277 = bind_name w, %w.var -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Outer(%T.loc4_13.1: type) { -// CHECK:STDOUT: %T.loc4_13.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_13.2 (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %Inner.type: type = generic_class_type @Inner, @Outer(%T.loc4_13.2) [symbolic = %Inner.type (constants.%Inner.type.eae)] -// CHECK:STDOUT: %Inner.generic: @Outer.%Inner.type (%Inner.type.eae) = struct_value () [symbolic = %Inner.generic (constants.%Inner.generic.137)] -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %Inner.decl: @Outer.%Inner.type (%Inner.type.eae) = class_decl @Inner [symbolic = @Outer.%Inner.generic (constants.%Inner.generic.137)] { -// CHECK:STDOUT: %U.patt: %pattern_type.98f = symbolic_binding_pattern U, 1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %U.loc5_15.1: type = bind_symbolic_name U, 1 [symbolic = %U.loc5_15.2 (constants.%U)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Outer.9d6 -// CHECK:STDOUT: .Inner = %Inner.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Inner(@Outer.%T.loc4_13.1: type, %U.loc5_15.1: type) { -// CHECK:STDOUT: %U.loc5_15.2: type = bind_symbolic_name U, 1 [symbolic = %U.loc5_15.2 (constants.%U)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Inner.c71 -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @__global_init() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %v.ref: ref %Outer.614 = name_ref v, file.%v -// CHECK:STDOUT: %.loc19: %Inner.277 = converted %v.ref, [concrete = ] -// CHECK:STDOUT: assign file.%w.var, -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Outer(constants.%T) { -// CHECK:STDOUT: %T.loc4_13.2 => constants.%T -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Inner(constants.%T, constants.%U) { -// CHECK:STDOUT: %U.loc5_15.2 => constants.%U -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Outer(constants.%ptr.c28) { -// CHECK:STDOUT: %T.loc4_13.2 => constants.%ptr.c28 -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %Inner.type => constants.%Inner.type.5d2 -// CHECK:STDOUT: %Inner.generic => constants.%Inner.generic.8e6 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Inner(constants.%ptr.c28, constants.%ptr.1bb) { -// CHECK:STDOUT: %U.loc5_15.2 => constants.%ptr.1bb -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_int_value.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %N.51e: %i32 = bind_symbolic_name N, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %C.type: type = generic_class_type @C [concrete] -// CHECK:STDOUT: %C.generic: %C.type = struct_value () [concrete] -// CHECK:STDOUT: %C.506: type = class_type @C, @C(%N.51e) [symbolic] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %int_123.fff: Core.IntLiteral = int_value 123 [concrete] -// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.type.205: type = facet_type <@ImplicitAs, @ImplicitAs(%i32)> [concrete] -// CHECK:STDOUT: %Convert.type.1b6: type = fn_type @Convert.1, @ImplicitAs(%i32) [concrete] -// CHECK:STDOUT: %To.c80: Core.IntLiteral = bind_symbolic_name To, 0 [symbolic] -// CHECK:STDOUT: %Convert.type.0f9: type = fn_type @Convert.2, @impl.4f9(%To.c80) [symbolic] -// CHECK:STDOUT: %Convert.f06: %Convert.type.0f9 = struct_value () [symbolic] -// CHECK:STDOUT: %ImplicitAs.impl_witness.c75: = impl_witness imports.%ImplicitAs.impl_witness_table.a2f, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.type.035: type = fn_type @Convert.2, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.956: %Convert.type.035 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.facet: %ImplicitAs.type.205 = facet_value Core.IntLiteral, (%ImplicitAs.impl_witness.c75) [concrete] -// CHECK:STDOUT: %.9c3: type = fn_type_with_self_type %Convert.type.1b6, %ImplicitAs.facet [concrete] -// CHECK:STDOUT: %Convert.bound: = bound_method %int_123.fff, %Convert.956 [concrete] -// CHECK:STDOUT: %Convert.specific_fn: = specific_function %Convert.956, @Convert.2(%int_32) [concrete] -// CHECK:STDOUT: %bound_method: = bound_method %int_123.fff, %Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_123.f7f: %i32 = int_value 123 [concrete] -// CHECK:STDOUT: %C.4c3: type = class_type @C, @C(%int_123.f7f) [concrete] -// CHECK:STDOUT: %pattern_type.1b4: type = pattern_type %C.4c3 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/operators/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] -// CHECK:STDOUT: %Core.import_ref.a5b: @impl.4f9.%Convert.type (%Convert.type.0f9) = import_ref Core//prelude/types/int, loc19_39, loaded [symbolic = @impl.4f9.%Convert (constants.%Convert.f06)] -// CHECK:STDOUT: %ImplicitAs.impl_witness_table.a2f = impl_witness_table (%Core.import_ref.a5b), @impl.4f9 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: .v = %v -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %C.decl: %C.type = class_decl @C [concrete = constants.%C.generic] { -// CHECK:STDOUT: %N.patt: %pattern_type.7ce = symbolic_binding_pattern N, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %.loc4: type = splice_block %i32 [concrete = constants.%i32] { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: } -// CHECK:STDOUT: %N.loc4_9.1: %i32 = bind_symbolic_name N, 0 [symbolic = %N.loc4_9.2 (constants.%N.51e)] -// CHECK:STDOUT: } -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %v.patt: %pattern_type.1b4 = binding_pattern v [concrete] -// CHECK:STDOUT: %v.var_patt: %pattern_type.1b4 = var_pattern %v.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %v.var: ref %C.4c3 = var %v.var_patt [concrete] -// CHECK:STDOUT: %.loc13_13.1: type = splice_block %C [concrete = constants.%C.4c3] { -// CHECK:STDOUT: %C.ref: %C.type = name_ref C, %C.decl [concrete = constants.%C.generic] -// CHECK:STDOUT: %int_123: Core.IntLiteral = int_value 123 [concrete = constants.%int_123.fff] -// CHECK:STDOUT: %impl.elem0: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc13_13.1: = bound_method %int_123, %impl.elem0 [concrete = constants.%Convert.bound] -// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc13_13.2: = bound_method %int_123, %specific_fn [concrete = constants.%bound_method] -// CHECK:STDOUT: %int.convert_checked: init %i32 = call %bound_method.loc13_13.2(%int_123) [concrete = constants.%int_123.f7f] -// CHECK:STDOUT: %.loc13_13.2: %i32 = value_of_initializer %int.convert_checked [concrete = constants.%int_123.f7f] -// CHECK:STDOUT: %.loc13_13.3: %i32 = converted %int_123, %.loc13_13.2 [concrete = constants.%int_123.f7f] -// CHECK:STDOUT: %C: type = class_type @C, @C(constants.%int_123.f7f) [concrete = constants.%C.4c3] -// CHECK:STDOUT: } -// CHECK:STDOUT: %v: ref %C.4c3 = bind_name v, %v.var -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @C(%N.loc4_9.1: %i32) { -// CHECK:STDOUT: %N.loc4_9.2: %i32 = bind_symbolic_name N, 0 [symbolic = %N.loc4_9.2 (constants.%N.51e)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%C.506 -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @__global_init() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %.loc13_18: %empty_tuple.type = tuple_literal () -// CHECK:STDOUT: %.loc13_1: %C.4c3 = converted %.loc13_18, [concrete = ] -// CHECK:STDOUT: assign file.%v.var, -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @C(constants.%N.51e) { -// CHECK:STDOUT: %N.loc4_9.2 => constants.%N.51e -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @C(constants.%int_123.f7f) { -// CHECK:STDOUT: %N.loc4_9.2 => constants.%int_123.f7f -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_class_param.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %D: type = class_type @D [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %D.elem: type = unbound_element_type %D, %i32 [concrete] -// CHECK:STDOUT: %struct_type.a.b.501: type = struct_type {.a: %i32, .b: %i32} [concrete] -// CHECK:STDOUT: %complete_type.705: = complete_type_witness %struct_type.a.b.501 [concrete] -// CHECK:STDOUT: %F: %D = bind_symbolic_name F, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.510: type = pattern_type %D [concrete] -// CHECK:STDOUT: %E.type: type = generic_class_type @E [concrete] -// CHECK:STDOUT: %E.generic: %E.type = struct_value () [concrete] -// CHECK:STDOUT: %E: type = class_type @E, @E(%F) [symbolic] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [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: %struct_type.a.b.cfd: type = struct_type {.a: Core.IntLiteral, .b: Core.IntLiteral} [concrete] -// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.type.205: type = facet_type <@ImplicitAs, @ImplicitAs(%i32)> [concrete] -// CHECK:STDOUT: %Convert.type.1b6: type = fn_type @Convert.1, @ImplicitAs(%i32) [concrete] -// CHECK:STDOUT: %To.c80: Core.IntLiteral = bind_symbolic_name To, 0 [symbolic] -// CHECK:STDOUT: %Convert.type.0f9: type = fn_type @Convert.2, @impl.4f9(%To.c80) [symbolic] -// CHECK:STDOUT: %Convert.f06: %Convert.type.0f9 = struct_value () [symbolic] -// CHECK:STDOUT: %ImplicitAs.impl_witness.c75: = impl_witness imports.%ImplicitAs.impl_witness_table.a2f, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.type.035: type = fn_type @Convert.2, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.956: %Convert.type.035 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.facet: %ImplicitAs.type.205 = facet_value Core.IntLiteral, (%ImplicitAs.impl_witness.c75) [concrete] -// CHECK:STDOUT: %.9c3: type = fn_type_with_self_type %Convert.type.1b6, %ImplicitAs.facet [concrete] -// CHECK:STDOUT: %Convert.bound.ab5: = bound_method %int_1.5b8, %Convert.956 [concrete] -// CHECK:STDOUT: %Convert.specific_fn: = specific_function %Convert.956, @Convert.2(%int_32) [concrete] -// CHECK:STDOUT: %bound_method.9a1: = bound_method %int_1.5b8, %Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_1.5d2: %i32 = int_value 1 [concrete] -// CHECK:STDOUT: %Convert.bound.ef9: = bound_method %int_2.ecc, %Convert.956 [concrete] -// CHECK:STDOUT: %bound_method.b92: = bound_method %int_2.ecc, %Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_2.ef8: %i32 = int_value 2 [concrete] -// CHECK:STDOUT: %D.val.413: %D = struct_value (%int_1.5d2, %int_2.ef8) [concrete] -// CHECK:STDOUT: %int_3.1ba: Core.IntLiteral = int_value 3 [concrete] -// CHECK:STDOUT: %int_4.0c1: Core.IntLiteral = int_value 4 [concrete] -// CHECK:STDOUT: %Convert.bound.b30: = bound_method %int_3.1ba, %Convert.956 [concrete] -// CHECK:STDOUT: %bound_method.047: = bound_method %int_3.1ba, %Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_3.822: %i32 = int_value 3 [concrete] -// CHECK:STDOUT: %Convert.bound.ac3: = bound_method %int_4.0c1, %Convert.956 [concrete] -// CHECK:STDOUT: %bound_method.1da: = bound_method %int_4.0c1, %Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_4.940: %i32 = int_value 4 [concrete] -// CHECK:STDOUT: %D.val.835: %D = struct_value (%int_3.822, %int_4.940) [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/operators/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] -// CHECK:STDOUT: %Core.import_ref.a5b: @impl.4f9.%Convert.type (%Convert.type.0f9) = import_ref Core//prelude/types/int, loc19_39, loaded [symbolic = @impl.4f9.%Convert (constants.%Convert.f06)] -// CHECK:STDOUT: %ImplicitAs.impl_witness_table.a2f = impl_witness_table (%Core.import_ref.a5b), @impl.4f9 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .D = %D.decl -// CHECK:STDOUT: .E = %E.decl -// CHECK:STDOUT: .g = %g -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %D.decl: type = class_decl @D [concrete = constants.%D] {} {} -// CHECK:STDOUT: %E.decl: %E.type = class_decl @E [concrete = constants.%E.generic] { -// CHECK:STDOUT: %F.patt: %pattern_type.510 = symbolic_binding_pattern F, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %D.ref: type = name_ref D, file.%D.decl [concrete = constants.%D] -// CHECK:STDOUT: %F.loc9_9.1: %D = bind_symbolic_name F, 0 [symbolic = %F.loc9_9.2 (constants.%F)] -// CHECK:STDOUT: } -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %g.patt: = binding_pattern g [concrete] -// CHECK:STDOUT: %g.var_patt: = var_pattern %g.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %g.var: ref = var %g.var_patt [concrete = ] -// CHECK:STDOUT: %.1: = splice_block [concrete = ] { -// CHECK:STDOUT: %E.ref: %E.type = name_ref E, %E.decl [concrete = constants.%E.generic] -// CHECK:STDOUT: %int_1: Core.IntLiteral = int_value 1 [concrete = constants.%int_1.5b8] -// CHECK:STDOUT: %int_2: Core.IntLiteral = int_value 2 [concrete = constants.%int_2.ecc] -// CHECK:STDOUT: %.loc25_25.1: %struct_type.a.b.cfd = struct_literal (%int_1, %int_2) -// CHECK:STDOUT: %impl.elem0.loc25_25.1: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc25_25.1: = bound_method %int_1, %impl.elem0.loc25_25.1 [concrete = constants.%Convert.bound.ab5] -// CHECK:STDOUT: %specific_fn.loc25_25.1: = specific_function %impl.elem0.loc25_25.1, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc25_25.2: = bound_method %int_1, %specific_fn.loc25_25.1 [concrete = constants.%bound_method.9a1] -// CHECK:STDOUT: %int.convert_checked.loc25_25.1: init %i32 = call %bound_method.loc25_25.2(%int_1) [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %.loc25_25.2: init %i32 = converted %int_1, %int.convert_checked.loc25_25.1 [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %.loc25_25.3: ref %D = temporary_storage -// CHECK:STDOUT: %.loc25_25.4: ref %i32 = class_element_access %.loc25_25.3, element0 -// CHECK:STDOUT: %.loc25_25.5: init %i32 = initialize_from %.loc25_25.2 to %.loc25_25.4 [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %impl.elem0.loc25_25.2: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc25_25.3: = bound_method %int_2, %impl.elem0.loc25_25.2 [concrete = constants.%Convert.bound.ef9] -// CHECK:STDOUT: %specific_fn.loc25_25.2: = specific_function %impl.elem0.loc25_25.2, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc25_25.4: = bound_method %int_2, %specific_fn.loc25_25.2 [concrete = constants.%bound_method.b92] -// CHECK:STDOUT: %int.convert_checked.loc25_25.2: init %i32 = call %bound_method.loc25_25.4(%int_2) [concrete = constants.%int_2.ef8] -// CHECK:STDOUT: %.loc25_25.6: init %i32 = converted %int_2, %int.convert_checked.loc25_25.2 [concrete = constants.%int_2.ef8] -// CHECK:STDOUT: %.loc25_25.7: ref %i32 = class_element_access %.loc25_25.3, element1 -// CHECK:STDOUT: %.loc25_25.8: init %i32 = initialize_from %.loc25_25.6 to %.loc25_25.7 [concrete = constants.%int_2.ef8] -// CHECK:STDOUT: %.loc25_25.9: init %D = class_init (%.loc25_25.5, %.loc25_25.8), %.loc25_25.3 [concrete = constants.%D.val.413] -// CHECK:STDOUT: %.loc25_25.10: ref %D = temporary %.loc25_25.3, %.loc25_25.9 -// CHECK:STDOUT: %.loc25_26.1: ref %D = converted %.loc25_25.1, %.loc25_25.10 -// CHECK:STDOUT: %.loc25_26.2: %D = bind_value %.loc25_26.1 -// CHECK:STDOUT: } -// CHECK:STDOUT: %g: = bind_name g, -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @D { -// CHECK:STDOUT: %int_32.loc5: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc5: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc5: %D.elem = field_decl a, element0 [concrete] -// CHECK:STDOUT: %int_32.loc6: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc6: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc6: %D.elem = field_decl b, element1 [concrete] -// CHECK:STDOUT: %struct_type.a.b: type = struct_type {.a: %i32, .b: %i32} [concrete = constants.%struct_type.a.b.501] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.a.b [concrete = constants.%complete_type.705] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%D -// CHECK:STDOUT: .a = %.loc5 -// CHECK:STDOUT: .b = %.loc6 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @E(%F.loc9_9.1: %D) { -// CHECK:STDOUT: %F.loc9_9.2: %D = bind_symbolic_name F, 0 [symbolic = %F.loc9_9.2 (constants.%F)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%E -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @__global_init() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %.loc25_31: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %E.ref: %E.type = name_ref E, file.%E.decl [concrete = constants.%E.generic] -// CHECK:STDOUT: %int_3: Core.IntLiteral = int_value 3 [concrete = constants.%int_3.1ba] -// CHECK:STDOUT: %int_4: Core.IntLiteral = int_value 4 [concrete = constants.%int_4.0c1] -// CHECK:STDOUT: %.loc25_53.1: %struct_type.a.b.cfd = struct_literal (%int_3, %int_4) -// CHECK:STDOUT: %D.ref: type = name_ref D, file.%D.decl [concrete = constants.%D] -// CHECK:STDOUT: %impl.elem0.loc25_53.1: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc25_53.1: = bound_method %int_3, %impl.elem0.loc25_53.1 [concrete = constants.%Convert.bound.b30] -// CHECK:STDOUT: %specific_fn.loc25_53.1: = specific_function %impl.elem0.loc25_53.1, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc25_53.2: = bound_method %int_3, %specific_fn.loc25_53.1 [concrete = constants.%bound_method.047] -// CHECK:STDOUT: %int.convert_checked.loc25_53.1: init %i32 = call %bound_method.loc25_53.2(%int_3) [concrete = constants.%int_3.822] -// CHECK:STDOUT: %.loc25_53.2: init %i32 = converted %int_3, %int.convert_checked.loc25_53.1 [concrete = constants.%int_3.822] -// CHECK:STDOUT: %.loc25_53.3: ref %D = temporary_storage -// CHECK:STDOUT: %.loc25_53.4: ref %i32 = class_element_access %.loc25_53.3, element0 -// CHECK:STDOUT: %.loc25_53.5: init %i32 = initialize_from %.loc25_53.2 to %.loc25_53.4 [concrete = constants.%int_3.822] -// CHECK:STDOUT: %impl.elem0.loc25_53.2: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc25_53.3: = bound_method %int_4, %impl.elem0.loc25_53.2 [concrete = constants.%Convert.bound.ac3] -// CHECK:STDOUT: %specific_fn.loc25_53.2: = specific_function %impl.elem0.loc25_53.2, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc25_53.4: = bound_method %int_4, %specific_fn.loc25_53.2 [concrete = constants.%bound_method.1da] -// CHECK:STDOUT: %int.convert_checked.loc25_53.2: init %i32 = call %bound_method.loc25_53.4(%int_4) [concrete = constants.%int_4.940] -// CHECK:STDOUT: %.loc25_53.6: init %i32 = converted %int_4, %int.convert_checked.loc25_53.2 [concrete = constants.%int_4.940] -// CHECK:STDOUT: %.loc25_53.7: ref %i32 = class_element_access %.loc25_53.3, element1 -// CHECK:STDOUT: %.loc25_53.8: init %i32 = initialize_from %.loc25_53.6 to %.loc25_53.7 [concrete = constants.%int_4.940] -// CHECK:STDOUT: %.loc25_53.9: init %D = class_init (%.loc25_53.5, %.loc25_53.8), %.loc25_53.3 [concrete = constants.%D.val.835] -// CHECK:STDOUT: %.loc25_53.10: ref %D = temporary %.loc25_53.3, %.loc25_53.9 -// CHECK:STDOUT: %.loc25_55.1: ref %D = converted %.loc25_53.1, %.loc25_53.10 -// CHECK:STDOUT: %.loc25_55.2: %D = bind_value %.loc25_55.1 -// CHECK:STDOUT: assign file.%g.var, -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @E(constants.%F) { -// CHECK:STDOUT: %F.loc9_9.2 => constants.%F -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/syntactic_merge_literal.carbon b/toolchain/check/testdata/class/generic/syntactic_merge_literal.carbon similarity index 99% rename from toolchain/check/testdata/class/syntactic_merge_literal.carbon rename to toolchain/check/testdata/class/generic/syntactic_merge_literal.carbon index 6ae07478b0638..ee4729d756f79 100644 --- a/toolchain/check/testdata/class/syntactic_merge_literal.carbon +++ b/toolchain/check/testdata/class/generic/syntactic_merge_literal.carbon @@ -4,9 +4,9 @@ // // AUTOUPDATE // TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/syntactic_merge_literal.carbon +// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/generic/syntactic_merge_literal.carbon // TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/syntactic_merge_literal.carbon +// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/generic/syntactic_merge_literal.carbon // --- int_match.carbon diff --git a/toolchain/check/testdata/class/generic_method.carbon b/toolchain/check/testdata/class/generic_method.carbon deleted file mode 100644 index 27711f9ff724b..0000000000000 --- a/toolchain/check/testdata/class/generic_method.carbon +++ /dev/null @@ -1,152 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/generic_method.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/generic_method.carbon - -class Class(T:! type) { - var a: T; - fn F[self: Self](n: T); -} - -fn Class(T:! type).F[self: Self](n: T) {} - -// CHECK:STDOUT: --- generic_method.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] -// CHECK:STDOUT: %Class.type: type = generic_class_type @Class [concrete] -// CHECK:STDOUT: %Class.generic: %Class.type = struct_value () [concrete] -// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T) [symbolic] -// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T [symbolic] -// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %T [symbolic] -// CHECK:STDOUT: %pattern_type.3c1: type = pattern_type %Class [symbolic] -// CHECK:STDOUT: %pattern_type.7dc: type = pattern_type %T [symbolic] -// CHECK:STDOUT: %F.type: type = fn_type @F, @Class(%T) [symbolic] -// CHECK:STDOUT: %F: %F.type = struct_value () [symbolic] -// CHECK:STDOUT: %struct_type.a: type = struct_type {.a: %T} [symbolic] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.a [symbolic] -// CHECK:STDOUT: %require_complete.4f8: = require_complete_type %Class [symbolic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Class = %Class.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Class.decl: %Class.type = class_decl @Class [concrete = constants.%Class.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc11_13.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc11_13.2 (constants.%T)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [symbolic = constants.%F] { -// CHECK:STDOUT: %self.patt: @F.%pattern_type.loc13_8 (%pattern_type.3c1) = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: @F.%pattern_type.loc13_8 (%pattern_type.3c1) = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %n.patt: @F.%pattern_type.loc13_20 (%pattern_type.7dc) = binding_pattern n [concrete] -// CHECK:STDOUT: %n.param_patt: @F.%pattern_type.loc13_20 (%pattern_type.7dc) = value_param_pattern %n.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc16: type = bind_symbolic_name T, 0 [symbolic = @Class.%T.loc11_13.2 (constants.%T)] -// CHECK:STDOUT: %self.param.loc16: @F.%Class (%Class) = value_param call_param0 -// CHECK:STDOUT: %.loc16_28.1: type = splice_block %Self.ref.loc16 [symbolic = %Class (constants.%Class)] { -// CHECK:STDOUT: %.loc16_28.2: type = specific_constant constants.%Class, @Class(constants.%T) [symbolic = %Class (constants.%Class)] -// CHECK:STDOUT: %Self.ref.loc16: type = name_ref Self, %.loc16_28.2 [symbolic = %Class (constants.%Class)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self.loc16: @F.%Class (%Class) = bind_name self, %self.param.loc16 -// CHECK:STDOUT: %n.param.loc16: @F.%T.loc13 (%T) = value_param call_param1 -// CHECK:STDOUT: %T.ref.loc16: type = name_ref T, %T.loc16 [symbolic = %T.loc13 (constants.%T)] -// CHECK:STDOUT: %n.loc16: @F.%T.loc13 (%T) = bind_name n, %n.param.loc16 -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Class(%T.loc11_13.1: type) { -// CHECK:STDOUT: %T.loc11_13.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc11_13.2 (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete: = require_complete_type %T.loc11_13.2 [symbolic = %require_complete (constants.%require_complete.4ae)] -// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T.loc11_13.2) [symbolic = %Class (constants.%Class)] -// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %T.loc11_13.2 [symbolic = %Class.elem (constants.%Class.elem)] -// CHECK:STDOUT: %F.type: type = fn_type @F, @Class(%T.loc11_13.2) [symbolic = %F.type (constants.%F.type)] -// CHECK:STDOUT: %F: @Class.%F.type (%F.type) = struct_value () [symbolic = %F (constants.%F)] -// CHECK:STDOUT: %struct_type.a.loc14_1.2: type = struct_type {.a: @Class.%T.loc11_13.2 (%T)} [symbolic = %struct_type.a.loc14_1.2 (constants.%struct_type.a)] -// CHECK:STDOUT: %complete_type.loc14_1.2: = complete_type_witness %struct_type.a.loc14_1.2 [symbolic = %complete_type.loc14_1.2 (constants.%complete_type)] -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc11_13.1 [symbolic = %T.loc11_13.2 (constants.%T)] -// CHECK:STDOUT: %.loc12: @Class.%Class.elem (%Class.elem) = field_decl a, element0 [concrete] -// CHECK:STDOUT: %F.decl: @Class.%F.type (%F.type) = fn_decl @F [symbolic = @Class.%F (constants.%F)] { -// CHECK:STDOUT: %self.patt: @F.%pattern_type.loc13_8 (%pattern_type.3c1) = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: @F.%pattern_type.loc13_8 (%pattern_type.3c1) = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %n.patt: @F.%pattern_type.loc13_20 (%pattern_type.7dc) = binding_pattern n [concrete] -// CHECK:STDOUT: %n.param_patt: @F.%pattern_type.loc13_20 (%pattern_type.7dc) = value_param_pattern %n.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param.loc13: @F.%Class (%Class) = value_param call_param0 -// CHECK:STDOUT: %.loc13_14.1: type = splice_block %Self.ref.loc13 [symbolic = %Class (constants.%Class)] { -// CHECK:STDOUT: %.loc13_14.2: type = specific_constant constants.%Class, @Class(constants.%T) [symbolic = %Class (constants.%Class)] -// CHECK:STDOUT: %Self.ref.loc13: type = name_ref Self, %.loc13_14.2 [symbolic = %Class (constants.%Class)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self.loc13: @F.%Class (%Class) = bind_name self, %self.param.loc13 -// CHECK:STDOUT: %n.param.loc13: @F.%T.loc13 (%T) = value_param call_param1 -// CHECK:STDOUT: %T.ref.loc13: type = name_ref T, @Class.%T.loc11_13.1 [symbolic = %T.loc13 (constants.%T)] -// CHECK:STDOUT: %n.loc13: @F.%T.loc13 (%T) = bind_name n, %n.param.loc13 -// CHECK:STDOUT: } -// CHECK:STDOUT: %struct_type.a.loc14_1.1: type = struct_type {.a: %T} [symbolic = %struct_type.a.loc14_1.2 (constants.%struct_type.a)] -// CHECK:STDOUT: %complete_type.loc14_1.1: = complete_type_witness %struct_type.a.loc14_1.1 [symbolic = %complete_type.loc14_1.2 (constants.%complete_type)] -// CHECK:STDOUT: complete_type_witness = %complete_type.loc14_1.1 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Class -// CHECK:STDOUT: .T = -// CHECK:STDOUT: .a = %.loc12 -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @F(@Class.%T.loc11_13.1: type) { -// CHECK:STDOUT: %T.loc13: type = bind_symbolic_name T, 0 [symbolic = %T.loc13 (constants.%T)] -// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T.loc13) [symbolic = %Class (constants.%Class)] -// CHECK:STDOUT: %pattern_type.loc13_8: type = pattern_type %Class [symbolic = %pattern_type.loc13_8 (constants.%pattern_type.3c1)] -// CHECK:STDOUT: %pattern_type.loc13_20: type = pattern_type %T.loc13 [symbolic = %pattern_type.loc13_20 (constants.%pattern_type.7dc)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete.loc16_26: = require_complete_type %Class [symbolic = %require_complete.loc16_26 (constants.%require_complete.4f8)] -// CHECK:STDOUT: %require_complete.loc16_35: = require_complete_type %T.loc13 [symbolic = %require_complete.loc16_35 (constants.%require_complete.4ae)] -// CHECK:STDOUT: -// CHECK:STDOUT: fn(%self.param.loc16: @F.%Class (%Class), %n.param.loc16: @F.%T.loc13 (%T)) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Class(constants.%T) { -// CHECK:STDOUT: %T.loc11_13.2 => constants.%T -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %require_complete => constants.%require_complete.4ae -// CHECK:STDOUT: %Class => constants.%Class -// CHECK:STDOUT: %Class.elem => constants.%Class.elem -// CHECK:STDOUT: %F.type => constants.%F.type -// CHECK:STDOUT: %F => constants.%F -// CHECK:STDOUT: %struct_type.a.loc14_1.2 => constants.%struct_type.a -// CHECK:STDOUT: %complete_type.loc14_1.2 => constants.%complete_type -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @F(constants.%T) { -// CHECK:STDOUT: %T.loc13 => constants.%T -// CHECK:STDOUT: %Class => constants.%Class -// CHECK:STDOUT: %pattern_type.loc13_8 => constants.%pattern_type.3c1 -// CHECK:STDOUT: %pattern_type.loc13_20 => constants.%pattern_type.7dc -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/import.carbon b/toolchain/check/testdata/class/import.carbon deleted file mode 100644 index 6cf31675a683c..0000000000000 --- a/toolchain/check/testdata/class/import.carbon +++ /dev/null @@ -1,389 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/import.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/import.carbon - -// --- a.carbon - -library "[[@TEST_NAME]]"; - -class Empty { -} - -class Field { - var x: i32; -} - -class ForwardDeclared; - -class ForwardDeclared { - fn F[self: Self](); - fn G[addr self: Self*](); -} - -class Incomplete; - -// --- b.carbon - -library "[[@TEST_NAME]]"; - -import library "a"; - -fn Run() { - var a: Empty = {}; - - var b: Field = {.x = 1}; - b.x = 2; - - var c: ForwardDeclared = {}; - c.F(); - c.G(); - - var d: ForwardDeclared* = &c; - - var e: Incomplete*; -} - -// CHECK:STDOUT: --- a.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Empty: type = class_type @Empty [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %Field: type = class_type @Field [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %Field.elem: type = unbound_element_type %Field, %i32 [concrete] -// CHECK:STDOUT: %struct_type.x: type = struct_type {.x: %i32} [concrete] -// CHECK:STDOUT: %complete_type.1ec: = complete_type_witness %struct_type.x [concrete] -// CHECK:STDOUT: %ForwardDeclared: type = class_type @ForwardDeclared [concrete] -// CHECK:STDOUT: %pattern_type.1b8: type = pattern_type %ForwardDeclared [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %ptr: type = ptr_type %ForwardDeclared [concrete] -// CHECK:STDOUT: %pattern_type.ebb: type = pattern_type %ptr [concrete] -// CHECK:STDOUT: %pattern_type.f6d: type = pattern_type auto [concrete] -// CHECK:STDOUT: %G.type: type = fn_type @G [concrete] -// CHECK:STDOUT: %G: %G.type = struct_value () [concrete] -// CHECK:STDOUT: %Incomplete: type = class_type @Incomplete [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Empty = %Empty.decl -// CHECK:STDOUT: .Field = %Field.decl -// CHECK:STDOUT: .ForwardDeclared = %ForwardDeclared.decl.loc11 -// CHECK:STDOUT: .Incomplete = %Incomplete.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Empty.decl: type = class_decl @Empty [concrete = constants.%Empty] {} {} -// CHECK:STDOUT: %Field.decl: type = class_decl @Field [concrete = constants.%Field] {} {} -// CHECK:STDOUT: %ForwardDeclared.decl.loc11: type = class_decl @ForwardDeclared [concrete = constants.%ForwardDeclared] {} {} -// CHECK:STDOUT: %ForwardDeclared.decl.loc13: type = class_decl @ForwardDeclared [concrete = constants.%ForwardDeclared] {} {} -// CHECK:STDOUT: %Incomplete.decl: type = class_decl @Incomplete [concrete = constants.%Incomplete] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Empty { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Empty -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Field { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc8: %Field.elem = field_decl x, element0 [concrete] -// CHECK:STDOUT: %struct_type.x: type = struct_type {.x: %i32} [concrete = constants.%struct_type.x] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.x [concrete = constants.%complete_type.1ec] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Field -// CHECK:STDOUT: .x = %.loc8 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @ForwardDeclared { -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %self.patt: %pattern_type.1b8 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.1b8 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %ForwardDeclared = value_param call_param0 -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%ForwardDeclared [concrete = constants.%ForwardDeclared] -// CHECK:STDOUT: %self: %ForwardDeclared = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %G.decl: %G.type = fn_decl @G [concrete = constants.%G] { -// CHECK:STDOUT: %self.patt: %pattern_type.ebb = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.ebb = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc15_8: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %ptr = value_param call_param0 -// CHECK:STDOUT: %.loc15_23: type = splice_block %ptr [concrete = constants.%ptr] { -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%ForwardDeclared [concrete = constants.%ForwardDeclared] -// CHECK:STDOUT: %ptr: type = ptr_type %Self.ref [concrete = constants.%ptr] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self: %ptr = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%ForwardDeclared -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: .G = %G.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Incomplete; -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F(%self.param: %ForwardDeclared); -// CHECK:STDOUT: -// CHECK:STDOUT: fn @G(%self.param: %ptr); -// CHECK:STDOUT: -// CHECK:STDOUT: --- b.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Run.type: type = fn_type @Run [concrete] -// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] -// CHECK:STDOUT: %Run: %Run.type = struct_value () [concrete] -// CHECK:STDOUT: %Empty: type = class_type @Empty [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %pattern_type.2f0: type = pattern_type %Empty [concrete] -// CHECK:STDOUT: %Empty.val: %Empty = struct_value () [concrete] -// CHECK:STDOUT: %Field: type = class_type @Field [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %struct_type.x.767: type = struct_type {.x: %i32} [concrete] -// CHECK:STDOUT: %complete_type.c07: = complete_type_witness %struct_type.x.767 [concrete] -// CHECK:STDOUT: %pattern_type.f46: type = pattern_type %Field [concrete] -// CHECK:STDOUT: %int_1.5b8: Core.IntLiteral = int_value 1 [concrete] -// CHECK:STDOUT: %struct_type.x.c96: type = struct_type {.x: Core.IntLiteral} [concrete] -// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.type.9ba: type = facet_type <@ImplicitAs, @ImplicitAs(%i32)> [concrete] -// CHECK:STDOUT: %Convert.type.6da: type = fn_type @Convert.1, @ImplicitAs(%i32) [concrete] -// CHECK:STDOUT: %To.c80: Core.IntLiteral = bind_symbolic_name To, 0 [symbolic] -// CHECK:STDOUT: %Convert.type.0b2: type = fn_type @Convert.2, @impl.c81(%To.c80) [symbolic] -// CHECK:STDOUT: %Convert.6d7: %Convert.type.0b2 = struct_value () [symbolic] -// CHECK:STDOUT: %ImplicitAs.impl_witness.e34: = impl_witness imports.%ImplicitAs.impl_witness_table.e36, @impl.c81(%int_32) [concrete] -// CHECK:STDOUT: %Convert.type.ed5: type = fn_type @Convert.2, @impl.c81(%int_32) [concrete] -// CHECK:STDOUT: %Convert.16d: %Convert.type.ed5 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.facet: %ImplicitAs.type.9ba = facet_value Core.IntLiteral, (%ImplicitAs.impl_witness.e34) [concrete] -// CHECK:STDOUT: %.d6a: type = fn_type_with_self_type %Convert.type.6da, %ImplicitAs.facet [concrete] -// CHECK:STDOUT: %Convert.bound.43e: = bound_method %int_1.5b8, %Convert.16d [concrete] -// CHECK:STDOUT: %Convert.specific_fn: = specific_function %Convert.16d, @Convert.2(%int_32) [concrete] -// CHECK:STDOUT: %bound_method.947: = bound_method %int_1.5b8, %Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_1.47b: %i32 = int_value 1 [concrete] -// CHECK:STDOUT: %Field.val: %Field = struct_value (%int_1.47b) [concrete] -// CHECK:STDOUT: %Field.elem: type = unbound_element_type %Field, %i32 [concrete] -// CHECK:STDOUT: %int_2.ecc: Core.IntLiteral = int_value 2 [concrete] -// CHECK:STDOUT: %Convert.bound.918: = bound_method %int_2.ecc, %Convert.16d [concrete] -// CHECK:STDOUT: %bound_method.c74: = bound_method %int_2.ecc, %Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_2.d0d: %i32 = int_value 2 [concrete] -// CHECK:STDOUT: %ForwardDeclared.7b34f2.1: type = class_type @ForwardDeclared.1 [concrete] -// CHECK:STDOUT: %pattern_type.1b8: type = pattern_type %ForwardDeclared.7b34f2.1 [concrete] -// CHECK:STDOUT: %ForwardDeclared.val: %ForwardDeclared.7b34f2.1 = struct_value () [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %G.type: type = fn_type @G [concrete] -// CHECK:STDOUT: %G: %G.type = struct_value () [concrete] -// CHECK:STDOUT: %ptr.6cf: type = ptr_type %ForwardDeclared.7b34f2.1 [concrete] -// CHECK:STDOUT: %pattern_type.ebb: type = pattern_type %ptr.6cf [concrete] -// CHECK:STDOUT: %Incomplete: type = class_type @Incomplete [concrete] -// CHECK:STDOUT: %ptr.c62: type = ptr_type %Incomplete [concrete] -// CHECK:STDOUT: %pattern_type.275: type = pattern_type %ptr.c62 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Main.Empty: type = import_ref Main//a, Empty, loaded [concrete = constants.%Empty] -// CHECK:STDOUT: %Main.Field: type = import_ref Main//a, Field, loaded [concrete = constants.%Field] -// CHECK:STDOUT: %Main.ForwardDeclared: type = import_ref Main//a, ForwardDeclared, loaded [concrete = constants.%ForwardDeclared.7b34f2.1] -// CHECK:STDOUT: %Main.Incomplete: type = import_ref Main//a, Incomplete, loaded [concrete = constants.%Incomplete] -// CHECK:STDOUT: %Core.ece: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Main.import_ref.8f24d3.1: = import_ref Main//a, loc5_1, loaded [concrete = constants.%complete_type.357] -// CHECK:STDOUT: %Main.import_ref.fd7 = import_ref Main//a, inst18 [no loc], unloaded -// CHECK:STDOUT: %Main.import_ref.709: = import_ref Main//a, loc9_1, loaded [concrete = constants.%complete_type.c07] -// CHECK:STDOUT: %Main.import_ref.845 = import_ref Main//a, inst24 [no loc], unloaded -// CHECK:STDOUT: %Main.import_ref.4d2: %Field.elem = import_ref Main//a, loc8_8, loaded [concrete = %.d33] -// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/operators/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] -// CHECK:STDOUT: %Core.import_ref.a86: @impl.c81.%Convert.type (%Convert.type.0b2) = import_ref Core//prelude/types/int, loc19_39, loaded [symbolic = @impl.c81.%Convert (constants.%Convert.6d7)] -// CHECK:STDOUT: %ImplicitAs.impl_witness_table.e36 = impl_witness_table (%Core.import_ref.a86), @impl.c81 [concrete] -// CHECK:STDOUT: %.d33: %Field.elem = field_decl x, element0 [concrete] -// CHECK:STDOUT: %Main.import_ref.8f24d3.2: = import_ref Main//a, loc16_1, loaded [concrete = constants.%complete_type.357] -// CHECK:STDOUT: %Main.import_ref.39e731.1 = import_ref Main//a, inst59 [no loc], unloaded -// CHECK:STDOUT: %Main.import_ref.760: %F.type = import_ref Main//a, loc14_21, loaded [concrete = constants.%F] -// CHECK:STDOUT: %Main.import_ref.26e: %G.type = import_ref Main//a, loc15_27, loaded [concrete = constants.%G] -// CHECK:STDOUT: %Main.import_ref.8f24d3.3: = import_ref Main//a, loc16_1, loaded [concrete = constants.%complete_type.357] -// CHECK:STDOUT: %Main.import_ref.39e731.2 = import_ref Main//a, inst59 [no loc], unloaded -// CHECK:STDOUT: %Main.import_ref.42a = import_ref Main//a, loc14_21, unloaded -// CHECK:STDOUT: %Main.import_ref.67a = import_ref Main//a, loc15_27, unloaded -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Empty = imports.%Main.Empty -// CHECK:STDOUT: .Field = imports.%Main.Field -// CHECK:STDOUT: .ForwardDeclared = imports.%Main.ForwardDeclared -// CHECK:STDOUT: .Incomplete = imports.%Main.Incomplete -// CHECK:STDOUT: .Core = imports.%Core.ece -// CHECK:STDOUT: .Run = %Run.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %default.import = import -// CHECK:STDOUT: %Run.decl: %Run.type = fn_decl @Run [concrete = constants.%Run] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Empty [from "a.carbon"] { -// CHECK:STDOUT: complete_type_witness = imports.%Main.import_ref.8f24d3.1 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Main.import_ref.fd7 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Field [from "a.carbon"] { -// CHECK:STDOUT: complete_type_witness = imports.%Main.import_ref.709 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Main.import_ref.845 -// CHECK:STDOUT: .x = imports.%Main.import_ref.4d2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @ForwardDeclared.1 [from "a.carbon"] { -// CHECK:STDOUT: complete_type_witness = imports.%Main.import_ref.8f24d3.2 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Main.import_ref.39e731.1 -// CHECK:STDOUT: .F = imports.%Main.import_ref.760 -// CHECK:STDOUT: .G = imports.%Main.import_ref.26e -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @ForwardDeclared.2 [from "a.carbon"] { -// CHECK:STDOUT: complete_type_witness = imports.%Main.import_ref.8f24d3.3 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Main.import_ref.39e731.2 -// CHECK:STDOUT: .F = imports.%Main.import_ref.42a -// CHECK:STDOUT: .G = imports.%Main.import_ref.67a -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Incomplete [from "a.carbon"]; -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Run() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %a.patt: %pattern_type.2f0 = binding_pattern a [concrete] -// CHECK:STDOUT: %a.var_patt: %pattern_type.2f0 = var_pattern %a.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %a.var: ref %Empty = var %a.var_patt -// CHECK:STDOUT: %.loc7_19.1: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %.loc7_19.2: init %Empty = class_init (), %a.var [concrete = constants.%Empty.val] -// CHECK:STDOUT: %.loc7_3: init %Empty = converted %.loc7_19.1, %.loc7_19.2 [concrete = constants.%Empty.val] -// CHECK:STDOUT: assign %a.var, %.loc7_3 -// CHECK:STDOUT: %Empty.ref: type = name_ref Empty, imports.%Main.Empty [concrete = constants.%Empty] -// CHECK:STDOUT: %a: ref %Empty = bind_name a, %a.var -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %b.patt: %pattern_type.f46 = binding_pattern b [concrete] -// CHECK:STDOUT: %b.var_patt: %pattern_type.f46 = var_pattern %b.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %b.var: ref %Field = var %b.var_patt -// CHECK:STDOUT: %int_1: Core.IntLiteral = int_value 1 [concrete = constants.%int_1.5b8] -// CHECK:STDOUT: %.loc9_25.1: %struct_type.x.c96 = struct_literal (%int_1) -// CHECK:STDOUT: %impl.elem0.loc9: %.d6a = impl_witness_access constants.%ImplicitAs.impl_witness.e34, element0 [concrete = constants.%Convert.16d] -// CHECK:STDOUT: %bound_method.loc9_25.1: = bound_method %int_1, %impl.elem0.loc9 [concrete = constants.%Convert.bound.43e] -// CHECK:STDOUT: %specific_fn.loc9: = specific_function %impl.elem0.loc9, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc9_25.2: = bound_method %int_1, %specific_fn.loc9 [concrete = constants.%bound_method.947] -// CHECK:STDOUT: %int.convert_checked.loc9: init %i32 = call %bound_method.loc9_25.2(%int_1) [concrete = constants.%int_1.47b] -// CHECK:STDOUT: %.loc9_25.2: init %i32 = converted %int_1, %int.convert_checked.loc9 [concrete = constants.%int_1.47b] -// CHECK:STDOUT: %.loc9_25.3: ref %i32 = class_element_access %b.var, element0 -// CHECK:STDOUT: %.loc9_25.4: init %i32 = initialize_from %.loc9_25.2 to %.loc9_25.3 [concrete = constants.%int_1.47b] -// CHECK:STDOUT: %.loc9_25.5: init %Field = class_init (%.loc9_25.4), %b.var [concrete = constants.%Field.val] -// CHECK:STDOUT: %.loc9_3: init %Field = converted %.loc9_25.1, %.loc9_25.5 [concrete = constants.%Field.val] -// CHECK:STDOUT: assign %b.var, %.loc9_3 -// CHECK:STDOUT: %Field.ref: type = name_ref Field, imports.%Main.Field [concrete = constants.%Field] -// CHECK:STDOUT: %b: ref %Field = bind_name b, %b.var -// CHECK:STDOUT: %b.ref: ref %Field = name_ref b, %b -// CHECK:STDOUT: %x.ref: %Field.elem = name_ref x, imports.%Main.import_ref.4d2 [concrete = imports.%.d33] -// CHECK:STDOUT: %.loc10_4: ref %i32 = class_element_access %b.ref, element0 -// CHECK:STDOUT: %int_2: Core.IntLiteral = int_value 2 [concrete = constants.%int_2.ecc] -// CHECK:STDOUT: %impl.elem0.loc10: %.d6a = impl_witness_access constants.%ImplicitAs.impl_witness.e34, element0 [concrete = constants.%Convert.16d] -// CHECK:STDOUT: %bound_method.loc10_7.1: = bound_method %int_2, %impl.elem0.loc10 [concrete = constants.%Convert.bound.918] -// CHECK:STDOUT: %specific_fn.loc10: = specific_function %impl.elem0.loc10, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc10_7.2: = bound_method %int_2, %specific_fn.loc10 [concrete = constants.%bound_method.c74] -// CHECK:STDOUT: %int.convert_checked.loc10: init %i32 = call %bound_method.loc10_7.2(%int_2) [concrete = constants.%int_2.d0d] -// CHECK:STDOUT: %.loc10_7: init %i32 = converted %int_2, %int.convert_checked.loc10 [concrete = constants.%int_2.d0d] -// CHECK:STDOUT: assign %.loc10_4, %.loc10_7 -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %c.patt: %pattern_type.1b8 = binding_pattern c [concrete] -// CHECK:STDOUT: %c.var_patt: %pattern_type.1b8 = var_pattern %c.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %c.var: ref %ForwardDeclared.7b34f2.1 = var %c.var_patt -// CHECK:STDOUT: %.loc12_29.1: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %.loc12_29.2: init %ForwardDeclared.7b34f2.1 = class_init (), %c.var [concrete = constants.%ForwardDeclared.val] -// CHECK:STDOUT: %.loc12_3: init %ForwardDeclared.7b34f2.1 = converted %.loc12_29.1, %.loc12_29.2 [concrete = constants.%ForwardDeclared.val] -// CHECK:STDOUT: assign %c.var, %.loc12_3 -// CHECK:STDOUT: %ForwardDeclared.ref.loc12: type = name_ref ForwardDeclared, imports.%Main.ForwardDeclared [concrete = constants.%ForwardDeclared.7b34f2.1] -// CHECK:STDOUT: %c: ref %ForwardDeclared.7b34f2.1 = bind_name c, %c.var -// CHECK:STDOUT: %c.ref.loc13: ref %ForwardDeclared.7b34f2.1 = name_ref c, %c -// CHECK:STDOUT: %F.ref: %F.type = name_ref F, imports.%Main.import_ref.760 [concrete = constants.%F] -// CHECK:STDOUT: %F.bound: = bound_method %c.ref.loc13, %F.ref -// CHECK:STDOUT: %.loc13: %ForwardDeclared.7b34f2.1 = bind_value %c.ref.loc13 -// CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.bound(%.loc13) -// CHECK:STDOUT: %c.ref.loc14: ref %ForwardDeclared.7b34f2.1 = name_ref c, %c -// CHECK:STDOUT: %G.ref: %G.type = name_ref G, imports.%Main.import_ref.26e [concrete = constants.%G] -// CHECK:STDOUT: %G.bound: = bound_method %c.ref.loc14, %G.ref -// CHECK:STDOUT: %addr.loc14: %ptr.6cf = addr_of %c.ref.loc14 -// CHECK:STDOUT: %G.call: init %empty_tuple.type = call %G.bound(%addr.loc14) -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %d.patt: %pattern_type.ebb = binding_pattern d [concrete] -// CHECK:STDOUT: %d.var_patt: %pattern_type.ebb = var_pattern %d.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %d.var: ref %ptr.6cf = var %d.var_patt -// CHECK:STDOUT: %c.ref.loc16: ref %ForwardDeclared.7b34f2.1 = name_ref c, %c -// CHECK:STDOUT: %addr.loc16: %ptr.6cf = addr_of %c.ref.loc16 -// CHECK:STDOUT: assign %d.var, %addr.loc16 -// CHECK:STDOUT: %.loc16: type = splice_block %ptr.loc16 [concrete = constants.%ptr.6cf] { -// CHECK:STDOUT: %ForwardDeclared.ref.loc16: type = name_ref ForwardDeclared, imports.%Main.ForwardDeclared [concrete = constants.%ForwardDeclared.7b34f2.1] -// CHECK:STDOUT: %ptr.loc16: type = ptr_type %ForwardDeclared.ref.loc16 [concrete = constants.%ptr.6cf] -// CHECK:STDOUT: } -// CHECK:STDOUT: %d: ref %ptr.6cf = bind_name d, %d.var -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %e.patt: %pattern_type.275 = binding_pattern e [concrete] -// CHECK:STDOUT: %e.var_patt: %pattern_type.275 = var_pattern %e.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %e.var: ref %ptr.c62 = var %e.var_patt -// CHECK:STDOUT: %.loc18: type = splice_block %ptr.loc18 [concrete = constants.%ptr.c62] { -// CHECK:STDOUT: %Incomplete.ref: type = name_ref Incomplete, imports.%Main.Incomplete [concrete = constants.%Incomplete] -// CHECK:STDOUT: %ptr.loc18: type = ptr_type %Incomplete.ref [concrete = constants.%ptr.c62] -// CHECK:STDOUT: } -// CHECK:STDOUT: %e: ref %ptr.c62 = bind_name e, %e.var -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F [from "a.carbon"]; -// CHECK:STDOUT: -// CHECK:STDOUT: fn @G [from "a.carbon"]; -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/import_base.carbon b/toolchain/check/testdata/class/import_base.carbon deleted file mode 100644 index e19ef0a1243cc..0000000000000 --- a/toolchain/check/testdata/class/import_base.carbon +++ /dev/null @@ -1,300 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/import_base.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/import_base.carbon - -// --- a.carbon - -library "[[@TEST_NAME]]"; - -base class Base { - fn F[self: Self](); - fn Unused[self: Self](); - - var x: i32; - var unused: i32; -} - -class Child { - extend base: Base; -} - -// --- b.carbon - -library "[[@TEST_NAME]]"; - -import library "a"; - -fn Run() { - var a: Child = {.base = {.x = 0, .unused = 1}}; - a.x = 2; - a.F(); -} - -// CHECK:STDOUT: --- a.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Base: type = class_type @Base [concrete] -// CHECK:STDOUT: %pattern_type.bcc: type = pattern_type %Base [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %Unused.type: type = fn_type @Unused [concrete] -// CHECK:STDOUT: %Unused: %Unused.type = struct_value () [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %Base.elem: type = unbound_element_type %Base, %i32 [concrete] -// CHECK:STDOUT: %struct_type.x.unused: type = struct_type {.x: %i32, .unused: %i32} [concrete] -// CHECK:STDOUT: %complete_type.20c: = complete_type_witness %struct_type.x.unused [concrete] -// CHECK:STDOUT: %Child: type = class_type @Child [concrete] -// CHECK:STDOUT: %Child.elem: type = unbound_element_type %Child, %Base [concrete] -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %Base} [concrete] -// CHECK:STDOUT: %complete_type.15c: = complete_type_witness %struct_type.base [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Base = %Base.decl -// CHECK:STDOUT: .Child = %Child.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Base.decl: type = class_decl @Base [concrete = constants.%Base] {} {} -// CHECK:STDOUT: %Child.decl: type = class_decl @Child [concrete = constants.%Child] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Base { -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %self.patt: %pattern_type.bcc = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.bcc = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %Base = value_param call_param0 -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Base [concrete = constants.%Base] -// CHECK:STDOUT: %self: %Base = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %Unused.decl: %Unused.type = fn_decl @Unused [concrete = constants.%Unused] { -// CHECK:STDOUT: %self.patt: %pattern_type.bcc = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.bcc = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %Base = value_param call_param0 -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Base [concrete = constants.%Base] -// CHECK:STDOUT: %self: %Base = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %int_32.loc8: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc8: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc8: %Base.elem = field_decl x, element0 [concrete] -// CHECK:STDOUT: %int_32.loc9: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc9: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc9: %Base.elem = field_decl unused, element1 [concrete] -// CHECK:STDOUT: %struct_type.x.unused: type = struct_type {.x: %i32, .unused: %i32} [concrete = constants.%struct_type.x.unused] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.x.unused [concrete = constants.%complete_type.20c] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Base -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: .Unused = %Unused.decl -// CHECK:STDOUT: .x = %.loc8 -// CHECK:STDOUT: .unused = %.loc9 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Child { -// CHECK:STDOUT: %Base.ref: type = name_ref Base, file.%Base.decl [concrete = constants.%Base] -// CHECK:STDOUT: %.loc13: %Child.elem = base_decl %Base.ref, element0 [concrete] -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %Base} [concrete = constants.%struct_type.base] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base [concrete = constants.%complete_type.15c] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Child -// CHECK:STDOUT: .Base = -// CHECK:STDOUT: .base = %.loc13 -// CHECK:STDOUT: extend %Base.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F(%self.param: %Base); -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Unused(%self.param: %Base); -// CHECK:STDOUT: -// CHECK:STDOUT: --- b.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Run.type: type = fn_type @Run [concrete] -// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] -// CHECK:STDOUT: %Run: %Run.type = struct_value () [concrete] -// CHECK:STDOUT: %Child: type = class_type @Child [concrete] -// CHECK:STDOUT: %Base: type = class_type @Base [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %struct_type.x.unused.7d5: type = struct_type {.x: %i32, .unused: %i32} [concrete] -// CHECK:STDOUT: %complete_type.90f: = complete_type_witness %struct_type.x.unused.7d5 [concrete] -// CHECK:STDOUT: %struct_type.base.b1e: type = struct_type {.base: %Base} [concrete] -// CHECK:STDOUT: %complete_type.15c: = complete_type_witness %struct_type.base.b1e [concrete] -// CHECK:STDOUT: %pattern_type.1bd: type = pattern_type %Child [concrete] -// CHECK:STDOUT: %int_0.5c6: Core.IntLiteral = int_value 0 [concrete] -// CHECK:STDOUT: %int_1.5b8: Core.IntLiteral = int_value 1 [concrete] -// CHECK:STDOUT: %struct_type.x.unused.c45: type = struct_type {.x: Core.IntLiteral, .unused: Core.IntLiteral} [concrete] -// CHECK:STDOUT: %struct_type.base.6c7: type = struct_type {.base: %struct_type.x.unused.c45} [concrete] -// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.type.9ba: type = facet_type <@ImplicitAs, @ImplicitAs(%i32)> [concrete] -// CHECK:STDOUT: %Convert.type.6da: type = fn_type @Convert.1, @ImplicitAs(%i32) [concrete] -// CHECK:STDOUT: %To.c80: Core.IntLiteral = bind_symbolic_name To, 0 [symbolic] -// CHECK:STDOUT: %Convert.type.0b2: type = fn_type @Convert.2, @impl.c81(%To.c80) [symbolic] -// CHECK:STDOUT: %Convert.6d7: %Convert.type.0b2 = struct_value () [symbolic] -// CHECK:STDOUT: %ImplicitAs.impl_witness.e34: = impl_witness imports.%ImplicitAs.impl_witness_table.e36, @impl.c81(%int_32) [concrete] -// CHECK:STDOUT: %Convert.type.ed5: type = fn_type @Convert.2, @impl.c81(%int_32) [concrete] -// CHECK:STDOUT: %Convert.16d: %Convert.type.ed5 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.facet: %ImplicitAs.type.9ba = facet_value Core.IntLiteral, (%ImplicitAs.impl_witness.e34) [concrete] -// CHECK:STDOUT: %.d6a: type = fn_type_with_self_type %Convert.type.6da, %ImplicitAs.facet [concrete] -// CHECK:STDOUT: %Convert.bound.9aa: = bound_method %int_0.5c6, %Convert.16d [concrete] -// CHECK:STDOUT: %Convert.specific_fn: = specific_function %Convert.16d, @Convert.2(%int_32) [concrete] -// CHECK:STDOUT: %bound_method.8aa: = bound_method %int_0.5c6, %Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_0.263: %i32 = int_value 0 [concrete] -// CHECK:STDOUT: %Convert.bound.43e: = bound_method %int_1.5b8, %Convert.16d [concrete] -// CHECK:STDOUT: %bound_method.947: = bound_method %int_1.5b8, %Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_1.47b: %i32 = int_value 1 [concrete] -// CHECK:STDOUT: %Base.val: %Base = struct_value (%int_0.263, %int_1.47b) [concrete] -// CHECK:STDOUT: %Child.val: %Child = struct_value (%Base.val) [concrete] -// CHECK:STDOUT: %Base.elem: type = unbound_element_type %Base, %i32 [concrete] -// CHECK:STDOUT: %int_2.ecc: Core.IntLiteral = int_value 2 [concrete] -// CHECK:STDOUT: %Convert.bound.918: = bound_method %int_2.ecc, %Convert.16d [concrete] -// CHECK:STDOUT: %bound_method.c74: = bound_method %int_2.ecc, %Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_2.d0d: %i32 = int_value 2 [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Main.Base = import_ref Main//a, Base, unloaded -// CHECK:STDOUT: %Main.Child: type = import_ref Main//a, Child, loaded [concrete = constants.%Child] -// CHECK:STDOUT: %Core.ece: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Main.import_ref.239: = import_ref Main//a, loc10_1, loaded [concrete = constants.%complete_type.90f] -// CHECK:STDOUT: %Main.import_ref.1f3 = import_ref Main//a, inst18 [no loc], unloaded -// CHECK:STDOUT: %Main.import_ref.e8f: %F.type = import_ref Main//a, loc5_21, loaded [concrete = constants.%F] -// CHECK:STDOUT: %Main.import_ref.8bf = import_ref Main//a, loc6_26, unloaded -// CHECK:STDOUT: %Main.import_ref.e67: %Base.elem = import_ref Main//a, loc8_8, loaded [concrete = %.720] -// CHECK:STDOUT: %Main.import_ref.2e4 = import_ref Main//a, loc9_13, unloaded -// CHECK:STDOUT: %Main.import_ref.c5f: = import_ref Main//a, loc14_1, loaded [concrete = constants.%complete_type.15c] -// CHECK:STDOUT: %Main.import_ref.9a9 = import_ref Main//a, inst73 [no loc], unloaded -// CHECK:STDOUT: %Main.import_ref.7e5 = import_ref Main//a, loc13_20, unloaded -// CHECK:STDOUT: %Main.import_ref.a21640.2: type = import_ref Main//a, loc13_16, loaded [concrete = constants.%Base] -// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/operators/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] -// CHECK:STDOUT: %Core.import_ref.a86: @impl.c81.%Convert.type (%Convert.type.0b2) = import_ref Core//prelude/types/int, loc19_39, loaded [symbolic = @impl.c81.%Convert (constants.%Convert.6d7)] -// CHECK:STDOUT: %ImplicitAs.impl_witness_table.e36 = impl_witness_table (%Core.import_ref.a86), @impl.c81 [concrete] -// CHECK:STDOUT: %.720: %Base.elem = field_decl x, element0 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Base = imports.%Main.Base -// CHECK:STDOUT: .Child = imports.%Main.Child -// CHECK:STDOUT: .Core = imports.%Core.ece -// CHECK:STDOUT: .Run = %Run.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %default.import = import -// CHECK:STDOUT: %Run.decl: %Run.type = fn_decl @Run [concrete = constants.%Run] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Child [from "a.carbon"] { -// CHECK:STDOUT: complete_type_witness = imports.%Main.import_ref.c5f -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Main.import_ref.9a9 -// CHECK:STDOUT: .base = imports.%Main.import_ref.7e5 -// CHECK:STDOUT: .x = -// CHECK:STDOUT: .F = -// CHECK:STDOUT: extend imports.%Main.import_ref.a21640.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Base [from "a.carbon"] { -// CHECK:STDOUT: complete_type_witness = imports.%Main.import_ref.239 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Main.import_ref.1f3 -// CHECK:STDOUT: .F = imports.%Main.import_ref.e8f -// CHECK:STDOUT: .Unused = imports.%Main.import_ref.8bf -// CHECK:STDOUT: .x = imports.%Main.import_ref.e67 -// CHECK:STDOUT: .unused = imports.%Main.import_ref.2e4 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Run() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %a.patt: %pattern_type.1bd = binding_pattern a [concrete] -// CHECK:STDOUT: %a.var_patt: %pattern_type.1bd = var_pattern %a.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %a.var: ref %Child = var %a.var_patt -// CHECK:STDOUT: %int_0: Core.IntLiteral = int_value 0 [concrete = constants.%int_0.5c6] -// CHECK:STDOUT: %int_1: Core.IntLiteral = int_value 1 [concrete = constants.%int_1.5b8] -// CHECK:STDOUT: %.loc7_47.1: %struct_type.x.unused.c45 = struct_literal (%int_0, %int_1) -// CHECK:STDOUT: %.loc7_48.1: %struct_type.base.6c7 = struct_literal (%.loc7_47.1) -// CHECK:STDOUT: %impl.elem0.loc7_47.1: %.d6a = impl_witness_access constants.%ImplicitAs.impl_witness.e34, element0 [concrete = constants.%Convert.16d] -// CHECK:STDOUT: %bound_method.loc7_47.1: = bound_method %int_0, %impl.elem0.loc7_47.1 [concrete = constants.%Convert.bound.9aa] -// CHECK:STDOUT: %specific_fn.loc7_47.1: = specific_function %impl.elem0.loc7_47.1, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc7_47.2: = bound_method %int_0, %specific_fn.loc7_47.1 [concrete = constants.%bound_method.8aa] -// CHECK:STDOUT: %int.convert_checked.loc7_47.1: init %i32 = call %bound_method.loc7_47.2(%int_0) [concrete = constants.%int_0.263] -// CHECK:STDOUT: %.loc7_47.2: init %i32 = converted %int_0, %int.convert_checked.loc7_47.1 [concrete = constants.%int_0.263] -// CHECK:STDOUT: %.loc7_48.2: ref %Base = class_element_access %a.var, element0 -// CHECK:STDOUT: %.loc7_47.3: ref %i32 = class_element_access %.loc7_48.2, element0 -// CHECK:STDOUT: %.loc7_47.4: init %i32 = initialize_from %.loc7_47.2 to %.loc7_47.3 [concrete = constants.%int_0.263] -// CHECK:STDOUT: %impl.elem0.loc7_47.2: %.d6a = impl_witness_access constants.%ImplicitAs.impl_witness.e34, element0 [concrete = constants.%Convert.16d] -// CHECK:STDOUT: %bound_method.loc7_47.3: = bound_method %int_1, %impl.elem0.loc7_47.2 [concrete = constants.%Convert.bound.43e] -// CHECK:STDOUT: %specific_fn.loc7_47.2: = specific_function %impl.elem0.loc7_47.2, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc7_47.4: = bound_method %int_1, %specific_fn.loc7_47.2 [concrete = constants.%bound_method.947] -// CHECK:STDOUT: %int.convert_checked.loc7_47.2: init %i32 = call %bound_method.loc7_47.4(%int_1) [concrete = constants.%int_1.47b] -// CHECK:STDOUT: %.loc7_47.5: init %i32 = converted %int_1, %int.convert_checked.loc7_47.2 [concrete = constants.%int_1.47b] -// CHECK:STDOUT: %.loc7_47.6: ref %i32 = class_element_access %.loc7_48.2, element1 -// CHECK:STDOUT: %.loc7_47.7: init %i32 = initialize_from %.loc7_47.5 to %.loc7_47.6 [concrete = constants.%int_1.47b] -// CHECK:STDOUT: %.loc7_47.8: init %Base = class_init (%.loc7_47.4, %.loc7_47.7), %.loc7_48.2 [concrete = constants.%Base.val] -// CHECK:STDOUT: %.loc7_48.3: init %Base = converted %.loc7_47.1, %.loc7_47.8 [concrete = constants.%Base.val] -// CHECK:STDOUT: %.loc7_48.4: init %Child = class_init (%.loc7_48.3), %a.var [concrete = constants.%Child.val] -// CHECK:STDOUT: %.loc7_3: init %Child = converted %.loc7_48.1, %.loc7_48.4 [concrete = constants.%Child.val] -// CHECK:STDOUT: assign %a.var, %.loc7_3 -// CHECK:STDOUT: %Child.ref: type = name_ref Child, imports.%Main.Child [concrete = constants.%Child] -// CHECK:STDOUT: %a: ref %Child = bind_name a, %a.var -// CHECK:STDOUT: %a.ref.loc8: ref %Child = name_ref a, %a -// CHECK:STDOUT: %x.ref: %Base.elem = name_ref x, imports.%Main.import_ref.e67 [concrete = imports.%.720] -// CHECK:STDOUT: %.loc8_4.1: ref %Base = class_element_access %a.ref.loc8, element0 -// CHECK:STDOUT: %.loc8_4.2: ref %Base = converted %a.ref.loc8, %.loc8_4.1 -// CHECK:STDOUT: %.loc8_4.3: ref %i32 = class_element_access %.loc8_4.2, element0 -// CHECK:STDOUT: %int_2: Core.IntLiteral = int_value 2 [concrete = constants.%int_2.ecc] -// CHECK:STDOUT: %impl.elem0.loc8: %.d6a = impl_witness_access constants.%ImplicitAs.impl_witness.e34, element0 [concrete = constants.%Convert.16d] -// CHECK:STDOUT: %bound_method.loc8_7.1: = bound_method %int_2, %impl.elem0.loc8 [concrete = constants.%Convert.bound.918] -// CHECK:STDOUT: %specific_fn.loc8: = specific_function %impl.elem0.loc8, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc8_7.2: = bound_method %int_2, %specific_fn.loc8 [concrete = constants.%bound_method.c74] -// CHECK:STDOUT: %int.convert_checked.loc8: init %i32 = call %bound_method.loc8_7.2(%int_2) [concrete = constants.%int_2.d0d] -// CHECK:STDOUT: %.loc8_7: init %i32 = converted %int_2, %int.convert_checked.loc8 [concrete = constants.%int_2.d0d] -// CHECK:STDOUT: assign %.loc8_4.3, %.loc8_7 -// CHECK:STDOUT: %a.ref.loc9: ref %Child = name_ref a, %a -// CHECK:STDOUT: %F.ref: %F.type = name_ref F, imports.%Main.import_ref.e8f [concrete = constants.%F] -// CHECK:STDOUT: %F.bound: = bound_method %a.ref.loc9, %F.ref -// CHECK:STDOUT: %.loc9_3.1: ref %Base = class_element_access %a.ref.loc9, element0 -// CHECK:STDOUT: %.loc9_3.2: ref %Base = converted %a.ref.loc9, %.loc9_3.1 -// CHECK:STDOUT: %.loc9_3.3: %Base = bind_value %.loc9_3.2 -// CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.bound(%.loc9_3.3) -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F [from "a.carbon"]; -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/import_forward_decl.carbon b/toolchain/check/testdata/class/import_forward_decl.carbon deleted file mode 100644 index 718eed7fb139e..0000000000000 --- a/toolchain/check/testdata/class/import_forward_decl.carbon +++ /dev/null @@ -1,82 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/import_forward_decl.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/import_forward_decl.carbon - -// --- a.carbon - -library "[[@TEST_NAME]]"; - -class ForwardDecl; - -// --- a.impl.carbon - -impl library "[[@TEST_NAME]]"; - -class ForwardDecl { -} - -// CHECK:STDOUT: --- a.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %ForwardDecl: type = class_type @ForwardDecl [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .ForwardDecl = %ForwardDecl.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %ForwardDecl.decl: type = class_decl @ForwardDecl [concrete = constants.%ForwardDecl] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @ForwardDecl; -// CHECK:STDOUT: -// CHECK:STDOUT: --- a.impl.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %ForwardDecl: type = class_type @ForwardDecl [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .ForwardDecl = %ForwardDecl.decl -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: } -// CHECK:STDOUT: %default.import.loc2_17.1 = import -// CHECK:STDOUT: %default.import.loc2_17.2 = import -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %ForwardDecl.decl: type = class_decl @ForwardDecl [concrete = constants.%ForwardDecl] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @ForwardDecl { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%ForwardDecl -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/import_indirect.carbon b/toolchain/check/testdata/class/import_indirect.carbon deleted file mode 100644 index bd2543a9db9e9..0000000000000 --- a/toolchain/check/testdata/class/import_indirect.carbon +++ /dev/null @@ -1,587 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/import_indirect.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/import_indirect.carbon - -// Triangle: -// -// a <-- Define -// |\ -// | b <-- Re-export -// |/ -// X <-- Use both -// -// Diamond: -// -// a <-- Define -// / \ -// b c <-- Re-export -// \ / -// X <-- Use both - -// ============================================================================ -// Setup files -// ============================================================================ - -// --- a.carbon - -library "[[@TEST_NAME]]"; - -class C {} - -// --- b.carbon - -library "[[@TEST_NAME]]"; - -import library "a"; - -alias D = C; - -var b_val: C = {}; -var b_ptr: D* = &b_val; - -// --- c.carbon - -library "[[@TEST_NAME]]"; - -import library "a"; - -alias E = C; - -var c_val: C = {}; -var c_ptr: E* = &c_val; - -// ============================================================================ -// Test files -// ============================================================================ - -// --- triangle.carbon - -library "[[@TEST_NAME]]"; - -import library "a"; -import library "b"; - -var val: C = {}; -var ptr: D* = &val; - -// --- triangle_reverse.carbon - -library "[[@TEST_NAME]]"; - -import library "b"; -import library "a"; - -var val: C = {}; -var ptr: D* = &val; - -// --- diamond.carbon - -library "[[@TEST_NAME]]"; - -import library "b"; -import library "c"; - -var val: D = {}; -var ptr: E* = &val; - -// --- diamond_reverse.carbon - -library "[[@TEST_NAME]]"; - -import library "c"; -import library "b"; - -var val: D = {}; -var ptr: E* = &val; - -// CHECK:STDOUT: --- a.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- b.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %pattern_type.c48: type = pattern_type %C [concrete] -// CHECK:STDOUT: %C.val: %C = struct_value () [concrete] -// CHECK:STDOUT: %ptr.019: type = ptr_type %C [concrete] -// CHECK:STDOUT: %pattern_type.44a: type = pattern_type %ptr.019 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Main.C: type = import_ref Main//a, C, loaded [concrete = constants.%C] -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Main.import_ref.8f2: = import_ref Main//a, loc4_10, loaded [concrete = constants.%complete_type] -// CHECK:STDOUT: %Main.import_ref.2c4 = import_ref Main//a, inst18 [no loc], unloaded -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .C = imports.%Main.C -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .D = %D -// CHECK:STDOUT: .b_val = %b_val -// CHECK:STDOUT: .b_ptr = %b_ptr -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %default.import = import -// CHECK:STDOUT: %C.ref.loc6: type = name_ref C, imports.%Main.C [concrete = constants.%C] -// CHECK:STDOUT: %D: type = bind_alias D, imports.%Main.C [concrete = constants.%C] -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %b_val.patt: %pattern_type.c48 = binding_pattern b_val [concrete] -// CHECK:STDOUT: %b_val.var_patt: %pattern_type.c48 = var_pattern %b_val.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %b_val.var: ref %C = var %b_val.var_patt [concrete] -// CHECK:STDOUT: %C.ref.loc8: type = name_ref C, imports.%Main.C [concrete = constants.%C] -// CHECK:STDOUT: %b_val: ref %C = bind_name b_val, %b_val.var -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %b_ptr.patt: %pattern_type.44a = binding_pattern b_ptr [concrete] -// CHECK:STDOUT: %b_ptr.var_patt: %pattern_type.44a = var_pattern %b_ptr.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %b_ptr.var: ref %ptr.019 = var %b_ptr.var_patt [concrete] -// CHECK:STDOUT: %.loc9: type = splice_block %ptr [concrete = constants.%ptr.019] { -// CHECK:STDOUT: %D.ref: type = name_ref D, %D [concrete = constants.%C] -// CHECK:STDOUT: %ptr: type = ptr_type %D.ref [concrete = constants.%ptr.019] -// CHECK:STDOUT: } -// CHECK:STDOUT: %b_ptr: ref %ptr.019 = bind_name b_ptr, %b_ptr.var -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C [from "a.carbon"] { -// CHECK:STDOUT: complete_type_witness = imports.%Main.import_ref.8f2 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Main.import_ref.2c4 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @__global_init() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %.loc8_17.1: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %.loc8_17.2: init %C = class_init (), file.%b_val.var [concrete = constants.%C.val] -// CHECK:STDOUT: %.loc8_1: init %C = converted %.loc8_17.1, %.loc8_17.2 [concrete = constants.%C.val] -// CHECK:STDOUT: assign file.%b_val.var, %.loc8_1 -// CHECK:STDOUT: %b_val.ref: ref %C = name_ref b_val, file.%b_val -// CHECK:STDOUT: %addr: %ptr.019 = addr_of %b_val.ref -// CHECK:STDOUT: assign file.%b_ptr.var, %addr -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- c.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %pattern_type.c48: type = pattern_type %C [concrete] -// CHECK:STDOUT: %C.val: %C = struct_value () [concrete] -// CHECK:STDOUT: %ptr.019: type = ptr_type %C [concrete] -// CHECK:STDOUT: %pattern_type.44a: type = pattern_type %ptr.019 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Main.C: type = import_ref Main//a, C, loaded [concrete = constants.%C] -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Main.import_ref.8f2: = import_ref Main//a, loc4_10, loaded [concrete = constants.%complete_type] -// CHECK:STDOUT: %Main.import_ref.2c4 = import_ref Main//a, inst18 [no loc], unloaded -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .C = imports.%Main.C -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .E = %E -// CHECK:STDOUT: .c_val = %c_val -// CHECK:STDOUT: .c_ptr = %c_ptr -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %default.import = import -// CHECK:STDOUT: %C.ref.loc6: type = name_ref C, imports.%Main.C [concrete = constants.%C] -// CHECK:STDOUT: %E: type = bind_alias E, imports.%Main.C [concrete = constants.%C] -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %c_val.patt: %pattern_type.c48 = binding_pattern c_val [concrete] -// CHECK:STDOUT: %c_val.var_patt: %pattern_type.c48 = var_pattern %c_val.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %c_val.var: ref %C = var %c_val.var_patt [concrete] -// CHECK:STDOUT: %C.ref.loc8: type = name_ref C, imports.%Main.C [concrete = constants.%C] -// CHECK:STDOUT: %c_val: ref %C = bind_name c_val, %c_val.var -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %c_ptr.patt: %pattern_type.44a = binding_pattern c_ptr [concrete] -// CHECK:STDOUT: %c_ptr.var_patt: %pattern_type.44a = var_pattern %c_ptr.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %c_ptr.var: ref %ptr.019 = var %c_ptr.var_patt [concrete] -// CHECK:STDOUT: %.loc9: type = splice_block %ptr [concrete = constants.%ptr.019] { -// CHECK:STDOUT: %E.ref: type = name_ref E, %E [concrete = constants.%C] -// CHECK:STDOUT: %ptr: type = ptr_type %E.ref [concrete = constants.%ptr.019] -// CHECK:STDOUT: } -// CHECK:STDOUT: %c_ptr: ref %ptr.019 = bind_name c_ptr, %c_ptr.var -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C [from "a.carbon"] { -// CHECK:STDOUT: complete_type_witness = imports.%Main.import_ref.8f2 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Main.import_ref.2c4 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @__global_init() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %.loc8_17.1: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %.loc8_17.2: init %C = class_init (), file.%c_val.var [concrete = constants.%C.val] -// CHECK:STDOUT: %.loc8_1: init %C = converted %.loc8_17.1, %.loc8_17.2 [concrete = constants.%C.val] -// CHECK:STDOUT: assign file.%c_val.var, %.loc8_1 -// CHECK:STDOUT: %c_val.ref: ref %C = name_ref c_val, file.%c_val -// CHECK:STDOUT: %addr: %ptr.019 = addr_of %c_val.ref -// CHECK:STDOUT: assign file.%c_ptr.var, %addr -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- triangle.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %pattern_type.c48: type = pattern_type %C [concrete] -// CHECK:STDOUT: %C.val: %C = struct_value () [concrete] -// CHECK:STDOUT: %ptr.019: type = ptr_type %C [concrete] -// CHECK:STDOUT: %pattern_type.44a: type = pattern_type %ptr.019 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Main.C: type = import_ref Main//a, C, loaded [concrete = constants.%C] -// CHECK:STDOUT: %Main.D: type = import_ref Main//b, D, loaded [concrete = constants.%C] -// CHECK:STDOUT: %Main.b_val = import_ref Main//b, b_val, unloaded -// CHECK:STDOUT: %Main.b_ptr = import_ref Main//b, b_ptr, unloaded -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Main.import_ref.8f2: = import_ref Main//a, loc4_10, loaded [concrete = constants.%complete_type] -// CHECK:STDOUT: %Main.import_ref.2c4 = import_ref Main//a, inst18 [no loc], unloaded -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .C = imports.%Main.C -// CHECK:STDOUT: .D = imports.%Main.D -// CHECK:STDOUT: .b_val = imports.%Main.b_val -// CHECK:STDOUT: .b_ptr = imports.%Main.b_ptr -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .val = %val -// CHECK:STDOUT: .ptr = %ptr.loc8_5 -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %default.import = import -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %val.patt: %pattern_type.c48 = binding_pattern val [concrete] -// CHECK:STDOUT: %val.var_patt: %pattern_type.c48 = var_pattern %val.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %val.var: ref %C = var %val.var_patt [concrete] -// CHECK:STDOUT: %C.ref: type = name_ref C, imports.%Main.C [concrete = constants.%C] -// CHECK:STDOUT: %val: ref %C = bind_name val, %val.var -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %ptr.patt: %pattern_type.44a = binding_pattern ptr [concrete] -// CHECK:STDOUT: %ptr.var_patt: %pattern_type.44a = var_pattern %ptr.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %ptr.var: ref %ptr.019 = var %ptr.var_patt [concrete] -// CHECK:STDOUT: %.loc8: type = splice_block %ptr.loc8_11 [concrete = constants.%ptr.019] { -// CHECK:STDOUT: %D.ref: type = name_ref D, imports.%Main.D [concrete = constants.%C] -// CHECK:STDOUT: %ptr.loc8_11: type = ptr_type %D.ref [concrete = constants.%ptr.019] -// CHECK:STDOUT: } -// CHECK:STDOUT: %ptr.loc8_5: ref %ptr.019 = bind_name ptr, %ptr.var -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C [from "a.carbon"] { -// CHECK:STDOUT: complete_type_witness = imports.%Main.import_ref.8f2 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Main.import_ref.2c4 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @__global_init() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %.loc7_15.1: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %.loc7_15.2: init %C = class_init (), file.%val.var [concrete = constants.%C.val] -// CHECK:STDOUT: %.loc7_1: init %C = converted %.loc7_15.1, %.loc7_15.2 [concrete = constants.%C.val] -// CHECK:STDOUT: assign file.%val.var, %.loc7_1 -// CHECK:STDOUT: %val.ref: ref %C = name_ref val, file.%val -// CHECK:STDOUT: %addr: %ptr.019 = addr_of %val.ref -// CHECK:STDOUT: assign file.%ptr.var, %addr -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- triangle_reverse.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %pattern_type.c48: type = pattern_type %C [concrete] -// CHECK:STDOUT: %C.val: %C = struct_value () [concrete] -// CHECK:STDOUT: %ptr.019: type = ptr_type %C [concrete] -// CHECK:STDOUT: %pattern_type.44a: type = pattern_type %ptr.019 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Main.D: type = import_ref Main//b, D, loaded [concrete = constants.%C] -// CHECK:STDOUT: %Main.b_val = import_ref Main//b, b_val, unloaded -// CHECK:STDOUT: %Main.b_ptr = import_ref Main//b, b_ptr, unloaded -// CHECK:STDOUT: %Main.C: type = import_ref Main//a, C, loaded [concrete = constants.%C] -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Main.import_ref.8f2: = import_ref Main//a, loc4_10, loaded [concrete = constants.%complete_type] -// CHECK:STDOUT: %Main.import_ref.2c4 = import_ref Main//a, inst18 [no loc], unloaded -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .D = imports.%Main.D -// CHECK:STDOUT: .b_val = imports.%Main.b_val -// CHECK:STDOUT: .b_ptr = imports.%Main.b_ptr -// CHECK:STDOUT: .C = imports.%Main.C -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .val = %val -// CHECK:STDOUT: .ptr = %ptr.loc8_5 -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %default.import = import -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %val.patt: %pattern_type.c48 = binding_pattern val [concrete] -// CHECK:STDOUT: %val.var_patt: %pattern_type.c48 = var_pattern %val.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %val.var: ref %C = var %val.var_patt [concrete] -// CHECK:STDOUT: %C.ref: type = name_ref C, imports.%Main.C [concrete = constants.%C] -// CHECK:STDOUT: %val: ref %C = bind_name val, %val.var -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %ptr.patt: %pattern_type.44a = binding_pattern ptr [concrete] -// CHECK:STDOUT: %ptr.var_patt: %pattern_type.44a = var_pattern %ptr.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %ptr.var: ref %ptr.019 = var %ptr.var_patt [concrete] -// CHECK:STDOUT: %.loc8: type = splice_block %ptr.loc8_11 [concrete = constants.%ptr.019] { -// CHECK:STDOUT: %D.ref: type = name_ref D, imports.%Main.D [concrete = constants.%C] -// CHECK:STDOUT: %ptr.loc8_11: type = ptr_type %D.ref [concrete = constants.%ptr.019] -// CHECK:STDOUT: } -// CHECK:STDOUT: %ptr.loc8_5: ref %ptr.019 = bind_name ptr, %ptr.var -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C [from "a.carbon"] { -// CHECK:STDOUT: complete_type_witness = imports.%Main.import_ref.8f2 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Main.import_ref.2c4 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @__global_init() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %.loc7_15.1: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %.loc7_15.2: init %C = class_init (), file.%val.var [concrete = constants.%C.val] -// CHECK:STDOUT: %.loc7_1: init %C = converted %.loc7_15.1, %.loc7_15.2 [concrete = constants.%C.val] -// CHECK:STDOUT: assign file.%val.var, %.loc7_1 -// CHECK:STDOUT: %val.ref: ref %C = name_ref val, file.%val -// CHECK:STDOUT: %addr: %ptr.019 = addr_of %val.ref -// CHECK:STDOUT: assign file.%ptr.var, %addr -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- diamond.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %pattern_type.c48: type = pattern_type %C [concrete] -// CHECK:STDOUT: %C.val: %C = struct_value () [concrete] -// CHECK:STDOUT: %ptr.019: type = ptr_type %C [concrete] -// CHECK:STDOUT: %pattern_type.44a: type = pattern_type %ptr.019 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Main.D: type = import_ref Main//b, D, loaded [concrete = constants.%C] -// CHECK:STDOUT: %Main.b_val = import_ref Main//b, b_val, unloaded -// CHECK:STDOUT: %Main.b_ptr = import_ref Main//b, b_ptr, unloaded -// CHECK:STDOUT: %Main.E: type = import_ref Main//c, E, loaded [concrete = constants.%C] -// CHECK:STDOUT: %Main.c_val = import_ref Main//c, c_val, unloaded -// CHECK:STDOUT: %Main.c_ptr = import_ref Main//c, c_ptr, unloaded -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Main.import_ref.8db: = import_ref Main//b, inst23 [indirect], loaded [concrete = constants.%complete_type] -// CHECK:STDOUT: %Main.import_ref.6a9 = import_ref Main//b, inst24 [indirect], unloaded -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .D = imports.%Main.D -// CHECK:STDOUT: .b_val = imports.%Main.b_val -// CHECK:STDOUT: .b_ptr = imports.%Main.b_ptr -// CHECK:STDOUT: .E = imports.%Main.E -// CHECK:STDOUT: .c_val = imports.%Main.c_val -// CHECK:STDOUT: .c_ptr = imports.%Main.c_ptr -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .val = %val -// CHECK:STDOUT: .ptr = %ptr.loc8_5 -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %default.import = import -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %val.patt: %pattern_type.c48 = binding_pattern val [concrete] -// CHECK:STDOUT: %val.var_patt: %pattern_type.c48 = var_pattern %val.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %val.var: ref %C = var %val.var_patt [concrete] -// CHECK:STDOUT: %D.ref: type = name_ref D, imports.%Main.D [concrete = constants.%C] -// CHECK:STDOUT: %val: ref %C = bind_name val, %val.var -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %ptr.patt: %pattern_type.44a = binding_pattern ptr [concrete] -// CHECK:STDOUT: %ptr.var_patt: %pattern_type.44a = var_pattern %ptr.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %ptr.var: ref %ptr.019 = var %ptr.var_patt [concrete] -// CHECK:STDOUT: %.loc8: type = splice_block %ptr.loc8_11 [concrete = constants.%ptr.019] { -// CHECK:STDOUT: %E.ref: type = name_ref E, imports.%Main.E [concrete = constants.%C] -// CHECK:STDOUT: %ptr.loc8_11: type = ptr_type %E.ref [concrete = constants.%ptr.019] -// CHECK:STDOUT: } -// CHECK:STDOUT: %ptr.loc8_5: ref %ptr.019 = bind_name ptr, %ptr.var -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C [from "b.carbon"] { -// CHECK:STDOUT: complete_type_witness = imports.%Main.import_ref.8db -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Main.import_ref.6a9 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @__global_init() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %.loc7_15.1: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %.loc7_15.2: init %C = class_init (), file.%val.var [concrete = constants.%C.val] -// CHECK:STDOUT: %.loc7_1: init %C = converted %.loc7_15.1, %.loc7_15.2 [concrete = constants.%C.val] -// CHECK:STDOUT: assign file.%val.var, %.loc7_1 -// CHECK:STDOUT: %val.ref: ref %C = name_ref val, file.%val -// CHECK:STDOUT: %addr: %ptr.019 = addr_of %val.ref -// CHECK:STDOUT: assign file.%ptr.var, %addr -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- diamond_reverse.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %pattern_type.c48: type = pattern_type %C [concrete] -// CHECK:STDOUT: %C.val: %C = struct_value () [concrete] -// CHECK:STDOUT: %ptr.019: type = ptr_type %C [concrete] -// CHECK:STDOUT: %pattern_type.44a: type = pattern_type %ptr.019 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Main.E: type = import_ref Main//c, E, loaded [concrete = constants.%C] -// CHECK:STDOUT: %Main.c_val = import_ref Main//c, c_val, unloaded -// CHECK:STDOUT: %Main.c_ptr = import_ref Main//c, c_ptr, unloaded -// CHECK:STDOUT: %Main.D: type = import_ref Main//b, D, loaded [concrete = constants.%C] -// CHECK:STDOUT: %Main.b_val = import_ref Main//b, b_val, unloaded -// CHECK:STDOUT: %Main.b_ptr = import_ref Main//b, b_ptr, unloaded -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Main.import_ref.8db: = import_ref Main//b, inst23 [indirect], loaded [concrete = constants.%complete_type] -// CHECK:STDOUT: %Main.import_ref.6a9 = import_ref Main//b, inst24 [indirect], unloaded -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .E = imports.%Main.E -// CHECK:STDOUT: .c_val = imports.%Main.c_val -// CHECK:STDOUT: .c_ptr = imports.%Main.c_ptr -// CHECK:STDOUT: .D = imports.%Main.D -// CHECK:STDOUT: .b_val = imports.%Main.b_val -// CHECK:STDOUT: .b_ptr = imports.%Main.b_ptr -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .val = %val -// CHECK:STDOUT: .ptr = %ptr.loc8_5 -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %default.import = import -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %val.patt: %pattern_type.c48 = binding_pattern val [concrete] -// CHECK:STDOUT: %val.var_patt: %pattern_type.c48 = var_pattern %val.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %val.var: ref %C = var %val.var_patt [concrete] -// CHECK:STDOUT: %D.ref: type = name_ref D, imports.%Main.D [concrete = constants.%C] -// CHECK:STDOUT: %val: ref %C = bind_name val, %val.var -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %ptr.patt: %pattern_type.44a = binding_pattern ptr [concrete] -// CHECK:STDOUT: %ptr.var_patt: %pattern_type.44a = var_pattern %ptr.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %ptr.var: ref %ptr.019 = var %ptr.var_patt [concrete] -// CHECK:STDOUT: %.loc8: type = splice_block %ptr.loc8_11 [concrete = constants.%ptr.019] { -// CHECK:STDOUT: %E.ref: type = name_ref E, imports.%Main.E [concrete = constants.%C] -// CHECK:STDOUT: %ptr.loc8_11: type = ptr_type %E.ref [concrete = constants.%ptr.019] -// CHECK:STDOUT: } -// CHECK:STDOUT: %ptr.loc8_5: ref %ptr.019 = bind_name ptr, %ptr.var -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C [from "b.carbon"] { -// CHECK:STDOUT: complete_type_witness = imports.%Main.import_ref.8db -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Main.import_ref.6a9 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @__global_init() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %.loc7_15.1: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %.loc7_15.2: init %C = class_init (), file.%val.var [concrete = constants.%C.val] -// CHECK:STDOUT: %.loc7_1: init %C = converted %.loc7_15.1, %.loc7_15.2 [concrete = constants.%C.val] -// CHECK:STDOUT: assign file.%val.var, %.loc7_1 -// CHECK:STDOUT: %val.ref: ref %C = name_ref val, file.%val -// CHECK:STDOUT: %addr: %ptr.019 = addr_of %val.ref -// CHECK:STDOUT: assign file.%ptr.var, %addr -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/import_member_cycle.carbon b/toolchain/check/testdata/class/import_member_cycle.carbon deleted file mode 100644 index b72d40533568a..0000000000000 --- a/toolchain/check/testdata/class/import_member_cycle.carbon +++ /dev/null @@ -1,125 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/import_member_cycle.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/import_member_cycle.carbon - -// --- a.carbon - -library "[[@TEST_NAME]]"; - -class Cycle { - var a: Cycle*; -} - -// --- b.carbon - -library "[[@TEST_NAME]]"; - -import library "a"; - -fn Run() { - var a: Cycle*; -} - -// CHECK:STDOUT: --- a.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Cycle: type = class_type @Cycle [concrete] -// CHECK:STDOUT: %ptr: type = ptr_type %Cycle [concrete] -// CHECK:STDOUT: %Cycle.elem: type = unbound_element_type %Cycle, %ptr [concrete] -// CHECK:STDOUT: %struct_type.a: type = struct_type {.a: %ptr} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.a [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Cycle = %Cycle.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Cycle.decl: type = class_decl @Cycle [concrete = constants.%Cycle] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Cycle { -// CHECK:STDOUT: %Cycle.ref: type = name_ref Cycle, file.%Cycle.decl [concrete = constants.%Cycle] -// CHECK:STDOUT: %ptr: type = ptr_type %Cycle.ref [concrete = constants.%ptr] -// CHECK:STDOUT: %.loc5: %Cycle.elem = field_decl a, element0 [concrete] -// CHECK:STDOUT: %struct_type.a: type = struct_type {.a: %ptr} [concrete = constants.%struct_type.a] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.a [concrete = constants.%complete_type] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Cycle -// CHECK:STDOUT: .Cycle = -// CHECK:STDOUT: .a = %.loc5 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- b.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Run.type: type = fn_type @Run [concrete] -// CHECK:STDOUT: %Run: %Run.type = struct_value () [concrete] -// CHECK:STDOUT: %Cycle: type = class_type @Cycle [concrete] -// CHECK:STDOUT: %ptr: type = ptr_type %Cycle [concrete] -// CHECK:STDOUT: %struct_type.a: type = struct_type {.a: %ptr} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.a [concrete] -// CHECK:STDOUT: %pattern_type: type = pattern_type %ptr [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Main.Cycle: type = import_ref Main//a, Cycle, loaded [concrete = constants.%Cycle] -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Main.import_ref.72d: = import_ref Main//a, loc6_1, loaded [concrete = constants.%complete_type] -// CHECK:STDOUT: %Main.import_ref.3a6 = import_ref Main//a, inst18 [no loc], unloaded -// CHECK:STDOUT: %Main.import_ref.4e0 = import_ref Main//a, loc5_8, unloaded -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Cycle = imports.%Main.Cycle -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Run = %Run.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %default.import = import -// CHECK:STDOUT: %Run.decl: %Run.type = fn_decl @Run [concrete = constants.%Run] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Cycle [from "a.carbon"] { -// CHECK:STDOUT: complete_type_witness = imports.%Main.import_ref.72d -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Main.import_ref.3a6 -// CHECK:STDOUT: .a = imports.%Main.import_ref.4e0 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Run() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %a.patt: %pattern_type = binding_pattern a [concrete] -// CHECK:STDOUT: %a.var_patt: %pattern_type = var_pattern %a.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %a.var: ref %ptr = var %a.var_patt -// CHECK:STDOUT: %.loc7: type = splice_block %ptr [concrete = constants.%ptr] { -// CHECK:STDOUT: %Cycle.ref: type = name_ref Cycle, imports.%Main.Cycle [concrete = constants.%Cycle] -// CHECK:STDOUT: %ptr: type = ptr_type %Cycle.ref [concrete = constants.%ptr] -// CHECK:STDOUT: } -// CHECK:STDOUT: %a: ref %ptr = bind_name a, %a.var -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/import_struct_cyle.carbon b/toolchain/check/testdata/class/import_struct_cyle.carbon deleted file mode 100644 index 98ea0392fe9aa..0000000000000 --- a/toolchain/check/testdata/class/import_struct_cyle.carbon +++ /dev/null @@ -1,151 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/import_struct_cyle.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/import_struct_cyle.carbon - -// --- a.carbon - -library "[[@TEST_NAME]]"; - -class Cycle; - -var a: {.b: Cycle*}; - -class Cycle { - // The type here is equivalent to the `a` above, but on import can be resolved first. - var c: {.b: Cycle*}; -} - -// --- b.carbon - -library "[[@TEST_NAME]]"; - -import library "a"; - -fn Run() { - a.b = (*a.b).c.b; -} - -// CHECK:STDOUT: --- a.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Cycle: type = class_type @Cycle [concrete] -// CHECK:STDOUT: %ptr: type = ptr_type %Cycle [concrete] -// CHECK:STDOUT: %struct_type.b: type = struct_type {.b: %ptr} [concrete] -// CHECK:STDOUT: %pattern_type: type = pattern_type %struct_type.b [concrete] -// CHECK:STDOUT: %Cycle.elem: type = unbound_element_type %Cycle, %struct_type.b [concrete] -// CHECK:STDOUT: %struct_type.c: type = struct_type {.c: %struct_type.b} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.c [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Cycle = %Cycle.decl.loc4 -// CHECK:STDOUT: .a = %a -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Cycle.decl.loc4: type = class_decl @Cycle [concrete = constants.%Cycle] {} {} -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %a.patt: %pattern_type = binding_pattern a [concrete] -// CHECK:STDOUT: %a.var_patt: %pattern_type = var_pattern %a.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %a.var: ref %struct_type.b = var %a.var_patt [concrete] -// CHECK:STDOUT: %.loc6: type = splice_block %struct_type.b [concrete = constants.%struct_type.b] { -// CHECK:STDOUT: %Cycle.ref: type = name_ref Cycle, %Cycle.decl.loc4 [concrete = constants.%Cycle] -// CHECK:STDOUT: %ptr: type = ptr_type %Cycle.ref [concrete = constants.%ptr] -// CHECK:STDOUT: %struct_type.b: type = struct_type {.b: %ptr} [concrete = constants.%struct_type.b] -// CHECK:STDOUT: } -// CHECK:STDOUT: %a: ref %struct_type.b = bind_name a, %a.var -// CHECK:STDOUT: %Cycle.decl.loc8: type = class_decl @Cycle [concrete = constants.%Cycle] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Cycle { -// CHECK:STDOUT: %Cycle.ref: type = name_ref Cycle, file.%Cycle.decl.loc4 [concrete = constants.%Cycle] -// CHECK:STDOUT: %ptr: type = ptr_type %Cycle.ref [concrete = constants.%ptr] -// CHECK:STDOUT: %struct_type.b: type = struct_type {.b: %ptr} [concrete = constants.%struct_type.b] -// CHECK:STDOUT: %.loc10: %Cycle.elem = field_decl c, element0 [concrete] -// CHECK:STDOUT: %struct_type.c: type = struct_type {.c: %struct_type.b} [concrete = constants.%struct_type.c] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.c [concrete = constants.%complete_type] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Cycle -// CHECK:STDOUT: .Cycle = -// CHECK:STDOUT: .c = %.loc10 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- b.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Run.type: type = fn_type @Run [concrete] -// CHECK:STDOUT: %Run: %Run.type = struct_value () [concrete] -// CHECK:STDOUT: %Cycle: type = class_type @Cycle [concrete] -// CHECK:STDOUT: %ptr.257: type = ptr_type %Cycle [concrete] -// CHECK:STDOUT: %struct_type.b: type = struct_type {.b: %ptr.257} [concrete] -// CHECK:STDOUT: %struct_type.c: type = struct_type {.c: %struct_type.b} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.c [concrete] -// CHECK:STDOUT: %Cycle.elem: type = unbound_element_type %Cycle, %struct_type.b [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Main.Cycle = import_ref Main//a, Cycle, unloaded -// CHECK:STDOUT: %Main.a: ref %struct_type.b = import_ref Main//a, a, loaded -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Main.import_ref.b93: = import_ref Main//a, loc11_1, loaded [concrete = constants.%complete_type] -// CHECK:STDOUT: %Main.import_ref.3a6 = import_ref Main//a, inst18 [no loc], unloaded -// CHECK:STDOUT: %Main.import_ref.455: %Cycle.elem = import_ref Main//a, loc10_8, loaded [concrete = %.354] -// CHECK:STDOUT: %.354: %Cycle.elem = field_decl c, element0 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Cycle = imports.%Main.Cycle -// CHECK:STDOUT: .a = imports.%Main.a -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Run = %Run.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %default.import = import -// CHECK:STDOUT: %Run.decl: %Run.type = fn_decl @Run [concrete = constants.%Run] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Cycle [from "a.carbon"] { -// CHECK:STDOUT: complete_type_witness = imports.%Main.import_ref.b93 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Main.import_ref.3a6 -// CHECK:STDOUT: .c = imports.%Main.import_ref.455 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Run() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %a.ref.loc7_3: ref %struct_type.b = name_ref a, imports.%Main.a -// CHECK:STDOUT: %.loc7_4: ref %ptr.257 = struct_access %a.ref.loc7_3, element0 -// CHECK:STDOUT: %a.ref.loc7_11: ref %struct_type.b = name_ref a, imports.%Main.a -// CHECK:STDOUT: %.loc7_12.1: ref %ptr.257 = struct_access %a.ref.loc7_11, element0 -// CHECK:STDOUT: %.loc7_12.2: %ptr.257 = bind_value %.loc7_12.1 -// CHECK:STDOUT: %.loc7_10: ref %Cycle = deref %.loc7_12.2 -// CHECK:STDOUT: %c.ref: %Cycle.elem = name_ref c, imports.%Main.import_ref.455 [concrete = imports.%.354] -// CHECK:STDOUT: %.loc7_15: ref %struct_type.b = class_element_access %.loc7_10, element0 -// CHECK:STDOUT: %.loc7_17.1: ref %ptr.257 = struct_access %.loc7_15, element0 -// CHECK:STDOUT: %.loc7_17.2: %ptr.257 = bind_value %.loc7_17.1 -// CHECK:STDOUT: assign %.loc7_4, %.loc7_17.2 -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/inheritance_access.carbon b/toolchain/check/testdata/class/inheritance_access.carbon deleted file mode 100644 index 2ad57337ab327..0000000000000 --- a/toolchain/check/testdata/class/inheritance_access.carbon +++ /dev/null @@ -1,1364 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/inheritance_access.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/inheritance_access.carbon - - -// --- instance_protected_field_access.carbon - -library "[[@TEST_NAME]]"; - -base class Shape { - protected var x: i32; - protected var y: i32; -} - -class Circle { - extend base: Shape; - - fn GetPosition[self: Self]() -> (i32, i32) { - return (self.x, self.y); - } -} - -// --- shadowing_access.carbon - -library "[[@TEST_NAME]]"; - -base class A { - fn F(); -} - -base class B { - extend base: A; - private fn F() -> i32; -} - -base class C { - extend base: B; - fn G[self: Self]() -> () { return self.F(); } -} - -// --- inherited_member_access.carbon - -library "[[@TEST_NAME]]"; - -base class A { - protected let SOME_CONSTANT: i32 = 5; - protected fn SomeProtectedFunction() -> i32 { - return 5; - } -} - -class B { - extend base: A; - - fn G() -> i32 { - return A.SOME_CONSTANT; - } - - fn H() -> i32 { - return A.SomeProtectedFunction(); - } -} - -// --- fail_inherited_private_field_access.carbon - -library "[[@TEST_NAME]]"; - -base class Shape { - private var y: i32; -} - -class Square { - extend base: Shape; - - fn GetPosition[self: Self]() -> i32 { - // CHECK:STDERR: fail_inherited_private_field_access.carbon:[[@LINE+7]]:12: error: cannot access private member `y` of type `Shape` [ClassInvalidMemberAccess] - // CHECK:STDERR: return self.y; - // CHECK:STDERR: ^~~~~~ - // CHECK:STDERR: fail_inherited_private_field_access.carbon:[[@LINE-10]]:15: note: declared here [ClassMemberDeclaration] - // CHECK:STDERR: private var y: i32; - // CHECK:STDERR: ^~~~~~ - // CHECK:STDERR: - return self.y; - } -} - -// --- noninstance_private_on_self.carbon - -library "[[@TEST_NAME]]"; - -class C { - private fn F() {} - fn G() { Self.F(); } -} - -// --- noninstance_protected_on_self.carbon - -library "[[@TEST_NAME]]"; - -class C { - protected fn F() {} - fn G() { Self.F(); } -} - -// --- fail_noninstance_private_on_parent.carbon - -library "[[@TEST_NAME]]"; - -base class B { - private fn F() {} -} - -class C { - extend base: B; - // CHECK:STDERR: fail_noninstance_private_on_parent.carbon:[[@LINE+7]]:12: error: cannot access private member `F` of type `B` [ClassInvalidMemberAccess] - // CHECK:STDERR: fn G() { Self.F(); } - // CHECK:STDERR: ^~~~~~ - // CHECK:STDERR: fail_noninstance_private_on_parent.carbon:[[@LINE-8]]:3: note: declared here [ClassMemberDeclaration] - // CHECK:STDERR: private fn F() {} - // CHECK:STDERR: ^~~~~~~~~~~~~~~~ - // CHECK:STDERR: - fn G() { Self.F(); } -} - -// --- noninstance_protected_on_parent.carbon - -library "[[@TEST_NAME]]"; - -base class B { - protected fn F() {} -} - -class C { - extend base: B; - fn G() { Self.F(); } -} - -// --- fail_non_inherited_access.carbon - -library "[[@TEST_NAME]]"; - -base class A { - protected let SOME_PROTECTED_CONSTANT: i32 = 5; - private let SOME_PRIVATE_CONSTANT: i32 = 5; -} - -base class Internal { - protected let INTERNAL_CONSTANT: i32 = 5; -} - -class B { - private var internal: Internal; - - fn G() -> i32 { - // CHECK:STDERR: fail_non_inherited_access.carbon:[[@LINE+7]]:5: error: cannot access private member `SOME_PRIVATE_CONSTANT` of type `A` [ClassInvalidMemberAccess] - // CHECK:STDERR: A.SOME_PRIVATE_CONSTANT; - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_non_inherited_access.carbon:[[@LINE-14]]:15: note: declared here [ClassMemberDeclaration] - // CHECK:STDERR: private let SOME_PRIVATE_CONSTANT: i32 = 5; - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: - A.SOME_PRIVATE_CONSTANT; - - // CHECK:STDERR: fail_non_inherited_access.carbon:[[@LINE+7]]:12: error: cannot access protected member `SOME_PROTECTED_CONSTANT` of type `A` [ClassInvalidMemberAccess] - // CHECK:STDERR: return A.SOME_PROTECTED_CONSTANT; - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_non_inherited_access.carbon:[[@LINE-24]]:17: note: declared here [ClassMemberDeclaration] - // CHECK:STDERR: protected let SOME_PROTECTED_CONSTANT: i32 = 5; - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: - return A.SOME_PROTECTED_CONSTANT; - } - - fn SomeFunc[self: Self]() -> i32{ - // CHECK:STDERR: fail_non_inherited_access.carbon:[[@LINE+7]]:12: error: cannot access protected member `INTERNAL_CONSTANT` of type `Internal` [ClassInvalidMemberAccess] - // CHECK:STDERR: return self.internal.INTERNAL_CONSTANT; - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_non_inherited_access.carbon:[[@LINE-30]]:17: note: declared here [ClassMemberDeclaration] - // CHECK:STDERR: protected let INTERNAL_CONSTANT: i32 = 5; - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~ - // CHECK:STDERR: - return self.internal.INTERNAL_CONSTANT; - } -} - -// --- fail_compound_member_access.carbon - -library "[[@TEST_NAME]]"; - -base class A { - private var x: i32; -} - -class B { - extend base: A; - fn F[self: Self]() { - // CHECK:STDERR: fail_compound_member_access.carbon:[[@LINE+7]]:11: error: cannot access private member `x` of type `A` [ClassInvalidMemberAccess] - // CHECK:STDERR: self.(A.x); - // CHECK:STDERR: ^~~ - // CHECK:STDERR: fail_compound_member_access.carbon:[[@LINE-9]]:15: note: declared here [ClassMemberDeclaration] - // CHECK:STDERR: private var x: i32; - // CHECK:STDERR: ^~~~~~ - // CHECK:STDERR: - self.(A.x); - } -} - -// --- inherited_compound_member_access.carbon - -library "[[@TEST_NAME]]"; - -base class A { - protected var x: i32; -} - -class B { - extend base: A; - - fn F[self: Self]() { - self.(A.x); - } -} - -// CHECK:STDOUT: --- instance_protected_field_access.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Shape: type = class_type @Shape [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %Shape.elem: type = unbound_element_type %Shape, %i32 [concrete] -// CHECK:STDOUT: %struct_type.x.y: type = struct_type {.x: %i32, .y: %i32} [concrete] -// CHECK:STDOUT: %complete_type.70a: = complete_type_witness %struct_type.x.y [concrete] -// CHECK:STDOUT: %Circle: type = class_type @Circle [concrete] -// CHECK:STDOUT: %Circle.elem: type = unbound_element_type %Circle, %Shape [concrete] -// CHECK:STDOUT: %pattern_type.ce2: type = pattern_type %Circle [concrete] -// CHECK:STDOUT: %tuple.type.24b: type = tuple_type (type, type) [concrete] -// CHECK:STDOUT: %tuple.type.d07: type = tuple_type (%i32, %i32) [concrete] -// CHECK:STDOUT: %pattern_type.511: type = pattern_type %tuple.type.d07 [concrete] -// CHECK:STDOUT: %GetPosition.type: type = fn_type @GetPosition [concrete] -// CHECK:STDOUT: %GetPosition: %GetPosition.type = struct_value () [concrete] -// CHECK:STDOUT: %struct_type.base.0ed: type = struct_type {.base: %Shape} [concrete] -// CHECK:STDOUT: %complete_type.a2b: = complete_type_witness %struct_type.base.0ed [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Shape = %Shape.decl -// CHECK:STDOUT: .Circle = %Circle.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Shape.decl: type = class_decl @Shape [concrete = constants.%Shape] {} {} -// CHECK:STDOUT: %Circle.decl: type = class_decl @Circle [concrete = constants.%Circle] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Shape { -// CHECK:STDOUT: %int_32.loc5: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc5: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc5: %Shape.elem = field_decl x, element0 [concrete] -// CHECK:STDOUT: %int_32.loc6: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc6: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc6: %Shape.elem = field_decl y, element1 [concrete] -// CHECK:STDOUT: %struct_type.x.y: type = struct_type {.x: %i32, .y: %i32} [concrete = constants.%struct_type.x.y] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.x.y [concrete = constants.%complete_type.70a] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Shape -// CHECK:STDOUT: .x [protected] = %.loc5 -// CHECK:STDOUT: .y [protected] = %.loc6 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Circle { -// CHECK:STDOUT: %Shape.ref: type = name_ref Shape, file.%Shape.decl [concrete = constants.%Shape] -// CHECK:STDOUT: %.loc10: %Circle.elem = base_decl %Shape.ref, element0 [concrete] -// CHECK:STDOUT: %GetPosition.decl: %GetPosition.type = fn_decl @GetPosition [concrete = constants.%GetPosition] { -// CHECK:STDOUT: %self.patt: %pattern_type.ce2 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.ce2 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.511 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.511 = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32.loc12_36: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc12_36: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %int_32.loc12_41: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc12_41: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc12_44.1: %tuple.type.24b = tuple_literal (%i32.loc12_36, %i32.loc12_41) -// CHECK:STDOUT: %.loc12_44.2: type = converted %.loc12_44.1, constants.%tuple.type.d07 [concrete = constants.%tuple.type.d07] -// CHECK:STDOUT: %self.param: %Circle = value_param call_param0 -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Circle [concrete = constants.%Circle] -// CHECK:STDOUT: %self: %Circle = bind_name self, %self.param -// CHECK:STDOUT: %return.param: ref %tuple.type.d07 = out_param call_param1 -// CHECK:STDOUT: %return: ref %tuple.type.d07 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %Shape} [concrete = constants.%struct_type.base.0ed] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base [concrete = constants.%complete_type.a2b] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Circle -// CHECK:STDOUT: .Shape = -// CHECK:STDOUT: .base = %.loc10 -// CHECK:STDOUT: .GetPosition = %GetPosition.decl -// CHECK:STDOUT: .x = -// CHECK:STDOUT: .y = -// CHECK:STDOUT: extend %Shape.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @GetPosition(%self.param: %Circle) -> %return.param: %tuple.type.d07 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %self.ref.loc13_13: %Circle = name_ref self, %self -// CHECK:STDOUT: %x.ref: %Shape.elem = name_ref x, @Shape.%.loc5 [concrete = @Shape.%.loc5] -// CHECK:STDOUT: %.loc13_17.1: ref %Shape = class_element_access %self.ref.loc13_13, element0 -// CHECK:STDOUT: %.loc13_17.2: ref %Shape = converted %self.ref.loc13_13, %.loc13_17.1 -// CHECK:STDOUT: %.loc13_17.3: ref %i32 = class_element_access %.loc13_17.2, element0 -// CHECK:STDOUT: %self.ref.loc13_21: %Circle = name_ref self, %self -// CHECK:STDOUT: %y.ref: %Shape.elem = name_ref y, @Shape.%.loc6 [concrete = @Shape.%.loc6] -// CHECK:STDOUT: %.loc13_25.1: ref %Shape = class_element_access %self.ref.loc13_21, element0 -// CHECK:STDOUT: %.loc13_25.2: ref %Shape = converted %self.ref.loc13_21, %.loc13_25.1 -// CHECK:STDOUT: %.loc13_25.3: ref %i32 = class_element_access %.loc13_25.2, element1 -// CHECK:STDOUT: %.loc13_27.1: %tuple.type.d07 = tuple_literal (%.loc13_17.3, %.loc13_25.3) -// CHECK:STDOUT: %.loc13_17.4: %i32 = bind_value %.loc13_17.3 -// CHECK:STDOUT: %tuple.elem0: ref %i32 = tuple_access %return, element0 -// CHECK:STDOUT: %.loc13_27.2: init %i32 = initialize_from %.loc13_17.4 to %tuple.elem0 -// CHECK:STDOUT: %.loc13_25.4: %i32 = bind_value %.loc13_25.3 -// CHECK:STDOUT: %tuple.elem1: ref %i32 = tuple_access %return, element1 -// CHECK:STDOUT: %.loc13_27.3: init %i32 = initialize_from %.loc13_25.4 to %tuple.elem1 -// CHECK:STDOUT: %.loc13_27.4: init %tuple.type.d07 = tuple_init (%.loc13_27.2, %.loc13_27.3) to %return -// CHECK:STDOUT: %.loc13_28: init %tuple.type.d07 = converted %.loc13_27.1, %.loc13_27.4 -// CHECK:STDOUT: return %.loc13_28 to %return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- shadowing_access.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %A: type = class_type @A [concrete] -// CHECK:STDOUT: %F.type.649: type = fn_type @F.1 [concrete] -// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] -// CHECK:STDOUT: %F.485: %F.type.649 = struct_value () [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %B: type = class_type @B [concrete] -// CHECK:STDOUT: %B.elem: type = unbound_element_type %B, %A [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %F.type.8c6: type = fn_type @F.2 [concrete] -// CHECK:STDOUT: %F.92a: %F.type.8c6 = struct_value () [concrete] -// CHECK:STDOUT: %struct_type.base.953: type = struct_type {.base: %A} [concrete] -// CHECK:STDOUT: %complete_type.020: = complete_type_witness %struct_type.base.953 [concrete] -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %C.elem: type = unbound_element_type %C, %B [concrete] -// CHECK:STDOUT: %pattern_type.c48: type = pattern_type %C [concrete] -// CHECK:STDOUT: %pattern_type.cb1: type = pattern_type %empty_tuple.type [concrete] -// CHECK:STDOUT: %G.type: type = fn_type @G [concrete] -// CHECK:STDOUT: %G: %G.type = struct_value () [concrete] -// CHECK:STDOUT: %struct_type.base.0ff: type = struct_type {.base: %B} [concrete] -// CHECK:STDOUT: %complete_type.98e: = complete_type_witness %struct_type.base.0ff [concrete] -// CHECK:STDOUT: %empty_tuple: %empty_tuple.type = tuple_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .A = %A.decl -// CHECK:STDOUT: .B = %B.decl -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %A.decl: type = class_decl @A [concrete = constants.%A] {} {} -// CHECK:STDOUT: %B.decl: type = class_decl @B [concrete = constants.%B] {} {} -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @A { -// CHECK:STDOUT: %F.decl: %F.type.649 = fn_decl @F.1 [concrete = constants.%F.485] {} {} -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%A -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @B { -// CHECK:STDOUT: %A.ref: type = name_ref A, file.%A.decl [concrete = constants.%A] -// CHECK:STDOUT: %.loc9: %B.elem = base_decl %A.ref, element0 [concrete] -// CHECK:STDOUT: %F.decl: %F.type.8c6 = fn_decl @F.2 [concrete = constants.%F.92a] { -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param0 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %A} [concrete = constants.%struct_type.base.953] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base [concrete = constants.%complete_type.020] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%B -// CHECK:STDOUT: .A = -// CHECK:STDOUT: .base = %.loc9 -// CHECK:STDOUT: .F [private] = %F.decl -// CHECK:STDOUT: extend %A.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C { -// CHECK:STDOUT: %B.ref: type = name_ref B, file.%B.decl [concrete = constants.%B] -// CHECK:STDOUT: %.loc14: %C.elem = base_decl %B.ref, element0 [concrete] -// CHECK:STDOUT: %G.decl: %G.type = fn_decl @G [concrete = constants.%G] { -// CHECK:STDOUT: %self.patt: %pattern_type.c48 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.c48 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.cb1 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.cb1 = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %.loc15_26.1: %empty_tuple.type = tuple_literal () -// CHECK:STDOUT: %.loc15_26.2: type = converted %.loc15_26.1, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] -// CHECK:STDOUT: %self.param: %C = value_param call_param0 -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%C [concrete = constants.%C] -// CHECK:STDOUT: %self: %C = bind_name self, %self.param -// CHECK:STDOUT: %return.param: ref %empty_tuple.type = out_param call_param1 -// CHECK:STDOUT: %return: ref %empty_tuple.type = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %B} [concrete = constants.%struct_type.base.0ff] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base [concrete = constants.%complete_type.98e] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%C -// CHECK:STDOUT: .B = -// CHECK:STDOUT: .base = %.loc14 -// CHECK:STDOUT: .G = %G.decl -// CHECK:STDOUT: .F = -// CHECK:STDOUT: extend %B.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F.1(); -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F.2() -> %i32; -// CHECK:STDOUT: -// CHECK:STDOUT: fn @G(%self.param: %C) -> %empty_tuple.type { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %self.ref: %C = name_ref self, %self -// CHECK:STDOUT: %F.ref: %F.type.649 = name_ref F, @A.%F.decl [concrete = constants.%F.485] -// CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.ref() -// CHECK:STDOUT: %.loc15_44.1: ref %empty_tuple.type = temporary_storage -// CHECK:STDOUT: %.loc15_44.2: ref %empty_tuple.type = temporary %.loc15_44.1, %F.call -// CHECK:STDOUT: %tuple: %empty_tuple.type = tuple_value () [concrete = constants.%empty_tuple] -// CHECK:STDOUT: %.loc15_45: %empty_tuple.type = converted %F.call, %tuple [concrete = constants.%empty_tuple] -// CHECK:STDOUT: return %.loc15_45 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- inherited_member_access.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %A: type = class_type @A [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %int_5.64b: Core.IntLiteral = int_value 5 [concrete] -// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.type.205: type = facet_type <@ImplicitAs, @ImplicitAs(%i32)> [concrete] -// CHECK:STDOUT: %Convert.type.1b6: type = fn_type @Convert.1, @ImplicitAs(%i32) [concrete] -// CHECK:STDOUT: %To.c80: Core.IntLiteral = bind_symbolic_name To, 0 [symbolic] -// CHECK:STDOUT: %Convert.type.0f9: type = fn_type @Convert.2, @impl.4f9(%To.c80) [symbolic] -// CHECK:STDOUT: %Convert.f06: %Convert.type.0f9 = struct_value () [symbolic] -// CHECK:STDOUT: %ImplicitAs.impl_witness.c75: = impl_witness imports.%ImplicitAs.impl_witness_table.a2f, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.type.035: type = fn_type @Convert.2, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.956: %Convert.type.035 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.facet: %ImplicitAs.type.205 = facet_value Core.IntLiteral, (%ImplicitAs.impl_witness.c75) [concrete] -// CHECK:STDOUT: %.9c3: type = fn_type_with_self_type %Convert.type.1b6, %ImplicitAs.facet [concrete] -// CHECK:STDOUT: %Convert.bound: = bound_method %int_5.64b, %Convert.956 [concrete] -// CHECK:STDOUT: %Convert.specific_fn: = specific_function %Convert.956, @Convert.2(%int_32) [concrete] -// CHECK:STDOUT: %bound_method: = bound_method %int_5.64b, %Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_5.0f6: %i32 = int_value 5 [concrete] -// CHECK:STDOUT: %SomeProtectedFunction.type: type = fn_type @SomeProtectedFunction [concrete] -// CHECK:STDOUT: %SomeProtectedFunction: %SomeProtectedFunction.type = struct_value () [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %B: type = class_type @B [concrete] -// CHECK:STDOUT: %B.elem: type = unbound_element_type %B, %A [concrete] -// CHECK:STDOUT: %G.type: type = fn_type @G [concrete] -// CHECK:STDOUT: %G: %G.type = struct_value () [concrete] -// CHECK:STDOUT: %H.type: type = fn_type @H [concrete] -// CHECK:STDOUT: %H: %H.type = struct_value () [concrete] -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %A} [concrete] -// CHECK:STDOUT: %complete_type.020: = complete_type_witness %struct_type.base [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/operators/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] -// CHECK:STDOUT: %Core.import_ref.a5b: @impl.4f9.%Convert.type (%Convert.type.0f9) = import_ref Core//prelude/types/int, loc19_39, loaded [symbolic = @impl.4f9.%Convert (constants.%Convert.f06)] -// CHECK:STDOUT: %ImplicitAs.impl_witness_table.a2f = impl_witness_table (%Core.import_ref.a5b), @impl.4f9 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .A = %A.decl -// CHECK:STDOUT: .B = %B.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %A.decl: type = class_decl @A [concrete = constants.%A] {} {} -// CHECK:STDOUT: %B.decl: type = class_decl @B [concrete = constants.%B] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @A { -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %SOME_CONSTANT.patt: %pattern_type.7ce = binding_pattern SOME_CONSTANT [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %int_5: Core.IntLiteral = int_value 5 [concrete = constants.%int_5.64b] -// CHECK:STDOUT: %.loc5_32: type = splice_block %i32 [concrete = constants.%i32] { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: } -// CHECK:STDOUT: %impl.elem0: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc5_38.1: = bound_method %int_5, %impl.elem0 [concrete = constants.%Convert.bound] -// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc5_38.2: = bound_method %int_5, %specific_fn [concrete = constants.%bound_method] -// CHECK:STDOUT: %int.convert_checked: init %i32 = call %bound_method.loc5_38.2(%int_5) [concrete = constants.%int_5.0f6] -// CHECK:STDOUT: %.loc5_38.1: %i32 = value_of_initializer %int.convert_checked [concrete = constants.%int_5.0f6] -// CHECK:STDOUT: %.loc5_38.2: %i32 = converted %int_5, %.loc5_38.1 [concrete = constants.%int_5.0f6] -// CHECK:STDOUT: %SOME_CONSTANT: %i32 = bind_name SOME_CONSTANT, %.loc5_38.2 -// CHECK:STDOUT: %SomeProtectedFunction.decl: %SomeProtectedFunction.type = fn_decl @SomeProtectedFunction [concrete = constants.%SomeProtectedFunction] { -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param0 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%A -// CHECK:STDOUT: .SOME_CONSTANT [protected] = %SOME_CONSTANT -// CHECK:STDOUT: .SomeProtectedFunction [protected] = %SomeProtectedFunction.decl -// CHECK:STDOUT: .A = -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @B { -// CHECK:STDOUT: %A.ref: type = name_ref A, file.%A.decl [concrete = constants.%A] -// CHECK:STDOUT: %.loc12: %B.elem = base_decl %A.ref, element0 [concrete] -// CHECK:STDOUT: %G.decl: %G.type = fn_decl @G [concrete = constants.%G] { -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param0 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %H.decl: %H.type = fn_decl @H [concrete = constants.%H] { -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param0 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %A} [concrete = constants.%struct_type.base] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base [concrete = constants.%complete_type.020] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%B -// CHECK:STDOUT: .A = -// CHECK:STDOUT: .base = %.loc12 -// CHECK:STDOUT: .G = %G.decl -// CHECK:STDOUT: .H = %H.decl -// CHECK:STDOUT: extend %A.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @SomeProtectedFunction() -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %int_5: Core.IntLiteral = int_value 5 [concrete = constants.%int_5.64b] -// CHECK:STDOUT: %impl.elem0: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc7_13.1: = bound_method %int_5, %impl.elem0 [concrete = constants.%Convert.bound] -// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc7_13.2: = bound_method %int_5, %specific_fn [concrete = constants.%bound_method] -// CHECK:STDOUT: %int.convert_checked: init %i32 = call %bound_method.loc7_13.2(%int_5) [concrete = constants.%int_5.0f6] -// CHECK:STDOUT: %.loc7_13.1: %i32 = value_of_initializer %int.convert_checked [concrete = constants.%int_5.0f6] -// CHECK:STDOUT: %.loc7_13.2: %i32 = converted %int_5, %.loc7_13.1 [concrete = constants.%int_5.0f6] -// CHECK:STDOUT: return %.loc7_13.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @G() -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %A.ref: type = name_ref A, file.%A.decl [concrete = constants.%A] -// CHECK:STDOUT: %SOME_CONSTANT.ref: %i32 = name_ref SOME_CONSTANT, @A.%SOME_CONSTANT -// CHECK:STDOUT: return %SOME_CONSTANT.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @H() -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %A.ref: type = name_ref A, file.%A.decl [concrete = constants.%A] -// CHECK:STDOUT: %SomeProtectedFunction.ref: %SomeProtectedFunction.type = name_ref SomeProtectedFunction, @A.%SomeProtectedFunction.decl [concrete = constants.%SomeProtectedFunction] -// CHECK:STDOUT: %SomeProtectedFunction.call: init %i32 = call %SomeProtectedFunction.ref() -// CHECK:STDOUT: %.loc19_37.1: %i32 = value_of_initializer %SomeProtectedFunction.call -// CHECK:STDOUT: %.loc19_37.2: %i32 = converted %SomeProtectedFunction.call, %.loc19_37.1 -// CHECK:STDOUT: return %.loc19_37.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_inherited_private_field_access.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Shape: type = class_type @Shape [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %Shape.elem: type = unbound_element_type %Shape, %i32 [concrete] -// CHECK:STDOUT: %struct_type.y: type = struct_type {.y: %i32} [concrete] -// CHECK:STDOUT: %complete_type.0f9: = complete_type_witness %struct_type.y [concrete] -// CHECK:STDOUT: %Square: type = class_type @Square [concrete] -// CHECK:STDOUT: %Square.elem: type = unbound_element_type %Square, %Shape [concrete] -// CHECK:STDOUT: %pattern_type.39b: type = pattern_type %Square [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %GetPosition.type: type = fn_type @GetPosition [concrete] -// CHECK:STDOUT: %GetPosition: %GetPosition.type = struct_value () [concrete] -// CHECK:STDOUT: %struct_type.base.0ed: type = struct_type {.base: %Shape} [concrete] -// CHECK:STDOUT: %complete_type.a2b: = complete_type_witness %struct_type.base.0ed [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Shape = %Shape.decl -// CHECK:STDOUT: .Square = %Square.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Shape.decl: type = class_decl @Shape [concrete = constants.%Shape] {} {} -// CHECK:STDOUT: %Square.decl: type = class_decl @Square [concrete = constants.%Square] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Shape { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc5: %Shape.elem = field_decl y, element0 [concrete] -// CHECK:STDOUT: %struct_type.y: type = struct_type {.y: %i32} [concrete = constants.%struct_type.y] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.y [concrete = constants.%complete_type.0f9] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Shape -// CHECK:STDOUT: .y [private] = %.loc5 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Square { -// CHECK:STDOUT: %Shape.ref: type = name_ref Shape, file.%Shape.decl [concrete = constants.%Shape] -// CHECK:STDOUT: %.loc9: %Square.elem = base_decl %Shape.ref, element0 [concrete] -// CHECK:STDOUT: %GetPosition.decl: %GetPosition.type = fn_decl @GetPosition [concrete = constants.%GetPosition] { -// CHECK:STDOUT: %self.patt: %pattern_type.39b = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.39b = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %self.param: %Square = value_param call_param0 -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Square [concrete = constants.%Square] -// CHECK:STDOUT: %self: %Square = bind_name self, %self.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %Shape} [concrete = constants.%struct_type.base.0ed] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base [concrete = constants.%complete_type.a2b] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Square -// CHECK:STDOUT: .Shape = -// CHECK:STDOUT: .base = %.loc9 -// CHECK:STDOUT: .GetPosition = %GetPosition.decl -// CHECK:STDOUT: .y = -// CHECK:STDOUT: extend %Shape.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @GetPosition(%self.param: %Square) -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %self.ref: %Square = name_ref self, %self -// CHECK:STDOUT: %y.ref: = name_ref y, [concrete = ] -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- noninstance_private_on_self.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %G.type: type = fn_type @G [concrete] -// CHECK:STDOUT: %G: %G.type = struct_value () [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C { -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] {} {} -// CHECK:STDOUT: %G.decl: %G.type = fn_decl @G [concrete = constants.%G] {} {} -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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: .F [private] = %F.decl -// CHECK:STDOUT: .G = %G.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @G() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%C [concrete = constants.%C] -// CHECK:STDOUT: %F.ref: %F.type = name_ref F, @C.%F.decl [concrete = constants.%F] -// CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.ref() -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- noninstance_protected_on_self.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %G.type: type = fn_type @G [concrete] -// CHECK:STDOUT: %G: %G.type = struct_value () [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C { -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] {} {} -// CHECK:STDOUT: %G.decl: %G.type = fn_decl @G [concrete = constants.%G] {} {} -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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: .F [protected] = %F.decl -// CHECK:STDOUT: .G = %G.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @G() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%C [concrete = constants.%C] -// CHECK:STDOUT: %F.ref: %F.type = name_ref F, @C.%F.decl [concrete = constants.%F] -// CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.ref() -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_noninstance_private_on_parent.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %B: type = class_type @B [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %C.elem: type = unbound_element_type %C, %B [concrete] -// CHECK:STDOUT: %G.type: type = fn_type @G [concrete] -// CHECK:STDOUT: %G: %G.type = struct_value () [concrete] -// CHECK:STDOUT: %struct_type.base.0ff: type = struct_type {.base: %B} [concrete] -// CHECK:STDOUT: %complete_type.98e: = complete_type_witness %struct_type.base.0ff [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .B = %B.decl -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %B.decl: type = class_decl @B [concrete = constants.%B] {} {} -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @B { -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] {} {} -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%B -// CHECK:STDOUT: .F [private] = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C { -// CHECK:STDOUT: %B.ref: type = name_ref B, file.%B.decl [concrete = constants.%B] -// CHECK:STDOUT: %.loc9: %C.elem = base_decl %B.ref, element0 [concrete] -// CHECK:STDOUT: %G.decl: %G.type = fn_decl @G [concrete = constants.%G] {} {} -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %B} [concrete = constants.%struct_type.base.0ff] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base [concrete = constants.%complete_type.98e] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%C -// CHECK:STDOUT: .B = -// CHECK:STDOUT: .base = %.loc9 -// CHECK:STDOUT: .G = %G.decl -// CHECK:STDOUT: .F = -// CHECK:STDOUT: extend %B.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @G() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%C [concrete = constants.%C] -// CHECK:STDOUT: %F.ref: = name_ref F, [concrete = ] -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- noninstance_protected_on_parent.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %B: type = class_type @B [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %C.elem: type = unbound_element_type %C, %B [concrete] -// CHECK:STDOUT: %G.type: type = fn_type @G [concrete] -// CHECK:STDOUT: %G: %G.type = struct_value () [concrete] -// CHECK:STDOUT: %struct_type.base.0ff: type = struct_type {.base: %B} [concrete] -// CHECK:STDOUT: %complete_type.98e: = complete_type_witness %struct_type.base.0ff [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .B = %B.decl -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %B.decl: type = class_decl @B [concrete = constants.%B] {} {} -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @B { -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] {} {} -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%B -// CHECK:STDOUT: .F [protected] = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C { -// CHECK:STDOUT: %B.ref: type = name_ref B, file.%B.decl [concrete = constants.%B] -// CHECK:STDOUT: %.loc9: %C.elem = base_decl %B.ref, element0 [concrete] -// CHECK:STDOUT: %G.decl: %G.type = fn_decl @G [concrete = constants.%G] {} {} -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %B} [concrete = constants.%struct_type.base.0ff] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base [concrete = constants.%complete_type.98e] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%C -// CHECK:STDOUT: .B = -// CHECK:STDOUT: .base = %.loc9 -// CHECK:STDOUT: .G = %G.decl -// CHECK:STDOUT: .F = -// CHECK:STDOUT: extend %B.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @G() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%C [concrete = constants.%C] -// CHECK:STDOUT: %F.ref: %F.type = name_ref F, @B.%F.decl [concrete = constants.%F] -// CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.ref() -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_non_inherited_access.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %A: type = class_type @A [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %int_5.64b: Core.IntLiteral = int_value 5 [concrete] -// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.type.205: type = facet_type <@ImplicitAs, @ImplicitAs(%i32)> [concrete] -// CHECK:STDOUT: %Convert.type.1b6: type = fn_type @Convert.1, @ImplicitAs(%i32) [concrete] -// CHECK:STDOUT: %To.c80: Core.IntLiteral = bind_symbolic_name To, 0 [symbolic] -// CHECK:STDOUT: %Convert.type.0f9: type = fn_type @Convert.2, @impl.4f9(%To.c80) [symbolic] -// CHECK:STDOUT: %Convert.f06: %Convert.type.0f9 = struct_value () [symbolic] -// CHECK:STDOUT: %ImplicitAs.impl_witness.c75: = impl_witness imports.%ImplicitAs.impl_witness_table.a2f, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.type.035: type = fn_type @Convert.2, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.956: %Convert.type.035 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.facet: %ImplicitAs.type.205 = facet_value Core.IntLiteral, (%ImplicitAs.impl_witness.c75) [concrete] -// CHECK:STDOUT: %.9c3: type = fn_type_with_self_type %Convert.type.1b6, %ImplicitAs.facet [concrete] -// CHECK:STDOUT: %Convert.bound: = bound_method %int_5.64b, %Convert.956 [concrete] -// CHECK:STDOUT: %Convert.specific_fn: = specific_function %Convert.956, @Convert.2(%int_32) [concrete] -// CHECK:STDOUT: %bound_method: = bound_method %int_5.64b, %Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_5.0f6: %i32 = int_value 5 [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %Internal: type = class_type @Internal [concrete] -// CHECK:STDOUT: %B: type = class_type @B [concrete] -// CHECK:STDOUT: %B.elem: type = unbound_element_type %B, %Internal [concrete] -// CHECK:STDOUT: %G.type: type = fn_type @G [concrete] -// CHECK:STDOUT: %G: %G.type = struct_value () [concrete] -// CHECK:STDOUT: %pattern_type.049: type = pattern_type %B [concrete] -// CHECK:STDOUT: %SomeFunc.type: type = fn_type @SomeFunc [concrete] -// CHECK:STDOUT: %SomeFunc: %SomeFunc.type = struct_value () [concrete] -// CHECK:STDOUT: %struct_type.internal.6f5: type = struct_type {.internal: %Internal} [concrete] -// CHECK:STDOUT: %complete_type.d77: = complete_type_witness %struct_type.internal.6f5 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/operators/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] -// CHECK:STDOUT: %Core.import_ref.a5b: @impl.4f9.%Convert.type (%Convert.type.0f9) = import_ref Core//prelude/types/int, loc19_39, loaded [symbolic = @impl.4f9.%Convert (constants.%Convert.f06)] -// CHECK:STDOUT: %ImplicitAs.impl_witness_table.a2f = impl_witness_table (%Core.import_ref.a5b), @impl.4f9 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .A = %A.decl -// CHECK:STDOUT: .Internal = %Internal.decl -// CHECK:STDOUT: .B = %B.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %A.decl: type = class_decl @A [concrete = constants.%A] {} {} -// CHECK:STDOUT: %Internal.decl: type = class_decl @Internal [concrete = constants.%Internal] {} {} -// CHECK:STDOUT: %B.decl: type = class_decl @B [concrete = constants.%B] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @A { -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %SOME_PROTECTED_CONSTANT.patt: %pattern_type.7ce = binding_pattern SOME_PROTECTED_CONSTANT [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %int_5.loc5: Core.IntLiteral = int_value 5 [concrete = constants.%int_5.64b] -// CHECK:STDOUT: %.loc5_42: type = splice_block %i32.loc5 [concrete = constants.%i32] { -// CHECK:STDOUT: %int_32.loc5: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc5: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: } -// CHECK:STDOUT: %impl.elem0.loc5: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc5_48.1: = bound_method %int_5.loc5, %impl.elem0.loc5 [concrete = constants.%Convert.bound] -// CHECK:STDOUT: %specific_fn.loc5: = specific_function %impl.elem0.loc5, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc5_48.2: = bound_method %int_5.loc5, %specific_fn.loc5 [concrete = constants.%bound_method] -// CHECK:STDOUT: %int.convert_checked.loc5: init %i32 = call %bound_method.loc5_48.2(%int_5.loc5) [concrete = constants.%int_5.0f6] -// CHECK:STDOUT: %.loc5_48.1: %i32 = value_of_initializer %int.convert_checked.loc5 [concrete = constants.%int_5.0f6] -// CHECK:STDOUT: %.loc5_48.2: %i32 = converted %int_5.loc5, %.loc5_48.1 [concrete = constants.%int_5.0f6] -// CHECK:STDOUT: %SOME_PROTECTED_CONSTANT: %i32 = bind_name SOME_PROTECTED_CONSTANT, %.loc5_48.2 -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %SOME_PRIVATE_CONSTANT.patt: %pattern_type.7ce = binding_pattern SOME_PRIVATE_CONSTANT [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %int_5.loc6: Core.IntLiteral = int_value 5 [concrete = constants.%int_5.64b] -// CHECK:STDOUT: %.loc6_38: type = splice_block %i32.loc6 [concrete = constants.%i32] { -// CHECK:STDOUT: %int_32.loc6: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc6: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: } -// CHECK:STDOUT: %impl.elem0.loc6: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc6_44.1: = bound_method %int_5.loc6, %impl.elem0.loc6 [concrete = constants.%Convert.bound] -// CHECK:STDOUT: %specific_fn.loc6: = specific_function %impl.elem0.loc6, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc6_44.2: = bound_method %int_5.loc6, %specific_fn.loc6 [concrete = constants.%bound_method] -// CHECK:STDOUT: %int.convert_checked.loc6: init %i32 = call %bound_method.loc6_44.2(%int_5.loc6) [concrete = constants.%int_5.0f6] -// CHECK:STDOUT: %.loc6_44.1: %i32 = value_of_initializer %int.convert_checked.loc6 [concrete = constants.%int_5.0f6] -// CHECK:STDOUT: %.loc6_44.2: %i32 = converted %int_5.loc6, %.loc6_44.1 [concrete = constants.%int_5.0f6] -// CHECK:STDOUT: %SOME_PRIVATE_CONSTANT: %i32 = bind_name SOME_PRIVATE_CONSTANT, %.loc6_44.2 -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%A -// CHECK:STDOUT: .SOME_PROTECTED_CONSTANT [protected] = %SOME_PROTECTED_CONSTANT -// CHECK:STDOUT: .SOME_PRIVATE_CONSTANT [private] = %SOME_PRIVATE_CONSTANT -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Internal { -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %INTERNAL_CONSTANT.patt: %pattern_type.7ce = binding_pattern INTERNAL_CONSTANT [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %int_5: Core.IntLiteral = int_value 5 [concrete = constants.%int_5.64b] -// CHECK:STDOUT: %.loc10_36: type = splice_block %i32 [concrete = constants.%i32] { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: } -// CHECK:STDOUT: %impl.elem0: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc10_42.1: = bound_method %int_5, %impl.elem0 [concrete = constants.%Convert.bound] -// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc10_42.2: = bound_method %int_5, %specific_fn [concrete = constants.%bound_method] -// CHECK:STDOUT: %int.convert_checked: init %i32 = call %bound_method.loc10_42.2(%int_5) [concrete = constants.%int_5.0f6] -// CHECK:STDOUT: %.loc10_42.1: %i32 = value_of_initializer %int.convert_checked [concrete = constants.%int_5.0f6] -// CHECK:STDOUT: %.loc10_42.2: %i32 = converted %int_5, %.loc10_42.1 [concrete = constants.%int_5.0f6] -// CHECK:STDOUT: %INTERNAL_CONSTANT: %i32 = bind_name INTERNAL_CONSTANT, %.loc10_42.2 -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Internal -// CHECK:STDOUT: .INTERNAL_CONSTANT [protected] = %INTERNAL_CONSTANT -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @B { -// CHECK:STDOUT: %Internal.ref: type = name_ref Internal, file.%Internal.decl [concrete = constants.%Internal] -// CHECK:STDOUT: %.loc14: %B.elem = field_decl internal, element0 [concrete] -// CHECK:STDOUT: %G.decl: %G.type = fn_decl @G [concrete = constants.%G] { -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param0 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %SomeFunc.decl: %SomeFunc.type = fn_decl @SomeFunc [concrete = constants.%SomeFunc] { -// CHECK:STDOUT: %self.patt: %pattern_type.049 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.049 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %self.param: %B = value_param call_param0 -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%B [concrete = constants.%B] -// CHECK:STDOUT: %self: %B = bind_name self, %self.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %struct_type.internal: type = struct_type {.internal: %Internal} [concrete = constants.%struct_type.internal.6f5] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.internal [concrete = constants.%complete_type.d77] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%B -// CHECK:STDOUT: .Internal = -// CHECK:STDOUT: .internal [private] = %.loc14 -// CHECK:STDOUT: .G = %G.decl -// CHECK:STDOUT: .SomeFunc = %SomeFunc.decl -// CHECK:STDOUT: .A = -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @G() -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %A.ref.loc24: type = name_ref A, file.%A.decl [concrete = constants.%A] -// CHECK:STDOUT: %SOME_PRIVATE_CONSTANT.ref: = name_ref SOME_PRIVATE_CONSTANT, [concrete = ] -// CHECK:STDOUT: %A.ref.loc33: type = name_ref A, file.%A.decl [concrete = constants.%A] -// CHECK:STDOUT: %SOME_PROTECTED_CONSTANT.ref: = name_ref SOME_PROTECTED_CONSTANT, [concrete = ] -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @SomeFunc(%self.param: %B) -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %self.ref: %B = name_ref self, %self -// CHECK:STDOUT: %internal.ref: %B.elem = name_ref internal, @B.%.loc14 [concrete = @B.%.loc14] -// CHECK:STDOUT: %.loc44_16.1: ref %Internal = class_element_access %self.ref, element0 -// CHECK:STDOUT: %.loc44_16.2: %Internal = bind_value %.loc44_16.1 -// CHECK:STDOUT: %INTERNAL_CONSTANT.ref: = name_ref INTERNAL_CONSTANT, [concrete = ] -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_compound_member_access.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %A: type = class_type @A [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %A.elem: type = unbound_element_type %A, %i32 [concrete] -// CHECK:STDOUT: %struct_type.x: type = struct_type {.x: %i32} [concrete] -// CHECK:STDOUT: %complete_type.1ec: = complete_type_witness %struct_type.x [concrete] -// CHECK:STDOUT: %B: type = class_type @B [concrete] -// CHECK:STDOUT: %B.elem: type = unbound_element_type %B, %A [concrete] -// CHECK:STDOUT: %pattern_type.049: type = pattern_type %B [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %struct_type.base.953: type = struct_type {.base: %A} [concrete] -// CHECK:STDOUT: %complete_type.020: = complete_type_witness %struct_type.base.953 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .A = %A.decl -// CHECK:STDOUT: .B = %B.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %A.decl: type = class_decl @A [concrete = constants.%A] {} {} -// CHECK:STDOUT: %B.decl: type = class_decl @B [concrete = constants.%B] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @A { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc5: %A.elem = field_decl x, element0 [concrete] -// CHECK:STDOUT: %struct_type.x: type = struct_type {.x: %i32} [concrete = constants.%struct_type.x] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.x [concrete = constants.%complete_type.1ec] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%A -// CHECK:STDOUT: .x [private] = %.loc5 -// CHECK:STDOUT: .A = -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @B { -// CHECK:STDOUT: %A.ref: type = name_ref A, file.%A.decl [concrete = constants.%A] -// CHECK:STDOUT: %.loc9: %B.elem = base_decl %A.ref, element0 [concrete] -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %self.patt: %pattern_type.049 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.049 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %B = value_param call_param0 -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%B [concrete = constants.%B] -// CHECK:STDOUT: %self: %B = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %A} [concrete = constants.%struct_type.base.953] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base [concrete = constants.%complete_type.020] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%B -// CHECK:STDOUT: .A = -// CHECK:STDOUT: .base = %.loc9 -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: extend %A.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F(%self.param: %B) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %self.ref: %B = name_ref self, %self -// CHECK:STDOUT: %A.ref: type = name_ref A, file.%A.decl [concrete = constants.%A] -// CHECK:STDOUT: %x.ref: = name_ref x, [concrete = ] -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- inherited_compound_member_access.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %A: type = class_type @A [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %A.elem: type = unbound_element_type %A, %i32 [concrete] -// CHECK:STDOUT: %struct_type.x: type = struct_type {.x: %i32} [concrete] -// CHECK:STDOUT: %complete_type.1ec: = complete_type_witness %struct_type.x [concrete] -// CHECK:STDOUT: %B: type = class_type @B [concrete] -// CHECK:STDOUT: %B.elem: type = unbound_element_type %B, %A [concrete] -// CHECK:STDOUT: %pattern_type.049: type = pattern_type %B [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %struct_type.base.953: type = struct_type {.base: %A} [concrete] -// CHECK:STDOUT: %complete_type.020: = complete_type_witness %struct_type.base.953 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .A = %A.decl -// CHECK:STDOUT: .B = %B.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %A.decl: type = class_decl @A [concrete = constants.%A] {} {} -// CHECK:STDOUT: %B.decl: type = class_decl @B [concrete = constants.%B] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @A { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc5: %A.elem = field_decl x, element0 [concrete] -// CHECK:STDOUT: %struct_type.x: type = struct_type {.x: %i32} [concrete = constants.%struct_type.x] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.x [concrete = constants.%complete_type.1ec] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%A -// CHECK:STDOUT: .x [protected] = %.loc5 -// CHECK:STDOUT: .A = -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @B { -// CHECK:STDOUT: %A.ref: type = name_ref A, file.%A.decl [concrete = constants.%A] -// CHECK:STDOUT: %.loc9: %B.elem = base_decl %A.ref, element0 [concrete] -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %self.patt: %pattern_type.049 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.049 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %B = value_param call_param0 -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%B [concrete = constants.%B] -// CHECK:STDOUT: %self: %B = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %A} [concrete = constants.%struct_type.base.953] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base [concrete = constants.%complete_type.020] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%B -// CHECK:STDOUT: .A = -// CHECK:STDOUT: .base = %.loc9 -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: extend %A.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F(%self.param: %B) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %self.ref: %B = name_ref self, %self -// CHECK:STDOUT: %A.ref: type = name_ref A, file.%A.decl [concrete = constants.%A] -// CHECK:STDOUT: %x.ref: %A.elem = name_ref x, @A.%.loc5 [concrete = @A.%.loc5] -// CHECK:STDOUT: %.loc12_9.1: ref %A = class_element_access %self.ref, element0 -// CHECK:STDOUT: %.loc12_9.2: ref %A = converted %self.ref, %.loc12_9.1 -// CHECK:STDOUT: %.loc12_9.3: ref %i32 = class_element_access %.loc12_9.2, element0 -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/init.carbon b/toolchain/check/testdata/class/init.carbon deleted file mode 100644 index 3d1d27fd01a50..0000000000000 --- a/toolchain/check/testdata/class/init.carbon +++ /dev/null @@ -1,160 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/init.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/init.carbon - -class Class { - var n: i32; - var next: Class*; -} - -fn Make(n: i32, next: Class*) -> Class { - return {.n = n, .next = next}; -} - -fn MakeReorder(n: i32, next: Class*) -> Class { - return {.next = next, .n = n}; -} - -// CHECK:STDOUT: --- init.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Class: type = class_type @Class [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %Class.elem.c91: type = unbound_element_type %Class, %i32 [concrete] -// CHECK:STDOUT: %ptr.e71: type = ptr_type %Class [concrete] -// CHECK:STDOUT: %Class.elem.0c0: type = unbound_element_type %Class, %ptr.e71 [concrete] -// CHECK:STDOUT: %struct_type.n.next: type = struct_type {.n: %i32, .next: %ptr.e71} [concrete] -// CHECK:STDOUT: %complete_type.78f: = complete_type_witness %struct_type.n.next [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %pattern_type.796: type = pattern_type %ptr.e71 [concrete] -// CHECK:STDOUT: %pattern_type.761: type = pattern_type %Class [concrete] -// CHECK:STDOUT: %Make.type: type = fn_type @Make [concrete] -// CHECK:STDOUT: %Make: %Make.type = struct_value () [concrete] -// CHECK:STDOUT: %MakeReorder.type: type = fn_type @MakeReorder [concrete] -// CHECK:STDOUT: %MakeReorder: %MakeReorder.type = struct_value () [concrete] -// CHECK:STDOUT: %struct_type.next.n: type = struct_type {.next: %ptr.e71, .n: %i32} [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Class = %Class.decl -// CHECK:STDOUT: .Make = %Make.decl -// CHECK:STDOUT: .MakeReorder = %MakeReorder.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Class.decl: type = class_decl @Class [concrete = constants.%Class] {} {} -// CHECK:STDOUT: %Make.decl: %Make.type = fn_decl @Make [concrete = constants.%Make] { -// CHECK:STDOUT: %n.patt: %pattern_type.7ce = binding_pattern n [concrete] -// CHECK:STDOUT: %n.param_patt: %pattern_type.7ce = value_param_pattern %n.patt, call_param0 [concrete] -// CHECK:STDOUT: %next.patt: %pattern_type.796 = binding_pattern next [concrete] -// CHECK:STDOUT: %next.param_patt: %pattern_type.796 = value_param_pattern %next.patt, call_param1 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.761 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.761 = out_param_pattern %return.patt, call_param2 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %Class.ref.loc16_34: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %n.param: %i32 = value_param call_param0 -// CHECK:STDOUT: %.loc16_12: type = splice_block %i32 [concrete = constants.%i32] { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: } -// CHECK:STDOUT: %n: %i32 = bind_name n, %n.param -// CHECK:STDOUT: %next.param: %ptr.e71 = value_param call_param1 -// CHECK:STDOUT: %.loc16_28: type = splice_block %ptr [concrete = constants.%ptr.e71] { -// CHECK:STDOUT: %Class.ref.loc16_23: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %ptr: type = ptr_type %Class.ref.loc16_23 [concrete = constants.%ptr.e71] -// CHECK:STDOUT: } -// CHECK:STDOUT: %next: %ptr.e71 = bind_name next, %next.param -// CHECK:STDOUT: %return.param: ref %Class = out_param call_param2 -// CHECK:STDOUT: %return: ref %Class = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %MakeReorder.decl: %MakeReorder.type = fn_decl @MakeReorder [concrete = constants.%MakeReorder] { -// CHECK:STDOUT: %n.patt: %pattern_type.7ce = binding_pattern n [concrete] -// CHECK:STDOUT: %n.param_patt: %pattern_type.7ce = value_param_pattern %n.patt, call_param0 [concrete] -// CHECK:STDOUT: %next.patt: %pattern_type.796 = binding_pattern next [concrete] -// CHECK:STDOUT: %next.param_patt: %pattern_type.796 = value_param_pattern %next.patt, call_param1 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.761 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.761 = out_param_pattern %return.patt, call_param2 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %Class.ref.loc20_41: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %n.param: %i32 = value_param call_param0 -// CHECK:STDOUT: %.loc20_19: type = splice_block %i32 [concrete = constants.%i32] { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: } -// CHECK:STDOUT: %n: %i32 = bind_name n, %n.param -// CHECK:STDOUT: %next.param: %ptr.e71 = value_param call_param1 -// CHECK:STDOUT: %.loc20_35: type = splice_block %ptr [concrete = constants.%ptr.e71] { -// CHECK:STDOUT: %Class.ref.loc20_30: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %ptr: type = ptr_type %Class.ref.loc20_30 [concrete = constants.%ptr.e71] -// CHECK:STDOUT: } -// CHECK:STDOUT: %next: %ptr.e71 = bind_name next, %next.param -// CHECK:STDOUT: %return.param: ref %Class = out_param call_param2 -// CHECK:STDOUT: %return: ref %Class = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Class { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc12: %Class.elem.c91 = field_decl n, element0 [concrete] -// CHECK:STDOUT: %Class.ref: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %ptr: type = ptr_type %Class.ref [concrete = constants.%ptr.e71] -// CHECK:STDOUT: %.loc13: %Class.elem.0c0 = field_decl next, element1 [concrete] -// CHECK:STDOUT: %struct_type.n.next: type = struct_type {.n: %i32, .next: %ptr.e71} [concrete = constants.%struct_type.n.next] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.n.next [concrete = constants.%complete_type.78f] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Class -// CHECK:STDOUT: .n = %.loc12 -// CHECK:STDOUT: .Class = -// CHECK:STDOUT: .next = %.loc13 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Make(%n.param: %i32, %next.param: %ptr.e71) -> %return.param: %Class { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %n.ref: %i32 = name_ref n, %n -// CHECK:STDOUT: %next.ref: %ptr.e71 = name_ref next, %next -// CHECK:STDOUT: %.loc17_31.1: %struct_type.n.next = struct_literal (%n.ref, %next.ref) -// CHECK:STDOUT: %.loc17_31.2: ref %i32 = class_element_access %return, element0 -// CHECK:STDOUT: %.loc17_31.3: init %i32 = initialize_from %n.ref to %.loc17_31.2 -// CHECK:STDOUT: %.loc17_31.4: ref %ptr.e71 = class_element_access %return, element1 -// CHECK:STDOUT: %.loc17_31.5: init %ptr.e71 = initialize_from %next.ref to %.loc17_31.4 -// CHECK:STDOUT: %.loc17_31.6: init %Class = class_init (%.loc17_31.3, %.loc17_31.5), %return -// CHECK:STDOUT: %.loc17_32: init %Class = converted %.loc17_31.1, %.loc17_31.6 -// CHECK:STDOUT: return %.loc17_32 to %return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @MakeReorder(%n.param: %i32, %next.param: %ptr.e71) -> %return.param: %Class { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %next.ref: %ptr.e71 = name_ref next, %next -// CHECK:STDOUT: %n.ref: %i32 = name_ref n, %n -// CHECK:STDOUT: %.loc21_31.1: %struct_type.next.n = struct_literal (%next.ref, %n.ref) -// CHECK:STDOUT: %.loc21_31.2: ref %i32 = class_element_access %return, element1 -// CHECK:STDOUT: %.loc21_31.3: init %i32 = initialize_from %n.ref to %.loc21_31.2 -// CHECK:STDOUT: %.loc21_31.4: ref %ptr.e71 = class_element_access %return, element0 -// CHECK:STDOUT: %.loc21_31.5: init %ptr.e71 = initialize_from %next.ref to %.loc21_31.4 -// CHECK:STDOUT: %.loc21_31.6: init %Class = class_init (%.loc21_31.3, %.loc21_31.5), %return -// CHECK:STDOUT: %.loc21_32: init %Class = converted %.loc21_31.1, %.loc21_31.6 -// CHECK:STDOUT: return %.loc21_32 to %return -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/init_as.carbon b/toolchain/check/testdata/class/init_as.carbon deleted file mode 100644 index 1a1fad04fbf4f..0000000000000 --- a/toolchain/check/testdata/class/init_as.carbon +++ /dev/null @@ -1,139 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/init_as.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/init_as.carbon - -class Class { - var a: i32; - var b: i32; -} - -fn F() -> i32 { - return ({.a = 1, .b = 2} as Class).a; -} - -// CHECK:STDOUT: --- init_as.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Class: type = class_type @Class [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %i32 [concrete] -// CHECK:STDOUT: %struct_type.a.b.501: type = struct_type {.a: %i32, .b: %i32} [concrete] -// CHECK:STDOUT: %complete_type.705: = complete_type_witness %struct_type.a.b.501 [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [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: %struct_type.a.b.cfd: type = struct_type {.a: Core.IntLiteral, .b: Core.IntLiteral} [concrete] -// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.type.205: type = facet_type <@ImplicitAs, @ImplicitAs(%i32)> [concrete] -// CHECK:STDOUT: %Convert.type.1b6: type = fn_type @Convert.1, @ImplicitAs(%i32) [concrete] -// CHECK:STDOUT: %To.c80: Core.IntLiteral = bind_symbolic_name To, 0 [symbolic] -// CHECK:STDOUT: %Convert.type.0f9: type = fn_type @Convert.2, @impl.4f9(%To.c80) [symbolic] -// CHECK:STDOUT: %Convert.f06: %Convert.type.0f9 = struct_value () [symbolic] -// CHECK:STDOUT: %ImplicitAs.impl_witness.c75: = impl_witness imports.%ImplicitAs.impl_witness_table.a2f, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.type.035: type = fn_type @Convert.2, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.956: %Convert.type.035 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.facet: %ImplicitAs.type.205 = facet_value Core.IntLiteral, (%ImplicitAs.impl_witness.c75) [concrete] -// CHECK:STDOUT: %.9c3: type = fn_type_with_self_type %Convert.type.1b6, %ImplicitAs.facet [concrete] -// CHECK:STDOUT: %Convert.bound.ab5: = bound_method %int_1.5b8, %Convert.956 [concrete] -// CHECK:STDOUT: %Convert.specific_fn: = specific_function %Convert.956, @Convert.2(%int_32) [concrete] -// CHECK:STDOUT: %bound_method.9a1: = bound_method %int_1.5b8, %Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_1.5d2: %i32 = int_value 1 [concrete] -// CHECK:STDOUT: %Convert.bound.ef9: = bound_method %int_2.ecc, %Convert.956 [concrete] -// CHECK:STDOUT: %bound_method.b92: = bound_method %int_2.ecc, %Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_2.ef8: %i32 = int_value 2 [concrete] -// CHECK:STDOUT: %Class.val: %Class = struct_value (%int_1.5d2, %int_2.ef8) [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/operators/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] -// CHECK:STDOUT: %Core.import_ref.a5b: @impl.4f9.%Convert.type (%Convert.type.0f9) = import_ref Core//prelude/types/int, loc19_39, loaded [symbolic = @impl.4f9.%Convert (constants.%Convert.f06)] -// CHECK:STDOUT: %ImplicitAs.impl_witness_table.a2f = impl_witness_table (%Core.import_ref.a5b), @impl.4f9 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Class = %Class.decl -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Class.decl: type = class_decl @Class [concrete = constants.%Class] {} {} -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param0 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Class { -// CHECK:STDOUT: %int_32.loc12: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc12: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc12: %Class.elem = field_decl a, element0 [concrete] -// CHECK:STDOUT: %int_32.loc13: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc13: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc13: %Class.elem = field_decl b, element1 [concrete] -// CHECK:STDOUT: %struct_type.a.b: type = struct_type {.a: %i32, .b: %i32} [concrete = constants.%struct_type.a.b.501] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.a.b [concrete = constants.%complete_type.705] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Class -// CHECK:STDOUT: .a = %.loc12 -// CHECK:STDOUT: .b = %.loc13 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F() -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %int_1: Core.IntLiteral = int_value 1 [concrete = constants.%int_1.5b8] -// CHECK:STDOUT: %int_2: Core.IntLiteral = int_value 2 [concrete = constants.%int_2.ecc] -// CHECK:STDOUT: %.loc17_26.1: %struct_type.a.b.cfd = struct_literal (%int_1, %int_2) -// CHECK:STDOUT: %Class.ref: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %impl.elem0.loc17_26.1: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc17_26.1: = bound_method %int_1, %impl.elem0.loc17_26.1 [concrete = constants.%Convert.bound.ab5] -// CHECK:STDOUT: %specific_fn.loc17_26.1: = specific_function %impl.elem0.loc17_26.1, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc17_26.2: = bound_method %int_1, %specific_fn.loc17_26.1 [concrete = constants.%bound_method.9a1] -// CHECK:STDOUT: %int.convert_checked.loc17_26.1: init %i32 = call %bound_method.loc17_26.2(%int_1) [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %.loc17_26.2: init %i32 = converted %int_1, %int.convert_checked.loc17_26.1 [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %.loc17_26.3: ref %Class = temporary_storage -// CHECK:STDOUT: %.loc17_26.4: ref %i32 = class_element_access %.loc17_26.3, element0 -// CHECK:STDOUT: %.loc17_26.5: init %i32 = initialize_from %.loc17_26.2 to %.loc17_26.4 [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %impl.elem0.loc17_26.2: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc17_26.3: = bound_method %int_2, %impl.elem0.loc17_26.2 [concrete = constants.%Convert.bound.ef9] -// CHECK:STDOUT: %specific_fn.loc17_26.2: = specific_function %impl.elem0.loc17_26.2, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc17_26.4: = bound_method %int_2, %specific_fn.loc17_26.2 [concrete = constants.%bound_method.b92] -// CHECK:STDOUT: %int.convert_checked.loc17_26.2: init %i32 = call %bound_method.loc17_26.4(%int_2) [concrete = constants.%int_2.ef8] -// CHECK:STDOUT: %.loc17_26.6: init %i32 = converted %int_2, %int.convert_checked.loc17_26.2 [concrete = constants.%int_2.ef8] -// CHECK:STDOUT: %.loc17_26.7: ref %i32 = class_element_access %.loc17_26.3, element1 -// CHECK:STDOUT: %.loc17_26.8: init %i32 = initialize_from %.loc17_26.6 to %.loc17_26.7 [concrete = constants.%int_2.ef8] -// CHECK:STDOUT: %.loc17_26.9: init %Class = class_init (%.loc17_26.5, %.loc17_26.8), %.loc17_26.3 [concrete = constants.%Class.val] -// CHECK:STDOUT: %.loc17_26.10: ref %Class = temporary %.loc17_26.3, %.loc17_26.9 -// CHECK:STDOUT: %.loc17_28: ref %Class = converted %.loc17_26.1, %.loc17_26.10 -// CHECK:STDOUT: %a.ref: %Class.elem = name_ref a, @Class.%.loc12 [concrete = @Class.%.loc12] -// CHECK:STDOUT: %.loc17_37.1: ref %i32 = class_element_access %.loc17_28, element0 -// CHECK:STDOUT: %.loc17_37.2: %i32 = bind_value %.loc17_37.1 -// CHECK:STDOUT: return %.loc17_37.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/init_nested.carbon b/toolchain/check/testdata/class/init_nested.carbon deleted file mode 100644 index 9dc2866346beb..0000000000000 --- a/toolchain/check/testdata/class/init_nested.carbon +++ /dev/null @@ -1,136 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/init_nested.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/init_nested.carbon - -class Inner { - var a: i32; - var b: i32; -} - -fn MakeInner() -> Inner; - -class Outer { - var c: Inner; - var d: Inner; -} - -fn MakeOuter() -> Outer { - return {.c = MakeInner(), .d = MakeInner()}; -} - -// CHECK:STDOUT: --- init_nested.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Inner: type = class_type @Inner [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %Inner.elem: type = unbound_element_type %Inner, %i32 [concrete] -// CHECK:STDOUT: %struct_type.a.b: type = struct_type {.a: %i32, .b: %i32} [concrete] -// CHECK:STDOUT: %complete_type.705: = complete_type_witness %struct_type.a.b [concrete] -// CHECK:STDOUT: %pattern_type.a31: type = pattern_type %Inner [concrete] -// CHECK:STDOUT: %MakeInner.type: type = fn_type @MakeInner [concrete] -// CHECK:STDOUT: %MakeInner: %MakeInner.type = struct_value () [concrete] -// CHECK:STDOUT: %Outer: type = class_type @Outer [concrete] -// CHECK:STDOUT: %Outer.elem: type = unbound_element_type %Outer, %Inner [concrete] -// CHECK:STDOUT: %struct_type.c.d.dce: type = struct_type {.c: %Inner, .d: %Inner} [concrete] -// CHECK:STDOUT: %complete_type.8b6: = complete_type_witness %struct_type.c.d.dce [concrete] -// CHECK:STDOUT: %pattern_type.e74: type = pattern_type %Outer [concrete] -// CHECK:STDOUT: %MakeOuter.type: type = fn_type @MakeOuter [concrete] -// CHECK:STDOUT: %MakeOuter: %MakeOuter.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Inner = %Inner.decl -// CHECK:STDOUT: .MakeInner = %MakeInner.decl -// CHECK:STDOUT: .Outer = %Outer.decl -// CHECK:STDOUT: .MakeOuter = %MakeOuter.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Inner.decl: type = class_decl @Inner [concrete = constants.%Inner] {} {} -// CHECK:STDOUT: %MakeInner.decl: %MakeInner.type = fn_decl @MakeInner [concrete = constants.%MakeInner] { -// CHECK:STDOUT: %return.patt: %pattern_type.a31 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.a31 = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %Inner.ref: type = name_ref Inner, file.%Inner.decl [concrete = constants.%Inner] -// CHECK:STDOUT: %return.param: ref %Inner = out_param call_param0 -// CHECK:STDOUT: %return: ref %Inner = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %Outer.decl: type = class_decl @Outer [concrete = constants.%Outer] {} {} -// CHECK:STDOUT: %MakeOuter.decl: %MakeOuter.type = fn_decl @MakeOuter [concrete = constants.%MakeOuter] { -// CHECK:STDOUT: %return.patt: %pattern_type.e74 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.e74 = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %Outer.ref: type = name_ref Outer, file.%Outer.decl [concrete = constants.%Outer] -// CHECK:STDOUT: %return.param: ref %Outer = out_param call_param0 -// CHECK:STDOUT: %return: ref %Outer = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Inner { -// CHECK:STDOUT: %int_32.loc12: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc12: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc12: %Inner.elem = field_decl a, element0 [concrete] -// CHECK:STDOUT: %int_32.loc13: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc13: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc13: %Inner.elem = field_decl b, element1 [concrete] -// CHECK:STDOUT: %struct_type.a.b: type = struct_type {.a: %i32, .b: %i32} [concrete = constants.%struct_type.a.b] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.a.b [concrete = constants.%complete_type.705] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Inner -// CHECK:STDOUT: .a = %.loc12 -// CHECK:STDOUT: .b = %.loc13 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Outer { -// CHECK:STDOUT: %Inner.ref.loc19: type = name_ref Inner, file.%Inner.decl [concrete = constants.%Inner] -// CHECK:STDOUT: %.loc19: %Outer.elem = field_decl c, element0 [concrete] -// CHECK:STDOUT: %Inner.ref.loc20: type = name_ref Inner, file.%Inner.decl [concrete = constants.%Inner] -// CHECK:STDOUT: %.loc20: %Outer.elem = field_decl d, element1 [concrete] -// CHECK:STDOUT: %struct_type.c.d: type = struct_type {.c: %Inner, .d: %Inner} [concrete = constants.%struct_type.c.d.dce] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.c.d [concrete = constants.%complete_type.8b6] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Outer -// CHECK:STDOUT: .Inner = -// CHECK:STDOUT: .c = %.loc19 -// CHECK:STDOUT: .d = %.loc20 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @MakeInner() -> %return.param: %Inner; -// CHECK:STDOUT: -// CHECK:STDOUT: fn @MakeOuter() -> %return.param: %Outer { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %MakeInner.ref.loc24_16: %MakeInner.type = name_ref MakeInner, file.%MakeInner.decl [concrete = constants.%MakeInner] -// CHECK:STDOUT: %.loc24_45.1: ref %Inner = class_element_access %return, element0 -// CHECK:STDOUT: %MakeInner.call.loc24_26: init %Inner = call %MakeInner.ref.loc24_16() to %.loc24_45.1 -// CHECK:STDOUT: %MakeInner.ref.loc24_34: %MakeInner.type = name_ref MakeInner, file.%MakeInner.decl [concrete = constants.%MakeInner] -// CHECK:STDOUT: %.loc24_45.2: ref %Inner = class_element_access %return, element1 -// CHECK:STDOUT: %MakeInner.call.loc24_44: init %Inner = call %MakeInner.ref.loc24_34() to %.loc24_45.2 -// CHECK:STDOUT: %.loc24_45.3: %struct_type.c.d.dce = struct_literal (%MakeInner.call.loc24_26, %MakeInner.call.loc24_44) -// CHECK:STDOUT: %.loc24_45.4: init %Outer = class_init (%MakeInner.call.loc24_26, %MakeInner.call.loc24_44), %return -// CHECK:STDOUT: %.loc24_46: init %Outer = converted %.loc24_45.3, %.loc24_45.4 -// CHECK:STDOUT: return %.loc24_46 to %return -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/local.carbon b/toolchain/check/testdata/class/local.carbon deleted file mode 100644 index 9c75e38bee492..0000000000000 --- a/toolchain/check/testdata/class/local.carbon +++ /dev/null @@ -1,167 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/local.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/local.carbon - -class A { - fn F() -> i32 { - class B { - fn Make() -> Self { - returned var b: Self = {.n = 1}; - return var; - } - - var n: i32; - } - - return B.Make().n; - } -} - -// CHECK:STDOUT: --- local.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %A: type = class_type @A [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %B: type = class_type @B [concrete] -// CHECK:STDOUT: %pattern_type.971: type = pattern_type %B [concrete] -// CHECK:STDOUT: %Make.type: type = fn_type @Make [concrete] -// CHECK:STDOUT: %Make: %Make.type = struct_value () [concrete] -// CHECK:STDOUT: %B.elem: type = unbound_element_type %B, %i32 [concrete] -// CHECK:STDOUT: %struct_type.n.033: type = struct_type {.n: %i32} [concrete] -// CHECK:STDOUT: %complete_type.54b: = complete_type_witness %struct_type.n.033 [concrete] -// CHECK:STDOUT: %int_1.5b8: Core.IntLiteral = int_value 1 [concrete] -// CHECK:STDOUT: %struct_type.n.44a: type = struct_type {.n: Core.IntLiteral} [concrete] -// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.type.205: type = facet_type <@ImplicitAs, @ImplicitAs(%i32)> [concrete] -// CHECK:STDOUT: %Convert.type.1b6: type = fn_type @Convert.1, @ImplicitAs(%i32) [concrete] -// CHECK:STDOUT: %To.c80: Core.IntLiteral = bind_symbolic_name To, 0 [symbolic] -// CHECK:STDOUT: %Convert.type.0f9: type = fn_type @Convert.2, @impl.4f9(%To.c80) [symbolic] -// CHECK:STDOUT: %Convert.f06: %Convert.type.0f9 = struct_value () [symbolic] -// CHECK:STDOUT: %ImplicitAs.impl_witness.c75: = impl_witness imports.%ImplicitAs.impl_witness_table.a2f, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.type.035: type = fn_type @Convert.2, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.956: %Convert.type.035 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.facet: %ImplicitAs.type.205 = facet_value Core.IntLiteral, (%ImplicitAs.impl_witness.c75) [concrete] -// CHECK:STDOUT: %.9c3: type = fn_type_with_self_type %Convert.type.1b6, %ImplicitAs.facet [concrete] -// CHECK:STDOUT: %Convert.bound: = bound_method %int_1.5b8, %Convert.956 [concrete] -// CHECK:STDOUT: %Convert.specific_fn: = specific_function %Convert.956, @Convert.2(%int_32) [concrete] -// CHECK:STDOUT: %bound_method: = bound_method %int_1.5b8, %Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_1.5d2: %i32 = int_value 1 [concrete] -// CHECK:STDOUT: %B.val: %B = struct_value (%int_1.5d2) [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/operators/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] -// CHECK:STDOUT: %Core.import_ref.a5b: @impl.4f9.%Convert.type (%Convert.type.0f9) = import_ref Core//prelude/types/int, loc19_39, loaded [symbolic = @impl.4f9.%Convert (constants.%Convert.f06)] -// CHECK:STDOUT: %ImplicitAs.impl_witness_table.a2f = impl_witness_table (%Core.import_ref.a5b), @impl.4f9 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .A = %A.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %A.decl: type = class_decl @A [concrete = constants.%A] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @A { -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param0 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%A -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @B { -// CHECK:STDOUT: %Make.decl: %Make.type = fn_decl @Make [concrete = constants.%Make] { -// CHECK:STDOUT: %return.patt: %pattern_type.971 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.971 = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %Self.ref.loc14: type = name_ref Self, constants.%B [concrete = constants.%B] -// CHECK:STDOUT: %return.param: ref %B = out_param call_param0 -// CHECK:STDOUT: %return: ref %B = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc19: %B.elem = field_decl n, element0 [concrete] -// CHECK:STDOUT: %struct_type.n: type = struct_type {.n: %i32} [concrete = constants.%struct_type.n.033] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.n [concrete = constants.%complete_type.54b] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%B -// CHECK:STDOUT: .Make = %Make.decl -// CHECK:STDOUT: .n = %.loc19 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F() -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %B.decl: type = class_decl @B [concrete = constants.%B] {} {} -// CHECK:STDOUT: %B.ref: type = name_ref B, %B.decl [concrete = constants.%B] -// CHECK:STDOUT: %Make.ref: %Make.type = name_ref Make, @B.%Make.decl [concrete = constants.%Make] -// CHECK:STDOUT: %.loc22_19.1: ref %B = temporary_storage -// CHECK:STDOUT: %Make.call: init %B = call %Make.ref() to %.loc22_19.1 -// CHECK:STDOUT: %.loc22_19.2: ref %B = temporary %.loc22_19.1, %Make.call -// CHECK:STDOUT: %n.ref: %B.elem = name_ref n, @B.%.loc19 [concrete = @B.%.loc19] -// CHECK:STDOUT: %.loc22_20.1: ref %i32 = class_element_access %.loc22_19.2, element0 -// CHECK:STDOUT: %.loc22_20.2: %i32 = bind_value %.loc22_20.1 -// CHECK:STDOUT: return %.loc22_20.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Make() -> %return.param: %B { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %b.patt: %pattern_type.971 = binding_pattern b [concrete] -// CHECK:STDOUT: %b.var_patt: %pattern_type.971 = var_pattern %b.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %int_1: Core.IntLiteral = int_value 1 [concrete = constants.%int_1.5b8] -// CHECK:STDOUT: %.loc15_39.1: %struct_type.n.44a = struct_literal (%int_1) -// CHECK:STDOUT: %impl.elem0: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc15_39.1: = bound_method %int_1, %impl.elem0 [concrete = constants.%Convert.bound] -// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc15_39.2: = bound_method %int_1, %specific_fn [concrete = constants.%bound_method] -// CHECK:STDOUT: %int.convert_checked: init %i32 = call %bound_method.loc15_39.2(%int_1) [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %.loc15_39.2: init %i32 = converted %int_1, %int.convert_checked [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %.loc15_39.3: ref %i32 = class_element_access %return, element0 -// CHECK:STDOUT: %.loc15_39.4: init %i32 = initialize_from %.loc15_39.2 to %.loc15_39.3 [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %.loc15_39.5: init %B = class_init (%.loc15_39.4), %return [concrete = constants.%B.val] -// CHECK:STDOUT: %.loc15_18: init %B = converted %.loc15_39.1, %.loc15_39.5 [concrete = constants.%B.val] -// CHECK:STDOUT: assign %return, %.loc15_18 -// CHECK:STDOUT: %Self.ref.loc15: type = name_ref Self, constants.%B [concrete = constants.%B] -// CHECK:STDOUT: %b: ref %B = bind_name b, %return -// CHECK:STDOUT: return %b to %return -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/method.carbon b/toolchain/check/testdata/class/method.carbon deleted file mode 100644 index 319898fcb8d87..0000000000000 --- a/toolchain/check/testdata/class/method.carbon +++ /dev/null @@ -1,456 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/method.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/method.carbon - -class Class { - fn F[self: Self]() -> i32; - fn G[addr self: Self*]() -> i32; - - alias A = F; - - var k: i32; -} - -fn Class.F[self: Self]() -> i32 { - return self.k; -} - -fn Call(c: Class) -> i32 { - // TODO: The sem-ir for this call doesn't distinguish the `self` argument from - // the explicit arguments. - return c.F(); -} - -fn CallAlias(c: Class) -> i32 { - return c.A(); -} - -fn CallOnConstBoundMethod() -> i32 { - return ({.k = 1} as Class).F(); -} - -fn CallWithAddr() -> i32 { - var c: Class; - return c.G(); -} - -fn CallFThroughPointer(p: Class*) -> i32 { - return (*p).F(); -} - -fn CallGThroughPointer(p: Class*) -> i32 { - return (*p).G(); -} - -fn Make() -> Class; - -fn CallFOnInitializingExpr() -> i32 { - return Make().F(); -} - -fn CallGOnInitializingExpr() -> i32 { - return Make().G(); -} - -// CHECK:STDOUT: --- method.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Class: type = class_type @Class [concrete] -// CHECK:STDOUT: %pattern_type.761: type = pattern_type %Class [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %ptr.e71: type = ptr_type %Class [concrete] -// CHECK:STDOUT: %pattern_type.796: type = pattern_type %ptr.e71 [concrete] -// CHECK:STDOUT: %pattern_type.f6d: type = pattern_type auto [concrete] -// CHECK:STDOUT: %G.type: type = fn_type @G [concrete] -// CHECK:STDOUT: %G: %G.type = struct_value () [concrete] -// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %i32 [concrete] -// CHECK:STDOUT: %struct_type.k.0bf: type = struct_type {.k: %i32} [concrete] -// CHECK:STDOUT: %complete_type.954: = complete_type_witness %struct_type.k.0bf [concrete] -// CHECK:STDOUT: %Call.type: type = fn_type @Call [concrete] -// CHECK:STDOUT: %Call: %Call.type = struct_value () [concrete] -// CHECK:STDOUT: %CallAlias.type: type = fn_type @CallAlias [concrete] -// CHECK:STDOUT: %CallAlias: %CallAlias.type = struct_value () [concrete] -// CHECK:STDOUT: %CallOnConstBoundMethod.type: type = fn_type @CallOnConstBoundMethod [concrete] -// CHECK:STDOUT: %CallOnConstBoundMethod: %CallOnConstBoundMethod.type = struct_value () [concrete] -// CHECK:STDOUT: %int_1.5b8: Core.IntLiteral = int_value 1 [concrete] -// CHECK:STDOUT: %struct_type.k.240: type = struct_type {.k: Core.IntLiteral} [concrete] -// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.type.205: type = facet_type <@ImplicitAs, @ImplicitAs(%i32)> [concrete] -// CHECK:STDOUT: %Convert.type.1b6: type = fn_type @Convert.1, @ImplicitAs(%i32) [concrete] -// CHECK:STDOUT: %To.c80: Core.IntLiteral = bind_symbolic_name To, 0 [symbolic] -// CHECK:STDOUT: %Convert.type.0f9: type = fn_type @Convert.2, @impl.4f9(%To.c80) [symbolic] -// CHECK:STDOUT: %Convert.f06: %Convert.type.0f9 = struct_value () [symbolic] -// CHECK:STDOUT: %ImplicitAs.impl_witness.c75: = impl_witness imports.%ImplicitAs.impl_witness_table.a2f, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.type.035: type = fn_type @Convert.2, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.956: %Convert.type.035 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.facet: %ImplicitAs.type.205 = facet_value Core.IntLiteral, (%ImplicitAs.impl_witness.c75) [concrete] -// CHECK:STDOUT: %.9c3: type = fn_type_with_self_type %Convert.type.1b6, %ImplicitAs.facet [concrete] -// CHECK:STDOUT: %Convert.bound: = bound_method %int_1.5b8, %Convert.956 [concrete] -// CHECK:STDOUT: %Convert.specific_fn: = specific_function %Convert.956, @Convert.2(%int_32) [concrete] -// CHECK:STDOUT: %bound_method: = bound_method %int_1.5b8, %Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_1.5d2: %i32 = int_value 1 [concrete] -// CHECK:STDOUT: %Class.val: %Class = struct_value (%int_1.5d2) [concrete] -// CHECK:STDOUT: %CallWithAddr.type: type = fn_type @CallWithAddr [concrete] -// CHECK:STDOUT: %CallWithAddr: %CallWithAddr.type = struct_value () [concrete] -// CHECK:STDOUT: %CallFThroughPointer.type: type = fn_type @CallFThroughPointer [concrete] -// CHECK:STDOUT: %CallFThroughPointer: %CallFThroughPointer.type = struct_value () [concrete] -// CHECK:STDOUT: %CallGThroughPointer.type: type = fn_type @CallGThroughPointer [concrete] -// CHECK:STDOUT: %CallGThroughPointer: %CallGThroughPointer.type = struct_value () [concrete] -// CHECK:STDOUT: %Make.type: type = fn_type @Make [concrete] -// CHECK:STDOUT: %Make: %Make.type = struct_value () [concrete] -// CHECK:STDOUT: %CallFOnInitializingExpr.type: type = fn_type @CallFOnInitializingExpr [concrete] -// CHECK:STDOUT: %CallFOnInitializingExpr: %CallFOnInitializingExpr.type = struct_value () [concrete] -// CHECK:STDOUT: %CallGOnInitializingExpr.type: type = fn_type @CallGOnInitializingExpr [concrete] -// CHECK:STDOUT: %CallGOnInitializingExpr: %CallGOnInitializingExpr.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/operators/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] -// CHECK:STDOUT: %Core.import_ref.a5b: @impl.4f9.%Convert.type (%Convert.type.0f9) = import_ref Core//prelude/types/int, loc19_39, loaded [symbolic = @impl.4f9.%Convert (constants.%Convert.f06)] -// CHECK:STDOUT: %ImplicitAs.impl_witness_table.a2f = impl_witness_table (%Core.import_ref.a5b), @impl.4f9 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Class = %Class.decl -// CHECK:STDOUT: .Call = %Call.decl -// CHECK:STDOUT: .CallAlias = %CallAlias.decl -// CHECK:STDOUT: .CallOnConstBoundMethod = %CallOnConstBoundMethod.decl -// CHECK:STDOUT: .CallWithAddr = %CallWithAddr.decl -// CHECK:STDOUT: .CallFThroughPointer = %CallFThroughPointer.decl -// CHECK:STDOUT: .CallGThroughPointer = %CallGThroughPointer.decl -// CHECK:STDOUT: .Make = %Make.decl -// CHECK:STDOUT: .CallFOnInitializingExpr = %CallFOnInitializingExpr.decl -// CHECK:STDOUT: .CallGOnInitializingExpr = %CallGOnInitializingExpr.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Class.decl: type = class_decl @Class [concrete = constants.%Class] {} {} -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %self.patt: %pattern_type.761 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.761 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32.loc20: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc20: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %self.param.loc20: %Class = value_param call_param0 -// CHECK:STDOUT: %Self.ref.loc20: type = name_ref Self, constants.%Class [concrete = constants.%Class] -// CHECK:STDOUT: %self.loc20: %Class = bind_name self, %self.param.loc20 -// CHECK:STDOUT: %return.param.loc20: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return.loc20: ref %i32 = return_slot %return.param.loc20 -// CHECK:STDOUT: } -// CHECK:STDOUT: %Call.decl: %Call.type = fn_decl @Call [concrete = constants.%Call] { -// CHECK:STDOUT: %c.patt: %pattern_type.761 = binding_pattern c [concrete] -// CHECK:STDOUT: %c.param_patt: %pattern_type.761 = value_param_pattern %c.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %c.param: %Class = value_param call_param0 -// CHECK:STDOUT: %Class.ref: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %c: %Class = bind_name c, %c.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %CallAlias.decl: %CallAlias.type = fn_decl @CallAlias [concrete = constants.%CallAlias] { -// CHECK:STDOUT: %c.patt: %pattern_type.761 = binding_pattern c [concrete] -// CHECK:STDOUT: %c.param_patt: %pattern_type.761 = value_param_pattern %c.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %c.param: %Class = value_param call_param0 -// CHECK:STDOUT: %Class.ref: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %c: %Class = bind_name c, %c.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %CallOnConstBoundMethod.decl: %CallOnConstBoundMethod.type = fn_decl @CallOnConstBoundMethod [concrete = constants.%CallOnConstBoundMethod] { -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param0 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %CallWithAddr.decl: %CallWithAddr.type = fn_decl @CallWithAddr [concrete = constants.%CallWithAddr] { -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param0 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %CallFThroughPointer.decl: %CallFThroughPointer.type = fn_decl @CallFThroughPointer [concrete = constants.%CallFThroughPointer] { -// CHECK:STDOUT: %p.patt: %pattern_type.796 = binding_pattern p [concrete] -// CHECK:STDOUT: %p.param_patt: %pattern_type.796 = value_param_pattern %p.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %p.param: %ptr.e71 = value_param call_param0 -// CHECK:STDOUT: %.loc43: type = splice_block %ptr [concrete = constants.%ptr.e71] { -// CHECK:STDOUT: %Class.ref: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %ptr: type = ptr_type %Class.ref [concrete = constants.%ptr.e71] -// CHECK:STDOUT: } -// CHECK:STDOUT: %p: %ptr.e71 = bind_name p, %p.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %CallGThroughPointer.decl: %CallGThroughPointer.type = fn_decl @CallGThroughPointer [concrete = constants.%CallGThroughPointer] { -// CHECK:STDOUT: %p.patt: %pattern_type.796 = binding_pattern p [concrete] -// CHECK:STDOUT: %p.param_patt: %pattern_type.796 = value_param_pattern %p.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %p.param: %ptr.e71 = value_param call_param0 -// CHECK:STDOUT: %.loc47: type = splice_block %ptr [concrete = constants.%ptr.e71] { -// CHECK:STDOUT: %Class.ref: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %ptr: type = ptr_type %Class.ref [concrete = constants.%ptr.e71] -// CHECK:STDOUT: } -// CHECK:STDOUT: %p: %ptr.e71 = bind_name p, %p.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %Make.decl: %Make.type = fn_decl @Make [concrete = constants.%Make] { -// CHECK:STDOUT: %return.patt: %pattern_type.761 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.761 = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %Class.ref: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %return.param: ref %Class = out_param call_param0 -// CHECK:STDOUT: %return: ref %Class = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %CallFOnInitializingExpr.decl: %CallFOnInitializingExpr.type = fn_decl @CallFOnInitializingExpr [concrete = constants.%CallFOnInitializingExpr] { -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param0 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %CallGOnInitializingExpr.decl: %CallGOnInitializingExpr.type = fn_decl @CallGOnInitializingExpr [concrete = constants.%CallGOnInitializingExpr] { -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param0 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Class { -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %self.patt: %pattern_type.761 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.761 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32.loc12: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc12: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %self.param.loc12: %Class = value_param call_param0 -// CHECK:STDOUT: %Self.ref.loc12: type = name_ref Self, constants.%Class [concrete = constants.%Class] -// CHECK:STDOUT: %self.loc12: %Class = bind_name self, %self.param.loc12 -// CHECK:STDOUT: %return.param.loc12: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return.loc12: ref %i32 = return_slot %return.param.loc12 -// CHECK:STDOUT: } -// CHECK:STDOUT: %G.decl: %G.type = fn_decl @G [concrete = constants.%G] { -// CHECK:STDOUT: %self.patt: %pattern_type.796 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.796 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc13_8: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %self.param: %ptr.e71 = value_param call_param0 -// CHECK:STDOUT: %.loc13_23: type = splice_block %ptr [concrete = constants.%ptr.e71] { -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Class [concrete = constants.%Class] -// CHECK:STDOUT: %ptr: type = ptr_type %Self.ref [concrete = constants.%ptr.e71] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self: %ptr.e71 = bind_name self, %self.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %F.ref: %F.type = name_ref F, %F.decl [concrete = constants.%F] -// CHECK:STDOUT: %A: %F.type = bind_alias A, %F.decl [concrete = constants.%F] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc17: %Class.elem = field_decl k, element0 [concrete] -// CHECK:STDOUT: %struct_type.k: type = struct_type {.k: %i32} [concrete = constants.%struct_type.k.0bf] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.k [concrete = constants.%complete_type.954] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Class -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: .G = %G.decl -// CHECK:STDOUT: .A = %A -// CHECK:STDOUT: .k = %.loc17 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F(%self.param.loc20: %Class) -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %self.ref: %Class = name_ref self, %self.loc20 -// CHECK:STDOUT: %k.ref: %Class.elem = name_ref k, @Class.%.loc17 [concrete = @Class.%.loc17] -// CHECK:STDOUT: %.loc21_14.1: ref %i32 = class_element_access %self.ref, element0 -// CHECK:STDOUT: %.loc21_14.2: %i32 = bind_value %.loc21_14.1 -// CHECK:STDOUT: return %.loc21_14.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @G(%self.param: %ptr.e71) -> %i32; -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Call(%c.param: %Class) -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %c.ref: %Class = name_ref c, %c -// CHECK:STDOUT: %F.ref: %F.type = name_ref F, @Class.%F.decl [concrete = constants.%F] -// CHECK:STDOUT: %F.bound: = bound_method %c.ref, %F.ref -// CHECK:STDOUT: %F.call: init %i32 = call %F.bound(%c.ref) -// CHECK:STDOUT: %.loc27_15.1: %i32 = value_of_initializer %F.call -// CHECK:STDOUT: %.loc27_15.2: %i32 = converted %F.call, %.loc27_15.1 -// CHECK:STDOUT: return %.loc27_15.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @CallAlias(%c.param: %Class) -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %c.ref: %Class = name_ref c, %c -// CHECK:STDOUT: %A.ref: %F.type = name_ref A, @Class.%A [concrete = constants.%F] -// CHECK:STDOUT: %F.bound: = bound_method %c.ref, %A.ref -// CHECK:STDOUT: %F.call: init %i32 = call %F.bound(%c.ref) -// CHECK:STDOUT: %.loc31_15.1: %i32 = value_of_initializer %F.call -// CHECK:STDOUT: %.loc31_15.2: %i32 = converted %F.call, %.loc31_15.1 -// CHECK:STDOUT: return %.loc31_15.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @CallOnConstBoundMethod() -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %int_1: Core.IntLiteral = int_value 1 [concrete = constants.%int_1.5b8] -// CHECK:STDOUT: %.loc35_18.1: %struct_type.k.240 = struct_literal (%int_1) -// CHECK:STDOUT: %Class.ref: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %impl.elem0: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc35_18.1: = bound_method %int_1, %impl.elem0 [concrete = constants.%Convert.bound] -// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc35_18.2: = bound_method %int_1, %specific_fn [concrete = constants.%bound_method] -// CHECK:STDOUT: %int.convert_checked: init %i32 = call %bound_method.loc35_18.2(%int_1) [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %.loc35_18.2: init %i32 = converted %int_1, %int.convert_checked [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %.loc35_18.3: ref %Class = temporary_storage -// CHECK:STDOUT: %.loc35_18.4: ref %i32 = class_element_access %.loc35_18.3, element0 -// CHECK:STDOUT: %.loc35_18.5: init %i32 = initialize_from %.loc35_18.2 to %.loc35_18.4 [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %.loc35_18.6: init %Class = class_init (%.loc35_18.5), %.loc35_18.3 [concrete = constants.%Class.val] -// CHECK:STDOUT: %.loc35_18.7: ref %Class = temporary %.loc35_18.3, %.loc35_18.6 -// CHECK:STDOUT: %.loc35_20.1: ref %Class = converted %.loc35_18.1, %.loc35_18.7 -// CHECK:STDOUT: %F.ref: %F.type = name_ref F, @Class.%F.decl [concrete = constants.%F] -// CHECK:STDOUT: %F.bound: = bound_method %.loc35_20.1, %F.ref -// CHECK:STDOUT: %.loc35_20.2: %Class = bind_value %.loc35_20.1 -// CHECK:STDOUT: %F.call: init %i32 = call %F.bound(%.loc35_20.2) -// CHECK:STDOUT: %.loc35_33.1: %i32 = value_of_initializer %F.call -// CHECK:STDOUT: %.loc35_33.2: %i32 = converted %F.call, %.loc35_33.1 -// CHECK:STDOUT: return %.loc35_33.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @CallWithAddr() -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %c.patt: %pattern_type.761 = binding_pattern c [concrete] -// CHECK:STDOUT: %c.var_patt: %pattern_type.761 = var_pattern %c.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %c.var: ref %Class = var %c.var_patt -// CHECK:STDOUT: %Class.ref: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %c: ref %Class = bind_name c, %c.var -// CHECK:STDOUT: %c.ref: ref %Class = name_ref c, %c -// CHECK:STDOUT: %G.ref: %G.type = name_ref G, @Class.%G.decl [concrete = constants.%G] -// CHECK:STDOUT: %G.bound: = bound_method %c.ref, %G.ref -// CHECK:STDOUT: %addr: %ptr.e71 = addr_of %c.ref -// CHECK:STDOUT: %G.call: init %i32 = call %G.bound(%addr) -// CHECK:STDOUT: %.loc40_15.1: %i32 = value_of_initializer %G.call -// CHECK:STDOUT: %.loc40_15.2: %i32 = converted %G.call, %.loc40_15.1 -// CHECK:STDOUT: return %.loc40_15.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @CallFThroughPointer(%p.param: %ptr.e71) -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %p.ref: %ptr.e71 = name_ref p, %p -// CHECK:STDOUT: %.loc44_11.1: ref %Class = deref %p.ref -// CHECK:STDOUT: %F.ref: %F.type = name_ref F, @Class.%F.decl [concrete = constants.%F] -// CHECK:STDOUT: %F.bound: = bound_method %.loc44_11.1, %F.ref -// CHECK:STDOUT: %.loc44_11.2: %Class = bind_value %.loc44_11.1 -// CHECK:STDOUT: %F.call: init %i32 = call %F.bound(%.loc44_11.2) -// CHECK:STDOUT: %.loc44_18.1: %i32 = value_of_initializer %F.call -// CHECK:STDOUT: %.loc44_18.2: %i32 = converted %F.call, %.loc44_18.1 -// CHECK:STDOUT: return %.loc44_18.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @CallGThroughPointer(%p.param: %ptr.e71) -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %p.ref: %ptr.e71 = name_ref p, %p -// CHECK:STDOUT: %.loc48_11: ref %Class = deref %p.ref -// CHECK:STDOUT: %G.ref: %G.type = name_ref G, @Class.%G.decl [concrete = constants.%G] -// CHECK:STDOUT: %G.bound: = bound_method %.loc48_11, %G.ref -// CHECK:STDOUT: %addr: %ptr.e71 = addr_of %.loc48_11 -// CHECK:STDOUT: %G.call: init %i32 = call %G.bound(%addr) -// CHECK:STDOUT: %.loc48_18.1: %i32 = value_of_initializer %G.call -// CHECK:STDOUT: %.loc48_18.2: %i32 = converted %G.call, %.loc48_18.1 -// CHECK:STDOUT: return %.loc48_18.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Make() -> %return.param: %Class; -// CHECK:STDOUT: -// CHECK:STDOUT: fn @CallFOnInitializingExpr() -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %Make.ref: %Make.type = name_ref Make, file.%Make.decl [concrete = constants.%Make] -// CHECK:STDOUT: %.loc54_15.1: ref %Class = temporary_storage -// CHECK:STDOUT: %Make.call: init %Class = call %Make.ref() to %.loc54_15.1 -// CHECK:STDOUT: %.loc54_15.2: ref %Class = temporary %.loc54_15.1, %Make.call -// CHECK:STDOUT: %F.ref: %F.type = name_ref F, @Class.%F.decl [concrete = constants.%F] -// CHECK:STDOUT: %F.bound: = bound_method %.loc54_15.2, %F.ref -// CHECK:STDOUT: %.loc54_15.3: %Class = bind_value %.loc54_15.2 -// CHECK:STDOUT: %F.call: init %i32 = call %F.bound(%.loc54_15.3) -// CHECK:STDOUT: %.loc54_20.1: %i32 = value_of_initializer %F.call -// CHECK:STDOUT: %.loc54_20.2: %i32 = converted %F.call, %.loc54_20.1 -// CHECK:STDOUT: return %.loc54_20.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @CallGOnInitializingExpr() -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %Make.ref: %Make.type = name_ref Make, file.%Make.decl [concrete = constants.%Make] -// CHECK:STDOUT: %.loc58_15.1: ref %Class = temporary_storage -// CHECK:STDOUT: %Make.call: init %Class = call %Make.ref() to %.loc58_15.1 -// CHECK:STDOUT: %.loc58_15.2: ref %Class = temporary %.loc58_15.1, %Make.call -// CHECK:STDOUT: %G.ref: %G.type = name_ref G, @Class.%G.decl [concrete = constants.%G] -// CHECK:STDOUT: %G.bound: = bound_method %.loc58_15.2, %G.ref -// CHECK:STDOUT: %addr: %ptr.e71 = addr_of %.loc58_15.2 -// CHECK:STDOUT: %G.call: init %i32 = call %G.bound(%addr) -// CHECK:STDOUT: %.loc58_20.1: %i32 = value_of_initializer %G.call -// CHECK:STDOUT: %.loc58_20.2: %i32 = converted %G.call, %.loc58_20.1 -// CHECK:STDOUT: return %.loc58_20.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/min_prelude/abstract.carbon b/toolchain/check/testdata/class/min_prelude/abstract.carbon new file mode 100644 index 0000000000000..6e6e56abe046b --- /dev/null +++ b/toolchain/check/testdata/class/min_prelude/abstract.carbon @@ -0,0 +1,284 @@ +// Part of the Carbon Language project, under the Apache License v2.0 with LLVM +// Exceptions. See /LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// INCLUDE-FILE: toolchain/testing/min_prelude/destroy.carbon +// +// AUTOUPDATE +// TIP: To test this file alone, run: +// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/min_prelude/abstract.carbon +// TIP: To dump output, run: +// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/min_prelude/abstract.carbon + +// --- fail_abstract_field.carbon + +library "[[@TEST_NAME]]"; + +abstract class Abstract { +} + +class Contains { + // CHECK:STDERR: fail_abstract_field.carbon:[[@LINE+7]]:10: error: field has abstract type `Abstract` [AbstractTypeInFieldDecl] + // CHECK:STDERR: var a: Abstract; + // CHECK:STDERR: ^~~~~~~~ + // CHECK:STDERR: fail_abstract_field.carbon:[[@LINE-7]]:1: note: class was declared abstract here [ClassAbstractHere] + // CHECK:STDERR: abstract class Abstract { + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + var a: Abstract; +} + +// --- fail_abstract_var.carbon + +library "[[@TEST_NAME]]"; + +abstract class Abstract { +} + +fn Var() { + // CHECK:STDERR: fail_abstract_var.carbon:[[@LINE+7]]:10: error: binding pattern has abstract type `Abstract` in `var` pattern [AbstractTypeInVarPattern] + // CHECK:STDERR: var v: Abstract; + // CHECK:STDERR: ^~~~~~~~ + // CHECK:STDERR: fail_abstract_var.carbon:[[@LINE-7]]:1: note: class was declared abstract here [ClassAbstractHere] + // CHECK:STDERR: abstract class Abstract { + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + var v: Abstract; +} + +// --- abstract_let.carbon + +library "[[@TEST_NAME]]"; + +abstract class Abstract { +} + +fn F(a: Abstract) { + //@dump-sem-ir-begin + let l: Abstract = a; + //@dump-sem-ir-end +} + +// --- fail_abstract_adapter.carbon + +library "[[@TEST_NAME]]"; + +abstract class Abstract { +} + +class Adapter { + // TODO(#4387): This should probably be valid + // CHECK:STDERR: fail_abstract_adapter.carbon:[[@LINE+7]]:3: error: adapted type `Abstract` is an abstract type [AbstractTypeInAdaptDecl] + // CHECK:STDERR: adapt Abstract; + // CHECK:STDERR: ^~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_abstract_adapter.carbon:[[@LINE-8]]:1: note: class was declared abstract here [ClassAbstractHere] + // CHECK:STDERR: abstract class Abstract { + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + adapt Abstract; +} + +// --- define_and_call_abstract_param.carbon + +library "[[@TEST_NAME]]"; + +abstract class Abstract { +} + +fn Param(a: Abstract); + +fn Call(p: Abstract) { + //@dump-sem-ir-begin + Param(p); + //@dump-sem-ir-end +} + +// --- fail_todo_return_nonabstract_derived.carbon + +library "[[@TEST_NAME]]"; + +abstract class Abstract { +} + +class Derived { + extend base: Abstract; + + var d: {}; +} + +fn Make() -> Derived { + //@dump-sem-ir-begin + // TODO: This should be valid, and should construct an instance of `partial Abstract` as the base. + // CHECK:STDERR: fail_todo_return_nonabstract_derived.carbon:[[@LINE+7]]:10: error: initialization of abstract type `Abstract` [AbstractTypeInInit] + // CHECK:STDERR: return {.base = {}, .d = {}}; + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_todo_return_nonabstract_derived.carbon:[[@LINE-15]]:1: note: class was declared abstract here [ClassAbstractHere] + // CHECK:STDERR: abstract class Abstract { + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + return {.base = {}, .d = {}}; + //@dump-sem-ir-end +} + +// --- fail_return_abstract.carbon + +library "[[@TEST_NAME]]"; + +abstract class Abstract { +} + +class Derived { + extend base: Abstract; + + var d: {}; +} + +fn Return(a: Abstract) -> Abstract { + // TODO: Seems like this would be better off failing with "function returns abstract type" here instead of this \/ + // CHECK:STDERR: fail_return_abstract.carbon:[[@LINE+7]]:3: error: initialization of abstract type `Abstract` [AbstractTypeInInit] + // CHECK:STDERR: return a; + // CHECK:STDERR: ^~~~~~~~~ + // CHECK:STDERR: fail_return_abstract.carbon:[[@LINE-14]]:1: note: class was declared abstract here [ClassAbstractHere] + // CHECK:STDERR: abstract class Abstract { + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + return a; +} + +// --- access_abstract_subobject.carbon + +library "[[@TEST_NAME]]"; + +abstract class Abstract { + var a: {}; +} + +class Derived { + extend base: Abstract; + + var d: {}; +} + +fn Access(d: Derived) -> {} { + //@dump-sem-ir-begin + return d.base.a; + //@dump-sem-ir-end +} + +// --- todo_fail_abstract_let_temporary.carbon + +library "[[@TEST_NAME]]"; + +abstract class Abstract { +} + +fn F() { + // TODO: This should probably require `partial`. + let l: Abstract = {}; +} + +// --- fail_call_abstract_return.carbon + +library "[[@TEST_NAME]]"; + +abstract class Abstract { +} + +fn ReturnAbstract() -> Abstract; + +fn CallReturnAbstract() { + // CHECK:STDERR: fail_call_abstract_return.carbon:[[@LINE+10]]:3: error: function returns abstract type `Abstract` [AbstractTypeInFunctionReturnType] + // CHECK:STDERR: ReturnAbstract(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_call_abstract_return.carbon:[[@LINE-9]]:1: note: class was declared abstract here [ClassAbstractHere] + // CHECK:STDERR: abstract class Abstract { + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_call_abstract_return.carbon:[[@LINE-9]]:21: note: return type declared here [IncompleteReturnTypeHere] + // CHECK:STDERR: fn ReturnAbstract() -> Abstract; + // CHECK:STDERR: ^~~~~~~~~~~ + // CHECK:STDERR: + ReturnAbstract(); +} + +// CHECK:STDOUT: --- abstract_let.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %Abstract: type = class_type @Abstract [concrete] +// CHECK:STDOUT: %pattern_type: type = pattern_type %Abstract [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @F(%a.param: %Abstract) { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %l.patt: %pattern_type = binding_pattern l [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: %a.ref: %Abstract = name_ref a, %a +// CHECK:STDOUT: %Abstract.ref.loc9: type = name_ref Abstract, file.%Abstract.decl [concrete = constants.%Abstract] +// CHECK:STDOUT: %l: %Abstract = bind_name l, +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: --- define_and_call_abstract_param.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %Abstract: type = class_type @Abstract [concrete] +// CHECK:STDOUT: %Param.type: type = fn_type @Param [concrete] +// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] +// CHECK:STDOUT: %Param: %Param.type = struct_value () [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @Call(%p.param: %Abstract) { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %Param.ref: %Param.type = name_ref Param, file.%Param.decl [concrete = constants.%Param] +// CHECK:STDOUT: %p.ref: %Abstract = name_ref p, %p +// CHECK:STDOUT: %Param.call: init %empty_tuple.type = call %Param.ref() +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: --- fail_todo_return_nonabstract_derived.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] +// CHECK:STDOUT: %Derived: type = class_type @Derived [concrete] +// CHECK:STDOUT: %struct_type.base.d.e0f: type = struct_type {.base: %empty_struct_type, .d: %empty_struct_type} [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @Make() -> %return.param: %Derived { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %.loc23_20: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc23_29: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc23_30: %struct_type.base.d.e0f = struct_literal (%.loc23_20, %.loc23_29) +// CHECK:STDOUT: return to %return +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: --- access_abstract_subobject.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %Abstract: type = class_type @Abstract [concrete] +// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] +// CHECK:STDOUT: %Derived: type = class_type @Derived [concrete] +// CHECK:STDOUT: %Derived.elem.513: type = unbound_element_type %Derived, %Abstract [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @Access(%d.param: %Derived) -> %empty_struct_type { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %d.ref: %Derived = name_ref d, %d +// CHECK:STDOUT: %base.ref: %Derived.elem.513 = name_ref base, @Derived.%.loc9 [concrete = @Derived.%.loc9] +// CHECK:STDOUT: %.loc16: ref %Abstract = class_element_access %d.ref, element0 +// CHECK:STDOUT: %a.ref: = name_ref a, [concrete = ] +// CHECK:STDOUT: return +// CHECK:STDOUT: } +// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/min_prelude/abstract_in_tuple.carbon b/toolchain/check/testdata/class/min_prelude/abstract_in_tuple.carbon new file mode 100644 index 0000000000000..784c7a6510835 --- /dev/null +++ b/toolchain/check/testdata/class/min_prelude/abstract_in_tuple.carbon @@ -0,0 +1,156 @@ +// Part of the Carbon Language project, under the Apache License v2.0 with LLVM +// Exceptions. See /LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// INCLUDE-FILE: toolchain/testing/min_prelude/destroy.carbon +// +// AUTOUPDATE +// TIP: To test this file alone, run: +// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/min_prelude/abstract_in_tuple.carbon +// TIP: To dump output, run: +// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/min_prelude/abstract_in_tuple.carbon + +// --- fail_abstract_field.carbon +library "[[@TEST_NAME]]"; + +abstract class Abstract1 {} + +class Contains { + // CHECK:STDERR: fail_abstract_field.carbon:[[@LINE+7]]:10: error: field has abstract type `(Abstract1,)` [AbstractTypeInFieldDecl] + // CHECK:STDERR: var a: (Abstract1,); + // CHECK:STDERR: ^~~~~~~~~~~~ + // CHECK:STDERR: fail_abstract_field.carbon:[[@LINE-6]]:1: note: uses class that was declared abstract here [ClassAbstractHere] + // CHECK:STDERR: abstract class Abstract1 {} + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + var a: (Abstract1,); +} + +// --- fail_abstract_var.carbon +library "[[@TEST_NAME]]"; + +abstract class Abstract2 {} + +fn Var() { + // CHECK:STDERR: fail_abstract_var.carbon:[[@LINE+7]]:10: error: binding pattern has abstract type `(Abstract2,)` in `var` pattern [AbstractTypeInVarPattern] + // CHECK:STDERR: var v: (Abstract2,); + // CHECK:STDERR: ^~~~~~~~~~~~ + // CHECK:STDERR: fail_abstract_var.carbon:[[@LINE-6]]:1: note: uses class that was declared abstract here [ClassAbstractHere] + // CHECK:STDERR: abstract class Abstract2 {} + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + var v: (Abstract2,); +} + +// --- abstract_let.carbon +library "[[@TEST_NAME]]"; + +abstract class Abstract3 { +} + +fn F(a: Abstract3) { + //@dump-sem-ir-begin + let l: (Abstract3,) = (a,); + //@dump-sem-ir-end +} + +// --- fail_abstract_twice.carbon +library "[[@TEST_NAME]]"; + +abstract class Abstract4 {} +abstract class Abstract5 {} + +fn Var2() { + // CHECK:STDERR: fail_abstract_twice.carbon:[[@LINE+7]]:11: error: binding pattern has abstract type `(Abstract4, Abstract5)` in `var` pattern [AbstractTypeInVarPattern] + // CHECK:STDERR: var v2: (Abstract4, Abstract5); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_abstract_twice.carbon:[[@LINE-7]]:1: note: uses class that was declared abstract here [ClassAbstractHere] + // CHECK:STDERR: abstract class Abstract4 {} + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + var v2: (Abstract4, Abstract5); +} + +// --- fail_abstract_first.carbon +library "[[@TEST_NAME]]"; + +abstract class Abstract6 {} + +fn Var3() { + // CHECK:STDERR: fail_abstract_first.carbon:[[@LINE+7]]:11: error: binding pattern has abstract type `(Abstract6, {})` in `var` pattern [AbstractTypeInVarPattern] + // CHECK:STDERR: var v3: (Abstract6, {}); + // CHECK:STDERR: ^~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_abstract_first.carbon:[[@LINE-6]]:1: note: uses class that was declared abstract here [ClassAbstractHere] + // CHECK:STDERR: abstract class Abstract6 {} + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + var v3: (Abstract6, {}); +} + +// --- fail_abstract_second.carbon +library "[[@TEST_NAME]]"; + +abstract class Abstract7 {} + +fn Var4() { + // CHECK:STDERR: fail_abstract_second.carbon:[[@LINE+7]]:11: error: binding pattern has abstract type `({}, Abstract7)` in `var` pattern [AbstractTypeInVarPattern] + // CHECK:STDERR: var v4: ({}, Abstract7); + // CHECK:STDERR: ^~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_abstract_second.carbon:[[@LINE-6]]:1: note: uses class that was declared abstract here [ClassAbstractHere] + // CHECK:STDERR: abstract class Abstract7 {} + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + var v4: ({}, Abstract7); +} + +// --- lib.carbon +library "[[@TEST_NAME]]"; + +abstract class Abstract {} + +// --- fail_import.carbon +library "[[@TEST_NAME]]"; + +import library "lib"; + +fn Var5() { + // CHECK:STDERR: fail_import.carbon:[[@LINE+8]]:11: error: binding pattern has abstract type `(Abstract,)` in `var` pattern [AbstractTypeInVarPattern] + // CHECK:STDERR: var v5: (Abstract,); + // CHECK:STDERR: ^~~~~~~~~~~ + // CHECK:STDERR: fail_import.carbon:[[@LINE-6]]:1: in import [InImport] + // CHECK:STDERR: lib.carbon:3:1: note: uses class that was declared abstract here [ClassAbstractHere] + // CHECK:STDERR: abstract class Abstract {} + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + var v5: (Abstract,); +} + +// CHECK:STDOUT: --- abstract_let.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %Abstract3: type = class_type @Abstract3 [concrete] +// CHECK:STDOUT: %tuple.type.85c: type = tuple_type (type) [concrete] +// CHECK:STDOUT: %tuple.type.fa1: type = tuple_type (%Abstract3) [concrete] +// CHECK:STDOUT: %pattern_type.3cf: type = pattern_type %tuple.type.fa1 [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @F(%a.param: %Abstract3) { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %l.patt: %pattern_type.3cf = binding_pattern l [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: %a.ref: %Abstract3 = name_ref a, %a +// CHECK:STDOUT: %.loc8_28: %tuple.type.fa1 = tuple_literal (%a.ref) +// CHECK:STDOUT: %.loc8_21.1: type = splice_block %.loc8_21.3 [concrete = constants.%tuple.type.fa1] { +// CHECK:STDOUT: %Abstract3.ref.loc8: type = name_ref Abstract3, file.%Abstract3.decl [concrete = constants.%Abstract3] +// CHECK:STDOUT: %.loc8_21.2: %tuple.type.85c = tuple_literal (%Abstract3.ref.loc8) +// CHECK:STDOUT: %.loc8_21.3: type = converted %.loc8_21.2, constants.%tuple.type.fa1 [concrete = constants.%tuple.type.fa1] +// CHECK:STDOUT: } +// CHECK:STDOUT: %l: %tuple.type.fa1 = bind_name l, +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/min_prelude/bad_conversions.carbon b/toolchain/check/testdata/class/min_prelude/bad_conversions.carbon new file mode 100644 index 0000000000000..3affd0f3a842e --- /dev/null +++ b/toolchain/check/testdata/class/min_prelude/bad_conversions.carbon @@ -0,0 +1,86 @@ +// Part of the Carbon Language project, under the Apache License v2.0 with LLVM +// Exceptions. See /LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// INCLUDE-FILE: toolchain/testing/min_prelude/convert.carbon +// +// AUTOUPDATE +// TIP: To test this file alone, run: +// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/min_prelude/bad_conversions.carbon +// TIP: To dump output, run: +// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/min_prelude/bad_conversions.carbon + +// --- fail_compound_type_mismatch.carbon + +library "[[@TEST_NAME]]"; + +class A { + var a: {}; +} + +class B { + var b: {}; +} + +fn AccessBInA(a: A) -> {} { + // CHECK:STDERR: fail_compound_type_mismatch.carbon:[[@LINE+7]]:10: error: cannot implicitly convert expression of type `A` to `B` [ConversionFailure] + // CHECK:STDERR: return a.(B.b); + // CHECK:STDERR: ^~~~~~~ + // CHECK:STDERR: fail_compound_type_mismatch.carbon:[[@LINE+4]]:10: note: type `A` does not implement interface `Core.ImplicitAs(B)` [MissingImplInMemberAccessNote] + // CHECK:STDERR: return a.(B.b); + // CHECK:STDERR: ^~~~~~~ + // CHECK:STDERR: + return a.(B.b); +} + +// --- fail_convert_to_invalid.carbon + +library "[[@TEST_NAME]]"; + +class C { + // CHECK:STDERR: fail_convert_to_invalid.carbon:[[@LINE+4]]:10: error: name `NoSuchType` not found [NameNotFound] + // CHECK:STDERR: var a: NoSuchType; + // CHECK:STDERR: ^~~~~~~~~~ + // CHECK:STDERR: + var a: NoSuchType; +} + +fn Make() -> C { + return {.a = 123}; +} + +// --- fail_derived_to_base.carbon + +base class A1 { + var a: (); +} + +base class A2 { + var a: (); +} + +class B2 { + extend base: A2; + var b: (); +} + +// CHECK:STDERR: fail_derived_to_base.carbon:[[@LINE+7]]:38: error: cannot implicitly convert expression of type `B2*` to `A1*` [ConversionFailure] +// CHECK:STDERR: fn ConvertUnrelated(p: B2*) -> A1* { return p; } +// CHECK:STDERR: ^~~~~~~~~ +// CHECK:STDERR: fail_derived_to_base.carbon:[[@LINE+4]]:38: note: type `B2*` does not implement interface `Core.ImplicitAs(A1*)` [MissingImplInMemberAccessNote] +// CHECK:STDERR: fn ConvertUnrelated(p: B2*) -> A1* { return p; } +// CHECK:STDERR: ^~~~~~~~~ +// CHECK:STDERR: +fn ConvertUnrelated(p: B2*) -> A1* { return p; } + +class Incomplete; + +// CHECK:STDERR: fail_derived_to_base.carbon:[[@LINE+7]]:47: error: cannot implicitly convert expression of type `Incomplete*` to `A2*` [ConversionFailure] +// CHECK:STDERR: fn ConvertIncomplete(p: Incomplete*) -> A2* { return p; } +// CHECK:STDERR: ^~~~~~~~~ +// CHECK:STDERR: fail_derived_to_base.carbon:[[@LINE+4]]:47: note: type `Incomplete*` does not implement interface `Core.ImplicitAs(A2*)` [MissingImplInMemberAccessNote] +// CHECK:STDERR: fn ConvertIncomplete(p: Incomplete*) -> A2* { return p; } +// CHECK:STDERR: ^~~~~~~~~ +// CHECK:STDERR: +fn ConvertIncomplete(p: Incomplete*) -> A2* { return p; } diff --git a/toolchain/check/testdata/class/min_prelude/base_bad_type.carbon b/toolchain/check/testdata/class/min_prelude/base_bad_type.carbon new file mode 100644 index 0000000000000..4c0d6332b1fc4 --- /dev/null +++ b/toolchain/check/testdata/class/min_prelude/base_bad_type.carbon @@ -0,0 +1,190 @@ +// Part of the Carbon Language project, under the Apache License v2.0 with LLVM +// Exceptions. See /LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// INCLUDE-FILE: toolchain/testing/min_prelude/convert.carbon +// +// AUTOUPDATE +// TIP: To test this file alone, run: +// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/min_prelude/base_bad_type.carbon +// TIP: To dump output, run: +// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/min_prelude/base_bad_type.carbon + +// --- fail_derive_from_error.carbon + +library "[[@TEST_NAME]]"; + +class DeriveFromError { + // CHECK:STDERR: fail_derive_from_error.carbon:[[@LINE+4]]:16: error: name `error` not found [NameNotFound] + // CHECK:STDERR: extend base: error; + // CHECK:STDERR: ^~~~~ + // CHECK:STDERR: + extend base: error; +} + +// This should not produce an error. +fn AccessMemberWithInvalidBaseError(p: DeriveFromError*) -> {} { return (*p).n; } + +// --- fail_derive_from_non_type.carbon + +library "[[@TEST_NAME]]"; + +class DeriveFromNonType { + // CHECK:STDERR: fail_derive_from_non_type.carbon:[[@LINE+7]]:16: error: cannot implicitly convert non-type value of type `Core.IntLiteral` to `type` [ConversionFailureNonTypeToFacet] + // CHECK:STDERR: extend base: 32; + // CHECK:STDERR: ^~ + // CHECK:STDERR: fail_derive_from_non_type.carbon:[[@LINE+4]]:16: note: type `Core.IntLiteral` does not implement interface `Core.ImplicitAs(type)` [MissingImplInMemberAccessNote] + // CHECK:STDERR: extend base: 32; + // CHECK:STDERR: ^~ + // CHECK:STDERR: + extend base: 32; +} + +fn AccessMemberWithInvalidBasNonType(p: DeriveFromNonType*) -> {} { return (*p).n; } + +// --- fail_derive_from_{}.carbon + +library "[[@TEST_NAME]]"; + +// CHECK:STDERR: fail_derive_from_{}.carbon:[[@LINE+8]]:20: error: unrecognized declaration introducer [UnrecognizedDecl] +// CHECK:STDERR: class DeriveFrom{} { +// CHECK:STDERR: ^ +// CHECK:STDERR: +// CHECK:STDERR: fail_derive_from_{}.carbon:[[@LINE+4]]:20: error: semantics TODO: `handle invalid parse trees in `check`` [SemanticsTodo] +// CHECK:STDERR: class DeriveFrom{} { +// CHECK:STDERR: ^ +// CHECK:STDERR: +class DeriveFrom{} { + extend base: {}; +} + +// It's not really important whether this conversion produces an error or not, +// but it shouldn't crash. +// CHECK:STDERR: fail_derive_from_{}.carbon:[[@LINE+4]]:22: error: unrecognized declaration introducer [UnrecognizedDecl] +// CHECK:STDERR: fn ConvertToBadBase{}(p: DeriveFrom{}*) -> {}* { return p; } +// CHECK:STDERR: ^ +// CHECK:STDERR: +fn ConvertToBadBase{}(p: DeriveFrom{}*) -> {}* { return p; } + +// CHECK:STDERR: fail_derive_from_{}.carbon:[[@LINE+4]]:33: error: unrecognized declaration introducer [UnrecognizedDecl] +// CHECK:STDERR: fn AccessMemberWithInvalidBase{}(p: DeriveFrom{}*) -> {} { return (*p).n; } +// CHECK:STDERR: ^ +// CHECK:STDERR: +fn AccessMemberWithInvalidBase{}(p: DeriveFrom{}*) -> {} { return (*p).n; } + +// --- fail_derive_from_tuple.carbon + +library "[[@TEST_NAME]]"; + +base class Base {} + +class DeriveFromTuple { + // CHECK:STDERR: fail_derive_from_tuple.carbon:[[@LINE+4]]:16: error: deriving from final type `(Base,)`; base type must be an `abstract` or `base` class [BaseIsFinal] + // CHECK:STDERR: extend base: (Base,); + // CHECK:STDERR: ^~~~~~~ + // CHECK:STDERR: + extend base: (Base,); +} + +// CHECK:STDERR: fail_derive_from_tuple.carbon:[[@LINE+7]]:61: error: cannot implicitly convert expression of type `DeriveFromTuple*` to `(Base,)*` [ConversionFailure] +// CHECK:STDERR: fn ConvertToBadBaseTuple(p: DeriveFromTuple*) -> (Base,)* { return p; } +// CHECK:STDERR: ^~~~~~~~~ +// CHECK:STDERR: fail_derive_from_tuple.carbon:[[@LINE+4]]:61: note: type `DeriveFromTuple*` does not implement interface `Core.ImplicitAs((Base,)*)` [MissingImplInMemberAccessNote] +// CHECK:STDERR: fn ConvertToBadBaseTuple(p: DeriveFromTuple*) -> (Base,)* { return p; } +// CHECK:STDERR: ^~~~~~~~~ +// CHECK:STDERR: +fn ConvertToBadBaseTuple(p: DeriveFromTuple*) -> (Base,)* { return p; } + +fn AccessMemberWithInvalidBaseTuple(p: DeriveFromTuple*) -> {} { return (*p).n; } + +// --- fail_derive_from_struct.carbon + +library "[[@TEST_NAME]]"; + +// TODO: Should we allow this? +// We do allow `{.base = {.a: {}, .b: {}}}`. +class DeriveFromStruct { + // CHECK:STDERR: fail_derive_from_struct.carbon:[[@LINE+4]]:16: error: deriving from final type `{.a: {}, .b: {}}`; base type must be an `abstract` or `base` class [BaseIsFinal] + // CHECK:STDERR: extend base: {.a: {}, .b: {}}; + // CHECK:STDERR: ^~~~~~~~~~~~~~~~ + // CHECK:STDERR: + extend base: {.a: {}, .b: {}}; +} + +// CHECK:STDERR: fail_derive_from_struct.carbon:[[@LINE+7]]:72: error: cannot implicitly convert expression of type `DeriveFromStruct*` to `{.a: {}, .b: {}}*` [ConversionFailure] +// CHECK:STDERR: fn ConvertToBadBaseStruct(p: DeriveFromStruct*) -> {.a: {}, .b: {}}* { return p; } +// CHECK:STDERR: ^~~~~~~~~ +// CHECK:STDERR: fail_derive_from_struct.carbon:[[@LINE+4]]:72: note: type `DeriveFromStruct*` does not implement interface `Core.ImplicitAs({.a: {}, .b: {}}*)` [MissingImplInMemberAccessNote] +// CHECK:STDERR: fn ConvertToBadBaseStruct(p: DeriveFromStruct*) -> {.a: {}, .b: {}}* { return p; } +// CHECK:STDERR: ^~~~~~~~~ +// CHECK:STDERR: +fn ConvertToBadBaseStruct(p: DeriveFromStruct*) -> {.a: {}, .b: {}}* { return p; } + +// It would be OK to reject this if we start actually looking in the struct type. +fn AccessMemberWithInvalidBaseStruct(p: DeriveFromStruct*) -> {} { return (*p).n; } + +// --- fail_derive_from_incomplete.carbon + +library "[[@TEST_NAME]]"; + +// CHECK:STDERR: fail_derive_from_incomplete.carbon:[[@LINE+4]]:1: error: `base` not allowed on `class` forward declaration, only definition [ModifierOnlyAllowedOnDefinition] +// CHECK:STDERR: base class Incomplete; +// CHECK:STDERR: ^~~~ +// CHECK:STDERR: +base class Incomplete; + +class DeriveFromIncomplete { + // CHECK:STDERR: fail_derive_from_incomplete.carbon:[[@LINE+7]]:16: error: base `Incomplete` is an incomplete type [IncompleteTypeInBaseDecl] + // CHECK:STDERR: extend base: Incomplete; + // CHECK:STDERR: ^~~~~~~~~~ + // CHECK:STDERR: fail_derive_from_incomplete.carbon:[[@LINE-6]]:1: note: class was forward declared here [ClassForwardDeclaredHere] + // CHECK:STDERR: base class Incomplete; + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + extend base: Incomplete; +} + +// CHECK:STDERR: fail_derive_from_incomplete.carbon:[[@LINE+7]]:74: error: cannot implicitly convert expression of type `DeriveFromIncomplete*` to `Incomplete*` [ConversionFailure] +// CHECK:STDERR: fn ConvertToBadBaseIncomplete(p: DeriveFromIncomplete*) -> Incomplete* { return p; } +// CHECK:STDERR: ^~~~~~~~~ +// CHECK:STDERR: fail_derive_from_incomplete.carbon:[[@LINE+4]]:74: note: type `DeriveFromIncomplete*` does not implement interface `Core.ImplicitAs(Incomplete*)` [MissingImplInMemberAccessNote] +// CHECK:STDERR: fn ConvertToBadBaseIncomplete(p: DeriveFromIncomplete*) -> Incomplete* { return p; } +// CHECK:STDERR: ^~~~~~~~~ +// CHECK:STDERR: +fn ConvertToBadBaseIncomplete(p: DeriveFromIncomplete*) -> Incomplete* { return p; } + +fn AccessMemberWithInvalidBaseIncomplete(p: DeriveFromIncomplete*) -> {} { return (*p).n; } + +// --- fail_derive_from_final.carbon + +library "[[@TEST_NAME]]"; + +class Final { + var a: {}; +} + +class DeriveFromFinal { + // CHECK:STDERR: fail_derive_from_final.carbon:[[@LINE+4]]:16: error: deriving from final type `Final`; base type must be an `abstract` or `base` class [BaseIsFinal] + // CHECK:STDERR: extend base: Final; + // CHECK:STDERR: ^~~~~ + // CHECK:STDERR: + extend base: Final; +} + +// For error recovery purposes, we derive from the final type anyway. +fn ConvertToBadBaseFinal(p: DeriveFromFinal*) -> Final* { + return p; +} + +fn AccessMemberWithInvalidBaseFinal_WithMember(p: DeriveFromFinal*) -> {} { + return (*p).a; +} + +fn AccessMemberWithInvalidBaseFinal_NoMember(p: DeriveFromFinal*) -> {} { + // CHECK:STDERR: fail_derive_from_final.carbon:[[@LINE+4]]:10: error: member name `b` not found in `DeriveFromFinal` [MemberNameNotFoundInInstScope] + // CHECK:STDERR: return (*p).b; + // CHECK:STDERR: ^~~~~~ + // CHECK:STDERR: + return (*p).b; +} diff --git a/toolchain/check/testdata/class/min_prelude/derived_to_base.carbon b/toolchain/check/testdata/class/min_prelude/derived_to_base.carbon new file mode 100644 index 0000000000000..2510724dccbd2 --- /dev/null +++ b/toolchain/check/testdata/class/min_prelude/derived_to_base.carbon @@ -0,0 +1,305 @@ +// Part of the Carbon Language project, under the Apache License v2.0 with LLVM +// Exceptions. See /LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// INCLUDE-FILE: toolchain/testing/min_prelude/convert.carbon +// +// AUTOUPDATE +// TIP: To test this file alone, run: +// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/min_prelude/derived_to_base.carbon +// TIP: To dump output, run: +// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/min_prelude/derived_to_base.carbon + +// --- derived_to_base.carbon + +library "[[@TEST_NAME]]"; + +base class A { + var a: (); +} + +base class B { + extend base: A; + var b: (); +} + +class C { + extend base: B; + var c: (); +} + +//@dump-sem-ir-begin +fn ConvertCToB(p: C*) -> B* { return p; } +fn ConvertBToA(p: B*) -> A* { return p; } +fn ConvertCToA(p: C*) -> A* { return p; } + +fn ConvertValue(c: C) { + let a: A = c; +} + +fn ConvertRef(c: C*) -> A* { + return &(*c as A); +} + +fn ConvertInit() { + let a: A = {.base = {.base = {.a = ()}, .b = ()}, .c = ()} as C; +} +//@dump-sem-ir-end + +// --- fail_derived_to_base.carbon + +// CHECK:STDERR: fail_derived_to_base.carbon:[[@LINE+4]]:1: error: library's API previously provided by `derived_to_base.carbon` [DuplicateLibraryApi] +// CHECK:STDERR: library "derived_to_base"; +// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~ +// CHECK:STDERR: +library "[[@TEST_NAME]]"; + +base class A1 { + var a: (); +} + +base class A2 { + var a: (); +} + +class B2 { + extend base: A2; + var b: (); +} + +// CHECK:STDERR: fail_derived_to_base.carbon:[[@LINE+7]]:38: error: cannot implicitly convert expression of type `B2*` to `A1*` [ConversionFailure] +// CHECK:STDERR: fn ConvertUnrelated(p: B2*) -> A1* { return p; } +// CHECK:STDERR: ^~~~~~~~~ +// CHECK:STDERR: fail_derived_to_base.carbon:[[@LINE+4]]:38: note: type `B2*` does not implement interface `Core.ImplicitAs(A1*)` [MissingImplInMemberAccessNote] +// CHECK:STDERR: fn ConvertUnrelated(p: B2*) -> A1* { return p; } +// CHECK:STDERR: ^~~~~~~~~ +// CHECK:STDERR: +fn ConvertUnrelated(p: B2*) -> A1* { return p; } + +class Incomplete; + +// CHECK:STDERR: fail_derived_to_base.carbon:[[@LINE+7]]:47: error: cannot implicitly convert expression of type `Incomplete*` to `A2*` [ConversionFailure] +// CHECK:STDERR: fn ConvertIncomplete(p: Incomplete*) -> A2* { return p; } +// CHECK:STDERR: ^~~~~~~~~ +// CHECK:STDERR: fail_derived_to_base.carbon:[[@LINE+4]]:47: note: type `Incomplete*` does not implement interface `Core.ImplicitAs(A2*)` [MissingImplInMemberAccessNote] +// CHECK:STDERR: fn ConvertIncomplete(p: Incomplete*) -> A2* { return p; } +// CHECK:STDERR: ^~~~~~~~~ +// CHECK:STDERR: +fn ConvertIncomplete(p: Incomplete*) -> A2* { return p; } + +// CHECK:STDOUT: --- derived_to_base.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %A: type = class_type @A [concrete] +// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] +// CHECK:STDOUT: %struct_type.a: type = struct_type {.a: %empty_tuple.type} [concrete] +// CHECK:STDOUT: %B: type = class_type @B [concrete] +// CHECK:STDOUT: %C: type = class_type @C [concrete] +// CHECK:STDOUT: %ptr.019: type = ptr_type %C [concrete] +// CHECK:STDOUT: %pattern_type.44a: type = pattern_type %ptr.019 [concrete] +// CHECK:STDOUT: %ptr.e79: type = ptr_type %B [concrete] +// CHECK:STDOUT: %pattern_type.960: type = pattern_type %ptr.e79 [concrete] +// CHECK:STDOUT: %ConvertCToB.type: type = fn_type @ConvertCToB [concrete] +// CHECK:STDOUT: %ConvertCToB: %ConvertCToB.type = struct_value () [concrete] +// CHECK:STDOUT: %ptr.6db: type = ptr_type %A [concrete] +// CHECK:STDOUT: %pattern_type.5f8: type = pattern_type %ptr.6db [concrete] +// CHECK:STDOUT: %ConvertBToA.type: type = fn_type @ConvertBToA [concrete] +// CHECK:STDOUT: %ConvertBToA: %ConvertBToA.type = struct_value () [concrete] +// CHECK:STDOUT: %ConvertCToA.type: type = fn_type @ConvertCToA [concrete] +// CHECK:STDOUT: %ConvertCToA: %ConvertCToA.type = struct_value () [concrete] +// CHECK:STDOUT: %pattern_type.c48: type = pattern_type %C [concrete] +// CHECK:STDOUT: %ConvertValue.type: type = fn_type @ConvertValue [concrete] +// CHECK:STDOUT: %ConvertValue: %ConvertValue.type = struct_value () [concrete] +// CHECK:STDOUT: %pattern_type.c10: type = pattern_type %A [concrete] +// CHECK:STDOUT: %ConvertRef.type: type = fn_type @ConvertRef [concrete] +// CHECK:STDOUT: %ConvertRef: %ConvertRef.type = struct_value () [concrete] +// CHECK:STDOUT: %ConvertInit.type: type = fn_type @ConvertInit [concrete] +// CHECK:STDOUT: %ConvertInit: %ConvertInit.type = struct_value () [concrete] +// CHECK:STDOUT: %struct_type.base.b.8ca: type = struct_type {.base: %struct_type.a, .b: %empty_tuple.type} [concrete] +// CHECK:STDOUT: %struct_type.base.c.7dc: type = struct_type {.base: %struct_type.base.b.8ca, .c: %empty_tuple.type} [concrete] +// CHECK:STDOUT: %empty_tuple: %empty_tuple.type = tuple_value () [concrete] +// CHECK:STDOUT: %A.val: %A = struct_value (%empty_tuple) [concrete] +// CHECK:STDOUT: %B.val: %B = struct_value (%A.val, %empty_tuple) [concrete] +// CHECK:STDOUT: %C.val: %C = struct_value (%B.val, %empty_tuple) [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: file { +// CHECK:STDOUT: %ConvertCToB.decl: %ConvertCToB.type = fn_decl @ConvertCToB [concrete = constants.%ConvertCToB] { +// CHECK:STDOUT: %p.patt: %pattern_type.44a = binding_pattern p [concrete] +// CHECK:STDOUT: %p.param_patt: %pattern_type.44a = value_param_pattern %p.patt, call_param0 [concrete] +// CHECK:STDOUT: %return.patt: %pattern_type.960 = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: %pattern_type.960 = out_param_pattern %return.patt, call_param1 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %B.ref: type = name_ref B, file.%B.decl [concrete = constants.%B] +// CHECK:STDOUT: %ptr.loc19_27: type = ptr_type %B.ref [concrete = constants.%ptr.e79] +// CHECK:STDOUT: %p.param: %ptr.019 = value_param call_param0 +// CHECK:STDOUT: %.loc19_20: type = splice_block %ptr.loc19_20 [concrete = constants.%ptr.019] { +// CHECK:STDOUT: %C.ref: type = name_ref C, file.%C.decl [concrete = constants.%C] +// CHECK:STDOUT: %ptr.loc19_20: type = ptr_type %C.ref [concrete = constants.%ptr.019] +// CHECK:STDOUT: } +// CHECK:STDOUT: %p: %ptr.019 = bind_name p, %p.param +// CHECK:STDOUT: %return.param: ref %ptr.e79 = out_param call_param1 +// CHECK:STDOUT: %return: ref %ptr.e79 = return_slot %return.param +// CHECK:STDOUT: } +// CHECK:STDOUT: %ConvertBToA.decl: %ConvertBToA.type = fn_decl @ConvertBToA [concrete = constants.%ConvertBToA] { +// CHECK:STDOUT: %p.patt: %pattern_type.960 = binding_pattern p [concrete] +// CHECK:STDOUT: %p.param_patt: %pattern_type.960 = value_param_pattern %p.patt, call_param0 [concrete] +// CHECK:STDOUT: %return.patt: %pattern_type.5f8 = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: %pattern_type.5f8 = out_param_pattern %return.patt, call_param1 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %A.ref: type = name_ref A, file.%A.decl [concrete = constants.%A] +// CHECK:STDOUT: %ptr.loc20_27: type = ptr_type %A.ref [concrete = constants.%ptr.6db] +// CHECK:STDOUT: %p.param: %ptr.e79 = value_param call_param0 +// CHECK:STDOUT: %.loc20_20: type = splice_block %ptr.loc20_20 [concrete = constants.%ptr.e79] { +// CHECK:STDOUT: %B.ref: type = name_ref B, file.%B.decl [concrete = constants.%B] +// CHECK:STDOUT: %ptr.loc20_20: type = ptr_type %B.ref [concrete = constants.%ptr.e79] +// CHECK:STDOUT: } +// CHECK:STDOUT: %p: %ptr.e79 = bind_name p, %p.param +// CHECK:STDOUT: %return.param: ref %ptr.6db = out_param call_param1 +// CHECK:STDOUT: %return: ref %ptr.6db = return_slot %return.param +// CHECK:STDOUT: } +// CHECK:STDOUT: %ConvertCToA.decl: %ConvertCToA.type = fn_decl @ConvertCToA [concrete = constants.%ConvertCToA] { +// CHECK:STDOUT: %p.patt: %pattern_type.44a = binding_pattern p [concrete] +// CHECK:STDOUT: %p.param_patt: %pattern_type.44a = value_param_pattern %p.patt, call_param0 [concrete] +// CHECK:STDOUT: %return.patt: %pattern_type.5f8 = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: %pattern_type.5f8 = out_param_pattern %return.patt, call_param1 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %A.ref: type = name_ref A, file.%A.decl [concrete = constants.%A] +// CHECK:STDOUT: %ptr.loc21_27: type = ptr_type %A.ref [concrete = constants.%ptr.6db] +// CHECK:STDOUT: %p.param: %ptr.019 = value_param call_param0 +// CHECK:STDOUT: %.loc21_20: type = splice_block %ptr.loc21_20 [concrete = constants.%ptr.019] { +// CHECK:STDOUT: %C.ref: type = name_ref C, file.%C.decl [concrete = constants.%C] +// CHECK:STDOUT: %ptr.loc21_20: type = ptr_type %C.ref [concrete = constants.%ptr.019] +// CHECK:STDOUT: } +// CHECK:STDOUT: %p: %ptr.019 = bind_name p, %p.param +// CHECK:STDOUT: %return.param: ref %ptr.6db = out_param call_param1 +// CHECK:STDOUT: %return: ref %ptr.6db = return_slot %return.param +// CHECK:STDOUT: } +// CHECK:STDOUT: %ConvertValue.decl: %ConvertValue.type = fn_decl @ConvertValue [concrete = constants.%ConvertValue] { +// CHECK:STDOUT: %c.patt: %pattern_type.c48 = binding_pattern c [concrete] +// CHECK:STDOUT: %c.param_patt: %pattern_type.c48 = value_param_pattern %c.patt, call_param0 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %c.param: %C = value_param call_param0 +// CHECK:STDOUT: %C.ref: type = name_ref C, file.%C.decl [concrete = constants.%C] +// CHECK:STDOUT: %c: %C = bind_name c, %c.param +// CHECK:STDOUT: } +// CHECK:STDOUT: %ConvertRef.decl: %ConvertRef.type = fn_decl @ConvertRef [concrete = constants.%ConvertRef] { +// CHECK:STDOUT: %c.patt: %pattern_type.44a = binding_pattern c [concrete] +// CHECK:STDOUT: %c.param_patt: %pattern_type.44a = value_param_pattern %c.patt, call_param0 [concrete] +// CHECK:STDOUT: %return.patt: %pattern_type.5f8 = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: %pattern_type.5f8 = out_param_pattern %return.patt, call_param1 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %A.ref.loc27: type = name_ref A, file.%A.decl [concrete = constants.%A] +// CHECK:STDOUT: %ptr.loc27_26: type = ptr_type %A.ref.loc27 [concrete = constants.%ptr.6db] +// CHECK:STDOUT: %c.param: %ptr.019 = value_param call_param0 +// CHECK:STDOUT: %.loc27: type = splice_block %ptr.loc27_19 [concrete = constants.%ptr.019] { +// CHECK:STDOUT: %C.ref: type = name_ref C, file.%C.decl [concrete = constants.%C] +// CHECK:STDOUT: %ptr.loc27_19: type = ptr_type %C.ref [concrete = constants.%ptr.019] +// CHECK:STDOUT: } +// CHECK:STDOUT: %c: %ptr.019 = bind_name c, %c.param +// CHECK:STDOUT: %return.param: ref %ptr.6db = out_param call_param1 +// CHECK:STDOUT: %return: ref %ptr.6db = return_slot %return.param +// CHECK:STDOUT: } +// CHECK:STDOUT: %ConvertInit.decl: %ConvertInit.type = fn_decl @ConvertInit [concrete = constants.%ConvertInit] {} {} +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @ConvertCToB(%p.param: %ptr.019) -> %ptr.e79 { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %p.ref: %ptr.019 = name_ref p, %p +// CHECK:STDOUT: %.loc19_39.1: ref %C = deref %p.ref +// CHECK:STDOUT: %.loc19_39.2: ref %B = class_element_access %.loc19_39.1, element0 +// CHECK:STDOUT: %addr: %ptr.e79 = addr_of %.loc19_39.2 +// CHECK:STDOUT: %.loc19_39.3: %ptr.e79 = converted %p.ref, %addr +// CHECK:STDOUT: return %.loc19_39.3 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @ConvertBToA(%p.param: %ptr.e79) -> %ptr.6db { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %p.ref: %ptr.e79 = name_ref p, %p +// CHECK:STDOUT: %.loc20_39.1: ref %B = deref %p.ref +// CHECK:STDOUT: %.loc20_39.2: ref %A = class_element_access %.loc20_39.1, element0 +// CHECK:STDOUT: %addr: %ptr.6db = addr_of %.loc20_39.2 +// CHECK:STDOUT: %.loc20_39.3: %ptr.6db = converted %p.ref, %addr +// CHECK:STDOUT: return %.loc20_39.3 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @ConvertCToA(%p.param: %ptr.019) -> %ptr.6db { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %p.ref: %ptr.019 = name_ref p, %p +// CHECK:STDOUT: %.loc21_39.1: ref %C = deref %p.ref +// CHECK:STDOUT: %.loc21_39.2: ref %B = class_element_access %.loc21_39.1, element0 +// CHECK:STDOUT: %.loc21_39.3: ref %A = class_element_access %.loc21_39.2, element0 +// CHECK:STDOUT: %addr: %ptr.6db = addr_of %.loc21_39.3 +// CHECK:STDOUT: %.loc21_39.4: %ptr.6db = converted %p.ref, %addr +// CHECK:STDOUT: return %.loc21_39.4 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @ConvertValue(%c.param: %C) { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %a.patt: %pattern_type.c10 = binding_pattern a [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: %c.ref: %C = name_ref c, %c +// CHECK:STDOUT: %A.ref: type = name_ref A, file.%A.decl [concrete = constants.%A] +// CHECK:STDOUT: %.loc24_14.1: ref %B = class_element_access %c.ref, element0 +// CHECK:STDOUT: %.loc24_14.2: ref %A = class_element_access %.loc24_14.1, element0 +// CHECK:STDOUT: %.loc24_14.3: ref %A = converted %c.ref, %.loc24_14.2 +// CHECK:STDOUT: %a: ref %A = bind_name a, %.loc24_14.3 +// CHECK:STDOUT: return +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @ConvertRef(%c.param: %ptr.019) -> %ptr.6db { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %c.ref: %ptr.019 = name_ref c, %c +// CHECK:STDOUT: %.loc28_12: ref %C = deref %c.ref +// CHECK:STDOUT: %A.ref.loc28: type = name_ref A, file.%A.decl [concrete = constants.%A] +// CHECK:STDOUT: %.loc28_15.1: ref %B = class_element_access %.loc28_12, element0 +// CHECK:STDOUT: %.loc28_15.2: ref %A = class_element_access %.loc28_15.1, element0 +// CHECK:STDOUT: %.loc28_15.3: ref %A = converted %.loc28_12, %.loc28_15.2 +// CHECK:STDOUT: %addr: %ptr.6db = addr_of %.loc28_15.3 +// CHECK:STDOUT: return %addr +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @ConvertInit() { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %a.patt: %pattern_type.c10 = binding_pattern a [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: %.loc32_39.1: %empty_tuple.type = tuple_literal () +// CHECK:STDOUT: %.loc32_40.1: %struct_type.a = struct_literal (%.loc32_39.1) +// CHECK:STDOUT: %.loc32_49.1: %empty_tuple.type = tuple_literal () +// CHECK:STDOUT: %.loc32_50.1: %struct_type.base.b.8ca = struct_literal (%.loc32_40.1, %.loc32_49.1) +// CHECK:STDOUT: %.loc32_59.1: %empty_tuple.type = tuple_literal () +// CHECK:STDOUT: %.loc32_60.1: %struct_type.base.c.7dc = struct_literal (%.loc32_50.1, %.loc32_59.1) +// CHECK:STDOUT: %C.ref: type = name_ref C, file.%C.decl [concrete = constants.%C] +// CHECK:STDOUT: %.loc32_60.2: ref %C = temporary_storage +// CHECK:STDOUT: %.loc32_60.3: ref %B = class_element_access %.loc32_60.2, element0 +// CHECK:STDOUT: %.loc32_50.2: ref %A = class_element_access %.loc32_60.3, element0 +// CHECK:STDOUT: %.loc32_40.2: ref %empty_tuple.type = class_element_access %.loc32_50.2, element0 +// CHECK:STDOUT: %.loc32_39.2: init %empty_tuple.type = tuple_init () to %.loc32_40.2 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc32_40.3: init %empty_tuple.type = converted %.loc32_39.1, %.loc32_39.2 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc32_40.4: init %A = class_init (%.loc32_40.3), %.loc32_50.2 [concrete = constants.%A.val] +// CHECK:STDOUT: %.loc32_50.3: init %A = converted %.loc32_40.1, %.loc32_40.4 [concrete = constants.%A.val] +// CHECK:STDOUT: %.loc32_50.4: ref %empty_tuple.type = class_element_access %.loc32_60.3, element1 +// CHECK:STDOUT: %.loc32_49.2: init %empty_tuple.type = tuple_init () to %.loc32_50.4 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc32_50.5: init %empty_tuple.type = converted %.loc32_49.1, %.loc32_49.2 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc32_50.6: init %B = class_init (%.loc32_50.3, %.loc32_50.5), %.loc32_60.3 [concrete = constants.%B.val] +// CHECK:STDOUT: %.loc32_60.4: init %B = converted %.loc32_50.1, %.loc32_50.6 [concrete = constants.%B.val] +// CHECK:STDOUT: %.loc32_60.5: ref %empty_tuple.type = class_element_access %.loc32_60.2, element1 +// CHECK:STDOUT: %.loc32_59.2: init %empty_tuple.type = tuple_init () to %.loc32_60.5 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc32_60.6: init %empty_tuple.type = converted %.loc32_59.1, %.loc32_59.2 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc32_60.7: init %C = class_init (%.loc32_60.4, %.loc32_60.6), %.loc32_60.2 [concrete = constants.%C.val] +// CHECK:STDOUT: %.loc32_60.8: ref %C = temporary %.loc32_60.2, %.loc32_60.7 +// CHECK:STDOUT: %.loc32_62.1: ref %C = converted %.loc32_60.1, %.loc32_60.8 +// CHECK:STDOUT: %A.ref: type = name_ref A, file.%A.decl [concrete = constants.%A] +// CHECK:STDOUT: %.loc32_62.2: ref %B = class_element_access %.loc32_62.1, element0 +// CHECK:STDOUT: %.loc32_62.3: ref %A = class_element_access %.loc32_62.2, element0 +// CHECK:STDOUT: %.loc32_62.4: ref %A = converted %.loc32_62.1, %.loc32_62.3 +// CHECK:STDOUT: %a: ref %A = bind_name a, %.loc32_62.4 +// CHECK:STDOUT: return +// CHECK:STDOUT: } +// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/min_prelude/destroy_calls.carbon b/toolchain/check/testdata/class/min_prelude/destroy_calls.carbon index 929045b7f541e..b3ca1eb43b8a7 100644 --- a/toolchain/check/testdata/class/min_prelude/destroy_calls.carbon +++ b/toolchain/check/testdata/class/min_prelude/destroy_calls.carbon @@ -2,6 +2,7 @@ // Exceptions. See /LICENSE for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // +// EXTRA-ARGS: --dump-sem-ir-ranges=only // INCLUDE-FILE: toolchain/testing/min_prelude/destroy.carbon // // AUTOUPDATE @@ -34,17 +35,20 @@ class WithAddr { library "[[@TEST_NAME]]"; import library "types"; +//@dump-sem-ir-begin fn F() { var no_addr: NoAddr; var explicit_return: ExplicitReturn; var with_addr: WithAddr; } +//@dump-sem-ir-end // --- nested_scope.carbon library "[[@TEST_NAME]]"; import library "types"; +//@dump-sem-ir-begin fn F() { var no_addr: NoAddr; var explicit_return: ExplicitReturn; @@ -53,12 +57,14 @@ fn F() { var in_scope: NoAddr; } } +//@dump-sem-ir-end // --- temp.carbon library "[[@TEST_NAME]]"; import library "types"; +//@dump-sem-ir-begin fn F() { // TODO: The scoping of these destroy calls is incorrect. Maybe we need to // establish statement scopes? @@ -66,6 +72,7 @@ fn F() { ExplicitReturn.Make(); WithAddr.Make(); } +//@dump-sem-ir-end // --- fail_recovery.carbon @@ -99,187 +106,25 @@ library "[[@TEST_NAME]]"; class C(template T:! type) {} +//@dump-sem-ir-begin fn F(template T:! type) { var v: C(T); } +//@dump-sem-ir-end fn G() { F({}); } -// CHECK:STDOUT: --- types.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %NoAddr: type = class_type @NoAddr [concrete] -// CHECK:STDOUT: %pattern_type.88f: type = pattern_type %NoAddr [concrete] -// CHECK:STDOUT: %Make.type.bc9: type = fn_type @Make.1 [concrete] -// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] -// CHECK:STDOUT: %Make.1be: %Make.type.bc9 = struct_value () [concrete] -// CHECK:STDOUT: %destroy.type.bc5: type = fn_type @destroy.1 [concrete] -// CHECK:STDOUT: %destroy.60f: %destroy.type.bc5 = struct_value () [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %ExplicitReturn: type = class_type @ExplicitReturn [concrete] -// CHECK:STDOUT: %pattern_type.611: type = pattern_type %ExplicitReturn [concrete] -// CHECK:STDOUT: %Make.type.378: type = fn_type @Make.2 [concrete] -// CHECK:STDOUT: %Make.960: %Make.type.378 = struct_value () [concrete] -// CHECK:STDOUT: %pattern_type.cb1: type = pattern_type %empty_tuple.type [concrete] -// CHECK:STDOUT: %destroy.type.dfa: type = fn_type @destroy.2 [concrete] -// CHECK:STDOUT: %destroy.539: %destroy.type.dfa = struct_value () [concrete] -// CHECK:STDOUT: %WithAddr: type = class_type @WithAddr [concrete] -// CHECK:STDOUT: %pattern_type.f93: type = pattern_type %WithAddr [concrete] -// CHECK:STDOUT: %Make.type.e14: type = fn_type @Make.3 [concrete] -// CHECK:STDOUT: %Make.b0a: %Make.type.e14 = struct_value () [concrete] -// CHECK:STDOUT: %ptr: type = ptr_type %WithAddr [concrete] -// CHECK:STDOUT: %pattern_type.4a0: type = pattern_type %ptr [concrete] -// CHECK:STDOUT: %pattern_type.f6d: type = pattern_type auto [concrete] -// CHECK:STDOUT: %destroy.type.02f: type = fn_type @destroy.3 [concrete] -// CHECK:STDOUT: %destroy.8d0: %destroy.type.02f = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .NoAddr = %NoAddr.decl -// CHECK:STDOUT: .ExplicitReturn = %ExplicitReturn.decl -// CHECK:STDOUT: .WithAddr = %WithAddr.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %NoAddr.decl: type = class_decl @NoAddr [concrete = constants.%NoAddr] {} {} -// CHECK:STDOUT: %ExplicitReturn.decl: type = class_decl @ExplicitReturn [concrete = constants.%ExplicitReturn] {} {} -// CHECK:STDOUT: %WithAddr.decl: type = class_decl @WithAddr [concrete = constants.%WithAddr] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @NoAddr { -// CHECK:STDOUT: %Make.decl: %Make.type.bc9 = fn_decl @Make.1 [concrete = constants.%Make.1be] { -// CHECK:STDOUT: %return.patt: %pattern_type.88f = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.88f = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %NoAddr.ref: type = name_ref NoAddr, file.%NoAddr.decl [concrete = constants.%NoAddr] -// CHECK:STDOUT: %return.param: ref %NoAddr = out_param call_param0 -// CHECK:STDOUT: %return: ref %NoAddr = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %destroy.decl: %destroy.type.bc5 = fn_decl @destroy.1 [concrete = constants.%destroy.60f] { -// CHECK:STDOUT: %self.patt: %pattern_type.88f = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.88f = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %NoAddr = value_param call_param0 -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%NoAddr [concrete = constants.%NoAddr] -// CHECK:STDOUT: %self: %NoAddr = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%NoAddr -// CHECK:STDOUT: .NoAddr = -// CHECK:STDOUT: .Make = %Make.decl -// CHECK:STDOUT: .destroy = %destroy.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @ExplicitReturn { -// CHECK:STDOUT: %Make.decl: %Make.type.378 = fn_decl @Make.2 [concrete = constants.%Make.960] { -// CHECK:STDOUT: %return.patt: %pattern_type.611 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.611 = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %ExplicitReturn.ref: type = name_ref ExplicitReturn, file.%ExplicitReturn.decl [concrete = constants.%ExplicitReturn] -// CHECK:STDOUT: %return.param: ref %ExplicitReturn = out_param call_param0 -// CHECK:STDOUT: %return: ref %ExplicitReturn = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %destroy.decl: %destroy.type.dfa = fn_decl @destroy.2 [concrete = constants.%destroy.539] { -// CHECK:STDOUT: %self.patt: %pattern_type.611 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.611 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.cb1 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.cb1 = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %.loc11_32.1: %empty_tuple.type = tuple_literal () -// CHECK:STDOUT: %.loc11_32.2: type = converted %.loc11_32.1, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] -// CHECK:STDOUT: %self.param: %ExplicitReturn = value_param call_param0 -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%ExplicitReturn [concrete = constants.%ExplicitReturn] -// CHECK:STDOUT: %self: %ExplicitReturn = bind_name self, %self.param -// CHECK:STDOUT: %return.param: ref %empty_tuple.type = out_param call_param1 -// CHECK:STDOUT: %return: ref %empty_tuple.type = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%ExplicitReturn -// CHECK:STDOUT: .ExplicitReturn = -// CHECK:STDOUT: .Make = %Make.decl -// CHECK:STDOUT: .destroy = %destroy.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @WithAddr { -// CHECK:STDOUT: %Make.decl: %Make.type.e14 = fn_decl @Make.3 [concrete = constants.%Make.b0a] { -// CHECK:STDOUT: %return.patt: %pattern_type.f93 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.f93 = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %WithAddr.ref: type = name_ref WithAddr, file.%WithAddr.decl [concrete = constants.%WithAddr] -// CHECK:STDOUT: %return.param: ref %WithAddr = out_param call_param0 -// CHECK:STDOUT: %return: ref %WithAddr = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %destroy.decl: %destroy.type.02f = fn_decl @destroy.3 [concrete = constants.%destroy.8d0] { -// CHECK:STDOUT: %self.patt: %pattern_type.4a0 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.4a0 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc16_14: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %ptr = value_param call_param0 -// CHECK:STDOUT: %.loc16_29: type = splice_block %ptr [concrete = constants.%ptr] { -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%WithAddr [concrete = constants.%WithAddr] -// CHECK:STDOUT: %ptr: type = ptr_type %Self.ref [concrete = constants.%ptr] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self: %ptr = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%WithAddr -// CHECK:STDOUT: .WithAddr = -// CHECK:STDOUT: .Make = %Make.decl -// CHECK:STDOUT: .destroy = %destroy.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Make.1() -> %NoAddr; -// CHECK:STDOUT: -// CHECK:STDOUT: fn @destroy.1(%self.param: %NoAddr); -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Make.2() -> %ExplicitReturn; -// CHECK:STDOUT: -// CHECK:STDOUT: fn @destroy.2(%self.param: %ExplicitReturn) -> %empty_tuple.type; -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Make.3() -> %WithAddr; -// CHECK:STDOUT: -// CHECK:STDOUT: fn @destroy.3(%self.param: %ptr); -// CHECK:STDOUT: // CHECK:STDOUT: --- implicit_return.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { // CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] // CHECK:STDOUT: %F: %F.type = struct_value () [concrete] // CHECK:STDOUT: %NoAddr: type = class_type @NoAddr [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] // CHECK:STDOUT: %pattern_type.88f: type = pattern_type %NoAddr [concrete] -// CHECK:STDOUT: %destroy.type.bc5: type = fn_type @destroy.1 [concrete] -// CHECK:STDOUT: %destroy.60f: %destroy.type.bc5 = struct_value () [concrete] // CHECK:STDOUT: %ExplicitReturn: type = class_type @ExplicitReturn [concrete] // CHECK:STDOUT: %pattern_type.611: type = pattern_type %ExplicitReturn [concrete] -// CHECK:STDOUT: %destroy.type.dfa: type = fn_type @destroy.2 [concrete] -// CHECK:STDOUT: %destroy.539: %destroy.type.dfa = struct_value () [concrete] // CHECK:STDOUT: %WithAddr: type = class_type @WithAddr [concrete] // CHECK:STDOUT: %pattern_type.f93: type = pattern_type %WithAddr [concrete] -// CHECK:STDOUT: %destroy.type.02f: type = fn_type @destroy.3 [concrete] -// CHECK:STDOUT: %destroy.8d0: %destroy.type.02f = struct_value () [concrete] // CHECK:STDOUT: %ptr.b4e: type = ptr_type %WithAddr [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: @@ -287,63 +132,12 @@ fn G() { F({}); } // CHECK:STDOUT: %Main.NoAddr: type = import_ref Main//types, NoAddr, loaded [concrete = constants.%NoAddr] // CHECK:STDOUT: %Main.ExplicitReturn: type = import_ref Main//types, ExplicitReturn, loaded [concrete = constants.%ExplicitReturn] // CHECK:STDOUT: %Main.WithAddr: type = import_ref Main//types, WithAddr, loaded [concrete = constants.%WithAddr] -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: } -// CHECK:STDOUT: %Main.import_ref.8f24d3.1: = import_ref Main//types, loc7_1, loaded [concrete = constants.%complete_type] -// CHECK:STDOUT: %Main.import_ref.f42 = import_ref Main//types, inst18 [no loc], unloaded -// CHECK:STDOUT: %Main.import_ref.b5b = import_ref Main//types, loc5_22, unloaded -// CHECK:STDOUT: %Main.import_ref.7fe: %destroy.type.bc5 = import_ref Main//types, loc6_27, loaded [concrete = constants.%destroy.60f] -// CHECK:STDOUT: %Main.import_ref.8f24d3.2: = import_ref Main//types, loc12_1, loaded [concrete = constants.%complete_type] -// CHECK:STDOUT: %Main.import_ref.ee7 = import_ref Main//types, inst42 [no loc], unloaded -// CHECK:STDOUT: %Main.import_ref.b14 = import_ref Main//types, loc10_30, unloaded -// CHECK:STDOUT: %Main.import_ref.83a: %destroy.type.dfa = import_ref Main//types, loc11_33, loaded [concrete = constants.%destroy.539] -// CHECK:STDOUT: %Main.import_ref.8f24d3.3: = import_ref Main//types, loc17_1, loaded [concrete = constants.%complete_type] -// CHECK:STDOUT: %Main.import_ref.95d = import_ref Main//types, inst70 [no loc], unloaded -// CHECK:STDOUT: %Main.import_ref.1cb = import_ref Main//types, loc15_24, unloaded -// CHECK:STDOUT: %Main.import_ref.54e: %destroy.type.02f = import_ref Main//types, loc16_33, loaded [concrete = constants.%destroy.8d0] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .NoAddr = imports.%Main.NoAddr -// CHECK:STDOUT: .ExplicitReturn = imports.%Main.ExplicitReturn -// CHECK:STDOUT: .WithAddr = imports.%Main.WithAddr -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %default.import = import // CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] {} {} // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: class @NoAddr [from "types.carbon"] { -// CHECK:STDOUT: complete_type_witness = imports.%Main.import_ref.8f24d3.1 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Main.import_ref.f42 -// CHECK:STDOUT: .Make = imports.%Main.import_ref.b5b -// CHECK:STDOUT: .destroy = imports.%Main.import_ref.7fe -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @ExplicitReturn [from "types.carbon"] { -// CHECK:STDOUT: complete_type_witness = imports.%Main.import_ref.8f24d3.2 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Main.import_ref.ee7 -// CHECK:STDOUT: .Make = imports.%Main.import_ref.b14 -// CHECK:STDOUT: .destroy = imports.%Main.import_ref.83a -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @WithAddr [from "types.carbon"] { -// CHECK:STDOUT: complete_type_witness = imports.%Main.import_ref.8f24d3.3 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Main.import_ref.95d -// CHECK:STDOUT: .Make = imports.%Main.import_ref.1cb -// CHECK:STDOUT: .destroy = imports.%Main.import_ref.54e -// CHECK:STDOUT: } -// CHECK:STDOUT: // CHECK:STDOUT: fn @F() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: name_binding_decl { @@ -351,8 +145,7 @@ fn G() { F({}); } // CHECK:STDOUT: %no_addr.var_patt: %pattern_type.88f = var_pattern %no_addr.patt [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: %no_addr.var: ref %NoAddr = var %no_addr.var_patt -// CHECK:STDOUT: %destroy.ref.1: %destroy.type.bc5 = name_ref destroy, imports.%Main.import_ref.7fe [concrete = constants.%destroy.60f] -// CHECK:STDOUT: %destroy.bound.1: = bound_method %no_addr.var, %destroy.ref.1 +// CHECK:STDOUT: // CHECK:STDOUT: %NoAddr.ref: type = name_ref NoAddr, imports.%Main.NoAddr [concrete = constants.%NoAddr] // CHECK:STDOUT: %no_addr: ref %NoAddr = bind_name no_addr, %no_addr.var // CHECK:STDOUT: name_binding_decl { @@ -360,8 +153,7 @@ fn G() { F({}); } // CHECK:STDOUT: %explicit_return.var_patt: %pattern_type.611 = var_pattern %explicit_return.patt [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: %explicit_return.var: ref %ExplicitReturn = var %explicit_return.var_patt -// CHECK:STDOUT: %destroy.ref.2: %destroy.type.dfa = name_ref destroy, imports.%Main.import_ref.83a [concrete = constants.%destroy.539] -// CHECK:STDOUT: %destroy.bound.2: = bound_method %explicit_return.var, %destroy.ref.2 +// CHECK:STDOUT: // CHECK:STDOUT: %ExplicitReturn.ref: type = name_ref ExplicitReturn, imports.%Main.ExplicitReturn [concrete = constants.%ExplicitReturn] // CHECK:STDOUT: %explicit_return: ref %ExplicitReturn = bind_name explicit_return, %explicit_return.var // CHECK:STDOUT: name_binding_decl { @@ -369,45 +161,29 @@ fn G() { F({}); } // CHECK:STDOUT: %with_addr.var_patt: %pattern_type.f93 = var_pattern %with_addr.patt [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: %with_addr.var: ref %WithAddr = var %with_addr.var_patt -// CHECK:STDOUT: %destroy.ref.3: %destroy.type.02f = name_ref destroy, imports.%Main.import_ref.54e [concrete = constants.%destroy.8d0] -// CHECK:STDOUT: %destroy.bound.3: = bound_method %with_addr.var, %destroy.ref.3 +// CHECK:STDOUT: // CHECK:STDOUT: %WithAddr.ref: type = name_ref WithAddr, imports.%Main.WithAddr [concrete = constants.%WithAddr] // CHECK:STDOUT: %with_addr: ref %WithAddr = bind_name with_addr, %with_addr.var // CHECK:STDOUT: %addr: %ptr.b4e = addr_of %with_addr.var -// CHECK:STDOUT: %destroy.call.1: init %empty_tuple.type = call %destroy.bound.3(%addr) -// CHECK:STDOUT: %.loc7: %ExplicitReturn = bind_value %explicit_return.var -// CHECK:STDOUT: %destroy.call.2: init %empty_tuple.type = call %destroy.bound.2(%.loc7) -// CHECK:STDOUT: %.loc6: %NoAddr = bind_value %no_addr.var -// CHECK:STDOUT: %destroy.call.3: init %empty_tuple.type = call %destroy.bound.1(%.loc6) +// CHECK:STDOUT: +// CHECK:STDOUT: %.loc8: %ExplicitReturn = bind_value %explicit_return.var +// CHECK:STDOUT: +// CHECK:STDOUT: %.loc7: %NoAddr = bind_value %no_addr.var +// CHECK:STDOUT: // CHECK:STDOUT: return // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: fn @destroy.1 [from "types.carbon"]; -// CHECK:STDOUT: -// CHECK:STDOUT: fn @destroy.2 [from "types.carbon"]; -// CHECK:STDOUT: -// CHECK:STDOUT: fn @destroy.3 [from "types.carbon"]; -// CHECK:STDOUT: // CHECK:STDOUT: --- nested_scope.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { // CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] // CHECK:STDOUT: %F: %F.type = struct_value () [concrete] // CHECK:STDOUT: %NoAddr: type = class_type @NoAddr [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] // CHECK:STDOUT: %pattern_type.88f: type = pattern_type %NoAddr [concrete] -// CHECK:STDOUT: %destroy.type.bc5: type = fn_type @destroy.1 [concrete] -// CHECK:STDOUT: %destroy.60f: %destroy.type.bc5 = struct_value () [concrete] // CHECK:STDOUT: %ExplicitReturn: type = class_type @ExplicitReturn [concrete] // CHECK:STDOUT: %pattern_type.611: type = pattern_type %ExplicitReturn [concrete] -// CHECK:STDOUT: %destroy.type.dfa: type = fn_type @destroy.2 [concrete] -// CHECK:STDOUT: %destroy.539: %destroy.type.dfa = struct_value () [concrete] // CHECK:STDOUT: %WithAddr: type = class_type @WithAddr [concrete] // CHECK:STDOUT: %pattern_type.f93: type = pattern_type %WithAddr [concrete] -// CHECK:STDOUT: %destroy.type.02f: type = fn_type @destroy.3 [concrete] -// CHECK:STDOUT: %destroy.8d0: %destroy.type.02f = struct_value () [concrete] // CHECK:STDOUT: %ptr.b4e: type = ptr_type %WithAddr [concrete] // CHECK:STDOUT: %true: bool = bool_literal true [concrete] // CHECK:STDOUT: } @@ -416,63 +192,12 @@ fn G() { F({}); } // CHECK:STDOUT: %Main.NoAddr: type = import_ref Main//types, NoAddr, loaded [concrete = constants.%NoAddr] // CHECK:STDOUT: %Main.ExplicitReturn: type = import_ref Main//types, ExplicitReturn, loaded [concrete = constants.%ExplicitReturn] // CHECK:STDOUT: %Main.WithAddr: type = import_ref Main//types, WithAddr, loaded [concrete = constants.%WithAddr] -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: } -// CHECK:STDOUT: %Main.import_ref.8f24d3.1: = import_ref Main//types, loc7_1, loaded [concrete = constants.%complete_type] -// CHECK:STDOUT: %Main.import_ref.f42 = import_ref Main//types, inst18 [no loc], unloaded -// CHECK:STDOUT: %Main.import_ref.b5b = import_ref Main//types, loc5_22, unloaded -// CHECK:STDOUT: %Main.import_ref.7fe: %destroy.type.bc5 = import_ref Main//types, loc6_27, loaded [concrete = constants.%destroy.60f] -// CHECK:STDOUT: %Main.import_ref.8f24d3.2: = import_ref Main//types, loc12_1, loaded [concrete = constants.%complete_type] -// CHECK:STDOUT: %Main.import_ref.ee7 = import_ref Main//types, inst42 [no loc], unloaded -// CHECK:STDOUT: %Main.import_ref.b14 = import_ref Main//types, loc10_30, unloaded -// CHECK:STDOUT: %Main.import_ref.83a: %destroy.type.dfa = import_ref Main//types, loc11_33, loaded [concrete = constants.%destroy.539] -// CHECK:STDOUT: %Main.import_ref.8f24d3.3: = import_ref Main//types, loc17_1, loaded [concrete = constants.%complete_type] -// CHECK:STDOUT: %Main.import_ref.95d = import_ref Main//types, inst70 [no loc], unloaded -// CHECK:STDOUT: %Main.import_ref.1cb = import_ref Main//types, loc15_24, unloaded -// CHECK:STDOUT: %Main.import_ref.54e: %destroy.type.02f = import_ref Main//types, loc16_33, loaded [concrete = constants.%destroy.8d0] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .NoAddr = imports.%Main.NoAddr -// CHECK:STDOUT: .ExplicitReturn = imports.%Main.ExplicitReturn -// CHECK:STDOUT: .WithAddr = imports.%Main.WithAddr -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %default.import = import // CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] {} {} // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: class @NoAddr [from "types.carbon"] { -// CHECK:STDOUT: complete_type_witness = imports.%Main.import_ref.8f24d3.1 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Main.import_ref.f42 -// CHECK:STDOUT: .Make = imports.%Main.import_ref.b5b -// CHECK:STDOUT: .destroy = imports.%Main.import_ref.7fe -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @ExplicitReturn [from "types.carbon"] { -// CHECK:STDOUT: complete_type_witness = imports.%Main.import_ref.8f24d3.2 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Main.import_ref.ee7 -// CHECK:STDOUT: .Make = imports.%Main.import_ref.b14 -// CHECK:STDOUT: .destroy = imports.%Main.import_ref.83a -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @WithAddr [from "types.carbon"] { -// CHECK:STDOUT: complete_type_witness = imports.%Main.import_ref.8f24d3.3 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Main.import_ref.95d -// CHECK:STDOUT: .Make = imports.%Main.import_ref.1cb -// CHECK:STDOUT: .destroy = imports.%Main.import_ref.54e -// CHECK:STDOUT: } -// CHECK:STDOUT: // CHECK:STDOUT: fn @F() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: name_binding_decl { @@ -480,17 +205,15 @@ fn G() { F({}); } // CHECK:STDOUT: %no_addr.var_patt: %pattern_type.88f = var_pattern %no_addr.patt [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: %no_addr.var: ref %NoAddr = var %no_addr.var_patt -// CHECK:STDOUT: %destroy.ref.1: %destroy.type.bc5 = name_ref destroy, imports.%Main.import_ref.7fe [concrete = constants.%destroy.60f] -// CHECK:STDOUT: %destroy.bound.1: = bound_method %no_addr.var, %destroy.ref.1 -// CHECK:STDOUT: %NoAddr.ref.loc6: type = name_ref NoAddr, imports.%Main.NoAddr [concrete = constants.%NoAddr] +// CHECK:STDOUT: +// CHECK:STDOUT: %NoAddr.ref.loc7: type = name_ref NoAddr, imports.%Main.NoAddr [concrete = constants.%NoAddr] // CHECK:STDOUT: %no_addr: ref %NoAddr = bind_name no_addr, %no_addr.var // CHECK:STDOUT: name_binding_decl { // CHECK:STDOUT: %explicit_return.patt: %pattern_type.611 = binding_pattern explicit_return [concrete] // CHECK:STDOUT: %explicit_return.var_patt: %pattern_type.611 = var_pattern %explicit_return.patt [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: %explicit_return.var: ref %ExplicitReturn = var %explicit_return.var_patt -// CHECK:STDOUT: %destroy.ref.2: %destroy.type.dfa = name_ref destroy, imports.%Main.import_ref.83a [concrete = constants.%destroy.539] -// CHECK:STDOUT: %destroy.bound.2: = bound_method %explicit_return.var, %destroy.ref.2 +// CHECK:STDOUT: // CHECK:STDOUT: %ExplicitReturn.ref: type = name_ref ExplicitReturn, imports.%Main.ExplicitReturn [concrete = constants.%ExplicitReturn] // CHECK:STDOUT: %explicit_return: ref %ExplicitReturn = bind_name explicit_return, %explicit_return.var // CHECK:STDOUT: name_binding_decl { @@ -498,8 +221,7 @@ fn G() { F({}); } // CHECK:STDOUT: %with_addr.var_patt: %pattern_type.f93 = var_pattern %with_addr.patt [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: %with_addr.var: ref %WithAddr = var %with_addr.var_patt -// CHECK:STDOUT: %destroy.ref.3: %destroy.type.02f = name_ref destroy, imports.%Main.import_ref.54e [concrete = constants.%destroy.8d0] -// CHECK:STDOUT: %destroy.bound.3: = bound_method %with_addr.var, %destroy.ref.3 +// CHECK:STDOUT: // CHECK:STDOUT: %WithAddr.ref: type = name_ref WithAddr, imports.%Main.WithAddr [concrete = constants.%WithAddr] // CHECK:STDOUT: %with_addr: ref %WithAddr = bind_name with_addr, %with_addr.var // CHECK:STDOUT: %true: bool = bool_literal true [concrete = constants.%true] @@ -511,53 +233,37 @@ fn G() { F({}); } // CHECK:STDOUT: %in_scope.var_patt: %pattern_type.88f = var_pattern %in_scope.patt [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: %in_scope.var: ref %NoAddr = var %in_scope.var_patt -// CHECK:STDOUT: %destroy.ref.4: %destroy.type.bc5 = name_ref destroy, imports.%Main.import_ref.7fe [concrete = constants.%destroy.60f] -// CHECK:STDOUT: %destroy.bound.4: = bound_method %in_scope.var, %destroy.ref.4 -// CHECK:STDOUT: %NoAddr.ref.loc10: type = name_ref NoAddr, imports.%Main.NoAddr [concrete = constants.%NoAddr] +// CHECK:STDOUT: +// CHECK:STDOUT: %NoAddr.ref.loc11: type = name_ref NoAddr, imports.%Main.NoAddr [concrete = constants.%NoAddr] // CHECK:STDOUT: %in_scope: ref %NoAddr = bind_name in_scope, %in_scope.var // CHECK:STDOUT: br !if.else // CHECK:STDOUT: // CHECK:STDOUT: !if.else: -// CHECK:STDOUT: %.loc10: %NoAddr = bind_value %in_scope.var -// CHECK:STDOUT: %destroy.call.1: init %empty_tuple.type = call %destroy.bound.4(%.loc10) +// CHECK:STDOUT: %.loc11: %NoAddr = bind_value %in_scope.var +// CHECK:STDOUT: // CHECK:STDOUT: %addr: %ptr.b4e = addr_of %with_addr.var -// CHECK:STDOUT: %destroy.call.2: init %empty_tuple.type = call %destroy.bound.3(%addr) -// CHECK:STDOUT: %.loc7: %ExplicitReturn = bind_value %explicit_return.var -// CHECK:STDOUT: %destroy.call.3: init %empty_tuple.type = call %destroy.bound.2(%.loc7) -// CHECK:STDOUT: %.loc6: %NoAddr = bind_value %no_addr.var -// CHECK:STDOUT: %destroy.call.4: init %empty_tuple.type = call %destroy.bound.1(%.loc6) +// CHECK:STDOUT: +// CHECK:STDOUT: %.loc8: %ExplicitReturn = bind_value %explicit_return.var +// CHECK:STDOUT: +// CHECK:STDOUT: %.loc7: %NoAddr = bind_value %no_addr.var +// CHECK:STDOUT: // CHECK:STDOUT: return // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: fn @destroy.1 [from "types.carbon"]; -// CHECK:STDOUT: -// CHECK:STDOUT: fn @destroy.2 [from "types.carbon"]; -// CHECK:STDOUT: -// CHECK:STDOUT: fn @destroy.3 [from "types.carbon"]; -// CHECK:STDOUT: // CHECK:STDOUT: --- temp.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { // CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] // CHECK:STDOUT: %F: %F.type = struct_value () [concrete] // CHECK:STDOUT: %NoAddr: type = class_type @NoAddr [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] // CHECK:STDOUT: %Make.type.bc9: type = fn_type @Make.1 [concrete] // CHECK:STDOUT: %Make.1be: %Make.type.bc9 = struct_value () [concrete] -// CHECK:STDOUT: %destroy.type.bc5: type = fn_type @destroy.1 [concrete] -// CHECK:STDOUT: %destroy.60f: %destroy.type.bc5 = struct_value () [concrete] // CHECK:STDOUT: %ExplicitReturn: type = class_type @ExplicitReturn [concrete] // CHECK:STDOUT: %Make.type.378: type = fn_type @Make.2 [concrete] // CHECK:STDOUT: %Make.960: %Make.type.378 = struct_value () [concrete] -// CHECK:STDOUT: %destroy.type.dfa: type = fn_type @destroy.2 [concrete] -// CHECK:STDOUT: %destroy.539: %destroy.type.dfa = struct_value () [concrete] // CHECK:STDOUT: %WithAddr: type = class_type @WithAddr [concrete] // CHECK:STDOUT: %Make.type.e14: type = fn_type @Make.3 [concrete] // CHECK:STDOUT: %Make.b0a: %Make.type.e14 = struct_value () [concrete] -// CHECK:STDOUT: %destroy.type.02f: type = fn_type @destroy.3 [concrete] -// CHECK:STDOUT: %destroy.8d0: %destroy.type.02f = struct_value () [concrete] // CHECK:STDOUT: %ptr.b4e: type = ptr_type %WithAddr [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: @@ -565,208 +271,41 @@ fn G() { F({}); } // CHECK:STDOUT: %Main.NoAddr: type = import_ref Main//types, NoAddr, loaded [concrete = constants.%NoAddr] // CHECK:STDOUT: %Main.ExplicitReturn: type = import_ref Main//types, ExplicitReturn, loaded [concrete = constants.%ExplicitReturn] // CHECK:STDOUT: %Main.WithAddr: type = import_ref Main//types, WithAddr, loaded [concrete = constants.%WithAddr] -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: } -// CHECK:STDOUT: %Main.import_ref.8f24d3.1: = import_ref Main//types, loc7_1, loaded [concrete = constants.%complete_type] -// CHECK:STDOUT: %Main.import_ref.f42 = import_ref Main//types, inst18 [no loc], unloaded // CHECK:STDOUT: %Main.import_ref.784: %Make.type.bc9 = import_ref Main//types, loc5_22, loaded [concrete = constants.%Make.1be] -// CHECK:STDOUT: %Main.import_ref.7fe: %destroy.type.bc5 = import_ref Main//types, loc6_27, loaded [concrete = constants.%destroy.60f] -// CHECK:STDOUT: %Main.import_ref.8f24d3.2: = import_ref Main//types, loc12_1, loaded [concrete = constants.%complete_type] -// CHECK:STDOUT: %Main.import_ref.ee7 = import_ref Main//types, inst42 [no loc], unloaded // CHECK:STDOUT: %Main.import_ref.8e0: %Make.type.378 = import_ref Main//types, loc10_30, loaded [concrete = constants.%Make.960] -// CHECK:STDOUT: %Main.import_ref.83a: %destroy.type.dfa = import_ref Main//types, loc11_33, loaded [concrete = constants.%destroy.539] -// CHECK:STDOUT: %Main.import_ref.8f24d3.3: = import_ref Main//types, loc17_1, loaded [concrete = constants.%complete_type] -// CHECK:STDOUT: %Main.import_ref.95d = import_ref Main//types, inst70 [no loc], unloaded // CHECK:STDOUT: %Main.import_ref.974: %Make.type.e14 = import_ref Main//types, loc15_24, loaded [concrete = constants.%Make.b0a] -// CHECK:STDOUT: %Main.import_ref.54e: %destroy.type.02f = import_ref Main//types, loc16_33, loaded [concrete = constants.%destroy.8d0] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .NoAddr = imports.%Main.NoAddr -// CHECK:STDOUT: .ExplicitReturn = imports.%Main.ExplicitReturn -// CHECK:STDOUT: .WithAddr = imports.%Main.WithAddr -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %default.import = import // CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] {} {} // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: class @NoAddr [from "types.carbon"] { -// CHECK:STDOUT: complete_type_witness = imports.%Main.import_ref.8f24d3.1 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Main.import_ref.f42 -// CHECK:STDOUT: .Make = imports.%Main.import_ref.784 -// CHECK:STDOUT: .destroy = imports.%Main.import_ref.7fe -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @ExplicitReturn [from "types.carbon"] { -// CHECK:STDOUT: complete_type_witness = imports.%Main.import_ref.8f24d3.2 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Main.import_ref.ee7 -// CHECK:STDOUT: .Make = imports.%Main.import_ref.8e0 -// CHECK:STDOUT: .destroy = imports.%Main.import_ref.83a -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @WithAddr [from "types.carbon"] { -// CHECK:STDOUT: complete_type_witness = imports.%Main.import_ref.8f24d3.3 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Main.import_ref.95d -// CHECK:STDOUT: .Make = imports.%Main.import_ref.974 -// CHECK:STDOUT: .destroy = imports.%Main.import_ref.54e -// CHECK:STDOUT: } -// CHECK:STDOUT: // CHECK:STDOUT: fn @F() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %NoAddr.ref: type = name_ref NoAddr, imports.%Main.NoAddr [concrete = constants.%NoAddr] -// CHECK:STDOUT: %Make.ref.loc8: %Make.type.bc9 = name_ref Make, imports.%Main.import_ref.784 [concrete = constants.%Make.1be] -// CHECK:STDOUT: %.loc8_15.1: ref %NoAddr = temporary_storage -// CHECK:STDOUT: %destroy.ref.1: %destroy.type.bc5 = name_ref destroy, imports.%Main.import_ref.7fe [concrete = constants.%destroy.60f] -// CHECK:STDOUT: %destroy.bound.1: = bound_method %.loc8_15.1, %destroy.ref.1 -// CHECK:STDOUT: %Make.call.loc8: init %NoAddr = call %Make.ref.loc8() to %.loc8_15.1 -// CHECK:STDOUT: %.loc8_15.2: ref %NoAddr = temporary %.loc8_15.1, %Make.call.loc8 +// CHECK:STDOUT: %Make.ref.loc9: %Make.type.bc9 = name_ref Make, imports.%Main.import_ref.784 [concrete = constants.%Make.1be] +// CHECK:STDOUT: %.loc9_15.1: ref %NoAddr = temporary_storage +// CHECK:STDOUT: +// CHECK:STDOUT: %Make.call.loc9: init %NoAddr = call %Make.ref.loc9() to %.loc9_15.1 +// CHECK:STDOUT: %.loc9_15.2: ref %NoAddr = temporary %.loc9_15.1, %Make.call.loc9 // CHECK:STDOUT: %ExplicitReturn.ref: type = name_ref ExplicitReturn, imports.%Main.ExplicitReturn [concrete = constants.%ExplicitReturn] -// CHECK:STDOUT: %Make.ref.loc9: %Make.type.378 = name_ref Make, imports.%Main.import_ref.8e0 [concrete = constants.%Make.960] -// CHECK:STDOUT: %.loc9_23.1: ref %ExplicitReturn = temporary_storage -// CHECK:STDOUT: %destroy.ref.2: %destroy.type.dfa = name_ref destroy, imports.%Main.import_ref.83a [concrete = constants.%destroy.539] -// CHECK:STDOUT: %destroy.bound.2: = bound_method %.loc9_23.1, %destroy.ref.2 -// CHECK:STDOUT: %Make.call.loc9: init %ExplicitReturn = call %Make.ref.loc9() to %.loc9_23.1 -// CHECK:STDOUT: %.loc9_23.2: ref %ExplicitReturn = temporary %.loc9_23.1, %Make.call.loc9 +// CHECK:STDOUT: %Make.ref.loc10: %Make.type.378 = name_ref Make, imports.%Main.import_ref.8e0 [concrete = constants.%Make.960] +// CHECK:STDOUT: %.loc10_23.1: ref %ExplicitReturn = temporary_storage +// CHECK:STDOUT: +// CHECK:STDOUT: %Make.call.loc10: init %ExplicitReturn = call %Make.ref.loc10() to %.loc10_23.1 +// CHECK:STDOUT: %.loc10_23.2: ref %ExplicitReturn = temporary %.loc10_23.1, %Make.call.loc10 // CHECK:STDOUT: %WithAddr.ref: type = name_ref WithAddr, imports.%Main.WithAddr [concrete = constants.%WithAddr] -// CHECK:STDOUT: %Make.ref.loc10: %Make.type.e14 = name_ref Make, imports.%Main.import_ref.974 [concrete = constants.%Make.b0a] -// CHECK:STDOUT: %.loc10_17.1: ref %WithAddr = temporary_storage -// CHECK:STDOUT: %destroy.ref.3: %destroy.type.02f = name_ref destroy, imports.%Main.import_ref.54e [concrete = constants.%destroy.8d0] -// CHECK:STDOUT: %destroy.bound.3: = bound_method %.loc10_17.1, %destroy.ref.3 -// CHECK:STDOUT: %Make.call.loc10: init %WithAddr = call %Make.ref.loc10() to %.loc10_17.1 -// CHECK:STDOUT: %.loc10_17.2: ref %WithAddr = temporary %.loc10_17.1, %Make.call.loc10 -// CHECK:STDOUT: %addr: %ptr.b4e = addr_of %.loc10_17.1 -// CHECK:STDOUT: %destroy.call.1: init %empty_tuple.type = call %destroy.bound.3(%addr) -// CHECK:STDOUT: %.loc9_23.3: %ExplicitReturn = bind_value %.loc9_23.1 -// CHECK:STDOUT: %destroy.call.2: init %empty_tuple.type = call %destroy.bound.2(%.loc9_23.3) -// CHECK:STDOUT: %.loc8_15.3: %NoAddr = bind_value %.loc8_15.1 -// CHECK:STDOUT: %destroy.call.3: init %empty_tuple.type = call %destroy.bound.1(%.loc8_15.3) -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Make.1 [from "types.carbon"]; -// CHECK:STDOUT: -// CHECK:STDOUT: fn @destroy.1 [from "types.carbon"]; -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Make.2 [from "types.carbon"]; -// CHECK:STDOUT: -// CHECK:STDOUT: fn @destroy.2 [from "types.carbon"]; -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Make.3 [from "types.carbon"]; -// CHECK:STDOUT: -// CHECK:STDOUT: fn @destroy.3 [from "types.carbon"]; -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_recovery.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %NoSelf: type = class_type @NoSelf [concrete] -// CHECK:STDOUT: %destroy.type.d69: type = fn_type @destroy.1 [concrete] -// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] -// CHECK:STDOUT: %destroy.ab7: %destroy.type.d69 = struct_value () [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %Args: type = class_type @Args [concrete] -// CHECK:STDOUT: %pattern_type.a81: type = pattern_type %Args [concrete] -// CHECK:STDOUT: %pattern_type.cb1: type = pattern_type %empty_tuple.type [concrete] -// CHECK:STDOUT: %destroy.type.ba0: type = fn_type @destroy.2 [concrete] -// CHECK:STDOUT: %destroy.723: %destroy.type.ba0 = struct_value () [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %pattern_type.9f4: type = pattern_type %NoSelf [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .NoSelf = %NoSelf.decl -// CHECK:STDOUT: .Args = %Args.decl -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %NoSelf.decl: type = class_decl @NoSelf [concrete = constants.%NoSelf] {} {} -// CHECK:STDOUT: %Args.decl: type = class_decl @Args [concrete = constants.%Args] {} {} -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @NoSelf { -// CHECK:STDOUT: %destroy.decl: %destroy.type.d69 = fn_decl @destroy.1 [concrete = constants.%destroy.ab7] {} {} -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%NoSelf -// CHECK:STDOUT: .destroy = %destroy.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Args { -// CHECK:STDOUT: %destroy.decl: %destroy.type.ba0 = fn_decl @destroy.2 [concrete = constants.%destroy.723] { -// CHECK:STDOUT: %self.patt: %pattern_type.a81 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.a81 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %x.patt: %pattern_type.cb1 = binding_pattern x [concrete] -// CHECK:STDOUT: %x.param_patt: %pattern_type.cb1 = value_param_pattern %x.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %Args = value_param call_param0 -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Args [concrete = constants.%Args] -// CHECK:STDOUT: %self: %Args = bind_name self, %self.param -// CHECK:STDOUT: %x.param: %empty_tuple.type = value_param call_param1 -// CHECK:STDOUT: %.loc17_30.1: type = splice_block %.loc17_30.3 [concrete = constants.%empty_tuple.type] { -// CHECK:STDOUT: %.loc17_30.2: %empty_tuple.type = tuple_literal () -// CHECK:STDOUT: %.loc17_30.3: type = converted %.loc17_30.2, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] -// CHECK:STDOUT: } -// CHECK:STDOUT: %x: %empty_tuple.type = bind_name x, %x.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Args -// CHECK:STDOUT: .destroy = %destroy.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @destroy.1(); -// CHECK:STDOUT: -// CHECK:STDOUT: fn @destroy.2(%self.param: %Args, %x.param: %empty_tuple.type); -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %a.patt: %pattern_type.9f4 = binding_pattern a [concrete] -// CHECK:STDOUT: %a.var_patt: %pattern_type.9f4 = var_pattern %a.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %a.var: ref %NoSelf = var %a.var_patt -// CHECK:STDOUT: %destroy.ref.1: %destroy.type.d69 = name_ref destroy, @NoSelf.%destroy.decl [concrete = constants.%destroy.ab7] -// CHECK:STDOUT: %NoSelf.ref: type = name_ref NoSelf, file.%NoSelf.decl [concrete = constants.%NoSelf] -// CHECK:STDOUT: %a: ref %NoSelf = bind_name a, %a.var -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %b.patt: %pattern_type.a81 = binding_pattern b [concrete] -// CHECK:STDOUT: %b.var_patt: %pattern_type.a81 = var_pattern %b.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %b.var: ref %Args = var %b.var_patt -// CHECK:STDOUT: %destroy.ref.2: %destroy.type.ba0 = name_ref destroy, @Args.%destroy.decl [concrete = constants.%destroy.723] -// CHECK:STDOUT: %destroy.bound: = bound_method %b.var, %destroy.ref.2 -// CHECK:STDOUT: %Args.ref: type = name_ref Args, file.%Args.decl [concrete = constants.%Args] -// CHECK:STDOUT: %b: ref %Args = bind_name b, %b.var -// CHECK:STDOUT: %.loc22: %Args = bind_value %b.var -// CHECK:STDOUT: %destroy.call.1: init %empty_tuple.type = call %destroy.bound(%.loc22) -// CHECK:STDOUT: %destroy.call.2: init %empty_tuple.type = call %destroy.ref.1() +// CHECK:STDOUT: %Make.ref.loc11: %Make.type.e14 = name_ref Make, imports.%Main.import_ref.974 [concrete = constants.%Make.b0a] +// CHECK:STDOUT: %.loc11_17.1: ref %WithAddr = temporary_storage +// CHECK:STDOUT: +// CHECK:STDOUT: %Make.call.loc11: init %WithAddr = call %Make.ref.loc11() to %.loc11_17.1 +// CHECK:STDOUT: %.loc11_17.2: ref %WithAddr = temporary %.loc11_17.1, %Make.call.loc11 +// CHECK:STDOUT: %addr: %ptr.b4e = addr_of %.loc11_17.1 +// CHECK:STDOUT: +// CHECK:STDOUT: %.loc10_23.3: %ExplicitReturn = bind_value %.loc10_23.1 +// CHECK:STDOUT: +// CHECK:STDOUT: %.loc9_15.3: %NoAddr = bind_value %.loc9_15.1 +// CHECK:STDOUT: // CHECK:STDOUT: return // CHECK:STDOUT: } // CHECK:STDOUT: @@ -776,7 +315,6 @@ fn G() { F({}); } // CHECK:STDOUT: %T: type = bind_symbolic_name T, 0, template [template] // CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] // CHECK:STDOUT: %C.type: type = generic_class_type @C [concrete] -// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] // CHECK:STDOUT: %C.generic: %C.type = struct_value () [concrete] // CHECK:STDOUT: %C.f2e: type = class_type @C, @C(%T) [template] // CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] @@ -785,9 +323,6 @@ fn G() { F({}); } // CHECK:STDOUT: %F: %F.type = struct_value () [concrete] // CHECK:STDOUT: %require_complete: = require_complete_type %C.f2e [template] // CHECK:STDOUT: %pattern_type.e5e: type = pattern_type %C.f2e [template] -// CHECK:STDOUT: %G.type: type = fn_type @G [concrete] -// CHECK:STDOUT: %G: %G.type = struct_value () [concrete] -// CHECK:STDOUT: %F.specific_fn: = specific_function %F, @F(%empty_struct_type) [concrete] // CHECK:STDOUT: %C.7a7: type = class_type @C, @C(%empty_struct_type) [concrete] // CHECK:STDOUT: %pattern_type.99a: type = pattern_type %C.7a7 [concrete] // CHECK:STDOUT: %inst.as_compatible: = inst_value [concrete] { @@ -799,57 +334,24 @@ fn G() { F({}); } // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: .G = %G.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %C.decl: %C.type = class_decl @C [concrete = constants.%C.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0, template [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc5_18.1: type = bind_symbolic_name T, 0, template [template = %T.loc5_18.2 (constants.%T)] -// CHECK:STDOUT: } // CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { // CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0, template [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc7_15.1: type = bind_symbolic_name T, 0, template [template = %T.loc7_15.2 (constants.%T)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %G.decl: %G.type = fn_decl @G [concrete = constants.%G] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @C(%T.loc5_18.1: type) { -// CHECK:STDOUT: %T.loc5_18.2: type = bind_symbolic_name T, 0, template [template = %T.loc5_18.2 (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.f2e +// CHECK:STDOUT: %T.loc8_15.1: type = bind_symbolic_name T, 0, template [template = %T.loc8_15.2 (constants.%T)] // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic fn @F(%T.loc7_15.1: type) { -// CHECK:STDOUT: %T.loc7_15.2: type = bind_symbolic_name T, 0, template [template = %T.loc7_15.2 (constants.%T)] +// CHECK:STDOUT: generic fn @F(%T.loc8_15.1: type) { +// CHECK:STDOUT: %T.loc8_15.2: type = bind_symbolic_name T, 0, template [template = %T.loc8_15.2 (constants.%T)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %C.loc8_13.2: type = class_type @C, @C(%T.loc7_15.2) [template = %C.loc8_13.2 (constants.%C.f2e)] -// CHECK:STDOUT: %require_complete: = require_complete_type %C.loc8_13.2 [template = %require_complete (constants.%require_complete)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %C.loc8_13.2 [template = %pattern_type (constants.%pattern_type.e5e)] -// CHECK:STDOUT: %.3: = refine_type_action %v.var, %C.loc8_13.2 [template] -// CHECK:STDOUT: %.4: = access_optional_member_action %.1, destroy [template] -// CHECK:STDOUT: %.5: type = type_of_inst %.4 [template] +// CHECK:STDOUT: %C.loc9_13.2: type = class_type @C, @C(%T.loc8_15.2) [template = %C.loc9_13.2 (constants.%C.f2e)] +// CHECK:STDOUT: %require_complete: = require_complete_type %C.loc9_13.2 [template = %require_complete (constants.%require_complete)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %C.loc9_13.2 [template = %pattern_type (constants.%pattern_type.e5e)] +// CHECK:STDOUT: // CHECK:STDOUT: // CHECK:STDOUT: fn() { // CHECK:STDOUT: !entry: @@ -857,44 +359,27 @@ fn G() { F({}); } // CHECK:STDOUT: %v.patt: @F.%pattern_type (%pattern_type.e5e) = binding_pattern v [concrete] // CHECK:STDOUT: %v.var_patt: @F.%pattern_type (%pattern_type.e5e) = var_pattern %v.patt [concrete] // CHECK:STDOUT: } -// CHECK:STDOUT: %v.var: ref @F.%C.loc8_13.2 (%C.f2e) = var %v.var_patt -// CHECK:STDOUT: %.1: @F.%C.loc8_13.2 (%C.f2e) = splice_inst %.3 -// CHECK:STDOUT: %.2: @F.%.5 (@F.%.5) = splice_inst %.4 -// CHECK:STDOUT: %.loc8: type = splice_block %C.loc8_13.1 [template = %C.loc8_13.2 (constants.%C.f2e)] { +// CHECK:STDOUT: %v.var: ref @F.%C.loc9_13.2 (%C.f2e) = var %v.var_patt +// CHECK:STDOUT: +// CHECK:STDOUT: %.loc9: type = splice_block %C.loc9_13.1 [template = %C.loc9_13.2 (constants.%C.f2e)] { // CHECK:STDOUT: %C.ref: %C.type = name_ref C, file.%C.decl [concrete = constants.%C.generic] -// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc7_15.1 [template = %T.loc7_15.2 (constants.%T)] -// CHECK:STDOUT: %C.loc8_13.1: type = class_type @C, @C(constants.%T) [template = %C.loc8_13.2 (constants.%C.f2e)] +// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc8_15.1 [template = %T.loc8_15.2 (constants.%T)] +// CHECK:STDOUT: %C.loc9_13.1: type = class_type @C, @C(constants.%T) [template = %C.loc9_13.2 (constants.%C.f2e)] // CHECK:STDOUT: } -// CHECK:STDOUT: %v: ref @F.%C.loc8_13.2 (%C.f2e) = bind_name v, %v.var +// CHECK:STDOUT: %v: ref @F.%C.loc9_13.2 (%C.f2e) = bind_name v, %v.var // CHECK:STDOUT: return // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: fn @G() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %F.ref: %F.type = name_ref F, file.%F.decl [concrete = constants.%F] -// CHECK:STDOUT: %.loc11_13: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %.loc11_14: type = converted %.loc11_13, constants.%empty_struct_type [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %F.specific_fn: = specific_function %F.ref, @F(constants.%empty_struct_type) [concrete = constants.%F.specific_fn] -// CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.specific_fn() -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @C(constants.%T) { -// CHECK:STDOUT: %T.loc5_18.2 => constants.%T -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: } -// CHECK:STDOUT: // CHECK:STDOUT: specific @F(constants.%T) { -// CHECK:STDOUT: %T.loc7_15.2 => constants.%T +// CHECK:STDOUT: %T.loc8_15.2 => constants.%T // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @F(constants.%empty_struct_type) { -// CHECK:STDOUT: %T.loc7_15.2 => constants.%empty_struct_type +// CHECK:STDOUT: %T.loc8_15.2 => constants.%empty_struct_type // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %C.loc8_13.2 => constants.%C.7a7 +// CHECK:STDOUT: %C.loc9_13.2 => constants.%C.7a7 // CHECK:STDOUT: %require_complete => constants.%complete_type // CHECK:STDOUT: %pattern_type => constants.%pattern_type.99a // CHECK:STDOUT: %.3 => constants.%inst.as_compatible @@ -902,9 +387,3 @@ fn G() { F({}); } // CHECK:STDOUT: %.5 => // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: specific @C(constants.%empty_struct_type) { -// CHECK:STDOUT: %T.loc5_18.2 => constants.%empty_struct_type -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/min_prelude/destroy_decl.carbon b/toolchain/check/testdata/class/min_prelude/destroy_decl.carbon index bd0901a3d8ab6..196a740b5d106 100644 --- a/toolchain/check/testdata/class/min_prelude/destroy_decl.carbon +++ b/toolchain/check/testdata/class/min_prelude/destroy_decl.carbon @@ -2,8 +2,8 @@ // Exceptions. See /LICENSE for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // +// EXTRA-ARGS: --dump-sem-ir-ranges=only // INCLUDE-FILE: toolchain/testing/min_prelude/destroy.carbon -// EXTRA-ARGS: --no-dump-sem-ir // // AUTOUPDATE // TIP: To test this file alone, run: @@ -15,25 +15,31 @@ library "[[@TEST_NAME]]"; +//@dump-sem-ir-begin class C { fn destroy[self: Self](); } +//@dump-sem-ir-end // --- addr_self.carbon library "[[@TEST_NAME]]"; +//@dump-sem-ir-begin class C { fn destroy[addr self: Self*](); } +//@dump-sem-ir-end // --- explicit_return.carbon library "[[@TEST_NAME]]"; +//@dump-sem-ir-begin class C { fn destroy[self: Self]() -> (); } +//@dump-sem-ir-end // --- fail_class_function.carbon @@ -193,3 +199,132 @@ class C { // CHECK:STDERR: fn destroy -> (); } + +// CHECK:STDOUT: --- self.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %C: type = class_type @C [concrete] +// CHECK:STDOUT: %pattern_type: type = pattern_type %C [concrete] +// CHECK:STDOUT: %destroy.type: type = fn_type @destroy [concrete] +// CHECK:STDOUT: %destroy: %destroy.type = struct_value () [concrete] +// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] +// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: file { +// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: class @C { +// CHECK:STDOUT: %destroy.decl: %destroy.type = fn_decl @destroy [concrete = constants.%destroy] { +// CHECK:STDOUT: %self.patt: %pattern_type = binding_pattern self [concrete] +// CHECK:STDOUT: %self.param_patt: %pattern_type = value_param_pattern %self.patt, call_param0 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %self.param: %C = value_param call_param0 +// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%C [concrete = constants.%C] +// CHECK:STDOUT: %self: %C = bind_name self, %self.param +// CHECK:STDOUT: } +// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] +// CHECK:STDOUT: %complete_type: = 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: .destroy = %destroy.decl +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @destroy(%self.param: %C); +// CHECK:STDOUT: +// CHECK:STDOUT: --- addr_self.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %C: type = class_type @C [concrete] +// CHECK:STDOUT: %ptr: type = ptr_type %C [concrete] +// CHECK:STDOUT: %pattern_type.44a: type = pattern_type %ptr [concrete] +// CHECK:STDOUT: %pattern_type.f6d: type = pattern_type auto [concrete] +// CHECK:STDOUT: %destroy.type: type = fn_type @destroy [concrete] +// CHECK:STDOUT: %destroy: %destroy.type = struct_value () [concrete] +// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] +// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: file { +// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: class @C { +// CHECK:STDOUT: %destroy.decl: %destroy.type = fn_decl @destroy [concrete = constants.%destroy] { +// CHECK:STDOUT: %self.patt: %pattern_type.44a = binding_pattern self [concrete] +// CHECK:STDOUT: %self.param_patt: %pattern_type.44a = value_param_pattern %self.patt, call_param0 [concrete] +// CHECK:STDOUT: %.loc6_14: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %self.param: %ptr = value_param call_param0 +// CHECK:STDOUT: %.loc6_29: type = splice_block %ptr [concrete = constants.%ptr] { +// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%C [concrete = constants.%C] +// CHECK:STDOUT: %ptr: type = ptr_type %Self.ref [concrete = constants.%ptr] +// CHECK:STDOUT: } +// CHECK:STDOUT: %self: %ptr = bind_name self, %self.param +// CHECK:STDOUT: } +// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] +// CHECK:STDOUT: %complete_type: = 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: .destroy = %destroy.decl +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @destroy(%self.param: %ptr); +// CHECK:STDOUT: +// CHECK:STDOUT: --- explicit_return.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %C: type = class_type @C [concrete] +// CHECK:STDOUT: %pattern_type.c48: type = pattern_type %C [concrete] +// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] +// CHECK:STDOUT: %pattern_type.cb1: type = pattern_type %empty_tuple.type [concrete] +// CHECK:STDOUT: %destroy.type: type = fn_type @destroy [concrete] +// CHECK:STDOUT: %destroy: %destroy.type = struct_value () [concrete] +// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] +// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: file { +// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: class @C { +// CHECK:STDOUT: %destroy.decl: %destroy.type = fn_decl @destroy [concrete = constants.%destroy] { +// CHECK:STDOUT: %self.patt: %pattern_type.c48 = binding_pattern self [concrete] +// CHECK:STDOUT: %self.param_patt: %pattern_type.c48 = value_param_pattern %self.patt, call_param0 [concrete] +// CHECK:STDOUT: %return.patt: %pattern_type.cb1 = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: %pattern_type.cb1 = out_param_pattern %return.patt, call_param1 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc6_32.1: %empty_tuple.type = tuple_literal () +// CHECK:STDOUT: %.loc6_32.2: type = converted %.loc6_32.1, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] +// CHECK:STDOUT: %self.param: %C = value_param call_param0 +// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%C [concrete = constants.%C] +// CHECK:STDOUT: %self: %C = bind_name self, %self.param +// CHECK:STDOUT: %return.param: ref %empty_tuple.type = out_param call_param1 +// CHECK:STDOUT: %return: ref %empty_tuple.type = return_slot %return.param +// CHECK:STDOUT: } +// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] +// CHECK:STDOUT: %complete_type: = 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: .destroy = %destroy.decl +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @destroy(%self.param: %C) -> %empty_tuple.type; +// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/min_prelude/fail_abstract.carbon b/toolchain/check/testdata/class/min_prelude/fail_abstract.carbon deleted file mode 100644 index 60627da4fed22..0000000000000 --- a/toolchain/check/testdata/class/min_prelude/fail_abstract.carbon +++ /dev/null @@ -1,810 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// INCLUDE-FILE: toolchain/testing/min_prelude/destroy.carbon -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/min_prelude/fail_abstract.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/min_prelude/fail_abstract.carbon - -// --- fail_abstract_field.carbon - -library "[[@TEST_NAME]]"; - -abstract class Abstract { -} - -class Contains { - // CHECK:STDERR: fail_abstract_field.carbon:[[@LINE+7]]:10: error: field has abstract type `Abstract` [AbstractTypeInFieldDecl] - // CHECK:STDERR: var a: Abstract; - // CHECK:STDERR: ^~~~~~~~ - // CHECK:STDERR: fail_abstract_field.carbon:[[@LINE-7]]:1: note: class was declared abstract here [ClassAbstractHere] - // CHECK:STDERR: abstract class Abstract { - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: - var a: Abstract; -} - -// --- fail_abstract_var.carbon - -library "[[@TEST_NAME]]"; - -abstract class Abstract { -} - -fn Var() { - // CHECK:STDERR: fail_abstract_var.carbon:[[@LINE+7]]:10: error: binding pattern has abstract type `Abstract` in `var` pattern [AbstractTypeInVarPattern] - // CHECK:STDERR: var v: Abstract; - // CHECK:STDERR: ^~~~~~~~ - // CHECK:STDERR: fail_abstract_var.carbon:[[@LINE-7]]:1: note: class was declared abstract here [ClassAbstractHere] - // CHECK:STDERR: abstract class Abstract { - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: - var v: Abstract; -} - -// --- abstract_let.carbon - -library "[[@TEST_NAME]]"; - -abstract class Abstract { -} - -fn F(a: Abstract) { - let l: Abstract = a; -} - -// --- fail_abstract_adapter.carbon - -library "[[@TEST_NAME]]"; - -abstract class Abstract { -} - -class Adapter { - // TODO(#4387): This should probably be valid - // CHECK:STDERR: fail_abstract_adapter.carbon:[[@LINE+7]]:3: error: adapted type `Abstract` is an abstract type [AbstractTypeInAdaptDecl] - // CHECK:STDERR: adapt Abstract; - // CHECK:STDERR: ^~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_abstract_adapter.carbon:[[@LINE-8]]:1: note: class was declared abstract here [ClassAbstractHere] - // CHECK:STDERR: abstract class Abstract { - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: - adapt Abstract; -} - -// --- define_and_call_abstract_param.carbon - -library "[[@TEST_NAME]]"; - -abstract class Abstract { -} - -fn Param(a: Abstract); - -fn Call(p: Abstract) { - Param(p); -} - -// --- fail_todo_return_nonabstract_derived.carbon - -library "[[@TEST_NAME]]"; - -abstract class Abstract { -} - -class Derived { - extend base: Abstract; - - var d: {}; -} - -fn Make() -> Derived { - // TODO: This should be valid, and should construct an instance of `partial Abstract` as the base. - // CHECK:STDERR: fail_todo_return_nonabstract_derived.carbon:[[@LINE+7]]:10: error: initialization of abstract type `Abstract` [AbstractTypeInInit] - // CHECK:STDERR: return {.base = {}, .d = {}}; - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_todo_return_nonabstract_derived.carbon:[[@LINE-14]]:1: note: class was declared abstract here [ClassAbstractHere] - // CHECK:STDERR: abstract class Abstract { - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: - return {.base = {}, .d = {}}; -} - -// --- fail_return_abstract.carbon - -library "[[@TEST_NAME]]"; - -abstract class Abstract { -} - -class Derived { - extend base: Abstract; - - var d: {}; -} - -fn Return(a: Abstract) -> Abstract { - // TODO: Seems like this would be better off failing with "function returns abstract type" here instead of this \/ - // CHECK:STDERR: fail_return_abstract.carbon:[[@LINE+7]]:3: error: initialization of abstract type `Abstract` [AbstractTypeInInit] - // CHECK:STDERR: return a; - // CHECK:STDERR: ^~~~~~~~~ - // CHECK:STDERR: fail_return_abstract.carbon:[[@LINE-14]]:1: note: class was declared abstract here [ClassAbstractHere] - // CHECK:STDERR: abstract class Abstract { - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: - return a; -} - -// --- access_abstract_subobject.carbon - -library "[[@TEST_NAME]]"; - -abstract class Abstract { - var a: {}; -} - -class Derived { - extend base: Abstract; - - var d: {}; -} - -fn Access(d: Derived) -> {} { - return d.base.a; -} - -// --- abstract_let_temporary.carbon - -library "[[@TEST_NAME]]"; - -abstract class Abstract { -} - -fn F() { - let l: Abstract = {}; -} - -// --- fail_call_abstract_return.carbon - -library "[[@TEST_NAME]]"; - -abstract class Abstract { -} - -fn ReturnAbstract() -> Abstract; - -fn CallReturnAbstract() { - // CHECK:STDERR: fail_call_abstract_return.carbon:[[@LINE+10]]:3: error: function returns abstract type `Abstract` [AbstractTypeInFunctionReturnType] - // CHECK:STDERR: ReturnAbstract(); - // CHECK:STDERR: ^~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_call_abstract_return.carbon:[[@LINE-9]]:1: note: class was declared abstract here [ClassAbstractHere] - // CHECK:STDERR: abstract class Abstract { - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_call_abstract_return.carbon:[[@LINE-9]]:21: note: return type declared here [IncompleteReturnTypeHere] - // CHECK:STDERR: fn ReturnAbstract() -> Abstract; - // CHECK:STDERR: ^~~~~~~~~~~ - // CHECK:STDERR: - ReturnAbstract(); -} - -// CHECK:STDOUT: --- fail_abstract_field.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Abstract: type = class_type @Abstract [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %Contains: type = class_type @Contains [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Abstract = %Abstract.decl -// CHECK:STDOUT: .Contains = %Contains.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Abstract.decl: type = class_decl @Abstract [concrete = constants.%Abstract] {} {} -// CHECK:STDOUT: %Contains.decl: type = class_decl @Contains [concrete = constants.%Contains] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Abstract { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Abstract -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Contains { -// CHECK:STDOUT: %Abstract.ref: type = name_ref Abstract, file.%Abstract.decl [concrete = constants.%Abstract] -// CHECK:STDOUT: %.loc15: = field_decl a, element0 [concrete] -// CHECK:STDOUT: %struct_type.a: type = struct_type {.a: } [concrete = ] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.a [concrete = ] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Contains -// CHECK:STDOUT: .Abstract = -// CHECK:STDOUT: .a = %.loc15 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_abstract_var.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Abstract: type = class_type @Abstract [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %Var.type: type = fn_type @Var [concrete] -// CHECK:STDOUT: %Var: %Var.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Abstract = %Abstract.decl -// CHECK:STDOUT: .Var = %Var.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Abstract.decl: type = class_decl @Abstract [concrete = constants.%Abstract] {} {} -// CHECK:STDOUT: %Var.decl: %Var.type = fn_decl @Var [concrete = constants.%Var] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Abstract { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Abstract -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Var() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %v.patt: = binding_pattern v [concrete] -// CHECK:STDOUT: %v.var_patt: = var_pattern %v.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %v.var: ref = var %v.var_patt [concrete = ] -// CHECK:STDOUT: %Abstract.ref: type = name_ref Abstract, file.%Abstract.decl [concrete = constants.%Abstract] -// CHECK:STDOUT: %v: = bind_name v, -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- abstract_let.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Abstract: type = class_type @Abstract [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %pattern_type: type = pattern_type %Abstract [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Abstract = %Abstract.decl -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Abstract.decl: type = class_decl @Abstract [concrete = constants.%Abstract] {} {} -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %a.patt: %pattern_type = binding_pattern a [concrete] -// CHECK:STDOUT: %a.param_patt: %pattern_type = value_param_pattern %a.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %a.param: %Abstract = value_param call_param0 -// CHECK:STDOUT: %Abstract.ref.loc7: type = name_ref Abstract, file.%Abstract.decl [concrete = constants.%Abstract] -// CHECK:STDOUT: %a: %Abstract = bind_name a, %a.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Abstract { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Abstract -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F(%a.param: %Abstract) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %l.patt: %pattern_type = binding_pattern l [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %a.ref: %Abstract = name_ref a, %a -// CHECK:STDOUT: %Abstract.ref.loc8: type = name_ref Abstract, file.%Abstract.decl [concrete = constants.%Abstract] -// CHECK:STDOUT: %l: %Abstract = bind_name l, -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_abstract_adapter.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Abstract: type = class_type @Abstract [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %Adapter: type = class_type @Adapter [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Abstract = %Abstract.decl -// CHECK:STDOUT: .Adapter = %Adapter.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Abstract.decl: type = class_decl @Abstract [concrete = constants.%Abstract] {} {} -// CHECK:STDOUT: %Adapter.decl: type = class_decl @Adapter [concrete = constants.%Adapter] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Abstract { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Abstract -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Adapter { -// CHECK:STDOUT: %Abstract.ref: type = name_ref Abstract, file.%Abstract.decl [concrete = constants.%Abstract] -// CHECK:STDOUT: adapt_decl [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness [concrete = ] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Adapter -// CHECK:STDOUT: .Abstract = -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- define_and_call_abstract_param.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Abstract: type = class_type @Abstract [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %pattern_type: type = pattern_type %Abstract [concrete] -// CHECK:STDOUT: %Param.type: type = fn_type @Param [concrete] -// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] -// CHECK:STDOUT: %Param: %Param.type = struct_value () [concrete] -// CHECK:STDOUT: %Call.type: type = fn_type @Call [concrete] -// CHECK:STDOUT: %Call: %Call.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Abstract = %Abstract.decl -// CHECK:STDOUT: .Param = %Param.decl -// CHECK:STDOUT: .Call = %Call.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Abstract.decl: type = class_decl @Abstract [concrete = constants.%Abstract] {} {} -// CHECK:STDOUT: %Param.decl: %Param.type = fn_decl @Param [concrete = constants.%Param] { -// CHECK:STDOUT: %a.patt: %pattern_type = binding_pattern a [concrete] -// CHECK:STDOUT: %a.param_patt: %pattern_type = value_param_pattern %a.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %a.param: %Abstract = value_param call_param0 -// CHECK:STDOUT: %Abstract.ref: type = name_ref Abstract, file.%Abstract.decl [concrete = constants.%Abstract] -// CHECK:STDOUT: %a: %Abstract = bind_name a, %a.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %Call.decl: %Call.type = fn_decl @Call [concrete = constants.%Call] { -// CHECK:STDOUT: %p.patt: %pattern_type = binding_pattern p [concrete] -// CHECK:STDOUT: %p.param_patt: %pattern_type = value_param_pattern %p.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %p.param: %Abstract = value_param call_param0 -// CHECK:STDOUT: %Abstract.ref: type = name_ref Abstract, file.%Abstract.decl [concrete = constants.%Abstract] -// CHECK:STDOUT: %p: %Abstract = bind_name p, %p.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Abstract { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Abstract -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Param(%a.param: %Abstract); -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Call(%p.param: %Abstract) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %Param.ref: %Param.type = name_ref Param, file.%Param.decl [concrete = constants.%Param] -// CHECK:STDOUT: %p.ref: %Abstract = name_ref p, %p -// CHECK:STDOUT: %Param.call: init %empty_tuple.type = call %Param.ref() -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_todo_return_nonabstract_derived.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Abstract: type = class_type @Abstract [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %Derived: type = class_type @Derived [concrete] -// CHECK:STDOUT: %Derived.elem.513: type = unbound_element_type %Derived, %Abstract [concrete] -// CHECK:STDOUT: %Derived.elem.ad9: type = unbound_element_type %Derived, %empty_struct_type [concrete] -// CHECK:STDOUT: %struct_type.base.d.c06: type = struct_type {.base: %Abstract, .d: %empty_struct_type} [concrete] -// CHECK:STDOUT: %complete_type.b4a: = complete_type_witness %struct_type.base.d.c06 [concrete] -// CHECK:STDOUT: %pattern_type: type = pattern_type %Derived [concrete] -// CHECK:STDOUT: %Make.type: type = fn_type @Make [concrete] -// CHECK:STDOUT: %Make: %Make.type = struct_value () [concrete] -// CHECK:STDOUT: %struct_type.base.d.e0f: type = struct_type {.base: %empty_struct_type, .d: %empty_struct_type} [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Abstract = %Abstract.decl -// CHECK:STDOUT: .Derived = %Derived.decl -// CHECK:STDOUT: .Make = %Make.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Abstract.decl: type = class_decl @Abstract [concrete = constants.%Abstract] {} {} -// CHECK:STDOUT: %Derived.decl: type = class_decl @Derived [concrete = constants.%Derived] {} {} -// CHECK:STDOUT: %Make.decl: %Make.type = fn_decl @Make [concrete = constants.%Make] { -// CHECK:STDOUT: %return.patt: %pattern_type = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %Derived.ref: type = name_ref Derived, file.%Derived.decl [concrete = constants.%Derived] -// CHECK:STDOUT: %return.param: ref %Derived = out_param call_param0 -// CHECK:STDOUT: %return: ref %Derived = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Abstract { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Abstract -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Derived { -// CHECK:STDOUT: %Abstract.ref: type = name_ref Abstract, file.%Abstract.decl [concrete = constants.%Abstract] -// CHECK:STDOUT: %.loc8: %Derived.elem.513 = base_decl %Abstract.ref, element0 [concrete] -// CHECK:STDOUT: %.loc10_11.1: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %.loc10_11.2: type = converted %.loc10_11.1, constants.%empty_struct_type [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %.loc10_8: %Derived.elem.ad9 = field_decl d, element1 [concrete] -// CHECK:STDOUT: %struct_type.base.d: type = struct_type {.base: %Abstract, .d: %empty_struct_type} [concrete = constants.%struct_type.base.d.c06] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base.d [concrete = constants.%complete_type.b4a] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Derived -// CHECK:STDOUT: .Abstract = -// CHECK:STDOUT: .base = %.loc8 -// CHECK:STDOUT: .d = %.loc10_8 -// CHECK:STDOUT: extend %Abstract.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Make() -> %return.param: %Derived { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %.loc22_20: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %.loc22_29: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %.loc22_30: %struct_type.base.d.e0f = struct_literal (%.loc22_20, %.loc22_29) -// CHECK:STDOUT: return to %return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_return_abstract.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Abstract: type = class_type @Abstract [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %Derived: type = class_type @Derived [concrete] -// CHECK:STDOUT: %Derived.elem.513: type = unbound_element_type %Derived, %Abstract [concrete] -// CHECK:STDOUT: %Derived.elem.ad9: type = unbound_element_type %Derived, %empty_struct_type [concrete] -// CHECK:STDOUT: %struct_type.base.d: type = struct_type {.base: %Abstract, .d: %empty_struct_type} [concrete] -// CHECK:STDOUT: %complete_type.b4a: = complete_type_witness %struct_type.base.d [concrete] -// CHECK:STDOUT: %pattern_type: type = pattern_type %Abstract [concrete] -// CHECK:STDOUT: %Return.type: type = fn_type @Return [concrete] -// CHECK:STDOUT: %Return: %Return.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Abstract = %Abstract.decl -// CHECK:STDOUT: .Derived = %Derived.decl -// CHECK:STDOUT: .Return = %Return.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Abstract.decl: type = class_decl @Abstract [concrete = constants.%Abstract] {} {} -// CHECK:STDOUT: %Derived.decl: type = class_decl @Derived [concrete = constants.%Derived] {} {} -// CHECK:STDOUT: %Return.decl: %Return.type = fn_decl @Return [concrete = constants.%Return] { -// CHECK:STDOUT: %a.patt: %pattern_type = binding_pattern a [concrete] -// CHECK:STDOUT: %a.param_patt: %pattern_type = value_param_pattern %a.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %Abstract.ref.loc13_27: type = name_ref Abstract, file.%Abstract.decl [concrete = constants.%Abstract] -// CHECK:STDOUT: %a.param: %Abstract = value_param call_param0 -// CHECK:STDOUT: %Abstract.ref.loc13_14: type = name_ref Abstract, file.%Abstract.decl [concrete = constants.%Abstract] -// CHECK:STDOUT: %a: %Abstract = bind_name a, %a.param -// CHECK:STDOUT: %return.param: ref %Abstract = out_param call_param1 -// CHECK:STDOUT: %return: ref %Abstract = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Abstract { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Abstract -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Derived { -// CHECK:STDOUT: %Abstract.ref: type = name_ref Abstract, file.%Abstract.decl [concrete = constants.%Abstract] -// CHECK:STDOUT: %.loc8: %Derived.elem.513 = base_decl %Abstract.ref, element0 [concrete] -// CHECK:STDOUT: %.loc10_11.1: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %.loc10_11.2: type = converted %.loc10_11.1, constants.%empty_struct_type [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %.loc10_8: %Derived.elem.ad9 = field_decl d, element1 [concrete] -// CHECK:STDOUT: %struct_type.base.d: type = struct_type {.base: %Abstract, .d: %empty_struct_type} [concrete = constants.%struct_type.base.d] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base.d [concrete = constants.%complete_type.b4a] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Derived -// CHECK:STDOUT: .Abstract = -// CHECK:STDOUT: .base = %.loc8 -// CHECK:STDOUT: .d = %.loc10_8 -// CHECK:STDOUT: extend %Abstract.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Return(%a.param: %Abstract) -> %return.param: %Abstract { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %a.ref: %Abstract = name_ref a, %a -// CHECK:STDOUT: return to %return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- access_abstract_subobject.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Abstract: type = class_type @Abstract [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %Abstract.elem: type = unbound_element_type %Abstract, %empty_struct_type [concrete] -// CHECK:STDOUT: %struct_type.a.225: type = struct_type {.a: %empty_struct_type} [concrete] -// CHECK:STDOUT: %complete_type.8c6: = complete_type_witness %struct_type.a.225 [concrete] -// CHECK:STDOUT: %Derived: type = class_type @Derived [concrete] -// CHECK:STDOUT: %Derived.elem.513: type = unbound_element_type %Derived, %Abstract [concrete] -// CHECK:STDOUT: %Derived.elem.ad9: type = unbound_element_type %Derived, %empty_struct_type [concrete] -// CHECK:STDOUT: %struct_type.base.d.c06: type = struct_type {.base: %Abstract, .d: %empty_struct_type} [concrete] -// CHECK:STDOUT: %complete_type.b4a: = complete_type_witness %struct_type.base.d.c06 [concrete] -// CHECK:STDOUT: %pattern_type.fb9: type = pattern_type %Derived [concrete] -// CHECK:STDOUT: %pattern_type.a96: type = pattern_type %empty_struct_type [concrete] -// CHECK:STDOUT: %Access.type: type = fn_type @Access [concrete] -// CHECK:STDOUT: %Access: %Access.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Abstract = %Abstract.decl -// CHECK:STDOUT: .Derived = %Derived.decl -// CHECK:STDOUT: .Access = %Access.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Abstract.decl: type = class_decl @Abstract [concrete = constants.%Abstract] {} {} -// CHECK:STDOUT: %Derived.decl: type = class_decl @Derived [concrete = constants.%Derived] {} {} -// CHECK:STDOUT: %Access.decl: %Access.type = fn_decl @Access [concrete = constants.%Access] { -// CHECK:STDOUT: %d.patt: %pattern_type.fb9 = binding_pattern d [concrete] -// CHECK:STDOUT: %d.param_patt: %pattern_type.fb9 = value_param_pattern %d.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.a96 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.a96 = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %.loc14_27.1: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %.loc14_27.2: type = converted %.loc14_27.1, constants.%empty_struct_type [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %d.param: %Derived = value_param call_param0 -// CHECK:STDOUT: %Derived.ref: type = name_ref Derived, file.%Derived.decl [concrete = constants.%Derived] -// CHECK:STDOUT: %d: %Derived = bind_name d, %d.param -// CHECK:STDOUT: %return.param: ref %empty_struct_type = out_param call_param1 -// CHECK:STDOUT: %return: ref %empty_struct_type = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Abstract { -// CHECK:STDOUT: %.loc5_11.1: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %.loc5_11.2: type = converted %.loc5_11.1, constants.%empty_struct_type [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %.loc5_8: %Abstract.elem = field_decl a, element0 [concrete] -// CHECK:STDOUT: %struct_type.a: type = struct_type {.a: %empty_struct_type} [concrete = constants.%struct_type.a.225] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.a [concrete = constants.%complete_type.8c6] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Abstract -// CHECK:STDOUT: .a = %.loc5_8 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Derived { -// CHECK:STDOUT: %Abstract.ref: type = name_ref Abstract, file.%Abstract.decl [concrete = constants.%Abstract] -// CHECK:STDOUT: %.loc9: %Derived.elem.513 = base_decl %Abstract.ref, element0 [concrete] -// CHECK:STDOUT: %.loc11_11.1: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %.loc11_11.2: type = converted %.loc11_11.1, constants.%empty_struct_type [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %.loc11_8: %Derived.elem.ad9 = field_decl d, element1 [concrete] -// CHECK:STDOUT: %struct_type.base.d: type = struct_type {.base: %Abstract, .d: %empty_struct_type} [concrete = constants.%struct_type.base.d.c06] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base.d [concrete = constants.%complete_type.b4a] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Derived -// CHECK:STDOUT: .Abstract = -// CHECK:STDOUT: .base = %.loc9 -// CHECK:STDOUT: .d = %.loc11_8 -// CHECK:STDOUT: extend %Abstract.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Access(%d.param: %Derived) -> %empty_struct_type { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %d.ref: %Derived = name_ref d, %d -// CHECK:STDOUT: %base.ref: %Derived.elem.513 = name_ref base, @Derived.%.loc9 [concrete = @Derived.%.loc9] -// CHECK:STDOUT: %.loc15: ref %Abstract = class_element_access %d.ref, element0 -// CHECK:STDOUT: %a.ref: = name_ref a, [concrete = ] -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- abstract_let_temporary.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Abstract: type = class_type @Abstract [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %pattern_type: type = pattern_type %Abstract [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Abstract = %Abstract.decl -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Abstract.decl: type = class_decl @Abstract [concrete = constants.%Abstract] {} {} -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Abstract { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Abstract -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %l.patt: %pattern_type = binding_pattern l [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %.loc8: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %Abstract.ref: type = name_ref Abstract, file.%Abstract.decl [concrete = constants.%Abstract] -// CHECK:STDOUT: %l: %Abstract = bind_name l, -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_call_abstract_return.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Abstract: type = class_type @Abstract [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %pattern_type: type = pattern_type %Abstract [concrete] -// CHECK:STDOUT: %ReturnAbstract.type: type = fn_type @ReturnAbstract [concrete] -// CHECK:STDOUT: %ReturnAbstract: %ReturnAbstract.type = struct_value () [concrete] -// CHECK:STDOUT: %CallReturnAbstract.type: type = fn_type @CallReturnAbstract [concrete] -// CHECK:STDOUT: %CallReturnAbstract: %CallReturnAbstract.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Abstract = %Abstract.decl -// CHECK:STDOUT: .ReturnAbstract = %ReturnAbstract.decl -// CHECK:STDOUT: .CallReturnAbstract = %CallReturnAbstract.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Abstract.decl: type = class_decl @Abstract [concrete = constants.%Abstract] {} {} -// CHECK:STDOUT: %ReturnAbstract.decl: %ReturnAbstract.type = fn_decl @ReturnAbstract [concrete = constants.%ReturnAbstract] { -// CHECK:STDOUT: %return.patt: %pattern_type = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %Abstract.ref: type = name_ref Abstract, file.%Abstract.decl [concrete = constants.%Abstract] -// CHECK:STDOUT: %return.param: ref %Abstract = out_param call_param0 -// CHECK:STDOUT: %return: ref %Abstract = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %CallReturnAbstract.decl: %CallReturnAbstract.type = fn_decl @CallReturnAbstract [concrete = constants.%CallReturnAbstract] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Abstract { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Abstract -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @ReturnAbstract() -> %return.param: %Abstract; -// CHECK:STDOUT: -// CHECK:STDOUT: fn @CallReturnAbstract() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %ReturnAbstract.ref: %ReturnAbstract.type = name_ref ReturnAbstract, file.%ReturnAbstract.decl [concrete = constants.%ReturnAbstract] -// CHECK:STDOUT: %ReturnAbstract.call: init = call %ReturnAbstract.ref() -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/min_prelude/fail_abstract_in_tuple.carbon b/toolchain/check/testdata/class/min_prelude/fail_abstract_in_tuple.carbon deleted file mode 100644 index 1df3a9354a498..0000000000000 --- a/toolchain/check/testdata/class/min_prelude/fail_abstract_in_tuple.carbon +++ /dev/null @@ -1,560 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// INCLUDE-FILE: toolchain/testing/min_prelude/destroy.carbon -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/min_prelude/fail_abstract_in_tuple.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/min_prelude/fail_abstract_in_tuple.carbon - -// --- fail_abstract_field.carbon -library "[[@TEST_NAME]]"; - -abstract class Abstract1 {} - -class Contains { - // CHECK:STDERR: fail_abstract_field.carbon:[[@LINE+7]]:10: error: field has abstract type `(Abstract1,)` [AbstractTypeInFieldDecl] - // CHECK:STDERR: var a: (Abstract1,); - // CHECK:STDERR: ^~~~~~~~~~~~ - // CHECK:STDERR: fail_abstract_field.carbon:[[@LINE-6]]:1: note: uses class that was declared abstract here [ClassAbstractHere] - // CHECK:STDERR: abstract class Abstract1 {} - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: - var a: (Abstract1,); -} - -// --- fail_abstract_var.carbon -library "[[@TEST_NAME]]"; - -abstract class Abstract2 {} - -fn Var() { - // CHECK:STDERR: fail_abstract_var.carbon:[[@LINE+7]]:10: error: binding pattern has abstract type `(Abstract2,)` in `var` pattern [AbstractTypeInVarPattern] - // CHECK:STDERR: var v: (Abstract2,); - // CHECK:STDERR: ^~~~~~~~~~~~ - // CHECK:STDERR: fail_abstract_var.carbon:[[@LINE-6]]:1: note: uses class that was declared abstract here [ClassAbstractHere] - // CHECK:STDERR: abstract class Abstract2 {} - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: - var v: (Abstract2,); -} - -// --- abstract_let.carbon -library "[[@TEST_NAME]]"; - -abstract class Abstract3 { -} - -fn F(a: Abstract3) { - let l: (Abstract3,) = (a,); -} - -// --- fail_abstract_twice.carbon -library "[[@TEST_NAME]]"; - -abstract class Abstract4 {} -abstract class Abstract5 {} - -fn Var2() { - // CHECK:STDERR: fail_abstract_twice.carbon:[[@LINE+7]]:11: error: binding pattern has abstract type `(Abstract4, Abstract5)` in `var` pattern [AbstractTypeInVarPattern] - // CHECK:STDERR: var v2: (Abstract4, Abstract5); - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_abstract_twice.carbon:[[@LINE-7]]:1: note: uses class that was declared abstract here [ClassAbstractHere] - // CHECK:STDERR: abstract class Abstract4 {} - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: - var v2: (Abstract4, Abstract5); -} - -// --- fail_abstract_first.carbon -library "[[@TEST_NAME]]"; - -abstract class Abstract6 {} - -fn Var3() { - // CHECK:STDERR: fail_abstract_first.carbon:[[@LINE+7]]:11: error: binding pattern has abstract type `(Abstract6, {})` in `var` pattern [AbstractTypeInVarPattern] - // CHECK:STDERR: var v3: (Abstract6, {}); - // CHECK:STDERR: ^~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_abstract_first.carbon:[[@LINE-6]]:1: note: uses class that was declared abstract here [ClassAbstractHere] - // CHECK:STDERR: abstract class Abstract6 {} - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: - var v3: (Abstract6, {}); -} - -// --- fail_abstract_second.carbon -library "[[@TEST_NAME]]"; - -abstract class Abstract7 {} - -fn Var4() { - // CHECK:STDERR: fail_abstract_second.carbon:[[@LINE+7]]:11: error: binding pattern has abstract type `({}, Abstract7)` in `var` pattern [AbstractTypeInVarPattern] - // CHECK:STDERR: var v4: ({}, Abstract7); - // CHECK:STDERR: ^~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_abstract_second.carbon:[[@LINE-6]]:1: note: uses class that was declared abstract here [ClassAbstractHere] - // CHECK:STDERR: abstract class Abstract7 {} - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: - var v4: ({}, Abstract7); -} - -// --- lib.carbon -library "[[@TEST_NAME]]"; - -abstract class Abstract {} - -// --- fail_import.carbon -library "[[@TEST_NAME]]"; - -import library "lib"; - -fn Var5() { - // CHECK:STDERR: fail_import.carbon:[[@LINE+8]]:11: error: binding pattern has abstract type `(Abstract,)` in `var` pattern [AbstractTypeInVarPattern] - // CHECK:STDERR: var v5: (Abstract,); - // CHECK:STDERR: ^~~~~~~~~~~ - // CHECK:STDERR: fail_import.carbon:[[@LINE-6]]:1: in import [InImport] - // CHECK:STDERR: lib.carbon:3:1: note: uses class that was declared abstract here [ClassAbstractHere] - // CHECK:STDERR: abstract class Abstract {} - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: - var v5: (Abstract,); -} - -// CHECK:STDOUT: --- fail_abstract_field.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Abstract1: type = class_type @Abstract1 [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %Contains: type = class_type @Contains [concrete] -// CHECK:STDOUT: %tuple.type.85c: type = tuple_type (type) [concrete] -// CHECK:STDOUT: %tuple.type.f19: type = tuple_type (%Abstract1) [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Abstract1 = %Abstract1.decl -// CHECK:STDOUT: .Contains = %Contains.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Abstract1.decl: type = class_decl @Abstract1 [concrete = constants.%Abstract1] {} {} -// CHECK:STDOUT: %Contains.decl: type = class_decl @Contains [concrete = constants.%Contains] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Abstract1 { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Abstract1 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Contains { -// CHECK:STDOUT: %Abstract1.ref: type = name_ref Abstract1, file.%Abstract1.decl [concrete = constants.%Abstract1] -// CHECK:STDOUT: %.loc13_21.1: %tuple.type.85c = tuple_literal (%Abstract1.ref) -// CHECK:STDOUT: %.loc13_21.2: type = converted %.loc13_21.1, constants.%tuple.type.f19 [concrete = constants.%tuple.type.f19] -// CHECK:STDOUT: %.loc13_8: = field_decl a, element0 [concrete] -// CHECK:STDOUT: %struct_type.a: type = struct_type {.a: } [concrete = ] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.a [concrete = ] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Contains -// CHECK:STDOUT: .Abstract1 = -// CHECK:STDOUT: .a = %.loc13_8 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_abstract_var.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Abstract2: type = class_type @Abstract2 [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %Var.type: type = fn_type @Var [concrete] -// CHECK:STDOUT: %Var: %Var.type = struct_value () [concrete] -// CHECK:STDOUT: %tuple.type.85c: type = tuple_type (type) [concrete] -// CHECK:STDOUT: %tuple.type.ac6: type = tuple_type (%Abstract2) [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Abstract2 = %Abstract2.decl -// CHECK:STDOUT: .Var = %Var.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Abstract2.decl: type = class_decl @Abstract2 [concrete = constants.%Abstract2] {} {} -// CHECK:STDOUT: %Var.decl: %Var.type = fn_decl @Var [concrete = constants.%Var] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Abstract2 { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Abstract2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Var() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %v.patt: = binding_pattern v [concrete] -// CHECK:STDOUT: %v.var_patt: = var_pattern %v.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %v.var: ref = var %v.var_patt [concrete = ] -// CHECK:STDOUT: %.loc13_21.1: type = splice_block %.loc13_21.3 [concrete = constants.%tuple.type.ac6] { -// CHECK:STDOUT: %Abstract2.ref: type = name_ref Abstract2, file.%Abstract2.decl [concrete = constants.%Abstract2] -// CHECK:STDOUT: %.loc13_21.2: %tuple.type.85c = tuple_literal (%Abstract2.ref) -// CHECK:STDOUT: %.loc13_21.3: type = converted %.loc13_21.2, constants.%tuple.type.ac6 [concrete = constants.%tuple.type.ac6] -// CHECK:STDOUT: } -// CHECK:STDOUT: %v: = bind_name v, -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- abstract_let.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Abstract3: type = class_type @Abstract3 [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %pattern_type.32b: type = pattern_type %Abstract3 [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %tuple.type.85c: type = tuple_type (type) [concrete] -// CHECK:STDOUT: %tuple.type.fa1: type = tuple_type (%Abstract3) [concrete] -// CHECK:STDOUT: %pattern_type.3cf: type = pattern_type %tuple.type.fa1 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Abstract3 = %Abstract3.decl -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Abstract3.decl: type = class_decl @Abstract3 [concrete = constants.%Abstract3] {} {} -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %a.patt: %pattern_type.32b = binding_pattern a [concrete] -// CHECK:STDOUT: %a.param_patt: %pattern_type.32b = value_param_pattern %a.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %a.param: %Abstract3 = value_param call_param0 -// CHECK:STDOUT: %Abstract3.ref.loc6: type = name_ref Abstract3, file.%Abstract3.decl [concrete = constants.%Abstract3] -// CHECK:STDOUT: %a: %Abstract3 = bind_name a, %a.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Abstract3 { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Abstract3 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F(%a.param: %Abstract3) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %l.patt: %pattern_type.3cf = binding_pattern l [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %a.ref: %Abstract3 = name_ref a, %a -// CHECK:STDOUT: %.loc7_28: %tuple.type.fa1 = tuple_literal (%a.ref) -// CHECK:STDOUT: %.loc7_21.1: type = splice_block %.loc7_21.3 [concrete = constants.%tuple.type.fa1] { -// CHECK:STDOUT: %Abstract3.ref.loc7: type = name_ref Abstract3, file.%Abstract3.decl [concrete = constants.%Abstract3] -// CHECK:STDOUT: %.loc7_21.2: %tuple.type.85c = tuple_literal (%Abstract3.ref.loc7) -// CHECK:STDOUT: %.loc7_21.3: type = converted %.loc7_21.2, constants.%tuple.type.fa1 [concrete = constants.%tuple.type.fa1] -// CHECK:STDOUT: } -// CHECK:STDOUT: %l: %tuple.type.fa1 = bind_name l, -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_abstract_twice.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Abstract4: type = class_type @Abstract4 [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %Abstract5: type = class_type @Abstract5 [concrete] -// CHECK:STDOUT: %Var2.type: type = fn_type @Var2 [concrete] -// CHECK:STDOUT: %Var2: %Var2.type = struct_value () [concrete] -// CHECK:STDOUT: %tuple.type.24b: type = tuple_type (type, type) [concrete] -// CHECK:STDOUT: %tuple.type.e3e: type = tuple_type (%Abstract4, %Abstract5) [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Abstract4 = %Abstract4.decl -// CHECK:STDOUT: .Abstract5 = %Abstract5.decl -// CHECK:STDOUT: .Var2 = %Var2.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Abstract4.decl: type = class_decl @Abstract4 [concrete = constants.%Abstract4] {} {} -// CHECK:STDOUT: %Abstract5.decl: type = class_decl @Abstract5 [concrete = constants.%Abstract5] {} {} -// CHECK:STDOUT: %Var2.decl: %Var2.type = fn_decl @Var2 [concrete = constants.%Var2] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Abstract4 { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Abstract4 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Abstract5 { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Abstract5 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Var2() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %v2.patt: = binding_pattern v2 [concrete] -// CHECK:STDOUT: %v2.var_patt: = var_pattern %v2.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %v2.var: ref = var %v2.var_patt [concrete = ] -// CHECK:STDOUT: %.loc14_32.1: type = splice_block %.loc14_32.3 [concrete = constants.%tuple.type.e3e] { -// CHECK:STDOUT: %Abstract4.ref: type = name_ref Abstract4, file.%Abstract4.decl [concrete = constants.%Abstract4] -// CHECK:STDOUT: %Abstract5.ref: type = name_ref Abstract5, file.%Abstract5.decl [concrete = constants.%Abstract5] -// CHECK:STDOUT: %.loc14_32.2: %tuple.type.24b = tuple_literal (%Abstract4.ref, %Abstract5.ref) -// CHECK:STDOUT: %.loc14_32.3: type = converted %.loc14_32.2, constants.%tuple.type.e3e [concrete = constants.%tuple.type.e3e] -// CHECK:STDOUT: } -// CHECK:STDOUT: %v2: = bind_name v2, -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_abstract_first.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Abstract6: type = class_type @Abstract6 [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %Var3.type: type = fn_type @Var3 [concrete] -// CHECK:STDOUT: %Var3: %Var3.type = struct_value () [concrete] -// CHECK:STDOUT: %tuple.type.159: type = tuple_type (type, %empty_struct_type) [concrete] -// CHECK:STDOUT: %tuple.type.d93: type = tuple_type (%Abstract6, %empty_struct_type) [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Abstract6 = %Abstract6.decl -// CHECK:STDOUT: .Var3 = %Var3.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Abstract6.decl: type = class_decl @Abstract6 [concrete = constants.%Abstract6] {} {} -// CHECK:STDOUT: %Var3.decl: %Var3.type = fn_decl @Var3 [concrete = constants.%Var3] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Abstract6 { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Abstract6 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Var3() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %v3.patt: = binding_pattern v3 [concrete] -// CHECK:STDOUT: %v3.var_patt: = var_pattern %v3.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %v3.var: ref = var %v3.var_patt [concrete = ] -// CHECK:STDOUT: %.loc13_25.1: type = splice_block %.loc13_25.4 [concrete = constants.%tuple.type.d93] { -// CHECK:STDOUT: %Abstract6.ref: type = name_ref Abstract6, file.%Abstract6.decl [concrete = constants.%Abstract6] -// CHECK:STDOUT: %.loc13_24: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %.loc13_25.2: %tuple.type.159 = tuple_literal (%Abstract6.ref, %.loc13_24) -// CHECK:STDOUT: %.loc13_25.3: type = converted %.loc13_24, constants.%empty_struct_type [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %.loc13_25.4: type = converted %.loc13_25.2, constants.%tuple.type.d93 [concrete = constants.%tuple.type.d93] -// CHECK:STDOUT: } -// CHECK:STDOUT: %v3: = bind_name v3, -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_abstract_second.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Abstract7: type = class_type @Abstract7 [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %Var4.type: type = fn_type @Var4 [concrete] -// CHECK:STDOUT: %Var4: %Var4.type = struct_value () [concrete] -// CHECK:STDOUT: %tuple.type.c8c: type = tuple_type (%empty_struct_type, type) [concrete] -// CHECK:STDOUT: %tuple.type.919: type = tuple_type (%empty_struct_type, %Abstract7) [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Abstract7 = %Abstract7.decl -// CHECK:STDOUT: .Var4 = %Var4.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Abstract7.decl: type = class_decl @Abstract7 [concrete = constants.%Abstract7] {} {} -// CHECK:STDOUT: %Var4.decl: %Var4.type = fn_decl @Var4 [concrete = constants.%Var4] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Abstract7 { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Abstract7 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Var4() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %v4.patt: = binding_pattern v4 [concrete] -// CHECK:STDOUT: %v4.var_patt: = var_pattern %v4.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %v4.var: ref = var %v4.var_patt [concrete = ] -// CHECK:STDOUT: %.loc13_25.1: type = splice_block %.loc13_25.4 [concrete = constants.%tuple.type.919] { -// CHECK:STDOUT: %.loc13_13: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %Abstract7.ref: type = name_ref Abstract7, file.%Abstract7.decl [concrete = constants.%Abstract7] -// CHECK:STDOUT: %.loc13_25.2: %tuple.type.c8c = tuple_literal (%.loc13_13, %Abstract7.ref) -// CHECK:STDOUT: %.loc13_25.3: type = converted %.loc13_13, constants.%empty_struct_type [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %.loc13_25.4: type = converted %.loc13_25.2, constants.%tuple.type.919 [concrete = constants.%tuple.type.919] -// CHECK:STDOUT: } -// CHECK:STDOUT: %v4: = bind_name v4, -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- lib.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Abstract: type = class_type @Abstract [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Abstract = %Abstract.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Abstract.decl: type = class_decl @Abstract [concrete = constants.%Abstract] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Abstract { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Abstract -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_import.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Var5.type: type = fn_type @Var5 [concrete] -// CHECK:STDOUT: %Var5: %Var5.type = struct_value () [concrete] -// CHECK:STDOUT: %Abstract: type = class_type @Abstract [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %tuple.type.85c: type = tuple_type (type) [concrete] -// CHECK:STDOUT: %tuple.type.555: type = tuple_type (%Abstract) [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Main.Abstract: type = import_ref Main//lib, Abstract, loaded [concrete = constants.%Abstract] -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: } -// CHECK:STDOUT: %Main.import_ref.8f2: = import_ref Main//lib, loc3_26, loaded [concrete = constants.%complete_type] -// CHECK:STDOUT: %Main.import_ref.ee1 = import_ref Main//lib, inst18 [no loc], unloaded -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Abstract = imports.%Main.Abstract -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Var5 = %Var5.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %default.import = import -// CHECK:STDOUT: %Var5.decl: %Var5.type = fn_decl @Var5 [concrete = constants.%Var5] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Abstract [from "lib.carbon"] { -// CHECK:STDOUT: complete_type_witness = imports.%Main.import_ref.8f2 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Main.import_ref.ee1 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Var5() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %v5.patt: = binding_pattern v5 [concrete] -// CHECK:STDOUT: %v5.var_patt: = var_pattern %v5.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %v5.var: ref = var %v5.var_patt [concrete = ] -// CHECK:STDOUT: %.loc14_21.1: type = splice_block %.loc14_21.3 [concrete = constants.%tuple.type.555] { -// CHECK:STDOUT: %Abstract.ref: type = name_ref Abstract, imports.%Main.Abstract [concrete = constants.%Abstract] -// CHECK:STDOUT: %.loc14_21.2: %tuple.type.85c = tuple_literal (%Abstract.ref) -// CHECK:STDOUT: %.loc14_21.3: type = converted %.loc14_21.2, constants.%tuple.type.555 [concrete = constants.%tuple.type.555] -// CHECK:STDOUT: } -// CHECK:STDOUT: %v5: = bind_name v5, -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/min_prelude/init.carbon b/toolchain/check/testdata/class/min_prelude/init.carbon new file mode 100644 index 0000000000000..7cd65c1d43b80 --- /dev/null +++ b/toolchain/check/testdata/class/min_prelude/init.carbon @@ -0,0 +1,228 @@ +// Part of the Carbon Language project, under the Apache License v2.0 with LLVM +// Exceptions. See /LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// INCLUDE-FILE: toolchain/testing/min_prelude/convert.carbon +// +// AUTOUPDATE +// TIP: To test this file alone, run: +// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/min_prelude/init.carbon +// TIP: To dump output, run: +// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/min_prelude/init.carbon + +// --- init.carbon +library "[[@TEST_NAME]]"; + +class Class { + var n: (); + var next: Class*; +} + +fn Make(n: (), next: Class*) -> Class { + //@dump-sem-ir-begin + return {.n = n, .next = next}; + //@dump-sem-ir-end +} + +fn MakeReorder(n: (), next: Class*) -> Class { + //@dump-sem-ir-begin + return {.next = next, .n = n}; + //@dump-sem-ir-end +} + +// --- init_as.carbon +library "[[@TEST_NAME]]"; + +class Class { + var a: (); + var b: (); +} + +fn F() -> () { + //@dump-sem-ir-begin + return ({.a = (), .b = ()} as Class).a; + //@dump-sem-ir-end +} + +// --- init_nested.carbon +library "[[@TEST_NAME]]"; + +class Inner { + var a: (); + var b: (); +} + +fn MakeInner() -> Inner; + +class Outer { + var c: Inner; + var d: Inner; +} + +fn MakeOuter() -> Outer { + //@dump-sem-ir-begin + return {.c = MakeInner(), .d = MakeInner()}; + //@dump-sem-ir-end +} + +// --- fail_init.carbon +// CHECK:STDERR: fail_init.carbon:[[@LINE+4]]:1: error: library's API previously provided by `init.carbon` [DuplicateLibraryApi] +// CHECK:STDERR: library "init"; +// CHECK:STDERR: ^~~~~~~~~~~~~~~ +// CHECK:STDERR: +library "[[@TEST_NAME]]"; + +class Class { + var a: (); + var b: (); +} + +fn F() { + // CHECK:STDERR: fail_init.carbon:[[@LINE+4]]:3: error: cannot initialize class with 2 fields from struct with 1 field [StructInitElementCountMismatch] + // CHECK:STDERR: {.a = ()} as Class; + // CHECK:STDERR: ^~~~~~~~~ + // CHECK:STDERR: + {.a = ()} as Class; + // CHECK:STDERR: fail_init.carbon:[[@LINE+4]]:3: error: missing value for field `b` in struct initialization [StructInitMissingFieldInLiteral] + // CHECK:STDERR: {.a = (), .c = ()} as Class; + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + {.a = (), .c = ()} as Class; + // CHECK:STDERR: fail_init.carbon:[[@LINE+4]]:3: error: cannot initialize class with 2 fields from struct with 3 fields [StructInitElementCountMismatch] + // CHECK:STDERR: {.a = (), .b = (), .c = ()} as Class; + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + {.a = (), .b = (), .c = ()} as Class; +} + +// --- fail_todo_init_as_inplace.carbon +library "[[@TEST_NAME]]"; + +class Class { + var a: (); + var b: (); +} + +fn G(p: Class*); + +fn F() { + // TODO: This case should presumably work: `{...} as Class` should be an + // initializing expression, not a value expression. + // + // CHECK:STDERR: fail_todo_init_as_inplace.carbon:[[@LINE+4]]:18: error: cannot copy value of type `Class` [CopyOfUncopyableType] + // CHECK:STDERR: var c: Class = {.a = (), .b = ()} as Class; + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + var c: Class = {.a = (), .b = ()} as Class; + G(&c); +} + +// CHECK:STDOUT: --- init.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %Class: type = class_type @Class [concrete] +// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] +// CHECK:STDOUT: %ptr.e71: type = ptr_type %Class [concrete] +// CHECK:STDOUT: %struct_type.n.next: type = struct_type {.n: %empty_tuple.type, .next: %ptr.e71} [concrete] +// CHECK:STDOUT: %empty_tuple: %empty_tuple.type = tuple_value () [concrete] +// CHECK:STDOUT: %struct_type.next.n: type = struct_type {.next: %ptr.e71, .n: %empty_tuple.type} [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @Make(%n.param: %empty_tuple.type, %next.param: %ptr.e71) -> %return.param: %Class { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %n.ref: %empty_tuple.type = name_ref n, %n +// CHECK:STDOUT: %next.ref: %ptr.e71 = name_ref next, %next +// CHECK:STDOUT: %.loc10_31.1: %struct_type.n.next = struct_literal (%n.ref, %next.ref) +// CHECK:STDOUT: %.loc10_31.2: ref %empty_tuple.type = class_element_access %return, element0 +// CHECK:STDOUT: %.loc10_16: init %empty_tuple.type = tuple_init () to %.loc10_31.2 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc10_31.3: init %empty_tuple.type = converted %n.ref, %.loc10_16 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc10_31.4: ref %ptr.e71 = class_element_access %return, element1 +// CHECK:STDOUT: %.loc10_31.5: init %ptr.e71 = initialize_from %next.ref to %.loc10_31.4 +// CHECK:STDOUT: %.loc10_31.6: init %Class = class_init (%.loc10_31.3, %.loc10_31.5), %return +// CHECK:STDOUT: %.loc10_32: init %Class = converted %.loc10_31.1, %.loc10_31.6 +// CHECK:STDOUT: return %.loc10_32 to %return +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @MakeReorder(%n.param: %empty_tuple.type, %next.param: %ptr.e71) -> %return.param: %Class { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %next.ref: %ptr.e71 = name_ref next, %next +// CHECK:STDOUT: %n.ref: %empty_tuple.type = name_ref n, %n +// CHECK:STDOUT: %.loc16_31.1: %struct_type.next.n = struct_literal (%next.ref, %n.ref) +// CHECK:STDOUT: %.loc16_31.2: ref %empty_tuple.type = class_element_access %return, element1 +// CHECK:STDOUT: %.loc16_30: init %empty_tuple.type = tuple_init () to %.loc16_31.2 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc16_31.3: init %empty_tuple.type = converted %n.ref, %.loc16_30 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc16_31.4: ref %ptr.e71 = class_element_access %return, element0 +// CHECK:STDOUT: %.loc16_31.5: init %ptr.e71 = initialize_from %next.ref to %.loc16_31.4 +// CHECK:STDOUT: %.loc16_31.6: init %Class = class_init (%.loc16_31.3, %.loc16_31.5), %return +// CHECK:STDOUT: %.loc16_32: init %Class = converted %.loc16_31.1, %.loc16_31.6 +// CHECK:STDOUT: return %.loc16_32 to %return +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: --- init_as.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %Class: type = class_type @Class [concrete] +// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] +// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %empty_tuple.type [concrete] +// CHECK:STDOUT: %struct_type.a.b: type = struct_type {.a: %empty_tuple.type, .b: %empty_tuple.type} [concrete] +// CHECK:STDOUT: %empty_tuple: %empty_tuple.type = tuple_value () [concrete] +// CHECK:STDOUT: %Class.val: %Class = struct_value (%empty_tuple, %empty_tuple) [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @F() -> %empty_tuple.type { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %.loc10_18.1: %empty_tuple.type = tuple_literal () +// CHECK:STDOUT: %.loc10_27.1: %empty_tuple.type = tuple_literal () +// CHECK:STDOUT: %.loc10_28.1: %struct_type.a.b = struct_literal (%.loc10_18.1, %.loc10_27.1) +// CHECK:STDOUT: %Class.ref: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] +// CHECK:STDOUT: %.loc10_28.2: ref %Class = temporary_storage +// CHECK:STDOUT: %.loc10_28.3: ref %empty_tuple.type = class_element_access %.loc10_28.2, element0 +// CHECK:STDOUT: %.loc10_18.2: init %empty_tuple.type = tuple_init () to %.loc10_28.3 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc10_28.4: init %empty_tuple.type = converted %.loc10_18.1, %.loc10_18.2 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc10_28.5: ref %empty_tuple.type = class_element_access %.loc10_28.2, element1 +// CHECK:STDOUT: %.loc10_27.2: init %empty_tuple.type = tuple_init () to %.loc10_28.5 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc10_28.6: init %empty_tuple.type = converted %.loc10_27.1, %.loc10_27.2 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc10_28.7: init %Class = class_init (%.loc10_28.4, %.loc10_28.6), %.loc10_28.2 [concrete = constants.%Class.val] +// CHECK:STDOUT: %.loc10_28.8: ref %Class = temporary %.loc10_28.2, %.loc10_28.7 +// CHECK:STDOUT: %.loc10_30: ref %Class = converted %.loc10_28.1, %.loc10_28.8 +// CHECK:STDOUT: %a.ref: %Class.elem = name_ref a, @Class.%.loc4_8 [concrete = @Class.%.loc4_8] +// CHECK:STDOUT: %.loc10_39: ref %empty_tuple.type = class_element_access %.loc10_30, element0 +// CHECK:STDOUT: %tuple: %empty_tuple.type = tuple_value () [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc10_41: %empty_tuple.type = converted %.loc10_39, %tuple [concrete = constants.%empty_tuple] +// CHECK:STDOUT: return %.loc10_41 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: --- init_nested.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %Inner: type = class_type @Inner [concrete] +// CHECK:STDOUT: %MakeInner.type: type = fn_type @MakeInner [concrete] +// CHECK:STDOUT: %MakeInner: %MakeInner.type = struct_value () [concrete] +// CHECK:STDOUT: %Outer: type = class_type @Outer [concrete] +// CHECK:STDOUT: %struct_type.c.d.dce: type = struct_type {.c: %Inner, .d: %Inner} [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @MakeOuter() -> %return.param: %Outer { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %MakeInner.ref.loc17_16: %MakeInner.type = name_ref MakeInner, file.%MakeInner.decl [concrete = constants.%MakeInner] +// CHECK:STDOUT: %.loc17_45.1: ref %Inner = class_element_access %return, element0 +// CHECK:STDOUT: %MakeInner.call.loc17_26: init %Inner = call %MakeInner.ref.loc17_16() to %.loc17_45.1 +// CHECK:STDOUT: %MakeInner.ref.loc17_34: %MakeInner.type = name_ref MakeInner, file.%MakeInner.decl [concrete = constants.%MakeInner] +// CHECK:STDOUT: %.loc17_45.2: ref %Inner = class_element_access %return, element1 +// CHECK:STDOUT: %MakeInner.call.loc17_44: init %Inner = call %MakeInner.ref.loc17_34() to %.loc17_45.2 +// CHECK:STDOUT: %.loc17_45.3: %struct_type.c.d.dce = struct_literal (%MakeInner.call.loc17_26, %MakeInner.call.loc17_44) +// CHECK:STDOUT: %.loc17_45.4: init %Outer = class_init (%MakeInner.call.loc17_26, %MakeInner.call.loc17_44), %return +// CHECK:STDOUT: %.loc17_46: init %Outer = converted %.loc17_45.3, %.loc17_45.4 +// CHECK:STDOUT: return %.loc17_46 to %return +// CHECK:STDOUT: } +// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/min_prelude/self.carbon b/toolchain/check/testdata/class/min_prelude/self.carbon new file mode 100644 index 0000000000000..e5ddd4ab1301b --- /dev/null +++ b/toolchain/check/testdata/class/min_prelude/self.carbon @@ -0,0 +1,143 @@ +// Part of the Carbon Language project, under the Apache License v2.0 with LLVM +// Exceptions. See /LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// INCLUDE-FILE: toolchain/testing/min_prelude/convert.carbon +// +// AUTOUPDATE +// TIP: To test this file alone, run: +// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/min_prelude/self.carbon +// TIP: To dump output, run: +// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/min_prelude/self.carbon + +// --- self.carbon +library "[[@TEST_NAME]]"; + +class Class { + fn F[self: Self]() -> (); + fn G[addr self: Self*]() -> (); + + var n: (); +} + +fn Class.F[self: Self]() -> () { + //@dump-sem-ir-begin + return self.n; + //@dump-sem-ir-end +} + +fn Class.G[addr self: Self*]() -> () { + //@dump-sem-ir-begin + return (*self).n; + //@dump-sem-ir-end +} + +// --- fail_return_self_value.carbon +library "[[@TEST_NAME]]"; + +class Class { + // CHECK:STDERR: fail_return_self_value.carbon:[[@LINE+7]]:25: error: cannot implicitly convert non-type value of type `Class` to `type` [ConversionFailureNonTypeToFacet] + // CHECK:STDERR: fn F[self: Self]() -> self; + // CHECK:STDERR: ^~~~ + // CHECK:STDERR: fail_return_self_value.carbon:[[@LINE+4]]:25: note: type `Class` does not implement interface `Core.ImplicitAs(type)` [MissingImplInMemberAccessNote] + // CHECK:STDERR: fn F[self: Self]() -> self; + // CHECK:STDERR: ^~~~ + // CHECK:STDERR: + fn F[self: Self]() -> self; +} + +// --- fail_self.carbon +// CHECK:STDERR: fail_self.carbon:[[@LINE+4]]:1: error: library's API previously provided by `self.carbon` [DuplicateLibraryApi] +// CHECK:STDERR: library "self"; +// CHECK:STDERR: ^~~~~~~~~~~~~~~ +// CHECK:STDERR: +library "[[@TEST_NAME]]"; + +class Class { + // CHECK:STDERR: fail_self.carbon:[[@LINE+4]]:8: error: `self` can only be declared in an implicit parameter list [SelfOutsideImplicitParamList] + // CHECK:STDERR: fn F(self: Self); + // CHECK:STDERR: ^~~~~~~~~~ + // CHECK:STDERR: + fn F(self: Self); + + fn G() -> Self; +} + +// CHECK:STDERR: fail_self.carbon:[[@LINE+4]]:12: error: `self` can only be declared in an implicit parameter list [SelfOutsideImplicitParamList] +// CHECK:STDERR: fn Class.F(self: Self) { +// CHECK:STDERR: ^~~~~~~~~~ +// CHECK:STDERR: +fn Class.F(self: Self) { +} + +fn Class.G() -> Self { + // CHECK:STDERR: fail_self.carbon:[[@LINE+4]]:7: error: `self` can only be declared in an implicit parameter list [SelfOutsideImplicitParamList] + // CHECK:STDERR: var self: Self; + // CHECK:STDERR: ^~~~~~~~~~ + // CHECK:STDERR: + var self: Self; + // CHECK:STDERR: fail_self.carbon:[[@LINE+4]]:10: error: cannot copy value of type `Class` [CopyOfUncopyableType] + // CHECK:STDERR: return self; + // CHECK:STDERR: ^~~~ + // CHECK:STDERR: + return self; +} + +// --- fail_wrong_self.carbon +library "[[@TEST_NAME]]"; + +class Class {} + +class WrongSelf { + fn F[self: Class](); +} + +fn CallWrongSelf(ws: WrongSelf) { + // CHECK:STDERR: fail_wrong_self.carbon:[[@LINE+10]]:3: error: cannot implicitly convert expression of type `WrongSelf` to `Class` [ConversionFailure] + // CHECK:STDERR: ws.F(); + // CHECK:STDERR: ^~ + // CHECK:STDERR: fail_wrong_self.carbon:[[@LINE+7]]:3: note: type `WrongSelf` does not implement interface `Core.ImplicitAs(Class)` [MissingImplInMemberAccessNote] + // CHECK:STDERR: ws.F(); + // CHECK:STDERR: ^~ + // CHECK:STDERR: fail_wrong_self.carbon:[[@LINE-10]]:8: note: initializing function parameter [InCallToFunctionParam] + // CHECK:STDERR: fn F[self: Class](); + // CHECK:STDERR: ^~~~~~~~~~~ + // CHECK:STDERR: + ws.F(); +} + +// CHECK:STDOUT: --- self.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %Class: type = class_type @Class [concrete] +// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] +// CHECK:STDOUT: %ptr.e71: type = ptr_type %Class [concrete] +// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %empty_tuple.type [concrete] +// CHECK:STDOUT: %empty_tuple: %empty_tuple.type = tuple_value () [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @F(%self.param.loc10: %Class) -> %empty_tuple.type { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %self.ref: %Class = name_ref self, %self.loc10 +// CHECK:STDOUT: %n.ref: %Class.elem = name_ref n, @Class.%.loc7_8 [concrete = @Class.%.loc7_8] +// CHECK:STDOUT: %.loc12_14.1: ref %empty_tuple.type = class_element_access %self.ref, element0 +// CHECK:STDOUT: %tuple: %empty_tuple.type = tuple_value () [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc12_14.2: %empty_tuple.type = converted %.loc12_14.1, %tuple [concrete = constants.%empty_tuple] +// CHECK:STDOUT: return %.loc12_14.2 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @G(%self.param.loc16: %ptr.e71) -> %empty_tuple.type { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %self.ref: %ptr.e71 = name_ref self, %self.loc16 +// CHECK:STDOUT: %.loc18_11: ref %Class = deref %self.ref +// CHECK:STDOUT: %n.ref: %Class.elem = name_ref n, @Class.%.loc7_8 [concrete = @Class.%.loc7_8] +// CHECK:STDOUT: %.loc18_17: ref %empty_tuple.type = class_element_access %.loc18_11, element0 +// CHECK:STDOUT: %tuple: %empty_tuple.type = tuple_value () [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc18_19: %empty_tuple.type = converted %.loc18_17, %tuple [concrete = constants.%empty_tuple] +// CHECK:STDOUT: return %.loc18_19 +// CHECK:STDOUT: } +// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/min_prelude/self_type.carbon b/toolchain/check/testdata/class/min_prelude/self_type.carbon new file mode 100644 index 0000000000000..5426bc9be23c0 --- /dev/null +++ b/toolchain/check/testdata/class/min_prelude/self_type.carbon @@ -0,0 +1,86 @@ +// Part of the Carbon Language project, under the Apache License v2.0 with LLVM +// Exceptions. See /LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// INCLUDE-FILE: toolchain/testing/min_prelude/convert.carbon +// +// AUTOUPDATE +// TIP: To test this file alone, run: +// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/min_prelude/self_type.carbon +// TIP: To dump output, run: +// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/min_prelude/self_type.carbon + +// --- self_type.carbon + +library "[[@TEST_NAME]]"; + +class Class { + fn F[self: Self]() -> (); + fn Make() -> Self { + returned var s: Self; + s = {.p = &s}; + return var; + } + var p: Self*; +} + +fn Class.F[self: Self]() -> () { + return (*self.p).F(); +} + +// --- self_conversion.carbon + +library "[[@TEST_NAME]]"; + +base class Base { + var a: (); +} + +class Derived { + extend base: Base; + + fn SelfBase[self: Base]() -> (); + fn AddrSelfBase[addr self: Base*](); +} + +fn Derived.SelfBase[self: Base]() -> () { + return self.a; +} + +fn Derived.AddrSelfBase[addr self: Base*]() { + (*self).a = (); +} + +fn Call(p: Derived*) -> () { + (*p).AddrSelfBase(); + return (*p).SelfBase(); +} + +// --- fail_self_type_member.carbon + +class Class { + // CHECK:STDERR: fail_self_type_member.carbon:[[@LINE+4]]:10: error: name `Core.Bool` implicitly referenced here, but not found [CoreNameNotFound] + // CHECK:STDERR: var b: bool; + // CHECK:STDERR: ^~~~ + // CHECK:STDERR: + var b: bool; +} + +// CHECK:STDERR: fail_self_type_member.carbon:[[@LINE+4]]:11: error: name `Core.Bool` implicitly referenced here, but not found [CoreNameNotFound] +// CHECK:STDERR: fn F() -> bool { +// CHECK:STDERR: ^~~~ +// CHECK:STDERR: +fn F() -> bool { + var c1: Class = {.b = true}; + // CHECK:STDERR: fail_self_type_member.carbon:[[@LINE+8]]:17: error: expected identifier after `.` [ExpectedIdentifierAfterPeriodOrArrow] + // CHECK:STDERR: var c2: Class.Self = c1; + // CHECK:STDERR: ^~~~ + // CHECK:STDERR: + // CHECK:STDERR: fail_self_type_member.carbon:[[@LINE+4]]:17: error: semantics TODO: `handle invalid parse trees in `check`` [SemanticsTodo] + // CHECK:STDERR: var c2: Class.Self = c1; + // CHECK:STDERR: ^~~~ + // CHECK:STDERR: + var c2: Class.Self = c1; + return c2.b; +} diff --git a/toolchain/check/testdata/class/min_prelude/virtual_modifiers.carbon b/toolchain/check/testdata/class/min_prelude/virtual_modifiers.carbon new file mode 100644 index 0000000000000..6fa3632f97435 --- /dev/null +++ b/toolchain/check/testdata/class/min_prelude/virtual_modifiers.carbon @@ -0,0 +1,658 @@ +// Part of the Carbon Language project, under the Apache License v2.0 with LLVM +// Exceptions. See /LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// INCLUDE-FILE: toolchain/testing/min_prelude/convert.carbon +// +// AUTOUPDATE +// TIP: To test this file alone, run: +// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/min_prelude/virtual_modifiers.carbon +// TIP: To dump output, run: +// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/min_prelude/virtual_modifiers.carbon + +// --- modifiers.carbon + +package Modifiers; + +//@dump-sem-ir-begin +base class Base { + virtual fn H[self: Self](); +} + +abstract class Abstract { + abstract fn J[self: Self](); + + virtual fn K[self: Self](); +} +//@dump-sem-ir-end + +// --- override_import.carbon + +library "[[@TEST_NAME]]"; + +import Modifiers; + +class Derived { + extend base: Modifiers.Base; + impl fn H[self: Self](); +} + +fn Use() { + //@dump-sem-ir-begin + var d: Derived = {.base = {}}; + //@dump-sem-ir-end +} + +// --- todo_fail_later_base.carbon + +library "[[@TEST_NAME]]"; + +import Modifiers; + +base class Derived { + virtual fn F[self: Self](); + extend base: Modifiers.Base; +} + +// --- init.carbon + +library "[[@TEST_NAME]]"; + +import Modifiers; + +fn F() { + //@dump-sem-ir-begin + var v: Modifiers.Base = {}; + //@dump-sem-ir-end +} + +// --- impl_abstract.carbon + +library "[[@TEST_NAME]]"; + +abstract class A1 { + virtual fn F[self: Self](); +} + +abstract class A2 { + extend base: A1; + impl fn F[self: Self](); +} + +// --- impl_base.carbon + +library "[[@TEST_NAME]]"; + +base class B1 { + virtual fn F[self: Self](); +} + +base class B2 { + extend base: B1; + impl fn F[self: Self](); +} + +class C { + extend base: B2; + impl fn F[self: Self](); +} + +fn Use() { + //@dump-sem-ir-begin + var b1: B1 = {}; + var b2: B2 = {.base = {}}; + var c: C = {.base = {.base = {}}}; + //@dump-sem-ir-end +} + +// --- fail_modifiers.carbon + +library "[[@TEST_NAME]]"; + +class C { + // CHECK:STDERR: fail_modifiers.carbon:[[@LINE+4]]:3: error: impl without base class [ImplWithoutBase] + // CHECK:STDERR: impl fn F[self: Self](); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + impl fn F[self: Self](); +} + +// --- init_members.carbon + +library "[[@TEST_NAME]]"; + +base class Base { + var m1: (); + var m2: (); + + virtual fn F[self: Self](); +} + +fn F() { + var i: () = (); + //@dump-sem-ir-begin + // TODO: These should initialize element1 (.m), not element0 (the vptr) + var b1: Base = {.m2 = i, .m1 = i}; + var b2: Base = {.m2 = (), .m1 = ()}; + + // This one is good, though. + b1.m2 = (); + //@dump-sem-ir-end +} + +// --- todo_fail_impl_without_base_declaration.carbon + +library "[[@TEST_NAME]]"; + +base class Base { +} + +class Derived { + extend base: Base; + impl fn F[self: Self](); +} + +// --- abstract_impl.carbon + +library "[[@TEST_NAME]]"; + +abstract class AbstractBase { + abstract fn F[self: Self](); +} + +abstract class AbstractIntermediate { + extend base: AbstractBase; +} + +class Derived { + extend base: AbstractIntermediate; + impl fn F[self: Self](); +} + +// --- virtual_impl.carbon + +library "[[@TEST_NAME]]"; + +base class VirtualBase { + virtual fn F[self: Self](); +} + +base class VirtualIntermediate { + extend base: VirtualBase; +} + +class Derived { + extend base: VirtualIntermediate; + impl fn F[self: Self](); +} + +// --- fail_impl_mismatch.carbon + +library "[[@TEST_NAME]]"; + +base class Base { + virtual fn F[self: Self](); +} + +class Derived { + extend base: Base; + // CHECK:STDERR: fail_impl_mismatch.carbon:[[@LINE+7]]:3: error: redeclaration differs because of parameter count of 1 [RedeclParamCountDiffers] + // CHECK:STDERR: impl fn F[self: Self](v: ()); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_impl_mismatch.carbon:[[@LINE-8]]:3: note: previously declared with parameter count of 0 [RedeclParamCountPrevious] + // CHECK:STDERR: virtual fn F[self: Self](); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + impl fn F[self: Self](v: ()); +} + +// --- fail_todo_impl_conversion.carbon + +library "[[@TEST_NAME]]"; + +class T1 { +} + +class T2 { +} + +impl T2 as Core.ImplicitAs(T1) { + fn Convert[self: Self]() -> T1 { + return {}; + } +} + +base class Base { + virtual fn F[self: Self]() -> T1; +} + +class Derived { + extend base: Base; + // CHECK:STDERR: fail_todo_impl_conversion.carbon:[[@LINE+7]]:3: error: function redeclaration differs because return type is `T2` [FunctionRedeclReturnTypeDiffers] + // CHECK:STDERR: impl fn F[self: Self]() -> T2; + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_todo_impl_conversion.carbon:[[@LINE-8]]:3: note: previously declared with return type `T1` [FunctionRedeclReturnTypePrevious] + // CHECK:STDERR: virtual fn F[self: Self]() -> T1; + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + impl fn F[self: Self]() -> T2; +} + +// --- fail_todo_impl_generic_base.carbon + +library "[[@TEST_NAME]]"; + +class T1 { +} + +base class Base(T:! type) { + virtual fn F[self: Self](t: T); +} + +class Derived { + extend base: Base(T1); + // CHECK:STDERR: fail_todo_impl_generic_base.carbon:[[@LINE+7]]:25: error: type `` of parameter 1 in redeclaration differs from previous parameter type `` [RedeclParamDiffersType] + // CHECK:STDERR: impl fn F[self: Self](t: T1); + // CHECK:STDERR: ^~~~~ + // CHECK:STDERR: fail_todo_impl_generic_base.carbon:[[@LINE-8]]:28: note: previous declaration's corresponding parameter here [RedeclParamPrevious] + // CHECK:STDERR: virtual fn F[self: Self](t: T); + // CHECK:STDERR: ^~~~ + // CHECK:STDERR: + impl fn F[self: Self](t: T1); +} + +// --- fail_virtual_without_self.carbon + +library "[[@TEST_NAME]]"; + +abstract class T1 { + // CHECK:STDERR: fail_virtual_without_self.carbon:[[@LINE+4]]:3: error: virtual class function [VirtualWithoutSelf] + // CHECK:STDERR: virtual fn F(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~ + // CHECK:STDERR: + virtual fn F(); + // CHECK:STDERR: fail_virtual_without_self.carbon:[[@LINE+4]]:3: error: virtual class function [VirtualWithoutSelf] + // CHECK:STDERR: abstract fn G(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~ + // CHECK:STDERR: + abstract fn G(); +} + +class T2 { + extend base: T1; + // CHECK:STDERR: fail_virtual_without_self.carbon:[[@LINE+4]]:3: error: virtual class function [VirtualWithoutSelf] + // CHECK:STDERR: impl fn F(); + // CHECK:STDERR: ^~~~~~~~~~~~ + // CHECK:STDERR: + impl fn F(); +} + +// --- fail_addr_self_mismatch.carbon + +library "[[@TEST_NAME]]"; + +base class T1 { + virtual fn F1[self: Self*](); +} + +class T2 { + extend base: T1; + // CHECK:STDERR: fail_addr_self_mismatch.carbon:[[@LINE+7]]:14: error: redeclaration differs at implicit parameter 1 [RedeclParamDiffers] + // CHECK:STDERR: impl fn F1[addr self: Self*](); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_addr_self_mismatch.carbon:[[@LINE-8]]:17: note: previous declaration's corresponding implicit parameter here [RedeclParamPrevious] + // CHECK:STDERR: virtual fn F1[self: Self*](); + // CHECK:STDERR: ^~~~~~~~~~~ + // CHECK:STDERR: + impl fn F1[addr self: Self*](); +} + +// --- fail_generic_virtual.carbon + +library "[[@TEST_NAME]]"; + +base class T1 { + // CHECK:STDERR: fail_generic_virtual.carbon:[[@LINE+4]]:3: error: generic virtual function [GenericVirtual] + // CHECK:STDERR: virtual fn F[self: Self, T:! type](); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + virtual fn F[self: Self, T:! type](); +} + +// --- fail_generic_virtual_in_generic_class.carbon + +library "[[@TEST_NAME]]"; + +base class T1(T:! type) { + // CHECK:STDERR: fail_generic_virtual_in_generic_class.carbon:[[@LINE+4]]:3: error: generic virtual function [GenericVirtual] + // CHECK:STDERR: virtual fn F[self: Self, T:! type](); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + virtual fn F[self: Self, T:! type](); +} + +// --- generic_with_virtual.carbon + +library "[[@TEST_NAME]]"; + +base class T1(T:! type) { + virtual fn F[self: Self](); +} + +// --- with_dependent_arg.carbon + +library "[[@TEST_NAME]]"; + +base class T1(T:! type) { + virtual fn F[self: Self](t: T); +} + + +// CHECK:STDOUT: --- modifiers.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %Base: type = class_type @Base [concrete] +// CHECK:STDOUT: %pattern_type.bcc: type = pattern_type %Base [concrete] +// CHECK:STDOUT: %H.type: type = fn_type @H [concrete] +// CHECK:STDOUT: %H: %H.type = struct_value () [concrete] +// CHECK:STDOUT: %ptr: type = ptr_type [concrete] +// CHECK:STDOUT: %.c3d: = vtable (%H) [concrete] +// CHECK:STDOUT: %struct_type.vptr: type = struct_type {.: %ptr} [concrete] +// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.vptr [concrete] +// CHECK:STDOUT: %Abstract: type = class_type @Abstract [concrete] +// CHECK:STDOUT: %pattern_type.41e: type = pattern_type %Abstract [concrete] +// CHECK:STDOUT: %J.type: type = fn_type @J [concrete] +// CHECK:STDOUT: %J: %J.type = struct_value () [concrete] +// CHECK:STDOUT: %K.type: type = fn_type @K [concrete] +// CHECK:STDOUT: %K: %K.type = struct_value () [concrete] +// CHECK:STDOUT: %.2b2: = vtable (%J, %K) [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: file { +// CHECK:STDOUT: %Base.decl: type = class_decl @Base [concrete = constants.%Base] {} {} +// CHECK:STDOUT: %Abstract.decl: type = class_decl @Abstract [concrete = constants.%Abstract] {} {} +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: class @Base { +// CHECK:STDOUT: %H.decl: %H.type = fn_decl @H [concrete = constants.%H] { +// CHECK:STDOUT: %self.patt: %pattern_type.bcc = binding_pattern self [concrete] +// CHECK:STDOUT: %self.param_patt: %pattern_type.bcc = value_param_pattern %self.patt, call_param0 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %self.param: %Base = value_param call_param0 +// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Base [concrete = constants.%Base] +// CHECK:STDOUT: %self: %Base = bind_name self, %self.param +// CHECK:STDOUT: } +// CHECK:STDOUT: %.loc7: = vtable (%H.decl) [concrete = constants.%.c3d] +// CHECK:STDOUT: %struct_type.vptr: type = struct_type {.: %ptr} [concrete = constants.%struct_type.vptr] +// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.vptr [concrete = constants.%complete_type] +// CHECK:STDOUT: complete_type_witness = %complete_type +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = constants.%Base +// CHECK:STDOUT: .H = %H.decl +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: class @Abstract { +// CHECK:STDOUT: %J.decl: %J.type = fn_decl @J [concrete = constants.%J] { +// CHECK:STDOUT: %self.patt: %pattern_type.41e = binding_pattern self [concrete] +// CHECK:STDOUT: %self.param_patt: %pattern_type.41e = value_param_pattern %self.patt, call_param0 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %self.param: %Abstract = value_param call_param0 +// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Abstract [concrete = constants.%Abstract] +// CHECK:STDOUT: %self: %Abstract = bind_name self, %self.param +// CHECK:STDOUT: } +// CHECK:STDOUT: %K.decl: %K.type = fn_decl @K [concrete = constants.%K] { +// CHECK:STDOUT: %self.patt: %pattern_type.41e = binding_pattern self [concrete] +// CHECK:STDOUT: %self.param_patt: %pattern_type.41e = value_param_pattern %self.patt, call_param0 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %self.param: %Abstract = value_param call_param0 +// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Abstract [concrete = constants.%Abstract] +// CHECK:STDOUT: %self: %Abstract = bind_name self, %self.param +// CHECK:STDOUT: } +// CHECK:STDOUT: %.loc13: = vtable (%J.decl, %K.decl) [concrete = constants.%.2b2] +// CHECK:STDOUT: %struct_type.vptr: type = struct_type {.: %ptr} [concrete = constants.%struct_type.vptr] +// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.vptr [concrete = constants.%complete_type] +// CHECK:STDOUT: complete_type_witness = %complete_type +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = constants.%Abstract +// CHECK:STDOUT: .J = %J.decl +// CHECK:STDOUT: .K = %K.decl +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: virtual fn @H(%self.param: %Base); +// CHECK:STDOUT: +// CHECK:STDOUT: abstract fn @J(%self.param: %Abstract); +// CHECK:STDOUT: +// CHECK:STDOUT: virtual fn @K(%self.param: %Abstract); +// CHECK:STDOUT: +// CHECK:STDOUT: --- override_import.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %Derived: type = class_type @Derived [concrete] +// CHECK:STDOUT: %Base: type = class_type @Base [concrete] +// CHECK:STDOUT: %ptr.454: type = ptr_type [concrete] +// CHECK:STDOUT: %pattern_type.fb9: type = pattern_type %Derived [concrete] +// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] +// CHECK:STDOUT: %struct_type.base.f5e: type = struct_type {.base: %empty_struct_type} [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @Use() { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %d.patt: %pattern_type.fb9 = binding_pattern d [concrete] +// CHECK:STDOUT: %d.var_patt: %pattern_type.fb9 = var_pattern %d.patt [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: %d.var: ref %Derived = var %d.var_patt +// CHECK:STDOUT: %.loc13_30.1: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc13_31.1: %struct_type.base.f5e = struct_literal (%.loc13_30.1) +// CHECK:STDOUT: %.loc13_31.2: ref %Base = class_element_access %d.var, element0 +// CHECK:STDOUT: %.loc13_30.2: ref %ptr.454 = class_element_access %.loc13_31.2, element0 +// CHECK:STDOUT: %.loc13_30.3: ref %ptr.454 = vtable_ptr @Derived.%.loc9 +// CHECK:STDOUT: %.loc13_30.4: init %ptr.454 = initialize_from %.loc13_30.3 to %.loc13_30.2 +// CHECK:STDOUT: %.loc13_30.5: init %Base = class_init (%.loc13_30.4), %.loc13_31.2 +// CHECK:STDOUT: %.loc13_31.3: init %Base = converted %.loc13_30.1, %.loc13_30.5 +// CHECK:STDOUT: %.loc13_31.4: init %Derived = class_init (%.loc13_31.3), %d.var +// CHECK:STDOUT: %.loc13_3: init %Derived = converted %.loc13_31.1, %.loc13_31.4 +// CHECK:STDOUT: assign %d.var, %.loc13_3 +// CHECK:STDOUT: %Derived.ref: type = name_ref Derived, file.%Derived.decl [concrete = constants.%Derived] +// CHECK:STDOUT: %d: ref %Derived = bind_name d, %d.var +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: --- init.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %Base: type = class_type @Base [concrete] +// CHECK:STDOUT: %ptr.454: type = ptr_type [concrete] +// CHECK:STDOUT: %pattern_type: type = pattern_type %Base [concrete] +// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: %Modifiers: = namespace file.%Modifiers.import, [concrete] { +// CHECK:STDOUT: .Base = %Modifiers.Base +// CHECK:STDOUT: import Modifiers//default +// CHECK:STDOUT: } +// CHECK:STDOUT: %Modifiers.Base: type = import_ref Modifiers//default, Base, loaded [concrete = constants.%Base] +// CHECK:STDOUT: %Modifiers.import_ref.ace = import_ref Modifiers//default, loc7_1, unloaded +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @F() { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %v.patt: %pattern_type = binding_pattern v [concrete] +// CHECK:STDOUT: %v.var_patt: %pattern_type = var_pattern %v.patt [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: %v.var: ref %Base = var %v.var_patt +// CHECK:STDOUT: %.loc8_28.1: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc8_28.2: ref %ptr.454 = class_element_access %v.var, element0 +// CHECK:STDOUT: %.loc8_28.3: ref %ptr.454 = vtable_ptr imports.%Modifiers.import_ref.ace +// CHECK:STDOUT: %.loc8_28.4: init %ptr.454 = initialize_from %.loc8_28.3 to %.loc8_28.2 +// CHECK:STDOUT: %.loc8_28.5: init %Base = class_init (%.loc8_28.4), %v.var +// CHECK:STDOUT: %.loc8_3: init %Base = converted %.loc8_28.1, %.loc8_28.5 +// CHECK:STDOUT: assign %v.var, %.loc8_3 +// CHECK:STDOUT: %.loc8_19: type = splice_block %Base.ref [concrete = constants.%Base] { +// CHECK:STDOUT: %Modifiers.ref: = name_ref Modifiers, imports.%Modifiers [concrete = imports.%Modifiers] +// CHECK:STDOUT: %Base.ref: type = name_ref Base, imports.%Modifiers.Base [concrete = constants.%Base] +// CHECK:STDOUT: } +// CHECK:STDOUT: %v: ref %Base = bind_name v, %v.var +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: --- impl_base.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %B1: type = class_type @B1 [concrete] +// CHECK:STDOUT: %pattern_type.e47: type = pattern_type %B1 [concrete] +// CHECK:STDOUT: %ptr.454: type = ptr_type [concrete] +// CHECK:STDOUT: %B2: type = class_type @B2 [concrete] +// CHECK:STDOUT: %pattern_type.b19: type = pattern_type %B2 [concrete] +// CHECK:STDOUT: %C: type = class_type @C [concrete] +// CHECK:STDOUT: %pattern_type.c48: type = pattern_type %C [concrete] +// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] +// CHECK:STDOUT: %struct_type.base.f5e: type = struct_type {.base: %empty_struct_type} [concrete] +// CHECK:STDOUT: %struct_type.base.a0c: type = struct_type {.base: %struct_type.base.f5e} [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @Use() { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %b1.patt: %pattern_type.e47 = binding_pattern b1 [concrete] +// CHECK:STDOUT: %b1.var_patt: %pattern_type.e47 = var_pattern %b1.patt [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: %b1.var: ref %B1 = var %b1.var_patt +// CHECK:STDOUT: %.loc20_17.1: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc20_17.2: ref %ptr.454 = class_element_access %b1.var, element0 +// CHECK:STDOUT: %.loc20_17.3: ref %ptr.454 = vtable_ptr @B1.%.loc6 +// CHECK:STDOUT: %.loc20_17.4: init %ptr.454 = initialize_from %.loc20_17.3 to %.loc20_17.2 +// CHECK:STDOUT: %.loc20_17.5: init %B1 = class_init (%.loc20_17.4), %b1.var +// CHECK:STDOUT: %.loc20_3: init %B1 = converted %.loc20_17.1, %.loc20_17.5 +// CHECK:STDOUT: assign %b1.var, %.loc20_3 +// CHECK:STDOUT: %B1.ref: type = name_ref B1, file.%B1.decl [concrete = constants.%B1] +// CHECK:STDOUT: %b1: ref %B1 = bind_name b1, %b1.var +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %b2.patt: %pattern_type.b19 = binding_pattern b2 [concrete] +// CHECK:STDOUT: %b2.var_patt: %pattern_type.b19 = var_pattern %b2.patt [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: %b2.var: ref %B2 = var %b2.var_patt +// CHECK:STDOUT: %.loc21_26.1: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc21_27.1: %struct_type.base.f5e = struct_literal (%.loc21_26.1) +// CHECK:STDOUT: %.loc21_27.2: ref %B1 = class_element_access %b2.var, element0 +// CHECK:STDOUT: %.loc21_26.2: ref %ptr.454 = class_element_access %.loc21_27.2, element0 +// CHECK:STDOUT: %.loc21_26.3: ref %ptr.454 = vtable_ptr @B2.%.loc11 +// CHECK:STDOUT: %.loc21_26.4: init %ptr.454 = initialize_from %.loc21_26.3 to %.loc21_26.2 +// CHECK:STDOUT: %.loc21_26.5: init %B1 = class_init (%.loc21_26.4), %.loc21_27.2 +// CHECK:STDOUT: %.loc21_27.3: init %B1 = converted %.loc21_26.1, %.loc21_26.5 +// CHECK:STDOUT: %.loc21_27.4: init %B2 = class_init (%.loc21_27.3), %b2.var +// CHECK:STDOUT: %.loc21_3: init %B2 = converted %.loc21_27.1, %.loc21_27.4 +// CHECK:STDOUT: assign %b2.var, %.loc21_3 +// CHECK:STDOUT: %B2.ref: type = name_ref B2, file.%B2.decl [concrete = constants.%B2] +// CHECK:STDOUT: %b2: ref %B2 = bind_name b2, %b2.var +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %c.patt: %pattern_type.c48 = binding_pattern c [concrete] +// CHECK:STDOUT: %c.var_patt: %pattern_type.c48 = var_pattern %c.patt [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: %c.var: ref %C = var %c.var_patt +// CHECK:STDOUT: %.loc22_33.1: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc22_34.1: %struct_type.base.f5e = struct_literal (%.loc22_33.1) +// CHECK:STDOUT: %.loc22_35.1: %struct_type.base.a0c = struct_literal (%.loc22_34.1) +// CHECK:STDOUT: %.loc22_35.2: ref %B2 = class_element_access %c.var, element0 +// CHECK:STDOUT: %.loc22_34.2: ref %B1 = class_element_access %.loc22_35.2, element0 +// CHECK:STDOUT: %.loc22_33.2: ref %ptr.454 = class_element_access %.loc22_34.2, element0 +// CHECK:STDOUT: %.loc22_33.3: ref %ptr.454 = vtable_ptr @C.%.loc16 +// CHECK:STDOUT: %.loc22_33.4: init %ptr.454 = initialize_from %.loc22_33.3 to %.loc22_33.2 +// CHECK:STDOUT: %.loc22_33.5: init %B1 = class_init (%.loc22_33.4), %.loc22_34.2 +// CHECK:STDOUT: %.loc22_34.3: init %B1 = converted %.loc22_33.1, %.loc22_33.5 +// CHECK:STDOUT: %.loc22_34.4: init %B2 = class_init (%.loc22_34.3), %.loc22_35.2 +// CHECK:STDOUT: %.loc22_35.3: init %B2 = converted %.loc22_34.1, %.loc22_34.4 +// CHECK:STDOUT: %.loc22_35.4: init %C = class_init (%.loc22_35.3), %c.var +// CHECK:STDOUT: %.loc22_3: init %C = converted %.loc22_35.1, %.loc22_35.4 +// CHECK:STDOUT: assign %c.var, %.loc22_3 +// CHECK:STDOUT: %C.ref: type = name_ref C, file.%C.decl [concrete = constants.%C] +// CHECK:STDOUT: %c: ref %C = bind_name c, %c.var +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: --- init_members.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %Base: type = class_type @Base [concrete] +// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] +// CHECK:STDOUT: %Base.elem: type = unbound_element_type %Base, %empty_tuple.type [concrete] +// CHECK:STDOUT: %pattern_type.bcc: type = pattern_type %Base [concrete] +// CHECK:STDOUT: %ptr.454: type = ptr_type [concrete] +// CHECK:STDOUT: %empty_tuple: %empty_tuple.type = tuple_value () [concrete] +// CHECK:STDOUT: %struct_type.m2.m1: type = struct_type {.m2: %empty_tuple.type, .m1: %empty_tuple.type} [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @F.2() { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %b1.patt: %pattern_type.bcc = binding_pattern b1 [concrete] +// CHECK:STDOUT: %b1.var_patt: %pattern_type.bcc = var_pattern %b1.patt [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: %b1.var: ref %Base = var %b1.var_patt +// CHECK:STDOUT: %i.ref.loc15_25: ref %empty_tuple.type = name_ref i, %i +// CHECK:STDOUT: %i.ref.loc15_34: ref %empty_tuple.type = name_ref i, %i +// CHECK:STDOUT: %.loc15_35.1: %struct_type.m2.m1 = struct_literal (%i.ref.loc15_25, %i.ref.loc15_34) +// CHECK:STDOUT: %.loc15_35.2: ref %ptr.454 = class_element_access %b1.var, element0 +// CHECK:STDOUT: %.loc15_35.3: ref %ptr.454 = vtable_ptr @Base.%.loc9 +// CHECK:STDOUT: %.loc15_35.4: init %ptr.454 = initialize_from %.loc15_35.3 to %.loc15_35.2 +// CHECK:STDOUT: %.loc15_35.5: ref %empty_tuple.type = class_element_access %b1.var, element2 +// CHECK:STDOUT: %.loc15_34: init %empty_tuple.type = tuple_init () to %.loc15_35.5 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc15_35.6: init %empty_tuple.type = converted %i.ref.loc15_34, %.loc15_34 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc15_35.7: ref %empty_tuple.type = class_element_access %b1.var, element1 +// CHECK:STDOUT: %.loc15_25: init %empty_tuple.type = tuple_init () to %.loc15_35.7 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc15_35.8: init %empty_tuple.type = converted %i.ref.loc15_25, %.loc15_25 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc15_35.9: init %Base = class_init (%.loc15_35.4, %.loc15_35.6, %.loc15_35.8), %b1.var +// CHECK:STDOUT: %.loc15_3: init %Base = converted %.loc15_35.1, %.loc15_35.9 +// CHECK:STDOUT: assign %b1.var, %.loc15_3 +// CHECK:STDOUT: %Base.ref.loc15: type = name_ref Base, file.%Base.decl [concrete = constants.%Base] +// CHECK:STDOUT: %b1: ref %Base = bind_name b1, %b1.var +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %b2.patt: %pattern_type.bcc = binding_pattern b2 [concrete] +// CHECK:STDOUT: %b2.var_patt: %pattern_type.bcc = var_pattern %b2.patt [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: %b2.var: ref %Base = var %b2.var_patt +// CHECK:STDOUT: %.loc16_26.1: %empty_tuple.type = tuple_literal () +// CHECK:STDOUT: %.loc16_36.1: %empty_tuple.type = tuple_literal () +// CHECK:STDOUT: %.loc16_37.1: %struct_type.m2.m1 = struct_literal (%.loc16_26.1, %.loc16_36.1) +// CHECK:STDOUT: %.loc16_37.2: ref %ptr.454 = class_element_access %b2.var, element0 +// CHECK:STDOUT: %.loc16_37.3: ref %ptr.454 = vtable_ptr @Base.%.loc9 +// CHECK:STDOUT: %.loc16_37.4: init %ptr.454 = initialize_from %.loc16_37.3 to %.loc16_37.2 +// CHECK:STDOUT: %.loc16_37.5: ref %empty_tuple.type = class_element_access %b2.var, element2 +// CHECK:STDOUT: %.loc16_36.2: init %empty_tuple.type = tuple_init () to %.loc16_37.5 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc16_37.6: init %empty_tuple.type = converted %.loc16_36.1, %.loc16_36.2 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc16_37.7: ref %empty_tuple.type = class_element_access %b2.var, element1 +// CHECK:STDOUT: %.loc16_26.2: init %empty_tuple.type = tuple_init () to %.loc16_37.7 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc16_37.8: init %empty_tuple.type = converted %.loc16_26.1, %.loc16_26.2 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc16_37.9: init %Base = class_init (%.loc16_37.4, %.loc16_37.6, %.loc16_37.8), %b2.var +// CHECK:STDOUT: %.loc16_3: init %Base = converted %.loc16_37.1, %.loc16_37.9 +// CHECK:STDOUT: assign %b2.var, %.loc16_3 +// CHECK:STDOUT: %Base.ref.loc16: type = name_ref Base, file.%Base.decl [concrete = constants.%Base] +// CHECK:STDOUT: %b2: ref %Base = bind_name b2, %b2.var +// CHECK:STDOUT: %b1.ref: ref %Base = name_ref b1, %b1 +// CHECK:STDOUT: %m2.ref: %Base.elem = name_ref m2, @Base.%.loc6_9 [concrete = @Base.%.loc6_9] +// CHECK:STDOUT: %.loc19_5: ref %empty_tuple.type = class_element_access %b1.ref, element2 +// CHECK:STDOUT: %.loc19_12.1: %empty_tuple.type = tuple_literal () +// CHECK:STDOUT: %.loc19_12.2: init %empty_tuple.type = tuple_init () to %.loc19_5 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc19_9: init %empty_tuple.type = converted %.loc19_12.1, %.loc19_12.2 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: assign %.loc19_5, %.loc19_9 +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/nested.carbon b/toolchain/check/testdata/class/nested.carbon deleted file mode 100644 index 55332ada87547..0000000000000 --- a/toolchain/check/testdata/class/nested.carbon +++ /dev/null @@ -1,287 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/nested.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/nested.carbon - -class Outer { - fn F() { - // Outer and Inner are both complete here. - var o: Outer; - var i: Inner; - } - - class Inner { - var pi: Self*; - var po: Outer*; - var qi: Inner*; - - fn G() { - // Outer and Inner are both complete here. - var o: Outer; - var i: Inner; - } - } - - fn H() { - // Outer and Inner are both complete here. - var o: Outer; - var i: Inner; - } - - var po: Self*; - var qo: Outer*; - var pi: Inner*; -} - -fn F(a: Outer*) { - let b: Outer.Inner* = (*a).pi; - - a->po = a; - a->qo = a; - a->pi = a->pi; - b->po = a; - b->pi = a->pi; - b->qi = a->pi; -} - -// CHECK:STDOUT: --- nested.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Outer: type = class_type @Outer [concrete] -// CHECK:STDOUT: %F.type.288: type = fn_type @F.1 [concrete] -// CHECK:STDOUT: %F.bd8: %F.type.288 = struct_value () [concrete] -// CHECK:STDOUT: %Inner: type = class_type @Inner [concrete] -// CHECK:STDOUT: %ptr.36a: type = ptr_type %Inner [concrete] -// CHECK:STDOUT: %Inner.elem.640: type = unbound_element_type %Inner, %ptr.36a [concrete] -// CHECK:STDOUT: %ptr.5df: type = ptr_type %Outer [concrete] -// CHECK:STDOUT: %Inner.elem.c30: type = unbound_element_type %Inner, %ptr.5df [concrete] -// CHECK:STDOUT: %G.type: type = fn_type @G [concrete] -// CHECK:STDOUT: %G: %G.type = struct_value () [concrete] -// CHECK:STDOUT: %struct_type.pi.po.qi: type = struct_type {.pi: %ptr.36a, .po: %ptr.5df, .qi: %ptr.36a} [concrete] -// CHECK:STDOUT: %complete_type.7ae: = complete_type_witness %struct_type.pi.po.qi [concrete] -// CHECK:STDOUT: %H.type: type = fn_type @H [concrete] -// CHECK:STDOUT: %H: %H.type = struct_value () [concrete] -// CHECK:STDOUT: %Outer.elem.a16: type = unbound_element_type %Outer, %ptr.5df [concrete] -// CHECK:STDOUT: %Outer.elem.fe9: type = unbound_element_type %Outer, %ptr.36a [concrete] -// CHECK:STDOUT: %struct_type.po.qo.pi: type = struct_type {.po: %ptr.5df, .qo: %ptr.5df, .pi: %ptr.36a} [concrete] -// CHECK:STDOUT: %complete_type.e99: = complete_type_witness %struct_type.po.qo.pi [concrete] -// CHECK:STDOUT: %pattern_type.e74: type = pattern_type %Outer [concrete] -// CHECK:STDOUT: %pattern_type.906: type = pattern_type %Inner [concrete] -// CHECK:STDOUT: %pattern_type.95c: type = pattern_type %ptr.5df [concrete] -// CHECK:STDOUT: %F.type.b25: type = fn_type @F.2 [concrete] -// CHECK:STDOUT: %F.c41: %F.type.b25 = struct_value () [concrete] -// CHECK:STDOUT: %pattern_type.27f: type = pattern_type %ptr.36a [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Outer = %Outer.decl -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Outer.decl: type = class_decl @Outer [concrete = constants.%Outer] {} {} -// CHECK:STDOUT: %F.decl: %F.type.b25 = fn_decl @F.2 [concrete = constants.%F.c41] { -// CHECK:STDOUT: %a.patt: %pattern_type.95c = binding_pattern a [concrete] -// CHECK:STDOUT: %a.param_patt: %pattern_type.95c = value_param_pattern %a.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %a.param: %ptr.5df = value_param call_param0 -// CHECK:STDOUT: %.loc41: type = splice_block %ptr.loc41 [concrete = constants.%ptr.5df] { -// CHECK:STDOUT: %Outer.ref.loc41: type = name_ref Outer, file.%Outer.decl [concrete = constants.%Outer] -// CHECK:STDOUT: %ptr.loc41: type = ptr_type %Outer.ref.loc41 [concrete = constants.%ptr.5df] -// CHECK:STDOUT: } -// CHECK:STDOUT: %a: %ptr.5df = bind_name a, %a.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Outer { -// CHECK:STDOUT: %F.decl: %F.type.288 = fn_decl @F.1 [concrete = constants.%F.bd8] {} {} -// CHECK:STDOUT: %Inner.decl: type = class_decl @Inner [concrete = constants.%Inner] {} {} -// CHECK:STDOUT: %H.decl: %H.type = fn_decl @H [concrete = constants.%H] {} {} -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Outer [concrete = constants.%Outer] -// CHECK:STDOUT: %ptr.loc36: type = ptr_type %Self.ref [concrete = constants.%ptr.5df] -// CHECK:STDOUT: %.loc36: %Outer.elem.a16 = field_decl po, element0 [concrete] -// CHECK:STDOUT: %Outer.ref: type = name_ref Outer, file.%Outer.decl [concrete = constants.%Outer] -// CHECK:STDOUT: %ptr.loc37: type = ptr_type %Outer.ref [concrete = constants.%ptr.5df] -// CHECK:STDOUT: %.loc37: %Outer.elem.a16 = field_decl qo, element1 [concrete] -// CHECK:STDOUT: %Inner.ref: type = name_ref Inner, %Inner.decl [concrete = constants.%Inner] -// CHECK:STDOUT: %ptr.loc38: type = ptr_type %Inner.ref [concrete = constants.%ptr.36a] -// CHECK:STDOUT: %.loc38: %Outer.elem.fe9 = field_decl pi, element2 [concrete] -// CHECK:STDOUT: %struct_type.po.qo.pi: type = struct_type {.po: %ptr.5df, .qo: %ptr.5df, .pi: %ptr.36a} [concrete = constants.%struct_type.po.qo.pi] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.po.qo.pi [concrete = constants.%complete_type.e99] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Outer -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: .Inner = %Inner.decl -// CHECK:STDOUT: .Outer = -// CHECK:STDOUT: .H = %H.decl -// CHECK:STDOUT: .po = %.loc36 -// CHECK:STDOUT: .qo = %.loc37 -// CHECK:STDOUT: .pi = %.loc38 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Inner { -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Inner [concrete = constants.%Inner] -// CHECK:STDOUT: %ptr.loc19: type = ptr_type %Self.ref [concrete = constants.%ptr.36a] -// CHECK:STDOUT: %.loc19: %Inner.elem.640 = field_decl pi, element0 [concrete] -// CHECK:STDOUT: %Outer.ref: type = name_ref Outer, file.%Outer.decl [concrete = constants.%Outer] -// CHECK:STDOUT: %ptr.loc20: type = ptr_type %Outer.ref [concrete = constants.%ptr.5df] -// CHECK:STDOUT: %.loc20: %Inner.elem.c30 = field_decl po, element1 [concrete] -// CHECK:STDOUT: %Inner.ref: type = name_ref Inner, @Outer.%Inner.decl [concrete = constants.%Inner] -// CHECK:STDOUT: %ptr.loc21: type = ptr_type %Inner.ref [concrete = constants.%ptr.36a] -// CHECK:STDOUT: %.loc21: %Inner.elem.640 = field_decl qi, element2 [concrete] -// CHECK:STDOUT: %G.decl: %G.type = fn_decl @G [concrete = constants.%G] {} {} -// CHECK:STDOUT: %struct_type.pi.po.qi: type = struct_type {.pi: %ptr.36a, .po: %ptr.5df, .qi: %ptr.36a} [concrete = constants.%struct_type.pi.po.qi] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.pi.po.qi [concrete = constants.%complete_type.7ae] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Inner -// CHECK:STDOUT: .pi = %.loc19 -// CHECK:STDOUT: .Outer = -// CHECK:STDOUT: .po = %.loc20 -// CHECK:STDOUT: .Inner = -// CHECK:STDOUT: .qi = %.loc21 -// CHECK:STDOUT: .G = %G.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F.1() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %o.patt: %pattern_type.e74 = binding_pattern o [concrete] -// CHECK:STDOUT: %o.var_patt: %pattern_type.e74 = var_pattern %o.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %o.var: ref %Outer = var %o.var_patt -// CHECK:STDOUT: %Outer.ref: type = name_ref Outer, file.%Outer.decl [concrete = constants.%Outer] -// CHECK:STDOUT: %o: ref %Outer = bind_name o, %o.var -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %i.patt: %pattern_type.906 = binding_pattern i [concrete] -// CHECK:STDOUT: %i.var_patt: %pattern_type.906 = var_pattern %i.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %i.var: ref %Inner = var %i.var_patt -// CHECK:STDOUT: %Inner.ref: type = name_ref Inner, @Outer.%Inner.decl [concrete = constants.%Inner] -// CHECK:STDOUT: %i: ref %Inner = bind_name i, %i.var -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @G() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %o.patt: %pattern_type.e74 = binding_pattern o [concrete] -// CHECK:STDOUT: %o.var_patt: %pattern_type.e74 = var_pattern %o.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %o.var: ref %Outer = var %o.var_patt -// CHECK:STDOUT: %Outer.ref: type = name_ref Outer, file.%Outer.decl [concrete = constants.%Outer] -// CHECK:STDOUT: %o: ref %Outer = bind_name o, %o.var -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %i.patt: %pattern_type.906 = binding_pattern i [concrete] -// CHECK:STDOUT: %i.var_patt: %pattern_type.906 = var_pattern %i.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %i.var: ref %Inner = var %i.var_patt -// CHECK:STDOUT: %Inner.ref: type = name_ref Inner, @Outer.%Inner.decl [concrete = constants.%Inner] -// CHECK:STDOUT: %i: ref %Inner = bind_name i, %i.var -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @H() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %o.patt: %pattern_type.e74 = binding_pattern o [concrete] -// CHECK:STDOUT: %o.var_patt: %pattern_type.e74 = var_pattern %o.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %o.var: ref %Outer = var %o.var_patt -// CHECK:STDOUT: %Outer.ref: type = name_ref Outer, file.%Outer.decl [concrete = constants.%Outer] -// CHECK:STDOUT: %o: ref %Outer = bind_name o, %o.var -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %i.patt: %pattern_type.906 = binding_pattern i [concrete] -// CHECK:STDOUT: %i.var_patt: %pattern_type.906 = var_pattern %i.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %i.var: ref %Inner = var %i.var_patt -// CHECK:STDOUT: %Inner.ref: type = name_ref Inner, @Outer.%Inner.decl [concrete = constants.%Inner] -// CHECK:STDOUT: %i: ref %Inner = bind_name i, %i.var -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F.2(%a.param: %ptr.5df) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %b.patt: %pattern_type.27f = binding_pattern b [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %a.ref.loc42: %ptr.5df = name_ref a, %a -// CHECK:STDOUT: %.loc42_26: ref %Outer = deref %a.ref.loc42 -// CHECK:STDOUT: %pi.ref.loc42: %Outer.elem.fe9 = name_ref pi, @Outer.%.loc38 [concrete = @Outer.%.loc38] -// CHECK:STDOUT: %.loc42_29: ref %ptr.36a = class_element_access %.loc42_26, element2 -// CHECK:STDOUT: %.loc42_21: type = splice_block %ptr.loc42 [concrete = constants.%ptr.36a] { -// CHECK:STDOUT: %Outer.ref.loc42: type = name_ref Outer, file.%Outer.decl [concrete = constants.%Outer] -// CHECK:STDOUT: %Inner.ref: type = name_ref Inner, @Outer.%Inner.decl [concrete = constants.%Inner] -// CHECK:STDOUT: %ptr.loc42: type = ptr_type %Inner.ref [concrete = constants.%ptr.36a] -// CHECK:STDOUT: } -// CHECK:STDOUT: %b: ref %ptr.36a = bind_name b, %.loc42_29 -// CHECK:STDOUT: %a.ref.loc44_3: %ptr.5df = name_ref a, %a -// CHECK:STDOUT: %.loc44_4.1: ref %Outer = deref %a.ref.loc44_3 -// CHECK:STDOUT: %po.ref.loc44: %Outer.elem.a16 = name_ref po, @Outer.%.loc36 [concrete = @Outer.%.loc36] -// CHECK:STDOUT: %.loc44_4.2: ref %ptr.5df = class_element_access %.loc44_4.1, element0 -// CHECK:STDOUT: %a.ref.loc44_11: %ptr.5df = name_ref a, %a -// CHECK:STDOUT: assign %.loc44_4.2, %a.ref.loc44_11 -// CHECK:STDOUT: %a.ref.loc45_3: %ptr.5df = name_ref a, %a -// CHECK:STDOUT: %.loc45_4.1: ref %Outer = deref %a.ref.loc45_3 -// CHECK:STDOUT: %qo.ref: %Outer.elem.a16 = name_ref qo, @Outer.%.loc37 [concrete = @Outer.%.loc37] -// CHECK:STDOUT: %.loc45_4.2: ref %ptr.5df = class_element_access %.loc45_4.1, element1 -// CHECK:STDOUT: %a.ref.loc45_11: %ptr.5df = name_ref a, %a -// CHECK:STDOUT: assign %.loc45_4.2, %a.ref.loc45_11 -// CHECK:STDOUT: %a.ref.loc46_3: %ptr.5df = name_ref a, %a -// CHECK:STDOUT: %.loc46_4.1: ref %Outer = deref %a.ref.loc46_3 -// CHECK:STDOUT: %pi.ref.loc46_4: %Outer.elem.fe9 = name_ref pi, @Outer.%.loc38 [concrete = @Outer.%.loc38] -// CHECK:STDOUT: %.loc46_4.2: ref %ptr.36a = class_element_access %.loc46_4.1, element2 -// CHECK:STDOUT: %a.ref.loc46_11: %ptr.5df = name_ref a, %a -// CHECK:STDOUT: %.loc46_12.1: ref %Outer = deref %a.ref.loc46_11 -// CHECK:STDOUT: %pi.ref.loc46_12: %Outer.elem.fe9 = name_ref pi, @Outer.%.loc38 [concrete = @Outer.%.loc38] -// CHECK:STDOUT: %.loc46_12.2: ref %ptr.36a = class_element_access %.loc46_12.1, element2 -// CHECK:STDOUT: %.loc46_12.3: %ptr.36a = bind_value %.loc46_12.2 -// CHECK:STDOUT: assign %.loc46_4.2, %.loc46_12.3 -// CHECK:STDOUT: %b.ref.loc47: ref %ptr.36a = name_ref b, %b -// CHECK:STDOUT: %.loc47_3: %ptr.36a = bind_value %b.ref.loc47 -// CHECK:STDOUT: %.loc47_4.1: ref %Inner = deref %.loc47_3 -// CHECK:STDOUT: %po.ref.loc47: %Inner.elem.c30 = name_ref po, @Inner.%.loc20 [concrete = @Inner.%.loc20] -// CHECK:STDOUT: %.loc47_4.2: ref %ptr.5df = class_element_access %.loc47_4.1, element1 -// CHECK:STDOUT: %a.ref.loc47: %ptr.5df = name_ref a, %a -// CHECK:STDOUT: assign %.loc47_4.2, %a.ref.loc47 -// CHECK:STDOUT: %b.ref.loc48: ref %ptr.36a = name_ref b, %b -// CHECK:STDOUT: %.loc48_3: %ptr.36a = bind_value %b.ref.loc48 -// CHECK:STDOUT: %.loc48_4.1: ref %Inner = deref %.loc48_3 -// CHECK:STDOUT: %pi.ref.loc48_4: %Inner.elem.640 = name_ref pi, @Inner.%.loc19 [concrete = @Inner.%.loc19] -// CHECK:STDOUT: %.loc48_4.2: ref %ptr.36a = class_element_access %.loc48_4.1, element0 -// CHECK:STDOUT: %a.ref.loc48: %ptr.5df = name_ref a, %a -// CHECK:STDOUT: %.loc48_12.1: ref %Outer = deref %a.ref.loc48 -// CHECK:STDOUT: %pi.ref.loc48_12: %Outer.elem.fe9 = name_ref pi, @Outer.%.loc38 [concrete = @Outer.%.loc38] -// CHECK:STDOUT: %.loc48_12.2: ref %ptr.36a = class_element_access %.loc48_12.1, element2 -// CHECK:STDOUT: %.loc48_12.3: %ptr.36a = bind_value %.loc48_12.2 -// CHECK:STDOUT: assign %.loc48_4.2, %.loc48_12.3 -// CHECK:STDOUT: %b.ref.loc49: ref %ptr.36a = name_ref b, %b -// CHECK:STDOUT: %.loc49_3: %ptr.36a = bind_value %b.ref.loc49 -// CHECK:STDOUT: %.loc49_4.1: ref %Inner = deref %.loc49_3 -// CHECK:STDOUT: %qi.ref: %Inner.elem.640 = name_ref qi, @Inner.%.loc21 [concrete = @Inner.%.loc21] -// CHECK:STDOUT: %.loc49_4.2: ref %ptr.36a = class_element_access %.loc49_4.1, element2 -// CHECK:STDOUT: %a.ref.loc49: %ptr.5df = name_ref a, %a -// CHECK:STDOUT: %.loc49_12.1: ref %Outer = deref %a.ref.loc49 -// CHECK:STDOUT: %pi.ref.loc49: %Outer.elem.fe9 = name_ref pi, @Outer.%.loc38 [concrete = @Outer.%.loc38] -// CHECK:STDOUT: %.loc49_12.2: ref %ptr.36a = class_element_access %.loc49_12.1, element2 -// CHECK:STDOUT: %.loc49_12.3: %ptr.36a = bind_value %.loc49_12.2 -// CHECK:STDOUT: assign %.loc49_4.2, %.loc49_12.3 -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/nested_name.carbon b/toolchain/check/testdata/class/nested_name.carbon deleted file mode 100644 index 1913818370f76..0000000000000 --- a/toolchain/check/testdata/class/nested_name.carbon +++ /dev/null @@ -1,140 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/nested_name.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/nested_name.carbon - -class Outer { - class Inner { - var n: i32; - } -} - -fn F(oi: Outer.Inner) -> i32 { - return oi.n; -} - -fn G(o: Outer) { - var i: o.Inner; -} - -// CHECK:STDOUT: --- nested_name.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Outer: type = class_type @Outer [concrete] -// CHECK:STDOUT: %Inner: type = class_type @Inner [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %Inner.elem: type = unbound_element_type %Inner, %i32 [concrete] -// CHECK:STDOUT: %struct_type.n: type = struct_type {.n: %i32} [concrete] -// CHECK:STDOUT: %complete_type.54b: = complete_type_witness %struct_type.n [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %pattern_type.906: type = pattern_type %Inner [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %pattern_type.e74: type = pattern_type %Outer [concrete] -// CHECK:STDOUT: %G.type: type = fn_type @G [concrete] -// CHECK:STDOUT: %G: %G.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Outer = %Outer.decl -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: .G = %G.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Outer.decl: type = class_decl @Outer [concrete = constants.%Outer] {} {} -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %oi.patt: %pattern_type.906 = binding_pattern oi [concrete] -// CHECK:STDOUT: %oi.param_patt: %pattern_type.906 = value_param_pattern %oi.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %oi.param: %Inner = value_param call_param0 -// CHECK:STDOUT: %.loc17: type = splice_block %Inner.ref [concrete = constants.%Inner] { -// CHECK:STDOUT: %Outer.ref: type = name_ref Outer, file.%Outer.decl [concrete = constants.%Outer] -// CHECK:STDOUT: %Inner.ref: type = name_ref Inner, @Outer.%Inner.decl [concrete = constants.%Inner] -// CHECK:STDOUT: } -// CHECK:STDOUT: %oi: %Inner = bind_name oi, %oi.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %G.decl: %G.type = fn_decl @G [concrete = constants.%G] { -// CHECK:STDOUT: %o.patt: %pattern_type.e74 = binding_pattern o [concrete] -// CHECK:STDOUT: %o.param_patt: %pattern_type.e74 = value_param_pattern %o.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %o.param: %Outer = value_param call_param0 -// CHECK:STDOUT: %Outer.ref: type = name_ref Outer, file.%Outer.decl [concrete = constants.%Outer] -// CHECK:STDOUT: %o: %Outer = bind_name o, %o.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Outer { -// CHECK:STDOUT: %Inner.decl: type = class_decl @Inner [concrete = constants.%Inner] {} {} -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Outer -// CHECK:STDOUT: .Inner = %Inner.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Inner { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc13: %Inner.elem = field_decl n, element0 [concrete] -// CHECK:STDOUT: %struct_type.n: type = struct_type {.n: %i32} [concrete = constants.%struct_type.n] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.n [concrete = constants.%complete_type.54b] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Inner -// CHECK:STDOUT: .n = %.loc13 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F(%oi.param: %Inner) -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %oi.ref: %Inner = name_ref oi, %oi -// CHECK:STDOUT: %n.ref: %Inner.elem = name_ref n, @Inner.%.loc13 [concrete = @Inner.%.loc13] -// CHECK:STDOUT: %.loc18_12.1: ref %i32 = class_element_access %oi.ref, element0 -// CHECK:STDOUT: %.loc18_12.2: %i32 = bind_value %.loc18_12.1 -// CHECK:STDOUT: return %.loc18_12.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @G(%o.param: %Outer) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %i.patt: %pattern_type.906 = binding_pattern i [concrete] -// CHECK:STDOUT: %i.var_patt: %pattern_type.906 = var_pattern %i.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %i.var: ref %Inner = var %i.var_patt -// CHECK:STDOUT: %.loc22: type = splice_block %Inner.ref [concrete = constants.%Inner] { -// CHECK:STDOUT: %o.ref: %Outer = name_ref o, %o -// CHECK:STDOUT: %Inner.ref: type = name_ref Inner, @Outer.%Inner.decl [concrete = constants.%Inner] -// CHECK:STDOUT: } -// CHECK:STDOUT: %i: ref %Inner = bind_name i, %i.var -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/no_prelude/abstract_in_struct.carbon b/toolchain/check/testdata/class/no_prelude/abstract_in_struct.carbon new file mode 100644 index 0000000000000..6c8ded48f53b6 --- /dev/null +++ b/toolchain/check/testdata/class/no_prelude/abstract_in_struct.carbon @@ -0,0 +1,141 @@ +// Part of the Carbon Language project, under the Apache License v2.0 with LLVM +// Exceptions. See /LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// +// AUTOUPDATE +// TIP: To test this file alone, run: +// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/no_prelude/abstract_in_struct.carbon +// TIP: To dump output, run: +// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/no_prelude/abstract_in_struct.carbon + +// --- fail_abstract_field.carbon +library "[[@TEST_NAME]]"; + +abstract class Abstract1 {} + +class Contains { + // CHECK:STDERR: fail_abstract_field.carbon:[[@LINE+7]]:10: error: field has abstract type `{.m1: Abstract1}` [AbstractTypeInFieldDecl] + // CHECK:STDERR: var a: {.m1: Abstract1}; + // CHECK:STDERR: ^~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_abstract_field.carbon:[[@LINE-6]]:1: note: uses class that was declared abstract here [ClassAbstractHere] + // CHECK:STDERR: abstract class Abstract1 {} + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + var a: {.m1: Abstract1}; +} + +// --- fail_abstract_var.carbon +library "[[@TEST_NAME]]"; + +abstract class Abstract2 {} + +// CHECK:STDERR: fail_abstract_var.carbon:[[@LINE+7]]:8: error: binding pattern has abstract type `{.m2: Abstract2}` in `var` pattern [AbstractTypeInVarPattern] +// CHECK:STDERR: var v: {.m2: Abstract2}; +// CHECK:STDERR: ^~~~~~~~~~~~~~~~ +// CHECK:STDERR: fail_abstract_var.carbon:[[@LINE-5]]:1: note: uses class that was declared abstract here [ClassAbstractHere] +// CHECK:STDERR: abstract class Abstract2 {} +// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~ +// CHECK:STDERR: +var v: {.m2: Abstract2}; + +// --- abstract_let.carbon +library "[[@TEST_NAME]]"; + +abstract class Abstract3 { +} + +fn F(a: Abstract3) { + // TODO: This should probably require `partial`. + //@dump-sem-ir-begin + let l: {.m3: Abstract3} = {.m3 = a}; + //@dump-sem-ir-end +} + +// --- fail_abstract_twice.carbon +library "[[@TEST_NAME]]"; + +abstract class Abstract4 {} +abstract class Abstract5 {} + +// CHECK:STDERR: fail_abstract_twice.carbon:[[@LINE+7]]:9: error: binding pattern has abstract type `{.m4: Abstract4, .m5: Abstract5}` in `var` pattern [AbstractTypeInVarPattern] +// CHECK:STDERR: var v2: {.m4: Abstract4, .m5: Abstract5}; +// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// CHECK:STDERR: fail_abstract_twice.carbon:[[@LINE-6]]:1: note: uses class that was declared abstract here [ClassAbstractHere] +// CHECK:STDERR: abstract class Abstract4 {} +// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~ +// CHECK:STDERR: +var v2: {.m4: Abstract4, .m5: Abstract5}; + +// --- fail_abstract_first.carbon +library "[[@TEST_NAME]]"; + +abstract class Abstract6 {} + +// CHECK:STDERR: fail_abstract_first.carbon:[[@LINE+7]]:9: error: binding pattern has abstract type `{.m6: Abstract6, .c1: ()}` in `var` pattern [AbstractTypeInVarPattern] +// CHECK:STDERR: var v3: {.m6: Abstract6, .c1: ()}; +// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~ +// CHECK:STDERR: fail_abstract_first.carbon:[[@LINE-5]]:1: note: uses class that was declared abstract here [ClassAbstractHere] +// CHECK:STDERR: abstract class Abstract6 {} +// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~ +// CHECK:STDERR: +var v3: {.m6: Abstract6, .c1: ()}; + +// --- fail_abstract_second.carbon +library "[[@TEST_NAME]]"; + +abstract class Abstract7 {} + +// CHECK:STDERR: fail_abstract_second.carbon:[[@LINE+7]]:9: error: binding pattern has abstract type `{.c2: (), .m7: Abstract7}` in `var` pattern [AbstractTypeInVarPattern] +// CHECK:STDERR: var v4: {.c2: (), .m7: Abstract7}; +// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~ +// CHECK:STDERR: fail_abstract_second.carbon:[[@LINE-5]]:1: note: uses class that was declared abstract here [ClassAbstractHere] +// CHECK:STDERR: abstract class Abstract7 {} +// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~ +// CHECK:STDERR: +var v4: {.c2: (), .m7: Abstract7}; + +// --- lib.carbon +library "[[@TEST_NAME]]"; + +abstract class Abstract {} + +// --- fail_import.carbon +library "[[@TEST_NAME]]"; + +import library "lib"; + +// CHECK:STDERR: fail_import.carbon:[[@LINE+8]]:9: error: binding pattern has abstract type `{.m: Abstract}` in `var` pattern [AbstractTypeInVarPattern] +// CHECK:STDERR: var v5: {.m: Abstract}; +// CHECK:STDERR: ^~~~~~~~~~~~~~ +// CHECK:STDERR: fail_import.carbon:[[@LINE-5]]:1: in import [InImport] +// CHECK:STDERR: lib.carbon:3:1: note: uses class that was declared abstract here [ClassAbstractHere] +// CHECK:STDERR: abstract class Abstract {} +// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~ +// CHECK:STDERR: +var v5: {.m: Abstract}; + +// CHECK:STDOUT: --- abstract_let.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %Abstract3: type = class_type @Abstract3 [concrete] +// CHECK:STDOUT: %struct_type.m3.fe4: type = struct_type {.m3: %Abstract3} [concrete] +// CHECK:STDOUT: %pattern_type.a22: type = pattern_type %struct_type.m3.fe4 [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @F(%a.param: %Abstract3) { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %l.patt: %pattern_type.a22 = binding_pattern l [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: %a.ref: %Abstract3 = name_ref a, %a +// CHECK:STDOUT: %.loc9_37: %struct_type.m3.fe4 = struct_literal (%a.ref) +// CHECK:STDOUT: %.loc9_25: type = splice_block %struct_type.m3 [concrete = constants.%struct_type.m3.fe4] { +// CHECK:STDOUT: %Abstract3.ref.loc9: type = name_ref Abstract3, file.%Abstract3.decl [concrete = constants.%Abstract3] +// CHECK:STDOUT: %struct_type.m3: type = struct_type {.m3: %Abstract3} [concrete = constants.%struct_type.m3.fe4] +// CHECK:STDOUT: } +// CHECK:STDOUT: %l: %struct_type.m3.fe4 = bind_name l, +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/no_prelude/access_inheritance.carbon b/toolchain/check/testdata/class/no_prelude/access_inheritance.carbon new file mode 100644 index 0000000000000..e5b9d2a7409d7 --- /dev/null +++ b/toolchain/check/testdata/class/no_prelude/access_inheritance.carbon @@ -0,0 +1,230 @@ +// Part of the Carbon Language project, under the Apache License v2.0 with LLVM +// Exceptions. See /LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// +// AUTOUPDATE +// TIP: To test this file alone, run: +// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/no_prelude/access_inheritance.carbon +// TIP: To dump output, run: +// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/no_prelude/access_inheritance.carbon + + +// --- instance_protected_field_access.carbon + +library "[[@TEST_NAME]]"; + +base class Shape { + protected var x: (); + protected var y: (); +} + +class Circle { + extend base: Shape; + + fn GetPosition[self: Self]() -> ((), ()) { + return (self.x, self.y); + } +} + +// --- shadowing_access.carbon + +library "[[@TEST_NAME]]"; + +base class A { + fn F(); +} + +base class B { + extend base: A; + private fn F() -> (); +} + +base class C { + extend base: B; + fn G[self: Self]() -> () { return self.F(); } +} + +// --- inherited_member_access.carbon + +library "[[@TEST_NAME]]"; + +base class A { + protected let SOME_CONSTANT: () = (); + protected fn SomeProtectedFunction() -> () { + return (); + } +} + +class B { + extend base: A; + + fn G() -> () { + return A.SOME_CONSTANT; + } + + fn H() -> () { + return A.SomeProtectedFunction(); + } +} + +// --- fail_inherited_private_field_access.carbon + +library "[[@TEST_NAME]]"; + +base class Shape { + private var y: (); +} + +class Square { + extend base: Shape; + + fn GetPosition[self: Self]() -> () { + // CHECK:STDERR: fail_inherited_private_field_access.carbon:[[@LINE+7]]:12: error: cannot access private member `y` of type `Shape` [ClassInvalidMemberAccess] + // CHECK:STDERR: return self.y; + // CHECK:STDERR: ^~~~~~ + // CHECK:STDERR: fail_inherited_private_field_access.carbon:[[@LINE-10]]:15: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: private var y: (); + // CHECK:STDERR: ^~~~~ + // CHECK:STDERR: + return self.y; + } +} + +// --- noninstance_private_on_self.carbon + +library "[[@TEST_NAME]]"; + +class C { + private fn F() {} + fn G() { Self.F(); } +} + +// --- noninstance_protected_on_self.carbon + +library "[[@TEST_NAME]]"; + +class C { + protected fn F() {} + fn G() { Self.F(); } +} + +// --- fail_noninstance_private_on_parent.carbon + +library "[[@TEST_NAME]]"; + +base class B { + private fn F() {} +} + +class C { + extend base: B; + // CHECK:STDERR: fail_noninstance_private_on_parent.carbon:[[@LINE+7]]:12: error: cannot access private member `F` of type `B` [ClassInvalidMemberAccess] + // CHECK:STDERR: fn G() { Self.F(); } + // CHECK:STDERR: ^~~~~~ + // CHECK:STDERR: fail_noninstance_private_on_parent.carbon:[[@LINE-8]]:3: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: private fn F() {} + // CHECK:STDERR: ^~~~~~~~~~~~~~~~ + // CHECK:STDERR: + fn G() { Self.F(); } +} + +// --- noninstance_protected_on_parent.carbon + +library "[[@TEST_NAME]]"; + +base class B { + protected fn F() {} +} + +class C { + extend base: B; + fn G() { Self.F(); } +} + +// --- fail_non_inherited_access.carbon + +library "[[@TEST_NAME]]"; + +base class A { + protected let SOME_PROTECTED_CONSTANT: () = (); + private let SOME_PRIVATE_CONSTANT: () = (); +} + +base class Internal { + protected let INTERNAL_CONSTANT: () = (); +} + +class B { + private var internal: Internal; + + fn G() -> () { + // CHECK:STDERR: fail_non_inherited_access.carbon:[[@LINE+7]]:5: error: cannot access private member `SOME_PRIVATE_CONSTANT` of type `A` [ClassInvalidMemberAccess] + // CHECK:STDERR: A.SOME_PRIVATE_CONSTANT; + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_non_inherited_access.carbon:[[@LINE-14]]:15: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: private let SOME_PRIVATE_CONSTANT: () = (); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + A.SOME_PRIVATE_CONSTANT; + + // CHECK:STDERR: fail_non_inherited_access.carbon:[[@LINE+7]]:12: error: cannot access protected member `SOME_PROTECTED_CONSTANT` of type `A` [ClassInvalidMemberAccess] + // CHECK:STDERR: return A.SOME_PROTECTED_CONSTANT; + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_non_inherited_access.carbon:[[@LINE-24]]:17: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: protected let SOME_PROTECTED_CONSTANT: () = (); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + return A.SOME_PROTECTED_CONSTANT; + } + + fn SomeFunc[self: Self]() -> () { + // CHECK:STDERR: fail_non_inherited_access.carbon:[[@LINE+7]]:12: error: cannot access protected member `INTERNAL_CONSTANT` of type `Internal` [ClassInvalidMemberAccess] + // CHECK:STDERR: return self.internal.INTERNAL_CONSTANT; + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_non_inherited_access.carbon:[[@LINE-30]]:17: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: protected let INTERNAL_CONSTANT: () = (); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + return self.internal.INTERNAL_CONSTANT; + } +} + +// --- fail_compound_member_access.carbon + +library "[[@TEST_NAME]]"; + +base class A { + private var x: (); +} + +class B { + extend base: A; + fn F[self: Self]() { + // CHECK:STDERR: fail_compound_member_access.carbon:[[@LINE+7]]:11: error: cannot access private member `x` of type `A` [ClassInvalidMemberAccess] + // CHECK:STDERR: self.(A.x); + // CHECK:STDERR: ^~~ + // CHECK:STDERR: fail_compound_member_access.carbon:[[@LINE-9]]:15: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: private var x: (); + // CHECK:STDERR: ^~~~~ + // CHECK:STDERR: + self.(A.x); + } +} + +// --- inherited_compound_member_access.carbon + +library "[[@TEST_NAME]]"; + +base class A { + protected var x: (); +} + +class B { + extend base: A; + + fn F[self: Self]() { + self.(A.x); + } +} diff --git a/toolchain/check/testdata/class/no_prelude/access_modifers.carbon b/toolchain/check/testdata/class/no_prelude/access_modifers.carbon new file mode 100644 index 0000000000000..7ec7ab1703a19 --- /dev/null +++ b/toolchain/check/testdata/class/no_prelude/access_modifers.carbon @@ -0,0 +1,175 @@ +// Part of the Carbon Language project, under the Apache License v2.0 with LLVM +// Exceptions. See /LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// +// AUTOUPDATE +// TIP: To test this file alone, run: +// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/no_prelude/access_modifers.carbon +// TIP: To dump output, run: +// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/no_prelude/access_modifers.carbon + +// --- fail_private_field_access.carbon + +library "[[@TEST_NAME]]"; + +class C { + private var x: {}; + private let SOME_INTERNAL_CONSTANT: {} = {}; + + private fn SomeInternalFunction() -> {} { + return {}; + } + + fn Make() -> Self { + return {.x = {}}; + } +} + +fn Run() { + let c: C = C.Make(); + // CHECK:STDERR: fail_private_field_access.carbon:[[@LINE+7]]:15: error: cannot access private member `x` of type `C` [ClassInvalidMemberAccess] + // CHECK:STDERR: let x: {} = c.x; + // CHECK:STDERR: ^~~ + // CHECK:STDERR: fail_private_field_access.carbon:[[@LINE-17]]:15: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: private var x: {}; + // CHECK:STDERR: ^~~~~ + // CHECK:STDERR: + let x: {} = c.x; + // CHECK:STDERR: fail_private_field_access.carbon:[[@LINE+7]]:3: error: cannot access private member `x` of type `C` [ClassInvalidMemberAccess] + // CHECK:STDERR: c.x = {}; + // CHECK:STDERR: ^~~ + // CHECK:STDERR: fail_private_field_access.carbon:[[@LINE-25]]:15: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: private var x: {}; + // CHECK:STDERR: ^~~~~ + // CHECK:STDERR: + c.x = {}; + // CHECK:STDERR: fail_private_field_access.carbon:[[@LINE+7]]:3: error: cannot access private member `SOME_INTERNAL_CONSTANT` of type `C` [ClassInvalidMemberAccess] + // CHECK:STDERR: c.SOME_INTERNAL_CONSTANT; + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_private_field_access.carbon:[[@LINE-32]]:15: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: private let SOME_INTERNAL_CONSTANT: {} = {}; + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + c.SOME_INTERNAL_CONSTANT; + + // CHECK:STDERR: fail_private_field_access.carbon:[[@LINE+7]]:3: error: cannot access private member `SomeInternalFunction` of type `C` [ClassInvalidMemberAccess] + // CHECK:STDERR: c.SomeInternalFunction(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_private_field_access.carbon:[[@LINE-39]]:3: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: private fn SomeInternalFunction() -> {} { + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + c.SomeInternalFunction(); +} + +// --- fail_protected_field_access.carbon + +library "[[@TEST_NAME]]"; + +class A { + protected var x: {}; +} + +fn Run() { + // CHECK:STDERR: fail_protected_field_access.carbon:[[@LINE+7]]:15: error: cannot access protected member `x` of type `A` [ClassInvalidMemberAccess] + // CHECK:STDERR: let x: {} = A.x; + // CHECK:STDERR: ^~~ + // CHECK:STDERR: fail_protected_field_access.carbon:[[@LINE-7]]:17: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: protected var x: {}; + // CHECK:STDERR: ^~~~~ + // CHECK:STDERR: + let x: {} = A.x; +} + +// --- instance_private_field_access_on_self.carbon + +library "[[@TEST_NAME]]"; + +class C { + //@dump-sem-ir-begin + private var x: {}; + //@dump-sem-ir-end + + fn GetRadius[self: Self]() -> {} { + return self.x; + } + + private fn SomeInternalFunction() -> {} { + return {}; + } + + fn Compute[self: Self]() -> {} { + return self.SomeInternalFunction(); + } +} + +// --- public_global_access.carbon + +library "[[@TEST_NAME]]"; + +class A { + let x: () = (); +} + +let x: () = A.x; + +// --- fail_global_access.carbon + +library "[[@TEST_NAME]]"; + +class A { + protected let x: () = (); + private let y: {} = {}; +} + +// CHECK:STDERR: fail_global_access.carbon:[[@LINE+7]]:13: error: cannot access protected member `x` of type `A` [ClassInvalidMemberAccess] +// CHECK:STDERR: let x: () = A.x; +// CHECK:STDERR: ^~~ +// CHECK:STDERR: fail_global_access.carbon:[[@LINE-7]]:17: note: declared here [ClassMemberDeclaration] +// CHECK:STDERR: protected let x: () = (); +// CHECK:STDERR: ^ +// CHECK:STDERR: +let x: () = A.x; +// CHECK:STDERR: fail_global_access.carbon:[[@LINE+7]]:13: error: cannot access private member `y` of type `A` [ClassInvalidMemberAccess] +// CHECK:STDERR: let y: {} = A.y; +// CHECK:STDERR: ^~~ +// CHECK:STDERR: fail_global_access.carbon:[[@LINE-14]]:15: note: declared here [ClassMemberDeclaration] +// CHECK:STDERR: private let y: {} = {}; +// CHECK:STDERR: ^ +// CHECK:STDERR: +let y: {} = A.y; + +// --- self_access.carbon + +library "[[@TEST_NAME]]"; + +class A { + private fn F() {} + private fn G() { Self.F(); } +} + +// CHECK:STDOUT: --- instance_private_field_access_on_self.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %C: type = class_type @C [concrete] +// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] +// CHECK:STDOUT: %C.elem: type = unbound_element_type %C, %empty_struct_type [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: class @C { +// CHECK:STDOUT: %.loc6_19.1: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc6_19.2: type = converted %.loc6_19.1, constants.%empty_struct_type [concrete = constants.%empty_struct_type] +// CHECK:STDOUT: %.loc6_16: %C.elem = field_decl x, element0 [concrete] +// CHECK:STDOUT: +// CHECK:STDOUT: complete_type_witness = %complete_type +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = constants.%C +// CHECK:STDOUT: .x [private] = %.loc6_16 +// CHECK:STDOUT: .GetRadius = %GetRadius.decl +// CHECK:STDOUT: .SomeInternalFunction [private] = %SomeInternalFunction.decl +// CHECK:STDOUT: .Compute = %Compute.decl +// CHECK:STDOUT: } +// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/no_prelude/base.carbon b/toolchain/check/testdata/class/no_prelude/base.carbon new file mode 100644 index 0000000000000..b7f0451e83d87 --- /dev/null +++ b/toolchain/check/testdata/class/no_prelude/base.carbon @@ -0,0 +1,589 @@ +// Part of the Carbon Language project, under the Apache License v2.0 with LLVM +// Exceptions. See /LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// +// AUTOUPDATE +// TIP: To test this file alone, run: +// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/no_prelude/base.carbon +// TIP: To dump output, run: +// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/no_prelude/base.carbon + +// --- base.carbon + +library "[[@TEST_NAME]]"; + +//@dump-sem-ir-begin +base class Base { + var b: {}; +} + +class Derived { + extend base: Base; + + var d: {}; +} +//@dump-sem-ir-end + +fn Make() -> Derived { + //@dump-sem-ir-begin + return {.base = {.b = {}}, .d = {}}; + //@dump-sem-ir-end +} + +fn Access(d: Derived) -> ({}, {}) { + //@dump-sem-ir-begin + return (d.d, d.base.b); + //@dump-sem-ir-end +} + +// --- base_field.carbon + +library "[[@TEST_NAME]]"; + +base class Base { + var a: {}; + var b: {}; + var c: {}; +} + +class Derived { + extend base: Base; + + var d: {}; + var e: {}; +} + +fn Access(p: Derived*) -> {}* { + //@dump-sem-ir-begin + return &(*p).c; + //@dump-sem-ir-end +} + +// --- fail_base_after_field.carbon + +library "[[@TEST_NAME]]"; + +base class Base { +} + +class Derived { + var d: {}; + + // CHECK:STDERR: fail_base_after_field.carbon:[[@LINE+4]]:3: error: `base` declaration must appear before field declarations [BaseDeclAfterFieldDecl] + // CHECK:STDERR: extend base: Base; + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + extend base: Base; +} + +// --- compound_field.carbon + +library "[[@TEST_NAME]]"; + +base class Base { + var a: {}; + var b: {}; + var c: {}; +} + +class Derived { + extend base: Base; + + var d: {}; + var e: {}; +} + +//@dump-sem-ir-begin +fn AccessDerived(d: Derived) -> {} { + return d.(Derived.d); +} + +fn AccessBase(d: Derived) -> {} { + return d.(Base.b); +} + +fn AccessDerivedIndirect(p: Derived*) -> {}* { + return &p->(Derived.d); +} + +fn AccessBaseIndirect(p: Derived*) -> {}* { + return &p->(Base.b); +} +//@dump-sem-ir-end + +// --- fail_base_unbound.carbon + +library "[[@TEST_NAME]]"; + +base class B {} + +class C { + extend base: B; +} + +// CHECK:STDERR: fail_base_unbound.carbon:[[@LINE+4]]:12: error: expression cannot be used as a value [UseOfNonExprAsValue] +// CHECK:STDERR: let b: B = C.base; +// CHECK:STDERR: ^~~~~~ +// CHECK:STDERR: +let b: B = C.base; + +// --- fail_base_as_declared_name.carbon + +namespace N; + +// CHECK:STDERR: fail_base_as_declared_name.carbon:[[@LINE+8]]:6: error: `.` should be followed by a name [ExpectedDeclNameAfterPeriod] +// CHECK:STDERR: fn N.base() {} +// CHECK:STDERR: ^~~~ +// CHECK:STDERR: +// CHECK:STDERR: fail_base_as_declared_name.carbon:[[@LINE+4]]:6: error: semantics TODO: `handle invalid parse trees in `check`` [SemanticsTodo] +// CHECK:STDERR: fn N.base() {} +// CHECK:STDERR: ^~~~ +// CHECK:STDERR: +fn N.base() {} + +// --- fail_base_method_define.carbon + +library "[[@TEST_NAME]]"; + +base class B { + fn F(); + + class C { + fn F(); + } +} + +class D { + extend base: B; +} + +// CHECK:STDERR: fail_base_method_define.carbon:[[@LINE+4]]:6: error: out-of-line declaration requires a declaration in scoped entity [QualifiedDeclOutsideScopeEntity] +// CHECK:STDERR: fn D.F() {} +// CHECK:STDERR: ^ +// CHECK:STDERR: +fn D.F() {} + +// CHECK:STDERR: fail_base_method_define.carbon:[[@LINE+4]]:6: error: name `C` not found [NameNotFound] +// CHECK:STDERR: fn D.C.F() {} +// CHECK:STDERR: ^ +// CHECK:STDERR: +fn D.C.F() {} + +// --- fail_base_misplaced.carbon + +library "[[@TEST_NAME]]"; + +base class B {} + +// CHECK:STDERR: fail_base_misplaced.carbon:[[@LINE+4]]:1: error: `base` declaration outside class [ClassSpecificDeclOutsideClass] +// CHECK:STDERR: extend base: B; +// CHECK:STDERR: ^~~~~~~~~~~~~~~ +// CHECK:STDERR: +extend base: B; + +fn F() { + // CHECK:STDERR: fail_base_misplaced.carbon:[[@LINE+4]]:3: error: `base` declaration outside class [ClassSpecificDeclOutsideClass] + // CHECK:STDERR: extend base: B; + // CHECK:STDERR: ^~~~~~~~~~~~~~~ + // CHECK:STDERR: + extend base: B; +} + +class C { + fn F() { + // CHECK:STDERR: fail_base_misplaced.carbon:[[@LINE+4]]:5: error: `base` declaration outside class [ClassSpecificDeclOutsideClass] + // CHECK:STDERR: extend base: B; + // CHECK:STDERR: ^~~~~~~~~~~~~~~ + // CHECK:STDERR: + extend base: B; + } +} + +// --- fail_base_modifiers.carbon + +library "[[@TEST_NAME]]"; + +base class B {} + +class C1 { + // CHECK:STDERR: fail_base_modifiers.carbon:[[@LINE+4]]:3: error: `private` not allowed on `base` declaration [ModifierNotAllowedOnDeclaration] + // CHECK:STDERR: private extend base: B; + // CHECK:STDERR: ^~~~~~~ + // CHECK:STDERR: + private extend base: B; +} + +class C2 { + // CHECK:STDERR: fail_base_modifiers.carbon:[[@LINE+8]]:3: error: `abstract` not allowed on `base` declaration [ModifierNotAllowedOnDeclaration] + // CHECK:STDERR: abstract base: B; + // CHECK:STDERR: ^~~~~~~~ + // CHECK:STDERR: + // CHECK:STDERR: fail_base_modifiers.carbon:[[@LINE+4]]:3: error: missing `extend` before `base` declaration [BaseMissingExtend] + // CHECK:STDERR: abstract base: B; + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + abstract base: B; +} + +class C3 { + // CHECK:STDERR: fail_base_modifiers.carbon:[[@LINE+4]]:10: error: `default` not allowed on `base` declaration [ModifierNotAllowedOnDeclaration] + // CHECK:STDERR: extend default base: B; + // CHECK:STDERR: ^~~~~~~ + // CHECK:STDERR: + extend default base: B; +} + +class C4 { + // CHECK:STDERR: fail_base_modifiers.carbon:[[@LINE+7]]:10: error: `extend` repeated on declaration [ModifierRepeated] + // CHECK:STDERR: extend extend base: B; + // CHECK:STDERR: ^~~~~~ + // CHECK:STDERR: fail_base_modifiers.carbon:[[@LINE+4]]:3: note: `extend` previously appeared here [ModifierPrevious] + // CHECK:STDERR: extend extend base: B; + // CHECK:STDERR: ^~~~~~ + // CHECK:STDERR: + extend extend base: B; +} + +// --- fail_base_no_extend.carbon + +library "[[@TEST_NAME]]"; + +base class B {} + +class C { + // CHECK:STDERR: fail_base_no_extend.carbon:[[@LINE+4]]:3: error: missing `extend` before `base` declaration [BaseMissingExtend] + // CHECK:STDERR: base: B; + // CHECK:STDERR: ^~~~~~~~ + // CHECK:STDERR: + base: B; +} + +// --- fail_base_repeated.carbon + +library "[[@TEST_NAME]]"; + +base class B1 {} +base class B2 {} + +class C { + extend base: B1; + // CHECK:STDERR: fail_base_repeated.carbon:[[@LINE+7]]:3: error: multiple `base` declarations in class; multiple inheritance is not permitted [BaseDeclRepeated] + // CHECK:STDERR: extend base: B2; + // CHECK:STDERR: ^~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_repeated.carbon:[[@LINE-4]]:3: note: previous `base` declaration is here [ClassSpecificDeclPrevious] + // CHECK:STDERR: extend base: B1; + // CHECK:STDERR: ^~~~~~~~~~~~~~~~ + // CHECK:STDERR: + extend base: B2; +} + +class D { + // TODO: Consider adding a custom diagnostic for this case. + extend base: B1; + // CHECK:STDERR: fail_base_repeated.carbon:[[@LINE+7]]:3: error: multiple `base` declarations in class; multiple inheritance is not permitted [BaseDeclRepeated] + // CHECK:STDERR: extend base: B1; + // CHECK:STDERR: ^~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_repeated.carbon:[[@LINE-4]]:3: note: previous `base` declaration is here [ClassSpecificDeclPrevious] + // CHECK:STDERR: extend base: B1; + // CHECK:STDERR: ^~~~~~~~~~~~~~~~ + // CHECK:STDERR: + extend base: B1; +} + +// --- fail_extend_cycle.carbon + +library "[[@TEST_NAME]]"; + +base class A { +} + +base class B { + // This ensures that the compiler treats A as complete. + extend base: A; +} + +// CHECK:STDERR: fail_extend_cycle.carbon:[[@LINE+7]]:1: error: redefinition of `class A` [RedeclRedef] +// CHECK:STDERR: base class A { +// CHECK:STDERR: ^~~~~~~~~~~~~~ +// CHECK:STDERR: fail_extend_cycle.carbon:[[@LINE-11]]:1: note: previously defined here [RedeclPrevDef] +// CHECK:STDERR: base class A { +// CHECK:STDERR: ^~~~~~~~~~~~~~ +// CHECK:STDERR: +base class A { + extend base: A; + // CHECK:STDERR: fail_extend_cycle.carbon:[[@LINE+4]]:10: error: name `C` not found [NameNotFound] + // CHECK:STDERR: var c: C; + // CHECK:STDERR: ^ + // CHECK:STDERR: + var c: C; +} + +// CHECK:STDOUT: --- base.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %Base: type = class_type @Base [concrete] +// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] +// CHECK:STDOUT: %Base.elem: type = unbound_element_type %Base, %empty_struct_type [concrete] +// CHECK:STDOUT: %struct_type.b.347: type = struct_type {.b: %empty_struct_type} [concrete] +// CHECK:STDOUT: %complete_type.66e: = complete_type_witness %struct_type.b.347 [concrete] +// CHECK:STDOUT: %Derived: type = class_type @Derived [concrete] +// CHECK:STDOUT: %Derived.elem.69e: type = unbound_element_type %Derived, %Base [concrete] +// CHECK:STDOUT: %Derived.elem.ad9: type = unbound_element_type %Derived, %empty_struct_type [concrete] +// CHECK:STDOUT: %struct_type.base.d.f04: type = struct_type {.base: %Base, .d: %empty_struct_type} [concrete] +// CHECK:STDOUT: %complete_type.fa5: = complete_type_witness %struct_type.base.d.f04 [concrete] +// CHECK:STDOUT: %struct_type.base.d.aae: type = struct_type {.base: %struct_type.b.347, .d: %empty_struct_type} [concrete] +// CHECK:STDOUT: %empty_struct: %empty_struct_type = struct_value () [concrete] +// CHECK:STDOUT: %Base.val: %Base = struct_value (%empty_struct) [concrete] +// CHECK:STDOUT: %Derived.val: %Derived = struct_value (%Base.val, %empty_struct) [concrete] +// CHECK:STDOUT: %tuple.type.b6b: type = tuple_type (%empty_struct_type, %empty_struct_type) [concrete] +// CHECK:STDOUT: %tuple: %tuple.type.b6b = tuple_value (%empty_struct, %empty_struct) [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: file { +// CHECK:STDOUT: %Base.decl: type = class_decl @Base [concrete = constants.%Base] {} {} +// CHECK:STDOUT: %Derived.decl: type = class_decl @Derived [concrete = constants.%Derived] {} {} +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: class @Base { +// CHECK:STDOUT: %.loc6_11.1: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc6_11.2: type = converted %.loc6_11.1, constants.%empty_struct_type [concrete = constants.%empty_struct_type] +// CHECK:STDOUT: %.loc6_8: %Base.elem = field_decl b, element0 [concrete] +// CHECK:STDOUT: %struct_type.b: type = struct_type {.b: %empty_struct_type} [concrete = constants.%struct_type.b.347] +// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.b [concrete = constants.%complete_type.66e] +// CHECK:STDOUT: complete_type_witness = %complete_type +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = constants.%Base +// CHECK:STDOUT: .b = %.loc6_8 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: class @Derived { +// CHECK:STDOUT: %Base.ref: type = name_ref Base, file.%Base.decl [concrete = constants.%Base] +// CHECK:STDOUT: %.loc10: %Derived.elem.69e = base_decl %Base.ref, element0 [concrete] +// CHECK:STDOUT: %.loc12_11.1: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc12_11.2: type = converted %.loc12_11.1, constants.%empty_struct_type [concrete = constants.%empty_struct_type] +// CHECK:STDOUT: %.loc12_8: %Derived.elem.ad9 = field_decl d, element1 [concrete] +// CHECK:STDOUT: %struct_type.base.d: type = struct_type {.base: %Base, .d: %empty_struct_type} [concrete = constants.%struct_type.base.d.f04] +// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base.d [concrete = constants.%complete_type.fa5] +// CHECK:STDOUT: complete_type_witness = %complete_type +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = constants.%Derived +// CHECK:STDOUT: .Base = +// CHECK:STDOUT: .base = %.loc10 +// CHECK:STDOUT: .d = %.loc12_8 +// CHECK:STDOUT: extend %Base.ref +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @Make() -> %return.param: %Derived { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %.loc18_26.1: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc18_27.1: %struct_type.b.347 = struct_literal (%.loc18_26.1) +// CHECK:STDOUT: %.loc18_36.1: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc18_37.1: %struct_type.base.d.aae = struct_literal (%.loc18_27.1, %.loc18_36.1) +// CHECK:STDOUT: %.loc18_37.2: ref %Base = class_element_access %return, element0 +// CHECK:STDOUT: %.loc18_27.2: ref %empty_struct_type = class_element_access %.loc18_37.2, element0 +// CHECK:STDOUT: %.loc18_26.2: init %empty_struct_type = struct_init () to %.loc18_27.2 [concrete = constants.%empty_struct] +// CHECK:STDOUT: %.loc18_27.3: init %empty_struct_type = converted %.loc18_26.1, %.loc18_26.2 [concrete = constants.%empty_struct] +// CHECK:STDOUT: %.loc18_27.4: init %Base = class_init (%.loc18_27.3), %.loc18_37.2 [concrete = constants.%Base.val] +// CHECK:STDOUT: %.loc18_37.3: init %Base = converted %.loc18_27.1, %.loc18_27.4 [concrete = constants.%Base.val] +// CHECK:STDOUT: %.loc18_37.4: ref %empty_struct_type = class_element_access %return, element1 +// CHECK:STDOUT: %.loc18_36.2: init %empty_struct_type = struct_init () to %.loc18_37.4 [concrete = constants.%empty_struct] +// CHECK:STDOUT: %.loc18_37.5: init %empty_struct_type = converted %.loc18_36.1, %.loc18_36.2 [concrete = constants.%empty_struct] +// CHECK:STDOUT: %.loc18_37.6: init %Derived = class_init (%.loc18_37.3, %.loc18_37.5), %return [concrete = constants.%Derived.val] +// CHECK:STDOUT: %.loc18_38: init %Derived = converted %.loc18_37.1, %.loc18_37.6 [concrete = constants.%Derived.val] +// CHECK:STDOUT: return %.loc18_38 to %return +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @Access(%d.param: %Derived) -> %return.param: %tuple.type.b6b { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %d.ref.loc24_11: %Derived = name_ref d, %d +// CHECK:STDOUT: %d.ref.loc24_12: %Derived.elem.ad9 = name_ref d, @Derived.%.loc12_8 [concrete = @Derived.%.loc12_8] +// CHECK:STDOUT: %.loc24_12.1: ref %empty_struct_type = class_element_access %d.ref.loc24_11, element1 +// CHECK:STDOUT: %empty_struct.loc24_12: %empty_struct_type = struct_value () [concrete = constants.%empty_struct] +// CHECK:STDOUT: %.loc24_12.2: %empty_struct_type = converted %.loc24_12.1, %empty_struct.loc24_12 [concrete = constants.%empty_struct] +// CHECK:STDOUT: %d.ref.loc24_16: %Derived = name_ref d, %d +// CHECK:STDOUT: %base.ref: %Derived.elem.69e = name_ref base, @Derived.%.loc10 [concrete = @Derived.%.loc10] +// CHECK:STDOUT: %.loc24_17.1: ref %Base = class_element_access %d.ref.loc24_16, element0 +// CHECK:STDOUT: %.loc24_17.2: %Base = bind_value %.loc24_17.1 +// CHECK:STDOUT: %b.ref: %Base.elem = name_ref b, @Base.%.loc6_8 [concrete = @Base.%.loc6_8] +// CHECK:STDOUT: %.loc24_22.1: ref %empty_struct_type = class_element_access %.loc24_17.2, element0 +// CHECK:STDOUT: %empty_struct.loc24_22: %empty_struct_type = struct_value () [concrete = constants.%empty_struct] +// CHECK:STDOUT: %.loc24_22.2: %empty_struct_type = converted %.loc24_22.1, %empty_struct.loc24_22 [concrete = constants.%empty_struct] +// CHECK:STDOUT: %.loc24_24.1: %tuple.type.b6b = tuple_literal (%.loc24_12.2, %.loc24_22.2) +// CHECK:STDOUT: %tuple.elem0: ref %empty_struct_type = tuple_access %return, element0 +// CHECK:STDOUT: %.loc24_12.3: init %empty_struct_type = struct_init () to %tuple.elem0 [concrete = constants.%empty_struct] +// CHECK:STDOUT: %.loc24_24.2: init %empty_struct_type = converted %.loc24_12.2, %.loc24_12.3 [concrete = constants.%empty_struct] +// CHECK:STDOUT: %tuple.elem1: ref %empty_struct_type = tuple_access %return, element1 +// CHECK:STDOUT: %.loc24_22.3: init %empty_struct_type = struct_init () to %tuple.elem1 [concrete = constants.%empty_struct] +// CHECK:STDOUT: %.loc24_24.3: init %empty_struct_type = converted %.loc24_22.2, %.loc24_22.3 [concrete = constants.%empty_struct] +// CHECK:STDOUT: %.loc24_24.4: init %tuple.type.b6b = tuple_init (%.loc24_24.2, %.loc24_24.3) to %return [concrete = constants.%tuple] +// CHECK:STDOUT: %.loc24_25: init %tuple.type.b6b = converted %.loc24_24.1, %.loc24_24.4 [concrete = constants.%tuple] +// CHECK:STDOUT: return %.loc24_25 to %return +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: --- base_field.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %Base: type = class_type @Base [concrete] +// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] +// CHECK:STDOUT: %Base.elem: type = unbound_element_type %Base, %empty_struct_type [concrete] +// CHECK:STDOUT: %Derived: type = class_type @Derived [concrete] +// CHECK:STDOUT: %ptr.404: type = ptr_type %Derived [concrete] +// CHECK:STDOUT: %ptr.c28: type = ptr_type %empty_struct_type [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @Access(%p.param: %ptr.404) -> %ptr.c28 { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %p.ref: %ptr.404 = name_ref p, %p +// CHECK:STDOUT: %.loc19_12: ref %Derived = deref %p.ref +// CHECK:STDOUT: %c.ref: %Base.elem = name_ref c, @Base.%.loc7_8 [concrete = @Base.%.loc7_8] +// CHECK:STDOUT: %.loc19_15.1: ref %Base = class_element_access %.loc19_12, element0 +// CHECK:STDOUT: %.loc19_15.2: ref %Base = converted %.loc19_12, %.loc19_15.1 +// CHECK:STDOUT: %.loc19_15.3: ref %empty_struct_type = class_element_access %.loc19_15.2, element2 +// CHECK:STDOUT: %addr: %ptr.c28 = addr_of %.loc19_15.3 +// CHECK:STDOUT: return %addr +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: --- compound_field.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %Base: type = class_type @Base [concrete] +// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] +// CHECK:STDOUT: %Base.elem: type = unbound_element_type %Base, %empty_struct_type [concrete] +// CHECK:STDOUT: %Derived: type = class_type @Derived [concrete] +// CHECK:STDOUT: %Derived.elem.ad9: type = unbound_element_type %Derived, %empty_struct_type [concrete] +// CHECK:STDOUT: %pattern_type.fb9: type = pattern_type %Derived [concrete] +// CHECK:STDOUT: %pattern_type.a96: type = pattern_type %empty_struct_type [concrete] +// CHECK:STDOUT: %AccessDerived.type: type = fn_type @AccessDerived [concrete] +// CHECK:STDOUT: %AccessDerived: %AccessDerived.type = struct_value () [concrete] +// CHECK:STDOUT: %empty_struct: %empty_struct_type = struct_value () [concrete] +// CHECK:STDOUT: %AccessBase.type: type = fn_type @AccessBase [concrete] +// CHECK:STDOUT: %AccessBase: %AccessBase.type = struct_value () [concrete] +// CHECK:STDOUT: %ptr.404: type = ptr_type %Derived [concrete] +// CHECK:STDOUT: %pattern_type.605: type = pattern_type %ptr.404 [concrete] +// CHECK:STDOUT: %ptr.c28: type = ptr_type %empty_struct_type [concrete] +// CHECK:STDOUT: %pattern_type.1cc: type = pattern_type %ptr.c28 [concrete] +// CHECK:STDOUT: %AccessDerivedIndirect.type: type = fn_type @AccessDerivedIndirect [concrete] +// CHECK:STDOUT: %AccessDerivedIndirect: %AccessDerivedIndirect.type = struct_value () [concrete] +// CHECK:STDOUT: %AccessBaseIndirect.type: type = fn_type @AccessBaseIndirect [concrete] +// CHECK:STDOUT: %AccessBaseIndirect: %AccessBaseIndirect.type = struct_value () [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: file { +// CHECK:STDOUT: %AccessDerived.decl: %AccessDerived.type = fn_decl @AccessDerived [concrete = constants.%AccessDerived] { +// CHECK:STDOUT: %d.patt: %pattern_type.fb9 = binding_pattern d [concrete] +// CHECK:STDOUT: %d.param_patt: %pattern_type.fb9 = value_param_pattern %d.patt, call_param0 [concrete] +// CHECK:STDOUT: %return.patt: %pattern_type.a96 = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: %pattern_type.a96 = out_param_pattern %return.patt, call_param1 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc18_34.1: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc18_34.2: type = converted %.loc18_34.1, constants.%empty_struct_type [concrete = constants.%empty_struct_type] +// CHECK:STDOUT: %d.param: %Derived = value_param call_param0 +// CHECK:STDOUT: %Derived.ref.loc18: type = name_ref Derived, file.%Derived.decl [concrete = constants.%Derived] +// CHECK:STDOUT: %d: %Derived = bind_name d, %d.param +// CHECK:STDOUT: %return.param: ref %empty_struct_type = out_param call_param1 +// CHECK:STDOUT: %return: ref %empty_struct_type = return_slot %return.param +// CHECK:STDOUT: } +// CHECK:STDOUT: %AccessBase.decl: %AccessBase.type = fn_decl @AccessBase [concrete = constants.%AccessBase] { +// CHECK:STDOUT: %d.patt: %pattern_type.fb9 = binding_pattern d [concrete] +// CHECK:STDOUT: %d.param_patt: %pattern_type.fb9 = value_param_pattern %d.patt, call_param0 [concrete] +// CHECK:STDOUT: %return.patt: %pattern_type.a96 = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: %pattern_type.a96 = out_param_pattern %return.patt, call_param1 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc22_31.1: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc22_31.2: type = converted %.loc22_31.1, constants.%empty_struct_type [concrete = constants.%empty_struct_type] +// CHECK:STDOUT: %d.param: %Derived = value_param call_param0 +// CHECK:STDOUT: %Derived.ref: type = name_ref Derived, file.%Derived.decl [concrete = constants.%Derived] +// CHECK:STDOUT: %d: %Derived = bind_name d, %d.param +// CHECK:STDOUT: %return.param: ref %empty_struct_type = out_param call_param1 +// CHECK:STDOUT: %return: ref %empty_struct_type = return_slot %return.param +// CHECK:STDOUT: } +// CHECK:STDOUT: %AccessDerivedIndirect.decl: %AccessDerivedIndirect.type = fn_decl @AccessDerivedIndirect [concrete = constants.%AccessDerivedIndirect] { +// CHECK:STDOUT: %p.patt: %pattern_type.605 = binding_pattern p [concrete] +// CHECK:STDOUT: %p.param_patt: %pattern_type.605 = value_param_pattern %p.patt, call_param0 [concrete] +// CHECK:STDOUT: %return.patt: %pattern_type.1cc = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: %pattern_type.1cc = out_param_pattern %return.patt, call_param1 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc26_43: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc26_44: type = converted %.loc26_43, constants.%empty_struct_type [concrete = constants.%empty_struct_type] +// CHECK:STDOUT: %ptr.loc26_44: type = ptr_type %.loc26_44 [concrete = constants.%ptr.c28] +// CHECK:STDOUT: %p.param: %ptr.404 = value_param call_param0 +// CHECK:STDOUT: %.loc26_36: type = splice_block %ptr.loc26_36 [concrete = constants.%ptr.404] { +// CHECK:STDOUT: %Derived.ref.loc26: type = name_ref Derived, file.%Derived.decl [concrete = constants.%Derived] +// CHECK:STDOUT: %ptr.loc26_36: type = ptr_type %Derived.ref.loc26 [concrete = constants.%ptr.404] +// CHECK:STDOUT: } +// CHECK:STDOUT: %p: %ptr.404 = bind_name p, %p.param +// CHECK:STDOUT: %return.param: ref %ptr.c28 = out_param call_param1 +// CHECK:STDOUT: %return: ref %ptr.c28 = return_slot %return.param +// CHECK:STDOUT: } +// CHECK:STDOUT: %AccessBaseIndirect.decl: %AccessBaseIndirect.type = fn_decl @AccessBaseIndirect [concrete = constants.%AccessBaseIndirect] { +// CHECK:STDOUT: %p.patt: %pattern_type.605 = binding_pattern p [concrete] +// CHECK:STDOUT: %p.param_patt: %pattern_type.605 = value_param_pattern %p.patt, call_param0 [concrete] +// CHECK:STDOUT: %return.patt: %pattern_type.1cc = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: %pattern_type.1cc = out_param_pattern %return.patt, call_param1 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc30_40: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc30_41: type = converted %.loc30_40, constants.%empty_struct_type [concrete = constants.%empty_struct_type] +// CHECK:STDOUT: %ptr.loc30_41: type = ptr_type %.loc30_41 [concrete = constants.%ptr.c28] +// CHECK:STDOUT: %p.param: %ptr.404 = value_param call_param0 +// CHECK:STDOUT: %.loc30_33: type = splice_block %ptr.loc30_33 [concrete = constants.%ptr.404] { +// CHECK:STDOUT: %Derived.ref: type = name_ref Derived, file.%Derived.decl [concrete = constants.%Derived] +// CHECK:STDOUT: %ptr.loc30_33: type = ptr_type %Derived.ref [concrete = constants.%ptr.404] +// CHECK:STDOUT: } +// CHECK:STDOUT: %p: %ptr.404 = bind_name p, %p.param +// CHECK:STDOUT: %return.param: ref %ptr.c28 = out_param call_param1 +// CHECK:STDOUT: %return: ref %ptr.c28 = return_slot %return.param +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @AccessDerived(%d.param: %Derived) -> %empty_struct_type { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %d.ref.loc19_10: %Derived = name_ref d, %d +// CHECK:STDOUT: %Derived.ref.loc19: type = name_ref Derived, file.%Derived.decl [concrete = constants.%Derived] +// CHECK:STDOUT: %d.ref.loc19_20: %Derived.elem.ad9 = name_ref d, @Derived.%.loc13_8 [concrete = @Derived.%.loc13_8] +// CHECK:STDOUT: %.loc19_11.1: ref %empty_struct_type = class_element_access %d.ref.loc19_10, element1 +// CHECK:STDOUT: %empty_struct: %empty_struct_type = struct_value () [concrete = constants.%empty_struct] +// CHECK:STDOUT: %.loc19_11.2: %empty_struct_type = converted %.loc19_11.1, %empty_struct [concrete = constants.%empty_struct] +// CHECK:STDOUT: return %.loc19_11.2 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @AccessBase(%d.param: %Derived) -> %empty_struct_type { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %d.ref: %Derived = name_ref d, %d +// CHECK:STDOUT: %Base.ref: type = name_ref Base, file.%Base.decl [concrete = constants.%Base] +// CHECK:STDOUT: %b.ref: %Base.elem = name_ref b, @Base.%.loc6_8 [concrete = @Base.%.loc6_8] +// CHECK:STDOUT: %.loc23_11.1: ref %Base = class_element_access %d.ref, element0 +// CHECK:STDOUT: %.loc23_11.2: ref %Base = converted %d.ref, %.loc23_11.1 +// CHECK:STDOUT: %.loc23_11.3: ref %empty_struct_type = class_element_access %.loc23_11.2, element1 +// CHECK:STDOUT: %empty_struct: %empty_struct_type = struct_value () [concrete = constants.%empty_struct] +// CHECK:STDOUT: %.loc23_20: %empty_struct_type = converted %.loc23_11.3, %empty_struct [concrete = constants.%empty_struct] +// CHECK:STDOUT: return %.loc23_20 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @AccessDerivedIndirect(%p.param: %ptr.404) -> %ptr.c28 { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %p.ref: %ptr.404 = name_ref p, %p +// CHECK:STDOUT: %Derived.ref.loc27: type = name_ref Derived, file.%Derived.decl [concrete = constants.%Derived] +// CHECK:STDOUT: %d.ref: %Derived.elem.ad9 = name_ref d, @Derived.%.loc13_8 [concrete = @Derived.%.loc13_8] +// CHECK:STDOUT: %.loc27_12.1: ref %Derived = deref %p.ref +// CHECK:STDOUT: %.loc27_12.2: ref %empty_struct_type = class_element_access %.loc27_12.1, element1 +// CHECK:STDOUT: %addr: %ptr.c28 = addr_of %.loc27_12.2 +// CHECK:STDOUT: return %addr +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @AccessBaseIndirect(%p.param: %ptr.404) -> %ptr.c28 { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %p.ref: %ptr.404 = name_ref p, %p +// CHECK:STDOUT: %Base.ref: type = name_ref Base, file.%Base.decl [concrete = constants.%Base] +// CHECK:STDOUT: %b.ref: %Base.elem = name_ref b, @Base.%.loc6_8 [concrete = @Base.%.loc6_8] +// CHECK:STDOUT: %.loc31_12.1: ref %Derived = deref %p.ref +// CHECK:STDOUT: %.loc31_12.2: ref %Base = class_element_access %.loc31_12.1, element0 +// CHECK:STDOUT: %.loc31_12.3: ref %Base = converted %.loc31_12.1, %.loc31_12.2 +// CHECK:STDOUT: %.loc31_12.4: ref %empty_struct_type = class_element_access %.loc31_12.3, element1 +// CHECK:STDOUT: %addr: %ptr.c28 = addr_of %.loc31_12.4 +// CHECK:STDOUT: return %addr +// CHECK:STDOUT: } +// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/no_prelude/base_function.carbon b/toolchain/check/testdata/class/no_prelude/base_function.carbon new file mode 100644 index 0000000000000..202f343c7f51a --- /dev/null +++ b/toolchain/check/testdata/class/no_prelude/base_function.carbon @@ -0,0 +1,374 @@ +// Part of the Carbon Language project, under the Apache License v2.0 with LLVM +// Exceptions. See /LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// +// AUTOUPDATE +// TIP: To test this file alone, run: +// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/no_prelude/base_function.carbon +// TIP: To dump output, run: +// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/no_prelude/base_function.carbon + +// --- base_method.carbon + +library "[[@TEST_NAME]]"; + +base class Base { + var a: {}; + + fn F[addr self: Self*](); +} + +fn Base.F[addr self: Self*]() { + (*self).a = {}; +} + +class Derived { + extend base: Base; +} + +fn Call(p: Derived*) { + //@dump-sem-ir-begin + (*p).F(); + //@dump-sem-ir-end +} + +// --- base_method_shadow.carbon + +library "[[@TEST_NAME]]"; + +base class A { + fn F[addr self: Self*](); +} + +base class B { + extend base: A; + fn F[addr self: Self*](); +} + +class C { + extend base: B; + fn F[addr self: Self*](); +} + +class D { + extend base: B; +} + +fn Call(a: A*, b: B*, c: C*, d: D*) { + //@dump-sem-ir-begin + (*a).F(); + (*b).F(); + (*c).F(); + (*d).F(); + //@dump-sem-ir-end +} + +// --- base_method_qualified.carbon + +library "[[@TEST_NAME]]"; + +class Derived; + +base class Base { + fn F[self: Self]() -> {}; + fn G[self: Derived]() -> {}; +} + +class Derived { + extend base: Base; + + fn F[self: Self](); + fn G[self: Self](); +} + +//@dump-sem-ir-begin +fn Call(a: Derived) -> {} { + return a.(Base.F)(); +} + +fn CallIndirect(p: Derived*) -> {} { + return p->(Base.F)(); +} + +fn PassDerivedToBase(a: Derived) -> {} { + return a.(Base.G)(); +} + +fn PassDerivedToBaseIndirect(p: Derived*) -> {} { + return p->(Base.G)(); +} +//@dump-sem-ir-end + +// --- base_function_unqualified.carbon + +library "[[@TEST_NAME]]"; + +base class Base { + fn F(); +} + +class Derived { + extend base: Base; + + fn G() { F(); } + fn H(); +} + +fn Derived.H() { + //@dump-sem-ir-begin + F(); + //@dump-sem-ir-end +} + +// CHECK:STDOUT: --- base_method.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %Base: type = class_type @Base [concrete] +// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] +// CHECK:STDOUT: %ptr.11f: type = ptr_type %Base [concrete] +// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] +// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] +// CHECK:STDOUT: %Derived: type = class_type @Derived [concrete] +// CHECK:STDOUT: %ptr.404: type = ptr_type %Derived [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @Call(%p.param: %ptr.404) { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %p.ref: %ptr.404 = name_ref p, %p +// CHECK:STDOUT: %.loc20_4.1: ref %Derived = deref %p.ref +// CHECK:STDOUT: %F.ref: %F.type = name_ref F, @Base.%F.decl [concrete = constants.%F] +// CHECK:STDOUT: %F.bound: = bound_method %.loc20_4.1, %F.ref +// CHECK:STDOUT: %addr.loc20_4.1: %ptr.404 = addr_of %.loc20_4.1 +// CHECK:STDOUT: %.loc20_4.2: ref %Derived = deref %addr.loc20_4.1 +// CHECK:STDOUT: %.loc20_4.3: ref %Base = class_element_access %.loc20_4.2, element0 +// CHECK:STDOUT: %addr.loc20_4.2: %ptr.11f = addr_of %.loc20_4.3 +// CHECK:STDOUT: %.loc20_4.4: %ptr.11f = converted %addr.loc20_4.1, %addr.loc20_4.2 +// CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.bound(%.loc20_4.4) +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: --- base_method_shadow.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %A: type = class_type @A [concrete] +// CHECK:STDOUT: %ptr.6db: type = ptr_type %A [concrete] +// CHECK:STDOUT: %F.type.649: type = fn_type @F.1 [concrete] +// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] +// CHECK:STDOUT: %F.485: %F.type.649 = struct_value () [concrete] +// CHECK:STDOUT: %B: type = class_type @B [concrete] +// CHECK:STDOUT: %ptr.e79: type = ptr_type %B [concrete] +// CHECK:STDOUT: %F.type.8c6: type = fn_type @F.2 [concrete] +// CHECK:STDOUT: %F.92a: %F.type.8c6 = struct_value () [concrete] +// CHECK:STDOUT: %C: type = class_type @C [concrete] +// CHECK:STDOUT: %ptr.019: type = ptr_type %C [concrete] +// CHECK:STDOUT: %F.type.c29: type = fn_type @F.3 [concrete] +// CHECK:STDOUT: %F.437: %F.type.c29 = struct_value () [concrete] +// CHECK:STDOUT: %D: type = class_type @D [concrete] +// CHECK:STDOUT: %ptr.19c: type = ptr_type %D [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @Call(%a.param: %ptr.6db, %b.param: %ptr.e79, %c.param: %ptr.019, %d.param: %ptr.19c) { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %a.ref: %ptr.6db = name_ref a, %a +// CHECK:STDOUT: %.loc24: ref %A = deref %a.ref +// CHECK:STDOUT: %F.ref.loc24: %F.type.649 = name_ref F, @A.%F.decl [concrete = constants.%F.485] +// CHECK:STDOUT: %F.bound.loc24: = bound_method %.loc24, %F.ref.loc24 +// CHECK:STDOUT: %addr.loc24: %ptr.6db = addr_of %.loc24 +// CHECK:STDOUT: %F.call.loc24: init %empty_tuple.type = call %F.bound.loc24(%addr.loc24) +// CHECK:STDOUT: %b.ref: %ptr.e79 = name_ref b, %b +// CHECK:STDOUT: %.loc25: ref %B = deref %b.ref +// CHECK:STDOUT: %F.ref.loc25: %F.type.8c6 = name_ref F, @B.%F.decl [concrete = constants.%F.92a] +// CHECK:STDOUT: %F.bound.loc25: = bound_method %.loc25, %F.ref.loc25 +// CHECK:STDOUT: %addr.loc25: %ptr.e79 = addr_of %.loc25 +// CHECK:STDOUT: %F.call.loc25: init %empty_tuple.type = call %F.bound.loc25(%addr.loc25) +// CHECK:STDOUT: %c.ref: %ptr.019 = name_ref c, %c +// CHECK:STDOUT: %.loc26: ref %C = deref %c.ref +// CHECK:STDOUT: %F.ref.loc26: %F.type.c29 = name_ref F, @C.%F.decl [concrete = constants.%F.437] +// CHECK:STDOUT: %F.bound.loc26: = bound_method %.loc26, %F.ref.loc26 +// CHECK:STDOUT: %addr.loc26: %ptr.019 = addr_of %.loc26 +// CHECK:STDOUT: %F.call.loc26: init %empty_tuple.type = call %F.bound.loc26(%addr.loc26) +// CHECK:STDOUT: %d.ref: %ptr.19c = name_ref d, %d +// CHECK:STDOUT: %.loc27_4.1: ref %D = deref %d.ref +// CHECK:STDOUT: %F.ref.loc27: %F.type.8c6 = name_ref F, @B.%F.decl [concrete = constants.%F.92a] +// CHECK:STDOUT: %F.bound.loc27: = bound_method %.loc27_4.1, %F.ref.loc27 +// CHECK:STDOUT: %addr.loc27_4.1: %ptr.19c = addr_of %.loc27_4.1 +// CHECK:STDOUT: %.loc27_4.2: ref %D = deref %addr.loc27_4.1 +// CHECK:STDOUT: %.loc27_4.3: ref %B = class_element_access %.loc27_4.2, element0 +// CHECK:STDOUT: %addr.loc27_4.2: %ptr.e79 = addr_of %.loc27_4.3 +// CHECK:STDOUT: %.loc27_4.4: %ptr.e79 = converted %addr.loc27_4.1, %addr.loc27_4.2 +// CHECK:STDOUT: %F.call.loc27: init %empty_tuple.type = call %F.bound.loc27(%.loc27_4.4) +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: --- base_method_qualified.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %Derived: type = class_type @Derived [concrete] +// CHECK:STDOUT: %Base: type = class_type @Base [concrete] +// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] +// CHECK:STDOUT: %pattern_type.a96: type = pattern_type %empty_struct_type [concrete] +// CHECK:STDOUT: %F.type.7c6: type = fn_type @F.1 [concrete] +// CHECK:STDOUT: %F.d17: %F.type.7c6 = struct_value () [concrete] +// CHECK:STDOUT: %pattern_type.fb9: type = pattern_type %Derived [concrete] +// CHECK:STDOUT: %G.type.6ee: type = fn_type @G.1 [concrete] +// CHECK:STDOUT: %G.663: %G.type.6ee = struct_value () [concrete] +// CHECK:STDOUT: %Call.type: type = fn_type @Call [concrete] +// CHECK:STDOUT: %Call: %Call.type = struct_value () [concrete] +// CHECK:STDOUT: %empty_struct: %empty_struct_type = struct_value () [concrete] +// CHECK:STDOUT: %ptr.404: type = ptr_type %Derived [concrete] +// CHECK:STDOUT: %pattern_type.605: type = pattern_type %ptr.404 [concrete] +// CHECK:STDOUT: %CallIndirect.type: type = fn_type @CallIndirect [concrete] +// CHECK:STDOUT: %CallIndirect: %CallIndirect.type = struct_value () [concrete] +// CHECK:STDOUT: %PassDerivedToBase.type: type = fn_type @PassDerivedToBase [concrete] +// CHECK:STDOUT: %PassDerivedToBase: %PassDerivedToBase.type = struct_value () [concrete] +// CHECK:STDOUT: %PassDerivedToBaseIndirect.type: type = fn_type @PassDerivedToBaseIndirect [concrete] +// CHECK:STDOUT: %PassDerivedToBaseIndirect: %PassDerivedToBaseIndirect.type = struct_value () [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: file { +// CHECK:STDOUT: %Call.decl: %Call.type = fn_decl @Call [concrete = constants.%Call] { +// CHECK:STDOUT: %a.patt: %pattern_type.fb9 = binding_pattern a [concrete] +// CHECK:STDOUT: %a.param_patt: %pattern_type.fb9 = value_param_pattern %a.patt, call_param0 [concrete] +// CHECK:STDOUT: %return.patt: %pattern_type.a96 = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: %pattern_type.a96 = out_param_pattern %return.patt, call_param1 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc19_25.1: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc19_25.2: type = converted %.loc19_25.1, constants.%empty_struct_type [concrete = constants.%empty_struct_type] +// CHECK:STDOUT: %a.param: %Derived = value_param call_param0 +// CHECK:STDOUT: %Derived.ref: type = name_ref Derived, file.%Derived.decl.loc4 [concrete = constants.%Derived] +// CHECK:STDOUT: %a: %Derived = bind_name a, %a.param +// CHECK:STDOUT: %return.param: ref %empty_struct_type = out_param call_param1 +// CHECK:STDOUT: %return: ref %empty_struct_type = return_slot %return.param +// CHECK:STDOUT: } +// CHECK:STDOUT: %CallIndirect.decl: %CallIndirect.type = fn_decl @CallIndirect [concrete = constants.%CallIndirect] { +// CHECK:STDOUT: %p.patt: %pattern_type.605 = binding_pattern p [concrete] +// CHECK:STDOUT: %p.param_patt: %pattern_type.605 = value_param_pattern %p.patt, call_param0 [concrete] +// CHECK:STDOUT: %return.patt: %pattern_type.a96 = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: %pattern_type.a96 = out_param_pattern %return.patt, call_param1 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc23_34.1: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc23_34.2: type = converted %.loc23_34.1, constants.%empty_struct_type [concrete = constants.%empty_struct_type] +// CHECK:STDOUT: %p.param: %ptr.404 = value_param call_param0 +// CHECK:STDOUT: %.loc23_27: type = splice_block %ptr [concrete = constants.%ptr.404] { +// CHECK:STDOUT: %Derived.ref: type = name_ref Derived, file.%Derived.decl.loc4 [concrete = constants.%Derived] +// CHECK:STDOUT: %ptr: type = ptr_type %Derived.ref [concrete = constants.%ptr.404] +// CHECK:STDOUT: } +// CHECK:STDOUT: %p: %ptr.404 = bind_name p, %p.param +// CHECK:STDOUT: %return.param: ref %empty_struct_type = out_param call_param1 +// CHECK:STDOUT: %return: ref %empty_struct_type = return_slot %return.param +// CHECK:STDOUT: } +// CHECK:STDOUT: %PassDerivedToBase.decl: %PassDerivedToBase.type = fn_decl @PassDerivedToBase [concrete = constants.%PassDerivedToBase] { +// CHECK:STDOUT: %a.patt: %pattern_type.fb9 = binding_pattern a [concrete] +// CHECK:STDOUT: %a.param_patt: %pattern_type.fb9 = value_param_pattern %a.patt, call_param0 [concrete] +// CHECK:STDOUT: %return.patt: %pattern_type.a96 = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: %pattern_type.a96 = out_param_pattern %return.patt, call_param1 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc27_38.1: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc27_38.2: type = converted %.loc27_38.1, constants.%empty_struct_type [concrete = constants.%empty_struct_type] +// CHECK:STDOUT: %a.param: %Derived = value_param call_param0 +// CHECK:STDOUT: %Derived.ref: type = name_ref Derived, file.%Derived.decl.loc4 [concrete = constants.%Derived] +// CHECK:STDOUT: %a: %Derived = bind_name a, %a.param +// CHECK:STDOUT: %return.param: ref %empty_struct_type = out_param call_param1 +// CHECK:STDOUT: %return: ref %empty_struct_type = return_slot %return.param +// CHECK:STDOUT: } +// CHECK:STDOUT: %PassDerivedToBaseIndirect.decl: %PassDerivedToBaseIndirect.type = fn_decl @PassDerivedToBaseIndirect [concrete = constants.%PassDerivedToBaseIndirect] { +// CHECK:STDOUT: %p.patt: %pattern_type.605 = binding_pattern p [concrete] +// CHECK:STDOUT: %p.param_patt: %pattern_type.605 = value_param_pattern %p.patt, call_param0 [concrete] +// CHECK:STDOUT: %return.patt: %pattern_type.a96 = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: %pattern_type.a96 = out_param_pattern %return.patt, call_param1 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc31_47.1: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc31_47.2: type = converted %.loc31_47.1, constants.%empty_struct_type [concrete = constants.%empty_struct_type] +// CHECK:STDOUT: %p.param: %ptr.404 = value_param call_param0 +// CHECK:STDOUT: %.loc31_40: type = splice_block %ptr [concrete = constants.%ptr.404] { +// CHECK:STDOUT: %Derived.ref: type = name_ref Derived, file.%Derived.decl.loc4 [concrete = constants.%Derived] +// CHECK:STDOUT: %ptr: type = ptr_type %Derived.ref [concrete = constants.%ptr.404] +// CHECK:STDOUT: } +// CHECK:STDOUT: %p: %ptr.404 = bind_name p, %p.param +// CHECK:STDOUT: %return.param: ref %empty_struct_type = out_param call_param1 +// CHECK:STDOUT: %return: ref %empty_struct_type = return_slot %return.param +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @Call(%a.param: %Derived) -> %empty_struct_type { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %a.ref: %Derived = name_ref a, %a +// CHECK:STDOUT: %Base.ref: type = name_ref Base, file.%Base.decl [concrete = constants.%Base] +// CHECK:STDOUT: %F.ref: %F.type.7c6 = name_ref F, @Base.%F.decl [concrete = constants.%F.d17] +// CHECK:STDOUT: %F.bound: = bound_method %a.ref, %F.ref +// CHECK:STDOUT: %.loc20_10.1: ref %Base = class_element_access %a.ref, element0 +// CHECK:STDOUT: %.loc20_10.2: ref %Base = converted %a.ref, %.loc20_10.1 +// CHECK:STDOUT: %.loc20_10.3: %Base = bind_value %.loc20_10.2 +// CHECK:STDOUT: %F.call: init %empty_struct_type = call %F.bound(%.loc20_10.3) +// CHECK:STDOUT: %.loc20_21.1: ref %empty_struct_type = temporary_storage +// CHECK:STDOUT: %.loc20_21.2: ref %empty_struct_type = temporary %.loc20_21.1, %F.call +// CHECK:STDOUT: %empty_struct: %empty_struct_type = struct_value () [concrete = constants.%empty_struct] +// CHECK:STDOUT: %.loc20_22: %empty_struct_type = converted %F.call, %empty_struct [concrete = constants.%empty_struct] +// CHECK:STDOUT: return %.loc20_22 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @CallIndirect(%p.param: %ptr.404) -> %empty_struct_type { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %p.ref: %ptr.404 = name_ref p, %p +// CHECK:STDOUT: %Base.ref: type = name_ref Base, file.%Base.decl [concrete = constants.%Base] +// CHECK:STDOUT: %F.ref: %F.type.7c6 = name_ref F, @Base.%F.decl [concrete = constants.%F.d17] +// CHECK:STDOUT: %.loc24_11.1: ref %Derived = deref %p.ref +// CHECK:STDOUT: %F.bound: = bound_method %.loc24_11.1, %F.ref +// CHECK:STDOUT: %.loc24_11.2: ref %Base = class_element_access %.loc24_11.1, element0 +// CHECK:STDOUT: %.loc24_11.3: ref %Base = converted %.loc24_11.1, %.loc24_11.2 +// CHECK:STDOUT: %.loc24_11.4: %Base = bind_value %.loc24_11.3 +// CHECK:STDOUT: %F.call: init %empty_struct_type = call %F.bound(%.loc24_11.4) +// CHECK:STDOUT: %.loc24_22.1: ref %empty_struct_type = temporary_storage +// CHECK:STDOUT: %.loc24_22.2: ref %empty_struct_type = temporary %.loc24_22.1, %F.call +// CHECK:STDOUT: %empty_struct: %empty_struct_type = struct_value () [concrete = constants.%empty_struct] +// CHECK:STDOUT: %.loc24_23: %empty_struct_type = converted %F.call, %empty_struct [concrete = constants.%empty_struct] +// CHECK:STDOUT: return %.loc24_23 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @PassDerivedToBase(%a.param: %Derived) -> %empty_struct_type { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %a.ref: %Derived = name_ref a, %a +// CHECK:STDOUT: %Base.ref: type = name_ref Base, file.%Base.decl [concrete = constants.%Base] +// CHECK:STDOUT: %G.ref: %G.type.6ee = name_ref G, @Base.%G.decl [concrete = constants.%G.663] +// CHECK:STDOUT: %G.bound: = bound_method %a.ref, %G.ref +// CHECK:STDOUT: %G.call: init %empty_struct_type = call %G.bound(%a.ref) +// CHECK:STDOUT: %.loc28_21.1: ref %empty_struct_type = temporary_storage +// CHECK:STDOUT: %.loc28_21.2: ref %empty_struct_type = temporary %.loc28_21.1, %G.call +// CHECK:STDOUT: %empty_struct: %empty_struct_type = struct_value () [concrete = constants.%empty_struct] +// CHECK:STDOUT: %.loc28_22: %empty_struct_type = converted %G.call, %empty_struct [concrete = constants.%empty_struct] +// CHECK:STDOUT: return %.loc28_22 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @PassDerivedToBaseIndirect(%p.param: %ptr.404) -> %empty_struct_type { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %p.ref: %ptr.404 = name_ref p, %p +// CHECK:STDOUT: %Base.ref: type = name_ref Base, file.%Base.decl [concrete = constants.%Base] +// CHECK:STDOUT: %G.ref: %G.type.6ee = name_ref G, @Base.%G.decl [concrete = constants.%G.663] +// CHECK:STDOUT: %.loc32_11.1: ref %Derived = deref %p.ref +// CHECK:STDOUT: %G.bound: = bound_method %.loc32_11.1, %G.ref +// CHECK:STDOUT: %.loc32_11.2: %Derived = bind_value %.loc32_11.1 +// CHECK:STDOUT: %G.call: init %empty_struct_type = call %G.bound(%.loc32_11.2) +// CHECK:STDOUT: %.loc32_22.1: ref %empty_struct_type = temporary_storage +// CHECK:STDOUT: %.loc32_22.2: ref %empty_struct_type = temporary %.loc32_22.1, %G.call +// CHECK:STDOUT: %empty_struct: %empty_struct_type = struct_value () [concrete = constants.%empty_struct] +// CHECK:STDOUT: %.loc32_23: %empty_struct_type = converted %G.call, %empty_struct [concrete = constants.%empty_struct] +// CHECK:STDOUT: return %.loc32_23 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: --- base_function_unqualified.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] +// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] +// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @H() { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %F.ref: %F.type = name_ref F, @Base.%F.decl [concrete = constants.%F] +// CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.ref() +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/no_prelude/basic.carbon b/toolchain/check/testdata/class/no_prelude/basic.carbon new file mode 100644 index 0000000000000..1cb6ed19a0996 --- /dev/null +++ b/toolchain/check/testdata/class/no_prelude/basic.carbon @@ -0,0 +1,220 @@ +// Part of the Carbon Language project, under the Apache License v2.0 with LLVM +// Exceptions. See /LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// +// AUTOUPDATE +// TIP: To test this file alone, run: +// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/no_prelude/basic.carbon +// TIP: To dump output, run: +// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/no_prelude/basic.carbon + +// --- basic.carbon +library "[[@TEST_NAME]]"; + +//@dump-sem-ir-begin +class Class { + fn F(n: ()) -> () { + return n; + } + + fn G(n: {}) -> {}; + + var k: {}; +} + +fn Class.G(n: {}) -> {} { + return n; +} + +fn Run() -> () { + return Class.F(()); +} +//@dump-sem-ir-end + +// --- complete_in_member_fn.carbon +library "[[@TEST_NAME]]"; + +class C { + fn F(c: C) -> () { + //@dump-sem-ir-begin + return c.a; + //@dump-sem-ir-end + } + + var a: (); +} + +// --- fail_unknown_member.carbon +library "[[@TEST_NAME]]"; + +class Class { + var n: (); +} + +fn G(c: Class) -> () { + // TODO: Mention the scope in which we looked for the name. + // CHECK:STDERR: fail_unknown_member.carbon:[[@LINE+4]]:10: error: member name `something` not found in `Class` [MemberNameNotFoundInInstScope] + // CHECK:STDERR: return c.something; + // CHECK:STDERR: ^~~~~~~~~~~ + // CHECK:STDERR: + return c.something; +} + +// CHECK:STDOUT: --- basic.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %Class: type = class_type @Class [concrete] +// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] +// CHECK:STDOUT: %pattern_type.cb1: type = pattern_type %empty_tuple.type [concrete] +// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] +// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] +// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] +// CHECK:STDOUT: %pattern_type.a96: type = pattern_type %empty_struct_type [concrete] +// CHECK:STDOUT: %G.type: type = fn_type @G [concrete] +// CHECK:STDOUT: %G: %G.type = struct_value () [concrete] +// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %empty_struct_type [concrete] +// CHECK:STDOUT: %struct_type.k.df9: type = struct_type {.k: %empty_struct_type} [concrete] +// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.k.df9 [concrete] +// CHECK:STDOUT: %Run.type: type = fn_type @Run [concrete] +// CHECK:STDOUT: %Run: %Run.type = struct_value () [concrete] +// CHECK:STDOUT: %empty_tuple: %empty_tuple.type = tuple_value () [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: file { +// CHECK:STDOUT: %Class.decl: type = class_decl @Class [concrete = constants.%Class] {} {} +// CHECK:STDOUT: %G.decl: %G.type = fn_decl @G [concrete = constants.%G] { +// CHECK:STDOUT: %n.patt: %pattern_type.a96 = binding_pattern n [concrete] +// CHECK:STDOUT: %n.param_patt: %pattern_type.a96 = value_param_pattern %n.patt, call_param0 [concrete] +// CHECK:STDOUT: %return.patt: %pattern_type.a96 = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: %pattern_type.a96 = out_param_pattern %return.patt, call_param1 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc14_23.1: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc14_23.2: type = converted %.loc14_23.1, constants.%empty_struct_type [concrete = constants.%empty_struct_type] +// CHECK:STDOUT: %n.param.loc14: %empty_struct_type = value_param call_param0 +// CHECK:STDOUT: %.loc14_16.1: type = splice_block %.loc14_16.3 [concrete = constants.%empty_struct_type] { +// CHECK:STDOUT: %.loc14_16.2: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc14_16.3: type = converted %.loc14_16.2, constants.%empty_struct_type [concrete = constants.%empty_struct_type] +// CHECK:STDOUT: } +// CHECK:STDOUT: %n.loc14: %empty_struct_type = bind_name n, %n.param.loc14 +// CHECK:STDOUT: %return.param.loc14: ref %empty_struct_type = out_param call_param1 +// CHECK:STDOUT: %return.loc14: ref %empty_struct_type = return_slot %return.param.loc14 +// CHECK:STDOUT: } +// CHECK:STDOUT: %Run.decl: %Run.type = fn_decl @Run [concrete = constants.%Run] { +// CHECK:STDOUT: %return.patt: %pattern_type.cb1 = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: %pattern_type.cb1 = out_param_pattern %return.patt, call_param0 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc18_14.1: %empty_tuple.type = tuple_literal () +// CHECK:STDOUT: %.loc18_14.2: type = converted %.loc18_14.1, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] +// CHECK:STDOUT: %return.param: ref %empty_tuple.type = out_param call_param0 +// CHECK:STDOUT: %return: ref %empty_tuple.type = return_slot %return.param +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: class @Class { +// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { +// CHECK:STDOUT: %n.patt: %pattern_type.cb1 = binding_pattern n [concrete] +// CHECK:STDOUT: %n.param_patt: %pattern_type.cb1 = value_param_pattern %n.patt, call_param0 [concrete] +// CHECK:STDOUT: %return.patt: %pattern_type.cb1 = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: %pattern_type.cb1 = out_param_pattern %return.patt, call_param1 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc5_19.1: %empty_tuple.type = tuple_literal () +// CHECK:STDOUT: %.loc5_19.2: type = converted %.loc5_19.1, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] +// CHECK:STDOUT: %n.param: %empty_tuple.type = value_param call_param0 +// CHECK:STDOUT: %.loc5_12.1: type = splice_block %.loc5_12.3 [concrete = constants.%empty_tuple.type] { +// CHECK:STDOUT: %.loc5_12.2: %empty_tuple.type = tuple_literal () +// CHECK:STDOUT: %.loc5_12.3: type = converted %.loc5_12.2, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] +// CHECK:STDOUT: } +// CHECK:STDOUT: %n: %empty_tuple.type = bind_name n, %n.param +// CHECK:STDOUT: %return.param: ref %empty_tuple.type = out_param call_param1 +// CHECK:STDOUT: %return: ref %empty_tuple.type = return_slot %return.param +// CHECK:STDOUT: } +// CHECK:STDOUT: %G.decl: %G.type = fn_decl @G [concrete = constants.%G] { +// CHECK:STDOUT: %n.patt: %pattern_type.a96 = binding_pattern n [concrete] +// CHECK:STDOUT: %n.param_patt: %pattern_type.a96 = value_param_pattern %n.patt, call_param0 [concrete] +// CHECK:STDOUT: %return.patt: %pattern_type.a96 = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: %pattern_type.a96 = out_param_pattern %return.patt, call_param1 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc9_19.1: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc9_19.2: type = converted %.loc9_19.1, constants.%empty_struct_type [concrete = constants.%empty_struct_type] +// CHECK:STDOUT: %n.param.loc9: %empty_struct_type = value_param call_param0 +// CHECK:STDOUT: %.loc9_12.1: type = splice_block %.loc9_12.3 [concrete = constants.%empty_struct_type] { +// CHECK:STDOUT: %.loc9_12.2: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc9_12.3: type = converted %.loc9_12.2, constants.%empty_struct_type [concrete = constants.%empty_struct_type] +// CHECK:STDOUT: } +// CHECK:STDOUT: %n.loc9: %empty_struct_type = bind_name n, %n.param.loc9 +// CHECK:STDOUT: %return.param.loc9: ref %empty_struct_type = out_param call_param1 +// CHECK:STDOUT: %return.loc9: ref %empty_struct_type = return_slot %return.param.loc9 +// CHECK:STDOUT: } +// CHECK:STDOUT: %.loc11_11.1: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc11_11.2: type = converted %.loc11_11.1, constants.%empty_struct_type [concrete = constants.%empty_struct_type] +// CHECK:STDOUT: %.loc11_8: %Class.elem = field_decl k, element0 [concrete] +// CHECK:STDOUT: %struct_type.k: type = struct_type {.k: %empty_struct_type} [concrete = constants.%struct_type.k.df9] +// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.k [concrete = constants.%complete_type] +// CHECK:STDOUT: complete_type_witness = %complete_type +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = constants.%Class +// CHECK:STDOUT: .F = %F.decl +// CHECK:STDOUT: .G = %G.decl +// CHECK:STDOUT: .k = %.loc11_8 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @F(%n.param: %empty_tuple.type) -> %empty_tuple.type { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %n.ref: %empty_tuple.type = name_ref n, %n +// CHECK:STDOUT: return %n.ref +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @G(%n.param.loc14: %empty_struct_type) -> %empty_struct_type { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %n.ref: %empty_struct_type = name_ref n, %n.loc14 +// CHECK:STDOUT: return %n.ref +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @Run() -> %empty_tuple.type { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %Class.ref: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] +// CHECK:STDOUT: %F.ref: %F.type = name_ref F, @Class.%F.decl [concrete = constants.%F] +// CHECK:STDOUT: %.loc19_19.1: %empty_tuple.type = tuple_literal () +// CHECK:STDOUT: %empty_tuple: %empty_tuple.type = tuple_value () [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc19_19.2: %empty_tuple.type = converted %.loc19_19.1, %empty_tuple [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.ref(%.loc19_19.2) +// CHECK:STDOUT: %.loc19_20.1: ref %empty_tuple.type = temporary_storage +// CHECK:STDOUT: %.loc19_20.2: ref %empty_tuple.type = temporary %.loc19_20.1, %F.call +// CHECK:STDOUT: %tuple: %empty_tuple.type = tuple_value () [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc19_21: %empty_tuple.type = converted %F.call, %tuple [concrete = constants.%empty_tuple] +// CHECK:STDOUT: return %.loc19_21 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: --- complete_in_member_fn.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %C: type = class_type @C [concrete] +// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] +// CHECK:STDOUT: %C.elem: type = unbound_element_type %C, %empty_tuple.type [concrete] +// CHECK:STDOUT: %empty_tuple: %empty_tuple.type = tuple_value () [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: class @C { +// CHECK:STDOUT: +// CHECK:STDOUT: complete_type_witness = %complete_type +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = constants.%C +// CHECK:STDOUT: .C = +// CHECK:STDOUT: .F = %F.decl +// CHECK:STDOUT: .a = %.loc10_8 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @F(%c.param: %C) -> %empty_tuple.type { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %c.ref: %C = name_ref c, %c +// CHECK:STDOUT: %a.ref: %C.elem = name_ref a, @C.%.loc10_8 [concrete = @C.%.loc10_8] +// CHECK:STDOUT: %.loc6_13.1: ref %empty_tuple.type = class_element_access %c.ref, element0 +// CHECK:STDOUT: %tuple: %empty_tuple.type = tuple_value () [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc6_13.2: %empty_tuple.type = converted %.loc6_13.1, %tuple [concrete = constants.%empty_tuple] +// CHECK:STDOUT: return %.loc6_13.2 +// CHECK:STDOUT: } +// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/no_prelude/comp_time_field.carbon b/toolchain/check/testdata/class/no_prelude/comp_time_field.carbon index 84fc1dd920eee..ce167e594be9f 100644 --- a/toolchain/check/testdata/class/no_prelude/comp_time_field.carbon +++ b/toolchain/check/testdata/class/no_prelude/comp_time_field.carbon @@ -2,6 +2,8 @@ // Exceptions. See /LICENSE for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// // AUTOUPDATE // TIP: To test this file alone, run: // TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/no_prelude/comp_time_field.carbon @@ -49,55 +51,3 @@ class Class { } var x: Class = {}; - -// CHECK:STDOUT: --- fail_let.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Class: type = class_type @Class [concrete] -// CHECK:STDOUT: %pattern_type: type = pattern_type type [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Class = %Class.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Class.decl: type = class_decl @Class [concrete = constants.%Class] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Class { -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %A.patt: %pattern_type = binding_pattern A [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %Class.ref.loc9: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %A: type = bind_name A, %Class.ref.loc9 -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %B.patt: %pattern_type = binding_pattern B [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %Class.ref.loc15: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %B: type = bind_name B, %Class.ref.loc15 -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Class -// CHECK:STDOUT: .A = %A -// CHECK:STDOUT: .Class = -// CHECK:STDOUT: .B = %B -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_var.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Class: type = class_type @Class [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Class { -// CHECK:STDOUT: complete_type_witness = invalid -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Class -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/no_prelude/cross_package_import.carbon b/toolchain/check/testdata/class/no_prelude/cross_package_import.carbon new file mode 100644 index 0000000000000..f24894c84633a --- /dev/null +++ b/toolchain/check/testdata/class/no_prelude/cross_package_import.carbon @@ -0,0 +1,145 @@ +// Part of the Carbon Language project, under the Apache License v2.0 with LLVM +// Exceptions. See /LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// +// AUTOUPDATE +// TIP: To test this file alone, run: +// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/no_prelude/cross_package_import.carbon +// TIP: To dump output, run: +// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/no_prelude/cross_package_import.carbon + +// ============================================================================ +// Setup files +// ============================================================================ + +// --- other_define.carbon + +package Other library "[[@TEST_NAME]]"; + +class C {} + +// --- other_extern.carbon + +package Other library "[[@TEST_NAME]]"; + +extern class C; + +// --- other_conflict.carbon + +package Other library "[[@TEST_NAME]]"; + +fn C() {} + +// ============================================================================ +// Test files +// ============================================================================ + +// --- define.carbon + +library "[[@TEST_NAME]]"; + +import Other library "other_define"; + +//@dump-sem-ir-begin +var c: Other.C = {}; +//@dump-sem-ir-end + +// --- fail_extern.carbon + +library "[[@TEST_NAME]]"; + +import Other library "other_extern"; + +// CHECK:STDERR: fail_extern.carbon:[[@LINE+8]]:8: error: binding pattern has incomplete type `C` in name binding declaration [IncompleteTypeInBindingDecl] +// CHECK:STDERR: var c: Other.C = {}; +// CHECK:STDERR: ^~~~~~~ +// CHECK:STDERR: fail_extern.carbon:[[@LINE-5]]:1: in import [InImport] +// CHECK:STDERR: other_extern.carbon:4:1: note: class was forward declared here [ClassForwardDeclaredHere] +// CHECK:STDERR: extern class C; +// CHECK:STDERR: ^~~~~~~~~~~~~~~ +// CHECK:STDERR: +var c: Other.C = {}; + +// --- fail_todo_merge_define_extern.carbon + +library "[[@TEST_NAME]]"; + +// CHECK:STDERR: fail_todo_merge_define_extern.carbon:[[@LINE+8]]:1: in import [InImport] +// CHECK:STDERR: other_extern.carbon:4:1: error: duplicate name `C` being declared in the same scope [NameDeclDuplicate] +// CHECK:STDERR: extern class C; +// CHECK:STDERR: ^~~~~~~~~~~~~~~ +// CHECK:STDERR: fail_todo_merge_define_extern.carbon:[[@LINE+4]]:1: in import [InImport] +// CHECK:STDERR: other_define.carbon:4:1: note: name is previously declared here [NameDeclPrevious] +// CHECK:STDERR: class C {} +// CHECK:STDERR: ^~~~~~~~~ +import Other library "other_define"; +import Other library "other_extern"; + +// CHECK:STDERR: fail_todo_merge_define_extern.carbon:[[@LINE+4]]:8: note: in name lookup for `C` [InNameLookup] +// CHECK:STDERR: var c: Other.C = {}; +// CHECK:STDERR: ^~~~~~~ +// CHECK:STDERR: +var c: Other.C = {}; + +// --- fail_conflict.carbon + +library "[[@TEST_NAME]]"; + +// CHECK:STDERR: fail_conflict.carbon:[[@LINE+8]]:1: in import [InImport] +// CHECK:STDERR: other_conflict.carbon:4:1: error: duplicate name `C` being declared in the same scope [NameDeclDuplicate] +// CHECK:STDERR: fn C() {} +// CHECK:STDERR: ^~~~~~~~ +// CHECK:STDERR: fail_conflict.carbon:[[@LINE+4]]:1: in import [InImport] +// CHECK:STDERR: other_define.carbon:4:1: note: name is previously declared here [NameDeclPrevious] +// CHECK:STDERR: class C {} +// CHECK:STDERR: ^~~~~~~~~ +import Other library "other_define"; +import Other library "other_conflict"; + +// CHECK:STDERR: fail_conflict.carbon:[[@LINE+4]]:8: note: in name lookup for `C` [InNameLookup] +// CHECK:STDERR: var c: Other.C = {}; +// CHECK:STDERR: ^~~~~~~ +// CHECK:STDERR: +var c: Other.C = {}; + +// CHECK:STDOUT: --- define.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %C: type = class_type @C [concrete] +// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] +// CHECK:STDOUT: %pattern_type: type = pattern_type %C [concrete] +// CHECK:STDOUT: %C.val: %C = struct_value () [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: %Other: = namespace file.%Other.import, [concrete] { +// CHECK:STDOUT: .C = %Other.C +// CHECK:STDOUT: import Other//other_define +// CHECK:STDOUT: } +// CHECK:STDOUT: %Other.C: type = import_ref Other//other_define, C, loaded [concrete = constants.%C] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: file { +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %c.patt: %pattern_type = binding_pattern c [concrete] +// CHECK:STDOUT: %c.var_patt: %pattern_type = var_pattern %c.patt [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: %c.var: ref %C = var %c.var_patt [concrete] +// CHECK:STDOUT: %.loc7: type = splice_block %C.ref [concrete = constants.%C] { +// CHECK:STDOUT: %Other.ref: = name_ref Other, imports.%Other [concrete = imports.%Other] +// CHECK:STDOUT: %C.ref: type = name_ref C, imports.%Other.C [concrete = constants.%C] +// CHECK:STDOUT: } +// CHECK:STDOUT: %c: ref %C = bind_name c, %c.var +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @__global_init() { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %.loc7_19.1: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc7_19.2: init %C = class_init (), file.%c.var [concrete = constants.%C.val] +// CHECK:STDOUT: %.loc7_1: init %C = converted %.loc7_19.1, %.loc7_19.2 [concrete = constants.%C.val] +// CHECK:STDOUT: assign file.%c.var, %.loc7_1 +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/no_prelude/error_recovery.carbon b/toolchain/check/testdata/class/no_prelude/error_recovery.carbon new file mode 100644 index 0000000000000..7bb783f37de26 --- /dev/null +++ b/toolchain/check/testdata/class/no_prelude/error_recovery.carbon @@ -0,0 +1,27 @@ +// Part of the Carbon Language project, under the Apache License v2.0 with LLVM +// Exceptions. See /LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// +// AUTOUPDATE +// TIP: To test this file alone, run: +// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/no_prelude/error_recovery.carbon +// TIP: To dump output, run: +// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/no_prelude/error_recovery.carbon + +// --- fail_virtual_fn_in_invalid_context.carbon + +// CHECK:STDERR: fail_virtual_fn_in_invalid_context.carbon:[[@LINE+4]]:10: error: name `error_not_found` not found [NameNotFound] +// CHECK:STDERR: fn F(N:! error_not_found) { +// CHECK:STDERR: ^~~~~~~~~~~~~~~ +// CHECK:STDERR: +fn F(N:! error_not_found) { + base class C { + virtual fn Foo[self: Self]() {} + } + + base class D { + extend base: C; + } +} diff --git a/toolchain/check/testdata/class/no_prelude/export_name.carbon b/toolchain/check/testdata/class/no_prelude/export_name.carbon index 12bc5aae0ab5b..58bba2fcb82ce 100644 --- a/toolchain/check/testdata/class/no_prelude/export_name.carbon +++ b/toolchain/check/testdata/class/no_prelude/export_name.carbon @@ -2,6 +2,8 @@ // Exceptions. See /LICENSE for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// // AUTOUPDATE // TIP: To test this file alone, run: // TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/no_prelude/export_name.carbon @@ -36,83 +38,24 @@ library "[[@TEST_NAME]]"; import library "export"; +//@dump-sem-ir-begin var c: C = {}; +//@dump-sem-ir-end -// CHECK:STDOUT: --- base.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- export.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Main.C: type = import_ref Main//base, C, loaded [concrete = constants.%C] -// CHECK:STDOUT: %Main.import_ref.8f2: = import_ref Main//base, loc4_10, loaded [concrete = constants.%complete_type] -// CHECK:STDOUT: %Main.import_ref.2c4 = import_ref Main//base, inst16 [no loc], unloaded -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .C = %C -// CHECK:STDOUT: } -// CHECK:STDOUT: %default.import = import -// CHECK:STDOUT: %C: type = export C, imports.%Main.C [concrete = constants.%C] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C [from "base.carbon"] { -// CHECK:STDOUT: complete_type_witness = imports.%Main.import_ref.8f2 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Main.import_ref.2c4 -// CHECK:STDOUT: } -// CHECK:STDOUT: // CHECK:STDOUT: --- use_export.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { // CHECK:STDOUT: %C: type = class_type @C [concrete] // CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] // CHECK:STDOUT: %pattern_type: type = pattern_type %C [concrete] // CHECK:STDOUT: %C.val: %C = struct_value () [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { // CHECK:STDOUT: %Main.C: type = import_ref Main//export, C, loaded [concrete = constants.%C] -// CHECK:STDOUT: %Main.import_ref.8db: = import_ref Main//export, inst21 [indirect], loaded [concrete = constants.%complete_type] -// CHECK:STDOUT: %Main.import_ref.6a9 = import_ref Main//export, inst22 [indirect], unloaded // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .C = imports.%Main.C -// CHECK:STDOUT: .c = %c -// CHECK:STDOUT: } -// CHECK:STDOUT: %default.import = import // CHECK:STDOUT: name_binding_decl { // CHECK:STDOUT: %c.patt: %pattern_type = binding_pattern c [concrete] // CHECK:STDOUT: %c.var_patt: %pattern_type = var_pattern %c.patt [concrete] @@ -122,19 +65,12 @@ var c: C = {}; // CHECK:STDOUT: %c: ref %C = bind_name c, %c.var // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: class @C [from "export.carbon"] { -// CHECK:STDOUT: complete_type_witness = imports.%Main.import_ref.8db -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Main.import_ref.6a9 -// CHECK:STDOUT: } -// CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %.loc6_13.1: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %.loc6_13.2: init %C = class_init (), file.%c.var [concrete = constants.%C.val] -// CHECK:STDOUT: %.loc6_1: init %C = converted %.loc6_13.1, %.loc6_13.2 [concrete = constants.%C.val] -// CHECK:STDOUT: assign file.%c.var, %.loc6_1 -// CHECK:STDOUT: return +// CHECK:STDOUT: %.loc7_13.1: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc7_13.2: init %C = class_init (), file.%c.var [concrete = constants.%C.val] +// CHECK:STDOUT: %.loc7_1: init %C = converted %.loc7_13.1, %.loc7_13.2 [concrete = constants.%C.val] +// CHECK:STDOUT: assign file.%c.var, %.loc7_1 +// CHECK:STDOUT: // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/no_prelude/extern.carbon b/toolchain/check/testdata/class/no_prelude/extern.carbon index d0a32ed553f2a..f05d07afbe633 100644 --- a/toolchain/check/testdata/class/no_prelude/extern.carbon +++ b/toolchain/check/testdata/class/no_prelude/extern.carbon @@ -2,6 +2,8 @@ // Exceptions. See /LICENSE for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// // AUTOUPDATE // TIP: To test this file alone, run: // TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/no_prelude/extern.carbon @@ -22,7 +24,9 @@ class C; library "[[@TEST_NAME]]"; +//@dump-sem-ir-begin extern class C; +//@dump-sem-ir-end // --- extern_decl_copy.carbon @@ -58,7 +62,9 @@ fn C.F(); library "[[@TEST_NAME]]"; +//@dump-sem-ir-begin extern class C {} +//@dump-sem-ir-end // --- fail_extern_decl_after_extern_decl.carbon @@ -137,7 +143,7 @@ library "[[@TEST_NAME]]"; // CHECK:STDERR: class C; // CHECK:STDERR: ^~~~~~~~ // CHECK:STDERR: fail_import_extern_decl_then_decl.carbon:[[@LINE+5]]:1: in import [InImport] -// CHECK:STDERR: extern_decl.carbon:4:1: note: name is previously declared here [NameDeclPrevious] +// CHECK:STDERR: extern_decl.carbon:5:1: note: name is previously declared here [NameDeclPrevious] // CHECK:STDERR: extern class C; // CHECK:STDERR: ^~~~~~~~~~~~~~~ // CHECK:STDERR: @@ -149,7 +155,7 @@ import library "decl"; library "[[@TEST_NAME]]"; // CHECK:STDERR: fail_import_decl_then_extern_decl.carbon:[[@LINE+9]]:1: in import [InImport] -// CHECK:STDERR: extern_decl.carbon:4:1: error: duplicate name `C` being declared in the same scope [NameDeclDuplicate] +// CHECK:STDERR: extern_decl.carbon:5:1: error: duplicate name `C` being declared in the same scope [NameDeclDuplicate] // CHECK:STDERR: extern class C; // CHECK:STDERR: ^~~~~~~~~~~~~~~ // CHECK:STDERR: fail_import_decl_then_extern_decl.carbon:[[@LINE+5]]:1: in import [InImport] @@ -169,7 +175,7 @@ library "[[@TEST_NAME]]"; // CHECK:STDERR: class C {} // CHECK:STDERR: ^~~~~~~~~ // CHECK:STDERR: fail_import_extern_decl_then_def.carbon:[[@LINE+5]]:1: in import [InImport] -// CHECK:STDERR: extern_decl.carbon:4:1: note: name is previously declared here [NameDeclPrevious] +// CHECK:STDERR: extern_decl.carbon:5:1: note: name is previously declared here [NameDeclPrevious] // CHECK:STDERR: extern class C; // CHECK:STDERR: ^~~~~~~~~~~~~~~ // CHECK:STDERR: @@ -185,7 +191,7 @@ library "[[@TEST_NAME]]"; // CHECK:STDERR: class C; // CHECK:STDERR: ^~~~~~~~ // CHECK:STDERR: fail_import_ownership_conflict.carbon:[[@LINE+14]]:1: in import [InImport] -// CHECK:STDERR: extern_decl.carbon:4:1: note: name is previously declared here [NameDeclPrevious] +// CHECK:STDERR: extern_decl.carbon:5:1: note: name is previously declared here [NameDeclPrevious] // CHECK:STDERR: extern class C; // CHECK:STDERR: ^~~~~~~~~~~~~~~ // CHECK:STDERR: @@ -194,7 +200,7 @@ library "[[@TEST_NAME]]"; // CHECK:STDERR: class C {} // CHECK:STDERR: ^~~~~~~~~ // CHECK:STDERR: fail_import_ownership_conflict.carbon:[[@LINE+5]]:1: in import [InImport] -// CHECK:STDERR: extern_decl.carbon:4:1: note: name is previously declared here [NameDeclPrevious] +// CHECK:STDERR: extern_decl.carbon:5:1: note: name is previously declared here [NameDeclPrevious] // CHECK:STDERR: extern class C; // CHECK:STDERR: ^~~~~~~~~~~~~~~ // CHECK:STDERR: @@ -211,7 +217,7 @@ library "[[@TEST_NAME]]"; // CHECK:STDERR: extern class C; // CHECK:STDERR: ^~~~~~~~~~~~~~~ // CHECK:STDERR: fail_todo_import_extern_decl_copy.carbon:[[@LINE+5]]:1: in import [InImport] -// CHECK:STDERR: extern_decl.carbon:4:1: note: name is previously declared here [NameDeclPrevious] +// CHECK:STDERR: extern_decl.carbon:5:1: note: name is previously declared here [NameDeclPrevious] // CHECK:STDERR: extern class C; // CHECK:STDERR: ^~~~~~~~~~~~~~~ // CHECK:STDERR: @@ -228,7 +234,7 @@ import library "extern_decl"; // CHECK:STDERR: extern class C; // CHECK:STDERR: ^~~~~~~~~~~~~~~ // CHECK:STDERR: fail_extern_decl_after_import_extern_decl.carbon:[[@LINE-5]]:1: in import [InImport] -// CHECK:STDERR: extern_decl.carbon:4:1: note: previously declared here [RedeclPrevDecl] +// CHECK:STDERR: extern_decl.carbon:5:1: note: previously declared here [RedeclPrevDecl] // CHECK:STDERR: extern class C; // CHECK:STDERR: ^~~~~~~~~~~~~~~ // CHECK:STDERR: @@ -282,21 +288,6 @@ import library "def"; // CHECK:STDERR: extern class C; -// CHECK:STDOUT: --- decl.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C; -// CHECK:STDOUT: // CHECK:STDOUT: --- extern_decl.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { @@ -304,73 +295,11 @@ extern class C; // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C; -// CHECK:STDOUT: -// CHECK:STDOUT: --- extern_decl_copy.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: } // CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: class @C; // CHECK:STDOUT: -// CHECK:STDOUT: --- def.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_decl_fn_in_extern.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// 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 [concrete] { -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C; -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F(); -// CHECK:STDOUT: // CHECK:STDOUT: --- extern_def.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { @@ -380,9 +309,6 @@ extern class C; // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: } // CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} // CHECK:STDOUT: } // CHECK:STDOUT: @@ -395,264 +321,3 @@ extern class C; // CHECK:STDOUT: .Self = constants.%C // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: --- fail_extern_decl_after_extern_decl.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .C = %C.decl.loc4 -// CHECK:STDOUT: } -// CHECK:STDOUT: %C.decl.loc4: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: %C.decl.loc12: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C; -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_decl_after_extern_decl.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .C = %C.decl.loc12 -// CHECK:STDOUT: } -// CHECK:STDOUT: %C.decl.loc4: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: %C.decl.loc12: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C; -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_extern_member_class.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %D: type = class_type @D [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C { -// CHECK:STDOUT: %D.decl: type = class_decl @D [concrete = constants.%D] {} {} -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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: .D = %D.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @D; -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_def_after_extern_decl.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .C = %C.decl.loc12 -// CHECK:STDOUT: } -// CHECK:STDOUT: %C.decl.loc4: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: %C.decl.loc12: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_extern_decl_after_decl.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .C = %C.decl.loc4 -// CHECK:STDOUT: } -// CHECK:STDOUT: %C.decl.loc4: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: %C.decl.loc12: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C; -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_import_extern_decl_then_decl.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Main.C = import_ref Main//extern_decl, C, unloaded -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .C = imports.%Main.C -// CHECK:STDOUT: } -// CHECK:STDOUT: %default.import = import -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_import_decl_then_extern_decl.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Main.C = import_ref Main//decl, C, unloaded -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .C = imports.%Main.C -// CHECK:STDOUT: } -// CHECK:STDOUT: %default.import = import -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_import_extern_decl_then_def.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Main.C = import_ref Main//extern_decl, C, unloaded -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .C = imports.%Main.C -// CHECK:STDOUT: } -// CHECK:STDOUT: %default.import = import -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_import_ownership_conflict.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Main.C = import_ref Main//extern_decl, C, unloaded -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .C = imports.%Main.C -// CHECK:STDOUT: } -// CHECK:STDOUT: %default.import = import -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_todo_import_extern_decl_copy.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Main.C = import_ref Main//extern_decl, C, unloaded -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .C = imports.%Main.C -// CHECK:STDOUT: } -// CHECK:STDOUT: %default.import = import -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_extern_decl_after_import_extern_decl.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %default.import = import -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C; -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_decl_after_import_extern_decl.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %default.import = import -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C; -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_def_after_import_extern_decl.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Main.import_ref.8f2: = import_ref Main//def, loc4_10, loaded [concrete = constants.%complete_type] -// CHECK:STDOUT: %Main.import_ref.2c4 = import_ref Main//def, inst16 [no loc], unloaded -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %default.import = import -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C { -// CHECK:STDOUT: complete_type_witness = imports.%Main.import_ref.8f2 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Main.import_ref.2c4 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_extern_decl_after_import_def.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Main.import_ref.8f2: = import_ref Main//def, loc4_10, loaded [concrete = constants.%complete_type] -// CHECK:STDOUT: %Main.import_ref.2c4 = import_ref Main//def, inst16 [no loc], unloaded -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %default.import = import -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C { -// CHECK:STDOUT: complete_type_witness = imports.%Main.import_ref.8f2 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Main.import_ref.2c4 -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/no_prelude/extern_library.carbon b/toolchain/check/testdata/class/no_prelude/extern_library.carbon index d737a37c8832e..0878d59ca2e0c 100644 --- a/toolchain/check/testdata/class/no_prelude/extern_library.carbon +++ b/toolchain/check/testdata/class/no_prelude/extern_library.carbon @@ -2,6 +2,8 @@ // Exceptions. See /LICENSE for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// // AUTOUPDATE // TIP: To test this file alone, run: // TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/no_prelude/extern_library.carbon @@ -15,19 +17,3 @@ // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // CHECK:STDERR: extern library "foo" class C; - -// CHECK:STDOUT: --- fail_todo.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C; -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/no_prelude/fail_abstract_in_struct.carbon b/toolchain/check/testdata/class/no_prelude/fail_abstract_in_struct.carbon deleted file mode 100644 index c9710e928edf9..0000000000000 --- a/toolchain/check/testdata/class/no_prelude/fail_abstract_in_struct.carbon +++ /dev/null @@ -1,435 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/no_prelude/fail_abstract_in_struct.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/no_prelude/fail_abstract_in_struct.carbon - -// --- fail_abstract_field.carbon -library "[[@TEST_NAME]]"; - -abstract class Abstract1 {} - -class Contains { - // CHECK:STDERR: fail_abstract_field.carbon:[[@LINE+7]]:10: error: field has abstract type `{.m1: Abstract1}` [AbstractTypeInFieldDecl] - // CHECK:STDERR: var a: {.m1: Abstract1}; - // CHECK:STDERR: ^~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_abstract_field.carbon:[[@LINE-6]]:1: note: uses class that was declared abstract here [ClassAbstractHere] - // CHECK:STDERR: abstract class Abstract1 {} - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: - var a: {.m1: Abstract1}; -} - -// --- fail_abstract_var.carbon -library "[[@TEST_NAME]]"; - -abstract class Abstract2 {} - -// CHECK:STDERR: fail_abstract_var.carbon:[[@LINE+7]]:8: error: binding pattern has abstract type `{.m2: Abstract2}` in `var` pattern [AbstractTypeInVarPattern] -// CHECK:STDERR: var v: {.m2: Abstract2}; -// CHECK:STDERR: ^~~~~~~~~~~~~~~~ -// CHECK:STDERR: fail_abstract_var.carbon:[[@LINE-5]]:1: note: uses class that was declared abstract here [ClassAbstractHere] -// CHECK:STDERR: abstract class Abstract2 {} -// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~ -// CHECK:STDERR: -var v: {.m2: Abstract2}; - -// --- abstract_let.carbon -library "[[@TEST_NAME]]"; - -abstract class Abstract3 { -} - -fn F(a: Abstract3) { - let l: {.m3: Abstract3} = {.m3 = a}; -} - -// --- fail_abstract_twice.carbon -library "[[@TEST_NAME]]"; - -abstract class Abstract4 {} -abstract class Abstract5 {} - -// CHECK:STDERR: fail_abstract_twice.carbon:[[@LINE+7]]:9: error: binding pattern has abstract type `{.m4: Abstract4, .m5: Abstract5}` in `var` pattern [AbstractTypeInVarPattern] -// CHECK:STDERR: var v2: {.m4: Abstract4, .m5: Abstract5}; -// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// CHECK:STDERR: fail_abstract_twice.carbon:[[@LINE-6]]:1: note: uses class that was declared abstract here [ClassAbstractHere] -// CHECK:STDERR: abstract class Abstract4 {} -// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~ -// CHECK:STDERR: -var v2: {.m4: Abstract4, .m5: Abstract5}; - -// --- fail_abstract_first.carbon -library "[[@TEST_NAME]]"; - -abstract class Abstract6 {} - -// CHECK:STDERR: fail_abstract_first.carbon:[[@LINE+7]]:9: error: binding pattern has abstract type `{.m6: Abstract6, .c1: ()}` in `var` pattern [AbstractTypeInVarPattern] -// CHECK:STDERR: var v3: {.m6: Abstract6, .c1: ()}; -// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~ -// CHECK:STDERR: fail_abstract_first.carbon:[[@LINE-5]]:1: note: uses class that was declared abstract here [ClassAbstractHere] -// CHECK:STDERR: abstract class Abstract6 {} -// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~ -// CHECK:STDERR: -var v3: {.m6: Abstract6, .c1: ()}; - -// --- fail_abstract_second.carbon -library "[[@TEST_NAME]]"; - -abstract class Abstract7 {} - -// CHECK:STDERR: fail_abstract_second.carbon:[[@LINE+7]]:9: error: binding pattern has abstract type `{.c2: (), .m7: Abstract7}` in `var` pattern [AbstractTypeInVarPattern] -// CHECK:STDERR: var v4: {.c2: (), .m7: Abstract7}; -// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~ -// CHECK:STDERR: fail_abstract_second.carbon:[[@LINE-5]]:1: note: uses class that was declared abstract here [ClassAbstractHere] -// CHECK:STDERR: abstract class Abstract7 {} -// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~ -// CHECK:STDERR: -var v4: {.c2: (), .m7: Abstract7}; - -// --- lib.carbon -library "[[@TEST_NAME]]"; - -abstract class Abstract {} - -// --- fail_import.carbon -library "[[@TEST_NAME]]"; - -import library "lib"; - -// CHECK:STDERR: fail_import.carbon:[[@LINE+8]]:9: error: binding pattern has abstract type `{.m: Abstract}` in `var` pattern [AbstractTypeInVarPattern] -// CHECK:STDERR: var v5: {.m: Abstract}; -// CHECK:STDERR: ^~~~~~~~~~~~~~ -// CHECK:STDERR: fail_import.carbon:[[@LINE-5]]:1: in import [InImport] -// CHECK:STDERR: lib.carbon:3:1: note: uses class that was declared abstract here [ClassAbstractHere] -// CHECK:STDERR: abstract class Abstract {} -// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~ -// CHECK:STDERR: -var v5: {.m: Abstract}; - -// CHECK:STDOUT: --- fail_abstract_field.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Abstract1: type = class_type @Abstract1 [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %Contains: type = class_type @Contains [concrete] -// CHECK:STDOUT: %struct_type.m1.198: type = struct_type {.m1: %Abstract1} [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Abstract1 = %Abstract1.decl -// CHECK:STDOUT: .Contains = %Contains.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Abstract1.decl: type = class_decl @Abstract1 [concrete = constants.%Abstract1] {} {} -// CHECK:STDOUT: %Contains.decl: type = class_decl @Contains [concrete = constants.%Contains] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Abstract1 { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Abstract1 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Contains { -// CHECK:STDOUT: %Abstract1.ref: type = name_ref Abstract1, file.%Abstract1.decl [concrete = constants.%Abstract1] -// CHECK:STDOUT: %struct_type.m1: type = struct_type {.m1: %Abstract1} [concrete = constants.%struct_type.m1.198] -// CHECK:STDOUT: %.loc13: = field_decl a, element0 [concrete] -// CHECK:STDOUT: %struct_type.a: type = struct_type {.a: } [concrete = ] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.a [concrete = ] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Contains -// CHECK:STDOUT: .Abstract1 = -// CHECK:STDOUT: .a = %.loc13 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_abstract_var.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Abstract2: type = class_type @Abstract2 [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %struct_type.m2.155: type = struct_type {.m2: %Abstract2} [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Abstract2 = %Abstract2.decl -// CHECK:STDOUT: .v = %v -// CHECK:STDOUT: } -// CHECK:STDOUT: %Abstract2.decl: type = class_decl @Abstract2 [concrete = constants.%Abstract2] {} {} -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %v.patt: = binding_pattern v [concrete] -// CHECK:STDOUT: %v.var_patt: = var_pattern %v.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %v.var: ref = var %v.var_patt [concrete = ] -// CHECK:STDOUT: %.loc12: type = splice_block %struct_type.m2 [concrete = constants.%struct_type.m2.155] { -// CHECK:STDOUT: %Abstract2.ref: type = name_ref Abstract2, %Abstract2.decl [concrete = constants.%Abstract2] -// CHECK:STDOUT: %struct_type.m2: type = struct_type {.m2: %Abstract2} [concrete = constants.%struct_type.m2.155] -// CHECK:STDOUT: } -// CHECK:STDOUT: %v: = bind_name v, -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Abstract2 { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Abstract2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- abstract_let.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Abstract3: type = class_type @Abstract3 [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %pattern_type.32b: type = pattern_type %Abstract3 [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %struct_type.m3.fe4: type = struct_type {.m3: %Abstract3} [concrete] -// CHECK:STDOUT: %pattern_type.a22: type = pattern_type %struct_type.m3.fe4 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Abstract3 = %Abstract3.decl -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Abstract3.decl: type = class_decl @Abstract3 [concrete = constants.%Abstract3] {} {} -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %a.patt: %pattern_type.32b = binding_pattern a [concrete] -// CHECK:STDOUT: %a.param_patt: %pattern_type.32b = value_param_pattern %a.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %a.param: %Abstract3 = value_param call_param0 -// CHECK:STDOUT: %Abstract3.ref.loc6: type = name_ref Abstract3, file.%Abstract3.decl [concrete = constants.%Abstract3] -// CHECK:STDOUT: %a: %Abstract3 = bind_name a, %a.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Abstract3 { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Abstract3 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F(%a.param: %Abstract3) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %l.patt: %pattern_type.a22 = binding_pattern l [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %a.ref: %Abstract3 = name_ref a, %a -// CHECK:STDOUT: %.loc7_37: %struct_type.m3.fe4 = struct_literal (%a.ref) -// CHECK:STDOUT: %.loc7_25: type = splice_block %struct_type.m3 [concrete = constants.%struct_type.m3.fe4] { -// CHECK:STDOUT: %Abstract3.ref.loc7: type = name_ref Abstract3, file.%Abstract3.decl [concrete = constants.%Abstract3] -// CHECK:STDOUT: %struct_type.m3: type = struct_type {.m3: %Abstract3} [concrete = constants.%struct_type.m3.fe4] -// CHECK:STDOUT: } -// CHECK:STDOUT: %l: %struct_type.m3.fe4 = bind_name l, -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_abstract_twice.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Abstract4: type = class_type @Abstract4 [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %Abstract5: type = class_type @Abstract5 [concrete] -// CHECK:STDOUT: %struct_type.m4.m5.c86: type = struct_type {.m4: %Abstract4, .m5: %Abstract5} [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Abstract4 = %Abstract4.decl -// CHECK:STDOUT: .Abstract5 = %Abstract5.decl -// CHECK:STDOUT: .v2 = %v2 -// CHECK:STDOUT: } -// CHECK:STDOUT: %Abstract4.decl: type = class_decl @Abstract4 [concrete = constants.%Abstract4] {} {} -// CHECK:STDOUT: %Abstract5.decl: type = class_decl @Abstract5 [concrete = constants.%Abstract5] {} {} -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %v2.patt: = binding_pattern v2 [concrete] -// CHECK:STDOUT: %v2.var_patt: = var_pattern %v2.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %v2.var: ref = var %v2.var_patt [concrete = ] -// CHECK:STDOUT: %.loc13: type = splice_block %struct_type.m4.m5 [concrete = constants.%struct_type.m4.m5.c86] { -// CHECK:STDOUT: %Abstract4.ref: type = name_ref Abstract4, %Abstract4.decl [concrete = constants.%Abstract4] -// CHECK:STDOUT: %Abstract5.ref: type = name_ref Abstract5, %Abstract5.decl [concrete = constants.%Abstract5] -// CHECK:STDOUT: %struct_type.m4.m5: type = struct_type {.m4: %Abstract4, .m5: %Abstract5} [concrete = constants.%struct_type.m4.m5.c86] -// CHECK:STDOUT: } -// CHECK:STDOUT: %v2: = bind_name v2, -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Abstract4 { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Abstract4 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Abstract5 { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Abstract5 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_abstract_first.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Abstract6: type = class_type @Abstract6 [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] -// CHECK:STDOUT: %struct_type.m6.c1.489: type = struct_type {.m6: %Abstract6, .c1: %empty_tuple.type} [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Abstract6 = %Abstract6.decl -// CHECK:STDOUT: .v3 = %v3 -// CHECK:STDOUT: } -// CHECK:STDOUT: %Abstract6.decl: type = class_decl @Abstract6 [concrete = constants.%Abstract6] {} {} -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %v3.patt: = binding_pattern v3 [concrete] -// CHECK:STDOUT: %v3.var_patt: = var_pattern %v3.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %v3.var: ref = var %v3.var_patt [concrete = ] -// CHECK:STDOUT: %.loc12_33: type = splice_block %struct_type.m6.c1 [concrete = constants.%struct_type.m6.c1.489] { -// CHECK:STDOUT: %Abstract6.ref: type = name_ref Abstract6, %Abstract6.decl [concrete = constants.%Abstract6] -// CHECK:STDOUT: %.loc12_32.1: %empty_tuple.type = tuple_literal () -// CHECK:STDOUT: %.loc12_32.2: type = converted %.loc12_32.1, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] -// CHECK:STDOUT: %struct_type.m6.c1: type = struct_type {.m6: %Abstract6, .c1: %empty_tuple.type} [concrete = constants.%struct_type.m6.c1.489] -// CHECK:STDOUT: } -// CHECK:STDOUT: %v3: = bind_name v3, -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Abstract6 { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Abstract6 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_abstract_second.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Abstract7: type = class_type @Abstract7 [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] -// CHECK:STDOUT: %struct_type.c2.m7.4a7: type = struct_type {.c2: %empty_tuple.type, .m7: %Abstract7} [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Abstract7 = %Abstract7.decl -// CHECK:STDOUT: .v4 = %v4 -// CHECK:STDOUT: } -// CHECK:STDOUT: %Abstract7.decl: type = class_decl @Abstract7 [concrete = constants.%Abstract7] {} {} -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %v4.patt: = binding_pattern v4 [concrete] -// CHECK:STDOUT: %v4.var_patt: = var_pattern %v4.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %v4.var: ref = var %v4.var_patt [concrete = ] -// CHECK:STDOUT: %.loc12_33: type = splice_block %struct_type.c2.m7 [concrete = constants.%struct_type.c2.m7.4a7] { -// CHECK:STDOUT: %.loc12_16.1: %empty_tuple.type = tuple_literal () -// CHECK:STDOUT: %.loc12_16.2: type = converted %.loc12_16.1, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] -// CHECK:STDOUT: %Abstract7.ref: type = name_ref Abstract7, %Abstract7.decl [concrete = constants.%Abstract7] -// CHECK:STDOUT: %struct_type.c2.m7: type = struct_type {.c2: %empty_tuple.type, .m7: %Abstract7} [concrete = constants.%struct_type.c2.m7.4a7] -// CHECK:STDOUT: } -// CHECK:STDOUT: %v4: = bind_name v4, -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Abstract7 { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Abstract7 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- lib.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Abstract: type = class_type @Abstract [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Abstract = %Abstract.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Abstract.decl: type = class_decl @Abstract [concrete = constants.%Abstract] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Abstract { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Abstract -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_import.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Abstract: type = class_type @Abstract [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %struct_type.m.50b: type = struct_type {.m: %Abstract} [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Main.Abstract: type = import_ref Main//lib, Abstract, loaded [concrete = constants.%Abstract] -// CHECK:STDOUT: %Main.import_ref.8f2: = import_ref Main//lib, loc3_26, loaded [concrete = constants.%complete_type] -// CHECK:STDOUT: %Main.import_ref.ee1 = import_ref Main//lib, inst16 [no loc], unloaded -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Abstract = imports.%Main.Abstract -// CHECK:STDOUT: .v5 = %v5 -// CHECK:STDOUT: } -// CHECK:STDOUT: %default.import = import -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %v5.patt: = binding_pattern v5 [concrete] -// CHECK:STDOUT: %v5.var_patt: = var_pattern %v5.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %v5.var: ref = var %v5.var_patt [concrete = ] -// CHECK:STDOUT: %.loc13: type = splice_block %struct_type.m [concrete = constants.%struct_type.m.50b] { -// CHECK:STDOUT: %Abstract.ref: type = name_ref Abstract, imports.%Main.Abstract [concrete = constants.%Abstract] -// CHECK:STDOUT: %struct_type.m: type = struct_type {.m: %Abstract} [concrete = constants.%struct_type.m.50b] -// CHECK:STDOUT: } -// CHECK:STDOUT: %v5: = bind_name v5, -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Abstract [from "lib.carbon"] { -// CHECK:STDOUT: complete_type_witness = imports.%Main.import_ref.8f2 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Main.import_ref.ee1 -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/no_prelude/fail_error_recovery.carbon b/toolchain/check/testdata/class/no_prelude/fail_error_recovery.carbon deleted file mode 100644 index 00e5e7d8cd800..0000000000000 --- a/toolchain/check/testdata/class/no_prelude/fail_error_recovery.carbon +++ /dev/null @@ -1,120 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/no_prelude/fail_error_recovery.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/no_prelude/fail_error_recovery.carbon - -// --- fail_virtual_fn_in_invalid_context.carbon - -// CHECK:STDERR: fail_virtual_fn_in_invalid_context.carbon:[[@LINE+4]]:10: error: name `error_not_found` not found [NameNotFound] -// CHECK:STDERR: fn F(N:! error_not_found) { -// CHECK:STDERR: ^~~~~~~~~~~~~~~ -// CHECK:STDERR: -fn F(N:! error_not_found) { - base class C { - virtual fn Foo[self: Self]() {} - } - - base class D { - extend base: C; - } -} - -// CHECK:STDOUT: --- fail_virtual_fn_in_invalid_context.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: %ptr: type = ptr_type [concrete] -// CHECK:STDOUT: %struct_type.vptr: type = struct_type {.: %ptr} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.vptr [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .error_not_found = -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %N.patt: = symbolic_binding_pattern N, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %error_not_found.ref: = name_ref error_not_found, [concrete = ] -// CHECK:STDOUT: %N: = bind_symbolic_name N, 0 [concrete = ] -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @C(@F.%N: ) { -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %Foo.decl: = fn_decl @Foo [concrete = ] { -// CHECK:STDOUT: %self.patt: = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: = value_param call_param0 -// CHECK:STDOUT: %Self.ref: = name_ref Self, [concrete = ] -// CHECK:STDOUT: %self: = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %.loc9: = vtable (%Foo.decl) [concrete = ] -// CHECK:STDOUT: %struct_type.vptr: type = struct_type {.: %ptr} [concrete = constants.%struct_type.vptr] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.vptr [concrete = constants.%complete_type] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = -// CHECK:STDOUT: .Foo = %Foo.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @D(@F.%N: ) { -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %C.ref: type = name_ref C, @F.%C.decl [concrete = ] -// CHECK:STDOUT: %.loc12: = base_decl , element0 [concrete] -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: } [concrete = ] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base [concrete = ] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = -// CHECK:STDOUT: .C = -// CHECK:STDOUT: .base = %.loc12 -// CHECK:STDOUT: has_error -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @F(%N: ) { -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: -// CHECK:STDOUT: fn() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = ] {} {} -// CHECK:STDOUT: %D.decl: type = class_decl @D [concrete = ] {} {} -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic virtual fn @Foo(@F.%N: ) { -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: -// CHECK:STDOUT: virtual fn(%self.param: ) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @F() {} -// CHECK:STDOUT: -// CHECK:STDOUT: specific @C() { -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Foo() {} -// CHECK:STDOUT: -// CHECK:STDOUT: specific @D() {} -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/no_prelude/fail_modifiers.carbon b/toolchain/check/testdata/class/no_prelude/fail_modifiers.carbon new file mode 100644 index 0000000000000..59305f3e6329a --- /dev/null +++ b/toolchain/check/testdata/class/no_prelude/fail_modifiers.carbon @@ -0,0 +1,154 @@ +// Part of the Carbon Language project, under the Apache License v2.0 with LLVM +// Exceptions. See /LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// +// AUTOUPDATE +// TIP: To test this file alone, run: +// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/no_prelude/fail_modifiers.carbon +// TIP: To dump output, run: +// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/no_prelude/fail_modifiers.carbon + +// --- fail_class_modifiers.carbon +library "[[@TEST_NAME]]"; + +// CHECK:STDERR: fail_class_modifiers.carbon:[[@LINE+7]]:9: error: `private` repeated on declaration [ModifierRepeated] +// CHECK:STDERR: private private class DuplicatePrivate; +// CHECK:STDERR: ^~~~~~~ +// CHECK:STDERR: fail_class_modifiers.carbon:[[@LINE+4]]:1: note: `private` previously appeared here [ModifierPrevious] +// CHECK:STDERR: private private class DuplicatePrivate; +// CHECK:STDERR: ^~~~~~~ +// CHECK:STDERR: +private private class DuplicatePrivate; + +// CHECK:STDERR: fail_class_modifiers.carbon:[[@LINE+4]]:1: error: `abstract` not allowed on `class` forward declaration, only definition [ModifierOnlyAllowedOnDefinition] +// CHECK:STDERR: abstract class AbstractDecl; +// CHECK:STDERR: ^~~~~~~~ +// CHECK:STDERR: +abstract class AbstractDecl; + +// CHECK:STDERR: fail_class_modifiers.carbon:[[@LINE+7]]:9: error: `protected` not allowed on declaration with `private` [ModifierNotAllowedWith] +// CHECK:STDERR: private protected class TwoAccess; +// CHECK:STDERR: ^~~~~~~~~ +// CHECK:STDERR: fail_class_modifiers.carbon:[[@LINE+4]]:1: note: `private` previously appeared here [ModifierPrevious] +// CHECK:STDERR: private protected class TwoAccess; +// CHECK:STDERR: ^~~~~~~ +// CHECK:STDERR: +private protected class TwoAccess; + +// CHECK:STDERR: fail_class_modifiers.carbon:[[@LINE+4]]:1: error: `base` not allowed on `class` forward declaration, only definition [ModifierOnlyAllowedOnDefinition] +// CHECK:STDERR: base class BaseDecl; +// CHECK:STDERR: ^~~~ +// CHECK:STDERR: +base class BaseDecl; + +// CHECK:STDERR: fail_class_modifiers.carbon:[[@LINE+7]]:10: error: `abstract` repeated on declaration [ModifierRepeated] +// CHECK:STDERR: abstract abstract class TwoAbstract { } +// CHECK:STDERR: ^~~~~~~~ +// CHECK:STDERR: fail_class_modifiers.carbon:[[@LINE+4]]:1: note: `abstract` previously appeared here [ModifierPrevious] +// CHECK:STDERR: abstract abstract class TwoAbstract { } +// CHECK:STDERR: ^~~~~~~~ +// CHECK:STDERR: +abstract abstract class TwoAbstract { } + +// CHECK:STDERR: fail_class_modifiers.carbon:[[@LINE+15]]:19: error: `base` not allowed on declaration with `virtual` [ModifierNotAllowedWith] +// CHECK:STDERR: protected virtual base class Virtual {} +// CHECK:STDERR: ^~~~ +// CHECK:STDERR: fail_class_modifiers.carbon:[[@LINE+12]]:11: note: `virtual` previously appeared here [ModifierPrevious] +// CHECK:STDERR: protected virtual base class Virtual {} +// CHECK:STDERR: ^~~~~~~ +// CHECK:STDERR: +// CHECK:STDERR: fail_class_modifiers.carbon:[[@LINE+8]]:1: error: `protected` not allowed; requires class scope [ModifierProtectedNotAllowed] +// CHECK:STDERR: protected virtual base class Virtual {} +// CHECK:STDERR: ^~~~~~~~~ +// CHECK:STDERR: +// CHECK:STDERR: fail_class_modifiers.carbon:[[@LINE+4]]:11: error: `virtual` not allowed on `class` declaration [ModifierNotAllowedOnDeclaration] +// CHECK:STDERR: protected virtual base class Virtual {} +// CHECK:STDERR: ^~~~~~~ +// CHECK:STDERR: +protected virtual base class Virtual {} + +// CHECK:STDERR: fail_class_modifiers.carbon:[[@LINE+7]]:10: error: `protected` must appear before `abstract` [ModifierMustAppearBefore] +// CHECK:STDERR: abstract protected class WrongOrder { } +// CHECK:STDERR: ^~~~~~~~~ +// CHECK:STDERR: fail_class_modifiers.carbon:[[@LINE+4]]:1: note: `abstract` previously appeared here [ModifierPrevious] +// CHECK:STDERR: abstract protected class WrongOrder { } +// CHECK:STDERR: ^~~~~~~~ +// CHECK:STDERR: +abstract protected class WrongOrder { } + +// CHECK:STDERR: fail_class_modifiers.carbon:[[@LINE+7]]:10: error: `base` not allowed on declaration with `abstract` [ModifierNotAllowedWith] +// CHECK:STDERR: abstract base class AbstractAndBase {} +// CHECK:STDERR: ^~~~ +// CHECK:STDERR: fail_class_modifiers.carbon:[[@LINE+4]]:1: note: `abstract` previously appeared here [ModifierPrevious] +// CHECK:STDERR: abstract base class AbstractAndBase {} +// CHECK:STDERR: ^~~~~~~~ +// CHECK:STDERR: +abstract base class AbstractAndBase {} + +abstract class AbstractWithDefinition { + // CHECK:STDERR: fail_class_modifiers.carbon:[[@LINE+4]]:31: error: definition of `abstract` function [DefinedAbstractFunction] + // CHECK:STDERR: abstract fn F[self: Self]() {} + // CHECK:STDERR: ^ + // CHECK:STDERR: + abstract fn F[self: Self]() {} + abstract fn G[self: Self](); +} +// CHECK:STDERR: fail_class_modifiers.carbon:[[@LINE+4]]:43: error: definition of `abstract` function [DefinedAbstractFunction] +// CHECK:STDERR: fn AbstractWithDefinition.G[self: Self]() { +// CHECK:STDERR: ^ +// CHECK:STDERR: +fn AbstractWithDefinition.G[self: Self]() { +} + +// --- fail_method_modifiers.carbon +library "[[@TEST_NAME]]"; + +class FinalClass { + + // CHECK:STDERR: fail_method_modifiers.carbon:[[@LINE+7]]:3: error: `abstract` not allowed; requires `abstract` class scope [ModifierAbstractNotAllowed] + // CHECK:STDERR: abstract fn Abstract[self: Self](); + // CHECK:STDERR: ^~~~~~~~ + // CHECK:STDERR: fail_method_modifiers.carbon:[[@LINE-5]]:1: note: containing definition here [ModifierNotInContext] + // CHECK:STDERR: class FinalClass { + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + abstract fn Abstract[self: Self](); + + // CHECK:STDERR: fail_method_modifiers.carbon:[[@LINE+7]]:3: error: `virtual` not allowed; requires `abstract` or `base` class scope [ModifierVirtualNotAllowed] + // CHECK:STDERR: virtual fn Virtual[self: Self](); + // CHECK:STDERR: ^~~~~~~ + // CHECK:STDERR: fail_method_modifiers.carbon:[[@LINE-14]]:1: note: containing definition here [ModifierNotInContext] + // CHECK:STDERR: class FinalClass { + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + virtual fn Virtual[self: Self](); +} + +abstract class AbstractClass { + + // CHECK:STDERR: fail_method_modifiers.carbon:[[@LINE+4]]:3: error: `default` not allowed; requires interface scope [ModifierRequiresInterface] + // CHECK:STDERR: default fn Default[self: Self](); + // CHECK:STDERR: ^~~~~~~ + // CHECK:STDERR: + default fn Default[self: Self](); + + // CHECK:STDERR: fail_method_modifiers.carbon:[[@LINE+4]]:3: error: `final` not allowed; requires interface scope [ModifierRequiresInterface] + // CHECK:STDERR: final fn Final[self: Self](); + // CHECK:STDERR: ^~~~~ + // CHECK:STDERR: + final fn Final[self: Self](); +} + +base class BaseClass { + + // CHECK:STDERR: fail_method_modifiers.carbon:[[@LINE+7]]:3: error: `abstract` not allowed; requires `abstract` class scope [ModifierAbstractNotAllowed] + // CHECK:STDERR: abstract fn Abstract[self: Self](); + // CHECK:STDERR: ^~~~~~~~ + // CHECK:STDERR: fail_method_modifiers.carbon:[[@LINE-5]]:1: note: containing definition here [ModifierNotInContext] + // CHECK:STDERR: base class BaseClass { + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + abstract fn Abstract[self: Self](); +} diff --git a/toolchain/check/testdata/class/no_prelude/fields.carbon b/toolchain/check/testdata/class/no_prelude/fields.carbon new file mode 100644 index 0000000000000..b3f6a44dafc35 --- /dev/null +++ b/toolchain/check/testdata/class/no_prelude/fields.carbon @@ -0,0 +1,222 @@ +// Part of the Carbon Language project, under the Apache License v2.0 with LLVM +// Exceptions. See /LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// +// AUTOUPDATE +// TIP: To test this file alone, run: +// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/no_prelude/fields.carbon +// TIP: To dump output, run: +// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/no_prelude/fields.carbon + +// --- field_access.carbon +library "[[@TEST_NAME]]"; + +class Class { + var j: (); + var k: (); +} + +fn Run() { + var c: Class; + //@dump-sem-ir-begin + c.j = (); + c.k = (); + var cj: () = c.j; + var ck: () = c.k; + //@dump-sem-ir-end +} + +// --- field_access_in_value.carbon +library "[[@TEST_NAME]]"; + +class Class { + var j: (); + var k: (); +} + +fn Test() { + var cv: Class; + cv.j = (); + cv.k = (); + let c: Class = cv; + //@dump-sem-ir-begin + var cj: () = c.j; + var ck: () = c.k; + //@dump-sem-ir-end +} + +// --- fail_todo_field_initializer.carbon +library "[[@TEST_NAME]]"; + +class Class { + // CHECK:STDERR: fail_todo_field_initializer.carbon:[[@LINE+4]]:3: error: semantics TODO: `Field initializer` [SemanticsTodo] + // CHECK:STDERR: var field: () = 0; + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + var field: () = 0; +} + +// --- fail_field_modifiers.carbon +library "[[@TEST_NAME]]"; + +class Class { + + // CHECK:STDERR: fail_field_modifiers.carbon:[[@LINE+4]]:3: error: `default` not allowed on `var` declaration [ModifierNotAllowedOnDeclaration] + // CHECK:STDERR: default var j: (); + // CHECK:STDERR: ^~~~~~~ + // CHECK:STDERR: + default var j: (); + + // CHECK:STDERR: fail_field_modifiers.carbon:[[@LINE+4]]:3: error: `final` not allowed on `var` declaration [ModifierNotAllowedOnDeclaration] + // CHECK:STDERR: final var k: (); + // CHECK:STDERR: ^~~~~ + // CHECK:STDERR: + final var k: (); + + // CHECK:STDERR: fail_field_modifiers.carbon:[[@LINE+4]]:3: error: `default` not allowed; requires interface scope [ModifierRequiresInterface] + // CHECK:STDERR: default let l: () = (); + // CHECK:STDERR: ^~~~~~~ + // CHECK:STDERR: + default let l: () = (); + + // CHECK:STDERR: fail_field_modifiers.carbon:[[@LINE+4]]:3: error: `final` not allowed; requires interface scope [ModifierRequiresInterface] + // CHECK:STDERR: final let m: () = (); + // CHECK:STDERR: ^~~~~ + // CHECK:STDERR: + final let m: () = (); +} + +// --- fail_unbound_field.carbon +library "[[@TEST_NAME]]"; + +class Class { + var field: (); + fn F() -> () { + // CHECK:STDERR: fail_unbound_field.carbon:[[@LINE+4]]:12: error: expression cannot be used as a value [UseOfNonExprAsValue] + // CHECK:STDERR: return field; + // CHECK:STDERR: ^~~~~ + // CHECK:STDERR: + return field; + } +} + +fn G() -> () { + // CHECK:STDERR: fail_unbound_field.carbon:[[@LINE+4]]:10: error: expression cannot be used as a value [UseOfNonExprAsValue] + // CHECK:STDERR: return Class.field; + // CHECK:STDERR: ^~~~~~~~~~~ + // CHECK:STDERR: + return Class.field; +} + +// CHECK:STDOUT: --- field_access.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %Class: type = class_type @Class [concrete] +// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] +// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %empty_tuple.type [concrete] +// CHECK:STDOUT: %empty_tuple: %empty_tuple.type = tuple_value () [concrete] +// CHECK:STDOUT: %pattern_type.cb1: type = pattern_type %empty_tuple.type [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @Run() { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: +// CHECK:STDOUT: %c.ref.loc11: ref %Class = name_ref c, %c +// CHECK:STDOUT: %j.ref.loc11: %Class.elem = name_ref j, @Class.%.loc4_8 [concrete = @Class.%.loc4_8] +// CHECK:STDOUT: %.loc11_4: ref %empty_tuple.type = class_element_access %c.ref.loc11, element0 +// CHECK:STDOUT: %.loc11_10.1: %empty_tuple.type = tuple_literal () +// CHECK:STDOUT: %.loc11_10.2: init %empty_tuple.type = tuple_init () to %.loc11_4 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc11_7: init %empty_tuple.type = converted %.loc11_10.1, %.loc11_10.2 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: assign %.loc11_4, %.loc11_7 +// CHECK:STDOUT: %c.ref.loc12: ref %Class = name_ref c, %c +// CHECK:STDOUT: %k.ref.loc12: %Class.elem = name_ref k, @Class.%.loc5_8 [concrete = @Class.%.loc5_8] +// CHECK:STDOUT: %.loc12_4: ref %empty_tuple.type = class_element_access %c.ref.loc12, element1 +// CHECK:STDOUT: %.loc12_10.1: %empty_tuple.type = tuple_literal () +// CHECK:STDOUT: %.loc12_10.2: init %empty_tuple.type = tuple_init () to %.loc12_4 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc12_7: init %empty_tuple.type = converted %.loc12_10.1, %.loc12_10.2 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: assign %.loc12_4, %.loc12_7 +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %cj.patt: %pattern_type.cb1 = binding_pattern cj [concrete] +// CHECK:STDOUT: %cj.var_patt: %pattern_type.cb1 = var_pattern %cj.patt [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: %cj.var: ref %empty_tuple.type = var %cj.var_patt +// CHECK:STDOUT: %c.ref.loc13: ref %Class = name_ref c, %c +// CHECK:STDOUT: %j.ref.loc13: %Class.elem = name_ref j, @Class.%.loc4_8 [concrete = @Class.%.loc4_8] +// CHECK:STDOUT: %.loc13_17.1: ref %empty_tuple.type = class_element_access %c.ref.loc13, element0 +// CHECK:STDOUT: %.loc13_17.2: init %empty_tuple.type = tuple_init () to %cj.var [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc13_3: init %empty_tuple.type = converted %.loc13_17.1, %.loc13_17.2 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: assign %cj.var, %.loc13_3 +// CHECK:STDOUT: %.loc13_12.1: type = splice_block %.loc13_12.3 [concrete = constants.%empty_tuple.type] { +// CHECK:STDOUT: %.loc13_12.2: %empty_tuple.type = tuple_literal () +// CHECK:STDOUT: %.loc13_12.3: type = converted %.loc13_12.2, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] +// CHECK:STDOUT: } +// CHECK:STDOUT: %cj: ref %empty_tuple.type = bind_name cj, %cj.var +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %ck.patt: %pattern_type.cb1 = binding_pattern ck [concrete] +// CHECK:STDOUT: %ck.var_patt: %pattern_type.cb1 = var_pattern %ck.patt [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: %ck.var: ref %empty_tuple.type = var %ck.var_patt +// CHECK:STDOUT: %c.ref.loc14: ref %Class = name_ref c, %c +// CHECK:STDOUT: %k.ref.loc14: %Class.elem = name_ref k, @Class.%.loc5_8 [concrete = @Class.%.loc5_8] +// CHECK:STDOUT: %.loc14_17.1: ref %empty_tuple.type = class_element_access %c.ref.loc14, element1 +// CHECK:STDOUT: %.loc14_17.2: init %empty_tuple.type = tuple_init () to %ck.var [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc14_3: init %empty_tuple.type = converted %.loc14_17.1, %.loc14_17.2 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: assign %ck.var, %.loc14_3 +// CHECK:STDOUT: %.loc14_12.1: type = splice_block %.loc14_12.3 [concrete = constants.%empty_tuple.type] { +// CHECK:STDOUT: %.loc14_12.2: %empty_tuple.type = tuple_literal () +// CHECK:STDOUT: %.loc14_12.3: type = converted %.loc14_12.2, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] +// CHECK:STDOUT: } +// CHECK:STDOUT: %ck: ref %empty_tuple.type = bind_name ck, %ck.var +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: --- field_access_in_value.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %Class: type = class_type @Class [concrete] +// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] +// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %empty_tuple.type [concrete] +// CHECK:STDOUT: %empty_tuple: %empty_tuple.type = tuple_value () [concrete] +// CHECK:STDOUT: %pattern_type.cb1: type = pattern_type %empty_tuple.type [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @Test() { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %cj.patt: %pattern_type.cb1 = binding_pattern cj [concrete] +// CHECK:STDOUT: %cj.var_patt: %pattern_type.cb1 = var_pattern %cj.patt [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: %cj.var: ref %empty_tuple.type = var %cj.var_patt +// CHECK:STDOUT: %c.ref.loc14: ref %Class = name_ref c, %c +// CHECK:STDOUT: %j.ref.loc14: %Class.elem = name_ref j, @Class.%.loc4_8 [concrete = @Class.%.loc4_8] +// CHECK:STDOUT: %.loc14_17.1: ref %empty_tuple.type = class_element_access %c.ref.loc14, element0 +// CHECK:STDOUT: %.loc14_17.2: init %empty_tuple.type = tuple_init () to %cj.var [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc14_3: init %empty_tuple.type = converted %.loc14_17.1, %.loc14_17.2 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: assign %cj.var, %.loc14_3 +// CHECK:STDOUT: %.loc14_12.1: type = splice_block %.loc14_12.3 [concrete = constants.%empty_tuple.type] { +// CHECK:STDOUT: %.loc14_12.2: %empty_tuple.type = tuple_literal () +// CHECK:STDOUT: %.loc14_12.3: type = converted %.loc14_12.2, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] +// CHECK:STDOUT: } +// CHECK:STDOUT: %cj: ref %empty_tuple.type = bind_name cj, %cj.var +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %ck.patt: %pattern_type.cb1 = binding_pattern ck [concrete] +// CHECK:STDOUT: %ck.var_patt: %pattern_type.cb1 = var_pattern %ck.patt [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: %ck.var: ref %empty_tuple.type = var %ck.var_patt +// CHECK:STDOUT: %c.ref.loc15: ref %Class = name_ref c, %c +// CHECK:STDOUT: %k.ref.loc15: %Class.elem = name_ref k, @Class.%.loc5_8 [concrete = @Class.%.loc5_8] +// CHECK:STDOUT: %.loc15_17.1: ref %empty_tuple.type = class_element_access %c.ref.loc15, element1 +// CHECK:STDOUT: %.loc15_17.2: init %empty_tuple.type = tuple_init () to %ck.var [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc15_3: init %empty_tuple.type = converted %.loc15_17.1, %.loc15_17.2 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: assign %ck.var, %.loc15_3 +// CHECK:STDOUT: %.loc15_12.1: type = splice_block %.loc15_12.3 [concrete = constants.%empty_tuple.type] { +// CHECK:STDOUT: %.loc15_12.2: %empty_tuple.type = tuple_literal () +// CHECK:STDOUT: %.loc15_12.3: type = converted %.loc15_12.2, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] +// CHECK:STDOUT: } +// CHECK:STDOUT: %ck: ref %empty_tuple.type = bind_name ck, %ck.var +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/no_prelude/generic_method.carbon b/toolchain/check/testdata/class/no_prelude/generic_method.carbon new file mode 100644 index 0000000000000..44f062b035fac --- /dev/null +++ b/toolchain/check/testdata/class/no_prelude/generic_method.carbon @@ -0,0 +1,176 @@ +// Part of the Carbon Language project, under the Apache License v2.0 with LLVM +// Exceptions. See /LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// +// AUTOUPDATE +// TIP: To test this file alone, run: +// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/no_prelude/generic_method.carbon +// TIP: To dump output, run: +// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/no_prelude/generic_method.carbon + +// --- basics.carbon +library "[[@TEST_NAME]]"; + +//@dump-sem-ir-begin +class Class(T:! type) { + var a: T; + fn F[self: Self](n: T); +} + +fn Class(T:! type).F[self: Self](n: T) {} +//@dump-sem-ir-end + +// --- fail_differs.carbon +library "[[@TEST_NAME]]"; + +class Difference {} + +class Class(T:! type) { + var a: T; + fn F[self: Self](n: T); +} + +// TODO: The follow-on errors here aren't great. Investigate whether we can +// enter the scope anyway if the parameters don't match. +// CHECK:STDERR: fail_differs.carbon:[[@LINE+15]]:10: error: type `` of parameter 1 in redeclaration differs from previous parameter type `` [RedeclParamDiffersType] +// CHECK:STDERR: fn Class(N:! Difference).F[self: Self](n: T) {} +// CHECK:STDERR: ^ +// CHECK:STDERR: fail_differs.carbon:[[@LINE-10]]:13: note: previous declaration's corresponding parameter here [RedeclParamPrevious] +// CHECK:STDERR: class Class(T:! type) { +// CHECK:STDERR: ^ +// CHECK:STDERR: +// CHECK:STDERR: fail_differs.carbon:[[@LINE+8]]:34: error: name `Self` not found [NameNotFound] +// CHECK:STDERR: fn Class(N:! Difference).F[self: Self](n: T) {} +// CHECK:STDERR: ^~~~ +// CHECK:STDERR: +// CHECK:STDERR: fail_differs.carbon:[[@LINE+4]]:43: error: name `T` not found [NameNotFound] +// CHECK:STDERR: fn Class(N:! Difference).F[self: Self](n: T) {} +// CHECK:STDERR: ^ +// CHECK:STDERR: +fn Class(N:! Difference).F[self: Self](n: T) {} + +// CHECK:STDOUT: --- basics.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] +// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] +// CHECK:STDOUT: %Class.type: type = generic_class_type @Class [concrete] +// CHECK:STDOUT: %Class.generic: %Class.type = struct_value () [concrete] +// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T) [symbolic] +// CHECK:STDOUT: %require_complete.4ae: = require_complete_type %T [symbolic] +// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %T [symbolic] +// CHECK:STDOUT: %pattern_type.3c1: type = pattern_type %Class [symbolic] +// CHECK:STDOUT: %pattern_type.7dc: type = pattern_type %T [symbolic] +// CHECK:STDOUT: %F.type: type = fn_type @F, @Class(%T) [symbolic] +// CHECK:STDOUT: %F: %F.type = struct_value () [symbolic] +// CHECK:STDOUT: %struct_type.a: type = struct_type {.a: %T} [symbolic] +// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.a [symbolic] +// CHECK:STDOUT: %require_complete.4f8: = require_complete_type %Class [symbolic] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: file { +// CHECK:STDOUT: %Class.decl: %Class.type = class_decl @Class [concrete = constants.%Class.generic] { +// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %T.loc4_13.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_13.2 (constants.%T)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [symbolic = constants.%F] { +// CHECK:STDOUT: %self.patt: @F.%pattern_type.loc6_8 (%pattern_type.3c1) = binding_pattern self [concrete] +// CHECK:STDOUT: %self.param_patt: @F.%pattern_type.loc6_8 (%pattern_type.3c1) = value_param_pattern %self.patt, call_param0 [concrete] +// CHECK:STDOUT: %n.patt: @F.%pattern_type.loc6_20 (%pattern_type.7dc) = binding_pattern n [concrete] +// CHECK:STDOUT: %n.param_patt: @F.%pattern_type.loc6_20 (%pattern_type.7dc) = value_param_pattern %n.patt, call_param1 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %T.loc9: type = bind_symbolic_name T, 0 [symbolic = @Class.%T.loc4_13.2 (constants.%T)] +// CHECK:STDOUT: %self.param.loc9: @F.%Class (%Class) = value_param call_param0 +// CHECK:STDOUT: %.loc9_28.1: type = splice_block %Self.ref.loc9 [symbolic = %Class (constants.%Class)] { +// CHECK:STDOUT: %.loc9_28.2: type = specific_constant constants.%Class, @Class(constants.%T) [symbolic = %Class (constants.%Class)] +// CHECK:STDOUT: %Self.ref.loc9: type = name_ref Self, %.loc9_28.2 [symbolic = %Class (constants.%Class)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %self.loc9: @F.%Class (%Class) = bind_name self, %self.param.loc9 +// CHECK:STDOUT: %n.param.loc9: @F.%T.loc6 (%T) = value_param call_param1 +// CHECK:STDOUT: %T.ref.loc9: type = name_ref T, %T.loc9 [symbolic = %T.loc6 (constants.%T)] +// CHECK:STDOUT: %n.loc9: @F.%T.loc6 (%T) = bind_name n, %n.param.loc9 +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic class @Class(%T.loc4_13.1: type) { +// CHECK:STDOUT: %T.loc4_13.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_13.2 (constants.%T)] +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %require_complete: = require_complete_type %T.loc4_13.2 [symbolic = %require_complete (constants.%require_complete.4ae)] +// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T.loc4_13.2) [symbolic = %Class (constants.%Class)] +// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %T.loc4_13.2 [symbolic = %Class.elem (constants.%Class.elem)] +// CHECK:STDOUT: %F.type: type = fn_type @F, @Class(%T.loc4_13.2) [symbolic = %F.type (constants.%F.type)] +// CHECK:STDOUT: %F: @Class.%F.type (%F.type) = struct_value () [symbolic = %F (constants.%F)] +// CHECK:STDOUT: %struct_type.a.loc7_1.2: type = struct_type {.a: @Class.%T.loc4_13.2 (%T)} [symbolic = %struct_type.a.loc7_1.2 (constants.%struct_type.a)] +// CHECK:STDOUT: %complete_type.loc7_1.2: = complete_type_witness %struct_type.a.loc7_1.2 [symbolic = %complete_type.loc7_1.2 (constants.%complete_type)] +// CHECK:STDOUT: +// CHECK:STDOUT: class { +// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc4_13.1 [symbolic = %T.loc4_13.2 (constants.%T)] +// CHECK:STDOUT: %.loc5: @Class.%Class.elem (%Class.elem) = field_decl a, element0 [concrete] +// CHECK:STDOUT: %F.decl: @Class.%F.type (%F.type) = fn_decl @F [symbolic = @Class.%F (constants.%F)] { +// CHECK:STDOUT: %self.patt: @F.%pattern_type.loc6_8 (%pattern_type.3c1) = binding_pattern self [concrete] +// CHECK:STDOUT: %self.param_patt: @F.%pattern_type.loc6_8 (%pattern_type.3c1) = value_param_pattern %self.patt, call_param0 [concrete] +// CHECK:STDOUT: %n.patt: @F.%pattern_type.loc6_20 (%pattern_type.7dc) = binding_pattern n [concrete] +// CHECK:STDOUT: %n.param_patt: @F.%pattern_type.loc6_20 (%pattern_type.7dc) = value_param_pattern %n.patt, call_param1 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %self.param.loc6: @F.%Class (%Class) = value_param call_param0 +// CHECK:STDOUT: %.loc6_14.1: type = splice_block %Self.ref.loc6 [symbolic = %Class (constants.%Class)] { +// CHECK:STDOUT: %.loc6_14.2: type = specific_constant constants.%Class, @Class(constants.%T) [symbolic = %Class (constants.%Class)] +// CHECK:STDOUT: %Self.ref.loc6: type = name_ref Self, %.loc6_14.2 [symbolic = %Class (constants.%Class)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %self.loc6: @F.%Class (%Class) = bind_name self, %self.param.loc6 +// CHECK:STDOUT: %n.param.loc6: @F.%T.loc6 (%T) = value_param call_param1 +// CHECK:STDOUT: %T.ref.loc6: type = name_ref T, @Class.%T.loc4_13.1 [symbolic = %T.loc6 (constants.%T)] +// CHECK:STDOUT: %n.loc6: @F.%T.loc6 (%T) = bind_name n, %n.param.loc6 +// CHECK:STDOUT: } +// CHECK:STDOUT: %struct_type.a.loc7_1.1: type = struct_type {.a: %T} [symbolic = %struct_type.a.loc7_1.2 (constants.%struct_type.a)] +// CHECK:STDOUT: %complete_type.loc7_1.1: = complete_type_witness %struct_type.a.loc7_1.1 [symbolic = %complete_type.loc7_1.2 (constants.%complete_type)] +// CHECK:STDOUT: complete_type_witness = %complete_type.loc7_1.1 +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = constants.%Class +// CHECK:STDOUT: .T = +// CHECK:STDOUT: .a = %.loc5 +// CHECK:STDOUT: .F = %F.decl +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @F(@Class.%T.loc4_13.1: type) { +// CHECK:STDOUT: %T.loc6: type = bind_symbolic_name T, 0 [symbolic = %T.loc6 (constants.%T)] +// CHECK:STDOUT: %Class: type = class_type @Class, @Class(%T.loc6) [symbolic = %Class (constants.%Class)] +// CHECK:STDOUT: %pattern_type.loc6_8: type = pattern_type %Class [symbolic = %pattern_type.loc6_8 (constants.%pattern_type.3c1)] +// CHECK:STDOUT: %pattern_type.loc6_20: type = pattern_type %T.loc6 [symbolic = %pattern_type.loc6_20 (constants.%pattern_type.7dc)] +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %require_complete.loc9_26: = require_complete_type %Class [symbolic = %require_complete.loc9_26 (constants.%require_complete.4f8)] +// CHECK:STDOUT: %require_complete.loc9_35: = require_complete_type %T.loc6 [symbolic = %require_complete.loc9_35 (constants.%require_complete.4ae)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn(%self.param.loc9: @F.%Class (%Class), %n.param.loc9: @F.%T.loc6 (%T)) { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: return +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @Class(constants.%T) { +// CHECK:STDOUT: %T.loc4_13.2 => constants.%T +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %require_complete => constants.%require_complete.4ae +// CHECK:STDOUT: %Class => constants.%Class +// CHECK:STDOUT: %Class.elem => constants.%Class.elem +// CHECK:STDOUT: %F.type => constants.%F.type +// CHECK:STDOUT: %F => constants.%F +// CHECK:STDOUT: %struct_type.a.loc7_1.2 => constants.%struct_type.a +// CHECK:STDOUT: %complete_type.loc7_1.2 => constants.%complete_type +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @F(constants.%T) { +// CHECK:STDOUT: %T.loc6 => constants.%T +// CHECK:STDOUT: %Class => constants.%Class +// CHECK:STDOUT: %pattern_type.loc6_8 => constants.%pattern_type.3c1 +// CHECK:STDOUT: %pattern_type.loc6_20 => constants.%pattern_type.7dc +// CHECK:STDOUT: } +// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/no_prelude/generic_vs_params.carbon b/toolchain/check/testdata/class/no_prelude/generic_vs_params.carbon index a7edc8160b305..c8aeed47f5c5f 100644 --- a/toolchain/check/testdata/class/no_prelude/generic_vs_params.carbon +++ b/toolchain/check/testdata/class/no_prelude/generic_vs_params.carbon @@ -2,6 +2,8 @@ // Exceptions. See /LICENSE for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// // AUTOUPDATE // TIP: To test this file alone, run: // TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/no_prelude/generic_vs_params.carbon @@ -12,6 +14,7 @@ library "[[@TEST_NAME]]"; +//@dump-sem-ir-begin class NotGenericNoParams {} class NotGenericButParams() {} class GenericAndParams(T:! type) {} @@ -20,14 +23,17 @@ class C(T:! type) { class GenericNoParams {} class GenericAndParams(U:! type) {} } +//@dump-sem-ir-end class X {} +//@dump-sem-ir-begin var a: NotGenericNoParams = {}; var b: NotGenericButParams() = {}; var c: GenericAndParams(X) = {}; var d: C(X).GenericNoParams = {}; var e: C(X).GenericAndParams(X) = {}; +//@dump-sem-ir-end // --- fail_non_generic_implicit_params.carbon @@ -116,31 +122,18 @@ class Foo[T:! type]; // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .NotGenericNoParams = %NotGenericNoParams.decl -// CHECK:STDOUT: .NotGenericButParams = %NotGenericButParams.decl -// CHECK:STDOUT: .GenericAndParams = %GenericAndParams.decl -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: .X = %X.decl -// CHECK:STDOUT: .a = %a -// CHECK:STDOUT: .b = %b -// CHECK:STDOUT: .c = %c -// CHECK:STDOUT: .d = %d -// CHECK:STDOUT: .e = %e -// CHECK:STDOUT: } // CHECK:STDOUT: %NotGenericNoParams.decl: type = class_decl @NotGenericNoParams [concrete = constants.%NotGenericNoParams] {} {} // CHECK:STDOUT: %NotGenericButParams.decl: %NotGenericButParams.type = class_decl @NotGenericButParams [concrete = constants.%NotGenericButParams.generic] {} {} // CHECK:STDOUT: %GenericAndParams.decl: %GenericAndParams.type.c8d = class_decl @GenericAndParams.1 [concrete = constants.%GenericAndParams.generic.1e4] { // CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc6_24.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc6_24.2 (constants.%T)] +// CHECK:STDOUT: %T.loc7_24.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc7_24.2 (constants.%T)] // CHECK:STDOUT: } // CHECK:STDOUT: %C.decl: %C.type = class_decl @C [concrete = constants.%C.generic] { // CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc8_9.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc8_9.2 (constants.%T)] +// CHECK:STDOUT: %T.loc9_9.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc9_9.2 (constants.%T)] // CHECK:STDOUT: } -// CHECK:STDOUT: %X.decl: type = class_decl @X [concrete = constants.%X] {} {} // CHECK:STDOUT: name_binding_decl { // CHECK:STDOUT: %a.patt: %pattern_type.71d = binding_pattern a [concrete] // CHECK:STDOUT: %a.var_patt: %pattern_type.71d = var_pattern %a.patt [concrete] @@ -153,7 +146,7 @@ class Foo[T:! type]; // CHECK:STDOUT: %b.var_patt: %pattern_type.4f9 = var_pattern %b.patt [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: %b.var: ref %NotGenericButParams = var %b.var_patt [concrete] -// CHECK:STDOUT: %.loc16: type = splice_block %NotGenericButParams [concrete = constants.%NotGenericButParams] { +// CHECK:STDOUT: %.loc19: type = splice_block %NotGenericButParams [concrete = constants.%NotGenericButParams] { // CHECK:STDOUT: %NotGenericButParams.ref: %NotGenericButParams.type = name_ref NotGenericButParams, %NotGenericButParams.decl [concrete = constants.%NotGenericButParams.generic] // CHECK:STDOUT: %NotGenericButParams: type = class_type @NotGenericButParams [concrete = constants.%NotGenericButParams] // CHECK:STDOUT: } @@ -163,10 +156,10 @@ class Foo[T:! type]; // CHECK:STDOUT: %c.var_patt: %pattern_type.569 = var_pattern %c.patt [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: %c.var: ref %GenericAndParams.2bb = var %c.var_patt [concrete] -// CHECK:STDOUT: %.loc17: type = splice_block %GenericAndParams.loc17 [concrete = constants.%GenericAndParams.2bb] { -// CHECK:STDOUT: %GenericAndParams.ref.loc17: %GenericAndParams.type.c8d = name_ref GenericAndParams, %GenericAndParams.decl [concrete = constants.%GenericAndParams.generic.1e4] -// CHECK:STDOUT: %X.ref.loc17: type = name_ref X, %X.decl [concrete = constants.%X] -// CHECK:STDOUT: %GenericAndParams.loc17: type = class_type @GenericAndParams.1, @GenericAndParams.1(constants.%X) [concrete = constants.%GenericAndParams.2bb] +// CHECK:STDOUT: %.loc20: type = splice_block %GenericAndParams.loc20 [concrete = constants.%GenericAndParams.2bb] { +// CHECK:STDOUT: %GenericAndParams.ref.loc20: %GenericAndParams.type.c8d = name_ref GenericAndParams, %GenericAndParams.decl [concrete = constants.%GenericAndParams.generic.1e4] +// CHECK:STDOUT: %X.ref.loc20: type = name_ref X, %X.decl [concrete = constants.%X] +// CHECK:STDOUT: %GenericAndParams.loc20: type = class_type @GenericAndParams.1, @GenericAndParams.1(constants.%X) [concrete = constants.%GenericAndParams.2bb] // CHECK:STDOUT: } // CHECK:STDOUT: %c: ref %GenericAndParams.2bb = bind_name c, %c.var // CHECK:STDOUT: name_binding_decl { @@ -174,12 +167,12 @@ class Foo[T:! type]; // CHECK:STDOUT: %d.var_patt: %pattern_type.518 = var_pattern %d.patt [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: %d.var: ref %GenericNoParams.fa1 = var %d.var_patt [concrete] -// CHECK:STDOUT: %.loc18_12.1: type = splice_block %GenericNoParams.ref [concrete = constants.%GenericNoParams.fa1] { -// CHECK:STDOUT: %C.ref.loc18: %C.type = name_ref C, %C.decl [concrete = constants.%C.generic] -// CHECK:STDOUT: %X.ref.loc18: type = name_ref X, %X.decl [concrete = constants.%X] -// CHECK:STDOUT: %C.loc18: type = class_type @C, @C(constants.%X) [concrete = constants.%C.fac] -// CHECK:STDOUT: %.loc18_12.2: type = specific_constant @C.%GenericNoParams.decl, @C(constants.%X) [concrete = constants.%GenericNoParams.fa1] -// CHECK:STDOUT: %GenericNoParams.ref: type = name_ref GenericNoParams, %.loc18_12.2 [concrete = constants.%GenericNoParams.fa1] +// CHECK:STDOUT: %.loc21_12.1: type = splice_block %GenericNoParams.ref [concrete = constants.%GenericNoParams.fa1] { +// CHECK:STDOUT: %C.ref.loc21: %C.type = name_ref C, %C.decl [concrete = constants.%C.generic] +// CHECK:STDOUT: %X.ref.loc21: type = name_ref X, %X.decl [concrete = constants.%X] +// CHECK:STDOUT: %C.loc21: type = class_type @C, @C(constants.%X) [concrete = constants.%C.fac] +// CHECK:STDOUT: %.loc21_12.2: type = specific_constant @C.%GenericNoParams.decl, @C(constants.%X) [concrete = constants.%GenericNoParams.fa1] +// CHECK:STDOUT: %GenericNoParams.ref: type = name_ref GenericNoParams, %.loc21_12.2 [concrete = constants.%GenericNoParams.fa1] // CHECK:STDOUT: } // CHECK:STDOUT: %d: ref %GenericNoParams.fa1 = bind_name d, %d.var // CHECK:STDOUT: name_binding_decl { @@ -187,14 +180,14 @@ class Foo[T:! type]; // CHECK:STDOUT: %e.var_patt: %pattern_type.806 = var_pattern %e.patt [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: %e.var: ref %GenericAndParams.91f = var %e.var_patt [concrete] -// CHECK:STDOUT: %.loc19_31: type = splice_block %GenericAndParams.loc19 [concrete = constants.%GenericAndParams.91f] { -// CHECK:STDOUT: %C.ref.loc19: %C.type = name_ref C, %C.decl [concrete = constants.%C.generic] -// CHECK:STDOUT: %X.ref.loc19_10: type = name_ref X, %X.decl [concrete = constants.%X] -// CHECK:STDOUT: %C.loc19: type = class_type @C, @C(constants.%X) [concrete = constants.%C.fac] -// CHECK:STDOUT: %.loc19_12: %GenericAndParams.type.c20 = specific_constant @C.%GenericAndParams.decl, @C(constants.%X) [concrete = constants.%GenericAndParams.generic.a55] -// CHECK:STDOUT: %GenericAndParams.ref.loc19: %GenericAndParams.type.c20 = name_ref GenericAndParams, %.loc19_12 [concrete = constants.%GenericAndParams.generic.a55] -// CHECK:STDOUT: %X.ref.loc19_30: type = name_ref X, %X.decl [concrete = constants.%X] -// CHECK:STDOUT: %GenericAndParams.loc19: type = class_type @GenericAndParams.2, @GenericAndParams.2(constants.%X, constants.%X) [concrete = constants.%GenericAndParams.91f] +// CHECK:STDOUT: %.loc22_31: type = splice_block %GenericAndParams.loc22 [concrete = constants.%GenericAndParams.91f] { +// CHECK:STDOUT: %C.ref.loc22: %C.type = name_ref C, %C.decl [concrete = constants.%C.generic] +// CHECK:STDOUT: %X.ref.loc22_10: type = name_ref X, %X.decl [concrete = constants.%X] +// CHECK:STDOUT: %C.loc22: type = class_type @C, @C(constants.%X) [concrete = constants.%C.fac] +// CHECK:STDOUT: %.loc22_12: %GenericAndParams.type.c20 = specific_constant @C.%GenericAndParams.decl, @C(constants.%X) [concrete = constants.%GenericAndParams.generic.a55] +// CHECK:STDOUT: %GenericAndParams.ref.loc22: %GenericAndParams.type.c20 = name_ref GenericAndParams, %.loc22_12 [concrete = constants.%GenericAndParams.generic.a55] +// CHECK:STDOUT: %X.ref.loc22_30: type = name_ref X, %X.decl [concrete = constants.%X] +// CHECK:STDOUT: %GenericAndParams.loc22: type = class_type @GenericAndParams.2, @GenericAndParams.2(constants.%X, constants.%X) [concrete = constants.%GenericAndParams.91f] // CHECK:STDOUT: } // CHECK:STDOUT: %e: ref %GenericAndParams.91f = bind_name e, %e.var // CHECK:STDOUT: } @@ -217,8 +210,8 @@ class Foo[T:! type]; // CHECK:STDOUT: .Self = constants.%NotGenericButParams // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic class @GenericAndParams.1(%T.loc6_24.1: type) { -// CHECK:STDOUT: %T.loc6_24.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc6_24.2 (constants.%T)] +// CHECK:STDOUT: generic class @GenericAndParams.1(%T.loc7_24.1: type) { +// CHECK:STDOUT: %T.loc7_24.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc7_24.2 (constants.%T)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: @@ -232,12 +225,12 @@ class Foo[T:! type]; // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic class @C(%T.loc8_9.1: type) { -// CHECK:STDOUT: %T.loc8_9.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc8_9.2 (constants.%T)] +// CHECK:STDOUT: generic class @C(%T.loc9_9.1: type) { +// CHECK:STDOUT: %T.loc9_9.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc9_9.2 (constants.%T)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: %GenericNoParams: type = class_type @GenericNoParams, @GenericNoParams(%T.loc8_9.2) [symbolic = %GenericNoParams (constants.%GenericNoParams.fbf)] -// CHECK:STDOUT: %GenericAndParams.type: type = generic_class_type @GenericAndParams.2, @C(%T.loc8_9.2) [symbolic = %GenericAndParams.type (constants.%GenericAndParams.type.3ce)] +// CHECK:STDOUT: %GenericNoParams: type = class_type @GenericNoParams, @GenericNoParams(%T.loc9_9.2) [symbolic = %GenericNoParams (constants.%GenericNoParams.fbf)] +// CHECK:STDOUT: %GenericAndParams.type: type = generic_class_type @GenericAndParams.2, @C(%T.loc9_9.2) [symbolic = %GenericAndParams.type (constants.%GenericAndParams.type.3ce)] // CHECK:STDOUT: %GenericAndParams.generic: @C.%GenericAndParams.type (%GenericAndParams.type.3ce) = struct_value () [symbolic = %GenericAndParams.generic (constants.%GenericAndParams.generic.54a)] // CHECK:STDOUT: // CHECK:STDOUT: class { @@ -245,7 +238,7 @@ class Foo[T:! type]; // CHECK:STDOUT: %GenericAndParams.decl: @C.%GenericAndParams.type (%GenericAndParams.type.3ce) = class_decl @GenericAndParams.2 [symbolic = @C.%GenericAndParams.generic (constants.%GenericAndParams.generic.54a)] { // CHECK:STDOUT: %U.patt: %pattern_type.98f = symbolic_binding_pattern U, 1 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %U.loc10_26.1: type = bind_symbolic_name U, 1 [symbolic = %U.loc10_26.2 (constants.%U)] +// CHECK:STDOUT: %U.loc11_26.1: type = bind_symbolic_name U, 1 [symbolic = %U.loc11_26.2 (constants.%U)] // CHECK:STDOUT: } // CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] // CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type] @@ -258,7 +251,7 @@ class Foo[T:! type]; // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic class @GenericNoParams(@C.%T.loc8_9.1: type) { +// CHECK:STDOUT: generic class @GenericNoParams(@C.%T.loc9_9.1: type) { // CHECK:STDOUT: !definition: // CHECK:STDOUT: // CHECK:STDOUT: class { @@ -271,8 +264,8 @@ class Foo[T:! type]; // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic class @GenericAndParams.2(@C.%T.loc8_9.1: type, %U.loc10_26.1: type) { -// CHECK:STDOUT: %U.loc10_26.2: type = bind_symbolic_name U, 1 [symbolic = %U.loc10_26.2 (constants.%U)] +// CHECK:STDOUT: generic class @GenericAndParams.2(@C.%T.loc9_9.1: type, %U.loc11_26.1: type) { +// CHECK:STDOUT: %U.loc11_26.2: type = bind_symbolic_name U, 1 [symbolic = %U.loc11_26.2 (constants.%U)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: @@ -286,62 +279,53 @@ class Foo[T:! type]; // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: class @X { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%X -// CHECK:STDOUT: } -// CHECK:STDOUT: // CHECK:STDOUT: fn @__global_init() { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %.loc15_30.1: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %.loc15_30.2: init %NotGenericNoParams = class_init (), file.%a.var [concrete = constants.%NotGenericNoParams.val] -// CHECK:STDOUT: %.loc15_1: init %NotGenericNoParams = converted %.loc15_30.1, %.loc15_30.2 [concrete = constants.%NotGenericNoParams.val] -// CHECK:STDOUT: assign file.%a.var, %.loc15_1 -// CHECK:STDOUT: %.loc16_33.1: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %.loc16_33.2: init %NotGenericButParams = class_init (), file.%b.var [concrete = constants.%NotGenericButParams.val] -// CHECK:STDOUT: %.loc16_1: init %NotGenericButParams = converted %.loc16_33.1, %.loc16_33.2 [concrete = constants.%NotGenericButParams.val] -// CHECK:STDOUT: assign file.%b.var, %.loc16_1 -// CHECK:STDOUT: %.loc17_31.1: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %.loc17_31.2: init %GenericAndParams.2bb = class_init (), file.%c.var [concrete = constants.%GenericAndParams.val.0b2] -// CHECK:STDOUT: %.loc17_1: init %GenericAndParams.2bb = converted %.loc17_31.1, %.loc17_31.2 [concrete = constants.%GenericAndParams.val.0b2] -// CHECK:STDOUT: assign file.%c.var, %.loc17_1 -// CHECK:STDOUT: %.loc18_32.1: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %.loc18_32.2: init %GenericNoParams.fa1 = class_init (), file.%d.var [concrete = constants.%GenericNoParams.val] -// CHECK:STDOUT: %.loc18_1: init %GenericNoParams.fa1 = converted %.loc18_32.1, %.loc18_32.2 [concrete = constants.%GenericNoParams.val] -// CHECK:STDOUT: assign file.%d.var, %.loc18_1 -// CHECK:STDOUT: %.loc19_36.1: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %.loc19_36.2: init %GenericAndParams.91f = class_init (), file.%e.var [concrete = constants.%GenericAndParams.val.99b] -// CHECK:STDOUT: %.loc19_1: init %GenericAndParams.91f = converted %.loc19_36.1, %.loc19_36.2 [concrete = constants.%GenericAndParams.val.99b] -// CHECK:STDOUT: assign file.%e.var, %.loc19_1 -// CHECK:STDOUT: return +// CHECK:STDOUT: %.loc18_30.1: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc18_30.2: init %NotGenericNoParams = class_init (), file.%a.var [concrete = constants.%NotGenericNoParams.val] +// CHECK:STDOUT: %.loc18_1: init %NotGenericNoParams = converted %.loc18_30.1, %.loc18_30.2 [concrete = constants.%NotGenericNoParams.val] +// CHECK:STDOUT: assign file.%a.var, %.loc18_1 +// CHECK:STDOUT: %.loc19_33.1: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc19_33.2: init %NotGenericButParams = class_init (), file.%b.var [concrete = constants.%NotGenericButParams.val] +// CHECK:STDOUT: %.loc19_1: init %NotGenericButParams = converted %.loc19_33.1, %.loc19_33.2 [concrete = constants.%NotGenericButParams.val] +// CHECK:STDOUT: assign file.%b.var, %.loc19_1 +// CHECK:STDOUT: %.loc20_31.1: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc20_31.2: init %GenericAndParams.2bb = class_init (), file.%c.var [concrete = constants.%GenericAndParams.val.0b2] +// CHECK:STDOUT: %.loc20_1: init %GenericAndParams.2bb = converted %.loc20_31.1, %.loc20_31.2 [concrete = constants.%GenericAndParams.val.0b2] +// CHECK:STDOUT: assign file.%c.var, %.loc20_1 +// CHECK:STDOUT: %.loc21_32.1: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc21_32.2: init %GenericNoParams.fa1 = class_init (), file.%d.var [concrete = constants.%GenericNoParams.val] +// CHECK:STDOUT: %.loc21_1: init %GenericNoParams.fa1 = converted %.loc21_32.1, %.loc21_32.2 [concrete = constants.%GenericNoParams.val] +// CHECK:STDOUT: assign file.%d.var, %.loc21_1 +// CHECK:STDOUT: %.loc22_36.1: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc22_36.2: init %GenericAndParams.91f = class_init (), file.%e.var [concrete = constants.%GenericAndParams.val.99b] +// CHECK:STDOUT: %.loc22_1: init %GenericAndParams.91f = converted %.loc22_36.1, %.loc22_36.2 [concrete = constants.%GenericAndParams.val.99b] +// CHECK:STDOUT: assign file.%e.var, %.loc22_1 +// CHECK:STDOUT: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @GenericAndParams.1(constants.%T) { -// CHECK:STDOUT: %T.loc6_24.2 => constants.%T +// CHECK:STDOUT: %T.loc7_24.2 => constants.%T // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @C(constants.%T) { -// CHECK:STDOUT: %T.loc8_9.2 => constants.%T +// CHECK:STDOUT: %T.loc9_9.2 => constants.%T // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @GenericNoParams(constants.%T) {} // CHECK:STDOUT: // CHECK:STDOUT: specific @GenericAndParams.2(constants.%T, constants.%U) { -// CHECK:STDOUT: %U.loc10_26.2 => constants.%U +// CHECK:STDOUT: %U.loc11_26.2 => constants.%U // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @GenericAndParams.1(constants.%X) { -// CHECK:STDOUT: %T.loc6_24.2 => constants.%X +// CHECK:STDOUT: %T.loc7_24.2 => constants.%X // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @C(constants.%X) { -// CHECK:STDOUT: %T.loc8_9.2 => constants.%X +// CHECK:STDOUT: %T.loc9_9.2 => constants.%X // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: %GenericNoParams => constants.%GenericNoParams.fa1 @@ -354,134 +338,8 @@ class Foo[T:! type]; // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @GenericAndParams.2(constants.%X, constants.%X) { -// CHECK:STDOUT: %U.loc10_26.2 => constants.%X -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_non_generic_implicit_params.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %A.type: type = generic_class_type @A [concrete] -// CHECK:STDOUT: %A.generic: %A.type = struct_value () [concrete] -// CHECK:STDOUT: %A: type = class_type @A [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .A = %A.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %A.decl: %A.type = class_decl @A [concrete = constants.%A.generic] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @A { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%A -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_non_generic_params.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %A.type: type = generic_class_type @A [concrete] -// CHECK:STDOUT: %A.generic: %A.type = struct_value () [concrete] -// CHECK:STDOUT: %A: type = class_type @A [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type: type = pattern_type type [concrete] -// 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 [concrete] { -// CHECK:STDOUT: .A = %A.decl -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %A.decl: %A.type = class_decl @A [concrete = constants.%A.generic] {} {} -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %T.patt: %pattern_type = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc11_6.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc11_6.2 (constants.%T)] -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @A { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%A -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic fn @F(%T.loc11_6.1: type) { -// CHECK:STDOUT: %T.loc11_6.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc11_6.2 (constants.%T)] +// CHECK:STDOUT: %U.loc11_26.2 => constants.%X // CHECK:STDOUT: // CHECK:STDOUT: !definition: -// CHECK:STDOUT: -// CHECK:STDOUT: fn() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %A.ref: %A.type = name_ref A, file.%A.decl [concrete = constants.%A.generic] -// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc11_6.1 [symbolic = %T.loc11_6.2 (constants.%T)] -// CHECK:STDOUT: %A: type = class_type @A [concrete = constants.%A] -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @F(constants.%T) { -// CHECK:STDOUT: %T.loc11_6.2 => constants.%T -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_implicit_params_only_empty.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Foo.type: type = generic_class_type @Foo [concrete] -// CHECK:STDOUT: %Foo.generic: %Foo.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Foo = %Foo.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Foo.decl: %Foo.type = class_decl @Foo [concrete = constants.%Foo.generic] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Foo; -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_implicit_params_only.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type: type = pattern_type type [concrete] -// CHECK:STDOUT: %Foo.type: type = generic_class_type @Foo [concrete] -// CHECK:STDOUT: %Foo.generic: %Foo.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Foo = %Foo.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Foo.decl: %Foo.type = class_decl @Foo [concrete = constants.%Foo.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc8_11.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc8_11.2 (constants.%T)] -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Foo(%T.loc8_11.1: type) { -// CHECK:STDOUT: %T.loc8_11.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc8_11.2 (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: class; -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Foo(constants.%T) { -// CHECK:STDOUT: %T.loc8_11.2 => constants.%T // CHECK:STDOUT: } // CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/no_prelude/implicit_import.carbon b/toolchain/check/testdata/class/no_prelude/implicit_import.carbon index db5d9ffc3e625..ad04512218107 100644 --- a/toolchain/check/testdata/class/no_prelude/implicit_import.carbon +++ b/toolchain/check/testdata/class/no_prelude/implicit_import.carbon @@ -2,6 +2,8 @@ // Exceptions. See /LICENSE for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// // AUTOUPDATE // TIP: To test this file alone, run: // TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/no_prelude/implicit_import.carbon @@ -18,7 +20,9 @@ class C; impl library "[[@TEST_NAME]]"; +//@dump-sem-ir-begin class C {} +//@dump-sem-ir-end // --- redecl_after_def.carbon @@ -81,21 +85,6 @@ impl library "[[@TEST_NAME]]"; // CHECK:STDERR: class B {} -// CHECK:STDOUT: --- basic.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C; -// CHECK:STDOUT: // CHECK:STDOUT: --- basic.impl.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { @@ -108,88 +97,6 @@ class B {} // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %default.import.loc2_21.1 = import -// CHECK:STDOUT: %default.import.loc2_21.2 = import -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- redecl_after_def.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_redecl_after_def.impl.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Main.import_ref.8f2: = import_ref Main//redecl_after_def, loc4_10, loaded [concrete = constants.%complete_type] -// CHECK:STDOUT: %Main.import_ref.2c4 = import_ref Main//redecl_after_def, inst16 [no loc], unloaded -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %default.import.loc2_32.1 = import -// CHECK:STDOUT: %default.import.loc2_32.2 = import -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C { -// CHECK:STDOUT: complete_type_witness = imports.%Main.import_ref.8f2 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Main.import_ref.2c4 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- redef_after_def.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: } // CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} // CHECK:STDOUT: } // CHECK:STDOUT: @@ -202,96 +109,3 @@ class B {} // CHECK:STDOUT: .Self = constants.%C // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: --- fail_redef_after_def.impl.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C.f794a0.1: type = class_type @C.1 [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %C.f794a0.2: type = class_type @C.2 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Main.C: type = import_ref Main//redef_after_def, C, loaded [concrete = constants.%C.f794a0.1] -// CHECK:STDOUT: %Main.import_ref.8f2: = import_ref Main//redef_after_def, loc4_10, loaded [concrete = constants.%complete_type] -// CHECK:STDOUT: %Main.import_ref.2c4 = import_ref Main//redef_after_def, inst16 [no loc], unloaded -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .C = imports.%Main.C -// CHECK:STDOUT: } -// CHECK:STDOUT: %default.import.loc2_31.1 = import -// CHECK:STDOUT: %default.import.loc2_31.2 = import -// CHECK:STDOUT: %C.decl: type = class_decl @C.2 [concrete = constants.%C.f794a0.2] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C.1 [from "redef_after_def.carbon"] { -// CHECK:STDOUT: complete_type_witness = imports.%Main.import_ref.8f2 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Main.import_ref.2c4 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C.2 { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.f794a0.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- def_alias.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: .B = %B -// CHECK:STDOUT: } -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: %C.ref: type = name_ref C, %C.decl [concrete = constants.%C] -// CHECK:STDOUT: %B: type = bind_alias B, %C.decl [concrete = constants.%C] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C; -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_def_alias.impl.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %B: type = class_type @B [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Main.C = import_ref Main//def_alias, C, unloaded -// CHECK:STDOUT: %Main.B: type = import_ref Main//def_alias, B, loaded [concrete = constants.%C] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .C = imports.%Main.C -// CHECK:STDOUT: .B = imports.%Main.B -// CHECK:STDOUT: } -// CHECK:STDOUT: %default.import.loc2_25.1 = import -// CHECK:STDOUT: %default.import.loc2_25.2 = import -// CHECK:STDOUT: %B.decl: type = class_decl @B [concrete = constants.%B] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C [from "def_alias.carbon"]; -// CHECK:STDOUT: -// CHECK:STDOUT: class @B { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%B -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/no_prelude/import.carbon b/toolchain/check/testdata/class/no_prelude/import.carbon new file mode 100644 index 0000000000000..ff2257145eb8f --- /dev/null +++ b/toolchain/check/testdata/class/no_prelude/import.carbon @@ -0,0 +1,242 @@ +// Part of the Carbon Language project, under the Apache License v2.0 with LLVM +// Exceptions. See /LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// +// AUTOUPDATE +// TIP: To test this file alone, run: +// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/no_prelude/import.carbon +// TIP: To dump output, run: +// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/no_prelude/import.carbon + +// --- basics.carbon + +library "[[@TEST_NAME]]"; + +class Empty { +} + +class Field { + var x: (); +} + +class ForwardDeclared; + +class ForwardDeclared { + fn F[self: Self](); + fn G[addr self: Self*](); +} + +class Incomplete; + +// --- basics_use.carbon + +library "[[@TEST_NAME]]"; + +import library "basics"; + +fn Run() { + //@dump-sem-ir-begin + var a: Empty = {}; + + var b: Field = {.x = ()}; + b.x = (); + + var c: ForwardDeclared = {}; + c.F(); + c.G(); + + var d: ForwardDeclared* = &c; + + var e: Incomplete*; + //@dump-sem-ir-end +} + +// --- fail_import_misuses.carbon + +library "[[@TEST_NAME]]"; + +import library "basics"; + +// CHECK:STDERR: fail_import_misuses.carbon:[[@LINE+8]]:1: error: redeclaration of `class Empty` is redundant [RedeclRedundant] +// CHECK:STDERR: class Empty { +// CHECK:STDERR: ^~~~~~~~~~~~~ +// CHECK:STDERR: fail_import_misuses.carbon:[[@LINE-5]]:1: in import [InImport] +// CHECK:STDERR: basics.carbon:4:1: note: previously declared here [RedeclPrevDecl] +// CHECK:STDERR: class Empty { +// CHECK:STDERR: ^~~~~~~~~~~~~ +// CHECK:STDERR: +class Empty { +} + +// CHECK:STDERR: fail_import_misuses.carbon:[[@LINE+8]]:8: error: binding pattern has incomplete type `Incomplete` in name binding declaration [IncompleteTypeInBindingDecl] +// CHECK:STDERR: var a: Incomplete; +// CHECK:STDERR: ^~~~~~~~~~ +// CHECK:STDERR: fail_import_misuses.carbon:[[@LINE-16]]:1: in import [InImport] +// CHECK:STDERR: basics.carbon:18:1: note: class was forward declared here [ClassForwardDeclaredHere] +// CHECK:STDERR: class Incomplete; +// CHECK:STDERR: ^~~~~~~~~~~~~~~~~ +// CHECK:STDERR: +var a: Incomplete; + +// --- forward_decl.carbon + +library "[[@TEST_NAME]]"; + +class ForwardDecl; + +// --- forward_decl.impl.carbon + +impl library "[[@TEST_NAME]]"; + +//@dump-sem-ir-begin +class ForwardDecl { +} +//@dump-sem-ir-end + +// CHECK:STDOUT: --- basics_use.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] +// CHECK:STDOUT: %Empty: type = class_type @Empty [concrete] +// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] +// CHECK:STDOUT: %pattern_type.2f0: type = pattern_type %Empty [concrete] +// CHECK:STDOUT: %Empty.val: %Empty = struct_value () [concrete] +// CHECK:STDOUT: %Field: type = class_type @Field [concrete] +// CHECK:STDOUT: %struct_type.x: type = struct_type {.x: %empty_tuple.type} [concrete] +// CHECK:STDOUT: %pattern_type.f46: type = pattern_type %Field [concrete] +// CHECK:STDOUT: %empty_tuple: %empty_tuple.type = tuple_value () [concrete] +// CHECK:STDOUT: %Field.val: %Field = struct_value (%empty_tuple) [concrete] +// CHECK:STDOUT: %Field.elem: type = unbound_element_type %Field, %empty_tuple.type [concrete] +// CHECK:STDOUT: %ForwardDeclared.7b34f2.1: type = class_type @ForwardDeclared.1 [concrete] +// CHECK:STDOUT: %pattern_type.1b8: type = pattern_type %ForwardDeclared.7b34f2.1 [concrete] +// CHECK:STDOUT: %ForwardDeclared.val: %ForwardDeclared.7b34f2.1 = struct_value () [concrete] +// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] +// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] +// CHECK:STDOUT: %G.type: type = fn_type @G [concrete] +// CHECK:STDOUT: %G: %G.type = struct_value () [concrete] +// CHECK:STDOUT: %ptr.6cf: type = ptr_type %ForwardDeclared.7b34f2.1 [concrete] +// CHECK:STDOUT: %pattern_type.ebb: type = pattern_type %ptr.6cf [concrete] +// CHECK:STDOUT: %Incomplete: type = class_type @Incomplete [concrete] +// CHECK:STDOUT: %ptr.c62: type = ptr_type %Incomplete [concrete] +// CHECK:STDOUT: %pattern_type.275: type = pattern_type %ptr.c62 [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: %Main.Empty: type = import_ref Main//basics, Empty, loaded [concrete = constants.%Empty] +// CHECK:STDOUT: %Main.Field: type = import_ref Main//basics, Field, loaded [concrete = constants.%Field] +// CHECK:STDOUT: %Main.ForwardDeclared: type = import_ref Main//basics, ForwardDeclared, loaded [concrete = constants.%ForwardDeclared.7b34f2.1] +// CHECK:STDOUT: %Main.Incomplete: type = import_ref Main//basics, Incomplete, loaded [concrete = constants.%Incomplete] +// CHECK:STDOUT: %Main.import_ref.695: %Field.elem = import_ref Main//basics, loc8_8, loaded [concrete = %.99e] +// CHECK:STDOUT: %.99e: %Field.elem = field_decl x, element0 [concrete] +// CHECK:STDOUT: %Main.import_ref.760: %F.type = import_ref Main//basics, loc14_21, loaded [concrete = constants.%F] +// CHECK:STDOUT: %Main.import_ref.26e: %G.type = import_ref Main//basics, loc15_27, loaded [concrete = constants.%G] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @Run() { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %a.patt: %pattern_type.2f0 = binding_pattern a [concrete] +// CHECK:STDOUT: %a.var_patt: %pattern_type.2f0 = var_pattern %a.patt [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: %a.var: ref %Empty = var %a.var_patt +// CHECK:STDOUT: %.loc8_19.1: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc8_19.2: init %Empty = class_init (), %a.var [concrete = constants.%Empty.val] +// CHECK:STDOUT: %.loc8_3: init %Empty = converted %.loc8_19.1, %.loc8_19.2 [concrete = constants.%Empty.val] +// CHECK:STDOUT: assign %a.var, %.loc8_3 +// CHECK:STDOUT: %Empty.ref: type = name_ref Empty, imports.%Main.Empty [concrete = constants.%Empty] +// CHECK:STDOUT: %a: ref %Empty = bind_name a, %a.var +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %b.patt: %pattern_type.f46 = binding_pattern b [concrete] +// CHECK:STDOUT: %b.var_patt: %pattern_type.f46 = var_pattern %b.patt [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: %b.var: ref %Field = var %b.var_patt +// CHECK:STDOUT: %.loc10_25.1: %empty_tuple.type = tuple_literal () +// CHECK:STDOUT: %.loc10_26.1: %struct_type.x = struct_literal (%.loc10_25.1) +// CHECK:STDOUT: %.loc10_26.2: ref %empty_tuple.type = class_element_access %b.var, element0 +// CHECK:STDOUT: %.loc10_25.2: init %empty_tuple.type = tuple_init () to %.loc10_26.2 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc10_26.3: init %empty_tuple.type = converted %.loc10_25.1, %.loc10_25.2 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc10_26.4: init %Field = class_init (%.loc10_26.3), %b.var [concrete = constants.%Field.val] +// CHECK:STDOUT: %.loc10_3: init %Field = converted %.loc10_26.1, %.loc10_26.4 [concrete = constants.%Field.val] +// CHECK:STDOUT: assign %b.var, %.loc10_3 +// CHECK:STDOUT: %Field.ref: type = name_ref Field, imports.%Main.Field [concrete = constants.%Field] +// CHECK:STDOUT: %b: ref %Field = bind_name b, %b.var +// CHECK:STDOUT: %b.ref: ref %Field = name_ref b, %b +// CHECK:STDOUT: %x.ref: %Field.elem = name_ref x, imports.%Main.import_ref.695 [concrete = imports.%.99e] +// CHECK:STDOUT: %.loc11_4: ref %empty_tuple.type = class_element_access %b.ref, element0 +// CHECK:STDOUT: %.loc11_10.1: %empty_tuple.type = tuple_literal () +// CHECK:STDOUT: %.loc11_10.2: init %empty_tuple.type = tuple_init () to %.loc11_4 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc11_7: init %empty_tuple.type = converted %.loc11_10.1, %.loc11_10.2 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: assign %.loc11_4, %.loc11_7 +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %c.patt: %pattern_type.1b8 = binding_pattern c [concrete] +// CHECK:STDOUT: %c.var_patt: %pattern_type.1b8 = var_pattern %c.patt [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: %c.var: ref %ForwardDeclared.7b34f2.1 = var %c.var_patt +// CHECK:STDOUT: %.loc13_29.1: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc13_29.2: init %ForwardDeclared.7b34f2.1 = class_init (), %c.var [concrete = constants.%ForwardDeclared.val] +// CHECK:STDOUT: %.loc13_3: init %ForwardDeclared.7b34f2.1 = converted %.loc13_29.1, %.loc13_29.2 [concrete = constants.%ForwardDeclared.val] +// CHECK:STDOUT: assign %c.var, %.loc13_3 +// CHECK:STDOUT: %ForwardDeclared.ref.loc13: type = name_ref ForwardDeclared, imports.%Main.ForwardDeclared [concrete = constants.%ForwardDeclared.7b34f2.1] +// CHECK:STDOUT: %c: ref %ForwardDeclared.7b34f2.1 = bind_name c, %c.var +// CHECK:STDOUT: %c.ref.loc14: ref %ForwardDeclared.7b34f2.1 = name_ref c, %c +// CHECK:STDOUT: %F.ref: %F.type = name_ref F, imports.%Main.import_ref.760 [concrete = constants.%F] +// CHECK:STDOUT: %F.bound: = bound_method %c.ref.loc14, %F.ref +// CHECK:STDOUT: %.loc14: %ForwardDeclared.7b34f2.1 = bind_value %c.ref.loc14 +// CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.bound(%.loc14) +// CHECK:STDOUT: %c.ref.loc15: ref %ForwardDeclared.7b34f2.1 = name_ref c, %c +// CHECK:STDOUT: %G.ref: %G.type = name_ref G, imports.%Main.import_ref.26e [concrete = constants.%G] +// CHECK:STDOUT: %G.bound: = bound_method %c.ref.loc15, %G.ref +// CHECK:STDOUT: %addr.loc15: %ptr.6cf = addr_of %c.ref.loc15 +// CHECK:STDOUT: %G.call: init %empty_tuple.type = call %G.bound(%addr.loc15) +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %d.patt: %pattern_type.ebb = binding_pattern d [concrete] +// CHECK:STDOUT: %d.var_patt: %pattern_type.ebb = var_pattern %d.patt [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: %d.var: ref %ptr.6cf = var %d.var_patt +// CHECK:STDOUT: %c.ref.loc17: ref %ForwardDeclared.7b34f2.1 = name_ref c, %c +// CHECK:STDOUT: %addr.loc17: %ptr.6cf = addr_of %c.ref.loc17 +// CHECK:STDOUT: assign %d.var, %addr.loc17 +// CHECK:STDOUT: %.loc17: type = splice_block %ptr.loc17 [concrete = constants.%ptr.6cf] { +// CHECK:STDOUT: %ForwardDeclared.ref.loc17: type = name_ref ForwardDeclared, imports.%Main.ForwardDeclared [concrete = constants.%ForwardDeclared.7b34f2.1] +// CHECK:STDOUT: %ptr.loc17: type = ptr_type %ForwardDeclared.ref.loc17 [concrete = constants.%ptr.6cf] +// CHECK:STDOUT: } +// CHECK:STDOUT: %d: ref %ptr.6cf = bind_name d, %d.var +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %e.patt: %pattern_type.275 = binding_pattern e [concrete] +// CHECK:STDOUT: %e.var_patt: %pattern_type.275 = var_pattern %e.patt [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: %e.var: ref %ptr.c62 = var %e.var_patt +// CHECK:STDOUT: %.loc19: type = splice_block %ptr.loc19 [concrete = constants.%ptr.c62] { +// CHECK:STDOUT: %Incomplete.ref: type = name_ref Incomplete, imports.%Main.Incomplete [concrete = constants.%Incomplete] +// CHECK:STDOUT: %ptr.loc19: type = ptr_type %Incomplete.ref [concrete = constants.%ptr.c62] +// CHECK:STDOUT: } +// CHECK:STDOUT: %e: ref %ptr.c62 = bind_name e, %e.var +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: --- forward_decl.impl.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %ForwardDecl: type = class_type @ForwardDecl [concrete] +// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] +// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: file { +// CHECK:STDOUT: %ForwardDecl.decl: type = class_decl @ForwardDecl [concrete = constants.%ForwardDecl] {} {} +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: class @ForwardDecl { +// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] +// CHECK:STDOUT: %complete_type: = 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.%ForwardDecl +// CHECK:STDOUT: } +// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/no_prelude/import_access.carbon b/toolchain/check/testdata/class/no_prelude/import_access.carbon index 5a15f5a0258b1..f3224aae52da0 100644 --- a/toolchain/check/testdata/class/no_prelude/import_access.carbon +++ b/toolchain/check/testdata/class/no_prelude/import_access.carbon @@ -2,6 +2,8 @@ // Exceptions. See /LICENSE for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// // AUTOUPDATE // TIP: To test this file alone, run: // TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/no_prelude/import_access.carbon @@ -135,442 +137,3 @@ library "[[@TEST_NAME]]"; private class Redecl; private class Redecl {} - -// CHECK:STDOUT: --- def.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Def: type = class_type @Def [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Def [private] = %Def.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Def.decl: type = class_decl @Def [concrete = constants.%Def] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Def { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Def -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- forward_with_def.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %ForwardWithDef: type = class_type @ForwardWithDef [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .ForwardWithDef [private] = %ForwardWithDef.decl.loc4 -// CHECK:STDOUT: } -// CHECK:STDOUT: %ForwardWithDef.decl.loc4: type = class_decl @ForwardWithDef [concrete = constants.%ForwardWithDef] {} {} -// CHECK:STDOUT: %ForwardWithDef.decl.loc6: type = class_decl @ForwardWithDef [concrete = constants.%ForwardWithDef] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @ForwardWithDef { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%ForwardWithDef -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- forward.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Forward: type = class_type @Forward [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Forward [private] = %Forward.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Forward.decl: type = class_decl @Forward [concrete = constants.%Forward] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Forward; -// CHECK:STDOUT: -// CHECK:STDOUT: --- def.impl.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Def: type = class_type @Def [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %pattern_type: type = pattern_type %Def [concrete] -// CHECK:STDOUT: %Def.val: %Def = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Test.Def: type = import_ref Test//def, Def, loaded [concrete = constants.%Def] -// CHECK:STDOUT: %Test.import_ref.8f2: = import_ref Test//def, loc4_20, loaded [concrete = constants.%complete_type] -// CHECK:STDOUT: %Test.import_ref.4ce = import_ref Test//def, inst16 [no loc], unloaded -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Def [private] = imports.%Test.Def -// CHECK:STDOUT: .c = %c -// CHECK:STDOUT: } -// CHECK:STDOUT: %Test.import = import Test -// CHECK:STDOUT: %default.import = import -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %c.patt: %pattern_type = binding_pattern c [concrete] -// CHECK:STDOUT: %c.var_patt: %pattern_type = var_pattern %c.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %c.var: ref %Def = var %c.var_patt [concrete] -// CHECK:STDOUT: %Def.ref: type = name_ref Def, imports.%Test.Def [concrete = constants.%Def] -// CHECK:STDOUT: %c: ref %Def = bind_name c, %c.var -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Def [from "def.carbon"] { -// CHECK:STDOUT: complete_type_witness = imports.%Test.import_ref.8f2 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Test.import_ref.4ce -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @__global_init() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %.loc4_15.1: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %.loc4_15.2: init %Def = class_init (), file.%c.var [concrete = constants.%Def.val] -// CHECK:STDOUT: %.loc4_1: init %Def = converted %.loc4_15.1, %.loc4_15.2 [concrete = constants.%Def.val] -// CHECK:STDOUT: assign file.%c.var, %.loc4_1 -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_local_def.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Def = -// CHECK:STDOUT: .c = %c -// CHECK:STDOUT: } -// CHECK:STDOUT: %default.import = import -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %c.patt: = binding_pattern c [concrete] -// CHECK:STDOUT: %c.var_patt: = var_pattern %c.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %c.var: ref = var %c.var_patt [concrete = ] -// CHECK:STDOUT: %Def.ref: = name_ref Def, [concrete = ] -// CHECK:STDOUT: %c: = bind_name c, -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @__global_init() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %.loc10: %empty_struct_type = struct_literal () -// CHECK:STDOUT: assign file.%c.var, -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_other_def.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Test: = namespace file.%Test.import, [concrete] { -// CHECK:STDOUT: .Def = -// CHECK:STDOUT: import Test//def -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Test = imports.%Test -// CHECK:STDOUT: .c = %c -// CHECK:STDOUT: } -// CHECK:STDOUT: %Test.import = import Test -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %c.patt: = binding_pattern c [concrete] -// CHECK:STDOUT: %c.var_patt: = var_pattern %c.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %c.var: ref = var %c.var_patt [concrete = ] -// CHECK:STDOUT: %.1: = splice_block [concrete = ] { -// CHECK:STDOUT: %Test.ref: = name_ref Test, imports.%Test [concrete = imports.%Test] -// CHECK:STDOUT: %Def.ref: = name_ref Def, [concrete = ] -// CHECK:STDOUT: } -// CHECK:STDOUT: %c: = bind_name c, -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @__global_init() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %.loc10: %empty_struct_type = struct_literal () -// CHECK:STDOUT: assign file.%c.var, -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- forward_with_def.impl.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %ForwardWithDef: type = class_type @ForwardWithDef [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %pattern_type: type = pattern_type %ForwardWithDef [concrete] -// CHECK:STDOUT: %ForwardWithDef.val: %ForwardWithDef = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Test.ForwardWithDef: type = import_ref Test//forward_with_def, ForwardWithDef, loaded [concrete = constants.%ForwardWithDef] -// CHECK:STDOUT: %Test.import_ref.8f2: = import_ref Test//forward_with_def, loc6_23, loaded [concrete = constants.%complete_type] -// CHECK:STDOUT: %Test.import_ref.414 = import_ref Test//forward_with_def, inst16 [no loc], unloaded -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .ForwardWithDef [private] = imports.%Test.ForwardWithDef -// CHECK:STDOUT: .c = %c -// CHECK:STDOUT: } -// CHECK:STDOUT: %Test.import = import Test -// CHECK:STDOUT: %default.import = import -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %c.patt: %pattern_type = binding_pattern c [concrete] -// CHECK:STDOUT: %c.var_patt: %pattern_type = var_pattern %c.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %c.var: ref %ForwardWithDef = var %c.var_patt [concrete] -// CHECK:STDOUT: %ForwardWithDef.ref: type = name_ref ForwardWithDef, imports.%Test.ForwardWithDef [concrete = constants.%ForwardWithDef] -// CHECK:STDOUT: %c: ref %ForwardWithDef = bind_name c, %c.var -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @ForwardWithDef [from "forward_with_def.carbon"] { -// CHECK:STDOUT: complete_type_witness = imports.%Test.import_ref.8f2 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Test.import_ref.414 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @__global_init() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %.loc4_26.1: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %.loc4_26.2: init %ForwardWithDef = class_init (), file.%c.var [concrete = constants.%ForwardWithDef.val] -// CHECK:STDOUT: %.loc4_1: init %ForwardWithDef = converted %.loc4_26.1, %.loc4_26.2 [concrete = constants.%ForwardWithDef.val] -// CHECK:STDOUT: assign file.%c.var, %.loc4_1 -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_local_forward_with_def.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .ForwardWithDef = -// CHECK:STDOUT: .c = %c -// CHECK:STDOUT: } -// CHECK:STDOUT: %default.import = import -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %c.patt: = binding_pattern c [concrete] -// CHECK:STDOUT: %c.var_patt: = var_pattern %c.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %c.var: ref = var %c.var_patt [concrete = ] -// CHECK:STDOUT: %ForwardWithDef.ref: = name_ref ForwardWithDef, [concrete = ] -// CHECK:STDOUT: %c: = bind_name c, -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @__global_init() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %.loc10: %empty_struct_type = struct_literal () -// CHECK:STDOUT: assign file.%c.var, -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_other_forward_with_def.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Test: = namespace file.%Test.import, [concrete] { -// CHECK:STDOUT: .ForwardWithDef = -// CHECK:STDOUT: import Test//forward_with_def -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Test = imports.%Test -// CHECK:STDOUT: .c = %c -// CHECK:STDOUT: } -// CHECK:STDOUT: %Test.import = import Test -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %c.patt: = binding_pattern c [concrete] -// CHECK:STDOUT: %c.var_patt: = var_pattern %c.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %c.var: ref = var %c.var_patt [concrete = ] -// CHECK:STDOUT: %.1: = splice_block [concrete = ] { -// CHECK:STDOUT: %Test.ref: = name_ref Test, imports.%Test [concrete = imports.%Test] -// CHECK:STDOUT: %ForwardWithDef.ref: = name_ref ForwardWithDef, [concrete = ] -// CHECK:STDOUT: } -// CHECK:STDOUT: %c: = bind_name c, -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @__global_init() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %.loc10: %empty_struct_type = struct_literal () -// CHECK:STDOUT: assign file.%c.var, -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- forward.impl.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Forward: type = class_type @Forward [concrete] -// CHECK:STDOUT: %ptr: type = ptr_type %Forward [concrete] -// CHECK:STDOUT: %pattern_type: type = pattern_type %ptr [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Test.Forward: type = import_ref Test//forward, Forward, loaded [concrete = constants.%Forward] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Forward [private] = %Forward.decl -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Test.import = import Test -// CHECK:STDOUT: %default.import = import -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %c.patt: %pattern_type = binding_pattern c [concrete] -// CHECK:STDOUT: %c.param_patt: %pattern_type = value_param_pattern %c.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %c.param: %ptr = value_param call_param0 -// CHECK:STDOUT: %.loc4: type = splice_block %ptr [concrete = constants.%ptr] { -// CHECK:STDOUT: %Forward.ref: type = name_ref Forward, imports.%Test.Forward [concrete = constants.%Forward] -// CHECK:STDOUT: %ptr: type = ptr_type %Forward.ref [concrete = constants.%ptr] -// CHECK:STDOUT: } -// CHECK:STDOUT: %c: %ptr = bind_name c, %c.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %Forward.decl: type = class_decl @Forward [concrete = constants.%Forward] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Forward { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Forward -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F(%c.param: %ptr) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_local_forward.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 [concrete] { -// CHECK:STDOUT: .Forward = -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %default.import = import -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %c.patt: = binding_pattern c [concrete] -// CHECK:STDOUT: %c.param_patt: = value_param_pattern %c.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %c.param: = value_param call_param0 -// CHECK:STDOUT: %.loc10: type = splice_block %ptr [concrete = ] { -// CHECK:STDOUT: %Forward.ref: = name_ref Forward, [concrete = ] -// CHECK:STDOUT: %ptr: type = ptr_type [concrete = ] -// CHECK:STDOUT: } -// CHECK:STDOUT: %c: = bind_name c, %c.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F(%c.param: ) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_other_forward.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: imports { -// CHECK:STDOUT: %Test: = namespace file.%Test.import, [concrete] { -// CHECK:STDOUT: .Forward = -// CHECK:STDOUT: import Test//forward -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Test = imports.%Test -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Test.import = import Test -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %c.patt: = binding_pattern c [concrete] -// CHECK:STDOUT: %c.param_patt: = value_param_pattern %c.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %c.param: = value_param call_param0 -// CHECK:STDOUT: %.loc10: type = splice_block %ptr [concrete = ] { -// CHECK:STDOUT: %Test.ref: = name_ref Test, imports.%Test [concrete = imports.%Test] -// CHECK:STDOUT: %Forward.ref: = name_ref Forward, [concrete = ] -// CHECK:STDOUT: %ptr: type = ptr_type [concrete = ] -// CHECK:STDOUT: } -// CHECK:STDOUT: %c: = bind_name c, %c.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F(%c.param: ) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- todo_fail_private_on_redecl.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Redecl: type = class_type @Redecl [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Redecl [private] = %Redecl.decl.loc4 -// CHECK:STDOUT: } -// CHECK:STDOUT: %Redecl.decl.loc4: type = class_decl @Redecl [concrete = constants.%Redecl] {} {} -// CHECK:STDOUT: %Redecl.decl.loc6: type = class_decl @Redecl [concrete = constants.%Redecl] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Redecl { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Redecl -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/no_prelude/import_base.carbon b/toolchain/check/testdata/class/no_prelude/import_base.carbon new file mode 100644 index 0000000000000..69752587ace77 --- /dev/null +++ b/toolchain/check/testdata/class/no_prelude/import_base.carbon @@ -0,0 +1,39 @@ +// Part of the Carbon Language project, under the Apache License v2.0 with LLVM +// Exceptions. See /LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// +// AUTOUPDATE +// TIP: To test this file alone, run: +// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/no_prelude/import_base.carbon +// TIP: To dump output, run: +// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/no_prelude/import_base.carbon + +// --- a.carbon + +library "[[@TEST_NAME]]"; + +base class Base { + fn F[self: Self](); + fn Unused[self: Self](); + + var x: (); + var unused: (); +} + +class Child { + extend base: Base; +} + +// --- b.carbon + +library "[[@TEST_NAME]]"; + +import library "a"; + +fn Run() { + var a: Child = {.base = {.x = (), .unused = ()}}; + a.x = (); + a.F(); +} diff --git a/toolchain/check/testdata/class/no_prelude/import_indirect.carbon b/toolchain/check/testdata/class/no_prelude/import_indirect.carbon new file mode 100644 index 0000000000000..59144bfde7333 --- /dev/null +++ b/toolchain/check/testdata/class/no_prelude/import_indirect.carbon @@ -0,0 +1,103 @@ +// Part of the Carbon Language project, under the Apache License v2.0 with LLVM +// Exceptions. See /LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// +// AUTOUPDATE +// TIP: To test this file alone, run: +// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/no_prelude/import_indirect.carbon +// TIP: To dump output, run: +// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/no_prelude/import_indirect.carbon + +// Triangle: +// +// a <-- Define +// |\ +// | b <-- Re-export +// |/ +// X <-- Use both +// +// Diamond: +// +// a <-- Define +// / \ +// b c <-- Re-export +// \ / +// X <-- Use both + +// ============================================================================ +// Setup files +// ============================================================================ + +// --- a.carbon + +library "[[@TEST_NAME]]"; + +class C {} + +// --- b.carbon + +library "[[@TEST_NAME]]"; + +import library "a"; + +alias D = C; + +var b_val: C = {}; +var b_ptr: D* = &b_val; + +// --- c.carbon + +library "[[@TEST_NAME]]"; + +import library "a"; + +alias E = C; + +var c_val: C = {}; +var c_ptr: E* = &c_val; + +// ============================================================================ +// Test files +// ============================================================================ + +// --- triangle.carbon + +library "[[@TEST_NAME]]"; + +import library "a"; +import library "b"; + +var val: C = {}; +var ptr: D* = &val; + +// --- triangle_reverse.carbon + +library "[[@TEST_NAME]]"; + +import library "b"; +import library "a"; + +var val: C = {}; +var ptr: D* = &val; + +// --- diamond.carbon + +library "[[@TEST_NAME]]"; + +import library "b"; +import library "c"; + +var val: D = {}; +var ptr: E* = &val; + +// --- diamond_reverse.carbon + +library "[[@TEST_NAME]]"; + +import library "c"; +import library "b"; + +var val: D = {}; +var ptr: E* = &val; diff --git a/toolchain/check/testdata/class/no_prelude/import_member_cycle.carbon b/toolchain/check/testdata/class/no_prelude/import_member_cycle.carbon new file mode 100644 index 0000000000000..cb01b972e6a71 --- /dev/null +++ b/toolchain/check/testdata/class/no_prelude/import_member_cycle.carbon @@ -0,0 +1,29 @@ +// Part of the Carbon Language project, under the Apache License v2.0 with LLVM +// Exceptions. See /LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// +// AUTOUPDATE +// TIP: To test this file alone, run: +// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/no_prelude/import_member_cycle.carbon +// TIP: To dump output, run: +// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/no_prelude/import_member_cycle.carbon + +// --- a.carbon + +library "[[@TEST_NAME]]"; + +class Cycle { + var a: Cycle*; +} + +// --- b.carbon + +library "[[@TEST_NAME]]"; + +import library "a"; + +fn Run() { + var a: Cycle*; +} diff --git a/toolchain/check/testdata/class/no_prelude/import_struct_cyle.carbon b/toolchain/check/testdata/class/no_prelude/import_struct_cyle.carbon new file mode 100644 index 0000000000000..7935534236418 --- /dev/null +++ b/toolchain/check/testdata/class/no_prelude/import_struct_cyle.carbon @@ -0,0 +1,34 @@ +// Part of the Carbon Language project, under the Apache License v2.0 with LLVM +// Exceptions. See /LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// +// AUTOUPDATE +// TIP: To test this file alone, run: +// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/no_prelude/import_struct_cyle.carbon +// TIP: To dump output, run: +// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/no_prelude/import_struct_cyle.carbon + +// --- a.carbon + +library "[[@TEST_NAME]]"; + +class Cycle; + +var a: {.b: Cycle*}; + +class Cycle { + // The type here is equivalent to the `a` above, but on import can be resolved first. + var c: {.b: Cycle*}; +} + +// --- b.carbon + +library "[[@TEST_NAME]]"; + +import library "a"; + +fn Run() { + a.b = (*a.b).c.b; +} diff --git a/toolchain/check/testdata/class/no_prelude/incomplete.carbon b/toolchain/check/testdata/class/no_prelude/incomplete.carbon new file mode 100644 index 0000000000000..0daf2c9706d46 --- /dev/null +++ b/toolchain/check/testdata/class/no_prelude/incomplete.carbon @@ -0,0 +1,225 @@ +// Part of the Carbon Language project, under the Apache License v2.0 with LLVM +// Exceptions. See /LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// +// AUTOUPDATE +// TIP: To test this file alone, run: +// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/no_prelude/incomplete.carbon +// TIP: To dump output, run: +// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/no_prelude/incomplete.carbon + +// --- forward_decl.carbon + +//@dump-sem-ir-begin +class Class; + +fn F(p: Class*) -> Class* { return p; } +//@dump-sem-ir-end + +// --- fail_forward_decl.carbon + +library "[[@TEST_NAME]]"; + +class Class; + +// CHECK:STDERR: fail_forward_decl.carbon:[[@LINE+7]]:4: error: cannot declare a member of incomplete class `Class` [QualifiedDeclInIncompleteClassScope] +// CHECK:STDERR: fn Class.Function() {} +// CHECK:STDERR: ^~~~~ +// CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-5]]:1: note: class was forward declared here [ClassForwardDeclaredHere] +// CHECK:STDERR: class Class; +// CHECK:STDERR: ^~~~~~~~~~~~ +// CHECK:STDERR: +fn Class.Function() {} + +fn CallClassFunction() { + // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE+7]]:3: error: member access into incomplete class `Class` [QualifiedExprInIncompleteClassScope] + // CHECK:STDERR: Class.Function(); + // CHECK:STDERR: ^~~~~~~~~~~~~~ + // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-15]]:1: note: class was forward declared here [ClassForwardDeclaredHere] + // CHECK:STDERR: class Class; + // CHECK:STDERR: ^~~~~~~~~~~~ + // CHECK:STDERR: + Class.Function(); +} + +// CHECK:STDERR: fail_forward_decl.carbon:[[@LINE+7]]:17: error: binding pattern has incomplete type `Class` in name binding declaration [IncompleteTypeInBindingDecl] +// CHECK:STDERR: var global_var: Class; +// CHECK:STDERR: ^~~~~ +// CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-25]]:1: note: class was forward declared here [ClassForwardDeclaredHere] +// CHECK:STDERR: class Class; +// CHECK:STDERR: ^~~~~~~~~~~~ +// CHECK:STDERR: +var global_var: Class; + +// CHECK:STDERR: fail_forward_decl.carbon:[[@LINE+7]]:24: error: function returns incomplete type `Class` [IncompleteTypeInFunctionReturnType] +// CHECK:STDERR: fn ConvertFromStruct() -> Class { return {}; } +// CHECK:STDERR: ^~~~~~~~ +// CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-34]]:1: note: class was forward declared here [ClassForwardDeclaredHere] +// CHECK:STDERR: class Class; +// CHECK:STDERR: ^~~~~~~~~~~~ +// CHECK:STDERR: +fn ConvertFromStruct() -> Class { return {}; } + +fn G(p: Class*) -> () { + // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE+7]]:10: error: member access into object of incomplete type `Class` [IncompleteTypeInMemberAccess] + // CHECK:STDERR: return p->n; + // CHECK:STDERR: ^~~~ + // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-44]]:1: note: class was forward declared here [ClassForwardDeclaredHere] + // CHECK:STDERR: class Class; + // CHECK:STDERR: ^~~~~~~~~~~~ + // CHECK:STDERR: + return p->n; +} + +fn MemberAccess(p: Class*) -> () { + // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE+7]]:11: error: member access into object of incomplete type `Class` [IncompleteTypeInMemberAccess] + // CHECK:STDERR: return (*p).n; + // CHECK:STDERR: ^~ + // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-55]]:1: note: class was forward declared here [ClassForwardDeclaredHere] + // CHECK:STDERR: class Class; + // CHECK:STDERR: ^~~~~~~~~~~~ + // CHECK:STDERR: + return (*p).n; +} + +// CHECK:STDERR: fail_forward_decl.carbon:[[@LINE+7]]:20: error: function returns incomplete type `Class` [IncompleteTypeInFunctionReturnType] +// CHECK:STDERR: fn Copy(p: Class*) -> Class { +// CHECK:STDERR: ^~~~~~~~ +// CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-65]]:1: note: class was forward declared here [ClassForwardDeclaredHere] +// CHECK:STDERR: class Class; +// CHECK:STDERR: ^~~~~~~~~~~~ +// CHECK:STDERR: +fn Copy(p: Class*) -> Class { + return *p; +} + +fn Let(p: Class*) { + // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE+7]]:10: error: binding pattern has incomplete type `Class` in name binding declaration [IncompleteTypeInBindingDecl] + // CHECK:STDERR: let c: Class = *p; + // CHECK:STDERR: ^~~~~ + // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-77]]:1: note: class was forward declared here [ClassForwardDeclaredHere] + // CHECK:STDERR: class Class; + // CHECK:STDERR: ^~~~~~~~~~~~ + // CHECK:STDERR: + let c: Class = *p; +} + +fn TakeIncomplete(c: Class); + +fn ReturnIncomplete() -> Class; + +fn CallTakeIncomplete(p: Class*) { + // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE+10]]:18: error: forming value of incomplete type `Class` [IncompleteTypeInValueConversion] + // CHECK:STDERR: TakeIncomplete(*p); + // CHECK:STDERR: ^~ + // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-92]]:1: note: class was forward declared here [ClassForwardDeclaredHere] + // CHECK:STDERR: class Class; + // CHECK:STDERR: ^~~~~~~~~~~~ + // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-11]]:19: note: initializing function parameter [InCallToFunctionParam] + // CHECK:STDERR: fn TakeIncomplete(c: Class); + // CHECK:STDERR: ^~~~~~~~ + // CHECK:STDERR: + TakeIncomplete(*p); + + // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE+10]]:18: error: forming value of incomplete type `Class` [IncompleteTypeInValueConversion] + // CHECK:STDERR: TakeIncomplete({}); + // CHECK:STDERR: ^~ + // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-104]]:1: note: class was forward declared here [ClassForwardDeclaredHere] + // CHECK:STDERR: class Class; + // CHECK:STDERR: ^~~~~~~~~~~~ + // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-23]]:19: note: initializing function parameter [InCallToFunctionParam] + // CHECK:STDERR: fn TakeIncomplete(c: Class); + // CHECK:STDERR: ^~~~~~~~ + // CHECK:STDERR: + TakeIncomplete({}); +} + +fn CallReturnIncomplete() { + // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE+10]]:3: error: function returns incomplete type `Class` [IncompleteTypeInFunctionReturnType] + // CHECK:STDERR: ReturnIncomplete(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-118]]:1: note: class was forward declared here [ClassForwardDeclaredHere] + // CHECK:STDERR: class Class; + // CHECK:STDERR: ^~~~~~~~~~~~ + // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-35]]:23: note: return type declared here [IncompleteReturnTypeHere] + // CHECK:STDERR: fn ReturnIncomplete() -> Class; + // CHECK:STDERR: ^~~~~~~~ + // CHECK:STDERR: + ReturnIncomplete(); +} + +class IncompleteAddrSelf { + fn F[addr self: Class*](); +} + +fn CallIncompleteAddrSelf(p: Class*) { + // TODO: Should this be valid? + // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE+10]]:3: error: invalid use of incomplete type `Class` [IncompleteTypeInConversion] + // CHECK:STDERR: p->(IncompleteAddrSelf.F)(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-137]]:1: note: class was forward declared here [ClassForwardDeclaredHere] + // CHECK:STDERR: class Class; + // CHECK:STDERR: ^~~~~~~~~~~~ + // CHECK:STDERR: fail_forward_decl.carbon:[[@LINE-11]]:8: note: initializing function parameter [InCallToFunctionParam] + // CHECK:STDERR: fn F[addr self: Class*](); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + p->(IncompleteAddrSelf.F)(); +} + +// --- fail_in_definition.carbon + +library "[[@TEST_NAME]]"; + +class C { + // CHECK:STDERR: fail_in_definition.carbon:[[@LINE+7]]:10: error: field has incomplete type `C` [IncompleteTypeInFieldDecl] + // CHECK:STDERR: var c: C; + // CHECK:STDERR: ^ + // CHECK:STDERR: fail_in_definition.carbon:[[@LINE-4]]:1: note: class is incomplete within its definition [ClassIncompleteWithinDefinition] + // CHECK:STDERR: class C { + // CHECK:STDERR: ^~~~~~~~~ + // CHECK:STDERR: + var c: C; +} + +// CHECK:STDOUT: --- forward_decl.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %Class: type = class_type @Class [concrete] +// CHECK:STDOUT: %ptr: type = ptr_type %Class [concrete] +// CHECK:STDOUT: %pattern_type: type = pattern_type %ptr [concrete] +// 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: %Class.decl: type = class_decl @Class [concrete = constants.%Class] {} {} +// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { +// CHECK:STDOUT: %p.patt: %pattern_type = binding_pattern p [concrete] +// CHECK:STDOUT: %p.param_patt: %pattern_type = value_param_pattern %p.patt, call_param0 [concrete] +// CHECK:STDOUT: %return.patt: %pattern_type = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: %pattern_type = out_param_pattern %return.patt, call_param1 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %Class.ref.loc5_20: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] +// CHECK:STDOUT: %ptr.loc5_25: type = ptr_type %Class.ref.loc5_20 [concrete = constants.%ptr] +// CHECK:STDOUT: %p.param: %ptr = value_param call_param0 +// CHECK:STDOUT: %.loc5: type = splice_block %ptr.loc5_14 [concrete = constants.%ptr] { +// CHECK:STDOUT: %Class.ref.loc5_9: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] +// CHECK:STDOUT: %ptr.loc5_14: type = ptr_type %Class.ref.loc5_9 [concrete = constants.%ptr] +// CHECK:STDOUT: } +// CHECK:STDOUT: %p: %ptr = bind_name p, %p.param +// CHECK:STDOUT: %return.param: ref %ptr = out_param call_param1 +// CHECK:STDOUT: %return: ref %ptr = return_slot %return.param +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: class @Class; +// CHECK:STDOUT: +// CHECK:STDOUT: fn @F(%p.param: %ptr) -> %ptr { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %p.ref: %ptr = name_ref p, %p +// CHECK:STDOUT: return %p.ref +// CHECK:STDOUT: } +// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/no_prelude/indirect_import_member.carbon b/toolchain/check/testdata/class/no_prelude/indirect_import_member.carbon index 7727999e5de04..d41c452ec9745 100644 --- a/toolchain/check/testdata/class/no_prelude/indirect_import_member.carbon +++ b/toolchain/check/testdata/class/no_prelude/indirect_import_member.carbon @@ -2,6 +2,8 @@ // Exceptions. See /LICENSE for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// // AUTOUPDATE // TIP: To test this file alone, run: // TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/no_prelude/indirect_import_member.carbon @@ -99,459 +101,3 @@ library "[[@TEST_NAME]]"; import library "f"; var x: () = D.C.F(); - -// CHECK:STDOUT: --- a.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C { -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] {} {} -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- b.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Main.C = import_ref Main//a, C, unloaded -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .C = imports.%Main.C -// CHECK:STDOUT: } -// CHECK:STDOUT: %default.import = import -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- c.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Main.C: type = import_ref Main//a, C, loaded [concrete = constants.%C] -// CHECK:STDOUT: %Main.import_ref.8f2: = import_ref Main//a, loc6_1, loaded [concrete = constants.%complete_type] -// CHECK:STDOUT: %Main.import_ref.2c4 = import_ref Main//a, inst16 [no loc], unloaded -// CHECK:STDOUT: %Main.import_ref.2cf = import_ref Main//a, loc5_10, unloaded -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .C = %C -// CHECK:STDOUT: } -// CHECK:STDOUT: %default.import = import -// CHECK:STDOUT: %C: type = export C, imports.%Main.C [concrete = constants.%C] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C [from "a.carbon"] { -// CHECK:STDOUT: complete_type_witness = imports.%Main.import_ref.8f2 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Main.import_ref.2c4 -// CHECK:STDOUT: .F = imports.%Main.import_ref.2cf -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- d.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Main.C = import_ref Main//c, C, unloaded -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .C = imports.%Main.C -// CHECK:STDOUT: } -// CHECK:STDOUT: %default.import = import -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- e.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %D: type = class_type @D [concrete] -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Main.C: type = import_ref Main//c, C, loaded [concrete = constants.%C] -// CHECK:STDOUT: %Main.import_ref.8db: = import_ref Main//c, inst21 [indirect], loaded [concrete = constants.%complete_type] -// CHECK:STDOUT: %Main.import_ref.6a9 = import_ref Main//c, inst22 [indirect], unloaded -// CHECK:STDOUT: %Main.import_ref.230 = import_ref Main//c, inst23 [indirect], unloaded -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .C = imports.%Main.C -// CHECK:STDOUT: .D = %D.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %default.import = import -// CHECK:STDOUT: %D.decl: type = class_decl @D [concrete = constants.%D] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @D { -// CHECK:STDOUT: %package.ref: = name_ref package, package [concrete = package] -// CHECK:STDOUT: %C.ref: type = name_ref C, imports.%Main.C [concrete = constants.%C] -// CHECK:STDOUT: %C: type = bind_alias C, imports.%Main.C [concrete = constants.%C] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%D -// CHECK:STDOUT: .C = %C -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C [from "c.carbon"] { -// CHECK:STDOUT: complete_type_witness = imports.%Main.import_ref.8db -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Main.import_ref.6a9 -// CHECK:STDOUT: .F = imports.%Main.import_ref.230 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- f.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Main.D = import_ref Main//e, D, unloaded -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .D = imports.%Main.D -// CHECK:STDOUT: } -// CHECK:STDOUT: %default.import = import -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- use_b.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] -// CHECK:STDOUT: %pattern_type: type = pattern_type %empty_tuple.type [concrete] -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Main.C: type = import_ref Main//a, C, loaded [concrete = constants.%C] -// CHECK:STDOUT: %Main.import_ref.8f2: = import_ref Main//a, loc6_1, loaded [concrete = constants.%complete_type] -// CHECK:STDOUT: %Main.import_ref.2c4 = import_ref Main//a, inst16 [no loc], unloaded -// CHECK:STDOUT: %Main.import_ref.943: %F.type = import_ref Main//a, loc5_10, loaded [concrete = constants.%F] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .C = imports.%Main.C -// CHECK:STDOUT: .x = %x -// CHECK:STDOUT: } -// CHECK:STDOUT: %default.import = import -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %x.patt: %pattern_type = binding_pattern x [concrete] -// CHECK:STDOUT: %x.var_patt: %pattern_type = var_pattern %x.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %x.var: ref %empty_tuple.type = var %x.var_patt [concrete] -// CHECK:STDOUT: %.loc6_9.1: type = splice_block %.loc6_9.3 [concrete = constants.%empty_tuple.type] { -// CHECK:STDOUT: %.loc6_9.2: %empty_tuple.type = tuple_literal () -// CHECK:STDOUT: %.loc6_9.3: type = converted %.loc6_9.2, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] -// CHECK:STDOUT: } -// CHECK:STDOUT: %x: ref %empty_tuple.type = bind_name x, %x.var -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C [from "a.carbon"] { -// CHECK:STDOUT: complete_type_witness = imports.%Main.import_ref.8f2 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Main.import_ref.2c4 -// CHECK:STDOUT: .F = imports.%Main.import_ref.943 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F [from "a.carbon"]; -// CHECK:STDOUT: -// CHECK:STDOUT: fn @__global_init() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %C.ref: type = name_ref C, imports.%Main.C [concrete = constants.%C] -// CHECK:STDOUT: %F.ref: %F.type = name_ref F, imports.%Main.import_ref.943 [concrete = constants.%F] -// CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.ref() -// CHECK:STDOUT: assign file.%x.var, %F.call -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- use_c.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] -// CHECK:STDOUT: %pattern_type: type = pattern_type %empty_tuple.type [concrete] -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Main.C: type = import_ref Main//c, C, loaded [concrete = constants.%C] -// CHECK:STDOUT: %Main.import_ref.8db: = import_ref Main//c, inst21 [indirect], loaded [concrete = constants.%complete_type] -// CHECK:STDOUT: %Main.import_ref.6a9 = import_ref Main//c, inst22 [indirect], unloaded -// CHECK:STDOUT: %Main.import_ref.5d3: %F.type = import_ref Main//c, inst23 [indirect], loaded [concrete = constants.%F] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .C = imports.%Main.C -// CHECK:STDOUT: .x = %x -// CHECK:STDOUT: } -// CHECK:STDOUT: %default.import = import -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %x.patt: %pattern_type = binding_pattern x [concrete] -// CHECK:STDOUT: %x.var_patt: %pattern_type = var_pattern %x.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %x.var: ref %empty_tuple.type = var %x.var_patt [concrete] -// CHECK:STDOUT: %.loc6_9.1: type = splice_block %.loc6_9.3 [concrete = constants.%empty_tuple.type] { -// CHECK:STDOUT: %.loc6_9.2: %empty_tuple.type = tuple_literal () -// CHECK:STDOUT: %.loc6_9.3: type = converted %.loc6_9.2, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] -// CHECK:STDOUT: } -// CHECK:STDOUT: %x: ref %empty_tuple.type = bind_name x, %x.var -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C [from "c.carbon"] { -// CHECK:STDOUT: complete_type_witness = imports.%Main.import_ref.8db -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Main.import_ref.6a9 -// CHECK:STDOUT: .F = imports.%Main.import_ref.5d3 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F [from "a.carbon"]; -// CHECK:STDOUT: -// CHECK:STDOUT: fn @__global_init() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %C.ref: type = name_ref C, imports.%Main.C [concrete = constants.%C] -// CHECK:STDOUT: %F.ref: %F.type = name_ref F, imports.%Main.import_ref.5d3 [concrete = constants.%F] -// CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.ref() -// CHECK:STDOUT: assign file.%x.var, %F.call -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- use_d.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] -// CHECK:STDOUT: %pattern_type: type = pattern_type %empty_tuple.type [concrete] -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Main.C: type = import_ref Main//c, C, loaded [concrete = constants.%C] -// CHECK:STDOUT: %Main.import_ref.8db: = import_ref Main//c, inst21 [indirect], loaded [concrete = constants.%complete_type] -// CHECK:STDOUT: %Main.import_ref.6a9 = import_ref Main//c, inst22 [indirect], unloaded -// CHECK:STDOUT: %Main.import_ref.5d3: %F.type = import_ref Main//c, inst23 [indirect], loaded [concrete = constants.%F] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .C = imports.%Main.C -// CHECK:STDOUT: .x = %x -// CHECK:STDOUT: } -// CHECK:STDOUT: %default.import = import -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %x.patt: %pattern_type = binding_pattern x [concrete] -// CHECK:STDOUT: %x.var_patt: %pattern_type = var_pattern %x.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %x.var: ref %empty_tuple.type = var %x.var_patt [concrete] -// CHECK:STDOUT: %.loc6_9.1: type = splice_block %.loc6_9.3 [concrete = constants.%empty_tuple.type] { -// CHECK:STDOUT: %.loc6_9.2: %empty_tuple.type = tuple_literal () -// CHECK:STDOUT: %.loc6_9.3: type = converted %.loc6_9.2, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] -// CHECK:STDOUT: } -// CHECK:STDOUT: %x: ref %empty_tuple.type = bind_name x, %x.var -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C [from "c.carbon"] { -// CHECK:STDOUT: complete_type_witness = imports.%Main.import_ref.8db -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Main.import_ref.6a9 -// CHECK:STDOUT: .F = imports.%Main.import_ref.5d3 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F [from "a.carbon"]; -// CHECK:STDOUT: -// CHECK:STDOUT: fn @__global_init() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %C.ref: type = name_ref C, imports.%Main.C [concrete = constants.%C] -// CHECK:STDOUT: %F.ref: %F.type = name_ref F, imports.%Main.import_ref.5d3 [concrete = constants.%F] -// CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.ref() -// CHECK:STDOUT: assign file.%x.var, %F.call -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- use_e.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] -// CHECK:STDOUT: %pattern_type: type = pattern_type %empty_tuple.type [concrete] -// CHECK:STDOUT: %D: type = class_type @D [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Main.D: type = import_ref Main//e, D, loaded [concrete = constants.%D] -// CHECK:STDOUT: %Main.import_ref.8f2: = import_ref Main//e, loc8_1, loaded [concrete = constants.%complete_type] -// CHECK:STDOUT: %Main.import_ref.cab = import_ref Main//e, inst18 [no loc], unloaded -// CHECK:STDOUT: %Main.import_ref.bf1: type = import_ref Main//e, loc7_9, loaded [concrete = constants.%C] -// CHECK:STDOUT: %Main.import_ref.8f3: = import_ref Main//e, inst24 [indirect], loaded [concrete = constants.%complete_type] -// CHECK:STDOUT: %Main.import_ref.db8 = import_ref Main//e, inst25 [indirect], unloaded -// CHECK:STDOUT: %Main.import_ref.c85: %F.type = import_ref Main//e, inst26 [indirect], loaded [concrete = constants.%F] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .D = imports.%Main.D -// CHECK:STDOUT: .x = %x -// CHECK:STDOUT: } -// CHECK:STDOUT: %default.import = import -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %x.patt: %pattern_type = binding_pattern x [concrete] -// CHECK:STDOUT: %x.var_patt: %pattern_type = var_pattern %x.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %x.var: ref %empty_tuple.type = var %x.var_patt [concrete] -// CHECK:STDOUT: %.loc6_9.1: type = splice_block %.loc6_9.3 [concrete = constants.%empty_tuple.type] { -// CHECK:STDOUT: %.loc6_9.2: %empty_tuple.type = tuple_literal () -// CHECK:STDOUT: %.loc6_9.3: type = converted %.loc6_9.2, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] -// CHECK:STDOUT: } -// CHECK:STDOUT: %x: ref %empty_tuple.type = bind_name x, %x.var -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @D [from "e.carbon"] { -// CHECK:STDOUT: complete_type_witness = imports.%Main.import_ref.8f2 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Main.import_ref.cab -// CHECK:STDOUT: .C = imports.%Main.import_ref.bf1 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C [from "e.carbon"] { -// CHECK:STDOUT: complete_type_witness = imports.%Main.import_ref.8f3 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Main.import_ref.db8 -// CHECK:STDOUT: .F = imports.%Main.import_ref.c85 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F [from "a.carbon"]; -// CHECK:STDOUT: -// CHECK:STDOUT: fn @__global_init() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %D.ref: type = name_ref D, imports.%Main.D [concrete = constants.%D] -// CHECK:STDOUT: %C.ref: type = name_ref C, imports.%Main.import_ref.bf1 [concrete = constants.%C] -// CHECK:STDOUT: %F.ref: %F.type = name_ref F, imports.%Main.import_ref.c85 [concrete = constants.%F] -// CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.ref() -// CHECK:STDOUT: assign file.%x.var, %F.call -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- use_f.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] -// CHECK:STDOUT: %pattern_type: type = pattern_type %empty_tuple.type [concrete] -// CHECK:STDOUT: %D: type = class_type @D [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Main.D: type = import_ref Main//e, D, loaded [concrete = constants.%D] -// CHECK:STDOUT: %Main.import_ref.8f2: = import_ref Main//e, loc8_1, loaded [concrete = constants.%complete_type] -// CHECK:STDOUT: %Main.import_ref.cab = import_ref Main//e, inst18 [no loc], unloaded -// CHECK:STDOUT: %Main.import_ref.bf1: type = import_ref Main//e, loc7_9, loaded [concrete = constants.%C] -// CHECK:STDOUT: %Main.import_ref.8f3: = import_ref Main//e, inst24 [indirect], loaded [concrete = constants.%complete_type] -// CHECK:STDOUT: %Main.import_ref.db8 = import_ref Main//e, inst25 [indirect], unloaded -// CHECK:STDOUT: %Main.import_ref.c85: %F.type = import_ref Main//e, inst26 [indirect], loaded [concrete = constants.%F] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .D = imports.%Main.D -// CHECK:STDOUT: .x = %x -// CHECK:STDOUT: } -// CHECK:STDOUT: %default.import = import -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %x.patt: %pattern_type = binding_pattern x [concrete] -// CHECK:STDOUT: %x.var_patt: %pattern_type = var_pattern %x.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %x.var: ref %empty_tuple.type = var %x.var_patt [concrete] -// CHECK:STDOUT: %.loc6_9.1: type = splice_block %.loc6_9.3 [concrete = constants.%empty_tuple.type] { -// CHECK:STDOUT: %.loc6_9.2: %empty_tuple.type = tuple_literal () -// CHECK:STDOUT: %.loc6_9.3: type = converted %.loc6_9.2, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] -// CHECK:STDOUT: } -// CHECK:STDOUT: %x: ref %empty_tuple.type = bind_name x, %x.var -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @D [from "e.carbon"] { -// CHECK:STDOUT: complete_type_witness = imports.%Main.import_ref.8f2 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Main.import_ref.cab -// CHECK:STDOUT: .C = imports.%Main.import_ref.bf1 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C [from "e.carbon"] { -// CHECK:STDOUT: complete_type_witness = imports.%Main.import_ref.8f3 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Main.import_ref.db8 -// CHECK:STDOUT: .F = imports.%Main.import_ref.c85 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F [from "a.carbon"]; -// CHECK:STDOUT: -// CHECK:STDOUT: fn @__global_init() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %D.ref: type = name_ref D, imports.%Main.D [concrete = constants.%D] -// CHECK:STDOUT: %C.ref: type = name_ref C, imports.%Main.import_ref.bf1 [concrete = constants.%C] -// CHECK:STDOUT: %F.ref: %F.type = name_ref F, imports.%Main.import_ref.c85 [concrete = constants.%F] -// CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.ref() -// CHECK:STDOUT: assign file.%x.var, %F.call -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/no_prelude/local.carbon b/toolchain/check/testdata/class/no_prelude/local.carbon new file mode 100644 index 0000000000000..611096ef9327d --- /dev/null +++ b/toolchain/check/testdata/class/no_prelude/local.carbon @@ -0,0 +1,129 @@ +// Part of the Carbon Language project, under the Apache License v2.0 with LLVM +// Exceptions. See /LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// +// AUTOUPDATE +// TIP: To test this file alone, run: +// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/no_prelude/local.carbon +// TIP: To dump output, run: +// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/no_prelude/local.carbon + +//@dump-sem-ir-begin +class A { + fn F() -> () { + class B { + fn Make() -> Self { + returned var b: Self = {.n = ()}; + return var; + } + + var n: (); + } + + return B.Make().n; + } +} +//@dump-sem-ir-end + +// CHECK:STDOUT: --- local.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %A: type = class_type @A [concrete] +// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] +// CHECK:STDOUT: %pattern_type.cb1: type = pattern_type %empty_tuple.type [concrete] +// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] +// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] +// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] +// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] +// CHECK:STDOUT: %B: type = class_type @B [concrete] +// CHECK:STDOUT: %pattern_type.971: type = pattern_type %B [concrete] +// CHECK:STDOUT: %Make.type: type = fn_type @Make [concrete] +// CHECK:STDOUT: %Make: %Make.type = struct_value () [concrete] +// CHECK:STDOUT: %B.elem: type = unbound_element_type %B, %empty_tuple.type [concrete] +// CHECK:STDOUT: %struct_type.n: type = struct_type {.n: %empty_tuple.type} [concrete] +// CHECK:STDOUT: %complete_type.880: = complete_type_witness %struct_type.n [concrete] +// CHECK:STDOUT: %empty_tuple: %empty_tuple.type = tuple_value () [concrete] +// CHECK:STDOUT: %B.val: %B = struct_value (%empty_tuple) [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: file { +// CHECK:STDOUT: %A.decl: type = class_decl @A [concrete = constants.%A] {} {} +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: class @A { +// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { +// CHECK:STDOUT: %return.patt: %pattern_type.cb1 = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: %pattern_type.cb1 = out_param_pattern %return.patt, call_param0 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc15_14.1: %empty_tuple.type = tuple_literal () +// CHECK:STDOUT: %.loc15_14.2: type = converted %.loc15_14.1, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] +// CHECK:STDOUT: %return.param: ref %empty_tuple.type = out_param call_param0 +// CHECK:STDOUT: %return: ref %empty_tuple.type = return_slot %return.param +// CHECK:STDOUT: } +// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] +// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] +// CHECK:STDOUT: complete_type_witness = %complete_type +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = constants.%A +// CHECK:STDOUT: .F = %F.decl +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: class @B { +// CHECK:STDOUT: %Make.decl: %Make.type = fn_decl @Make [concrete = constants.%Make] { +// CHECK:STDOUT: %return.patt: %pattern_type.971 = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: %pattern_type.971 = out_param_pattern %return.patt, call_param0 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %Self.ref.loc17: type = name_ref Self, constants.%B [concrete = constants.%B] +// CHECK:STDOUT: %return.param: ref %B = out_param call_param0 +// CHECK:STDOUT: %return: ref %B = return_slot %return.param +// CHECK:STDOUT: } +// CHECK:STDOUT: %.loc22_15.1: %empty_tuple.type = tuple_literal () +// CHECK:STDOUT: %.loc22_15.2: type = converted %.loc22_15.1, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] +// CHECK:STDOUT: %.loc22_12: %B.elem = field_decl n, element0 [concrete] +// CHECK:STDOUT: %struct_type.n: type = struct_type {.n: %empty_tuple.type} [concrete = constants.%struct_type.n] +// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.n [concrete = constants.%complete_type.880] +// CHECK:STDOUT: complete_type_witness = %complete_type +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = constants.%B +// CHECK:STDOUT: .Make = %Make.decl +// CHECK:STDOUT: .n = %.loc22_12 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @F() -> %empty_tuple.type { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %B.decl: type = class_decl @B [concrete = constants.%B] {} {} +// CHECK:STDOUT: %B.ref: type = name_ref B, %B.decl [concrete = constants.%B] +// CHECK:STDOUT: %Make.ref: %Make.type = name_ref Make, @B.%Make.decl [concrete = constants.%Make] +// CHECK:STDOUT: %.loc25_19.1: ref %B = temporary_storage +// CHECK:STDOUT: %Make.call: init %B = call %Make.ref() to %.loc25_19.1 +// CHECK:STDOUT: %.loc25_19.2: ref %B = temporary %.loc25_19.1, %Make.call +// CHECK:STDOUT: %n.ref: %B.elem = name_ref n, @B.%.loc22_12 [concrete = @B.%.loc22_12] +// CHECK:STDOUT: %.loc25_20: ref %empty_tuple.type = class_element_access %.loc25_19.2, element0 +// CHECK:STDOUT: %tuple: %empty_tuple.type = tuple_value () [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc25_22: %empty_tuple.type = converted %.loc25_20, %tuple [concrete = constants.%empty_tuple] +// CHECK:STDOUT: return %.loc25_22 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @Make() -> %return.param: %B { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %b.patt: %pattern_type.971 = binding_pattern b [concrete] +// CHECK:STDOUT: %b.var_patt: %pattern_type.971 = var_pattern %b.patt [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: %.loc18_39.1: %empty_tuple.type = tuple_literal () +// CHECK:STDOUT: %.loc18_40.1: %struct_type.n = struct_literal (%.loc18_39.1) +// CHECK:STDOUT: %.loc18_40.2: ref %empty_tuple.type = class_element_access %return, element0 +// CHECK:STDOUT: %.loc18_39.2: init %empty_tuple.type = tuple_init () to %.loc18_40.2 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc18_40.3: init %empty_tuple.type = converted %.loc18_39.1, %.loc18_39.2 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc18_40.4: init %B = class_init (%.loc18_40.3), %return [concrete = constants.%B.val] +// CHECK:STDOUT: %.loc18_18: init %B = converted %.loc18_40.1, %.loc18_40.4 [concrete = constants.%B.val] +// CHECK:STDOUT: assign %return, %.loc18_18 +// CHECK:STDOUT: %Self.ref.loc18: type = name_ref Self, constants.%B [concrete = constants.%B] +// CHECK:STDOUT: %b: ref %B = bind_name b, %return +// CHECK:STDOUT: return %b to %return +// CHECK:STDOUT: } +// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/no_prelude/member_functions.carbon b/toolchain/check/testdata/class/no_prelude/member_functions.carbon new file mode 100644 index 0000000000000..1efbfce00e5c5 --- /dev/null +++ b/toolchain/check/testdata/class/no_prelude/member_functions.carbon @@ -0,0 +1,677 @@ +// Part of the Carbon Language project, under the Apache License v2.0 with LLVM +// Exceptions. See /LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// +// AUTOUPDATE +// TIP: To test this file alone, run: +// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/no_prelude/member_functions.carbon +// TIP: To dump output, run: +// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/no_prelude/member_functions.carbon + +// --- method.carbon +library "[[@TEST_NAME]]"; + +class Class { + //@dump-sem-ir-begin + fn F[self: Self]() -> {}; + fn G[addr self: Self*]() -> {}; + + alias A = F; + //@dump-sem-ir-end + + var k: {}; +} + +fn Make() -> Class; + +//@dump-sem-ir-begin +fn Class.F[self: Self]() -> {} { + return self.k; +} + +fn Call(c: Class) -> {} { + // TODO: The sem-ir for this call doesn't distinguish the `self` argument from + // the explicit arguments. + return c.F(); +} + +fn CallAlias(c: Class) -> {} { + return c.A(); +} + +fn CallOnConstBoundMethod() -> {} { + return ({.k = {}} as Class).F(); +} + +fn CallWithAddr() -> {} { + var c: Class; + return c.G(); +} + +fn CallFThroughPointer(p: Class*) -> {} { + return (*p).F(); +} + +fn CallGThroughPointer(p: Class*) -> {} { + return (*p).G(); +} + +fn CallFOnInitializingExpr() -> {} { + return Make().F(); +} + +fn CallGOnInitializingExpr() -> {} { + return Make().G(); +} +//@dump-sem-ir-end + +// --- fail_multiple_bindings.carbon +library "[[@TEST_NAME]]"; + +class X { + fn F[self: Self](); +} + +fn G(x: X) { + // TODO: Produce a better diagnostic for this case. + // CHECK:STDERR: fail_multiple_bindings.carbon:[[@LINE+4]]:3: error: member name of type `` in compound member access is not an instance member or an interface member [CompoundMemberAccessDoesNotUseBase] + // CHECK:STDERR: x.(x.F)(); + // CHECK:STDERR: ^~~~~~~ + // CHECK:STDERR: + x.(x.F)(); +} + +// --- fail_addr_not_self.carbon +library "[[@TEST_NAME]]"; + +class Class { + // CHECK:STDERR: fail_addr_not_self.carbon:[[@LINE+4]]:8: error: `addr` can only be applied to a `self` parameter [AddrOnNonSelfParam] + // CHECK:STDERR: fn F[addr a:! Class*](); + // CHECK:STDERR: ^~~~ + // CHECK:STDERR: + fn F[addr a:! Class*](); + + // CHECK:STDERR: fail_addr_not_self.carbon:[[@LINE+4]]:8: error: `addr` can only be applied to a `self` parameter [AddrOnNonSelfParam] + // CHECK:STDERR: fn G(addr b: Class*); + // CHECK:STDERR: ^~~~ + // CHECK:STDERR: + fn G(addr b: Class*); +} + +// --- fail_addr_self.carbon + +library "[[@TEST_NAME]]"; + +class Class { + fn F[addr self: Class*](); + // CHECK:STDERR: fail_addr_self.carbon:[[@LINE+4]]:8: error: `addr` can only be applied to a binding with a pointer type [AddrOnNonPointerType] + // CHECK:STDERR: fn G[addr self: Class](); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~ + // CHECK:STDERR: + fn G[addr self: Class](); +} + +fn F(c: Class, p: Class*) { + // CHECK:STDERR: fail_addr_self.carbon:[[@LINE+7]]:3: error: `addr self` method cannot be invoked on a value [AddrSelfIsNonRef] + // CHECK:STDERR: c.F(); + // CHECK:STDERR: ^ + // CHECK:STDERR: fail_addr_self.carbon:[[@LINE-12]]:8: note: initializing function parameter [InCallToFunctionParam] + // CHECK:STDERR: fn F[addr self: Class*](); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + c.F(); + + c.G(); + + // This call is OK. + (*p).F(); + + (*p).G(); +} + +// CHECK:STDERR: fail_addr_self.carbon:[[@LINE+4]]:4: error: name `D` not found [NameNotFound] +// CHECK:STDERR: fn D.F() {} +// CHECK:STDERR: ^ +// CHECK:STDERR: +fn D.F() {} + +// CHECK:STDERR: fail_addr_self.carbon:[[@LINE+4]]:4: error: name `D` not found [NameNotFound] +// CHECK:STDERR: fn D.C.F() {} +// CHECK:STDERR: ^ +// CHECK:STDERR: +fn D.C.F() {} + +// --- fail_method.carbon +// CHECK:STDERR: fail_method.carbon:[[@LINE+4]]:1: error: library's API previously provided by `method.carbon` [DuplicateLibraryApi] +// CHECK:STDERR: library "method"; +// CHECK:STDERR: ^~~~~~~~~~~~~~~~~ +// CHECK:STDERR: +library "[[@TEST_NAME]]"; + +class Class { + fn NoSelf(); + fn WithSelf[self: Class](); +} + +alias A = Class.WithSelf; + +fn F(c: Class) { + c.NoSelf(); + c.WithSelf(); + + Class.NoSelf(); + // CHECK:STDERR: fail_method.carbon:[[@LINE+7]]:3: error: missing object argument in method call [MissingObjectInMethodCall] + // CHECK:STDERR: Class.WithSelf(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_method.carbon:[[@LINE-13]]:3: note: calling function declared here [InCallToFunction] + // CHECK:STDERR: fn WithSelf[self: Class](); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + Class.WithSelf(); + // CHECK:STDERR: fail_method.carbon:[[@LINE+7]]:3: error: 1 argument passed to function expecting 0 arguments [CallArgCountMismatch] + // CHECK:STDERR: Class.WithSelf(c); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_method.carbon:[[@LINE-21]]:3: note: calling function declared here [InCallToEntity] + // CHECK:STDERR: fn WithSelf[self: Class](); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + Class.WithSelf(c); + + // CHECK:STDERR: fail_method.carbon:[[@LINE+7]]:3: error: missing object argument in method call [MissingObjectInMethodCall] + // CHECK:STDERR: A(); + // CHECK:STDERR: ^~~ + // CHECK:STDERR: fail_method.carbon:[[@LINE-30]]:3: note: calling function declared here [InCallToFunction] + // CHECK:STDERR: fn WithSelf[self: Class](); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + A(); +} + +// --- fail_method_redefinition.carbon +library "[[@TEST_NAME]]"; + +class Class { + fn F() {} + // CHECK:STDERR: fail_method_redefinition.carbon:[[@LINE+7]]:3: error: redefinition of `fn F` [RedeclRedef] + // CHECK:STDERR: fn F() {} + // CHECK:STDERR: ^~~~~~~~ + // CHECK:STDERR: fail_method_redefinition.carbon:[[@LINE-4]]:3: note: previously defined here [RedeclPrevDef] + // CHECK:STDERR: fn F() {} + // CHECK:STDERR: ^~~~~~~~ + // CHECK:STDERR: + fn F() {} +} + +// --- fail_out_of_line_decl.carbon +library "[[@TEST_NAME]]"; + +class C {} + +// CHECK:STDERR: fail_out_of_line_decl.carbon:[[@LINE+4]]:6: error: out-of-line declaration requires a declaration in scoped entity [QualifiedDeclOutsideScopeEntity] +// CHECK:STDERR: fn C.F() {} +// CHECK:STDERR: ^ +// CHECK:STDERR: +fn C.F() {} + +// --- class_function.carbon +library "[[@TEST_NAME]]"; + +class Class { + //@dump-sem-ir-begin + fn F() -> (); + //@dump-sem-ir-end +} + +fn Run() -> () { + var c: Class; + //@dump-sem-ir-begin + return c.F(); + //@dump-sem-ir-end +} + +// --- fail_member_of_let.carbon +library "[[@TEST_NAME]]"; + +class Class { + fn F(); +} + +// TODO: Use `:!` here once it is available. +let T: type = Class; + +// The class name is required to be written in the same way as in the class +// declaration. An expression that evaluates to the class name is not accepted. +// CHECK:STDERR: fail_member_of_let.carbon:[[@LINE+7]]:4: error: name qualifiers are only allowed for entities that provide a scope [QualifiedNameInNonScope] +// CHECK:STDERR: fn T.F() {} +// CHECK:STDERR: ^ +// CHECK:STDERR: fail_member_of_let.carbon:[[@LINE-7]]:5: note: referenced non-scope entity declared here [QualifiedNameNonScopeEntity] +// CHECK:STDERR: let T: type = Class; +// CHECK:STDERR: ^ +// CHECK:STDERR: +fn T.F() {} + +// --- fail_memaccess_category.carbon +library "[[@TEST_NAME]]"; + +class A { + fn F[addr self: A*](); +} + +class B { + var a: A; +} + +fn F(s: {.a: A}, b: B) { + // `s` has only a value representation, so this must be invalid. + // CHECK:STDERR: fail_memaccess_category.carbon:[[@LINE+7]]:3: error: `addr self` method cannot be invoked on a value [AddrSelfIsNonRef] + // CHECK:STDERR: s.a.F(); + // CHECK:STDERR: ^~~ + // CHECK:STDERR: fail_memaccess_category.carbon:[[@LINE-12]]:8: note: initializing function parameter [InCallToFunctionParam] + // CHECK:STDERR: fn F[addr self: A*](); + // CHECK:STDERR: ^~~~~~~~~~~~~ + // CHECK:STDERR: + s.a.F(); + + // `b` has an object representation for `A`, but this is still invalid for + // consistency. + // CHECK:STDERR: fail_memaccess_category.carbon:[[@LINE+7]]:3: error: `addr self` method cannot be invoked on a value [AddrSelfIsNonRef] + // CHECK:STDERR: b.a.F(); + // CHECK:STDERR: ^~~ + // CHECK:STDERR: fail_memaccess_category.carbon:[[@LINE-23]]:8: note: initializing function parameter [InCallToFunctionParam] + // CHECK:STDERR: fn F[addr self: A*](); + // CHECK:STDERR: ^~~~~~~~~~~~~ + // CHECK:STDERR: + b.a.F(); +} + +// CHECK:STDOUT: --- method.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %Class: type = class_type @Class [concrete] +// CHECK:STDOUT: %pattern_type.761: type = pattern_type %Class [concrete] +// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] +// CHECK:STDOUT: %pattern_type.a96: type = pattern_type %empty_struct_type [concrete] +// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] +// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] +// CHECK:STDOUT: %ptr.e71: type = ptr_type %Class [concrete] +// CHECK:STDOUT: %pattern_type.796: type = pattern_type %ptr.e71 [concrete] +// CHECK:STDOUT: %pattern_type.f6d: type = pattern_type auto [concrete] +// CHECK:STDOUT: %G.type: type = fn_type @G [concrete] +// CHECK:STDOUT: %G: %G.type = struct_value () [concrete] +// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %empty_struct_type [concrete] +// CHECK:STDOUT: %struct_type.k.df9: type = struct_type {.k: %empty_struct_type} [concrete] +// CHECK:STDOUT: %Make.type: type = fn_type @Make [concrete] +// CHECK:STDOUT: %Make: %Make.type = struct_value () [concrete] +// CHECK:STDOUT: %empty_struct: %empty_struct_type = struct_value () [concrete] +// CHECK:STDOUT: %Call.type: type = fn_type @Call [concrete] +// CHECK:STDOUT: %Call: %Call.type = struct_value () [concrete] +// CHECK:STDOUT: %CallAlias.type: type = fn_type @CallAlias [concrete] +// CHECK:STDOUT: %CallAlias: %CallAlias.type = struct_value () [concrete] +// CHECK:STDOUT: %CallOnConstBoundMethod.type: type = fn_type @CallOnConstBoundMethod [concrete] +// CHECK:STDOUT: %CallOnConstBoundMethod: %CallOnConstBoundMethod.type = struct_value () [concrete] +// CHECK:STDOUT: %Class.val: %Class = struct_value (%empty_struct) [concrete] +// CHECK:STDOUT: %CallWithAddr.type: type = fn_type @CallWithAddr [concrete] +// CHECK:STDOUT: %CallWithAddr: %CallWithAddr.type = struct_value () [concrete] +// CHECK:STDOUT: %CallFThroughPointer.type: type = fn_type @CallFThroughPointer [concrete] +// CHECK:STDOUT: %CallFThroughPointer: %CallFThroughPointer.type = struct_value () [concrete] +// CHECK:STDOUT: %CallGThroughPointer.type: type = fn_type @CallGThroughPointer [concrete] +// CHECK:STDOUT: %CallGThroughPointer: %CallGThroughPointer.type = struct_value () [concrete] +// CHECK:STDOUT: %CallFOnInitializingExpr.type: type = fn_type @CallFOnInitializingExpr [concrete] +// CHECK:STDOUT: %CallFOnInitializingExpr: %CallFOnInitializingExpr.type = struct_value () [concrete] +// CHECK:STDOUT: %CallGOnInitializingExpr.type: type = fn_type @CallGOnInitializingExpr [concrete] +// CHECK:STDOUT: %CallGOnInitializingExpr: %CallGOnInitializingExpr.type = struct_value () [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: file { +// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { +// CHECK:STDOUT: %self.patt: %pattern_type.761 = binding_pattern self [concrete] +// CHECK:STDOUT: %self.param_patt: %pattern_type.761 = value_param_pattern %self.patt, call_param0 [concrete] +// CHECK:STDOUT: %return.patt: %pattern_type.a96 = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: %pattern_type.a96 = out_param_pattern %return.patt, call_param1 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc17_30.1: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc17_30.2: type = converted %.loc17_30.1, constants.%empty_struct_type [concrete = constants.%empty_struct_type] +// CHECK:STDOUT: %self.param.loc17: %Class = value_param call_param0 +// CHECK:STDOUT: %Self.ref.loc17: type = name_ref Self, constants.%Class [concrete = constants.%Class] +// CHECK:STDOUT: %self.loc17: %Class = bind_name self, %self.param.loc17 +// CHECK:STDOUT: %return.param.loc17: ref %empty_struct_type = out_param call_param1 +// CHECK:STDOUT: %return.loc17: ref %empty_struct_type = return_slot %return.param.loc17 +// CHECK:STDOUT: } +// CHECK:STDOUT: %Call.decl: %Call.type = fn_decl @Call [concrete = constants.%Call] { +// CHECK:STDOUT: %c.patt: %pattern_type.761 = binding_pattern c [concrete] +// CHECK:STDOUT: %c.param_patt: %pattern_type.761 = value_param_pattern %c.patt, call_param0 [concrete] +// CHECK:STDOUT: %return.patt: %pattern_type.a96 = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: %pattern_type.a96 = out_param_pattern %return.patt, call_param1 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc21_23.1: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc21_23.2: type = converted %.loc21_23.1, constants.%empty_struct_type [concrete = constants.%empty_struct_type] +// CHECK:STDOUT: %c.param: %Class = value_param call_param0 +// CHECK:STDOUT: %Class.ref: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] +// CHECK:STDOUT: %c: %Class = bind_name c, %c.param +// CHECK:STDOUT: %return.param: ref %empty_struct_type = out_param call_param1 +// CHECK:STDOUT: %return: ref %empty_struct_type = return_slot %return.param +// CHECK:STDOUT: } +// CHECK:STDOUT: %CallAlias.decl: %CallAlias.type = fn_decl @CallAlias [concrete = constants.%CallAlias] { +// CHECK:STDOUT: %c.patt: %pattern_type.761 = binding_pattern c [concrete] +// CHECK:STDOUT: %c.param_patt: %pattern_type.761 = value_param_pattern %c.patt, call_param0 [concrete] +// CHECK:STDOUT: %return.patt: %pattern_type.a96 = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: %pattern_type.a96 = out_param_pattern %return.patt, call_param1 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc27_28.1: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc27_28.2: type = converted %.loc27_28.1, constants.%empty_struct_type [concrete = constants.%empty_struct_type] +// CHECK:STDOUT: %c.param: %Class = value_param call_param0 +// CHECK:STDOUT: %Class.ref: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] +// CHECK:STDOUT: %c: %Class = bind_name c, %c.param +// CHECK:STDOUT: %return.param: ref %empty_struct_type = out_param call_param1 +// CHECK:STDOUT: %return: ref %empty_struct_type = return_slot %return.param +// CHECK:STDOUT: } +// CHECK:STDOUT: %CallOnConstBoundMethod.decl: %CallOnConstBoundMethod.type = fn_decl @CallOnConstBoundMethod [concrete = constants.%CallOnConstBoundMethod] { +// CHECK:STDOUT: %return.patt: %pattern_type.a96 = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: %pattern_type.a96 = out_param_pattern %return.patt, call_param0 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc31_33.1: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc31_33.2: type = converted %.loc31_33.1, constants.%empty_struct_type [concrete = constants.%empty_struct_type] +// CHECK:STDOUT: %return.param: ref %empty_struct_type = out_param call_param0 +// CHECK:STDOUT: %return: ref %empty_struct_type = return_slot %return.param +// CHECK:STDOUT: } +// CHECK:STDOUT: %CallWithAddr.decl: %CallWithAddr.type = fn_decl @CallWithAddr [concrete = constants.%CallWithAddr] { +// CHECK:STDOUT: %return.patt: %pattern_type.a96 = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: %pattern_type.a96 = out_param_pattern %return.patt, call_param0 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc35_23.1: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc35_23.2: type = converted %.loc35_23.1, constants.%empty_struct_type [concrete = constants.%empty_struct_type] +// CHECK:STDOUT: %return.param: ref %empty_struct_type = out_param call_param0 +// CHECK:STDOUT: %return: ref %empty_struct_type = return_slot %return.param +// CHECK:STDOUT: } +// CHECK:STDOUT: %CallFThroughPointer.decl: %CallFThroughPointer.type = fn_decl @CallFThroughPointer [concrete = constants.%CallFThroughPointer] { +// CHECK:STDOUT: %p.patt: %pattern_type.796 = binding_pattern p [concrete] +// CHECK:STDOUT: %p.param_patt: %pattern_type.796 = value_param_pattern %p.patt, call_param0 [concrete] +// CHECK:STDOUT: %return.patt: %pattern_type.a96 = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: %pattern_type.a96 = out_param_pattern %return.patt, call_param1 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc40_39.1: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc40_39.2: type = converted %.loc40_39.1, constants.%empty_struct_type [concrete = constants.%empty_struct_type] +// CHECK:STDOUT: %p.param: %ptr.e71 = value_param call_param0 +// CHECK:STDOUT: %.loc40_32: type = splice_block %ptr [concrete = constants.%ptr.e71] { +// CHECK:STDOUT: %Class.ref: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] +// CHECK:STDOUT: %ptr: type = ptr_type %Class.ref [concrete = constants.%ptr.e71] +// CHECK:STDOUT: } +// CHECK:STDOUT: %p: %ptr.e71 = bind_name p, %p.param +// CHECK:STDOUT: %return.param: ref %empty_struct_type = out_param call_param1 +// CHECK:STDOUT: %return: ref %empty_struct_type = return_slot %return.param +// CHECK:STDOUT: } +// CHECK:STDOUT: %CallGThroughPointer.decl: %CallGThroughPointer.type = fn_decl @CallGThroughPointer [concrete = constants.%CallGThroughPointer] { +// CHECK:STDOUT: %p.patt: %pattern_type.796 = binding_pattern p [concrete] +// CHECK:STDOUT: %p.param_patt: %pattern_type.796 = value_param_pattern %p.patt, call_param0 [concrete] +// CHECK:STDOUT: %return.patt: %pattern_type.a96 = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: %pattern_type.a96 = out_param_pattern %return.patt, call_param1 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc44_39.1: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc44_39.2: type = converted %.loc44_39.1, constants.%empty_struct_type [concrete = constants.%empty_struct_type] +// CHECK:STDOUT: %p.param: %ptr.e71 = value_param call_param0 +// CHECK:STDOUT: %.loc44_32: type = splice_block %ptr [concrete = constants.%ptr.e71] { +// CHECK:STDOUT: %Class.ref: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] +// CHECK:STDOUT: %ptr: type = ptr_type %Class.ref [concrete = constants.%ptr.e71] +// CHECK:STDOUT: } +// CHECK:STDOUT: %p: %ptr.e71 = bind_name p, %p.param +// CHECK:STDOUT: %return.param: ref %empty_struct_type = out_param call_param1 +// CHECK:STDOUT: %return: ref %empty_struct_type = return_slot %return.param +// CHECK:STDOUT: } +// CHECK:STDOUT: %CallFOnInitializingExpr.decl: %CallFOnInitializingExpr.type = fn_decl @CallFOnInitializingExpr [concrete = constants.%CallFOnInitializingExpr] { +// CHECK:STDOUT: %return.patt: %pattern_type.a96 = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: %pattern_type.a96 = out_param_pattern %return.patt, call_param0 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc48_34.1: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc48_34.2: type = converted %.loc48_34.1, constants.%empty_struct_type [concrete = constants.%empty_struct_type] +// CHECK:STDOUT: %return.param: ref %empty_struct_type = out_param call_param0 +// CHECK:STDOUT: %return: ref %empty_struct_type = return_slot %return.param +// CHECK:STDOUT: } +// CHECK:STDOUT: %CallGOnInitializingExpr.decl: %CallGOnInitializingExpr.type = fn_decl @CallGOnInitializingExpr [concrete = constants.%CallGOnInitializingExpr] { +// CHECK:STDOUT: %return.patt: %pattern_type.a96 = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: %pattern_type.a96 = out_param_pattern %return.patt, call_param0 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc52_34.1: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc52_34.2: type = converted %.loc52_34.1, constants.%empty_struct_type [concrete = constants.%empty_struct_type] +// CHECK:STDOUT: %return.param: ref %empty_struct_type = out_param call_param0 +// CHECK:STDOUT: %return: ref %empty_struct_type = return_slot %return.param +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: class @Class { +// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { +// CHECK:STDOUT: %self.patt: %pattern_type.761 = binding_pattern self [concrete] +// CHECK:STDOUT: %self.param_patt: %pattern_type.761 = value_param_pattern %self.patt, call_param0 [concrete] +// CHECK:STDOUT: %return.patt: %pattern_type.a96 = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: %pattern_type.a96 = out_param_pattern %return.patt, call_param1 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc5_26.1: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc5_26.2: type = converted %.loc5_26.1, constants.%empty_struct_type [concrete = constants.%empty_struct_type] +// CHECK:STDOUT: %self.param.loc5: %Class = value_param call_param0 +// CHECK:STDOUT: %Self.ref.loc5: type = name_ref Self, constants.%Class [concrete = constants.%Class] +// CHECK:STDOUT: %self.loc5: %Class = bind_name self, %self.param.loc5 +// CHECK:STDOUT: %return.param.loc5: ref %empty_struct_type = out_param call_param1 +// CHECK:STDOUT: %return.loc5: ref %empty_struct_type = return_slot %return.param.loc5 +// CHECK:STDOUT: } +// CHECK:STDOUT: %G.decl: %G.type = fn_decl @G [concrete = constants.%G] { +// CHECK:STDOUT: %self.patt: %pattern_type.796 = binding_pattern self [concrete] +// CHECK:STDOUT: %self.param_patt: %pattern_type.796 = value_param_pattern %self.patt, call_param0 [concrete] +// CHECK:STDOUT: %.loc6_8: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] +// CHECK:STDOUT: %return.patt: %pattern_type.a96 = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: %pattern_type.a96 = out_param_pattern %return.patt, call_param1 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc6_32.1: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc6_32.2: type = converted %.loc6_32.1, constants.%empty_struct_type [concrete = constants.%empty_struct_type] +// CHECK:STDOUT: %self.param: %ptr.e71 = value_param call_param0 +// CHECK:STDOUT: %.loc6_23: type = splice_block %ptr [concrete = constants.%ptr.e71] { +// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Class [concrete = constants.%Class] +// CHECK:STDOUT: %ptr: type = ptr_type %Self.ref [concrete = constants.%ptr.e71] +// CHECK:STDOUT: } +// CHECK:STDOUT: %self: %ptr.e71 = bind_name self, %self.param +// CHECK:STDOUT: %return.param: ref %empty_struct_type = out_param call_param1 +// CHECK:STDOUT: %return: ref %empty_struct_type = return_slot %return.param +// CHECK:STDOUT: } +// CHECK:STDOUT: %F.ref: %F.type = name_ref F, %F.decl [concrete = constants.%F] +// CHECK:STDOUT: %A: %F.type = bind_alias A, %F.decl [concrete = constants.%F] +// CHECK:STDOUT: +// CHECK:STDOUT: complete_type_witness = %complete_type +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = constants.%Class +// CHECK:STDOUT: .F = %F.decl +// CHECK:STDOUT: .G = %G.decl +// CHECK:STDOUT: .A = %A +// CHECK:STDOUT: .k = %.loc11_8 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @F(%self.param.loc17: %Class) -> %empty_struct_type { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %self.ref: %Class = name_ref self, %self.loc17 +// CHECK:STDOUT: %k.ref: %Class.elem = name_ref k, @Class.%.loc11_8 [concrete = @Class.%.loc11_8] +// CHECK:STDOUT: %.loc18_14.1: ref %empty_struct_type = class_element_access %self.ref, element0 +// CHECK:STDOUT: %empty_struct: %empty_struct_type = struct_value () [concrete = constants.%empty_struct] +// CHECK:STDOUT: %.loc18_14.2: %empty_struct_type = converted %.loc18_14.1, %empty_struct [concrete = constants.%empty_struct] +// CHECK:STDOUT: return %.loc18_14.2 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @G(%self.param: %ptr.e71) -> %empty_struct_type; +// CHECK:STDOUT: +// CHECK:STDOUT: fn @Call(%c.param: %Class) -> %empty_struct_type { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %c.ref: %Class = name_ref c, %c +// CHECK:STDOUT: %F.ref: %F.type = name_ref F, @Class.%F.decl [concrete = constants.%F] +// CHECK:STDOUT: %F.bound: = bound_method %c.ref, %F.ref +// CHECK:STDOUT: %F.call: init %empty_struct_type = call %F.bound(%c.ref) +// CHECK:STDOUT: %.loc24_14.1: ref %empty_struct_type = temporary_storage +// CHECK:STDOUT: %.loc24_14.2: ref %empty_struct_type = temporary %.loc24_14.1, %F.call +// CHECK:STDOUT: %empty_struct: %empty_struct_type = struct_value () [concrete = constants.%empty_struct] +// CHECK:STDOUT: %.loc24_15: %empty_struct_type = converted %F.call, %empty_struct [concrete = constants.%empty_struct] +// CHECK:STDOUT: return %.loc24_15 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @CallAlias(%c.param: %Class) -> %empty_struct_type { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %c.ref: %Class = name_ref c, %c +// CHECK:STDOUT: %A.ref: %F.type = name_ref A, @Class.%A [concrete = constants.%F] +// CHECK:STDOUT: %F.bound: = bound_method %c.ref, %A.ref +// CHECK:STDOUT: %F.call: init %empty_struct_type = call %F.bound(%c.ref) +// CHECK:STDOUT: %.loc28_14.1: ref %empty_struct_type = temporary_storage +// CHECK:STDOUT: %.loc28_14.2: ref %empty_struct_type = temporary %.loc28_14.1, %F.call +// CHECK:STDOUT: %empty_struct: %empty_struct_type = struct_value () [concrete = constants.%empty_struct] +// CHECK:STDOUT: %.loc28_15: %empty_struct_type = converted %F.call, %empty_struct [concrete = constants.%empty_struct] +// CHECK:STDOUT: return %.loc28_15 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @CallOnConstBoundMethod() -> %empty_struct_type { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %.loc32_18.1: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc32_19.1: %struct_type.k.df9 = struct_literal (%.loc32_18.1) +// CHECK:STDOUT: %Class.ref: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] +// CHECK:STDOUT: %.loc32_19.2: ref %Class = temporary_storage +// CHECK:STDOUT: %.loc32_19.3: ref %empty_struct_type = class_element_access %.loc32_19.2, element0 +// CHECK:STDOUT: %.loc32_18.2: init %empty_struct_type = struct_init () to %.loc32_19.3 [concrete = constants.%empty_struct] +// CHECK:STDOUT: %.loc32_19.4: init %empty_struct_type = converted %.loc32_18.1, %.loc32_18.2 [concrete = constants.%empty_struct] +// CHECK:STDOUT: %.loc32_19.5: init %Class = class_init (%.loc32_19.4), %.loc32_19.2 [concrete = constants.%Class.val] +// CHECK:STDOUT: %.loc32_19.6: ref %Class = temporary %.loc32_19.2, %.loc32_19.5 +// CHECK:STDOUT: %.loc32_21.1: ref %Class = converted %.loc32_19.1, %.loc32_19.6 +// CHECK:STDOUT: %F.ref: %F.type = name_ref F, @Class.%F.decl [concrete = constants.%F] +// CHECK:STDOUT: %F.bound: = bound_method %.loc32_21.1, %F.ref +// CHECK:STDOUT: %.loc32_21.2: %Class = bind_value %.loc32_21.1 +// CHECK:STDOUT: %F.call: init %empty_struct_type = call %F.bound(%.loc32_21.2) +// CHECK:STDOUT: %.loc32_33.1: ref %empty_struct_type = temporary_storage +// CHECK:STDOUT: %.loc32_33.2: ref %empty_struct_type = temporary %.loc32_33.1, %F.call +// CHECK:STDOUT: %empty_struct: %empty_struct_type = struct_value () [concrete = constants.%empty_struct] +// CHECK:STDOUT: %.loc32_34: %empty_struct_type = converted %F.call, %empty_struct [concrete = constants.%empty_struct] +// CHECK:STDOUT: return %.loc32_34 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @CallWithAddr() -> %empty_struct_type { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %c.patt: %pattern_type.761 = binding_pattern c [concrete] +// CHECK:STDOUT: %c.var_patt: %pattern_type.761 = var_pattern %c.patt [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: %c.var: ref %Class = var %c.var_patt +// CHECK:STDOUT: %Class.ref: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] +// CHECK:STDOUT: %c: ref %Class = bind_name c, %c.var +// CHECK:STDOUT: %c.ref: ref %Class = name_ref c, %c +// CHECK:STDOUT: %G.ref: %G.type = name_ref G, @Class.%G.decl [concrete = constants.%G] +// CHECK:STDOUT: %G.bound: = bound_method %c.ref, %G.ref +// CHECK:STDOUT: %addr: %ptr.e71 = addr_of %c.ref +// CHECK:STDOUT: %G.call: init %empty_struct_type = call %G.bound(%addr) +// CHECK:STDOUT: %.loc37_14.1: ref %empty_struct_type = temporary_storage +// CHECK:STDOUT: %.loc37_14.2: ref %empty_struct_type = temporary %.loc37_14.1, %G.call +// CHECK:STDOUT: %empty_struct: %empty_struct_type = struct_value () [concrete = constants.%empty_struct] +// CHECK:STDOUT: %.loc37_15: %empty_struct_type = converted %G.call, %empty_struct [concrete = constants.%empty_struct] +// CHECK:STDOUT: return %.loc37_15 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @CallFThroughPointer(%p.param: %ptr.e71) -> %empty_struct_type { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %p.ref: %ptr.e71 = name_ref p, %p +// CHECK:STDOUT: %.loc41_11.1: ref %Class = deref %p.ref +// CHECK:STDOUT: %F.ref: %F.type = name_ref F, @Class.%F.decl [concrete = constants.%F] +// CHECK:STDOUT: %F.bound: = bound_method %.loc41_11.1, %F.ref +// CHECK:STDOUT: %.loc41_11.2: %Class = bind_value %.loc41_11.1 +// CHECK:STDOUT: %F.call: init %empty_struct_type = call %F.bound(%.loc41_11.2) +// CHECK:STDOUT: %.loc41_17.1: ref %empty_struct_type = temporary_storage +// CHECK:STDOUT: %.loc41_17.2: ref %empty_struct_type = temporary %.loc41_17.1, %F.call +// CHECK:STDOUT: %empty_struct: %empty_struct_type = struct_value () [concrete = constants.%empty_struct] +// CHECK:STDOUT: %.loc41_18: %empty_struct_type = converted %F.call, %empty_struct [concrete = constants.%empty_struct] +// CHECK:STDOUT: return %.loc41_18 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @CallGThroughPointer(%p.param: %ptr.e71) -> %empty_struct_type { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %p.ref: %ptr.e71 = name_ref p, %p +// CHECK:STDOUT: %.loc45_11: ref %Class = deref %p.ref +// CHECK:STDOUT: %G.ref: %G.type = name_ref G, @Class.%G.decl [concrete = constants.%G] +// CHECK:STDOUT: %G.bound: = bound_method %.loc45_11, %G.ref +// CHECK:STDOUT: %addr: %ptr.e71 = addr_of %.loc45_11 +// CHECK:STDOUT: %G.call: init %empty_struct_type = call %G.bound(%addr) +// CHECK:STDOUT: %.loc45_17.1: ref %empty_struct_type = temporary_storage +// CHECK:STDOUT: %.loc45_17.2: ref %empty_struct_type = temporary %.loc45_17.1, %G.call +// CHECK:STDOUT: %empty_struct: %empty_struct_type = struct_value () [concrete = constants.%empty_struct] +// CHECK:STDOUT: %.loc45_18: %empty_struct_type = converted %G.call, %empty_struct [concrete = constants.%empty_struct] +// CHECK:STDOUT: return %.loc45_18 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @CallFOnInitializingExpr() -> %empty_struct_type { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %Make.ref: %Make.type = name_ref Make, file.%Make.decl [concrete = constants.%Make] +// CHECK:STDOUT: %.loc49_15.1: ref %Class = temporary_storage +// CHECK:STDOUT: %Make.call: init %Class = call %Make.ref() to %.loc49_15.1 +// CHECK:STDOUT: %.loc49_15.2: ref %Class = temporary %.loc49_15.1, %Make.call +// CHECK:STDOUT: %F.ref: %F.type = name_ref F, @Class.%F.decl [concrete = constants.%F] +// CHECK:STDOUT: %F.bound: = bound_method %.loc49_15.2, %F.ref +// CHECK:STDOUT: %.loc49_15.3: %Class = bind_value %.loc49_15.2 +// CHECK:STDOUT: %F.call: init %empty_struct_type = call %F.bound(%.loc49_15.3) +// CHECK:STDOUT: %.loc49_19.1: ref %empty_struct_type = temporary_storage +// CHECK:STDOUT: %.loc49_19.2: ref %empty_struct_type = temporary %.loc49_19.1, %F.call +// CHECK:STDOUT: %empty_struct: %empty_struct_type = struct_value () [concrete = constants.%empty_struct] +// CHECK:STDOUT: %.loc49_20: %empty_struct_type = converted %F.call, %empty_struct [concrete = constants.%empty_struct] +// CHECK:STDOUT: return %.loc49_20 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @CallGOnInitializingExpr() -> %empty_struct_type { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %Make.ref: %Make.type = name_ref Make, file.%Make.decl [concrete = constants.%Make] +// CHECK:STDOUT: %.loc53_15.1: ref %Class = temporary_storage +// CHECK:STDOUT: %Make.call: init %Class = call %Make.ref() to %.loc53_15.1 +// CHECK:STDOUT: %.loc53_15.2: ref %Class = temporary %.loc53_15.1, %Make.call +// CHECK:STDOUT: %G.ref: %G.type = name_ref G, @Class.%G.decl [concrete = constants.%G] +// CHECK:STDOUT: %G.bound: = bound_method %.loc53_15.2, %G.ref +// CHECK:STDOUT: %addr: %ptr.e71 = addr_of %.loc53_15.2 +// CHECK:STDOUT: %G.call: init %empty_struct_type = call %G.bound(%addr) +// CHECK:STDOUT: %.loc53_19.1: ref %empty_struct_type = temporary_storage +// CHECK:STDOUT: %.loc53_19.2: ref %empty_struct_type = temporary %.loc53_19.1, %G.call +// CHECK:STDOUT: %empty_struct: %empty_struct_type = struct_value () [concrete = constants.%empty_struct] +// CHECK:STDOUT: %.loc53_20: %empty_struct_type = converted %G.call, %empty_struct [concrete = constants.%empty_struct] +// CHECK:STDOUT: return %.loc53_20 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: --- class_function.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %Class: type = class_type @Class [concrete] +// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] +// CHECK:STDOUT: %pattern_type.cb1: type = pattern_type %empty_tuple.type [concrete] +// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] +// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] +// CHECK:STDOUT: %empty_tuple: %empty_tuple.type = tuple_value () [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: class @Class { +// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { +// CHECK:STDOUT: %return.patt: %pattern_type.cb1 = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: %pattern_type.cb1 = out_param_pattern %return.patt, call_param0 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc5_14.1: %empty_tuple.type = tuple_literal () +// CHECK:STDOUT: %.loc5_14.2: type = converted %.loc5_14.1, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] +// CHECK:STDOUT: %return.param: ref %empty_tuple.type = out_param call_param0 +// CHECK:STDOUT: %return: ref %empty_tuple.type = return_slot %return.param +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: complete_type_witness = %complete_type +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = constants.%Class +// CHECK:STDOUT: .F = %F.decl +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @F() -> %empty_tuple.type; +// CHECK:STDOUT: +// CHECK:STDOUT: fn @Run() -> %empty_tuple.type { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: +// CHECK:STDOUT: %c.ref: ref %Class = name_ref c, %c +// CHECK:STDOUT: %F.ref: %F.type = name_ref F, @Class.%F.decl [concrete = constants.%F] +// CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.ref() +// CHECK:STDOUT: %.loc12_14.1: ref %empty_tuple.type = temporary_storage +// CHECK:STDOUT: %.loc12_14.2: ref %empty_tuple.type = temporary %.loc12_14.1, %F.call +// CHECK:STDOUT: %tuple: %empty_tuple.type = tuple_value () [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc12_15: %empty_tuple.type = converted %F.call, %tuple [concrete = constants.%empty_tuple] +// CHECK:STDOUT: return %.loc12_15 +// CHECK:STDOUT: } +// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/no_prelude/method_access.carbon b/toolchain/check/testdata/class/no_prelude/method_access.carbon deleted file mode 100644 index 3cb014fd0ed25..0000000000000 --- a/toolchain/check/testdata/class/no_prelude/method_access.carbon +++ /dev/null @@ -1,85 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/no_prelude/method_access.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/no_prelude/method_access.carbon - -// --- fail_multiple_bindings.carbon - -class X { - fn F[self: Self](); -} - -fn G(x: X) { - // TODO: Produce a better diagnostic for this case. - // CHECK:STDERR: fail_multiple_bindings.carbon:[[@LINE+4]]:3: error: member name of type `` in compound member access is not an instance member or an interface member [CompoundMemberAccessDoesNotUseBase] - // CHECK:STDERR: x.(x.F)(); - // CHECK:STDERR: ^~~~~~~ - // CHECK:STDERR: - x.(x.F)(); -} - -// CHECK:STDOUT: --- fail_multiple_bindings.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %X: type = class_type @X [concrete] -// CHECK:STDOUT: %pattern_type: type = pattern_type %X [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %G.type: type = fn_type @G [concrete] -// CHECK:STDOUT: %G: %G.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .X = %X.decl -// CHECK:STDOUT: .G = %G.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %X.decl: type = class_decl @X [concrete = constants.%X] {} {} -// CHECK:STDOUT: %G.decl: %G.type = fn_decl @G [concrete = constants.%G] { -// CHECK:STDOUT: %x.patt: %pattern_type = binding_pattern x [concrete] -// CHECK:STDOUT: %x.param_patt: %pattern_type = value_param_pattern %x.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %x.param: %X = value_param call_param0 -// CHECK:STDOUT: %X.ref: type = name_ref X, file.%X.decl [concrete = constants.%X] -// CHECK:STDOUT: %x: %X = bind_name x, %x.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @X { -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %self.patt: %pattern_type = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %X = value_param call_param0 -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%X [concrete = constants.%X] -// CHECK:STDOUT: %self: %X = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%X -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F(%self.param: %X); -// CHECK:STDOUT: -// CHECK:STDOUT: fn @G(%x.param: %X) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %x.ref.loc12_3: %X = name_ref x, %x -// CHECK:STDOUT: %x.ref.loc12_6: %X = name_ref x, %x -// CHECK:STDOUT: %F.ref: %F.type = name_ref F, @X.%F.decl [concrete = constants.%F] -// CHECK:STDOUT: %F.bound: = bound_method %x.ref.loc12_6, %F.ref -// CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.bound(%x.ref.loc12_6) -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/no_prelude/name_poisoning.carbon b/toolchain/check/testdata/class/no_prelude/name_poisoning.carbon index 56a585cef001b..4f062a955c4e5 100644 --- a/toolchain/check/testdata/class/no_prelude/name_poisoning.carbon +++ b/toolchain/check/testdata/class/no_prelude/name_poisoning.carbon @@ -2,7 +2,7 @@ // Exceptions. See /LICENSE for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // -// EXTRA-ARGS: --no-dump-sem-ir +// EXTRA-ARGS: --dump-sem-ir-ranges=only // // AUTOUPDATE // TIP: To test this file alone, run: diff --git a/toolchain/check/testdata/class/no_prelude/nested.carbon b/toolchain/check/testdata/class/no_prelude/nested.carbon new file mode 100644 index 0000000000000..68543a9088f91 --- /dev/null +++ b/toolchain/check/testdata/class/no_prelude/nested.carbon @@ -0,0 +1,207 @@ +// Part of the Carbon Language project, under the Apache License v2.0 with LLVM +// Exceptions. See /LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// +// AUTOUPDATE +// TIP: To test this file alone, run: +// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/no_prelude/nested.carbon +// TIP: To dump output, run: +// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/no_prelude/nested.carbon + +// --- nested.carbon + +class Outer { + fn F() { + // Outer and Inner are both complete here. + var o: Outer; + var i: Inner; + } + + class Inner { + var pi: Self*; + var po: Outer*; + var qi: Inner*; + + fn G() { + // Outer and Inner are both complete here. + var o: Outer; + var i: Inner; + } + } + + fn H() { + // Outer and Inner are both complete here. + var o: Outer; + var i: Inner; + } + + var po: Self*; + var qo: Outer*; + var pi: Inner*; +} + +fn F(a: Outer*) { + //@dump-sem-ir-begin + let b: Outer.Inner* = (*a).pi; + + a->po = a; + a->qo = a; + a->pi = a->pi; + b->po = a; + b->pi = a->pi; + b->qi = a->pi; + //@dump-sem-ir-end +} + +// --- nested_name.carbon +// CHECK:STDERR: nested_name.carbon: error: `Main//default` previously provided by `nested.carbon` [DuplicateMainApi] +// CHECK:STDERR: + +class Outer { + //@dump-sem-ir-begin + class Inner { + var n: (); + } + //@dump-sem-ir-end +} + +fn F(oi: Outer.Inner) -> () { + //@dump-sem-ir-begin + return oi.n; + //@dump-sem-ir-end +} + +fn G(o: Outer) { + var i: o.Inner; +} + +// CHECK:STDOUT: --- nested.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %Outer: type = class_type @Outer [concrete] +// CHECK:STDOUT: %Inner: type = class_type @Inner [concrete] +// CHECK:STDOUT: %ptr.36a: type = ptr_type %Inner [concrete] +// CHECK:STDOUT: %Inner.elem.640: type = unbound_element_type %Inner, %ptr.36a [concrete] +// CHECK:STDOUT: %ptr.5df: type = ptr_type %Outer [concrete] +// CHECK:STDOUT: %Inner.elem.c30: type = unbound_element_type %Inner, %ptr.5df [concrete] +// CHECK:STDOUT: %Outer.elem.a16: type = unbound_element_type %Outer, %ptr.5df [concrete] +// CHECK:STDOUT: %Outer.elem.fe9: type = unbound_element_type %Outer, %ptr.36a [concrete] +// CHECK:STDOUT: %pattern_type.27f: type = pattern_type %ptr.36a [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @F.2(%a.param: %ptr.5df) { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %b.patt: %pattern_type.27f = binding_pattern b [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: %a.ref.loc34: %ptr.5df = name_ref a, %a +// CHECK:STDOUT: %.loc34_26: ref %Outer = deref %a.ref.loc34 +// CHECK:STDOUT: %pi.ref.loc34: %Outer.elem.fe9 = name_ref pi, @Outer.%.loc29 [concrete = @Outer.%.loc29] +// CHECK:STDOUT: %.loc34_29: ref %ptr.36a = class_element_access %.loc34_26, element2 +// CHECK:STDOUT: %.loc34_21: type = splice_block %ptr.loc34 [concrete = constants.%ptr.36a] { +// CHECK:STDOUT: %Outer.ref.loc34: type = name_ref Outer, file.%Outer.decl [concrete = constants.%Outer] +// CHECK:STDOUT: %Inner.ref: type = name_ref Inner, @Outer.%Inner.decl [concrete = constants.%Inner] +// CHECK:STDOUT: %ptr.loc34: type = ptr_type %Inner.ref [concrete = constants.%ptr.36a] +// CHECK:STDOUT: } +// CHECK:STDOUT: %b: ref %ptr.36a = bind_name b, %.loc34_29 +// CHECK:STDOUT: %a.ref.loc36_3: %ptr.5df = name_ref a, %a +// CHECK:STDOUT: %.loc36_4.1: ref %Outer = deref %a.ref.loc36_3 +// CHECK:STDOUT: %po.ref.loc36: %Outer.elem.a16 = name_ref po, @Outer.%.loc27 [concrete = @Outer.%.loc27] +// CHECK:STDOUT: %.loc36_4.2: ref %ptr.5df = class_element_access %.loc36_4.1, element0 +// CHECK:STDOUT: %a.ref.loc36_11: %ptr.5df = name_ref a, %a +// CHECK:STDOUT: assign %.loc36_4.2, %a.ref.loc36_11 +// CHECK:STDOUT: %a.ref.loc37_3: %ptr.5df = name_ref a, %a +// CHECK:STDOUT: %.loc37_4.1: ref %Outer = deref %a.ref.loc37_3 +// CHECK:STDOUT: %qo.ref: %Outer.elem.a16 = name_ref qo, @Outer.%.loc28 [concrete = @Outer.%.loc28] +// CHECK:STDOUT: %.loc37_4.2: ref %ptr.5df = class_element_access %.loc37_4.1, element1 +// CHECK:STDOUT: %a.ref.loc37_11: %ptr.5df = name_ref a, %a +// CHECK:STDOUT: assign %.loc37_4.2, %a.ref.loc37_11 +// CHECK:STDOUT: %a.ref.loc38_3: %ptr.5df = name_ref a, %a +// CHECK:STDOUT: %.loc38_4.1: ref %Outer = deref %a.ref.loc38_3 +// CHECK:STDOUT: %pi.ref.loc38_4: %Outer.elem.fe9 = name_ref pi, @Outer.%.loc29 [concrete = @Outer.%.loc29] +// CHECK:STDOUT: %.loc38_4.2: ref %ptr.36a = class_element_access %.loc38_4.1, element2 +// CHECK:STDOUT: %a.ref.loc38_11: %ptr.5df = name_ref a, %a +// CHECK:STDOUT: %.loc38_12.1: ref %Outer = deref %a.ref.loc38_11 +// CHECK:STDOUT: %pi.ref.loc38_12: %Outer.elem.fe9 = name_ref pi, @Outer.%.loc29 [concrete = @Outer.%.loc29] +// CHECK:STDOUT: %.loc38_12.2: ref %ptr.36a = class_element_access %.loc38_12.1, element2 +// CHECK:STDOUT: %.loc38_12.3: %ptr.36a = bind_value %.loc38_12.2 +// CHECK:STDOUT: assign %.loc38_4.2, %.loc38_12.3 +// CHECK:STDOUT: %b.ref.loc39: ref %ptr.36a = name_ref b, %b +// CHECK:STDOUT: %.loc39_3: %ptr.36a = bind_value %b.ref.loc39 +// CHECK:STDOUT: %.loc39_4.1: ref %Inner = deref %.loc39_3 +// CHECK:STDOUT: %po.ref.loc39: %Inner.elem.c30 = name_ref po, @Inner.%.loc11 [concrete = @Inner.%.loc11] +// CHECK:STDOUT: %.loc39_4.2: ref %ptr.5df = class_element_access %.loc39_4.1, element1 +// CHECK:STDOUT: %a.ref.loc39: %ptr.5df = name_ref a, %a +// CHECK:STDOUT: assign %.loc39_4.2, %a.ref.loc39 +// CHECK:STDOUT: %b.ref.loc40: ref %ptr.36a = name_ref b, %b +// CHECK:STDOUT: %.loc40_3: %ptr.36a = bind_value %b.ref.loc40 +// CHECK:STDOUT: %.loc40_4.1: ref %Inner = deref %.loc40_3 +// CHECK:STDOUT: %pi.ref.loc40_4: %Inner.elem.640 = name_ref pi, @Inner.%.loc10 [concrete = @Inner.%.loc10] +// CHECK:STDOUT: %.loc40_4.2: ref %ptr.36a = class_element_access %.loc40_4.1, element0 +// CHECK:STDOUT: %a.ref.loc40: %ptr.5df = name_ref a, %a +// CHECK:STDOUT: %.loc40_12.1: ref %Outer = deref %a.ref.loc40 +// CHECK:STDOUT: %pi.ref.loc40_12: %Outer.elem.fe9 = name_ref pi, @Outer.%.loc29 [concrete = @Outer.%.loc29] +// CHECK:STDOUT: %.loc40_12.2: ref %ptr.36a = class_element_access %.loc40_12.1, element2 +// CHECK:STDOUT: %.loc40_12.3: %ptr.36a = bind_value %.loc40_12.2 +// CHECK:STDOUT: assign %.loc40_4.2, %.loc40_12.3 +// CHECK:STDOUT: %b.ref.loc41: ref %ptr.36a = name_ref b, %b +// CHECK:STDOUT: %.loc41_3: %ptr.36a = bind_value %b.ref.loc41 +// CHECK:STDOUT: %.loc41_4.1: ref %Inner = deref %.loc41_3 +// CHECK:STDOUT: %qi.ref: %Inner.elem.640 = name_ref qi, @Inner.%.loc12 [concrete = @Inner.%.loc12] +// CHECK:STDOUT: %.loc41_4.2: ref %ptr.36a = class_element_access %.loc41_4.1, element2 +// CHECK:STDOUT: %a.ref.loc41: %ptr.5df = name_ref a, %a +// CHECK:STDOUT: %.loc41_12.1: ref %Outer = deref %a.ref.loc41 +// CHECK:STDOUT: %pi.ref.loc41: %Outer.elem.fe9 = name_ref pi, @Outer.%.loc29 [concrete = @Outer.%.loc29] +// CHECK:STDOUT: %.loc41_12.2: ref %ptr.36a = class_element_access %.loc41_12.1, element2 +// CHECK:STDOUT: %.loc41_12.3: %ptr.36a = bind_value %.loc41_12.2 +// CHECK:STDOUT: assign %.loc41_4.2, %.loc41_12.3 +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: --- nested_name.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %Outer: type = class_type @Outer [concrete] +// CHECK:STDOUT: %Inner: type = class_type @Inner [concrete] +// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] +// CHECK:STDOUT: %Inner.elem: type = unbound_element_type %Inner, %empty_tuple.type [concrete] +// CHECK:STDOUT: %struct_type.n: type = struct_type {.n: %empty_tuple.type} [concrete] +// CHECK:STDOUT: %complete_type.880: = complete_type_witness %struct_type.n [concrete] +// CHECK:STDOUT: %empty_tuple: %empty_tuple.type = tuple_value () [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: class @Outer { +// CHECK:STDOUT: %Inner.decl: type = class_decl @Inner [concrete = constants.%Inner] {} {} +// CHECK:STDOUT: +// CHECK:STDOUT: complete_type_witness = %complete_type +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = constants.%Outer +// CHECK:STDOUT: .Inner = %Inner.decl +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: class @Inner { +// CHECK:STDOUT: %.loc7_13.1: %empty_tuple.type = tuple_literal () +// CHECK:STDOUT: %.loc7_13.2: type = converted %.loc7_13.1, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] +// CHECK:STDOUT: %.loc7_10: %Inner.elem = field_decl n, element0 [concrete] +// CHECK:STDOUT: %struct_type.n: type = struct_type {.n: %empty_tuple.type} [concrete = constants.%struct_type.n] +// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.n [concrete = constants.%complete_type.880] +// CHECK:STDOUT: complete_type_witness = %complete_type +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = constants.%Inner +// CHECK:STDOUT: .n = %.loc7_10 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @F(%oi.param: %Inner) -> %empty_tuple.type { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %oi.ref: %Inner = name_ref oi, %oi +// CHECK:STDOUT: %n.ref: %Inner.elem = name_ref n, @Inner.%.loc7_10 [concrete = @Inner.%.loc7_10] +// CHECK:STDOUT: %.loc14_12.1: ref %empty_tuple.type = class_element_access %oi.ref, element0 +// CHECK:STDOUT: %tuple: %empty_tuple.type = tuple_value () [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc14_12.2: %empty_tuple.type = converted %.loc14_12.1, %tuple [concrete = constants.%empty_tuple] +// CHECK:STDOUT: return %.loc14_12.2 +// CHECK:STDOUT: } +// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/no_prelude/no_definition_in_impl_file.carbon b/toolchain/check/testdata/class/no_prelude/no_definition_in_impl_file.carbon index caa913a2df151..18afd18651de7 100644 --- a/toolchain/check/testdata/class/no_prelude/no_definition_in_impl_file.carbon +++ b/toolchain/check/testdata/class/no_prelude/no_definition_in_impl_file.carbon @@ -2,6 +2,8 @@ // Exceptions. See /LICENSE for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// // AUTOUPDATE // TIP: To test this file alone, run: // TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/no_prelude/no_definition_in_impl_file.carbon @@ -71,156 +73,3 @@ impl library "[[@TEST_NAME]]"; // CHECK:STDERR: ^~~~~~~~ // CHECK:STDERR: class D; - -// CHECK:STDOUT: --- decl_in_api_definition_in_impl.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %A: type = class_type @A [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .A = %A.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %A.decl: type = class_decl @A [concrete = constants.%A] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @A; -// CHECK:STDOUT: -// CHECK:STDOUT: --- decl_in_api_definition_in_impl.impl.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %A: type = class_type @A [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .A = %A.decl.loc4 -// CHECK:STDOUT: } -// CHECK:STDOUT: %default.import.loc2_46.1 = import -// CHECK:STDOUT: %default.import.loc2_46.2 = import -// CHECK:STDOUT: %A.decl.loc4: type = class_decl @A [concrete = constants.%A] {} {} -// CHECK:STDOUT: %A.decl.loc6: type = class_decl @A [concrete = constants.%A] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @A { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%A -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- use_decl_in_api.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- use_decl_in_api.impl.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Main.A = import_ref Main//decl_in_api_definition_in_impl, A, unloaded -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .A = imports.%Main.A -// CHECK:STDOUT: } -// CHECK:STDOUT: %default.import.loc2_31.1 = import -// CHECK:STDOUT: %default.import.loc2_31.2 = import -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- decl_only_in_api.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %B: type = class_type @B [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .B = %B.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %B.decl: type = class_decl @B [concrete = constants.%B] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @B; -// CHECK:STDOUT: -// CHECK:STDOUT: --- decl_only_in_api.impl.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Main.B = import_ref Main//decl_only_in_api, B, unloaded -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .B = imports.%Main.B -// CHECK:STDOUT: } -// CHECK:STDOUT: %default.import.loc2_32.1 = import -// CHECK:STDOUT: %default.import.loc2_32.2 = import -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- decl_in_api_decl_in_impl.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C; -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_decl_in_api_decl_in_impl.impl.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %default.import.loc2_40.1 = import -// CHECK:STDOUT: %default.import.loc2_40.2 = import -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C; -// CHECK:STDOUT: -// CHECK:STDOUT: --- decl_only_in_impl.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_decl_only_in_impl.impl.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %D: type = class_type @D [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .D = %D.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %default.import.loc2_33.1 = import -// CHECK:STDOUT: %default.import.loc2_33.2 = import -// CHECK:STDOUT: %D.decl: type = class_decl @D [concrete = constants.%D] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @D; -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/no_prelude/raw_self.carbon b/toolchain/check/testdata/class/no_prelude/raw_self.carbon new file mode 100644 index 0000000000000..4842af24afa93 --- /dev/null +++ b/toolchain/check/testdata/class/no_prelude/raw_self.carbon @@ -0,0 +1,46 @@ +// Part of the Carbon Language project, under the Apache License v2.0 with LLVM +// Exceptions. See /LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// +// AUTOUPDATE +// TIP: To test this file alone, run: +// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/no_prelude/raw_self.carbon +// TIP: To dump output, run: +// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/no_prelude/raw_self.carbon + +// --- raw_self.carbon +library "[[@TEST_NAME]]"; + +class Class { + fn F[addr self: Self*](r#self: ()); + fn G[self: Self](r#self: ()) -> ((), ()); + var n: (); +} + +fn Class.F[addr self: Self*](r#self: ()) { + (*self).n = r#self; +} + +fn Class.G[self: Self](r#self: ()) -> ((), ()) { + return (self.n, r#self); +} + +// --- raw_self_type.carbon +library "[[@TEST_NAME]]"; + +class Class { + fn F() { + var r#Self: Self*; + var p: Self* = r#Self; + } +} + +class MemberNamedSelf { + class r#Self {} + + fn F(x: Self, y: r#Self); +} + +fn MemberNamedSelf.F(x: Self, y: r#Self) {} diff --git a/toolchain/check/testdata/class/no_prelude/redeclaration.carbon b/toolchain/check/testdata/class/no_prelude/redeclaration.carbon new file mode 100644 index 0000000000000..a58b813216951 --- /dev/null +++ b/toolchain/check/testdata/class/no_prelude/redeclaration.carbon @@ -0,0 +1,208 @@ +// Part of the Carbon Language project, under the Apache License v2.0 with LLVM +// Exceptions. See /LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// +// AUTOUPDATE +// TIP: To test this file alone, run: +// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/no_prelude/redeclaration.carbon +// TIP: To dump output, run: +// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/no_prelude/redeclaration.carbon + +// --- redeclaration.carbon +library "[[@TEST_NAME]]"; + +//@dump-sem-ir-begin +class Class; + +class Class { + fn F[self: Self](b: ()); +} + +fn Class.F[self: Self](b: ()) {} +//@dump-sem-ir-end + +// --- redeclaration_introducer.carbon +library "[[@TEST_NAME]]"; + +//@dump-sem-ir-begin +class A; +class B; +class C; + +class A {} +base class B {} +abstract class C {} +//@dump-sem-ir-end + +// --- fail_redeclaration_scope.carbon +library "[[@TEST_NAME]]"; + +class A; + +class X { + // OK, a different A. + class A { class B; } + class A.B {} +} + +class A { class B; } + +class Y { + // CHECK:STDERR: fail_redeclaration_scope.carbon:[[@LINE+4]]:9: error: name `A` not found [NameNotFound] + // CHECK:STDERR: class A.B {} + // CHECK:STDERR: ^ + // CHECK:STDERR: + class A.B {} +} + +// --- fail_redefinition.carbon +library "[[@TEST_NAME]]"; + +class Class { + fn F(); + fn H(); + fn I() {} +} + +// CHECK:STDERR: fail_redefinition.carbon:[[@LINE+7]]:1: error: redefinition of `class Class` [RedeclRedef] +// CHECK:STDERR: class Class { +// CHECK:STDERR: ^~~~~~~~~~~~~ +// CHECK:STDERR: fail_redefinition.carbon:[[@LINE-9]]:1: note: previously defined here [RedeclPrevDef] +// CHECK:STDERR: class Class { +// CHECK:STDERR: ^~~~~~~~~~~~~ +// CHECK:STDERR: +class Class { + fn G(); + fn H(); + fn I() {} +} + +fn Class.F() {} +// CHECK:STDERR: fail_redefinition.carbon:[[@LINE+4]]:10: error: out-of-line declaration requires a declaration in scoped entity [QualifiedDeclOutsideScopeEntity] +// CHECK:STDERR: fn Class.G() {} +// CHECK:STDERR: ^ +// CHECK:STDERR: +fn Class.G() {} +fn Class.H() {} +// CHECK:STDERR: fail_redefinition.carbon:[[@LINE+7]]:1: error: redefinition of `fn I` [RedeclRedef] +// CHECK:STDERR: fn Class.I() {} +// CHECK:STDERR: ^~~~~~~~~~~~~~ +// CHECK:STDERR: fail_redefinition.carbon:[[@LINE-26]]:3: note: previously defined here [RedeclPrevDef] +// CHECK:STDERR: fn I() {} +// CHECK:STDERR: ^~~~~~~~ +// CHECK:STDERR: +fn Class.I() {} + +// CHECK:STDOUT: --- redeclaration.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %Class: type = class_type @Class [concrete] +// CHECK:STDOUT: %pattern_type.761: type = pattern_type %Class [concrete] +// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] +// CHECK:STDOUT: %pattern_type.cb1: type = pattern_type %empty_tuple.type [concrete] +// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] +// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] +// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] +// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: file { +// CHECK:STDOUT: %Class.decl.loc4: type = class_decl @Class [concrete = constants.%Class] {} {} +// CHECK:STDOUT: %Class.decl.loc6: type = class_decl @Class [concrete = constants.%Class] {} {} +// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { +// CHECK:STDOUT: %self.patt: %pattern_type.761 = binding_pattern self [concrete] +// CHECK:STDOUT: %self.param_patt: %pattern_type.761 = value_param_pattern %self.patt, call_param0 [concrete] +// CHECK:STDOUT: %b.patt: %pattern_type.cb1 = binding_pattern b [concrete] +// CHECK:STDOUT: %b.param_patt: %pattern_type.cb1 = value_param_pattern %b.patt, call_param1 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %self.param.loc10: %Class = value_param call_param0 +// CHECK:STDOUT: %Self.ref.loc10: type = name_ref Self, constants.%Class [concrete = constants.%Class] +// CHECK:STDOUT: %self.loc10: %Class = bind_name self, %self.param.loc10 +// CHECK:STDOUT: %b.param.loc10: %empty_tuple.type = value_param call_param1 +// CHECK:STDOUT: %.loc10_28.1: type = splice_block %.loc10_28.3 [concrete = constants.%empty_tuple.type] { +// CHECK:STDOUT: %.loc10_28.2: %empty_tuple.type = tuple_literal () +// CHECK:STDOUT: %.loc10_28.3: type = converted %.loc10_28.2, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] +// CHECK:STDOUT: } +// CHECK:STDOUT: %b.loc10: %empty_tuple.type = bind_name b, %b.param.loc10 +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: class @Class { +// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { +// CHECK:STDOUT: %self.patt: %pattern_type.761 = binding_pattern self [concrete] +// CHECK:STDOUT: %self.param_patt: %pattern_type.761 = value_param_pattern %self.patt, call_param0 [concrete] +// CHECK:STDOUT: %b.patt: %pattern_type.cb1 = binding_pattern b [concrete] +// CHECK:STDOUT: %b.param_patt: %pattern_type.cb1 = value_param_pattern %b.patt, call_param1 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %self.param.loc7: %Class = value_param call_param0 +// CHECK:STDOUT: %Self.ref.loc7: type = name_ref Self, constants.%Class [concrete = constants.%Class] +// CHECK:STDOUT: %self.loc7: %Class = bind_name self, %self.param.loc7 +// CHECK:STDOUT: %b.param.loc7: %empty_tuple.type = value_param call_param1 +// CHECK:STDOUT: %.loc7_24.1: type = splice_block %.loc7_24.3 [concrete = constants.%empty_tuple.type] { +// CHECK:STDOUT: %.loc7_24.2: %empty_tuple.type = tuple_literal () +// CHECK:STDOUT: %.loc7_24.3: type = converted %.loc7_24.2, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] +// CHECK:STDOUT: } +// CHECK:STDOUT: %b.loc7: %empty_tuple.type = bind_name b, %b.param.loc7 +// CHECK:STDOUT: } +// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] +// CHECK:STDOUT: %complete_type: = 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.%Class +// CHECK:STDOUT: .F = %F.decl +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @F(%self.param.loc10: %Class, %b.param.loc10: %empty_tuple.type) { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: return +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: --- redeclaration_introducer.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %A: type = class_type @A [concrete] +// CHECK:STDOUT: %B: type = class_type @B [concrete] +// CHECK:STDOUT: %C: type = class_type @C [concrete] +// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] +// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: file { +// CHECK:STDOUT: %A.decl.loc4: type = class_decl @A [concrete = constants.%A] {} {} +// CHECK:STDOUT: %B.decl.loc5: type = class_decl @B [concrete = constants.%B] {} {} +// CHECK:STDOUT: %C.decl.loc6: type = class_decl @C [concrete = constants.%C] {} {} +// CHECK:STDOUT: %A.decl.loc8: type = class_decl @A [concrete = constants.%A] {} {} +// CHECK:STDOUT: %B.decl.loc9: type = class_decl @B [concrete = constants.%B] {} {} +// CHECK:STDOUT: %C.decl.loc10: type = class_decl @C [concrete = constants.%C] {} {} +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: class @A { +// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] +// CHECK:STDOUT: %complete_type: = 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.%A +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: class @B { +// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] +// CHECK:STDOUT: %complete_type: = 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.%B +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: class @C { +// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] +// CHECK:STDOUT: %complete_type: = 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: } +// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/no_prelude/reorder.carbon b/toolchain/check/testdata/class/no_prelude/reorder.carbon new file mode 100644 index 0000000000000..ddf8b8aaee5fd --- /dev/null +++ b/toolchain/check/testdata/class/no_prelude/reorder.carbon @@ -0,0 +1,65 @@ +// Part of the Carbon Language project, under the Apache License v2.0 with LLVM +// Exceptions. See /LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// +// AUTOUPDATE +// TIP: To test this file alone, run: +// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/no_prelude/reorder.carbon +// TIP: To dump output, run: +// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/no_prelude/reorder.carbon + +// --- reorder.carbon +library "[[@TEST_NAME]]"; + +class Class { + fn G() -> () { + return Class.F(); + } + + fn F() -> () { + return (); + } +} + +// --- reorder_qualified.carbon +library "[[@TEST_NAME]]"; + +class A { + class B { + class C; + + fn BF(); + var b: (); + } + + class B.C { + class D { + fn F(); + + fn DF(); + var d: (); + } + + fn D.DF() { + // A, B, C, and D are complete here. + var a: A = {.a = ()}; + var b: B = {.b = ()}; + var c: C = {.c = ()}; + var d: D = {.d = ()}; + + // Unqualified lookup looks in all of them. + AF(); + BF(); + CF(); + DF(); + } + + fn CF(); + var c: (); + } + + fn AF(); + var a: (); +} diff --git a/toolchain/check/testdata/class/no_prelude/scope.carbon b/toolchain/check/testdata/class/no_prelude/scope.carbon new file mode 100644 index 0000000000000..c1df30ef51ae8 --- /dev/null +++ b/toolchain/check/testdata/class/no_prelude/scope.carbon @@ -0,0 +1,63 @@ +// Part of the Carbon Language project, under the Apache License v2.0 with LLVM +// Exceptions. See /LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// +// AUTOUPDATE +// TIP: To test this file alone, run: +// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/no_prelude/scope.carbon +// TIP: To dump output, run: +// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/no_prelude/scope.carbon + +// --- scope.carbon +library "[[@TEST_NAME]]"; + +class Class { + fn F() -> () { + return (); + } + + fn G() -> () { + return F(); + } +} + +fn F() -> () { + return (); +} + +fn Run() { + var a: () = F(); + var b: () = Class.F(); +} + +// --- reenter_scope.carbon +library "[[@TEST_NAME]]"; + +class Class { + fn F() -> (); + fn G() -> (); +} + +fn Class.F() -> () { + Self.G(); + return G(); +} + +// --- fail_out_of_scope.carbon +library "[[@TEST_NAME]]"; + +class Class { + fn F() -> () { + return (); + } +} + +fn G() -> () { + // CHECK:STDERR: fail_out_of_scope.carbon:[[@LINE+4]]:10: error: name `F` not found [NameNotFound] + // CHECK:STDERR: return F(); + // CHECK:STDERR: ^ + // CHECK:STDERR: + return F(); +} diff --git a/toolchain/check/testdata/class/no_prelude/syntactic_merge.carbon b/toolchain/check/testdata/class/no_prelude/syntactic_merge.carbon index 855d240293383..85d3cdb7c003b 100644 --- a/toolchain/check/testdata/class/no_prelude/syntactic_merge.carbon +++ b/toolchain/check/testdata/class/no_prelude/syntactic_merge.carbon @@ -2,6 +2,8 @@ // Exceptions. See /LICENSE for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // +// EXTRA-ARGS: --dump-sem-ir-ranges=only +// // AUTOUPDATE // TIP: To test this file alone, run: // TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/no_prelude/syntactic_merge.carbon @@ -179,956 +181,3 @@ base class Base { fn Base.F[addr self: Base*]() { (*self).a = (); } - -// CHECK:STDOUT: --- basic.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %a: %C = bind_symbolic_name a, 0 [symbolic] -// CHECK:STDOUT: %pattern_type: type = pattern_type %C [concrete] -// CHECK:STDOUT: %Foo.type: type = generic_class_type @Foo [concrete] -// CHECK:STDOUT: %Foo.generic: %Foo.type = struct_value () [concrete] -// CHECK:STDOUT: %Foo: type = class_type @Foo, @Foo(%a) [symbolic] -// CHECK:STDOUT: %Bar.type: type = generic_class_type @Bar [concrete] -// CHECK:STDOUT: %Bar.generic: %Bar.type = struct_value () [concrete] -// CHECK:STDOUT: %Bar: type = class_type @Bar, @Bar(%a) [symbolic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: .D = %D -// CHECK:STDOUT: .Foo = %Foo.decl.loc7 -// CHECK:STDOUT: .Bar = %Bar.decl.loc10 -// CHECK:STDOUT: } -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: %C.ref: type = name_ref C, %C.decl [concrete = constants.%C] -// CHECK:STDOUT: %D: type = bind_alias D, %C.decl [concrete = constants.%C] -// CHECK:STDOUT: %Foo.decl.loc7: %Foo.type = class_decl @Foo [concrete = constants.%Foo.generic] { -// CHECK:STDOUT: %a.patt: %pattern_type = symbolic_binding_pattern a, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %C.ref.loc7: type = name_ref C, file.%C.decl [concrete = constants.%C] -// CHECK:STDOUT: %a.loc7_11.1: %C = bind_symbolic_name a, 0 [symbolic = %a.loc7_11.2 (constants.%a)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %Foo.decl.loc8: %Foo.type = class_decl @Foo [concrete = constants.%Foo.generic] { -// CHECK:STDOUT: %a.patt: %pattern_type = symbolic_binding_pattern a, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %C.ref.loc8: type = name_ref C, file.%C.decl [concrete = constants.%C] -// CHECK:STDOUT: %a.loc8: %C = bind_symbolic_name a, 0 [symbolic = %a.loc7_11.2 (constants.%a)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %Bar.decl.loc10: %Bar.type = class_decl @Bar [concrete = constants.%Bar.generic] { -// CHECK:STDOUT: %a.patt: %pattern_type = symbolic_binding_pattern a, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %D.ref.loc10: type = name_ref D, file.%D [concrete = constants.%C] -// CHECK:STDOUT: %a.loc10_11.1: %C = bind_symbolic_name a, 0 [symbolic = %a.loc10_11.2 (constants.%a)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %Bar.decl.loc11: %Bar.type = class_decl @Bar [concrete = constants.%Bar.generic] { -// CHECK:STDOUT: %a.patt: %pattern_type = symbolic_binding_pattern a, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %D.ref.loc11: type = name_ref D, file.%D [concrete = constants.%C] -// CHECK:STDOUT: %a.loc11: %C = bind_symbolic_name a, 0 [symbolic = %a.loc10_11.2 (constants.%a)] -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Foo(%a.loc7_11.1: %C) { -// CHECK:STDOUT: %a.loc7_11.2: %C = bind_symbolic_name a, 0 [symbolic = %a.loc7_11.2 (constants.%a)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Foo -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Bar(%a.loc10_11.1: %C) { -// CHECK:STDOUT: %a.loc10_11.2: %C = bind_symbolic_name a, 0 [symbolic = %a.loc10_11.2 (constants.%a)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Bar -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Foo(constants.%a) { -// CHECK:STDOUT: %a.loc7_11.2 => constants.%a -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Bar(constants.%a) { -// CHECK:STDOUT: %a.loc10_11.2 => constants.%a -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- spacing.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %a: %C = bind_symbolic_name a, 0 [symbolic] -// CHECK:STDOUT: %pattern_type: type = pattern_type %C [concrete] -// CHECK:STDOUT: %Foo.type: type = generic_class_type @Foo [concrete] -// CHECK:STDOUT: %Foo.generic: %Foo.type = struct_value () [concrete] -// CHECK:STDOUT: %Foo: type = class_type @Foo, @Foo(%a) [symbolic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: .Foo = %Foo.decl.loc6 -// CHECK:STDOUT: } -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: %Foo.decl.loc6: %Foo.type = class_decl @Foo [concrete = constants.%Foo.generic] { -// CHECK:STDOUT: %a.patt: %pattern_type = symbolic_binding_pattern a, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %C.ref.loc6: type = name_ref C, file.%C.decl [concrete = constants.%C] -// CHECK:STDOUT: %a.loc6_17.1: %C = bind_symbolic_name a, 0 [symbolic = %a.loc6_17.2 (constants.%a)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %Foo.decl.loc7: %Foo.type = class_decl @Foo [concrete = constants.%Foo.generic] { -// CHECK:STDOUT: %a.patt: %pattern_type = symbolic_binding_pattern a, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %C.ref.loc7: type = name_ref C, file.%C.decl [concrete = constants.%C] -// CHECK:STDOUT: %a.loc7: %C = bind_symbolic_name a, 0 [symbolic = %a.loc6_17.2 (constants.%a)] -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Foo(%a.loc6_17.1: %C) { -// CHECK:STDOUT: %a.loc6_17.2: %C = bind_symbolic_name a, 0 [symbolic = %a.loc6_17.2 (constants.%a)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Foo -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Foo(constants.%a) { -// CHECK:STDOUT: %a.loc6_17.2 => constants.%a -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_parens.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %a: %C = bind_symbolic_name a, 0 [symbolic] -// CHECK:STDOUT: %pattern_type: type = pattern_type %C [concrete] -// CHECK:STDOUT: %Foo.type.39e446.1: type = generic_class_type @Foo.1 [concrete] -// CHECK:STDOUT: %Foo.generic.80461b.1: %Foo.type.39e446.1 = struct_value () [concrete] -// CHECK:STDOUT: %Foo.type.39e446.2: type = generic_class_type @Foo.2 [concrete] -// CHECK:STDOUT: %Foo.generic.80461b.2: %Foo.type.39e446.2 = struct_value () [concrete] -// CHECK:STDOUT: %Foo.67ab7c.2: type = class_type @Foo.2, @Foo.2(%a) [symbolic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: .Foo = %Foo.decl.loc6 -// CHECK:STDOUT: } -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: %Foo.decl.loc6: %Foo.type.39e446.1 = class_decl @Foo.1 [concrete = constants.%Foo.generic.80461b.1] { -// CHECK:STDOUT: %a.patt: %pattern_type = symbolic_binding_pattern a, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %C.ref: type = name_ref C, file.%C.decl [concrete = constants.%C] -// CHECK:STDOUT: %a.loc6_11.1: %C = bind_symbolic_name a, 0 [symbolic = %a.loc6_11.2 (constants.%a)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %Foo.decl.loc14: %Foo.type.39e446.2 = class_decl @Foo.2 [concrete = constants.%Foo.generic.80461b.2] { -// CHECK:STDOUT: %a.patt: %pattern_type = symbolic_binding_pattern a, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %C.ref: type = name_ref C, file.%C.decl [concrete = constants.%C] -// CHECK:STDOUT: %a.loc14_11.1: %C = bind_symbolic_name a, 0 [symbolic = %a.loc14_11.2 (constants.%a)] -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Foo.1(%a.loc6_11.1: %C) { -// CHECK:STDOUT: %a.loc6_11.2: %C = bind_symbolic_name a, 0 [symbolic = %a.loc6_11.2 (constants.%a)] -// CHECK:STDOUT: -// CHECK:STDOUT: class; -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Foo.2(%a.loc14_11.1: %C) { -// CHECK:STDOUT: %a.loc14_11.2: %C = bind_symbolic_name a, 0 [symbolic = %a.loc14_11.2 (constants.%a)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Foo.67ab7c.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Foo.1(constants.%a) { -// CHECK:STDOUT: %a.loc6_11.2 => constants.%a -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Foo.2(constants.%a) { -// CHECK:STDOUT: %a.loc14_11.2 => constants.%a -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- todo_fail_raw_identifier.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %a: %C = bind_symbolic_name a, 0 [symbolic] -// CHECK:STDOUT: %pattern_type: type = pattern_type %C [concrete] -// CHECK:STDOUT: %Foo.type: type = generic_class_type @Foo [concrete] -// CHECK:STDOUT: %Foo.generic: %Foo.type = struct_value () [concrete] -// CHECK:STDOUT: %Foo: type = class_type @Foo, @Foo(%a) [symbolic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: .Foo = %Foo.decl.loc6 -// CHECK:STDOUT: } -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: %Foo.decl.loc6: %Foo.type = class_decl @Foo [concrete = constants.%Foo.generic] { -// CHECK:STDOUT: %a.patt: %pattern_type = symbolic_binding_pattern a, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %C.ref.loc6: type = name_ref C, file.%C.decl [concrete = constants.%C] -// CHECK:STDOUT: %a.loc6_11.1: %C = bind_symbolic_name a, 0 [symbolic = %a.loc6_11.2 (constants.%a)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %Foo.decl.loc7: %Foo.type = class_decl @Foo [concrete = constants.%Foo.generic] { -// CHECK:STDOUT: %a.patt: %pattern_type = symbolic_binding_pattern a, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %C.ref.loc7: type = name_ref C, file.%C.decl [concrete = constants.%C] -// CHECK:STDOUT: %a.loc7: %C = bind_symbolic_name a, 0 [symbolic = %a.loc6_11.2 (constants.%a)] -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Foo(%a.loc6_11.1: %C) { -// CHECK:STDOUT: %a.loc6_11.2: %C = bind_symbolic_name a, 0 [symbolic = %a.loc6_11.2 (constants.%a)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Foo -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Foo(constants.%a) { -// CHECK:STDOUT: %a.loc6_11.2 => constants.%a -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- two_file.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %a: %C = bind_symbolic_name a, 0 [symbolic] -// CHECK:STDOUT: %pattern_type: type = pattern_type %C [concrete] -// CHECK:STDOUT: %Foo.type: type = generic_class_type @Foo [concrete] -// CHECK:STDOUT: %Foo.generic: %Foo.type = struct_value () [concrete] -// CHECK:STDOUT: %Bar.type: type = generic_class_type @Bar [concrete] -// CHECK:STDOUT: %Bar.generic: %Bar.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: .D = %D -// CHECK:STDOUT: .Foo = %Foo.decl -// CHECK:STDOUT: .Bar = %Bar.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: %C.ref: type = name_ref C, %C.decl [concrete = constants.%C] -// CHECK:STDOUT: %D: type = bind_alias D, %C.decl [concrete = constants.%C] -// CHECK:STDOUT: %Foo.decl: %Foo.type = class_decl @Foo [concrete = constants.%Foo.generic] { -// CHECK:STDOUT: %a.patt: %pattern_type = symbolic_binding_pattern a, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %C.ref: type = name_ref C, file.%C.decl [concrete = constants.%C] -// CHECK:STDOUT: %a.loc7_11.1: %C = bind_symbolic_name a, 0 [symbolic = %a.loc7_11.2 (constants.%a)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %Bar.decl: %Bar.type = class_decl @Bar [concrete = constants.%Bar.generic] { -// CHECK:STDOUT: %a.patt: %pattern_type = symbolic_binding_pattern a, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %D.ref: type = name_ref D, file.%D [concrete = constants.%C] -// CHECK:STDOUT: %a.loc8_11.1: %C = bind_symbolic_name a, 0 [symbolic = %a.loc8_11.2 (constants.%a)] -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Foo(%a.loc7_11.1: %C) { -// CHECK:STDOUT: %a.loc7_11.2: %C = bind_symbolic_name a, 0 [symbolic = %a.loc7_11.2 (constants.%a)] -// CHECK:STDOUT: -// CHECK:STDOUT: class; -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Bar(%a.loc8_11.1: %C) { -// CHECK:STDOUT: %a.loc8_11.2: %C = bind_symbolic_name a, 0 [symbolic = %a.loc8_11.2 (constants.%a)] -// CHECK:STDOUT: -// CHECK:STDOUT: class; -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Foo(constants.%a) { -// CHECK:STDOUT: %a.loc7_11.2 => constants.%a -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Bar(constants.%a) { -// CHECK:STDOUT: %a.loc8_11.2 => constants.%a -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- two_file.impl.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %a: %C = bind_symbolic_name a, 0 [symbolic] -// CHECK:STDOUT: %pattern_type: type = pattern_type %C [concrete] -// CHECK:STDOUT: %Foo.type: type = generic_class_type @Foo [concrete] -// CHECK:STDOUT: %Foo.generic: %Foo.type = struct_value () [concrete] -// CHECK:STDOUT: %Foo: type = class_type @Foo, @Foo(%a) [symbolic] -// CHECK:STDOUT: %Bar.type: type = generic_class_type @Bar [concrete] -// CHECK:STDOUT: %Bar.generic: %Bar.type = struct_value () [concrete] -// CHECK:STDOUT: %Bar: type = class_type @Bar, @Bar(%a) [symbolic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Main.C: type = import_ref Main//two_file, C, loaded [concrete = constants.%C] -// CHECK:STDOUT: %Main.D: type = import_ref Main//two_file, D, loaded [concrete = constants.%C] -// CHECK:STDOUT: %Main.import_ref.8f2: = import_ref Main//two_file, loc4_10, loaded [concrete = constants.%complete_type] -// CHECK:STDOUT: %Main.import_ref.2c4 = import_ref Main//two_file, inst16 [no loc], unloaded -// CHECK:STDOUT: %Main.import_ref.f97b44.1: %C = import_ref Main//two_file, loc7_11, loaded [symbolic = @Foo.%a.1 (constants.%a)] -// CHECK:STDOUT: %Main.import_ref.f97b44.2: %C = import_ref Main//two_file, loc8_11, loaded [symbolic = @Bar.%a.1 (constants.%a)] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .C = imports.%Main.C -// CHECK:STDOUT: .D = imports.%Main.D -// CHECK:STDOUT: .Foo = %Foo.decl -// CHECK:STDOUT: .Bar = %Bar.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %default.import.loc2_24.1 = import -// CHECK:STDOUT: %default.import.loc2_24.2 = import -// CHECK:STDOUT: %Foo.decl: %Foo.type = class_decl @Foo [concrete = constants.%Foo.generic] { -// CHECK:STDOUT: %a.patt: %pattern_type = symbolic_binding_pattern a, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %C.ref: type = name_ref C, imports.%Main.C [concrete = constants.%C] -// CHECK:STDOUT: %a.loc4: %C = bind_symbolic_name a, 0 [symbolic = %a.1 (constants.%a)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %Bar.decl: %Bar.type = class_decl @Bar [concrete = constants.%Bar.generic] { -// CHECK:STDOUT: %a.patt: %pattern_type = symbolic_binding_pattern a, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %D.ref: type = name_ref D, imports.%Main.D [concrete = constants.%C] -// CHECK:STDOUT: %a.loc5: %C = bind_symbolic_name a, 0 [symbolic = %a.1 (constants.%a)] -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C [from "two_file.carbon"] { -// CHECK:STDOUT: complete_type_witness = imports.%Main.import_ref.8f2 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Main.import_ref.2c4 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Foo(imports.%Main.import_ref.f97b44.1: %C) { -// CHECK:STDOUT: %a.1: %C = bind_symbolic_name a, 0 [symbolic = %a.1 (constants.%a)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Foo -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Bar(imports.%Main.import_ref.f97b44.2: %C) { -// CHECK:STDOUT: %a.1: %C = bind_symbolic_name a, 0 [symbolic = %a.1 (constants.%a)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Bar -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Foo(constants.%a) { -// CHECK:STDOUT: %a.1 => constants.%a -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Bar(constants.%a) { -// CHECK:STDOUT: %a.1 => constants.%a -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_name_mismatch.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %a: %C = bind_symbolic_name a, 0 [symbolic] -// CHECK:STDOUT: %pattern_type: type = pattern_type %C [concrete] -// CHECK:STDOUT: %Foo.type.39e446.1: type = generic_class_type @Foo.1 [concrete] -// CHECK:STDOUT: %Foo.generic.80461b.1: %Foo.type.39e446.1 = struct_value () [concrete] -// CHECK:STDOUT: %b: %C = bind_symbolic_name b, 0 [symbolic] -// CHECK:STDOUT: %Foo.type.39e446.2: type = generic_class_type @Foo.2 [concrete] -// CHECK:STDOUT: %Foo.generic.80461b.2: %Foo.type.39e446.2 = struct_value () [concrete] -// CHECK:STDOUT: %Foo.67ab7c.2: type = class_type @Foo.2, @Foo.2(%b) [symbolic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: .D = %D -// CHECK:STDOUT: .Foo = %Foo.decl.loc7 -// CHECK:STDOUT: } -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: %C.ref: type = name_ref C, %C.decl [concrete = constants.%C] -// CHECK:STDOUT: %D: type = bind_alias D, %C.decl [concrete = constants.%C] -// CHECK:STDOUT: %Foo.decl.loc7: %Foo.type.39e446.1 = class_decl @Foo.1 [concrete = constants.%Foo.generic.80461b.1] { -// CHECK:STDOUT: %a.patt: %pattern_type = symbolic_binding_pattern a, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %C.ref: type = name_ref C, file.%C.decl [concrete = constants.%C] -// CHECK:STDOUT: %a.loc7_11.1: %C = bind_symbolic_name a, 0 [symbolic = %a.loc7_11.2 (constants.%a)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %Foo.decl.loc15: %Foo.type.39e446.2 = class_decl @Foo.2 [concrete = constants.%Foo.generic.80461b.2] { -// CHECK:STDOUT: %b.patt: %pattern_type = symbolic_binding_pattern b, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %D.ref: type = name_ref D, file.%D [concrete = constants.%C] -// CHECK:STDOUT: %b.loc15_11.1: %C = bind_symbolic_name b, 0 [symbolic = %b.loc15_11.2 (constants.%b)] -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Foo.1(%a.loc7_11.1: %C) { -// CHECK:STDOUT: %a.loc7_11.2: %C = bind_symbolic_name a, 0 [symbolic = %a.loc7_11.2 (constants.%a)] -// CHECK:STDOUT: -// CHECK:STDOUT: class; -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Foo.2(%b.loc15_11.1: %C) { -// CHECK:STDOUT: %b.loc15_11.2: %C = bind_symbolic_name b, 0 [symbolic = %b.loc15_11.2 (constants.%b)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Foo.67ab7c.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Foo.1(constants.%a) { -// CHECK:STDOUT: %a.loc7_11.2 => constants.%a -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Foo.2(constants.%b) { -// CHECK:STDOUT: %b.loc15_11.2 => constants.%b -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_alias.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %a: %C = bind_symbolic_name a, 0 [symbolic] -// CHECK:STDOUT: %pattern_type: type = pattern_type %C [concrete] -// CHECK:STDOUT: %Foo.type.39e446.1: type = generic_class_type @Foo.1 [concrete] -// CHECK:STDOUT: %Foo.generic.80461b.1: %Foo.type.39e446.1 = struct_value () [concrete] -// CHECK:STDOUT: %Foo.type.39e446.2: type = generic_class_type @Foo.2 [concrete] -// CHECK:STDOUT: %Foo.generic.80461b.2: %Foo.type.39e446.2 = struct_value () [concrete] -// CHECK:STDOUT: %Foo.67ab7c.2: type = class_type @Foo.2, @Foo.2(%a) [symbolic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: .D = %D -// CHECK:STDOUT: .Foo = %Foo.decl.loc7 -// CHECK:STDOUT: } -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: %C.ref: type = name_ref C, %C.decl [concrete = constants.%C] -// CHECK:STDOUT: %D: type = bind_alias D, %C.decl [concrete = constants.%C] -// CHECK:STDOUT: %Foo.decl.loc7: %Foo.type.39e446.1 = class_decl @Foo.1 [concrete = constants.%Foo.generic.80461b.1] { -// CHECK:STDOUT: %a.patt: %pattern_type = symbolic_binding_pattern a, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %C.ref: type = name_ref C, file.%C.decl [concrete = constants.%C] -// CHECK:STDOUT: %a.loc7_11.1: %C = bind_symbolic_name a, 0 [symbolic = %a.loc7_11.2 (constants.%a)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %Foo.decl.loc15: %Foo.type.39e446.2 = class_decl @Foo.2 [concrete = constants.%Foo.generic.80461b.2] { -// CHECK:STDOUT: %a.patt: %pattern_type = symbolic_binding_pattern a, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %D.ref: type = name_ref D, file.%D [concrete = constants.%C] -// CHECK:STDOUT: %a.loc15_11.1: %C = bind_symbolic_name a, 0 [symbolic = %a.loc15_11.2 (constants.%a)] -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Foo.1(%a.loc7_11.1: %C) { -// CHECK:STDOUT: %a.loc7_11.2: %C = bind_symbolic_name a, 0 [symbolic = %a.loc7_11.2 (constants.%a)] -// CHECK:STDOUT: -// CHECK:STDOUT: class; -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Foo.2(%a.loc15_11.1: %C) { -// CHECK:STDOUT: %a.loc15_11.2: %C = bind_symbolic_name a, 0 [symbolic = %a.loc15_11.2 (constants.%a)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Foo.67ab7c.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Foo.1(constants.%a) { -// CHECK:STDOUT: %a.loc7_11.2 => constants.%a -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Foo.2(constants.%a) { -// CHECK:STDOUT: %a.loc15_11.2 => constants.%a -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_deduced_alias.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %a: %C = bind_symbolic_name a, 0 [symbolic] -// CHECK:STDOUT: %pattern_type: type = pattern_type %C [concrete] -// CHECK:STDOUT: %Foo.type.39e446.1: type = generic_class_type @Foo.1 [concrete] -// CHECK:STDOUT: %Foo.generic.80461b.1: %Foo.type.39e446.1 = struct_value () [concrete] -// CHECK:STDOUT: %Foo.type.39e446.2: type = generic_class_type @Foo.2 [concrete] -// CHECK:STDOUT: %Foo.generic.80461b.2: %Foo.type.39e446.2 = struct_value () [concrete] -// CHECK:STDOUT: %Foo.67ab7c.2: type = class_type @Foo.2, @Foo.2(%a) [symbolic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: .D = %D -// CHECK:STDOUT: .Foo = %Foo.decl.loc7 -// CHECK:STDOUT: } -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: %C.ref: type = name_ref C, %C.decl [concrete = constants.%C] -// CHECK:STDOUT: %D: type = bind_alias D, %C.decl [concrete = constants.%C] -// CHECK:STDOUT: %Foo.decl.loc7: %Foo.type.39e446.1 = class_decl @Foo.1 [concrete = constants.%Foo.generic.80461b.1] { -// CHECK:STDOUT: %a.patt: %pattern_type = symbolic_binding_pattern a, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %C.ref: type = name_ref C, file.%C.decl [concrete = constants.%C] -// CHECK:STDOUT: %a.loc7_11.1: %C = bind_symbolic_name a, 0 [symbolic = %a.loc7_11.2 (constants.%a)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %Foo.decl.loc15: %Foo.type.39e446.2 = class_decl @Foo.2 [concrete = constants.%Foo.generic.80461b.2] { -// CHECK:STDOUT: %a.patt: %pattern_type = symbolic_binding_pattern a, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %D.ref: type = name_ref D, file.%D [concrete = constants.%C] -// CHECK:STDOUT: %a.loc15_11.1: %C = bind_symbolic_name a, 0 [symbolic = %a.loc15_11.2 (constants.%a)] -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Foo.1(%a.loc7_11.1: %C) { -// CHECK:STDOUT: %a.loc7_11.2: %C = bind_symbolic_name a, 0 [symbolic = %a.loc7_11.2 (constants.%a)] -// CHECK:STDOUT: -// CHECK:STDOUT: class; -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Foo.2(%a.loc15_11.1: %C) { -// CHECK:STDOUT: %a.loc15_11.2: %C = bind_symbolic_name a, 0 [symbolic = %a.loc15_11.2 (constants.%a)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Foo.67ab7c.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Foo.1(constants.%a) { -// CHECK:STDOUT: %a.loc7_11.2 => constants.%a -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Foo.2(constants.%a) { -// CHECK:STDOUT: %a.loc15_11.2 => constants.%a -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- alias_two_file.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %a: %C = bind_symbolic_name a, 0 [symbolic] -// CHECK:STDOUT: %pattern_type: type = pattern_type %C [concrete] -// CHECK:STDOUT: %Foo.type: type = generic_class_type @Foo [concrete] -// CHECK:STDOUT: %Foo.generic: %Foo.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: .Foo = %Foo.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: %Foo.decl: %Foo.type = class_decl @Foo [concrete = constants.%Foo.generic] { -// CHECK:STDOUT: %a.patt: %pattern_type = symbolic_binding_pattern a, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %C.ref: type = name_ref C, file.%C.decl [concrete = constants.%C] -// CHECK:STDOUT: %a.loc6_11.1: %C = bind_symbolic_name a, 0 [symbolic = %a.loc6_11.2 (constants.%a)] -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Foo(%a.loc6_11.1: %C) { -// CHECK:STDOUT: %a.loc6_11.2: %C = bind_symbolic_name a, 0 [symbolic = %a.loc6_11.2 (constants.%a)] -// CHECK:STDOUT: -// CHECK:STDOUT: class; -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Foo(constants.%a) { -// CHECK:STDOUT: %a.loc6_11.2 => constants.%a -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- todo_fail_alias_two_file.impl.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %a: %C = bind_symbolic_name a, 0 [symbolic] -// CHECK:STDOUT: %pattern_type: type = pattern_type %C [concrete] -// CHECK:STDOUT: %Foo.type: type = generic_class_type @Foo [concrete] -// CHECK:STDOUT: %Foo.generic: %Foo.type = struct_value () [concrete] -// CHECK:STDOUT: %Foo: type = class_type @Foo, @Foo(%a) [symbolic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Main.C: type = import_ref Main//alias_two_file, C, loaded [concrete = constants.%C] -// CHECK:STDOUT: %Main.import_ref.8f2: = import_ref Main//alias_two_file, loc4_10, loaded [concrete = constants.%complete_type] -// CHECK:STDOUT: %Main.import_ref.2c4 = import_ref Main//alias_two_file, inst16 [no loc], unloaded -// CHECK:STDOUT: %Main.import_ref.f97: %C = import_ref Main//alias_two_file, loc6_11, loaded [symbolic = @Foo.%a.1 (constants.%a)] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .C = imports.%Main.C -// CHECK:STDOUT: .Foo = %Foo.decl -// CHECK:STDOUT: .D = %D -// CHECK:STDOUT: } -// CHECK:STDOUT: %default.import.loc2_30.1 = import -// CHECK:STDOUT: %default.import.loc2_30.2 = import -// CHECK:STDOUT: %C.ref: type = name_ref C, imports.%Main.C [concrete = constants.%C] -// CHECK:STDOUT: %D: type = bind_alias D, imports.%Main.C [concrete = constants.%C] -// CHECK:STDOUT: %Foo.decl: %Foo.type = class_decl @Foo [concrete = constants.%Foo.generic] { -// CHECK:STDOUT: %a.patt: %pattern_type = symbolic_binding_pattern a, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %D.ref: type = name_ref D, file.%D [concrete = constants.%C] -// CHECK:STDOUT: %a.loc6: %C = bind_symbolic_name a, 0 [symbolic = %a.1 (constants.%a)] -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C [from "alias_two_file.carbon"] { -// CHECK:STDOUT: complete_type_witness = imports.%Main.import_ref.8f2 -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Main.import_ref.2c4 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Foo(imports.%Main.import_ref.f97: %C) { -// CHECK:STDOUT: %a.1: %C = bind_symbolic_name a, 0 [symbolic = %a.1 (constants.%a)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Foo -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Foo(constants.%a) { -// CHECK:STDOUT: %a.1 => constants.%a -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_repeat_const.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %const: type = const_type %C [concrete] -// CHECK:STDOUT: %a: %const = bind_symbolic_name a, 0 [symbolic] -// CHECK:STDOUT: %pattern_type: type = pattern_type %const [concrete] -// CHECK:STDOUT: %Foo.type.39e446.1: type = generic_class_type @Foo.1 [concrete] -// CHECK:STDOUT: %Foo.generic.80461b.1: %Foo.type.39e446.1 = struct_value () [concrete] -// CHECK:STDOUT: %Foo.type.39e446.2: type = generic_class_type @Foo.2 [concrete] -// CHECK:STDOUT: %Foo.generic.80461b.2: %Foo.type.39e446.2 = struct_value () [concrete] -// CHECK:STDOUT: %Foo.1a4f0e.2: type = class_type @Foo.2, @Foo.2(%a) [symbolic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: .Foo = %Foo.decl.loc6 -// CHECK:STDOUT: } -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: %Foo.decl.loc6: %Foo.type.39e446.1 = class_decl @Foo.1 [concrete = constants.%Foo.generic.80461b.1] { -// CHECK:STDOUT: %a.patt: %pattern_type = symbolic_binding_pattern a, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %.loc6: type = splice_block %const [concrete = constants.%const] { -// CHECK:STDOUT: %C.ref: type = name_ref C, file.%C.decl [concrete = constants.%C] -// CHECK:STDOUT: %const: type = const_type %C.ref [concrete = constants.%const] -// CHECK:STDOUT: } -// CHECK:STDOUT: %a.loc6_11.1: %const = bind_symbolic_name a, 0 [symbolic = %a.loc6_11.2 (constants.%a)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %Foo.decl.loc18: %Foo.type.39e446.2 = class_decl @Foo.2 [concrete = constants.%Foo.generic.80461b.2] { -// CHECK:STDOUT: %a.patt: %pattern_type = symbolic_binding_pattern a, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %.loc18: type = splice_block %const.loc18_15 [concrete = constants.%const] { -// CHECK:STDOUT: %C.ref: type = name_ref C, file.%C.decl [concrete = constants.%C] -// CHECK:STDOUT: %const.loc18_22: type = const_type %C.ref [concrete = constants.%const] -// CHECK:STDOUT: %const.loc18_15: type = const_type %const.loc18_22 [concrete = constants.%const] -// CHECK:STDOUT: } -// CHECK:STDOUT: %a.loc18_11.1: %const = bind_symbolic_name a, 0 [symbolic = %a.loc18_11.2 (constants.%a)] -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Foo.1(%a.loc6_11.1: %const) { -// CHECK:STDOUT: %a.loc6_11.2: %const = bind_symbolic_name a, 0 [symbolic = %a.loc6_11.2 (constants.%a)] -// CHECK:STDOUT: -// CHECK:STDOUT: class; -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Foo.2(%a.loc18_11.1: %const) { -// CHECK:STDOUT: %a.loc18_11.2: %const = bind_symbolic_name a, 0 [symbolic = %a.loc18_11.2 (constants.%a)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Foo.1a4f0e.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Foo.1(constants.%a) { -// CHECK:STDOUT: %a.loc6_11.2 => constants.%a -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Foo.2(constants.%a) { -// CHECK:STDOUT: %a.loc18_11.2 => constants.%a -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_self_type.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Base: type = class_type @Base [concrete] -// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] -// CHECK:STDOUT: %Base.elem: type = unbound_element_type %Base, %empty_tuple.type [concrete] -// CHECK:STDOUT: %ptr.11f: type = ptr_type %Base [concrete] -// CHECK:STDOUT: %pattern_type.1b9: type = pattern_type %ptr.11f [concrete] -// CHECK:STDOUT: %pattern_type.f6d: type = pattern_type auto [concrete] -// CHECK:STDOUT: %F.type.7c6384.1: type = fn_type @F.1 [concrete] -// CHECK:STDOUT: %F.d17bbc.1: %F.type.7c6384.1 = struct_value () [concrete] -// CHECK:STDOUT: %struct_type.a: type = struct_type {.a: %empty_tuple.type} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.a [concrete] -// CHECK:STDOUT: %F.type.7c6384.2: type = fn_type @F.2 [concrete] -// CHECK:STDOUT: %F.d17bbc.2: %F.type.7c6384.2 = struct_value () [concrete] -// CHECK:STDOUT: %empty_tuple: %empty_tuple.type = tuple_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Base = %Base.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Base.decl: type = class_decl @Base [concrete = constants.%Base] {} {} -// CHECK:STDOUT: %F.decl: %F.type.7c6384.2 = fn_decl @F.2 [concrete = constants.%F.d17bbc.2] { -// CHECK:STDOUT: %self.patt: %pattern_type.1b9 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.1b9 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc17_11: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %ptr.11f = value_param call_param0 -// CHECK:STDOUT: %.loc17_26: type = splice_block %ptr [concrete = constants.%ptr.11f] { -// CHECK:STDOUT: %Base.ref: type = name_ref Base, file.%Base.decl [concrete = constants.%Base] -// CHECK:STDOUT: %ptr: type = ptr_type %Base.ref [concrete = constants.%ptr.11f] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self: %ptr.11f = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Base { -// CHECK:STDOUT: %.loc5_11.1: %empty_tuple.type = tuple_literal () -// CHECK:STDOUT: %.loc5_11.2: type = converted %.loc5_11.1, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] -// CHECK:STDOUT: %.loc5_8: %Base.elem = field_decl a, element0 [concrete] -// CHECK:STDOUT: %F.decl: %F.type.7c6384.1 = fn_decl @F.1 [concrete = constants.%F.d17bbc.1] { -// CHECK:STDOUT: %self.patt: %pattern_type.1b9 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.1b9 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc7_8: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %ptr.11f = value_param call_param0 -// CHECK:STDOUT: %.loc7_23: type = splice_block %ptr [concrete = constants.%ptr.11f] { -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Base [concrete = constants.%Base] -// CHECK:STDOUT: %ptr: type = ptr_type %Self.ref [concrete = constants.%ptr.11f] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self: %ptr.11f = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %struct_type.a: type = struct_type {.a: %empty_tuple.type} [concrete = constants.%struct_type.a] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.a [concrete = constants.%complete_type] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Base -// CHECK:STDOUT: .a = %.loc5_8 -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: .Base = -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F.1(%self.param: %ptr.11f); -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F.2(%self.param: %ptr.11f) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %self.ref: %ptr.11f = name_ref self, %self -// CHECK:STDOUT: %.loc18_4: ref %Base = deref %self.ref -// CHECK:STDOUT: %a.ref: %Base.elem = name_ref a, @Base.%.loc5_8 [concrete = @Base.%.loc5_8] -// CHECK:STDOUT: %.loc18_10: ref %empty_tuple.type = class_element_access %.loc18_4, element0 -// CHECK:STDOUT: %.loc18_16.1: %empty_tuple.type = tuple_literal () -// CHECK:STDOUT: %.loc18_16.2: init %empty_tuple.type = tuple_init () to %.loc18_10 [concrete = constants.%empty_tuple] -// CHECK:STDOUT: %.loc18_13: init %empty_tuple.type = converted %.loc18_16.1, %.loc18_16.2 [concrete = constants.%empty_tuple] -// CHECK:STDOUT: assign %.loc18_10, %.loc18_13 -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/raw_self.carbon b/toolchain/check/testdata/class/raw_self.carbon deleted file mode 100644 index 41def80353e63..0000000000000 --- a/toolchain/check/testdata/class/raw_self.carbon +++ /dev/null @@ -1,202 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/raw_self.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/raw_self.carbon - -class Class { - fn F[addr self: Self*](r#self: i32); - fn G[self: Self](r#self: i32) -> (i32, i32); - var n: i32; -} - -fn Class.F[addr self: Self*](r#self: i32) { - (*self).n = r#self; -} - -fn Class.G[self: Self](r#self: i32) -> (i32, i32) { - return (self.n, r#self); -} - -// CHECK:STDOUT: --- raw_self.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Class: type = class_type @Class [concrete] -// CHECK:STDOUT: %ptr.e71: type = ptr_type %Class [concrete] -// CHECK:STDOUT: %pattern_type.796: type = pattern_type %ptr.e71 [concrete] -// CHECK:STDOUT: %pattern_type.f6d: type = pattern_type auto [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %pattern_type.761: type = pattern_type %Class [concrete] -// CHECK:STDOUT: %tuple.type.24b: type = tuple_type (type, type) [concrete] -// CHECK:STDOUT: %tuple.type.d07: type = tuple_type (%i32, %i32) [concrete] -// CHECK:STDOUT: %pattern_type.511: type = pattern_type %tuple.type.d07 [concrete] -// CHECK:STDOUT: %G.type: type = fn_type @G [concrete] -// CHECK:STDOUT: %G: %G.type = struct_value () [concrete] -// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %i32 [concrete] -// CHECK:STDOUT: %struct_type.n: type = struct_type {.n: %i32} [concrete] -// CHECK:STDOUT: %complete_type.54b: = complete_type_witness %struct_type.n [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Class = %Class.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Class.decl: type = class_decl @Class [concrete = constants.%Class] {} {} -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %self.patt.loc17_17: %pattern_type.796 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt.loc17_21: %pattern_type.796 = value_param_pattern %self.patt.loc17_17, call_param0 [concrete] -// CHECK:STDOUT: %.loc17_12: %pattern_type.f6d = addr_pattern %self.param_patt.loc17_21 [concrete] -// CHECK:STDOUT: %self.patt.loc17_30: %pattern_type.7ce = binding_pattern r#self [concrete] -// CHECK:STDOUT: %self.param_patt.loc17_36: %pattern_type.7ce = value_param_pattern %self.patt.loc17_30, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param.loc17_21: %ptr.e71 = value_param call_param0 -// CHECK:STDOUT: %.loc17_27: type = splice_block %ptr.loc17 [concrete = constants.%ptr.e71] { -// CHECK:STDOUT: %Self.ref.loc17: type = name_ref Self, constants.%Class [concrete = constants.%Class] -// CHECK:STDOUT: %ptr.loc17: type = ptr_type %Self.ref.loc17 [concrete = constants.%ptr.e71] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self.loc17_17: %ptr.e71 = bind_name self, %self.param.loc17_21 -// CHECK:STDOUT: %self.param.loc17_36: %i32 = value_param call_param1 -// CHECK:STDOUT: %.loc17_38: type = splice_block %i32.loc17 [concrete = constants.%i32] { -// CHECK:STDOUT: %int_32.loc17: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc17: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self.loc17_30: %i32 = bind_name r#self, %self.param.loc17_36 -// CHECK:STDOUT: } -// CHECK:STDOUT: %G.decl: %G.type = fn_decl @G [concrete = constants.%G] { -// CHECK:STDOUT: %self.patt.loc21_12: %pattern_type.761 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt.loc21_16: %pattern_type.761 = value_param_pattern %self.patt.loc21_12, call_param0 [concrete] -// CHECK:STDOUT: %self.patt.loc21_24: %pattern_type.7ce = binding_pattern r#self [concrete] -// CHECK:STDOUT: %self.param_patt.loc21_30: %pattern_type.7ce = value_param_pattern %self.patt.loc21_24, call_param1 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.511 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.511 = out_param_pattern %return.patt, call_param2 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32.loc21_41: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc21_41: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %int_32.loc21_46: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc21_46: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc21_49.1: %tuple.type.24b = tuple_literal (%i32.loc21_41, %i32.loc21_46) -// CHECK:STDOUT: %.loc21_49.2: type = converted %.loc21_49.1, constants.%tuple.type.d07 [concrete = constants.%tuple.type.d07] -// CHECK:STDOUT: %self.param.loc21_16: %Class = value_param call_param0 -// CHECK:STDOUT: %Self.ref.loc21: type = name_ref Self, constants.%Class [concrete = constants.%Class] -// CHECK:STDOUT: %self.loc21_12: %Class = bind_name self, %self.param.loc21_16 -// CHECK:STDOUT: %self.param.loc21_30: %i32 = value_param call_param1 -// CHECK:STDOUT: %.loc21_32: type = splice_block %i32.loc21_32 [concrete = constants.%i32] { -// CHECK:STDOUT: %int_32.loc21_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc21_32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self.loc21_24: %i32 = bind_name r#self, %self.param.loc21_30 -// CHECK:STDOUT: %return.param.loc21: ref %tuple.type.d07 = out_param call_param2 -// CHECK:STDOUT: %return.loc21: ref %tuple.type.d07 = return_slot %return.param.loc21 -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Class { -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %self.patt.loc17_17: %pattern_type.796 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt.loc17_21: %pattern_type.796 = value_param_pattern %self.patt.loc17_17, call_param0 [concrete] -// CHECK:STDOUT: %.loc17_12: %pattern_type.f6d = addr_pattern %self.param_patt.loc17_21 [concrete] -// CHECK:STDOUT: %self.patt.loc17_30: %pattern_type.7ce = binding_pattern r#self [concrete] -// CHECK:STDOUT: %self.param_patt.loc17_36: %pattern_type.7ce = value_param_pattern %self.patt.loc17_30, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param.loc12_17: %ptr.e71 = value_param call_param0 -// CHECK:STDOUT: %.loc12_23: type = splice_block %ptr.loc12 [concrete = constants.%ptr.e71] { -// CHECK:STDOUT: %Self.ref.loc12: type = name_ref Self, constants.%Class [concrete = constants.%Class] -// CHECK:STDOUT: %ptr.loc12: type = ptr_type %Self.ref.loc12 [concrete = constants.%ptr.e71] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self.loc12_13: %ptr.e71 = bind_name self, %self.param.loc12_17 -// CHECK:STDOUT: %self.param.loc12_32: %i32 = value_param call_param1 -// CHECK:STDOUT: %.loc12_34: type = splice_block %i32.loc12 [concrete = constants.%i32] { -// CHECK:STDOUT: %int_32.loc12: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc12: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self.loc12_26: %i32 = bind_name r#self, %self.param.loc12_32 -// CHECK:STDOUT: } -// CHECK:STDOUT: %G.decl: %G.type = fn_decl @G [concrete = constants.%G] { -// CHECK:STDOUT: %self.patt.loc21_12: %pattern_type.761 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt.loc21_16: %pattern_type.761 = value_param_pattern %self.patt.loc21_12, call_param0 [concrete] -// CHECK:STDOUT: %self.patt.loc21_24: %pattern_type.7ce = binding_pattern r#self [concrete] -// CHECK:STDOUT: %self.param_patt.loc21_30: %pattern_type.7ce = value_param_pattern %self.patt.loc21_24, call_param1 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.511 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.511 = out_param_pattern %return.patt, call_param2 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32.loc13_37: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc13_37: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %int_32.loc13_42: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc13_42: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc13_45.1: %tuple.type.24b = tuple_literal (%i32.loc13_37, %i32.loc13_42) -// CHECK:STDOUT: %.loc13_45.2: type = converted %.loc13_45.1, constants.%tuple.type.d07 [concrete = constants.%tuple.type.d07] -// CHECK:STDOUT: %self.param.loc13_12: %Class = value_param call_param0 -// CHECK:STDOUT: %Self.ref.loc13: type = name_ref Self, constants.%Class [concrete = constants.%Class] -// CHECK:STDOUT: %self.loc13_8: %Class = bind_name self, %self.param.loc13_12 -// CHECK:STDOUT: %self.param.loc13_26: %i32 = value_param call_param1 -// CHECK:STDOUT: %.loc13_28: type = splice_block %i32.loc13_28 [concrete = constants.%i32] { -// CHECK:STDOUT: %int_32.loc13_28: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc13_28: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self.loc13_20: %i32 = bind_name r#self, %self.param.loc13_26 -// CHECK:STDOUT: %return.param.loc13: ref %tuple.type.d07 = out_param call_param2 -// CHECK:STDOUT: %return.loc13: ref %tuple.type.d07 = return_slot %return.param.loc13 -// CHECK:STDOUT: } -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc14: %Class.elem = field_decl n, element0 [concrete] -// CHECK:STDOUT: %struct_type.n: type = struct_type {.n: %i32} [concrete = constants.%struct_type.n] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.n [concrete = constants.%complete_type.54b] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Class -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: .G = %G.decl -// CHECK:STDOUT: .n = %.loc14 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F(%self.param.loc17_21: %ptr.e71, %self.param.loc17_36: %i32) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %self.ref.loc18_5: %ptr.e71 = name_ref self, %self.loc17_17 -// CHECK:STDOUT: %.loc18_4: ref %Class = deref %self.ref.loc18_5 -// CHECK:STDOUT: %n.ref: %Class.elem = name_ref n, @Class.%.loc14 [concrete = @Class.%.loc14] -// CHECK:STDOUT: %.loc18_10: ref %i32 = class_element_access %.loc18_4, element0 -// CHECK:STDOUT: %self.ref.loc18_15: %i32 = name_ref r#self, %self.loc17_30 -// CHECK:STDOUT: assign %.loc18_10, %self.ref.loc18_15 -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @G(%self.param.loc21_16: %Class, %self.param.loc21_30: %i32) -> %return.param.loc21: %tuple.type.d07 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %self.ref.loc22_11: %Class = name_ref self, %self.loc21_12 -// CHECK:STDOUT: %n.ref: %Class.elem = name_ref n, @Class.%.loc14 [concrete = @Class.%.loc14] -// CHECK:STDOUT: %.loc22_15.1: ref %i32 = class_element_access %self.ref.loc22_11, element0 -// CHECK:STDOUT: %.loc22_15.2: %i32 = bind_value %.loc22_15.1 -// CHECK:STDOUT: %self.ref.loc22_19: %i32 = name_ref r#self, %self.loc21_24 -// CHECK:STDOUT: %.loc22_25.1: %tuple.type.d07 = tuple_literal (%.loc22_15.2, %self.ref.loc22_19) -// CHECK:STDOUT: %tuple.elem0: ref %i32 = tuple_access %return.loc21, element0 -// CHECK:STDOUT: %.loc22_25.2: init %i32 = initialize_from %.loc22_15.2 to %tuple.elem0 -// CHECK:STDOUT: %tuple.elem1: ref %i32 = tuple_access %return.loc21, element1 -// CHECK:STDOUT: %.loc22_25.3: init %i32 = initialize_from %self.ref.loc22_19 to %tuple.elem1 -// CHECK:STDOUT: %.loc22_25.4: init %tuple.type.d07 = tuple_init (%.loc22_25.2, %.loc22_25.3) to %return.loc21 -// CHECK:STDOUT: %.loc22_26: init %tuple.type.d07 = converted %.loc22_25.1, %.loc22_25.4 -// CHECK:STDOUT: return %.loc22_26 to %return.loc21 -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/raw_self_type.carbon b/toolchain/check/testdata/class/raw_self_type.carbon deleted file mode 100644 index 183ab6056ac88..0000000000000 --- a/toolchain/check/testdata/class/raw_self_type.carbon +++ /dev/null @@ -1,152 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/raw_self_type.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/raw_self_type.carbon - -class Class { - fn F() { - var r#Self: Self*; - var p: Self* = r#Self; - } -} - -class MemberNamedSelf { - class r#Self {} - - fn F(x: Self, y: r#Self); -} - -fn MemberNamedSelf.F(x: Self, y: r#Self) {} - -// CHECK:STDOUT: --- raw_self_type.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Class: type = class_type @Class [concrete] -// CHECK:STDOUT: %F.type.f1b: type = fn_type @F.1 [concrete] -// CHECK:STDOUT: %F.1f2: %F.type.f1b = struct_value () [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %ptr.e71: type = ptr_type %Class [concrete] -// CHECK:STDOUT: %pattern_type.796: type = pattern_type %ptr.e71 [concrete] -// CHECK:STDOUT: %MemberNamedSelf: type = class_type @MemberNamedSelf [concrete] -// CHECK:STDOUT: %Self: type = class_type @Self [concrete] -// CHECK:STDOUT: %pattern_type.356: type = pattern_type %MemberNamedSelf [concrete] -// CHECK:STDOUT: %pattern_type.c06: type = pattern_type %Self [concrete] -// CHECK:STDOUT: %F.type.648: type = fn_type @F.2 [concrete] -// CHECK:STDOUT: %F.e97: %F.type.648 = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Class = %Class.decl -// CHECK:STDOUT: .MemberNamedSelf = %MemberNamedSelf.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Class.decl: type = class_decl @Class [concrete = constants.%Class] {} {} -// CHECK:STDOUT: %MemberNamedSelf.decl: type = class_decl @MemberNamedSelf [concrete = constants.%MemberNamedSelf] {} {} -// CHECK:STDOUT: %F.decl: %F.type.648 = fn_decl @F.2 [concrete = constants.%F.e97] { -// CHECK:STDOUT: %x.patt: %pattern_type.356 = binding_pattern x [concrete] -// CHECK:STDOUT: %x.param_patt: %pattern_type.356 = value_param_pattern %x.patt, call_param0 [concrete] -// CHECK:STDOUT: %y.patt: %pattern_type.c06 = binding_pattern y [concrete] -// CHECK:STDOUT: %y.param_patt: %pattern_type.c06 = value_param_pattern %y.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %x.param.loc24: %MemberNamedSelf = value_param call_param0 -// CHECK:STDOUT: %Self.ref.loc24_25: type = name_ref Self, constants.%MemberNamedSelf [concrete = constants.%MemberNamedSelf] -// CHECK:STDOUT: %x.loc24: %MemberNamedSelf = bind_name x, %x.param.loc24 -// CHECK:STDOUT: %y.param.loc24: %Self = value_param call_param1 -// CHECK:STDOUT: %Self.ref.loc24_34: type = name_ref r#Self, @MemberNamedSelf.%Self.decl [concrete = constants.%Self] -// CHECK:STDOUT: %y.loc24: %Self = bind_name y, %y.param.loc24 -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Class { -// CHECK:STDOUT: %F.decl: %F.type.f1b = fn_decl @F.1 [concrete = constants.%F.1f2] {} {} -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Class -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @MemberNamedSelf { -// CHECK:STDOUT: %Self.decl: type = class_decl @Self [concrete = constants.%Self] {} {} -// CHECK:STDOUT: %F.decl: %F.type.648 = fn_decl @F.2 [concrete = constants.%F.e97] { -// CHECK:STDOUT: %x.patt: %pattern_type.356 = binding_pattern x [concrete] -// CHECK:STDOUT: %x.param_patt: %pattern_type.356 = value_param_pattern %x.patt, call_param0 [concrete] -// CHECK:STDOUT: %y.patt: %pattern_type.c06 = binding_pattern y [concrete] -// CHECK:STDOUT: %y.param_patt: %pattern_type.c06 = value_param_pattern %y.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %x.param.loc21: %MemberNamedSelf = value_param call_param0 -// CHECK:STDOUT: %Self.ref.loc21_11: type = name_ref Self, constants.%MemberNamedSelf [concrete = constants.%MemberNamedSelf] -// CHECK:STDOUT: %x.loc21: %MemberNamedSelf = bind_name x, %x.param.loc21 -// CHECK:STDOUT: %y.param.loc21: %Self = value_param call_param1 -// CHECK:STDOUT: %Self.ref.loc21_20: type = name_ref r#Self, @MemberNamedSelf.%Self.decl [concrete = constants.%Self] -// CHECK:STDOUT: %y.loc21: %Self = bind_name y, %y.param.loc21 -// CHECK:STDOUT: } -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%MemberNamedSelf -// CHECK:STDOUT: .r#Self = %Self.decl -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Self { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Self -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F.1() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %Self.patt: %pattern_type.796 = binding_pattern r#Self [concrete] -// CHECK:STDOUT: %Self.var_patt: %pattern_type.796 = var_pattern %Self.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %Self.var: ref %ptr.e71 = var %Self.var_patt -// CHECK:STDOUT: %.loc13: type = splice_block %ptr.loc13 [concrete = constants.%ptr.e71] { -// CHECK:STDOUT: %Self.ref.loc13: type = name_ref Self, constants.%Class [concrete = constants.%Class] -// CHECK:STDOUT: %ptr.loc13: type = ptr_type %Self.ref.loc13 [concrete = constants.%ptr.e71] -// CHECK:STDOUT: } -// CHECK:STDOUT: %Self: ref %ptr.e71 = bind_name r#Self, %Self.var -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %p.patt: %pattern_type.796 = binding_pattern p [concrete] -// CHECK:STDOUT: %p.var_patt: %pattern_type.796 = var_pattern %p.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %p.var: ref %ptr.e71 = var %p.var_patt -// CHECK:STDOUT: %Self.ref.loc14_20: ref %ptr.e71 = name_ref r#Self, %Self -// CHECK:STDOUT: %.loc14_20: %ptr.e71 = bind_value %Self.ref.loc14_20 -// CHECK:STDOUT: assign %p.var, %.loc14_20 -// CHECK:STDOUT: %.loc14_16: type = splice_block %ptr.loc14 [concrete = constants.%ptr.e71] { -// CHECK:STDOUT: %Self.ref.loc14_12: type = name_ref Self, constants.%Class [concrete = constants.%Class] -// CHECK:STDOUT: %ptr.loc14: type = ptr_type %Self.ref.loc14_12 [concrete = constants.%ptr.e71] -// CHECK:STDOUT: } -// CHECK:STDOUT: %p: ref %ptr.e71 = bind_name p, %p.var -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F.2(%x.param.loc24: %MemberNamedSelf, %y.param.loc24: %Self) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/redeclaration.carbon b/toolchain/check/testdata/class/redeclaration.carbon deleted file mode 100644 index 1bd3be2c4206a..0000000000000 --- a/toolchain/check/testdata/class/redeclaration.carbon +++ /dev/null @@ -1,100 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/redeclaration.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/redeclaration.carbon - -class Class; - -class Class { - fn F[self: Self](b: bool); -} - -fn Class.F[self: Self](b: bool) {} - -// CHECK:STDOUT: --- redeclaration.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Class: type = class_type @Class [concrete] -// CHECK:STDOUT: %pattern_type.761: type = pattern_type %Class [concrete] -// CHECK:STDOUT: %Bool.type: type = fn_type @Bool [concrete] -// CHECK:STDOUT: %Bool: %Bool.type = struct_value () [concrete] -// CHECK:STDOUT: %pattern_type.831: type = pattern_type bool [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Bool = %Core.Bool -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Bool: %Bool.type = import_ref Core//prelude/types/bool, Bool, loaded [concrete = constants.%Bool] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Class = %Class.decl.loc11 -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Class.decl.loc11: type = class_decl @Class [concrete = constants.%Class] {} {} -// CHECK:STDOUT: %Class.decl.loc13: type = class_decl @Class [concrete = constants.%Class] {} {} -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %self.patt: %pattern_type.761 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.761 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %b.patt: %pattern_type.831 = binding_pattern b [concrete] -// CHECK:STDOUT: %b.param_patt: %pattern_type.831 = value_param_pattern %b.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param.loc17: %Class = value_param call_param0 -// CHECK:STDOUT: %Self.ref.loc17: type = name_ref Self, constants.%Class [concrete = constants.%Class] -// CHECK:STDOUT: %self.loc17: %Class = bind_name self, %self.param.loc17 -// CHECK:STDOUT: %b.param.loc17: bool = value_param call_param1 -// CHECK:STDOUT: %.loc17_27.1: type = splice_block %.loc17_27.3 [concrete = bool] { -// CHECK:STDOUT: %bool.make_type.loc17: init type = call constants.%Bool() [concrete = bool] -// CHECK:STDOUT: %.loc17_27.2: type = value_of_initializer %bool.make_type.loc17 [concrete = bool] -// CHECK:STDOUT: %.loc17_27.3: type = converted %bool.make_type.loc17, %.loc17_27.2 [concrete = bool] -// CHECK:STDOUT: } -// CHECK:STDOUT: %b.loc17: bool = bind_name b, %b.param.loc17 -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Class { -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %self.patt: %pattern_type.761 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.761 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %b.patt: %pattern_type.831 = binding_pattern b [concrete] -// CHECK:STDOUT: %b.param_patt: %pattern_type.831 = value_param_pattern %b.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param.loc14: %Class = value_param call_param0 -// CHECK:STDOUT: %Self.ref.loc14: type = name_ref Self, constants.%Class [concrete = constants.%Class] -// CHECK:STDOUT: %self.loc14: %Class = bind_name self, %self.param.loc14 -// CHECK:STDOUT: %b.param.loc14: bool = value_param call_param1 -// CHECK:STDOUT: %.loc14_23.1: type = splice_block %.loc14_23.3 [concrete = bool] { -// CHECK:STDOUT: %bool.make_type.loc14: init type = call constants.%Bool() [concrete = bool] -// CHECK:STDOUT: %.loc14_23.2: type = value_of_initializer %bool.make_type.loc14 [concrete = bool] -// CHECK:STDOUT: %.loc14_23.3: type = converted %bool.make_type.loc14, %.loc14_23.2 [concrete = bool] -// CHECK:STDOUT: } -// CHECK:STDOUT: %b.loc14: bool = bind_name b, %b.param.loc14 -// CHECK:STDOUT: } -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Class -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F(%self.param.loc17: %Class, %b.param.loc17: bool) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/redeclaration_introducer.carbon b/toolchain/check/testdata/class/redeclaration_introducer.carbon deleted file mode 100644 index e8153b692c38e..0000000000000 --- a/toolchain/check/testdata/class/redeclaration_introducer.carbon +++ /dev/null @@ -1,78 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/redeclaration_introducer.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/redeclaration_introducer.carbon - -class A; -class B; -class C; - -class A {} -base class B {} -abstract class C {} - -// CHECK:STDOUT: --- redeclaration_introducer.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %A: type = class_type @A [concrete] -// CHECK:STDOUT: %B: type = class_type @B [concrete] -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .A = %A.decl.loc11 -// CHECK:STDOUT: .B = %B.decl.loc12 -// CHECK:STDOUT: .C = %C.decl.loc13 -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %A.decl.loc11: type = class_decl @A [concrete = constants.%A] {} {} -// CHECK:STDOUT: %B.decl.loc12: type = class_decl @B [concrete = constants.%B] {} {} -// CHECK:STDOUT: %C.decl.loc13: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: %A.decl.loc15: type = class_decl @A [concrete = constants.%A] {} {} -// CHECK:STDOUT: %B.decl.loc16: type = class_decl @B [concrete = constants.%B] {} {} -// CHECK:STDOUT: %C.decl.loc17: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @A { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%A -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @B { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%B -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/reenter_scope.carbon b/toolchain/check/testdata/class/reenter_scope.carbon deleted file mode 100644 index 00d7d7e5e026c..0000000000000 --- a/toolchain/check/testdata/class/reenter_scope.carbon +++ /dev/null @@ -1,107 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/reenter_scope.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/reenter_scope.carbon - -class Class { - fn F() -> i32; - fn G() -> i32; -} - -fn Class.F() -> i32 { - Self.G(); - return G(); -} - -// CHECK:STDOUT: --- reenter_scope.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Class: type = class_type @Class [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %G.type: type = fn_type @G [concrete] -// CHECK:STDOUT: %G: %G.type = struct_value () [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Class = %Class.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Class.decl: type = class_decl @Class [concrete = constants.%Class] {} {} -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32.loc16: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc16: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %return.param.loc16: ref %i32 = out_param call_param0 -// CHECK:STDOUT: %return.loc16: ref %i32 = return_slot %return.param.loc16 -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Class { -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32.loc12: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc12: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %return.param.loc12: ref %i32 = out_param call_param0 -// CHECK:STDOUT: %return.loc12: ref %i32 = return_slot %return.param.loc12 -// CHECK:STDOUT: } -// CHECK:STDOUT: %G.decl: %G.type = fn_decl @G [concrete = constants.%G] { -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param0 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Class -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: .G = %G.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F() -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Class [concrete = constants.%Class] -// CHECK:STDOUT: %G.ref.loc17: %G.type = name_ref G, @Class.%G.decl [concrete = constants.%G] -// CHECK:STDOUT: %G.call.loc17: init %i32 = call %G.ref.loc17() -// CHECK:STDOUT: %G.ref.loc18: %G.type = name_ref G, @Class.%G.decl [concrete = constants.%G] -// CHECK:STDOUT: %G.call.loc18: init %i32 = call %G.ref.loc18() -// CHECK:STDOUT: %.loc18_13.1: %i32 = value_of_initializer %G.call.loc18 -// CHECK:STDOUT: %.loc18_13.2: %i32 = converted %G.call.loc18, %.loc18_13.1 -// CHECK:STDOUT: return %.loc18_13.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @G() -> %i32; -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/reorder.carbon b/toolchain/check/testdata/class/reorder.carbon deleted file mode 100644 index a34392a8d9a44..0000000000000 --- a/toolchain/check/testdata/class/reorder.carbon +++ /dev/null @@ -1,129 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/reorder.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/reorder.carbon - -class Class { - fn G() -> i32 { - return Class.F(); - } - - fn F() -> i32 { - return 1; - } -} - -// CHECK:STDOUT: --- reorder.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Class: type = class_type @Class [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %G.type: type = fn_type @G [concrete] -// CHECK:STDOUT: %G: %G.type = struct_value () [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %int_1.5b8: Core.IntLiteral = int_value 1 [concrete] -// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.type.205: type = facet_type <@ImplicitAs, @ImplicitAs(%i32)> [concrete] -// CHECK:STDOUT: %Convert.type.1b6: type = fn_type @Convert.1, @ImplicitAs(%i32) [concrete] -// CHECK:STDOUT: %To.c80: Core.IntLiteral = bind_symbolic_name To, 0 [symbolic] -// CHECK:STDOUT: %Convert.type.0f9: type = fn_type @Convert.2, @impl.4f9(%To.c80) [symbolic] -// CHECK:STDOUT: %Convert.f06: %Convert.type.0f9 = struct_value () [symbolic] -// CHECK:STDOUT: %ImplicitAs.impl_witness.c75: = impl_witness imports.%ImplicitAs.impl_witness_table.a2f, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.type.035: type = fn_type @Convert.2, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.956: %Convert.type.035 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.facet: %ImplicitAs.type.205 = facet_value Core.IntLiteral, (%ImplicitAs.impl_witness.c75) [concrete] -// CHECK:STDOUT: %.9c3: type = fn_type_with_self_type %Convert.type.1b6, %ImplicitAs.facet [concrete] -// CHECK:STDOUT: %Convert.bound: = bound_method %int_1.5b8, %Convert.956 [concrete] -// CHECK:STDOUT: %Convert.specific_fn: = specific_function %Convert.956, @Convert.2(%int_32) [concrete] -// CHECK:STDOUT: %bound_method: = bound_method %int_1.5b8, %Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_1.5d2: %i32 = int_value 1 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/operators/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] -// CHECK:STDOUT: %Core.import_ref.a5b: @impl.4f9.%Convert.type (%Convert.type.0f9) = import_ref Core//prelude/types/int, loc19_39, loaded [symbolic = @impl.4f9.%Convert (constants.%Convert.f06)] -// CHECK:STDOUT: %ImplicitAs.impl_witness_table.a2f = impl_witness_table (%Core.import_ref.a5b), @impl.4f9 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Class = %Class.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Class.decl: type = class_decl @Class [concrete = constants.%Class] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Class { -// CHECK:STDOUT: %G.decl: %G.type = fn_decl @G [concrete = constants.%G] { -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param0 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param0 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Class -// CHECK:STDOUT: .G = %G.decl -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: .Class = -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @G() -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %Class.ref: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %F.ref: %F.type = name_ref F, @Class.%F.decl [concrete = constants.%F] -// CHECK:STDOUT: %F.call: init %i32 = call %F.ref() -// CHECK:STDOUT: %.loc13_21.1: %i32 = value_of_initializer %F.call -// CHECK:STDOUT: %.loc13_21.2: %i32 = converted %F.call, %.loc13_21.1 -// CHECK:STDOUT: return %.loc13_21.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F() -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %int_1: Core.IntLiteral = int_value 1 [concrete = constants.%int_1.5b8] -// CHECK:STDOUT: %impl.elem0: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc17_13.1: = bound_method %int_1, %impl.elem0 [concrete = constants.%Convert.bound] -// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc17_13.2: = bound_method %int_1, %specific_fn [concrete = constants.%bound_method] -// CHECK:STDOUT: %int.convert_checked: init %i32 = call %bound_method.loc17_13.2(%int_1) [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %.loc17_13.1: %i32 = value_of_initializer %int.convert_checked [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %.loc17_13.2: %i32 = converted %int_1, %.loc17_13.1 [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: return %.loc17_13.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/reorder_qualified.carbon b/toolchain/check/testdata/class/reorder_qualified.carbon deleted file mode 100644 index 4a8c7549e904b..0000000000000 --- a/toolchain/check/testdata/class/reorder_qualified.carbon +++ /dev/null @@ -1,334 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/reorder_qualified.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/reorder_qualified.carbon - -class A { - class B { - class C; - - fn BF(); - var b: i32; - } - - class B.C { - class D { - fn F(); - - fn DF(); - var d: i32; - } - - fn D.DF() { - // A, B, C, and D are complete here. - var a: A = {.a = 1}; - var b: B = {.b = 2}; - var c: C = {.c = 3}; - var d: D = {.d = 4}; - - // Unqualified lookup looks in all of them. - AF(); - BF(); - CF(); - DF(); - } - - fn CF(); - var c: i32; - } - - fn AF(); - var a: i32; -} - -// CHECK:STDOUT: --- reorder_qualified.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %A: type = class_type @A [concrete] -// CHECK:STDOUT: %B: type = class_type @B [concrete] -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %BF.type: type = fn_type @BF [concrete] -// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] -// CHECK:STDOUT: %BF: %BF.type = struct_value () [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %B.elem: type = unbound_element_type %B, %i32 [concrete] -// CHECK:STDOUT: %struct_type.b.0a3: type = struct_type {.b: %i32} [concrete] -// CHECK:STDOUT: %complete_type.ba8: = complete_type_witness %struct_type.b.0a3 [concrete] -// CHECK:STDOUT: %D: type = class_type @D [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %DF.type: type = fn_type @DF [concrete] -// CHECK:STDOUT: %DF: %DF.type = struct_value () [concrete] -// CHECK:STDOUT: %D.elem: type = unbound_element_type %D, %i32 [concrete] -// CHECK:STDOUT: %struct_type.d.b7b: type = struct_type {.d: %i32} [concrete] -// CHECK:STDOUT: %complete_type.860: = complete_type_witness %struct_type.d.b7b [concrete] -// CHECK:STDOUT: %CF.type: type = fn_type @CF [concrete] -// CHECK:STDOUT: %CF: %CF.type = struct_value () [concrete] -// CHECK:STDOUT: %C.elem: type = unbound_element_type %C, %i32 [concrete] -// CHECK:STDOUT: %struct_type.c.b66: type = struct_type {.c: %i32} [concrete] -// CHECK:STDOUT: %complete_type.836: = complete_type_witness %struct_type.c.b66 [concrete] -// CHECK:STDOUT: %AF.type: type = fn_type @AF [concrete] -// CHECK:STDOUT: %AF: %AF.type = struct_value () [concrete] -// CHECK:STDOUT: %A.elem: type = unbound_element_type %A, %i32 [concrete] -// CHECK:STDOUT: %struct_type.a.ba9: type = struct_type {.a: %i32} [concrete] -// CHECK:STDOUT: %complete_type.fd7: = complete_type_witness %struct_type.a.ba9 [concrete] -// CHECK:STDOUT: %pattern_type.c10: type = pattern_type %A [concrete] -// CHECK:STDOUT: %int_1.5b8: Core.IntLiteral = int_value 1 [concrete] -// CHECK:STDOUT: %struct_type.a.a6c: type = struct_type {.a: Core.IntLiteral} [concrete] -// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.type.205: type = facet_type <@ImplicitAs, @ImplicitAs(%i32)> [concrete] -// CHECK:STDOUT: %Convert.type.1b6: type = fn_type @Convert.1, @ImplicitAs(%i32) [concrete] -// CHECK:STDOUT: %To.c80: Core.IntLiteral = bind_symbolic_name To, 0 [symbolic] -// CHECK:STDOUT: %Convert.type.0f9: type = fn_type @Convert.2, @impl.4f9(%To.c80) [symbolic] -// CHECK:STDOUT: %Convert.f06: %Convert.type.0f9 = struct_value () [symbolic] -// CHECK:STDOUT: %ImplicitAs.impl_witness.c75: = impl_witness imports.%ImplicitAs.impl_witness_table.a2f, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.type.035: type = fn_type @Convert.2, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.956: %Convert.type.035 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.facet: %ImplicitAs.type.205 = facet_value Core.IntLiteral, (%ImplicitAs.impl_witness.c75) [concrete] -// CHECK:STDOUT: %.9c3: type = fn_type_with_self_type %Convert.type.1b6, %ImplicitAs.facet [concrete] -// CHECK:STDOUT: %Convert.bound.ab5: = bound_method %int_1.5b8, %Convert.956 [concrete] -// CHECK:STDOUT: %Convert.specific_fn: = specific_function %Convert.956, @Convert.2(%int_32) [concrete] -// CHECK:STDOUT: %bound_method.9a1: = bound_method %int_1.5b8, %Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_1.5d2: %i32 = int_value 1 [concrete] -// CHECK:STDOUT: %A.val: %A = struct_value (%int_1.5d2) [concrete] -// CHECK:STDOUT: %pattern_type.98e: type = pattern_type %B [concrete] -// CHECK:STDOUT: %int_2.ecc: Core.IntLiteral = int_value 2 [concrete] -// CHECK:STDOUT: %struct_type.b.a15: type = struct_type {.b: Core.IntLiteral} [concrete] -// CHECK:STDOUT: %Convert.bound.ef9: = bound_method %int_2.ecc, %Convert.956 [concrete] -// CHECK:STDOUT: %bound_method.b92: = bound_method %int_2.ecc, %Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_2.ef8: %i32 = int_value 2 [concrete] -// CHECK:STDOUT: %B.val: %B = struct_value (%int_2.ef8) [concrete] -// CHECK:STDOUT: %pattern_type.6d8: type = pattern_type %C [concrete] -// CHECK:STDOUT: %int_3.1ba: Core.IntLiteral = int_value 3 [concrete] -// CHECK:STDOUT: %struct_type.c.5b8: type = struct_type {.c: Core.IntLiteral} [concrete] -// CHECK:STDOUT: %Convert.bound.b30: = bound_method %int_3.1ba, %Convert.956 [concrete] -// CHECK:STDOUT: %bound_method.047: = bound_method %int_3.1ba, %Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_3.822: %i32 = int_value 3 [concrete] -// CHECK:STDOUT: %C.val: %C = struct_value (%int_3.822) [concrete] -// CHECK:STDOUT: %pattern_type.d58: type = pattern_type %D [concrete] -// CHECK:STDOUT: %int_4.0c1: Core.IntLiteral = int_value 4 [concrete] -// CHECK:STDOUT: %struct_type.d.3ea: type = struct_type {.d: Core.IntLiteral} [concrete] -// CHECK:STDOUT: %Convert.bound.ac3: = bound_method %int_4.0c1, %Convert.956 [concrete] -// CHECK:STDOUT: %bound_method.1da: = bound_method %int_4.0c1, %Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_4.940: %i32 = int_value 4 [concrete] -// CHECK:STDOUT: %D.val: %D = struct_value (%int_4.940) [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/operators/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] -// CHECK:STDOUT: %Core.import_ref.a5b: @impl.4f9.%Convert.type (%Convert.type.0f9) = import_ref Core//prelude/types/int, loc19_39, loaded [symbolic = @impl.4f9.%Convert (constants.%Convert.f06)] -// CHECK:STDOUT: %ImplicitAs.impl_witness_table.a2f = impl_witness_table (%Core.import_ref.a5b), @impl.4f9 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .A = %A.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %A.decl: type = class_decl @A [concrete = constants.%A] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @A { -// CHECK:STDOUT: %B.decl: type = class_decl @B [concrete = constants.%B] {} {} -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: %AF.decl: %AF.type = fn_decl @AF [concrete = constants.%AF] {} {} -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc46: %A.elem = field_decl a, element0 [concrete] -// CHECK:STDOUT: %struct_type.a: type = struct_type {.a: %i32} [concrete = constants.%struct_type.a.ba9] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.a [concrete = constants.%complete_type.fd7] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%A -// CHECK:STDOUT: .B = %B.decl -// CHECK:STDOUT: .AF = %AF.decl -// CHECK:STDOUT: .a = %.loc46 -// CHECK:STDOUT: .A = -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @B { -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: %BF.decl: %BF.type = fn_decl @BF [concrete = constants.%BF] {} {} -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc16: %B.elem = field_decl b, element0 [concrete] -// CHECK:STDOUT: %struct_type.b: type = struct_type {.b: %i32} [concrete = constants.%struct_type.b.0a3] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.b [concrete = constants.%complete_type.ba8] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%B -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: .BF = %BF.decl -// CHECK:STDOUT: .b = %.loc16 -// CHECK:STDOUT: .A = -// CHECK:STDOUT: .B = -// CHECK:STDOUT: .AF = -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C { -// CHECK:STDOUT: %D.decl: type = class_decl @D [concrete = constants.%D] {} {} -// CHECK:STDOUT: %DF.decl: %DF.type = fn_decl @DF [concrete = constants.%DF] {} {} -// CHECK:STDOUT: %CF.decl: %CF.type = fn_decl @CF [concrete = constants.%CF] {} {} -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc42: %C.elem = field_decl c, element0 [concrete] -// CHECK:STDOUT: %struct_type.c: type = struct_type {.c: %i32} [concrete = constants.%struct_type.c.b66] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.c [concrete = constants.%complete_type.836] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%C -// CHECK:STDOUT: .D = %D.decl -// CHECK:STDOUT: .CF = %CF.decl -// CHECK:STDOUT: .c = %.loc42 -// CHECK:STDOUT: .A = -// CHECK:STDOUT: .B = -// CHECK:STDOUT: .C = -// CHECK:STDOUT: .AF = -// CHECK:STDOUT: .BF = -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @D { -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] {} {} -// CHECK:STDOUT: %DF.decl: %DF.type = fn_decl @DF [concrete = constants.%DF] {} {} -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc24: %D.elem = field_decl d, element0 [concrete] -// CHECK:STDOUT: %struct_type.d: type = struct_type {.d: %i32} [concrete = constants.%struct_type.d.b7b] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.d [concrete = constants.%complete_type.860] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%D -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: .DF = %DF.decl -// CHECK:STDOUT: .d = %.loc24 -// CHECK:STDOUT: .A = -// CHECK:STDOUT: .B = -// CHECK:STDOUT: .C = -// CHECK:STDOUT: .D = -// CHECK:STDOUT: .AF = -// CHECK:STDOUT: .BF = -// CHECK:STDOUT: .CF = -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @BF(); -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F(); -// CHECK:STDOUT: -// CHECK:STDOUT: fn @DF() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %a.patt: %pattern_type.c10 = binding_pattern a [concrete] -// CHECK:STDOUT: %a.var_patt: %pattern_type.c10 = var_pattern %a.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %a.var: ref %A = var %a.var_patt -// CHECK:STDOUT: %int_1: Core.IntLiteral = int_value 1 [concrete = constants.%int_1.5b8] -// CHECK:STDOUT: %.loc29_25.1: %struct_type.a.a6c = struct_literal (%int_1) -// CHECK:STDOUT: %impl.elem0.loc29: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc29_25.1: = bound_method %int_1, %impl.elem0.loc29 [concrete = constants.%Convert.bound.ab5] -// CHECK:STDOUT: %specific_fn.loc29: = specific_function %impl.elem0.loc29, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc29_25.2: = bound_method %int_1, %specific_fn.loc29 [concrete = constants.%bound_method.9a1] -// CHECK:STDOUT: %int.convert_checked.loc29: init %i32 = call %bound_method.loc29_25.2(%int_1) [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %.loc29_25.2: init %i32 = converted %int_1, %int.convert_checked.loc29 [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %.loc29_25.3: ref %i32 = class_element_access %a.var, element0 -// CHECK:STDOUT: %.loc29_25.4: init %i32 = initialize_from %.loc29_25.2 to %.loc29_25.3 [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %.loc29_25.5: init %A = class_init (%.loc29_25.4), %a.var [concrete = constants.%A.val] -// CHECK:STDOUT: %.loc29_7: init %A = converted %.loc29_25.1, %.loc29_25.5 [concrete = constants.%A.val] -// CHECK:STDOUT: assign %a.var, %.loc29_7 -// CHECK:STDOUT: %A.ref: type = name_ref A, file.%A.decl [concrete = constants.%A] -// CHECK:STDOUT: %a: ref %A = bind_name a, %a.var -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %b.patt: %pattern_type.98e = binding_pattern b [concrete] -// CHECK:STDOUT: %b.var_patt: %pattern_type.98e = var_pattern %b.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %b.var: ref %B = var %b.var_patt -// CHECK:STDOUT: %int_2: Core.IntLiteral = int_value 2 [concrete = constants.%int_2.ecc] -// CHECK:STDOUT: %.loc30_25.1: %struct_type.b.a15 = struct_literal (%int_2) -// CHECK:STDOUT: %impl.elem0.loc30: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc30_25.1: = bound_method %int_2, %impl.elem0.loc30 [concrete = constants.%Convert.bound.ef9] -// CHECK:STDOUT: %specific_fn.loc30: = specific_function %impl.elem0.loc30, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc30_25.2: = bound_method %int_2, %specific_fn.loc30 [concrete = constants.%bound_method.b92] -// CHECK:STDOUT: %int.convert_checked.loc30: init %i32 = call %bound_method.loc30_25.2(%int_2) [concrete = constants.%int_2.ef8] -// CHECK:STDOUT: %.loc30_25.2: init %i32 = converted %int_2, %int.convert_checked.loc30 [concrete = constants.%int_2.ef8] -// CHECK:STDOUT: %.loc30_25.3: ref %i32 = class_element_access %b.var, element0 -// CHECK:STDOUT: %.loc30_25.4: init %i32 = initialize_from %.loc30_25.2 to %.loc30_25.3 [concrete = constants.%int_2.ef8] -// CHECK:STDOUT: %.loc30_25.5: init %B = class_init (%.loc30_25.4), %b.var [concrete = constants.%B.val] -// CHECK:STDOUT: %.loc30_7: init %B = converted %.loc30_25.1, %.loc30_25.5 [concrete = constants.%B.val] -// CHECK:STDOUT: assign %b.var, %.loc30_7 -// CHECK:STDOUT: %B.ref: type = name_ref B, @A.%B.decl [concrete = constants.%B] -// CHECK:STDOUT: %b: ref %B = bind_name b, %b.var -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %c.patt: %pattern_type.6d8 = binding_pattern c [concrete] -// CHECK:STDOUT: %c.var_patt: %pattern_type.6d8 = var_pattern %c.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %c.var: ref %C = var %c.var_patt -// CHECK:STDOUT: %int_3: Core.IntLiteral = int_value 3 [concrete = constants.%int_3.1ba] -// CHECK:STDOUT: %.loc31_25.1: %struct_type.c.5b8 = struct_literal (%int_3) -// CHECK:STDOUT: %impl.elem0.loc31: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc31_25.1: = bound_method %int_3, %impl.elem0.loc31 [concrete = constants.%Convert.bound.b30] -// CHECK:STDOUT: %specific_fn.loc31: = specific_function %impl.elem0.loc31, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc31_25.2: = bound_method %int_3, %specific_fn.loc31 [concrete = constants.%bound_method.047] -// CHECK:STDOUT: %int.convert_checked.loc31: init %i32 = call %bound_method.loc31_25.2(%int_3) [concrete = constants.%int_3.822] -// CHECK:STDOUT: %.loc31_25.2: init %i32 = converted %int_3, %int.convert_checked.loc31 [concrete = constants.%int_3.822] -// CHECK:STDOUT: %.loc31_25.3: ref %i32 = class_element_access %c.var, element0 -// CHECK:STDOUT: %.loc31_25.4: init %i32 = initialize_from %.loc31_25.2 to %.loc31_25.3 [concrete = constants.%int_3.822] -// CHECK:STDOUT: %.loc31_25.5: init %C = class_init (%.loc31_25.4), %c.var [concrete = constants.%C.val] -// CHECK:STDOUT: %.loc31_7: init %C = converted %.loc31_25.1, %.loc31_25.5 [concrete = constants.%C.val] -// CHECK:STDOUT: assign %c.var, %.loc31_7 -// CHECK:STDOUT: %C.ref: type = name_ref C, @B.%C.decl [concrete = constants.%C] -// CHECK:STDOUT: %c: ref %C = bind_name c, %c.var -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %d.patt: %pattern_type.d58 = binding_pattern d [concrete] -// CHECK:STDOUT: %d.var_patt: %pattern_type.d58 = var_pattern %d.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %d.var: ref %D = var %d.var_patt -// CHECK:STDOUT: %int_4: Core.IntLiteral = int_value 4 [concrete = constants.%int_4.0c1] -// CHECK:STDOUT: %.loc32_25.1: %struct_type.d.3ea = struct_literal (%int_4) -// CHECK:STDOUT: %impl.elem0.loc32: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc32_25.1: = bound_method %int_4, %impl.elem0.loc32 [concrete = constants.%Convert.bound.ac3] -// CHECK:STDOUT: %specific_fn.loc32: = specific_function %impl.elem0.loc32, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc32_25.2: = bound_method %int_4, %specific_fn.loc32 [concrete = constants.%bound_method.1da] -// CHECK:STDOUT: %int.convert_checked.loc32: init %i32 = call %bound_method.loc32_25.2(%int_4) [concrete = constants.%int_4.940] -// CHECK:STDOUT: %.loc32_25.2: init %i32 = converted %int_4, %int.convert_checked.loc32 [concrete = constants.%int_4.940] -// CHECK:STDOUT: %.loc32_25.3: ref %i32 = class_element_access %d.var, element0 -// CHECK:STDOUT: %.loc32_25.4: init %i32 = initialize_from %.loc32_25.2 to %.loc32_25.3 [concrete = constants.%int_4.940] -// CHECK:STDOUT: %.loc32_25.5: init %D = class_init (%.loc32_25.4), %d.var [concrete = constants.%D.val] -// CHECK:STDOUT: %.loc32_7: init %D = converted %.loc32_25.1, %.loc32_25.5 [concrete = constants.%D.val] -// CHECK:STDOUT: assign %d.var, %.loc32_7 -// CHECK:STDOUT: %D.ref: type = name_ref D, @C.%D.decl [concrete = constants.%D] -// CHECK:STDOUT: %d: ref %D = bind_name d, %d.var -// CHECK:STDOUT: %AF.ref: %AF.type = name_ref AF, @A.%AF.decl [concrete = constants.%AF] -// CHECK:STDOUT: %AF.call: init %empty_tuple.type = call %AF.ref() -// CHECK:STDOUT: %BF.ref: %BF.type = name_ref BF, @B.%BF.decl [concrete = constants.%BF] -// CHECK:STDOUT: %BF.call: init %empty_tuple.type = call %BF.ref() -// CHECK:STDOUT: %CF.ref: %CF.type = name_ref CF, @C.%CF.decl [concrete = constants.%CF] -// CHECK:STDOUT: %CF.call: init %empty_tuple.type = call %CF.ref() -// CHECK:STDOUT: %DF.ref: %DF.type = name_ref DF, @D.%DF.decl [concrete = constants.%DF] -// CHECK:STDOUT: %DF.call: init %empty_tuple.type = call %DF.ref() -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @CF(); -// CHECK:STDOUT: -// CHECK:STDOUT: fn @AF(); -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/scope.carbon b/toolchain/check/testdata/class/scope.carbon deleted file mode 100644 index 85bb20b169d48..0000000000000 --- a/toolchain/check/testdata/class/scope.carbon +++ /dev/null @@ -1,201 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/scope.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/scope.carbon - -class Class { - fn F() -> i32 { - return 1; - } - - fn G() -> i32 { - return F(); - } -} - -fn F() -> i32 { - return 2; -} - -fn Run() { - var a: i32 = F(); - var b: i32 = Class.F(); -} - -// CHECK:STDOUT: --- scope.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Class: type = class_type @Class [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %F.type.f1b: type = fn_type @F.1 [concrete] -// CHECK:STDOUT: %F.1f2: %F.type.f1b = struct_value () [concrete] -// CHECK:STDOUT: %G.type: type = fn_type @G [concrete] -// CHECK:STDOUT: %G: %G.type = struct_value () [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %int_1.5b8: Core.IntLiteral = int_value 1 [concrete] -// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.type.205: type = facet_type <@ImplicitAs, @ImplicitAs(%i32)> [concrete] -// CHECK:STDOUT: %Convert.type.1b6: type = fn_type @Convert.1, @ImplicitAs(%i32) [concrete] -// CHECK:STDOUT: %To.c80: Core.IntLiteral = bind_symbolic_name To, 0 [symbolic] -// CHECK:STDOUT: %Convert.type.0f9: type = fn_type @Convert.2, @impl.4f9(%To.c80) [symbolic] -// CHECK:STDOUT: %Convert.f06: %Convert.type.0f9 = struct_value () [symbolic] -// CHECK:STDOUT: %ImplicitAs.impl_witness.c75: = impl_witness imports.%ImplicitAs.impl_witness_table.a2f, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.type.035: type = fn_type @Convert.2, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.956: %Convert.type.035 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.facet: %ImplicitAs.type.205 = facet_value Core.IntLiteral, (%ImplicitAs.impl_witness.c75) [concrete] -// CHECK:STDOUT: %.9c3: type = fn_type_with_self_type %Convert.type.1b6, %ImplicitAs.facet [concrete] -// CHECK:STDOUT: %Convert.bound.ab5: = bound_method %int_1.5b8, %Convert.956 [concrete] -// CHECK:STDOUT: %Convert.specific_fn: = specific_function %Convert.956, @Convert.2(%int_32) [concrete] -// CHECK:STDOUT: %bound_method.9a1: = bound_method %int_1.5b8, %Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_1.5d2: %i32 = int_value 1 [concrete] -// CHECK:STDOUT: %F.type.b25: type = fn_type @F.2 [concrete] -// CHECK:STDOUT: %F.c41: %F.type.b25 = struct_value () [concrete] -// CHECK:STDOUT: %int_2.ecc: Core.IntLiteral = int_value 2 [concrete] -// CHECK:STDOUT: %Convert.bound.ef9: = bound_method %int_2.ecc, %Convert.956 [concrete] -// CHECK:STDOUT: %bound_method.b92: = bound_method %int_2.ecc, %Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_2.ef8: %i32 = int_value 2 [concrete] -// CHECK:STDOUT: %Run.type: type = fn_type @Run [concrete] -// CHECK:STDOUT: %Run: %Run.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/operators/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] -// CHECK:STDOUT: %Core.import_ref.a5b: @impl.4f9.%Convert.type (%Convert.type.0f9) = import_ref Core//prelude/types/int, loc19_39, loaded [symbolic = @impl.4f9.%Convert (constants.%Convert.f06)] -// CHECK:STDOUT: %ImplicitAs.impl_witness_table.a2f = impl_witness_table (%Core.import_ref.a5b), @impl.4f9 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Class = %Class.decl -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: .Run = %Run.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Class.decl: type = class_decl @Class [concrete = constants.%Class] {} {} -// CHECK:STDOUT: %F.decl: %F.type.b25 = fn_decl @F.2 [concrete = constants.%F.c41] { -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param0 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %Run.decl: %Run.type = fn_decl @Run [concrete = constants.%Run] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Class { -// CHECK:STDOUT: %F.decl: %F.type.f1b = fn_decl @F.1 [concrete = constants.%F.1f2] { -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param0 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %G.decl: %G.type = fn_decl @G [concrete = constants.%G] { -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param0 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Class -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: .G = %G.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F.1() -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %int_1: Core.IntLiteral = int_value 1 [concrete = constants.%int_1.5b8] -// CHECK:STDOUT: %impl.elem0: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc13_13.1: = bound_method %int_1, %impl.elem0 [concrete = constants.%Convert.bound.ab5] -// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc13_13.2: = bound_method %int_1, %specific_fn [concrete = constants.%bound_method.9a1] -// CHECK:STDOUT: %int.convert_checked: init %i32 = call %bound_method.loc13_13.2(%int_1) [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %.loc13_13.1: %i32 = value_of_initializer %int.convert_checked [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %.loc13_13.2: %i32 = converted %int_1, %.loc13_13.1 [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: return %.loc13_13.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @G() -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %F.ref: %F.type.f1b = name_ref F, @Class.%F.decl [concrete = constants.%F.1f2] -// CHECK:STDOUT: %F.call: init %i32 = call %F.ref() -// CHECK:STDOUT: %.loc17_15.1: %i32 = value_of_initializer %F.call -// CHECK:STDOUT: %.loc17_15.2: %i32 = converted %F.call, %.loc17_15.1 -// CHECK:STDOUT: return %.loc17_15.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F.2() -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %int_2: Core.IntLiteral = int_value 2 [concrete = constants.%int_2.ecc] -// CHECK:STDOUT: %impl.elem0: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc22_11.1: = bound_method %int_2, %impl.elem0 [concrete = constants.%Convert.bound.ef9] -// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc22_11.2: = bound_method %int_2, %specific_fn [concrete = constants.%bound_method.b92] -// CHECK:STDOUT: %int.convert_checked: init %i32 = call %bound_method.loc22_11.2(%int_2) [concrete = constants.%int_2.ef8] -// CHECK:STDOUT: %.loc22_11.1: %i32 = value_of_initializer %int.convert_checked [concrete = constants.%int_2.ef8] -// CHECK:STDOUT: %.loc22_11.2: %i32 = converted %int_2, %.loc22_11.1 [concrete = constants.%int_2.ef8] -// CHECK:STDOUT: return %.loc22_11.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Run() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %a.patt: %pattern_type.7ce = binding_pattern a [concrete] -// CHECK:STDOUT: %a.var_patt: %pattern_type.7ce = var_pattern %a.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %a.var: ref %i32 = var %a.var_patt -// CHECK:STDOUT: %F.ref.loc26: %F.type.b25 = name_ref F, file.%F.decl [concrete = constants.%F.c41] -// CHECK:STDOUT: %F.call.loc26: init %i32 = call %F.ref.loc26() -// CHECK:STDOUT: assign %a.var, %F.call.loc26 -// CHECK:STDOUT: %.loc26: type = splice_block %i32.loc26 [concrete = constants.%i32] { -// CHECK:STDOUT: %int_32.loc26: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc26: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: } -// CHECK:STDOUT: %a: ref %i32 = bind_name a, %a.var -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %b.patt: %pattern_type.7ce = binding_pattern b [concrete] -// CHECK:STDOUT: %b.var_patt: %pattern_type.7ce = var_pattern %b.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %b.var: ref %i32 = var %b.var_patt -// CHECK:STDOUT: %Class.ref: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %F.ref.loc27: %F.type.f1b = name_ref F, @Class.%F.decl [concrete = constants.%F.1f2] -// CHECK:STDOUT: %F.call.loc27: init %i32 = call %F.ref.loc27() -// CHECK:STDOUT: assign %b.var, %F.call.loc27 -// CHECK:STDOUT: %.loc27: type = splice_block %i32.loc27 [concrete = constants.%i32] { -// CHECK:STDOUT: %int_32.loc27: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc27: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: } -// CHECK:STDOUT: %b: ref %i32 = bind_name b, %b.var -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/self.carbon b/toolchain/check/testdata/class/self.carbon deleted file mode 100644 index 0621ea8685ec8..0000000000000 --- a/toolchain/check/testdata/class/self.carbon +++ /dev/null @@ -1,239 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/self.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/self.carbon - -// --- self.carbon - -library "[[@TEST_NAME]]"; - -class Class { - fn F[self: Self]() -> i32; - fn G[addr self: Self*]() -> i32; - - var n: i32; -} - -fn Class.F[self: Self]() -> i32 { - return self.n; -} - -fn Class.G[addr self: Self*]() -> i32 { - return (*self).n; -} - -// --- fail_return_self_value.carbon - -library "[[@TEST_NAME]]"; - -class Class { - // CHECK:STDERR: fail_return_self_value.carbon:[[@LINE+7]]:25: error: cannot implicitly convert non-type value of type `Class` to `type` [ConversionFailureNonTypeToFacet] - // CHECK:STDERR: fn F[self: Self]() -> self; - // CHECK:STDERR: ^~~~ - // CHECK:STDERR: fail_return_self_value.carbon:[[@LINE+4]]:25: note: type `Class` does not implement interface `Core.ImplicitAs(type)` [MissingImplInMemberAccessNote] - // CHECK:STDERR: fn F[self: Self]() -> self; - // CHECK:STDERR: ^~~~ - // CHECK:STDERR: - fn F[self: Self]() -> self; -} - -// CHECK:STDOUT: --- self.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Class: type = class_type @Class [concrete] -// CHECK:STDOUT: %pattern_type.761: type = pattern_type %Class [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %ptr.e71: type = ptr_type %Class [concrete] -// CHECK:STDOUT: %pattern_type.796: type = pattern_type %ptr.e71 [concrete] -// CHECK:STDOUT: %pattern_type.f6d: type = pattern_type auto [concrete] -// CHECK:STDOUT: %G.type: type = fn_type @G [concrete] -// CHECK:STDOUT: %G: %G.type = struct_value () [concrete] -// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %i32 [concrete] -// CHECK:STDOUT: %struct_type.n: type = struct_type {.n: %i32} [concrete] -// CHECK:STDOUT: %complete_type.54b: = complete_type_witness %struct_type.n [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Class = %Class.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Class.decl: type = class_decl @Class [concrete = constants.%Class] {} {} -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %self.patt: %pattern_type.761 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.761 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32.loc11: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc11: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %self.param.loc11: %Class = value_param call_param0 -// CHECK:STDOUT: %Self.ref.loc11: type = name_ref Self, constants.%Class [concrete = constants.%Class] -// CHECK:STDOUT: %self.loc11: %Class = bind_name self, %self.param.loc11 -// CHECK:STDOUT: %return.param.loc11: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return.loc11: ref %i32 = return_slot %return.param.loc11 -// CHECK:STDOUT: } -// CHECK:STDOUT: %G.decl: %G.type = fn_decl @G [concrete = constants.%G] { -// CHECK:STDOUT: %self.patt: %pattern_type.796 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.796 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc15_12: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32.loc15: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc15: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %self.param.loc15: %ptr.e71 = value_param call_param0 -// CHECK:STDOUT: %.loc15_27: type = splice_block %ptr.loc15 [concrete = constants.%ptr.e71] { -// CHECK:STDOUT: %Self.ref.loc15: type = name_ref Self, constants.%Class [concrete = constants.%Class] -// CHECK:STDOUT: %ptr.loc15: type = ptr_type %Self.ref.loc15 [concrete = constants.%ptr.e71] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self.loc15: %ptr.e71 = bind_name self, %self.param.loc15 -// CHECK:STDOUT: %return.param.loc15: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return.loc15: ref %i32 = return_slot %return.param.loc15 -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Class { -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %self.patt: %pattern_type.761 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.761 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32.loc5: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc5: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %self.param.loc5: %Class = value_param call_param0 -// CHECK:STDOUT: %Self.ref.loc5: type = name_ref Self, constants.%Class [concrete = constants.%Class] -// CHECK:STDOUT: %self.loc5: %Class = bind_name self, %self.param.loc5 -// CHECK:STDOUT: %return.param.loc5: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return.loc5: ref %i32 = return_slot %return.param.loc5 -// CHECK:STDOUT: } -// CHECK:STDOUT: %G.decl: %G.type = fn_decl @G [concrete = constants.%G] { -// CHECK:STDOUT: %self.patt: %pattern_type.796 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.796 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc15_12: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32.loc6: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc6: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %self.param.loc6: %ptr.e71 = value_param call_param0 -// CHECK:STDOUT: %.loc6: type = splice_block %ptr.loc6 [concrete = constants.%ptr.e71] { -// CHECK:STDOUT: %Self.ref.loc6: type = name_ref Self, constants.%Class [concrete = constants.%Class] -// CHECK:STDOUT: %ptr.loc6: type = ptr_type %Self.ref.loc6 [concrete = constants.%ptr.e71] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self.loc6: %ptr.e71 = bind_name self, %self.param.loc6 -// CHECK:STDOUT: %return.param.loc6: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return.loc6: ref %i32 = return_slot %return.param.loc6 -// CHECK:STDOUT: } -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc8: %Class.elem = field_decl n, element0 [concrete] -// CHECK:STDOUT: %struct_type.n: type = struct_type {.n: %i32} [concrete = constants.%struct_type.n] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.n [concrete = constants.%complete_type.54b] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Class -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: .G = %G.decl -// CHECK:STDOUT: .n = %.loc8 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F(%self.param.loc11: %Class) -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %self.ref: %Class = name_ref self, %self.loc11 -// CHECK:STDOUT: %n.ref: %Class.elem = name_ref n, @Class.%.loc8 [concrete = @Class.%.loc8] -// CHECK:STDOUT: %.loc12_14.1: ref %i32 = class_element_access %self.ref, element0 -// CHECK:STDOUT: %.loc12_14.2: %i32 = bind_value %.loc12_14.1 -// CHECK:STDOUT: return %.loc12_14.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @G(%self.param.loc15: %ptr.e71) -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %self.ref: %ptr.e71 = name_ref self, %self.loc15 -// CHECK:STDOUT: %.loc16_11: ref %Class = deref %self.ref -// CHECK:STDOUT: %n.ref: %Class.elem = name_ref n, @Class.%.loc8 [concrete = @Class.%.loc8] -// CHECK:STDOUT: %.loc16_17.1: ref %i32 = class_element_access %.loc16_11, element0 -// CHECK:STDOUT: %.loc16_17.2: %i32 = bind_value %.loc16_17.1 -// CHECK:STDOUT: return %.loc16_17.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_return_self_value.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Class: type = class_type @Class [concrete] -// CHECK:STDOUT: %pattern_type.761: type = pattern_type %Class [concrete] -// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/operators/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Class = %Class.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Class.decl: type = class_decl @Class [concrete = constants.%Class] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Class { -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %self.patt: %pattern_type.761 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.761 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.ref: %Class = name_ref self, %self -// CHECK:STDOUT: %.loc12: type = converted %self.ref, [concrete = ] -// CHECK:STDOUT: %self.param: %Class = value_param call_param0 -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Class [concrete = constants.%Class] -// CHECK:STDOUT: %self: %Class = bind_name self, %self.param -// CHECK:STDOUT: %return.param: ref = out_param call_param1 -// CHECK:STDOUT: %return: ref = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%Class -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F(%self.param: %Class) -> ; -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/self_conversion.carbon b/toolchain/check/testdata/class/self_conversion.carbon deleted file mode 100644 index 9fa8e8af9898a..0000000000000 --- a/toolchain/check/testdata/class/self_conversion.carbon +++ /dev/null @@ -1,257 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/self_conversion.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/self_conversion.carbon - -base class Base { - var a: i32; -} - -class Derived { - extend base: Base; - - fn SelfBase[self: Base]() -> i32; - fn AddrSelfBase[addr self: Base*](); -} - -fn Derived.SelfBase[self: Base]() -> i32 { - return self.a; -} - -fn Derived.AddrSelfBase[addr self: Base*]() { - (*self).a = 1; -} - -fn Call(p: Derived*) -> i32 { - (*p).AddrSelfBase(); - return (*p).SelfBase(); -} - -// CHECK:STDOUT: --- self_conversion.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Base: type = class_type @Base [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %Base.elem: type = unbound_element_type %Base, %i32 [concrete] -// CHECK:STDOUT: %struct_type.a: type = struct_type {.a: %i32} [concrete] -// CHECK:STDOUT: %complete_type.fd7: = complete_type_witness %struct_type.a [concrete] -// CHECK:STDOUT: %Derived: type = class_type @Derived [concrete] -// CHECK:STDOUT: %Derived.elem: type = unbound_element_type %Derived, %Base [concrete] -// CHECK:STDOUT: %pattern_type.bcc: type = pattern_type %Base [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %SelfBase.type: type = fn_type @SelfBase [concrete] -// CHECK:STDOUT: %SelfBase: %SelfBase.type = struct_value () [concrete] -// CHECK:STDOUT: %ptr.11f: type = ptr_type %Base [concrete] -// CHECK:STDOUT: %pattern_type.1b9: type = pattern_type %ptr.11f [concrete] -// CHECK:STDOUT: %pattern_type.f6d: type = pattern_type auto [concrete] -// CHECK:STDOUT: %AddrSelfBase.type: type = fn_type @AddrSelfBase [concrete] -// CHECK:STDOUT: %AddrSelfBase: %AddrSelfBase.type = struct_value () [concrete] -// CHECK:STDOUT: %struct_type.base.b1e: type = struct_type {.base: %Base} [concrete] -// CHECK:STDOUT: %complete_type.15c: = complete_type_witness %struct_type.base.b1e [concrete] -// CHECK:STDOUT: %int_1.5b8: Core.IntLiteral = int_value 1 [concrete] -// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.type.205: type = facet_type <@ImplicitAs, @ImplicitAs(%i32)> [concrete] -// CHECK:STDOUT: %Convert.type.1b6: type = fn_type @Convert.1, @ImplicitAs(%i32) [concrete] -// CHECK:STDOUT: %To.c80: Core.IntLiteral = bind_symbolic_name To, 0 [symbolic] -// CHECK:STDOUT: %Convert.type.0f9: type = fn_type @Convert.2, @impl.4f9(%To.c80) [symbolic] -// CHECK:STDOUT: %Convert.f06: %Convert.type.0f9 = struct_value () [symbolic] -// CHECK:STDOUT: %ImplicitAs.impl_witness.c75: = impl_witness imports.%ImplicitAs.impl_witness_table.a2f, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.type.035: type = fn_type @Convert.2, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.956: %Convert.type.035 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.facet: %ImplicitAs.type.205 = facet_value Core.IntLiteral, (%ImplicitAs.impl_witness.c75) [concrete] -// CHECK:STDOUT: %.9c3: type = fn_type_with_self_type %Convert.type.1b6, %ImplicitAs.facet [concrete] -// CHECK:STDOUT: %Convert.bound: = bound_method %int_1.5b8, %Convert.956 [concrete] -// CHECK:STDOUT: %Convert.specific_fn: = specific_function %Convert.956, @Convert.2(%int_32) [concrete] -// CHECK:STDOUT: %bound_method: = bound_method %int_1.5b8, %Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_1.5d2: %i32 = int_value 1 [concrete] -// CHECK:STDOUT: %ptr.404: type = ptr_type %Derived [concrete] -// CHECK:STDOUT: %pattern_type.605: type = pattern_type %ptr.404 [concrete] -// CHECK:STDOUT: %Call.type: type = fn_type @Call [concrete] -// CHECK:STDOUT: %Call: %Call.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/operators/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] -// CHECK:STDOUT: %Core.import_ref.a5b: @impl.4f9.%Convert.type (%Convert.type.0f9) = import_ref Core//prelude/types/int, loc19_39, loaded [symbolic = @impl.4f9.%Convert (constants.%Convert.f06)] -// CHECK:STDOUT: %ImplicitAs.impl_witness_table.a2f = impl_witness_table (%Core.import_ref.a5b), @impl.4f9 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Base = %Base.decl -// CHECK:STDOUT: .Derived = %Derived.decl -// CHECK:STDOUT: .Call = %Call.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Base.decl: type = class_decl @Base [concrete = constants.%Base] {} {} -// CHECK:STDOUT: %Derived.decl: type = class_decl @Derived [concrete = constants.%Derived] {} {} -// CHECK:STDOUT: %SelfBase.decl: %SelfBase.type = fn_decl @SelfBase [concrete = constants.%SelfBase] { -// CHECK:STDOUT: %self.patt: %pattern_type.bcc = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.bcc = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32.loc22: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc22: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %self.param.loc22: %Base = value_param call_param0 -// CHECK:STDOUT: %Base.ref.loc22: type = name_ref Base, file.%Base.decl [concrete = constants.%Base] -// CHECK:STDOUT: %self.loc22: %Base = bind_name self, %self.param.loc22 -// CHECK:STDOUT: %return.param.loc22: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return.loc22: ref %i32 = return_slot %return.param.loc22 -// CHECK:STDOUT: } -// CHECK:STDOUT: %AddrSelfBase.decl: %AddrSelfBase.type = fn_decl @AddrSelfBase [concrete = constants.%AddrSelfBase] { -// CHECK:STDOUT: %self.patt: %pattern_type.1b9 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.1b9 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc26_25: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param.loc26: %ptr.11f = value_param call_param0 -// CHECK:STDOUT: %.loc26_40: type = splice_block %ptr.loc26 [concrete = constants.%ptr.11f] { -// CHECK:STDOUT: %Base.ref.loc26: type = name_ref Base, file.%Base.decl [concrete = constants.%Base] -// CHECK:STDOUT: %ptr.loc26: type = ptr_type %Base.ref.loc26 [concrete = constants.%ptr.11f] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self.loc26: %ptr.11f = bind_name self, %self.param.loc26 -// CHECK:STDOUT: } -// CHECK:STDOUT: %Call.decl: %Call.type = fn_decl @Call [concrete = constants.%Call] { -// CHECK:STDOUT: %p.patt: %pattern_type.605 = binding_pattern p [concrete] -// CHECK:STDOUT: %p.param_patt: %pattern_type.605 = value_param_pattern %p.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %p.param: %ptr.404 = value_param call_param0 -// CHECK:STDOUT: %.loc30: type = splice_block %ptr [concrete = constants.%ptr.404] { -// CHECK:STDOUT: %Derived.ref: type = name_ref Derived, file.%Derived.decl [concrete = constants.%Derived] -// CHECK:STDOUT: %ptr: type = ptr_type %Derived.ref [concrete = constants.%ptr.404] -// CHECK:STDOUT: } -// CHECK:STDOUT: %p: %ptr.404 = bind_name p, %p.param -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Base { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc12: %Base.elem = field_decl a, element0 [concrete] -// CHECK:STDOUT: %struct_type.a: type = struct_type {.a: %i32} [concrete = constants.%struct_type.a] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.a [concrete = constants.%complete_type.fd7] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Base -// CHECK:STDOUT: .a = %.loc12 -// CHECK:STDOUT: .Base = -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Derived { -// CHECK:STDOUT: %Base.ref: type = name_ref Base, file.%Base.decl [concrete = constants.%Base] -// CHECK:STDOUT: %.loc16: %Derived.elem = base_decl %Base.ref, element0 [concrete] -// CHECK:STDOUT: %SelfBase.decl: %SelfBase.type = fn_decl @SelfBase [concrete = constants.%SelfBase] { -// CHECK:STDOUT: %self.patt: %pattern_type.bcc = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.bcc = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32.loc18: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc18: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %self.param.loc18: %Base = value_param call_param0 -// CHECK:STDOUT: %Base.ref.loc18: type = name_ref Base, file.%Base.decl [concrete = constants.%Base] -// CHECK:STDOUT: %self.loc18: %Base = bind_name self, %self.param.loc18 -// CHECK:STDOUT: %return.param.loc18: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return.loc18: ref %i32 = return_slot %return.param.loc18 -// CHECK:STDOUT: } -// CHECK:STDOUT: %AddrSelfBase.decl: %AddrSelfBase.type = fn_decl @AddrSelfBase [concrete = constants.%AddrSelfBase] { -// CHECK:STDOUT: %self.patt: %pattern_type.1b9 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.1b9 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc26_25: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param.loc19: %ptr.11f = value_param call_param0 -// CHECK:STDOUT: %.loc19: type = splice_block %ptr.loc19 [concrete = constants.%ptr.11f] { -// CHECK:STDOUT: %Base.ref.loc19: type = name_ref Base, file.%Base.decl [concrete = constants.%Base] -// CHECK:STDOUT: %ptr.loc19: type = ptr_type %Base.ref.loc19 [concrete = constants.%ptr.11f] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self.loc19: %ptr.11f = bind_name self, %self.param.loc19 -// CHECK:STDOUT: } -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %Base} [concrete = constants.%struct_type.base.b1e] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base [concrete = constants.%complete_type.15c] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Derived -// CHECK:STDOUT: .Base = -// CHECK:STDOUT: .base = %.loc16 -// CHECK:STDOUT: .SelfBase = %SelfBase.decl -// CHECK:STDOUT: .AddrSelfBase = %AddrSelfBase.decl -// CHECK:STDOUT: extend %Base.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @SelfBase(%self.param.loc22: %Base) -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %self.ref: %Base = name_ref self, %self.loc22 -// CHECK:STDOUT: %a.ref: %Base.elem = name_ref a, @Base.%.loc12 [concrete = @Base.%.loc12] -// CHECK:STDOUT: %.loc23_14.1: ref %i32 = class_element_access %self.ref, element0 -// CHECK:STDOUT: %.loc23_14.2: %i32 = bind_value %.loc23_14.1 -// CHECK:STDOUT: return %.loc23_14.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @AddrSelfBase(%self.param.loc26: %ptr.11f) { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %self.ref: %ptr.11f = name_ref self, %self.loc26 -// CHECK:STDOUT: %.loc27_4: ref %Base = deref %self.ref -// CHECK:STDOUT: %a.ref: %Base.elem = name_ref a, @Base.%.loc12 [concrete = @Base.%.loc12] -// CHECK:STDOUT: %.loc27_10: ref %i32 = class_element_access %.loc27_4, element0 -// CHECK:STDOUT: %int_1: Core.IntLiteral = int_value 1 [concrete = constants.%int_1.5b8] -// CHECK:STDOUT: %impl.elem0: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc27_13.1: = bound_method %int_1, %impl.elem0 [concrete = constants.%Convert.bound] -// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc27_13.2: = bound_method %int_1, %specific_fn [concrete = constants.%bound_method] -// CHECK:STDOUT: %int.convert_checked: init %i32 = call %bound_method.loc27_13.2(%int_1) [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %.loc27_13: init %i32 = converted %int_1, %int.convert_checked [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: assign %.loc27_10, %.loc27_13 -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Call(%p.param: %ptr.404) -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %p.ref.loc31: %ptr.404 = name_ref p, %p -// CHECK:STDOUT: %.loc31_4.1: ref %Derived = deref %p.ref.loc31 -// CHECK:STDOUT: %AddrSelfBase.ref: %AddrSelfBase.type = name_ref AddrSelfBase, @Derived.%AddrSelfBase.decl [concrete = constants.%AddrSelfBase] -// CHECK:STDOUT: %AddrSelfBase.bound: = bound_method %.loc31_4.1, %AddrSelfBase.ref -// CHECK:STDOUT: %addr.loc31_4.1: %ptr.404 = addr_of %.loc31_4.1 -// CHECK:STDOUT: %.loc31_4.2: ref %Derived = deref %addr.loc31_4.1 -// CHECK:STDOUT: %.loc31_4.3: ref %Base = class_element_access %.loc31_4.2, element0 -// CHECK:STDOUT: %addr.loc31_4.2: %ptr.11f = addr_of %.loc31_4.3 -// CHECK:STDOUT: %.loc31_4.4: %ptr.11f = converted %addr.loc31_4.1, %addr.loc31_4.2 -// CHECK:STDOUT: %AddrSelfBase.call: init %empty_tuple.type = call %AddrSelfBase.bound(%.loc31_4.4) -// CHECK:STDOUT: %p.ref.loc32: %ptr.404 = name_ref p, %p -// CHECK:STDOUT: %.loc32_11.1: ref %Derived = deref %p.ref.loc32 -// CHECK:STDOUT: %SelfBase.ref: %SelfBase.type = name_ref SelfBase, @Derived.%SelfBase.decl [concrete = constants.%SelfBase] -// CHECK:STDOUT: %SelfBase.bound: = bound_method %.loc32_11.1, %SelfBase.ref -// CHECK:STDOUT: %.loc32_11.2: ref %Base = class_element_access %.loc32_11.1, element0 -// CHECK:STDOUT: %.loc32_11.3: ref %Base = converted %.loc32_11.1, %.loc32_11.2 -// CHECK:STDOUT: %.loc32_11.4: %Base = bind_value %.loc32_11.3 -// CHECK:STDOUT: %SelfBase.call: init %i32 = call %SelfBase.bound(%.loc32_11.4) -// CHECK:STDOUT: %.loc32_25.1: %i32 = value_of_initializer %SelfBase.call -// CHECK:STDOUT: %.loc32_25.2: %i32 = converted %SelfBase.call, %.loc32_25.1 -// CHECK:STDOUT: return %.loc32_25.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/self_type.carbon b/toolchain/check/testdata/class/self_type.carbon deleted file mode 100644 index 4199d0225644e..0000000000000 --- a/toolchain/check/testdata/class/self_type.carbon +++ /dev/null @@ -1,149 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/self_type.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/self_type.carbon - -class Class { - fn F[self: Self]() -> i32; - fn Make() -> Self { - returned var s: Self; - s = {.p = &s}; - return var; - } - var p: Self*; -} - -fn Class.F[self: Self]() -> i32 { - return (*self.p).F(); -} - -// CHECK:STDOUT: --- self_type.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Class: type = class_type @Class [concrete] -// CHECK:STDOUT: %pattern_type.761: type = pattern_type %Class [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %Make.type: type = fn_type @Make [concrete] -// CHECK:STDOUT: %Make: %Make.type = struct_value () [concrete] -// CHECK:STDOUT: %ptr.e71: type = ptr_type %Class [concrete] -// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %ptr.e71 [concrete] -// CHECK:STDOUT: %struct_type.p: type = struct_type {.p: %ptr.e71} [concrete] -// CHECK:STDOUT: %complete_type.56d: = complete_type_witness %struct_type.p [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Class = %Class.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Class.decl: type = class_decl @Class [concrete = constants.%Class] {} {} -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %self.patt: %pattern_type.761 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.761 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32.loc21: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc21: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %self.param.loc21: %Class = value_param call_param0 -// CHECK:STDOUT: %Self.ref.loc21: type = name_ref Self, constants.%Class [concrete = constants.%Class] -// CHECK:STDOUT: %self.loc21: %Class = bind_name self, %self.param.loc21 -// CHECK:STDOUT: %return.param.loc21: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return.loc21: ref %i32 = return_slot %return.param.loc21 -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Class { -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %self.patt: %pattern_type.761 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.761 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32.loc12: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc12: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %self.param.loc12: %Class = value_param call_param0 -// CHECK:STDOUT: %Self.ref.loc12: type = name_ref Self, constants.%Class [concrete = constants.%Class] -// CHECK:STDOUT: %self.loc12: %Class = bind_name self, %self.param.loc12 -// CHECK:STDOUT: %return.param.loc12: ref %i32 = out_param call_param1 -// CHECK:STDOUT: %return.loc12: ref %i32 = return_slot %return.param.loc12 -// CHECK:STDOUT: } -// CHECK:STDOUT: %Make.decl: %Make.type = fn_decl @Make [concrete = constants.%Make] { -// CHECK:STDOUT: %return.patt: %pattern_type.761 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.761 = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %Self.ref.loc13: type = name_ref Self, constants.%Class [concrete = constants.%Class] -// CHECK:STDOUT: %return.param: ref %Class = out_param call_param0 -// CHECK:STDOUT: %return: ref %Class = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Class [concrete = constants.%Class] -// CHECK:STDOUT: %ptr: type = ptr_type %Self.ref [concrete = constants.%ptr.e71] -// CHECK:STDOUT: %.loc18: %Class.elem = field_decl p, element0 [concrete] -// CHECK:STDOUT: %struct_type.p: type = struct_type {.p: %ptr.e71} [concrete = constants.%struct_type.p] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.p [concrete = constants.%complete_type.56d] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Class -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: .Make = %Make.decl -// CHECK:STDOUT: .p = %.loc18 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F(%self.param.loc21: %Class) -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %self.ref: %Class = name_ref self, %self.loc21 -// CHECK:STDOUT: %p.ref: %Class.elem = name_ref p, @Class.%.loc18 [concrete = @Class.%.loc18] -// CHECK:STDOUT: %.loc22_16.1: ref %ptr.e71 = class_element_access %self.ref, element0 -// CHECK:STDOUT: %.loc22_16.2: %ptr.e71 = bind_value %.loc22_16.1 -// CHECK:STDOUT: %.loc22_11.1: ref %Class = deref %.loc22_16.2 -// CHECK:STDOUT: %F.ref: %F.type = name_ref F, @Class.%F.decl [concrete = constants.%F] -// CHECK:STDOUT: %F.bound: = bound_method %.loc22_11.1, %F.ref -// CHECK:STDOUT: %.loc22_11.2: %Class = bind_value %.loc22_11.1 -// CHECK:STDOUT: %F.call: init %i32 = call %F.bound(%.loc22_11.2) -// CHECK:STDOUT: %.loc22_23.1: %i32 = value_of_initializer %F.call -// CHECK:STDOUT: %.loc22_23.2: %i32 = converted %F.call, %.loc22_23.1 -// CHECK:STDOUT: return %.loc22_23.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Make() -> %return.param: %Class { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %s.patt: %pattern_type.761 = binding_pattern s [concrete] -// CHECK:STDOUT: %s.var_patt: %pattern_type.761 = var_pattern %s.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %Self.ref.loc14: type = name_ref Self, constants.%Class [concrete = constants.%Class] -// CHECK:STDOUT: %s: ref %Class = bind_name s, %return -// CHECK:STDOUT: %s.ref.loc15_5: ref %Class = name_ref s, %s -// CHECK:STDOUT: %s.ref.loc15_16: ref %Class = name_ref s, %s -// CHECK:STDOUT: %addr: %ptr.e71 = addr_of %s.ref.loc15_16 -// CHECK:STDOUT: %.loc15_17.1: %struct_type.p = struct_literal (%addr) -// CHECK:STDOUT: %.loc15_17.2: ref %ptr.e71 = class_element_access %s.ref.loc15_5, element0 -// CHECK:STDOUT: %.loc15_17.3: init %ptr.e71 = initialize_from %addr to %.loc15_17.2 -// CHECK:STDOUT: %.loc15_17.4: init %Class = class_init (%.loc15_17.3), %s.ref.loc15_5 -// CHECK:STDOUT: %.loc15_7: init %Class = converted %.loc15_17.1, %.loc15_17.4 -// CHECK:STDOUT: assign %s.ref.loc15_5, %.loc15_7 -// CHECK:STDOUT: return %s to %return -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/static_method.carbon b/toolchain/check/testdata/class/static_method.carbon deleted file mode 100644 index f02be29cb2241..0000000000000 --- a/toolchain/check/testdata/class/static_method.carbon +++ /dev/null @@ -1,105 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/static_method.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/static_method.carbon - -class Class { - fn F() -> i32; -} - -fn Run() -> i32 { - var c: Class; - return c.F(); -} - -// CHECK:STDOUT: --- static_method.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Class: type = class_type @Class [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %Run.type: type = fn_type @Run [concrete] -// CHECK:STDOUT: %Run: %Run.type = struct_value () [concrete] -// CHECK:STDOUT: %pattern_type.761: type = pattern_type %Class [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Class = %Class.decl -// CHECK:STDOUT: .Run = %Run.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Class.decl: type = class_decl @Class [concrete = constants.%Class] {} {} -// CHECK:STDOUT: %Run.decl: %Run.type = fn_decl @Run [concrete = constants.%Run] { -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param0 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Class { -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern %return.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %return.param: ref %i32 = out_param call_param0 -// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Class -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F() -> %i32; -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Run() -> %i32 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %c.patt: %pattern_type.761 = binding_pattern c [concrete] -// CHECK:STDOUT: %c.var_patt: %pattern_type.761 = var_pattern %c.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %c.var: ref %Class = var %c.var_patt -// CHECK:STDOUT: %Class.ref: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] -// CHECK:STDOUT: %c: ref %Class = bind_name c, %c.var -// CHECK:STDOUT: %c.ref: ref %Class = name_ref c, %c -// CHECK:STDOUT: %F.ref: %F.type = name_ref F, @Class.%F.decl [concrete = constants.%F] -// CHECK:STDOUT: %F.call: init %i32 = call %F.ref() -// CHECK:STDOUT: %.loc17_15.1: %i32 = value_of_initializer %F.call -// CHECK:STDOUT: %.loc17_15.2: %i32 = converted %F.call, %.loc17_15.1 -// CHECK:STDOUT: return %.loc17_15.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/todo_access_modifiers.carbon b/toolchain/check/testdata/class/todo_access_modifiers.carbon deleted file mode 100644 index f4fab6c68c0b6..0000000000000 --- a/toolchain/check/testdata/class/todo_access_modifiers.carbon +++ /dev/null @@ -1,81 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/todo_access_modifiers.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/todo_access_modifiers.carbon - -// TODO: Test calls to these (member access control is not yet implemented). -class Access { - private fn F(); - - protected fn G(); - - private var k: i32; - - protected var l: i32; -} - -// CHECK:STDOUT: --- todo_access_modifiers.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Access: type = class_type @Access [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %G.type: type = fn_type @G [concrete] -// CHECK:STDOUT: %G: %G.type = struct_value () [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %Access.elem: type = unbound_element_type %Access, %i32 [concrete] -// CHECK:STDOUT: %struct_type.k.l: type = struct_type {.k: %i32, .l: %i32} [concrete] -// CHECK:STDOUT: %complete_type.48a: = complete_type_witness %struct_type.k.l [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Access = %Access.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Access.decl: type = class_decl @Access [concrete = constants.%Access] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Access { -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] {} {} -// CHECK:STDOUT: %G.decl: %G.type = fn_decl @G [concrete = constants.%G] {} {} -// CHECK:STDOUT: %int_32.loc17: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc17: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc17: %Access.elem = field_decl k, element0 [concrete] -// CHECK:STDOUT: %int_32.loc19: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc19: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc19: %Access.elem = field_decl l, element1 [concrete] -// CHECK:STDOUT: %struct_type.k.l: type = struct_type {.k: %i32, .l: %i32} [concrete = constants.%struct_type.k.l] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.k.l [concrete = constants.%complete_type.48a] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Access -// CHECK:STDOUT: .F [private] = %F.decl -// CHECK:STDOUT: .G [protected] = %G.decl -// CHECK:STDOUT: .k [private] = %.loc17 -// CHECK:STDOUT: .l [protected] = %.loc19 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F(); -// CHECK:STDOUT: -// CHECK:STDOUT: fn @G(); -// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/virtual_modifiers.carbon b/toolchain/check/testdata/class/virtual_modifiers.carbon deleted file mode 100644 index 70e9e255394c6..0000000000000 --- a/toolchain/check/testdata/class/virtual_modifiers.carbon +++ /dev/null @@ -1,2424 +0,0 @@ -// Part of the Carbon Language project, under the Apache License v2.0 with LLVM -// Exceptions. See /LICENSE for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -// AUTOUPDATE -// TIP: To test this file alone, run: -// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/class/virtual_modifiers.carbon -// TIP: To dump output, run: -// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/virtual_modifiers.carbon - -// --- modifiers.carbon - -package Modifiers; - -base class Base { - virtual fn H[self: Self](); -} - -abstract class Abstract { - abstract fn J[self: Self](); - - virtual fn K[self: Self](); -} - -// --- override_import.carbon - -library "[[@TEST_NAME]]"; - -import Modifiers; - -class Derived { - extend base: Modifiers.Base; - impl fn H[self: Self](); -} - -fn Use() { - var d: Derived = {.base = {}}; -} - -// --- todo_fail_later_base.carbon - -library "[[@TEST_NAME]]"; - -import Modifiers; - -base class Derived { - virtual fn F[self: Self](); - extend base: Modifiers.Base; -} - -// --- init.carbon - -library "[[@TEST_NAME]]"; - -import Modifiers; - -fn F() { - var v: Modifiers.Base = {}; -} - -// --- impl_abstract.carbon - -library "[[@TEST_NAME]]"; - -abstract class A1 { - virtual fn F[self: Self](); -} - -abstract class A2 { - extend base: A1; - impl fn F[self: Self](); -} - -// --- impl_base.carbon - -library "[[@TEST_NAME]]"; - -base class B1 { - virtual fn F[self: Self](); -} - -base class B2 { - extend base: B1; - impl fn F[self: Self](); -} - -class C { - extend base: B2; - impl fn F[self: Self](); -} - -fn Use() { - var b1: B1 = {}; - var b2: B2 = {.base = {}}; - var c: C = {.base = {.base = {}}}; -} - -// --- fail_modifiers.carbon - -library "[[@TEST_NAME]]"; - -class C { - // CHECK:STDERR: fail_modifiers.carbon:[[@LINE+4]]:3: error: impl without base class [ImplWithoutBase] - // CHECK:STDERR: impl fn F[self: Self](); - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: - impl fn F[self: Self](); -} - -// --- init_members.carbon - -library "[[@TEST_NAME]]"; - -base class Base { - var m1: i32; - var m2: i32; - - virtual fn F[self: Self](); -} - -fn F() { - var i: i32 = 3; - // TODO: These should initialize element1 (.m), not element0 (the vptr) - var b1: Base = {.m2 = i, .m1 = i}; - var b2: Base = {.m2 = 3, .m1 = 5}; - - // This one is good, though. - b1.m2 = 4; -} - -// --- todo_fail_impl_without_base_declaration.carbon - -library "[[@TEST_NAME]]"; - -base class Base { -} - -class Derived { - extend base: Base; - impl fn F[self: Self](); -} - -// --- abstract_impl.carbon - -library "[[@TEST_NAME]]"; - -abstract class AbstractBase { - abstract fn F[self: Self](); -} - -abstract class AbstractIntermediate { - extend base: AbstractBase; -} - -class Derived { - extend base: AbstractIntermediate; - impl fn F[self: Self](); -} - -// --- virtual_impl.carbon - -library "[[@TEST_NAME]]"; - -base class VirtualBase { - virtual fn F[self: Self](); -} - -base class VirtualIntermediate { - extend base: VirtualBase; -} - -class Derived { - extend base: VirtualIntermediate; - impl fn F[self: Self](); -} - -// --- fail_impl_mismatch.carbon - -library "[[@TEST_NAME]]"; - -base class Base { - virtual fn F[self: Self](); -} - -class Derived { - extend base: Base; - // CHECK:STDERR: fail_impl_mismatch.carbon:[[@LINE+7]]:3: error: redeclaration differs because of parameter count of 1 [RedeclParamCountDiffers] - // CHECK:STDERR: impl fn F[self: Self](v: i32); - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_impl_mismatch.carbon:[[@LINE-8]]:3: note: previously declared with parameter count of 0 [RedeclParamCountPrevious] - // CHECK:STDERR: virtual fn F[self: Self](); - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: - impl fn F[self: Self](v: i32); -} - -// --- fail_todo_impl_conversion.carbon - -library "[[@TEST_NAME]]"; - -class T1 { -} - -class T2 { -} - -impl T2 as Core.ImplicitAs(T1) { - fn Convert[self: Self]() -> T1 { - return {}; - } -} - -base class Base { - virtual fn F[self: Self]() -> T1; -} - -class Derived { - extend base: Base; - // CHECK:STDERR: fail_todo_impl_conversion.carbon:[[@LINE+7]]:3: error: function redeclaration differs because return type is `T2` [FunctionRedeclReturnTypeDiffers] - // CHECK:STDERR: impl fn F[self: Self]() -> T2; - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_todo_impl_conversion.carbon:[[@LINE-8]]:3: note: previously declared with return type `T1` [FunctionRedeclReturnTypePrevious] - // CHECK:STDERR: virtual fn F[self: Self]() -> T1; - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: - impl fn F[self: Self]() -> T2; -} - -// --- fail_todo_impl_generic_base.carbon - -library "[[@TEST_NAME]]"; - -class T1 { -} - -base class Base(T:! type) { - virtual fn F[self: Self](t: T); -} - -class Derived { - extend base: Base(T1); - // CHECK:STDERR: fail_todo_impl_generic_base.carbon:[[@LINE+7]]:25: error: type `` of parameter 1 in redeclaration differs from previous parameter type `` [RedeclParamDiffersType] - // CHECK:STDERR: impl fn F[self: Self](t: T1); - // CHECK:STDERR: ^~~~~ - // CHECK:STDERR: fail_todo_impl_generic_base.carbon:[[@LINE-8]]:28: note: previous declaration's corresponding parameter here [RedeclParamPrevious] - // CHECK:STDERR: virtual fn F[self: Self](t: T); - // CHECK:STDERR: ^~~~ - // CHECK:STDERR: - impl fn F[self: Self](t: T1); -} - -// --- fail_virtual_without_self.carbon - -library "[[@TEST_NAME]]"; - -abstract class T1 { - // CHECK:STDERR: fail_virtual_without_self.carbon:[[@LINE+4]]:3: error: virtual class function [VirtualWithoutSelf] - // CHECK:STDERR: virtual fn F(); - // CHECK:STDERR: ^~~~~~~~~~~~~~~ - // CHECK:STDERR: - virtual fn F(); - // CHECK:STDERR: fail_virtual_without_self.carbon:[[@LINE+4]]:3: error: virtual class function [VirtualWithoutSelf] - // CHECK:STDERR: abstract fn G(); - // CHECK:STDERR: ^~~~~~~~~~~~~~~~ - // CHECK:STDERR: - abstract fn G(); -} - -class T2 { - extend base: T1; - // CHECK:STDERR: fail_virtual_without_self.carbon:[[@LINE+4]]:3: error: virtual class function [VirtualWithoutSelf] - // CHECK:STDERR: impl fn F(); - // CHECK:STDERR: ^~~~~~~~~~~~ - // CHECK:STDERR: - impl fn F(); -} - -// --- fail_addr_self_mismatch.carbon - -library "[[@TEST_NAME]]"; - -base class T1 { - virtual fn F1[self: Self*](); -} - -class T2 { - extend base: T1; - // CHECK:STDERR: fail_addr_self_mismatch.carbon:[[@LINE+7]]:14: error: redeclaration differs at implicit parameter 1 [RedeclParamDiffers] - // CHECK:STDERR: impl fn F1[addr self: Self*](); - // CHECK:STDERR: ^~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_addr_self_mismatch.carbon:[[@LINE-8]]:17: note: previous declaration's corresponding implicit parameter here [RedeclParamPrevious] - // CHECK:STDERR: virtual fn F1[self: Self*](); - // CHECK:STDERR: ^~~~~~~~~~~ - // CHECK:STDERR: - impl fn F1[addr self: Self*](); -} - -// --- fail_generic_virtual.carbon - -library "[[@TEST_NAME]]"; - -base class T1 { - // CHECK:STDERR: fail_generic_virtual.carbon:[[@LINE+4]]:3: error: generic virtual function [GenericVirtual] - // CHECK:STDERR: virtual fn F[self: Self, T:! type](); - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: - virtual fn F[self: Self, T:! type](); -} - -// --- fail_generic_virtual_in_generic_class.carbon - -library "[[@TEST_NAME]]"; - -base class T1(T:! type) { - // CHECK:STDERR: fail_generic_virtual_in_generic_class.carbon:[[@LINE+4]]:3: error: generic virtual function [GenericVirtual] - // CHECK:STDERR: virtual fn F[self: Self, T:! type](); - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: - virtual fn F[self: Self, T:! type](); -} - -// --- generic_with_virtual.carbon - -library "[[@TEST_NAME]]"; - -base class T1(T:! type) { - virtual fn F[self: Self](); -} - -// --- with_dependent_arg.carbon - -library "[[@TEST_NAME]]"; - -base class T1(T:! type) { - virtual fn F[self: Self](t: T); -} - - -// CHECK:STDOUT: --- modifiers.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Base: type = class_type @Base [concrete] -// CHECK:STDOUT: %pattern_type.bcc: type = pattern_type %Base [concrete] -// CHECK:STDOUT: %H.type: type = fn_type @H [concrete] -// CHECK:STDOUT: %H: %H.type = struct_value () [concrete] -// CHECK:STDOUT: %ptr: type = ptr_type [concrete] -// CHECK:STDOUT: %.c3d: = vtable (%H) [concrete] -// CHECK:STDOUT: %struct_type.vptr: type = struct_type {.: %ptr} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.vptr [concrete] -// CHECK:STDOUT: %Abstract: type = class_type @Abstract [concrete] -// CHECK:STDOUT: %pattern_type.41e: type = pattern_type %Abstract [concrete] -// CHECK:STDOUT: %J.type: type = fn_type @J [concrete] -// CHECK:STDOUT: %J: %J.type = struct_value () [concrete] -// CHECK:STDOUT: %K.type: type = fn_type @K [concrete] -// CHECK:STDOUT: %K: %K.type = struct_value () [concrete] -// CHECK:STDOUT: %.2b2: = vtable (%J, %K) [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Base = %Base.decl -// CHECK:STDOUT: .Abstract = %Abstract.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Base.decl: type = class_decl @Base [concrete = constants.%Base] {} {} -// CHECK:STDOUT: %Abstract.decl: type = class_decl @Abstract [concrete = constants.%Abstract] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Base { -// CHECK:STDOUT: %H.decl: %H.type = fn_decl @H [concrete = constants.%H] { -// CHECK:STDOUT: %self.patt: %pattern_type.bcc = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.bcc = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %Base = value_param call_param0 -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Base [concrete = constants.%Base] -// CHECK:STDOUT: %self: %Base = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %.loc6: = vtable (%H.decl) [concrete = constants.%.c3d] -// CHECK:STDOUT: %struct_type.vptr: type = struct_type {.: %ptr} [concrete = constants.%struct_type.vptr] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.vptr [concrete = constants.%complete_type] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Base -// CHECK:STDOUT: .H = %H.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Abstract { -// CHECK:STDOUT: %J.decl: %J.type = fn_decl @J [concrete = constants.%J] { -// CHECK:STDOUT: %self.patt: %pattern_type.41e = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.41e = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %Abstract = value_param call_param0 -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Abstract [concrete = constants.%Abstract] -// CHECK:STDOUT: %self: %Abstract = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %K.decl: %K.type = fn_decl @K [concrete = constants.%K] { -// CHECK:STDOUT: %self.patt: %pattern_type.41e = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.41e = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %Abstract = value_param call_param0 -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Abstract [concrete = constants.%Abstract] -// CHECK:STDOUT: %self: %Abstract = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %.loc12: = vtable (%J.decl, %K.decl) [concrete = constants.%.2b2] -// CHECK:STDOUT: %struct_type.vptr: type = struct_type {.: %ptr} [concrete = constants.%struct_type.vptr] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.vptr [concrete = constants.%complete_type] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Abstract -// CHECK:STDOUT: .J = %J.decl -// CHECK:STDOUT: .K = %K.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: virtual fn @H(%self.param: %Base); -// CHECK:STDOUT: -// CHECK:STDOUT: abstract fn @J(%self.param: %Abstract); -// CHECK:STDOUT: -// CHECK:STDOUT: virtual fn @K(%self.param: %Abstract); -// CHECK:STDOUT: -// CHECK:STDOUT: --- override_import.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Derived: type = class_type @Derived [concrete] -// CHECK:STDOUT: %Base: type = class_type @Base [concrete] -// CHECK:STDOUT: %ptr.454: type = ptr_type [concrete] -// CHECK:STDOUT: %struct_type.vptr: type = struct_type {.: %ptr.454} [concrete] -// CHECK:STDOUT: %complete_type.513: = complete_type_witness %struct_type.vptr [concrete] -// CHECK:STDOUT: %Derived.elem: type = unbound_element_type %Derived, %Base [concrete] -// CHECK:STDOUT: %pattern_type.fb9: type = pattern_type %Derived [concrete] -// CHECK:STDOUT: %H.type.dba: type = fn_type @H.1 [concrete] -// CHECK:STDOUT: %H.bce: %H.type.dba = struct_value () [concrete] -// CHECK:STDOUT: %.dce: = vtable (%H.bce) [concrete] -// CHECK:STDOUT: %struct_type.base.96c: type = struct_type {.base: %Base} [concrete] -// CHECK:STDOUT: %complete_type.0e2: = complete_type_witness %struct_type.base.96c [concrete] -// CHECK:STDOUT: %Use.type: type = fn_type @Use [concrete] -// CHECK:STDOUT: %Use: %Use.type = struct_value () [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %struct_type.base.f5e: type = struct_type {.base: %empty_struct_type} [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Modifiers: = namespace file.%Modifiers.import, [concrete] { -// CHECK:STDOUT: .Base = %Modifiers.Base -// CHECK:STDOUT: import Modifiers//default -// CHECK:STDOUT: } -// CHECK:STDOUT: %Modifiers.Base: type = import_ref Modifiers//default, Base, loaded [concrete = constants.%Base] -// CHECK:STDOUT: %Modifiers.import_ref.05e: = import_ref Modifiers//default, loc6_1, loaded [concrete = constants.%complete_type.513] -// CHECK:STDOUT: %Modifiers.import_ref.1f3 = import_ref Modifiers//default, inst18 [no loc], unloaded -// CHECK:STDOUT: %Modifiers.import_ref.2cc = import_ref Modifiers//default, loc5_29, unloaded -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Modifiers = imports.%Modifiers -// CHECK:STDOUT: .Derived = %Derived.decl -// CHECK:STDOUT: .Use = %Use.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Modifiers.import = import Modifiers -// CHECK:STDOUT: %Derived.decl: type = class_decl @Derived [concrete = constants.%Derived] {} {} -// CHECK:STDOUT: %Use.decl: %Use.type = fn_decl @Use [concrete = constants.%Use] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Derived { -// CHECK:STDOUT: %Modifiers.ref: = name_ref Modifiers, imports.%Modifiers [concrete = imports.%Modifiers] -// CHECK:STDOUT: %Base.ref: type = name_ref Base, imports.%Modifiers.Base [concrete = constants.%Base] -// CHECK:STDOUT: %.loc7: %Derived.elem = base_decl %Base.ref, element0 [concrete] -// CHECK:STDOUT: %H.decl: %H.type.dba = fn_decl @H.1 [concrete = constants.%H.bce] { -// CHECK:STDOUT: %self.patt: %pattern_type.fb9 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.fb9 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %Derived = value_param call_param0 -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Derived [concrete = constants.%Derived] -// CHECK:STDOUT: %self: %Derived = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %.loc9: = vtable (%H.decl) [concrete = constants.%.dce] -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %Base} [concrete = constants.%struct_type.base.96c] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base [concrete = constants.%complete_type.0e2] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Derived -// CHECK:STDOUT: .Modifiers = -// CHECK:STDOUT: .base = %.loc7 -// CHECK:STDOUT: .H = %H.decl -// CHECK:STDOUT: extend %Base.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Base [from "modifiers.carbon"] { -// CHECK:STDOUT: complete_type_witness = imports.%Modifiers.import_ref.05e -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Modifiers.import_ref.1f3 -// CHECK:STDOUT: .H = imports.%Modifiers.import_ref.2cc -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: impl fn @H.1(%self.param: %Derived); -// CHECK:STDOUT: -// CHECK:STDOUT: fn @H.2 [from "modifiers.carbon"]; -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Use() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %d.patt: %pattern_type.fb9 = binding_pattern d [concrete] -// CHECK:STDOUT: %d.var_patt: %pattern_type.fb9 = var_pattern %d.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %d.var: ref %Derived = var %d.var_patt -// CHECK:STDOUT: %.loc12_30.1: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %.loc12_31.1: %struct_type.base.f5e = struct_literal (%.loc12_30.1) -// CHECK:STDOUT: %.loc12_31.2: ref %Base = class_element_access %d.var, element0 -// CHECK:STDOUT: %.loc12_30.2: ref %ptr.454 = class_element_access %.loc12_31.2, element0 -// CHECK:STDOUT: %.loc12_30.3: ref %ptr.454 = vtable_ptr @Derived.%.loc9 -// CHECK:STDOUT: %.loc12_30.4: init %ptr.454 = initialize_from %.loc12_30.3 to %.loc12_30.2 -// CHECK:STDOUT: %.loc12_30.5: init %Base = class_init (%.loc12_30.4), %.loc12_31.2 -// CHECK:STDOUT: %.loc12_31.3: init %Base = converted %.loc12_30.1, %.loc12_30.5 -// CHECK:STDOUT: %.loc12_31.4: init %Derived = class_init (%.loc12_31.3), %d.var -// CHECK:STDOUT: %.loc12_3: init %Derived = converted %.loc12_31.1, %.loc12_31.4 -// CHECK:STDOUT: assign %d.var, %.loc12_3 -// CHECK:STDOUT: %Derived.ref: type = name_ref Derived, file.%Derived.decl [concrete = constants.%Derived] -// CHECK:STDOUT: %d: ref %Derived = bind_name d, %d.var -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- todo_fail_later_base.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Derived: type = class_type @Derived [concrete] -// CHECK:STDOUT: %pattern_type.fb9: type = pattern_type %Derived [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %Base: type = class_type @Base [concrete] -// CHECK:STDOUT: %ptr.454: type = ptr_type [concrete] -// CHECK:STDOUT: %struct_type.vptr: type = struct_type {.: %ptr.454} [concrete] -// CHECK:STDOUT: %complete_type.513: = complete_type_witness %struct_type.vptr [concrete] -// CHECK:STDOUT: %Derived.elem: type = unbound_element_type %Derived, %Base [concrete] -// CHECK:STDOUT: %H.type: type = fn_type @H [concrete] -// CHECK:STDOUT: %H: %H.type = struct_value () [concrete] -// CHECK:STDOUT: %.02f: = vtable (%H, %F) [concrete] -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %Base} [concrete] -// CHECK:STDOUT: %complete_type.0e2: = complete_type_witness %struct_type.base [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Modifiers: = namespace file.%Modifiers.import, [concrete] { -// CHECK:STDOUT: .Base = %Modifiers.Base -// CHECK:STDOUT: import Modifiers//default -// CHECK:STDOUT: } -// CHECK:STDOUT: %Modifiers.Base: type = import_ref Modifiers//default, Base, loaded [concrete = constants.%Base] -// CHECK:STDOUT: %Modifiers.import_ref.05e: = import_ref Modifiers//default, loc6_1, loaded [concrete = constants.%complete_type.513] -// CHECK:STDOUT: %Modifiers.import_ref.1f3 = import_ref Modifiers//default, inst18 [no loc], unloaded -// CHECK:STDOUT: %Modifiers.import_ref.2cc = import_ref Modifiers//default, loc5_29, unloaded -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Modifiers = imports.%Modifiers -// CHECK:STDOUT: .Derived = %Derived.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Modifiers.import = import Modifiers -// CHECK:STDOUT: %Derived.decl: type = class_decl @Derived [concrete = constants.%Derived] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Derived { -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %self.patt: %pattern_type.fb9 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.fb9 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %Derived = value_param call_param0 -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Derived [concrete = constants.%Derived] -// CHECK:STDOUT: %self: %Derived = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %Modifiers.ref: = name_ref Modifiers, imports.%Modifiers [concrete = imports.%Modifiers] -// CHECK:STDOUT: %Base.ref: type = name_ref Base, imports.%Modifiers.Base [concrete = constants.%Base] -// CHECK:STDOUT: %.loc8: %Derived.elem = base_decl %Base.ref, element0 [concrete] -// CHECK:STDOUT: %.loc9: = vtable (constants.%H, %F.decl) [concrete = constants.%.02f] -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %Base} [concrete = constants.%struct_type.base] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base [concrete = constants.%complete_type.0e2] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Derived -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: .Modifiers = -// CHECK:STDOUT: .base = %.loc8 -// CHECK:STDOUT: extend %Base.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Base [from "modifiers.carbon"] { -// CHECK:STDOUT: complete_type_witness = imports.%Modifiers.import_ref.05e -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Modifiers.import_ref.1f3 -// CHECK:STDOUT: .H = imports.%Modifiers.import_ref.2cc -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: virtual fn @F(%self.param: %Derived); -// CHECK:STDOUT: -// CHECK:STDOUT: fn @H [from "modifiers.carbon"]; -// CHECK:STDOUT: -// CHECK:STDOUT: --- init.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: %Base: type = class_type @Base [concrete] -// CHECK:STDOUT: %ptr.454: type = ptr_type [concrete] -// CHECK:STDOUT: %struct_type.vptr: type = struct_type {.: %ptr.454} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.vptr [concrete] -// CHECK:STDOUT: %pattern_type: type = pattern_type %Base [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Modifiers: = namespace file.%Modifiers.import, [concrete] { -// CHECK:STDOUT: .Base = %Modifiers.Base -// CHECK:STDOUT: import Modifiers//default -// CHECK:STDOUT: } -// CHECK:STDOUT: %Modifiers.Base: type = import_ref Modifiers//default, Base, loaded [concrete = constants.%Base] -// CHECK:STDOUT: %Modifiers.import_ref.ace = import_ref Modifiers//default, loc6_1, unloaded -// CHECK:STDOUT: %Modifiers.import_ref.05e: = import_ref Modifiers//default, loc6_1, loaded [concrete = constants.%complete_type] -// CHECK:STDOUT: %Modifiers.import_ref.1f3 = import_ref Modifiers//default, inst18 [no loc], unloaded -// CHECK:STDOUT: %Modifiers.import_ref.2cc = import_ref Modifiers//default, loc5_29, unloaded -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Modifiers = imports.%Modifiers -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Modifiers.import = import Modifiers -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Base [from "modifiers.carbon"] { -// CHECK:STDOUT: complete_type_witness = imports.%Modifiers.import_ref.05e -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = imports.%Modifiers.import_ref.1f3 -// CHECK:STDOUT: .H = imports.%Modifiers.import_ref.2cc -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %v.patt: %pattern_type = binding_pattern v [concrete] -// CHECK:STDOUT: %v.var_patt: %pattern_type = var_pattern %v.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %v.var: ref %Base = var %v.var_patt -// CHECK:STDOUT: %.loc7_28.1: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %.loc7_28.2: ref %ptr.454 = class_element_access %v.var, element0 -// CHECK:STDOUT: %.loc7_28.3: ref %ptr.454 = vtable_ptr imports.%Modifiers.import_ref.ace -// CHECK:STDOUT: %.loc7_28.4: init %ptr.454 = initialize_from %.loc7_28.3 to %.loc7_28.2 -// CHECK:STDOUT: %.loc7_28.5: init %Base = class_init (%.loc7_28.4), %v.var -// CHECK:STDOUT: %.loc7_3: init %Base = converted %.loc7_28.1, %.loc7_28.5 -// CHECK:STDOUT: assign %v.var, %.loc7_3 -// CHECK:STDOUT: %.loc7_19: type = splice_block %Base.ref [concrete = constants.%Base] { -// CHECK:STDOUT: %Modifiers.ref: = name_ref Modifiers, imports.%Modifiers [concrete = imports.%Modifiers] -// CHECK:STDOUT: %Base.ref: type = name_ref Base, imports.%Modifiers.Base [concrete = constants.%Base] -// CHECK:STDOUT: } -// CHECK:STDOUT: %v: ref %Base = bind_name v, %v.var -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- impl_abstract.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %A1: type = class_type @A1 [concrete] -// CHECK:STDOUT: %pattern_type.ddb: type = pattern_type %A1 [concrete] -// CHECK:STDOUT: %F.type.13a: type = fn_type @F.1 [concrete] -// CHECK:STDOUT: %F.df5: %F.type.13a = struct_value () [concrete] -// CHECK:STDOUT: %ptr.454: type = ptr_type [concrete] -// CHECK:STDOUT: %.593: = vtable (%F.df5) [concrete] -// CHECK:STDOUT: %struct_type.vptr: type = struct_type {.: %ptr.454} [concrete] -// CHECK:STDOUT: %complete_type.513: = complete_type_witness %struct_type.vptr [concrete] -// CHECK:STDOUT: %A2: type = class_type @A2 [concrete] -// CHECK:STDOUT: %A2.elem: type = unbound_element_type %A2, %A1 [concrete] -// CHECK:STDOUT: %pattern_type.b21: type = pattern_type %A2 [concrete] -// CHECK:STDOUT: %F.type.4ae: type = fn_type @F.2 [concrete] -// CHECK:STDOUT: %F.1d5: %F.type.4ae = struct_value () [concrete] -// CHECK:STDOUT: %.943: = vtable (%F.1d5) [concrete] -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %A1} [concrete] -// CHECK:STDOUT: %complete_type.a6f: = complete_type_witness %struct_type.base [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .A1 = %A1.decl -// CHECK:STDOUT: .A2 = %A2.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %A1.decl: type = class_decl @A1 [concrete = constants.%A1] {} {} -// CHECK:STDOUT: %A2.decl: type = class_decl @A2 [concrete = constants.%A2] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @A1 { -// CHECK:STDOUT: %F.decl: %F.type.13a = fn_decl @F.1 [concrete = constants.%F.df5] { -// CHECK:STDOUT: %self.patt: %pattern_type.ddb = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.ddb = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %A1 = value_param call_param0 -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%A1 [concrete = constants.%A1] -// CHECK:STDOUT: %self: %A1 = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %.loc6: = vtable (%F.decl) [concrete = constants.%.593] -// CHECK:STDOUT: %struct_type.vptr: type = struct_type {.: %ptr.454} [concrete = constants.%struct_type.vptr] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.vptr [concrete = constants.%complete_type.513] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%A1 -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @A2 { -// CHECK:STDOUT: %A1.ref: type = name_ref A1, file.%A1.decl [concrete = constants.%A1] -// CHECK:STDOUT: %.loc9: %A2.elem = base_decl %A1.ref, element0 [concrete] -// CHECK:STDOUT: %F.decl: %F.type.4ae = fn_decl @F.2 [concrete = constants.%F.1d5] { -// CHECK:STDOUT: %self.patt: %pattern_type.b21 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.b21 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %A2 = value_param call_param0 -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%A2 [concrete = constants.%A2] -// CHECK:STDOUT: %self: %A2 = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %.loc11: = vtable (%F.decl) [concrete = constants.%.943] -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %A1} [concrete = constants.%struct_type.base] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base [concrete = constants.%complete_type.a6f] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%A2 -// CHECK:STDOUT: .A1 = -// CHECK:STDOUT: .base = %.loc9 -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: extend %A1.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: virtual fn @F.1(%self.param: %A1); -// CHECK:STDOUT: -// CHECK:STDOUT: impl fn @F.2(%self.param: %A2); -// CHECK:STDOUT: -// CHECK:STDOUT: --- impl_base.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %B1: type = class_type @B1 [concrete] -// CHECK:STDOUT: %pattern_type.e47: type = pattern_type %B1 [concrete] -// CHECK:STDOUT: %F.type.e4c: type = fn_type @F.1 [concrete] -// CHECK:STDOUT: %F.8f5: %F.type.e4c = struct_value () [concrete] -// CHECK:STDOUT: %ptr.454: type = ptr_type [concrete] -// CHECK:STDOUT: %.bc5: = vtable (%F.8f5) [concrete] -// CHECK:STDOUT: %struct_type.vptr: type = struct_type {.: %ptr.454} [concrete] -// CHECK:STDOUT: %complete_type.513: = complete_type_witness %struct_type.vptr [concrete] -// CHECK:STDOUT: %B2: type = class_type @B2 [concrete] -// CHECK:STDOUT: %B2.elem: type = unbound_element_type %B2, %B1 [concrete] -// CHECK:STDOUT: %pattern_type.b19: type = pattern_type %B2 [concrete] -// CHECK:STDOUT: %F.type.b26: type = fn_type @F.2 [concrete] -// CHECK:STDOUT: %F.d48: %F.type.b26 = struct_value () [concrete] -// CHECK:STDOUT: %.579: = vtable (%F.d48) [concrete] -// CHECK:STDOUT: %struct_type.base.508: type = struct_type {.base: %B1} [concrete] -// CHECK:STDOUT: %complete_type.5ac: = complete_type_witness %struct_type.base.508 [concrete] -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %C.elem: type = unbound_element_type %C, %B2 [concrete] -// CHECK:STDOUT: %pattern_type.c48: type = pattern_type %C [concrete] -// CHECK:STDOUT: %F.type.c29: type = fn_type @F.3 [concrete] -// CHECK:STDOUT: %F.437: %F.type.c29 = struct_value () [concrete] -// CHECK:STDOUT: %.5f6: = vtable (%F.437) [concrete] -// CHECK:STDOUT: %struct_type.base.421: type = struct_type {.base: %B2} [concrete] -// CHECK:STDOUT: %complete_type.066: = complete_type_witness %struct_type.base.421 [concrete] -// CHECK:STDOUT: %Use.type: type = fn_type @Use [concrete] -// CHECK:STDOUT: %Use: %Use.type = struct_value () [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %struct_type.base.f5e: type = struct_type {.base: %empty_struct_type} [concrete] -// CHECK:STDOUT: %struct_type.base.a0c: type = struct_type {.base: %struct_type.base.f5e} [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .B1 = %B1.decl -// CHECK:STDOUT: .B2 = %B2.decl -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: .Use = %Use.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %B1.decl: type = class_decl @B1 [concrete = constants.%B1] {} {} -// CHECK:STDOUT: %B2.decl: type = class_decl @B2 [concrete = constants.%B2] {} {} -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: %Use.decl: %Use.type = fn_decl @Use [concrete = constants.%Use] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @B1 { -// CHECK:STDOUT: %F.decl: %F.type.e4c = fn_decl @F.1 [concrete = constants.%F.8f5] { -// CHECK:STDOUT: %self.patt: %pattern_type.e47 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.e47 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %B1 = value_param call_param0 -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%B1 [concrete = constants.%B1] -// CHECK:STDOUT: %self: %B1 = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %.loc6: = vtable (%F.decl) [concrete = constants.%.bc5] -// CHECK:STDOUT: %struct_type.vptr: type = struct_type {.: %ptr.454} [concrete = constants.%struct_type.vptr] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.vptr [concrete = constants.%complete_type.513] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%B1 -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @B2 { -// CHECK:STDOUT: %B1.ref: type = name_ref B1, file.%B1.decl [concrete = constants.%B1] -// CHECK:STDOUT: %.loc9: %B2.elem = base_decl %B1.ref, element0 [concrete] -// CHECK:STDOUT: %F.decl: %F.type.b26 = fn_decl @F.2 [concrete = constants.%F.d48] { -// CHECK:STDOUT: %self.patt: %pattern_type.b19 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.b19 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %B2 = value_param call_param0 -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%B2 [concrete = constants.%B2] -// CHECK:STDOUT: %self: %B2 = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %.loc11: = vtable (%F.decl) [concrete = constants.%.579] -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %B1} [concrete = constants.%struct_type.base.508] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base [concrete = constants.%complete_type.5ac] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%B2 -// CHECK:STDOUT: .B1 = -// CHECK:STDOUT: .base = %.loc9 -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: extend %B1.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C { -// CHECK:STDOUT: %B2.ref: type = name_ref B2, file.%B2.decl [concrete = constants.%B2] -// CHECK:STDOUT: %.loc14: %C.elem = base_decl %B2.ref, element0 [concrete] -// CHECK:STDOUT: %F.decl: %F.type.c29 = fn_decl @F.3 [concrete = constants.%F.437] { -// CHECK:STDOUT: %self.patt: %pattern_type.c48 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.c48 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %C = value_param call_param0 -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%C [concrete = constants.%C] -// CHECK:STDOUT: %self: %C = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %.loc16: = vtable (%F.decl) [concrete = constants.%.5f6] -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %B2} [concrete = constants.%struct_type.base.421] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base [concrete = constants.%complete_type.066] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%C -// CHECK:STDOUT: .B2 = -// CHECK:STDOUT: .base = %.loc14 -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: extend %B2.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: virtual fn @F.1(%self.param: %B1); -// CHECK:STDOUT: -// CHECK:STDOUT: impl fn @F.2(%self.param: %B2); -// CHECK:STDOUT: -// CHECK:STDOUT: impl fn @F.3(%self.param: %C); -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Use() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %b1.patt: %pattern_type.e47 = binding_pattern b1 [concrete] -// CHECK:STDOUT: %b1.var_patt: %pattern_type.e47 = var_pattern %b1.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %b1.var: ref %B1 = var %b1.var_patt -// CHECK:STDOUT: %.loc19_17.1: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %.loc19_17.2: ref %ptr.454 = class_element_access %b1.var, element0 -// CHECK:STDOUT: %.loc19_17.3: ref %ptr.454 = vtable_ptr @B1.%.loc6 -// CHECK:STDOUT: %.loc19_17.4: init %ptr.454 = initialize_from %.loc19_17.3 to %.loc19_17.2 -// CHECK:STDOUT: %.loc19_17.5: init %B1 = class_init (%.loc19_17.4), %b1.var -// CHECK:STDOUT: %.loc19_3: init %B1 = converted %.loc19_17.1, %.loc19_17.5 -// CHECK:STDOUT: assign %b1.var, %.loc19_3 -// CHECK:STDOUT: %B1.ref: type = name_ref B1, file.%B1.decl [concrete = constants.%B1] -// CHECK:STDOUT: %b1: ref %B1 = bind_name b1, %b1.var -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %b2.patt: %pattern_type.b19 = binding_pattern b2 [concrete] -// CHECK:STDOUT: %b2.var_patt: %pattern_type.b19 = var_pattern %b2.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %b2.var: ref %B2 = var %b2.var_patt -// CHECK:STDOUT: %.loc20_26.1: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %.loc20_27.1: %struct_type.base.f5e = struct_literal (%.loc20_26.1) -// CHECK:STDOUT: %.loc20_27.2: ref %B1 = class_element_access %b2.var, element0 -// CHECK:STDOUT: %.loc20_26.2: ref %ptr.454 = class_element_access %.loc20_27.2, element0 -// CHECK:STDOUT: %.loc20_26.3: ref %ptr.454 = vtable_ptr @B2.%.loc11 -// CHECK:STDOUT: %.loc20_26.4: init %ptr.454 = initialize_from %.loc20_26.3 to %.loc20_26.2 -// CHECK:STDOUT: %.loc20_26.5: init %B1 = class_init (%.loc20_26.4), %.loc20_27.2 -// CHECK:STDOUT: %.loc20_27.3: init %B1 = converted %.loc20_26.1, %.loc20_26.5 -// CHECK:STDOUT: %.loc20_27.4: init %B2 = class_init (%.loc20_27.3), %b2.var -// CHECK:STDOUT: %.loc20_3: init %B2 = converted %.loc20_27.1, %.loc20_27.4 -// CHECK:STDOUT: assign %b2.var, %.loc20_3 -// CHECK:STDOUT: %B2.ref: type = name_ref B2, file.%B2.decl [concrete = constants.%B2] -// CHECK:STDOUT: %b2: ref %B2 = bind_name b2, %b2.var -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %c.patt: %pattern_type.c48 = binding_pattern c [concrete] -// CHECK:STDOUT: %c.var_patt: %pattern_type.c48 = var_pattern %c.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %c.var: ref %C = var %c.var_patt -// CHECK:STDOUT: %.loc21_33.1: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %.loc21_34.1: %struct_type.base.f5e = struct_literal (%.loc21_33.1) -// CHECK:STDOUT: %.loc21_35.1: %struct_type.base.a0c = struct_literal (%.loc21_34.1) -// CHECK:STDOUT: %.loc21_35.2: ref %B2 = class_element_access %c.var, element0 -// CHECK:STDOUT: %.loc21_34.2: ref %B1 = class_element_access %.loc21_35.2, element0 -// CHECK:STDOUT: %.loc21_33.2: ref %ptr.454 = class_element_access %.loc21_34.2, element0 -// CHECK:STDOUT: %.loc21_33.3: ref %ptr.454 = vtable_ptr @C.%.loc16 -// CHECK:STDOUT: %.loc21_33.4: init %ptr.454 = initialize_from %.loc21_33.3 to %.loc21_33.2 -// CHECK:STDOUT: %.loc21_33.5: init %B1 = class_init (%.loc21_33.4), %.loc21_34.2 -// CHECK:STDOUT: %.loc21_34.3: init %B1 = converted %.loc21_33.1, %.loc21_33.5 -// CHECK:STDOUT: %.loc21_34.4: init %B2 = class_init (%.loc21_34.3), %.loc21_35.2 -// CHECK:STDOUT: %.loc21_35.3: init %B2 = converted %.loc21_34.1, %.loc21_34.4 -// CHECK:STDOUT: %.loc21_35.4: init %C = class_init (%.loc21_35.3), %c.var -// CHECK:STDOUT: %.loc21_3: init %C = converted %.loc21_35.1, %.loc21_35.4 -// CHECK:STDOUT: assign %c.var, %.loc21_3 -// CHECK:STDOUT: %C.ref: type = name_ref C, file.%C.decl [concrete = constants.%C] -// CHECK:STDOUT: %c: ref %C = bind_name c, %c.var -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_modifiers.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %pattern_type: type = pattern_type %C [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %ptr: type = ptr_type [concrete] -// CHECK:STDOUT: %.f2b: = vtable () [concrete] -// CHECK:STDOUT: %struct_type.vptr: type = struct_type {.: %ptr} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.vptr [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C { -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %self.patt: %pattern_type = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %C = value_param call_param0 -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%C [concrete = constants.%C] -// CHECK:STDOUT: %self: %C = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %.loc10: = vtable () [concrete = constants.%.f2b] -// CHECK:STDOUT: %struct_type.vptr: type = struct_type {.: %ptr} [concrete = constants.%struct_type.vptr] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.vptr [concrete = constants.%complete_type] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%C -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: impl fn @F(%self.param: %C); -// CHECK:STDOUT: -// CHECK:STDOUT: --- init_members.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Base: type = class_type @Base [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %Base.elem: type = unbound_element_type %Base, %i32 [concrete] -// CHECK:STDOUT: %pattern_type.bcc: type = pattern_type %Base [concrete] -// CHECK:STDOUT: %F.type.7c6: type = fn_type @F.1 [concrete] -// CHECK:STDOUT: %F.d17: %F.type.7c6 = struct_value () [concrete] -// CHECK:STDOUT: %ptr.454: type = ptr_type [concrete] -// CHECK:STDOUT: %.5ee: = vtable (%F.d17) [concrete] -// CHECK:STDOUT: %struct_type.vptr.m1.m2: type = struct_type {.: %ptr.454, .m1: %i32, .m2: %i32} [concrete] -// CHECK:STDOUT: %complete_type.cf7: = complete_type_witness %struct_type.vptr.m1.m2 [concrete] -// CHECK:STDOUT: %F.type.b25: type = fn_type @F.2 [concrete] -// CHECK:STDOUT: %F.c41: %F.type.b25 = struct_value () [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %int_3.1ba: Core.IntLiteral = int_value 3 [concrete] -// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.type.205: type = facet_type <@ImplicitAs, @ImplicitAs(%i32)> [concrete] -// CHECK:STDOUT: %Convert.type.1b6: type = fn_type @Convert.1, @ImplicitAs(%i32) [concrete] -// CHECK:STDOUT: %To.c80: Core.IntLiteral = bind_symbolic_name To, 0 [symbolic] -// CHECK:STDOUT: %Convert.type.0f9: type = fn_type @Convert.2, @impl.4f9(%To.c80) [symbolic] -// CHECK:STDOUT: %Convert.f06: %Convert.type.0f9 = struct_value () [symbolic] -// CHECK:STDOUT: %ImplicitAs.impl_witness.c75: = impl_witness imports.%ImplicitAs.impl_witness_table.a2f, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.type.035: type = fn_type @Convert.2, @impl.4f9(%int_32) [concrete] -// CHECK:STDOUT: %Convert.956: %Convert.type.035 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.facet: %ImplicitAs.type.205 = facet_value Core.IntLiteral, (%ImplicitAs.impl_witness.c75) [concrete] -// CHECK:STDOUT: %.9c3: type = fn_type_with_self_type %Convert.type.1b6, %ImplicitAs.facet [concrete] -// CHECK:STDOUT: %Convert.bound.b30: = bound_method %int_3.1ba, %Convert.956 [concrete] -// CHECK:STDOUT: %Convert.specific_fn: = specific_function %Convert.956, @Convert.2(%int_32) [concrete] -// CHECK:STDOUT: %bound_method.047: = bound_method %int_3.1ba, %Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_3.822: %i32 = int_value 3 [concrete] -// CHECK:STDOUT: %struct_type.m2.m1.68c: type = struct_type {.m2: %i32, .m1: %i32} [concrete] -// CHECK:STDOUT: %int_5.64b: Core.IntLiteral = int_value 5 [concrete] -// CHECK:STDOUT: %struct_type.m2.m1.5f2: type = struct_type {.m2: Core.IntLiteral, .m1: Core.IntLiteral} [concrete] -// CHECK:STDOUT: %Convert.bound.4e6: = bound_method %int_5.64b, %Convert.956 [concrete] -// CHECK:STDOUT: %bound_method.a25: = bound_method %int_5.64b, %Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_5.0f6: %i32 = int_value 5 [concrete] -// CHECK:STDOUT: %int_4.0c1: Core.IntLiteral = int_value 4 [concrete] -// CHECK:STDOUT: %Convert.bound.ac3: = bound_method %int_4.0c1, %Convert.956 [concrete] -// CHECK:STDOUT: %bound_method.1da: = bound_method %int_4.0c1, %Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_4.940: %i32 = int_value 4 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/operators/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] -// CHECK:STDOUT: %Core.import_ref.a5b: @impl.4f9.%Convert.type (%Convert.type.0f9) = import_ref Core//prelude/types/int, loc19_39, loaded [symbolic = @impl.4f9.%Convert (constants.%Convert.f06)] -// CHECK:STDOUT: %ImplicitAs.impl_witness_table.a2f = impl_witness_table (%Core.import_ref.a5b), @impl.4f9 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Base = %Base.decl -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Base.decl: type = class_decl @Base [concrete = constants.%Base] {} {} -// CHECK:STDOUT: %F.decl: %F.type.b25 = fn_decl @F.2 [concrete = constants.%F.c41] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Base { -// CHECK:STDOUT: %int_32.loc5: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc5: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc5: %Base.elem = field_decl m1, element1 [concrete] -// CHECK:STDOUT: %int_32.loc6: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32.loc6: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: %.loc6: %Base.elem = field_decl m2, element2 [concrete] -// CHECK:STDOUT: %F.decl: %F.type.7c6 = fn_decl @F.1 [concrete = constants.%F.d17] { -// CHECK:STDOUT: %self.patt: %pattern_type.bcc = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.bcc = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %Base = value_param call_param0 -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Base [concrete = constants.%Base] -// CHECK:STDOUT: %self: %Base = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %.loc9: = vtable (%F.decl) [concrete = constants.%.5ee] -// CHECK:STDOUT: %struct_type.vptr.m1.m2: type = struct_type {.: %ptr.454, .m1: %i32, .m2: %i32} [concrete = constants.%struct_type.vptr.m1.m2] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.vptr.m1.m2 [concrete = constants.%complete_type.cf7] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Base -// CHECK:STDOUT: .m1 = %.loc5 -// CHECK:STDOUT: .m2 = %.loc6 -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: virtual fn @F.1(%self.param: %Base); -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F.2() { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %i.patt: %pattern_type.7ce = binding_pattern i [concrete] -// CHECK:STDOUT: %i.var_patt: %pattern_type.7ce = var_pattern %i.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %i.var: ref %i32 = var %i.var_patt -// CHECK:STDOUT: %int_3.loc12: Core.IntLiteral = int_value 3 [concrete = constants.%int_3.1ba] -// CHECK:STDOUT: %impl.elem0.loc12: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc12_3.1: = bound_method %int_3.loc12, %impl.elem0.loc12 [concrete = constants.%Convert.bound.b30] -// CHECK:STDOUT: %specific_fn.loc12: = specific_function %impl.elem0.loc12, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc12_3.2: = bound_method %int_3.loc12, %specific_fn.loc12 [concrete = constants.%bound_method.047] -// CHECK:STDOUT: %int.convert_checked.loc12: init %i32 = call %bound_method.loc12_3.2(%int_3.loc12) [concrete = constants.%int_3.822] -// CHECK:STDOUT: %.loc12_3: init %i32 = converted %int_3.loc12, %int.convert_checked.loc12 [concrete = constants.%int_3.822] -// CHECK:STDOUT: assign %i.var, %.loc12_3 -// CHECK:STDOUT: %.loc12_10: type = splice_block %i32 [concrete = constants.%i32] { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: } -// CHECK:STDOUT: %i: ref %i32 = bind_name i, %i.var -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %b1.patt: %pattern_type.bcc = binding_pattern b1 [concrete] -// CHECK:STDOUT: %b1.var_patt: %pattern_type.bcc = var_pattern %b1.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %b1.var: ref %Base = var %b1.var_patt -// CHECK:STDOUT: %i.ref.loc14_25: ref %i32 = name_ref i, %i -// CHECK:STDOUT: %i.ref.loc14_34: ref %i32 = name_ref i, %i -// CHECK:STDOUT: %.loc14_35.1: %struct_type.m2.m1.68c = struct_literal (%i.ref.loc14_25, %i.ref.loc14_34) -// CHECK:STDOUT: %.loc14_35.2: ref %ptr.454 = class_element_access %b1.var, element0 -// CHECK:STDOUT: %.loc14_35.3: ref %ptr.454 = vtable_ptr @Base.%.loc9 -// CHECK:STDOUT: %.loc14_35.4: init %ptr.454 = initialize_from %.loc14_35.3 to %.loc14_35.2 -// CHECK:STDOUT: %.loc14_34: %i32 = bind_value %i.ref.loc14_34 -// CHECK:STDOUT: %.loc14_35.5: ref %i32 = class_element_access %b1.var, element2 -// CHECK:STDOUT: %.loc14_35.6: init %i32 = initialize_from %.loc14_34 to %.loc14_35.5 -// CHECK:STDOUT: %.loc14_25: %i32 = bind_value %i.ref.loc14_25 -// CHECK:STDOUT: %.loc14_35.7: ref %i32 = class_element_access %b1.var, element1 -// CHECK:STDOUT: %.loc14_35.8: init %i32 = initialize_from %.loc14_25 to %.loc14_35.7 -// CHECK:STDOUT: %.loc14_35.9: init %Base = class_init (%.loc14_35.4, %.loc14_35.6, %.loc14_35.8), %b1.var -// CHECK:STDOUT: %.loc14_3: init %Base = converted %.loc14_35.1, %.loc14_35.9 -// CHECK:STDOUT: assign %b1.var, %.loc14_3 -// CHECK:STDOUT: %Base.ref.loc14: type = name_ref Base, file.%Base.decl [concrete = constants.%Base] -// CHECK:STDOUT: %b1: ref %Base = bind_name b1, %b1.var -// CHECK:STDOUT: name_binding_decl { -// CHECK:STDOUT: %b2.patt: %pattern_type.bcc = binding_pattern b2 [concrete] -// CHECK:STDOUT: %b2.var_patt: %pattern_type.bcc = var_pattern %b2.patt [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: %b2.var: ref %Base = var %b2.var_patt -// CHECK:STDOUT: %int_3.loc15: Core.IntLiteral = int_value 3 [concrete = constants.%int_3.1ba] -// CHECK:STDOUT: %int_5: Core.IntLiteral = int_value 5 [concrete = constants.%int_5.64b] -// CHECK:STDOUT: %.loc15_35.1: %struct_type.m2.m1.5f2 = struct_literal (%int_3.loc15, %int_5) -// CHECK:STDOUT: %.loc15_35.2: ref %ptr.454 = class_element_access %b2.var, element0 -// CHECK:STDOUT: %.loc15_35.3: ref %ptr.454 = vtable_ptr @Base.%.loc9 -// CHECK:STDOUT: %.loc15_35.4: init %ptr.454 = initialize_from %.loc15_35.3 to %.loc15_35.2 -// CHECK:STDOUT: %impl.elem0.loc15_35.1: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc15_35.1: = bound_method %int_5, %impl.elem0.loc15_35.1 [concrete = constants.%Convert.bound.4e6] -// CHECK:STDOUT: %specific_fn.loc15_35.1: = specific_function %impl.elem0.loc15_35.1, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc15_35.2: = bound_method %int_5, %specific_fn.loc15_35.1 [concrete = constants.%bound_method.a25] -// CHECK:STDOUT: %int.convert_checked.loc15_35.1: init %i32 = call %bound_method.loc15_35.2(%int_5) [concrete = constants.%int_5.0f6] -// CHECK:STDOUT: %.loc15_35.5: init %i32 = converted %int_5, %int.convert_checked.loc15_35.1 [concrete = constants.%int_5.0f6] -// CHECK:STDOUT: %.loc15_35.6: ref %i32 = class_element_access %b2.var, element2 -// CHECK:STDOUT: %.loc15_35.7: init %i32 = initialize_from %.loc15_35.5 to %.loc15_35.6 [concrete = constants.%int_5.0f6] -// CHECK:STDOUT: %impl.elem0.loc15_35.2: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc15_35.3: = bound_method %int_3.loc15, %impl.elem0.loc15_35.2 [concrete = constants.%Convert.bound.b30] -// CHECK:STDOUT: %specific_fn.loc15_35.2: = specific_function %impl.elem0.loc15_35.2, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc15_35.4: = bound_method %int_3.loc15, %specific_fn.loc15_35.2 [concrete = constants.%bound_method.047] -// CHECK:STDOUT: %int.convert_checked.loc15_35.2: init %i32 = call %bound_method.loc15_35.4(%int_3.loc15) [concrete = constants.%int_3.822] -// CHECK:STDOUT: %.loc15_35.8: init %i32 = converted %int_3.loc15, %int.convert_checked.loc15_35.2 [concrete = constants.%int_3.822] -// CHECK:STDOUT: %.loc15_35.9: ref %i32 = class_element_access %b2.var, element1 -// CHECK:STDOUT: %.loc15_35.10: init %i32 = initialize_from %.loc15_35.8 to %.loc15_35.9 [concrete = constants.%int_3.822] -// CHECK:STDOUT: %.loc15_35.11: init %Base = class_init (%.loc15_35.4, %.loc15_35.7, %.loc15_35.10), %b2.var -// CHECK:STDOUT: %.loc15_3: init %Base = converted %.loc15_35.1, %.loc15_35.11 -// CHECK:STDOUT: assign %b2.var, %.loc15_3 -// CHECK:STDOUT: %Base.ref.loc15: type = name_ref Base, file.%Base.decl [concrete = constants.%Base] -// CHECK:STDOUT: %b2: ref %Base = bind_name b2, %b2.var -// CHECK:STDOUT: %b1.ref: ref %Base = name_ref b1, %b1 -// CHECK:STDOUT: %m2.ref: %Base.elem = name_ref m2, @Base.%.loc6 [concrete = @Base.%.loc6] -// CHECK:STDOUT: %.loc18_5: ref %i32 = class_element_access %b1.ref, element2 -// CHECK:STDOUT: %int_4: Core.IntLiteral = int_value 4 [concrete = constants.%int_4.0c1] -// CHECK:STDOUT: %impl.elem0.loc18: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc18_9.1: = bound_method %int_4, %impl.elem0.loc18 [concrete = constants.%Convert.bound.ac3] -// CHECK:STDOUT: %specific_fn.loc18: = specific_function %impl.elem0.loc18, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc18_9.2: = bound_method %int_4, %specific_fn.loc18 [concrete = constants.%bound_method.1da] -// CHECK:STDOUT: %int.convert_checked.loc18: init %i32 = call %bound_method.loc18_9.2(%int_4) [concrete = constants.%int_4.940] -// CHECK:STDOUT: %.loc18_9: init %i32 = converted %int_4, %int.convert_checked.loc18 [concrete = constants.%int_4.940] -// CHECK:STDOUT: assign %.loc18_5, %.loc18_9 -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- todo_fail_impl_without_base_declaration.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Base: type = class_type @Base [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %Derived: type = class_type @Derived [concrete] -// CHECK:STDOUT: %Derived.elem: type = unbound_element_type %Derived, %Base [concrete] -// CHECK:STDOUT: %pattern_type: type = pattern_type %Derived [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %ptr.454: type = ptr_type [concrete] -// CHECK:STDOUT: %.f2b: = vtable () [concrete] -// CHECK:STDOUT: %struct_type.vptr.base: type = struct_type {.: %ptr.454, .base: %Base} [concrete] -// CHECK:STDOUT: %complete_type.336: = complete_type_witness %struct_type.vptr.base [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Base = %Base.decl -// CHECK:STDOUT: .Derived = %Derived.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Base.decl: type = class_decl @Base [concrete = constants.%Base] {} {} -// CHECK:STDOUT: %Derived.decl: type = class_decl @Derived [concrete = constants.%Derived] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Base { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Base -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Derived { -// CHECK:STDOUT: %Base.ref: type = name_ref Base, file.%Base.decl [concrete = constants.%Base] -// CHECK:STDOUT: %.loc8: %Derived.elem = base_decl %Base.ref, element1 [concrete] -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %self.patt: %pattern_type = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %Derived = value_param call_param0 -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Derived [concrete = constants.%Derived] -// CHECK:STDOUT: %self: %Derived = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %.loc10: = vtable () [concrete = constants.%.f2b] -// CHECK:STDOUT: %struct_type.vptr.base: type = struct_type {.: %ptr.454, .base: %Base} [concrete = constants.%struct_type.vptr.base] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.vptr.base [concrete = constants.%complete_type.336] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Derived -// CHECK:STDOUT: .Base = -// CHECK:STDOUT: .base = %.loc8 -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: extend %Base.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: impl fn @F(%self.param: %Derived); -// CHECK:STDOUT: -// CHECK:STDOUT: --- abstract_impl.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %AbstractBase: type = class_type @AbstractBase [concrete] -// CHECK:STDOUT: %pattern_type.27c: type = pattern_type %AbstractBase [concrete] -// CHECK:STDOUT: %F.type.85b: type = fn_type @F.1 [concrete] -// CHECK:STDOUT: %F.6e9: %F.type.85b = struct_value () [concrete] -// CHECK:STDOUT: %ptr.454: type = ptr_type [concrete] -// CHECK:STDOUT: %.6ec: = vtable (%F.6e9) [concrete] -// CHECK:STDOUT: %struct_type.vptr: type = struct_type {.: %ptr.454} [concrete] -// CHECK:STDOUT: %complete_type.513: = complete_type_witness %struct_type.vptr [concrete] -// CHECK:STDOUT: %AbstractIntermediate: type = class_type @AbstractIntermediate [concrete] -// CHECK:STDOUT: %AbstractIntermediate.elem: type = unbound_element_type %AbstractIntermediate, %AbstractBase [concrete] -// CHECK:STDOUT: %struct_type.base.efd: type = struct_type {.base: %AbstractBase} [concrete] -// CHECK:STDOUT: %complete_type.2d3: = complete_type_witness %struct_type.base.efd [concrete] -// CHECK:STDOUT: %Derived: type = class_type @Derived [concrete] -// CHECK:STDOUT: %Derived.elem: type = unbound_element_type %Derived, %AbstractIntermediate [concrete] -// CHECK:STDOUT: %pattern_type.fb9: type = pattern_type %Derived [concrete] -// CHECK:STDOUT: %F.type.5da: type = fn_type @F.2 [concrete] -// CHECK:STDOUT: %F.fa3: %F.type.5da = struct_value () [concrete] -// CHECK:STDOUT: %.88d: = vtable (%F.fa3) [concrete] -// CHECK:STDOUT: %struct_type.base.da5: type = struct_type {.base: %AbstractIntermediate} [concrete] -// CHECK:STDOUT: %complete_type.f8c: = complete_type_witness %struct_type.base.da5 [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .AbstractBase = %AbstractBase.decl -// CHECK:STDOUT: .AbstractIntermediate = %AbstractIntermediate.decl -// CHECK:STDOUT: .Derived = %Derived.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %AbstractBase.decl: type = class_decl @AbstractBase [concrete = constants.%AbstractBase] {} {} -// CHECK:STDOUT: %AbstractIntermediate.decl: type = class_decl @AbstractIntermediate [concrete = constants.%AbstractIntermediate] {} {} -// CHECK:STDOUT: %Derived.decl: type = class_decl @Derived [concrete = constants.%Derived] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @AbstractBase { -// CHECK:STDOUT: %F.decl: %F.type.85b = fn_decl @F.1 [concrete = constants.%F.6e9] { -// CHECK:STDOUT: %self.patt: %pattern_type.27c = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.27c = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %AbstractBase = value_param call_param0 -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%AbstractBase [concrete = constants.%AbstractBase] -// CHECK:STDOUT: %self: %AbstractBase = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %.loc6: = vtable (%F.decl) [concrete = constants.%.6ec] -// CHECK:STDOUT: %struct_type.vptr: type = struct_type {.: %ptr.454} [concrete = constants.%struct_type.vptr] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.vptr [concrete = constants.%complete_type.513] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%AbstractBase -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @AbstractIntermediate { -// CHECK:STDOUT: %AbstractBase.ref: type = name_ref AbstractBase, file.%AbstractBase.decl [concrete = constants.%AbstractBase] -// CHECK:STDOUT: %.loc9: %AbstractIntermediate.elem = base_decl %AbstractBase.ref, element0 [concrete] -// CHECK:STDOUT: %.loc10: = vtable (constants.%F.6e9) [concrete = constants.%.6ec] -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %AbstractBase} [concrete = constants.%struct_type.base.efd] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base [concrete = constants.%complete_type.2d3] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%AbstractIntermediate -// CHECK:STDOUT: .AbstractBase = -// CHECK:STDOUT: .base = %.loc9 -// CHECK:STDOUT: extend %AbstractBase.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Derived { -// CHECK:STDOUT: %AbstractIntermediate.ref: type = name_ref AbstractIntermediate, file.%AbstractIntermediate.decl [concrete = constants.%AbstractIntermediate] -// CHECK:STDOUT: %.loc13: %Derived.elem = base_decl %AbstractIntermediate.ref, element0 [concrete] -// CHECK:STDOUT: %F.decl: %F.type.5da = fn_decl @F.2 [concrete = constants.%F.fa3] { -// CHECK:STDOUT: %self.patt: %pattern_type.fb9 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.fb9 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %Derived = value_param call_param0 -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Derived [concrete = constants.%Derived] -// CHECK:STDOUT: %self: %Derived = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %.loc15: = vtable (%F.decl) [concrete = constants.%.88d] -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %AbstractIntermediate} [concrete = constants.%struct_type.base.da5] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base [concrete = constants.%complete_type.f8c] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Derived -// CHECK:STDOUT: .AbstractIntermediate = -// CHECK:STDOUT: .base = %.loc13 -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: extend %AbstractIntermediate.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: abstract fn @F.1(%self.param: %AbstractBase); -// CHECK:STDOUT: -// CHECK:STDOUT: impl fn @F.2(%self.param: %Derived); -// CHECK:STDOUT: -// CHECK:STDOUT: --- virtual_impl.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %VirtualBase: type = class_type @VirtualBase [concrete] -// CHECK:STDOUT: %pattern_type.ad4: type = pattern_type %VirtualBase [concrete] -// CHECK:STDOUT: %F.type.e62: type = fn_type @F.1 [concrete] -// CHECK:STDOUT: %F.3e7: %F.type.e62 = struct_value () [concrete] -// CHECK:STDOUT: %ptr.454: type = ptr_type [concrete] -// CHECK:STDOUT: %.def: = vtable (%F.3e7) [concrete] -// CHECK:STDOUT: %struct_type.vptr: type = struct_type {.: %ptr.454} [concrete] -// CHECK:STDOUT: %complete_type.513: = complete_type_witness %struct_type.vptr [concrete] -// CHECK:STDOUT: %VirtualIntermediate: type = class_type @VirtualIntermediate [concrete] -// CHECK:STDOUT: %VirtualIntermediate.elem: type = unbound_element_type %VirtualIntermediate, %VirtualBase [concrete] -// CHECK:STDOUT: %struct_type.base.61e: type = struct_type {.base: %VirtualBase} [concrete] -// CHECK:STDOUT: %complete_type.f09: = complete_type_witness %struct_type.base.61e [concrete] -// CHECK:STDOUT: %Derived: type = class_type @Derived [concrete] -// CHECK:STDOUT: %Derived.elem: type = unbound_element_type %Derived, %VirtualIntermediate [concrete] -// CHECK:STDOUT: %pattern_type.fb9: type = pattern_type %Derived [concrete] -// CHECK:STDOUT: %F.type.5da: type = fn_type @F.2 [concrete] -// CHECK:STDOUT: %F.fa3: %F.type.5da = struct_value () [concrete] -// CHECK:STDOUT: %.88d: = vtable (%F.fa3) [concrete] -// CHECK:STDOUT: %struct_type.base.43c: type = struct_type {.base: %VirtualIntermediate} [concrete] -// CHECK:STDOUT: %complete_type.fa6: = complete_type_witness %struct_type.base.43c [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .VirtualBase = %VirtualBase.decl -// CHECK:STDOUT: .VirtualIntermediate = %VirtualIntermediate.decl -// CHECK:STDOUT: .Derived = %Derived.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %VirtualBase.decl: type = class_decl @VirtualBase [concrete = constants.%VirtualBase] {} {} -// CHECK:STDOUT: %VirtualIntermediate.decl: type = class_decl @VirtualIntermediate [concrete = constants.%VirtualIntermediate] {} {} -// CHECK:STDOUT: %Derived.decl: type = class_decl @Derived [concrete = constants.%Derived] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @VirtualBase { -// CHECK:STDOUT: %F.decl: %F.type.e62 = fn_decl @F.1 [concrete = constants.%F.3e7] { -// CHECK:STDOUT: %self.patt: %pattern_type.ad4 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.ad4 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %VirtualBase = value_param call_param0 -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%VirtualBase [concrete = constants.%VirtualBase] -// CHECK:STDOUT: %self: %VirtualBase = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %.loc6: = vtable (%F.decl) [concrete = constants.%.def] -// CHECK:STDOUT: %struct_type.vptr: type = struct_type {.: %ptr.454} [concrete = constants.%struct_type.vptr] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.vptr [concrete = constants.%complete_type.513] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%VirtualBase -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @VirtualIntermediate { -// CHECK:STDOUT: %VirtualBase.ref: type = name_ref VirtualBase, file.%VirtualBase.decl [concrete = constants.%VirtualBase] -// CHECK:STDOUT: %.loc9: %VirtualIntermediate.elem = base_decl %VirtualBase.ref, element0 [concrete] -// CHECK:STDOUT: %.loc10: = vtable (constants.%F.3e7) [concrete = constants.%.def] -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %VirtualBase} [concrete = constants.%struct_type.base.61e] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base [concrete = constants.%complete_type.f09] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%VirtualIntermediate -// CHECK:STDOUT: .VirtualBase = -// CHECK:STDOUT: .base = %.loc9 -// CHECK:STDOUT: extend %VirtualBase.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Derived { -// CHECK:STDOUT: %VirtualIntermediate.ref: type = name_ref VirtualIntermediate, file.%VirtualIntermediate.decl [concrete = constants.%VirtualIntermediate] -// CHECK:STDOUT: %.loc13: %Derived.elem = base_decl %VirtualIntermediate.ref, element0 [concrete] -// CHECK:STDOUT: %F.decl: %F.type.5da = fn_decl @F.2 [concrete = constants.%F.fa3] { -// CHECK:STDOUT: %self.patt: %pattern_type.fb9 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.fb9 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %Derived = value_param call_param0 -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Derived [concrete = constants.%Derived] -// CHECK:STDOUT: %self: %Derived = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %.loc15: = vtable (%F.decl) [concrete = constants.%.88d] -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %VirtualIntermediate} [concrete = constants.%struct_type.base.43c] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base [concrete = constants.%complete_type.fa6] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Derived -// CHECK:STDOUT: .VirtualIntermediate = -// CHECK:STDOUT: .base = %.loc13 -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: extend %VirtualIntermediate.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: virtual fn @F.1(%self.param: %VirtualBase); -// CHECK:STDOUT: -// CHECK:STDOUT: impl fn @F.2(%self.param: %Derived); -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_impl_mismatch.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %Base: type = class_type @Base [concrete] -// CHECK:STDOUT: %pattern_type.bcc: type = pattern_type %Base [concrete] -// CHECK:STDOUT: %F.type.7c6: type = fn_type @F.1 [concrete] -// CHECK:STDOUT: %F.d17: %F.type.7c6 = struct_value () [concrete] -// CHECK:STDOUT: %ptr.454: type = ptr_type [concrete] -// CHECK:STDOUT: %.5ee: = vtable (%F.d17) [concrete] -// CHECK:STDOUT: %struct_type.vptr: type = struct_type {.: %ptr.454} [concrete] -// CHECK:STDOUT: %complete_type.513: = complete_type_witness %struct_type.vptr [concrete] -// CHECK:STDOUT: %Derived: type = class_type @Derived [concrete] -// CHECK:STDOUT: %Derived.elem: type = unbound_element_type %Derived, %Base [concrete] -// CHECK:STDOUT: %pattern_type.fb9: type = pattern_type %Derived [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] -// CHECK:STDOUT: %F.type.5da: type = fn_type @F.2 [concrete] -// CHECK:STDOUT: %F.fa3: %F.type.5da = struct_value () [concrete] -// CHECK:STDOUT: %.88d: = vtable (%F.fa3) [concrete] -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %Base} [concrete] -// CHECK:STDOUT: %complete_type.15c: = complete_type_witness %struct_type.base [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Base = %Base.decl -// CHECK:STDOUT: .Derived = %Derived.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Base.decl: type = class_decl @Base [concrete = constants.%Base] {} {} -// CHECK:STDOUT: %Derived.decl: type = class_decl @Derived [concrete = constants.%Derived] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Base { -// CHECK:STDOUT: %F.decl: %F.type.7c6 = fn_decl @F.1 [concrete = constants.%F.d17] { -// CHECK:STDOUT: %self.patt: %pattern_type.bcc = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.bcc = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %Base = value_param call_param0 -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Base [concrete = constants.%Base] -// CHECK:STDOUT: %self: %Base = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %.loc6: = vtable (%F.decl) [concrete = constants.%.5ee] -// CHECK:STDOUT: %struct_type.vptr: type = struct_type {.: %ptr.454} [concrete = constants.%struct_type.vptr] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.vptr [concrete = constants.%complete_type.513] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Base -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Derived { -// CHECK:STDOUT: %Base.ref: type = name_ref Base, file.%Base.decl [concrete = constants.%Base] -// CHECK:STDOUT: %.loc9: %Derived.elem = base_decl %Base.ref, element0 [concrete] -// CHECK:STDOUT: %F.decl: %F.type.5da = fn_decl @F.2 [concrete = constants.%F.fa3] { -// CHECK:STDOUT: %self.patt: %pattern_type.fb9 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.fb9 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %v.patt: %pattern_type.7ce = binding_pattern v [concrete] -// CHECK:STDOUT: %v.param_patt: %pattern_type.7ce = value_param_pattern %v.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %Derived = value_param call_param0 -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Derived [concrete = constants.%Derived] -// CHECK:STDOUT: %self: %Derived = bind_name self, %self.param -// CHECK:STDOUT: %v.param: %i32 = value_param call_param1 -// CHECK:STDOUT: %.loc17: type = splice_block %i32 [concrete = constants.%i32] { -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] -// CHECK:STDOUT: } -// CHECK:STDOUT: %v: %i32 = bind_name v, %v.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %.loc18: = vtable (%F.decl) [concrete = constants.%.88d] -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %Base} [concrete = constants.%struct_type.base] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base [concrete = constants.%complete_type.15c] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Derived -// CHECK:STDOUT: .Base = -// CHECK:STDOUT: .base = %.loc9 -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: extend %Base.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: virtual fn @F.1(%self.param: %Base); -// CHECK:STDOUT: -// CHECK:STDOUT: impl fn @F.2(%self.param: %Derived, %v.param: %i32); -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_todo_impl_conversion.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %T1: type = class_type @T1 [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %T2: type = class_type @T2 [concrete] -// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.type.e40: type = facet_type <@ImplicitAs, @ImplicitAs(%T1)> [concrete] -// CHECK:STDOUT: %ImplicitAs.impl_witness: = impl_witness file.%ImplicitAs.impl_witness_table [concrete] -// CHECK:STDOUT: %pattern_type.682: type = pattern_type %T2 [concrete] -// CHECK:STDOUT: %pattern_type.28b: type = pattern_type %T1 [concrete] -// CHECK:STDOUT: %Convert.type.c41: type = fn_type @Convert.2 [concrete] -// CHECK:STDOUT: %Convert.f35: %Convert.type.c41 = struct_value () [concrete] -// CHECK:STDOUT: %T1.val: %T1 = struct_value () [concrete] -// CHECK:STDOUT: %Base: type = class_type @Base [concrete] -// CHECK:STDOUT: %pattern_type.bcc: type = pattern_type %Base [concrete] -// CHECK:STDOUT: %F.type.7c6: type = fn_type @F.1 [concrete] -// CHECK:STDOUT: %F.d17: %F.type.7c6 = struct_value () [concrete] -// CHECK:STDOUT: %ptr.454: type = ptr_type [concrete] -// CHECK:STDOUT: %.5ee: = vtable (%F.d17) [concrete] -// CHECK:STDOUT: %struct_type.vptr: type = struct_type {.: %ptr.454} [concrete] -// CHECK:STDOUT: %complete_type.513: = complete_type_witness %struct_type.vptr [concrete] -// CHECK:STDOUT: %Derived: type = class_type @Derived [concrete] -// CHECK:STDOUT: %Derived.elem: type = unbound_element_type %Derived, %Base [concrete] -// CHECK:STDOUT: %pattern_type.fb9: type = pattern_type %Derived [concrete] -// CHECK:STDOUT: %F.type.5da: type = fn_type @F.2 [concrete] -// CHECK:STDOUT: %F.fa3: %F.type.5da = struct_value () [concrete] -// CHECK:STDOUT: %.88d: = vtable (%F.fa3) [concrete] -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %Base} [concrete] -// CHECK:STDOUT: %complete_type.15c: = complete_type_witness %struct_type.base [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/operators/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .T1 = %T1.decl -// CHECK:STDOUT: .T2 = %T2.decl -// CHECK:STDOUT: .Base = %Base.decl -// CHECK:STDOUT: .Derived = %Derived.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %T1.decl: type = class_decl @T1 [concrete = constants.%T1] {} {} -// CHECK:STDOUT: %T2.decl: type = class_decl @T2 [concrete = constants.%T2] {} {} -// CHECK:STDOUT: impl_decl @impl [concrete] {} { -// CHECK:STDOUT: %T2.ref: type = name_ref T2, file.%T2.decl [concrete = constants.%T2] -// CHECK:STDOUT: %Core.ref: = name_ref Core, imports.%Core [concrete = imports.%Core] -// CHECK:STDOUT: %ImplicitAs.ref: %ImplicitAs.type.cc7 = name_ref ImplicitAs, imports.%Core.ImplicitAs [concrete = constants.%ImplicitAs.generic] -// CHECK:STDOUT: %T1.ref: type = name_ref T1, file.%T1.decl [concrete = constants.%T1] -// CHECK:STDOUT: %ImplicitAs.type: type = facet_type <@ImplicitAs, @ImplicitAs(constants.%T1)> [concrete = constants.%ImplicitAs.type.e40] -// CHECK:STDOUT: } -// CHECK:STDOUT: %ImplicitAs.impl_witness_table = impl_witness_table (@impl.%Convert.decl), @impl [concrete] -// CHECK:STDOUT: %ImplicitAs.impl_witness: = impl_witness %ImplicitAs.impl_witness_table [concrete = constants.%ImplicitAs.impl_witness] -// CHECK:STDOUT: %Base.decl: type = class_decl @Base [concrete = constants.%Base] {} {} -// CHECK:STDOUT: %Derived.decl: type = class_decl @Derived [concrete = constants.%Derived] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: impl @impl: %T2.ref as %ImplicitAs.type { -// CHECK:STDOUT: %Convert.decl: %Convert.type.c41 = fn_decl @Convert.2 [concrete = constants.%Convert.f35] { -// CHECK:STDOUT: %self.patt: %pattern_type.682 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.682 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.28b = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.28b = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T1.ref: type = name_ref T1, file.%T1.decl [concrete = constants.%T1] -// CHECK:STDOUT: %self.param: %T2 = value_param call_param0 -// CHECK:STDOUT: %Self.ref: type = name_ref Self, @impl.%T2.ref [concrete = constants.%T2] -// CHECK:STDOUT: %self: %T2 = bind_name self, %self.param -// CHECK:STDOUT: %return.param: ref %T1 = out_param call_param1 -// CHECK:STDOUT: %return: ref %T1 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .T1 = -// CHECK:STDOUT: .Convert = %Convert.decl -// CHECK:STDOUT: witness = file.%ImplicitAs.impl_witness -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @T1 { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%T1 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @T2 { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%T2 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Base { -// CHECK:STDOUT: %F.decl: %F.type.7c6 = fn_decl @F.1 [concrete = constants.%F.d17] { -// CHECK:STDOUT: %self.patt: %pattern_type.bcc = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.bcc = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.28b = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.28b = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T1.ref: type = name_ref T1, file.%T1.decl [concrete = constants.%T1] -// CHECK:STDOUT: %self.param: %Base = value_param call_param0 -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Base [concrete = constants.%Base] -// CHECK:STDOUT: %self: %Base = bind_name self, %self.param -// CHECK:STDOUT: %return.param: ref %T1 = out_param call_param1 -// CHECK:STDOUT: %return: ref %T1 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %.loc18: = vtable (%F.decl) [concrete = constants.%.5ee] -// CHECK:STDOUT: %struct_type.vptr: type = struct_type {.: %ptr.454} [concrete = constants.%struct_type.vptr] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.vptr [concrete = constants.%complete_type.513] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Base -// CHECK:STDOUT: .T1 = -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: .T2 = -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Derived { -// CHECK:STDOUT: %Base.ref: type = name_ref Base, file.%Base.decl [concrete = constants.%Base] -// CHECK:STDOUT: %.loc21: %Derived.elem = base_decl %Base.ref, element0 [concrete] -// CHECK:STDOUT: %F.decl: %F.type.5da = fn_decl @F.2 [concrete = constants.%F.fa3] { -// CHECK:STDOUT: %self.patt: %pattern_type.fb9 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.fb9 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: %pattern_type.682 = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: %pattern_type.682 = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T2.ref: type = name_ref T2, file.%T2.decl [concrete = constants.%T2] -// CHECK:STDOUT: %self.param: %Derived = value_param call_param0 -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Derived [concrete = constants.%Derived] -// CHECK:STDOUT: %self: %Derived = bind_name self, %self.param -// CHECK:STDOUT: %return.param: ref %T2 = out_param call_param1 -// CHECK:STDOUT: %return: ref %T2 = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %.loc30: = vtable (%F.decl) [concrete = constants.%.88d] -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %Base} [concrete = constants.%struct_type.base] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base [concrete = constants.%complete_type.15c] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Derived -// CHECK:STDOUT: .Base = -// CHECK:STDOUT: .base = %.loc21 -// CHECK:STDOUT: .T2 = -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: extend %Base.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @Convert.2(%self.param: %T2) -> %return.param: %T1 { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %.loc12_13.1: %empty_struct_type = struct_literal () -// CHECK:STDOUT: %.loc12_13.2: init %T1 = class_init (), %return [concrete = constants.%T1.val] -// CHECK:STDOUT: %.loc12_14: init %T1 = converted %.loc12_13.1, %.loc12_13.2 [concrete = constants.%T1.val] -// CHECK:STDOUT: return %.loc12_14 to %return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: virtual fn @F.1(%self.param: %Base) -> %return.param: %T1; -// CHECK:STDOUT: -// CHECK:STDOUT: impl fn @F.2(%self.param: %Derived) -> %return.param: %T2; -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_todo_impl_generic_base.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %T1: type = class_type @T1 [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] -// CHECK:STDOUT: %Base.type: type = generic_class_type @Base [concrete] -// CHECK:STDOUT: %Base.generic: %Base.type = struct_value () [concrete] -// CHECK:STDOUT: %Base.370: type = class_type @Base, @Base(%T) [symbolic] -// CHECK:STDOUT: %pattern_type.9f7: type = pattern_type %Base.370 [symbolic] -// CHECK:STDOUT: %pattern_type.7dc: type = pattern_type %T [symbolic] -// CHECK:STDOUT: %F.type.f17: type = fn_type @F.1, @Base(%T) [symbolic] -// CHECK:STDOUT: %F.e26: %F.type.f17 = struct_value () [symbolic] -// CHECK:STDOUT: %ptr.454: type = ptr_type [concrete] -// CHECK:STDOUT: %.f89: = vtable (%F.e26) [symbolic] -// CHECK:STDOUT: %struct_type.vptr: type = struct_type {.: %ptr.454} [concrete] -// CHECK:STDOUT: %complete_type.513: = complete_type_witness %struct_type.vptr [concrete] -// CHECK:STDOUT: %Derived: type = class_type @Derived [concrete] -// CHECK:STDOUT: %Base.ea5: type = class_type @Base, @Base(%T1) [concrete] -// CHECK:STDOUT: %F.type.d82: type = fn_type @F.1, @Base(%T1) [concrete] -// CHECK:STDOUT: %F.d25: %F.type.d82 = struct_value () [concrete] -// CHECK:STDOUT: %.611: = vtable (%F.d25) [concrete] -// CHECK:STDOUT: %Derived.elem: type = unbound_element_type %Derived, %Base.ea5 [concrete] -// CHECK:STDOUT: %pattern_type.fb9: type = pattern_type %Derived [concrete] -// CHECK:STDOUT: %pattern_type.28b: type = pattern_type %T1 [concrete] -// CHECK:STDOUT: %F.type.5da: type = fn_type @F.2 [concrete] -// CHECK:STDOUT: %F.fa3: %F.type.5da = struct_value () [concrete] -// CHECK:STDOUT: %.88d: = vtable (%F.fa3) [concrete] -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %Base.ea5} [concrete] -// CHECK:STDOUT: %complete_type.65a: = complete_type_witness %struct_type.base [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .T1 = %T1.decl -// CHECK:STDOUT: .Base = %Base.decl -// CHECK:STDOUT: .Derived = %Derived.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %T1.decl: type = class_decl @T1 [concrete = constants.%T1] {} {} -// CHECK:STDOUT: %Base.decl: %Base.type = class_decl @Base [concrete = constants.%Base.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc7_17.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc7_17.2 (constants.%T)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %Derived.decl: type = class_decl @Derived [concrete = constants.%Derived] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @T1 { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%T1 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @Base(%T.loc7_17.1: type) { -// CHECK:STDOUT: %T.loc7_17.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc7_17.2 (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %F.type: type = fn_type @F.1, @Base(%T.loc7_17.2) [symbolic = %F.type (constants.%F.type.f17)] -// CHECK:STDOUT: %F: @Base.%F.type (%F.type.f17) = struct_value () [symbolic = %F (constants.%F.e26)] -// CHECK:STDOUT: %.loc9_1.2: = vtable (%F) [symbolic = %.loc9_1.2 (constants.%.f89)] -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %F.decl: @Base.%F.type (%F.type.f17) = fn_decl @F.1 [symbolic = @Base.%F (constants.%F.e26)] { -// CHECK:STDOUT: %self.patt: @F.1.%pattern_type.loc8_16 (%pattern_type.9f7) = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: @F.1.%pattern_type.loc8_16 (%pattern_type.9f7) = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %t.patt: @F.1.%pattern_type.loc8_28 (%pattern_type.7dc) = binding_pattern t [concrete] -// CHECK:STDOUT: %t.param_patt: @F.1.%pattern_type.loc8_28 (%pattern_type.7dc) = value_param_pattern %t.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: @F.1.%Base (%Base.370) = value_param call_param0 -// CHECK:STDOUT: %.loc8_22.1: type = splice_block %Self.ref [symbolic = %Base (constants.%Base.370)] { -// CHECK:STDOUT: %.loc8_22.2: type = specific_constant constants.%Base.370, @Base(constants.%T) [symbolic = %Base (constants.%Base.370)] -// CHECK:STDOUT: %Self.ref: type = name_ref Self, %.loc8_22.2 [symbolic = %Base (constants.%Base.370)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self: @F.1.%Base (%Base.370) = bind_name self, %self.param -// CHECK:STDOUT: %t.param: @F.1.%T (%T) = value_param call_param1 -// CHECK:STDOUT: %T.ref: type = name_ref T, @Base.%T.loc7_17.1 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %t: @F.1.%T (%T) = bind_name t, %t.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %.loc9_1.1: = vtable (%F.decl) [symbolic = %.loc9_1.2 (constants.%.f89)] -// CHECK:STDOUT: %struct_type.vptr: type = struct_type {.: %ptr.454} [concrete = constants.%struct_type.vptr] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.vptr [concrete = constants.%complete_type.513] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Base.370 -// CHECK:STDOUT: .T = -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: .T1 = -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @Derived { -// CHECK:STDOUT: %Base.ref: %Base.type = name_ref Base, file.%Base.decl [concrete = constants.%Base.generic] -// CHECK:STDOUT: %T1.ref: type = name_ref T1, file.%T1.decl [concrete = constants.%T1] -// CHECK:STDOUT: %Base: type = class_type @Base, @Base(constants.%T1) [concrete = constants.%Base.ea5] -// CHECK:STDOUT: %.loc12: %Derived.elem = base_decl %Base, element0 [concrete] -// CHECK:STDOUT: %F.decl: %F.type.5da = fn_decl @F.2 [concrete = constants.%F.fa3] { -// CHECK:STDOUT: %self.patt: %pattern_type.fb9 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.fb9 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %t.patt: %pattern_type.28b = binding_pattern t [concrete] -// CHECK:STDOUT: %t.param_patt: %pattern_type.28b = value_param_pattern %t.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %Derived = value_param call_param0 -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Derived [concrete = constants.%Derived] -// CHECK:STDOUT: %self: %Derived = bind_name self, %self.param -// CHECK:STDOUT: %t.param: %T1 = value_param call_param1 -// CHECK:STDOUT: %T1.ref: type = name_ref T1, file.%T1.decl [concrete = constants.%T1] -// CHECK:STDOUT: %t: %T1 = bind_name t, %t.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %.loc21: = vtable (%F.decl) [concrete = constants.%.88d] -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %Base.ea5} [concrete = constants.%struct_type.base] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base [concrete = constants.%complete_type.65a] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%Derived -// CHECK:STDOUT: .Base = -// CHECK:STDOUT: .T1 = -// CHECK:STDOUT: .base = %.loc12 -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: extend %Base -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic virtual fn @F.1(@Base.%T.loc7_17.1: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %Base: type = class_type @Base, @Base(%T) [symbolic = %Base (constants.%Base.370)] -// CHECK:STDOUT: %pattern_type.loc8_16: type = pattern_type %Base [symbolic = %pattern_type.loc8_16 (constants.%pattern_type.9f7)] -// CHECK:STDOUT: %pattern_type.loc8_28: type = pattern_type %T [symbolic = %pattern_type.loc8_28 (constants.%pattern_type.7dc)] -// CHECK:STDOUT: -// CHECK:STDOUT: virtual fn(%self.param: @F.1.%Base (%Base.370), %t.param: @F.1.%T (%T)); -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: impl fn @F.2(%self.param: %Derived, %t.param: %T1); -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Base(constants.%T) { -// CHECK:STDOUT: %T.loc7_17.2 => constants.%T -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @F.1(constants.%T) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %Base => constants.%Base.370 -// CHECK:STDOUT: %pattern_type.loc8_16 => constants.%pattern_type.9f7 -// CHECK:STDOUT: %pattern_type.loc8_28 => constants.%pattern_type.7dc -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Base(constants.%T1) { -// CHECK:STDOUT: %T.loc7_17.2 => constants.%T1 -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %F.type => constants.%F.type.d82 -// CHECK:STDOUT: %F => constants.%F.d25 -// CHECK:STDOUT: %.loc9_1.2 => constants.%.611 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_virtual_without_self.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %T1: type = class_type @T1 [concrete] -// CHECK:STDOUT: %F.type.ba7: type = fn_type @F.1 [concrete] -// CHECK:STDOUT: %F.1a5: %F.type.ba7 = struct_value () [concrete] -// CHECK:STDOUT: %G.type: type = fn_type @G [concrete] -// CHECK:STDOUT: %G: %G.type = struct_value () [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %T2: type = class_type @T2 [concrete] -// CHECK:STDOUT: %T2.elem: type = unbound_element_type %T2, %T1 [concrete] -// CHECK:STDOUT: %F.type.834: type = fn_type @F.2 [concrete] -// CHECK:STDOUT: %F.a48: %F.type.834 = struct_value () [concrete] -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %T1} [concrete] -// CHECK:STDOUT: %complete_type.e14: = complete_type_witness %struct_type.base [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .T1 = %T1.decl -// CHECK:STDOUT: .T2 = %T2.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %T1.decl: type = class_decl @T1 [concrete = constants.%T1] {} {} -// CHECK:STDOUT: %T2.decl: type = class_decl @T2 [concrete = constants.%T2] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @T1 { -// CHECK:STDOUT: %F.decl: %F.type.ba7 = fn_decl @F.1 [concrete = constants.%F.1a5] {} {} -// CHECK:STDOUT: %G.decl: %G.type = fn_decl @G [concrete = constants.%G] {} {} -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type.357] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%T1 -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: .G = %G.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @T2 { -// CHECK:STDOUT: %T1.ref: type = name_ref T1, file.%T1.decl [concrete = constants.%T1] -// CHECK:STDOUT: %.loc18: %T2.elem = base_decl %T1.ref, element0 [concrete] -// CHECK:STDOUT: %F.decl: %F.type.834 = fn_decl @F.2 [concrete = constants.%F.a48] {} {} -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %T1} [concrete = constants.%struct_type.base] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base [concrete = constants.%complete_type.e14] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%T2 -// CHECK:STDOUT: .T1 = -// CHECK:STDOUT: .base = %.loc18 -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: extend %T1.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F.1(); -// CHECK:STDOUT: -// CHECK:STDOUT: fn @G(); -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F.2(); -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_addr_self_mismatch.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %T1: type = class_type @T1 [concrete] -// CHECK:STDOUT: %ptr.87b: type = ptr_type %T1 [concrete] -// CHECK:STDOUT: %pattern_type.a36: type = pattern_type %ptr.87b [concrete] -// CHECK:STDOUT: %F1.type.b96: type = fn_type @F1.1 [concrete] -// CHECK:STDOUT: %F1.765: %F1.type.b96 = struct_value () [concrete] -// CHECK:STDOUT: %ptr.454: type = ptr_type [concrete] -// CHECK:STDOUT: %.278: = vtable (%F1.765) [concrete] -// CHECK:STDOUT: %struct_type.vptr: type = struct_type {.: %ptr.454} [concrete] -// CHECK:STDOUT: %complete_type.513: = complete_type_witness %struct_type.vptr [concrete] -// CHECK:STDOUT: %T2: type = class_type @T2 [concrete] -// CHECK:STDOUT: %T2.elem: type = unbound_element_type %T2, %T1 [concrete] -// CHECK:STDOUT: %ptr.63e: type = ptr_type %T2 [concrete] -// CHECK:STDOUT: %pattern_type.fb8: type = pattern_type %ptr.63e [concrete] -// CHECK:STDOUT: %pattern_type.f6d: type = pattern_type auto [concrete] -// CHECK:STDOUT: %F1.type.b0d: type = fn_type @F1.2 [concrete] -// CHECK:STDOUT: %F1.0ce: %F1.type.b0d = struct_value () [concrete] -// CHECK:STDOUT: %.20a: = vtable (%F1.0ce) [concrete] -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %T1} [concrete] -// CHECK:STDOUT: %complete_type.e14: = complete_type_witness %struct_type.base [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .T1 = %T1.decl -// CHECK:STDOUT: .T2 = %T2.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %T1.decl: type = class_decl @T1 [concrete = constants.%T1] {} {} -// CHECK:STDOUT: %T2.decl: type = class_decl @T2 [concrete = constants.%T2] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @T1 { -// CHECK:STDOUT: %F1.decl: %F1.type.b96 = fn_decl @F1.1 [concrete = constants.%F1.765] { -// CHECK:STDOUT: %self.patt: %pattern_type.a36 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.a36 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %ptr.87b = value_param call_param0 -// CHECK:STDOUT: %.loc5: type = splice_block %ptr [concrete = constants.%ptr.87b] { -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%T1 [concrete = constants.%T1] -// CHECK:STDOUT: %ptr: type = ptr_type %Self.ref [concrete = constants.%ptr.87b] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self: %ptr.87b = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %.loc6: = vtable (%F1.decl) [concrete = constants.%.278] -// CHECK:STDOUT: %struct_type.vptr: type = struct_type {.: %ptr.454} [concrete = constants.%struct_type.vptr] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.vptr [concrete = constants.%complete_type.513] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%T1 -// CHECK:STDOUT: .F1 = %F1.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @T2 { -// CHECK:STDOUT: %T1.ref: type = name_ref T1, file.%T1.decl [concrete = constants.%T1] -// CHECK:STDOUT: %.loc9: %T2.elem = base_decl %T1.ref, element0 [concrete] -// CHECK:STDOUT: %F1.decl: %F1.type.b0d = fn_decl @F1.2 [concrete = constants.%F1.0ce] { -// CHECK:STDOUT: %self.patt: %pattern_type.fb8 = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.fb8 = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %.loc17_14: %pattern_type.f6d = addr_pattern %self.param_patt [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %ptr.63e = value_param call_param0 -// CHECK:STDOUT: %.loc17_29: type = splice_block %ptr [concrete = constants.%ptr.63e] { -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%T2 [concrete = constants.%T2] -// CHECK:STDOUT: %ptr: type = ptr_type %Self.ref [concrete = constants.%ptr.63e] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self: %ptr.63e = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %.loc18: = vtable (%F1.decl) [concrete = constants.%.20a] -// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %T1} [concrete = constants.%struct_type.base] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base [concrete = constants.%complete_type.e14] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%T2 -// CHECK:STDOUT: .T1 = -// CHECK:STDOUT: .base = %.loc9 -// CHECK:STDOUT: .F1 = %F1.decl -// CHECK:STDOUT: extend %T1.ref -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: virtual fn @F1.1(%self.param: %ptr.87b); -// CHECK:STDOUT: -// CHECK:STDOUT: impl fn @F1.2(%self.param: %ptr.63e); -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_generic_virtual.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %T1: type = class_type @T1 [concrete] -// CHECK:STDOUT: %pattern_type.28b: type = pattern_type %T1 [concrete] -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .T1 = %T1.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %T1.decl: type = class_decl @T1 [concrete = constants.%T1] {} {} -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @T1 { -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %self.patt: %pattern_type.28b = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: %pattern_type.28b = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: %T1 = value_param call_param0 -// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%T1 [concrete = constants.%T1] -// CHECK:STDOUT: %self: %T1 = bind_name self, %self.param -// CHECK:STDOUT: %T.loc9_28.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc9_28.1 (constants.%T)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%T1 -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic virtual fn @F(%T.loc9_28.2: type) { -// CHECK:STDOUT: %T.loc9_28.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc9_28.1 (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: virtual fn(%self.param: %T1); -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @F(constants.%T) { -// CHECK:STDOUT: %T.loc9_28.1 => constants.%T -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_generic_virtual_in_generic_class.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %T.8b3: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] -// CHECK:STDOUT: %T1.type: type = generic_class_type @T1 [concrete] -// CHECK:STDOUT: %T1.generic: %T1.type = struct_value () [concrete] -// CHECK:STDOUT: %T1: type = class_type @T1, @T1(%T.8b3) [symbolic] -// CHECK:STDOUT: %pattern_type.48e: type = pattern_type %T1 [symbolic] -// CHECK:STDOUT: %T.336: type = bind_symbolic_name T, 1 [symbolic] -// CHECK:STDOUT: %F.type: type = fn_type @F, @T1(%T.8b3) [symbolic] -// CHECK:STDOUT: %F: %F.type = struct_value () [symbolic] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .T1 = %T1.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %T1.decl: %T1.type = class_decl @T1 [concrete = constants.%T1.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc4_15.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_15.2 (constants.%T.8b3)] -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @T1(%T.loc4_15.1: type) { -// CHECK:STDOUT: %T.loc4_15.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_15.2 (constants.%T.8b3)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %F.type: type = fn_type @F, @T1(%T.loc4_15.2) [symbolic = %F.type (constants.%F.type)] -// CHECK:STDOUT: %F: @T1.%F.type (%F.type) = struct_value () [symbolic = %F (constants.%F)] -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %F.decl: @T1.%F.type (%F.type) = fn_decl @F [symbolic = @T1.%F (constants.%F)] { -// CHECK:STDOUT: %self.patt: @F.%pattern_type (%pattern_type.48e) = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: @F.%pattern_type (%pattern_type.48e) = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: @F.%T1 (%T1) = value_param call_param0 -// CHECK:STDOUT: %.loc9_22.1: type = splice_block %Self.ref [symbolic = %T1 (constants.%T1)] { -// CHECK:STDOUT: %.loc9_22.2: type = specific_constant constants.%T1, @T1(constants.%T.8b3) [symbolic = %T1 (constants.%T1)] -// CHECK:STDOUT: %Self.ref: type = name_ref Self, %.loc9_22.2 [symbolic = %T1 (constants.%T1)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self: @F.%T1 (%T1) = bind_name self, %self.param -// CHECK:STDOUT: %T.loc9_28.2: type = bind_symbolic_name T, 1 [symbolic = %T.loc9_28.1 (constants.%T.336)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = 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.%T1 -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic virtual fn @F(@T1.%T.loc4_15.1: type, %T.loc9_28.2: type) { -// CHECK:STDOUT: %T.loc9_22: type = bind_symbolic_name T, 0 [symbolic = %T.loc9_22 (constants.%T.8b3)] -// CHECK:STDOUT: %T1: type = class_type @T1, @T1(%T.loc9_22) [symbolic = %T1 (constants.%T1)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %T1 [symbolic = %pattern_type (constants.%pattern_type.48e)] -// CHECK:STDOUT: %T.loc9_28.1: type = bind_symbolic_name T, 1 [symbolic = %T.loc9_28.1 (constants.%T.336)] -// CHECK:STDOUT: -// CHECK:STDOUT: virtual fn(%self.param: @F.%T1 (%T1)); -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @T1(constants.%T.8b3) { -// CHECK:STDOUT: %T.loc4_15.2 => constants.%T.8b3 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @F(constants.%T.8b3, constants.%T.336) { -// CHECK:STDOUT: %T.loc9_22 => constants.%T.8b3 -// CHECK:STDOUT: %T1 => constants.%T1 -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.48e -// CHECK:STDOUT: %T.loc9_28.1 => constants.%T.336 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- generic_with_virtual.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] -// CHECK:STDOUT: %T1.type: type = generic_class_type @T1 [concrete] -// CHECK:STDOUT: %T1.generic: %T1.type = struct_value () [concrete] -// CHECK:STDOUT: %T1: type = class_type @T1, @T1(%T) [symbolic] -// CHECK:STDOUT: %pattern_type.48e: type = pattern_type %T1 [symbolic] -// CHECK:STDOUT: %F.type: type = fn_type @F, @T1(%T) [symbolic] -// CHECK:STDOUT: %F: %F.type = struct_value () [symbolic] -// CHECK:STDOUT: %ptr: type = ptr_type [concrete] -// CHECK:STDOUT: %.db6: = vtable (%F) [symbolic] -// CHECK:STDOUT: %struct_type.vptr: type = struct_type {.: %ptr} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.vptr [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .T1 = %T1.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %T1.decl: %T1.type = class_decl @T1 [concrete = constants.%T1.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc4_15.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_15.2 (constants.%T)] -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @T1(%T.loc4_15.1: type) { -// CHECK:STDOUT: %T.loc4_15.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_15.2 (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %F.type: type = fn_type @F, @T1(%T.loc4_15.2) [symbolic = %F.type (constants.%F.type)] -// CHECK:STDOUT: %F: @T1.%F.type (%F.type) = struct_value () [symbolic = %F (constants.%F)] -// CHECK:STDOUT: %.loc6_1.2: = vtable (%F) [symbolic = %.loc6_1.2 (constants.%.db6)] -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %F.decl: @T1.%F.type (%F.type) = fn_decl @F [symbolic = @T1.%F (constants.%F)] { -// CHECK:STDOUT: %self.patt: @F.%pattern_type (%pattern_type.48e) = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: @F.%pattern_type (%pattern_type.48e) = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: @F.%T1 (%T1) = value_param call_param0 -// CHECK:STDOUT: %.loc5_22.1: type = splice_block %Self.ref [symbolic = %T1 (constants.%T1)] { -// CHECK:STDOUT: %.loc5_22.2: type = specific_constant constants.%T1, @T1(constants.%T) [symbolic = %T1 (constants.%T1)] -// CHECK:STDOUT: %Self.ref: type = name_ref Self, %.loc5_22.2 [symbolic = %T1 (constants.%T1)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self: @F.%T1 (%T1) = bind_name self, %self.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %.loc6_1.1: = vtable (%F.decl) [symbolic = %.loc6_1.2 (constants.%.db6)] -// CHECK:STDOUT: %struct_type.vptr: type = struct_type {.: %ptr} [concrete = constants.%struct_type.vptr] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.vptr [concrete = constants.%complete_type] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%T1 -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic virtual fn @F(@T1.%T.loc4_15.1: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %T1: type = class_type @T1, @T1(%T) [symbolic = %T1 (constants.%T1)] -// CHECK:STDOUT: %pattern_type: type = pattern_type %T1 [symbolic = %pattern_type (constants.%pattern_type.48e)] -// CHECK:STDOUT: -// CHECK:STDOUT: virtual fn(%self.param: @F.%T1 (%T1)); -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @T1(constants.%T) { -// CHECK:STDOUT: %T.loc4_15.2 => constants.%T -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @F(constants.%T) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %T1 => constants.%T1 -// CHECK:STDOUT: %pattern_type => constants.%pattern_type.48e -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- with_dependent_arg.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] -// CHECK:STDOUT: %T1.type: type = generic_class_type @T1 [concrete] -// CHECK:STDOUT: %T1.generic: %T1.type = struct_value () [concrete] -// CHECK:STDOUT: %T1: type = class_type @T1, @T1(%T) [symbolic] -// CHECK:STDOUT: %pattern_type.48e: type = pattern_type %T1 [symbolic] -// CHECK:STDOUT: %pattern_type.7dc: type = pattern_type %T [symbolic] -// CHECK:STDOUT: %F.type: type = fn_type @F, @T1(%T) [symbolic] -// CHECK:STDOUT: %F: %F.type = struct_value () [symbolic] -// CHECK:STDOUT: %ptr: type = ptr_type [concrete] -// CHECK:STDOUT: %.db6: = vtable (%F) [symbolic] -// CHECK:STDOUT: %struct_type.vptr: type = struct_type {.: %ptr} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.vptr [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .T1 = %T1.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %T1.decl: %T1.type = class_decl @T1 [concrete = constants.%T1.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc4_15.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_15.2 (constants.%T)] -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic class @T1(%T.loc4_15.1: type) { -// CHECK:STDOUT: %T.loc4_15.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc4_15.2 (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %F.type: type = fn_type @F, @T1(%T.loc4_15.2) [symbolic = %F.type (constants.%F.type)] -// CHECK:STDOUT: %F: @T1.%F.type (%F.type) = struct_value () [symbolic = %F (constants.%F)] -// CHECK:STDOUT: %.loc6_1.2: = vtable (%F) [symbolic = %.loc6_1.2 (constants.%.db6)] -// CHECK:STDOUT: -// CHECK:STDOUT: class { -// CHECK:STDOUT: %F.decl: @T1.%F.type (%F.type) = fn_decl @F [symbolic = @T1.%F (constants.%F)] { -// CHECK:STDOUT: %self.patt: @F.%pattern_type.loc5_16 (%pattern_type.48e) = binding_pattern self [concrete] -// CHECK:STDOUT: %self.param_patt: @F.%pattern_type.loc5_16 (%pattern_type.48e) = value_param_pattern %self.patt, call_param0 [concrete] -// CHECK:STDOUT: %t.patt: @F.%pattern_type.loc5_28 (%pattern_type.7dc) = binding_pattern t [concrete] -// CHECK:STDOUT: %t.param_patt: @F.%pattern_type.loc5_28 (%pattern_type.7dc) = value_param_pattern %t.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %self.param: @F.%T1 (%T1) = value_param call_param0 -// CHECK:STDOUT: %.loc5_22.1: type = splice_block %Self.ref [symbolic = %T1 (constants.%T1)] { -// CHECK:STDOUT: %.loc5_22.2: type = specific_constant constants.%T1, @T1(constants.%T) [symbolic = %T1 (constants.%T1)] -// CHECK:STDOUT: %Self.ref: type = name_ref Self, %.loc5_22.2 [symbolic = %T1 (constants.%T1)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %self: @F.%T1 (%T1) = bind_name self, %self.param -// CHECK:STDOUT: %t.param: @F.%T (%T) = value_param call_param1 -// CHECK:STDOUT: %T.ref: type = name_ref T, @T1.%T.loc4_15.1 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %t: @F.%T (%T) = bind_name t, %t.param -// CHECK:STDOUT: } -// CHECK:STDOUT: %.loc6_1.1: = vtable (%F.decl) [symbolic = %.loc6_1.2 (constants.%.db6)] -// CHECK:STDOUT: %struct_type.vptr: type = struct_type {.: %ptr} [concrete = constants.%struct_type.vptr] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.vptr [concrete = constants.%complete_type] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%T1 -// CHECK:STDOUT: .T = -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic virtual fn @F(@T1.%T.loc4_15.1: type) { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)] -// CHECK:STDOUT: %T1: type = class_type @T1, @T1(%T) [symbolic = %T1 (constants.%T1)] -// CHECK:STDOUT: %pattern_type.loc5_16: type = pattern_type %T1 [symbolic = %pattern_type.loc5_16 (constants.%pattern_type.48e)] -// CHECK:STDOUT: %pattern_type.loc5_28: type = pattern_type %T [symbolic = %pattern_type.loc5_28 (constants.%pattern_type.7dc)] -// CHECK:STDOUT: -// CHECK:STDOUT: virtual fn(%self.param: @F.%T1 (%T1), %t.param: @F.%T (%T)); -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @T1(constants.%T) { -// CHECK:STDOUT: %T.loc4_15.2 => constants.%T -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @F(constants.%T) { -// CHECK:STDOUT: %T => constants.%T -// CHECK:STDOUT: %T1 => constants.%T1 -// CHECK:STDOUT: %pattern_type.loc5_16 => constants.%pattern_type.48e -// CHECK:STDOUT: %pattern_type.loc5_28 => constants.%pattern_type.7dc -// CHECK:STDOUT: } -// CHECK:STDOUT: From 75d78dacd2e503eb44c89523c4b825d3cc2a9517 Mon Sep 17 00:00:00 2001 From: jonmeow Date: Tue, 27 May 2025 14:54:47 -0700 Subject: [PATCH 3/6] library --- .../testdata/class/no_prelude/nested.carbon | 100 +++++++++--------- 1 file changed, 50 insertions(+), 50 deletions(-) diff --git a/toolchain/check/testdata/class/no_prelude/nested.carbon b/toolchain/check/testdata/class/no_prelude/nested.carbon index 68543a9088f91..ac10f9c844a27 100644 --- a/toolchain/check/testdata/class/no_prelude/nested.carbon +++ b/toolchain/check/testdata/class/no_prelude/nested.carbon @@ -11,6 +11,7 @@ // TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/no_prelude/nested.carbon // --- nested.carbon +library "[[@TEST_NAME]]"; class Outer { fn F() { @@ -56,8 +57,7 @@ fn F(a: Outer*) { } // --- nested_name.carbon -// CHECK:STDERR: nested_name.carbon: error: `Main//default` previously provided by `nested.carbon` [DuplicateMainApi] -// CHECK:STDERR: +library "[[@TEST_NAME]]"; class Outer { //@dump-sem-ir-begin @@ -96,67 +96,67 @@ fn G(o: Outer) { // CHECK:STDOUT: name_binding_decl { // CHECK:STDOUT: %b.patt: %pattern_type.27f = binding_pattern b [concrete] // CHECK:STDOUT: } -// CHECK:STDOUT: %a.ref.loc34: %ptr.5df = name_ref a, %a -// CHECK:STDOUT: %.loc34_26: ref %Outer = deref %a.ref.loc34 -// CHECK:STDOUT: %pi.ref.loc34: %Outer.elem.fe9 = name_ref pi, @Outer.%.loc29 [concrete = @Outer.%.loc29] -// CHECK:STDOUT: %.loc34_29: ref %ptr.36a = class_element_access %.loc34_26, element2 -// CHECK:STDOUT: %.loc34_21: type = splice_block %ptr.loc34 [concrete = constants.%ptr.36a] { -// CHECK:STDOUT: %Outer.ref.loc34: type = name_ref Outer, file.%Outer.decl [concrete = constants.%Outer] +// CHECK:STDOUT: %a.ref.loc35: %ptr.5df = name_ref a, %a +// CHECK:STDOUT: %.loc35_26: ref %Outer = deref %a.ref.loc35 +// CHECK:STDOUT: %pi.ref.loc35: %Outer.elem.fe9 = name_ref pi, @Outer.%.loc30 [concrete = @Outer.%.loc30] +// CHECK:STDOUT: %.loc35_29: ref %ptr.36a = class_element_access %.loc35_26, element2 +// CHECK:STDOUT: %.loc35_21: type = splice_block %ptr.loc35 [concrete = constants.%ptr.36a] { +// CHECK:STDOUT: %Outer.ref.loc35: type = name_ref Outer, file.%Outer.decl [concrete = constants.%Outer] // CHECK:STDOUT: %Inner.ref: type = name_ref Inner, @Outer.%Inner.decl [concrete = constants.%Inner] -// CHECK:STDOUT: %ptr.loc34: type = ptr_type %Inner.ref [concrete = constants.%ptr.36a] +// CHECK:STDOUT: %ptr.loc35: type = ptr_type %Inner.ref [concrete = constants.%ptr.36a] // CHECK:STDOUT: } -// CHECK:STDOUT: %b: ref %ptr.36a = bind_name b, %.loc34_29 -// CHECK:STDOUT: %a.ref.loc36_3: %ptr.5df = name_ref a, %a -// CHECK:STDOUT: %.loc36_4.1: ref %Outer = deref %a.ref.loc36_3 -// CHECK:STDOUT: %po.ref.loc36: %Outer.elem.a16 = name_ref po, @Outer.%.loc27 [concrete = @Outer.%.loc27] -// CHECK:STDOUT: %.loc36_4.2: ref %ptr.5df = class_element_access %.loc36_4.1, element0 -// CHECK:STDOUT: %a.ref.loc36_11: %ptr.5df = name_ref a, %a -// CHECK:STDOUT: assign %.loc36_4.2, %a.ref.loc36_11 +// CHECK:STDOUT: %b: ref %ptr.36a = bind_name b, %.loc35_29 // CHECK:STDOUT: %a.ref.loc37_3: %ptr.5df = name_ref a, %a // CHECK:STDOUT: %.loc37_4.1: ref %Outer = deref %a.ref.loc37_3 -// CHECK:STDOUT: %qo.ref: %Outer.elem.a16 = name_ref qo, @Outer.%.loc28 [concrete = @Outer.%.loc28] -// CHECK:STDOUT: %.loc37_4.2: ref %ptr.5df = class_element_access %.loc37_4.1, element1 +// CHECK:STDOUT: %po.ref.loc37: %Outer.elem.a16 = name_ref po, @Outer.%.loc28 [concrete = @Outer.%.loc28] +// CHECK:STDOUT: %.loc37_4.2: ref %ptr.5df = class_element_access %.loc37_4.1, element0 // CHECK:STDOUT: %a.ref.loc37_11: %ptr.5df = name_ref a, %a // CHECK:STDOUT: assign %.loc37_4.2, %a.ref.loc37_11 // CHECK:STDOUT: %a.ref.loc38_3: %ptr.5df = name_ref a, %a // CHECK:STDOUT: %.loc38_4.1: ref %Outer = deref %a.ref.loc38_3 -// CHECK:STDOUT: %pi.ref.loc38_4: %Outer.elem.fe9 = name_ref pi, @Outer.%.loc29 [concrete = @Outer.%.loc29] -// CHECK:STDOUT: %.loc38_4.2: ref %ptr.36a = class_element_access %.loc38_4.1, element2 +// CHECK:STDOUT: %qo.ref: %Outer.elem.a16 = name_ref qo, @Outer.%.loc29 [concrete = @Outer.%.loc29] +// CHECK:STDOUT: %.loc38_4.2: ref %ptr.5df = class_element_access %.loc38_4.1, element1 // CHECK:STDOUT: %a.ref.loc38_11: %ptr.5df = name_ref a, %a -// CHECK:STDOUT: %.loc38_12.1: ref %Outer = deref %a.ref.loc38_11 -// CHECK:STDOUT: %pi.ref.loc38_12: %Outer.elem.fe9 = name_ref pi, @Outer.%.loc29 [concrete = @Outer.%.loc29] -// CHECK:STDOUT: %.loc38_12.2: ref %ptr.36a = class_element_access %.loc38_12.1, element2 -// CHECK:STDOUT: %.loc38_12.3: %ptr.36a = bind_value %.loc38_12.2 -// CHECK:STDOUT: assign %.loc38_4.2, %.loc38_12.3 -// CHECK:STDOUT: %b.ref.loc39: ref %ptr.36a = name_ref b, %b -// CHECK:STDOUT: %.loc39_3: %ptr.36a = bind_value %b.ref.loc39 -// CHECK:STDOUT: %.loc39_4.1: ref %Inner = deref %.loc39_3 -// CHECK:STDOUT: %po.ref.loc39: %Inner.elem.c30 = name_ref po, @Inner.%.loc11 [concrete = @Inner.%.loc11] -// CHECK:STDOUT: %.loc39_4.2: ref %ptr.5df = class_element_access %.loc39_4.1, element1 -// CHECK:STDOUT: %a.ref.loc39: %ptr.5df = name_ref a, %a -// CHECK:STDOUT: assign %.loc39_4.2, %a.ref.loc39 +// CHECK:STDOUT: assign %.loc38_4.2, %a.ref.loc38_11 +// CHECK:STDOUT: %a.ref.loc39_3: %ptr.5df = name_ref a, %a +// CHECK:STDOUT: %.loc39_4.1: ref %Outer = deref %a.ref.loc39_3 +// CHECK:STDOUT: %pi.ref.loc39_4: %Outer.elem.fe9 = name_ref pi, @Outer.%.loc30 [concrete = @Outer.%.loc30] +// CHECK:STDOUT: %.loc39_4.2: ref %ptr.36a = class_element_access %.loc39_4.1, element2 +// CHECK:STDOUT: %a.ref.loc39_11: %ptr.5df = name_ref a, %a +// CHECK:STDOUT: %.loc39_12.1: ref %Outer = deref %a.ref.loc39_11 +// CHECK:STDOUT: %pi.ref.loc39_12: %Outer.elem.fe9 = name_ref pi, @Outer.%.loc30 [concrete = @Outer.%.loc30] +// CHECK:STDOUT: %.loc39_12.2: ref %ptr.36a = class_element_access %.loc39_12.1, element2 +// CHECK:STDOUT: %.loc39_12.3: %ptr.36a = bind_value %.loc39_12.2 +// CHECK:STDOUT: assign %.loc39_4.2, %.loc39_12.3 // CHECK:STDOUT: %b.ref.loc40: ref %ptr.36a = name_ref b, %b // CHECK:STDOUT: %.loc40_3: %ptr.36a = bind_value %b.ref.loc40 // CHECK:STDOUT: %.loc40_4.1: ref %Inner = deref %.loc40_3 -// CHECK:STDOUT: %pi.ref.loc40_4: %Inner.elem.640 = name_ref pi, @Inner.%.loc10 [concrete = @Inner.%.loc10] -// CHECK:STDOUT: %.loc40_4.2: ref %ptr.36a = class_element_access %.loc40_4.1, element0 +// CHECK:STDOUT: %po.ref.loc40: %Inner.elem.c30 = name_ref po, @Inner.%.loc12 [concrete = @Inner.%.loc12] +// CHECK:STDOUT: %.loc40_4.2: ref %ptr.5df = class_element_access %.loc40_4.1, element1 // CHECK:STDOUT: %a.ref.loc40: %ptr.5df = name_ref a, %a -// CHECK:STDOUT: %.loc40_12.1: ref %Outer = deref %a.ref.loc40 -// CHECK:STDOUT: %pi.ref.loc40_12: %Outer.elem.fe9 = name_ref pi, @Outer.%.loc29 [concrete = @Outer.%.loc29] -// CHECK:STDOUT: %.loc40_12.2: ref %ptr.36a = class_element_access %.loc40_12.1, element2 -// CHECK:STDOUT: %.loc40_12.3: %ptr.36a = bind_value %.loc40_12.2 -// CHECK:STDOUT: assign %.loc40_4.2, %.loc40_12.3 +// CHECK:STDOUT: assign %.loc40_4.2, %a.ref.loc40 // CHECK:STDOUT: %b.ref.loc41: ref %ptr.36a = name_ref b, %b // CHECK:STDOUT: %.loc41_3: %ptr.36a = bind_value %b.ref.loc41 // CHECK:STDOUT: %.loc41_4.1: ref %Inner = deref %.loc41_3 -// CHECK:STDOUT: %qi.ref: %Inner.elem.640 = name_ref qi, @Inner.%.loc12 [concrete = @Inner.%.loc12] -// CHECK:STDOUT: %.loc41_4.2: ref %ptr.36a = class_element_access %.loc41_4.1, element2 +// CHECK:STDOUT: %pi.ref.loc41_4: %Inner.elem.640 = name_ref pi, @Inner.%.loc11 [concrete = @Inner.%.loc11] +// CHECK:STDOUT: %.loc41_4.2: ref %ptr.36a = class_element_access %.loc41_4.1, element0 // CHECK:STDOUT: %a.ref.loc41: %ptr.5df = name_ref a, %a // CHECK:STDOUT: %.loc41_12.1: ref %Outer = deref %a.ref.loc41 -// CHECK:STDOUT: %pi.ref.loc41: %Outer.elem.fe9 = name_ref pi, @Outer.%.loc29 [concrete = @Outer.%.loc29] +// CHECK:STDOUT: %pi.ref.loc41_12: %Outer.elem.fe9 = name_ref pi, @Outer.%.loc30 [concrete = @Outer.%.loc30] // CHECK:STDOUT: %.loc41_12.2: ref %ptr.36a = class_element_access %.loc41_12.1, element2 // CHECK:STDOUT: %.loc41_12.3: %ptr.36a = bind_value %.loc41_12.2 // CHECK:STDOUT: assign %.loc41_4.2, %.loc41_12.3 +// CHECK:STDOUT: %b.ref.loc42: ref %ptr.36a = name_ref b, %b +// CHECK:STDOUT: %.loc42_3: %ptr.36a = bind_value %b.ref.loc42 +// CHECK:STDOUT: %.loc42_4.1: ref %Inner = deref %.loc42_3 +// CHECK:STDOUT: %qi.ref: %Inner.elem.640 = name_ref qi, @Inner.%.loc13 [concrete = @Inner.%.loc13] +// CHECK:STDOUT: %.loc42_4.2: ref %ptr.36a = class_element_access %.loc42_4.1, element2 +// CHECK:STDOUT: %a.ref.loc42: %ptr.5df = name_ref a, %a +// CHECK:STDOUT: %.loc42_12.1: ref %Outer = deref %a.ref.loc42 +// CHECK:STDOUT: %pi.ref.loc42: %Outer.elem.fe9 = name_ref pi, @Outer.%.loc30 [concrete = @Outer.%.loc30] +// CHECK:STDOUT: %.loc42_12.2: ref %ptr.36a = class_element_access %.loc42_12.1, element2 +// CHECK:STDOUT: %.loc42_12.3: %ptr.36a = bind_value %.loc42_12.2 +// CHECK:STDOUT: assign %.loc42_4.2, %.loc42_12.3 // CHECK:STDOUT: // CHECK:STDOUT: } // CHECK:STDOUT: @@ -183,25 +183,25 @@ fn G(o: Outer) { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: class @Inner { -// CHECK:STDOUT: %.loc7_13.1: %empty_tuple.type = tuple_literal () -// CHECK:STDOUT: %.loc7_13.2: type = converted %.loc7_13.1, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] -// CHECK:STDOUT: %.loc7_10: %Inner.elem = field_decl n, element0 [concrete] +// CHECK:STDOUT: %.loc6_13.1: %empty_tuple.type = tuple_literal () +// CHECK:STDOUT: %.loc6_13.2: type = converted %.loc6_13.1, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] +// CHECK:STDOUT: %.loc6_10: %Inner.elem = field_decl n, element0 [concrete] // CHECK:STDOUT: %struct_type.n: type = struct_type {.n: %empty_tuple.type} [concrete = constants.%struct_type.n] // CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.n [concrete = constants.%complete_type.880] // CHECK:STDOUT: complete_type_witness = %complete_type // CHECK:STDOUT: // CHECK:STDOUT: !members: // CHECK:STDOUT: .Self = constants.%Inner -// CHECK:STDOUT: .n = %.loc7_10 +// CHECK:STDOUT: .n = %.loc6_10 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F(%oi.param: %Inner) -> %empty_tuple.type { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %oi.ref: %Inner = name_ref oi, %oi -// CHECK:STDOUT: %n.ref: %Inner.elem = name_ref n, @Inner.%.loc7_10 [concrete = @Inner.%.loc7_10] -// CHECK:STDOUT: %.loc14_12.1: ref %empty_tuple.type = class_element_access %oi.ref, element0 +// CHECK:STDOUT: %n.ref: %Inner.elem = name_ref n, @Inner.%.loc6_10 [concrete = @Inner.%.loc6_10] +// CHECK:STDOUT: %.loc13_12.1: ref %empty_tuple.type = class_element_access %oi.ref, element0 // CHECK:STDOUT: %tuple: %empty_tuple.type = tuple_value () [concrete = constants.%empty_tuple] -// CHECK:STDOUT: %.loc14_12.2: %empty_tuple.type = converted %.loc14_12.1, %tuple [concrete = constants.%empty_tuple] -// CHECK:STDOUT: return %.loc14_12.2 +// CHECK:STDOUT: %.loc13_12.2: %empty_tuple.type = converted %.loc13_12.1, %tuple [concrete = constants.%empty_tuple] +// CHECK:STDOUT: return %.loc13_12.2 // CHECK:STDOUT: } // CHECK:STDOUT: From 16cd0002e96a7a913bbcfaa9ac3c4856c10ad97d Mon Sep 17 00:00:00 2001 From: jonmeow Date: Tue, 27 May 2025 16:20:35 -0700 Subject: [PATCH 4/6] Fix a few bad test names --- .../class/min_prelude/derived_to_base.carbon | 14 +++++------- .../testdata/class/min_prelude/init.carbon | 12 ++++------ .../testdata/class/min_prelude/self.carbon | 14 +++++------- .../class/no_prelude/member_functions.carbon | 22 ++++++++----------- 4 files changed, 23 insertions(+), 39 deletions(-) diff --git a/toolchain/check/testdata/class/min_prelude/derived_to_base.carbon b/toolchain/check/testdata/class/min_prelude/derived_to_base.carbon index 2510724dccbd2..e5b43c10b3af6 100644 --- a/toolchain/check/testdata/class/min_prelude/derived_to_base.carbon +++ b/toolchain/check/testdata/class/min_prelude/derived_to_base.carbon @@ -47,12 +47,8 @@ fn ConvertInit() { } //@dump-sem-ir-end -// --- fail_derived_to_base.carbon +// --- fail_bad_derived_to_base.carbon -// CHECK:STDERR: fail_derived_to_base.carbon:[[@LINE+4]]:1: error: library's API previously provided by `derived_to_base.carbon` [DuplicateLibraryApi] -// CHECK:STDERR: library "derived_to_base"; -// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~ -// CHECK:STDERR: library "[[@TEST_NAME]]"; base class A1 { @@ -68,10 +64,10 @@ class B2 { var b: (); } -// CHECK:STDERR: fail_derived_to_base.carbon:[[@LINE+7]]:38: error: cannot implicitly convert expression of type `B2*` to `A1*` [ConversionFailure] +// CHECK:STDERR: fail_bad_derived_to_base.carbon:[[@LINE+7]]:38: error: cannot implicitly convert expression of type `B2*` to `A1*` [ConversionFailure] // CHECK:STDERR: fn ConvertUnrelated(p: B2*) -> A1* { return p; } // CHECK:STDERR: ^~~~~~~~~ -// CHECK:STDERR: fail_derived_to_base.carbon:[[@LINE+4]]:38: note: type `B2*` does not implement interface `Core.ImplicitAs(A1*)` [MissingImplInMemberAccessNote] +// CHECK:STDERR: fail_bad_derived_to_base.carbon:[[@LINE+4]]:38: note: type `B2*` does not implement interface `Core.ImplicitAs(A1*)` [MissingImplInMemberAccessNote] // CHECK:STDERR: fn ConvertUnrelated(p: B2*) -> A1* { return p; } // CHECK:STDERR: ^~~~~~~~~ // CHECK:STDERR: @@ -79,10 +75,10 @@ fn ConvertUnrelated(p: B2*) -> A1* { return p; } class Incomplete; -// CHECK:STDERR: fail_derived_to_base.carbon:[[@LINE+7]]:47: error: cannot implicitly convert expression of type `Incomplete*` to `A2*` [ConversionFailure] +// CHECK:STDERR: fail_bad_derived_to_base.carbon:[[@LINE+7]]:47: error: cannot implicitly convert expression of type `Incomplete*` to `A2*` [ConversionFailure] // CHECK:STDERR: fn ConvertIncomplete(p: Incomplete*) -> A2* { return p; } // CHECK:STDERR: ^~~~~~~~~ -// CHECK:STDERR: fail_derived_to_base.carbon:[[@LINE+4]]:47: note: type `Incomplete*` does not implement interface `Core.ImplicitAs(A2*)` [MissingImplInMemberAccessNote] +// CHECK:STDERR: fail_bad_derived_to_base.carbon:[[@LINE+4]]:47: note: type `Incomplete*` does not implement interface `Core.ImplicitAs(A2*)` [MissingImplInMemberAccessNote] // CHECK:STDERR: fn ConvertIncomplete(p: Incomplete*) -> A2* { return p; } // CHECK:STDERR: ^~~~~~~~~ // CHECK:STDERR: diff --git a/toolchain/check/testdata/class/min_prelude/init.carbon b/toolchain/check/testdata/class/min_prelude/init.carbon index 7cd65c1d43b80..22b4c35a6d03f 100644 --- a/toolchain/check/testdata/class/min_prelude/init.carbon +++ b/toolchain/check/testdata/class/min_prelude/init.carbon @@ -66,11 +66,7 @@ fn MakeOuter() -> Outer { //@dump-sem-ir-end } -// --- fail_init.carbon -// CHECK:STDERR: fail_init.carbon:[[@LINE+4]]:1: error: library's API previously provided by `init.carbon` [DuplicateLibraryApi] -// CHECK:STDERR: library "init"; -// CHECK:STDERR: ^~~~~~~~~~~~~~~ -// CHECK:STDERR: +// --- fail_bad_init.carbon library "[[@TEST_NAME]]"; class Class { @@ -79,17 +75,17 @@ class Class { } fn F() { - // CHECK:STDERR: fail_init.carbon:[[@LINE+4]]:3: error: cannot initialize class with 2 fields from struct with 1 field [StructInitElementCountMismatch] + // CHECK:STDERR: fail_bad_init.carbon:[[@LINE+4]]:3: error: cannot initialize class with 2 fields from struct with 1 field [StructInitElementCountMismatch] // CHECK:STDERR: {.a = ()} as Class; // CHECK:STDERR: ^~~~~~~~~ // CHECK:STDERR: {.a = ()} as Class; - // CHECK:STDERR: fail_init.carbon:[[@LINE+4]]:3: error: missing value for field `b` in struct initialization [StructInitMissingFieldInLiteral] + // CHECK:STDERR: fail_bad_init.carbon:[[@LINE+4]]:3: error: missing value for field `b` in struct initialization [StructInitMissingFieldInLiteral] // CHECK:STDERR: {.a = (), .c = ()} as Class; // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~ // CHECK:STDERR: {.a = (), .c = ()} as Class; - // CHECK:STDERR: fail_init.carbon:[[@LINE+4]]:3: error: cannot initialize class with 2 fields from struct with 3 fields [StructInitElementCountMismatch] + // CHECK:STDERR: fail_bad_init.carbon:[[@LINE+4]]:3: error: cannot initialize class with 2 fields from struct with 3 fields [StructInitElementCountMismatch] // CHECK:STDERR: {.a = (), .b = (), .c = ()} as Class; // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~ // CHECK:STDERR: diff --git a/toolchain/check/testdata/class/min_prelude/self.carbon b/toolchain/check/testdata/class/min_prelude/self.carbon index e5ddd4ab1301b..d62c9a39f84cc 100644 --- a/toolchain/check/testdata/class/min_prelude/self.carbon +++ b/toolchain/check/testdata/class/min_prelude/self.carbon @@ -47,15 +47,11 @@ class Class { fn F[self: Self]() -> self; } -// --- fail_self.carbon -// CHECK:STDERR: fail_self.carbon:[[@LINE+4]]:1: error: library's API previously provided by `self.carbon` [DuplicateLibraryApi] -// CHECK:STDERR: library "self"; -// CHECK:STDERR: ^~~~~~~~~~~~~~~ -// CHECK:STDERR: +// --- fail_bad_self.carbon library "[[@TEST_NAME]]"; class Class { - // CHECK:STDERR: fail_self.carbon:[[@LINE+4]]:8: error: `self` can only be declared in an implicit parameter list [SelfOutsideImplicitParamList] + // CHECK:STDERR: fail_bad_self.carbon:[[@LINE+4]]:8: error: `self` can only be declared in an implicit parameter list [SelfOutsideImplicitParamList] // CHECK:STDERR: fn F(self: Self); // CHECK:STDERR: ^~~~~~~~~~ // CHECK:STDERR: @@ -64,7 +60,7 @@ class Class { fn G() -> Self; } -// CHECK:STDERR: fail_self.carbon:[[@LINE+4]]:12: error: `self` can only be declared in an implicit parameter list [SelfOutsideImplicitParamList] +// CHECK:STDERR: fail_bad_self.carbon:[[@LINE+4]]:12: error: `self` can only be declared in an implicit parameter list [SelfOutsideImplicitParamList] // CHECK:STDERR: fn Class.F(self: Self) { // CHECK:STDERR: ^~~~~~~~~~ // CHECK:STDERR: @@ -72,12 +68,12 @@ fn Class.F(self: Self) { } fn Class.G() -> Self { - // CHECK:STDERR: fail_self.carbon:[[@LINE+4]]:7: error: `self` can only be declared in an implicit parameter list [SelfOutsideImplicitParamList] + // CHECK:STDERR: fail_bad_self.carbon:[[@LINE+4]]:7: error: `self` can only be declared in an implicit parameter list [SelfOutsideImplicitParamList] // CHECK:STDERR: var self: Self; // CHECK:STDERR: ^~~~~~~~~~ // CHECK:STDERR: var self: Self; - // CHECK:STDERR: fail_self.carbon:[[@LINE+4]]:10: error: cannot copy value of type `Class` [CopyOfUncopyableType] + // CHECK:STDERR: fail_bad_self.carbon:[[@LINE+4]]:10: error: cannot copy value of type `Class` [CopyOfUncopyableType] // CHECK:STDERR: return self; // CHECK:STDERR: ^~~~ // CHECK:STDERR: diff --git a/toolchain/check/testdata/class/no_prelude/member_functions.carbon b/toolchain/check/testdata/class/no_prelude/member_functions.carbon index 1efbfce00e5c5..9f73a76dcd790 100644 --- a/toolchain/check/testdata/class/no_prelude/member_functions.carbon +++ b/toolchain/check/testdata/class/no_prelude/member_functions.carbon @@ -10,7 +10,7 @@ // TIP: To dump output, run: // TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/class/no_prelude/member_functions.carbon -// --- method.carbon +// --- basics.carbon library "[[@TEST_NAME]]"; class Class { @@ -143,11 +143,7 @@ fn D.F() {} // CHECK:STDERR: fn D.C.F() {} -// --- fail_method.carbon -// CHECK:STDERR: fail_method.carbon:[[@LINE+4]]:1: error: library's API previously provided by `method.carbon` [DuplicateLibraryApi] -// CHECK:STDERR: library "method"; -// CHECK:STDERR: ^~~~~~~~~~~~~~~~~ -// CHECK:STDERR: +// --- fail_method_binding.carbon library "[[@TEST_NAME]]"; class Class { @@ -162,27 +158,27 @@ fn F(c: Class) { c.WithSelf(); Class.NoSelf(); - // CHECK:STDERR: fail_method.carbon:[[@LINE+7]]:3: error: missing object argument in method call [MissingObjectInMethodCall] + // CHECK:STDERR: fail_method_binding.carbon:[[@LINE+7]]:3: error: missing object argument in method call [MissingObjectInMethodCall] // CHECK:STDERR: Class.WithSelf(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_method.carbon:[[@LINE-13]]:3: note: calling function declared here [InCallToFunction] + // CHECK:STDERR: fail_method_binding.carbon:[[@LINE-13]]:3: note: calling function declared here [InCallToFunction] // CHECK:STDERR: fn WithSelf[self: Class](); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~ // CHECK:STDERR: Class.WithSelf(); - // CHECK:STDERR: fail_method.carbon:[[@LINE+7]]:3: error: 1 argument passed to function expecting 0 arguments [CallArgCountMismatch] + // CHECK:STDERR: fail_method_binding.carbon:[[@LINE+7]]:3: error: 1 argument passed to function expecting 0 arguments [CallArgCountMismatch] // CHECK:STDERR: Class.WithSelf(c); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_method.carbon:[[@LINE-21]]:3: note: calling function declared here [InCallToEntity] + // CHECK:STDERR: fail_method_binding.carbon:[[@LINE-21]]:3: note: calling function declared here [InCallToEntity] // CHECK:STDERR: fn WithSelf[self: Class](); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~ // CHECK:STDERR: Class.WithSelf(c); - // CHECK:STDERR: fail_method.carbon:[[@LINE+7]]:3: error: missing object argument in method call [MissingObjectInMethodCall] + // CHECK:STDERR: fail_method_binding.carbon:[[@LINE+7]]:3: error: missing object argument in method call [MissingObjectInMethodCall] // CHECK:STDERR: A(); // CHECK:STDERR: ^~~ - // CHECK:STDERR: fail_method.carbon:[[@LINE-30]]:3: note: calling function declared here [InCallToFunction] + // CHECK:STDERR: fail_method_binding.carbon:[[@LINE-30]]:3: note: calling function declared here [InCallToFunction] // CHECK:STDERR: fn WithSelf[self: Class](); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~ // CHECK:STDERR: @@ -286,7 +282,7 @@ fn F(s: {.a: A}, b: B) { b.a.F(); } -// CHECK:STDOUT: --- method.carbon +// CHECK:STDOUT: --- basics.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { // CHECK:STDOUT: %Class: type = class_type @Class [concrete] From aaf6d4aaad499b927864f58bada5ebce273ee247 Mon Sep 17 00:00:00 2001 From: jonmeow Date: Wed, 28 May 2025 13:05:51 -0700 Subject: [PATCH 5/6] ranges --- .../testdata/class/generic/basics.carbon | 64 ++++++ .../generic/syntactic_merge_literal.carbon | 74 +++---- .../class/min_prelude/base_bad_type.carbon | 37 ++-- .../class/min_prelude/self_type.carbon | 190 +++++++++++++++- .../class/no_prelude/import_base.carbon | 43 ++++ .../class/no_prelude/import_indirect.carbon | 201 +++++++++++++++++ .../no_prelude/import_member_cycle.carbon | 30 +++ .../no_prelude/import_struct_cyle.carbon | 34 +++ .../no_prelude/indirect_import_member.carbon | 202 +++++++++++++++++ .../testdata/class/no_prelude/raw_self.carbon | 84 ++++++++ .../testdata/class/no_prelude/reorder.carbon | 170 +++++++++++++++ .../testdata/class/no_prelude/scope.carbon | 74 +++++++ .../class/no_prelude/syntactic_merge.carbon | 203 ++++++++++++++++++ 13 files changed, 1330 insertions(+), 76 deletions(-) diff --git a/toolchain/check/testdata/class/generic/basics.carbon b/toolchain/check/testdata/class/generic/basics.carbon index 5e1ccd3c5da6e..b088a1c19f203 100644 --- a/toolchain/check/testdata/class/generic/basics.carbon +++ b/toolchain/check/testdata/class/generic/basics.carbon @@ -72,11 +72,15 @@ fn F(c: Class(i32)) -> i32 { } fn G(T:! type, c: Class(T)) -> T { + //@dump-sem-ir-begin return c.x; + //@dump-sem-ir-end } fn H(U:! type, c: Class(U)) -> U { + //@dump-sem-ir-begin return c.x; + //@dump-sem-ir-end } // --- fail_derived_to_base.carbon @@ -440,10 +444,21 @@ var v: C(0); // CHECK:STDOUT: --- field.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { +// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] +// CHECK:STDOUT: %Class.fe1b2d.1: type = class_type @Class, @Class(%T) [symbolic] +// CHECK:STDOUT: %require_complete.4aeca8.1: = require_complete_type %T [symbolic] +// CHECK:STDOUT: %Class.elem.e262de.1: type = unbound_element_type %Class.fe1b2d.1, %T [symbolic] // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %Class.247: type = class_type @Class, @Class(%i32) [concrete] // CHECK:STDOUT: %Class.elem.2d8: type = unbound_element_type %Class.247, %i32 [concrete] +// CHECK:STDOUT: %pattern_type.3c18fb.1: type = pattern_type %Class.fe1b2d.1 [symbolic] +// CHECK:STDOUT: %pattern_type.7dcd0a.1: type = pattern_type %T [symbolic] +// CHECK:STDOUT: %U: type = bind_symbolic_name U, 0 [symbolic] +// CHECK:STDOUT: %Class.fe1b2d.2: type = class_type @Class, @Class(%U) [symbolic] +// CHECK:STDOUT: %pattern_type.3c18fb.2: type = pattern_type %Class.fe1b2d.2 [symbolic] +// CHECK:STDOUT: %pattern_type.7dcd0a.2: type = pattern_type %U [symbolic] +// CHECK:STDOUT: %Class.elem.e262de.2: type = unbound_element_type %Class.fe1b2d.2, %U [symbolic] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { @@ -458,3 +473,52 @@ var v: C(0); // CHECK:STDOUT: return %.loc10_11.2 // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: generic fn @G(%T.loc14_6.1: type) { +// CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: +// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class.loc14_26.2, %T.loc14_6.2 [symbolic = %Class.elem (constants.%Class.elem.e262de.1)] +// CHECK:STDOUT: %require_complete.loc16: = require_complete_type %T.loc14_6.2 [symbolic = %require_complete.loc16 (constants.%require_complete.4aeca8.1)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn(%c.param: @G.%Class.loc14_26.2 (%Class.fe1b2d.1)) -> @G.%T.loc14_6.2 (%T) { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %c.ref: @G.%Class.loc14_26.2 (%Class.fe1b2d.1) = name_ref c, %c +// CHECK:STDOUT: %x.ref: @G.%Class.elem (%Class.elem.e262de.1) = name_ref x, @Class.%.loc5 [concrete = @Class.%.loc5] +// CHECK:STDOUT: %.loc16_11.1: ref @G.%T.loc14_6.2 (%T) = class_element_access %c.ref, element0 +// CHECK:STDOUT: %.loc16_11.2: @G.%T.loc14_6.2 (%T) = bind_value %.loc16_11.1 +// CHECK:STDOUT: return %.loc16_11.2 +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @H(%U.loc20_6.1: type) { +// CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: +// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class.loc20_26.2, %U.loc20_6.2 [symbolic = %Class.elem (constants.%Class.elem.e262de.2)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn(%c.param: @H.%Class.loc20_26.2 (%Class.fe1b2d.2)) -> @H.%U.loc20_6.2 (%U) { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %c.ref: @H.%Class.loc20_26.2 (%Class.fe1b2d.2) = name_ref c, %c +// CHECK:STDOUT: %x.ref: @H.%Class.elem (%Class.elem.e262de.2) = name_ref x, @Class.%.loc5 [concrete = @Class.%.loc5] +// CHECK:STDOUT: %.loc22_11.1: ref @H.%U.loc20_6.2 (%U) = class_element_access %c.ref, element0 +// CHECK:STDOUT: %.loc22_11.2: @H.%U.loc20_6.2 (%U) = bind_value %.loc22_11.1 +// CHECK:STDOUT: return %.loc22_11.2 +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @G(constants.%T) { +// CHECK:STDOUT: %T.loc14_6.2 => constants.%T +// CHECK:STDOUT: %Class.loc14_26.2 => constants.%Class.fe1b2d.1 +// CHECK:STDOUT: %pattern_type.loc14_16 => constants.%pattern_type.3c18fb.1 +// CHECK:STDOUT: %pattern_type.loc14_29 => constants.%pattern_type.7dcd0a.1 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @H(constants.%U) { +// CHECK:STDOUT: %U.loc20_6.2 => constants.%U +// CHECK:STDOUT: %Class.loc20_26.2 => constants.%Class.fe1b2d.2 +// CHECK:STDOUT: %pattern_type.loc20_16 => constants.%pattern_type.3c18fb.2 +// CHECK:STDOUT: %pattern_type.loc20_29 => constants.%pattern_type.7dcd0a.2 +// CHECK:STDOUT: } +// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/generic/syntactic_merge_literal.carbon b/toolchain/check/testdata/class/generic/syntactic_merge_literal.carbon index ee4729d756f79..2861aab97d2bc 100644 --- a/toolchain/check/testdata/class/generic/syntactic_merge_literal.carbon +++ b/toolchain/check/testdata/class/generic/syntactic_merge_literal.carbon @@ -12,9 +12,11 @@ library "[[@TEST_NAME]]"; +//@dump-sem-ir-begin class C(a:! i32) {} class D(b:! C(1_000)); class D(b:! C(1_000)) {} +//@dump-sem-ir-end // --- fail_int_mismatch.carbon @@ -35,8 +37,6 @@ class D(b:! C(1_000)) {} // CHECK:STDOUT: // CHECK:STDOUT: constants { // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] -// CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %a: %i32 = bind_symbolic_name a, 0 [symbolic] // CHECK:STDOUT: %pattern_type.7ce: type = pattern_type %i32 [concrete] @@ -46,8 +46,6 @@ class D(b:! C(1_000)) {} // CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] // CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] // CHECK:STDOUT: %int_1000.ff9: Core.IntLiteral = int_value 1000 [concrete] -// CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] -// CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] // CHECK:STDOUT: %ImplicitAs.type.205: type = facet_type <@ImplicitAs, @ImplicitAs(%i32)> [concrete] // CHECK:STDOUT: %Convert.type.1b6: type = fn_type @Convert.1, @ImplicitAs(%i32) [concrete] // CHECK:STDOUT: %To.c80: Core.IntLiteral = bind_symbolic_name To, 0 [symbolic] @@ -71,50 +69,19 @@ class D(b:! C(1_000)) {} // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .Int = %Core.Int -// CHECK:STDOUT: .ImplicitAs = %Core.ImplicitAs -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: import Core//prelude/... -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.Int: %Int.type = import_ref Core//prelude/types/int, Int, loaded [concrete = constants.%Int.generic] -// CHECK:STDOUT: %Core.ImplicitAs: %ImplicitAs.type.cc7 = import_ref Core//prelude/operators/as, ImplicitAs, loaded [concrete = constants.%ImplicitAs.generic] // CHECK:STDOUT: %Core.import_ref.a5b: @impl.4f9.%Convert.type (%Convert.type.0f9) = import_ref Core//prelude/types/int, loc19_39, loaded [symbolic = @impl.4f9.%Convert (constants.%Convert.f06)] // CHECK:STDOUT: %ImplicitAs.impl_witness_table.a2f = impl_witness_table (%Core.import_ref.a5b), @impl.4f9 [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: .D = %D.decl.loc5 -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core // CHECK:STDOUT: %C.decl: %C.type = class_decl @C [concrete = constants.%C.generic] { // CHECK:STDOUT: %a.patt: %pattern_type.7ce = symbolic_binding_pattern a, 0 [concrete] // CHECK:STDOUT: } { -// CHECK:STDOUT: %.loc4: type = splice_block %i32 [concrete = constants.%i32] { +// CHECK:STDOUT: %.loc5: type = splice_block %i32 [concrete = constants.%i32] { // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete = constants.%int_32] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(constants.%int_32) [concrete = constants.%i32] // CHECK:STDOUT: } -// CHECK:STDOUT: %a.loc4_9.1: %i32 = bind_symbolic_name a, 0 [symbolic = %a.loc4_9.2 (constants.%a)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %D.decl.loc5: %D.type = class_decl @D [concrete = constants.%D.generic] { -// CHECK:STDOUT: %b.patt: %pattern_type.dfb = symbolic_binding_pattern b, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %.loc5_20.1: type = splice_block %C.loc5 [concrete = constants.%C.262] { -// CHECK:STDOUT: %C.ref.loc5: %C.type = name_ref C, file.%C.decl [concrete = constants.%C.generic] -// CHECK:STDOUT: %int_1000.loc5: Core.IntLiteral = int_value 1000 [concrete = constants.%int_1000.ff9] -// CHECK:STDOUT: %impl.elem0.loc5: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] -// CHECK:STDOUT: %bound_method.loc5_20.1: = bound_method %int_1000.loc5, %impl.elem0.loc5 [concrete = constants.%Convert.bound] -// CHECK:STDOUT: %specific_fn.loc5: = specific_function %impl.elem0.loc5, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc5_20.2: = bound_method %int_1000.loc5, %specific_fn.loc5 [concrete = constants.%bound_method] -// CHECK:STDOUT: %int.convert_checked.loc5: init %i32 = call %bound_method.loc5_20.2(%int_1000.loc5) [concrete = constants.%int_1000.1b6] -// CHECK:STDOUT: %.loc5_20.2: %i32 = value_of_initializer %int.convert_checked.loc5 [concrete = constants.%int_1000.1b6] -// CHECK:STDOUT: %.loc5_20.3: %i32 = converted %int_1000.loc5, %.loc5_20.2 [concrete = constants.%int_1000.1b6] -// CHECK:STDOUT: %C.loc5: type = class_type @C, @C(constants.%int_1000.1b6) [concrete = constants.%C.262] -// CHECK:STDOUT: } -// CHECK:STDOUT: %b.loc5_9.1: %C.262 = bind_symbolic_name b, 0 [symbolic = %b.loc5_9.2 (constants.%b)] +// CHECK:STDOUT: %a.loc5_9.1: %i32 = bind_symbolic_name a, 0 [symbolic = %a.loc5_9.2 (constants.%a)] // CHECK:STDOUT: } // CHECK:STDOUT: %D.decl.loc6: %D.type = class_decl @D [concrete = constants.%D.generic] { // CHECK:STDOUT: %b.patt: %pattern_type.dfb = symbolic_binding_pattern b, 0 [concrete] @@ -131,12 +98,29 @@ class D(b:! C(1_000)) {} // CHECK:STDOUT: %.loc6_20.3: %i32 = converted %int_1000.loc6, %.loc6_20.2 [concrete = constants.%int_1000.1b6] // CHECK:STDOUT: %C.loc6: type = class_type @C, @C(constants.%int_1000.1b6) [concrete = constants.%C.262] // CHECK:STDOUT: } -// CHECK:STDOUT: %b.loc6: %C.262 = bind_symbolic_name b, 0 [symbolic = %b.loc5_9.2 (constants.%b)] +// CHECK:STDOUT: %b.loc6_9.1: %C.262 = bind_symbolic_name b, 0 [symbolic = %b.loc6_9.2 (constants.%b)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %D.decl.loc7: %D.type = class_decl @D [concrete = constants.%D.generic] { +// CHECK:STDOUT: %b.patt: %pattern_type.dfb = symbolic_binding_pattern b, 0 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc7_20.1: type = splice_block %C.loc7 [concrete = constants.%C.262] { +// CHECK:STDOUT: %C.ref.loc7: %C.type = name_ref C, file.%C.decl [concrete = constants.%C.generic] +// CHECK:STDOUT: %int_1000.loc7: Core.IntLiteral = int_value 1000 [concrete = constants.%int_1000.ff9] +// CHECK:STDOUT: %impl.elem0.loc7: %.9c3 = impl_witness_access constants.%ImplicitAs.impl_witness.c75, element0 [concrete = constants.%Convert.956] +// CHECK:STDOUT: %bound_method.loc7_20.1: = bound_method %int_1000.loc7, %impl.elem0.loc7 [concrete = constants.%Convert.bound] +// CHECK:STDOUT: %specific_fn.loc7: = specific_function %impl.elem0.loc7, @Convert.2(constants.%int_32) [concrete = constants.%Convert.specific_fn] +// CHECK:STDOUT: %bound_method.loc7_20.2: = bound_method %int_1000.loc7, %specific_fn.loc7 [concrete = constants.%bound_method] +// CHECK:STDOUT: %int.convert_checked.loc7: init %i32 = call %bound_method.loc7_20.2(%int_1000.loc7) [concrete = constants.%int_1000.1b6] +// CHECK:STDOUT: %.loc7_20.2: %i32 = value_of_initializer %int.convert_checked.loc7 [concrete = constants.%int_1000.1b6] +// CHECK:STDOUT: %.loc7_20.3: %i32 = converted %int_1000.loc7, %.loc7_20.2 [concrete = constants.%int_1000.1b6] +// CHECK:STDOUT: %C.loc7: type = class_type @C, @C(constants.%int_1000.1b6) [concrete = constants.%C.262] +// CHECK:STDOUT: } +// CHECK:STDOUT: %b.loc7: %C.262 = bind_symbolic_name b, 0 [symbolic = %b.loc6_9.2 (constants.%b)] // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic class @C(%a.loc4_9.1: %i32) { -// CHECK:STDOUT: %a.loc4_9.2: %i32 = bind_symbolic_name a, 0 [symbolic = %a.loc4_9.2 (constants.%a)] +// CHECK:STDOUT: generic class @C(%a.loc5_9.1: %i32) { +// CHECK:STDOUT: %a.loc5_9.2: %i32 = bind_symbolic_name a, 0 [symbolic = %a.loc5_9.2 (constants.%a)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: @@ -150,8 +134,8 @@ class D(b:! C(1_000)) {} // CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: generic class @D(%b.loc5_9.1: %C.262) { -// CHECK:STDOUT: %b.loc5_9.2: %C.262 = bind_symbolic_name b, 0 [symbolic = %b.loc5_9.2 (constants.%b)] +// CHECK:STDOUT: generic class @D(%b.loc6_9.1: %C.262) { +// CHECK:STDOUT: %b.loc6_9.2: %C.262 = bind_symbolic_name b, 0 [symbolic = %b.loc6_9.2 (constants.%b)] // CHECK:STDOUT: // CHECK:STDOUT: !definition: // CHECK:STDOUT: @@ -166,15 +150,15 @@ class D(b:! C(1_000)) {} // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @C(constants.%a) { -// CHECK:STDOUT: %a.loc4_9.2 => constants.%a +// CHECK:STDOUT: %a.loc5_9.2 => constants.%a // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @C(constants.%int_1000.1b6) { -// CHECK:STDOUT: %a.loc4_9.2 => constants.%int_1000.1b6 +// CHECK:STDOUT: %a.loc5_9.2 => constants.%int_1000.1b6 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @D(constants.%b) { -// CHECK:STDOUT: %b.loc5_9.2 => constants.%b +// CHECK:STDOUT: %b.loc6_9.2 => constants.%b // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_int_mismatch.carbon diff --git a/toolchain/check/testdata/class/min_prelude/base_bad_type.carbon b/toolchain/check/testdata/class/min_prelude/base_bad_type.carbon index 4c0d6332b1fc4..a17c9b12849e3 100644 --- a/toolchain/check/testdata/class/min_prelude/base_bad_type.carbon +++ b/toolchain/check/testdata/class/min_prelude/base_bad_type.carbon @@ -43,35 +43,32 @@ class DeriveFromNonType { fn AccessMemberWithInvalidBasNonType(p: DeriveFromNonType*) -> {} { return (*p).n; } -// --- fail_derive_from_{}.carbon +// --- fail_derive_from_builtin.carbon library "[[@TEST_NAME]]"; -// CHECK:STDERR: fail_derive_from_{}.carbon:[[@LINE+8]]:20: error: unrecognized declaration introducer [UnrecognizedDecl] -// CHECK:STDERR: class DeriveFrom{} { -// CHECK:STDERR: ^ -// CHECK:STDERR: -// CHECK:STDERR: fail_derive_from_{}.carbon:[[@LINE+4]]:20: error: semantics TODO: `handle invalid parse trees in `check`` [SemanticsTodo] -// CHECK:STDERR: class DeriveFrom{} { -// CHECK:STDERR: ^ -// CHECK:STDERR: -class DeriveFrom{} { - extend base: {}; +fn Bool() -> type = "bool.make_type"; + +class DeriveFromBuiltin { + // CHECK:STDERR: fail_derive_from_builtin.carbon:[[@LINE+4]]:16: error: deriving from final type `bool`; base type must be an `abstract` or `base` class [BaseIsFinal] + // CHECK:STDERR: extend base: Bool(); + // CHECK:STDERR: ^~~~~~ + // CHECK:STDERR: + extend base: Bool(); } // It's not really important whether this conversion produces an error or not, // but it shouldn't crash. -// CHECK:STDERR: fail_derive_from_{}.carbon:[[@LINE+4]]:22: error: unrecognized declaration introducer [UnrecognizedDecl] -// CHECK:STDERR: fn ConvertToBadBase{}(p: DeriveFrom{}*) -> {}* { return p; } -// CHECK:STDERR: ^ +// CHECK:STDERR: fail_derive_from_builtin.carbon:[[@LINE+7]]:64: error: cannot implicitly convert expression of type `DeriveFromBuiltin*` to `bool*` [ConversionFailure] +// CHECK:STDERR: fn ConvertToBadBaseBuiltin(p: DeriveFromBuiltin*) -> Bool()* { return p; } +// CHECK:STDERR: ^~~~~~~~~ +// CHECK:STDERR: fail_derive_from_builtin.carbon:[[@LINE+4]]:64: note: type `DeriveFromBuiltin*` does not implement interface `Core.ImplicitAs(bool*)` [MissingImplInMemberAccessNote] +// CHECK:STDERR: fn ConvertToBadBaseBuiltin(p: DeriveFromBuiltin*) -> Bool()* { return p; } +// CHECK:STDERR: ^~~~~~~~~ // CHECK:STDERR: -fn ConvertToBadBase{}(p: DeriveFrom{}*) -> {}* { return p; } +fn ConvertToBadBaseBuiltin(p: DeriveFromBuiltin*) -> Bool()* { return p; } -// CHECK:STDERR: fail_derive_from_{}.carbon:[[@LINE+4]]:33: error: unrecognized declaration introducer [UnrecognizedDecl] -// CHECK:STDERR: fn AccessMemberWithInvalidBase{}(p: DeriveFrom{}*) -> {} { return (*p).n; } -// CHECK:STDERR: ^ -// CHECK:STDERR: -fn AccessMemberWithInvalidBase{}(p: DeriveFrom{}*) -> {} { return (*p).n; } +fn AccessMemberWithInvalidBaseBuiltin(p: DeriveFromBuiltin*) -> Bool() { return (*p).n; } // --- fail_derive_from_tuple.carbon diff --git a/toolchain/check/testdata/class/min_prelude/self_type.carbon b/toolchain/check/testdata/class/min_prelude/self_type.carbon index 5426bc9be23c0..275a7b9b33c45 100644 --- a/toolchain/check/testdata/class/min_prelude/self_type.carbon +++ b/toolchain/check/testdata/class/min_prelude/self_type.carbon @@ -16,7 +16,10 @@ library "[[@TEST_NAME]]"; class Class { + //@dump-sem-ir-begin fn F[self: Self]() -> (); + //@dump-sem-ir-end + fn Make() -> Self { returned var s: Self; s = {.p = &s}; @@ -25,9 +28,11 @@ class Class { var p: Self*; } +//@dump-sem-ir-begin fn Class.F[self: Self]() -> () { return (*self.p).F(); } +//@dump-sem-ir-end // --- self_conversion.carbon @@ -37,19 +42,25 @@ base class Base { var a: (); } +//@dump-sem-ir-begin class Derived { extend base: Base; fn SelfBase[self: Base]() -> (); fn AddrSelfBase[addr self: Base*](); } +//@dump-sem-ir-end fn Derived.SelfBase[self: Base]() -> () { + //@dump-sem-ir-begin return self.a; + //@dump-sem-ir-end } fn Derived.AddrSelfBase[addr self: Base*]() { + //@dump-sem-ir-begin (*self).a = (); + //@dump-sem-ir-end } fn Call(p: Derived*) -> () { @@ -59,20 +70,14 @@ fn Call(p: Derived*) -> () { // --- fail_self_type_member.carbon +class C {} + class Class { - // CHECK:STDERR: fail_self_type_member.carbon:[[@LINE+4]]:10: error: name `Core.Bool` implicitly referenced here, but not found [CoreNameNotFound] - // CHECK:STDERR: var b: bool; - // CHECK:STDERR: ^~~~ - // CHECK:STDERR: - var b: bool; + var b: C; } -// CHECK:STDERR: fail_self_type_member.carbon:[[@LINE+4]]:11: error: name `Core.Bool` implicitly referenced here, but not found [CoreNameNotFound] -// CHECK:STDERR: fn F() -> bool { -// CHECK:STDERR: ^~~~ -// CHECK:STDERR: -fn F() -> bool { - var c1: Class = {.b = true}; +fn F() -> {} { + var c1: Class = {.b = {}}; // CHECK:STDERR: fail_self_type_member.carbon:[[@LINE+8]]:17: error: expected identifier after `.` [ExpectedIdentifierAfterPeriodOrArrow] // CHECK:STDERR: var c2: Class.Self = c1; // CHECK:STDERR: ^~~~ @@ -84,3 +89,166 @@ fn F() -> bool { var c2: Class.Self = c1; return c2.b; } + +// CHECK:STDOUT: --- self_type.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %Class: type = class_type @Class [concrete] +// CHECK:STDOUT: %pattern_type.761: type = pattern_type %Class [concrete] +// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] +// CHECK:STDOUT: %pattern_type.cb1: type = pattern_type %empty_tuple.type [concrete] +// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] +// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] +// CHECK:STDOUT: %ptr.e71: type = ptr_type %Class [concrete] +// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %ptr.e71 [concrete] +// CHECK:STDOUT: %empty_tuple: %empty_tuple.type = tuple_value () [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: file { +// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { +// CHECK:STDOUT: %self.patt: %pattern_type.761 = binding_pattern self [concrete] +// CHECK:STDOUT: %self.param_patt: %pattern_type.761 = value_param_pattern %self.patt, call_param0 [concrete] +// CHECK:STDOUT: %return.patt: %pattern_type.cb1 = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: %pattern_type.cb1 = out_param_pattern %return.patt, call_param1 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc18_30.1: %empty_tuple.type = tuple_literal () +// CHECK:STDOUT: %.loc18_30.2: type = converted %.loc18_30.1, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] +// CHECK:STDOUT: %self.param.loc18: %Class = value_param call_param0 +// CHECK:STDOUT: %Self.ref.loc18: type = name_ref Self, constants.%Class [concrete = constants.%Class] +// CHECK:STDOUT: %self.loc18: %Class = bind_name self, %self.param.loc18 +// CHECK:STDOUT: %return.param.loc18: ref %empty_tuple.type = out_param call_param1 +// CHECK:STDOUT: %return.loc18: ref %empty_tuple.type = return_slot %return.param.loc18 +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: class @Class { +// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { +// CHECK:STDOUT: %self.patt: %pattern_type.761 = binding_pattern self [concrete] +// CHECK:STDOUT: %self.param_patt: %pattern_type.761 = value_param_pattern %self.patt, call_param0 [concrete] +// CHECK:STDOUT: %return.patt: %pattern_type.cb1 = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: %pattern_type.cb1 = out_param_pattern %return.patt, call_param1 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc6_26.1: %empty_tuple.type = tuple_literal () +// CHECK:STDOUT: %.loc6_26.2: type = converted %.loc6_26.1, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] +// CHECK:STDOUT: %self.param.loc6: %Class = value_param call_param0 +// CHECK:STDOUT: %Self.ref.loc6: type = name_ref Self, constants.%Class [concrete = constants.%Class] +// CHECK:STDOUT: %self.loc6: %Class = bind_name self, %self.param.loc6 +// CHECK:STDOUT: %return.param.loc6: ref %empty_tuple.type = out_param call_param1 +// CHECK:STDOUT: %return.loc6: ref %empty_tuple.type = return_slot %return.param.loc6 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: complete_type_witness = %complete_type +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = constants.%Class +// CHECK:STDOUT: .F = %F.decl +// CHECK:STDOUT: .Make = %Make.decl +// CHECK:STDOUT: .p = %.loc14 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @F(%self.param.loc18: %Class) -> %empty_tuple.type { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %self.ref: %Class = name_ref self, %self.loc18 +// CHECK:STDOUT: %p.ref: %Class.elem = name_ref p, @Class.%.loc14 [concrete = @Class.%.loc14] +// CHECK:STDOUT: %.loc19_16.1: ref %ptr.e71 = class_element_access %self.ref, element0 +// CHECK:STDOUT: %.loc19_16.2: %ptr.e71 = bind_value %.loc19_16.1 +// CHECK:STDOUT: %.loc19_11.1: ref %Class = deref %.loc19_16.2 +// CHECK:STDOUT: %F.ref: %F.type = name_ref F, @Class.%F.decl [concrete = constants.%F] +// CHECK:STDOUT: %F.bound: = bound_method %.loc19_11.1, %F.ref +// CHECK:STDOUT: %.loc19_11.2: %Class = bind_value %.loc19_11.1 +// CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.bound(%.loc19_11.2) +// CHECK:STDOUT: %.loc19_22.1: ref %empty_tuple.type = temporary_storage +// CHECK:STDOUT: %.loc19_22.2: ref %empty_tuple.type = temporary %.loc19_22.1, %F.call +// CHECK:STDOUT: %tuple: %empty_tuple.type = tuple_value () [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc19_23: %empty_tuple.type = converted %F.call, %tuple [concrete = constants.%empty_tuple] +// CHECK:STDOUT: return %.loc19_23 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: --- self_conversion.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %Base: type = class_type @Base [concrete] +// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] +// CHECK:STDOUT: %Base.elem: type = unbound_element_type %Base, %empty_tuple.type [concrete] +// CHECK:STDOUT: %Derived: type = class_type @Derived [concrete] +// CHECK:STDOUT: %Derived.elem: type = unbound_element_type %Derived, %Base [concrete] +// CHECK:STDOUT: %SelfBase.type: type = fn_type @SelfBase [concrete] +// CHECK:STDOUT: %SelfBase: %SelfBase.type = struct_value () [concrete] +// CHECK:STDOUT: %ptr.11f: type = ptr_type %Base [concrete] +// CHECK:STDOUT: %AddrSelfBase.type: type = fn_type @AddrSelfBase [concrete] +// CHECK:STDOUT: %AddrSelfBase: %AddrSelfBase.type = struct_value () [concrete] +// CHECK:STDOUT: %struct_type.base.b1e: type = struct_type {.base: %Base} [concrete] +// CHECK:STDOUT: %complete_type.15c: = complete_type_witness %struct_type.base.b1e [concrete] +// CHECK:STDOUT: %empty_tuple: %empty_tuple.type = tuple_value () [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: file { +// CHECK:STDOUT: %Derived.decl: type = class_decl @Derived [concrete = constants.%Derived] {} {} +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: class @Derived { +// CHECK:STDOUT: %Base.ref: type = name_ref Base, file.%Base.decl [concrete = constants.%Base] +// CHECK:STDOUT: %.loc10: %Derived.elem = base_decl %Base.ref, element0 [concrete] +// CHECK:STDOUT: %SelfBase.decl: %SelfBase.type = fn_decl @SelfBase [concrete = constants.%SelfBase] { +// CHECK:STDOUT: +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc12_33.1: %empty_tuple.type = tuple_literal () +// CHECK:STDOUT: %.loc12_33.2: type = converted %.loc12_33.1, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] +// CHECK:STDOUT: %self.param.loc12: %Base = value_param call_param0 +// CHECK:STDOUT: %Base.ref.loc12: type = name_ref Base, file.%Base.decl [concrete = constants.%Base] +// CHECK:STDOUT: %self.loc12: %Base = bind_name self, %self.param.loc12 +// CHECK:STDOUT: %return.param.loc12: ref %empty_tuple.type = out_param call_param1 +// CHECK:STDOUT: %return.loc12: ref %empty_tuple.type = return_slot %return.param.loc12 +// CHECK:STDOUT: } +// CHECK:STDOUT: %AddrSelfBase.decl: %AddrSelfBase.type = fn_decl @AddrSelfBase [concrete = constants.%AddrSelfBase] { +// CHECK:STDOUT: +// CHECK:STDOUT: } { +// CHECK:STDOUT: %self.param.loc13: %ptr.11f = value_param call_param0 +// CHECK:STDOUT: %.loc13: type = splice_block %ptr.loc13 [concrete = constants.%ptr.11f] { +// CHECK:STDOUT: %Base.ref.loc13: type = name_ref Base, file.%Base.decl [concrete = constants.%Base] +// CHECK:STDOUT: %ptr.loc13: type = ptr_type %Base.ref.loc13 [concrete = constants.%ptr.11f] +// CHECK:STDOUT: } +// CHECK:STDOUT: %self.loc13: %ptr.11f = bind_name self, %self.param.loc13 +// CHECK:STDOUT: } +// CHECK:STDOUT: %struct_type.base: type = struct_type {.base: %Base} [concrete = constants.%struct_type.base.b1e] +// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.base [concrete = constants.%complete_type.15c] +// CHECK:STDOUT: complete_type_witness = %complete_type +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = constants.%Derived +// CHECK:STDOUT: .Base = +// CHECK:STDOUT: .base = %.loc10 +// CHECK:STDOUT: .SelfBase = %SelfBase.decl +// CHECK:STDOUT: .AddrSelfBase = %AddrSelfBase.decl +// CHECK:STDOUT: extend %Base.ref +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @SelfBase(%self.param.loc17: %Base) -> %empty_tuple.type { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %self.ref: %Base = name_ref self, %self.loc17 +// CHECK:STDOUT: %a.ref: %Base.elem = name_ref a, @Base.%.loc5_8 [concrete = @Base.%.loc5_8] +// CHECK:STDOUT: %.loc19_14.1: ref %empty_tuple.type = class_element_access %self.ref, element0 +// CHECK:STDOUT: %tuple: %empty_tuple.type = tuple_value () [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc19_14.2: %empty_tuple.type = converted %.loc19_14.1, %tuple [concrete = constants.%empty_tuple] +// CHECK:STDOUT: return %.loc19_14.2 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @AddrSelfBase(%self.param.loc23: %ptr.11f) { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %self.ref: %ptr.11f = name_ref self, %self.loc23 +// CHECK:STDOUT: %.loc25_4: ref %Base = deref %self.ref +// CHECK:STDOUT: %a.ref: %Base.elem = name_ref a, @Base.%.loc5_8 [concrete = @Base.%.loc5_8] +// CHECK:STDOUT: %.loc25_10: ref %empty_tuple.type = class_element_access %.loc25_4, element0 +// CHECK:STDOUT: %.loc25_16.1: %empty_tuple.type = tuple_literal () +// CHECK:STDOUT: %.loc25_16.2: init %empty_tuple.type = tuple_init () to %.loc25_10 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc25_13: init %empty_tuple.type = converted %.loc25_16.1, %.loc25_16.2 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: assign %.loc25_10, %.loc25_13 +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/no_prelude/import_base.carbon b/toolchain/check/testdata/class/no_prelude/import_base.carbon index 69752587ace77..6b1dc7f02c082 100644 --- a/toolchain/check/testdata/class/no_prelude/import_base.carbon +++ b/toolchain/check/testdata/class/no_prelude/import_base.carbon @@ -34,6 +34,49 @@ import library "a"; fn Run() { var a: Child = {.base = {.x = (), .unused = ()}}; + //@dump-sem-ir-begin a.x = (); a.F(); + //@dump-sem-ir-end } + +// CHECK:STDOUT: --- b.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] +// CHECK:STDOUT: %Child: type = class_type @Child [concrete] +// CHECK:STDOUT: %Base: type = class_type @Base [concrete] +// CHECK:STDOUT: %empty_tuple: %empty_tuple.type = tuple_value () [concrete] +// CHECK:STDOUT: %Base.elem: type = unbound_element_type %Base, %empty_tuple.type [concrete] +// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] +// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: %Main.import_ref.e8f: %F.type = import_ref Main//a, loc5_21, loaded [concrete = constants.%F] +// CHECK:STDOUT: %Main.import_ref.f99: %Base.elem = import_ref Main//a, loc8_8, loaded [concrete = %.6dd] +// CHECK:STDOUT: %.6dd: %Base.elem = field_decl x, element0 [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @Run() { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: +// CHECK:STDOUT: %a.ref.loc9: ref %Child = name_ref a, %a +// CHECK:STDOUT: %x.ref: %Base.elem = name_ref x, imports.%Main.import_ref.f99 [concrete = imports.%.6dd] +// CHECK:STDOUT: %.loc9_4.1: ref %Base = class_element_access %a.ref.loc9, element0 +// CHECK:STDOUT: %.loc9_4.2: ref %Base = converted %a.ref.loc9, %.loc9_4.1 +// CHECK:STDOUT: %.loc9_4.3: ref %empty_tuple.type = class_element_access %.loc9_4.2, element0 +// CHECK:STDOUT: %.loc9_10.1: %empty_tuple.type = tuple_literal () +// CHECK:STDOUT: %.loc9_10.2: init %empty_tuple.type = tuple_init () to %.loc9_4.3 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc9_7: init %empty_tuple.type = converted %.loc9_10.1, %.loc9_10.2 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: assign %.loc9_4.3, %.loc9_7 +// CHECK:STDOUT: %a.ref.loc10: ref %Child = name_ref a, %a +// CHECK:STDOUT: %F.ref: %F.type = name_ref F, imports.%Main.import_ref.e8f [concrete = constants.%F] +// CHECK:STDOUT: %F.bound: = bound_method %a.ref.loc10, %F.ref +// CHECK:STDOUT: %.loc10_3.1: ref %Base = class_element_access %a.ref.loc10, element0 +// CHECK:STDOUT: %.loc10_3.2: ref %Base = converted %a.ref.loc10, %.loc10_3.1 +// CHECK:STDOUT: %.loc10_3.3: %Base = bind_value %.loc10_3.2 +// CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.bound(%.loc10_3.3) +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/no_prelude/import_indirect.carbon b/toolchain/check/testdata/class/no_prelude/import_indirect.carbon index 59144bfde7333..3551823a7eca3 100644 --- a/toolchain/check/testdata/class/no_prelude/import_indirect.carbon +++ b/toolchain/check/testdata/class/no_prelude/import_indirect.carbon @@ -69,8 +69,10 @@ library "[[@TEST_NAME]]"; import library "a"; import library "b"; +//@dump-sem-ir-begin var val: C = {}; var ptr: D* = &val; +//@dump-sem-ir-end // --- triangle_reverse.carbon @@ -79,8 +81,10 @@ library "[[@TEST_NAME]]"; import library "b"; import library "a"; +//@dump-sem-ir-begin var val: C = {}; var ptr: D* = &val; +//@dump-sem-ir-end // --- diamond.carbon @@ -89,8 +93,10 @@ library "[[@TEST_NAME]]"; import library "b"; import library "c"; +//@dump-sem-ir-begin var val: D = {}; var ptr: E* = &val; +//@dump-sem-ir-end // --- diamond_reverse.carbon @@ -99,5 +105,200 @@ library "[[@TEST_NAME]]"; import library "c"; import library "b"; +//@dump-sem-ir-begin var val: D = {}; var ptr: E* = &val; +//@dump-sem-ir-end + +// CHECK:STDOUT: --- triangle.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %C: type = class_type @C [concrete] +// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] +// CHECK:STDOUT: %pattern_type.c48: type = pattern_type %C [concrete] +// CHECK:STDOUT: %C.val: %C = struct_value () [concrete] +// CHECK:STDOUT: %ptr.019: type = ptr_type %C [concrete] +// CHECK:STDOUT: %pattern_type.44a: type = pattern_type %ptr.019 [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: %Main.C: type = import_ref Main//a, C, loaded [concrete = constants.%C] +// CHECK:STDOUT: %Main.D: type = import_ref Main//b, D, loaded [concrete = constants.%C] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: file { +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %val.patt: %pattern_type.c48 = binding_pattern val [concrete] +// CHECK:STDOUT: %val.var_patt: %pattern_type.c48 = var_pattern %val.patt [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: %val.var: ref %C = var %val.var_patt [concrete] +// CHECK:STDOUT: %C.ref: type = name_ref C, imports.%Main.C [concrete = constants.%C] +// CHECK:STDOUT: %val: ref %C = bind_name val, %val.var +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %ptr.patt: %pattern_type.44a = binding_pattern ptr [concrete] +// CHECK:STDOUT: %ptr.var_patt: %pattern_type.44a = var_pattern %ptr.patt [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: %ptr.var: ref %ptr.019 = var %ptr.var_patt [concrete] +// CHECK:STDOUT: %.loc9: type = splice_block %ptr.loc9_11 [concrete = constants.%ptr.019] { +// CHECK:STDOUT: %D.ref: type = name_ref D, imports.%Main.D [concrete = constants.%C] +// CHECK:STDOUT: %ptr.loc9_11: type = ptr_type %D.ref [concrete = constants.%ptr.019] +// CHECK:STDOUT: } +// CHECK:STDOUT: %ptr.loc9_5: ref %ptr.019 = bind_name ptr, %ptr.var +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @__global_init() { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %.loc8_15.1: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc8_15.2: init %C = class_init (), file.%val.var [concrete = constants.%C.val] +// CHECK:STDOUT: %.loc8_1: init %C = converted %.loc8_15.1, %.loc8_15.2 [concrete = constants.%C.val] +// CHECK:STDOUT: assign file.%val.var, %.loc8_1 +// CHECK:STDOUT: %val.ref: ref %C = name_ref val, file.%val +// CHECK:STDOUT: %addr: %ptr.019 = addr_of %val.ref +// CHECK:STDOUT: assign file.%ptr.var, %addr +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: --- triangle_reverse.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %C: type = class_type @C [concrete] +// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] +// CHECK:STDOUT: %pattern_type.c48: type = pattern_type %C [concrete] +// CHECK:STDOUT: %C.val: %C = struct_value () [concrete] +// CHECK:STDOUT: %ptr.019: type = ptr_type %C [concrete] +// CHECK:STDOUT: %pattern_type.44a: type = pattern_type %ptr.019 [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: %Main.D: type = import_ref Main//b, D, loaded [concrete = constants.%C] +// CHECK:STDOUT: %Main.C: type = import_ref Main//a, C, loaded [concrete = constants.%C] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: file { +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %val.patt: %pattern_type.c48 = binding_pattern val [concrete] +// CHECK:STDOUT: %val.var_patt: %pattern_type.c48 = var_pattern %val.patt [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: %val.var: ref %C = var %val.var_patt [concrete] +// CHECK:STDOUT: %C.ref: type = name_ref C, imports.%Main.C [concrete = constants.%C] +// CHECK:STDOUT: %val: ref %C = bind_name val, %val.var +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %ptr.patt: %pattern_type.44a = binding_pattern ptr [concrete] +// CHECK:STDOUT: %ptr.var_patt: %pattern_type.44a = var_pattern %ptr.patt [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: %ptr.var: ref %ptr.019 = var %ptr.var_patt [concrete] +// CHECK:STDOUT: %.loc9: type = splice_block %ptr.loc9_11 [concrete = constants.%ptr.019] { +// CHECK:STDOUT: %D.ref: type = name_ref D, imports.%Main.D [concrete = constants.%C] +// CHECK:STDOUT: %ptr.loc9_11: type = ptr_type %D.ref [concrete = constants.%ptr.019] +// CHECK:STDOUT: } +// CHECK:STDOUT: %ptr.loc9_5: ref %ptr.019 = bind_name ptr, %ptr.var +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @__global_init() { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %.loc8_15.1: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc8_15.2: init %C = class_init (), file.%val.var [concrete = constants.%C.val] +// CHECK:STDOUT: %.loc8_1: init %C = converted %.loc8_15.1, %.loc8_15.2 [concrete = constants.%C.val] +// CHECK:STDOUT: assign file.%val.var, %.loc8_1 +// CHECK:STDOUT: %val.ref: ref %C = name_ref val, file.%val +// CHECK:STDOUT: %addr: %ptr.019 = addr_of %val.ref +// CHECK:STDOUT: assign file.%ptr.var, %addr +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: --- diamond.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %C: type = class_type @C [concrete] +// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] +// CHECK:STDOUT: %pattern_type.c48: type = pattern_type %C [concrete] +// CHECK:STDOUT: %C.val: %C = struct_value () [concrete] +// CHECK:STDOUT: %ptr.019: type = ptr_type %C [concrete] +// CHECK:STDOUT: %pattern_type.44a: type = pattern_type %ptr.019 [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: %Main.D: type = import_ref Main//b, D, loaded [concrete = constants.%C] +// CHECK:STDOUT: %Main.E: type = import_ref Main//c, E, loaded [concrete = constants.%C] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: file { +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %val.patt: %pattern_type.c48 = binding_pattern val [concrete] +// CHECK:STDOUT: %val.var_patt: %pattern_type.c48 = var_pattern %val.patt [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: %val.var: ref %C = var %val.var_patt [concrete] +// CHECK:STDOUT: %D.ref: type = name_ref D, imports.%Main.D [concrete = constants.%C] +// CHECK:STDOUT: %val: ref %C = bind_name val, %val.var +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %ptr.patt: %pattern_type.44a = binding_pattern ptr [concrete] +// CHECK:STDOUT: %ptr.var_patt: %pattern_type.44a = var_pattern %ptr.patt [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: %ptr.var: ref %ptr.019 = var %ptr.var_patt [concrete] +// CHECK:STDOUT: %.loc9: type = splice_block %ptr.loc9_11 [concrete = constants.%ptr.019] { +// CHECK:STDOUT: %E.ref: type = name_ref E, imports.%Main.E [concrete = constants.%C] +// CHECK:STDOUT: %ptr.loc9_11: type = ptr_type %E.ref [concrete = constants.%ptr.019] +// CHECK:STDOUT: } +// CHECK:STDOUT: %ptr.loc9_5: ref %ptr.019 = bind_name ptr, %ptr.var +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @__global_init() { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %.loc8_15.1: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc8_15.2: init %C = class_init (), file.%val.var [concrete = constants.%C.val] +// CHECK:STDOUT: %.loc8_1: init %C = converted %.loc8_15.1, %.loc8_15.2 [concrete = constants.%C.val] +// CHECK:STDOUT: assign file.%val.var, %.loc8_1 +// CHECK:STDOUT: %val.ref: ref %C = name_ref val, file.%val +// CHECK:STDOUT: %addr: %ptr.019 = addr_of %val.ref +// CHECK:STDOUT: assign file.%ptr.var, %addr +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: --- diamond_reverse.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %C: type = class_type @C [concrete] +// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] +// CHECK:STDOUT: %pattern_type.c48: type = pattern_type %C [concrete] +// CHECK:STDOUT: %C.val: %C = struct_value () [concrete] +// CHECK:STDOUT: %ptr.019: type = ptr_type %C [concrete] +// CHECK:STDOUT: %pattern_type.44a: type = pattern_type %ptr.019 [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: %Main.E: type = import_ref Main//c, E, loaded [concrete = constants.%C] +// CHECK:STDOUT: %Main.D: type = import_ref Main//b, D, loaded [concrete = constants.%C] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: file { +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %val.patt: %pattern_type.c48 = binding_pattern val [concrete] +// CHECK:STDOUT: %val.var_patt: %pattern_type.c48 = var_pattern %val.patt [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: %val.var: ref %C = var %val.var_patt [concrete] +// CHECK:STDOUT: %D.ref: type = name_ref D, imports.%Main.D [concrete = constants.%C] +// CHECK:STDOUT: %val: ref %C = bind_name val, %val.var +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %ptr.patt: %pattern_type.44a = binding_pattern ptr [concrete] +// CHECK:STDOUT: %ptr.var_patt: %pattern_type.44a = var_pattern %ptr.patt [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: %ptr.var: ref %ptr.019 = var %ptr.var_patt [concrete] +// CHECK:STDOUT: %.loc9: type = splice_block %ptr.loc9_11 [concrete = constants.%ptr.019] { +// CHECK:STDOUT: %E.ref: type = name_ref E, imports.%Main.E [concrete = constants.%C] +// CHECK:STDOUT: %ptr.loc9_11: type = ptr_type %E.ref [concrete = constants.%ptr.019] +// CHECK:STDOUT: } +// CHECK:STDOUT: %ptr.loc9_5: ref %ptr.019 = bind_name ptr, %ptr.var +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @__global_init() { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %.loc8_15.1: %empty_struct_type = struct_literal () +// CHECK:STDOUT: %.loc8_15.2: init %C = class_init (), file.%val.var [concrete = constants.%C.val] +// CHECK:STDOUT: %.loc8_1: init %C = converted %.loc8_15.1, %.loc8_15.2 [concrete = constants.%C.val] +// CHECK:STDOUT: assign file.%val.var, %.loc8_1 +// CHECK:STDOUT: %val.ref: ref %C = name_ref val, file.%val +// CHECK:STDOUT: %addr: %ptr.019 = addr_of %val.ref +// CHECK:STDOUT: assign file.%ptr.var, %addr +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/no_prelude/import_member_cycle.carbon b/toolchain/check/testdata/class/no_prelude/import_member_cycle.carbon index cb01b972e6a71..1bcb0714c5951 100644 --- a/toolchain/check/testdata/class/no_prelude/import_member_cycle.carbon +++ b/toolchain/check/testdata/class/no_prelude/import_member_cycle.carbon @@ -25,5 +25,35 @@ library "[[@TEST_NAME]]"; import library "a"; fn Run() { + //@dump-sem-ir-begin var a: Cycle*; + //@dump-sem-ir-end } + +// CHECK:STDOUT: --- b.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %Cycle: type = class_type @Cycle [concrete] +// CHECK:STDOUT: %ptr: type = ptr_type %Cycle [concrete] +// CHECK:STDOUT: %pattern_type: type = pattern_type %ptr [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: %Main.Cycle: type = import_ref Main//a, Cycle, loaded [concrete = constants.%Cycle] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @Run() { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %a.patt: %pattern_type = binding_pattern a [concrete] +// CHECK:STDOUT: %a.var_patt: %pattern_type = var_pattern %a.patt [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: %a.var: ref %ptr = var %a.var_patt +// CHECK:STDOUT: %.loc8: type = splice_block %ptr [concrete = constants.%ptr] { +// CHECK:STDOUT: %Cycle.ref: type = name_ref Cycle, imports.%Main.Cycle [concrete = constants.%Cycle] +// CHECK:STDOUT: %ptr: type = ptr_type %Cycle.ref [concrete = constants.%ptr] +// CHECK:STDOUT: } +// CHECK:STDOUT: %a: ref %ptr = bind_name a, %a.var +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/no_prelude/import_struct_cyle.carbon b/toolchain/check/testdata/class/no_prelude/import_struct_cyle.carbon index 7935534236418..d44efd24d899c 100644 --- a/toolchain/check/testdata/class/no_prelude/import_struct_cyle.carbon +++ b/toolchain/check/testdata/class/no_prelude/import_struct_cyle.carbon @@ -30,5 +30,39 @@ library "[[@TEST_NAME]]"; import library "a"; fn Run() { + //@dump-sem-ir-begin a.b = (*a.b).c.b; + //@dump-sem-ir-end } + +// CHECK:STDOUT: --- b.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %Cycle: type = class_type @Cycle [concrete] +// CHECK:STDOUT: %ptr.257: type = ptr_type %Cycle [concrete] +// CHECK:STDOUT: %struct_type.b: type = struct_type {.b: %ptr.257} [concrete] +// CHECK:STDOUT: %Cycle.elem: type = unbound_element_type %Cycle, %struct_type.b [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: %Main.a: ref %struct_type.b = import_ref Main//a, a, loaded +// CHECK:STDOUT: %Main.import_ref.455: %Cycle.elem = import_ref Main//a, loc10_8, loaded [concrete = %.354] +// CHECK:STDOUT: %.354: %Cycle.elem = field_decl c, element0 [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @Run() { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %a.ref.loc8_3: ref %struct_type.b = name_ref a, imports.%Main.a +// CHECK:STDOUT: %.loc8_4: ref %ptr.257 = struct_access %a.ref.loc8_3, element0 +// CHECK:STDOUT: %a.ref.loc8_11: ref %struct_type.b = name_ref a, imports.%Main.a +// CHECK:STDOUT: %.loc8_12.1: ref %ptr.257 = struct_access %a.ref.loc8_11, element0 +// CHECK:STDOUT: %.loc8_12.2: %ptr.257 = bind_value %.loc8_12.1 +// CHECK:STDOUT: %.loc8_10: ref %Cycle = deref %.loc8_12.2 +// CHECK:STDOUT: %c.ref: %Cycle.elem = name_ref c, imports.%Main.import_ref.455 [concrete = imports.%.354] +// CHECK:STDOUT: %.loc8_15: ref %struct_type.b = class_element_access %.loc8_10, element0 +// CHECK:STDOUT: %.loc8_17.1: ref %ptr.257 = struct_access %.loc8_15, element0 +// CHECK:STDOUT: %.loc8_17.2: %ptr.257 = bind_value %.loc8_17.1 +// CHECK:STDOUT: assign %.loc8_4, %.loc8_17.2 +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/no_prelude/indirect_import_member.carbon b/toolchain/check/testdata/class/no_prelude/indirect_import_member.carbon index d41c452ec9745..cacf76d78b4c1 100644 --- a/toolchain/check/testdata/class/no_prelude/indirect_import_member.carbon +++ b/toolchain/check/testdata/class/no_prelude/indirect_import_member.carbon @@ -68,7 +68,9 @@ library "[[@TEST_NAME]]"; import library "b"; +//@dump-sem-ir-begin var x: () = C.F(); +//@dump-sem-ir-end // --- use_c.carbon @@ -76,7 +78,9 @@ library "[[@TEST_NAME]]"; import library "c"; +//@dump-sem-ir-begin var x: () = C.F(); +//@dump-sem-ir-end // --- use_d.carbon @@ -84,7 +88,9 @@ library "[[@TEST_NAME]]"; import library "d"; +//@dump-sem-ir-begin var x: () = C.F(); +//@dump-sem-ir-end // --- use_e.carbon @@ -92,7 +98,9 @@ library "[[@TEST_NAME]]"; import library "e"; +//@dump-sem-ir-begin var x: () = D.C.F(); +//@dump-sem-ir-end // --- use_f.carbon @@ -100,4 +108,198 @@ library "[[@TEST_NAME]]"; import library "f"; +//@dump-sem-ir-begin var x: () = D.C.F(); +//@dump-sem-ir-end + +// CHECK:STDOUT: --- use_b.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] +// CHECK:STDOUT: %pattern_type: type = pattern_type %empty_tuple.type [concrete] +// CHECK:STDOUT: %C: type = class_type @C [concrete] +// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] +// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: %Main.C: type = import_ref Main//a, C, loaded [concrete = constants.%C] +// CHECK:STDOUT: %Main.import_ref.943: %F.type = import_ref Main//a, loc5_10, loaded [concrete = constants.%F] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: file { +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %x.patt: %pattern_type = binding_pattern x [concrete] +// CHECK:STDOUT: %x.var_patt: %pattern_type = var_pattern %x.patt [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: %x.var: ref %empty_tuple.type = var %x.var_patt [concrete] +// CHECK:STDOUT: %.loc7_9.1: type = splice_block %.loc7_9.3 [concrete = constants.%empty_tuple.type] { +// CHECK:STDOUT: %.loc7_9.2: %empty_tuple.type = tuple_literal () +// CHECK:STDOUT: %.loc7_9.3: type = converted %.loc7_9.2, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] +// CHECK:STDOUT: } +// CHECK:STDOUT: %x: ref %empty_tuple.type = bind_name x, %x.var +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @__global_init() { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %C.ref: type = name_ref C, imports.%Main.C [concrete = constants.%C] +// CHECK:STDOUT: %F.ref: %F.type = name_ref F, imports.%Main.import_ref.943 [concrete = constants.%F] +// CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.ref() +// CHECK:STDOUT: assign file.%x.var, %F.call +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: --- use_c.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] +// CHECK:STDOUT: %pattern_type: type = pattern_type %empty_tuple.type [concrete] +// CHECK:STDOUT: %C: type = class_type @C [concrete] +// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] +// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: %Main.C: type = import_ref Main//c, C, loaded [concrete = constants.%C] +// CHECK:STDOUT: %Main.import_ref.5d3: %F.type = import_ref Main//c, inst23 [indirect], loaded [concrete = constants.%F] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: file { +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %x.patt: %pattern_type = binding_pattern x [concrete] +// CHECK:STDOUT: %x.var_patt: %pattern_type = var_pattern %x.patt [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: %x.var: ref %empty_tuple.type = var %x.var_patt [concrete] +// CHECK:STDOUT: %.loc7_9.1: type = splice_block %.loc7_9.3 [concrete = constants.%empty_tuple.type] { +// CHECK:STDOUT: %.loc7_9.2: %empty_tuple.type = tuple_literal () +// CHECK:STDOUT: %.loc7_9.3: type = converted %.loc7_9.2, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] +// CHECK:STDOUT: } +// CHECK:STDOUT: %x: ref %empty_tuple.type = bind_name x, %x.var +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @__global_init() { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %C.ref: type = name_ref C, imports.%Main.C [concrete = constants.%C] +// CHECK:STDOUT: %F.ref: %F.type = name_ref F, imports.%Main.import_ref.5d3 [concrete = constants.%F] +// CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.ref() +// CHECK:STDOUT: assign file.%x.var, %F.call +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: --- use_d.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] +// CHECK:STDOUT: %pattern_type: type = pattern_type %empty_tuple.type [concrete] +// CHECK:STDOUT: %C: type = class_type @C [concrete] +// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] +// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: %Main.C: type = import_ref Main//c, C, loaded [concrete = constants.%C] +// CHECK:STDOUT: %Main.import_ref.5d3: %F.type = import_ref Main//c, inst23 [indirect], loaded [concrete = constants.%F] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: file { +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %x.patt: %pattern_type = binding_pattern x [concrete] +// CHECK:STDOUT: %x.var_patt: %pattern_type = var_pattern %x.patt [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: %x.var: ref %empty_tuple.type = var %x.var_patt [concrete] +// CHECK:STDOUT: %.loc7_9.1: type = splice_block %.loc7_9.3 [concrete = constants.%empty_tuple.type] { +// CHECK:STDOUT: %.loc7_9.2: %empty_tuple.type = tuple_literal () +// CHECK:STDOUT: %.loc7_9.3: type = converted %.loc7_9.2, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] +// CHECK:STDOUT: } +// CHECK:STDOUT: %x: ref %empty_tuple.type = bind_name x, %x.var +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @__global_init() { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %C.ref: type = name_ref C, imports.%Main.C [concrete = constants.%C] +// CHECK:STDOUT: %F.ref: %F.type = name_ref F, imports.%Main.import_ref.5d3 [concrete = constants.%F] +// CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.ref() +// CHECK:STDOUT: assign file.%x.var, %F.call +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: --- use_e.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] +// CHECK:STDOUT: %pattern_type: type = pattern_type %empty_tuple.type [concrete] +// CHECK:STDOUT: %D: type = class_type @D [concrete] +// CHECK:STDOUT: %C: type = class_type @C [concrete] +// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] +// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: %Main.D: type = import_ref Main//e, D, loaded [concrete = constants.%D] +// CHECK:STDOUT: %Main.import_ref.bf1: type = import_ref Main//e, loc7_9, loaded [concrete = constants.%C] +// CHECK:STDOUT: %Main.import_ref.c85: %F.type = import_ref Main//e, inst26 [indirect], loaded [concrete = constants.%F] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: file { +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %x.patt: %pattern_type = binding_pattern x [concrete] +// CHECK:STDOUT: %x.var_patt: %pattern_type = var_pattern %x.patt [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: %x.var: ref %empty_tuple.type = var %x.var_patt [concrete] +// CHECK:STDOUT: %.loc7_9.1: type = splice_block %.loc7_9.3 [concrete = constants.%empty_tuple.type] { +// CHECK:STDOUT: %.loc7_9.2: %empty_tuple.type = tuple_literal () +// CHECK:STDOUT: %.loc7_9.3: type = converted %.loc7_9.2, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] +// CHECK:STDOUT: } +// CHECK:STDOUT: %x: ref %empty_tuple.type = bind_name x, %x.var +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @__global_init() { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %D.ref: type = name_ref D, imports.%Main.D [concrete = constants.%D] +// CHECK:STDOUT: %C.ref: type = name_ref C, imports.%Main.import_ref.bf1 [concrete = constants.%C] +// CHECK:STDOUT: %F.ref: %F.type = name_ref F, imports.%Main.import_ref.c85 [concrete = constants.%F] +// CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.ref() +// CHECK:STDOUT: assign file.%x.var, %F.call +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: --- use_f.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] +// CHECK:STDOUT: %pattern_type: type = pattern_type %empty_tuple.type [concrete] +// CHECK:STDOUT: %D: type = class_type @D [concrete] +// CHECK:STDOUT: %C: type = class_type @C [concrete] +// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] +// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: %Main.D: type = import_ref Main//e, D, loaded [concrete = constants.%D] +// CHECK:STDOUT: %Main.import_ref.bf1: type = import_ref Main//e, loc7_9, loaded [concrete = constants.%C] +// CHECK:STDOUT: %Main.import_ref.c85: %F.type = import_ref Main//e, inst26 [indirect], loaded [concrete = constants.%F] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: file { +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %x.patt: %pattern_type = binding_pattern x [concrete] +// CHECK:STDOUT: %x.var_patt: %pattern_type = var_pattern %x.patt [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: %x.var: ref %empty_tuple.type = var %x.var_patt [concrete] +// CHECK:STDOUT: %.loc7_9.1: type = splice_block %.loc7_9.3 [concrete = constants.%empty_tuple.type] { +// CHECK:STDOUT: %.loc7_9.2: %empty_tuple.type = tuple_literal () +// CHECK:STDOUT: %.loc7_9.3: type = converted %.loc7_9.2, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] +// CHECK:STDOUT: } +// CHECK:STDOUT: %x: ref %empty_tuple.type = bind_name x, %x.var +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @__global_init() { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %D.ref: type = name_ref D, imports.%Main.D [concrete = constants.%D] +// CHECK:STDOUT: %C.ref: type = name_ref C, imports.%Main.import_ref.bf1 [concrete = constants.%C] +// CHECK:STDOUT: %F.ref: %F.type = name_ref F, imports.%Main.import_ref.c85 [concrete = constants.%F] +// CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.ref() +// CHECK:STDOUT: assign file.%x.var, %F.call +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/no_prelude/raw_self.carbon b/toolchain/check/testdata/class/no_prelude/raw_self.carbon index 4842af24afa93..4e34acab9721e 100644 --- a/toolchain/check/testdata/class/no_prelude/raw_self.carbon +++ b/toolchain/check/testdata/class/no_prelude/raw_self.carbon @@ -20,11 +20,15 @@ class Class { } fn Class.F[addr self: Self*](r#self: ()) { + //@dump-sem-ir-begin (*self).n = r#self; + //@dump-sem-ir-end } fn Class.G[self: Self](r#self: ()) -> ((), ()) { + //@dump-sem-ir-begin return (self.n, r#self); + //@dump-sem-ir-end } // --- raw_self_type.carbon @@ -32,7 +36,9 @@ library "[[@TEST_NAME]]"; class Class { fn F() { + //@dump-sem-ir-begin var r#Self: Self*; + //@dump-sem-ir-end var p: Self* = r#Self; } } @@ -44,3 +50,81 @@ class MemberNamedSelf { } fn MemberNamedSelf.F(x: Self, y: r#Self) {} + +// CHECK:STDOUT: --- raw_self.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %Class: type = class_type @Class [concrete] +// CHECK:STDOUT: %ptr.e71: type = ptr_type %Class [concrete] +// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] +// CHECK:STDOUT: %tuple.type: type = tuple_type (%empty_tuple.type, %empty_tuple.type) [concrete] +// CHECK:STDOUT: %Class.elem: type = unbound_element_type %Class, %empty_tuple.type [concrete] +// CHECK:STDOUT: %empty_tuple: %empty_tuple.type = tuple_value () [concrete] +// CHECK:STDOUT: %tuple: %tuple.type = tuple_value (%empty_tuple, %empty_tuple) [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @F(%self.param.loc9_21: %ptr.e71, %self.param.loc9_36: %empty_tuple.type) { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %self.ref.loc11_5: %ptr.e71 = name_ref self, %self.loc9_17 +// CHECK:STDOUT: %.loc11_4: ref %Class = deref %self.ref.loc11_5 +// CHECK:STDOUT: %n.ref: %Class.elem = name_ref n, @Class.%.loc6_8 [concrete = @Class.%.loc6_8] +// CHECK:STDOUT: %.loc11_10: ref %empty_tuple.type = class_element_access %.loc11_4, element0 +// CHECK:STDOUT: %self.ref.loc11_15: %empty_tuple.type = name_ref r#self, %self.loc9_30 +// CHECK:STDOUT: %.loc11_15: init %empty_tuple.type = tuple_init () to %.loc11_10 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc11_13: init %empty_tuple.type = converted %self.ref.loc11_15, %.loc11_15 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: assign %.loc11_10, %.loc11_13 +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @G(%self.param.loc15_16: %Class, %self.param.loc15_30: %empty_tuple.type) -> %return.param.loc15: %tuple.type { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %self.ref.loc17_11: %Class = name_ref self, %self.loc15_12 +// CHECK:STDOUT: %n.ref: %Class.elem = name_ref n, @Class.%.loc6_8 [concrete = @Class.%.loc6_8] +// CHECK:STDOUT: %.loc17_15.1: ref %empty_tuple.type = class_element_access %self.ref.loc17_11, element0 +// CHECK:STDOUT: %tuple: %empty_tuple.type = tuple_value () [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc17_15.2: %empty_tuple.type = converted %.loc17_15.1, %tuple [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %self.ref.loc17_19: %empty_tuple.type = name_ref r#self, %self.loc15_24 +// CHECK:STDOUT: %.loc17_25.1: %tuple.type = tuple_literal (%.loc17_15.2, %self.ref.loc17_19) +// CHECK:STDOUT: %tuple.elem0: ref %empty_tuple.type = tuple_access %return.loc15, element0 +// CHECK:STDOUT: %.loc17_15.3: init %empty_tuple.type = tuple_init () to %tuple.elem0 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc17_25.2: init %empty_tuple.type = converted %.loc17_15.2, %.loc17_15.3 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %tuple.elem1: ref %empty_tuple.type = tuple_access %return.loc15, element1 +// CHECK:STDOUT: %.loc17_19: init %empty_tuple.type = tuple_init () to %tuple.elem1 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc17_25.3: init %empty_tuple.type = converted %self.ref.loc17_19, %.loc17_19 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc17_25.4: init %tuple.type = tuple_init (%.loc17_25.2, %.loc17_25.3) to %return.loc15 [concrete = constants.%tuple] +// CHECK:STDOUT: %.loc17_26: init %tuple.type = converted %.loc17_25.1, %.loc17_25.4 [concrete = constants.%tuple] +// CHECK:STDOUT: return %.loc17_26 to %return.loc15 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: --- raw_self_type.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %Class: type = class_type @Class [concrete] +// CHECK:STDOUT: %ptr.e71: type = ptr_type %Class [concrete] +// CHECK:STDOUT: %pattern_type.796: type = pattern_type %ptr.e71 [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: class @Class { +// CHECK:STDOUT: +// CHECK:STDOUT: complete_type_witness = %complete_type +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = constants.%Class +// CHECK:STDOUT: .F = %F.decl +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @F.1() { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %Self.patt: %pattern_type.796 = binding_pattern r#Self [concrete] +// CHECK:STDOUT: %Self.var_patt: %pattern_type.796 = var_pattern %Self.patt [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: %Self.var: ref %ptr.e71 = var %Self.var_patt +// CHECK:STDOUT: %.loc6: type = splice_block %ptr.loc6 [concrete = constants.%ptr.e71] { +// CHECK:STDOUT: %Self.ref.loc6: type = name_ref Self, constants.%Class [concrete = constants.%Class] +// CHECK:STDOUT: %ptr.loc6: type = ptr_type %Self.ref.loc6 [concrete = constants.%ptr.e71] +// CHECK:STDOUT: } +// CHECK:STDOUT: %Self: ref %ptr.e71 = bind_name r#Self, %Self.var +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/no_prelude/reorder.carbon b/toolchain/check/testdata/class/no_prelude/reorder.carbon index ddf8b8aaee5fd..0a823dc47442c 100644 --- a/toolchain/check/testdata/class/no_prelude/reorder.carbon +++ b/toolchain/check/testdata/class/no_prelude/reorder.carbon @@ -15,7 +15,9 @@ library "[[@TEST_NAME]]"; class Class { fn G() -> () { + //@dump-sem-ir-begin return Class.F(); + //@dump-sem-ir-end } fn F() -> () { @@ -43,6 +45,7 @@ class A { } fn D.DF() { + //@dump-sem-ir-begin // A, B, C, and D are complete here. var a: A = {.a = ()}; var b: B = {.b = ()}; @@ -54,6 +57,7 @@ class A { BF(); CF(); DF(); + //@dump-sem-ir-end } fn CF(); @@ -63,3 +67,169 @@ class A { fn AF(); var a: (); } + +// CHECK:STDOUT: --- reorder.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %Class: type = class_type @Class [concrete] +// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] +// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] +// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] +// CHECK:STDOUT: %empty_tuple: %empty_tuple.type = tuple_value () [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: class @Class { +// CHECK:STDOUT: +// CHECK:STDOUT: complete_type_witness = %complete_type +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = constants.%Class +// CHECK:STDOUT: .G = %G.decl +// CHECK:STDOUT: .F = %F.decl +// CHECK:STDOUT: .Class = +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @G() -> %empty_tuple.type { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %Class.ref: type = name_ref Class, file.%Class.decl [concrete = constants.%Class] +// CHECK:STDOUT: %F.ref: %F.type = name_ref F, @Class.%F.decl [concrete = constants.%F] +// CHECK:STDOUT: %F.call: init %empty_tuple.type = call %F.ref() +// CHECK:STDOUT: %.loc6_20.1: ref %empty_tuple.type = temporary_storage +// CHECK:STDOUT: %.loc6_20.2: ref %empty_tuple.type = temporary %.loc6_20.1, %F.call +// CHECK:STDOUT: %tuple: %empty_tuple.type = tuple_value () [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc6_21: %empty_tuple.type = converted %F.call, %tuple [concrete = constants.%empty_tuple] +// CHECK:STDOUT: return %.loc6_21 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: --- reorder_qualified.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %A: type = class_type @A [concrete] +// CHECK:STDOUT: %B: type = class_type @B [concrete] +// CHECK:STDOUT: %C: type = class_type @C [concrete] +// CHECK:STDOUT: %BF.type: type = fn_type @BF [concrete] +// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] +// CHECK:STDOUT: %BF: %BF.type = struct_value () [concrete] +// CHECK:STDOUT: %struct_type.b: type = struct_type {.b: %empty_tuple.type} [concrete] +// CHECK:STDOUT: %D: type = class_type @D [concrete] +// CHECK:STDOUT: %DF.type: type = fn_type @DF [concrete] +// CHECK:STDOUT: %DF: %DF.type = struct_value () [concrete] +// CHECK:STDOUT: %struct_type.d: type = struct_type {.d: %empty_tuple.type} [concrete] +// CHECK:STDOUT: %CF.type: type = fn_type @CF [concrete] +// CHECK:STDOUT: %CF: %CF.type = struct_value () [concrete] +// CHECK:STDOUT: %struct_type.c: type = struct_type {.c: %empty_tuple.type} [concrete] +// CHECK:STDOUT: %AF.type: type = fn_type @AF [concrete] +// CHECK:STDOUT: %AF: %AF.type = struct_value () [concrete] +// CHECK:STDOUT: %struct_type.a: type = struct_type {.a: %empty_tuple.type} [concrete] +// CHECK:STDOUT: %pattern_type.c10: type = pattern_type %A [concrete] +// CHECK:STDOUT: %empty_tuple: %empty_tuple.type = tuple_value () [concrete] +// CHECK:STDOUT: %A.val: %A = struct_value (%empty_tuple) [concrete] +// CHECK:STDOUT: %pattern_type.98e: type = pattern_type %B [concrete] +// CHECK:STDOUT: %B.val: %B = struct_value (%empty_tuple) [concrete] +// CHECK:STDOUT: %pattern_type.6d8: type = pattern_type %C [concrete] +// CHECK:STDOUT: %C.val: %C = struct_value (%empty_tuple) [concrete] +// CHECK:STDOUT: %pattern_type.d58: type = pattern_type %D [concrete] +// CHECK:STDOUT: %D.val: %D = struct_value (%empty_tuple) [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: class @A { +// CHECK:STDOUT: +// CHECK:STDOUT: complete_type_witness = %complete_type +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = constants.%A +// CHECK:STDOUT: .B = %B.decl +// CHECK:STDOUT: .AF = %AF.decl +// CHECK:STDOUT: .a = %.loc40_8 +// CHECK:STDOUT: .A = +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: class @C { +// CHECK:STDOUT: +// CHECK:STDOUT: complete_type_witness = %complete_type +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = constants.%C +// CHECK:STDOUT: .D = %D.decl +// CHECK:STDOUT: .CF = %CF.decl +// CHECK:STDOUT: .c = %.loc36_10 +// CHECK:STDOUT: .A = +// CHECK:STDOUT: .B = +// CHECK:STDOUT: .C = +// CHECK:STDOUT: .AF = +// CHECK:STDOUT: .BF = +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @DF() { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %a.patt: %pattern_type.c10 = binding_pattern a [concrete] +// CHECK:STDOUT: %a.var_patt: %pattern_type.c10 = var_pattern %a.patt [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: %a.var: ref %A = var %a.var_patt +// CHECK:STDOUT: %.loc22_25.1: %empty_tuple.type = tuple_literal () +// CHECK:STDOUT: %.loc22_26.1: %struct_type.a = struct_literal (%.loc22_25.1) +// CHECK:STDOUT: %.loc22_26.2: ref %empty_tuple.type = class_element_access %a.var, element0 +// CHECK:STDOUT: %.loc22_25.2: init %empty_tuple.type = tuple_init () to %.loc22_26.2 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc22_26.3: init %empty_tuple.type = converted %.loc22_25.1, %.loc22_25.2 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc22_26.4: init %A = class_init (%.loc22_26.3), %a.var [concrete = constants.%A.val] +// CHECK:STDOUT: %.loc22_7: init %A = converted %.loc22_26.1, %.loc22_26.4 [concrete = constants.%A.val] +// CHECK:STDOUT: assign %a.var, %.loc22_7 +// CHECK:STDOUT: %A.ref: type = name_ref A, file.%A.decl [concrete = constants.%A] +// CHECK:STDOUT: %a: ref %A = bind_name a, %a.var +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %b.patt: %pattern_type.98e = binding_pattern b [concrete] +// CHECK:STDOUT: %b.var_patt: %pattern_type.98e = var_pattern %b.patt [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: %b.var: ref %B = var %b.var_patt +// CHECK:STDOUT: %.loc23_25.1: %empty_tuple.type = tuple_literal () +// CHECK:STDOUT: %.loc23_26.1: %struct_type.b = struct_literal (%.loc23_25.1) +// CHECK:STDOUT: %.loc23_26.2: ref %empty_tuple.type = class_element_access %b.var, element0 +// CHECK:STDOUT: %.loc23_25.2: init %empty_tuple.type = tuple_init () to %.loc23_26.2 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc23_26.3: init %empty_tuple.type = converted %.loc23_25.1, %.loc23_25.2 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc23_26.4: init %B = class_init (%.loc23_26.3), %b.var [concrete = constants.%B.val] +// CHECK:STDOUT: %.loc23_7: init %B = converted %.loc23_26.1, %.loc23_26.4 [concrete = constants.%B.val] +// CHECK:STDOUT: assign %b.var, %.loc23_7 +// CHECK:STDOUT: %B.ref: type = name_ref B, @A.%B.decl [concrete = constants.%B] +// CHECK:STDOUT: %b: ref %B = bind_name b, %b.var +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %c.patt: %pattern_type.6d8 = binding_pattern c [concrete] +// CHECK:STDOUT: %c.var_patt: %pattern_type.6d8 = var_pattern %c.patt [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: %c.var: ref %C = var %c.var_patt +// CHECK:STDOUT: %.loc24_25.1: %empty_tuple.type = tuple_literal () +// CHECK:STDOUT: %.loc24_26.1: %struct_type.c = struct_literal (%.loc24_25.1) +// CHECK:STDOUT: %.loc24_26.2: ref %empty_tuple.type = class_element_access %c.var, element0 +// CHECK:STDOUT: %.loc24_25.2: init %empty_tuple.type = tuple_init () to %.loc24_26.2 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc24_26.3: init %empty_tuple.type = converted %.loc24_25.1, %.loc24_25.2 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc24_26.4: init %C = class_init (%.loc24_26.3), %c.var [concrete = constants.%C.val] +// CHECK:STDOUT: %.loc24_7: init %C = converted %.loc24_26.1, %.loc24_26.4 [concrete = constants.%C.val] +// CHECK:STDOUT: assign %c.var, %.loc24_7 +// CHECK:STDOUT: %C.ref: type = name_ref C, @B.%C.decl [concrete = constants.%C] +// CHECK:STDOUT: %c: ref %C = bind_name c, %c.var +// CHECK:STDOUT: name_binding_decl { +// CHECK:STDOUT: %d.patt: %pattern_type.d58 = binding_pattern d [concrete] +// CHECK:STDOUT: %d.var_patt: %pattern_type.d58 = var_pattern %d.patt [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: %d.var: ref %D = var %d.var_patt +// CHECK:STDOUT: %.loc25_25.1: %empty_tuple.type = tuple_literal () +// CHECK:STDOUT: %.loc25_26.1: %struct_type.d = struct_literal (%.loc25_25.1) +// CHECK:STDOUT: %.loc25_26.2: ref %empty_tuple.type = class_element_access %d.var, element0 +// CHECK:STDOUT: %.loc25_25.2: init %empty_tuple.type = tuple_init () to %.loc25_26.2 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc25_26.3: init %empty_tuple.type = converted %.loc25_25.1, %.loc25_25.2 [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc25_26.4: init %D = class_init (%.loc25_26.3), %d.var [concrete = constants.%D.val] +// CHECK:STDOUT: %.loc25_7: init %D = converted %.loc25_26.1, %.loc25_26.4 [concrete = constants.%D.val] +// CHECK:STDOUT: assign %d.var, %.loc25_7 +// CHECK:STDOUT: %D.ref: type = name_ref D, @C.%D.decl [concrete = constants.%D] +// CHECK:STDOUT: %d: ref %D = bind_name d, %d.var +// CHECK:STDOUT: %AF.ref: %AF.type = name_ref AF, @A.%AF.decl [concrete = constants.%AF] +// CHECK:STDOUT: %AF.call: init %empty_tuple.type = call %AF.ref() +// CHECK:STDOUT: %BF.ref: %BF.type = name_ref BF, @B.%BF.decl [concrete = constants.%BF] +// CHECK:STDOUT: %BF.call: init %empty_tuple.type = call %BF.ref() +// CHECK:STDOUT: %CF.ref: %CF.type = name_ref CF, @C.%CF.decl [concrete = constants.%CF] +// CHECK:STDOUT: %CF.call: init %empty_tuple.type = call %CF.ref() +// CHECK:STDOUT: %DF.ref: %DF.type = name_ref DF, @D.%DF.decl [concrete = constants.%DF] +// CHECK:STDOUT: %DF.call: init %empty_tuple.type = call %DF.ref() +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/no_prelude/scope.carbon b/toolchain/check/testdata/class/no_prelude/scope.carbon index c1df30ef51ae8..bacd79119b254 100644 --- a/toolchain/check/testdata/class/no_prelude/scope.carbon +++ b/toolchain/check/testdata/class/no_prelude/scope.carbon @@ -23,9 +23,11 @@ class Class { } } +//@dump-sem-ir-begin fn F() -> () { return (); } +//@dump-sem-ir-end fn Run() { var a: () = F(); @@ -40,10 +42,12 @@ class Class { fn G() -> (); } +//@dump-sem-ir-begin fn Class.F() -> () { Self.G(); return G(); } +//@dump-sem-ir-end // --- fail_out_of_scope.carbon library "[[@TEST_NAME]]"; @@ -61,3 +65,73 @@ fn G() -> () { // CHECK:STDERR: return F(); } + +// CHECK:STDOUT: --- scope.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] +// CHECK:STDOUT: %pattern_type: type = pattern_type %empty_tuple.type [concrete] +// CHECK:STDOUT: %empty_tuple: %empty_tuple.type = tuple_value () [concrete] +// CHECK:STDOUT: %F.type.b25: type = fn_type @F.2 [concrete] +// CHECK:STDOUT: %F.c41: %F.type.b25 = struct_value () [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: file { +// CHECK:STDOUT: %F.decl: %F.type.b25 = fn_decl @F.2 [concrete = constants.%F.c41] { +// CHECK:STDOUT: %return.patt: %pattern_type = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: %pattern_type = out_param_pattern %return.patt, call_param0 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc14_12.1: %empty_tuple.type = tuple_literal () +// CHECK:STDOUT: %.loc14_12.2: type = converted %.loc14_12.1, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] +// CHECK:STDOUT: %return.param: ref %empty_tuple.type = out_param call_param0 +// CHECK:STDOUT: %return: ref %empty_tuple.type = return_slot %return.param +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @F.2() -> %empty_tuple.type { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %.loc15_11: %empty_tuple.type = tuple_literal () +// CHECK:STDOUT: %empty_tuple: %empty_tuple.type = tuple_value () [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc15_12: %empty_tuple.type = converted %.loc15_11, %empty_tuple [concrete = constants.%empty_tuple] +// CHECK:STDOUT: return %.loc15_12 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: --- reenter_scope.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %Class: type = class_type @Class [concrete] +// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] +// CHECK:STDOUT: %pattern_type: type = pattern_type %empty_tuple.type [concrete] +// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] +// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] +// CHECK:STDOUT: %G.type: type = fn_type @G [concrete] +// CHECK:STDOUT: %G: %G.type = struct_value () [concrete] +// CHECK:STDOUT: %empty_tuple: %empty_tuple.type = tuple_value () [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: file { +// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { +// CHECK:STDOUT: %return.patt: %pattern_type = return_slot_pattern [concrete] +// CHECK:STDOUT: %return.param_patt: %pattern_type = out_param_pattern %return.patt, call_param0 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc9_18.1: %empty_tuple.type = tuple_literal () +// CHECK:STDOUT: %.loc9_18.2: type = converted %.loc9_18.1, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] +// CHECK:STDOUT: %return.param.loc9: ref %empty_tuple.type = out_param call_param0 +// CHECK:STDOUT: %return.loc9: ref %empty_tuple.type = return_slot %return.param.loc9 +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @F() -> %empty_tuple.type { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%Class [concrete = constants.%Class] +// CHECK:STDOUT: %G.ref.loc10: %G.type = name_ref G, @Class.%G.decl [concrete = constants.%G] +// CHECK:STDOUT: %G.call.loc10: init %empty_tuple.type = call %G.ref.loc10() +// CHECK:STDOUT: %G.ref.loc11: %G.type = name_ref G, @Class.%G.decl [concrete = constants.%G] +// CHECK:STDOUT: %G.call.loc11: init %empty_tuple.type = call %G.ref.loc11() +// CHECK:STDOUT: %.loc11_12.1: ref %empty_tuple.type = temporary_storage +// CHECK:STDOUT: %.loc11_12.2: ref %empty_tuple.type = temporary %.loc11_12.1, %G.call.loc11 +// CHECK:STDOUT: %tuple: %empty_tuple.type = tuple_value () [concrete = constants.%empty_tuple] +// CHECK:STDOUT: %.loc11_13: %empty_tuple.type = converted %G.call.loc11, %tuple [concrete = constants.%empty_tuple] +// CHECK:STDOUT: return %.loc11_13 +// CHECK:STDOUT: } +// CHECK:STDOUT: diff --git a/toolchain/check/testdata/class/no_prelude/syntactic_merge.carbon b/toolchain/check/testdata/class/no_prelude/syntactic_merge.carbon index 85d3cdb7c003b..4e783baf7f31f 100644 --- a/toolchain/check/testdata/class/no_prelude/syntactic_merge.carbon +++ b/toolchain/check/testdata/class/no_prelude/syntactic_merge.carbon @@ -17,11 +17,13 @@ library "[[@TEST_NAME]]"; class C {} alias D = C; +//@dump-sem-ir-begin class Foo(a:! C); class Foo(a:! C) {} class Bar(a:! D); class Bar(a:! D) {} +//@dump-sem-ir-end // --- spacing.carbon @@ -29,8 +31,10 @@ library "[[@TEST_NAME]]"; class C {} +//@dump-sem-ir-begin class Foo [ ] ( a :! C ); class Foo[](a:! C) {} +//@dump-sem-ir-end // --- fail_parens.carbon @@ -71,8 +75,10 @@ class Bar(a:! D); impl library "[[@TEST_NAME]]"; +//@dump-sem-ir-begin class Foo(a:! C) {} class Bar(a:! D) {} +//@dump-sem-ir-end // --- fail_name_mismatch.carbon @@ -181,3 +187,200 @@ base class Base { fn Base.F[addr self: Base*]() { (*self).a = (); } + +// CHECK:STDOUT: --- basic.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %C: type = class_type @C [concrete] +// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] +// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] +// CHECK:STDOUT: %a: %C = bind_symbolic_name a, 0 [symbolic] +// CHECK:STDOUT: %pattern_type: type = pattern_type %C [concrete] +// CHECK:STDOUT: %Foo.type: type = generic_class_type @Foo [concrete] +// CHECK:STDOUT: %Foo.generic: %Foo.type = struct_value () [concrete] +// CHECK:STDOUT: %Foo: type = class_type @Foo, @Foo(%a) [symbolic] +// CHECK:STDOUT: %Bar.type: type = generic_class_type @Bar [concrete] +// CHECK:STDOUT: %Bar.generic: %Bar.type = struct_value () [concrete] +// CHECK:STDOUT: %Bar: type = class_type @Bar, @Bar(%a) [symbolic] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: file { +// CHECK:STDOUT: %Foo.decl.loc8: %Foo.type = class_decl @Foo [concrete = constants.%Foo.generic] { +// CHECK:STDOUT: %a.patt: %pattern_type = symbolic_binding_pattern a, 0 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %C.ref.loc8: type = name_ref C, file.%C.decl [concrete = constants.%C] +// CHECK:STDOUT: %a.loc8_11.1: %C = bind_symbolic_name a, 0 [symbolic = %a.loc8_11.2 (constants.%a)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %Foo.decl.loc9: %Foo.type = class_decl @Foo [concrete = constants.%Foo.generic] { +// CHECK:STDOUT: %a.patt: %pattern_type = symbolic_binding_pattern a, 0 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %C.ref.loc9: type = name_ref C, file.%C.decl [concrete = constants.%C] +// CHECK:STDOUT: %a.loc9: %C = bind_symbolic_name a, 0 [symbolic = %a.loc8_11.2 (constants.%a)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %Bar.decl.loc11: %Bar.type = class_decl @Bar [concrete = constants.%Bar.generic] { +// CHECK:STDOUT: %a.patt: %pattern_type = symbolic_binding_pattern a, 0 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %D.ref.loc11: type = name_ref D, file.%D [concrete = constants.%C] +// CHECK:STDOUT: %a.loc11_11.1: %C = bind_symbolic_name a, 0 [symbolic = %a.loc11_11.2 (constants.%a)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %Bar.decl.loc12: %Bar.type = class_decl @Bar [concrete = constants.%Bar.generic] { +// CHECK:STDOUT: %a.patt: %pattern_type = symbolic_binding_pattern a, 0 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %D.ref.loc12: type = name_ref D, file.%D [concrete = constants.%C] +// CHECK:STDOUT: %a.loc12: %C = bind_symbolic_name a, 0 [symbolic = %a.loc11_11.2 (constants.%a)] +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic class @Foo(%a.loc8_11.1: %C) { +// CHECK:STDOUT: %a.loc8_11.2: %C = bind_symbolic_name a, 0 [symbolic = %a.loc8_11.2 (constants.%a)] +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: +// CHECK:STDOUT: class { +// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] +// CHECK:STDOUT: %complete_type: = 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.%Foo +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic class @Bar(%a.loc11_11.1: %C) { +// CHECK:STDOUT: %a.loc11_11.2: %C = bind_symbolic_name a, 0 [symbolic = %a.loc11_11.2 (constants.%a)] +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: +// CHECK:STDOUT: class { +// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] +// CHECK:STDOUT: %complete_type: = 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.%Bar +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @Foo(constants.%a) { +// CHECK:STDOUT: %a.loc8_11.2 => constants.%a +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @Bar(constants.%a) { +// CHECK:STDOUT: %a.loc11_11.2 => constants.%a +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: --- spacing.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %C: type = class_type @C [concrete] +// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] +// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] +// CHECK:STDOUT: %a: %C = bind_symbolic_name a, 0 [symbolic] +// CHECK:STDOUT: %pattern_type: type = pattern_type %C [concrete] +// CHECK:STDOUT: %Foo.type: type = generic_class_type @Foo [concrete] +// CHECK:STDOUT: %Foo.generic: %Foo.type = struct_value () [concrete] +// CHECK:STDOUT: %Foo: type = class_type @Foo, @Foo(%a) [symbolic] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: file { +// CHECK:STDOUT: %Foo.decl.loc7: %Foo.type = class_decl @Foo [concrete = constants.%Foo.generic] { +// CHECK:STDOUT: %a.patt: %pattern_type = symbolic_binding_pattern a, 0 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %C.ref.loc7: type = name_ref C, file.%C.decl [concrete = constants.%C] +// CHECK:STDOUT: %a.loc7_17.1: %C = bind_symbolic_name a, 0 [symbolic = %a.loc7_17.2 (constants.%a)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %Foo.decl.loc8: %Foo.type = class_decl @Foo [concrete = constants.%Foo.generic] { +// CHECK:STDOUT: %a.patt: %pattern_type = symbolic_binding_pattern a, 0 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %C.ref.loc8: type = name_ref C, file.%C.decl [concrete = constants.%C] +// CHECK:STDOUT: %a.loc8: %C = bind_symbolic_name a, 0 [symbolic = %a.loc7_17.2 (constants.%a)] +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic class @Foo(%a.loc7_17.1: %C) { +// CHECK:STDOUT: %a.loc7_17.2: %C = bind_symbolic_name a, 0 [symbolic = %a.loc7_17.2 (constants.%a)] +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: +// CHECK:STDOUT: class { +// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] +// CHECK:STDOUT: %complete_type: = 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.%Foo +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @Foo(constants.%a) { +// CHECK:STDOUT: %a.loc7_17.2 => constants.%a +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: --- two_file.impl.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %C: type = class_type @C [concrete] +// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] +// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] +// CHECK:STDOUT: %a: %C = bind_symbolic_name a, 0 [symbolic] +// CHECK:STDOUT: %pattern_type: type = pattern_type %C [concrete] +// CHECK:STDOUT: %Foo.type: type = generic_class_type @Foo [concrete] +// CHECK:STDOUT: %Foo.generic: %Foo.type = struct_value () [concrete] +// CHECK:STDOUT: %Foo: type = class_type @Foo, @Foo(%a) [symbolic] +// CHECK:STDOUT: %Bar.type: type = generic_class_type @Bar [concrete] +// CHECK:STDOUT: %Bar.generic: %Bar.type = struct_value () [concrete] +// CHECK:STDOUT: %Bar: type = class_type @Bar, @Bar(%a) [symbolic] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: %Main.C: type = import_ref Main//two_file, C, loaded [concrete = constants.%C] +// CHECK:STDOUT: %Main.D: type = import_ref Main//two_file, D, loaded [concrete = constants.%C] +// CHECK:STDOUT: %Main.import_ref.f97b44.1: %C = import_ref Main//two_file, loc7_11, loaded [symbolic = @Foo.%a.1 (constants.%a)] +// CHECK:STDOUT: %Main.import_ref.f97b44.2: %C = import_ref Main//two_file, loc8_11, loaded [symbolic = @Bar.%a.1 (constants.%a)] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: file { +// CHECK:STDOUT: %Foo.decl: %Foo.type = class_decl @Foo [concrete = constants.%Foo.generic] { +// CHECK:STDOUT: %a.patt: %pattern_type = symbolic_binding_pattern a, 0 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %C.ref: type = name_ref C, imports.%Main.C [concrete = constants.%C] +// CHECK:STDOUT: %a.loc5: %C = bind_symbolic_name a, 0 [symbolic = %a.1 (constants.%a)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %Bar.decl: %Bar.type = class_decl @Bar [concrete = constants.%Bar.generic] { +// CHECK:STDOUT: %a.patt: %pattern_type = symbolic_binding_pattern a, 0 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %D.ref: type = name_ref D, imports.%Main.D [concrete = constants.%C] +// CHECK:STDOUT: %a.loc6: %C = bind_symbolic_name a, 0 [symbolic = %a.1 (constants.%a)] +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic class @Foo(imports.%Main.import_ref.f97b44.1: %C) { +// CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: +// CHECK:STDOUT: class { +// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] +// CHECK:STDOUT: %complete_type: = 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.%Foo +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic class @Bar(imports.%Main.import_ref.f97b44.2: %C) { +// CHECK:STDOUT: +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: +// CHECK:STDOUT: class { +// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] +// CHECK:STDOUT: %complete_type: = 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.%Bar +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: From 4b0eb47648d1a8c2ae5c2aa7d0b5981c6a839f3a Mon Sep 17 00:00:00 2001 From: jonmeow Date: Wed, 28 May 2025 13:08:44 -0700 Subject: [PATCH 6/6] rename --- .../class/min_prelude/self_type.carbon | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/toolchain/check/testdata/class/min_prelude/self_type.carbon b/toolchain/check/testdata/class/min_prelude/self_type.carbon index 275a7b9b33c45..400c9aaff1d62 100644 --- a/toolchain/check/testdata/class/min_prelude/self_type.carbon +++ b/toolchain/check/testdata/class/min_prelude/self_type.carbon @@ -72,21 +72,21 @@ fn Call(p: Derived*) -> () { class C {} -class Class { +class D { var b: C; } -fn F() -> {} { - var c1: Class = {.b = {}}; - // CHECK:STDERR: fail_self_type_member.carbon:[[@LINE+8]]:17: error: expected identifier after `.` [ExpectedIdentifierAfterPeriodOrArrow] - // CHECK:STDERR: var c2: Class.Self = c1; - // CHECK:STDERR: ^~~~ +fn F() -> C { + var c1: D = {.b = {}}; + // CHECK:STDERR: fail_self_type_member.carbon:[[@LINE+8]]:13: error: expected identifier after `.` [ExpectedIdentifierAfterPeriodOrArrow] + // CHECK:STDERR: var c2: D.Self = c1; + // CHECK:STDERR: ^~~~ // CHECK:STDERR: - // CHECK:STDERR: fail_self_type_member.carbon:[[@LINE+4]]:17: error: semantics TODO: `handle invalid parse trees in `check`` [SemanticsTodo] - // CHECK:STDERR: var c2: Class.Self = c1; - // CHECK:STDERR: ^~~~ + // CHECK:STDERR: fail_self_type_member.carbon:[[@LINE+4]]:13: error: semantics TODO: `handle invalid parse trees in `check`` [SemanticsTodo] + // CHECK:STDERR: var c2: D.Self = c1; + // CHECK:STDERR: ^~~~ // CHECK:STDERR: - var c2: Class.Self = c1; + var c2: D.Self = c1; return c2.b; }