Track the instruction used to name the type and constraint in an impl. (#4368)

This is necessary in order to have access to the specific versions of
their constant values in a generic impl.

Stub out impl deduction.
This commit is contained in:
Richard Smith
2024-10-04 00:06:55 +00:00
committed by GitHub
parent eab5dd6112
commit 568ad197d1
79 changed files with 591 additions and 342 deletions
+15
View File
@@ -10,6 +10,7 @@
#include "toolchain/check/generic.h"
#include "toolchain/check/subst.h"
#include "toolchain/sem_ir/ids.h"
#include "toolchain/sem_ir/impl.h"
#include "toolchain/sem_ir/typed_insts.h"
namespace Carbon::Check {
@@ -238,4 +239,18 @@ auto DeduceGenericCallArguments(
context.inst_blocks().AddCanonical(result_arg_ids));
}
// Deduces the impl arguments to use in a use of a parameterized impl. Returns
// `Invalid` if deduction fails.
auto DeduceImplArguments(Context& context, const SemIR::Impl& impl,
SemIR::ConstantId self_id,
SemIR::ConstantId constraint_id) -> SemIR::SpecificId {
CARBON_CHECK(impl.generic_id.is_valid(),
"Performing deduction for non-generic impl");
// TODO: This is a placeholder. Implement deduction.
static_cast<void>(context);
static_cast<void>(self_id);
static_cast<void>(constraint_id);
return SemIR::SpecificId::Invalid;
}
} // namespace Carbon::Check
+6
View File
@@ -20,6 +20,12 @@ auto DeduceGenericCallArguments(Context& context, SemIR::LocId loc_id,
llvm::ArrayRef<SemIR::InstId> arg_ids)
-> SemIR::SpecificId;
// Deduces the impl arguments to use in a use of a parameterized impl. Returns
// `Invalid` if deduction fails.
auto DeduceImplArguments(Context& context, const SemIR::Impl& impl,
SemIR::ConstantId self_id,
SemIR::ConstantId constraint_id) -> SemIR::SpecificId;
} // namespace Carbon::Check
#endif // CARBON_TOOLCHAIN_CHECK_DEDUCE_H_
+27 -14
View File
@@ -55,14 +55,14 @@ auto HandleParseNode(Context& context, Parse::ImplForallId node_id) -> bool {
auto HandleParseNode(Context& context, Parse::TypeImplAsId node_id) -> bool {
auto [self_node, self_id] = context.node_stack().PopExprWithNodeId();
auto [self_inst_id, self_type_id] = ExprAsType(context, self_node, self_id);
context.node_stack().Push(node_id, self_type_id);
self_id = ExprAsType(context, self_node, self_id).inst_id;
context.node_stack().Push(node_id, self_id);
// Introduce `Self`. Note that we add this name lexically rather than adding
// to the `NameScopeId` of the `impl`, because this happens before we enter
// the `impl` scope or even identify which `impl` we're declaring.
// TODO: Revisit this once #3714 is resolved.
context.AddNameToLookup(SemIR::NameId::SelfType, self_inst_id);
context.AddNameToLookup(SemIR::NameId::SelfType, self_id);
return true;
}
@@ -103,9 +103,21 @@ auto HandleParseNode(Context& context, Parse::DefaultSelfImplAsId node_id)
self_type_id = SemIR::TypeId::Error;
}
// Build the implicit access to the enclosing `Self`.
// TODO: Consider calling `HandleNameAsExpr` to build this implicit `Self`
// expression. We've already done the work to check that the enclosing context
// is a class and found its `Self`, so additionally performing an unqualified
// name lookup would be redundant work, but would avoid duplicating the
// handling of the `Self` expression.
auto self_inst_id = context.AddInst(
node_id,
SemIR::NameRef{.type_id = SemIR::TypeId::TypeType,
.name_id = SemIR::NameId::SelfType,
.value_id = context.types().GetInstId(self_type_id)});
// There's no need to push `Self` into scope here, because we can find it in
// the parent class scope.
context.node_stack().Push(node_id, self_type_id);
context.node_stack().Push(node_id, self_inst_id);
return true;
}
@@ -241,16 +253,17 @@ static auto BuildImplDecl(Context& context, Parse::AnyImplDeclId node_id,
-> std::pair<SemIR::ImplId, SemIR::InstId> {
auto [constraint_node, constraint_id] =
context.node_stack().PopExprWithNodeId();
auto [self_type_node, self_type_id] =
auto [self_type_node, self_inst_id] =
context.node_stack().PopWithNodeId<Parse::NodeCategory::ImplAs>();
auto self_type_id = context.GetTypeIdForTypeInst(self_inst_id);
// Pop the `impl` introducer and any `forall` parameters as a "name".
auto name = PopImplIntroducerAndParamsAsNameComponent(context, node_id);
auto decl_block_id = context.inst_block_stack().Pop();
// Convert the constraint expression to a type.
// TODO: Check that its constant value is a constraint.
auto constraint_type_id =
ExprAsType(context, constraint_node, constraint_id).type_id;
auto [constraint_inst_id, constraint_type_id] =
ExprAsType(context, constraint_node, constraint_id);
// Process modifiers.
// TODO: Should we somehow permit access specifiers on `impl`s?
@@ -276,11 +289,10 @@ static auto BuildImplDecl(Context& context, Parse::AnyImplDeclId node_id,
name_context.MakeEntityWithParamsBase(name, impl_decl_id,
/*is_extern=*/false,
SemIR::LibraryNameId::Invalid),
{.self_id = self_type_id, .constraint_id = constraint_type_id}};
{.self_id = self_inst_id, .constraint_id = constraint_inst_id}};
// Add the impl declaration.
auto lookup_bucket_ref = context.impls().GetOrAddLookupBucket(
impl_info.self_id, impl_info.constraint_id);
auto lookup_bucket_ref = context.impls().GetOrAddLookupBucket(impl_info);
for (auto prev_impl_id : lookup_bucket_ref) {
if (MergeImplRedecl(context, impl_info, prev_impl_id)) {
impl_decl.impl_id = prev_impl_id;
@@ -329,13 +341,14 @@ auto HandleParseNode(Context& context, Parse::ImplDefinitionStartId node_id)
if (impl_info.is_defined()) {
CARBON_DIAGNOSTIC(ImplRedefinition, Error,
"redefinition of `impl {0} as {1}`", SemIR::TypeId,
SemIR::TypeId);
"redefinition of `impl {0} as {1}`", std::string,
std::string);
CARBON_DIAGNOSTIC(ImplPreviousDefinition, Note,
"previous definition was here");
context.emitter()
.Build(node_id, ImplRedefinition, impl_info.self_id,
impl_info.constraint_id)
.Build(node_id, ImplRedefinition,
context.sem_ir().StringifyTypeExpr(impl_info.self_id),
context.sem_ir().StringifyTypeExpr(impl_info.constraint_id))
.Note(impl_info.definition_id, ImplPreviousDefinition)
.Emit();
} else {
+5 -3
View File
@@ -139,6 +139,7 @@ static auto BuildInterfaceWitness(
}
auto& impl_scope = context.name_scopes().Get(impl.scope_id);
auto self_type_id = context.GetTypeIdForTypeInst(impl.self_id);
llvm::SmallVector<SemIR::InstId> table;
auto assoc_entities =
@@ -168,7 +169,7 @@ static auto BuildInterfaceWitness(
if (impl_decl_id.is_valid()) {
used_decl_ids.push_back(impl_decl_id);
table.push_back(CheckAssociatedFunctionImplementation(
context, *fn_type, impl_decl_id, impl.self_id));
context, *fn_type, impl_decl_id, self_type_id));
} else {
CARBON_DIAGNOSTIC(
ImplMissingFunction, Error,
@@ -210,8 +211,9 @@ auto BuildImplWitness(Context& context, SemIR::ImplId impl_id)
CARBON_CHECK(impl.is_being_defined());
// TODO: Handle non-interface constraints.
auto interface_type_id = context.GetTypeIdForTypeInst(impl.constraint_id);
auto interface_type =
context.types().TryGetAs<SemIR::InterfaceType>(impl.constraint_id);
context.types().TryGetAs<SemIR::InterfaceType>(interface_type_id);
if (!interface_type) {
context.TODO(impl.definition_id, "impl as non-interface");
return SemIR::InstId::BuiltinError;
@@ -219,7 +221,7 @@ auto BuildImplWitness(Context& context, SemIR::ImplId impl_id)
llvm::SmallVector<SemIR::InstId> used_decl_ids;
auto witness_id = BuildInterfaceWitness(context, impl, impl.constraint_id,
auto witness_id = BuildInterfaceWitness(context, impl, interface_type_id,
*interface_type, used_decl_ids);
// TODO: Diagnose if any declarations in the impl are not in used_decl_ids.
+48 -21
View File
@@ -56,7 +56,8 @@ auto AddImportIR(Context& context, SemIR::ImportIR import_ir)
}
auto AddImportRef(Context& context, SemIR::ImportIRInst import_ir_inst,
SemIR::EntityNameId entity_name_id) -> SemIR::InstId {
SemIR::EntityNameId entity_name_id =
SemIR::EntityNameId::Invalid) -> SemIR::InstId {
auto import_ir_inst_id = context.import_ir_insts().Add(import_ir_inst);
SemIR::ImportRefUnloaded inst = {.import_ir_inst_id = import_ir_inst_id,
.entity_name_id = entity_name_id};
@@ -70,6 +71,29 @@ auto AddImportRef(Context& context, SemIR::ImportIRInst import_ir_inst,
return import_ref_id;
}
// Adds an import_ref instruction for an instruction that we have already loaded
// from an imported IR, with a known constant value. This is useful when the
// instruction has a symbolic constant value, in order to produce an instruction
// that hold that symbolic constant.
static auto AddLoadedImportRef(Context& context,
SemIR::ImportIRInst import_ir_inst,
SemIR::TypeId type_id,
SemIR::ConstantId const_id) -> SemIR::InstId {
auto import_ir_inst_id = context.import_ir_insts().Add(import_ir_inst);
SemIR::ImportRefLoaded inst = {
.type_id = type_id,
.import_ir_inst_id = import_ir_inst_id,
.entity_name_id = SemIR::EntityNameId::Invalid};
auto inst_id = context.AddPlaceholderInstInNoBlock(
context.MakeImportedLocAndInst(import_ir_inst_id, inst));
context.import_ref_ids().push_back(inst_id);
context.constant_values().Set(inst_id, const_id);
context.import_ir_constant_values()[import_ir_inst.ir_id.index].Set(
import_ir_inst.inst_id, const_id);
return inst_id;
}
auto GetCanonicalImportIRInst(Context& context, const SemIR::File* cursor_ir,
SemIR::InstId cursor_inst_id)
-> SemIR::ImportIRInst {
@@ -115,8 +139,7 @@ auto VerifySameCanonicalImportIRInst(Context& context, SemIR::InstId prev_id,
return;
}
auto conflict_id =
AddImportRef(context, {.ir_id = new_ir_id, .inst_id = new_inst_id},
SemIR::EntityNameId::Invalid);
AddImportRef(context, {.ir_id = new_ir_id, .inst_id = new_inst_id});
context.DiagnoseDuplicateName(conflict_id, prev_id);
}
@@ -902,8 +925,7 @@ class ImportRefResolver {
SemIR::NameScope& new_scope) -> void {
for (auto entry : import_scope.names) {
auto ref_id = AddImportRef(
context_, {.ir_id = import_ir_id_, .inst_id = entry.inst_id},
SemIR::EntityNameId::Invalid);
context_, {.ir_id = import_ir_id_, .inst_id = entry.inst_id});
new_scope.AddRequired({.name_id = GetLocalNameId(entry.name_id),
.inst_id = ref_id,
.access_kind = entry.access_kind});
@@ -923,8 +945,7 @@ class ImportRefResolver {
new_associated_entities.reserve(associated_entities.size());
for (auto inst_id : associated_entities) {
new_associated_entities.push_back(
AddImportRef(context_, {.ir_id = import_ir_id_, .inst_id = inst_id},
SemIR::EntityNameId::Invalid));
AddImportRef(context_, {.ir_id = import_ir_id_, .inst_id = inst_id}));
}
return context_.inst_blocks().Add(new_associated_entities);
}
@@ -1143,8 +1164,7 @@ class ImportRefResolver {
// Add a lazy reference to the target declaration.
auto decl_id = AddImportRef(
context_, {.ir_id = import_ir_id_, .inst_id = inst.decl_id},
SemIR::EntityNameId::Invalid);
context_, {.ir_id = import_ir_id_, .inst_id = inst.decl_id});
return ResolveAs<SemIR::AssociatedEntity>(
{.type_id = context_.GetTypeIdForTypeConstant(type_const_id),
@@ -1589,8 +1609,8 @@ class ImportRefResolver {
AddImportIRInst(import_impl.latest_decl_id()), impl_decl));
impl_decl.impl_id = context_.impls().Add(
{GetIncompleteLocalEntityBase(impl_decl_id, import_impl),
{.self_id = SemIR::TypeId::Invalid,
.constraint_id = SemIR::TypeId::Invalid,
{.self_id = SemIR::InstId::Invalid,
.constraint_id = SemIR::InstId::Invalid,
.witness_id = SemIR::InstId::Invalid}});
// Write the impl ID into the ImplDecl.
@@ -1654,8 +1674,10 @@ class ImportRefResolver {
auto parent_scope_id = GetLocalNameScopeId(import_impl.parent_scope_id);
LoadLocalParamConstantIds(import_impl.implicit_param_refs_id);
auto generic_data = GetLocalGenericData(import_impl.generic_id);
auto self_const_id = GetLocalConstantId(import_impl.self_id);
auto constraint_const_id = GetLocalConstantId(import_impl.constraint_id);
auto self_const_id = GetLocalConstantId(
import_ir_.constant_values().Get(import_impl.self_id));
auto constraint_const_id = GetLocalConstantId(
import_ir_.constant_values().Get(import_impl.constraint_id));
if (HasNewWork()) {
return Retry(impl_const_id);
@@ -1668,14 +1690,21 @@ class ImportRefResolver {
CARBON_CHECK(!import_impl.param_refs_id.is_valid() &&
!new_impl.param_refs_id.is_valid());
SetGenericData(import_impl.generic_id, new_impl.generic_id, generic_data);
new_impl.self_id = context_.GetTypeIdForTypeConstant(self_const_id);
new_impl.constraint_id =
context_.GetTypeIdForTypeConstant(constraint_const_id);
// Create instructions for self and constraint to hold the symbolic constant
// value for a generic impl.
new_impl.self_id = AddLoadedImportRef(
context_, {.ir_id = import_ir_id_, .inst_id = import_impl.self_id},
SemIR::TypeId::TypeType, self_const_id);
new_impl.constraint_id = AddLoadedImportRef(
context_,
{.ir_id = import_ir_id_, .inst_id = import_impl.constraint_id},
SemIR::TypeId::TypeType, constraint_const_id);
if (import_impl.is_defined()) {
auto witness_id = AddImportRef(
context_, {.ir_id = import_ir_id_, .inst_id = import_impl.witness_id},
SemIR::EntityNameId::Invalid);
context_,
{.ir_id = import_ir_id_, .inst_id = import_impl.witness_id});
AddImplDefinition(import_impl, new_impl, witness_id);
}
@@ -1683,9 +1712,7 @@ class ImportRefResolver {
// file, add this to impl lookup so that it can be found by redeclarations
// in the current file.
if (import_ir_id_ == SemIR::ImportIRId::ApiForImpl) {
context_.impls()
.GetOrAddLookupBucket(new_impl.self_id, new_impl.constraint_id)
.push_back(impl_id);
context_.impls().GetOrAddLookupBucket(new_impl).push_back(impl_id);
}
return ResolveAsConstant(impl_const_id);
+22 -7
View File
@@ -10,6 +10,7 @@
#include "toolchain/base/kind_switch.h"
#include "toolchain/check/context.h"
#include "toolchain/check/convert.h"
#include "toolchain/check/deduce.h"
#include "toolchain/check/import_ref.h"
#include "toolchain/diagnostics/diagnostic_emitter.h"
#include "toolchain/sem_ir/generic.h"
@@ -177,18 +178,30 @@ static auto ScopeNeedsImplLookup(Context& context, LookupScope scope) -> bool {
// Returns an invalid InstId if no matching impl is found.
static auto LookupInterfaceWitness(Context& context,
SemIR::ConstantId type_const_id,
SemIR::TypeId interface_type_id)
SemIR::ConstantId interface_const_id)
-> SemIR::InstId {
// TODO: Add a better impl lookup system. At the very least, we should only be
// considering impls that are for the same interface we're querying. We can
// also skip impls that mention any types that aren't part of our impl query.
for (const auto& impl : context.impls().array_ref()) {
auto specific_id = SemIR::SpecificId::Invalid;
if (impl.generic_id.is_valid()) {
specific_id =
DeduceImplArguments(context, impl, type_const_id, interface_const_id);
if (!specific_id.is_valid()) {
continue;
}
}
if (!context.constant_values().AreEqualAcrossDeclarations(
context.types().GetConstantId(impl.self_id), type_const_id)) {
SemIR::GetConstantValueInSpecific(context.sem_ir(), specific_id,
impl.self_id),
type_const_id)) {
continue;
}
if (!context.types().AreEqualAcrossDeclarations(impl.constraint_id,
interface_type_id)) {
if (!context.constant_values().AreEqualAcrossDeclarations(
SemIR::GetConstantValueInSpecific(context.sem_ir(), specific_id,
impl.constraint_id),
interface_const_id)) {
// TODO: An impl of a constraint type should be treated as implementing
// the constraint's interfaces.
continue;
@@ -198,7 +211,9 @@ static auto LookupInterfaceWitness(Context& context,
return SemIR::InstId::Invalid;
}
LoadImportRef(context, impl.witness_id);
return impl.witness_id;
return context.constant_values().GetInstId(
SemIR::GetConstantValueInSpecific(context.sem_ir(), specific_id,
impl.witness_id));
}
return SemIR::InstId::Invalid;
}
@@ -213,8 +228,8 @@ static auto PerformImplLookup(
auto interface_type =
context.types().GetAs<SemIR::InterfaceType>(assoc_type.interface_type_id);
auto& interface = context.interfaces().Get(interface_type.interface_id);
auto witness_id = LookupInterfaceWitness(context, type_const_id,
assoc_type.interface_type_id);
auto witness_id = LookupInterfaceWitness(
context, type_const_id, assoc_type.interface_type_id.AsConstantId());
if (!witness_id.is_valid()) {
if (missing_impl_diagnoser) {
CARBON_DIAGNOSTIC(MissingImplInMemberAccessNote, Note,
+1 -1
View File
@@ -391,7 +391,7 @@ class NodeStack {
set_id_if_category_is(Parse::NodeCategory::MemberName,
Id::KindFor<SemIR::NameId>());
set_id_if_category_is(Parse::NodeCategory::ImplAs,
Id::KindFor<SemIR::TypeId>());
Id::KindFor<SemIR::InstId>());
set_id_if_category_is(Parse::NodeCategory::Decl |
Parse::NodeCategory::Statement |
Parse::NodeCategory::Modifier,
+4 -4
View File
@@ -136,7 +136,7 @@ let n: i32 = ((4 as i32) as X) as i32;
// CHECK:STDOUT: }
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.1: i32 as %.8 {
// CHECK:STDOUT: impl @impl.1: %.loc15_6.2 as %.loc15_20 {
// CHECK:STDOUT: %Convert.decl: %Convert.type.2 = fn_decl @Convert.2 [template = constants.%Convert.2] {
// CHECK:STDOUT: %self.patt: i32 = binding_pattern self
// CHECK:STDOUT: } {
@@ -155,7 +155,7 @@ let n: i32 = ((4 as i32) as X) as i32;
// CHECK:STDOUT: witness = %.loc15_24
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.2: %X as %.13 {
// CHECK:STDOUT: impl @impl.2: %X.ref as %.loc19_18.3 {
// CHECK:STDOUT: %Convert.decl: %Convert.type.4 = fn_decl @Convert.3 [template = constants.%Convert.4] {
// CHECK:STDOUT: %self.patt: %X = binding_pattern self
// CHECK:STDOUT: } {
@@ -226,7 +226,7 @@ let n: i32 = ((4 as i32) as X) as i32;
// CHECK:STDOUT: %.loc23_26.1: type = interface_type @As, @As(constants.%X) [template = constants.%.8]
// CHECK:STDOUT: %.loc23_26.2: %.9 = specific_constant imports.%import_ref.4, @As(constants.%X) [template = constants.%.10]
// CHECK:STDOUT: %Convert.ref.loc23_26: %.9 = name_ref Convert, %.loc23_26.2 [template = constants.%.10]
// CHECK:STDOUT: %.loc23_26.3: %Convert.type.3 = interface_witness_access @impl.1.%.loc15_24, element0 [template = constants.%Convert.2]
// CHECK:STDOUT: %.loc23_26.3: %Convert.type.3 = interface_witness_access constants.%.11, element0 [template = constants.%Convert.2]
// CHECK:STDOUT: %.loc23_26.4: <bound method> = bound_method %.loc23_16, %.loc23_26.3 [template = constants.%.19]
// CHECK:STDOUT: %.loc23_26.5: ref %X = temporary_storage
// CHECK:STDOUT: %Convert.call.loc23_26: init %X = call %.loc23_26.4(%.loc23_16) to %.loc23_26.5
@@ -238,7 +238,7 @@ let n: i32 = ((4 as i32) as X) as i32;
// CHECK:STDOUT: %.loc23_32.2: %.14 = specific_constant imports.%import_ref.4, @As(i32) [template = constants.%.15]
// CHECK:STDOUT: %Convert.ref.loc23_32: %.14 = name_ref Convert, %.loc23_32.2 [template = constants.%.15]
// CHECK:STDOUT: %.loc23_26.7: ref %X = temporary %.loc23_26.5, %.loc23_26.6
// CHECK:STDOUT: %.loc23_32.3: %Convert.type.5 = interface_witness_access @impl.2.%.loc19_24, element0 [template = constants.%Convert.4]
// CHECK:STDOUT: %.loc23_32.3: %Convert.type.5 = interface_witness_access constants.%.16, element0 [template = constants.%Convert.4]
// CHECK:STDOUT: %.loc23_32.4: <bound method> = bound_method %.loc23_26.7, %.loc23_32.3
// CHECK:STDOUT: %.loc23_26.8: %X = bind_value %.loc23_26.7
// CHECK:STDOUT: %Convert.call.loc23_32: init i32 = call %.loc23_32.4(%.loc23_26.8)
+2 -2
View File
@@ -74,7 +74,7 @@ var arr: [i32; 1.(I.F)(2)];
// CHECK:STDOUT: %.loc19_16: i32 = int_literal 1 [template = constants.%.6]
// CHECK:STDOUT: %I.ref: type = name_ref I, %I.decl [template = constants.%.1]
// CHECK:STDOUT: %F.ref: %.3 = name_ref F, @I.%.loc12 [template = constants.%.4]
// CHECK:STDOUT: %.loc19_17.1: %F.type.1 = interface_witness_access @impl.%.loc15_15, element0 [template = constants.%F.2]
// CHECK:STDOUT: %.loc19_17.1: %F.type.1 = interface_witness_access constants.%.5, element0 [template = constants.%F.2]
// CHECK:STDOUT: %.loc19_17.2: <bound method> = bound_method %.loc19_16, %.loc19_17.1 [template = constants.%.7]
// CHECK:STDOUT: %.loc19_24: i32 = int_literal 2 [template = constants.%.8]
// CHECK:STDOUT: %int.sadd: init i32 = call %.loc19_17.2(%.loc19_16, %.loc19_24) [template = constants.%.9]
@@ -114,7 +114,7 @@ var arr: [i32; 1.(I.F)(2)];
// CHECK:STDOUT: witness = (%F.decl)
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl: i32 as %.1 {
// CHECK:STDOUT: impl @impl: %.loc15_6.2 as %I.ref {
// CHECK:STDOUT: %F.decl: %F.type.2 = fn_decl @F.2 [template = constants.%F.2] {
// CHECK:STDOUT: %self.patt: i32 = binding_pattern self
// CHECK:STDOUT: %other.patt: i32 = binding_pattern other
@@ -156,7 +156,7 @@ var arr: [i32; 1 + 2] = (3, 4, 3 + 4);
// CHECK:STDOUT: %.loc10_16: i32 = int_literal 1 [template = constants.%.4]
// CHECK:STDOUT: %.loc10_20: i32 = int_literal 2 [template = constants.%.5]
// CHECK:STDOUT: %Op.ref: %.6 = name_ref Op, imports.%import_ref.4 [template = constants.%.7]
// CHECK:STDOUT: %.loc10_18.1: %Op.type.2 = interface_witness_access @impl.%.loc6_22, element0 [template = constants.%Op.1]
// CHECK:STDOUT: %.loc10_18.1: %Op.type.2 = interface_witness_access constants.%.3, element0 [template = constants.%Op.1]
// CHECK:STDOUT: %.loc10_18.2: <bound method> = bound_method %.loc10_16, %.loc10_18.1 [template = constants.%.8]
// CHECK:STDOUT: %int.sadd: init i32 = call %.loc10_18.2(%.loc10_16, %.loc10_20) [template = constants.%.9]
// CHECK:STDOUT: %.loc10_11.1: type = value_of_initializer %int.make_type_32 [template = i32]
@@ -173,7 +173,7 @@ var arr: [i32; 1 + 2] = (3, 4, 3 + 4);
// CHECK:STDOUT: witness = (imports.%import_ref.5)
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl: i32 as %.2 {
// CHECK:STDOUT: impl @impl: %.loc6_6.2 as %Add.ref {
// CHECK:STDOUT: %Op.decl: %Op.type.1 = fn_decl @Op.1 [template = constants.%Op.1] {
// CHECK:STDOUT: %self.patt: i32 = binding_pattern self
// CHECK:STDOUT: %other.patt: i32 = binding_pattern other
@@ -211,7 +211,7 @@ var arr: [i32; 1 + 2] = (3, 4, 3 + 4);
// CHECK:STDOUT: %.loc10_32: i32 = int_literal 3 [template = constants.%.9]
// CHECK:STDOUT: %.loc10_36: i32 = int_literal 4 [template = constants.%.12]
// CHECK:STDOUT: %Op.ref: %.6 = name_ref Op, imports.%import_ref.4 [template = constants.%.7]
// CHECK:STDOUT: %.loc10_34.1: %Op.type.2 = interface_witness_access @impl.%.loc6_22, element0 [template = constants.%Op.1]
// CHECK:STDOUT: %.loc10_34.1: %Op.type.2 = interface_witness_access constants.%.3, element0 [template = constants.%Op.1]
// CHECK:STDOUT: %.loc10_34.2: <bound method> = bound_method %.loc10_32, %.loc10_34.1 [template = constants.%.13]
// CHECK:STDOUT: %int.sadd: init i32 = call %.loc10_34.2(%.loc10_32, %.loc10_36) [template = constants.%.14]
// CHECK:STDOUT: %.loc10_37.1: %.15 = tuple_literal (%.loc10_26, %.loc10_29, %int.sadd)
+5 -5
View File
@@ -160,7 +160,7 @@ fn InstanceCallIndirect(p: i32*) {
// CHECK:STDOUT: witness = (%F.decl, %G.decl)
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl: i32 as %.1 {
// CHECK:STDOUT: impl @impl: %.loc16_6.2 as %Simple.ref {
// CHECK:STDOUT: %F.decl: %F.type.2 = fn_decl @F.2 [template = constants.%F.2] {} {}
// CHECK:STDOUT: %G.decl: %G.type.2 = fn_decl @G.2 [template = constants.%G.2] {
// CHECK:STDOUT: %self.patt: i32 = binding_pattern self
@@ -201,7 +201,7 @@ fn InstanceCallIndirect(p: i32*) {
// CHECK:STDOUT: %n.ref: i32 = name_ref n, %n
// CHECK:STDOUT: %Simple.ref: type = name_ref Simple, file.%Simple.decl [template = constants.%.1]
// CHECK:STDOUT: %F.ref: %.3 = name_ref F, @Simple.%.loc12 [template = constants.%.4]
// CHECK:STDOUT: %.loc22: %F.type.1 = interface_witness_access @impl.%.loc16_20, element0 [template = constants.%F.2]
// CHECK:STDOUT: %.loc22: %F.type.1 = interface_witness_access constants.%.7, element0 [template = constants.%F.2]
// CHECK:STDOUT: %F.call: init %.2 = call %.loc22()
// CHECK:STDOUT: return
// CHECK:STDOUT: }
@@ -211,7 +211,7 @@ fn InstanceCallIndirect(p: i32*) {
// CHECK:STDOUT: %n.ref: i32 = name_ref n, %n
// CHECK:STDOUT: %Simple.ref: type = name_ref Simple, file.%Simple.decl [template = constants.%.1]
// CHECK:STDOUT: %G.ref: %.5 = name_ref G, @Simple.%.loc13 [template = constants.%.6]
// CHECK:STDOUT: %.loc26_4.1: %G.type.1 = interface_witness_access @impl.%.loc16_20, element1 [template = constants.%G.2]
// CHECK:STDOUT: %.loc26_4.1: %G.type.1 = interface_witness_access constants.%.7, element1 [template = constants.%G.2]
// CHECK:STDOUT: %.loc26_4.2: <bound method> = bound_method %n.ref, %.loc26_4.1
// CHECK:STDOUT: %G.call: init %.2 = call %.loc26_4.2(%n.ref)
// CHECK:STDOUT: return
@@ -223,7 +223,7 @@ fn InstanceCallIndirect(p: i32*) {
// CHECK:STDOUT: %Simple.ref: type = name_ref Simple, file.%Simple.decl [template = constants.%.1]
// CHECK:STDOUT: %F.ref: %.3 = name_ref F, @Simple.%.loc12 [template = constants.%.4]
// CHECK:STDOUT: %.loc30_4.1: ref i32 = deref %p.ref
// CHECK:STDOUT: %.loc30_4.2: %F.type.1 = interface_witness_access @impl.%.loc16_20, element0 [template = constants.%F.2]
// CHECK:STDOUT: %.loc30_4.2: %F.type.1 = interface_witness_access constants.%.7, element0 [template = constants.%F.2]
// CHECK:STDOUT: %F.call: init %.2 = call %.loc30_4.2()
// CHECK:STDOUT: return
// CHECK:STDOUT: }
@@ -234,7 +234,7 @@ fn InstanceCallIndirect(p: i32*) {
// CHECK:STDOUT: %Simple.ref: type = name_ref Simple, file.%Simple.decl [template = constants.%.1]
// CHECK:STDOUT: %G.ref: %.5 = name_ref G, @Simple.%.loc13 [template = constants.%.6]
// CHECK:STDOUT: %.loc34_4.1: ref i32 = deref %p.ref
// CHECK:STDOUT: %.loc34_4.2: %G.type.1 = interface_witness_access @impl.%.loc16_20, element1 [template = constants.%G.2]
// CHECK:STDOUT: %.loc34_4.2: %G.type.1 = interface_witness_access constants.%.7, element1 [template = constants.%G.2]
// CHECK:STDOUT: %.loc34_4.3: <bound method> = bound_method %.loc34_4.1, %.loc34_4.2
// CHECK:STDOUT: %.loc34_4.4: i32 = bind_value %.loc34_4.1
// CHECK:STDOUT: %G.call: init %.2 = call %.loc34_4.3(%.loc34_4.4)
+1 -1
View File
@@ -60,7 +60,7 @@ impl i32 as I;
// CHECK:STDOUT: witness = ()
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl: i32 as %.1;
// CHECK:STDOUT: impl @impl: %.loc13_6.2 as %I.ref;
// CHECK:STDOUT:
// CHECK:STDOUT: fn @Int32() -> type = "int.make_type_32";
// CHECK:STDOUT:
+1 -1
View File
@@ -63,7 +63,7 @@ impl i32 as Empty {
// CHECK:STDOUT: witness = ()
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl: i32 as %.1 {
// CHECK:STDOUT: impl @impl: %.loc14_6.2 as %Empty.ref {
// CHECK:STDOUT: %.loc14_19: <witness> = interface_witness () [template = constants.%.3]
// CHECK:STDOUT:
// CHECK:STDOUT: !members:
+4 -3
View File
@@ -87,7 +87,7 @@ fn G(c: C) {
// CHECK:STDOUT: witness = (%F.decl)
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl: %C as %.1 {
// CHECK:STDOUT: impl @impl: %Self.ref as %HasF.ref {
// CHECK:STDOUT: %F.decl: %F.type.2 = fn_decl @F.2 [template = constants.%F.2] {} {}
// CHECK:STDOUT: %.loc16: <witness> = interface_witness (%F.decl) [template = constants.%.5]
// CHECK:STDOUT:
@@ -98,6 +98,7 @@ fn G(c: C) {
// CHECK:STDOUT:
// CHECK:STDOUT: class @C {
// CHECK:STDOUT: impl_decl @impl [template] {} {
// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%C [template = constants.%C]
// CHECK:STDOUT: %HasF.ref: type = name_ref HasF, file.%HasF.decl [template = constants.%.1]
// CHECK:STDOUT: }
// CHECK:STDOUT: %.loc19: <witness> = complete_type_witness %.6 [template = constants.%.7]
@@ -121,11 +122,11 @@ fn G(c: C) {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %C.ref.loc22: type = name_ref C, file.%C.decl [template = constants.%C]
// CHECK:STDOUT: %F.ref.loc22: %.3 = name_ref F, @HasF.%.loc12 [template = constants.%.4]
// CHECK:STDOUT: %.loc22: %F.type.1 = interface_witness_access @impl.%.loc16, element0 [template = constants.%F.2]
// CHECK:STDOUT: %.loc22: %F.type.1 = interface_witness_access constants.%.5, element0 [template = constants.%F.2]
// CHECK:STDOUT: %F.call.loc22: init %.2 = call %.loc22()
// CHECK:STDOUT: %c.ref: %C = name_ref c, %c
// CHECK:STDOUT: %F.ref.loc23: %.3 = name_ref F, @HasF.%.loc12 [template = constants.%.4]
// CHECK:STDOUT: %.loc23: %F.type.1 = interface_witness_access @impl.%.loc16, element0 [template = constants.%F.2]
// CHECK:STDOUT: %.loc23: %F.type.1 = interface_witness_access constants.%.5, element0 [template = constants.%F.2]
// CHECK:STDOUT: %F.call.loc23: init %.2 = call %.loc23()
// CHECK:STDOUT: return
// CHECK:STDOUT: }
+2 -2
View File
@@ -100,7 +100,7 @@ fn InstanceCall(n: i32) {
// CHECK:STDOUT: witness = (%G.decl)
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl: i32 as %.1 {
// CHECK:STDOUT: impl @impl: %.loc15_6.2 as %Simple.ref {
// CHECK:STDOUT: %G.decl: %G.type.2 = fn_decl @G.2 [template = constants.%G.2] {
// CHECK:STDOUT: %self.patt: <error> = binding_pattern self
// CHECK:STDOUT: } {
@@ -130,7 +130,7 @@ fn InstanceCall(n: i32) {
// CHECK:STDOUT: %n.ref: i32 = name_ref n, %n
// CHECK:STDOUT: %Simple.ref: type = name_ref Simple, file.%Simple.decl [template = constants.%.1]
// CHECK:STDOUT: %G.ref: %.3 = name_ref G, @Simple.%.loc12 [template = constants.%.4]
// CHECK:STDOUT: %.loc23_4.1: %G.type.1 = interface_witness_access @impl.%.loc15_20, element0 [template = <error>]
// CHECK:STDOUT: %.loc23_4.1: %G.type.1 = interface_witness_access <error>, element0 [template = <error>]
// CHECK:STDOUT: %.loc23_4.2: <bound method> = bound_method %n.ref, %.loc23_4.1
// CHECK:STDOUT: return
// CHECK:STDOUT: }
@@ -104,7 +104,7 @@ class C {
// CHECK:STDOUT: %T.1: type = bind_symbolic_name T, 0 [symbolic = %T.1 (constants.%T)]
// CHECK:STDOUT: %.1: type = interface_type @GenericInterface, @GenericInterface(%T.1) [symbolic = %.1 (constants.%.2)]
// CHECK:STDOUT:
// CHECK:STDOUT: impl: %C as %.2 {
// CHECK:STDOUT: impl: %Self.ref as %.loc19_52 {
// CHECK:STDOUT: %F.decl: %F.type.2 = fn_decl @F.2 [template = constants.%F.2] {
// CHECK:STDOUT: %x.patt: @F.2.%T (%T) = binding_pattern x
// CHECK:STDOUT: } {
@@ -126,6 +126,7 @@ class C {
// CHECK:STDOUT: } {
// CHECK:STDOUT: %T.param: type = param T, runtime_param<invalid>
// CHECK:STDOUT: %T.loc19: type = bind_symbolic_name T, 0, %T.param [symbolic = %T.1 (constants.%T)]
// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%C [template = constants.%C]
// CHECK:STDOUT: %GenericInterface.ref: %GenericInterface.type = name_ref GenericInterface, file.%GenericInterface.decl [template = constants.%GenericInterface]
// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc19 [symbolic = %T.1 (constants.%T)]
// CHECK:STDOUT: %.loc19_52: type = interface_type @GenericInterface, @GenericInterface(constants.%T) [symbolic = %.1 (constants.%.2)]
@@ -64,7 +64,7 @@ extend impl i32 as I {}
// CHECK:STDOUT: witness = ()
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl: i32 as %.1 {
// CHECK:STDOUT: impl @impl: %.loc16_13.2 as %I.ref {
// CHECK:STDOUT: %.loc16_22: <witness> = interface_witness () [template = constants.%.3]
// CHECK:STDOUT:
// CHECK:STDOUT: !members:
@@ -93,16 +93,16 @@ class E {
// CHECK:STDOUT: witness = ()
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.1: i32 as %.1 {
// CHECK:STDOUT: impl @impl.1: %.loc18_15.2 as %I.ref {
// CHECK:STDOUT: %.loc18_24: <witness> = interface_witness () [template = constants.%.3]
// CHECK:STDOUT:
// CHECK:STDOUT: !members:
// CHECK:STDOUT: witness = %.loc18_24
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.2: %D as %.1;
// CHECK:STDOUT: impl @impl.2: %D.ref as %I.ref;
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.3: %E as %.1 {
// CHECK:STDOUT: impl @impl.3: %Self.ref as %I.ref {
// CHECK:STDOUT: %.loc39: <witness> = interface_witness () [template = constants.%.3]
// CHECK:STDOUT:
// CHECK:STDOUT: !members:
@@ -50,12 +50,13 @@ class C {
// CHECK:STDOUT: %C.decl: type = class_decl @C [template = constants.%C] {} {}
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl: %C as i32;
// CHECK:STDOUT: impl @impl: %Self.ref as @C.%.loc15_18.2;
// CHECK:STDOUT:
// CHECK:STDOUT: class @C {
// CHECK:STDOUT: %.loc15_18.1: type = value_of_initializer @impl.%int.make_type_32 [template = i32]
// CHECK:STDOUT: %.loc15_18.2: type = converted @impl.%int.make_type_32, %.loc15_18.1 [template = i32]
// CHECK:STDOUT: impl_decl @impl [template] {} {
// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%C [template = constants.%C]
// CHECK:STDOUT: %int.make_type_32: init type = call constants.%Int32() [template = i32]
// CHECK:STDOUT: }
// CHECK:STDOUT: %.loc16: <witness> = complete_type_witness %.2 [template = constants.%.3]
@@ -64,8 +64,10 @@ interface I {
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: generic impl @impl(@I.%Self: %.1) {
// CHECK:STDOUT: %Self: %.1 = bind_symbolic_name Self, 0 [symbolic = %Self (constants.%Self)]
// CHECK:STDOUT: %C: type = class_type @C, @C(%Self) [symbolic = %C (constants.%C.2)]
// CHECK:STDOUT:
// CHECK:STDOUT: impl: %C.2 as %.1;
// CHECK:STDOUT: impl: %Self.ref as %I.ref;
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: generic class @C(@I.%Self: %.1) {
@@ -73,6 +75,7 @@ interface I {
// CHECK:STDOUT:
// CHECK:STDOUT: class {
// CHECK:STDOUT: impl_decl @impl [template] {} {
// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%C.2 [symbolic = %C (constants.%C.2)]
// CHECK:STDOUT: %I.ref: type = name_ref I, file.%I.decl [template = constants.%.1]
// CHECK:STDOUT: }
// CHECK:STDOUT: %.loc20: <witness> = complete_type_witness %.2 [template = constants.%.3]
@@ -85,5 +88,10 @@ interface I {
// CHECK:STDOUT:
// CHECK:STDOUT: specific @C(constants.%Self) {}
// CHECK:STDOUT:
// CHECK:STDOUT: specific @impl(constants.%Self) {}
// CHECK:STDOUT: specific @C(@impl.%Self) {}
// CHECK:STDOUT:
// CHECK:STDOUT: specific @impl(constants.%Self) {
// CHECK:STDOUT: %Self => constants.%Self
// CHECK:STDOUT: %C => constants.%C.2
// CHECK:STDOUT: }
// CHECK:STDOUT:
@@ -55,10 +55,11 @@ class C {
// CHECK:STDOUT:
// CHECK:STDOUT: interface @I;
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl: %C as %.1;
// CHECK:STDOUT: impl @impl: %Self.ref as %I.ref;
// CHECK:STDOUT:
// CHECK:STDOUT: class @C {
// CHECK:STDOUT: impl_decl @impl [template] {} {
// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%C [template = constants.%C]
// CHECK:STDOUT: %I.ref: type = name_ref I, file.%I.decl [template = constants.%.1]
// CHECK:STDOUT: }
// CHECK:STDOUT: %.loc21: <witness> = complete_type_witness %.2 [template = constants.%.3]
+2 -1
View File
@@ -55,6 +55,7 @@ impl as Simple {
// CHECK:STDOUT: %Core.import = import Core
// CHECK:STDOUT: %Simple.decl: type = interface_decl @Simple [template = constants.%.1] {} {}
// CHECK:STDOUT: impl_decl @impl [template] {} {
// CHECK:STDOUT: %Self.ref: type = name_ref Self, <error> [template = <error>]
// CHECK:STDOUT: %Simple.ref: type = name_ref Simple, file.%Simple.decl [template = constants.%.1]
// CHECK:STDOUT: }
// CHECK:STDOUT: }
@@ -70,7 +71,7 @@ impl as Simple {
// CHECK:STDOUT: witness = (%F.decl)
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl: <error> as %.1 {
// CHECK:STDOUT: impl @impl: %Self.ref as %Simple.ref {
// CHECK:STDOUT: %F.decl: %F.type.2 = fn_decl @F.2 [template = constants.%F.2] {} {}
// CHECK:STDOUT: %.loc18: <witness> = interface_witness (%F.decl) [template = constants.%.5]
// CHECK:STDOUT:
@@ -68,7 +68,7 @@ impl bool as I {}
// CHECK:STDOUT: witness = (%T)
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl: bool as %.1 {
// CHECK:STDOUT: impl @impl: %.loc16_6.2 as %I.ref {
// CHECK:STDOUT: !members:
// CHECK:STDOUT: witness = <error>
// CHECK:STDOUT: }
+30 -15
View File
@@ -438,14 +438,14 @@ class SelfNestedBadReturnType {
// CHECK:STDOUT: witness = (%F.decl)
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.1: %NoF as %.1 {
// CHECK:STDOUT: impl @impl.1: %Self.ref as %I.ref {
// CHECK:STDOUT: %.loc21: <witness> = interface_witness (<error>) [template = <error>]
// CHECK:STDOUT:
// CHECK:STDOUT: !members:
// CHECK:STDOUT: witness = %.loc21
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.2: %FNotFunction as %.1 {
// CHECK:STDOUT: impl @impl.2: %Self.ref as %I.ref {
// CHECK:STDOUT: %F.decl: type = class_decl @F.16 [template = constants.%F.2] {} {}
// CHECK:STDOUT: %.loc25: <witness> = interface_witness (<error>) [template = <error>]
// CHECK:STDOUT:
@@ -454,7 +454,7 @@ class SelfNestedBadReturnType {
// CHECK:STDOUT: witness = %.loc25
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.3: %FAlias as %.1 {
// CHECK:STDOUT: impl @impl.3: %Self.ref as %I.ref {
// CHECK:STDOUT: %PossiblyF.ref: %PossiblyF.type = name_ref PossiblyF, file.%PossiblyF.decl [template = constants.%PossiblyF]
// CHECK:STDOUT: %F: %PossiblyF.type = bind_alias F, file.%PossiblyF.decl [template = constants.%PossiblyF]
// CHECK:STDOUT: %.loc41: <witness> = interface_witness (<error>) [template = <error>]
@@ -464,7 +464,7 @@ class SelfNestedBadReturnType {
// CHECK:STDOUT: witness = %.loc41
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.4: %FExtraParam as %.1 {
// CHECK:STDOUT: impl @impl.4: %Self.ref as %I.ref {
// CHECK:STDOUT: %F.decl: %F.type.2 = fn_decl @F.2 [template = constants.%F.3] {
// CHECK:STDOUT: %b.patt: bool = binding_pattern b
// CHECK:STDOUT: } {
@@ -481,7 +481,7 @@ class SelfNestedBadReturnType {
// CHECK:STDOUT: witness = %.loc54
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.5: %FExtraImplicitParam as %.1 {
// CHECK:STDOUT: impl @impl.5: %Self.ref as %I.ref {
// CHECK:STDOUT: %F.decl: %F.type.3 = fn_decl @F.3 [template = constants.%F.4] {
// CHECK:STDOUT: %self.patt: %FExtraImplicitParam = binding_pattern self
// CHECK:STDOUT: } {
@@ -496,7 +496,7 @@ class SelfNestedBadReturnType {
// CHECK:STDOUT: witness = %.loc67
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.6: %FExtraReturnType as %.1 {
// CHECK:STDOUT: impl @impl.6: %Self.ref as %I.ref {
// CHECK:STDOUT: %F.decl: %F.type.4 = fn_decl @F.4 [template = constants.%F.5] {} {
// CHECK:STDOUT: %bool.make_type: init type = call constants.%Bool() [template = bool]
// CHECK:STDOUT: %.loc89_15.1: type = value_of_initializer %bool.make_type [template = bool]
@@ -510,7 +510,7 @@ class SelfNestedBadReturnType {
// CHECK:STDOUT: witness = %.loc81
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.7: %FMissingParam as %.7 {
// CHECK:STDOUT: impl @impl.7: %Self.ref as %J.ref {
// CHECK:STDOUT: %F.decl: %F.type.6 = fn_decl @F.6 [template = constants.%F.7] {
// CHECK:STDOUT: %self.patt: bool = binding_pattern self
// CHECK:STDOUT: } {
@@ -531,7 +531,7 @@ class SelfNestedBadReturnType {
// CHECK:STDOUT: witness = %.loc96
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.8: %FMissingImplicitParam as %.7 {
// CHECK:STDOUT: impl @impl.8: %Self.ref as %J.ref {
// CHECK:STDOUT: %F.decl: %F.type.7 = fn_decl @F.7 [template = constants.%F.8] {
// CHECK:STDOUT: %b.patt: bool = binding_pattern b
// CHECK:STDOUT: } {
@@ -552,7 +552,7 @@ class SelfNestedBadReturnType {
// CHECK:STDOUT: witness = %.loc109
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.9: %FMissingReturnType as %.7 {
// CHECK:STDOUT: impl @impl.9: %Self.ref as %J.ref {
// CHECK:STDOUT: %F.decl: %F.type.8 = fn_decl @F.8 [template = constants.%F.9] {
// CHECK:STDOUT: %self.patt: bool = binding_pattern self
// CHECK:STDOUT: %b.patt: bool = binding_pattern b
@@ -575,7 +575,7 @@ class SelfNestedBadReturnType {
// CHECK:STDOUT: witness = %.loc122
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.10: %FDifferentParamType as %.7 {
// CHECK:STDOUT: impl @impl.10: %Self.ref as %J.ref {
// CHECK:STDOUT: %F.decl: %F.type.9 = fn_decl @F.9 [template = constants.%F.10] {
// CHECK:STDOUT: %self.patt: bool = binding_pattern self
// CHECK:STDOUT: %b.patt: %FDifferentParamType = binding_pattern b
@@ -600,7 +600,7 @@ class SelfNestedBadReturnType {
// CHECK:STDOUT: witness = %.loc135
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.11: %FDifferentImplicitParamType as %.7 {
// CHECK:STDOUT: impl @impl.11: %Self.ref as %J.ref {
// CHECK:STDOUT: %F.decl: %F.type.10 = fn_decl @F.10 [template = constants.%F.11] {
// CHECK:STDOUT: %self.patt: %FDifferentImplicitParamType = binding_pattern self
// CHECK:STDOUT: %b.patt: bool = binding_pattern b
@@ -625,7 +625,7 @@ class SelfNestedBadReturnType {
// CHECK:STDOUT: witness = %.loc148
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.12: %FDifferentReturnType as %.7 {
// CHECK:STDOUT: impl @impl.12: %Self.ref as %J.ref {
// CHECK:STDOUT: %F.decl: %F.type.11 = fn_decl @F.11 [template = constants.%F.12] {
// CHECK:STDOUT: %self.patt: bool = binding_pattern self
// CHECK:STDOUT: %b.patt: bool = binding_pattern b
@@ -650,7 +650,7 @@ class SelfNestedBadReturnType {
// CHECK:STDOUT: witness = %.loc161
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.13: %FDifferentParamName as %.7 {
// CHECK:STDOUT: impl @impl.13: %Self.ref as %J.ref {
// CHECK:STDOUT: %F.decl: %F.type.12 = fn_decl @F.12 [template = constants.%F.13] {
// CHECK:STDOUT: %self.patt: bool = binding_pattern self
// CHECK:STDOUT: %not_b.patt: bool = binding_pattern not_b
@@ -677,7 +677,7 @@ class SelfNestedBadReturnType {
// CHECK:STDOUT: witness = %.loc175
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.14: %SelfNestedBadParam as %.10 {
// CHECK:STDOUT: impl @impl.14: %Self.ref as %SelfNested.ref {
// CHECK:STDOUT: %F.decl: %F.type.14 = fn_decl @F.14 [template = constants.%F.15] {
// CHECK:STDOUT: %x.patt: %.21 = binding_pattern x
// CHECK:STDOUT: } {
@@ -706,7 +706,7 @@ class SelfNestedBadReturnType {
// CHECK:STDOUT: witness = %.loc192
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.15: %SelfNestedBadReturnType as %.10 {
// CHECK:STDOUT: impl @impl.15: %Self.ref as %SelfNested.ref {
// CHECK:STDOUT: %F.decl: %F.type.15 = fn_decl @F.15 [template = constants.%F.16] {
// CHECK:STDOUT: %x.patt: %.27 = binding_pattern x
// CHECK:STDOUT: } {
@@ -735,6 +735,7 @@ class SelfNestedBadReturnType {
// CHECK:STDOUT:
// CHECK:STDOUT: class @NoF {
// CHECK:STDOUT: impl_decl @impl.1 [template] {} {
// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%NoF [template = constants.%NoF]
// CHECK:STDOUT: %I.ref: type = name_ref I, file.%I.decl [template = constants.%.1]
// CHECK:STDOUT: }
// CHECK:STDOUT: %.loc22: <witness> = complete_type_witness %.5 [template = constants.%.6]
@@ -745,6 +746,7 @@ class SelfNestedBadReturnType {
// CHECK:STDOUT:
// CHECK:STDOUT: class @FNotFunction {
// CHECK:STDOUT: impl_decl @impl.2 [template] {} {
// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%FNotFunction [template = constants.%FNotFunction]
// CHECK:STDOUT: %I.ref: type = name_ref I, file.%I.decl [template = constants.%.1]
// CHECK:STDOUT: }
// CHECK:STDOUT: %.loc35: <witness> = complete_type_witness %.5 [template = constants.%.6]
@@ -757,6 +759,7 @@ class SelfNestedBadReturnType {
// CHECK:STDOUT:
// CHECK:STDOUT: class @FAlias {
// CHECK:STDOUT: impl_decl @impl.3 [template] {} {
// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%FAlias [template = constants.%FAlias]
// CHECK:STDOUT: %I.ref: type = name_ref I, file.%I.decl [template = constants.%.1]
// CHECK:STDOUT: }
// CHECK:STDOUT: %.loc51: <witness> = complete_type_witness %.5 [template = constants.%.6]
@@ -767,6 +770,7 @@ class SelfNestedBadReturnType {
// CHECK:STDOUT:
// CHECK:STDOUT: class @FExtraParam {
// CHECK:STDOUT: impl_decl @impl.4 [template] {} {
// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%FExtraParam [template = constants.%FExtraParam]
// CHECK:STDOUT: %I.ref: type = name_ref I, file.%I.decl [template = constants.%.1]
// CHECK:STDOUT: }
// CHECK:STDOUT: %.loc64: <witness> = complete_type_witness %.5 [template = constants.%.6]
@@ -777,6 +781,7 @@ class SelfNestedBadReturnType {
// CHECK:STDOUT:
// CHECK:STDOUT: class @FExtraImplicitParam {
// CHECK:STDOUT: impl_decl @impl.5 [template] {} {
// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%FExtraImplicitParam [template = constants.%FExtraImplicitParam]
// CHECK:STDOUT: %I.ref: type = name_ref I, file.%I.decl [template = constants.%.1]
// CHECK:STDOUT: }
// CHECK:STDOUT: %.loc77: <witness> = complete_type_witness %.5 [template = constants.%.6]
@@ -787,6 +792,7 @@ class SelfNestedBadReturnType {
// CHECK:STDOUT:
// CHECK:STDOUT: class @FExtraReturnType {
// CHECK:STDOUT: impl_decl @impl.6 [template] {} {
// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%FExtraReturnType [template = constants.%FExtraReturnType]
// CHECK:STDOUT: %I.ref: type = name_ref I, file.%I.decl [template = constants.%.1]
// CHECK:STDOUT: }
// CHECK:STDOUT: %.loc91: <witness> = complete_type_witness %.5 [template = constants.%.6]
@@ -797,6 +803,7 @@ class SelfNestedBadReturnType {
// CHECK:STDOUT:
// CHECK:STDOUT: class @FMissingParam {
// CHECK:STDOUT: impl_decl @impl.7 [template] {} {
// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%FMissingParam [template = constants.%FMissingParam]
// CHECK:STDOUT: %J.ref: type = name_ref J, file.%J.decl [template = constants.%.7]
// CHECK:STDOUT: }
// CHECK:STDOUT: %.loc106: <witness> = complete_type_witness %.5 [template = constants.%.6]
@@ -807,6 +814,7 @@ class SelfNestedBadReturnType {
// CHECK:STDOUT:
// CHECK:STDOUT: class @FMissingImplicitParam {
// CHECK:STDOUT: impl_decl @impl.8 [template] {} {
// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%FMissingImplicitParam [template = constants.%FMissingImplicitParam]
// CHECK:STDOUT: %J.ref: type = name_ref J, file.%J.decl [template = constants.%.7]
// CHECK:STDOUT: }
// CHECK:STDOUT: %.loc119: <witness> = complete_type_witness %.5 [template = constants.%.6]
@@ -817,6 +825,7 @@ class SelfNestedBadReturnType {
// CHECK:STDOUT:
// CHECK:STDOUT: class @FMissingReturnType {
// CHECK:STDOUT: impl_decl @impl.9 [template] {} {
// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%FMissingReturnType [template = constants.%FMissingReturnType]
// CHECK:STDOUT: %J.ref: type = name_ref J, file.%J.decl [template = constants.%.7]
// CHECK:STDOUT: }
// CHECK:STDOUT: %.loc132: <witness> = complete_type_witness %.5 [template = constants.%.6]
@@ -827,6 +836,7 @@ class SelfNestedBadReturnType {
// CHECK:STDOUT:
// CHECK:STDOUT: class @FDifferentParamType {
// CHECK:STDOUT: impl_decl @impl.10 [template] {} {
// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%FDifferentParamType [template = constants.%FDifferentParamType]
// CHECK:STDOUT: %J.ref: type = name_ref J, file.%J.decl [template = constants.%.7]
// CHECK:STDOUT: }
// CHECK:STDOUT: %.loc145: <witness> = complete_type_witness %.5 [template = constants.%.6]
@@ -837,6 +847,7 @@ class SelfNestedBadReturnType {
// CHECK:STDOUT:
// CHECK:STDOUT: class @FDifferentImplicitParamType {
// CHECK:STDOUT: impl_decl @impl.11 [template] {} {
// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%FDifferentImplicitParamType [template = constants.%FDifferentImplicitParamType]
// CHECK:STDOUT: %J.ref: type = name_ref J, file.%J.decl [template = constants.%.7]
// CHECK:STDOUT: }
// CHECK:STDOUT: %.loc158: <witness> = complete_type_witness %.5 [template = constants.%.6]
@@ -847,6 +858,7 @@ class SelfNestedBadReturnType {
// CHECK:STDOUT:
// CHECK:STDOUT: class @FDifferentReturnType {
// CHECK:STDOUT: impl_decl @impl.12 [template] {} {
// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%FDifferentReturnType [template = constants.%FDifferentReturnType]
// CHECK:STDOUT: %J.ref: type = name_ref J, file.%J.decl [template = constants.%.7]
// CHECK:STDOUT: }
// CHECK:STDOUT: %.loc171: <witness> = complete_type_witness %.5 [template = constants.%.6]
@@ -857,6 +869,7 @@ class SelfNestedBadReturnType {
// CHECK:STDOUT:
// CHECK:STDOUT: class @FDifferentParamName {
// CHECK:STDOUT: impl_decl @impl.13 [template] {} {
// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%FDifferentParamName [template = constants.%FDifferentParamName]
// CHECK:STDOUT: %J.ref: type = name_ref J, file.%J.decl [template = constants.%.7]
// CHECK:STDOUT: }
// CHECK:STDOUT: %.loc185: <witness> = complete_type_witness %.5 [template = constants.%.6]
@@ -867,6 +880,7 @@ class SelfNestedBadReturnType {
// CHECK:STDOUT:
// CHECK:STDOUT: class @SelfNestedBadParam {
// CHECK:STDOUT: impl_decl @impl.14 [template] {} {
// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%SelfNestedBadParam [template = constants.%SelfNestedBadParam]
// CHECK:STDOUT: %SelfNested.ref: type = name_ref SelfNested, file.%SelfNested.decl [template = constants.%.10]
// CHECK:STDOUT: }
// CHECK:STDOUT: %.loc202: <witness> = complete_type_witness %.5 [template = constants.%.6]
@@ -877,6 +891,7 @@ class SelfNestedBadReturnType {
// CHECK:STDOUT:
// CHECK:STDOUT: class @SelfNestedBadReturnType {
// CHECK:STDOUT: impl_decl @impl.15 [template] {} {
// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%SelfNestedBadReturnType [template = constants.%SelfNestedBadReturnType]
// CHECK:STDOUT: %SelfNested.ref: type = name_ref SelfNested, file.%SelfNested.decl [template = constants.%.10]
// CHECK:STDOUT: }
// CHECK:STDOUT: %.loc214: <witness> = complete_type_witness %.5 [template = constants.%.6]
@@ -103,7 +103,7 @@ impl i32 as false {}
// CHECK:STDOUT: }
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl: i32 as <error> {
// CHECK:STDOUT: impl @impl: %.loc21_6.2 as <error> {
// CHECK:STDOUT: !members:
// CHECK:STDOUT: witness = <error>
// CHECK:STDOUT: }
+1 -1
View File
@@ -75,7 +75,7 @@ impl i32 as I {}
// CHECK:STDOUT: witness = ()
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl: i32 as %.1 {
// CHECK:STDOUT: impl @impl: %.loc13_6.2 as %I.ref.loc13 {
// CHECK:STDOUT: !members:
// CHECK:STDOUT: witness = <unexpected>.inst+18.loc13_15
// CHECK:STDOUT: }
@@ -76,7 +76,7 @@ impl bool as I where .T = bool {}
// CHECK:STDOUT: witness = (%T)
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl: bool as %.1 {
// CHECK:STDOUT: impl @impl: %.loc16_6.2 as %.loc16_16 {
// CHECK:STDOUT: !members:
// CHECK:STDOUT: witness = <error>
// CHECK:STDOUT: }
+2 -1
View File
@@ -76,7 +76,7 @@ class C {
// CHECK:STDOUT: witness = (%F.decl)
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl: %C as %.1 {
// CHECK:STDOUT: impl @impl: %Self.ref as %Simple.ref {
// CHECK:STDOUT: %F.decl: %F.type.2 = fn_decl @F.2 [template = constants.%F.2] {} {}
// CHECK:STDOUT: %.loc16: <witness> = interface_witness (%F.decl) [template = constants.%.5]
// CHECK:STDOUT:
@@ -87,6 +87,7 @@ class C {
// CHECK:STDOUT:
// CHECK:STDOUT: class @C {
// CHECK:STDOUT: impl_decl @impl [template] {} {
// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%C [template = constants.%C]
// CHECK:STDOUT: %Simple.ref: type = name_ref Simple, file.%Simple.decl [template = constants.%.1]
// CHECK:STDOUT: }
// CHECK:STDOUT: %.loc22: <witness> = complete_type_witness %.6 [template = constants.%.7]
+1 -1
View File
@@ -76,7 +76,7 @@ impl forall [T:! type] T as Simple {
// CHECK:STDOUT: generic impl @impl(%T.loc15: type) {
// CHECK:STDOUT: %T.1: type = bind_symbolic_name T, 0 [symbolic = %T.1 (constants.%T)]
// CHECK:STDOUT:
// CHECK:STDOUT: impl: %T as %.1 {
// CHECK:STDOUT: impl: %T.ref as %Simple.ref {
// CHECK:STDOUT: %F.decl: %F.type.2 = fn_decl @F.2 [template = constants.%F.2] {} {}
// CHECK:STDOUT: %.loc15: <witness> = interface_witness (%F.decl) [template = constants.%.5]
// CHECK:STDOUT:
+3 -3
View File
@@ -93,7 +93,7 @@ fn G(c: C) {
// CHECK:STDOUT: witness = (%F.decl)
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl: %C as %.1 {
// CHECK:STDOUT: impl @impl: %C.ref as %HasF.ref {
// CHECK:STDOUT: %F.decl: %F.type.2 = fn_decl @F.2 [template = constants.%F.2] {} {}
// CHECK:STDOUT: %.loc19: <witness> = interface_witness (%F.decl) [template = constants.%.7]
// CHECK:STDOUT:
@@ -127,11 +127,11 @@ fn G(c: C) {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %C.ref.loc24: type = name_ref C, file.%C.decl [template = constants.%C]
// CHECK:STDOUT: %G.ref.loc24: %.3 = name_ref G, @C.%G [template = constants.%.4]
// CHECK:STDOUT: %.loc24: %F.type.1 = interface_witness_access @impl.%.loc19, element0 [template = constants.%F.2]
// CHECK:STDOUT: %.loc24: %F.type.1 = interface_witness_access constants.%.7, element0 [template = constants.%F.2]
// CHECK:STDOUT: %F.call.loc24: init %.2 = call %.loc24()
// CHECK:STDOUT: %c.ref: %C = name_ref c, %c
// CHECK:STDOUT: %G.ref.loc25: %.3 = name_ref G, @C.%G [template = constants.%.4]
// CHECK:STDOUT: %.loc25: %F.type.1 = interface_witness_access @impl.%.loc19, element0 [template = constants.%F.2]
// CHECK:STDOUT: %.loc25: %F.type.1 = interface_witness_access constants.%.7, element0 [template = constants.%F.2]
// CHECK:STDOUT: %F.call.loc25: init %.2 = call %.loc25()
// CHECK:STDOUT: return
// CHECK:STDOUT: }
@@ -99,9 +99,9 @@ impl C as I {
// CHECK:STDOUT: witness = (%F.decl)
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.1: %C as %.1;
// CHECK:STDOUT: impl @impl.1: %Self.ref as %I.ref;
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.2: %C as %.1 {
// CHECK:STDOUT: impl @impl.2: %C.ref as %I.ref {
// CHECK:STDOUT: %F.decl: %F.type.3 = fn_decl @F.3 [template = constants.%F.3] {} {}
// CHECK:STDOUT: %.loc27: <witness> = interface_witness (%F.decl) [template = constants.%.8]
// CHECK:STDOUT:
@@ -112,6 +112,7 @@ impl C as I {
// CHECK:STDOUT:
// CHECK:STDOUT: class @C {
// CHECK:STDOUT: impl_decl @impl.1 [template] {} {
// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%C [template = constants.%C]
// CHECK:STDOUT: %I.ref: type = name_ref I, file.%I.decl [template = constants.%.1]
// CHECK:STDOUT: }
// CHECK:STDOUT: %.loc17: <witness> = complete_type_witness %.5 [template = constants.%.6]
+15 -13
View File
@@ -87,7 +87,7 @@ fn G(c: Impl.C) {
// CHECK:STDOUT: witness = (%F.decl)
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl: %C as %.1 {
// CHECK:STDOUT: impl @impl: %C.ref as %HasF.ref {
// CHECK:STDOUT: %F.decl: %F.type.2 = fn_decl @F.2 [template = constants.%F.2] {} {}
// CHECK:STDOUT: %.loc10: <witness> = interface_witness (%F.decl) [template = constants.%.7]
// CHECK:STDOUT:
@@ -132,7 +132,7 @@ fn G(c: Impl.C) {
// CHECK:STDOUT: %F.type.1: type = fn_type @F.1 [template]
// CHECK:STDOUT: %F.1: %F.type.1 = struct_value () [template]
// CHECK:STDOUT: %.6: type = assoc_entity_type %.1, %F.type.1 [template]
// CHECK:STDOUT: %.7: %.6 = assoc_entity element0, imports.%import_ref.8 [template]
// CHECK:STDOUT: %.7: %.6 = assoc_entity element0, imports.%import_ref.10 [template]
// CHECK:STDOUT: %F.type.2: type = fn_type @F.2 [template]
// CHECK:STDOUT: %F.2: %F.type.2 = struct_value () [template]
// CHECK:STDOUT: %.8: <witness> = interface_witness (%F.2) [template]
@@ -150,18 +150,20 @@ fn G(c: Impl.C) {
// CHECK:STDOUT: import Core//prelude/types/bool
// CHECK:STDOUT: }
// CHECK:STDOUT: %Impl: <namespace> = namespace file.%Impl.import, [template] {
// CHECK:STDOUT: .C = %import_ref.6
// CHECK:STDOUT: .HasF = %import_ref.7
// CHECK:STDOUT: .C = %import_ref.8
// CHECK:STDOUT: .HasF = %import_ref.9
// CHECK:STDOUT: import Impl//default
// CHECK:STDOUT: }
// CHECK:STDOUT: %import_ref.1 = import_ref Impl//default, inst+5, unloaded
// CHECK:STDOUT: %import_ref.2: %.6 = import_ref Impl//default, inst+12, loaded [template = constants.%.7]
// CHECK:STDOUT: %import_ref.3 = import_ref Impl//default, inst+7, unloaded
// CHECK:STDOUT: %import_ref.4 = import_ref Impl//default, inst+15, unloaded
// CHECK:STDOUT: %import_ref.5: <witness> = import_ref Impl//default, inst+25, loaded [template = constants.%.8]
// CHECK:STDOUT: %import_ref.6: type = import_ref Impl//default, inst+14, loaded [template = constants.%C]
// CHECK:STDOUT: %import_ref.7: type = import_ref Impl//default, inst+3, loaded [template = constants.%.1]
// CHECK:STDOUT: %import_ref.8 = import_ref Impl//default, inst+7, unloaded
// CHECK:STDOUT: %import_ref.5: type = import_ref Impl//default, inst+19, loaded [template = constants.%C]
// CHECK:STDOUT: %import_ref.6: type = import_ref Impl//default, inst+20, loaded [template = constants.%.1]
// CHECK:STDOUT: %import_ref.7: <witness> = import_ref Impl//default, inst+25, loaded [template = constants.%.8]
// CHECK:STDOUT: %import_ref.8: type = import_ref Impl//default, inst+14, loaded [template = constants.%C]
// CHECK:STDOUT: %import_ref.9: type = import_ref Impl//default, inst+3, loaded [template = constants.%.1]
// CHECK:STDOUT: %import_ref.10 = import_ref Impl//default, inst+7, unloaded
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: file {
@@ -176,7 +178,7 @@ fn G(c: Impl.C) {
// CHECK:STDOUT: %c.patt: %C = binding_pattern c
// CHECK:STDOUT: } {
// CHECK:STDOUT: %Impl.ref.loc4: <namespace> = name_ref Impl, imports.%Impl [template = imports.%Impl]
// CHECK:STDOUT: %C.ref: type = name_ref C, imports.%import_ref.6 [template = constants.%C]
// CHECK:STDOUT: %C.ref: type = name_ref C, imports.%import_ref.8 [template = constants.%C]
// CHECK:STDOUT: %c.param: %C = param c, runtime_param0
// CHECK:STDOUT: %c: %C = bind_name c, %c.param
// CHECK:STDOUT: }
@@ -189,9 +191,9 @@ fn G(c: Impl.C) {
// CHECK:STDOUT: witness = (imports.%import_ref.3)
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl: %C as %.1 {
// CHECK:STDOUT: impl @impl: imports.%import_ref.5 as imports.%import_ref.6 {
// CHECK:STDOUT: !members:
// CHECK:STDOUT: witness = imports.%import_ref.5
// CHECK:STDOUT: witness = imports.%import_ref.7
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: class @C {
@@ -203,9 +205,9 @@ fn G(c: Impl.C) {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %c.ref: %C = name_ref c, %c
// CHECK:STDOUT: %Impl.ref.loc5: <namespace> = name_ref Impl, imports.%Impl [template = imports.%Impl]
// CHECK:STDOUT: %HasF.ref: type = name_ref HasF, imports.%import_ref.7 [template = constants.%.1]
// CHECK:STDOUT: %HasF.ref: type = name_ref HasF, imports.%import_ref.9 [template = constants.%.1]
// CHECK:STDOUT: %F.ref: %.6 = name_ref F, imports.%import_ref.2 [template = constants.%.7]
// CHECK:STDOUT: %.loc5: %F.type.1 = interface_witness_access imports.%import_ref.5, element0 [template = constants.%F.2]
// CHECK:STDOUT: %.loc5: %F.type.1 = interface_witness_access constants.%.8, element0 [template = constants.%F.2]
// CHECK:STDOUT: %F.call: init %.4 = call %.loc5()
// CHECK:STDOUT: return
// CHECK:STDOUT: }
@@ -109,7 +109,7 @@ fn F(c: C) -> i32 {
// CHECK:STDOUT: witness = (%F.decl)
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl: %C as %.1 {
// CHECK:STDOUT: impl @impl: %Self.ref as %I.ref {
// CHECK:STDOUT: %F.decl: %F.type.2 = fn_decl @F.2 [template = constants.%F.2] {
// CHECK:STDOUT: %self.patt: %C = binding_pattern self
// CHECK:STDOUT: } {
@@ -130,6 +130,7 @@ fn F(c: C) -> i32 {
// CHECK:STDOUT:
// CHECK:STDOUT: class @C {
// CHECK:STDOUT: impl_decl @impl [template] {} {
// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%C [template = constants.%C]
// CHECK:STDOUT: %I.ref: type = name_ref I, file.%I.decl [template = constants.%.1]
// CHECK:STDOUT: }
// CHECK:STDOUT: %.loc21: <witness> = complete_type_witness %.6 [template = constants.%.7]
@@ -153,7 +154,7 @@ fn F(c: C) -> i32 {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %c.ref: %C = name_ref c, %c
// CHECK:STDOUT: %F.ref: %.3 = name_ref F, @I.%.loc14 [template = constants.%.4]
// CHECK:STDOUT: %.loc24_11.1: %F.type.1 = interface_witness_access @impl.%.loc18, element0 [template = constants.%F.2]
// CHECK:STDOUT: %.loc24_11.1: %F.type.1 = interface_witness_access constants.%.5, element0 [template = constants.%F.2]
// CHECK:STDOUT: %.loc24_11.2: <bound method> = bound_method %c.ref, %.loc24_11.1
// CHECK:STDOUT: %F.call: init i32 = call %.loc24_11.2(%c.ref)
// CHECK:STDOUT: %.loc24_15.1: i32 = value_of_initializer %F.call
@@ -201,7 +201,7 @@ fn TestSpecific(a: A({})) -> {} {
// CHECK:STDOUT: %A.1: type = class_type @A, @A(%V.1) [symbolic = %A.1 (constants.%A.3)]
// CHECK:STDOUT: %.1: type = interface_type @I, @I(%V.1) [symbolic = %.1 (constants.%.8)]
// CHECK:STDOUT:
// CHECK:STDOUT: impl: %A.3 as %.8 {
// CHECK:STDOUT: impl: %A.loc10 as %.loc10_33 {
// CHECK:STDOUT: %F.decl: %F.type.2 = fn_decl @F.2 [template = constants.%F.2] {
// CHECK:STDOUT: %self.patt: @F.2.%A (%A.3) = binding_pattern self
// CHECK:STDOUT: } {
+15 -13
View File
@@ -72,7 +72,7 @@ fn G(c: Impl.C) {
// CHECK:STDOUT: witness = (%F.decl)
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl: %C as %.1 {
// CHECK:STDOUT: impl @impl: %C.ref as %HasF.ref {
// CHECK:STDOUT: %F.decl: %F.type.2 = fn_decl @F.2 [template = constants.%F.2] {} {}
// CHECK:STDOUT: %.loc10: <witness> = interface_witness (%F.decl) [template = constants.%.7]
// CHECK:STDOUT:
@@ -117,7 +117,7 @@ fn G(c: Impl.C) {
// CHECK:STDOUT: %F.type.1: type = fn_type @F.1 [template]
// CHECK:STDOUT: %F.1: %F.type.1 = struct_value () [template]
// CHECK:STDOUT: %.6: type = assoc_entity_type %.1, %F.type.1 [template]
// CHECK:STDOUT: %.7: %.6 = assoc_entity element0, imports.%import_ref.8 [template]
// CHECK:STDOUT: %.7: %.6 = assoc_entity element0, imports.%import_ref.10 [template]
// CHECK:STDOUT: %F.type.2: type = fn_type @F.2 [template]
// CHECK:STDOUT: %F.2: %F.type.2 = struct_value () [template]
// CHECK:STDOUT: %.8: <witness> = interface_witness (%F.2) [template]
@@ -125,18 +125,20 @@ fn G(c: Impl.C) {
// CHECK:STDOUT:
// CHECK:STDOUT: imports {
// CHECK:STDOUT: %Impl: <namespace> = namespace file.%Impl.import, [template] {
// CHECK:STDOUT: .C = %import_ref.6
// CHECK:STDOUT: .HasF = %import_ref.7
// CHECK:STDOUT: .C = %import_ref.8
// CHECK:STDOUT: .HasF = %import_ref.9
// CHECK:STDOUT: import Impl//default
// CHECK:STDOUT: }
// CHECK:STDOUT: %import_ref.1 = import_ref Impl//default, inst+3, unloaded
// CHECK:STDOUT: %import_ref.2: %.6 = import_ref Impl//default, inst+10, loaded [template = constants.%.7]
// CHECK:STDOUT: %import_ref.3 = import_ref Impl//default, inst+5, unloaded
// CHECK:STDOUT: %import_ref.4 = import_ref Impl//default, inst+13, unloaded
// CHECK:STDOUT: %import_ref.5: <witness> = import_ref Impl//default, inst+23, loaded [template = constants.%.8]
// CHECK:STDOUT: %import_ref.6: type = import_ref Impl//default, inst+12, loaded [template = constants.%C]
// CHECK:STDOUT: %import_ref.7: type = import_ref Impl//default, inst+1, loaded [template = constants.%.1]
// CHECK:STDOUT: %import_ref.8 = import_ref Impl//default, inst+5, unloaded
// CHECK:STDOUT: %import_ref.5: type = import_ref Impl//default, inst+17, loaded [template = constants.%C]
// CHECK:STDOUT: %import_ref.6: type = import_ref Impl//default, inst+18, loaded [template = constants.%.1]
// CHECK:STDOUT: %import_ref.7: <witness> = import_ref Impl//default, inst+23, loaded [template = constants.%.8]
// CHECK:STDOUT: %import_ref.8: type = import_ref Impl//default, inst+12, loaded [template = constants.%C]
// CHECK:STDOUT: %import_ref.9: type = import_ref Impl//default, inst+1, loaded [template = constants.%.1]
// CHECK:STDOUT: %import_ref.10 = import_ref Impl//default, inst+5, unloaded
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: file {
@@ -149,7 +151,7 @@ fn G(c: Impl.C) {
// CHECK:STDOUT: %c.patt: %C = binding_pattern c
// CHECK:STDOUT: } {
// CHECK:STDOUT: %Impl.ref.loc4: <namespace> = name_ref Impl, imports.%Impl [template = imports.%Impl]
// CHECK:STDOUT: %C.ref: type = name_ref C, imports.%import_ref.6 [template = constants.%C]
// CHECK:STDOUT: %C.ref: type = name_ref C, imports.%import_ref.8 [template = constants.%C]
// CHECK:STDOUT: %c.param: %C = param c, runtime_param0
// CHECK:STDOUT: %c: %C = bind_name c, %c.param
// CHECK:STDOUT: }
@@ -162,9 +164,9 @@ fn G(c: Impl.C) {
// CHECK:STDOUT: witness = (imports.%import_ref.3)
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl: %C as %.1 {
// CHECK:STDOUT: impl @impl: imports.%import_ref.5 as imports.%import_ref.6 {
// CHECK:STDOUT: !members:
// CHECK:STDOUT: witness = imports.%import_ref.5
// CHECK:STDOUT: witness = imports.%import_ref.7
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: class @C {
@@ -176,9 +178,9 @@ fn G(c: Impl.C) {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %c.ref: %C = name_ref c, %c
// CHECK:STDOUT: %Impl.ref.loc5: <namespace> = name_ref Impl, imports.%Impl [template = imports.%Impl]
// CHECK:STDOUT: %HasF.ref: type = name_ref HasF, imports.%import_ref.7 [template = constants.%.1]
// CHECK:STDOUT: %HasF.ref: type = name_ref HasF, imports.%import_ref.9 [template = constants.%.1]
// CHECK:STDOUT: %F.ref: %.6 = name_ref F, imports.%import_ref.2 [template = constants.%.7]
// CHECK:STDOUT: %.loc5: %F.type.1 = interface_witness_access imports.%import_ref.5, element0 [template = constants.%F.2]
// CHECK:STDOUT: %.loc5: %F.type.1 = interface_witness_access constants.%.8, element0 [template = constants.%F.2]
// CHECK:STDOUT: %F.call: init %.4 = call %.loc5()
// CHECK:STDOUT: return
// CHECK:STDOUT: }
+1 -1
View File
@@ -60,7 +60,7 @@ impl C as Simple {
// CHECK:STDOUT: witness = (%F.decl)
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl: %C as %.1 {
// CHECK:STDOUT: impl @impl: %C.ref as %Simple.ref {
// CHECK:STDOUT: %F.decl: %F.type.2 = fn_decl @F.2 [template = constants.%F.2] {} {}
// CHECK:STDOUT: %.loc17: <witness> = interface_witness (%F.decl) [template = constants.%.7]
// CHECK:STDOUT:
@@ -0,0 +1,81 @@
// 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/impl/no_prelude/fail_alias.carbon
// TIP: To dump output, run:
// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/impl/no_prelude/fail_alias.carbon
interface I {}
class C {}
alias AI = I;
alias AC = C;
impl AC as AI {}
// CHECK:STDERR: fail_alias.carbon:[[@LINE+6]]:1: error: redefinition of `impl AC as AI`
// CHECK:STDERR: impl AC as AI {}
// CHECK:STDERR: ^~~~~~~~~~~~~~~
// CHECK:STDERR: fail_alias.carbon:[[@LINE-5]]:1: note: previous definition was here
// CHECK:STDERR: impl AC as AI {}
// CHECK:STDERR: ^~~~~~~~~~~~~~~
impl AC as AI {}
// CHECK:STDOUT: --- fail_alias.carbon
// CHECK:STDOUT:
// CHECK:STDOUT: constants {
// CHECK:STDOUT: %.1: type = interface_type @I [template]
// CHECK:STDOUT: %Self: %.1 = bind_symbolic_name Self, 0 [symbolic]
// CHECK:STDOUT: %C: type = class_type @C [template]
// CHECK:STDOUT: %.2: type = struct_type {} [template]
// CHECK:STDOUT: %.3: <witness> = complete_type_witness %.2 [template]
// CHECK:STDOUT: %.4: type = tuple_type () [template]
// CHECK:STDOUT: %.5: <witness> = interface_witness () [template]
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: file {
// CHECK:STDOUT: package: <namespace> = namespace [template] {
// CHECK:STDOUT: .I = %I.decl
// CHECK:STDOUT: .C = %C.decl
// CHECK:STDOUT: .AI = %AI
// CHECK:STDOUT: .AC = %AC
// CHECK:STDOUT: }
// CHECK:STDOUT: %I.decl: type = interface_decl @I [template = constants.%.1] {} {}
// CHECK:STDOUT: %C.decl: type = class_decl @C [template = constants.%C] {} {}
// CHECK:STDOUT: %I.ref: type = name_ref I, %I.decl [template = constants.%.1]
// CHECK:STDOUT: %AI: type = bind_alias AI, %I.decl [template = constants.%.1]
// CHECK:STDOUT: %C.ref: type = name_ref C, %C.decl [template = constants.%C]
// CHECK:STDOUT: %AC: type = bind_alias AC, %C.decl [template = constants.%C]
// CHECK:STDOUT: impl_decl @impl [template] {} {
// CHECK:STDOUT: %AC.ref.loc17: type = name_ref AC, file.%AC [template = constants.%C]
// CHECK:STDOUT: %AI.ref.loc17: type = name_ref AI, file.%AI [template = constants.%.1]
// CHECK:STDOUT: }
// CHECK:STDOUT: impl_decl @impl [template] {} {
// CHECK:STDOUT: %AC.ref.loc25: type = name_ref AC, file.%AC [template = constants.%C]
// CHECK:STDOUT: %AI.ref.loc25: type = name_ref AI, file.%AI [template = constants.%.1]
// CHECK:STDOUT: }
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: interface @I {
// CHECK:STDOUT: %Self: %.1 = bind_symbolic_name Self, 0 [symbolic = constants.%Self]
// CHECK:STDOUT:
// CHECK:STDOUT: !members:
// CHECK:STDOUT: .Self = %Self
// CHECK:STDOUT: witness = ()
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl: %AC.ref.loc17 as %AI.ref.loc17 {
// CHECK:STDOUT: !members:
// CHECK:STDOUT: witness = <unexpected>.inst+18.loc17_15
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: class @C {
// CHECK:STDOUT: %.loc12: <witness> = complete_type_witness %.2 [template = constants.%.3]
// CHECK:STDOUT:
// CHECK:STDOUT: !members:
// CHECK:STDOUT: .Self = constants.%C
// CHECK:STDOUT: }
// CHECK:STDOUT:
@@ -45,7 +45,7 @@ impl true as I {}
// CHECK:STDOUT: witness = ()
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl: <error> as %.1 {
// CHECK:STDOUT: impl @impl: <error> as %I.ref {
// CHECK:STDOUT: %.loc16_16: <witness> = interface_witness () [template = constants.%.4]
// CHECK:STDOUT:
// CHECK:STDOUT: !members:
@@ -230,31 +230,31 @@ impl (C, C).0 as I {}
// CHECK:STDOUT: generic impl @impl.1(%T.loc11: %.2) {
// CHECK:STDOUT: %T.1: %.2 = bind_symbolic_name T, 0 [symbolic = %T.1 (constants.%T.1)]
// CHECK:STDOUT:
// CHECK:STDOUT: impl: %T.1 as %.1;
// CHECK:STDOUT: impl: %.loc11_21.2 as %Interface.ref;
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: generic impl @impl.2(%T.loc12: %.3) {
// CHECK:STDOUT: %T.1: %.3 = bind_symbolic_name T, 0 [symbolic = %T.1 (constants.%T.2)]
// CHECK:STDOUT:
// CHECK:STDOUT: impl: %T.2 as %.1;
// CHECK:STDOUT: impl: %.loc12_21.2 as %Interface.ref;
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: generic impl @impl.3(%T.loc13: %.4) {
// CHECK:STDOUT: %T.1: %.4 = bind_symbolic_name T, 0 [symbolic = %T.1 (constants.%T.3)]
// CHECK:STDOUT:
// CHECK:STDOUT: impl: %T.3 as %.1;
// CHECK:STDOUT: impl: %.loc13_21.2 as %Interface.ref;
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: generic impl @impl.4(%T.loc14: %.5) {
// CHECK:STDOUT: %T.1: %.5 = bind_symbolic_name T, 0 [symbolic = %T.1 (constants.%T.4)]
// CHECK:STDOUT:
// CHECK:STDOUT: impl: %T.4 as %.1;
// CHECK:STDOUT: impl: %.loc14_21.2 as %Interface.ref;
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: generic impl @impl.5(%T.loc18: %.2) {
// CHECK:STDOUT: %T.1: %.2 = bind_symbolic_name T, 0 [symbolic = %T.1 (constants.%T.1)]
// CHECK:STDOUT:
// CHECK:STDOUT: impl: %T.1 as %.1 {
// CHECK:STDOUT: impl: %.loc18_21.2 as %Interface.ref {
// CHECK:STDOUT: %.loc18_36: <witness> = interface_witness () [template = constants.%.7]
// CHECK:STDOUT:
// CHECK:STDOUT: !members:
@@ -265,7 +265,7 @@ impl (C, C).0 as I {}
// CHECK:STDOUT: generic impl @impl.6(%T.loc19: %.3) {
// CHECK:STDOUT: %T.1: %.3 = bind_symbolic_name T, 0 [symbolic = %T.1 (constants.%T.2)]
// CHECK:STDOUT:
// CHECK:STDOUT: impl: %T.2 as %.1 {
// CHECK:STDOUT: impl: %.loc19_21.2 as %Interface.ref {
// CHECK:STDOUT: %.loc19_36: <witness> = interface_witness () [template = constants.%.7]
// CHECK:STDOUT:
// CHECK:STDOUT: !members:
@@ -276,7 +276,7 @@ impl (C, C).0 as I {}
// CHECK:STDOUT: generic impl @impl.7(%T.loc20: %.4) {
// CHECK:STDOUT: %T.1: %.4 = bind_symbolic_name T, 0 [symbolic = %T.1 (constants.%T.3)]
// CHECK:STDOUT:
// CHECK:STDOUT: impl: %T.3 as %.1 {
// CHECK:STDOUT: impl: %.loc20_21.2 as %Interface.ref {
// CHECK:STDOUT: %.loc20_36: <witness> = interface_witness () [template = constants.%.7]
// CHECK:STDOUT:
// CHECK:STDOUT: !members:
@@ -287,7 +287,7 @@ impl (C, C).0 as I {}
// CHECK:STDOUT: generic impl @impl.8(%T.loc21: %.5) {
// CHECK:STDOUT: %T.1: %.5 = bind_symbolic_name T, 0 [symbolic = %T.1 (constants.%T.4)]
// CHECK:STDOUT:
// CHECK:STDOUT: impl: %T.4 as %.1 {
// CHECK:STDOUT: impl: %.loc21_21.2 as %Interface.ref {
// CHECK:STDOUT: %.loc21_36: <witness> = interface_witness () [template = constants.%.7]
// CHECK:STDOUT:
// CHECK:STDOUT: !members:
@@ -389,7 +389,7 @@ impl (C, C).0 as I {}
// CHECK:STDOUT: generic impl @impl(%T.loc7: %.1) {
// CHECK:STDOUT: %T.1: %.1 = bind_symbolic_name T, 0 [symbolic = %T.1 (constants.%T)]
// CHECK:STDOUT:
// CHECK:STDOUT: impl: %T as %.2 {
// CHECK:STDOUT: impl: %.loc7_21.2 as %J.ref.loc7 {
// CHECK:STDOUT: !members:
// CHECK:STDOUT: witness = <unexpected>.inst+21.loc7_28
// CHECK:STDOUT: }
@@ -444,14 +444,14 @@ impl (C, C).0 as I {}
// CHECK:STDOUT: witness = ()
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.1: %C as %.1 {
// CHECK:STDOUT: impl @impl.1: %C.ref as %I.ref {
// CHECK:STDOUT: %.loc13: <witness> = interface_witness () [template = constants.%.3]
// CHECK:STDOUT:
// CHECK:STDOUT: !members:
// CHECK:STDOUT: witness = %.loc13
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.2: %C as %.1 {
// CHECK:STDOUT: impl @impl.2: %.loc14_12 as %I.ref {
// CHECK:STDOUT: %.loc14_20: <witness> = interface_witness () [template = constants.%.3]
// CHECK:STDOUT:
// CHECK:STDOUT: !members:
@@ -109,7 +109,7 @@ impl forall [T:! type] C as I(T*) {}
// CHECK:STDOUT: %T.1: type = bind_symbolic_name T, 0 [symbolic = %T.1 (constants.%T)]
// CHECK:STDOUT: %.1: type = interface_type @I, @I(%T.1) [symbolic = %.1 (constants.%.4)]
// CHECK:STDOUT:
// CHECK:STDOUT: impl: %C as %.4;
// CHECK:STDOUT: impl: %C.ref as %.loc7;
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: generic impl @impl.2(%T.loc8: type) {
@@ -117,7 +117,7 @@ impl forall [T:! type] C as I(T*) {}
// CHECK:STDOUT: %.1: type = ptr_type @impl.2.%T.1 (%T) [symbolic = %.1 (constants.%.5)]
// CHECK:STDOUT: %.2: type = interface_type @I, @I(%.1) [symbolic = %.2 (constants.%.6)]
// CHECK:STDOUT:
// CHECK:STDOUT: impl: %C as %.6 {
// CHECK:STDOUT: impl: %C.ref as %.loc8_30 {
// CHECK:STDOUT: %.loc8_35: <witness> = interface_witness () [template = constants.%.7]
// CHECK:STDOUT:
// CHECK:STDOUT: !members:
@@ -190,7 +190,11 @@ impl forall [T:! type] C as I(T*) {}
// CHECK:STDOUT: %import_ref.2: %I.type = import_ref Main//import_generic, inst+10, loaded [template = constants.%I]
// CHECK:STDOUT: %import_ref.3 = import_ref Main//import_generic, inst+16, unloaded
// CHECK:STDOUT: %import_ref.4 = import_ref Main//import_generic, inst+2, unloaded
// CHECK:STDOUT: %import_ref.5 = import_ref Main//import_generic, inst+44, unloaded
// CHECK:STDOUT: %import_ref.5: type = import_ref Main//import_generic, inst+23, loaded [template = constants.%C]
// CHECK:STDOUT: %import_ref.6: type = import_ref Main//import_generic, inst+26, loaded [symbolic = @impl.1.%.1 (constants.%.2)]
// CHECK:STDOUT: %import_ref.7: type = import_ref Main//import_generic, inst+33, loaded [template = constants.%C]
// CHECK:STDOUT: %import_ref.8: type = import_ref Main//import_generic, inst+38, loaded [symbolic = @impl.2.%.2 (constants.%.6)]
// CHECK:STDOUT: %import_ref.9 = import_ref Main//import_generic, inst+44, unloaded
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: file {
@@ -228,7 +232,7 @@ impl forall [T:! type] C as I(T*) {}
// CHECK:STDOUT: %T.1: type = bind_symbolic_name T, 0 [symbolic = %T.1 (constants.%T)]
// CHECK:STDOUT: %.1: type = interface_type @I, @I(%T.1) [symbolic = %.1 (constants.%.2)]
// CHECK:STDOUT:
// CHECK:STDOUT: impl: %C as %.2 {
// CHECK:STDOUT: impl: imports.%import_ref.5 as imports.%import_ref.6 {
// CHECK:STDOUT: %.loc4_34: <witness> = interface_witness () [template = constants.%.7]
// CHECK:STDOUT:
// CHECK:STDOUT: !members:
@@ -241,9 +245,9 @@ impl forall [T:! type] C as I(T*) {}
// CHECK:STDOUT: %.1: type = ptr_type @impl.2.%T (%T) [symbolic = %.1 (constants.%.5)]
// CHECK:STDOUT: %.2: type = interface_type @I, @I(%.1) [symbolic = %.2 (constants.%.6)]
// CHECK:STDOUT:
// CHECK:STDOUT: impl: %C as %.6 {
// CHECK:STDOUT: impl: imports.%import_ref.7 as imports.%import_ref.8 {
// CHECK:STDOUT: !members:
// CHECK:STDOUT: witness = imports.%import_ref.5
// CHECK:STDOUT: witness = imports.%import_ref.9
// CHECK:STDOUT: }
// CHECK:STDOUT: }
// CHECK:STDOUT:
@@ -275,10 +279,6 @@ impl forall [T:! type] C as I(T*) {}
// CHECK:STDOUT:
// CHECK:STDOUT: specific @I(constants.%.5) {
// CHECK:STDOUT: %T => constants.%.5
// CHECK:STDOUT:
// CHECK:STDOUT: !definition:
// CHECK:STDOUT: %.1 => constants.%.6
// CHECK:STDOUT: %Self => constants.%Self.2
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: specific @I(@impl.2.%.1) {
@@ -313,7 +313,11 @@ impl forall [T:! type] C as I(T*) {}
// CHECK:STDOUT: %import_ref.2: %I.type = import_ref Main//import_generic, inst+10, loaded [template = constants.%I]
// CHECK:STDOUT: %import_ref.3 = import_ref Main//import_generic, inst+16, unloaded
// CHECK:STDOUT: %import_ref.4 = import_ref Main//import_generic, inst+2, unloaded
// CHECK:STDOUT: %import_ref.5 = import_ref Main//import_generic, inst+44, unloaded
// CHECK:STDOUT: %import_ref.5: type = import_ref Main//import_generic, inst+23, loaded [template = constants.%C]
// CHECK:STDOUT: %import_ref.6: type = import_ref Main//import_generic, inst+26, loaded [symbolic = @impl.1.%.1 (constants.%.2)]
// CHECK:STDOUT: %import_ref.7: type = import_ref Main//import_generic, inst+33, loaded [template = constants.%C]
// CHECK:STDOUT: %import_ref.8: type = import_ref Main//import_generic, inst+38, loaded [symbolic = @impl.2.%.2 (constants.%.6)]
// CHECK:STDOUT: %import_ref.9 = import_ref Main//import_generic, inst+44, unloaded
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: file {
@@ -352,7 +356,7 @@ impl forall [T:! type] C as I(T*) {}
// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)]
// CHECK:STDOUT: %.1: type = interface_type @I, @I(%T) [symbolic = %.1 (constants.%.2)]
// CHECK:STDOUT:
// CHECK:STDOUT: impl: %C as %.2;
// CHECK:STDOUT: impl: imports.%import_ref.5 as imports.%import_ref.6;
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: generic impl @impl.2(constants.%T: type) {
@@ -360,9 +364,9 @@ impl forall [T:! type] C as I(T*) {}
// CHECK:STDOUT: %.1: type = ptr_type @impl.2.%T.1 (%T) [symbolic = %.1 (constants.%.5)]
// CHECK:STDOUT: %.2: type = interface_type @I, @I(%.1) [symbolic = %.2 (constants.%.6)]
// CHECK:STDOUT:
// CHECK:STDOUT: impl: %C as %.6 {
// CHECK:STDOUT: impl: imports.%import_ref.7 as imports.%import_ref.8 {
// CHECK:STDOUT: !members:
// CHECK:STDOUT: witness = imports.%import_ref.5
// CHECK:STDOUT: witness = imports.%import_ref.9
// CHECK:STDOUT: }
// CHECK:STDOUT: }
// CHECK:STDOUT:
@@ -390,10 +394,6 @@ impl forall [T:! type] C as I(T*) {}
// CHECK:STDOUT:
// CHECK:STDOUT: specific @I(constants.%.5) {
// CHECK:STDOUT: %T => constants.%.5
// CHECK:STDOUT:
// CHECK:STDOUT: !definition:
// CHECK:STDOUT: %.1 => constants.%.6
// CHECK:STDOUT: %Self => constants.%Self.2
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: specific @I(@impl.2.%.1) {
@@ -150,7 +150,7 @@ fn F(x: (), y: ()) -> () {
// CHECK:STDOUT: witness = (imports.%import_ref.4)
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl: %.1 as %.2 {
// CHECK:STDOUT: impl @impl: %.loc6_7.2 as %Add.ref {
// CHECK:STDOUT: %Op.decl: %Op.type.1 = fn_decl @Op.1 [template = constants.%Op.1] {
// CHECK:STDOUT: %self.patt: %.1 = binding_pattern self
// CHECK:STDOUT: %other.patt: %.1 = binding_pattern other
@@ -190,7 +190,7 @@ fn F(x: (), y: ()) -> () {
// CHECK:STDOUT: %x.ref: %.1 = name_ref x, %x
// CHECK:STDOUT: %Add.ref: type = name_ref Add, imports.%import_ref.1 [template = constants.%.2]
// CHECK:STDOUT: %Op.ref: %.4 = name_ref Op, imports.%import_ref.3 [template = constants.%.5]
// CHECK:STDOUT: %.loc11_11.1: %Op.type.2 = interface_witness_access @impl.%.loc6_16, element0 [template = constants.%Op.1]
// CHECK:STDOUT: %.loc11_11.1: %Op.type.2 = interface_witness_access constants.%.3, element0 [template = constants.%Op.1]
// CHECK:STDOUT: %.loc11_11.2: <bound method> = bound_method %x.ref, %.loc11_11.1
// CHECK:STDOUT: %y.ref: %.1 = name_ref y, %y
// CHECK:STDOUT: %Op.call: init %.1 = call %.loc11_11.2(%x.ref, %y.ref)
@@ -164,7 +164,7 @@ fn MakeC(a: A) -> C {
// CHECK:STDOUT: }
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl: %A as %.7 {
// CHECK:STDOUT: impl @impl: %A.ref as %.loc12_17 {
// CHECK:STDOUT: %Op.decl: %Op.type.2 = fn_decl @Op.2 [template = constants.%Op.2] {} {}
// CHECK:STDOUT: %.loc12_21: <witness> = interface_witness (%Op.decl) [template = constants.%.10]
// CHECK:STDOUT:
@@ -212,7 +212,7 @@ fn MakeC(a: A) -> C {
// CHECK:STDOUT: %.loc16_23: type = interface_type @Action, @Action(constants.%B) [template = constants.%.7]
// CHECK:STDOUT: %.loc16_26: %.8 = specific_constant @Action.%.loc5, @Action(constants.%B) [template = constants.%.9]
// CHECK:STDOUT: %Op.ref: %.8 = name_ref Op, %.loc16_26 [template = constants.%.9]
// CHECK:STDOUT: %.loc16_15: %Op.type.3 = interface_witness_access @impl.%.loc12_21, element0 [template = constants.%Op.2]
// CHECK:STDOUT: %.loc16_15: %Op.type.3 = interface_witness_access constants.%.10, element0 [template = constants.%Op.2]
// CHECK:STDOUT: %Op.call: init %.1 = call %.loc16_15()
// CHECK:STDOUT: return
// CHECK:STDOUT: }
@@ -259,15 +259,15 @@ fn MakeC(a: A) -> C {
// CHECK:STDOUT: %Op.type.1: type = fn_type @Op.1, @Action(%T) [symbolic]
// CHECK:STDOUT: %Op.1: %Op.type.1 = struct_value () [symbolic]
// CHECK:STDOUT: %.6: type = assoc_entity_type %.4, %Op.type.1 [symbolic]
// CHECK:STDOUT: %.7: %.6 = assoc_entity element0, imports.%import_ref.13 [symbolic]
// CHECK:STDOUT: %.7: %.6 = assoc_entity element0, imports.%import_ref.15 [symbolic]
// CHECK:STDOUT: %Op.type.2: type = fn_type @Op.1, @Action(%B) [template]
// CHECK:STDOUT: %Op.2: %Op.type.2 = struct_value () [template]
// CHECK:STDOUT: %.8: type = assoc_entity_type %.5, %Op.type.2 [template]
// CHECK:STDOUT: %.9: %.8 = assoc_entity element0, imports.%import_ref.14 [template]
// CHECK:STDOUT: %.9: %.8 = assoc_entity element0, imports.%import_ref.16 [template]
// CHECK:STDOUT: %G.type: type = fn_type @G [template]
// CHECK:STDOUT: %G: %G.type = struct_value () [template]
// CHECK:STDOUT: %.10: type = ptr_type %.1 [template]
// CHECK:STDOUT: %.11: %.6 = assoc_entity element0, imports.%import_ref.15 [symbolic]
// CHECK:STDOUT: %.11: %.6 = assoc_entity element0, imports.%import_ref.17 [symbolic]
// CHECK:STDOUT: %Op.type.3: type = fn_type @Op.2 [template]
// CHECK:STDOUT: %Op.3: %Op.type.3 = struct_value () [template]
// CHECK:STDOUT: %.12: <witness> = interface_witness (%Op.3) [template]
@@ -284,11 +284,13 @@ fn MakeC(a: A) -> C {
// CHECK:STDOUT: %import_ref.8: @Action.%.2 (%.6) = import_ref Main//action, inst+17, loaded [symbolic = @Action.%.3 (constants.%.11)]
// CHECK:STDOUT: %import_ref.9 = import_ref Main//action, inst+13, unloaded
// CHECK:STDOUT: %import_ref.10 = import_ref Main//action, inst+26, unloaded
// CHECK:STDOUT: %import_ref.11: <witness> = import_ref Main//action, inst+49, loaded [template = constants.%.12]
// CHECK:STDOUT: %import_ref.12 = import_ref Main//action, inst+42, unloaded
// CHECK:STDOUT: %import_ref.13 = import_ref Main//action, inst+13, unloaded
// CHECK:STDOUT: %import_ref.14 = import_ref Main//action, inst+13, unloaded
// CHECK:STDOUT: %import_ref.11: type = import_ref Main//action, inst+36, loaded [template = constants.%A]
// CHECK:STDOUT: %import_ref.12: type = import_ref Main//action, inst+39, loaded [template = constants.%.5]
// CHECK:STDOUT: %import_ref.13: <witness> = import_ref Main//action, inst+49, loaded [template = constants.%.12]
// CHECK:STDOUT: %import_ref.14 = import_ref Main//action, inst+42, unloaded
// CHECK:STDOUT: %import_ref.15 = import_ref Main//action, inst+13, unloaded
// CHECK:STDOUT: %import_ref.16 = import_ref Main//action, inst+13, unloaded
// CHECK:STDOUT: %import_ref.17 = import_ref Main//action, inst+13, unloaded
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: file {
@@ -320,7 +322,7 @@ fn MakeC(a: A) -> C {
// CHECK:STDOUT: %Op.type: type = fn_type @Op.1, @Action(%T) [symbolic = %Op.type (constants.%Op.type.1)]
// CHECK:STDOUT: %Op: @Action.%Op.type (%Op.type.1) = struct_value () [symbolic = %Op (constants.%Op.1)]
// CHECK:STDOUT: %.2: type = assoc_entity_type @Action.%.1 (%.4), @Action.%Op.type (%Op.type.1) [symbolic = %.2 (constants.%.6)]
// CHECK:STDOUT: %.3: @Action.%.2 (%.6) = assoc_entity element0, imports.%import_ref.13 [symbolic = %.3 (constants.%.7)]
// CHECK:STDOUT: %.3: @Action.%.2 (%.6) = assoc_entity element0, imports.%import_ref.15 [symbolic = %.3 (constants.%.7)]
// CHECK:STDOUT:
// CHECK:STDOUT: interface {
// CHECK:STDOUT: !members:
@@ -330,10 +332,10 @@ fn MakeC(a: A) -> C {
// CHECK:STDOUT: }
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl: %A as %.5 {
// CHECK:STDOUT: impl @impl: imports.%import_ref.11 as imports.%import_ref.12 {
// CHECK:STDOUT: !members:
// CHECK:STDOUT: .Op = imports.%import_ref.12
// CHECK:STDOUT: witness = imports.%import_ref.11
// CHECK:STDOUT: .Op = imports.%import_ref.14
// CHECK:STDOUT: witness = imports.%import_ref.13
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: class @B {
@@ -359,7 +361,7 @@ fn MakeC(a: A) -> C {
// CHECK:STDOUT: %.loc4_23: type = interface_type @Action, @Action(constants.%B) [template = constants.%.5]
// CHECK:STDOUT: %.loc4_26: %.8 = specific_constant imports.%import_ref.8, @Action(constants.%B) [template = constants.%.9]
// CHECK:STDOUT: %Op.ref: %.8 = name_ref Op, %.loc4_26 [template = constants.%.9]
// CHECK:STDOUT: %.loc4_15: %Op.type.2 = interface_witness_access imports.%import_ref.11, element0 [template = constants.%Op.3]
// CHECK:STDOUT: %.loc4_15: %Op.type.2 = interface_witness_access constants.%.12, element0 [template = constants.%Op.3]
// CHECK:STDOUT: %Op.call: init %.3 = call %.loc4_15()
// CHECK:STDOUT: return
// CHECK:STDOUT: }
@@ -406,11 +408,11 @@ fn MakeC(a: A) -> C {
// CHECK:STDOUT: %Op.type.1: type = fn_type @Op, @Action(%T) [symbolic]
// CHECK:STDOUT: %Op.1: %Op.type.1 = struct_value () [symbolic]
// CHECK:STDOUT: %.6: type = assoc_entity_type %.4, %Op.type.1 [symbolic]
// CHECK:STDOUT: %.7: %.6 = assoc_entity element0, imports.%import_ref.13 [symbolic]
// CHECK:STDOUT: %.7: %.6 = assoc_entity element0, imports.%import_ref.15 [symbolic]
// CHECK:STDOUT: %Op.type.2: type = fn_type @Op, @Action(%B) [template]
// CHECK:STDOUT: %Op.2: %Op.type.2 = struct_value () [template]
// CHECK:STDOUT: %.8: type = assoc_entity_type %.5, %Op.type.2 [template]
// CHECK:STDOUT: %.9: %.8 = assoc_entity element0, imports.%import_ref.14 [template]
// CHECK:STDOUT: %.9: %.8 = assoc_entity element0, imports.%import_ref.16 [template]
// CHECK:STDOUT: %G.type: type = fn_type @G [template]
// CHECK:STDOUT: %G: %G.type = struct_value () [template]
// CHECK:STDOUT: %.10: type = ptr_type %.1 [template]
@@ -419,8 +421,8 @@ fn MakeC(a: A) -> C {
// CHECK:STDOUT: %Op.type.3: type = fn_type @Op, @Action(%C) [template]
// CHECK:STDOUT: %Op.3: %Op.type.3 = struct_value () [template]
// CHECK:STDOUT: %.12: type = assoc_entity_type %.11, %Op.type.3 [template]
// CHECK:STDOUT: %.13: %.12 = assoc_entity element0, imports.%import_ref.13 [template]
// CHECK:STDOUT: %.14: %.6 = assoc_entity element0, imports.%import_ref.16 [symbolic]
// CHECK:STDOUT: %.13: %.12 = assoc_entity element0, imports.%import_ref.15 [template]
// CHECK:STDOUT: %.14: %.6 = assoc_entity element0, imports.%import_ref.18 [symbolic]
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: imports {
@@ -434,12 +436,14 @@ fn MakeC(a: A) -> C {
// CHECK:STDOUT: %import_ref.8: @Action.%.2 (%.6) = import_ref Main//action, inst+17, loaded [symbolic = @Action.%.3 (constants.%.14)]
// CHECK:STDOUT: %import_ref.9 = import_ref Main//action, inst+13, unloaded
// CHECK:STDOUT: %import_ref.10 = import_ref Main//action, inst+26, unloaded
// CHECK:STDOUT: %import_ref.11 = import_ref Main//action, inst+49, unloaded
// CHECK:STDOUT: %import_ref.12 = import_ref Main//action, inst+42, unloaded
// CHECK:STDOUT: %import_ref.13 = import_ref Main//action, inst+13, unloaded
// CHECK:STDOUT: %import_ref.14 = import_ref Main//action, inst+13, unloaded
// CHECK:STDOUT: %import_ref.15 = import_ref Main//action, inst+34, unloaded
// CHECK:STDOUT: %import_ref.11: type = import_ref Main//action, inst+36, loaded [template = constants.%A]
// CHECK:STDOUT: %import_ref.12: type = import_ref Main//action, inst+39, loaded [template = constants.%.5]
// CHECK:STDOUT: %import_ref.13 = import_ref Main//action, inst+49, unloaded
// CHECK:STDOUT: %import_ref.14 = import_ref Main//action, inst+42, unloaded
// CHECK:STDOUT: %import_ref.15 = import_ref Main//action, inst+13, unloaded
// CHECK:STDOUT: %import_ref.16 = import_ref Main//action, inst+13, unloaded
// CHECK:STDOUT: %import_ref.17 = import_ref Main//action, inst+34, unloaded
// CHECK:STDOUT: %import_ref.18 = import_ref Main//action, inst+13, unloaded
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: file {
@@ -471,7 +475,7 @@ fn MakeC(a: A) -> C {
// CHECK:STDOUT: %Op.type: type = fn_type @Op, @Action(%T) [symbolic = %Op.type (constants.%Op.type.1)]
// CHECK:STDOUT: %Op: @Action.%Op.type (%Op.type.1) = struct_value () [symbolic = %Op (constants.%Op.1)]
// CHECK:STDOUT: %.2: type = assoc_entity_type @Action.%.1 (%.4), @Action.%Op.type (%Op.type.1) [symbolic = %.2 (constants.%.6)]
// CHECK:STDOUT: %.3: @Action.%.2 (%.6) = assoc_entity element0, imports.%import_ref.13 [symbolic = %.3 (constants.%.7)]
// CHECK:STDOUT: %.3: @Action.%.2 (%.6) = assoc_entity element0, imports.%import_ref.15 [symbolic = %.3 (constants.%.7)]
// CHECK:STDOUT:
// CHECK:STDOUT: interface {
// CHECK:STDOUT: !members:
@@ -481,10 +485,10 @@ fn MakeC(a: A) -> C {
// CHECK:STDOUT: }
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl: %A as %.5 {
// CHECK:STDOUT: impl @impl: imports.%import_ref.11 as imports.%import_ref.12 {
// CHECK:STDOUT: !members:
// CHECK:STDOUT: .Op = imports.%import_ref.12
// CHECK:STDOUT: witness = imports.%import_ref.11
// CHECK:STDOUT: .Op = imports.%import_ref.14
// CHECK:STDOUT: witness = imports.%import_ref.13
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: class @B {
@@ -499,7 +503,7 @@ fn MakeC(a: A) -> C {
// CHECK:STDOUT:
// CHECK:STDOUT: class @C {
// CHECK:STDOUT: !members:
// CHECK:STDOUT: .Self = imports.%import_ref.15
// CHECK:STDOUT: .Self = imports.%import_ref.17
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: generic fn @Op(constants.%T: type, constants.%Self.1: @Action.%.1 (%.4)) {
@@ -627,7 +631,7 @@ fn MakeC(a: A) -> C {
// CHECK:STDOUT: }
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl: %A as %.7 {
// CHECK:STDOUT: impl @impl: %A.ref as %.loc11_18 {
// CHECK:STDOUT: %Make.decl: %Make.type.2 = fn_decl @Make.2 [template = constants.%Make.2] {} {
// CHECK:STDOUT: %B.ref: type = name_ref B, file.%B.decl [template = constants.%B]
// CHECK:STDOUT: %return: ref %B = var <return slot>
@@ -707,15 +711,15 @@ fn MakeC(a: A) -> C {
// CHECK:STDOUT: %Make.type.1: type = fn_type @Make.1, @Factory(%T) [symbolic]
// CHECK:STDOUT: %Make.1: %Make.type.1 = struct_value () [symbolic]
// CHECK:STDOUT: %.6: type = assoc_entity_type %.4, %Make.type.1 [symbolic]
// CHECK:STDOUT: %.7: %.6 = assoc_entity element0, imports.%import_ref.11 [symbolic]
// CHECK:STDOUT: %.7: %.6 = assoc_entity element0, imports.%import_ref.13 [symbolic]
// CHECK:STDOUT: %Make.type.2: type = fn_type @Make.1, @Factory(%B) [template]
// CHECK:STDOUT: %Make.2: %Make.type.2 = struct_value () [template]
// CHECK:STDOUT: %.8: type = assoc_entity_type %.5, %Make.type.2 [template]
// CHECK:STDOUT: %.9: %.8 = assoc_entity element0, imports.%import_ref.12 [template]
// CHECK:STDOUT: %.9: %.8 = assoc_entity element0, imports.%import_ref.14 [template]
// CHECK:STDOUT: %MakeB.type: type = fn_type @MakeB [template]
// CHECK:STDOUT: %MakeB: %MakeB.type = struct_value () [template]
// CHECK:STDOUT: %.10: type = ptr_type %.1 [template]
// CHECK:STDOUT: %.11: %.6 = assoc_entity element0, imports.%import_ref.13 [symbolic]
// CHECK:STDOUT: %.11: %.6 = assoc_entity element0, imports.%import_ref.15 [symbolic]
// CHECK:STDOUT: %Make.type.3: type = fn_type @Make.2 [template]
// CHECK:STDOUT: %Make.3: %Make.type.3 = struct_value () [template]
// CHECK:STDOUT: %.12: <witness> = interface_witness (%Make.3) [template]
@@ -730,11 +734,13 @@ fn MakeC(a: A) -> C {
// CHECK:STDOUT: %import_ref.6: @Factory.%.2 (%.6) = import_ref Main//factory, inst+20, loaded [symbolic = @Factory.%.3 (constants.%.11)]
// CHECK:STDOUT: %import_ref.7 = import_ref Main//factory, inst+15, unloaded
// CHECK:STDOUT: %import_ref.8 = import_ref Main//factory, inst+29, unloaded
// CHECK:STDOUT: %import_ref.9: <witness> = import_ref Main//factory, inst+51, loaded [template = constants.%.12]
// CHECK:STDOUT: %import_ref.10 = import_ref Main//factory, inst+44, unloaded
// CHECK:STDOUT: %import_ref.11 = import_ref Main//factory, inst+15, unloaded
// CHECK:STDOUT: %import_ref.12 = import_ref Main//factory, inst+15, unloaded
// CHECK:STDOUT: %import_ref.9: type = import_ref Main//factory, inst+36, loaded [template = constants.%A]
// CHECK:STDOUT: %import_ref.10: type = import_ref Main//factory, inst+39, loaded [template = constants.%.5]
// CHECK:STDOUT: %import_ref.11: <witness> = import_ref Main//factory, inst+51, loaded [template = constants.%.12]
// CHECK:STDOUT: %import_ref.12 = import_ref Main//factory, inst+44, unloaded
// CHECK:STDOUT: %import_ref.13 = import_ref Main//factory, inst+15, unloaded
// CHECK:STDOUT: %import_ref.14 = import_ref Main//factory, inst+15, unloaded
// CHECK:STDOUT: %import_ref.15 = import_ref Main//factory, inst+15, unloaded
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: file {
@@ -766,7 +772,7 @@ fn MakeC(a: A) -> C {
// CHECK:STDOUT: %Make.type: type = fn_type @Make.1, @Factory(%T) [symbolic = %Make.type (constants.%Make.type.1)]
// CHECK:STDOUT: %Make: @Factory.%Make.type (%Make.type.1) = struct_value () [symbolic = %Make (constants.%Make.1)]
// CHECK:STDOUT: %.2: type = assoc_entity_type @Factory.%.1 (%.4), @Factory.%Make.type (%Make.type.1) [symbolic = %.2 (constants.%.6)]
// CHECK:STDOUT: %.3: @Factory.%.2 (%.6) = assoc_entity element0, imports.%import_ref.11 [symbolic = %.3 (constants.%.7)]
// CHECK:STDOUT: %.3: @Factory.%.2 (%.6) = assoc_entity element0, imports.%import_ref.13 [symbolic = %.3 (constants.%.7)]
// CHECK:STDOUT:
// CHECK:STDOUT: interface {
// CHECK:STDOUT: !members:
@@ -776,10 +782,10 @@ fn MakeC(a: A) -> C {
// CHECK:STDOUT: }
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl: %A as %.5 {
// CHECK:STDOUT: impl @impl: imports.%import_ref.9 as imports.%import_ref.10 {
// CHECK:STDOUT: !members:
// CHECK:STDOUT: .Make = imports.%import_ref.10
// CHECK:STDOUT: witness = imports.%import_ref.9
// CHECK:STDOUT: .Make = imports.%import_ref.12
// CHECK:STDOUT: witness = imports.%import_ref.11
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: class @B {
@@ -806,7 +812,7 @@ fn MakeC(a: A) -> C {
// CHECK:STDOUT: %.loc5_20: type = interface_type @Factory, @Factory(constants.%B) [template = constants.%.5]
// CHECK:STDOUT: %.loc5_23: %.8 = specific_constant imports.%import_ref.6, @Factory(constants.%B) [template = constants.%.9]
// CHECK:STDOUT: %Make.ref: %.8 = name_ref Make, %.loc5_23 [template = constants.%.9]
// CHECK:STDOUT: %.loc5_11: %Make.type.2 = interface_witness_access imports.%import_ref.9, element0 [template = constants.%Make.3]
// CHECK:STDOUT: %.loc5_11: %Make.type.2 = interface_witness_access constants.%.12, element0 [template = constants.%Make.3]
// CHECK:STDOUT: %.loc4: ref %B = splice_block %return {}
// CHECK:STDOUT: %Make.call: init %B = call %.loc5_11() to %.loc4
// CHECK:STDOUT: return %Make.call to %return
@@ -856,11 +862,11 @@ fn MakeC(a: A) -> C {
// CHECK:STDOUT: %Make.type.1: type = fn_type @Make, @Factory(%T) [symbolic]
// CHECK:STDOUT: %Make.1: %Make.type.1 = struct_value () [symbolic]
// CHECK:STDOUT: %.6: type = assoc_entity_type %.4, %Make.type.1 [symbolic]
// CHECK:STDOUT: %.7: %.6 = assoc_entity element0, imports.%import_ref.11 [symbolic]
// CHECK:STDOUT: %.7: %.6 = assoc_entity element0, imports.%import_ref.13 [symbolic]
// CHECK:STDOUT: %Make.type.2: type = fn_type @Make, @Factory(%B) [template]
// CHECK:STDOUT: %Make.2: %Make.type.2 = struct_value () [template]
// CHECK:STDOUT: %.8: type = assoc_entity_type %.5, %Make.type.2 [template]
// CHECK:STDOUT: %.9: %.8 = assoc_entity element0, imports.%import_ref.12 [template]
// CHECK:STDOUT: %.9: %.8 = assoc_entity element0, imports.%import_ref.14 [template]
// CHECK:STDOUT: %C: type = class_type @C [template]
// CHECK:STDOUT: %MakeC.type: type = fn_type @MakeC [template]
// CHECK:STDOUT: %MakeC: %MakeC.type = struct_value () [template]
@@ -869,8 +875,8 @@ fn MakeC(a: A) -> C {
// CHECK:STDOUT: %Make.type.3: type = fn_type @Make, @Factory(%C) [template]
// CHECK:STDOUT: %Make.3: %Make.type.3 = struct_value () [template]
// CHECK:STDOUT: %.12: type = assoc_entity_type %.11, %Make.type.3 [template]
// CHECK:STDOUT: %.13: %.12 = assoc_entity element0, imports.%import_ref.11 [template]
// CHECK:STDOUT: %.14: %.6 = assoc_entity element0, imports.%import_ref.13 [symbolic]
// CHECK:STDOUT: %.13: %.12 = assoc_entity element0, imports.%import_ref.13 [template]
// CHECK:STDOUT: %.14: %.6 = assoc_entity element0, imports.%import_ref.15 [symbolic]
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: imports {
@@ -882,11 +888,13 @@ fn MakeC(a: A) -> C {
// CHECK:STDOUT: %import_ref.6: @Factory.%.2 (%.6) = import_ref Main//factory, inst+20, loaded [symbolic = @Factory.%.3 (constants.%.14)]
// CHECK:STDOUT: %import_ref.7 = import_ref Main//factory, inst+15, unloaded
// CHECK:STDOUT: %import_ref.8 = import_ref Main//factory, inst+29, unloaded
// CHECK:STDOUT: %import_ref.9 = import_ref Main//factory, inst+51, unloaded
// CHECK:STDOUT: %import_ref.10 = import_ref Main//factory, inst+44, unloaded
// CHECK:STDOUT: %import_ref.11 = import_ref Main//factory, inst+15, unloaded
// CHECK:STDOUT: %import_ref.12 = import_ref Main//factory, inst+15, unloaded
// CHECK:STDOUT: %import_ref.9: type = import_ref Main//factory, inst+36, loaded [template = constants.%A]
// CHECK:STDOUT: %import_ref.10: type = import_ref Main//factory, inst+39, loaded [template = constants.%.5]
// CHECK:STDOUT: %import_ref.11 = import_ref Main//factory, inst+51, unloaded
// CHECK:STDOUT: %import_ref.12 = import_ref Main//factory, inst+44, unloaded
// CHECK:STDOUT: %import_ref.13 = import_ref Main//factory, inst+15, unloaded
// CHECK:STDOUT: %import_ref.14 = import_ref Main//factory, inst+15, unloaded
// CHECK:STDOUT: %import_ref.15 = import_ref Main//factory, inst+15, unloaded
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: file {
@@ -920,7 +928,7 @@ fn MakeC(a: A) -> C {
// CHECK:STDOUT: %Make.type: type = fn_type @Make, @Factory(%T) [symbolic = %Make.type (constants.%Make.type.1)]
// CHECK:STDOUT: %Make: @Factory.%Make.type (%Make.type.1) = struct_value () [symbolic = %Make (constants.%Make.1)]
// CHECK:STDOUT: %.2: type = assoc_entity_type @Factory.%.1 (%.4), @Factory.%Make.type (%Make.type.1) [symbolic = %.2 (constants.%.6)]
// CHECK:STDOUT: %.3: @Factory.%.2 (%.6) = assoc_entity element0, imports.%import_ref.11 [symbolic = %.3 (constants.%.7)]
// CHECK:STDOUT: %.3: @Factory.%.2 (%.6) = assoc_entity element0, imports.%import_ref.13 [symbolic = %.3 (constants.%.7)]
// CHECK:STDOUT:
// CHECK:STDOUT: interface {
// CHECK:STDOUT: !members:
@@ -930,10 +938,10 @@ fn MakeC(a: A) -> C {
// CHECK:STDOUT: }
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl: %A as %.5 {
// CHECK:STDOUT: impl @impl: imports.%import_ref.9 as imports.%import_ref.10 {
// CHECK:STDOUT: !members:
// CHECK:STDOUT: .Make = imports.%import_ref.10
// CHECK:STDOUT: witness = imports.%import_ref.9
// CHECK:STDOUT: .Make = imports.%import_ref.12
// CHECK:STDOUT: witness = imports.%import_ref.11
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: class @B {
@@ -107,7 +107,7 @@ impl () as D;
// CHECK:STDOUT: witness = ()
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl: %.2 as %.1;
// CHECK:STDOUT: impl @impl: %.loc6_7.2 as %A.ref;
// CHECK:STDOUT:
// CHECK:STDOUT: --- decl_in_api_definition_in_impl.impl.carbon
// CHECK:STDOUT:
@@ -121,6 +121,8 @@ impl () as D;
// CHECK:STDOUT: imports {
// CHECK:STDOUT: %import_ref.1: type = import_ref Main//decl_in_api_definition_in_impl, inst+1, loaded [template = constants.%.1]
// CHECK:STDOUT: %import_ref.2 = import_ref Main//decl_in_api_definition_in_impl, inst+3, unloaded
// CHECK:STDOUT: %import_ref.3: type = import_ref Main//decl_in_api_definition_in_impl, inst+7, loaded [template = constants.%.2]
// CHECK:STDOUT: %import_ref.4: type = import_ref Main//decl_in_api_definition_in_impl, inst+8, loaded [template = constants.%.1]
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: file {
@@ -147,7 +149,7 @@ impl () as D;
// CHECK:STDOUT: witness = ()
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl: %.2 as %.1 {
// CHECK:STDOUT: impl @impl: imports.%import_ref.3 as imports.%import_ref.4 {
// CHECK:STDOUT: %.loc6_14: <witness> = interface_witness () [template = constants.%.3]
// CHECK:STDOUT:
// CHECK:STDOUT: !members:
@@ -171,6 +173,8 @@ impl () as D;
// CHECK:STDOUT: imports {
// CHECK:STDOUT: %import_ref.1 = import_ref Main//decl_in_api_definition_in_impl, inst+1, unloaded
// CHECK:STDOUT: %import_ref.2 = import_ref Main//decl_in_api_definition_in_impl, inst+3, unloaded
// CHECK:STDOUT: %import_ref.3: type = import_ref Main//decl_in_api_definition_in_impl, inst+7, loaded [template = constants.%.2]
// CHECK:STDOUT: %import_ref.4: type = import_ref Main//decl_in_api_definition_in_impl, inst+8, loaded [template = constants.%.1]
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: file {
@@ -187,7 +191,7 @@ impl () as D;
// CHECK:STDOUT: witness = ()
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl: %.2 as %.1;
// CHECK:STDOUT: impl @impl: imports.%import_ref.3 as imports.%import_ref.4;
// CHECK:STDOUT:
// CHECK:STDOUT: --- decl_only_in_api.carbon
// CHECK:STDOUT:
@@ -217,7 +221,7 @@ impl () as D;
// CHECK:STDOUT: witness = ()
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl: %.2 as %.1;
// CHECK:STDOUT: impl @impl: %.loc6_7.2 as %B.ref;
// CHECK:STDOUT:
// CHECK:STDOUT: --- decl_only_in_api.impl.carbon
// CHECK:STDOUT:
@@ -230,6 +234,8 @@ impl () as D;
// CHECK:STDOUT: imports {
// CHECK:STDOUT: %import_ref.1 = import_ref Main//decl_only_in_api, inst+1, unloaded
// CHECK:STDOUT: %import_ref.2 = import_ref Main//decl_only_in_api, inst+3, unloaded
// CHECK:STDOUT: %import_ref.3: type = import_ref Main//decl_only_in_api, inst+7, loaded [template = constants.%.2]
// CHECK:STDOUT: %import_ref.4: type = import_ref Main//decl_only_in_api, inst+8, loaded [template = constants.%.1]
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: file {
@@ -246,7 +252,7 @@ impl () as D;
// CHECK:STDOUT: witness = ()
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl: %.2 as %.1;
// CHECK:STDOUT: impl @impl: imports.%import_ref.3 as imports.%import_ref.4;
// CHECK:STDOUT:
// CHECK:STDOUT: --- decl_in_api_decl_in_impl.carbon
// CHECK:STDOUT:
@@ -276,7 +282,7 @@ impl () as D;
// CHECK:STDOUT: witness = ()
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl: %.2 as %.1;
// CHECK:STDOUT: impl @impl: %.loc6_7.2 as %C.ref;
// CHECK:STDOUT:
// CHECK:STDOUT: --- fail_decl_in_api_decl_in_impl.impl.carbon
// CHECK:STDOUT:
@@ -289,6 +295,8 @@ impl () as D;
// CHECK:STDOUT: imports {
// CHECK:STDOUT: %import_ref.1: type = import_ref Main//decl_in_api_decl_in_impl, inst+1, loaded [template = constants.%.1]
// CHECK:STDOUT: %import_ref.2 = import_ref Main//decl_in_api_decl_in_impl, inst+3, unloaded
// CHECK:STDOUT: %import_ref.3: type = import_ref Main//decl_in_api_decl_in_impl, inst+7, loaded [template = constants.%.2]
// CHECK:STDOUT: %import_ref.4: type = import_ref Main//decl_in_api_decl_in_impl, inst+8, loaded [template = constants.%.1]
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: file {
@@ -310,7 +318,7 @@ impl () as D;
// CHECK:STDOUT: witness = ()
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl: %.2 as %.1;
// CHECK:STDOUT: impl @impl: imports.%import_ref.3 as imports.%import_ref.4;
// CHECK:STDOUT:
// CHECK:STDOUT: --- decl_only_in_impl.carbon
// CHECK:STDOUT:
@@ -348,5 +356,5 @@ impl () as D;
// CHECK:STDOUT: witness = ()
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl: %.2 as %.1;
// CHECK:STDOUT: impl @impl: %.loc9_7.2 as %D.ref;
// CHECK:STDOUT:
@@ -70,7 +70,7 @@ class A {
// CHECK:STDOUT: witness = (%Make.decl)
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl: %C as %.1 {
// CHECK:STDOUT: impl @impl: %C.ref as %DefaultConstructible.ref {
// CHECK:STDOUT: %Make.decl: %Make.type.2 = fn_decl @Make.2 [template = constants.%Make.2] {} {
// CHECK:STDOUT: %Self.ref: type = name_ref Self, @impl.%C.ref [template = constants.%C]
// CHECK:STDOUT: %return: ref %C = var <return slot>
@@ -169,7 +169,7 @@ impl D as SelfNested {
// CHECK:STDOUT: witness = (%F.decl)
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.1: %C as %.1 {
// CHECK:STDOUT: impl @impl.1: %C.ref as %UseSelf.ref {
// CHECK:STDOUT: %F.decl: %F.type.2 = fn_decl @F.2 [template = constants.%F.2] {
// CHECK:STDOUT: %self.patt: %C = binding_pattern self
// CHECK:STDOUT: %x.patt: %C = binding_pattern x
@@ -190,7 +190,7 @@ impl D as SelfNested {
// CHECK:STDOUT: witness = %.loc19
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.2: %D as %.1 {
// CHECK:STDOUT: impl @impl.2: %D.ref as %UseSelf.ref {
// CHECK:STDOUT: %F.decl: %F.type.3 = fn_decl @F.3 [template = constants.%F.3] {
// CHECK:STDOUT: %self.patt: %D = binding_pattern self
// CHECK:STDOUT: %x.patt: %D = binding_pattern x
@@ -211,7 +211,7 @@ impl D as SelfNested {
// CHECK:STDOUT: witness = %.loc23
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.3: %C as %.10 {
// CHECK:STDOUT: impl @impl.3: %C.ref as %SelfNested.ref {
// CHECK:STDOUT: %F.decl: %F.type.5 = fn_decl @F.5 [template = constants.%F.5] {
// CHECK:STDOUT: %x.patt: %.19 = binding_pattern x
// CHECK:STDOUT: } {
@@ -233,7 +233,7 @@ impl D as SelfNested {
// CHECK:STDOUT: witness = %.loc31
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.4: %D as %.10 {
// CHECK:STDOUT: impl @impl.4: %D.ref as %SelfNested.ref {
// CHECK:STDOUT: %F.decl: %F.type.6 = fn_decl @F.6 [template = constants.%F.6] {
// CHECK:STDOUT: %x.patt: %.23 = binding_pattern x
// CHECK:STDOUT: } {
+2 -2
View File
@@ -78,9 +78,9 @@ impl i32 as I {}
// CHECK:STDOUT: witness = ()
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.1: i32 as %.1;
// CHECK:STDOUT: impl @impl.1: %.loc13_6.2 as %I.ref.loc13;
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.2: i32 as %.1 {
// CHECK:STDOUT: impl @impl.2: %.loc19_6.2 as %I.ref {
// CHECK:STDOUT: %.loc19_15: <witness> = interface_witness () [template = constants.%.5]
// CHECK:STDOUT:
// CHECK:STDOUT: !members:
@@ -61,7 +61,7 @@ class C {
// CHECK:STDOUT: witness = (%F.decl)
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl: %C as %.1 {
// CHECK:STDOUT: impl @impl: %C.ref as %I.ref {
// CHECK:STDOUT: %F.decl: %F.type.2 = fn_decl @F.2 [template = constants.%F.2] {} {}
// CHECK:STDOUT: %.loc21: <witness> = interface_witness (%F.decl) [template = constants.%.5]
// CHECK:STDOUT:
@@ -98,7 +98,7 @@ class C {
// CHECK:STDOUT: %c.ref: ref %C = name_ref c, %c
// CHECK:STDOUT: %I.ref: type = name_ref I, @C.%I.decl [template = constants.%.1]
// CHECK:STDOUT: %F.ref: %.3 = name_ref F, @I.%.loc14 [template = constants.%.4]
// CHECK:STDOUT: %.loc17: %F.type.1 = interface_witness_access @impl.%.loc21, element0 [template = constants.%F.2]
// CHECK:STDOUT: %.loc17: %F.type.1 = interface_witness_access constants.%.5, element0 [template = constants.%F.2]
// CHECK:STDOUT: %F.call: init %.2 = call %.loc17()
// CHECK:STDOUT: return
// CHECK:STDOUT: }
@@ -204,14 +204,14 @@ fn G(T:! Generic(B)) {
// CHECK:STDOUT: interface;
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.1: %C as %.8 {
// CHECK:STDOUT: impl @impl.1: %Self.ref as %.loc14_17 {
// CHECK:STDOUT: %.loc14_21: <witness> = interface_witness () [template = constants.%.9]
// CHECK:STDOUT:
// CHECK:STDOUT: !members:
// CHECK:STDOUT: witness = %.loc14_21
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.2: %C as %.10 {
// CHECK:STDOUT: impl @impl.2: %Self.ref as %.loc15_22 {
// CHECK:STDOUT: %F.decl: %F.type.2 = fn_decl @F.2 [template = constants.%F.2] {} {
// CHECK:STDOUT: %X.ref: type = name_ref X, file.%X.decl [template = constants.%X]
// CHECK:STDOUT: %return: ref %X = var <return slot>
@@ -232,11 +232,13 @@ fn G(T:! Generic(B)) {
// CHECK:STDOUT:
// CHECK:STDOUT: class @C {
// CHECK:STDOUT: impl_decl @impl.1 [template] {} {
// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%C [template = constants.%C]
// CHECK:STDOUT: %Simple.ref: %Simple.type = name_ref Simple, file.%Simple.decl [template = constants.%Simple]
// CHECK:STDOUT: %C.ref: type = name_ref C, file.%C.decl [template = constants.%C]
// CHECK:STDOUT: %.loc14_17: type = interface_type @Simple, @Simple(constants.%C) [template = constants.%.8]
// CHECK:STDOUT: }
// CHECK:STDOUT: impl_decl @impl.2 [template] {} {
// CHECK:STDOUT: %Self.ref: type = name_ref Self, constants.%C [template = constants.%C]
// CHECK:STDOUT: %WithAssocFn.ref: %WithAssocFn.type = name_ref WithAssocFn, file.%WithAssocFn.decl [template = constants.%WithAssocFn]
// CHECK:STDOUT: %C.ref: type = name_ref C, file.%C.decl [template = constants.%C]
// CHECK:STDOUT: %.loc15_22: type = interface_type @WithAssocFn, @WithAssocFn(constants.%C) [template = constants.%.10]
@@ -161,7 +161,7 @@ impl C as AddWith(C) {
// CHECK:STDOUT: }
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl: %C as %.7 {
// CHECK:STDOUT: impl @impl: %C.ref.loc7_6 as %.loc7_18 {
// CHECK:STDOUT: %F.decl: %F.type.2 = fn_decl @F.2 [template = constants.%F.2] {} {}
// CHECK:STDOUT: %.loc7_22: <witness> = interface_witness (%F.decl) [template = constants.%.10]
// CHECK:STDOUT:
@@ -206,35 +206,35 @@ interface A(T: type) {}
// CHECK:STDOUT: }
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.1: %X as %.1 {
// CHECK:STDOUT: impl @impl.1: %X.ref as %NotGenericNoParams.ref {
// CHECK:STDOUT: %.loc14: <witness> = interface_witness () [template = constants.%.10]
// CHECK:STDOUT:
// CHECK:STDOUT: !members:
// CHECK:STDOUT: witness = %.loc14
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.2: %X as %.3 {
// CHECK:STDOUT: impl @impl.2: %X.ref as %.loc15_30 {
// CHECK:STDOUT: %.loc15_33: <witness> = interface_witness () [template = constants.%.10]
// CHECK:STDOUT:
// CHECK:STDOUT: !members:
// CHECK:STDOUT: witness = %.loc15_33
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.3: %X as %.11 {
// CHECK:STDOUT: impl @impl.3: %X.ref.loc16_6 as %.loc16_27 {
// CHECK:STDOUT: %.loc16_31: <witness> = interface_witness () [template = constants.%.10]
// CHECK:STDOUT:
// CHECK:STDOUT: !members:
// CHECK:STDOUT: witness = %.loc16_31
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.4: %X as %.5 {
// CHECK:STDOUT: impl @impl.4: %X.ref.loc17_6 as %GenericNoParams.ref {
// CHECK:STDOUT: %.loc17: <witness> = interface_witness () [template = constants.%.10]
// CHECK:STDOUT:
// CHECK:STDOUT: !members:
// CHECK:STDOUT: witness = %.loc17
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.5: %X as %.13 {
// CHECK:STDOUT: impl @impl.5: %X.ref.loc18_6 as %.loc18_32 {
// CHECK:STDOUT: %.loc18_36: <witness> = interface_witness () [template = constants.%.10]
// CHECK:STDOUT:
// CHECK:STDOUT: !members:
@@ -38,7 +38,7 @@ impl library "[[@TEST_NAME]]";
// CHECK:STDOUT:
// CHECK:STDOUT: interface @A;
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl: %.2 as %.1;
// CHECK:STDOUT: impl @impl: %.loc3_7.2 as %A.ref;
// CHECK:STDOUT:
// CHECK:STDOUT: --- a.impl.carbon
// CHECK:STDOUT:
@@ -48,12 +48,14 @@ impl library "[[@TEST_NAME]]";
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: imports {
// CHECK:STDOUT: %import_ref = import_ref Main//a, inst+1, unloaded
// CHECK:STDOUT: %import_ref.1 = import_ref Main//a, inst+1, unloaded
// CHECK:STDOUT: %import_ref.2: type = import_ref Main//a, inst+5, loaded [template = constants.%.2]
// CHECK:STDOUT: %import_ref.3: type = import_ref Main//a, inst+6, loaded [template = constants.%.1]
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: file {
// CHECK:STDOUT: package: <namespace> = namespace [template] {
// CHECK:STDOUT: .A = imports.%import_ref
// CHECK:STDOUT: .A = imports.%import_ref.1
// CHECK:STDOUT: }
// CHECK:STDOUT: %default.import.loc1_6.1 = import <invalid>
// CHECK:STDOUT: %default.import.loc1_6.2 = import <invalid>
@@ -61,5 +63,5 @@ impl library "[[@TEST_NAME]]";
// CHECK:STDOUT:
// CHECK:STDOUT: interface @A;
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl: %.2 as %.1;
// CHECK:STDOUT: impl @impl: imports.%import_ref.2 as imports.%import_ref.3;
// CHECK:STDOUT:
+4 -4
View File
@@ -151,7 +151,7 @@ fn TestAssign(a: C*, b: C) {
// CHECK:STDOUT: witness = (imports.%import_ref.8)
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.1: %C as %.3 {
// CHECK:STDOUT: impl @impl.1: %C.ref as %Add.ref {
// CHECK:STDOUT: %Op.decl: %Op.type.1 = fn_decl @Op.1 [template = constants.%Op.1] {
// CHECK:STDOUT: %self.patt: %C = binding_pattern self
// CHECK:STDOUT: %other.patt: %C = binding_pattern other
@@ -172,7 +172,7 @@ fn TestAssign(a: C*, b: C) {
// CHECK:STDOUT: witness = %.loc17
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.2: %C as %.7 {
// CHECK:STDOUT: impl @impl.2: %C.ref as %AddAssign.ref {
// CHECK:STDOUT: %Op.decl: %Op.type.3 = fn_decl @Op.3 [template = constants.%Op.3] {
// CHECK:STDOUT: %self.patt: %.8 = binding_pattern self
// CHECK:STDOUT: %other.patt: %C = binding_pattern other
@@ -231,7 +231,7 @@ fn TestAssign(a: C*, b: C) {
// CHECK:STDOUT: %a.ref: %C = name_ref a, %a
// CHECK:STDOUT: %b.ref: %C = name_ref b, %b
// CHECK:STDOUT: %Op.ref: %.11 = name_ref Op, imports.%import_ref.3 [template = constants.%.12]
// CHECK:STDOUT: %.loc27_12.1: %Op.type.2 = interface_witness_access @impl.1.%.loc17, element0 [template = constants.%Op.1]
// CHECK:STDOUT: %.loc27_12.1: %Op.type.2 = interface_witness_access constants.%.5, element0 [template = constants.%Op.1]
// CHECK:STDOUT: %.loc27_12.2: <bound method> = bound_method %a.ref, %.loc27_12.1
// CHECK:STDOUT: %.loc26: ref %C = splice_block %return {}
// CHECK:STDOUT: %Op.call: init %C = call %.loc27_12.2(%a.ref, %b.ref) to %.loc26
@@ -244,7 +244,7 @@ fn TestAssign(a: C*, b: C) {
// CHECK:STDOUT: %.loc31_3.1: ref %C = deref %a.ref
// CHECK:STDOUT: %b.ref: %C = name_ref b, %b
// CHECK:STDOUT: %Op.ref: %.13 = name_ref Op, imports.%import_ref.7 [template = constants.%.14]
// CHECK:STDOUT: %.loc31_6.1: %Op.type.4 = interface_witness_access @impl.2.%.loc22, element0 [template = constants.%Op.3]
// CHECK:STDOUT: %.loc31_6.1: %Op.type.4 = interface_witness_access constants.%.10, element0 [template = constants.%Op.3]
// CHECK:STDOUT: %.loc31_6.2: <bound method> = bound_method %.loc31_3.1, %.loc31_6.1
// CHECK:STDOUT: %.loc31_3.2: %.8 = addr_of %.loc31_3.1
// CHECK:STDOUT: %Op.call: init %.4 = call %.loc31_6.2(%.loc31_3.2, %b.ref)
@@ -151,7 +151,7 @@ fn TestAssign(a: C*, b: C) {
// CHECK:STDOUT: witness = (imports.%import_ref.8)
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.1: %C as %.3 {
// CHECK:STDOUT: impl @impl.1: %C.ref as %BitAnd.ref {
// CHECK:STDOUT: %Op.decl: %Op.type.1 = fn_decl @Op.1 [template = constants.%Op.1] {
// CHECK:STDOUT: %self.patt: %C = binding_pattern self
// CHECK:STDOUT: %other.patt: %C = binding_pattern other
@@ -172,7 +172,7 @@ fn TestAssign(a: C*, b: C) {
// CHECK:STDOUT: witness = %.loc17
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.2: %C as %.7 {
// CHECK:STDOUT: impl @impl.2: %C.ref as %BitAndAssign.ref {
// CHECK:STDOUT: %Op.decl: %Op.type.3 = fn_decl @Op.3 [template = constants.%Op.3] {
// CHECK:STDOUT: %self.patt: %.8 = binding_pattern self
// CHECK:STDOUT: %other.patt: %C = binding_pattern other
@@ -231,7 +231,7 @@ fn TestAssign(a: C*, b: C) {
// CHECK:STDOUT: %a.ref: %C = name_ref a, %a
// CHECK:STDOUT: %b.ref: %C = name_ref b, %b
// CHECK:STDOUT: %Op.ref: %.11 = name_ref Op, imports.%import_ref.3 [template = constants.%.12]
// CHECK:STDOUT: %.loc27_12.1: %Op.type.2 = interface_witness_access @impl.1.%.loc17, element0 [template = constants.%Op.1]
// CHECK:STDOUT: %.loc27_12.1: %Op.type.2 = interface_witness_access constants.%.5, element0 [template = constants.%Op.1]
// CHECK:STDOUT: %.loc27_12.2: <bound method> = bound_method %a.ref, %.loc27_12.1
// CHECK:STDOUT: %.loc26: ref %C = splice_block %return {}
// CHECK:STDOUT: %Op.call: init %C = call %.loc27_12.2(%a.ref, %b.ref) to %.loc26
@@ -244,7 +244,7 @@ fn TestAssign(a: C*, b: C) {
// CHECK:STDOUT: %.loc31_3.1: ref %C = deref %a.ref
// CHECK:STDOUT: %b.ref: %C = name_ref b, %b
// CHECK:STDOUT: %Op.ref: %.13 = name_ref Op, imports.%import_ref.7 [template = constants.%.14]
// CHECK:STDOUT: %.loc31_6.1: %Op.type.4 = interface_witness_access @impl.2.%.loc22, element0 [template = constants.%Op.3]
// CHECK:STDOUT: %.loc31_6.1: %Op.type.4 = interface_witness_access constants.%.10, element0 [template = constants.%Op.3]
// CHECK:STDOUT: %.loc31_6.2: <bound method> = bound_method %.loc31_3.1, %.loc31_6.1
// CHECK:STDOUT: %.loc31_3.2: %.8 = addr_of %.loc31_3.1
// CHECK:STDOUT: %Op.call: init %.4 = call %.loc31_6.2(%.loc31_3.2, %b.ref)
@@ -96,7 +96,7 @@ fn TestOp(a: C) -> C {
// CHECK:STDOUT: witness = (imports.%import_ref.4)
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl: %C as %.3 {
// CHECK:STDOUT: impl @impl: %C.ref as %BitComplement.ref {
// CHECK:STDOUT: %Op.decl: %Op.type.1 = fn_decl @Op.1 [template = constants.%Op.1] {
// CHECK:STDOUT: %self.patt: %C = binding_pattern self
// CHECK:STDOUT: } {
@@ -138,7 +138,7 @@ fn TestOp(a: C) -> C {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %a.ref: %C = name_ref a, %a
// CHECK:STDOUT: %Op.ref: %.7 = name_ref Op, imports.%import_ref.3 [template = constants.%.8]
// CHECK:STDOUT: %.loc24_10.1: %Op.type.2 = interface_witness_access @impl.%.loc17, element0 [template = constants.%Op.1]
// CHECK:STDOUT: %.loc24_10.1: %Op.type.2 = interface_witness_access constants.%.5, element0 [template = constants.%Op.1]
// CHECK:STDOUT: %.loc24_10.2: <bound method> = bound_method %a.ref, %.loc24_10.1
// CHECK:STDOUT: %.loc23: ref %C = splice_block %return {}
// CHECK:STDOUT: %Op.call: init %C = call %.loc24_10.2(%a.ref) to %.loc23
@@ -151,7 +151,7 @@ fn TestAssign(a: C*, b: C) {
// CHECK:STDOUT: witness = (imports.%import_ref.8)
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.1: %C as %.3 {
// CHECK:STDOUT: impl @impl.1: %C.ref as %BitOr.ref {
// CHECK:STDOUT: %Op.decl: %Op.type.1 = fn_decl @Op.1 [template = constants.%Op.1] {
// CHECK:STDOUT: %self.patt: %C = binding_pattern self
// CHECK:STDOUT: %other.patt: %C = binding_pattern other
@@ -172,7 +172,7 @@ fn TestAssign(a: C*, b: C) {
// CHECK:STDOUT: witness = %.loc17
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.2: %C as %.7 {
// CHECK:STDOUT: impl @impl.2: %C.ref as %BitOrAssign.ref {
// CHECK:STDOUT: %Op.decl: %Op.type.3 = fn_decl @Op.3 [template = constants.%Op.3] {
// CHECK:STDOUT: %self.patt: %.8 = binding_pattern self
// CHECK:STDOUT: %other.patt: %C = binding_pattern other
@@ -231,7 +231,7 @@ fn TestAssign(a: C*, b: C) {
// CHECK:STDOUT: %a.ref: %C = name_ref a, %a
// CHECK:STDOUT: %b.ref: %C = name_ref b, %b
// CHECK:STDOUT: %Op.ref: %.11 = name_ref Op, imports.%import_ref.3 [template = constants.%.12]
// CHECK:STDOUT: %.loc27_12.1: %Op.type.2 = interface_witness_access @impl.1.%.loc17, element0 [template = constants.%Op.1]
// CHECK:STDOUT: %.loc27_12.1: %Op.type.2 = interface_witness_access constants.%.5, element0 [template = constants.%Op.1]
// CHECK:STDOUT: %.loc27_12.2: <bound method> = bound_method %a.ref, %.loc27_12.1
// CHECK:STDOUT: %.loc26: ref %C = splice_block %return {}
// CHECK:STDOUT: %Op.call: init %C = call %.loc27_12.2(%a.ref, %b.ref) to %.loc26
@@ -244,7 +244,7 @@ fn TestAssign(a: C*, b: C) {
// CHECK:STDOUT: %.loc31_3.1: ref %C = deref %a.ref
// CHECK:STDOUT: %b.ref: %C = name_ref b, %b
// CHECK:STDOUT: %Op.ref: %.13 = name_ref Op, imports.%import_ref.7 [template = constants.%.14]
// CHECK:STDOUT: %.loc31_6.1: %Op.type.4 = interface_witness_access @impl.2.%.loc22, element0 [template = constants.%Op.3]
// CHECK:STDOUT: %.loc31_6.1: %Op.type.4 = interface_witness_access constants.%.10, element0 [template = constants.%Op.3]
// CHECK:STDOUT: %.loc31_6.2: <bound method> = bound_method %.loc31_3.1, %.loc31_6.1
// CHECK:STDOUT: %.loc31_3.2: %.8 = addr_of %.loc31_3.1
// CHECK:STDOUT: %Op.call: init %.4 = call %.loc31_6.2(%.loc31_3.2, %b.ref)
@@ -151,7 +151,7 @@ fn TestAssign(a: C*, b: C) {
// CHECK:STDOUT: witness = (imports.%import_ref.8)
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.1: %C as %.3 {
// CHECK:STDOUT: impl @impl.1: %C.ref as %BitXor.ref {
// CHECK:STDOUT: %Op.decl: %Op.type.1 = fn_decl @Op.1 [template = constants.%Op.1] {
// CHECK:STDOUT: %self.patt: %C = binding_pattern self
// CHECK:STDOUT: %other.patt: %C = binding_pattern other
@@ -172,7 +172,7 @@ fn TestAssign(a: C*, b: C) {
// CHECK:STDOUT: witness = %.loc17
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.2: %C as %.7 {
// CHECK:STDOUT: impl @impl.2: %C.ref as %BitXorAssign.ref {
// CHECK:STDOUT: %Op.decl: %Op.type.3 = fn_decl @Op.3 [template = constants.%Op.3] {
// CHECK:STDOUT: %self.patt: %.8 = binding_pattern self
// CHECK:STDOUT: %other.patt: %C = binding_pattern other
@@ -231,7 +231,7 @@ fn TestAssign(a: C*, b: C) {
// CHECK:STDOUT: %a.ref: %C = name_ref a, %a
// CHECK:STDOUT: %b.ref: %C = name_ref b, %b
// CHECK:STDOUT: %Op.ref: %.11 = name_ref Op, imports.%import_ref.3 [template = constants.%.12]
// CHECK:STDOUT: %.loc27_12.1: %Op.type.2 = interface_witness_access @impl.1.%.loc17, element0 [template = constants.%Op.1]
// CHECK:STDOUT: %.loc27_12.1: %Op.type.2 = interface_witness_access constants.%.5, element0 [template = constants.%Op.1]
// CHECK:STDOUT: %.loc27_12.2: <bound method> = bound_method %a.ref, %.loc27_12.1
// CHECK:STDOUT: %.loc26: ref %C = splice_block %return {}
// CHECK:STDOUT: %Op.call: init %C = call %.loc27_12.2(%a.ref, %b.ref) to %.loc26
@@ -244,7 +244,7 @@ fn TestAssign(a: C*, b: C) {
// CHECK:STDOUT: %.loc31_3.1: ref %C = deref %a.ref
// CHECK:STDOUT: %b.ref: %C = name_ref b, %b
// CHECK:STDOUT: %Op.ref: %.13 = name_ref Op, imports.%import_ref.7 [template = constants.%.14]
// CHECK:STDOUT: %.loc31_6.1: %Op.type.4 = interface_witness_access @impl.2.%.loc22, element0 [template = constants.%Op.3]
// CHECK:STDOUT: %.loc31_6.1: %Op.type.4 = interface_witness_access constants.%.10, element0 [template = constants.%Op.3]
// CHECK:STDOUT: %.loc31_6.2: <bound method> = bound_method %.loc31_3.1, %.loc31_6.1
// CHECK:STDOUT: %.loc31_3.2: %.8 = addr_of %.loc31_3.1
// CHECK:STDOUT: %Op.call: init %.4 = call %.loc31_6.2(%.loc31_3.2, %b.ref)
+2 -2
View File
@@ -89,7 +89,7 @@ fn TestOp() {
// CHECK:STDOUT: witness = (imports.%import_ref.4)
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl: %C as %.3 {
// CHECK:STDOUT: impl @impl: %C.ref as %Dec.ref {
// CHECK:STDOUT: %Op.decl: %Op.type.1 = fn_decl @Op.1 [template = constants.%Op.1] {
// CHECK:STDOUT: %self.patt: %.4 = binding_pattern self
// CHECK:STDOUT: } {
@@ -133,7 +133,7 @@ fn TestOp() {
// CHECK:STDOUT: assign %c.var, %.loc22_16
// CHECK:STDOUT: %c.ref: ref %C = name_ref c, %c
// CHECK:STDOUT: %Op.ref: %.9 = name_ref Op, imports.%import_ref.3 [template = constants.%.10]
// CHECK:STDOUT: %.loc23_3.1: %Op.type.2 = interface_witness_access @impl.%.loc17, element0 [template = constants.%Op.1]
// CHECK:STDOUT: %.loc23_3.1: %Op.type.2 = interface_witness_access constants.%.7, element0 [template = constants.%Op.1]
// CHECK:STDOUT: %.loc23_3.2: <bound method> = bound_method %c.ref, %.loc23_3.1
// CHECK:STDOUT: %.loc23_5: %.4 = addr_of %c.ref
// CHECK:STDOUT: %Op.call: init %.5 = call %.loc23_3.2(%.loc23_5)
+4 -4
View File
@@ -151,7 +151,7 @@ fn TestAssign(a: C*, b: C) {
// CHECK:STDOUT: witness = (imports.%import_ref.8)
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.1: %C as %.3 {
// CHECK:STDOUT: impl @impl.1: %C.ref as %Div.ref {
// CHECK:STDOUT: %Op.decl: %Op.type.1 = fn_decl @Op.1 [template = constants.%Op.1] {
// CHECK:STDOUT: %self.patt: %C = binding_pattern self
// CHECK:STDOUT: %other.patt: %C = binding_pattern other
@@ -172,7 +172,7 @@ fn TestAssign(a: C*, b: C) {
// CHECK:STDOUT: witness = %.loc17
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.2: %C as %.7 {
// CHECK:STDOUT: impl @impl.2: %C.ref as %DivAssign.ref {
// CHECK:STDOUT: %Op.decl: %Op.type.3 = fn_decl @Op.3 [template = constants.%Op.3] {
// CHECK:STDOUT: %self.patt: %.8 = binding_pattern self
// CHECK:STDOUT: %other.patt: %C = binding_pattern other
@@ -231,7 +231,7 @@ fn TestAssign(a: C*, b: C) {
// CHECK:STDOUT: %a.ref: %C = name_ref a, %a
// CHECK:STDOUT: %b.ref: %C = name_ref b, %b
// CHECK:STDOUT: %Op.ref: %.11 = name_ref Op, imports.%import_ref.3 [template = constants.%.12]
// CHECK:STDOUT: %.loc27_12.1: %Op.type.2 = interface_witness_access @impl.1.%.loc17, element0 [template = constants.%Op.1]
// CHECK:STDOUT: %.loc27_12.1: %Op.type.2 = interface_witness_access constants.%.5, element0 [template = constants.%Op.1]
// CHECK:STDOUT: %.loc27_12.2: <bound method> = bound_method %a.ref, %.loc27_12.1
// CHECK:STDOUT: %.loc26: ref %C = splice_block %return {}
// CHECK:STDOUT: %Op.call: init %C = call %.loc27_12.2(%a.ref, %b.ref) to %.loc26
@@ -244,7 +244,7 @@ fn TestAssign(a: C*, b: C) {
// CHECK:STDOUT: %.loc31_3.1: ref %C = deref %a.ref
// CHECK:STDOUT: %b.ref: %C = name_ref b, %b
// CHECK:STDOUT: %Op.ref: %.13 = name_ref Op, imports.%import_ref.7 [template = constants.%.14]
// CHECK:STDOUT: %.loc31_6.1: %Op.type.4 = interface_witness_access @impl.2.%.loc22, element0 [template = constants.%Op.3]
// CHECK:STDOUT: %.loc31_6.1: %Op.type.4 = interface_witness_access constants.%.10, element0 [template = constants.%Op.3]
// CHECK:STDOUT: %.loc31_6.2: <bound method> = bound_method %.loc31_3.1, %.loc31_6.1
// CHECK:STDOUT: %.loc31_3.2: %.8 = addr_of %.loc31_3.1
// CHECK:STDOUT: %Op.call: init %.4 = call %.loc31_6.2(%.loc31_3.2, %b.ref)
+5 -5
View File
@@ -191,7 +191,7 @@ fn TestLhsBad(a: D, b: C) -> bool {
// CHECK:STDOUT: witness = (imports.%import_ref.5, imports.%import_ref.6)
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl: %C as %.3 {
// CHECK:STDOUT: impl @impl: %C.ref as %Eq.ref {
// CHECK:STDOUT: %Equal.decl: %Equal.type.1 = fn_decl @Equal.1 [template = constants.%Equal.1] {
// CHECK:STDOUT: %self.patt: %C = binding_pattern self
// CHECK:STDOUT: %other.patt: %C = binding_pattern other
@@ -260,7 +260,7 @@ fn TestLhsBad(a: D, b: C) -> bool {
// CHECK:STDOUT: %a.ref: %C = name_ref a, %a
// CHECK:STDOUT: %b.ref: %C = name_ref b, %b
// CHECK:STDOUT: %Equal.ref: %.7 = name_ref Equal, imports.%import_ref.3 [template = constants.%.8]
// CHECK:STDOUT: %.loc12_12.1: %Equal.type.2 = interface_witness_access @impl.%.loc6, element0 [template = constants.%Equal.1]
// CHECK:STDOUT: %.loc12_12.1: %Equal.type.2 = interface_witness_access constants.%.5, element0 [template = constants.%Equal.1]
// CHECK:STDOUT: %.loc12_12.2: <bound method> = bound_method %a.ref, %.loc12_12.1
// CHECK:STDOUT: %Equal.call: init bool = call %.loc12_12.2(%a.ref, %b.ref)
// CHECK:STDOUT: %.loc12_16.1: bool = value_of_initializer %Equal.call
@@ -273,7 +273,7 @@ fn TestLhsBad(a: D, b: C) -> bool {
// CHECK:STDOUT: %a.ref: %C = name_ref a, %a
// CHECK:STDOUT: %b.ref: %C = name_ref b, %b
// CHECK:STDOUT: %NotEqual.ref: %.9 = name_ref NotEqual, imports.%import_ref.4 [template = constants.%.10]
// CHECK:STDOUT: %.loc16_12.1: %NotEqual.type.2 = interface_witness_access @impl.%.loc6, element1 [template = constants.%NotEqual.1]
// CHECK:STDOUT: %.loc16_12.1: %NotEqual.type.2 = interface_witness_access constants.%.5, element1 [template = constants.%NotEqual.1]
// CHECK:STDOUT: %.loc16_12.2: <bound method> = bound_method %a.ref, %.loc16_12.1
// CHECK:STDOUT: %NotEqual.call: init bool = call %.loc16_12.2(%a.ref, %b.ref)
// CHECK:STDOUT: %.loc16_16.1: bool = value_of_initializer %NotEqual.call
@@ -595,7 +595,7 @@ fn TestLhsBad(a: D, b: C) -> bool {
// CHECK:STDOUT: }
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl: %C as %.3 {
// CHECK:STDOUT: impl @impl: %C.ref as %Eq.ref {
// CHECK:STDOUT: %Equal.decl: %Equal.type.1 = fn_decl @Equal.1 [template = constants.%Equal.1] {
// CHECK:STDOUT: %self.patt: %C = binding_pattern self
// CHECK:STDOUT: %other.patt: %C = binding_pattern other
@@ -671,7 +671,7 @@ fn TestLhsBad(a: D, b: C) -> bool {
// CHECK:STDOUT: %a.ref: %C = name_ref a, %a
// CHECK:STDOUT: %b.ref: %D = name_ref b, %b
// CHECK:STDOUT: %Equal.ref: %.7 = name_ref Equal, imports.%import_ref.3 [template = constants.%.8]
// CHECK:STDOUT: %.loc23_12.1: %Equal.type.2 = interface_witness_access @impl.%.loc7, element0 [template = constants.%Equal.1]
// CHECK:STDOUT: %.loc23_12.1: %Equal.type.2 = interface_witness_access constants.%.5, element0 [template = constants.%Equal.1]
// CHECK:STDOUT: %.loc23_12.2: <bound method> = bound_method %a.ref, %.loc23_12.1
// CHECK:STDOUT: %.loc23_12.3: type = interface_type @ImplicitAs, @ImplicitAs(constants.%C) [template = constants.%.12]
// CHECK:STDOUT: %.loc23_12.4: %.13 = specific_constant imports.%import_ref.11, @ImplicitAs(constants.%C) [template = constants.%.14]
@@ -153,7 +153,7 @@ fn TestAddAssignNonRef(a: C, b: C) {
// CHECK:STDOUT: witness = (imports.%import_ref.8)
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.1: %C as %.3 {
// CHECK:STDOUT: impl @impl.1: %C.ref as %Inc.ref {
// CHECK:STDOUT: %Op.decl: %Op.type.1 = fn_decl @Op.1 [template = constants.%Op.1] {
// CHECK:STDOUT: %self.patt: %.4 = binding_pattern self
// CHECK:STDOUT: } {
@@ -170,7 +170,7 @@ fn TestAddAssignNonRef(a: C, b: C) {
// CHECK:STDOUT: witness = %.loc15
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.2: %C as %.8 {
// CHECK:STDOUT: impl @impl.2: %C.ref as %AddAssign.ref {
// CHECK:STDOUT: %Op.decl: %Op.type.3 = fn_decl @Op.3 [template = constants.%Op.3] {
// CHECK:STDOUT: %self.patt: %.4 = binding_pattern self
// CHECK:STDOUT: %other.patt: %C = binding_pattern other
@@ -220,7 +220,7 @@ fn TestAddAssignNonRef(a: C, b: C) {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %a.ref: %C = name_ref a, %a
// CHECK:STDOUT: %Op.ref: %.12 = name_ref Op, imports.%import_ref.3 [template = constants.%.13]
// CHECK:STDOUT: %.loc30_3.1: %Op.type.2 = interface_witness_access @impl.1.%.loc15, element0 [template = constants.%Op.1]
// CHECK:STDOUT: %.loc30_3.1: %Op.type.2 = interface_witness_access constants.%.7, element0 [template = constants.%Op.1]
// CHECK:STDOUT: %.loc30_3.2: <bound method> = bound_method %a.ref, %.loc30_3.1
// CHECK:STDOUT: %Op.call: init %.5 = call %.loc30_3.2(<invalid>) [template = <error>]
// CHECK:STDOUT: return
@@ -231,7 +231,7 @@ fn TestAddAssignNonRef(a: C, b: C) {
// CHECK:STDOUT: %a.ref: %C = name_ref a, %a
// CHECK:STDOUT: %b.ref: %C = name_ref b, %b
// CHECK:STDOUT: %Op.ref: %.14 = name_ref Op, imports.%import_ref.7 [template = constants.%.15]
// CHECK:STDOUT: %.loc40_5.1: %Op.type.4 = interface_witness_access @impl.2.%.loc18, element0 [template = constants.%Op.3]
// CHECK:STDOUT: %.loc40_5.1: %Op.type.4 = interface_witness_access constants.%.10, element0 [template = constants.%Op.3]
// CHECK:STDOUT: %.loc40_5.2: <bound method> = bound_method %a.ref, %.loc40_5.1
// CHECK:STDOUT: %Op.call: init %.5 = call %.loc40_5.2(<invalid>) [template = <error>]
// CHECK:STDOUT: return
@@ -208,7 +208,7 @@ fn TestAssign(b: D) {
// CHECK:STDOUT: }
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.1: %C as %.3 {
// CHECK:STDOUT: impl @impl.1: %C.ref as %Add.ref {
// CHECK:STDOUT: %Op.decl: %Op.type.1 = fn_decl @Op.1 [template = constants.%Op.1] {
// CHECK:STDOUT: %self.patt: %C = binding_pattern self
// CHECK:STDOUT: %other.patt: %C = binding_pattern other
@@ -229,7 +229,7 @@ fn TestAssign(b: D) {
// CHECK:STDOUT: witness = %.loc16
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.2: %C as %.6 {
// CHECK:STDOUT: impl @impl.2: %C.ref as %AddAssign.ref {
// CHECK:STDOUT: %Op.decl: %Op.type.3 = fn_decl @Op.3 [template = constants.%Op.3] {
// CHECK:STDOUT: %self.patt: %.7 = binding_pattern self
// CHECK:STDOUT: %other.patt: %C = binding_pattern other
@@ -286,7 +286,7 @@ fn TestAssign(b: D) {
// CHECK:STDOUT: %a.ref: %C = name_ref a, %a
// CHECK:STDOUT: %b.ref: %D = name_ref b, %b
// CHECK:STDOUT: %Op.ref: %.11 = name_ref Op, imports.%import_ref.3 [template = constants.%.12]
// CHECK:STDOUT: %.loc34_12.1: %Op.type.2 = interface_witness_access @impl.1.%.loc16, element0 [template = constants.%Op.1]
// CHECK:STDOUT: %.loc34_12.1: %Op.type.2 = interface_witness_access constants.%.5, element0 [template = constants.%Op.1]
// CHECK:STDOUT: %.loc34_12.2: <bound method> = bound_method %a.ref, %.loc34_12.1
// CHECK:STDOUT: %.loc34_12.3: ref %C = temporary_storage
// CHECK:STDOUT: %.loc34_12.4: type = interface_type @ImplicitAs, @ImplicitAs(constants.%C) [template = constants.%.16]
@@ -317,7 +317,7 @@ fn TestAssign(b: D) {
// CHECK:STDOUT: %a.ref: ref %C = name_ref a, %a
// CHECK:STDOUT: %b.ref: %D = name_ref b, %b
// CHECK:STDOUT: %Op.ref: %.20 = name_ref Op, imports.%import_ref.7 [template = constants.%.21]
// CHECK:STDOUT: %.loc48_5.1: %Op.type.4 = interface_witness_access @impl.2.%.loc19, element0 [template = constants.%Op.3]
// CHECK:STDOUT: %.loc48_5.1: %Op.type.4 = interface_witness_access constants.%.9, element0 [template = constants.%Op.3]
// CHECK:STDOUT: %.loc48_5.2: <bound method> = bound_method %a.ref, %.loc48_5.1
// CHECK:STDOUT: %.loc48_3: %.7 = addr_of %a.ref
// CHECK:STDOUT: %.loc48_5.3: type = interface_type @ImplicitAs, @ImplicitAs(constants.%C) [template = constants.%.16]
@@ -177,7 +177,7 @@ fn Test() {
// CHECK:STDOUT: }
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.1: i32 as %.8 {
// CHECK:STDOUT: impl @impl.1: %.loc15_6.2 as %.loc15_28 {
// CHECK:STDOUT: %Convert.decl: %Convert.type.2 = fn_decl @Convert.2 [template = constants.%Convert.2] {
// CHECK:STDOUT: %self.patt: i32 = binding_pattern self
// CHECK:STDOUT: } {
@@ -196,7 +196,7 @@ fn Test() {
// CHECK:STDOUT: witness = %.loc15_32
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.2: %X as %.13 {
// CHECK:STDOUT: impl @impl.2: %X.ref as %.loc19_26.3 {
// CHECK:STDOUT: %Convert.decl: %Convert.type.4 = fn_decl @Convert.3 [template = constants.%Convert.4] {
// CHECK:STDOUT: %self.patt: %X = binding_pattern self
// CHECK:STDOUT: } {
@@ -278,7 +278,7 @@ fn Test() {
// CHECK:STDOUT: %.loc30_11.2: %.14 = specific_constant imports.%import_ref.4, @ImplicitAs(i32) [template = constants.%.15]
// CHECK:STDOUT: %Convert.ref.loc30: %.14 = name_ref Convert, %.loc30_11.2 [template = constants.%.15]
// CHECK:STDOUT: %.loc30_18.2: ref %X = temporary %.loc30_18.1, %Source.call.loc30
// CHECK:STDOUT: %.loc30_11.3: %Convert.type.5 = interface_witness_access @impl.2.%.loc19_32, element0 [template = constants.%Convert.4]
// CHECK:STDOUT: %.loc30_11.3: %Convert.type.5 = interface_witness_access constants.%.16, element0 [template = constants.%Convert.4]
// CHECK:STDOUT: %.loc30_11.4: <bound method> = bound_method %.loc30_18.2, %.loc30_11.3
// CHECK:STDOUT: %.loc30_18.3: %X = bind_value %.loc30_18.2
// CHECK:STDOUT: %Convert.call.loc30: init i32 = call %.loc30_11.4(%.loc30_18.3)
@@ -298,7 +298,7 @@ fn Test() {
// CHECK:STDOUT: %Convert.ref.loc31: %.9 = name_ref Convert, %.loc31_9.2 [template = constants.%.10]
// CHECK:STDOUT: %.loc31_16.3: ref i32 = temporary_storage
// CHECK:STDOUT: %.loc31_16.4: ref i32 = temporary %.loc31_16.3, %Source.call.loc31
// CHECK:STDOUT: %.loc31_9.3: %Convert.type.3 = interface_witness_access @impl.1.%.loc15_32, element0 [template = constants.%Convert.2]
// CHECK:STDOUT: %.loc31_9.3: %Convert.type.3 = interface_witness_access constants.%.11, element0 [template = constants.%Convert.2]
// CHECK:STDOUT: %.loc31_9.4: <bound method> = bound_method %.loc31_16.4, %.loc31_9.3
// CHECK:STDOUT: %.loc31_9.5: ref %X = temporary_storage
// CHECK:STDOUT: %.loc31_16.5: i32 = bind_value %.loc31_16.4
+2 -2
View File
@@ -89,7 +89,7 @@ fn TestOp() {
// CHECK:STDOUT: witness = (imports.%import_ref.4)
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl: %C as %.3 {
// CHECK:STDOUT: impl @impl: %C.ref as %Inc.ref {
// CHECK:STDOUT: %Op.decl: %Op.type.1 = fn_decl @Op.1 [template = constants.%Op.1] {
// CHECK:STDOUT: %self.patt: %.4 = binding_pattern self
// CHECK:STDOUT: } {
@@ -133,7 +133,7 @@ fn TestOp() {
// CHECK:STDOUT: assign %c.var, %.loc22_16
// CHECK:STDOUT: %c.ref: ref %C = name_ref c, %c
// CHECK:STDOUT: %Op.ref: %.9 = name_ref Op, imports.%import_ref.3 [template = constants.%.10]
// CHECK:STDOUT: %.loc23_3.1: %Op.type.2 = interface_witness_access @impl.%.loc17, element0 [template = constants.%Op.1]
// CHECK:STDOUT: %.loc23_3.1: %Op.type.2 = interface_witness_access constants.%.7, element0 [template = constants.%Op.1]
// CHECK:STDOUT: %.loc23_3.2: <bound method> = bound_method %c.ref, %.loc23_3.1
// CHECK:STDOUT: %.loc23_5: %.4 = addr_of %c.ref
// CHECK:STDOUT: %Op.call: init %.5 = call %.loc23_3.2(%.loc23_5)
@@ -151,7 +151,7 @@ fn TestAssign(a: C*, b: C) {
// CHECK:STDOUT: witness = (imports.%import_ref.8)
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.1: %C as %.3 {
// CHECK:STDOUT: impl @impl.1: %C.ref as %LeftShift.ref {
// CHECK:STDOUT: %Op.decl: %Op.type.1 = fn_decl @Op.1 [template = constants.%Op.1] {
// CHECK:STDOUT: %self.patt: %C = binding_pattern self
// CHECK:STDOUT: %other.patt: %C = binding_pattern other
@@ -172,7 +172,7 @@ fn TestAssign(a: C*, b: C) {
// CHECK:STDOUT: witness = %.loc17
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.2: %C as %.7 {
// CHECK:STDOUT: impl @impl.2: %C.ref as %LeftShiftAssign.ref {
// CHECK:STDOUT: %Op.decl: %Op.type.3 = fn_decl @Op.3 [template = constants.%Op.3] {
// CHECK:STDOUT: %self.patt: %.8 = binding_pattern self
// CHECK:STDOUT: %other.patt: %C = binding_pattern other
@@ -231,7 +231,7 @@ fn TestAssign(a: C*, b: C) {
// CHECK:STDOUT: %a.ref: %C = name_ref a, %a
// CHECK:STDOUT: %b.ref: %C = name_ref b, %b
// CHECK:STDOUT: %Op.ref: %.11 = name_ref Op, imports.%import_ref.3 [template = constants.%.12]
// CHECK:STDOUT: %.loc27_12.1: %Op.type.2 = interface_witness_access @impl.1.%.loc17, element0 [template = constants.%Op.1]
// CHECK:STDOUT: %.loc27_12.1: %Op.type.2 = interface_witness_access constants.%.5, element0 [template = constants.%Op.1]
// CHECK:STDOUT: %.loc27_12.2: <bound method> = bound_method %a.ref, %.loc27_12.1
// CHECK:STDOUT: %.loc26: ref %C = splice_block %return {}
// CHECK:STDOUT: %Op.call: init %C = call %.loc27_12.2(%a.ref, %b.ref) to %.loc26
@@ -244,7 +244,7 @@ fn TestAssign(a: C*, b: C) {
// CHECK:STDOUT: %.loc31_3.1: ref %C = deref %a.ref
// CHECK:STDOUT: %b.ref: %C = name_ref b, %b
// CHECK:STDOUT: %Op.ref: %.13 = name_ref Op, imports.%import_ref.7 [template = constants.%.14]
// CHECK:STDOUT: %.loc31_6.1: %Op.type.4 = interface_witness_access @impl.2.%.loc22, element0 [template = constants.%Op.3]
// CHECK:STDOUT: %.loc31_6.1: %Op.type.4 = interface_witness_access constants.%.10, element0 [template = constants.%Op.3]
// CHECK:STDOUT: %.loc31_6.2: <bound method> = bound_method %.loc31_3.1, %.loc31_6.1
// CHECK:STDOUT: %.loc31_3.2: %.8 = addr_of %.loc31_3.1
// CHECK:STDOUT: %Op.call: init %.4 = call %.loc31_6.2(%.loc31_3.2, %b.ref)
+4 -4
View File
@@ -151,7 +151,7 @@ fn TestAssign(a: C*, b: C) {
// CHECK:STDOUT: witness = (imports.%import_ref.8)
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.1: %C as %.3 {
// CHECK:STDOUT: impl @impl.1: %C.ref as %Mod.ref {
// CHECK:STDOUT: %Op.decl: %Op.type.1 = fn_decl @Op.1 [template = constants.%Op.1] {
// CHECK:STDOUT: %self.patt: %C = binding_pattern self
// CHECK:STDOUT: %other.patt: %C = binding_pattern other
@@ -172,7 +172,7 @@ fn TestAssign(a: C*, b: C) {
// CHECK:STDOUT: witness = %.loc17
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.2: %C as %.7 {
// CHECK:STDOUT: impl @impl.2: %C.ref as %ModAssign.ref {
// CHECK:STDOUT: %Op.decl: %Op.type.3 = fn_decl @Op.3 [template = constants.%Op.3] {
// CHECK:STDOUT: %self.patt: %.8 = binding_pattern self
// CHECK:STDOUT: %other.patt: %C = binding_pattern other
@@ -231,7 +231,7 @@ fn TestAssign(a: C*, b: C) {
// CHECK:STDOUT: %a.ref: %C = name_ref a, %a
// CHECK:STDOUT: %b.ref: %C = name_ref b, %b
// CHECK:STDOUT: %Op.ref: %.11 = name_ref Op, imports.%import_ref.3 [template = constants.%.12]
// CHECK:STDOUT: %.loc27_12.1: %Op.type.2 = interface_witness_access @impl.1.%.loc17, element0 [template = constants.%Op.1]
// CHECK:STDOUT: %.loc27_12.1: %Op.type.2 = interface_witness_access constants.%.5, element0 [template = constants.%Op.1]
// CHECK:STDOUT: %.loc27_12.2: <bound method> = bound_method %a.ref, %.loc27_12.1
// CHECK:STDOUT: %.loc26: ref %C = splice_block %return {}
// CHECK:STDOUT: %Op.call: init %C = call %.loc27_12.2(%a.ref, %b.ref) to %.loc26
@@ -244,7 +244,7 @@ fn TestAssign(a: C*, b: C) {
// CHECK:STDOUT: %.loc31_3.1: ref %C = deref %a.ref
// CHECK:STDOUT: %b.ref: %C = name_ref b, %b
// CHECK:STDOUT: %Op.ref: %.13 = name_ref Op, imports.%import_ref.7 [template = constants.%.14]
// CHECK:STDOUT: %.loc31_6.1: %Op.type.4 = interface_witness_access @impl.2.%.loc22, element0 [template = constants.%Op.3]
// CHECK:STDOUT: %.loc31_6.1: %Op.type.4 = interface_witness_access constants.%.10, element0 [template = constants.%Op.3]
// CHECK:STDOUT: %.loc31_6.2: <bound method> = bound_method %.loc31_3.1, %.loc31_6.1
// CHECK:STDOUT: %.loc31_3.2: %.8 = addr_of %.loc31_3.1
// CHECK:STDOUT: %Op.call: init %.4 = call %.loc31_6.2(%.loc31_3.2, %b.ref)
+4 -4
View File
@@ -151,7 +151,7 @@ fn TestAssign(a: C*, b: C) {
// CHECK:STDOUT: witness = (imports.%import_ref.8)
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.1: %C as %.3 {
// CHECK:STDOUT: impl @impl.1: %C.ref as %Mul.ref {
// CHECK:STDOUT: %Op.decl: %Op.type.1 = fn_decl @Op.1 [template = constants.%Op.1] {
// CHECK:STDOUT: %self.patt: %C = binding_pattern self
// CHECK:STDOUT: %other.patt: %C = binding_pattern other
@@ -172,7 +172,7 @@ fn TestAssign(a: C*, b: C) {
// CHECK:STDOUT: witness = %.loc17
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.2: %C as %.7 {
// CHECK:STDOUT: impl @impl.2: %C.ref as %MulAssign.ref {
// CHECK:STDOUT: %Op.decl: %Op.type.3 = fn_decl @Op.3 [template = constants.%Op.3] {
// CHECK:STDOUT: %self.patt: %.8 = binding_pattern self
// CHECK:STDOUT: %other.patt: %C = binding_pattern other
@@ -231,7 +231,7 @@ fn TestAssign(a: C*, b: C) {
// CHECK:STDOUT: %a.ref: %C = name_ref a, %a
// CHECK:STDOUT: %b.ref: %C = name_ref b, %b
// CHECK:STDOUT: %Op.ref: %.11 = name_ref Op, imports.%import_ref.3 [template = constants.%.12]
// CHECK:STDOUT: %.loc27_12.1: %Op.type.2 = interface_witness_access @impl.1.%.loc17, element0 [template = constants.%Op.1]
// CHECK:STDOUT: %.loc27_12.1: %Op.type.2 = interface_witness_access constants.%.5, element0 [template = constants.%Op.1]
// CHECK:STDOUT: %.loc27_12.2: <bound method> = bound_method %a.ref, %.loc27_12.1
// CHECK:STDOUT: %.loc26: ref %C = splice_block %return {}
// CHECK:STDOUT: %Op.call: init %C = call %.loc27_12.2(%a.ref, %b.ref) to %.loc26
@@ -244,7 +244,7 @@ fn TestAssign(a: C*, b: C) {
// CHECK:STDOUT: %.loc31_3.1: ref %C = deref %a.ref
// CHECK:STDOUT: %b.ref: %C = name_ref b, %b
// CHECK:STDOUT: %Op.ref: %.13 = name_ref Op, imports.%import_ref.7 [template = constants.%.14]
// CHECK:STDOUT: %.loc31_6.1: %Op.type.4 = interface_witness_access @impl.2.%.loc22, element0 [template = constants.%Op.3]
// CHECK:STDOUT: %.loc31_6.1: %Op.type.4 = interface_witness_access constants.%.10, element0 [template = constants.%Op.3]
// CHECK:STDOUT: %.loc31_6.2: <bound method> = bound_method %.loc31_3.1, %.loc31_6.1
// CHECK:STDOUT: %.loc31_3.2: %.8 = addr_of %.loc31_3.1
// CHECK:STDOUT: %Op.call: init %.4 = call %.loc31_6.2(%.loc31_3.2, %b.ref)
@@ -96,7 +96,7 @@ fn TestOp(a: C) -> C {
// CHECK:STDOUT: witness = (imports.%import_ref.4)
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl: %C as %.3 {
// CHECK:STDOUT: impl @impl: %C.ref as %Negate.ref {
// CHECK:STDOUT: %Op.decl: %Op.type.1 = fn_decl @Op.1 [template = constants.%Op.1] {
// CHECK:STDOUT: %self.patt: %C = binding_pattern self
// CHECK:STDOUT: } {
@@ -138,7 +138,7 @@ fn TestOp(a: C) -> C {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %a.ref: %C = name_ref a, %a
// CHECK:STDOUT: %Op.ref: %.7 = name_ref Op, imports.%import_ref.3 [template = constants.%.8]
// CHECK:STDOUT: %.loc24_10.1: %Op.type.2 = interface_witness_access @impl.%.loc17, element0 [template = constants.%Op.1]
// CHECK:STDOUT: %.loc24_10.1: %Op.type.2 = interface_witness_access constants.%.5, element0 [template = constants.%Op.1]
// CHECK:STDOUT: %.loc24_10.2: <bound method> = bound_method %a.ref, %.loc24_10.1
// CHECK:STDOUT: %.loc23: ref %C = splice_block %return {}
// CHECK:STDOUT: %Op.call: init %C = call %.loc24_10.2(%a.ref) to %.loc23
@@ -239,7 +239,7 @@ fn TestGreaterEqual(a: D, b: D) -> bool {
// CHECK:STDOUT: witness = (imports.%import_ref.7, imports.%import_ref.8, imports.%import_ref.9, imports.%import_ref.10)
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl: %C as %.3 {
// CHECK:STDOUT: impl @impl: %C.ref as %Ordered.ref {
// CHECK:STDOUT: %Less.decl: %Less.type.1 = fn_decl @Less.1 [template = constants.%Less.1] {
// CHECK:STDOUT: %self.patt: %C = binding_pattern self
// CHECK:STDOUT: %other.patt: %C = binding_pattern other
@@ -356,7 +356,7 @@ fn TestGreaterEqual(a: D, b: D) -> bool {
// CHECK:STDOUT: %a.ref: %C = name_ref a, %a
// CHECK:STDOUT: %b.ref: %C = name_ref b, %b
// CHECK:STDOUT: %Less.ref: %.7 = name_ref Less, imports.%import_ref.3 [template = constants.%.8]
// CHECK:STDOUT: %.loc14_12.1: %Less.type.2 = interface_witness_access @impl.%.loc6, element0 [template = constants.%Less.1]
// CHECK:STDOUT: %.loc14_12.1: %Less.type.2 = interface_witness_access constants.%.5, element0 [template = constants.%Less.1]
// CHECK:STDOUT: %.loc14_12.2: <bound method> = bound_method %a.ref, %.loc14_12.1
// CHECK:STDOUT: %Less.call: init bool = call %.loc14_12.2(%a.ref, %b.ref)
// CHECK:STDOUT: %.loc14_15.1: bool = value_of_initializer %Less.call
@@ -369,7 +369,7 @@ fn TestGreaterEqual(a: D, b: D) -> bool {
// CHECK:STDOUT: %a.ref: %C = name_ref a, %a
// CHECK:STDOUT: %b.ref: %C = name_ref b, %b
// CHECK:STDOUT: %LessOrEquivalent.ref: %.9 = name_ref LessOrEquivalent, imports.%import_ref.4 [template = constants.%.10]
// CHECK:STDOUT: %.loc18_12.1: %LessOrEquivalent.type.2 = interface_witness_access @impl.%.loc6, element1 [template = constants.%LessOrEquivalent.1]
// CHECK:STDOUT: %.loc18_12.1: %LessOrEquivalent.type.2 = interface_witness_access constants.%.5, element1 [template = constants.%LessOrEquivalent.1]
// CHECK:STDOUT: %.loc18_12.2: <bound method> = bound_method %a.ref, %.loc18_12.1
// CHECK:STDOUT: %LessOrEquivalent.call: init bool = call %.loc18_12.2(%a.ref, %b.ref)
// CHECK:STDOUT: %.loc18_16.1: bool = value_of_initializer %LessOrEquivalent.call
@@ -382,7 +382,7 @@ fn TestGreaterEqual(a: D, b: D) -> bool {
// CHECK:STDOUT: %a.ref: %C = name_ref a, %a
// CHECK:STDOUT: %b.ref: %C = name_ref b, %b
// CHECK:STDOUT: %Greater.ref: %.11 = name_ref Greater, imports.%import_ref.5 [template = constants.%.12]
// CHECK:STDOUT: %.loc22_12.1: %Greater.type.2 = interface_witness_access @impl.%.loc6, element2 [template = constants.%Greater.1]
// CHECK:STDOUT: %.loc22_12.1: %Greater.type.2 = interface_witness_access constants.%.5, element2 [template = constants.%Greater.1]
// CHECK:STDOUT: %.loc22_12.2: <bound method> = bound_method %a.ref, %.loc22_12.1
// CHECK:STDOUT: %Greater.call: init bool = call %.loc22_12.2(%a.ref, %b.ref)
// CHECK:STDOUT: %.loc22_15.1: bool = value_of_initializer %Greater.call
@@ -395,7 +395,7 @@ fn TestGreaterEqual(a: D, b: D) -> bool {
// CHECK:STDOUT: %a.ref: %C = name_ref a, %a
// CHECK:STDOUT: %b.ref: %C = name_ref b, %b
// CHECK:STDOUT: %GreaterOrEquivalent.ref: %.13 = name_ref GreaterOrEquivalent, imports.%import_ref.6 [template = constants.%.14]
// CHECK:STDOUT: %.loc26_12.1: %GreaterOrEquivalent.type.2 = interface_witness_access @impl.%.loc6, element3 [template = constants.%GreaterOrEquivalent.1]
// CHECK:STDOUT: %.loc26_12.1: %GreaterOrEquivalent.type.2 = interface_witness_access constants.%.5, element3 [template = constants.%GreaterOrEquivalent.1]
// CHECK:STDOUT: %.loc26_12.2: <bound method> = bound_method %a.ref, %.loc26_12.1
// CHECK:STDOUT: %GreaterOrEquivalent.call: init bool = call %.loc26_12.2(%a.ref, %b.ref)
// CHECK:STDOUT: %.loc26_16.1: bool = value_of_initializer %GreaterOrEquivalent.call
@@ -151,7 +151,7 @@ fn TestAssign(a: C*, b: C) {
// CHECK:STDOUT: witness = (imports.%import_ref.8)
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.1: %C as %.3 {
// CHECK:STDOUT: impl @impl.1: %C.ref as %RightShift.ref {
// CHECK:STDOUT: %Op.decl: %Op.type.1 = fn_decl @Op.1 [template = constants.%Op.1] {
// CHECK:STDOUT: %self.patt: %C = binding_pattern self
// CHECK:STDOUT: %other.patt: %C = binding_pattern other
@@ -172,7 +172,7 @@ fn TestAssign(a: C*, b: C) {
// CHECK:STDOUT: witness = %.loc17
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.2: %C as %.7 {
// CHECK:STDOUT: impl @impl.2: %C.ref as %RightShiftAssign.ref {
// CHECK:STDOUT: %Op.decl: %Op.type.3 = fn_decl @Op.3 [template = constants.%Op.3] {
// CHECK:STDOUT: %self.patt: %.8 = binding_pattern self
// CHECK:STDOUT: %other.patt: %C = binding_pattern other
@@ -231,7 +231,7 @@ fn TestAssign(a: C*, b: C) {
// CHECK:STDOUT: %a.ref: %C = name_ref a, %a
// CHECK:STDOUT: %b.ref: %C = name_ref b, %b
// CHECK:STDOUT: %Op.ref: %.11 = name_ref Op, imports.%import_ref.3 [template = constants.%.12]
// CHECK:STDOUT: %.loc27_12.1: %Op.type.2 = interface_witness_access @impl.1.%.loc17, element0 [template = constants.%Op.1]
// CHECK:STDOUT: %.loc27_12.1: %Op.type.2 = interface_witness_access constants.%.5, element0 [template = constants.%Op.1]
// CHECK:STDOUT: %.loc27_12.2: <bound method> = bound_method %a.ref, %.loc27_12.1
// CHECK:STDOUT: %.loc26: ref %C = splice_block %return {}
// CHECK:STDOUT: %Op.call: init %C = call %.loc27_12.2(%a.ref, %b.ref) to %.loc26
@@ -244,7 +244,7 @@ fn TestAssign(a: C*, b: C) {
// CHECK:STDOUT: %.loc31_3.1: ref %C = deref %a.ref
// CHECK:STDOUT: %b.ref: %C = name_ref b, %b
// CHECK:STDOUT: %Op.ref: %.13 = name_ref Op, imports.%import_ref.7 [template = constants.%.14]
// CHECK:STDOUT: %.loc31_6.1: %Op.type.4 = interface_witness_access @impl.2.%.loc22, element0 [template = constants.%Op.3]
// CHECK:STDOUT: %.loc31_6.1: %Op.type.4 = interface_witness_access constants.%.10, element0 [template = constants.%Op.3]
// CHECK:STDOUT: %.loc31_6.2: <bound method> = bound_method %.loc31_3.1, %.loc31_6.1
// CHECK:STDOUT: %.loc31_3.2: %.8 = addr_of %.loc31_3.1
// CHECK:STDOUT: %Op.call: init %.4 = call %.loc31_6.2(%.loc31_3.2, %b.ref)
+4 -4
View File
@@ -151,7 +151,7 @@ fn TestAssign(a: C*, b: C) {
// CHECK:STDOUT: witness = (imports.%import_ref.8)
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.1: %C as %.3 {
// CHECK:STDOUT: impl @impl.1: %C.ref as %Sub.ref {
// CHECK:STDOUT: %Op.decl: %Op.type.1 = fn_decl @Op.1 [template = constants.%Op.1] {
// CHECK:STDOUT: %self.patt: %C = binding_pattern self
// CHECK:STDOUT: %other.patt: %C = binding_pattern other
@@ -172,7 +172,7 @@ fn TestAssign(a: C*, b: C) {
// CHECK:STDOUT: witness = %.loc17
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl.2: %C as %.7 {
// CHECK:STDOUT: impl @impl.2: %C.ref as %SubAssign.ref {
// CHECK:STDOUT: %Op.decl: %Op.type.3 = fn_decl @Op.3 [template = constants.%Op.3] {
// CHECK:STDOUT: %self.patt: %.8 = binding_pattern self
// CHECK:STDOUT: %other.patt: %C = binding_pattern other
@@ -231,7 +231,7 @@ fn TestAssign(a: C*, b: C) {
// CHECK:STDOUT: %a.ref: %C = name_ref a, %a
// CHECK:STDOUT: %b.ref: %C = name_ref b, %b
// CHECK:STDOUT: %Op.ref: %.11 = name_ref Op, imports.%import_ref.3 [template = constants.%.12]
// CHECK:STDOUT: %.loc27_12.1: %Op.type.2 = interface_witness_access @impl.1.%.loc17, element0 [template = constants.%Op.1]
// CHECK:STDOUT: %.loc27_12.1: %Op.type.2 = interface_witness_access constants.%.5, element0 [template = constants.%Op.1]
// CHECK:STDOUT: %.loc27_12.2: <bound method> = bound_method %a.ref, %.loc27_12.1
// CHECK:STDOUT: %.loc26: ref %C = splice_block %return {}
// CHECK:STDOUT: %Op.call: init %C = call %.loc27_12.2(%a.ref, %b.ref) to %.loc26
@@ -244,7 +244,7 @@ fn TestAssign(a: C*, b: C) {
// CHECK:STDOUT: %.loc31_3.1: ref %C = deref %a.ref
// CHECK:STDOUT: %b.ref: %C = name_ref b, %b
// CHECK:STDOUT: %Op.ref: %.13 = name_ref Op, imports.%import_ref.7 [template = constants.%.14]
// CHECK:STDOUT: %.loc31_6.1: %Op.type.4 = interface_witness_access @impl.2.%.loc22, element0 [template = constants.%Op.3]
// CHECK:STDOUT: %.loc31_6.1: %Op.type.4 = interface_witness_access constants.%.10, element0 [template = constants.%Op.3]
// CHECK:STDOUT: %.loc31_6.2: <bound method> = bound_method %.loc31_3.1, %.loc31_6.1
// CHECK:STDOUT: %.loc31_3.2: %.8 = addr_of %.loc31_3.1
// CHECK:STDOUT: %Op.call: init %.4 = call %.loc31_6.2(%.loc31_3.2, %b.ref)
+1 -1
View File
@@ -474,7 +474,7 @@ fn NotEmptyStruct() {
// CHECK:STDOUT: }
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: impl @impl: %C as %.3 {
// CHECK:STDOUT: impl @impl: %C.ref as %J.ref {
// CHECK:STDOUT: %.loc8: <witness> = interface_witness () [template = constants.%.5]
// CHECK:STDOUT:
// CHECK:STDOUT: !members:
+4 -3
View File
@@ -42,14 +42,15 @@ auto Mangler::MangleInverseQualifiedNameScope(llvm::raw_ostream& os,
case CARBON_KIND(SemIR::ImplDecl impl_decl): {
const auto& impl = sem_ir().impls().Get(impl_decl.impl_id);
auto interface_type =
types().GetAs<SemIR::InterfaceType>(impl.constraint_id);
auto interface_type = insts().GetAs<SemIR::InterfaceType>(
constant_values().GetConstantInstId(impl.constraint_id));
const auto& interface =
sem_ir().interfaces().Get(interface_type.interface_id);
names_to_render.push_back(
{.name_scope_id = interface.scope_id, .prefix = ':'});
CARBON_KIND_SWITCH(types().GetAsInst(impl.self_id)) {
CARBON_KIND_SWITCH(insts().Get(constant_values().GetConstantInstId(
impl.self_id))) {
case CARBON_KIND(SemIR::ClassType class_type): {
auto next_name_scope_id =
sem_ir().classes().Get(class_type.class_id).scope_id;
+8 -1
View File
@@ -8,6 +8,7 @@
#include <string>
#include "toolchain/lower/file_context.h"
#include "toolchain/sem_ir/constant.h"
#include "toolchain/sem_ir/ids.h"
namespace Carbon::Lower {
@@ -38,7 +39,13 @@ class Mangler {
auto names() const -> SemIR::NameStoreWrapper { return sem_ir().names(); }
auto types() const -> SemIR::TypeStore { return sem_ir().types(); }
auto insts() const -> const SemIR::InstStore& { return sem_ir().insts(); }
auto types() const -> const SemIR::TypeStore& { return sem_ir().types(); }
auto constant_values() const -> const SemIR::ConstantValueStore& {
return sem_ir().constant_values();
}
FileContext& file_context_;
};
+1
View File
@@ -88,6 +88,7 @@ cc_library(
"file.cpp",
"function.cpp",
"generic.cpp",
"impl.cpp",
"name.cpp",
"type_info.cpp",
],
+1 -2
View File
@@ -143,8 +143,7 @@ class ConstantValueStore {
// Provides storage for instructions representing deduplicated global constants.
class ConstantStore {
public:
explicit ConstantStore(File& sem_ir, llvm::BumpPtrAllocator& /*allocator*/)
: sem_ir_(sem_ir) {}
explicit ConstantStore(File& sem_ir) : sem_ir_(sem_ir) {}
// Adds a new constant instruction, or gets the existing constant with this
// value. Returns the ID of the constant.
+11 -1
View File
@@ -27,11 +27,12 @@ File::File(CheckIRId check_ir_id, IdentifierId package_id,
library_id_(library_id),
value_stores_(&value_stores),
filename_(std::move(filename)),
impls_(*this),
type_blocks_(allocator_),
name_scopes_(&insts_),
constant_values_(ConstantId::NotConstant),
inst_blocks_(allocator_),
constants_(*this, allocator_) {
constants_(*this) {
// `type` and the error type are both complete types.
types_.SetValueRepr(TypeId::TypeType,
{.kind = ValueRepr::Copy, .type_id = TypeId::TypeType});
@@ -488,6 +489,15 @@ static auto StringifyTypeExprImpl(const SemIR::File& outer_sem_ir,
case ValueAsRef::Kind:
case ValueOfInitializer::Kind:
case VarStorage::Kind:
// We don't know how to print this instruction, but it might have a
// constant value that we can print.
auto const_inst_id =
sem_ir.constant_values().GetConstantInstId(step.inst_id);
if (const_inst_id.is_valid() && const_inst_id != step.inst_id) {
push_inst_id(const_inst_id);
break;
}
// We don't need to handle stringification for instructions that don't
// show up in errors, but make it clear what's going on so that it's
// clearer when stringification is needed.
+5 -5
View File
@@ -225,13 +225,13 @@ class FormatterImpl {
const Impl& impl_info = sem_ir_.impls().Get(id);
FormatEntityStart("impl", impl_info.generic_id, id);
out_ << ": ";
FormatType(impl_info.self_id);
out_ << " as ";
FormatType(impl_info.constraint_id);
llvm::SaveAndRestore impl_scope(scope_, inst_namer_->GetScopeFor(id));
out_ << ": ";
FormatName(impl_info.self_id);
out_ << " as ";
FormatName(impl_info.constraint_id);
if (impl_info.is_defined()) {
out_ << ' ';
OpenBrace();
+22
View File
@@ -0,0 +1,22 @@
// 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 "toolchain/sem_ir/impl.h"
#include "toolchain/sem_ir/file.h"
namespace Carbon::SemIR {
auto ImplStore::GetOrAddLookupBucket(const Impl& impl) -> LookupBucketRef {
auto self_id = sem_ir_.constant_values().GetConstantInstId(impl.self_id);
auto constraint_id =
sem_ir_.constant_values().GetConstantInstId(impl.constraint_id);
return LookupBucketRef(
*this, lookup_
.Insert(std::pair{self_id, constraint_id},
[] { return ImplOrLookupBucketId::Invalid; })
.value());
}
} // namespace Carbon::SemIR
+7 -12
View File
@@ -6,7 +6,6 @@
#define CARBON_TOOLCHAIN_SEM_IR_IMPL_H_
#include "common/map.h"
#include "llvm/ADT/TinyPtrVector.h"
#include "toolchain/sem_ir/entity_with_params_base.h"
#include "toolchain/sem_ir/ids.h"
@@ -17,9 +16,9 @@ struct ImplFields {
// lifetime of the interface.
// The type for which the impl is implementing a constraint.
TypeId self_id;
InstId self_id;
// The constraint that the impl implements.
TypeId constraint_id;
InstId constraint_id;
// The following members are set at the `{` of the impl definition.
@@ -151,18 +150,13 @@ class ImplStore {
ImplId single_id_storage_;
};
explicit ImplStore(File& sem_ir) : sem_ir_(sem_ir) {}
// Returns a reference to the lookup bucket containing the list of impls with
// this self type and constraint, or adds a new bucket if this is the first
// time we've seen an impl of this kind. The lookup bucket reference remains
// valid until this function is called again.
auto GetOrAddLookupBucket(TypeId self_id, TypeId constraint_id)
-> LookupBucketRef {
return LookupBucketRef(
*this, lookup_
.Insert(std::pair{self_id, constraint_id},
[] { return ImplOrLookupBucketId::Invalid; })
.value());
}
auto GetOrAddLookupBucket(const Impl& impl) -> LookupBucketRef;
// Adds the specified impl to the store. Does not add it to impl lookup.
auto Add(Impl impl) -> ImplId { return values_.Add(impl); }
@@ -188,8 +182,9 @@ class ImplStore {
auto size() const -> size_t { return values_.size(); }
private:
File& sem_ir_;
ValueStore<ImplId> values_;
Map<std::pair<TypeId, TypeId>, ImplOrLookupBucketId> lookup_;
Map<std::pair<InstId, InstId>, ImplOrLookupBucketId> lookup_;
// Buckets with at least 2 entries, which will be rare; see LookupBucketRef.
llvm::SmallVector<llvm::SmallVector<ImplId, 2>> lookup_buckets_;
};