From c297344937f19a064cbd5a607be978e9cad4a4bf Mon Sep 17 00:00:00 2001 From: Richard Smith Date: Mon, 9 Mar 2026 18:40:16 -0700 Subject: [PATCH] Support conversion between integer types. (#6856) Add an `IntFitsIn` interface with a custom witness, such that `T impls IntFitsIn(U)` if `T` is an integer type all of whose values fit losslessly into the integer type `U`. Use it to constrain implicit conversions between integer types. So far, this has not been extended to the `CppCompat.[U]{Long32,LongLong64}` types, only to `Core.Int(N)` and `Core.UInt(N)`. Assisted-by: Gemini 3 Pro via Antigravity --- core/prelude/operators/as.carbon | 2 + core/prelude/types/cpp/int.carbon | 8 +- core/prelude/types/int.carbon | 21 +- core/prelude/types/uint.carbon | 44 +- toolchain/check/core_identifier.def | 1 + toolchain/check/cpp/impl_lookup.cpp | 9 +- toolchain/check/custom_witness.cpp | 106 ++++- toolchain/check/custom_witness.h | 1 + .../check/testdata/array/bound_values.carbon | 16 +- toolchain/check/testdata/for/actual.carbon | 22 +- .../impl/custom_witness/int_fits_in.carbon | 114 ++++++ .../interop/cpp/builtins.llp64.carbon | 114 ++++-- .../testdata/interop/cpp/builtins.lp64.carbon | 112 +++-- .../function/arithmetic_types_bridged.carbon | 4 +- .../check/testdata/interop/cpp/macros.carbon | 4 +- .../primitives/int_conversions.carbon | 264 ++++++++++++ .../compile/optimize/optimize_debug.carbon | 8 +- .../compile/optimize/optimize_default.carbon | 8 +- .../compile/optimize/optimize_none.carbon | 44 +- .../compile/optimize/optimize_size.carbon | 44 +- .../compile/optimize/optimize_speed.carbon | 8 +- toolchain/lower/testdata/array/iterate.carbon | 44 +- .../lower/testdata/for/break_continue.carbon | 44 +- toolchain/lower/testdata/for/for.carbon | 44 +- .../lower/testdata/operators/increment.carbon | 44 +- .../testdata/primitives/int_types.carbon | 386 +++++++++++++++--- .../lower/testdata/primitives/optional.carbon | 114 +++--- 27 files changed, 1281 insertions(+), 349 deletions(-) create mode 100644 toolchain/check/testdata/impl/custom_witness/int_fits_in.carbon create mode 100644 toolchain/check/testdata/primitives/int_conversions.carbon diff --git a/core/prelude/operators/as.carbon b/core/prelude/operators/as.carbon index 080660a16aae..f628104a2432 100644 --- a/core/prelude/operators/as.carbon +++ b/core/prelude/operators/as.carbon @@ -49,3 +49,5 @@ impl forall [T:! type, U:! ImplicitAs(T)] const U as ImplicitAs(T) { impl forall [T:! type, U:! type] T* as UnsafeAs(U*) { fn Convert[self: T*]() -> U* = "pointer.unsafe_convert"; } + +interface IntFitsIn(Dest:! type) {} diff --git a/core/prelude/types/cpp/int.carbon b/core/prelude/types/cpp/int.carbon index 62b14399dd91..febf0b384887 100644 --- a/core/prelude/types/cpp/int.carbon +++ b/core/prelude/types/cpp/int.carbon @@ -97,8 +97,8 @@ impl u32 as ImplicitAs(CppCompat.ULong32) { } // TODO: ImplicitAs from ULong32 to UInt(N) if N > 32. -final impl CppCompat.ULong32 as ImplicitAs(u32) { - fn Convert[self: Self]() -> u32 = "int.convert"; +final impl CppCompat.ULong32 as ImplicitAs(u64) { + fn Convert[self: Self]() -> u64 = "int.convert"; } impl IntLiteral() as ImplicitAs(CppCompat.LongLong64) { @@ -146,8 +146,8 @@ impl u64 as ImplicitAs(CppCompat.ULongLong64) { } // TODO: ImplicitAs from ULongLong64 to UInt(N) if N > 64. -final impl CppCompat.ULongLong64 as ImplicitAs(u64) { - fn Convert[self: Self]() -> u64 = "int.convert"; +final impl CppCompat.ULongLong64 as ImplicitAs(u128) { + fn Convert[self: Self]() -> u128 = "int.convert"; } // TODO: As from Long32 to Int(N) if N < 32. diff --git a/core/prelude/types/int.carbon b/core/prelude/types/int.carbon index 8c4183bd47ef..97d047d4dbe6 100644 --- a/core/prelude/types/int.carbon +++ b/core/prelude/types/int.carbon @@ -42,7 +42,26 @@ final impl forall [From:! IntLiteral()] Int(From) as As(IntLiteral()) { fn Convert[self: Self]() -> IntLiteral() = "int.convert_checked"; } -// TODO: Allow as an implicit conversion if N > M. +// Work around the inability to put a `where` clause on a generic parameter of +// type `IntLiteral`. +// TODO: Remove this once possible. +private interface AnyInt { + let Width:! IntLiteral(); + fn AsInt[self: Self]() -> Int(Width); +} + +impl forall [N:! IntLiteral()] Int(N) as AnyInt where .Width = N { + fn AsInt[self: Self]() -> Self { return self; } +} + +impl forall [To:! IntLiteral(), From:! AnyInt & IntFitsIn(Int(To))] + From as ImplicitAs(Int(To)) { + fn Convert[self: Self]() -> Int(To) { + fn Impl(src: Int(From.Width)) -> Int(To) = "int.convert"; + return Impl(self.AsInt()); + } +} + final impl forall [From:! IntLiteral(), To:! IntLiteral()] Int(From) as As(Int(To)) { fn Convert[self: Self]() -> Int(To) = "int.convert"; } diff --git a/core/prelude/types/uint.carbon b/core/prelude/types/uint.carbon index 4454ac8da151..971b618b52cd 100644 --- a/core/prelude/types/uint.carbon +++ b/core/prelude/types/uint.carbon @@ -43,12 +43,52 @@ final impl forall [From:! IntLiteral()] UInt(From) as As(IntLiteral()) { fn Convert[self: Self]() -> IntLiteral() = "int.convert_checked"; } -// TODO: Allow as an implicit conversion if To > From. +// Work around the inability to put a `where` clause on a generic parameter of +// type `IntLiteral`. +// TODO: Remove this once possible. +private interface AnyUInt { + let Width:! IntLiteral(); + fn AsUInt[self: Self]() -> UInt(Width); +} + +impl forall [N:! IntLiteral()] UInt(N) as AnyUInt where .Width = N { + fn AsUInt[self: Self]() -> Self { return self; } +} + +// Work around the inability to constrain types other than `.Self` by reversing +// the Self and argument type of `ImplicitAs`. +// TODO: Remove this once possible. +private interface FromUInt(From:! type) { + fn Convert(from: From) -> Self; +} + +impl forall [To:! IntLiteral(), From:! AnyUInt & IntFitsIn(UInt(To))] + UInt(To) as FromUInt(From) { + fn Convert(from: From) -> Self { + fn Impl(src: UInt(From.Width)) -> Self = "int.convert"; + return Impl(from.AsUInt()); + } +} + +impl forall [To:! IntLiteral(), From:! AnyUInt & IntFitsIn(Int(To))] + Int(To) as FromUInt(From) { + fn Convert(from: From) -> Self { + fn Impl(src: UInt(From.Width)) -> Self = "int.convert"; + return Impl(from.AsUInt()); + } +} + +impl forall [From:! IntLiteral(), To:! FromUInt(UInt(From))] + UInt(From) as ImplicitAs(To) { + fn Convert[self: Self]() -> To { + return To.Convert(self); + } +} + final impl forall [From:! IntLiteral(), To:! IntLiteral()] UInt(From) as As(UInt(To)) { fn Convert[self: Self]() -> UInt(To) = "int.convert"; } -// TODO: Allow as an implicit conversion if To > From. final impl forall [From:! IntLiteral(), To:! IntLiteral()] UInt(From) as As(Int(To)) { fn Convert[self: Self]() -> Int(To) = "int.convert"; } diff --git a/toolchain/check/core_identifier.def b/toolchain/check/core_identifier.def index 28f3cbbdc83b..5f9ce2351d83 100644 --- a/toolchain/check/core_identifier.def +++ b/toolchain/check/core_identifier.def @@ -48,6 +48,7 @@ CARBON_CORE_IDENTIFIER(ImplicitAs) CARBON_CORE_IDENTIFIER(Inc) CARBON_CORE_IDENTIFIER(IndexWith) CARBON_CORE_IDENTIFIER(Int) +CARBON_CORE_IDENTIFIER(IntFitsIn) CARBON_CORE_IDENTIFIER(Iterate) CARBON_CORE_IDENTIFIER(LeftShiftAssignWith) CARBON_CORE_IDENTIFIER(LeftShiftWith) diff --git a/toolchain/check/cpp/impl_lookup.cpp b/toolchain/check/cpp/impl_lookup.cpp index cc85a0ba461f..ea5327362858 100644 --- a/toolchain/check/cpp/impl_lookup.cpp +++ b/toolchain/check/cpp/impl_lookup.cpp @@ -77,8 +77,8 @@ static auto GetCppAssociatedFunctions(const CoreInterface core_interface) case CoreInterface::Destroy: return {llvm::to_underlying(AssociatedFunction::Destructor)}; case CoreInterface::Unknown: - CARBON_FATAL( - "`CoreInterface::Unknown` doesn't have a `CppCoreFunction` mapping"); + case CoreInterface::IntFitsIn: + CARBON_FATAL("No AssociatedFunction mapping for this interface"); } } @@ -131,6 +131,7 @@ static auto FindCppAssociatedFunction(Context& context, SemIR::LocId loc_id, return fn_id; } + auto LookupCppImpl(Context& context, SemIR::LocId loc_id, CoreInterface core_interface, SemIR::ConstantId query_self_const_id, @@ -142,18 +143,20 @@ auto LookupCppImpl(Context& context, SemIR::LocId loc_id, return SemIR::InstId::None; } - auto associated_functions = GetCppAssociatedFunctions(core_interface); auto witness_id = SemIR::ErrorInst::InstId; switch (core_interface) { case CoreInterface::Copy: case CoreInterface::Destroy: { + auto associated_functions = GetCppAssociatedFunctions(core_interface); CARBON_CHECK(associated_functions.count() == 1); witness_id = FindCppAssociatedFunction( context, loc_id, static_cast(associated_functions.to_ullong()), class_decl); } break; + case CoreInterface::IntFitsIn: + return SemIR::InstId::None; case CoreInterface::Unknown: CARBON_FATAL("shouldn't be called with `Unknown`"); } diff --git a/toolchain/check/custom_witness.cpp b/toolchain/check/custom_witness.cpp index 6adf28a26b1f..187f3390c72e 100644 --- a/toolchain/check/custom_witness.cpp +++ b/toolchain/check/custom_witness.cpp @@ -14,6 +14,7 @@ #include "toolchain/check/inst.h" #include "toolchain/check/name_lookup.h" #include "toolchain/check/type.h" +#include "toolchain/check/type_completion.h" #include "toolchain/sem_ir/builtin_function_kind.h" #include "toolchain/sem_ir/ids.h" #include "toolchain/sem_ir/typed_insts.h" @@ -283,7 +284,8 @@ auto GetCoreInterface(Context& context, SemIR::InterfaceId interface_id) for (auto [core_identifier, core_interface] : {std::pair{CoreIdentifier::Copy, CoreInterface::Copy}, - std::pair{CoreIdentifier::Destroy, CoreInterface::Destroy}}) { + std::pair{CoreIdentifier::Destroy, CoreInterface::Destroy}, + std::pair{CoreIdentifier::IntFitsIn, CoreInterface::IntFitsIn}}) { if (interface.name_id == context.core_identifiers().AddNameId(core_identifier)) { return core_interface; @@ -348,16 +350,11 @@ static auto TypeCanDestroy(Context& context, } } -auto LookupCustomWitness(Context& context, SemIR::LocId loc_id, - CoreInterface core_interface, - SemIR::ConstantId query_self_const_id, - SemIR::SpecificInterfaceId query_specific_interface_id) +static auto MakeDestroyWitness( + Context& context, SemIR::LocId loc_id, + SemIR::ConstantId query_self_const_id, + SemIR::SpecificInterfaceId query_specific_interface_id) -> std::optional { - // TODO: Handle more interfaces, particularly copy, move, and conversion. - if (core_interface != CoreInterface::Destroy) { - return std::nullopt; - } - auto query_specific_interface = context.specific_interfaces().Get(query_specific_interface_id); @@ -383,4 +380,93 @@ auto LookupCustomWitness(Context& context, SemIR::LocId loc_id, query_specific_interface_id, {op_id}); } +static auto MakeIntFitsInWitness( + Context& context, SemIR::LocId loc_id, + SemIR::ConstantId query_self_const_id, + SemIR::SpecificInterfaceId query_specific_interface_id) + -> std::optional { + auto query_specific_interface = + context.specific_interfaces().Get(query_specific_interface_id); + + auto args_id = query_specific_interface.specific_id; + if (!args_id.has_value()) { + return std::nullopt; + } + auto args_block_id = context.specifics().Get(args_id).args_id; + auto args_block = context.inst_blocks().Get(args_block_id); + if (args_block.size() != 1) { + return std::nullopt; + } + + auto dest_const_id = context.constant_values().Get(args_block[0]); + if (!dest_const_id.is_constant()) { + return std::nullopt; + } + + auto src_type_id = GetFacetAsType(context, query_self_const_id); + auto dest_type_id = GetFacetAsType(context, dest_const_id); + + auto context_fn = [](DiagnosticContextBuilder& /*builder*/) -> void {}; + if (!RequireCompleteType(context, src_type_id, loc_id, context_fn) || + !RequireCompleteType(context, dest_type_id, loc_id, context_fn)) { + return std::nullopt; + } + + auto src_info = context.types().TryGetIntTypeInfo(src_type_id); + auto dest_info = context.types().TryGetIntTypeInfo(dest_type_id); + + if (!src_info || !dest_info) { + return std::nullopt; + } + + // If the bit width is unknown (e.g., due to symbolic evaluation), we cannot + // determine whether it fits yet. + if (src_info->bit_width == IntId::None || + dest_info->bit_width == IntId::None) { + return std::nullopt; + } + + const auto& src_width = context.ints().Get(src_info->bit_width); + const auto& dest_width = context.ints().Get(dest_info->bit_width); + + bool fits = false; + if (src_info->is_signed && !dest_info->is_signed) { + // Signed -> unsigned: would truncate the sign bit. + fits = false; + } else if (src_info->is_signed == dest_info->is_signed) { + // Signed -> signed or unsigned -> unsigned: allow widening or preserving + // width. + fits = src_width.sle(dest_width); + } else { + // Unsigned -> signed: strict widening required. + fits = src_width.slt(dest_width); + } + + if (!fits) { + return std::nullopt; + } + + return BuildCustomWitness(context, loc_id, query_self_const_id, + query_specific_interface_id, {}); +} + +auto LookupCustomWitness(Context& context, SemIR::LocId loc_id, + CoreInterface core_interface, + SemIR::ConstantId query_self_const_id, + SemIR::SpecificInterfaceId query_specific_interface_id) + -> std::optional { + switch (core_interface) { + case CoreInterface::Destroy: + return MakeDestroyWitness(context, loc_id, query_self_const_id, + query_specific_interface_id); + case CoreInterface::IntFitsIn: + return MakeIntFitsInWitness(context, loc_id, query_self_const_id, + query_specific_interface_id); + case CoreInterface::Copy: + case CoreInterface::Unknown: + // TODO: Handle more interfaces, particularly copy, move, and conversion. + return std::nullopt; + } +} + } // namespace Carbon::Check diff --git a/toolchain/check/custom_witness.h b/toolchain/check/custom_witness.h index 68846f045db3..a516b69e1ca0 100644 --- a/toolchain/check/custom_witness.h +++ b/toolchain/check/custom_witness.h @@ -24,6 +24,7 @@ auto BuildCustomWitness(Context& context, SemIR::LocId loc_id, enum class CoreInterface : std::int8_t { Copy = 1 << 0, Destroy = 1 << 1, + IntFitsIn = 1 << 2, Unknown = -1, }; diff --git a/toolchain/check/testdata/array/bound_values.carbon b/toolchain/check/testdata/array/bound_values.carbon index 9d73f013a893..c3cdf27a2a2f 100644 --- a/toolchain/check/testdata/array/bound_values.carbon +++ b/toolchain/check/testdata/array/bound_values.carbon @@ -120,7 +120,7 @@ var b: array(1, 39999999999999999993); // CHECK:STDOUT: %To.fe9: Core.IntLiteral = symbolic_binding To, 0 [symbolic] // CHECK:STDOUT: %Core.IntLiteral.as.As.impl.Convert.type.2b1: type = fn_type @Core.IntLiteral.as.As.impl.Convert, @Core.IntLiteral.as.As.impl(%To.fe9) [symbolic] // CHECK:STDOUT: %Core.IntLiteral.as.As.impl.Convert.979: %Core.IntLiteral.as.As.impl.Convert.type.2b1 = struct_value () [symbolic] -// CHECK:STDOUT: %From: Core.IntLiteral = symbolic_binding From, 0 [symbolic] +// CHECK:STDOUT: %From.fe9: Core.IntLiteral = symbolic_binding From, 0 [symbolic] // CHECK:STDOUT: %As.impl_witness.e1d: = impl_witness imports.%As.impl_witness_table.7eb, @Core.IntLiteral.as.As.impl(%int_32) [concrete] // CHECK:STDOUT: %Core.IntLiteral.as.As.impl.Convert.type.3e7: type = fn_type @Core.IntLiteral.as.As.impl.Convert, @Core.IntLiteral.as.As.impl(%int_32) [concrete] // CHECK:STDOUT: %Core.IntLiteral.as.As.impl.Convert.bbd: %Core.IntLiteral.as.As.impl.Convert.type.3e7 = struct_value () [concrete] @@ -132,16 +132,16 @@ var b: array(1, 39999999999999999993); // CHECK:STDOUT: %bound_method.d64: = bound_method %int_3.1ba, %Core.IntLiteral.as.As.impl.Convert.specific_fn [concrete] // CHECK:STDOUT: %int_3.d14: %u32 = int_value 3 [concrete] // CHECK:STDOUT: %ImplicitAs.type.139: type = facet_type <@ImplicitAs, @ImplicitAs(Core.IntLiteral)> [concrete] -// CHECK:STDOUT: %UInt.as.ImplicitAs.impl.Convert.type.7f8: type = fn_type @UInt.as.ImplicitAs.impl.Convert, @UInt.as.ImplicitAs.impl(%From) [symbolic] +// CHECK:STDOUT: %UInt.as.ImplicitAs.impl.Convert.type.7f8: type = fn_type @UInt.as.ImplicitAs.impl.Convert.1, @UInt.as.ImplicitAs.impl.607(%From.fe9) [symbolic] // CHECK:STDOUT: %UInt.as.ImplicitAs.impl.Convert.0ea: %UInt.as.ImplicitAs.impl.Convert.type.7f8 = struct_value () [symbolic] -// CHECK:STDOUT: %ImplicitAs.impl_witness.895: = impl_witness imports.%ImplicitAs.impl_witness_table.493, @UInt.as.ImplicitAs.impl(%int_32) [concrete] -// CHECK:STDOUT: %UInt.as.ImplicitAs.impl.Convert.type.543: type = fn_type @UInt.as.ImplicitAs.impl.Convert, @UInt.as.ImplicitAs.impl(%int_32) [concrete] +// CHECK:STDOUT: %ImplicitAs.impl_witness.895: = impl_witness imports.%ImplicitAs.impl_witness_table.493, @UInt.as.ImplicitAs.impl.607(%int_32) [concrete] +// CHECK:STDOUT: %UInt.as.ImplicitAs.impl.Convert.type.543: type = fn_type @UInt.as.ImplicitAs.impl.Convert.1, @UInt.as.ImplicitAs.impl.607(%int_32) [concrete] // CHECK:STDOUT: %UInt.as.ImplicitAs.impl.Convert.342: %UInt.as.ImplicitAs.impl.Convert.type.543 = struct_value () [concrete] // CHECK:STDOUT: %ImplicitAs.facet.2c6: %ImplicitAs.type.139 = facet_value %u32, (%ImplicitAs.impl_witness.895) [concrete] // CHECK:STDOUT: %ImplicitAs.WithSelf.Convert.type.70d: type = fn_type @ImplicitAs.WithSelf.Convert, @ImplicitAs.WithSelf(Core.IntLiteral, %ImplicitAs.facet.2c6) [concrete] // CHECK:STDOUT: %.044: type = fn_type_with_self_type %ImplicitAs.WithSelf.Convert.type.70d, %ImplicitAs.facet.2c6 [concrete] // CHECK:STDOUT: %UInt.as.ImplicitAs.impl.Convert.bound: = bound_method %int_3.d14, %UInt.as.ImplicitAs.impl.Convert.342 [concrete] -// CHECK:STDOUT: %UInt.as.ImplicitAs.impl.Convert.specific_fn: = specific_function %UInt.as.ImplicitAs.impl.Convert.342, @UInt.as.ImplicitAs.impl.Convert(%int_32) [concrete] +// CHECK:STDOUT: %UInt.as.ImplicitAs.impl.Convert.specific_fn: = specific_function %UInt.as.ImplicitAs.impl.Convert.342, @UInt.as.ImplicitAs.impl.Convert.1(%int_32) [concrete] // CHECK:STDOUT: %bound_method.c86: = bound_method %int_3.d14, %UInt.as.ImplicitAs.impl.Convert.specific_fn [concrete] // CHECK:STDOUT: %array_type: type = array_type %int_3.1ba, %i32 [concrete] // CHECK:STDOUT: } @@ -149,8 +149,8 @@ var b: array(1, 39999999999999999993); // CHECK:STDOUT: imports { // CHECK:STDOUT: %Core.import_ref.600: @Core.IntLiteral.as.As.impl.%Core.IntLiteral.as.As.impl.Convert.type (%Core.IntLiteral.as.As.impl.Convert.type.2b1) = import_ref Core//prelude/types/uint, loc{{\d+_\d+}}, loaded [symbolic = @Core.IntLiteral.as.As.impl.%Core.IntLiteral.as.As.impl.Convert (constants.%Core.IntLiteral.as.As.impl.Convert.979)] // CHECK:STDOUT: %As.impl_witness_table.7eb = impl_witness_table (%Core.import_ref.600), @Core.IntLiteral.as.As.impl [concrete] -// CHECK:STDOUT: %Core.import_ref.483: @UInt.as.ImplicitAs.impl.%UInt.as.ImplicitAs.impl.Convert.type (%UInt.as.ImplicitAs.impl.Convert.type.7f8) = import_ref Core//prelude/types/uint, loc{{\d+_\d+}}, loaded [symbolic = @UInt.as.ImplicitAs.impl.%UInt.as.ImplicitAs.impl.Convert (constants.%UInt.as.ImplicitAs.impl.Convert.0ea)] -// CHECK:STDOUT: %ImplicitAs.impl_witness_table.493 = impl_witness_table (%Core.import_ref.483), @UInt.as.ImplicitAs.impl [concrete] +// CHECK:STDOUT: %Core.import_ref.483: @UInt.as.ImplicitAs.impl.607.%UInt.as.ImplicitAs.impl.Convert.type (%UInt.as.ImplicitAs.impl.Convert.type.7f8) = import_ref Core//prelude/types/uint, loc{{\d+_\d+}}, loaded [symbolic = @UInt.as.ImplicitAs.impl.607.%UInt.as.ImplicitAs.impl.Convert (constants.%UInt.as.ImplicitAs.impl.Convert.0ea)] +// CHECK:STDOUT: %ImplicitAs.impl_witness_table.493 = impl_witness_table (%Core.import_ref.483), @UInt.as.ImplicitAs.impl.607 [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: file { @@ -167,7 +167,7 @@ var b: array(1, 39999999999999999993); // CHECK:STDOUT: %.loc6_18.2: %u32 = converted %int_3.loc6, %.loc6_18.1 [concrete = constants.%int_3.d14] // CHECK:STDOUT: %impl.elem0.loc6_18.2: %.044 = impl_witness_access constants.%ImplicitAs.impl_witness.895, element0 [concrete = constants.%UInt.as.ImplicitAs.impl.Convert.342] // CHECK:STDOUT: %bound_method.loc6_18.3: = bound_method %.loc6_18.2, %impl.elem0.loc6_18.2 [concrete = constants.%UInt.as.ImplicitAs.impl.Convert.bound] -// CHECK:STDOUT: %specific_fn.loc6_18.2: = specific_function %impl.elem0.loc6_18.2, @UInt.as.ImplicitAs.impl.Convert(constants.%int_32) [concrete = constants.%UInt.as.ImplicitAs.impl.Convert.specific_fn] +// CHECK:STDOUT: %specific_fn.loc6_18.2: = specific_function %impl.elem0.loc6_18.2, @UInt.as.ImplicitAs.impl.Convert.1(constants.%int_32) [concrete = constants.%UInt.as.ImplicitAs.impl.Convert.specific_fn] // CHECK:STDOUT: %bound_method.loc6_18.4: = bound_method %.loc6_18.2, %specific_fn.loc6_18.2 [concrete = constants.%bound_method.c86] // CHECK:STDOUT: %UInt.as.ImplicitAs.impl.Convert.call: init Core.IntLiteral = call %bound_method.loc6_18.4(%.loc6_18.2) [concrete = constants.%int_3.1ba] // CHECK:STDOUT: %.loc6_18.3: Core.IntLiteral = value_of_initializer %UInt.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_3.1ba] diff --git a/toolchain/check/testdata/for/actual.carbon b/toolchain/check/testdata/for/actual.carbon index 46bbb9e6287d..69b4aeeaad93 100644 --- a/toolchain/check/testdata/for/actual.carbon +++ b/toolchain/check/testdata/for/actual.carbon @@ -74,7 +74,7 @@ fn Read(y:! Core.IntLiteral()) { // CHECK:STDOUT: %OptionalStorage.type: type = facet_type <@OptionalStorage> [concrete] // CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] // CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] -// CHECK:STDOUT: %facet_type: type = facet_type <@Destroy & @Copy> [concrete] +// CHECK:STDOUT: %facet_type.7e2: type = facet_type <@Destroy & @Copy> [concrete] // CHECK:STDOUT: %Optional.type: type = generic_class_type @Optional [concrete] // CHECK:STDOUT: %Optional.generic: %Optional.type = struct_value () [concrete] // CHECK:STDOUT: %T.542: %OptionalStorage.type = symbolic_binding T, 0 [symbolic] @@ -84,7 +84,7 @@ fn Read(y:! Core.IntLiteral()) { // CHECK:STDOUT: %Optional.None.fcb: %Optional.None.type.fc5 = struct_value () [symbolic] // CHECK:STDOUT: %.Self.2b2: %Iterate.type = symbolic_binding .Self [symbolic_self] // CHECK:STDOUT: %Iterate.lookup_impl_witness.53f: = lookup_impl_witness %.Self.2b2, @Iterate [symbolic_self] -// CHECK:STDOUT: %impl.elem0.3b1: %facet_type = impl_witness_access %Iterate.lookup_impl_witness.53f, element0 [symbolic_self] +// CHECK:STDOUT: %impl.elem0.3b1: %facet_type.7e2 = impl_witness_access %Iterate.lookup_impl_witness.53f, element0 [symbolic_self] // CHECK:STDOUT: %.Self.binding.as_type: type = symbolic_binding_type .Self, %.Self.2b2 [symbolic_self] // CHECK:STDOUT: %Iterate.assoc_type: type = assoc_entity_type @Iterate [concrete] // CHECK:STDOUT: %assoc1.a27: %Iterate.assoc_type = assoc_entity element1, imports.%Core.import_ref.cd6 [concrete] @@ -97,7 +97,7 @@ fn Read(y:! Core.IntLiteral()) { // CHECK:STDOUT: %.83cba3.1: Core.Form = init_form %Int.fc6021.1 [symbolic] // CHECK:STDOUT: %.4f8: require_specific_def_type = require_specific_def @Int.as.Copy.impl(%N) [symbolic] // CHECK:STDOUT: %Copy.lookup_impl_witness.7a8: = lookup_impl_witness %Int.fc6021.1, @Copy [symbolic] -// CHECK:STDOUT: %facet_value: %facet_type = facet_value %Int.fc6021.1, (%Destroy.lookup_impl_witness.93c, %Copy.lookup_impl_witness.7a8) [symbolic] +// CHECK:STDOUT: %facet_value: %facet_type.7e2 = facet_value %Int.fc6021.1, (%Destroy.lookup_impl_witness.93c, %Copy.lookup_impl_witness.7a8) [symbolic] // CHECK:STDOUT: %Iterate_where.type: type = facet_type <@Iterate where %impl.elem0.3b1 = %facet_value and %impl.elem1.49e = %Int.fc6021.1> [symbolic] // CHECK:STDOUT: %Iterate.impl_witness: = impl_witness @IntRange.as.Iterate.impl.%Iterate.impl_witness_table, @IntRange.as.Iterate.impl(%N) [symbolic] // CHECK:STDOUT: %require_complete.234: = require_complete_type %Iterate_where.type [symbolic] @@ -233,8 +233,8 @@ fn Read(y:! Core.IntLiteral()) { // CHECK:STDOUT: %Core.import_ref.aeb: @Optional.%Optional.Some.type (%Optional.Some.type.eaa) = import_ref Core//prelude/iterate, inst{{[0-9A-F]+}} [indirect], loaded [symbolic = @Optional.%Optional.Some (constants.%Optional.Some.6ca)] // CHECK:STDOUT: %Core.import_ref.cd6: type = import_ref Core//prelude/iterate, loc{{\d+_\d+}}, loaded [concrete = %CursorType] // CHECK:STDOUT: %CursorType: type = assoc_const_decl @CursorType [concrete] {} -// CHECK:STDOUT: %Core.import_ref.f74: %facet_type = import_ref Core//prelude/iterate, loc{{\d+_\d+}}, loaded [concrete = %ElementType] -// CHECK:STDOUT: %ElementType: %facet_type = assoc_const_decl @ElementType [concrete] {} +// CHECK:STDOUT: %Core.import_ref.f74: %facet_type.7e2 = import_ref Core//prelude/iterate, loc{{\d+_\d+}}, loaded [concrete = %ElementType] +// CHECK:STDOUT: %ElementType: %facet_type.7e2 = assoc_const_decl @ElementType [concrete] {} // CHECK:STDOUT: %Core.import_ref.18d: @Int.as.Copy.impl.%Int.as.Copy.impl.Op.type (%Int.as.Copy.impl.Op.type.824) = import_ref Core//prelude/types/int, loc{{\d+_\d+}}, loaded [symbolic = @Int.as.Copy.impl.%Int.as.Copy.impl.Op (constants.%Int.as.Copy.impl.Op.9b9)] // CHECK:STDOUT: %Copy.impl_witness_table.e76 = impl_witness_table (%Core.import_ref.18d), @Int.as.Copy.impl [concrete] // CHECK:STDOUT: %Core.Optional: %Optional.type = import_ref Core//prelude/types/optional, Optional, loaded [concrete = constants.%Optional.generic] @@ -300,7 +300,7 @@ fn Read(y:! Core.IntLiteral()) { // CHECK:STDOUT: %Destroy.lookup_impl_witness: = lookup_impl_witness %Int.loc9_54.1, @Destroy [symbolic = %Destroy.lookup_impl_witness (constants.%Destroy.lookup_impl_witness.93c)] // CHECK:STDOUT: %.loc9_85.1: require_specific_def_type = require_specific_def @Int.as.Copy.impl(%N) [symbolic = %.loc9_85.1 (constants.%.4f8)] // CHECK:STDOUT: %Copy.lookup_impl_witness: = lookup_impl_witness %Int.loc9_54.1, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.7a8)] -// CHECK:STDOUT: %facet_value.loc9_85.1: %facet_type = facet_value %Int.loc9_54.1, (%Destroy.lookup_impl_witness, %Copy.lookup_impl_witness) [symbolic = %facet_value.loc9_85.1 (constants.%facet_value)] +// CHECK:STDOUT: %facet_value.loc9_85.1: %facet_type.7e2 = facet_value %Int.loc9_54.1, (%Destroy.lookup_impl_witness, %Copy.lookup_impl_witness) [symbolic = %facet_value.loc9_85.1 (constants.%facet_value)] // CHECK:STDOUT: %Iterate_where.type: type = facet_type <@Iterate where constants.%impl.elem0.3b1 = %facet_value.loc9_85.1 and constants.%impl.elem1.49e = %Int.loc9_54.1> [symbolic = %Iterate_where.type (constants.%Iterate_where.type)] // CHECK:STDOUT: %Iterate.impl_witness.loc9_87.2: = impl_witness %Iterate.impl_witness_table, @IntRange.as.Iterate.impl(%N) [symbolic = %Iterate.impl_witness.loc9_87.2 (constants.%Iterate.impl_witness)] // CHECK:STDOUT: @@ -371,7 +371,7 @@ fn Read(y:! Core.IntLiteral()) { // CHECK:STDOUT: } // CHECK:STDOUT: %Iterate.impl_witness_table = impl_witness_table (%impl_witness_assoc_constant.loc9_87.1, %impl_witness_assoc_constant.loc9_87.2, %IntRange.as.Iterate.impl.NewCursor.decl, %IntRange.as.Iterate.impl.Next.decl), @IntRange.as.Iterate.impl [concrete] // CHECK:STDOUT: %Iterate.impl_witness.loc9_87.1: = impl_witness %Iterate.impl_witness_table, @IntRange.as.Iterate.impl(constants.%N) [symbolic = %Iterate.impl_witness.loc9_87.2 (constants.%Iterate.impl_witness)] -// CHECK:STDOUT: %impl_witness_assoc_constant.loc9_87.1: %facet_type = impl_witness_assoc_constant constants.%facet_value [symbolic = %facet_value.loc9_85.1 (constants.%facet_value)] +// CHECK:STDOUT: %impl_witness_assoc_constant.loc9_87.1: %facet_type.7e2 = impl_witness_assoc_constant constants.%facet_value [symbolic = %facet_value.loc9_85.1 (constants.%facet_value)] // CHECK:STDOUT: %impl_witness_assoc_constant.loc9_87.2: type = impl_witness_assoc_constant constants.%Int.fc6021.1 [symbolic = %Int.loc9_54.1 (constants.%Int.fc6021.1)] // CHECK:STDOUT: // CHECK:STDOUT: !members: @@ -445,13 +445,13 @@ fn Read(y:! Core.IntLiteral()) { // CHECK:STDOUT: %.Self.as_type.loc9_60: type = facet_access_type %.Self.ref.loc9_60 [symbolic_self = constants.%.Self.binding.as_type] // CHECK:STDOUT: %.loc9_60: type = converted %.Self.ref.loc9_60, %.Self.as_type.loc9_60 [symbolic_self = constants.%.Self.binding.as_type] // CHECK:STDOUT: %ElementType.ref: %Iterate.assoc_type = name_ref ElementType, imports.%Core.import_ref.39b [concrete = constants.%assoc0.4bd] -// CHECK:STDOUT: %impl.elem0: %facet_type = impl_witness_access constants.%Iterate.lookup_impl_witness.53f, element0 [symbolic_self = constants.%impl.elem0.3b1] +// CHECK:STDOUT: %impl.elem0: %facet_type.7e2 = impl_witness_access constants.%Iterate.lookup_impl_witness.53f, element0 [symbolic_self = constants.%impl.elem0.3b1] // CHECK:STDOUT: %Core.ref.loc9_75: = name_ref Core, imports.%Core [concrete = imports.%Core] // CHECK:STDOUT: %Int.ref.loc9_79: %Int.type = name_ref Int, imports.%Core.Int [concrete = constants.%Int.generic] // CHECK:STDOUT: %N.ref.loc9_84: Core.IntLiteral = name_ref N, @IntRange.%N.loc4_16.2 [symbolic = %N (constants.%N)] // CHECK:STDOUT: %Int.loc9_85: type = class_type @Int, @Int(constants.%N) [symbolic = %Int.loc9_54.1 (constants.%Int.fc6021.1)] -// CHECK:STDOUT: %facet_value.loc9_85.2: %facet_type = facet_value %Int.loc9_85, (constants.%Destroy.lookup_impl_witness.93c, constants.%Copy.lookup_impl_witness.7a8) [symbolic = %facet_value.loc9_85.1 (constants.%facet_value)] -// CHECK:STDOUT: %.loc9_85.2: %facet_type = converted %Int.loc9_85, %facet_value.loc9_85.2 [symbolic = %facet_value.loc9_85.1 (constants.%facet_value)] +// CHECK:STDOUT: %facet_value.loc9_85.2: %facet_type.7e2 = facet_value %Int.loc9_85, (constants.%Destroy.lookup_impl_witness.93c, constants.%Copy.lookup_impl_witness.7a8) [symbolic = %facet_value.loc9_85.1 (constants.%facet_value)] +// CHECK:STDOUT: %.loc9_85.2: %facet_type.7e2 = converted %Int.loc9_85, %facet_value.loc9_85.2 [symbolic = %facet_value.loc9_85.1 (constants.%facet_value)] // CHECK:STDOUT: %.loc9_24: type = where_expr %.Self [symbolic = %Iterate_where.type (constants.%Iterate_where.type)] { // CHECK:STDOUT: requirement_base_facet_type constants.%Iterate.type // CHECK:STDOUT: requirement_rewrite %impl.elem1, %Int.loc9_54.2 @@ -569,7 +569,7 @@ fn Read(y:! Core.IntLiteral()) { // CHECK:STDOUT: %pattern_type.loc11_25: type = pattern_type %ptr.loc11_44.1 [symbolic = %pattern_type.loc11_25 (constants.%pattern_type.bda)] // CHECK:STDOUT: %Destroy.lookup_impl_witness: = lookup_impl_witness %Int.loc11_43.1, @Destroy [symbolic = %Destroy.lookup_impl_witness (constants.%Destroy.lookup_impl_witness.93c)] // CHECK:STDOUT: %Copy.lookup_impl_witness: = lookup_impl_witness %Int.loc11_43.1, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.7a8)] -// CHECK:STDOUT: %facet_value: %facet_type = facet_value %Int.loc11_43.1, (%Destroy.lookup_impl_witness, %Copy.lookup_impl_witness) [symbolic = %facet_value (constants.%facet_value)] +// CHECK:STDOUT: %facet_value: %facet_type.7e2 = facet_value %Int.loc11_43.1, (%Destroy.lookup_impl_witness, %Copy.lookup_impl_witness) [symbolic = %facet_value (constants.%facet_value)] // CHECK:STDOUT: %.loc11_75.3: require_specific_def_type = require_specific_def @T.binding.as_type.as.OptionalStorage.impl(%facet_value) [symbolic = %.loc11_75.3 (constants.%.63c)] // CHECK:STDOUT: %OptionalStorage.lookup_impl_witness: = lookup_impl_witness %Int.loc11_43.1, @OptionalStorage [symbolic = %OptionalStorage.lookup_impl_witness (constants.%OptionalStorage.lookup_impl_witness.b62)] // CHECK:STDOUT: %OptionalStorage.facet.loc11_75.1: %OptionalStorage.type = facet_value %Int.loc11_43.1, (%OptionalStorage.lookup_impl_witness) [symbolic = %OptionalStorage.facet.loc11_75.1 (constants.%OptionalStorage.facet.01e)] diff --git a/toolchain/check/testdata/impl/custom_witness/int_fits_in.carbon b/toolchain/check/testdata/impl/custom_witness/int_fits_in.carbon new file mode 100644 index 000000000000..5e4fd3d973ca --- /dev/null +++ b/toolchain/check/testdata/impl/custom_witness/int_fits_in.carbon @@ -0,0 +1,114 @@ +// Part of the Carbon Language project, under the Apache License v2.0 with LLVM +// Exceptions. See /LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// INCLUDE-FILE: toolchain/testing/testdata/min_prelude/primitives.carbon +// +// AUTOUPDATE +// TIP: To test this file alone, run: +// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/impl/custom_witness/int_fits_in.carbon +// TIP: To dump output, run: +// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/impl/custom_witness/int_fits_in.carbon + +// --- core.carbon + +package Core; + +interface IntFitsIn(Dest:! type) {} + +fn CheckFitsIn[U:! type, T:! IntFitsIn(U)](unused t: T, unused u: U) {} + +// --- valid.carbon + +library "[[@TEST_NAME]]"; + +import Core; + +fn CheckOk() { + Core.CheckFitsIn(1 as i32, 2 as i64); + Core.CheckFitsIn(1 as u32, 2 as u64); + Core.CheckFitsIn(1 as u32, 2 as i64); +} + +// --- fail_narrowing.carbon + +library "[[@TEST_NAME]]"; + +import Core; + +fn CheckFail() { + // CHECK:STDERR: fail_narrowing.carbon:[[@LINE+7]]:3: error: cannot convert type `i64` into type implementing `Core.IntFitsIn(i32)` [ConversionFailureTypeToFacet] + // CHECK:STDERR: Core.CheckFitsIn(1 as i64, 2 as i32); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: core.carbon:6:1: note: while deducing parameters of generic declared here [DeductionGenericHere] + // CHECK:STDERR: fn CheckFitsIn[U:! type, T:! IntFitsIn(U)](unused t: T, unused u: U) {} + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + Core.CheckFitsIn(1 as i64, 2 as i32); + // CHECK:STDERR: fail_narrowing.carbon:[[@LINE+7]]:3: error: cannot convert type `i64` into type implementing `Core.IntFitsIn(u32)` [ConversionFailureTypeToFacet] + // CHECK:STDERR: Core.CheckFitsIn(1 as i64, 2 as u32); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: core.carbon:6:1: note: while deducing parameters of generic declared here [DeductionGenericHere] + // CHECK:STDERR: fn CheckFitsIn[U:! type, T:! IntFitsIn(U)](unused t: T, unused u: U) {} + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + Core.CheckFitsIn(1 as i64, 2 as u32); + // CHECK:STDERR: fail_narrowing.carbon:[[@LINE+7]]:3: error: cannot convert type `u64` into type implementing `Core.IntFitsIn(i32)` [ConversionFailureTypeToFacet] + // CHECK:STDERR: Core.CheckFitsIn(1 as u64, 2 as i32); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: core.carbon:6:1: note: while deducing parameters of generic declared here [DeductionGenericHere] + // CHECK:STDERR: fn CheckFitsIn[U:! type, T:! IntFitsIn(U)](unused t: T, unused u: U) {} + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + Core.CheckFitsIn(1 as u64, 2 as i32); + // CHECK:STDERR: fail_narrowing.carbon:[[@LINE+7]]:3: error: cannot convert type `u64` into type implementing `Core.IntFitsIn(u32)` [ConversionFailureTypeToFacet] + // CHECK:STDERR: Core.CheckFitsIn(1 as u64, 2 as u32); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: core.carbon:6:1: note: while deducing parameters of generic declared here [DeductionGenericHere] + // CHECK:STDERR: fn CheckFitsIn[U:! type, T:! IntFitsIn(U)](unused t: T, unused u: U) {} + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + Core.CheckFitsIn(1 as u64, 2 as u32); +} + +// --- fail_same_size_sign_change.carbon + +library "[[@TEST_NAME]]"; + +import Core; + +fn CheckFail() { + // CHECK:STDERR: fail_same_size_sign_change.carbon:[[@LINE+7]]:3: error: cannot convert type `u32` into type implementing `Core.IntFitsIn(i32)` [ConversionFailureTypeToFacet] + // CHECK:STDERR: Core.CheckFitsIn(1 as u32, 2 as i32); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: core.carbon:6:1: note: while deducing parameters of generic declared here [DeductionGenericHere] + // CHECK:STDERR: fn CheckFitsIn[U:! type, T:! IntFitsIn(U)](unused t: T, unused u: U) {} + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + Core.CheckFitsIn(1 as u32, 2 as i32); + // CHECK:STDERR: fail_same_size_sign_change.carbon:[[@LINE+7]]:3: error: cannot convert type `i32` into type implementing `Core.IntFitsIn(u32)` [ConversionFailureTypeToFacet] + // CHECK:STDERR: Core.CheckFitsIn(1 as i32, 2 as u32); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: core.carbon:6:1: note: while deducing parameters of generic declared here [DeductionGenericHere] + // CHECK:STDERR: fn CheckFitsIn[U:! type, T:! IntFitsIn(U)](unused t: T, unused u: U) {} + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + Core.CheckFitsIn(1 as i32, 2 as u32); +} + +// --- fail_signed_to_wider_unsigned.carbon + +library "[[@TEST_NAME]]"; + +import Core; + +fn CheckFail() { + // CHECK:STDERR: fail_signed_to_wider_unsigned.carbon:[[@LINE+7]]:3: error: cannot convert type `i32` into type implementing `Core.IntFitsIn(u32)` [ConversionFailureTypeToFacet] + // CHECK:STDERR: Core.CheckFitsIn(1 as i32, 2 as u32); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: core.carbon:6:1: note: while deducing parameters of generic declared here [DeductionGenericHere] + // CHECK:STDERR: fn CheckFitsIn[U:! type, T:! IntFitsIn(U)](unused t: T, unused u: U) {} + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + Core.CheckFitsIn(1 as i32, 2 as u32); +} diff --git a/toolchain/check/testdata/interop/cpp/builtins.llp64.carbon b/toolchain/check/testdata/interop/cpp/builtins.llp64.carbon index 7c0607c08f37..01372fd7a331 100644 --- a/toolchain/check/testdata/interop/cpp/builtins.llp64.carbon +++ b/toolchain/check/testdata/interop/cpp/builtins.llp64.carbon @@ -638,13 +638,38 @@ fn F() { let cpp_compat_ulong: Core.CppCompat.ULong32 = cpp_unsigned_long; let unused cpp_compat_ulong_result: Cpp.ULongResult = Cpp.PassULong(cpp_compat_ulong); - let carbon_u32: u32 = cpp_unsigned_long; + let carbon_u32: u32 = 1; let unused carbon_u32_result: Cpp.UIntResult = Cpp.PassULong(carbon_u32); var unused a: array(f32, 1 as Cpp.unsigned_long) = (1.0,); //@dump-sem-ir-end } +// --- fail_no_ulong_to_u32.carbon + +library "[[@TEST_NAME]]"; + +import Cpp; + +fn F() { + let cpp_unsigned_long: Cpp.unsigned_long = 1; + + // For portability reasons, this is not allowed even though `unsigned long` + // happens to fit in `u32` on this target. + // CHECK:STDERR: fail_no_ulong_to_u32.carbon:[[@LINE+11]]:25: error: cannot implicitly convert expression of type `Cpp.unsigned_long` to `u32` [ConversionFailure] + // CHECK:STDERR: let carbon_u32: u32 = cpp_unsigned_long; + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_no_ulong_to_u32.carbon:[[@LINE+8]]:25: note: type `Cpp.unsigned_long` does not implement interface `Core.ImplicitAs(u32)` [MissingImplInMemberAccessInContext] + // CHECK:STDERR: let carbon_u32: u32 = cpp_unsigned_long; + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + // CHECK:STDERR: fail_no_ulong_to_u32.carbon:[[@LINE+4]]:7: warning: binding `carbon_u32` unused [UnusedBinding] + // CHECK:STDERR: let carbon_u32: u32 = cpp_unsigned_long; + // CHECK:STDERR: ^~~~~~~~~~ + // CHECK:STDERR: + let carbon_u32: u32 = cpp_unsigned_long; +} + // --- copy_unsigned_long.carbon library "[[@TEST_NAME]]"; @@ -672,8 +697,8 @@ fn CopyUnsignedLong() { // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.4e6: type = fn_type @Core.IntLiteral.as.ImplicitAs.impl.Convert, @Core.IntLiteral.as.ImplicitAs.impl(%To.fe9) [symbolic] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.3c2: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.4e6 = struct_value () [symbolic] // CHECK:STDOUT: %ImplicitAs.type.139: type = facet_type <@ImplicitAs, @ImplicitAs(Core.IntLiteral)> [concrete] -// CHECK:STDOUT: %From: Core.IntLiteral = symbolic_binding From, 0 [symbolic] -// CHECK:STDOUT: %Int.as.ImplicitAs.impl.Convert.type.2ed: type = fn_type @Int.as.ImplicitAs.impl.Convert, @Int.as.ImplicitAs.impl(%From) [symbolic] +// CHECK:STDOUT: %From.fe9: Core.IntLiteral = symbolic_binding From, 0 [symbolic] +// CHECK:STDOUT: %Int.as.ImplicitAs.impl.Convert.type.2ed: type = fn_type @Int.as.ImplicitAs.impl.Convert, @Int.as.ImplicitAs.impl(%From.fe9) [symbolic] // CHECK:STDOUT: %Int.as.ImplicitAs.impl.Convert.d29: %Int.as.ImplicitAs.impl.Convert.type.2ed = struct_value () [symbolic] // CHECK:STDOUT: %ImplicitAs.impl_witness.556: = impl_witness imports.%ImplicitAs.impl_witness_table.74f, @Core.IntLiteral.as.ImplicitAs.impl(%int_64) [concrete] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.b78: type = fn_type @Core.IntLiteral.as.ImplicitAs.impl.Convert, @Core.IntLiteral.as.ImplicitAs.impl(%int_64) [concrete] @@ -834,8 +859,8 @@ fn CopyUnsignedLong() { // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.6a6: type = fn_type @Core.IntLiteral.as.ImplicitAs.impl.Convert, @Core.IntLiteral.as.ImplicitAs.impl(%To.fe9) [symbolic] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.46e: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.6a6 = struct_value () [symbolic] // CHECK:STDOUT: %ImplicitAs.type.139: type = facet_type <@ImplicitAs, @ImplicitAs(Core.IntLiteral)> [concrete] -// CHECK:STDOUT: %From: Core.IntLiteral = symbolic_binding From, 0 [symbolic] -// CHECK:STDOUT: %UInt.as.ImplicitAs.impl.Convert.type.7f8: type = fn_type @UInt.as.ImplicitAs.impl.Convert, @UInt.as.ImplicitAs.impl(%From) [symbolic] +// CHECK:STDOUT: %From.fe9: Core.IntLiteral = symbolic_binding From, 0 [symbolic] +// CHECK:STDOUT: %UInt.as.ImplicitAs.impl.Convert.type.7f8: type = fn_type @UInt.as.ImplicitAs.impl.Convert.1, @UInt.as.ImplicitAs.impl.607(%From.fe9) [symbolic] // CHECK:STDOUT: %UInt.as.ImplicitAs.impl.Convert.0ea: %UInt.as.ImplicitAs.impl.Convert.type.7f8 = struct_value () [symbolic] // CHECK:STDOUT: %ImplicitAs.impl_witness.bb3: = impl_witness imports.%ImplicitAs.impl_witness_table.899, @Core.IntLiteral.as.ImplicitAs.impl(%int_64) [concrete] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.fb8: type = fn_type @Core.IntLiteral.as.ImplicitAs.impl.Convert, @Core.IntLiteral.as.ImplicitAs.impl(%int_64) [concrete] @@ -861,14 +886,14 @@ fn CopyUnsignedLong() { // CHECK:STDOUT: %Core.IntLiteral.as.As.impl.Convert.bound: = bound_method %int_1.5b8, %Core.IntLiteral.as.As.impl.Convert.715 [concrete] // CHECK:STDOUT: %Core.IntLiteral.as.As.impl.Convert.specific_fn: = specific_function %Core.IntLiteral.as.As.impl.Convert.715, @Core.IntLiteral.as.As.impl.Convert(%int_64) [concrete] // CHECK:STDOUT: %bound_method.9cf: = bound_method %int_1.5b8, %Core.IntLiteral.as.As.impl.Convert.specific_fn [concrete] -// CHECK:STDOUT: %ImplicitAs.impl_witness.2cc: = impl_witness imports.%ImplicitAs.impl_witness_table.493, @UInt.as.ImplicitAs.impl(%int_64) [concrete] -// CHECK:STDOUT: %UInt.as.ImplicitAs.impl.Convert.type.812: type = fn_type @UInt.as.ImplicitAs.impl.Convert, @UInt.as.ImplicitAs.impl(%int_64) [concrete] +// CHECK:STDOUT: %ImplicitAs.impl_witness.2cc: = impl_witness imports.%ImplicitAs.impl_witness_table.493, @UInt.as.ImplicitAs.impl.607(%int_64) [concrete] +// CHECK:STDOUT: %UInt.as.ImplicitAs.impl.Convert.type.812: type = fn_type @UInt.as.ImplicitAs.impl.Convert.1, @UInt.as.ImplicitAs.impl.607(%int_64) [concrete] // CHECK:STDOUT: %UInt.as.ImplicitAs.impl.Convert.309: %UInt.as.ImplicitAs.impl.Convert.type.812 = struct_value () [concrete] // CHECK:STDOUT: %ImplicitAs.facet.02d: %ImplicitAs.type.139 = facet_value %u64, (%ImplicitAs.impl_witness.2cc) [concrete] // CHECK:STDOUT: %ImplicitAs.WithSelf.Convert.type.79a: type = fn_type @ImplicitAs.WithSelf.Convert, @ImplicitAs.WithSelf(Core.IntLiteral, %ImplicitAs.facet.02d) [concrete] // CHECK:STDOUT: %.74a: type = fn_type_with_self_type %ImplicitAs.WithSelf.Convert.type.79a, %ImplicitAs.facet.02d [concrete] // CHECK:STDOUT: %UInt.as.ImplicitAs.impl.Convert.bound: = bound_method %int_1.f23, %UInt.as.ImplicitAs.impl.Convert.309 [concrete] -// CHECK:STDOUT: %UInt.as.ImplicitAs.impl.Convert.specific_fn: = specific_function %UInt.as.ImplicitAs.impl.Convert.309, @UInt.as.ImplicitAs.impl.Convert(%int_64) [concrete] +// CHECK:STDOUT: %UInt.as.ImplicitAs.impl.Convert.specific_fn: = specific_function %UInt.as.ImplicitAs.impl.Convert.309, @UInt.as.ImplicitAs.impl.Convert.1(%int_64) [concrete] // CHECK:STDOUT: %bound_method.f18: = bound_method %int_1.f23, %UInt.as.ImplicitAs.impl.Convert.specific_fn [concrete] // CHECK:STDOUT: %array_type: type = array_type %int_1.5b8, %f32.97e [concrete] // CHECK:STDOUT: %pattern_type.b36: type = pattern_type %array_type [concrete] @@ -901,8 +926,8 @@ fn CopyUnsignedLong() { // CHECK:STDOUT: } // CHECK:STDOUT: %Core.import_ref.741: @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert.type (%Core.IntLiteral.as.ImplicitAs.impl.Convert.type.6a6) = import_ref Core//prelude/types/uint, loc{{\d+_\d+}}, loaded [symbolic = @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert (constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.46e)] // CHECK:STDOUT: %ImplicitAs.impl_witness_table.899 = impl_witness_table (%Core.import_ref.741), @Core.IntLiteral.as.ImplicitAs.impl [concrete] -// CHECK:STDOUT: %Core.import_ref.483: @UInt.as.ImplicitAs.impl.%UInt.as.ImplicitAs.impl.Convert.type (%UInt.as.ImplicitAs.impl.Convert.type.7f8) = import_ref Core//prelude/types/uint, loc{{\d+_\d+}}, loaded [symbolic = @UInt.as.ImplicitAs.impl.%UInt.as.ImplicitAs.impl.Convert (constants.%UInt.as.ImplicitAs.impl.Convert.0ea)] -// CHECK:STDOUT: %ImplicitAs.impl_witness_table.493 = impl_witness_table (%Core.import_ref.483), @UInt.as.ImplicitAs.impl [concrete] +// CHECK:STDOUT: %Core.import_ref.483: @UInt.as.ImplicitAs.impl.607.%UInt.as.ImplicitAs.impl.Convert.type (%UInt.as.ImplicitAs.impl.Convert.type.7f8) = import_ref Core//prelude/types/uint, loc{{\d+_\d+}}, loaded [symbolic = @UInt.as.ImplicitAs.impl.607.%UInt.as.ImplicitAs.impl.Convert (constants.%UInt.as.ImplicitAs.impl.Convert.0ea)] +// CHECK:STDOUT: %ImplicitAs.impl_witness_table.493 = impl_witness_table (%Core.import_ref.483), @UInt.as.ImplicitAs.impl.607 [concrete] // CHECK:STDOUT: %Core.import_ref.600: @Core.IntLiteral.as.As.impl.%Core.IntLiteral.as.As.impl.Convert.type (%Core.IntLiteral.as.As.impl.Convert.type.2b1) = import_ref Core//prelude/types/uint, loc{{\d+_\d+}}, loaded [symbolic = @Core.IntLiteral.as.As.impl.%Core.IntLiteral.as.As.impl.Convert (constants.%Core.IntLiteral.as.As.impl.Convert.979)] // CHECK:STDOUT: %As.impl_witness_table.7eb = impl_witness_table (%Core.import_ref.600), @Core.IntLiteral.as.As.impl [concrete] // CHECK:STDOUT: %Core.import_ref.38a: @Core.FloatLiteral.as.ImplicitAs.impl.%Core.FloatLiteral.as.ImplicitAs.impl.Convert.type (%Core.FloatLiteral.as.ImplicitAs.impl.Convert.type.02f) = import_ref Core//prelude/types/float, loc{{\d+_\d+}}, loaded [symbolic = @Core.FloatLiteral.as.ImplicitAs.impl.%Core.FloatLiteral.as.ImplicitAs.impl.Convert (constants.%Core.FloatLiteral.as.ImplicitAs.impl.Convert.1f0)] @@ -967,7 +992,7 @@ fn CopyUnsignedLong() { // CHECK:STDOUT: %.loc11_30.2: %u64 = converted %int_1.loc11, %.loc11_30.1 [concrete = constants.%int_1.f23] // CHECK:STDOUT: %impl.elem0.loc11_30.2: %.74a = impl_witness_access constants.%ImplicitAs.impl_witness.2cc, element0 [concrete = constants.%UInt.as.ImplicitAs.impl.Convert.309] // CHECK:STDOUT: %bound_method.loc11_30.3: = bound_method %.loc11_30.2, %impl.elem0.loc11_30.2 [concrete = constants.%UInt.as.ImplicitAs.impl.Convert.bound] -// CHECK:STDOUT: %specific_fn.loc11_30.2: = specific_function %impl.elem0.loc11_30.2, @UInt.as.ImplicitAs.impl.Convert(constants.%int_64) [concrete = constants.%UInt.as.ImplicitAs.impl.Convert.specific_fn] +// CHECK:STDOUT: %specific_fn.loc11_30.2: = specific_function %impl.elem0.loc11_30.2, @UInt.as.ImplicitAs.impl.Convert.1(constants.%int_64) [concrete = constants.%UInt.as.ImplicitAs.impl.Convert.specific_fn] // CHECK:STDOUT: %bound_method.loc11_30.4: = bound_method %.loc11_30.2, %specific_fn.loc11_30.2 [concrete = constants.%bound_method.f18] // CHECK:STDOUT: %UInt.as.ImplicitAs.impl.Convert.call: init Core.IntLiteral = call %bound_method.loc11_30.4(%.loc11_30.2) [concrete = constants.%int_1.5b8] // CHECK:STDOUT: %.loc11_30.3: Core.IntLiteral = value_of_initializer %UInt.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_1.5b8] @@ -3917,14 +3942,13 @@ fn CopyUnsignedLong() { // CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] // CHECK:STDOUT: %ImplicitAs.type.3c3: type = facet_type <@ImplicitAs, @ImplicitAs(%Cpp.unsigned_long)> [concrete] // CHECK:STDOUT: %ImplicitAs.type.139: type = facet_type <@ImplicitAs, @ImplicitAs(Core.IntLiteral)> [concrete] -// CHECK:STDOUT: %ImplicitAs.type.146: type = facet_type <@ImplicitAs, @ImplicitAs(%u32)> [concrete] // CHECK:STDOUT: %ImplicitAs.impl_witness.a19: = impl_witness imports.%ImplicitAs.impl_witness_table.5b5 [concrete] // CHECK:STDOUT: %ImplicitAs.facet.66c: %ImplicitAs.type.3c3 = facet_value Core.IntLiteral, (%ImplicitAs.impl_witness.a19) [concrete] // CHECK:STDOUT: %ImplicitAs.WithSelf.Convert.type.b7d: type = fn_type @ImplicitAs.WithSelf.Convert, @ImplicitAs.WithSelf(%Cpp.unsigned_long, %ImplicitAs.facet.66c) [concrete] // CHECK:STDOUT: %.541: type = fn_type_with_self_type %ImplicitAs.WithSelf.Convert.type.b7d, %ImplicitAs.facet.66c [concrete] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.71f: type = fn_type @Core.IntLiteral.as.ImplicitAs.impl.Convert.1 [concrete] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.14b: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.71f = struct_value () [concrete] -// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.bound: = bound_method %int_1.5b8, %Core.IntLiteral.as.ImplicitAs.impl.Convert.14b [concrete] +// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.bound.92f: = bound_method %int_1.5b8, %Core.IntLiteral.as.ImplicitAs.impl.Convert.14b [concrete] // CHECK:STDOUT: %int_1.0ab: %Cpp.unsigned_long = int_value 1 [concrete] // CHECK:STDOUT: %ULongResult: type = class_type @ULongResult [concrete] // CHECK:STDOUT: %pattern_type.6f2: type = pattern_type %ULongResult [concrete] @@ -3934,12 +3958,20 @@ fn CopyUnsignedLong() { // CHECK:STDOUT: %PassULong__carbon_thunk.type.3fc2d8.1: type = fn_type @PassULong__carbon_thunk.1 [concrete] // CHECK:STDOUT: %PassULong__carbon_thunk.ff747d.1: %PassULong__carbon_thunk.type.3fc2d8.1 = struct_value () [concrete] // CHECK:STDOUT: %pattern_type.4a9: type = pattern_type %u32 [concrete] -// CHECK:STDOUT: %ImplicitAs.impl_witness.e61: = impl_witness imports.%ImplicitAs.impl_witness_table.af7 [concrete] -// CHECK:STDOUT: %ImplicitAs.facet.3c4: %ImplicitAs.type.146 = facet_value %Cpp.unsigned_long, (%ImplicitAs.impl_witness.e61) [concrete] -// CHECK:STDOUT: %ImplicitAs.WithSelf.Convert.type.4ad: type = fn_type @ImplicitAs.WithSelf.Convert, @ImplicitAs.WithSelf(%u32, %ImplicitAs.facet.3c4) [concrete] -// CHECK:STDOUT: %.5ab: type = fn_type_with_self_type %ImplicitAs.WithSelf.Convert.type.4ad, %ImplicitAs.facet.3c4 [concrete] -// CHECK:STDOUT: %Cpp.unsigned_long.as.ImplicitAs.impl.Convert.type.bef: type = fn_type @Cpp.unsigned_long.as.ImplicitAs.impl.Convert.1 [concrete] -// CHECK:STDOUT: %Cpp.unsigned_long.as.ImplicitAs.impl.Convert.19d: %Cpp.unsigned_long.as.ImplicitAs.impl.Convert.type.bef = struct_value () [concrete] +// CHECK:STDOUT: %ImplicitAs.type.146: type = facet_type <@ImplicitAs, @ImplicitAs(%u32)> [concrete] +// CHECK:STDOUT: %To.fe9: Core.IntLiteral = symbolic_binding To, 0 [symbolic] +// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.6a6: type = fn_type @Core.IntLiteral.as.ImplicitAs.impl.Convert.2, @Core.IntLiteral.as.ImplicitAs.impl.c85(%To.fe9) [symbolic] +// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.46e: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.6a6 = struct_value () [symbolic] +// CHECK:STDOUT: %ImplicitAs.impl_witness.29e: = impl_witness imports.%ImplicitAs.impl_witness_table.899, @Core.IntLiteral.as.ImplicitAs.impl.c85(%int_32) [concrete] +// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.b07: type = fn_type @Core.IntLiteral.as.ImplicitAs.impl.Convert.2, @Core.IntLiteral.as.ImplicitAs.impl.c85(%int_32) [concrete] +// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.90e: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.b07 = struct_value () [concrete] +// CHECK:STDOUT: %ImplicitAs.facet.309: %ImplicitAs.type.146 = facet_value Core.IntLiteral, (%ImplicitAs.impl_witness.29e) [concrete] +// CHECK:STDOUT: %ImplicitAs.WithSelf.Convert.type.a88: type = fn_type @ImplicitAs.WithSelf.Convert, @ImplicitAs.WithSelf(%u32, %ImplicitAs.facet.309) [concrete] +// CHECK:STDOUT: %.b47: type = fn_type_with_self_type %ImplicitAs.WithSelf.Convert.type.a88, %ImplicitAs.facet.309 [concrete] +// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.bound.412: = bound_method %int_1.5b8, %Core.IntLiteral.as.ImplicitAs.impl.Convert.90e [concrete] +// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn: = specific_function %Core.IntLiteral.as.ImplicitAs.impl.Convert.90e, @Core.IntLiteral.as.ImplicitAs.impl.Convert.2(%int_32) [concrete] +// CHECK:STDOUT: %bound_method.21d: = bound_method %int_1.5b8, %Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn [concrete] +// CHECK:STDOUT: %int_1.c1d: %u32 = int_value 1 [concrete] // CHECK:STDOUT: %UIntResult: type = class_type @UIntResult [concrete] // CHECK:STDOUT: %pattern_type.dc7: type = pattern_type %UIntResult [concrete] // CHECK:STDOUT: %ptr.059: type = ptr_type %UIntResult [concrete] @@ -3962,9 +3994,9 @@ fn CopyUnsignedLong() { // CHECK:STDOUT: %ImplicitAs.facet.2f7: %ImplicitAs.type.139 = facet_value %Cpp.unsigned_long, (%ImplicitAs.impl_witness.a13) [concrete] // CHECK:STDOUT: %ImplicitAs.WithSelf.Convert.type.328: type = fn_type @ImplicitAs.WithSelf.Convert, @ImplicitAs.WithSelf(Core.IntLiteral, %ImplicitAs.facet.2f7) [concrete] // CHECK:STDOUT: %.0db: type = fn_type_with_self_type %ImplicitAs.WithSelf.Convert.type.328, %ImplicitAs.facet.2f7 [concrete] -// CHECK:STDOUT: %Cpp.unsigned_long.as.ImplicitAs.impl.Convert.type.a9d: type = fn_type @Cpp.unsigned_long.as.ImplicitAs.impl.Convert.2 [concrete] -// CHECK:STDOUT: %Cpp.unsigned_long.as.ImplicitAs.impl.Convert.e53: %Cpp.unsigned_long.as.ImplicitAs.impl.Convert.type.a9d = struct_value () [concrete] -// CHECK:STDOUT: %Cpp.unsigned_long.as.ImplicitAs.impl.Convert.bound: = bound_method %int_1.0ab, %Cpp.unsigned_long.as.ImplicitAs.impl.Convert.e53 [concrete] +// CHECK:STDOUT: %Cpp.unsigned_long.as.ImplicitAs.impl.Convert.type: type = fn_type @Cpp.unsigned_long.as.ImplicitAs.impl.Convert [concrete] +// CHECK:STDOUT: %Cpp.unsigned_long.as.ImplicitAs.impl.Convert: %Cpp.unsigned_long.as.ImplicitAs.impl.Convert.type = struct_value () [concrete] +// CHECK:STDOUT: %Cpp.unsigned_long.as.ImplicitAs.impl.Convert.bound: = bound_method %int_1.0ab, %Cpp.unsigned_long.as.ImplicitAs.impl.Convert [concrete] // CHECK:STDOUT: %array_type: type = array_type %int_1.5b8, %f32.97e [concrete] // CHECK:STDOUT: %pattern_type.b36: type = pattern_type %array_type [concrete] // CHECK:STDOUT: %float.674: Core.FloatLiteral = float_literal_value 10e-1 [concrete] @@ -3982,7 +4014,7 @@ fn CopyUnsignedLong() { // CHECK:STDOUT: %.98d: type = fn_type_with_self_type %ImplicitAs.WithSelf.Convert.type.e4d, %ImplicitAs.facet.945 [concrete] // CHECK:STDOUT: %Core.FloatLiteral.as.ImplicitAs.impl.Convert.bound: = bound_method %float.674, %Core.FloatLiteral.as.ImplicitAs.impl.Convert.e55 [concrete] // CHECK:STDOUT: %Core.FloatLiteral.as.ImplicitAs.impl.Convert.specific_fn: = specific_function %Core.FloatLiteral.as.ImplicitAs.impl.Convert.e55, @Core.FloatLiteral.as.ImplicitAs.impl.Convert(%int_32) [concrete] -// CHECK:STDOUT: %bound_method: = bound_method %float.674, %Core.FloatLiteral.as.ImplicitAs.impl.Convert.specific_fn [concrete] +// CHECK:STDOUT: %bound_method.1e4: = bound_method %float.674, %Core.FloatLiteral.as.ImplicitAs.impl.Convert.specific_fn [concrete] // CHECK:STDOUT: %float.e3b: %f32.97e = float_value 1 [concrete] // CHECK:STDOUT: %array: %array_type = tuple_value (%float.e3b) [concrete] // CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] @@ -4030,8 +4062,8 @@ fn CopyUnsignedLong() { // CHECK:STDOUT: // CHECK:STDOUT: } // CHECK:STDOUT: %Core.UInt: %UInt.type = import_ref Core//prelude/types/uint, UInt, loaded [concrete = constants.%UInt.generic] -// CHECK:STDOUT: %Core.import_ref.d88: %Cpp.unsigned_long.as.ImplicitAs.impl.Convert.type.bef = import_ref Core//prelude/types/cpp/int, loc{{\d+_\d+}}, loaded [concrete = constants.%Cpp.unsigned_long.as.ImplicitAs.impl.Convert.19d] -// CHECK:STDOUT: %ImplicitAs.impl_witness_table.af7 = impl_witness_table (%Core.import_ref.d88), @Cpp.unsigned_long.as.ImplicitAs.impl.66a [concrete] +// CHECK:STDOUT: %Core.import_ref.741: @Core.IntLiteral.as.ImplicitAs.impl.c85.%Core.IntLiteral.as.ImplicitAs.impl.Convert.type (%Core.IntLiteral.as.ImplicitAs.impl.Convert.type.6a6) = import_ref Core//prelude/types/uint, loc{{\d+_\d+}}, loaded [symbolic = @Core.IntLiteral.as.ImplicitAs.impl.c85.%Core.IntLiteral.as.ImplicitAs.impl.Convert (constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.46e)] +// CHECK:STDOUT: %ImplicitAs.impl_witness_table.899 = impl_witness_table (%Core.import_ref.741), @Core.IntLiteral.as.ImplicitAs.impl.c85 [concrete] // CHECK:STDOUT: %UIntResult.decl: type = class_decl @UIntResult [concrete = constants.%UIntResult] {} {} // CHECK:STDOUT: %PassULong__carbon_thunk.decl.108234.2: %PassULong__carbon_thunk.type.3fc2d8.2 = fn_decl @PassULong__carbon_thunk.2 [concrete = constants.%PassULong__carbon_thunk.ff747d.2] { // CHECK:STDOUT: @@ -4042,7 +4074,7 @@ fn CopyUnsignedLong() { // CHECK:STDOUT: %Core.As: %As.type.90f = import_ref Core//prelude/operators/as, As, loaded [concrete = constants.%As.generic] // CHECK:STDOUT: %Core.import_ref.190: %Core.IntLiteral.as.As.impl.Convert.type = import_ref Core//prelude/types/cpp/int, loc{{\d+_\d+}}, loaded [concrete = constants.%Core.IntLiteral.as.As.impl.Convert] // CHECK:STDOUT: %As.impl_witness_table.f58 = impl_witness_table (%Core.import_ref.190), @Core.IntLiteral.as.As.impl.8c9 [concrete] -// CHECK:STDOUT: %Core.import_ref.f5e: %Cpp.unsigned_long.as.ImplicitAs.impl.Convert.type.a9d = import_ref Core//prelude/types/cpp/int, loc{{\d+_\d+}}, loaded [concrete = constants.%Cpp.unsigned_long.as.ImplicitAs.impl.Convert.e53] +// CHECK:STDOUT: %Core.import_ref.f5e: %Cpp.unsigned_long.as.ImplicitAs.impl.Convert.type = import_ref Core//prelude/types/cpp/int, loc{{\d+_\d+}}, loaded [concrete = constants.%Cpp.unsigned_long.as.ImplicitAs.impl.Convert] // CHECK:STDOUT: %ImplicitAs.impl_witness_table.50d = impl_witness_table (%Core.import_ref.f5e), @Cpp.unsigned_long.as.ImplicitAs.impl.78e [concrete] // CHECK:STDOUT: %Core.import_ref.38a: @Core.FloatLiteral.as.ImplicitAs.impl.%Core.FloatLiteral.as.ImplicitAs.impl.Convert.type (%Core.FloatLiteral.as.ImplicitAs.impl.Convert.type.02f) = import_ref Core//prelude/types/float, loc{{\d+_\d+}}, loaded [symbolic = @Core.FloatLiteral.as.ImplicitAs.impl.%Core.FloatLiteral.as.ImplicitAs.impl.Convert (constants.%Core.FloatLiteral.as.ImplicitAs.impl.Convert.1f0)] // CHECK:STDOUT: %ImplicitAs.impl_witness_table.31a = impl_witness_table (%Core.import_ref.38a), @Core.FloatLiteral.as.ImplicitAs.impl [concrete] @@ -4060,9 +4092,9 @@ fn CopyUnsignedLong() { // CHECK:STDOUT: %unsigned_long.ref.loc15: type = name_ref unsigned_long, constants.%Cpp.unsigned_long [concrete = constants.%Cpp.unsigned_long] // CHECK:STDOUT: } // CHECK:STDOUT: %impl.elem0.loc15: %.541 = impl_witness_access constants.%ImplicitAs.impl_witness.a19, element0 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.14b] -// CHECK:STDOUT: %bound_method.loc15: = bound_method %int_1.loc15, %impl.elem0.loc15 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.bound] -// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %Cpp.unsigned_long = call %bound_method.loc15(%int_1.loc15) [concrete = constants.%int_1.0ab] -// CHECK:STDOUT: %.loc15_46.1: %Cpp.unsigned_long = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_1.0ab] +// CHECK:STDOUT: %bound_method.loc15: = bound_method %int_1.loc15, %impl.elem0.loc15 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.bound.92f] +// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call.loc15: init %Cpp.unsigned_long = call %bound_method.loc15(%int_1.loc15) [concrete = constants.%int_1.0ab] +// CHECK:STDOUT: %.loc15_46.1: %Cpp.unsigned_long = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call.loc15 [concrete = constants.%int_1.0ab] // CHECK:STDOUT: %.loc15_46.2: %Cpp.unsigned_long = converted %int_1.loc15, %.loc15_46.1 [concrete = constants.%int_1.0ab] // CHECK:STDOUT: %cpp_unsigned_long: %Cpp.unsigned_long = value_binding cpp_unsigned_long, %.loc15_46.2 // CHECK:STDOUT: name_binding_decl { @@ -4112,13 +4144,15 @@ fn CopyUnsignedLong() { // CHECK:STDOUT: name_binding_decl { // CHECK:STDOUT: %carbon_u32.patt: %pattern_type.4a9 = value_binding_pattern carbon_u32 [concrete] // CHECK:STDOUT: } -// CHECK:STDOUT: %cpp_unsigned_long.ref.loc21: %Cpp.unsigned_long = name_ref cpp_unsigned_long, %cpp_unsigned_long +// CHECK:STDOUT: %int_1.loc21: Core.IntLiteral = int_value 1 [concrete = constants.%int_1.5b8] // CHECK:STDOUT: %u32: type = type_literal constants.%u32 [concrete = constants.%u32] -// CHECK:STDOUT: %impl.elem0.loc21: %.5ab = impl_witness_access constants.%ImplicitAs.impl_witness.e61, element0 [concrete = constants.%Cpp.unsigned_long.as.ImplicitAs.impl.Convert.19d] -// CHECK:STDOUT: %bound_method.loc21: = bound_method %cpp_unsigned_long.ref.loc21, %impl.elem0.loc21 -// CHECK:STDOUT: %Cpp.unsigned_long.as.ImplicitAs.impl.Convert.call.loc21: init %u32 = call %bound_method.loc21(%cpp_unsigned_long.ref.loc21) -// CHECK:STDOUT: %.loc21_25.1: %u32 = value_of_initializer %Cpp.unsigned_long.as.ImplicitAs.impl.Convert.call.loc21 -// CHECK:STDOUT: %.loc21_25.2: %u32 = converted %cpp_unsigned_long.ref.loc21, %.loc21_25.1 +// CHECK:STDOUT: %impl.elem0.loc21: %.b47 = impl_witness_access constants.%ImplicitAs.impl_witness.29e, element0 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.90e] +// CHECK:STDOUT: %bound_method.loc21_25.1: = bound_method %int_1.loc21, %impl.elem0.loc21 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.bound.412] +// CHECK:STDOUT: %specific_fn.loc21: = specific_function %impl.elem0.loc21, @Core.IntLiteral.as.ImplicitAs.impl.Convert.2(constants.%int_32) [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn] +// CHECK:STDOUT: %bound_method.loc21_25.2: = bound_method %int_1.loc21, %specific_fn.loc21 [concrete = constants.%bound_method.21d] +// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call.loc21: init %u32 = call %bound_method.loc21_25.2(%int_1.loc21) [concrete = constants.%int_1.c1d] +// CHECK:STDOUT: %.loc21_25.1: %u32 = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call.loc21 [concrete = constants.%int_1.c1d] +// CHECK:STDOUT: %.loc21_25.2: %u32 = converted %int_1.loc21, %.loc21_25.1 [concrete = constants.%int_1.c1d] // CHECK:STDOUT: %carbon_u32: %u32 = value_binding carbon_u32, %.loc21_25.2 // CHECK:STDOUT: name_binding_decl { // CHECK:STDOUT: %carbon_u32_result.patt: %pattern_type.dc7 = value_binding_pattern carbon_u32_result [concrete] @@ -4146,8 +4180,8 @@ fn CopyUnsignedLong() { // CHECK:STDOUT: %.loc24_59.1: %tuple.type = tuple_literal (%float) [concrete = constants.%tuple] // CHECK:STDOUT: %impl.elem0.loc24_59: %.98d = impl_witness_access constants.%ImplicitAs.impl_witness.bc6, element0 [concrete = constants.%Core.FloatLiteral.as.ImplicitAs.impl.Convert.e55] // CHECK:STDOUT: %bound_method.loc24_59.1: = bound_method %float, %impl.elem0.loc24_59 [concrete = constants.%Core.FloatLiteral.as.ImplicitAs.impl.Convert.bound] -// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0.loc24_59, @Core.FloatLiteral.as.ImplicitAs.impl.Convert(constants.%int_32) [concrete = constants.%Core.FloatLiteral.as.ImplicitAs.impl.Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc24_59.2: = bound_method %float, %specific_fn [concrete = constants.%bound_method] +// CHECK:STDOUT: %specific_fn.loc24: = specific_function %impl.elem0.loc24_59, @Core.FloatLiteral.as.ImplicitAs.impl.Convert(constants.%int_32) [concrete = constants.%Core.FloatLiteral.as.ImplicitAs.impl.Convert.specific_fn] +// CHECK:STDOUT: %bound_method.loc24_59.2: = bound_method %float, %specific_fn.loc24 [concrete = constants.%bound_method.1e4] // CHECK:STDOUT: %Core.FloatLiteral.as.ImplicitAs.impl.Convert.call: init %f32.97e = call %bound_method.loc24_59.2(%float) [concrete = constants.%float.e3b] // CHECK:STDOUT: %.loc24_59.2: init %f32.97e = converted %float, %Core.FloatLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%float.e3b] // CHECK:STDOUT: %int_0: Core.IntLiteral = int_value 0 [concrete = constants.%int_0] @@ -4166,10 +4200,10 @@ fn CopyUnsignedLong() { // CHECK:STDOUT: %Core.IntLiteral.as.As.impl.Convert.call: init %Cpp.unsigned_long = call %bound_method.loc24_30.1(%int_1.loc24) [concrete = constants.%int_1.0ab] // CHECK:STDOUT: %.loc24_30.1: %Cpp.unsigned_long = value_of_initializer %Core.IntLiteral.as.As.impl.Convert.call [concrete = constants.%int_1.0ab] // CHECK:STDOUT: %.loc24_30.2: %Cpp.unsigned_long = converted %int_1.loc24, %.loc24_30.1 [concrete = constants.%int_1.0ab] -// CHECK:STDOUT: %impl.elem0.loc24_30.2: %.0db = impl_witness_access constants.%ImplicitAs.impl_witness.a13, element0 [concrete = constants.%Cpp.unsigned_long.as.ImplicitAs.impl.Convert.e53] +// CHECK:STDOUT: %impl.elem0.loc24_30.2: %.0db = impl_witness_access constants.%ImplicitAs.impl_witness.a13, element0 [concrete = constants.%Cpp.unsigned_long.as.ImplicitAs.impl.Convert] // CHECK:STDOUT: %bound_method.loc24_30.2: = bound_method %.loc24_30.2, %impl.elem0.loc24_30.2 [concrete = constants.%Cpp.unsigned_long.as.ImplicitAs.impl.Convert.bound] -// CHECK:STDOUT: %Cpp.unsigned_long.as.ImplicitAs.impl.Convert.call.loc24: init Core.IntLiteral = call %bound_method.loc24_30.2(%.loc24_30.2) [concrete = constants.%int_1.5b8] -// CHECK:STDOUT: %.loc24_30.3: Core.IntLiteral = value_of_initializer %Cpp.unsigned_long.as.ImplicitAs.impl.Convert.call.loc24 [concrete = constants.%int_1.5b8] +// CHECK:STDOUT: %Cpp.unsigned_long.as.ImplicitAs.impl.Convert.call: init Core.IntLiteral = call %bound_method.loc24_30.2(%.loc24_30.2) [concrete = constants.%int_1.5b8] +// CHECK:STDOUT: %.loc24_30.3: Core.IntLiteral = value_of_initializer %Cpp.unsigned_long.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_1.5b8] // CHECK:STDOUT: %.loc24_30.4: Core.IntLiteral = converted %.loc24_30.2, %.loc24_30.3 [concrete = constants.%int_1.5b8] // CHECK:STDOUT: %array_type: type = array_type %.loc24_30.4, %f32 [concrete = constants.%array_type] // CHECK:STDOUT: } diff --git a/toolchain/check/testdata/interop/cpp/builtins.lp64.carbon b/toolchain/check/testdata/interop/cpp/builtins.lp64.carbon index 8fa4a00df30c..f481ab44b620 100644 --- a/toolchain/check/testdata/interop/cpp/builtins.lp64.carbon +++ b/toolchain/check/testdata/interop/cpp/builtins.lp64.carbon @@ -586,13 +586,38 @@ fn F() { let cpp_compat_ulong_long: Core.CppCompat.ULongLong64 = cpp_unsigned_long_long; let unused cpp_compat_ulong_long_result: Cpp.ULongLongResult = Cpp.PassULongLong(cpp_compat_ulong_long); - let carbon_u64: u64 = cpp_unsigned_long_long; + let carbon_u64: u64 = 1; let unused carbon_u64_result: Cpp.ULongResult = Cpp.PassULongLong(carbon_u64); var unused a: array(f32, 1 as Cpp.unsigned_long_long) = (1.0,); //@dump-sem-ir-end } +// --- fail_pass_ulonglong_to_u64.carbon + +library "[[@TEST_NAME]]"; + +import Cpp; + +fn F() { + let cpp_unsigned_long_long: Cpp.unsigned_long_long = 1; + + // For portability reasons, this is not allowed even though `unsigned long + // long` happens to fit in `u64` on this target. + // CHECK:STDERR: fail_pass_ulonglong_to_u64.carbon:[[@LINE+11]]:25: error: cannot implicitly convert expression of type `Cpp.unsigned_long_long` to `u64` [ConversionFailure] + // CHECK:STDERR: let carbon_u64: u64 = cpp_unsigned_long_long; + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_pass_ulonglong_to_u64.carbon:[[@LINE+8]]:25: note: type `Cpp.unsigned_long_long` does not implement interface `Core.ImplicitAs(u64)` [MissingImplInMemberAccessInContext] + // CHECK:STDERR: let carbon_u64: u64 = cpp_unsigned_long_long; + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + // CHECK:STDERR: fail_pass_ulonglong_to_u64.carbon:[[@LINE+4]]:7: warning: binding `carbon_u64` unused [UnusedBinding] + // CHECK:STDERR: let carbon_u64: u64 = cpp_unsigned_long_long; + // CHECK:STDERR: ^~~~~~~~~~ + // CHECK:STDERR: + let carbon_u64: u64 = cpp_unsigned_long_long; +} + // --- copy_unsigned_long_long.carbon library "[[@TEST_NAME]]"; @@ -620,8 +645,8 @@ fn CopyUnsignedLongLong() { // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.4e6: type = fn_type @Core.IntLiteral.as.ImplicitAs.impl.Convert, @Core.IntLiteral.as.ImplicitAs.impl(%To.fe9) [symbolic] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.3c2: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.4e6 = struct_value () [symbolic] // CHECK:STDOUT: %ImplicitAs.type.139: type = facet_type <@ImplicitAs, @ImplicitAs(Core.IntLiteral)> [concrete] -// CHECK:STDOUT: %From: Core.IntLiteral = symbolic_binding From, 0 [symbolic] -// CHECK:STDOUT: %Int.as.ImplicitAs.impl.Convert.type.2ed: type = fn_type @Int.as.ImplicitAs.impl.Convert, @Int.as.ImplicitAs.impl(%From) [symbolic] +// CHECK:STDOUT: %From.fe9: Core.IntLiteral = symbolic_binding From, 0 [symbolic] +// CHECK:STDOUT: %Int.as.ImplicitAs.impl.Convert.type.2ed: type = fn_type @Int.as.ImplicitAs.impl.Convert, @Int.as.ImplicitAs.impl(%From.fe9) [symbolic] // CHECK:STDOUT: %Int.as.ImplicitAs.impl.Convert.d29: %Int.as.ImplicitAs.impl.Convert.type.2ed = struct_value () [symbolic] // CHECK:STDOUT: %ImplicitAs.impl_witness.556: = impl_witness imports.%ImplicitAs.impl_witness_table.74f, @Core.IntLiteral.as.ImplicitAs.impl(%int_64) [concrete] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.b78: type = fn_type @Core.IntLiteral.as.ImplicitAs.impl.Convert, @Core.IntLiteral.as.ImplicitAs.impl(%int_64) [concrete] @@ -782,8 +807,8 @@ fn CopyUnsignedLongLong() { // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.6a6: type = fn_type @Core.IntLiteral.as.ImplicitAs.impl.Convert, @Core.IntLiteral.as.ImplicitAs.impl(%To.fe9) [symbolic] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.46e: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.6a6 = struct_value () [symbolic] // CHECK:STDOUT: %ImplicitAs.type.139: type = facet_type <@ImplicitAs, @ImplicitAs(Core.IntLiteral)> [concrete] -// CHECK:STDOUT: %From: Core.IntLiteral = symbolic_binding From, 0 [symbolic] -// CHECK:STDOUT: %UInt.as.ImplicitAs.impl.Convert.type.7f8: type = fn_type @UInt.as.ImplicitAs.impl.Convert, @UInt.as.ImplicitAs.impl(%From) [symbolic] +// CHECK:STDOUT: %From.fe9: Core.IntLiteral = symbolic_binding From, 0 [symbolic] +// CHECK:STDOUT: %UInt.as.ImplicitAs.impl.Convert.type.7f8: type = fn_type @UInt.as.ImplicitAs.impl.Convert.1, @UInt.as.ImplicitAs.impl.607(%From.fe9) [symbolic] // CHECK:STDOUT: %UInt.as.ImplicitAs.impl.Convert.0ea: %UInt.as.ImplicitAs.impl.Convert.type.7f8 = struct_value () [symbolic] // CHECK:STDOUT: %ImplicitAs.impl_witness.bb3: = impl_witness imports.%ImplicitAs.impl_witness_table.899, @Core.IntLiteral.as.ImplicitAs.impl(%int_64) [concrete] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.fb8: type = fn_type @Core.IntLiteral.as.ImplicitAs.impl.Convert, @Core.IntLiteral.as.ImplicitAs.impl(%int_64) [concrete] @@ -809,14 +834,14 @@ fn CopyUnsignedLongLong() { // CHECK:STDOUT: %Core.IntLiteral.as.As.impl.Convert.bound: = bound_method %int_1.5b8, %Core.IntLiteral.as.As.impl.Convert.715 [concrete] // CHECK:STDOUT: %Core.IntLiteral.as.As.impl.Convert.specific_fn: = specific_function %Core.IntLiteral.as.As.impl.Convert.715, @Core.IntLiteral.as.As.impl.Convert(%int_64) [concrete] // CHECK:STDOUT: %bound_method.9cf: = bound_method %int_1.5b8, %Core.IntLiteral.as.As.impl.Convert.specific_fn [concrete] -// CHECK:STDOUT: %ImplicitAs.impl_witness.2cc: = impl_witness imports.%ImplicitAs.impl_witness_table.493, @UInt.as.ImplicitAs.impl(%int_64) [concrete] -// CHECK:STDOUT: %UInt.as.ImplicitAs.impl.Convert.type.812: type = fn_type @UInt.as.ImplicitAs.impl.Convert, @UInt.as.ImplicitAs.impl(%int_64) [concrete] +// CHECK:STDOUT: %ImplicitAs.impl_witness.2cc: = impl_witness imports.%ImplicitAs.impl_witness_table.493, @UInt.as.ImplicitAs.impl.607(%int_64) [concrete] +// CHECK:STDOUT: %UInt.as.ImplicitAs.impl.Convert.type.812: type = fn_type @UInt.as.ImplicitAs.impl.Convert.1, @UInt.as.ImplicitAs.impl.607(%int_64) [concrete] // CHECK:STDOUT: %UInt.as.ImplicitAs.impl.Convert.309: %UInt.as.ImplicitAs.impl.Convert.type.812 = struct_value () [concrete] // CHECK:STDOUT: %ImplicitAs.facet.02d: %ImplicitAs.type.139 = facet_value %u64, (%ImplicitAs.impl_witness.2cc) [concrete] // CHECK:STDOUT: %ImplicitAs.WithSelf.Convert.type.79a: type = fn_type @ImplicitAs.WithSelf.Convert, @ImplicitAs.WithSelf(Core.IntLiteral, %ImplicitAs.facet.02d) [concrete] // CHECK:STDOUT: %.74a: type = fn_type_with_self_type %ImplicitAs.WithSelf.Convert.type.79a, %ImplicitAs.facet.02d [concrete] // CHECK:STDOUT: %UInt.as.ImplicitAs.impl.Convert.bound: = bound_method %int_1.f23, %UInt.as.ImplicitAs.impl.Convert.309 [concrete] -// CHECK:STDOUT: %UInt.as.ImplicitAs.impl.Convert.specific_fn: = specific_function %UInt.as.ImplicitAs.impl.Convert.309, @UInt.as.ImplicitAs.impl.Convert(%int_64) [concrete] +// CHECK:STDOUT: %UInt.as.ImplicitAs.impl.Convert.specific_fn: = specific_function %UInt.as.ImplicitAs.impl.Convert.309, @UInt.as.ImplicitAs.impl.Convert.1(%int_64) [concrete] // CHECK:STDOUT: %bound_method.f18: = bound_method %int_1.f23, %UInt.as.ImplicitAs.impl.Convert.specific_fn [concrete] // CHECK:STDOUT: %array_type: type = array_type %int_1.5b8, %f32.97e [concrete] // CHECK:STDOUT: %pattern_type.b36: type = pattern_type %array_type [concrete] @@ -849,8 +874,8 @@ fn CopyUnsignedLongLong() { // CHECK:STDOUT: } // CHECK:STDOUT: %Core.import_ref.741: @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert.type (%Core.IntLiteral.as.ImplicitAs.impl.Convert.type.6a6) = import_ref Core//prelude/types/uint, loc{{\d+_\d+}}, loaded [symbolic = @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert (constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.46e)] // CHECK:STDOUT: %ImplicitAs.impl_witness_table.899 = impl_witness_table (%Core.import_ref.741), @Core.IntLiteral.as.ImplicitAs.impl [concrete] -// CHECK:STDOUT: %Core.import_ref.483: @UInt.as.ImplicitAs.impl.%UInt.as.ImplicitAs.impl.Convert.type (%UInt.as.ImplicitAs.impl.Convert.type.7f8) = import_ref Core//prelude/types/uint, loc{{\d+_\d+}}, loaded [symbolic = @UInt.as.ImplicitAs.impl.%UInt.as.ImplicitAs.impl.Convert (constants.%UInt.as.ImplicitAs.impl.Convert.0ea)] -// CHECK:STDOUT: %ImplicitAs.impl_witness_table.493 = impl_witness_table (%Core.import_ref.483), @UInt.as.ImplicitAs.impl [concrete] +// CHECK:STDOUT: %Core.import_ref.483: @UInt.as.ImplicitAs.impl.607.%UInt.as.ImplicitAs.impl.Convert.type (%UInt.as.ImplicitAs.impl.Convert.type.7f8) = import_ref Core//prelude/types/uint, loc{{\d+_\d+}}, loaded [symbolic = @UInt.as.ImplicitAs.impl.607.%UInt.as.ImplicitAs.impl.Convert (constants.%UInt.as.ImplicitAs.impl.Convert.0ea)] +// CHECK:STDOUT: %ImplicitAs.impl_witness_table.493 = impl_witness_table (%Core.import_ref.483), @UInt.as.ImplicitAs.impl.607 [concrete] // CHECK:STDOUT: %Core.import_ref.600: @Core.IntLiteral.as.As.impl.%Core.IntLiteral.as.As.impl.Convert.type (%Core.IntLiteral.as.As.impl.Convert.type.2b1) = import_ref Core//prelude/types/uint, loc{{\d+_\d+}}, loaded [symbolic = @Core.IntLiteral.as.As.impl.%Core.IntLiteral.as.As.impl.Convert (constants.%Core.IntLiteral.as.As.impl.Convert.979)] // CHECK:STDOUT: %As.impl_witness_table.7eb = impl_witness_table (%Core.import_ref.600), @Core.IntLiteral.as.As.impl [concrete] // CHECK:STDOUT: %Core.import_ref.38a: @Core.FloatLiteral.as.ImplicitAs.impl.%Core.FloatLiteral.as.ImplicitAs.impl.Convert.type (%Core.FloatLiteral.as.ImplicitAs.impl.Convert.type.02f) = import_ref Core//prelude/types/float, loc{{\d+_\d+}}, loaded [symbolic = @Core.FloatLiteral.as.ImplicitAs.impl.%Core.FloatLiteral.as.ImplicitAs.impl.Convert (constants.%Core.FloatLiteral.as.ImplicitAs.impl.Convert.1f0)] @@ -915,7 +940,7 @@ fn CopyUnsignedLongLong() { // CHECK:STDOUT: %.loc11_30.2: %u64 = converted %int_1.loc11, %.loc11_30.1 [concrete = constants.%int_1.f23] // CHECK:STDOUT: %impl.elem0.loc11_30.2: %.74a = impl_witness_access constants.%ImplicitAs.impl_witness.2cc, element0 [concrete = constants.%UInt.as.ImplicitAs.impl.Convert.309] // CHECK:STDOUT: %bound_method.loc11_30.3: = bound_method %.loc11_30.2, %impl.elem0.loc11_30.2 [concrete = constants.%UInt.as.ImplicitAs.impl.Convert.bound] -// CHECK:STDOUT: %specific_fn.loc11_30.2: = specific_function %impl.elem0.loc11_30.2, @UInt.as.ImplicitAs.impl.Convert(constants.%int_64) [concrete = constants.%UInt.as.ImplicitAs.impl.Convert.specific_fn] +// CHECK:STDOUT: %specific_fn.loc11_30.2: = specific_function %impl.elem0.loc11_30.2, @UInt.as.ImplicitAs.impl.Convert.1(constants.%int_64) [concrete = constants.%UInt.as.ImplicitAs.impl.Convert.specific_fn] // CHECK:STDOUT: %bound_method.loc11_30.4: = bound_method %.loc11_30.2, %specific_fn.loc11_30.2 [concrete = constants.%bound_method.f18] // CHECK:STDOUT: %UInt.as.ImplicitAs.impl.Convert.call: init Core.IntLiteral = call %bound_method.loc11_30.4(%.loc11_30.2) [concrete = constants.%int_1.5b8] // CHECK:STDOUT: %.loc11_30.3: Core.IntLiteral = value_of_initializer %UInt.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_1.5b8] @@ -3643,7 +3668,7 @@ fn CopyUnsignedLongLong() { // CHECK:STDOUT: %.30f: type = fn_type_with_self_type %ImplicitAs.WithSelf.Convert.type.3d9, %ImplicitAs.facet.195 [concrete] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.bcb: type = fn_type @Core.IntLiteral.as.ImplicitAs.impl.Convert.1 [concrete] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.f87: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.bcb = struct_value () [concrete] -// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.bound: = bound_method %int_1.5b8, %Core.IntLiteral.as.ImplicitAs.impl.Convert.f87 [concrete] +// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.bound.4b8: = bound_method %int_1.5b8, %Core.IntLiteral.as.ImplicitAs.impl.Convert.f87 [concrete] // CHECK:STDOUT: %int_1.79a: %Cpp.unsigned_long_long = int_value 1 [concrete] // CHECK:STDOUT: %ULongLongResult: type = class_type @ULongLongResult [concrete] // CHECK:STDOUT: %pattern_type.633: type = pattern_type %ULongLongResult [concrete] @@ -3653,12 +3678,19 @@ fn CopyUnsignedLongLong() { // CHECK:STDOUT: %PassULongLong__carbon_thunk.type.88c6c2.1: type = fn_type @PassULongLong__carbon_thunk.1 [concrete] // CHECK:STDOUT: %PassULongLong__carbon_thunk.887181.1: %PassULongLong__carbon_thunk.type.88c6c2.1 = struct_value () [concrete] // CHECK:STDOUT: %pattern_type.157: type = pattern_type %u64 [concrete] -// CHECK:STDOUT: %ImplicitAs.impl_witness.905: = impl_witness imports.%ImplicitAs.impl_witness_table.182 [concrete] -// CHECK:STDOUT: %ImplicitAs.facet.fb4: %ImplicitAs.type.584 = facet_value %Cpp.unsigned_long_long, (%ImplicitAs.impl_witness.905) [concrete] -// CHECK:STDOUT: %ImplicitAs.WithSelf.Convert.type.f8a: type = fn_type @ImplicitAs.WithSelf.Convert, @ImplicitAs.WithSelf(%u64, %ImplicitAs.facet.fb4) [concrete] -// CHECK:STDOUT: %.c93: type = fn_type_with_self_type %ImplicitAs.WithSelf.Convert.type.f8a, %ImplicitAs.facet.fb4 [concrete] -// CHECK:STDOUT: %Cpp.unsigned_long_long.as.ImplicitAs.impl.Convert.type.03b: type = fn_type @Cpp.unsigned_long_long.as.ImplicitAs.impl.Convert.1 [concrete] -// CHECK:STDOUT: %Cpp.unsigned_long_long.as.ImplicitAs.impl.Convert.d3c: %Cpp.unsigned_long_long.as.ImplicitAs.impl.Convert.type.03b = struct_value () [concrete] +// CHECK:STDOUT: %To.fe9: Core.IntLiteral = symbolic_binding To, 0 [symbolic] +// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.6a6: type = fn_type @Core.IntLiteral.as.ImplicitAs.impl.Convert.2, @Core.IntLiteral.as.ImplicitAs.impl.c85(%To.fe9) [symbolic] +// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.46e: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.6a6 = struct_value () [symbolic] +// CHECK:STDOUT: %ImplicitAs.impl_witness.bb3: = impl_witness imports.%ImplicitAs.impl_witness_table.899, @Core.IntLiteral.as.ImplicitAs.impl.c85(%int_64) [concrete] +// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.fb8: type = fn_type @Core.IntLiteral.as.ImplicitAs.impl.Convert.2, @Core.IntLiteral.as.ImplicitAs.impl.c85(%int_64) [concrete] +// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.042: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.fb8 = struct_value () [concrete] +// CHECK:STDOUT: %ImplicitAs.facet.dfe: %ImplicitAs.type.584 = facet_value Core.IntLiteral, (%ImplicitAs.impl_witness.bb3) [concrete] +// CHECK:STDOUT: %ImplicitAs.WithSelf.Convert.type.408: type = fn_type @ImplicitAs.WithSelf.Convert, @ImplicitAs.WithSelf(%u64, %ImplicitAs.facet.dfe) [concrete] +// CHECK:STDOUT: %.f17: type = fn_type_with_self_type %ImplicitAs.WithSelf.Convert.type.408, %ImplicitAs.facet.dfe [concrete] +// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.bound.141: = bound_method %int_1.5b8, %Core.IntLiteral.as.ImplicitAs.impl.Convert.042 [concrete] +// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn: = specific_function %Core.IntLiteral.as.ImplicitAs.impl.Convert.042, @Core.IntLiteral.as.ImplicitAs.impl.Convert.2(%int_64) [concrete] +// CHECK:STDOUT: %bound_method.fec: = bound_method %int_1.5b8, %Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn [concrete] +// CHECK:STDOUT: %int_1.f23: %u64 = int_value 1 [concrete] // CHECK:STDOUT: %ULongResult: type = class_type @ULongResult [concrete] // CHECK:STDOUT: %pattern_type.6f2: type = pattern_type %ULongResult [concrete] // CHECK:STDOUT: %ptr.f5e: type = ptr_type %ULongResult [concrete] @@ -3681,9 +3713,9 @@ fn CopyUnsignedLongLong() { // CHECK:STDOUT: %ImplicitAs.facet.29a: %ImplicitAs.type.139 = facet_value %Cpp.unsigned_long_long, (%ImplicitAs.impl_witness.7c3) [concrete] // CHECK:STDOUT: %ImplicitAs.WithSelf.Convert.type.314: type = fn_type @ImplicitAs.WithSelf.Convert, @ImplicitAs.WithSelf(Core.IntLiteral, %ImplicitAs.facet.29a) [concrete] // CHECK:STDOUT: %.66f: type = fn_type_with_self_type %ImplicitAs.WithSelf.Convert.type.314, %ImplicitAs.facet.29a [concrete] -// CHECK:STDOUT: %Cpp.unsigned_long_long.as.ImplicitAs.impl.Convert.type.109: type = fn_type @Cpp.unsigned_long_long.as.ImplicitAs.impl.Convert.2 [concrete] -// CHECK:STDOUT: %Cpp.unsigned_long_long.as.ImplicitAs.impl.Convert.ffb: %Cpp.unsigned_long_long.as.ImplicitAs.impl.Convert.type.109 = struct_value () [concrete] -// CHECK:STDOUT: %Cpp.unsigned_long_long.as.ImplicitAs.impl.Convert.bound: = bound_method %int_1.79a, %Cpp.unsigned_long_long.as.ImplicitAs.impl.Convert.ffb [concrete] +// CHECK:STDOUT: %Cpp.unsigned_long_long.as.ImplicitAs.impl.Convert.type: type = fn_type @Cpp.unsigned_long_long.as.ImplicitAs.impl.Convert [concrete] +// CHECK:STDOUT: %Cpp.unsigned_long_long.as.ImplicitAs.impl.Convert: %Cpp.unsigned_long_long.as.ImplicitAs.impl.Convert.type = struct_value () [concrete] +// CHECK:STDOUT: %Cpp.unsigned_long_long.as.ImplicitAs.impl.Convert.bound: = bound_method %int_1.79a, %Cpp.unsigned_long_long.as.ImplicitAs.impl.Convert [concrete] // CHECK:STDOUT: %array_type: type = array_type %int_1.5b8, %f32.97e [concrete] // CHECK:STDOUT: %pattern_type.b36: type = pattern_type %array_type [concrete] // CHECK:STDOUT: %float.674: Core.FloatLiteral = float_literal_value 10e-1 [concrete] @@ -3701,7 +3733,7 @@ fn CopyUnsignedLongLong() { // CHECK:STDOUT: %.98d: type = fn_type_with_self_type %ImplicitAs.WithSelf.Convert.type.e4d, %ImplicitAs.facet.945 [concrete] // CHECK:STDOUT: %Core.FloatLiteral.as.ImplicitAs.impl.Convert.bound: = bound_method %float.674, %Core.FloatLiteral.as.ImplicitAs.impl.Convert.e55 [concrete] // CHECK:STDOUT: %Core.FloatLiteral.as.ImplicitAs.impl.Convert.specific_fn: = specific_function %Core.FloatLiteral.as.ImplicitAs.impl.Convert.e55, @Core.FloatLiteral.as.ImplicitAs.impl.Convert(%int_32) [concrete] -// CHECK:STDOUT: %bound_method: = bound_method %float.674, %Core.FloatLiteral.as.ImplicitAs.impl.Convert.specific_fn [concrete] +// CHECK:STDOUT: %bound_method.1e4: = bound_method %float.674, %Core.FloatLiteral.as.ImplicitAs.impl.Convert.specific_fn [concrete] // CHECK:STDOUT: %float.e3b: %f32.97e = float_value 1 [concrete] // CHECK:STDOUT: %array: %array_type = tuple_value (%float.e3b) [concrete] // CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete] @@ -3749,8 +3781,8 @@ fn CopyUnsignedLongLong() { // CHECK:STDOUT: // CHECK:STDOUT: } // CHECK:STDOUT: %Core.UInt: %UInt.type = import_ref Core//prelude/types/uint, UInt, loaded [concrete = constants.%UInt.generic] -// CHECK:STDOUT: %Core.import_ref.506: %Cpp.unsigned_long_long.as.ImplicitAs.impl.Convert.type.03b = import_ref Core//prelude/types/cpp/int, loc{{\d+_\d+}}, loaded [concrete = constants.%Cpp.unsigned_long_long.as.ImplicitAs.impl.Convert.d3c] -// CHECK:STDOUT: %ImplicitAs.impl_witness_table.182 = impl_witness_table (%Core.import_ref.506), @Cpp.unsigned_long_long.as.ImplicitAs.impl.7c6 [concrete] +// CHECK:STDOUT: %Core.import_ref.741: @Core.IntLiteral.as.ImplicitAs.impl.c85.%Core.IntLiteral.as.ImplicitAs.impl.Convert.type (%Core.IntLiteral.as.ImplicitAs.impl.Convert.type.6a6) = import_ref Core//prelude/types/uint, loc{{\d+_\d+}}, loaded [symbolic = @Core.IntLiteral.as.ImplicitAs.impl.c85.%Core.IntLiteral.as.ImplicitAs.impl.Convert (constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.46e)] +// CHECK:STDOUT: %ImplicitAs.impl_witness_table.899 = impl_witness_table (%Core.import_ref.741), @Core.IntLiteral.as.ImplicitAs.impl.c85 [concrete] // CHECK:STDOUT: %ULongResult.decl: type = class_decl @ULongResult [concrete = constants.%ULongResult] {} {} // CHECK:STDOUT: %PassULongLong__carbon_thunk.decl.f0c073.2: %PassULongLong__carbon_thunk.type.88c6c2.2 = fn_decl @PassULongLong__carbon_thunk.2 [concrete = constants.%PassULongLong__carbon_thunk.887181.2] { // CHECK:STDOUT: @@ -3761,7 +3793,7 @@ fn CopyUnsignedLongLong() { // CHECK:STDOUT: %Core.As: %As.type.90f = import_ref Core//prelude/operators/as, As, loaded [concrete = constants.%As.generic] // CHECK:STDOUT: %Core.import_ref.7e9: %Core.IntLiteral.as.As.impl.Convert.type = import_ref Core//prelude/types/cpp/int, loc{{\d+_\d+}}, loaded [concrete = constants.%Core.IntLiteral.as.As.impl.Convert] // CHECK:STDOUT: %As.impl_witness_table.002 = impl_witness_table (%Core.import_ref.7e9), @Core.IntLiteral.as.As.impl.b6f [concrete] -// CHECK:STDOUT: %Core.import_ref.5ac: %Cpp.unsigned_long_long.as.ImplicitAs.impl.Convert.type.109 = import_ref Core//prelude/types/cpp/int, loc{{\d+_\d+}}, loaded [concrete = constants.%Cpp.unsigned_long_long.as.ImplicitAs.impl.Convert.ffb] +// CHECK:STDOUT: %Core.import_ref.5ac: %Cpp.unsigned_long_long.as.ImplicitAs.impl.Convert.type = import_ref Core//prelude/types/cpp/int, loc{{\d+_\d+}}, loaded [concrete = constants.%Cpp.unsigned_long_long.as.ImplicitAs.impl.Convert] // CHECK:STDOUT: %ImplicitAs.impl_witness_table.d12 = impl_witness_table (%Core.import_ref.5ac), @Cpp.unsigned_long_long.as.ImplicitAs.impl.fca [concrete] // CHECK:STDOUT: %Core.import_ref.38a: @Core.FloatLiteral.as.ImplicitAs.impl.%Core.FloatLiteral.as.ImplicitAs.impl.Convert.type (%Core.FloatLiteral.as.ImplicitAs.impl.Convert.type.02f) = import_ref Core//prelude/types/float, loc{{\d+_\d+}}, loaded [symbolic = @Core.FloatLiteral.as.ImplicitAs.impl.%Core.FloatLiteral.as.ImplicitAs.impl.Convert (constants.%Core.FloatLiteral.as.ImplicitAs.impl.Convert.1f0)] // CHECK:STDOUT: %ImplicitAs.impl_witness_table.31a = impl_witness_table (%Core.import_ref.38a), @Core.FloatLiteral.as.ImplicitAs.impl [concrete] @@ -3779,9 +3811,9 @@ fn CopyUnsignedLongLong() { // CHECK:STDOUT: %unsigned_long_long.ref.loc15: type = name_ref unsigned_long_long, constants.%Cpp.unsigned_long_long [concrete = constants.%Cpp.unsigned_long_long] // CHECK:STDOUT: } // CHECK:STDOUT: %impl.elem0.loc15: %.30f = impl_witness_access constants.%ImplicitAs.impl_witness.4384, element0 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.f87] -// CHECK:STDOUT: %bound_method.loc15: = bound_method %int_1.loc15, %impl.elem0.loc15 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.bound] -// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %Cpp.unsigned_long_long = call %bound_method.loc15(%int_1.loc15) [concrete = constants.%int_1.79a] -// CHECK:STDOUT: %.loc15_56.1: %Cpp.unsigned_long_long = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_1.79a] +// CHECK:STDOUT: %bound_method.loc15: = bound_method %int_1.loc15, %impl.elem0.loc15 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.bound.4b8] +// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call.loc15: init %Cpp.unsigned_long_long = call %bound_method.loc15(%int_1.loc15) [concrete = constants.%int_1.79a] +// CHECK:STDOUT: %.loc15_56.1: %Cpp.unsigned_long_long = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call.loc15 [concrete = constants.%int_1.79a] // CHECK:STDOUT: %.loc15_56.2: %Cpp.unsigned_long_long = converted %int_1.loc15, %.loc15_56.1 [concrete = constants.%int_1.79a] // CHECK:STDOUT: %cpp_unsigned_long_long: %Cpp.unsigned_long_long = value_binding cpp_unsigned_long_long, %.loc15_56.2 // CHECK:STDOUT: name_binding_decl { @@ -3831,13 +3863,15 @@ fn CopyUnsignedLongLong() { // CHECK:STDOUT: name_binding_decl { // CHECK:STDOUT: %carbon_u64.patt: %pattern_type.157 = value_binding_pattern carbon_u64 [concrete] // CHECK:STDOUT: } -// CHECK:STDOUT: %cpp_unsigned_long_long.ref.loc21: %Cpp.unsigned_long_long = name_ref cpp_unsigned_long_long, %cpp_unsigned_long_long +// CHECK:STDOUT: %int_1.loc21: Core.IntLiteral = int_value 1 [concrete = constants.%int_1.5b8] // CHECK:STDOUT: %u64: type = type_literal constants.%u64 [concrete = constants.%u64] -// CHECK:STDOUT: %impl.elem0.loc21: %.c93 = impl_witness_access constants.%ImplicitAs.impl_witness.905, element0 [concrete = constants.%Cpp.unsigned_long_long.as.ImplicitAs.impl.Convert.d3c] -// CHECK:STDOUT: %bound_method.loc21: = bound_method %cpp_unsigned_long_long.ref.loc21, %impl.elem0.loc21 -// CHECK:STDOUT: %Cpp.unsigned_long_long.as.ImplicitAs.impl.Convert.call.loc21: init %u64 = call %bound_method.loc21(%cpp_unsigned_long_long.ref.loc21) -// CHECK:STDOUT: %.loc21_25.1: %u64 = value_of_initializer %Cpp.unsigned_long_long.as.ImplicitAs.impl.Convert.call.loc21 -// CHECK:STDOUT: %.loc21_25.2: %u64 = converted %cpp_unsigned_long_long.ref.loc21, %.loc21_25.1 +// CHECK:STDOUT: %impl.elem0.loc21: %.f17 = impl_witness_access constants.%ImplicitAs.impl_witness.bb3, element0 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.042] +// CHECK:STDOUT: %bound_method.loc21_25.1: = bound_method %int_1.loc21, %impl.elem0.loc21 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.bound.141] +// CHECK:STDOUT: %specific_fn.loc21: = specific_function %impl.elem0.loc21, @Core.IntLiteral.as.ImplicitAs.impl.Convert.2(constants.%int_64) [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn] +// CHECK:STDOUT: %bound_method.loc21_25.2: = bound_method %int_1.loc21, %specific_fn.loc21 [concrete = constants.%bound_method.fec] +// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call.loc21: init %u64 = call %bound_method.loc21_25.2(%int_1.loc21) [concrete = constants.%int_1.f23] +// CHECK:STDOUT: %.loc21_25.1: %u64 = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call.loc21 [concrete = constants.%int_1.f23] +// CHECK:STDOUT: %.loc21_25.2: %u64 = converted %int_1.loc21, %.loc21_25.1 [concrete = constants.%int_1.f23] // CHECK:STDOUT: %carbon_u64: %u64 = value_binding carbon_u64, %.loc21_25.2 // CHECK:STDOUT: name_binding_decl { // CHECK:STDOUT: %carbon_u64_result.patt: %pattern_type.6f2 = value_binding_pattern carbon_u64_result [concrete] @@ -3865,8 +3899,8 @@ fn CopyUnsignedLongLong() { // CHECK:STDOUT: %.loc24_64.1: %tuple.type = tuple_literal (%float) [concrete = constants.%tuple] // CHECK:STDOUT: %impl.elem0.loc24_64: %.98d = impl_witness_access constants.%ImplicitAs.impl_witness.bc6, element0 [concrete = constants.%Core.FloatLiteral.as.ImplicitAs.impl.Convert.e55] // CHECK:STDOUT: %bound_method.loc24_64.1: = bound_method %float, %impl.elem0.loc24_64 [concrete = constants.%Core.FloatLiteral.as.ImplicitAs.impl.Convert.bound] -// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0.loc24_64, @Core.FloatLiteral.as.ImplicitAs.impl.Convert(constants.%int_32) [concrete = constants.%Core.FloatLiteral.as.ImplicitAs.impl.Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc24_64.2: = bound_method %float, %specific_fn [concrete = constants.%bound_method] +// CHECK:STDOUT: %specific_fn.loc24: = specific_function %impl.elem0.loc24_64, @Core.FloatLiteral.as.ImplicitAs.impl.Convert(constants.%int_32) [concrete = constants.%Core.FloatLiteral.as.ImplicitAs.impl.Convert.specific_fn] +// CHECK:STDOUT: %bound_method.loc24_64.2: = bound_method %float, %specific_fn.loc24 [concrete = constants.%bound_method.1e4] // CHECK:STDOUT: %Core.FloatLiteral.as.ImplicitAs.impl.Convert.call: init %f32.97e = call %bound_method.loc24_64.2(%float) [concrete = constants.%float.e3b] // CHECK:STDOUT: %.loc24_64.2: init %f32.97e = converted %float, %Core.FloatLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%float.e3b] // CHECK:STDOUT: %int_0: Core.IntLiteral = int_value 0 [concrete = constants.%int_0] @@ -3885,10 +3919,10 @@ fn CopyUnsignedLongLong() { // CHECK:STDOUT: %Core.IntLiteral.as.As.impl.Convert.call: init %Cpp.unsigned_long_long = call %bound_method.loc24_30.1(%int_1.loc24) [concrete = constants.%int_1.79a] // CHECK:STDOUT: %.loc24_30.1: %Cpp.unsigned_long_long = value_of_initializer %Core.IntLiteral.as.As.impl.Convert.call [concrete = constants.%int_1.79a] // CHECK:STDOUT: %.loc24_30.2: %Cpp.unsigned_long_long = converted %int_1.loc24, %.loc24_30.1 [concrete = constants.%int_1.79a] -// CHECK:STDOUT: %impl.elem0.loc24_30.2: %.66f = impl_witness_access constants.%ImplicitAs.impl_witness.7c3, element0 [concrete = constants.%Cpp.unsigned_long_long.as.ImplicitAs.impl.Convert.ffb] +// CHECK:STDOUT: %impl.elem0.loc24_30.2: %.66f = impl_witness_access constants.%ImplicitAs.impl_witness.7c3, element0 [concrete = constants.%Cpp.unsigned_long_long.as.ImplicitAs.impl.Convert] // CHECK:STDOUT: %bound_method.loc24_30.2: = bound_method %.loc24_30.2, %impl.elem0.loc24_30.2 [concrete = constants.%Cpp.unsigned_long_long.as.ImplicitAs.impl.Convert.bound] -// CHECK:STDOUT: %Cpp.unsigned_long_long.as.ImplicitAs.impl.Convert.call.loc24: init Core.IntLiteral = call %bound_method.loc24_30.2(%.loc24_30.2) [concrete = constants.%int_1.5b8] -// CHECK:STDOUT: %.loc24_30.3: Core.IntLiteral = value_of_initializer %Cpp.unsigned_long_long.as.ImplicitAs.impl.Convert.call.loc24 [concrete = constants.%int_1.5b8] +// CHECK:STDOUT: %Cpp.unsigned_long_long.as.ImplicitAs.impl.Convert.call: init Core.IntLiteral = call %bound_method.loc24_30.2(%.loc24_30.2) [concrete = constants.%int_1.5b8] +// CHECK:STDOUT: %.loc24_30.3: Core.IntLiteral = value_of_initializer %Cpp.unsigned_long_long.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_1.5b8] // CHECK:STDOUT: %.loc24_30.4: Core.IntLiteral = converted %.loc24_30.2, %.loc24_30.3 [concrete = constants.%int_1.5b8] // CHECK:STDOUT: %array_type: type = array_type %.loc24_30.4, %f32 [concrete = constants.%array_type] // CHECK:STDOUT: } diff --git a/toolchain/check/testdata/interop/cpp/function/arithmetic_types_bridged.carbon b/toolchain/check/testdata/interop/cpp/function/arithmetic_types_bridged.carbon index c47784f0d550..cd841cab5709 100644 --- a/toolchain/check/testdata/interop/cpp/function/arithmetic_types_bridged.carbon +++ b/toolchain/check/testdata/interop/cpp/function/arithmetic_types_bridged.carbon @@ -786,8 +786,8 @@ fn F() { // CHECK:STDOUT: %foo__carbon_thunk.type: type = fn_type @foo__carbon_thunk [concrete] // CHECK:STDOUT: %foo__carbon_thunk: %foo__carbon_thunk.type = struct_value () [concrete] // CHECK:STDOUT: %ImplicitAs.type.8ae: type = facet_type <@ImplicitAs, @ImplicitAs(%u8)> [concrete] -// CHECK:STDOUT: %To: Core.IntLiteral = symbolic_binding To, 0 [symbolic] -// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.6a6: type = fn_type @Core.IntLiteral.as.ImplicitAs.impl.Convert, @Core.IntLiteral.as.ImplicitAs.impl(%To) [symbolic] +// CHECK:STDOUT: %To.fe9: Core.IntLiteral = symbolic_binding To, 0 [symbolic] +// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.6a6: type = fn_type @Core.IntLiteral.as.ImplicitAs.impl.Convert, @Core.IntLiteral.as.ImplicitAs.impl(%To.fe9) [symbolic] // CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.46e: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.6a6 = struct_value () [symbolic] // CHECK:STDOUT: %Copy.type: type = facet_type <@Copy> [concrete] // CHECK:STDOUT: %ImplicitAs.impl_witness.7d6: = impl_witness imports.%ImplicitAs.impl_witness_table.899, @Core.IntLiteral.as.ImplicitAs.impl(%int_8) [concrete] diff --git a/toolchain/check/testdata/interop/cpp/macros.carbon b/toolchain/check/testdata/interop/cpp/macros.carbon index 148944719ec7..505cbce131a7 100644 --- a/toolchain/check/testdata/interop/cpp/macros.carbon +++ b/toolchain/check/testdata/interop/cpp/macros.carbon @@ -1067,8 +1067,8 @@ fn F() { // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] // CHECK:STDOUT: %int_1.5d2: %i32 = int_value 1 [concrete] // CHECK:STDOUT: %ImplicitAs.type.139: type = facet_type <@ImplicitAs, @ImplicitAs(Core.IntLiteral)> [concrete] -// CHECK:STDOUT: %From: Core.IntLiteral = symbolic_binding From, 0 [symbolic] -// CHECK:STDOUT: %Int.as.ImplicitAs.impl.Convert.type.2ed: type = fn_type @Int.as.ImplicitAs.impl.Convert, @Int.as.ImplicitAs.impl(%From) [symbolic] +// CHECK:STDOUT: %From.fe9: Core.IntLiteral = symbolic_binding From, 0 [symbolic] +// CHECK:STDOUT: %Int.as.ImplicitAs.impl.Convert.type.2ed: type = fn_type @Int.as.ImplicitAs.impl.Convert, @Int.as.ImplicitAs.impl(%From.fe9) [symbolic] // CHECK:STDOUT: %Int.as.ImplicitAs.impl.Convert.d29: %Int.as.ImplicitAs.impl.Convert.type.2ed = struct_value () [symbolic] // CHECK:STDOUT: %ImplicitAs.impl_witness.640: = impl_witness imports.%ImplicitAs.impl_witness_table.ea2, @Int.as.ImplicitAs.impl(%int_32) [concrete] // CHECK:STDOUT: %Int.as.ImplicitAs.impl.Convert.type.240: type = fn_type @Int.as.ImplicitAs.impl.Convert, @Int.as.ImplicitAs.impl(%int_32) [concrete] diff --git a/toolchain/check/testdata/primitives/int_conversions.carbon b/toolchain/check/testdata/primitives/int_conversions.carbon new file mode 100644 index 000000000000..14ebd072c7a2 --- /dev/null +++ b/toolchain/check/testdata/primitives/int_conversions.carbon @@ -0,0 +1,264 @@ +// Part of the Carbon Language project, under the Apache License v2.0 with LLVM +// Exceptions. See /LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// INCLUDE-FILE: toolchain/testing/testdata/min_prelude/full.carbon +// +// AUTOUPDATE +// TIP: To test this file alone, run: +// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/primitives/int_conversions.carbon +// TIP: To dump output, run: +// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/primitives/int_conversions.carbon + +// --- valid.carbon + +library "[[@TEST_NAME]]"; + +fn TestFits() { + var a: i32 = 1; + var unused b: i64 = a; + + var w: u32 = 1; + var unused x: u64 = w; +} + +// --- fail_narrow.carbon + +library "[[@TEST_NAME]]"; + +fn TestFailures() { + var a: i64 = 1; + // CHECK:STDERR: fail_narrow.carbon:[[@LINE+7]]:3: error: cannot implicitly convert expression of type `i64` to `i32` [ConversionFailure] + // CHECK:STDERR: var unused b: i32 = a; + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_narrow.carbon:[[@LINE+4]]:3: note: type `i64` does not implement interface `Core.ImplicitAs(i32)` [MissingImplInMemberAccessInContext] + // CHECK:STDERR: var unused b: i32 = a; + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + var unused b: i32 = a; + + var w: u64 = 1; + // CHECK:STDERR: fail_narrow.carbon:[[@LINE+7]]:3: error: cannot implicitly convert expression of type `u64` to `u32` [ConversionFailure] + // CHECK:STDERR: var unused x: u32 = w; + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_narrow.carbon:[[@LINE+4]]:3: note: type `u64` does not implement interface `Core.ImplicitAs(u32)` [MissingImplInMemberAccessInContext] + // CHECK:STDERR: var unused x: u32 = w; + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + var unused x: u32 = w; +} + +// --- cpp_compat.carbon + +library "[[@TEST_NAME]]"; + +fn TestCppCompat() { + var c: i32 = 1; + var unused d: Core.CppCompat.Long32 = c; +} + +// --- fail_todo_cpp_compat_widen.carbon + +library "[[@TEST_NAME]]"; + +fn TestCppCompat() { + var a: Core.CppCompat.Long32 = 1; + // CHECK:STDERR: fail_todo_cpp_compat_widen.carbon:[[@LINE+11]]:17: error: bit width of integer type literal must be a multiple of 8; use `Core.Int(33)` instead [IntWidthNotMultipleOf8] + // CHECK:STDERR: var unused b: i33 = a; + // CHECK:STDERR: ^~~ + // CHECK:STDERR: + // CHECK:STDERR: fail_todo_cpp_compat_widen.carbon:[[@LINE+7]]:3: error: cannot implicitly convert expression of type `Core.CppCompat.Long32` to `i33` [ConversionFailure] + // CHECK:STDERR: var unused b: i33 = a; + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_todo_cpp_compat_widen.carbon:[[@LINE+4]]:3: note: type `Core.CppCompat.Long32` does not implement interface `Core.ImplicitAs(i33)` [MissingImplInMemberAccessInContext] + // CHECK:STDERR: var unused b: i33 = a; + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + var unused b: i33 = a; + + var c: Core.CppCompat.LongLong64 = 1; + // CHECK:STDERR: fail_todo_cpp_compat_widen.carbon:[[@LINE+11]]:17: error: bit width of integer type literal must be a multiple of 8; use `Core.Int(65)` instead [IntWidthNotMultipleOf8] + // CHECK:STDERR: var unused d: i65 = c; + // CHECK:STDERR: ^~~ + // CHECK:STDERR: + // CHECK:STDERR: fail_todo_cpp_compat_widen.carbon:[[@LINE+7]]:3: error: cannot implicitly convert expression of type `Core.CppCompat.LongLong64` to `i65` [ConversionFailure] + // CHECK:STDERR: var unused d: i65 = c; + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_todo_cpp_compat_widen.carbon:[[@LINE+4]]:3: note: type `Core.CppCompat.LongLong64` does not implement interface `Core.ImplicitAs(i65)` [MissingImplInMemberAccessInContext] + // CHECK:STDERR: var unused d: i65 = c; + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + var unused d: i65 = c; + + var e: Core.CppCompat.ULong32 = 1; + // CHECK:STDERR: fail_todo_cpp_compat_widen.carbon:[[@LINE+11]]:17: error: bit width of integer type literal must be a multiple of 8; use `Core.UInt(33)` instead [IntWidthNotMultipleOf8] + // CHECK:STDERR: var unused f: u33 = e; + // CHECK:STDERR: ^~~ + // CHECK:STDERR: + // CHECK:STDERR: fail_todo_cpp_compat_widen.carbon:[[@LINE+7]]:3: error: cannot implicitly convert expression of type `Core.CppCompat.ULong32` to `u33` [ConversionFailure] + // CHECK:STDERR: var unused f: u33 = e; + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_todo_cpp_compat_widen.carbon:[[@LINE+4]]:3: note: type `Core.CppCompat.ULong32` does not implement interface `Core.ImplicitAs(u33)` [MissingImplInMemberAccessInContext] + // CHECK:STDERR: var unused f: u33 = e; + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + var unused f: u33 = e; + + var g: Core.CppCompat.ULongLong64 = 1; + // CHECK:STDERR: fail_todo_cpp_compat_widen.carbon:[[@LINE+11]]:17: error: bit width of integer type literal must be a multiple of 8; use `Core.UInt(65)` instead [IntWidthNotMultipleOf8] + // CHECK:STDERR: var unused h: u65 = g; + // CHECK:STDERR: ^~~ + // CHECK:STDERR: + // CHECK:STDERR: fail_todo_cpp_compat_widen.carbon:[[@LINE+7]]:3: error: cannot implicitly convert expression of type `Core.CppCompat.ULongLong64` to `u65` [ConversionFailure] + // CHECK:STDERR: var unused h: u65 = g; + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_todo_cpp_compat_widen.carbon:[[@LINE+4]]:3: note: type `Core.CppCompat.ULongLong64` does not implement interface `Core.ImplicitAs(u65)` [MissingImplInMemberAccessInContext] + // CHECK:STDERR: var unused h: u65 = g; + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + var unused h: u65 = g; +} + +// --- fail_cpp_compat_narrow.carbon + +library "[[@TEST_NAME]]"; + +fn TestCppCompat() { + // Long32 is slightly wider than i32. + var a: Core.CppCompat.Long32 = 1; + // CHECK:STDERR: fail_cpp_compat_narrow.carbon:[[@LINE+7]]:3: error: cannot implicitly convert expression of type `Core.CppCompat.Long32` to `i32` [ConversionFailure] + // CHECK:STDERR: var unused b: i32 = a; + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_cpp_compat_narrow.carbon:[[@LINE+4]]:3: note: type `Core.CppCompat.Long32` does not implement interface `Core.ImplicitAs(i32)` [MissingImplInMemberAccessInContext] + // CHECK:STDERR: var unused b: i32 = a; + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + var unused b: i32 = a; + + // LongLong64 is slightly wider than i64. + var c: Core.CppCompat.LongLong64 = 1; + // CHECK:STDERR: fail_cpp_compat_narrow.carbon:[[@LINE+7]]:3: error: cannot implicitly convert expression of type `Core.CppCompat.LongLong64` to `i64` [ConversionFailure] + // CHECK:STDERR: var unused d: i64 = c; + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_cpp_compat_narrow.carbon:[[@LINE+4]]:3: note: type `Core.CppCompat.LongLong64` does not implement interface `Core.ImplicitAs(i64)` [MissingImplInMemberAccessInContext] + // CHECK:STDERR: var unused d: i64 = c; + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + var unused d: i64 = c; + + // ULong32 is slightly wider than u32. + var e: Core.CppCompat.ULong32 = 1; + // CHECK:STDERR: fail_cpp_compat_narrow.carbon:[[@LINE+7]]:3: error: cannot implicitly convert expression of type `Core.CppCompat.ULong32` to `u32` [ConversionFailure] + // CHECK:STDERR: var unused f: u32 = e; + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_cpp_compat_narrow.carbon:[[@LINE+4]]:3: note: type `Core.CppCompat.ULong32` does not implement interface `Core.ImplicitAs(u32)` [MissingImplInMemberAccessInContext] + // CHECK:STDERR: var unused f: u32 = e; + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + var unused f: u32 = e; + + // ULongLong64 is slightly wider than u64. + var g: Core.CppCompat.ULongLong64 = 1; + // CHECK:STDERR: fail_cpp_compat_narrow.carbon:[[@LINE+7]]:3: error: cannot implicitly convert expression of type `Core.CppCompat.ULongLong64` to `u64` [ConversionFailure] + // CHECK:STDERR: var unused h: u64 = g; + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_cpp_compat_narrow.carbon:[[@LINE+4]]:3: note: type `Core.CppCompat.ULongLong64` does not implement interface `Core.ImplicitAs(u64)` [MissingImplInMemberAccessInContext] + // CHECK:STDERR: var unused h: u64 = g; + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + var unused h: u64 = g; +} + +// --- widen_sign_change.carbon + +library "[[@TEST_NAME]]"; + +fn TestWidenSign() { + var e: u32 = 1; + var unused f: i64 = e; +} + +// --- fail_narrow_sign_change.carbon + +library "[[@TEST_NAME]]"; + +fn TestMixedSign() { + var a: i32 = 1; + // CHECK:STDERR: fail_narrow_sign_change.carbon:[[@LINE+7]]:3: error: cannot implicitly convert expression of type `i32` to `u32` [ConversionFailure] + // CHECK:STDERR: var unused b: u32 = a; + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_narrow_sign_change.carbon:[[@LINE+4]]:3: note: type `i32` does not implement interface `Core.ImplicitAs(u32)` [MissingImplInMemberAccessInContext] + // CHECK:STDERR: var unused b: u32 = a; + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + var unused b: u32 = a; + + var c: u32 = 1; + // CHECK:STDERR: fail_narrow_sign_change.carbon:[[@LINE+7]]:3: error: cannot implicitly convert expression of type `u32` to `i32` [ConversionFailure] + // CHECK:STDERR: var unused d: i32 = c; + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_narrow_sign_change.carbon:[[@LINE+4]]:3: note: type `u32` does not implement interface `Core.ImplicitAs(i32)` [MissingImplInMemberAccessInContext] + // CHECK:STDERR: var unused d: i32 = c; + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + var unused d: i32 = c; + + var g: i32 = 1; + // CHECK:STDERR: fail_narrow_sign_change.carbon:[[@LINE+7]]:3: error: cannot implicitly convert expression of type `i32` to `u64` [ConversionFailure] + // CHECK:STDERR: var unused h: u64 = g; + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_narrow_sign_change.carbon:[[@LINE+4]]:3: note: type `i32` does not implement interface `Core.ImplicitAs(u64)` [MissingImplInMemberAccessInContext] + // CHECK:STDERR: var unused h: u64 = g; + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + var unused h: u64 = g; +} + +// --- arbitrary_width.carbon + +library "[[@TEST_NAME]]"; + +fn TestArbitraryWidth() { + var a: Core.Int(33) = 1; + var unused c: Core.Int(34) = a; + + var d: Core.UInt(33) = 1; + var unused f: Core.UInt(34) = d; + + var unused h: Core.Int(34) = d; +} + +// --- fail_narrow_arbitrary_width.carbon + +library "[[@TEST_NAME]]"; + +fn TestArbitraryWidth() { + var a: Core.Int(33) = 1; + // CHECK:STDERR: fail_narrow_arbitrary_width.carbon:[[@LINE+7]]:3: error: cannot implicitly convert expression of type `i33` to `i32` [ConversionFailure] + // CHECK:STDERR: var unused b: Core.Int(32) = a; + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_narrow_arbitrary_width.carbon:[[@LINE+4]]:3: note: type `i33` does not implement interface `Core.ImplicitAs(i32)` [MissingImplInMemberAccessInContext] + // CHECK:STDERR: var unused b: Core.Int(32) = a; + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + var unused b: Core.Int(32) = a; + + var d: Core.UInt(33) = 1; + // CHECK:STDERR: fail_narrow_arbitrary_width.carbon:[[@LINE+7]]:3: error: cannot implicitly convert expression of type `u33` to `u32` [ConversionFailure] + // CHECK:STDERR: var unused e: Core.UInt(32) = d; + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_narrow_arbitrary_width.carbon:[[@LINE+4]]:3: note: type `u33` does not implement interface `Core.ImplicitAs(u32)` [MissingImplInMemberAccessInContext] + // CHECK:STDERR: var unused e: Core.UInt(32) = d; + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + var unused e: Core.UInt(32) = d; + + // CHECK:STDERR: fail_narrow_arbitrary_width.carbon:[[@LINE+7]]:3: error: cannot implicitly convert expression of type `i33` to `u34` [ConversionFailure] + // CHECK:STDERR: var unused g: Core.UInt(34) = a; + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_narrow_arbitrary_width.carbon:[[@LINE+4]]:3: note: type `i33` does not implement interface `Core.ImplicitAs(u34)` [MissingImplInMemberAccessInContext] + // CHECK:STDERR: var unused g: Core.UInt(34) = a; + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: + var unused g: Core.UInt(34) = a; +} diff --git a/toolchain/driver/testdata/compile/optimize/optimize_debug.carbon b/toolchain/driver/testdata/compile/optimize/optimize_debug.carbon index 4d8f69ce9026..f2b2a32df967 100644 --- a/toolchain/driver/testdata/compile/optimize/optimize_debug.carbon +++ b/toolchain/driver/testdata/compile/optimize/optimize_debug.carbon @@ -113,16 +113,16 @@ fn VectorizedWithOptSpeed(a: array(i32, 65536)*) { // CHECK:STDOUT: !21 = !DILocalVariable(arg: 1, scope: !16, type: !19) // CHECK:STDOUT: !22 = !DILocation(line: 18, column: 9, scope: !16) // CHECK:STDOUT: !23 = !DILocation(line: 19, column: 5, scope: !16) -// CHECK:STDOUT: !24 = !DILocation(line: 277, column: 3, scope: !25, inlinedAt: !32) -// CHECK:STDOUT: !25 = distinct !DISubprogram(name: "Op", linkageName: "_COp:thunk.Int.9452f4c51951679b.Core:AddAssignWith.5375cfcbca6d9e35.Core.75bec4d236c9daa5", scope: null, file: !26, line: 277, type: !27, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !29) +// CHECK:STDOUT: !24 = !DILocation(line: 296, column: 3, scope: !25, inlinedAt: !32) +// CHECK:STDOUT: !25 = distinct !DISubprogram(name: "Op", linkageName: "_COp:thunk.Int.9452f4c51951679b.Core:AddAssignWith.5375cfcbca6d9e35.Core.57ee91777b6354a8", scope: null, file: !26, line: 296, type: !27, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !29) // CHECK:STDOUT: !26 = !DIFile(filename: "{{.*}}/prelude/types/int.carbon", directory: "") // CHECK:STDOUT: !27 = !DISubroutineType(types: !28) // CHECK:STDOUT: !28 = !{null, !7, !7} // CHECK:STDOUT: !29 = !{!30, !31} // CHECK:STDOUT: !30 = !DILocalVariable(arg: 1, scope: !25, type: !7) // CHECK:STDOUT: !31 = !DILocalVariable(arg: 2, scope: !25, type: !7) -// CHECK:STDOUT: !32 = distinct !DILocation(line: 343, column: 5, scope: !33, inlinedAt: !38) -// CHECK:STDOUT: !33 = distinct !DISubprogram(name: "Op", linkageName: "_COp.Int.9452f4c51951679b.Core:Inc.Core.be1e879c1ad406d8", scope: null, file: !26, line: 341, type: !34, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !36) +// CHECK:STDOUT: !32 = distinct !DILocation(line: 362, column: 5, scope: !33, inlinedAt: !38) +// CHECK:STDOUT: !33 = distinct !DISubprogram(name: "Op", linkageName: "_COp.Int.9452f4c51951679b.Core:Inc.Core.be1e879c1ad406d8", scope: null, file: !26, line: 360, type: !34, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !36) // CHECK:STDOUT: !34 = !DISubroutineType(types: !35) // CHECK:STDOUT: !35 = !{null, !7} // CHECK:STDOUT: !36 = !{!37} diff --git a/toolchain/driver/testdata/compile/optimize/optimize_default.carbon b/toolchain/driver/testdata/compile/optimize/optimize_default.carbon index ab02ec5565ff..4427394502e4 100644 --- a/toolchain/driver/testdata/compile/optimize/optimize_default.carbon +++ b/toolchain/driver/testdata/compile/optimize/optimize_default.carbon @@ -113,16 +113,16 @@ fn VectorizedWithOptSpeed(a: array(i32, 65536)*) { // CHECK:STDOUT: !21 = !DILocalVariable(arg: 1, scope: !16, type: !19) // CHECK:STDOUT: !22 = !DILocation(line: 18, column: 9, scope: !16) // CHECK:STDOUT: !23 = !DILocation(line: 19, column: 5, scope: !16) -// CHECK:STDOUT: !24 = !DILocation(line: 277, column: 3, scope: !25, inlinedAt: !32) -// CHECK:STDOUT: !25 = distinct !DISubprogram(name: "Op", linkageName: "_COp:thunk.Int.9452f4c51951679b.Core:AddAssignWith.5375cfcbca6d9e35.Core.75bec4d236c9daa5", scope: null, file: !26, line: 277, type: !27, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !29) +// CHECK:STDOUT: !24 = !DILocation(line: 296, column: 3, scope: !25, inlinedAt: !32) +// CHECK:STDOUT: !25 = distinct !DISubprogram(name: "Op", linkageName: "_COp:thunk.Int.9452f4c51951679b.Core:AddAssignWith.5375cfcbca6d9e35.Core.57ee91777b6354a8", scope: null, file: !26, line: 296, type: !27, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !29) // CHECK:STDOUT: !26 = !DIFile(filename: "{{.*}}/prelude/types/int.carbon", directory: "") // CHECK:STDOUT: !27 = !DISubroutineType(types: !28) // CHECK:STDOUT: !28 = !{null, !7, !7} // CHECK:STDOUT: !29 = !{!30, !31} // CHECK:STDOUT: !30 = !DILocalVariable(arg: 1, scope: !25, type: !7) // CHECK:STDOUT: !31 = !DILocalVariable(arg: 2, scope: !25, type: !7) -// CHECK:STDOUT: !32 = distinct !DILocation(line: 343, column: 5, scope: !33, inlinedAt: !38) -// CHECK:STDOUT: !33 = distinct !DISubprogram(name: "Op", linkageName: "_COp.Int.9452f4c51951679b.Core:Inc.Core.be1e879c1ad406d8", scope: null, file: !26, line: 341, type: !34, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !36) +// CHECK:STDOUT: !32 = distinct !DILocation(line: 362, column: 5, scope: !33, inlinedAt: !38) +// CHECK:STDOUT: !33 = distinct !DISubprogram(name: "Op", linkageName: "_COp.Int.9452f4c51951679b.Core:Inc.Core.be1e879c1ad406d8", scope: null, file: !26, line: 360, type: !34, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !36) // CHECK:STDOUT: !34 = !DISubroutineType(types: !35) // CHECK:STDOUT: !35 = !{null, !7} // CHECK:STDOUT: !36 = !{!37} diff --git a/toolchain/driver/testdata/compile/optimize/optimize_none.carbon b/toolchain/driver/testdata/compile/optimize/optimize_none.carbon index 62d9be86c4d1..161e0ee4d4cd 100644 --- a/toolchain/driver/testdata/compile/optimize/optimize_none.carbon +++ b/toolchain/driver/testdata/compile/optimize/optimize_none.carbon @@ -87,13 +87,13 @@ fn VectorizedWithOptSpeed(a: array(i32, 65536)*) { // CHECK:STDOUT: // CHECK:STDOUT: ; Function Attrs: noinline nounwind optnone // CHECK:STDOUT: define linkonce_odr void @"_COp.Int.9452f4c51951679b.Core:Inc.Core.be1e879c1ad406d8"(ptr %self) #0 !dbg !28 { -// CHECK:STDOUT: call void @"_COp:thunk.Int.9452f4c51951679b.Core:AddAssignWith.5375cfcbca6d9e35.Core.75bec4d236c9daa5"(ptr %self, i32 1), !dbg !34 +// CHECK:STDOUT: call void @"_COp:thunk.Int.9452f4c51951679b.Core:AddAssignWith.5375cfcbca6d9e35.Core.57ee91777b6354a8"(ptr %self, i32 1), !dbg !34 // CHECK:STDOUT: ret void, !dbg !35 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: ; Function Attrs: noinline nounwind optnone -// CHECK:STDOUT: define linkonce_odr void @"_COp:thunk.Int.9452f4c51951679b.Core:AddAssignWith.5375cfcbca6d9e35.Core.75bec4d236c9daa5"(ptr %self, i32 %other) #0 !dbg !36 { -// CHECK:STDOUT: %1 = call i32 @"_CConvert.14b8745117b2bc54:ImplicitAs.a9271c1e04015f9c.Core.64ccbb8e5d9a0b8e"(i32 %other), !dbg !42 +// CHECK:STDOUT: define linkonce_odr void @"_COp:thunk.Int.9452f4c51951679b.Core:AddAssignWith.5375cfcbca6d9e35.Core.57ee91777b6354a8"(ptr %self, i32 %other) #0 !dbg !36 { +// CHECK:STDOUT: %1 = call i32 @"_CConvert.272fc3e88346d0d9:ImplicitAs.d993a5132e000405.Core.628184612c80324d"(i32 %other), !dbg !42 // CHECK:STDOUT: %2 = load i32, ptr %self, align 4, !dbg !43 // CHECK:STDOUT: %3 = add i32 %2, %1, !dbg !43 // CHECK:STDOUT: store i32 %3, ptr %self, align 4, !dbg !43 @@ -101,8 +101,14 @@ fn VectorizedWithOptSpeed(a: array(i32, 65536)*) { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: ; Function Attrs: noinline nounwind optnone -// CHECK:STDOUT: define linkonce_odr i32 @"_CConvert.14b8745117b2bc54:ImplicitAs.a9271c1e04015f9c.Core.64ccbb8e5d9a0b8e"(i32 %self) #0 !dbg !44 { -// CHECK:STDOUT: ret i32 %self, !dbg !50 +// CHECK:STDOUT: define linkonce_odr i32 @"_CConvert.272fc3e88346d0d9:ImplicitAs.d993a5132e000405.Core.628184612c80324d"(i32 %self) #0 !dbg !44 { +// CHECK:STDOUT: %1 = call i32 @"_CAsInt.Int.9452f4c51951679b.Core:AnyInt.Core.be1e879c1ad406d8"(i32 %self), !dbg !49 +// CHECK:STDOUT: ret i32 %1, !dbg !50 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: ; Function Attrs: noinline nounwind optnone +// CHECK:STDOUT: define linkonce_odr i32 @"_CAsInt.Int.9452f4c51951679b.Core:AnyInt.Core.be1e879c1ad406d8"(i32 %self) #0 !dbg !51 { +// CHECK:STDOUT: ret i32 %self, !dbg !54 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: attributes #0 = { noinline nounwind optnone } @@ -139,26 +145,30 @@ fn VectorizedWithOptSpeed(a: array(i32, 65536)*) { // CHECK:STDOUT: !25 = !DILocation(line: 20, column: 5, scope: !14) // CHECK:STDOUT: !26 = !DILocation(line: 18, column: 3, scope: !14) // CHECK:STDOUT: !27 = !DILocation(line: 15, column: 1, scope: !14) -// CHECK:STDOUT: !28 = distinct !DISubprogram(name: "Op", linkageName: "_COp.Int.9452f4c51951679b.Core:Inc.Core.be1e879c1ad406d8", scope: null, file: !29, line: 341, type: !30, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !32) +// CHECK:STDOUT: !28 = distinct !DISubprogram(name: "Op", linkageName: "_COp.Int.9452f4c51951679b.Core:Inc.Core.be1e879c1ad406d8", scope: null, file: !29, line: 360, type: !30, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !32) // CHECK:STDOUT: !29 = !DIFile(filename: "{{.*}}/prelude/types/int.carbon", directory: "") // CHECK:STDOUT: !30 = !DISubroutineType(types: !31) // CHECK:STDOUT: !31 = !{null, !7} // CHECK:STDOUT: !32 = !{!33} // CHECK:STDOUT: !33 = !DILocalVariable(arg: 1, scope: !28, type: !7) -// CHECK:STDOUT: !34 = !DILocation(line: 343, column: 5, scope: !28) -// CHECK:STDOUT: !35 = !DILocation(line: 341, column: 3, scope: !28) -// CHECK:STDOUT: !36 = distinct !DISubprogram(name: "Op", linkageName: "_COp:thunk.Int.9452f4c51951679b.Core:AddAssignWith.5375cfcbca6d9e35.Core.75bec4d236c9daa5", scope: null, file: !29, line: 277, type: !37, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !39) +// CHECK:STDOUT: !34 = !DILocation(line: 362, column: 5, scope: !28) +// CHECK:STDOUT: !35 = !DILocation(line: 360, column: 3, scope: !28) +// CHECK:STDOUT: !36 = distinct !DISubprogram(name: "Op", linkageName: "_COp:thunk.Int.9452f4c51951679b.Core:AddAssignWith.5375cfcbca6d9e35.Core.57ee91777b6354a8", scope: null, file: !29, line: 296, type: !37, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !39) // CHECK:STDOUT: !37 = !DISubroutineType(types: !38) // CHECK:STDOUT: !38 = !{null, !7, !7} // CHECK:STDOUT: !39 = !{!40, !41} // CHECK:STDOUT: !40 = !DILocalVariable(arg: 1, scope: !36, type: !7) // CHECK:STDOUT: !41 = !DILocalVariable(arg: 2, scope: !36, type: !7) // CHECK:STDOUT: !42 = !DILocation(line: 4294967295, scope: !36) -// CHECK:STDOUT: !43 = !DILocation(line: 277, column: 3, scope: !36) -// CHECK:STDOUT: !44 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.14b8745117b2bc54:ImplicitAs.a9271c1e04015f9c.Core.64ccbb8e5d9a0b8e", scope: null, file: !45, line: 35, type: !46, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !48) -// CHECK:STDOUT: !45 = !DIFile(filename: "{{.*}}/prelude/operators/as.carbon", directory: "") -// CHECK:STDOUT: !46 = !DISubroutineType(types: !47) -// CHECK:STDOUT: !47 = !{!7, !7} -// CHECK:STDOUT: !48 = !{!49} -// CHECK:STDOUT: !49 = !DILocalVariable(arg: 1, scope: !44, type: !7) -// CHECK:STDOUT: !50 = !DILocation(line: 35, column: 38, scope: !44) +// CHECK:STDOUT: !43 = !DILocation(line: 296, column: 3, scope: !36) +// CHECK:STDOUT: !44 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.272fc3e88346d0d9:ImplicitAs.d993a5132e000405.Core.628184612c80324d", scope: null, file: !29, line: 59, type: !45, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !47) +// CHECK:STDOUT: !45 = !DISubroutineType(types: !46) +// CHECK:STDOUT: !46 = !{!7, !7} +// CHECK:STDOUT: !47 = !{!48} +// CHECK:STDOUT: !48 = !DILocalVariable(arg: 1, scope: !44, type: !7) +// CHECK:STDOUT: !49 = !DILocation(line: 61, column: 17, scope: !44) +// CHECK:STDOUT: !50 = !DILocation(line: 61, column: 5, scope: !44) +// CHECK:STDOUT: !51 = distinct !DISubprogram(name: "AsInt", linkageName: "_CAsInt.Int.9452f4c51951679b.Core:AnyInt.Core.be1e879c1ad406d8", scope: null, file: !29, line: 54, type: !45, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !52) +// CHECK:STDOUT: !52 = !{!53} +// CHECK:STDOUT: !53 = !DILocalVariable(arg: 1, scope: !51, type: !7) +// CHECK:STDOUT: !54 = !DILocation(line: 54, column: 36, scope: !51) diff --git a/toolchain/driver/testdata/compile/optimize/optimize_size.carbon b/toolchain/driver/testdata/compile/optimize/optimize_size.carbon index 398f66bee308..4532ac69b6c1 100644 --- a/toolchain/driver/testdata/compile/optimize/optimize_size.carbon +++ b/toolchain/driver/testdata/compile/optimize/optimize_size.carbon @@ -86,13 +86,13 @@ fn VectorizedWithOptSpeed(a: array(i32, 65536)*) { // CHECK:STDOUT: // CHECK:STDOUT: ; Function Attrs: minsize nounwind optsize // CHECK:STDOUT: define linkonce_odr void @"_COp.Int.9452f4c51951679b.Core:Inc.Core.be1e879c1ad406d8"(ptr %self) #0 !dbg !28 { -// CHECK:STDOUT: call void @"_COp:thunk.Int.9452f4c51951679b.Core:AddAssignWith.5375cfcbca6d9e35.Core.75bec4d236c9daa5"(ptr %self, i32 1), !dbg !34 +// CHECK:STDOUT: call void @"_COp:thunk.Int.9452f4c51951679b.Core:AddAssignWith.5375cfcbca6d9e35.Core.57ee91777b6354a8"(ptr %self, i32 1), !dbg !34 // CHECK:STDOUT: ret void, !dbg !35 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: ; Function Attrs: alwaysinline minsize nounwind optsize -// CHECK:STDOUT: define linkonce_odr void @"_COp:thunk.Int.9452f4c51951679b.Core:AddAssignWith.5375cfcbca6d9e35.Core.75bec4d236c9daa5"(ptr %self, i32 %other) #2 !dbg !36 { -// CHECK:STDOUT: %1 = call i32 @"_CConvert.14b8745117b2bc54:ImplicitAs.a9271c1e04015f9c.Core.64ccbb8e5d9a0b8e"(i32 %other), !dbg !42 +// CHECK:STDOUT: define linkonce_odr void @"_COp:thunk.Int.9452f4c51951679b.Core:AddAssignWith.5375cfcbca6d9e35.Core.57ee91777b6354a8"(ptr %self, i32 %other) #2 !dbg !36 { +// CHECK:STDOUT: %1 = call i32 @"_CConvert.272fc3e88346d0d9:ImplicitAs.d993a5132e000405.Core.628184612c80324d"(i32 %other), !dbg !42 // CHECK:STDOUT: %2 = load i32, ptr %self, align 4, !dbg !43 // CHECK:STDOUT: %3 = add i32 %2, %1, !dbg !43 // CHECK:STDOUT: store i32 %3, ptr %self, align 4, !dbg !43 @@ -100,8 +100,14 @@ fn VectorizedWithOptSpeed(a: array(i32, 65536)*) { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: ; Function Attrs: minsize nounwind optsize -// CHECK:STDOUT: define linkonce_odr i32 @"_CConvert.14b8745117b2bc54:ImplicitAs.a9271c1e04015f9c.Core.64ccbb8e5d9a0b8e"(i32 %self) #0 !dbg !44 { -// CHECK:STDOUT: ret i32 %self, !dbg !50 +// CHECK:STDOUT: define linkonce_odr i32 @"_CConvert.272fc3e88346d0d9:ImplicitAs.d993a5132e000405.Core.628184612c80324d"(i32 %self) #0 !dbg !44 { +// CHECK:STDOUT: %1 = call i32 @"_CAsInt.Int.9452f4c51951679b.Core:AnyInt.Core.be1e879c1ad406d8"(i32 %self), !dbg !49 +// CHECK:STDOUT: ret i32 %1, !dbg !50 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: ; Function Attrs: minsize nounwind optsize +// CHECK:STDOUT: define linkonce_odr i32 @"_CAsInt.Int.9452f4c51951679b.Core:AnyInt.Core.be1e879c1ad406d8"(i32 %self) #0 !dbg !51 { +// CHECK:STDOUT: ret i32 %self, !dbg !54 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: attributes #0 = { minsize nounwind optsize } @@ -139,26 +145,30 @@ fn VectorizedWithOptSpeed(a: array(i32, 65536)*) { // CHECK:STDOUT: !25 = !DILocation(line: 20, column: 5, scope: !14) // CHECK:STDOUT: !26 = !DILocation(line: 18, column: 3, scope: !14) // CHECK:STDOUT: !27 = !DILocation(line: 15, column: 1, scope: !14) -// CHECK:STDOUT: !28 = distinct !DISubprogram(name: "Op", linkageName: "_COp.Int.9452f4c51951679b.Core:Inc.Core.be1e879c1ad406d8", scope: null, file: !29, line: 341, type: !30, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !32) +// CHECK:STDOUT: !28 = distinct !DISubprogram(name: "Op", linkageName: "_COp.Int.9452f4c51951679b.Core:Inc.Core.be1e879c1ad406d8", scope: null, file: !29, line: 360, type: !30, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !32) // CHECK:STDOUT: !29 = !DIFile(filename: "{{.*}}/prelude/types/int.carbon", directory: "") // CHECK:STDOUT: !30 = !DISubroutineType(types: !31) // CHECK:STDOUT: !31 = !{null, !7} // CHECK:STDOUT: !32 = !{!33} // CHECK:STDOUT: !33 = !DILocalVariable(arg: 1, scope: !28, type: !7) -// CHECK:STDOUT: !34 = !DILocation(line: 343, column: 5, scope: !28) -// CHECK:STDOUT: !35 = !DILocation(line: 341, column: 3, scope: !28) -// CHECK:STDOUT: !36 = distinct !DISubprogram(name: "Op", linkageName: "_COp:thunk.Int.9452f4c51951679b.Core:AddAssignWith.5375cfcbca6d9e35.Core.75bec4d236c9daa5", scope: null, file: !29, line: 277, type: !37, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !39) +// CHECK:STDOUT: !34 = !DILocation(line: 362, column: 5, scope: !28) +// CHECK:STDOUT: !35 = !DILocation(line: 360, column: 3, scope: !28) +// CHECK:STDOUT: !36 = distinct !DISubprogram(name: "Op", linkageName: "_COp:thunk.Int.9452f4c51951679b.Core:AddAssignWith.5375cfcbca6d9e35.Core.57ee91777b6354a8", scope: null, file: !29, line: 296, type: !37, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !39) // CHECK:STDOUT: !37 = !DISubroutineType(types: !38) // CHECK:STDOUT: !38 = !{null, !7, !7} // CHECK:STDOUT: !39 = !{!40, !41} // CHECK:STDOUT: !40 = !DILocalVariable(arg: 1, scope: !36, type: !7) // CHECK:STDOUT: !41 = !DILocalVariable(arg: 2, scope: !36, type: !7) // CHECK:STDOUT: !42 = !DILocation(line: 4294967295, scope: !36) -// CHECK:STDOUT: !43 = !DILocation(line: 277, column: 3, scope: !36) -// CHECK:STDOUT: !44 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.14b8745117b2bc54:ImplicitAs.a9271c1e04015f9c.Core.64ccbb8e5d9a0b8e", scope: null, file: !45, line: 35, type: !46, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !48) -// CHECK:STDOUT: !45 = !DIFile(filename: "{{.*}}/prelude/operators/as.carbon", directory: "") -// CHECK:STDOUT: !46 = !DISubroutineType(types: !47) -// CHECK:STDOUT: !47 = !{!7, !7} -// CHECK:STDOUT: !48 = !{!49} -// CHECK:STDOUT: !49 = !DILocalVariable(arg: 1, scope: !44, type: !7) -// CHECK:STDOUT: !50 = !DILocation(line: 35, column: 38, scope: !44) +// CHECK:STDOUT: !43 = !DILocation(line: 296, column: 3, scope: !36) +// CHECK:STDOUT: !44 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.272fc3e88346d0d9:ImplicitAs.d993a5132e000405.Core.628184612c80324d", scope: null, file: !29, line: 59, type: !45, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !47) +// CHECK:STDOUT: !45 = !DISubroutineType(types: !46) +// CHECK:STDOUT: !46 = !{!7, !7} +// CHECK:STDOUT: !47 = !{!48} +// CHECK:STDOUT: !48 = !DILocalVariable(arg: 1, scope: !44, type: !7) +// CHECK:STDOUT: !49 = !DILocation(line: 61, column: 17, scope: !44) +// CHECK:STDOUT: !50 = !DILocation(line: 61, column: 5, scope: !44) +// CHECK:STDOUT: !51 = distinct !DISubprogram(name: "AsInt", linkageName: "_CAsInt.Int.9452f4c51951679b.Core:AnyInt.Core.be1e879c1ad406d8", scope: null, file: !29, line: 54, type: !45, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !52) +// CHECK:STDOUT: !52 = !{!53} +// CHECK:STDOUT: !53 = !DILocalVariable(arg: 1, scope: !51, type: !7) +// CHECK:STDOUT: !54 = !DILocation(line: 54, column: 36, scope: !51) diff --git a/toolchain/driver/testdata/compile/optimize/optimize_speed.carbon b/toolchain/driver/testdata/compile/optimize/optimize_speed.carbon index 844939d667c3..604a350c172e 100644 --- a/toolchain/driver/testdata/compile/optimize/optimize_speed.carbon +++ b/toolchain/driver/testdata/compile/optimize/optimize_speed.carbon @@ -128,16 +128,16 @@ fn VectorizedWithOptSpeed(a: array(i32, 65536)*) { // CHECK:STDOUT: !20 = !{!21} // CHECK:STDOUT: !21 = !DILocalVariable(arg: 1, scope: !16, type: !19) // CHECK:STDOUT: !22 = !DILocation(line: 18, column: 9, scope: !16) -// CHECK:STDOUT: !23 = !DILocation(line: 277, column: 3, scope: !24, inlinedAt: !31) -// CHECK:STDOUT: !24 = distinct !DISubprogram(name: "Op", linkageName: "_COp:thunk.Int.9452f4c51951679b.Core:AddAssignWith.5375cfcbca6d9e35.Core.75bec4d236c9daa5", scope: null, file: !25, line: 277, type: !26, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !28) +// CHECK:STDOUT: !23 = !DILocation(line: 296, column: 3, scope: !24, inlinedAt: !31) +// CHECK:STDOUT: !24 = distinct !DISubprogram(name: "Op", linkageName: "_COp:thunk.Int.9452f4c51951679b.Core:AddAssignWith.5375cfcbca6d9e35.Core.57ee91777b6354a8", scope: null, file: !25, line: 296, type: !26, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !28) // CHECK:STDOUT: !25 = !DIFile(filename: "{{.*}}/prelude/types/int.carbon", directory: "") // CHECK:STDOUT: !26 = !DISubroutineType(types: !27) // CHECK:STDOUT: !27 = !{null, !7, !7} // CHECK:STDOUT: !28 = !{!29, !30} // CHECK:STDOUT: !29 = !DILocalVariable(arg: 1, scope: !24, type: !7) // CHECK:STDOUT: !30 = !DILocalVariable(arg: 2, scope: !24, type: !7) -// CHECK:STDOUT: !31 = distinct !DILocation(line: 343, column: 5, scope: !32, inlinedAt: !37) -// CHECK:STDOUT: !32 = distinct !DISubprogram(name: "Op", linkageName: "_COp.Int.9452f4c51951679b.Core:Inc.Core.be1e879c1ad406d8", scope: null, file: !25, line: 341, type: !33, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !35) +// CHECK:STDOUT: !31 = distinct !DILocation(line: 362, column: 5, scope: !32, inlinedAt: !37) +// CHECK:STDOUT: !32 = distinct !DISubprogram(name: "Op", linkageName: "_COp.Int.9452f4c51951679b.Core:Inc.Core.be1e879c1ad406d8", scope: null, file: !25, line: 360, type: !33, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !35) // CHECK:STDOUT: !33 = !DISubroutineType(types: !34) // CHECK:STDOUT: !34 = !{null, !7} // CHECK:STDOUT: !35 = !{!36} diff --git a/toolchain/lower/testdata/array/iterate.carbon b/toolchain/lower/testdata/array/iterate.carbon index 4ef1d2172683..8109e7b85596 100644 --- a/toolchain/lower/testdata/array/iterate.carbon +++ b/toolchain/lower/testdata/array/iterate.carbon @@ -105,7 +105,7 @@ fn F() { // CHECK:STDOUT: // CHECK:STDOUT: ; Function Attrs: nounwind // CHECK:STDOUT: define linkonce_odr void @"_COp.Int.9452f4c51951679b.Core:Inc.Core.be1e879c1ad406d8"(ptr %self) #0 !dbg !49 { -// CHECK:STDOUT: call void @"_COp:thunk.Int.9452f4c51951679b.Core:AddAssignWith.e2da7149b7fcf782.Core.dcdd24268af36579"(ptr %self, i32 1), !dbg !55 +// CHECK:STDOUT: call void @"_COp:thunk.Int.9452f4c51951679b.Core:AddAssignWith.e2da7149b7fcf782.Core.23ea0ff7335d4fdc"(ptr %self, i32 1), !dbg !55 // CHECK:STDOUT: ret void, !dbg !56 // CHECK:STDOUT: } // CHECK:STDOUT: @@ -137,8 +137,8 @@ fn F() { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: ; Function Attrs: alwaysinline nounwind -// CHECK:STDOUT: define linkonce_odr void @"_COp:thunk.Int.9452f4c51951679b.Core:AddAssignWith.e2da7149b7fcf782.Core.dcdd24268af36579"(ptr %self, i32 %other) #3 !dbg !79 { -// CHECK:STDOUT: %1 = call i32 @"_CConvert.1e58d10da180d7d9:ImplicitAs.39e2e54f50ee65cc.Core.255ef555a3d2f793"(i32 %other), !dbg !85 +// CHECK:STDOUT: define linkonce_odr void @"_COp:thunk.Int.9452f4c51951679b.Core:AddAssignWith.e2da7149b7fcf782.Core.23ea0ff7335d4fdc"(ptr %self, i32 %other) #3 !dbg !79 { +// CHECK:STDOUT: %1 = call i32 @"_CConvert.93210ed0b06d6c25:ImplicitAs.11da3bb3c3dce533.Core.5da21217b3d19eab"(i32 %other), !dbg !85 // CHECK:STDOUT: %2 = load i32, ptr %self, align 4, !dbg !86 // CHECK:STDOUT: %3 = add i32 %2, %1, !dbg !86 // CHECK:STDOUT: store i32 %3, ptr %self, align 4, !dbg !86 @@ -162,8 +162,14 @@ fn F() { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: ; Function Attrs: nounwind -// CHECK:STDOUT: define linkonce_odr i32 @"_CConvert.1e58d10da180d7d9:ImplicitAs.39e2e54f50ee65cc.Core.255ef555a3d2f793"(i32 %self) #0 !dbg !96 { -// CHECK:STDOUT: ret i32 %self, !dbg !102 +// CHECK:STDOUT: define linkonce_odr i32 @"_CConvert.93210ed0b06d6c25:ImplicitAs.11da3bb3c3dce533.Core.5da21217b3d19eab"(i32 %self) #0 !dbg !96 { +// CHECK:STDOUT: %1 = call i32 @"_CAsInt.Int.9452f4c51951679b.Core:AnyInt.Core.be1e879c1ad406d8"(i32 %self), !dbg !101 +// CHECK:STDOUT: ret i32 %1, !dbg !102 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: ; Function Attrs: nounwind +// CHECK:STDOUT: define linkonce_odr i32 @"_CAsInt.Int.9452f4c51951679b.Core:AnyInt.Core.be1e879c1ad406d8"(i32 %self) #0 !dbg !103 { +// CHECK:STDOUT: ret i32 %self, !dbg !106 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: ; uselistorder directives @@ -226,14 +232,14 @@ fn F() { // CHECK:STDOUT: !46 = !DILocalVariable(arg: 1, scope: !44, type: !17) // CHECK:STDOUT: !47 = !DILocation(line: 36, column: 12, scope: !44) // CHECK:STDOUT: !48 = !DILocation(line: 36, column: 5, scope: !44) -// CHECK:STDOUT: !49 = distinct !DISubprogram(name: "Op", linkageName: "_COp.Int.9452f4c51951679b.Core:Inc.Core.be1e879c1ad406d8", scope: null, file: !50, line: 341, type: !51, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !53) +// CHECK:STDOUT: !49 = distinct !DISubprogram(name: "Op", linkageName: "_COp.Int.9452f4c51951679b.Core:Inc.Core.be1e879c1ad406d8", scope: null, file: !50, line: 360, type: !51, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !53) // CHECK:STDOUT: !50 = !DIFile(filename: "{{.*}}/prelude/types/int.carbon", directory: "") // CHECK:STDOUT: !51 = !DISubroutineType(types: !52) // CHECK:STDOUT: !52 = !{null, !16} // CHECK:STDOUT: !53 = !{!54} // CHECK:STDOUT: !54 = !DILocalVariable(arg: 1, scope: !49, type: !16) -// CHECK:STDOUT: !55 = !DILocation(line: 343, column: 5, scope: !49) -// CHECK:STDOUT: !56 = !DILocation(line: 341, column: 3, scope: !49) +// CHECK:STDOUT: !55 = !DILocation(line: 362, column: 5, scope: !49) +// CHECK:STDOUT: !56 = !DILocation(line: 360, column: 3, scope: !49) // CHECK:STDOUT: !57 = distinct !DISubprogram(name: "Some", linkageName: "_CSome.Optional.Core.b5e6acce74484d77", scope: null, file: !37, line: 29, type: !58, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !60) // CHECK:STDOUT: !58 = !DISubroutineType(types: !59) // CHECK:STDOUT: !59 = !{!17, !16} @@ -256,14 +262,14 @@ fn F() { // CHECK:STDOUT: !76 = !DILocalVariable(arg: 1, scope: !74, type: !17) // CHECK:STDOUT: !77 = !DILocation(line: 127, column: 12, scope: !74) // CHECK:STDOUT: !78 = !DILocation(line: 127, column: 5, scope: !74) -// CHECK:STDOUT: !79 = distinct !DISubprogram(name: "Op", linkageName: "_COp:thunk.Int.9452f4c51951679b.Core:AddAssignWith.e2da7149b7fcf782.Core.dcdd24268af36579", scope: null, file: !50, line: 277, type: !80, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !82) +// CHECK:STDOUT: !79 = distinct !DISubprogram(name: "Op", linkageName: "_COp:thunk.Int.9452f4c51951679b.Core:AddAssignWith.e2da7149b7fcf782.Core.23ea0ff7335d4fdc", scope: null, file: !50, line: 296, type: !80, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !82) // CHECK:STDOUT: !80 = !DISubroutineType(types: !81) // CHECK:STDOUT: !81 = !{null, !16, !16} // CHECK:STDOUT: !82 = !{!83, !84} // CHECK:STDOUT: !83 = !DILocalVariable(arg: 1, scope: !79, type: !16) // CHECK:STDOUT: !84 = !DILocalVariable(arg: 2, scope: !79, type: !16) // CHECK:STDOUT: !85 = !DILocation(line: 4294967295, scope: !79) -// CHECK:STDOUT: !86 = !DILocation(line: 277, column: 3, scope: !79) +// CHECK:STDOUT: !86 = !DILocation(line: 296, column: 3, scope: !79) // CHECK:STDOUT: !87 = distinct !DISubprogram(name: "Some", linkageName: "_CSome.3e8267224c5dc9c2:OptionalStorage.Core.bfb441135f07cbe1", scope: null, file: !37, line: 115, type: !58, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !88) // CHECK:STDOUT: !88 = !{!89} // CHECK:STDOUT: !89 = !DILocalVariable(arg: 1, scope: !87, type: !16) @@ -273,10 +279,14 @@ fn F() { // CHECK:STDOUT: !93 = distinct !DISubprogram(name: "None", linkageName: "_CNone.3e8267224c5dc9c2:OptionalStorage.Core.bfb441135f07cbe1", scope: null, file: !37, line: 110, type: !65, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !94 = !DILocation(line: 112, column: 5, scope: !93) // CHECK:STDOUT: !95 = !DILocation(line: 113, column: 5, scope: !93) -// CHECK:STDOUT: !96 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.1e58d10da180d7d9:ImplicitAs.39e2e54f50ee65cc.Core.255ef555a3d2f793", scope: null, file: !97, line: 35, type: !98, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !100) -// CHECK:STDOUT: !97 = !DIFile(filename: "{{.*}}/prelude/operators/as.carbon", directory: "") -// CHECK:STDOUT: !98 = !DISubroutineType(types: !99) -// CHECK:STDOUT: !99 = !{!16, !16} -// CHECK:STDOUT: !100 = !{!101} -// CHECK:STDOUT: !101 = !DILocalVariable(arg: 1, scope: !96, type: !16) -// CHECK:STDOUT: !102 = !DILocation(line: 35, column: 38, scope: !96) +// CHECK:STDOUT: !96 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.93210ed0b06d6c25:ImplicitAs.11da3bb3c3dce533.Core.5da21217b3d19eab", scope: null, file: !50, line: 59, type: !97, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !99) +// CHECK:STDOUT: !97 = !DISubroutineType(types: !98) +// CHECK:STDOUT: !98 = !{!16, !16} +// CHECK:STDOUT: !99 = !{!100} +// CHECK:STDOUT: !100 = !DILocalVariable(arg: 1, scope: !96, type: !16) +// CHECK:STDOUT: !101 = !DILocation(line: 61, column: 17, scope: !96) +// CHECK:STDOUT: !102 = !DILocation(line: 61, column: 5, scope: !96) +// CHECK:STDOUT: !103 = distinct !DISubprogram(name: "AsInt", linkageName: "_CAsInt.Int.9452f4c51951679b.Core:AnyInt.Core.be1e879c1ad406d8", scope: null, file: !50, line: 54, type: !97, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !104) +// CHECK:STDOUT: !104 = !{!105} +// CHECK:STDOUT: !105 = !DILocalVariable(arg: 1, scope: !103, type: !16) +// CHECK:STDOUT: !106 = !DILocation(line: 54, column: 36, scope: !103) diff --git a/toolchain/lower/testdata/for/break_continue.carbon b/toolchain/lower/testdata/for/break_continue.carbon index 331c006ec29c..007328f7d632 100644 --- a/toolchain/lower/testdata/for/break_continue.carbon +++ b/toolchain/lower/testdata/for/break_continue.carbon @@ -126,7 +126,7 @@ fn For() { // CHECK:STDOUT: // CHECK:STDOUT: ; Function Attrs: nounwind // CHECK:STDOUT: define linkonce_odr void @"_COp.Int.9452f4c51951679b.Core:Inc.Core.be1e879c1ad406d8"(ptr %self) #0 !dbg !58 { -// CHECK:STDOUT: call void @"_COp:thunk.Int.9452f4c51951679b.Core:AddAssignWith.5375cfcbca6d9e35.Core.cfd8ddddc59ca787"(ptr %self, i32 1), !dbg !64 +// CHECK:STDOUT: call void @"_COp:thunk.Int.9452f4c51951679b.Core:AddAssignWith.5375cfcbca6d9e35.Core.57ee91777b6354a8"(ptr %self, i32 1), !dbg !64 // CHECK:STDOUT: ret void, !dbg !65 // CHECK:STDOUT: } // CHECK:STDOUT: @@ -158,8 +158,8 @@ fn For() { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: ; Function Attrs: alwaysinline nounwind -// CHECK:STDOUT: define linkonce_odr void @"_COp:thunk.Int.9452f4c51951679b.Core:AddAssignWith.5375cfcbca6d9e35.Core.cfd8ddddc59ca787"(ptr %self, i32 %other) #2 !dbg !88 { -// CHECK:STDOUT: %1 = call i32 @"_CConvert.14b8745117b2bc54:ImplicitAs.a9271c1e04015f9c.Core.beca8a3ca33a86fb"(i32 %other), !dbg !94 +// CHECK:STDOUT: define linkonce_odr void @"_COp:thunk.Int.9452f4c51951679b.Core:AddAssignWith.5375cfcbca6d9e35.Core.57ee91777b6354a8"(ptr %self, i32 %other) #2 !dbg !88 { +// CHECK:STDOUT: %1 = call i32 @"_CConvert.272fc3e88346d0d9:ImplicitAs.d993a5132e000405.Core.628184612c80324d"(i32 %other), !dbg !94 // CHECK:STDOUT: %2 = load i32, ptr %self, align 4, !dbg !95 // CHECK:STDOUT: %3 = add i32 %2, %1, !dbg !95 // CHECK:STDOUT: store i32 %3, ptr %self, align 4, !dbg !95 @@ -183,8 +183,14 @@ fn For() { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: ; Function Attrs: nounwind -// CHECK:STDOUT: define linkonce_odr i32 @"_CConvert.14b8745117b2bc54:ImplicitAs.a9271c1e04015f9c.Core.beca8a3ca33a86fb"(i32 %self) #0 !dbg !105 { -// CHECK:STDOUT: ret i32 %self, !dbg !111 +// CHECK:STDOUT: define linkonce_odr i32 @"_CConvert.272fc3e88346d0d9:ImplicitAs.d993a5132e000405.Core.628184612c80324d"(i32 %self) #0 !dbg !105 { +// CHECK:STDOUT: %1 = call i32 @"_CAsInt.Int.9452f4c51951679b.Core:AnyInt.Core.be1e879c1ad406d8"(i32 %self), !dbg !110 +// CHECK:STDOUT: ret i32 %1, !dbg !111 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: ; Function Attrs: nounwind +// CHECK:STDOUT: define linkonce_odr i32 @"_CAsInt.Int.9452f4c51951679b.Core:AnyInt.Core.be1e879c1ad406d8"(i32 %self) #0 !dbg !112 { +// CHECK:STDOUT: ret i32 %self, !dbg !115 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: ; uselistorder directives @@ -255,14 +261,14 @@ fn For() { // CHECK:STDOUT: !55 = !DILocalVariable(arg: 1, scope: !53, type: !23) // CHECK:STDOUT: !56 = !DILocation(line: 36, column: 12, scope: !53) // CHECK:STDOUT: !57 = !DILocation(line: 36, column: 5, scope: !53) -// CHECK:STDOUT: !58 = distinct !DISubprogram(name: "Op", linkageName: "_COp.Int.9452f4c51951679b.Core:Inc.Core.be1e879c1ad406d8", scope: null, file: !59, line: 341, type: !60, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !62) +// CHECK:STDOUT: !58 = distinct !DISubprogram(name: "Op", linkageName: "_COp.Int.9452f4c51951679b.Core:Inc.Core.be1e879c1ad406d8", scope: null, file: !59, line: 360, type: !60, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !62) // CHECK:STDOUT: !59 = !DIFile(filename: "{{.*}}/prelude/types/int.carbon", directory: "") // CHECK:STDOUT: !60 = !DISubroutineType(types: !61) // CHECK:STDOUT: !61 = !{null, !22} // CHECK:STDOUT: !62 = !{!63} // CHECK:STDOUT: !63 = !DILocalVariable(arg: 1, scope: !58, type: !22) -// CHECK:STDOUT: !64 = !DILocation(line: 343, column: 5, scope: !58) -// CHECK:STDOUT: !65 = !DILocation(line: 341, column: 3, scope: !58) +// CHECK:STDOUT: !64 = !DILocation(line: 362, column: 5, scope: !58) +// CHECK:STDOUT: !65 = !DILocation(line: 360, column: 3, scope: !58) // CHECK:STDOUT: !66 = distinct !DISubprogram(name: "Some", linkageName: "_CSome.Optional.Core.a0986cb4211ec3fb", scope: null, file: !46, line: 29, type: !67, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !69) // CHECK:STDOUT: !67 = !DISubroutineType(types: !68) // CHECK:STDOUT: !68 = !{!23, !22} @@ -285,14 +291,14 @@ fn For() { // CHECK:STDOUT: !85 = !DILocalVariable(arg: 1, scope: !83, type: !23) // CHECK:STDOUT: !86 = !DILocation(line: 127, column: 12, scope: !83) // CHECK:STDOUT: !87 = !DILocation(line: 127, column: 5, scope: !83) -// CHECK:STDOUT: !88 = distinct !DISubprogram(name: "Op", linkageName: "_COp:thunk.Int.9452f4c51951679b.Core:AddAssignWith.5375cfcbca6d9e35.Core.cfd8ddddc59ca787", scope: null, file: !59, line: 277, type: !89, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !91) +// CHECK:STDOUT: !88 = distinct !DISubprogram(name: "Op", linkageName: "_COp:thunk.Int.9452f4c51951679b.Core:AddAssignWith.5375cfcbca6d9e35.Core.57ee91777b6354a8", scope: null, file: !59, line: 296, type: !89, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !91) // CHECK:STDOUT: !89 = !DISubroutineType(types: !90) // CHECK:STDOUT: !90 = !{null, !22, !22} // CHECK:STDOUT: !91 = !{!92, !93} // CHECK:STDOUT: !92 = !DILocalVariable(arg: 1, scope: !88, type: !22) // CHECK:STDOUT: !93 = !DILocalVariable(arg: 2, scope: !88, type: !22) // CHECK:STDOUT: !94 = !DILocation(line: 4294967295, scope: !88) -// CHECK:STDOUT: !95 = !DILocation(line: 277, column: 3, scope: !88) +// CHECK:STDOUT: !95 = !DILocation(line: 296, column: 3, scope: !88) // CHECK:STDOUT: !96 = distinct !DISubprogram(name: "Some", linkageName: "_CSome.3e8267224c5dc9c2:OptionalStorage.Core.0b1ea4541e2057b5", scope: null, file: !46, line: 115, type: !67, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !97) // CHECK:STDOUT: !97 = !{!98} // CHECK:STDOUT: !98 = !DILocalVariable(arg: 1, scope: !96, type: !22) @@ -302,10 +308,14 @@ fn For() { // CHECK:STDOUT: !102 = distinct !DISubprogram(name: "None", linkageName: "_CNone.3e8267224c5dc9c2:OptionalStorage.Core.0b1ea4541e2057b5", scope: null, file: !46, line: 110, type: !74, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !103 = !DILocation(line: 112, column: 5, scope: !102) // CHECK:STDOUT: !104 = !DILocation(line: 113, column: 5, scope: !102) -// CHECK:STDOUT: !105 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.14b8745117b2bc54:ImplicitAs.a9271c1e04015f9c.Core.beca8a3ca33a86fb", scope: null, file: !106, line: 35, type: !107, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !109) -// CHECK:STDOUT: !106 = !DIFile(filename: "{{.*}}/prelude/operators/as.carbon", directory: "") -// CHECK:STDOUT: !107 = !DISubroutineType(types: !108) -// CHECK:STDOUT: !108 = !{!22, !22} -// CHECK:STDOUT: !109 = !{!110} -// CHECK:STDOUT: !110 = !DILocalVariable(arg: 1, scope: !105, type: !22) -// CHECK:STDOUT: !111 = !DILocation(line: 35, column: 38, scope: !105) +// CHECK:STDOUT: !105 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.272fc3e88346d0d9:ImplicitAs.d993a5132e000405.Core.628184612c80324d", scope: null, file: !59, line: 59, type: !106, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !108) +// CHECK:STDOUT: !106 = !DISubroutineType(types: !107) +// CHECK:STDOUT: !107 = !{!22, !22} +// CHECK:STDOUT: !108 = !{!109} +// CHECK:STDOUT: !109 = !DILocalVariable(arg: 1, scope: !105, type: !22) +// CHECK:STDOUT: !110 = !DILocation(line: 61, column: 17, scope: !105) +// CHECK:STDOUT: !111 = !DILocation(line: 61, column: 5, scope: !105) +// CHECK:STDOUT: !112 = distinct !DISubprogram(name: "AsInt", linkageName: "_CAsInt.Int.9452f4c51951679b.Core:AnyInt.Core.be1e879c1ad406d8", scope: null, file: !59, line: 54, type: !106, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !113) +// CHECK:STDOUT: !113 = !{!114} +// CHECK:STDOUT: !114 = !DILocalVariable(arg: 1, scope: !112, type: !22) +// CHECK:STDOUT: !115 = !DILocation(line: 54, column: 36, scope: !112) diff --git a/toolchain/lower/testdata/for/for.carbon b/toolchain/lower/testdata/for/for.carbon index ef78230fdf9f..3479075ba7ea 100644 --- a/toolchain/lower/testdata/for/for.carbon +++ b/toolchain/lower/testdata/for/for.carbon @@ -114,7 +114,7 @@ fn For() { // CHECK:STDOUT: // CHECK:STDOUT: ; Function Attrs: nounwind // CHECK:STDOUT: define linkonce_odr void @"_COp.Int.9452f4c51951679b.Core:Inc.Core.be1e879c1ad406d8"(ptr %self) #0 !dbg !54 { -// CHECK:STDOUT: call void @"_COp:thunk.Int.9452f4c51951679b.Core:AddAssignWith.5375cfcbca6d9e35.Core.cfd8ddddc59ca787"(ptr %self, i32 1), !dbg !60 +// CHECK:STDOUT: call void @"_COp:thunk.Int.9452f4c51951679b.Core:AddAssignWith.5375cfcbca6d9e35.Core.57ee91777b6354a8"(ptr %self, i32 1), !dbg !60 // CHECK:STDOUT: ret void, !dbg !61 // CHECK:STDOUT: } // CHECK:STDOUT: @@ -146,8 +146,8 @@ fn For() { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: ; Function Attrs: alwaysinline nounwind -// CHECK:STDOUT: define linkonce_odr void @"_COp:thunk.Int.9452f4c51951679b.Core:AddAssignWith.5375cfcbca6d9e35.Core.cfd8ddddc59ca787"(ptr %self, i32 %other) #2 !dbg !84 { -// CHECK:STDOUT: %1 = call i32 @"_CConvert.14b8745117b2bc54:ImplicitAs.a9271c1e04015f9c.Core.beca8a3ca33a86fb"(i32 %other), !dbg !90 +// CHECK:STDOUT: define linkonce_odr void @"_COp:thunk.Int.9452f4c51951679b.Core:AddAssignWith.5375cfcbca6d9e35.Core.57ee91777b6354a8"(ptr %self, i32 %other) #2 !dbg !84 { +// CHECK:STDOUT: %1 = call i32 @"_CConvert.272fc3e88346d0d9:ImplicitAs.d993a5132e000405.Core.628184612c80324d"(i32 %other), !dbg !90 // CHECK:STDOUT: %2 = load i32, ptr %self, align 4, !dbg !91 // CHECK:STDOUT: %3 = add i32 %2, %1, !dbg !91 // CHECK:STDOUT: store i32 %3, ptr %self, align 4, !dbg !91 @@ -171,8 +171,14 @@ fn For() { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: ; Function Attrs: nounwind -// CHECK:STDOUT: define linkonce_odr i32 @"_CConvert.14b8745117b2bc54:ImplicitAs.a9271c1e04015f9c.Core.beca8a3ca33a86fb"(i32 %self) #0 !dbg !101 { -// CHECK:STDOUT: ret i32 %self, !dbg !107 +// CHECK:STDOUT: define linkonce_odr i32 @"_CConvert.272fc3e88346d0d9:ImplicitAs.d993a5132e000405.Core.628184612c80324d"(i32 %self) #0 !dbg !101 { +// CHECK:STDOUT: %1 = call i32 @"_CAsInt.Int.9452f4c51951679b.Core:AnyInt.Core.be1e879c1ad406d8"(i32 %self), !dbg !106 +// CHECK:STDOUT: ret i32 %1, !dbg !107 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: ; Function Attrs: nounwind +// CHECK:STDOUT: define linkonce_odr i32 @"_CAsInt.Int.9452f4c51951679b.Core:AnyInt.Core.be1e879c1ad406d8"(i32 %self) #0 !dbg !108 { +// CHECK:STDOUT: ret i32 %self, !dbg !111 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: ; uselistorder directives @@ -239,14 +245,14 @@ fn For() { // CHECK:STDOUT: !51 = !DILocalVariable(arg: 1, scope: !49, type: !19) // CHECK:STDOUT: !52 = !DILocation(line: 36, column: 12, scope: !49) // CHECK:STDOUT: !53 = !DILocation(line: 36, column: 5, scope: !49) -// CHECK:STDOUT: !54 = distinct !DISubprogram(name: "Op", linkageName: "_COp.Int.9452f4c51951679b.Core:Inc.Core.be1e879c1ad406d8", scope: null, file: !55, line: 341, type: !56, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !58) +// CHECK:STDOUT: !54 = distinct !DISubprogram(name: "Op", linkageName: "_COp.Int.9452f4c51951679b.Core:Inc.Core.be1e879c1ad406d8", scope: null, file: !55, line: 360, type: !56, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !58) // CHECK:STDOUT: !55 = !DIFile(filename: "{{.*}}/prelude/types/int.carbon", directory: "") // CHECK:STDOUT: !56 = !DISubroutineType(types: !57) // CHECK:STDOUT: !57 = !{null, !18} // CHECK:STDOUT: !58 = !{!59} // CHECK:STDOUT: !59 = !DILocalVariable(arg: 1, scope: !54, type: !18) -// CHECK:STDOUT: !60 = !DILocation(line: 343, column: 5, scope: !54) -// CHECK:STDOUT: !61 = !DILocation(line: 341, column: 3, scope: !54) +// CHECK:STDOUT: !60 = !DILocation(line: 362, column: 5, scope: !54) +// CHECK:STDOUT: !61 = !DILocation(line: 360, column: 3, scope: !54) // CHECK:STDOUT: !62 = distinct !DISubprogram(name: "Some", linkageName: "_CSome.Optional.Core.a0986cb4211ec3fb", scope: null, file: !42, line: 29, type: !63, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !65) // CHECK:STDOUT: !63 = !DISubroutineType(types: !64) // CHECK:STDOUT: !64 = !{!19, !18} @@ -269,14 +275,14 @@ fn For() { // CHECK:STDOUT: !81 = !DILocalVariable(arg: 1, scope: !79, type: !19) // CHECK:STDOUT: !82 = !DILocation(line: 127, column: 12, scope: !79) // CHECK:STDOUT: !83 = !DILocation(line: 127, column: 5, scope: !79) -// CHECK:STDOUT: !84 = distinct !DISubprogram(name: "Op", linkageName: "_COp:thunk.Int.9452f4c51951679b.Core:AddAssignWith.5375cfcbca6d9e35.Core.cfd8ddddc59ca787", scope: null, file: !55, line: 277, type: !85, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !87) +// CHECK:STDOUT: !84 = distinct !DISubprogram(name: "Op", linkageName: "_COp:thunk.Int.9452f4c51951679b.Core:AddAssignWith.5375cfcbca6d9e35.Core.57ee91777b6354a8", scope: null, file: !55, line: 296, type: !85, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !87) // CHECK:STDOUT: !85 = !DISubroutineType(types: !86) // CHECK:STDOUT: !86 = !{null, !18, !18} // CHECK:STDOUT: !87 = !{!88, !89} // CHECK:STDOUT: !88 = !DILocalVariable(arg: 1, scope: !84, type: !18) // CHECK:STDOUT: !89 = !DILocalVariable(arg: 2, scope: !84, type: !18) // CHECK:STDOUT: !90 = !DILocation(line: 4294967295, scope: !84) -// CHECK:STDOUT: !91 = !DILocation(line: 277, column: 3, scope: !84) +// CHECK:STDOUT: !91 = !DILocation(line: 296, column: 3, scope: !84) // CHECK:STDOUT: !92 = distinct !DISubprogram(name: "Some", linkageName: "_CSome.3e8267224c5dc9c2:OptionalStorage.Core.0b1ea4541e2057b5", scope: null, file: !42, line: 115, type: !63, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !93) // CHECK:STDOUT: !93 = !{!94} // CHECK:STDOUT: !94 = !DILocalVariable(arg: 1, scope: !92, type: !18) @@ -286,10 +292,14 @@ fn For() { // CHECK:STDOUT: !98 = distinct !DISubprogram(name: "None", linkageName: "_CNone.3e8267224c5dc9c2:OptionalStorage.Core.0b1ea4541e2057b5", scope: null, file: !42, line: 110, type: !70, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !99 = !DILocation(line: 112, column: 5, scope: !98) // CHECK:STDOUT: !100 = !DILocation(line: 113, column: 5, scope: !98) -// CHECK:STDOUT: !101 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.14b8745117b2bc54:ImplicitAs.a9271c1e04015f9c.Core.beca8a3ca33a86fb", scope: null, file: !102, line: 35, type: !103, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !105) -// CHECK:STDOUT: !102 = !DIFile(filename: "{{.*}}/prelude/operators/as.carbon", directory: "") -// CHECK:STDOUT: !103 = !DISubroutineType(types: !104) -// CHECK:STDOUT: !104 = !{!18, !18} -// CHECK:STDOUT: !105 = !{!106} -// CHECK:STDOUT: !106 = !DILocalVariable(arg: 1, scope: !101, type: !18) -// CHECK:STDOUT: !107 = !DILocation(line: 35, column: 38, scope: !101) +// CHECK:STDOUT: !101 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.272fc3e88346d0d9:ImplicitAs.d993a5132e000405.Core.628184612c80324d", scope: null, file: !55, line: 59, type: !102, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !104) +// CHECK:STDOUT: !102 = !DISubroutineType(types: !103) +// CHECK:STDOUT: !103 = !{!18, !18} +// CHECK:STDOUT: !104 = !{!105} +// CHECK:STDOUT: !105 = !DILocalVariable(arg: 1, scope: !101, type: !18) +// CHECK:STDOUT: !106 = !DILocation(line: 61, column: 17, scope: !101) +// CHECK:STDOUT: !107 = !DILocation(line: 61, column: 5, scope: !101) +// CHECK:STDOUT: !108 = distinct !DISubprogram(name: "AsInt", linkageName: "_CAsInt.Int.9452f4c51951679b.Core:AnyInt.Core.be1e879c1ad406d8", scope: null, file: !55, line: 54, type: !102, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !109) +// CHECK:STDOUT: !109 = !{!110} +// CHECK:STDOUT: !110 = !DILocalVariable(arg: 1, scope: !108, type: !18) +// CHECK:STDOUT: !111 = !DILocation(line: 54, column: 36, scope: !108) diff --git a/toolchain/lower/testdata/operators/increment.carbon b/toolchain/lower/testdata/operators/increment.carbon index 3e9fff07f1b5..b78a78955b3f 100644 --- a/toolchain/lower/testdata/operators/increment.carbon +++ b/toolchain/lower/testdata/operators/increment.carbon @@ -37,13 +37,13 @@ fn IncrSigned() { // CHECK:STDOUT: // CHECK:STDOUT: ; Function Attrs: nounwind // CHECK:STDOUT: define linkonce_odr void @"_COp.Int.9452f4c51951679b.Core:Inc.Core.be1e879c1ad406d8"(ptr %self) #0 !dbg !10 { -// CHECK:STDOUT: call void @"_COp:thunk.Int.9452f4c51951679b.Core:AddAssignWith.5375cfcbca6d9e35.Core.75bec4d236c9daa5"(ptr %self, i32 1), !dbg !17 +// CHECK:STDOUT: call void @"_COp:thunk.Int.9452f4c51951679b.Core:AddAssignWith.5375cfcbca6d9e35.Core.57ee91777b6354a8"(ptr %self, i32 1), !dbg !17 // CHECK:STDOUT: ret void, !dbg !18 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: ; Function Attrs: alwaysinline nounwind -// CHECK:STDOUT: define linkonce_odr void @"_COp:thunk.Int.9452f4c51951679b.Core:AddAssignWith.5375cfcbca6d9e35.Core.75bec4d236c9daa5"(ptr %self, i32 %other) #2 !dbg !19 { -// CHECK:STDOUT: %1 = call i32 @"_CConvert.14b8745117b2bc54:ImplicitAs.a9271c1e04015f9c.Core.64ccbb8e5d9a0b8e"(i32 %other), !dbg !25 +// CHECK:STDOUT: define linkonce_odr void @"_COp:thunk.Int.9452f4c51951679b.Core:AddAssignWith.5375cfcbca6d9e35.Core.57ee91777b6354a8"(ptr %self, i32 %other) #2 !dbg !19 { +// CHECK:STDOUT: %1 = call i32 @"_CConvert.272fc3e88346d0d9:ImplicitAs.d993a5132e000405.Core.628184612c80324d"(i32 %other), !dbg !25 // CHECK:STDOUT: %2 = load i32, ptr %self, align 4, !dbg !26 // CHECK:STDOUT: %3 = add i32 %2, %1, !dbg !26 // CHECK:STDOUT: store i32 %3, ptr %self, align 4, !dbg !26 @@ -51,8 +51,14 @@ fn IncrSigned() { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: ; Function Attrs: nounwind -// CHECK:STDOUT: define linkonce_odr i32 @"_CConvert.14b8745117b2bc54:ImplicitAs.a9271c1e04015f9c.Core.64ccbb8e5d9a0b8e"(i32 %self) #0 !dbg !27 { -// CHECK:STDOUT: ret i32 %self, !dbg !33 +// CHECK:STDOUT: define linkonce_odr i32 @"_CConvert.272fc3e88346d0d9:ImplicitAs.d993a5132e000405.Core.628184612c80324d"(i32 %self) #0 !dbg !27 { +// CHECK:STDOUT: %1 = call i32 @"_CAsInt.Int.9452f4c51951679b.Core:AnyInt.Core.be1e879c1ad406d8"(i32 %self), !dbg !32 +// CHECK:STDOUT: ret i32 %1, !dbg !33 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: ; Function Attrs: nounwind +// CHECK:STDOUT: define linkonce_odr i32 @"_CAsInt.Int.9452f4c51951679b.Core:AnyInt.Core.be1e879c1ad406d8"(i32 %self) #0 !dbg !34 { +// CHECK:STDOUT: ret i32 %self, !dbg !37 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: attributes #0 = { nounwind } @@ -72,27 +78,31 @@ fn IncrSigned() { // CHECK:STDOUT: !7 = !DILocation(line: 5, column: 3, scope: !4) // CHECK:STDOUT: !8 = !DILocation(line: 6, column: 3, scope: !4) // CHECK:STDOUT: !9 = !DILocation(line: 4, column: 1, scope: !4) -// CHECK:STDOUT: !10 = distinct !DISubprogram(name: "Op", linkageName: "_COp.Int.9452f4c51951679b.Core:Inc.Core.be1e879c1ad406d8", scope: null, file: !11, line: 341, type: !12, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !15) +// CHECK:STDOUT: !10 = distinct !DISubprogram(name: "Op", linkageName: "_COp.Int.9452f4c51951679b.Core:Inc.Core.be1e879c1ad406d8", scope: null, file: !11, line: 360, type: !12, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !15) // CHECK:STDOUT: !11 = !DIFile(filename: "{{.*}}/prelude/types/int.carbon", directory: "") // CHECK:STDOUT: !12 = !DISubroutineType(types: !13) // CHECK:STDOUT: !13 = !{null, !14} // CHECK:STDOUT: !14 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) // CHECK:STDOUT: !15 = !{!16} // CHECK:STDOUT: !16 = !DILocalVariable(arg: 1, scope: !10, type: !14) -// CHECK:STDOUT: !17 = !DILocation(line: 343, column: 5, scope: !10) -// CHECK:STDOUT: !18 = !DILocation(line: 341, column: 3, scope: !10) -// CHECK:STDOUT: !19 = distinct !DISubprogram(name: "Op", linkageName: "_COp:thunk.Int.9452f4c51951679b.Core:AddAssignWith.5375cfcbca6d9e35.Core.75bec4d236c9daa5", scope: null, file: !11, line: 277, type: !20, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !22) +// CHECK:STDOUT: !17 = !DILocation(line: 362, column: 5, scope: !10) +// CHECK:STDOUT: !18 = !DILocation(line: 360, column: 3, scope: !10) +// CHECK:STDOUT: !19 = distinct !DISubprogram(name: "Op", linkageName: "_COp:thunk.Int.9452f4c51951679b.Core:AddAssignWith.5375cfcbca6d9e35.Core.57ee91777b6354a8", scope: null, file: !11, line: 296, type: !20, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !22) // CHECK:STDOUT: !20 = !DISubroutineType(types: !21) // CHECK:STDOUT: !21 = !{null, !14, !14} // CHECK:STDOUT: !22 = !{!23, !24} // CHECK:STDOUT: !23 = !DILocalVariable(arg: 1, scope: !19, type: !14) // CHECK:STDOUT: !24 = !DILocalVariable(arg: 2, scope: !19, type: !14) // CHECK:STDOUT: !25 = !DILocation(line: 4294967295, scope: !19) -// CHECK:STDOUT: !26 = !DILocation(line: 277, column: 3, scope: !19) -// CHECK:STDOUT: !27 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.14b8745117b2bc54:ImplicitAs.a9271c1e04015f9c.Core.64ccbb8e5d9a0b8e", scope: null, file: !28, line: 35, type: !29, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !31) -// CHECK:STDOUT: !28 = !DIFile(filename: "{{.*}}/prelude/operators/as.carbon", directory: "") -// CHECK:STDOUT: !29 = !DISubroutineType(types: !30) -// CHECK:STDOUT: !30 = !{!14, !14} -// CHECK:STDOUT: !31 = !{!32} -// CHECK:STDOUT: !32 = !DILocalVariable(arg: 1, scope: !27, type: !14) -// CHECK:STDOUT: !33 = !DILocation(line: 35, column: 38, scope: !27) +// CHECK:STDOUT: !26 = !DILocation(line: 296, column: 3, scope: !19) +// CHECK:STDOUT: !27 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.272fc3e88346d0d9:ImplicitAs.d993a5132e000405.Core.628184612c80324d", scope: null, file: !11, line: 59, type: !28, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !30) +// CHECK:STDOUT: !28 = !DISubroutineType(types: !29) +// CHECK:STDOUT: !29 = !{!14, !14} +// CHECK:STDOUT: !30 = !{!31} +// CHECK:STDOUT: !31 = !DILocalVariable(arg: 1, scope: !27, type: !14) +// CHECK:STDOUT: !32 = !DILocation(line: 61, column: 17, scope: !27) +// CHECK:STDOUT: !33 = !DILocation(line: 61, column: 5, scope: !27) +// CHECK:STDOUT: !34 = distinct !DISubprogram(name: "AsInt", linkageName: "_CAsInt.Int.9452f4c51951679b.Core:AnyInt.Core.be1e879c1ad406d8", scope: null, file: !11, line: 54, type: !28, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !35) +// CHECK:STDOUT: !35 = !{!36} +// CHECK:STDOUT: !36 = !DILocalVariable(arg: 1, scope: !34, type: !14) +// CHECK:STDOUT: !37 = !DILocation(line: 54, column: 36, scope: !34) diff --git a/toolchain/lower/testdata/primitives/int_types.carbon b/toolchain/lower/testdata/primitives/int_types.carbon index 00659c1f1261..2b2d6c133a9b 100644 --- a/toolchain/lower/testdata/primitives/int_types.carbon +++ b/toolchain/lower/testdata/primitives/int_types.carbon @@ -2,7 +2,7 @@ // Exceptions. See /LICENSE for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // -// INCLUDE-FILE: toolchain/testing/testdata/min_prelude/uint.carbon +// INCLUDE-FILE: toolchain/testing/testdata/min_prelude/full.carbon // // AUTOUPDATE // TIP: To test this file alone, run: @@ -10,11 +10,19 @@ // TIP: To dump output, run: // TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/lower/testdata/primitives/int_types.carbon +// --- pass_and_return.carbon + +library "[[@TEST_NAME]]"; + fn F_i8(a: i8) -> i8 { return a; } fn F_u16(a: u16) -> u16 { return a; } fn F_i64(a: i64) -> i64 { return a; } fn F_u65536(a: u65536) -> u65536 { return a; } +// --- load_and_store.carbon + +library "[[@TEST_NAME]]"; + fn LoadStore_Bytes(p: Core.Int(24)*, n: Core.Int(24)) -> Core.Int(24) { let v: Core.Int(24) = *p; *p = n; @@ -27,8 +35,18 @@ fn LoadStore_NotBytes(p: Core.Int(13)*, n: Core.Int(13)) -> Core.Int(13) { return v; } -// CHECK:STDOUT: ; ModuleID = 'int_types.carbon' -// CHECK:STDOUT: source_filename = "int_types.carbon" +// --- convert.carbon + +library "[[@TEST_NAME]]"; + +fn ImplicitWidenSigned(a: i8) -> i32 { return a; } +fn ImplicitWidenUnsigned(a: u8) -> u32 { return a; } +fn ImplicitWidenUnsignedToSigned(a: u8) -> i32 { return a; } +fn ImplicitWidenCustom(a: Core.Int(4)) -> Core.Int(5) { return a; } +fn ImplicitWidenUnsignedCustom(a: Core.UInt(4)) -> Core.UInt(5) { return a; } + +// CHECK:STDOUT: ; ModuleID = 'pass_and_return.carbon' +// CHECK:STDOUT: source_filename = "pass_and_return.carbon" // CHECK:STDOUT: // CHECK:STDOUT: ; Function Attrs: nounwind // CHECK:STDOUT: define i8 @_CF_i8.Main(i8 %a) #0 !dbg !4 { @@ -54,22 +72,62 @@ fn LoadStore_NotBytes(p: Core.Int(13)*, n: Core.Int(13)) -> Core.Int(13) { // CHECK:STDOUT: ret i65536 %a, !dbg !31 // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: attributes #0 = { nounwind } +// CHECK:STDOUT: +// CHECK:STDOUT: !llvm.module.flags = !{!0, !1} +// CHECK:STDOUT: !llvm.dbg.cu = !{!2} +// CHECK:STDOUT: +// CHECK:STDOUT: !0 = !{i32 7, !"Dwarf Version", i32 5} +// CHECK:STDOUT: !1 = !{i32 2, !"Debug Info Version", i32 3} +// CHECK:STDOUT: !2 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !3, producer: "carbon", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug) +// CHECK:STDOUT: !3 = !DIFile(filename: "pass_and_return.carbon", directory: "") +// CHECK:STDOUT: !4 = distinct !DISubprogram(name: "F_i8", linkageName: "_CF_i8.Main", scope: null, file: !3, line: 4, type: !5, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !8) +// CHECK:STDOUT: !5 = !DISubroutineType(types: !6) +// CHECK:STDOUT: !6 = !{!7, !7} +// CHECK:STDOUT: !7 = !DIBasicType(name: "int", size: 8, encoding: DW_ATE_signed) +// CHECK:STDOUT: !8 = !{!9} +// CHECK:STDOUT: !9 = !DILocalVariable(arg: 1, scope: !4, type: !7) +// CHECK:STDOUT: !10 = !DILocation(line: 4, column: 24, scope: !4) +// CHECK:STDOUT: !11 = distinct !DISubprogram(name: "F_u16", linkageName: "_CF_u16.Main", scope: null, file: !3, line: 5, type: !12, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !15) +// CHECK:STDOUT: !12 = !DISubroutineType(types: !13) +// CHECK:STDOUT: !13 = !{!14, !14} +// CHECK:STDOUT: !14 = !DIBasicType(name: "int", size: 16, encoding: DW_ATE_unsigned) +// CHECK:STDOUT: !15 = !{!16} +// CHECK:STDOUT: !16 = !DILocalVariable(arg: 1, scope: !11, type: !14) +// CHECK:STDOUT: !17 = !DILocation(line: 5, column: 27, scope: !11) +// CHECK:STDOUT: !18 = distinct !DISubprogram(name: "F_i64", linkageName: "_CF_i64.Main", scope: null, file: !3, line: 6, type: !19, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !22) +// CHECK:STDOUT: !19 = !DISubroutineType(types: !20) +// CHECK:STDOUT: !20 = !{!21, !21} +// CHECK:STDOUT: !21 = !DIBasicType(name: "int", size: 64, encoding: DW_ATE_signed) +// CHECK:STDOUT: !22 = !{!23} +// CHECK:STDOUT: !23 = !DILocalVariable(arg: 1, scope: !18, type: !21) +// CHECK:STDOUT: !24 = !DILocation(line: 6, column: 27, scope: !18) +// CHECK:STDOUT: !25 = distinct !DISubprogram(name: "F_u65536", linkageName: "_CF_u65536.Main", scope: null, file: !3, line: 7, type: !26, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !29) +// CHECK:STDOUT: !26 = !DISubroutineType(types: !27) +// CHECK:STDOUT: !27 = !{!28, !28} +// CHECK:STDOUT: !28 = !DIBasicType(name: "int", size: 65536, encoding: DW_ATE_unsigned) +// CHECK:STDOUT: !29 = !{!30} +// CHECK:STDOUT: !30 = !DILocalVariable(arg: 1, scope: !25, type: !28) +// CHECK:STDOUT: !31 = !DILocation(line: 7, column: 36, scope: !25) +// CHECK:STDOUT: ; ModuleID = 'load_and_store.carbon' +// CHECK:STDOUT: source_filename = "load_and_store.carbon" +// CHECK:STDOUT: // CHECK:STDOUT: ; Function Attrs: nounwind -// CHECK:STDOUT: define i24 @_CLoadStore_Bytes.Main(ptr %p, i24 %n) #0 !dbg !32 { +// CHECK:STDOUT: define i24 @_CLoadStore_Bytes.Main(ptr %p, i24 %n) #0 !dbg !4 { // CHECK:STDOUT: entry: -// CHECK:STDOUT: %.loc19_25.2 = load i24, ptr %p, align 4, !dbg !40 -// CHECK:STDOUT: store i24 %n, ptr %p, align 4, !dbg !41 -// CHECK:STDOUT: ret i24 %.loc19_25.2, !dbg !42 +// CHECK:STDOUT: %.loc5_25.2 = load i24, ptr %p, align 4, !dbg !12 +// CHECK:STDOUT: store i24 %n, ptr %p, align 4, !dbg !13 +// CHECK:STDOUT: ret i24 %.loc5_25.2, !dbg !14 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: ; Function Attrs: nounwind -// CHECK:STDOUT: define i13 @_CLoadStore_NotBytes.Main(ptr %p, i13 %n) #0 !dbg !43 { +// CHECK:STDOUT: define i13 @_CLoadStore_NotBytes.Main(ptr %p, i13 %n) #0 !dbg !15 { // CHECK:STDOUT: entry: -// CHECK:STDOUT: %.loc25_25.2 = load i16, ptr %p, align 2, !dbg !50 -// CHECK:STDOUT: %.loc25_25.21 = trunc i16 %.loc25_25.2 to i13, !dbg !50 -// CHECK:STDOUT: %0 = zext i13 %n to i16, !dbg !51 -// CHECK:STDOUT: store i16 %0, ptr %p, align 2, !dbg !51 -// CHECK:STDOUT: ret i13 %.loc25_25.21, !dbg !52 +// CHECK:STDOUT: %.loc11_25.2 = load i16, ptr %p, align 2, !dbg !22 +// CHECK:STDOUT: %.loc11_25.21 = trunc i16 %.loc11_25.2 to i13, !dbg !22 +// CHECK:STDOUT: %0 = zext i13 %n to i16, !dbg !23 +// CHECK:STDOUT: store i16 %0, ptr %p, align 2, !dbg !23 +// CHECK:STDOUT: ret i13 %.loc11_25.21, !dbg !24 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: attributes #0 = { nounwind } @@ -80,53 +138,257 @@ fn LoadStore_NotBytes(p: Core.Int(13)*, n: Core.Int(13)) -> Core.Int(13) { // CHECK:STDOUT: !0 = !{i32 7, !"Dwarf Version", i32 5} // CHECK:STDOUT: !1 = !{i32 2, !"Debug Info Version", i32 3} // CHECK:STDOUT: !2 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !3, producer: "carbon", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug) -// CHECK:STDOUT: !3 = !DIFile(filename: "int_types.carbon", directory: "") -// CHECK:STDOUT: !4 = distinct !DISubprogram(name: "F_i8", linkageName: "_CF_i8.Main", scope: null, file: !3, line: 13, type: !5, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !8) +// CHECK:STDOUT: !3 = !DIFile(filename: "load_and_store.carbon", directory: "") +// CHECK:STDOUT: !4 = distinct !DISubprogram(name: "LoadStore_Bytes", linkageName: "_CLoadStore_Bytes.Main", scope: null, file: !3, line: 4, type: !5, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !9) // CHECK:STDOUT: !5 = !DISubroutineType(types: !6) -// CHECK:STDOUT: !6 = !{!7, !7} -// CHECK:STDOUT: !7 = !DIBasicType(name: "int", size: 8, encoding: DW_ATE_signed) -// CHECK:STDOUT: !8 = !{!9} -// CHECK:STDOUT: !9 = !DILocalVariable(arg: 1, scope: !4, type: !7) -// CHECK:STDOUT: !10 = !DILocation(line: 13, column: 24, scope: !4) -// CHECK:STDOUT: !11 = distinct !DISubprogram(name: "F_u16", linkageName: "_CF_u16.Main", scope: null, file: !3, line: 14, type: !12, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !15) -// CHECK:STDOUT: !12 = !DISubroutineType(types: !13) -// CHECK:STDOUT: !13 = !{!14, !14} -// CHECK:STDOUT: !14 = !DIBasicType(name: "int", size: 16, encoding: DW_ATE_unsigned) -// CHECK:STDOUT: !15 = !{!16} -// CHECK:STDOUT: !16 = !DILocalVariable(arg: 1, scope: !11, type: !14) -// CHECK:STDOUT: !17 = !DILocation(line: 14, column: 27, scope: !11) -// CHECK:STDOUT: !18 = distinct !DISubprogram(name: "F_i64", linkageName: "_CF_i64.Main", scope: null, file: !3, line: 15, type: !19, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !22) -// CHECK:STDOUT: !19 = !DISubroutineType(types: !20) -// CHECK:STDOUT: !20 = !{!21, !21} -// CHECK:STDOUT: !21 = !DIBasicType(name: "int", size: 64, encoding: DW_ATE_signed) -// CHECK:STDOUT: !22 = !{!23} -// CHECK:STDOUT: !23 = !DILocalVariable(arg: 1, scope: !18, type: !21) -// CHECK:STDOUT: !24 = !DILocation(line: 15, column: 27, scope: !18) -// CHECK:STDOUT: !25 = distinct !DISubprogram(name: "F_u65536", linkageName: "_CF_u65536.Main", scope: null, file: !3, line: 16, type: !26, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !29) -// CHECK:STDOUT: !26 = !DISubroutineType(types: !27) -// CHECK:STDOUT: !27 = !{!28, !28} -// CHECK:STDOUT: !28 = !DIBasicType(name: "int", size: 65536, encoding: DW_ATE_unsigned) -// CHECK:STDOUT: !29 = !{!30} -// CHECK:STDOUT: !30 = !DILocalVariable(arg: 1, scope: !25, type: !28) -// CHECK:STDOUT: !31 = !DILocation(line: 16, column: 36, scope: !25) -// CHECK:STDOUT: !32 = distinct !DISubprogram(name: "LoadStore_Bytes", linkageName: "_CLoadStore_Bytes.Main", scope: null, file: !3, line: 18, type: !33, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !37) -// CHECK:STDOUT: !33 = !DISubroutineType(types: !34) -// CHECK:STDOUT: !34 = !{!35, !36, !35} -// CHECK:STDOUT: !35 = !DIBasicType(name: "int", size: 24, encoding: DW_ATE_signed) -// CHECK:STDOUT: !36 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: null, size: 8) -// CHECK:STDOUT: !37 = !{!38, !39} -// CHECK:STDOUT: !38 = !DILocalVariable(arg: 1, scope: !32, type: !36) -// CHECK:STDOUT: !39 = !DILocalVariable(arg: 2, scope: !32, type: !35) -// CHECK:STDOUT: !40 = !DILocation(line: 19, column: 25, scope: !32) -// CHECK:STDOUT: !41 = !DILocation(line: 20, column: 3, scope: !32) -// CHECK:STDOUT: !42 = !DILocation(line: 21, column: 3, scope: !32) -// CHECK:STDOUT: !43 = distinct !DISubprogram(name: "LoadStore_NotBytes", linkageName: "_CLoadStore_NotBytes.Main", scope: null, file: !3, line: 24, type: !44, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !47) -// CHECK:STDOUT: !44 = !DISubroutineType(types: !45) -// CHECK:STDOUT: !45 = !{!46, !36, !46} -// CHECK:STDOUT: !46 = !DIBasicType(name: "int", size: 13, encoding: DW_ATE_signed) -// CHECK:STDOUT: !47 = !{!48, !49} -// CHECK:STDOUT: !48 = !DILocalVariable(arg: 1, scope: !43, type: !36) -// CHECK:STDOUT: !49 = !DILocalVariable(arg: 2, scope: !43, type: !46) -// CHECK:STDOUT: !50 = !DILocation(line: 25, column: 25, scope: !43) -// CHECK:STDOUT: !51 = !DILocation(line: 26, column: 3, scope: !43) -// CHECK:STDOUT: !52 = !DILocation(line: 27, column: 3, scope: !43) +// CHECK:STDOUT: !6 = !{!7, !8, !7} +// CHECK:STDOUT: !7 = !DIBasicType(name: "int", size: 24, encoding: DW_ATE_signed) +// CHECK:STDOUT: !8 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: null, size: 8) +// CHECK:STDOUT: !9 = !{!10, !11} +// CHECK:STDOUT: !10 = !DILocalVariable(arg: 1, scope: !4, type: !8) +// CHECK:STDOUT: !11 = !DILocalVariable(arg: 2, scope: !4, type: !7) +// CHECK:STDOUT: !12 = !DILocation(line: 5, column: 25, scope: !4) +// CHECK:STDOUT: !13 = !DILocation(line: 6, column: 3, scope: !4) +// CHECK:STDOUT: !14 = !DILocation(line: 7, column: 3, scope: !4) +// CHECK:STDOUT: !15 = distinct !DISubprogram(name: "LoadStore_NotBytes", linkageName: "_CLoadStore_NotBytes.Main", scope: null, file: !3, line: 10, type: !16, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !19) +// CHECK:STDOUT: !16 = !DISubroutineType(types: !17) +// CHECK:STDOUT: !17 = !{!18, !8, !18} +// CHECK:STDOUT: !18 = !DIBasicType(name: "int", size: 13, encoding: DW_ATE_signed) +// CHECK:STDOUT: !19 = !{!20, !21} +// CHECK:STDOUT: !20 = !DILocalVariable(arg: 1, scope: !15, type: !8) +// CHECK:STDOUT: !21 = !DILocalVariable(arg: 2, scope: !15, type: !18) +// CHECK:STDOUT: !22 = !DILocation(line: 11, column: 25, scope: !15) +// CHECK:STDOUT: !23 = !DILocation(line: 12, column: 3, scope: !15) +// CHECK:STDOUT: !24 = !DILocation(line: 13, column: 3, scope: !15) +// CHECK:STDOUT: ; ModuleID = 'convert.carbon' +// CHECK:STDOUT: source_filename = "convert.carbon" +// CHECK:STDOUT: +// CHECK:STDOUT: ; Function Attrs: nounwind +// CHECK:STDOUT: define i32 @_CImplicitWidenSigned.Main(i8 %a) #0 !dbg !4 { +// CHECK:STDOUT: entry: +// CHECK:STDOUT: %From.binding.as_type.as.ImplicitAs.impl.Convert.call = call i32 @"_CConvert.272fc3e88346d0d9:ImplicitAs.d993a5132e000405.Core.aa7228341bdcca99"(i8 %a), !dbg !11 +// CHECK:STDOUT: ret i32 %From.binding.as_type.as.ImplicitAs.impl.Convert.call, !dbg !11 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: ; Function Attrs: nounwind +// CHECK:STDOUT: define i32 @_CImplicitWidenUnsigned.Main(i8 %a) #0 !dbg !12 { +// CHECK:STDOUT: entry: +// CHECK:STDOUT: %UInt.as.ImplicitAs.impl.Convert.call = call i32 @"_CConvert.UInt.9452f4c51951679b.Core:ImplicitAs.952fa4f2c764f083.Core.0e306488ea9f63ef"(i8 %a), !dbg !19 +// CHECK:STDOUT: ret i32 %UInt.as.ImplicitAs.impl.Convert.call, !dbg !19 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: ; Function Attrs: nounwind +// CHECK:STDOUT: define i32 @_CImplicitWidenUnsignedToSigned.Main(i8 %a) #0 !dbg !20 { +// CHECK:STDOUT: entry: +// CHECK:STDOUT: %UInt.as.ImplicitAs.impl.Convert.call = call i32 @"_CConvert.UInt.9452f4c51951679b.Core:ImplicitAs.952fa4f2c764f083.Core.0237a74cabc89c74"(i8 %a), !dbg !25 +// CHECK:STDOUT: ret i32 %UInt.as.ImplicitAs.impl.Convert.call, !dbg !25 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: ; Function Attrs: nounwind +// CHECK:STDOUT: define i5 @_CImplicitWidenCustom.Main(i4 %a) #0 !dbg !26 { +// CHECK:STDOUT: entry: +// CHECK:STDOUT: %From.binding.as_type.as.ImplicitAs.impl.Convert.call = call i5 @"_CConvert.272fc3e88346d0d9:ImplicitAs.d993a5132e000405.Core.61459d64876d7c49"(i4 %a), !dbg !33 +// CHECK:STDOUT: ret i5 %From.binding.as_type.as.ImplicitAs.impl.Convert.call, !dbg !33 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: ; Function Attrs: nounwind +// CHECK:STDOUT: define i5 @_CImplicitWidenUnsignedCustom.Main(i4 %a) #0 !dbg !34 { +// CHECK:STDOUT: entry: +// CHECK:STDOUT: %UInt.as.ImplicitAs.impl.Convert.call = call i5 @"_CConvert.UInt.9452f4c51951679b.Core:ImplicitAs.952fa4f2c764f083.Core.d1cbb2cbeb4d860b"(i4 %a), !dbg !41 +// CHECK:STDOUT: ret i5 %UInt.as.ImplicitAs.impl.Convert.call, !dbg !41 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: ; Function Attrs: nounwind +// CHECK:STDOUT: define linkonce_odr i32 @"_CConvert.272fc3e88346d0d9:ImplicitAs.d993a5132e000405.Core.aa7228341bdcca99"(i8 %self) #0 !dbg !42 { +// CHECK:STDOUT: %1 = call i8 @"_CAsInt.Int.9452f4c51951679b.Core:AnyInt.Core.ca1ac10d3fc7c1a8"(i8 %self), !dbg !46 +// CHECK:STDOUT: %2 = sext i8 %1 to i32, !dbg !47 +// CHECK:STDOUT: ret i32 %2, !dbg !48 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: ; Function Attrs: nounwind +// CHECK:STDOUT: define linkonce_odr i32 @"_CConvert.UInt.9452f4c51951679b.Core:ImplicitAs.952fa4f2c764f083.Core.0e306488ea9f63ef"(i8 %self) #0 !dbg !49 { +// CHECK:STDOUT: %1 = call i32 @"_CConvert.UInt.9452f4c51951679b.Core:FromUInt.382a8acefd0525fe.Core.081daf9d9b61e05a"(i8 %self), !dbg !53 +// CHECK:STDOUT: ret i32 %1, !dbg !54 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: ; Function Attrs: nounwind +// CHECK:STDOUT: define linkonce_odr i32 @"_CConvert.UInt.9452f4c51951679b.Core:ImplicitAs.952fa4f2c764f083.Core.0237a74cabc89c74"(i8 %self) #0 !dbg !55 { +// CHECK:STDOUT: %1 = call i32 @"_CConvert.Int.9452f4c51951679b.Core:FromUInt.a15ed48781b6c2b7.Core.069b661f6a62a7bd"(i8 %self), !dbg !58 +// CHECK:STDOUT: ret i32 %1, !dbg !59 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: ; Function Attrs: nounwind +// CHECK:STDOUT: define linkonce_odr i5 @"_CConvert.272fc3e88346d0d9:ImplicitAs.d993a5132e000405.Core.61459d64876d7c49"(i4 %self) #0 !dbg !60 { +// CHECK:STDOUT: %1 = call i4 @"_CAsInt.Int.9452f4c51951679b.Core:AnyInt.Core.044c7d430ddd4fd6"(i4 %self), !dbg !63 +// CHECK:STDOUT: %2 = sext i4 %1 to i5, !dbg !64 +// CHECK:STDOUT: ret i5 %2, !dbg !65 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: ; Function Attrs: nounwind +// CHECK:STDOUT: define linkonce_odr i5 @"_CConvert.UInt.9452f4c51951679b.Core:ImplicitAs.952fa4f2c764f083.Core.d1cbb2cbeb4d860b"(i4 %self) #0 !dbg !66 { +// CHECK:STDOUT: %1 = call i5 @"_CConvert.UInt.9452f4c51951679b.Core:FromUInt.382a8acefd0525fe.Core.b0c274f0050b1ce4"(i4 %self), !dbg !69 +// CHECK:STDOUT: ret i5 %1, !dbg !70 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: ; Function Attrs: nounwind +// CHECK:STDOUT: define linkonce_odr i8 @"_CAsInt.Int.9452f4c51951679b.Core:AnyInt.Core.ca1ac10d3fc7c1a8"(i8 %self) #0 !dbg !71 { +// CHECK:STDOUT: ret i8 %self, !dbg !76 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: ; Function Attrs: nounwind +// CHECK:STDOUT: define linkonce_odr i32 @"_CConvert.UInt.9452f4c51951679b.Core:FromUInt.382a8acefd0525fe.Core.081daf9d9b61e05a"(i8 %from) #0 !dbg !77 { +// CHECK:STDOUT: %1 = call i8 @"_CAsUInt.UInt.9452f4c51951679b.Core:AnyUInt.Core.ca1ac10d3fc7c1a8"(i8 %from), !dbg !80 +// CHECK:STDOUT: %2 = zext i8 %1 to i32, !dbg !81 +// CHECK:STDOUT: ret i32 %2, !dbg !82 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: ; Function Attrs: nounwind +// CHECK:STDOUT: define linkonce_odr i32 @"_CConvert.Int.9452f4c51951679b.Core:FromUInt.a15ed48781b6c2b7.Core.069b661f6a62a7bd"(i8 %from) #0 !dbg !83 { +// CHECK:STDOUT: %1 = call i8 @"_CAsUInt.UInt.9452f4c51951679b.Core:AnyUInt.Core.ca1ac10d3fc7c1a8"(i8 %from), !dbg !86 +// CHECK:STDOUT: %2 = zext i8 %1 to i32, !dbg !87 +// CHECK:STDOUT: ret i32 %2, !dbg !88 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: ; Function Attrs: nounwind +// CHECK:STDOUT: define linkonce_odr i4 @"_CAsInt.Int.9452f4c51951679b.Core:AnyInt.Core.044c7d430ddd4fd6"(i4 %self) #0 !dbg !89 { +// CHECK:STDOUT: ret i4 %self, !dbg !94 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: ; Function Attrs: nounwind +// CHECK:STDOUT: define linkonce_odr i5 @"_CConvert.UInt.9452f4c51951679b.Core:FromUInt.382a8acefd0525fe.Core.b0c274f0050b1ce4"(i4 %from) #0 !dbg !95 { +// CHECK:STDOUT: %1 = call i4 @"_CAsUInt.UInt.9452f4c51951679b.Core:AnyUInt.Core.044c7d430ddd4fd6"(i4 %from), !dbg !98 +// CHECK:STDOUT: %2 = zext i4 %1 to i5, !dbg !99 +// CHECK:STDOUT: ret i5 %2, !dbg !100 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: ; Function Attrs: nounwind +// CHECK:STDOUT: define linkonce_odr i8 @"_CAsUInt.UInt.9452f4c51951679b.Core:AnyUInt.Core.ca1ac10d3fc7c1a8"(i8 %self) #0 !dbg !101 { +// CHECK:STDOUT: ret i8 %self, !dbg !106 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: ; Function Attrs: nounwind +// CHECK:STDOUT: define linkonce_odr i4 @"_CAsUInt.UInt.9452f4c51951679b.Core:AnyUInt.Core.044c7d430ddd4fd6"(i4 %self) #0 !dbg !107 { +// CHECK:STDOUT: ret i4 %self, !dbg !112 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: ; uselistorder directives +// CHECK:STDOUT: uselistorder ptr @"_CAsUInt.UInt.9452f4c51951679b.Core:AnyUInt.Core.ca1ac10d3fc7c1a8", { 1, 0 } +// CHECK:STDOUT: +// CHECK:STDOUT: attributes #0 = { nounwind } +// CHECK:STDOUT: +// CHECK:STDOUT: !llvm.module.flags = !{!0, !1} +// CHECK:STDOUT: !llvm.dbg.cu = !{!2} +// CHECK:STDOUT: +// CHECK:STDOUT: !0 = !{i32 7, !"Dwarf Version", i32 5} +// CHECK:STDOUT: !1 = !{i32 2, !"Debug Info Version", i32 3} +// CHECK:STDOUT: !2 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !3, producer: "carbon", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug) +// CHECK:STDOUT: !3 = !DIFile(filename: "convert.carbon", directory: "") +// CHECK:STDOUT: !4 = distinct !DISubprogram(name: "ImplicitWidenSigned", linkageName: "_CImplicitWidenSigned.Main", scope: null, file: !3, line: 4, type: !5, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !9) +// CHECK:STDOUT: !5 = !DISubroutineType(types: !6) +// CHECK:STDOUT: !6 = !{!7, !8} +// CHECK:STDOUT: !7 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) +// CHECK:STDOUT: !8 = !DIBasicType(name: "int", size: 8, encoding: DW_ATE_signed) +// CHECK:STDOUT: !9 = !{!10} +// CHECK:STDOUT: !10 = !DILocalVariable(arg: 1, scope: !4, type: !8) +// CHECK:STDOUT: !11 = !DILocation(line: 4, column: 40, scope: !4) +// CHECK:STDOUT: !12 = distinct !DISubprogram(name: "ImplicitWidenUnsigned", linkageName: "_CImplicitWidenUnsigned.Main", scope: null, file: !3, line: 5, type: !13, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !17) +// CHECK:STDOUT: !13 = !DISubroutineType(types: !14) +// CHECK:STDOUT: !14 = !{!15, !16} +// CHECK:STDOUT: !15 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_unsigned) +// CHECK:STDOUT: !16 = !DIBasicType(name: "int", size: 8, encoding: DW_ATE_unsigned) +// CHECK:STDOUT: !17 = !{!18} +// CHECK:STDOUT: !18 = !DILocalVariable(arg: 1, scope: !12, type: !16) +// CHECK:STDOUT: !19 = !DILocation(line: 5, column: 42, scope: !12) +// CHECK:STDOUT: !20 = distinct !DISubprogram(name: "ImplicitWidenUnsignedToSigned", linkageName: "_CImplicitWidenUnsignedToSigned.Main", scope: null, file: !3, line: 6, type: !21, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !23) +// CHECK:STDOUT: !21 = !DISubroutineType(types: !22) +// CHECK:STDOUT: !22 = !{!7, !16} +// CHECK:STDOUT: !23 = !{!24} +// CHECK:STDOUT: !24 = !DILocalVariable(arg: 1, scope: !20, type: !16) +// CHECK:STDOUT: !25 = !DILocation(line: 6, column: 50, scope: !20) +// CHECK:STDOUT: !26 = distinct !DISubprogram(name: "ImplicitWidenCustom", linkageName: "_CImplicitWidenCustom.Main", scope: null, file: !3, line: 7, type: !27, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !31) +// CHECK:STDOUT: !27 = !DISubroutineType(types: !28) +// CHECK:STDOUT: !28 = !{!29, !30} +// CHECK:STDOUT: !29 = !DIBasicType(name: "int", size: 5, encoding: DW_ATE_signed) +// CHECK:STDOUT: !30 = !DIBasicType(name: "int", size: 4, encoding: DW_ATE_signed) +// CHECK:STDOUT: !31 = !{!32} +// CHECK:STDOUT: !32 = !DILocalVariable(arg: 1, scope: !26, type: !30) +// CHECK:STDOUT: !33 = !DILocation(line: 7, column: 57, scope: !26) +// CHECK:STDOUT: !34 = distinct !DISubprogram(name: "ImplicitWidenUnsignedCustom", linkageName: "_CImplicitWidenUnsignedCustom.Main", scope: null, file: !3, line: 8, type: !35, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !39) +// CHECK:STDOUT: !35 = !DISubroutineType(types: !36) +// CHECK:STDOUT: !36 = !{!37, !38} +// CHECK:STDOUT: !37 = !DIBasicType(name: "int", size: 5, encoding: DW_ATE_unsigned) +// CHECK:STDOUT: !38 = !DIBasicType(name: "int", size: 4, encoding: DW_ATE_unsigned) +// CHECK:STDOUT: !39 = !{!40} +// CHECK:STDOUT: !40 = !DILocalVariable(arg: 1, scope: !34, type: !38) +// CHECK:STDOUT: !41 = !DILocation(line: 8, column: 67, scope: !34) +// CHECK:STDOUT: !42 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.272fc3e88346d0d9:ImplicitAs.d993a5132e000405.Core.aa7228341bdcca99", scope: null, file: !43, line: 59, type: !5, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !44) +// CHECK:STDOUT: !43 = !DIFile(filename: "{{.*}}/prelude/types/int.carbon", directory: "") +// CHECK:STDOUT: !44 = !{!45} +// CHECK:STDOUT: !45 = !DILocalVariable(arg: 1, scope: !42, type: !8) +// CHECK:STDOUT: !46 = !DILocation(line: 61, column: 17, scope: !42) +// CHECK:STDOUT: !47 = !DILocation(line: 61, column: 12, scope: !42) +// CHECK:STDOUT: !48 = !DILocation(line: 61, column: 5, scope: !42) +// CHECK:STDOUT: !49 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.UInt.9452f4c51951679b.Core:ImplicitAs.952fa4f2c764f083.Core.0e306488ea9f63ef", scope: null, file: !50, line: 83, type: !13, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !51) +// CHECK:STDOUT: !50 = !DIFile(filename: "{{.*}}/prelude/types/uint.carbon", directory: "") +// CHECK:STDOUT: !51 = !{!52} +// CHECK:STDOUT: !52 = !DILocalVariable(arg: 1, scope: !49, type: !16) +// CHECK:STDOUT: !53 = !DILocation(line: 84, column: 12, scope: !49) +// CHECK:STDOUT: !54 = !DILocation(line: 84, column: 5, scope: !49) +// CHECK:STDOUT: !55 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.UInt.9452f4c51951679b.Core:ImplicitAs.952fa4f2c764f083.Core.0237a74cabc89c74", scope: null, file: !50, line: 83, type: !21, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !56) +// CHECK:STDOUT: !56 = !{!57} +// CHECK:STDOUT: !57 = !DILocalVariable(arg: 1, scope: !55, type: !16) +// CHECK:STDOUT: !58 = !DILocation(line: 84, column: 12, scope: !55) +// CHECK:STDOUT: !59 = !DILocation(line: 84, column: 5, scope: !55) +// CHECK:STDOUT: !60 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.272fc3e88346d0d9:ImplicitAs.d993a5132e000405.Core.61459d64876d7c49", scope: null, file: !43, line: 59, type: !27, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !61) +// CHECK:STDOUT: !61 = !{!62} +// CHECK:STDOUT: !62 = !DILocalVariable(arg: 1, scope: !60, type: !30) +// CHECK:STDOUT: !63 = !DILocation(line: 61, column: 17, scope: !60) +// CHECK:STDOUT: !64 = !DILocation(line: 61, column: 12, scope: !60) +// CHECK:STDOUT: !65 = !DILocation(line: 61, column: 5, scope: !60) +// CHECK:STDOUT: !66 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.UInt.9452f4c51951679b.Core:ImplicitAs.952fa4f2c764f083.Core.d1cbb2cbeb4d860b", scope: null, file: !50, line: 83, type: !35, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !67) +// CHECK:STDOUT: !67 = !{!68} +// CHECK:STDOUT: !68 = !DILocalVariable(arg: 1, scope: !66, type: !38) +// CHECK:STDOUT: !69 = !DILocation(line: 84, column: 12, scope: !66) +// CHECK:STDOUT: !70 = !DILocation(line: 84, column: 5, scope: !66) +// CHECK:STDOUT: !71 = distinct !DISubprogram(name: "AsInt", linkageName: "_CAsInt.Int.9452f4c51951679b.Core:AnyInt.Core.ca1ac10d3fc7c1a8", scope: null, file: !43, line: 54, type: !72, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !74) +// CHECK:STDOUT: !72 = !DISubroutineType(types: !73) +// CHECK:STDOUT: !73 = !{!8, !8} +// CHECK:STDOUT: !74 = !{!75} +// CHECK:STDOUT: !75 = !DILocalVariable(arg: 1, scope: !71, type: !8) +// CHECK:STDOUT: !76 = !DILocation(line: 54, column: 36, scope: !71) +// CHECK:STDOUT: !77 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.UInt.9452f4c51951679b.Core:FromUInt.382a8acefd0525fe.Core.081daf9d9b61e05a", scope: null, file: !50, line: 67, type: !13, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !78) +// CHECK:STDOUT: !78 = !{!79} +// CHECK:STDOUT: !79 = !DILocalVariable(arg: 1, scope: !77, type: !16) +// CHECK:STDOUT: !80 = !DILocation(line: 69, column: 17, scope: !77) +// CHECK:STDOUT: !81 = !DILocation(line: 69, column: 12, scope: !77) +// CHECK:STDOUT: !82 = !DILocation(line: 69, column: 5, scope: !77) +// CHECK:STDOUT: !83 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.Int.9452f4c51951679b.Core:FromUInt.a15ed48781b6c2b7.Core.069b661f6a62a7bd", scope: null, file: !50, line: 75, type: !21, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !84) +// CHECK:STDOUT: !84 = !{!85} +// CHECK:STDOUT: !85 = !DILocalVariable(arg: 1, scope: !83, type: !16) +// CHECK:STDOUT: !86 = !DILocation(line: 77, column: 17, scope: !83) +// CHECK:STDOUT: !87 = !DILocation(line: 77, column: 12, scope: !83) +// CHECK:STDOUT: !88 = !DILocation(line: 77, column: 5, scope: !83) +// CHECK:STDOUT: !89 = distinct !DISubprogram(name: "AsInt", linkageName: "_CAsInt.Int.9452f4c51951679b.Core:AnyInt.Core.044c7d430ddd4fd6", scope: null, file: !43, line: 54, type: !90, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !92) +// CHECK:STDOUT: !90 = !DISubroutineType(types: !91) +// CHECK:STDOUT: !91 = !{!30, !30} +// CHECK:STDOUT: !92 = !{!93} +// CHECK:STDOUT: !93 = !DILocalVariable(arg: 1, scope: !89, type: !30) +// CHECK:STDOUT: !94 = !DILocation(line: 54, column: 36, scope: !89) +// CHECK:STDOUT: !95 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.UInt.9452f4c51951679b.Core:FromUInt.382a8acefd0525fe.Core.b0c274f0050b1ce4", scope: null, file: !50, line: 67, type: !35, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !96) +// CHECK:STDOUT: !96 = !{!97} +// CHECK:STDOUT: !97 = !DILocalVariable(arg: 1, scope: !95, type: !38) +// CHECK:STDOUT: !98 = !DILocation(line: 69, column: 17, scope: !95) +// CHECK:STDOUT: !99 = !DILocation(line: 69, column: 12, scope: !95) +// CHECK:STDOUT: !100 = !DILocation(line: 69, column: 5, scope: !95) +// CHECK:STDOUT: !101 = distinct !DISubprogram(name: "AsUInt", linkageName: "_CAsUInt.UInt.9452f4c51951679b.Core:AnyUInt.Core.ca1ac10d3fc7c1a8", scope: null, file: !50, line: 55, type: !102, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !104) +// CHECK:STDOUT: !102 = !DISubroutineType(types: !103) +// CHECK:STDOUT: !103 = !{!16, !16} +// CHECK:STDOUT: !104 = !{!105} +// CHECK:STDOUT: !105 = !DILocalVariable(arg: 1, scope: !101, type: !16) +// CHECK:STDOUT: !106 = !DILocation(line: 55, column: 37, scope: !101) +// CHECK:STDOUT: !107 = distinct !DISubprogram(name: "AsUInt", linkageName: "_CAsUInt.UInt.9452f4c51951679b.Core:AnyUInt.Core.044c7d430ddd4fd6", scope: null, file: !50, line: 55, type: !108, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !110) +// CHECK:STDOUT: !108 = !DISubroutineType(types: !109) +// CHECK:STDOUT: !109 = !{!38, !38} +// CHECK:STDOUT: !110 = !{!111} +// CHECK:STDOUT: !111 = !DILocalVariable(arg: 1, scope: !107, type: !38) +// CHECK:STDOUT: !112 = !DILocation(line: 55, column: 37, scope: !107) diff --git a/toolchain/lower/testdata/primitives/optional.carbon b/toolchain/lower/testdata/primitives/optional.carbon index d559c09e4fb4..a369a33287e6 100644 --- a/toolchain/lower/testdata/primitives/optional.carbon +++ b/toolchain/lower/testdata/primitives/optional.carbon @@ -67,17 +67,17 @@ fn AddOrRemoveConst(a: i32, b: const i32) { // CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %_.var.loc25), !dbg !25 // CHECK:STDOUT: call void @"_CConvert.a44fce96e16342e7:ImplicitAs.ad22d1bbc0605210.Core.77b263a5fd240ddf"(ptr %_.var.loc25, i32 %a), !dbg !25 // CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %_.var.loc26), !dbg !26 -// CHECK:STDOUT: call void @"_CConvert.e5cf8fcbb4feaae2:ImplicitAs.0f95c9e18c91e00a.Core.acebdc79896e8fac"(ptr %_.var.loc26, i32 %a), !dbg !26 +// CHECK:STDOUT: call void @"_CConvert.e5cf8fcbb4feaae2:ImplicitAs.0f95c9e18c91e00a.Core.787d589b54a95071"(ptr %_.var.loc26, i32 %a), !dbg !26 // CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %_.var.loc27), !dbg !27 -// CHECK:STDOUT: call void @"_CConvert.a44fce96e16342e7:ImplicitAs.ad22d1bbc0605210.Core.1a1590d9059e7de0"(ptr %_.var.loc27, i32 %a), !dbg !27 +// CHECK:STDOUT: call void @"_CConvert.a44fce96e16342e7:ImplicitAs.ad22d1bbc0605210.Core.25fb32d66f981ccd"(ptr %_.var.loc27, i32 %a), !dbg !27 // CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %_.var.loc28), !dbg !28 // CHECK:STDOUT: call void @"_CConvert.17f42c13d842b71d:ImplicitAs.eb057aa32837c84e.Core.77b263a5fd240ddf"(ptr %_.var.loc28, i32 %b), !dbg !28 // CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %_.var.loc29), !dbg !29 // CHECK:STDOUT: call void @"_CConvert.17f42c13d842b71d:ImplicitAs.eb057aa32837c84e.Core.693532dcb04bf6dc"(ptr %_.var.loc29, i32 %b), !dbg !29 // CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %_.var.loc30), !dbg !30 -// CHECK:STDOUT: call void @"_CConvert.17f42c13d842b71d:ImplicitAs.eb057aa32837c84e.Core.1a1590d9059e7de0"(ptr %_.var.loc30, i32 %b), !dbg !30 +// CHECK:STDOUT: call void @"_CConvert.17f42c13d842b71d:ImplicitAs.eb057aa32837c84e.Core.25fb32d66f981ccd"(ptr %_.var.loc30, i32 %b), !dbg !30 // CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %_.var.loc31), !dbg !31 -// CHECK:STDOUT: call void @"_CConvert.17f42c13d842b71d:ImplicitAs.eb057aa32837c84e.Core.2e7d01f168fff135"(ptr %_.var.loc31, i32 %b), !dbg !31 +// CHECK:STDOUT: call void @"_CConvert.17f42c13d842b71d:ImplicitAs.eb057aa32837c84e.Core.1c991c9fdfba671f"(ptr %_.var.loc31, i32 %b), !dbg !31 // CHECK:STDOUT: ret void, !dbg !32 // CHECK:STDOUT: } // CHECK:STDOUT: @@ -115,14 +115,14 @@ fn AddOrRemoveConst(a: i32, b: const i32) { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: ; Function Attrs: nounwind -// CHECK:STDOUT: define linkonce_odr void @"_CConvert.e5cf8fcbb4feaae2:ImplicitAs.0f95c9e18c91e00a.Core.acebdc79896e8fac"(ptr sret({ i32, i1 }) %return, i32 %self) #0 !dbg !62 { -// CHECK:STDOUT: call void @"_CConvert.3667eb502d1ddfa9:OptionalAs.c7a50af9bdd61b43.Core.d4040f3d74e112f2"(ptr %return, i32 %self), !dbg !65 +// CHECK:STDOUT: define linkonce_odr void @"_CConvert.e5cf8fcbb4feaae2:ImplicitAs.0f95c9e18c91e00a.Core.787d589b54a95071"(ptr sret({ i32, i1 }) %return, i32 %self) #0 !dbg !62 { +// CHECK:STDOUT: call void @"_CConvert.3667eb502d1ddfa9:OptionalAs.c7a50af9bdd61b43.Core.5d35ad54738af8e4"(ptr %return, i32 %self), !dbg !65 // CHECK:STDOUT: ret void, !dbg !66 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: ; Function Attrs: nounwind -// CHECK:STDOUT: define linkonce_odr void @"_CConvert.a44fce96e16342e7:ImplicitAs.ad22d1bbc0605210.Core.1a1590d9059e7de0"(ptr sret({ i32, i1 }) %return, i32 %self) #0 !dbg !67 { -// CHECK:STDOUT: call void @"_CConvert.e5cf8fcbb4feaae2:ImplicitAs.0f95c9e18c91e00a.Core.acebdc79896e8fac"(ptr %return, i32 %self), !dbg !70 +// CHECK:STDOUT: define linkonce_odr void @"_CConvert.a44fce96e16342e7:ImplicitAs.ad22d1bbc0605210.Core.25fb32d66f981ccd"(ptr sret({ i32, i1 }) %return, i32 %self) #0 !dbg !67 { +// CHECK:STDOUT: call void @"_CConvert.e5cf8fcbb4feaae2:ImplicitAs.0f95c9e18c91e00a.Core.787d589b54a95071"(ptr %return, i32 %self), !dbg !70 // CHECK:STDOUT: ret void, !dbg !71 // CHECK:STDOUT: } // CHECK:STDOUT: @@ -139,14 +139,14 @@ fn AddOrRemoveConst(a: i32, b: const i32) { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: ; Function Attrs: nounwind -// CHECK:STDOUT: define linkonce_odr void @"_CConvert.17f42c13d842b71d:ImplicitAs.eb057aa32837c84e.Core.1a1590d9059e7de0"(ptr sret({ i32, i1 }) %return, i32 %self) #0 !dbg !82 { -// CHECK:STDOUT: call void @"_CConvert.e5cf8fcbb4feaae2:ImplicitAs.0f95c9e18c91e00a.Core.acebdc79896e8fac"(ptr %return, i32 %self), !dbg !85 +// CHECK:STDOUT: define linkonce_odr void @"_CConvert.17f42c13d842b71d:ImplicitAs.eb057aa32837c84e.Core.25fb32d66f981ccd"(ptr sret({ i32, i1 }) %return, i32 %self) #0 !dbg !82 { +// CHECK:STDOUT: call void @"_CConvert.e5cf8fcbb4feaae2:ImplicitAs.0f95c9e18c91e00a.Core.787d589b54a95071"(ptr %return, i32 %self), !dbg !85 // CHECK:STDOUT: ret void, !dbg !86 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: ; Function Attrs: nounwind -// CHECK:STDOUT: define linkonce_odr void @"_CConvert.17f42c13d842b71d:ImplicitAs.eb057aa32837c84e.Core.2e7d01f168fff135"(ptr sret({ i32, i1 }) %return, i32 %self) #0 !dbg !87 { -// CHECK:STDOUT: call void @"_CConvert.a44fce96e16342e7:ImplicitAs.ad22d1bbc0605210.Core.1a1590d9059e7de0"(ptr %return, i32 %self), !dbg !90 +// CHECK:STDOUT: define linkonce_odr void @"_CConvert.17f42c13d842b71d:ImplicitAs.eb057aa32837c84e.Core.1c991c9fdfba671f"(ptr sret({ i32, i1 }) %return, i32 %self) #0 !dbg !87 { +// CHECK:STDOUT: call void @"_CConvert.a44fce96e16342e7:ImplicitAs.ad22d1bbc0605210.Core.25fb32d66f981ccd"(ptr %return, i32 %self), !dbg !90 // CHECK:STDOUT: ret void, !dbg !91 // CHECK:STDOUT: } // CHECK:STDOUT: @@ -176,10 +176,10 @@ fn AddOrRemoveConst(a: i32, b: const i32) { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: ; Function Attrs: nounwind -// CHECK:STDOUT: define linkonce_odr void @"_CConvert.3667eb502d1ddfa9:OptionalAs.c7a50af9bdd61b43.Core.d4040f3d74e112f2"(ptr sret({ i32, i1 }) %return, i32 %self) #0 !dbg !110 { +// CHECK:STDOUT: define linkonce_odr void @"_CConvert.3667eb502d1ddfa9:OptionalAs.c7a50af9bdd61b43.Core.5d35ad54738af8e4"(ptr sret({ i32, i1 }) %return, i32 %self) #0 !dbg !110 { // CHECK:STDOUT: %temp = alloca i32, align 4, !dbg !113 // CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %temp), !dbg !113 -// CHECK:STDOUT: %1 = call i32 @"_CConvert.a44fce96e16342e7:ImplicitAs.ad22d1bbc0605210.Core.b930bfdac0979466"(i32 %self), !dbg !113 +// CHECK:STDOUT: %1 = call i32 @"_CConvert.a44fce96e16342e7:ImplicitAs.ad22d1bbc0605210.Core.90a4f5ca3e06badd"(i32 %self), !dbg !113 // CHECK:STDOUT: store i32 %1, ptr %temp, align 4, !dbg !113 // CHECK:STDOUT: %2 = load i32, ptr %temp, align 4, !dbg !113 // CHECK:STDOUT: call void @_CSome.Optional.Core.b0246d3dd29c9210(ptr %return, i32 %2), !dbg !114 @@ -193,8 +193,8 @@ fn AddOrRemoveConst(a: i32, b: const i32) { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: ; Function Attrs: nounwind -// CHECK:STDOUT: define linkonce_odr i32 @"_CConvert.a44fce96e16342e7:ImplicitAs.ad22d1bbc0605210.Core.b930bfdac0979466"(i32 %self) #0 !dbg !121 { -// CHECK:STDOUT: %1 = call i32 @"_CConvert.14b8745117b2bc54:ImplicitAs.a9271c1e04015f9c.Core.64ccbb8e5d9a0b8e"(i32 %self), !dbg !124 +// CHECK:STDOUT: define linkonce_odr i32 @"_CConvert.a44fce96e16342e7:ImplicitAs.ad22d1bbc0605210.Core.90a4f5ca3e06badd"(i32 %self) #0 !dbg !121 { +// CHECK:STDOUT: %1 = call i32 @"_CConvert.272fc3e88346d0d9:ImplicitAs.d993a5132e000405.Core.628184612c80324d"(i32 %self), !dbg !124 // CHECK:STDOUT: ret i32 %1, !dbg !125 // CHECK:STDOUT: } // CHECK:STDOUT: @@ -214,23 +214,29 @@ fn AddOrRemoveConst(a: i32, b: const i32) { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: ; Function Attrs: nounwind -// CHECK:STDOUT: define linkonce_odr i32 @"_CConvert.14b8745117b2bc54:ImplicitAs.a9271c1e04015f9c.Core.64ccbb8e5d9a0b8e"(i32 %self) #0 !dbg !137 { -// CHECK:STDOUT: ret i32 %self, !dbg !142 +// CHECK:STDOUT: define linkonce_odr i32 @"_CConvert.272fc3e88346d0d9:ImplicitAs.d993a5132e000405.Core.628184612c80324d"(i32 %self) #0 !dbg !137 { +// CHECK:STDOUT: %1 = call i32 @"_CAsInt.Int.9452f4c51951679b.Core:AnyInt.Core.be1e879c1ad406d8"(i32 %self), !dbg !143 +// CHECK:STDOUT: ret i32 %1, !dbg !144 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: ; Function Attrs: nounwind -// CHECK:STDOUT: define linkonce_odr void @"_CSome.3e8267224c5dc9c2:OptionalStorage.Core.5325ffa2b57e13bd"(ptr sret({ i32, i1 }) %return, i32 %self) #0 !dbg !143 { -// CHECK:STDOUT: %value = getelementptr inbounds nuw { i32, i1 }, ptr %return, i32 0, i32 0, !dbg !146 -// CHECK:STDOUT: %1 = call i32 @"_COp.34e7a685d3648824:Copy.Core.64ccbb8e5d9a0b8e"(i32 %self), !dbg !147 -// CHECK:STDOUT: store i32 %1, ptr %value, align 4, !dbg !146 -// CHECK:STDOUT: %has_value = getelementptr inbounds nuw { i32, i1 }, ptr %return, i32 0, i32 1, !dbg !148 -// CHECK:STDOUT: store i8 1, ptr %has_value, align 1, !dbg !148 -// CHECK:STDOUT: ret void, !dbg !149 +// CHECK:STDOUT: define linkonce_odr void @"_CSome.3e8267224c5dc9c2:OptionalStorage.Core.5325ffa2b57e13bd"(ptr sret({ i32, i1 }) %return, i32 %self) #0 !dbg !145 { +// CHECK:STDOUT: %value = getelementptr inbounds nuw { i32, i1 }, ptr %return, i32 0, i32 0, !dbg !148 +// CHECK:STDOUT: %1 = call i32 @"_COp.34e7a685d3648824:Copy.Core.64ccbb8e5d9a0b8e"(i32 %self), !dbg !149 +// CHECK:STDOUT: store i32 %1, ptr %value, align 4, !dbg !148 +// CHECK:STDOUT: %has_value = getelementptr inbounds nuw { i32, i1 }, ptr %return, i32 0, i32 1, !dbg !150 +// CHECK:STDOUT: store i8 1, ptr %has_value, align 1, !dbg !150 +// CHECK:STDOUT: ret void, !dbg !151 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: ; Function Attrs: nounwind -// CHECK:STDOUT: define linkonce_odr i32 @"_COp.34e7a685d3648824:Copy.Core.64ccbb8e5d9a0b8e"(i32 %self) #0 !dbg !150 { -// CHECK:STDOUT: ret i32 %self, !dbg !154 +// CHECK:STDOUT: define linkonce_odr i32 @"_CAsInt.Int.9452f4c51951679b.Core:AnyInt.Core.be1e879c1ad406d8"(i32 %self) #0 !dbg !152 { +// CHECK:STDOUT: ret i32 %self, !dbg !155 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: ; Function Attrs: nounwind +// CHECK:STDOUT: define linkonce_odr i32 @"_COp.34e7a685d3648824:Copy.Core.64ccbb8e5d9a0b8e"(i32 %self) #0 !dbg !156 { +// CHECK:STDOUT: ret i32 %self, !dbg !160 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: ; uselistorder directives @@ -305,12 +311,12 @@ fn AddOrRemoveConst(a: i32, b: const i32) { // CHECK:STDOUT: !59 = !DILocalVariable(arg: 1, scope: !56, type: !20) // CHECK:STDOUT: !60 = !DILocation(line: 40, column: 45, scope: !56) // CHECK:STDOUT: !61 = !DILocation(line: 40, column: 38, scope: !56) -// CHECK:STDOUT: !62 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.e5cf8fcbb4feaae2:ImplicitAs.0f95c9e18c91e00a.Core.acebdc79896e8fac", scope: null, file: !34, line: 93, type: !45, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !63) +// CHECK:STDOUT: !62 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.e5cf8fcbb4feaae2:ImplicitAs.0f95c9e18c91e00a.Core.787d589b54a95071", scope: null, file: !34, line: 93, type: !45, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !63) // CHECK:STDOUT: !63 = !{!64} // CHECK:STDOUT: !64 = !DILocalVariable(arg: 1, scope: !62, type: !20) // CHECK:STDOUT: !65 = !DILocation(line: 94, column: 12, scope: !62) // CHECK:STDOUT: !66 = !DILocation(line: 94, column: 5, scope: !62) -// CHECK:STDOUT: !67 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.a44fce96e16342e7:ImplicitAs.ad22d1bbc0605210.Core.1a1590d9059e7de0", scope: null, file: !57, line: 40, type: !45, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !68) +// CHECK:STDOUT: !67 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.a44fce96e16342e7:ImplicitAs.ad22d1bbc0605210.Core.25fb32d66f981ccd", scope: null, file: !57, line: 40, type: !45, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !68) // CHECK:STDOUT: !68 = !{!69} // CHECK:STDOUT: !69 = !DILocalVariable(arg: 1, scope: !67, type: !20) // CHECK:STDOUT: !70 = !DILocation(line: 40, column: 45, scope: !67) @@ -325,12 +331,12 @@ fn AddOrRemoveConst(a: i32, b: const i32) { // CHECK:STDOUT: !79 = !DILocalVariable(arg: 1, scope: !77, type: !20) // CHECK:STDOUT: !80 = !DILocation(line: 44, column: 45, scope: !77) // CHECK:STDOUT: !81 = !DILocation(line: 44, column: 38, scope: !77) -// CHECK:STDOUT: !82 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.17f42c13d842b71d:ImplicitAs.eb057aa32837c84e.Core.1a1590d9059e7de0", scope: null, file: !57, line: 44, type: !45, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !83) +// CHECK:STDOUT: !82 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.17f42c13d842b71d:ImplicitAs.eb057aa32837c84e.Core.25fb32d66f981ccd", scope: null, file: !57, line: 44, type: !45, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !83) // CHECK:STDOUT: !83 = !{!84} // CHECK:STDOUT: !84 = !DILocalVariable(arg: 1, scope: !82, type: !20) // CHECK:STDOUT: !85 = !DILocation(line: 44, column: 45, scope: !82) // CHECK:STDOUT: !86 = !DILocation(line: 44, column: 38, scope: !82) -// CHECK:STDOUT: !87 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.17f42c13d842b71d:ImplicitAs.eb057aa32837c84e.Core.2e7d01f168fff135", scope: null, file: !57, line: 44, type: !45, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !88) +// CHECK:STDOUT: !87 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.17f42c13d842b71d:ImplicitAs.eb057aa32837c84e.Core.1c991c9fdfba671f", scope: null, file: !57, line: 44, type: !45, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !88) // CHECK:STDOUT: !88 = !{!89} // CHECK:STDOUT: !89 = !DILocalVariable(arg: 1, scope: !87, type: !20) // CHECK:STDOUT: !90 = !DILocation(line: 44, column: 45, scope: !87) @@ -353,7 +359,7 @@ fn AddOrRemoveConst(a: i32, b: const i32) { // CHECK:STDOUT: !107 = distinct !DISubprogram(name: "None", linkageName: "_CNone.3e8267224c5dc9c2:OptionalStorage.Core.bfb441135f07cbe1", scope: null, file: !34, line: 110, type: !52, spFlags: DISPFlagDefinition, unit: !2) // CHECK:STDOUT: !108 = !DILocation(line: 112, column: 5, scope: !107) // CHECK:STDOUT: !109 = !DILocation(line: 113, column: 5, scope: !107) -// CHECK:STDOUT: !110 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.3667eb502d1ddfa9:OptionalAs.c7a50af9bdd61b43.Core.d4040f3d74e112f2", scope: null, file: !34, line: 75, type: !45, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !111) +// CHECK:STDOUT: !110 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.3667eb502d1ddfa9:OptionalAs.c7a50af9bdd61b43.Core.5d35ad54738af8e4", scope: null, file: !34, line: 75, type: !45, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !111) // CHECK:STDOUT: !111 = !{!112} // CHECK:STDOUT: !112 = !DILocalVariable(arg: 1, scope: !110, type: !20) // CHECK:STDOUT: !113 = !DILocation(line: 76, column: 29, scope: !110) @@ -364,7 +370,7 @@ fn AddOrRemoveConst(a: i32, b: const i32) { // CHECK:STDOUT: !118 = !DILocalVariable(arg: 1, scope: !116, type: !20) // CHECK:STDOUT: !119 = !DILocation(line: 30, column: 12, scope: !116) // CHECK:STDOUT: !120 = !DILocation(line: 30, column: 5, scope: !116) -// CHECK:STDOUT: !121 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.a44fce96e16342e7:ImplicitAs.ad22d1bbc0605210.Core.b930bfdac0979466", scope: null, file: !57, line: 40, type: !45, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !122) +// CHECK:STDOUT: !121 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.a44fce96e16342e7:ImplicitAs.ad22d1bbc0605210.Core.90a4f5ca3e06badd", scope: null, file: !57, line: 40, type: !45, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !122) // CHECK:STDOUT: !122 = !{!123} // CHECK:STDOUT: !123 = !DILocalVariable(arg: 1, scope: !121, type: !20) // CHECK:STDOUT: !124 = !DILocation(line: 40, column: 45, scope: !121) @@ -380,21 +386,27 @@ fn AddOrRemoveConst(a: i32, b: const i32) { // CHECK:STDOUT: !134 = !DILocation(line: 119, column: 5, scope: !131) // CHECK:STDOUT: !135 = !DILocation(line: 120, column: 5, scope: !131) // CHECK:STDOUT: !136 = !DILocation(line: 121, column: 5, scope: !131) -// CHECK:STDOUT: !137 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.14b8745117b2bc54:ImplicitAs.a9271c1e04015f9c.Core.64ccbb8e5d9a0b8e", scope: null, file: !57, line: 35, type: !138, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !140) -// CHECK:STDOUT: !138 = !DISubroutineType(types: !139) -// CHECK:STDOUT: !139 = !{!20, !20} -// CHECK:STDOUT: !140 = !{!141} -// CHECK:STDOUT: !141 = !DILocalVariable(arg: 1, scope: !137, type: !20) -// CHECK:STDOUT: !142 = !DILocation(line: 35, column: 38, scope: !137) -// CHECK:STDOUT: !143 = distinct !DISubprogram(name: "Some", linkageName: "_CSome.3e8267224c5dc9c2:OptionalStorage.Core.5325ffa2b57e13bd", scope: null, file: !34, line: 115, type: !45, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !144) -// CHECK:STDOUT: !144 = !{!145} -// CHECK:STDOUT: !145 = !DILocalVariable(arg: 1, scope: !143, type: !20) -// CHECK:STDOUT: !146 = !DILocation(line: 119, column: 5, scope: !143) -// CHECK:STDOUT: !147 = !DILocation(line: 119, column: 28, scope: !143) -// CHECK:STDOUT: !148 = !DILocation(line: 120, column: 5, scope: !143) -// CHECK:STDOUT: !149 = !DILocation(line: 121, column: 5, scope: !143) -// CHECK:STDOUT: !150 = distinct !DISubprogram(name: "Op", linkageName: "_COp.34e7a685d3648824:Copy.Core.64ccbb8e5d9a0b8e", scope: null, file: !151, line: 19, type: !45, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !152) -// CHECK:STDOUT: !151 = !DIFile(filename: "{{.*}}/prelude/copy.carbon", directory: "") -// CHECK:STDOUT: !152 = !{!153} -// CHECK:STDOUT: !153 = !DILocalVariable(arg: 1, scope: !150, type: !20) -// CHECK:STDOUT: !154 = !DILocation(line: 19, column: 33, scope: !150) +// CHECK:STDOUT: !137 = distinct !DISubprogram(name: "Convert", linkageName: "_CConvert.272fc3e88346d0d9:ImplicitAs.d993a5132e000405.Core.628184612c80324d", scope: null, file: !138, line: 59, type: !139, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !141) +// CHECK:STDOUT: !138 = !DIFile(filename: "{{.*}}/prelude/types/int.carbon", directory: "") +// CHECK:STDOUT: !139 = !DISubroutineType(types: !140) +// CHECK:STDOUT: !140 = !{!20, !20} +// CHECK:STDOUT: !141 = !{!142} +// CHECK:STDOUT: !142 = !DILocalVariable(arg: 1, scope: !137, type: !20) +// CHECK:STDOUT: !143 = !DILocation(line: 61, column: 17, scope: !137) +// CHECK:STDOUT: !144 = !DILocation(line: 61, column: 5, scope: !137) +// CHECK:STDOUT: !145 = distinct !DISubprogram(name: "Some", linkageName: "_CSome.3e8267224c5dc9c2:OptionalStorage.Core.5325ffa2b57e13bd", scope: null, file: !34, line: 115, type: !45, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !146) +// CHECK:STDOUT: !146 = !{!147} +// CHECK:STDOUT: !147 = !DILocalVariable(arg: 1, scope: !145, type: !20) +// CHECK:STDOUT: !148 = !DILocation(line: 119, column: 5, scope: !145) +// CHECK:STDOUT: !149 = !DILocation(line: 119, column: 28, scope: !145) +// CHECK:STDOUT: !150 = !DILocation(line: 120, column: 5, scope: !145) +// CHECK:STDOUT: !151 = !DILocation(line: 121, column: 5, scope: !145) +// CHECK:STDOUT: !152 = distinct !DISubprogram(name: "AsInt", linkageName: "_CAsInt.Int.9452f4c51951679b.Core:AnyInt.Core.be1e879c1ad406d8", scope: null, file: !138, line: 54, type: !139, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !153) +// CHECK:STDOUT: !153 = !{!154} +// CHECK:STDOUT: !154 = !DILocalVariable(arg: 1, scope: !152, type: !20) +// CHECK:STDOUT: !155 = !DILocation(line: 54, column: 36, scope: !152) +// CHECK:STDOUT: !156 = distinct !DISubprogram(name: "Op", linkageName: "_COp.34e7a685d3648824:Copy.Core.64ccbb8e5d9a0b8e", scope: null, file: !157, line: 19, type: !45, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !158) +// CHECK:STDOUT: !157 = !DIFile(filename: "{{.*}}/prelude/copy.carbon", directory: "") +// CHECK:STDOUT: !158 = !{!159} +// CHECK:STDOUT: !159 = !DILocalVariable(arg: 1, scope: !156, type: !20) +// CHECK:STDOUT: !160 = !DILocation(line: 19, column: 33, scope: !156)