Refactor CppRange interface and fix a crash exposed by doing so. (#7515)

Split up the CppRange interface into smaller parts, with the intent of
improving the diagnostic quality and making the implementation easier to
understand.

This also makes the implementation details of the CppRange machinery
private, which breaks one of the existing tests; that test is split into
two files, one which tests the low-level machinery works, and another
that tests the resulting prelude behavior.

This change exposes a crash in `where` expression handling, where we
would perform a substitution that creates a new `SpecificConstant` that
refers into a region of a generic that has never been resolved. Fix that
by resolving the definition region of a generic if eval sees a
`SpecificConstant` that refers into it. This is usually not necessary
because something else should have resolved that region first, but that
doesn't happen here.

---------

Co-authored-by: Dana Jansens <danakj@orodu.net>
This commit is contained in:
Richard Smith
2026-07-17 00:31:12 +00:00
committed by GitHub
co-authored by Dana Jansens
parent 31cc20f6e3
commit 643ab57f5a
10 changed files with 1431 additions and 954 deletions
@@ -0,0 +1,406 @@
// 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
//
// EXTRA-ARGS: --clang-arg=-std=c++20
//
// AUTOUPDATE
// TIP: To test this file alone, run:
// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/interop/cpp/impls/cpp_range_for_iterate.carbon
// TIP: To dump output, run:
// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/interop/cpp/impls/cpp_range_for_iterate.carbon
// --- cpp_range_for_iterate.carbon
package Core library "cpp_range_for_iterate";
import library "prelude/parts/bool";
interface CppRangeForIterate {
let Iterator: type;
let Sentinel: type;
// TODO: self must be ref-qualified
fn Begin(self) -> Iterator;
fn End(self) -> Sentinel;
}
interface IsRange {
let Result: bool;
}
final impl forall [T: CppRangeForIterate] T as IsRange where .Result = true {}
impl forall [T: type] T as IsRange where .Result = false {}
fn AssertIsRange(unused generic R: IsRange where .Result = true) {}
fn AssertIsNotRange(unused generic S: IsRange where .Result = false) {}
// --- methods_return_same_type.carbon
library "[[@TEST_NAME]]";
import Core library "cpp_range_for_iterate";
import Cpp inline '''c++
class MutableRange {
struct Iterator {};
public:
auto begin() -> Iterator;
auto end() -> Iterator;
};
class ConstRange {
struct Iterator {};
public:
auto begin() const -> Iterator;
auto end() const -> Iterator;
};
''';
fn Test() {
Core.AssertIsRange(Cpp.MutableRange);
Core.AssertIsRange(Cpp.ConstRange);
}
// --- methods_return_different_types.carbon
library "[[@TEST_NAME]]";
import Core library "cpp_range_for_iterate";
import Cpp inline '''c++
class MutableRangeWithSentinel {
struct Iterator {};
struct Sentinel {};
public:
auto begin() -> Iterator;
auto end() -> Sentinel;
};
class ConstRangeWithSentinel {
struct Iterator {};
struct Sentinel {};
public:
auto begin() const -> Iterator;
auto end() const -> Sentinel;
};
''';
fn Test() {
Core.AssertIsRange(Cpp.MutableRangeWithSentinel);
Core.AssertIsRange(Cpp.ConstRangeWithSentinel);
}
// --- adl_return_same_types.carbon
library "[[@TEST_NAME]]";
import Core library "cpp_range_for_iterate";
import Cpp inline '''c++
namespace N {
class ConstRange {
struct Iterator {};
public:
friend auto begin(const ConstRange&) -> Iterator;
friend auto end(const ConstRange&) -> Iterator;
};
} // namespace N
''';
fn Test() {
Core.AssertIsRange(Cpp.N.ConstRange);
}
// --- fail_todo_adl_returns_same_types_mutable.carbon
// CHECK:STDERR: fail_todo_adl_returns_same_types_mutable.carbon: error: value expression passed to reference parameter [ValueForRefParam]
// TODO: merge with adl_returns_same_types.carbon when passing.
library "[[@TEST_NAME]]";
import Core library "cpp_range_for_iterate";
import Cpp inline '''c++
namespace N {
class MutableRange {
struct Iterator {};
public:
// CHECK:STDERR: fail_todo_adl_returns_same_types_mutable.carbon:[[@LINE+11]]:34: note: initializing function parameter [InCallToFunctionParam]
// CHECK:STDERR: friend auto begin(MutableRange&) -> Iterator;
// CHECK:STDERR: ^
// CHECK:STDERR: cpp_range_for_iterate.carbon:10:3: note: while building thunk to match the signature of this function [ThunkSignature]
// CHECK:STDERR: fn Begin(self) -> Iterator;
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~
// CHECK:STDERR: cpp_range_for_iterate.carbon:21:33: note: initializing generic parameter `R` declared here [InitializingGenericParam]
// CHECK:STDERR: fn AssertIsRange(unused generic R: IsRange where .Result = true) {}
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// CHECK:STDERR:
// CHECK:STDERR: fail_todo_adl_returns_same_types_mutable.carbon: error: value expression passed to reference parameter [ValueForRefParam]
friend auto begin(MutableRange&) -> Iterator;
// CHECK:STDERR: fail_todo_adl_returns_same_types_mutable.carbon:[[@LINE+10]]:32: note: initializing function parameter [InCallToFunctionParam]
// CHECK:STDERR: friend auto end(MutableRange&) -> Iterator;
// CHECK:STDERR: ^
// CHECK:STDERR: cpp_range_for_iterate.carbon:11:3: note: while building thunk to match the signature of this function [ThunkSignature]
// CHECK:STDERR: fn End(self) -> Sentinel;
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~
// CHECK:STDERR: cpp_range_for_iterate.carbon:21:33: note: initializing generic parameter `R` declared here [InitializingGenericParam]
// CHECK:STDERR: fn AssertIsRange(unused generic R: IsRange where .Result = true) {}
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// CHECK:STDERR:
friend auto end(MutableRange&) -> Iterator;
};
} // namespace N
''';
fn Test() {
Core.AssertIsRange(Cpp.N.MutableRange);
}
// --- adl_returns_different_types.carbon
library "[[@TEST_NAME]]";
import Core library "cpp_range_for_iterate";
import Cpp inline '''c++
namespace N {
class ConstRangeWithSentinel {
struct Iterator {};
struct Sentinel {};
public:
friend auto begin(const ConstRangeWithSentinel&) -> Iterator;
friend auto end(const ConstRangeWithSentinel&) -> Sentinel;
};
} // namespace N
''';
fn Test() {
Core.AssertIsRange(Cpp.N.ConstRangeWithSentinel);
}
// --- fail_todo_adl_returns_different_types_mutable.carbon
library "[[@TEST_NAME]]";
import Core library "cpp_range_for_iterate";
import Cpp inline '''c++
namespace N {
class MutableRangeWithSentinel {
struct Iterator {
// CHECK:STDERR: fail_todo_adl_returns_different_types_mutable.carbon:[[@LINE+5]]:31: error: unknown type name 'ValueType' [CppInteropParseError]
// CHECK:STDERR: 14 | auto operator*() const -> ValueType&;
// CHECK:STDERR: | ^
// CHECK:STDERR:
// CHECK:STDERR: fail_todo_adl_returns_different_types_mutable.carbon: error: value expression passed to reference parameter [ValueForRefParam]
auto operator*() const -> ValueType&;
auto operator++() -> Iterator&;
};
struct Sentinel {
friend auto operator==(Sentinel, Iterator) -> bool;
friend auto operator!=(Sentinel, Iterator) -> bool;
};
public:
// CHECK:STDERR: fail_todo_adl_returns_different_types_mutable.carbon:[[@LINE+11]]:46: note: initializing function parameter [InCallToFunctionParam]
// CHECK:STDERR: friend auto begin(MutableRangeWithSentinel&) -> Iterator;
// CHECK:STDERR: ^
// CHECK:STDERR: cpp_range_for_iterate.carbon:10:3: note: while building thunk to match the signature of this function [ThunkSignature]
// CHECK:STDERR: fn Begin(self) -> Iterator;
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~
// CHECK:STDERR: cpp_range_for_iterate.carbon:21:33: note: initializing generic parameter `R` declared here [InitializingGenericParam]
// CHECK:STDERR: fn AssertIsRange(unused generic R: IsRange where .Result = true) {}
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// CHECK:STDERR:
// CHECK:STDERR: fail_todo_adl_returns_different_types_mutable.carbon: error: value expression passed to reference parameter [ValueForRefParam]
friend auto begin(MutableRangeWithSentinel&) -> Iterator;
// CHECK:STDERR: fail_todo_adl_returns_different_types_mutable.carbon:[[@LINE+10]]:44: note: initializing function parameter [InCallToFunctionParam]
// CHECK:STDERR: friend auto end(MutableRangeWithSentinel&) -> Sentinel;
// CHECK:STDERR: ^
// CHECK:STDERR: cpp_range_for_iterate.carbon:11:3: note: while building thunk to match the signature of this function [ThunkSignature]
// CHECK:STDERR: fn End(self) -> Sentinel;
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~
// CHECK:STDERR: cpp_range_for_iterate.carbon:21:33: note: initializing generic parameter `R` declared here [InitializingGenericParam]
// CHECK:STDERR: fn AssertIsRange(unused generic R: IsRange where .Result = true) {}
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// CHECK:STDERR:
friend auto end(MutableRangeWithSentinel&) -> Sentinel;
};
}
''';
fn Test() {
Core.AssertIsRange(Cpp.N.MutableRangeWithSentinel);
}
// --- fail_todo_adl_overloads.carbon
// CHECK:STDERR: fail_todo_adl_overloads.carbon: error: value expression passed to reference parameter [ValueForRefParam]
library "[[@TEST_NAME]]";
import Core library "cpp_range_for_iterate";
import Cpp inline '''c++
namespace N {
class MutableAndConstRange {
struct Iterator {};
struct ConstIterator {};
public:
// CHECK:STDERR: fail_todo_adl_overloads.carbon:[[@LINE+11]]:42: note: initializing function parameter [InCallToFunctionParam]
// CHECK:STDERR: friend auto begin(MutableAndConstRange&) -> Iterator;
// CHECK:STDERR: ^
// CHECK:STDERR: cpp_range_for_iterate.carbon:10:3: note: while building thunk to match the signature of this function [ThunkSignature]
// CHECK:STDERR: fn Begin(self) -> Iterator;
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~
// CHECK:STDERR: cpp_range_for_iterate.carbon:21:33: note: initializing generic parameter `R` declared here [InitializingGenericParam]
// CHECK:STDERR: fn AssertIsRange(unused generic R: IsRange where .Result = true) {}
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// CHECK:STDERR:
// CHECK:STDERR: fail_todo_adl_overloads.carbon: error: value expression passed to reference parameter [ValueForRefParam]
friend auto begin(MutableAndConstRange&) -> Iterator;
// CHECK:STDERR: fail_todo_adl_overloads.carbon:[[@LINE+10]]:40: note: initializing function parameter [InCallToFunctionParam]
// CHECK:STDERR: friend auto end(MutableAndConstRange&) -> Iterator;
// CHECK:STDERR: ^
// CHECK:STDERR: cpp_range_for_iterate.carbon:11:3: note: while building thunk to match the signature of this function [ThunkSignature]
// CHECK:STDERR: fn End(self) -> Sentinel;
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~
// CHECK:STDERR: cpp_range_for_iterate.carbon:21:33: note: initializing generic parameter `R` declared here [InitializingGenericParam]
// CHECK:STDERR: fn AssertIsRange(unused generic R: IsRange where .Result = true) {}
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// CHECK:STDERR:
friend auto end(MutableAndConstRange&) -> Iterator;
friend auto begin(const MutableAndConstRange&) -> ConstIterator;
friend auto end(const MutableAndConstRange&) -> ConstIterator;
};
}
''';
fn Test() {
Core.AssertIsRange(Cpp.N.MutableAndConstRange);
}
// --- not_ranges.carbon
library "[[@TEST_NAME]]";
import Core library "cpp_range_for_iterate";
import Cpp inline '''c++
class NoBeginEnd {};
struct NoBeginMethod {
auto end() -> int;
};
struct NoEndMethod {
auto begin() -> int;
};
struct NoBeginADL {
friend auto end(NoBeginADL) -> int;
};
struct NoEndADL {
friend auto begin(NoEndADL) -> int;
};
struct BeginMethodEndADL {
auto begin() -> int;
friend auto end(BeginMethodEndADL) -> int;
};
struct BeginADLEndMethod {
friend auto begin(BeginADLEndMethod) -> int;
auto end() -> int;
};
struct BeginFieldEndMethod {
int begin;
auto end() -> int;
};
struct BeginMethodEndField {
auto begin() -> int;
int end;
};
''';
fn Test() {
Core.AssertIsNotRange(Cpp.NoBeginEnd);
Core.AssertIsNotRange(Cpp.NoBeginMethod);
Core.AssertIsNotRange(Cpp.NoEndMethod);
Core.AssertIsNotRange(Cpp.NoBeginADL);
Core.AssertIsNotRange(Cpp.NoEndADL);
Core.AssertIsNotRange(Cpp.BeginMethodEndADL);
Core.AssertIsNotRange(Cpp.BeginADLEndMethod);
Core.AssertIsNotRange(Cpp.BeginFieldEndMethod);
Core.AssertIsNotRange(Cpp.BeginMethodEndField);
}
// --- fail_deleted.carbon
library "[[@TEST_NAME]]";
import Core library "cpp_range_for_iterate";
import Cpp inline '''c++
struct BeginMethodDeleted {
auto begin() = delete;
auto end() -> int;
};
struct EndMethodDeleted {
auto begin() -> int;
auto end() = delete;
};
struct BeginFunctionDeleted {
friend auto begin(const BeginFunctionDeleted&) = delete;
friend auto end(const BeginFunctionDeleted&) -> int;
};
struct EndFunctionDeleted {
friend auto begin(const EndFunctionDeleted&) -> int;
friend auto end(const EndFunctionDeleted&) = delete;
};
''';
fn Test() {
// CHECK:STDERR: fail_deleted.carbon:[[@LINE+10]]:47: error: attempt to use a deleted function [CppInteropParseError]
// CHECK:STDERR: 38 | Core.AssertIsNotRange(Cpp.BeginMethodDeleted);
// CHECK:STDERR: | ^
// CHECK:STDERR: fail_deleted.carbon:[[@LINE-24]]:8: note: 'begin' has been explicitly marked deleted here [CppInteropParseNote]
// CHECK:STDERR: 7 | auto begin() = delete;
// CHECK:STDERR: | ^
// CHECK:STDERR: cpp_range_for_iterate.carbon:22:36: note: initializing generic parameter `S` declared here [InitializingGenericParam]
// CHECK:STDERR: fn AssertIsNotRange(unused generic S: IsRange where .Result = false) {}
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// CHECK:STDERR:
Core.AssertIsNotRange(Cpp.BeginMethodDeleted);
// CHECK:STDERR: fail_deleted.carbon:[[@LINE+10]]:45: error: attempt to use a deleted function [CppInteropParseError]
// CHECK:STDERR: 49 | Core.AssertIsNotRange(Cpp.EndMethodDeleted);
// CHECK:STDERR: | ^
// CHECK:STDERR: fail_deleted.carbon:[[@LINE-29]]:8: note: 'end' has been explicitly marked deleted here [CppInteropParseNote]
// CHECK:STDERR: 13 | auto end() = delete;
// CHECK:STDERR: | ^
// CHECK:STDERR: cpp_range_for_iterate.carbon:22:36: note: initializing generic parameter `S` declared here [InitializingGenericParam]
// CHECK:STDERR: fn AssertIsNotRange(unused generic S: IsRange where .Result = false) {}
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// CHECK:STDERR:
Core.AssertIsNotRange(Cpp.EndMethodDeleted);
// CHECK:STDERR: fail_deleted.carbon:[[@LINE+10]]:49: error: call to deleted function 'begin' [CppInteropParseError]
// CHECK:STDERR: 60 | Core.AssertIsNotRange(Cpp.BeginFunctionDeleted);
// CHECK:STDERR: | ^
// CHECK:STDERR: fail_deleted.carbon:[[@LINE-36]]:15: note: candidate function has been explicitly deleted [CppInteropParseNote]
// CHECK:STDERR: 17 | friend auto begin(const BeginFunctionDeleted&) = delete;
// CHECK:STDERR: | ^
// CHECK:STDERR: cpp_range_for_iterate.carbon:22:36: note: initializing generic parameter `S` declared here [InitializingGenericParam]
// CHECK:STDERR: fn AssertIsNotRange(unused generic S: IsRange where .Result = false) {}
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// CHECK:STDERR:
Core.AssertIsNotRange(Cpp.BeginFunctionDeleted);
// CHECK:STDERR: fail_deleted.carbon:[[@LINE+10]]:47: error: call to deleted function 'end' [CppInteropParseError]
// CHECK:STDERR: 71 | Core.AssertIsNotRange(Cpp.EndFunctionDeleted);
// CHECK:STDERR: | ^
// CHECK:STDERR: fail_deleted.carbon:[[@LINE-41]]:15: note: candidate function has been explicitly deleted [CppInteropParseNote]
// CHECK:STDERR: 23 | friend auto end(const EndFunctionDeleted&) = delete;
// CHECK:STDERR: | ^
// CHECK:STDERR: cpp_range_for_iterate.carbon:22:36: note: initializing generic parameter `S` declared here [InitializingGenericParam]
// CHECK:STDERR: fn AssertIsNotRange(unused generic S: IsRange where .Result = false) {}
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// CHECK:STDERR:
Core.AssertIsNotRange(Cpp.EndFunctionDeleted);
}
@@ -1605,10 +1605,10 @@ fn CopyUnsignedLong() {
// CHECK:STDOUT: %T.315: %ImplicitAs.type.7eb = symbolic_binding T, 0 [symbolic]
// CHECK:STDOUT: %Cpp.long.as.EqWith.impl.NotEqual.type.21e369.1: type = fn_type @Cpp.long.as.EqWith.impl.NotEqual.1, @Cpp.long.as.EqWith.impl.5b1(%T.315) [symbolic]
// CHECK:STDOUT: %Cpp.long.as.EqWith.impl.NotEqual.385432.1: %Cpp.long.as.EqWith.impl.NotEqual.type.21e369.1 = struct_value () [symbolic]
// CHECK:STDOUT: %Cpp.long.as.EqWith.impl.NotEqual.type.21e369.2: type = fn_type @Cpp.long.as.EqWith.impl.NotEqual.2, @Cpp.long.as.EqWith.impl.5b1(%T.315) [symbolic]
// CHECK:STDOUT: %Cpp.long.as.EqWith.impl.NotEqual.385432.2: %Cpp.long.as.EqWith.impl.NotEqual.type.21e369.2 = struct_value () [symbolic]
// CHECK:STDOUT: %Cpp.long.as.EqWith.impl.Equal.type.814973.1: type = fn_type @Cpp.long.as.EqWith.impl.Equal.1, @Cpp.long.as.EqWith.impl.5b1(%T.315) [symbolic]
// CHECK:STDOUT: %Cpp.long.as.EqWith.impl.Equal.4a8971.1: %Cpp.long.as.EqWith.impl.Equal.type.814973.1 = struct_value () [symbolic]
// CHECK:STDOUT: %Cpp.long.as.EqWith.impl.NotEqual.type.21e369.2: type = fn_type @Cpp.long.as.EqWith.impl.NotEqual.2, @Cpp.long.as.EqWith.impl.5b1(%T.315) [symbolic]
// CHECK:STDOUT: %Cpp.long.as.EqWith.impl.NotEqual.385432.2: %Cpp.long.as.EqWith.impl.NotEqual.type.21e369.2 = struct_value () [symbolic]
// CHECK:STDOUT: %Cpp.long.as.EqWith.impl.Equal.type.814973.2: type = fn_type @Cpp.long.as.EqWith.impl.Equal.2, @Cpp.long.as.EqWith.impl.5b1(%T.315) [symbolic]
// CHECK:STDOUT: %Cpp.long.as.EqWith.impl.Equal.4a8971.2: %Cpp.long.as.EqWith.impl.Equal.type.814973.2 = struct_value () [symbolic]
// CHECK:STDOUT: %EqWith.type.aee: type = facet_type <@EqWith, @EqWith(Core.IntLiteral)> [concrete]
@@ -1639,18 +1639,18 @@ fn CopyUnsignedLong() {
// CHECK:STDOUT: %OrderedWith.type.7dc: type = facet_type <@OrderedWith, @OrderedWith(%i32)> [concrete]
// CHECK:STDOUT: %Cpp.long.as.OrderedWith.impl.GreaterOrEquivalent.type.154997.1: type = fn_type @Cpp.long.as.OrderedWith.impl.GreaterOrEquivalent.1, @Cpp.long.as.OrderedWith.impl.3fc(%T.315) [symbolic]
// CHECK:STDOUT: %Cpp.long.as.OrderedWith.impl.GreaterOrEquivalent.e4afa3.1: %Cpp.long.as.OrderedWith.impl.GreaterOrEquivalent.type.154997.1 = struct_value () [symbolic]
// CHECK:STDOUT: %Cpp.long.as.OrderedWith.impl.GreaterOrEquivalent.type.154997.2: type = fn_type @Cpp.long.as.OrderedWith.impl.GreaterOrEquivalent.2, @Cpp.long.as.OrderedWith.impl.3fc(%T.315) [symbolic]
// CHECK:STDOUT: %Cpp.long.as.OrderedWith.impl.GreaterOrEquivalent.e4afa3.2: %Cpp.long.as.OrderedWith.impl.GreaterOrEquivalent.type.154997.2 = struct_value () [symbolic]
// CHECK:STDOUT: %Cpp.long.as.OrderedWith.impl.Greater.type.e2eef7.1: type = fn_type @Cpp.long.as.OrderedWith.impl.Greater.1, @Cpp.long.as.OrderedWith.impl.3fc(%T.315) [symbolic]
// CHECK:STDOUT: %Cpp.long.as.OrderedWith.impl.Greater.37f70d.1: %Cpp.long.as.OrderedWith.impl.Greater.type.e2eef7.1 = struct_value () [symbolic]
// CHECK:STDOUT: %Cpp.long.as.OrderedWith.impl.Greater.type.e2eef7.2: type = fn_type @Cpp.long.as.OrderedWith.impl.Greater.2, @Cpp.long.as.OrderedWith.impl.3fc(%T.315) [symbolic]
// CHECK:STDOUT: %Cpp.long.as.OrderedWith.impl.Greater.37f70d.2: %Cpp.long.as.OrderedWith.impl.Greater.type.e2eef7.2 = struct_value () [symbolic]
// CHECK:STDOUT: %Cpp.long.as.OrderedWith.impl.LessOrEquivalent.type.35cecb.1: type = fn_type @Cpp.long.as.OrderedWith.impl.LessOrEquivalent.1, @Cpp.long.as.OrderedWith.impl.3fc(%T.315) [symbolic]
// CHECK:STDOUT: %Cpp.long.as.OrderedWith.impl.LessOrEquivalent.351d50.1: %Cpp.long.as.OrderedWith.impl.LessOrEquivalent.type.35cecb.1 = struct_value () [symbolic]
// CHECK:STDOUT: %Cpp.long.as.OrderedWith.impl.LessOrEquivalent.type.35cecb.2: type = fn_type @Cpp.long.as.OrderedWith.impl.LessOrEquivalent.2, @Cpp.long.as.OrderedWith.impl.3fc(%T.315) [symbolic]
// CHECK:STDOUT: %Cpp.long.as.OrderedWith.impl.LessOrEquivalent.351d50.2: %Cpp.long.as.OrderedWith.impl.LessOrEquivalent.type.35cecb.2 = struct_value () [symbolic]
// CHECK:STDOUT: %Cpp.long.as.OrderedWith.impl.Less.type.3ff9ca.1: type = fn_type @Cpp.long.as.OrderedWith.impl.Less.1, @Cpp.long.as.OrderedWith.impl.3fc(%T.315) [symbolic]
// CHECK:STDOUT: %Cpp.long.as.OrderedWith.impl.Less.76c9f3.1: %Cpp.long.as.OrderedWith.impl.Less.type.3ff9ca.1 = struct_value () [symbolic]
// CHECK:STDOUT: %Cpp.long.as.OrderedWith.impl.GreaterOrEquivalent.type.154997.2: type = fn_type @Cpp.long.as.OrderedWith.impl.GreaterOrEquivalent.2, @Cpp.long.as.OrderedWith.impl.3fc(%T.315) [symbolic]
// CHECK:STDOUT: %Cpp.long.as.OrderedWith.impl.GreaterOrEquivalent.e4afa3.2: %Cpp.long.as.OrderedWith.impl.GreaterOrEquivalent.type.154997.2 = struct_value () [symbolic]
// CHECK:STDOUT: %Cpp.long.as.OrderedWith.impl.Greater.type.e2eef7.2: type = fn_type @Cpp.long.as.OrderedWith.impl.Greater.2, @Cpp.long.as.OrderedWith.impl.3fc(%T.315) [symbolic]
// CHECK:STDOUT: %Cpp.long.as.OrderedWith.impl.Greater.37f70d.2: %Cpp.long.as.OrderedWith.impl.Greater.type.e2eef7.2 = struct_value () [symbolic]
// CHECK:STDOUT: %Cpp.long.as.OrderedWith.impl.LessOrEquivalent.type.35cecb.2: type = fn_type @Cpp.long.as.OrderedWith.impl.LessOrEquivalent.2, @Cpp.long.as.OrderedWith.impl.3fc(%T.315) [symbolic]
// CHECK:STDOUT: %Cpp.long.as.OrderedWith.impl.LessOrEquivalent.351d50.2: %Cpp.long.as.OrderedWith.impl.LessOrEquivalent.type.35cecb.2 = struct_value () [symbolic]
// CHECK:STDOUT: %Cpp.long.as.OrderedWith.impl.Less.type.3ff9ca.2: type = fn_type @Cpp.long.as.OrderedWith.impl.Less.2, @Cpp.long.as.OrderedWith.impl.3fc(%T.315) [symbolic]
// CHECK:STDOUT: %Cpp.long.as.OrderedWith.impl.Less.76c9f3.2: %Cpp.long.as.OrderedWith.impl.Less.type.3ff9ca.2 = struct_value () [symbolic]
// CHECK:STDOUT: %OrderedWith.type.975: type = facet_type <@OrderedWith, @OrderedWith(Core.IntLiteral)> [concrete]
@@ -1752,8 +1752,8 @@ fn CopyUnsignedLong() {
// CHECK:STDOUT: %Core.import_ref.cd6: @Cpp.long.as.EqWith.impl.5b1.%Cpp.long.as.EqWith.impl.Equal.type.2 (%Cpp.long.as.EqWith.impl.Equal.type.814973.1) = import_ref Core//prelude/types/cpp/int, loc{{\d+_\d+}}, loaded [symbolic = @Cpp.long.as.EqWith.impl.5b1.%Cpp.long.as.EqWith.impl.Equal.2 (constants.%Cpp.long.as.EqWith.impl.Equal.4a8971.1)]
// CHECK:STDOUT: %Core.import_ref.40e: @Cpp.long.as.EqWith.impl.5b1.%Cpp.long.as.EqWith.impl.NotEqual.type.2 (%Cpp.long.as.EqWith.impl.NotEqual.type.21e369.1) = import_ref Core//prelude/types/cpp/int, loc{{\d+_\d+}}, loaded [symbolic = @Cpp.long.as.EqWith.impl.5b1.%Cpp.long.as.EqWith.impl.NotEqual.2 (constants.%Cpp.long.as.EqWith.impl.NotEqual.385432.1)]
// CHECK:STDOUT: %EqWith.impl_witness_table.fc9 = impl_witness_table (%Core.import_ref.cd6, %Core.import_ref.40e), @Cpp.long.as.EqWith.impl.5b1 [concrete]
// CHECK:STDOUT: %Core.NotEqual.db5: @Cpp.long.as.EqWith.impl.5b1.%Cpp.long.as.EqWith.impl.NotEqual.type.1 (%Cpp.long.as.EqWith.impl.NotEqual.type.21e369.2) = import_ref Core//prelude/types/cpp/int, NotEqual, loaded [symbolic = @Cpp.long.as.EqWith.impl.5b1.%Cpp.long.as.EqWith.impl.NotEqual.1 (constants.%Cpp.long.as.EqWith.impl.NotEqual.385432.2)]
// CHECK:STDOUT: %Core.Equal.025: @Cpp.long.as.EqWith.impl.5b1.%Cpp.long.as.EqWith.impl.Equal.type.1 (%Cpp.long.as.EqWith.impl.Equal.type.814973.2) = import_ref Core//prelude/types/cpp/int, Equal, loaded [symbolic = @Cpp.long.as.EqWith.impl.5b1.%Cpp.long.as.EqWith.impl.Equal.1 (constants.%Cpp.long.as.EqWith.impl.Equal.4a8971.2)]
// CHECK:STDOUT: %Core.NotEqual.db5: @Cpp.long.as.EqWith.impl.5b1.%Cpp.long.as.EqWith.impl.NotEqual.type.1 (%Cpp.long.as.EqWith.impl.NotEqual.type.21e369.2) = import_ref Core//prelude/types/cpp/int, NotEqual, loaded [symbolic = @Cpp.long.as.EqWith.impl.5b1.%Cpp.long.as.EqWith.impl.NotEqual.1 (constants.%Cpp.long.as.EqWith.impl.NotEqual.385432.2)]
// CHECK:STDOUT: %Core.import_ref.06c923.2: %i32.as.ImplicitAs.impl.Convert.type = import_ref Core//prelude/types/cpp/int, loc{{\d+_\d+}}, loaded [concrete = constants.%i32.as.ImplicitAs.impl.Convert]
// CHECK:STDOUT: %ImplicitAs.impl_witness_table.a75 = impl_witness_table (%Core.import_ref.06c923.2), @i32.as.ImplicitAs.impl [concrete]
// CHECK:STDOUT: %Core.import_ref.d32f: @Cpp.long.as.OrderedWith.impl.3fc.%Cpp.long.as.OrderedWith.impl.Less.type.2 (%Cpp.long.as.OrderedWith.impl.Less.type.3ff9ca.1) = import_ref Core//prelude/types/cpp/int, loc{{\d+_\d+}}, loaded [symbolic = @Cpp.long.as.OrderedWith.impl.3fc.%Cpp.long.as.OrderedWith.impl.Less.2 (constants.%Cpp.long.as.OrderedWith.impl.Less.76c9f3.1)]
@@ -1761,10 +1761,10 @@ fn CopyUnsignedLong() {
// CHECK:STDOUT: %Core.import_ref.b5f: @Cpp.long.as.OrderedWith.impl.3fc.%Cpp.long.as.OrderedWith.impl.Greater.type.2 (%Cpp.long.as.OrderedWith.impl.Greater.type.e2eef7.1) = import_ref Core//prelude/types/cpp/int, loc{{\d+_\d+}}, loaded [symbolic = @Cpp.long.as.OrderedWith.impl.3fc.%Cpp.long.as.OrderedWith.impl.Greater.2 (constants.%Cpp.long.as.OrderedWith.impl.Greater.37f70d.1)]
// CHECK:STDOUT: %Core.import_ref.a8b: @Cpp.long.as.OrderedWith.impl.3fc.%Cpp.long.as.OrderedWith.impl.GreaterOrEquivalent.type.2 (%Cpp.long.as.OrderedWith.impl.GreaterOrEquivalent.type.154997.1) = import_ref Core//prelude/types/cpp/int, loc{{\d+_\d+}}, loaded [symbolic = @Cpp.long.as.OrderedWith.impl.3fc.%Cpp.long.as.OrderedWith.impl.GreaterOrEquivalent.2 (constants.%Cpp.long.as.OrderedWith.impl.GreaterOrEquivalent.e4afa3.1)]
// CHECK:STDOUT: %OrderedWith.impl_witness_table.41e = impl_witness_table (%Core.import_ref.d32f, %Core.import_ref.4be, %Core.import_ref.b5f, %Core.import_ref.a8b), @Cpp.long.as.OrderedWith.impl.3fc [concrete]
// CHECK:STDOUT: %Core.GreaterOrEquivalent.839: @Cpp.long.as.OrderedWith.impl.3fc.%Cpp.long.as.OrderedWith.impl.GreaterOrEquivalent.type.1 (%Cpp.long.as.OrderedWith.impl.GreaterOrEquivalent.type.154997.2) = import_ref Core//prelude/types/cpp/int, GreaterOrEquivalent, loaded [symbolic = @Cpp.long.as.OrderedWith.impl.3fc.%Cpp.long.as.OrderedWith.impl.GreaterOrEquivalent.1 (constants.%Cpp.long.as.OrderedWith.impl.GreaterOrEquivalent.e4afa3.2)]
// CHECK:STDOUT: %Core.Greater.ac9: @Cpp.long.as.OrderedWith.impl.3fc.%Cpp.long.as.OrderedWith.impl.Greater.type.1 (%Cpp.long.as.OrderedWith.impl.Greater.type.e2eef7.2) = import_ref Core//prelude/types/cpp/int, Greater, loaded [symbolic = @Cpp.long.as.OrderedWith.impl.3fc.%Cpp.long.as.OrderedWith.impl.Greater.1 (constants.%Cpp.long.as.OrderedWith.impl.Greater.37f70d.2)]
// CHECK:STDOUT: %Core.LessOrEquivalent.a62: @Cpp.long.as.OrderedWith.impl.3fc.%Cpp.long.as.OrderedWith.impl.LessOrEquivalent.type.1 (%Cpp.long.as.OrderedWith.impl.LessOrEquivalent.type.35cecb.2) = import_ref Core//prelude/types/cpp/int, LessOrEquivalent, loaded [symbolic = @Cpp.long.as.OrderedWith.impl.3fc.%Cpp.long.as.OrderedWith.impl.LessOrEquivalent.1 (constants.%Cpp.long.as.OrderedWith.impl.LessOrEquivalent.351d50.2)]
// CHECK:STDOUT: %Core.Less.a91: @Cpp.long.as.OrderedWith.impl.3fc.%Cpp.long.as.OrderedWith.impl.Less.type.1 (%Cpp.long.as.OrderedWith.impl.Less.type.3ff9ca.2) = import_ref Core//prelude/types/cpp/int, Less, loaded [symbolic = @Cpp.long.as.OrderedWith.impl.3fc.%Cpp.long.as.OrderedWith.impl.Less.1 (constants.%Cpp.long.as.OrderedWith.impl.Less.76c9f3.2)]
// CHECK:STDOUT: %Core.LessOrEquivalent.a62: @Cpp.long.as.OrderedWith.impl.3fc.%Cpp.long.as.OrderedWith.impl.LessOrEquivalent.type.1 (%Cpp.long.as.OrderedWith.impl.LessOrEquivalent.type.35cecb.2) = import_ref Core//prelude/types/cpp/int, LessOrEquivalent, loaded [symbolic = @Cpp.long.as.OrderedWith.impl.3fc.%Cpp.long.as.OrderedWith.impl.LessOrEquivalent.1 (constants.%Cpp.long.as.OrderedWith.impl.LessOrEquivalent.351d50.2)]
// CHECK:STDOUT: %Core.Greater.ac9: @Cpp.long.as.OrderedWith.impl.3fc.%Cpp.long.as.OrderedWith.impl.Greater.type.1 (%Cpp.long.as.OrderedWith.impl.Greater.type.e2eef7.2) = import_ref Core//prelude/types/cpp/int, Greater, loaded [symbolic = @Cpp.long.as.OrderedWith.impl.3fc.%Cpp.long.as.OrderedWith.impl.Greater.1 (constants.%Cpp.long.as.OrderedWith.impl.Greater.37f70d.2)]
// CHECK:STDOUT: %Core.GreaterOrEquivalent.839: @Cpp.long.as.OrderedWith.impl.3fc.%Cpp.long.as.OrderedWith.impl.GreaterOrEquivalent.type.1 (%Cpp.long.as.OrderedWith.impl.GreaterOrEquivalent.type.154997.2) = import_ref Core//prelude/types/cpp/int, GreaterOrEquivalent, loaded [symbolic = @Cpp.long.as.OrderedWith.impl.3fc.%Cpp.long.as.OrderedWith.impl.GreaterOrEquivalent.1 (constants.%Cpp.long.as.OrderedWith.impl.GreaterOrEquivalent.e4afa3.2)]
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @ComparisonsHeterogeneousLongLeftSide() {
@@ -2061,10 +2061,10 @@ fn CopyUnsignedLong() {
// CHECK:STDOUT: %T.315: %ImplicitAs.type.7eb = symbolic_binding T, 0 [symbolic]
// CHECK:STDOUT: %T.as_type.as.EqWith.impl.NotEqual.type.92df03.1: type = fn_type @T.as_type.as.EqWith.impl.NotEqual.1, @T.as_type.as.EqWith.impl.673(%T.315) [symbolic]
// CHECK:STDOUT: %T.as_type.as.EqWith.impl.NotEqual.a7a615.1: %T.as_type.as.EqWith.impl.NotEqual.type.92df03.1 = struct_value () [symbolic]
// CHECK:STDOUT: %T.as_type.as.EqWith.impl.NotEqual.type.92df03.2: type = fn_type @T.as_type.as.EqWith.impl.NotEqual.2, @T.as_type.as.EqWith.impl.673(%T.315) [symbolic]
// CHECK:STDOUT: %T.as_type.as.EqWith.impl.NotEqual.a7a615.2: %T.as_type.as.EqWith.impl.NotEqual.type.92df03.2 = struct_value () [symbolic]
// CHECK:STDOUT: %T.as_type.as.EqWith.impl.Equal.type.94a46e.1: type = fn_type @T.as_type.as.EqWith.impl.Equal.1, @T.as_type.as.EqWith.impl.673(%T.315) [symbolic]
// CHECK:STDOUT: %T.as_type.as.EqWith.impl.Equal.3fb574.1: %T.as_type.as.EqWith.impl.Equal.type.94a46e.1 = struct_value () [symbolic]
// CHECK:STDOUT: %T.as_type.as.EqWith.impl.NotEqual.type.92df03.2: type = fn_type @T.as_type.as.EqWith.impl.NotEqual.2, @T.as_type.as.EqWith.impl.673(%T.315) [symbolic]
// CHECK:STDOUT: %T.as_type.as.EqWith.impl.NotEqual.a7a615.2: %T.as_type.as.EqWith.impl.NotEqual.type.92df03.2 = struct_value () [symbolic]
// CHECK:STDOUT: %T.as_type.as.EqWith.impl.Equal.type.94a46e.2: type = fn_type @T.as_type.as.EqWith.impl.Equal.2, @T.as_type.as.EqWith.impl.673(%T.315) [symbolic]
// CHECK:STDOUT: %T.as_type.as.EqWith.impl.Equal.3fb574.2: %T.as_type.as.EqWith.impl.Equal.type.94a46e.2 = struct_value () [symbolic]
// CHECK:STDOUT: %ImplicitAs.impl_witness.f82: <witness> = impl_witness imports.%ImplicitAs.impl_witness_table.a75 [concrete]
@@ -2094,18 +2094,18 @@ fn CopyUnsignedLong() {
// CHECK:STDOUT: %OrderedWith.type.a48: type = facet_type <@OrderedWith, @OrderedWith(%Cpp.long)> [concrete]
// CHECK:STDOUT: %T.as_type.as.OrderedWith.impl.GreaterOrEquivalent.type.2225a2.1: type = fn_type @T.as_type.as.OrderedWith.impl.GreaterOrEquivalent.1, @T.as_type.as.OrderedWith.impl.821(%T.315) [symbolic]
// CHECK:STDOUT: %T.as_type.as.OrderedWith.impl.GreaterOrEquivalent.56ba82.1: %T.as_type.as.OrderedWith.impl.GreaterOrEquivalent.type.2225a2.1 = struct_value () [symbolic]
// CHECK:STDOUT: %T.as_type.as.OrderedWith.impl.GreaterOrEquivalent.type.2225a2.2: type = fn_type @T.as_type.as.OrderedWith.impl.GreaterOrEquivalent.2, @T.as_type.as.OrderedWith.impl.821(%T.315) [symbolic]
// CHECK:STDOUT: %T.as_type.as.OrderedWith.impl.GreaterOrEquivalent.56ba82.2: %T.as_type.as.OrderedWith.impl.GreaterOrEquivalent.type.2225a2.2 = struct_value () [symbolic]
// CHECK:STDOUT: %T.as_type.as.OrderedWith.impl.Greater.type.4af657.1: type = fn_type @T.as_type.as.OrderedWith.impl.Greater.1, @T.as_type.as.OrderedWith.impl.821(%T.315) [symbolic]
// CHECK:STDOUT: %T.as_type.as.OrderedWith.impl.Greater.00ebff.1: %T.as_type.as.OrderedWith.impl.Greater.type.4af657.1 = struct_value () [symbolic]
// CHECK:STDOUT: %T.as_type.as.OrderedWith.impl.Greater.type.4af657.2: type = fn_type @T.as_type.as.OrderedWith.impl.Greater.2, @T.as_type.as.OrderedWith.impl.821(%T.315) [symbolic]
// CHECK:STDOUT: %T.as_type.as.OrderedWith.impl.Greater.00ebff.2: %T.as_type.as.OrderedWith.impl.Greater.type.4af657.2 = struct_value () [symbolic]
// CHECK:STDOUT: %T.as_type.as.OrderedWith.impl.LessOrEquivalent.type.accc59.1: type = fn_type @T.as_type.as.OrderedWith.impl.LessOrEquivalent.1, @T.as_type.as.OrderedWith.impl.821(%T.315) [symbolic]
// CHECK:STDOUT: %T.as_type.as.OrderedWith.impl.LessOrEquivalent.e8206a.1: %T.as_type.as.OrderedWith.impl.LessOrEquivalent.type.accc59.1 = struct_value () [symbolic]
// CHECK:STDOUT: %T.as_type.as.OrderedWith.impl.LessOrEquivalent.type.accc59.2: type = fn_type @T.as_type.as.OrderedWith.impl.LessOrEquivalent.2, @T.as_type.as.OrderedWith.impl.821(%T.315) [symbolic]
// CHECK:STDOUT: %T.as_type.as.OrderedWith.impl.LessOrEquivalent.e8206a.2: %T.as_type.as.OrderedWith.impl.LessOrEquivalent.type.accc59.2 = struct_value () [symbolic]
// CHECK:STDOUT: %T.as_type.as.OrderedWith.impl.Less.type.62945a.1: type = fn_type @T.as_type.as.OrderedWith.impl.Less.1, @T.as_type.as.OrderedWith.impl.821(%T.315) [symbolic]
// CHECK:STDOUT: %T.as_type.as.OrderedWith.impl.Less.2ef721.1: %T.as_type.as.OrderedWith.impl.Less.type.62945a.1 = struct_value () [symbolic]
// CHECK:STDOUT: %T.as_type.as.OrderedWith.impl.GreaterOrEquivalent.type.2225a2.2: type = fn_type @T.as_type.as.OrderedWith.impl.GreaterOrEquivalent.2, @T.as_type.as.OrderedWith.impl.821(%T.315) [symbolic]
// CHECK:STDOUT: %T.as_type.as.OrderedWith.impl.GreaterOrEquivalent.56ba82.2: %T.as_type.as.OrderedWith.impl.GreaterOrEquivalent.type.2225a2.2 = struct_value () [symbolic]
// CHECK:STDOUT: %T.as_type.as.OrderedWith.impl.Greater.type.4af657.2: type = fn_type @T.as_type.as.OrderedWith.impl.Greater.2, @T.as_type.as.OrderedWith.impl.821(%T.315) [symbolic]
// CHECK:STDOUT: %T.as_type.as.OrderedWith.impl.Greater.00ebff.2: %T.as_type.as.OrderedWith.impl.Greater.type.4af657.2 = struct_value () [symbolic]
// CHECK:STDOUT: %T.as_type.as.OrderedWith.impl.LessOrEquivalent.type.accc59.2: type = fn_type @T.as_type.as.OrderedWith.impl.LessOrEquivalent.2, @T.as_type.as.OrderedWith.impl.821(%T.315) [symbolic]
// CHECK:STDOUT: %T.as_type.as.OrderedWith.impl.LessOrEquivalent.e8206a.2: %T.as_type.as.OrderedWith.impl.LessOrEquivalent.type.accc59.2 = struct_value () [symbolic]
// CHECK:STDOUT: %T.as_type.as.OrderedWith.impl.Less.type.62945a.2: type = fn_type @T.as_type.as.OrderedWith.impl.Less.2, @T.as_type.as.OrderedWith.impl.821(%T.315) [symbolic]
// CHECK:STDOUT: %T.as_type.as.OrderedWith.impl.Less.2ef721.2: %T.as_type.as.OrderedWith.impl.Less.type.62945a.2 = struct_value () [symbolic]
// CHECK:STDOUT: %OrderedWith.impl_witness.029: <witness> = impl_witness imports.%OrderedWith.impl_witness_table.969, @T.as_type.as.OrderedWith.impl.821(%ImplicitAs.facet.ce4) [concrete]
@@ -2230,8 +2230,8 @@ fn CopyUnsignedLong() {
// CHECK:STDOUT: %Core.import_ref.a8d8: @T.as_type.as.EqWith.impl.673.%T.as_type.as.EqWith.impl.Equal.type.2 (%T.as_type.as.EqWith.impl.Equal.type.94a46e.1) = import_ref Core//prelude/types/cpp/int, loc{{\d+_\d+}}, loaded [symbolic = @T.as_type.as.EqWith.impl.673.%T.as_type.as.EqWith.impl.Equal.2 (constants.%T.as_type.as.EqWith.impl.Equal.3fb574.1)]
// CHECK:STDOUT: %Core.import_ref.81b: @T.as_type.as.EqWith.impl.673.%T.as_type.as.EqWith.impl.NotEqual.type.2 (%T.as_type.as.EqWith.impl.NotEqual.type.92df03.1) = import_ref Core//prelude/types/cpp/int, loc{{\d+_\d+}}, loaded [symbolic = @T.as_type.as.EqWith.impl.673.%T.as_type.as.EqWith.impl.NotEqual.2 (constants.%T.as_type.as.EqWith.impl.NotEqual.a7a615.1)]
// CHECK:STDOUT: %EqWith.impl_witness_table.9cc = impl_witness_table (%Core.import_ref.a8d8, %Core.import_ref.81b), @T.as_type.as.EqWith.impl.673 [concrete]
// CHECK:STDOUT: %Core.NotEqual.d11: @T.as_type.as.EqWith.impl.673.%T.as_type.as.EqWith.impl.NotEqual.type.1 (%T.as_type.as.EqWith.impl.NotEqual.type.92df03.2) = import_ref Core//prelude/types/cpp/int, NotEqual, loaded [symbolic = @T.as_type.as.EqWith.impl.673.%T.as_type.as.EqWith.impl.NotEqual.1 (constants.%T.as_type.as.EqWith.impl.NotEqual.a7a615.2)]
// CHECK:STDOUT: %Core.Equal.d4c: @T.as_type.as.EqWith.impl.673.%T.as_type.as.EqWith.impl.Equal.type.1 (%T.as_type.as.EqWith.impl.Equal.type.94a46e.2) = import_ref Core//prelude/types/cpp/int, Equal, loaded [symbolic = @T.as_type.as.EqWith.impl.673.%T.as_type.as.EqWith.impl.Equal.1 (constants.%T.as_type.as.EqWith.impl.Equal.3fb574.2)]
// CHECK:STDOUT: %Core.NotEqual.d11: @T.as_type.as.EqWith.impl.673.%T.as_type.as.EqWith.impl.NotEqual.type.1 (%T.as_type.as.EqWith.impl.NotEqual.type.92df03.2) = import_ref Core//prelude/types/cpp/int, NotEqual, loaded [symbolic = @T.as_type.as.EqWith.impl.673.%T.as_type.as.EqWith.impl.NotEqual.1 (constants.%T.as_type.as.EqWith.impl.NotEqual.a7a615.2)]
// CHECK:STDOUT: %Core.import_ref.06c923.2: %i32.as.ImplicitAs.impl.Convert.type = import_ref Core//prelude/types/cpp/int, loc{{\d+_\d+}}, loaded [concrete = constants.%i32.as.ImplicitAs.impl.Convert]
// CHECK:STDOUT: %ImplicitAs.impl_witness_table.a75 = impl_witness_table (%Core.import_ref.06c923.2), @i32.as.ImplicitAs.impl [concrete]
// CHECK:STDOUT: %Core.import_ref.0c1: @T.as_type.as.OrderedWith.impl.821.%T.as_type.as.OrderedWith.impl.Less.type.2 (%T.as_type.as.OrderedWith.impl.Less.type.62945a.1) = import_ref Core//prelude/types/cpp/int, loc{{\d+_\d+}}, loaded [symbolic = @T.as_type.as.OrderedWith.impl.821.%T.as_type.as.OrderedWith.impl.Less.2 (constants.%T.as_type.as.OrderedWith.impl.Less.2ef721.1)]
@@ -2239,10 +2239,10 @@ fn CopyUnsignedLong() {
// CHECK:STDOUT: %Core.import_ref.dc8: @T.as_type.as.OrderedWith.impl.821.%T.as_type.as.OrderedWith.impl.Greater.type.2 (%T.as_type.as.OrderedWith.impl.Greater.type.4af657.1) = import_ref Core//prelude/types/cpp/int, loc{{\d+_\d+}}, loaded [symbolic = @T.as_type.as.OrderedWith.impl.821.%T.as_type.as.OrderedWith.impl.Greater.2 (constants.%T.as_type.as.OrderedWith.impl.Greater.00ebff.1)]
// CHECK:STDOUT: %Core.import_ref.fbeb: @T.as_type.as.OrderedWith.impl.821.%T.as_type.as.OrderedWith.impl.GreaterOrEquivalent.type.2 (%T.as_type.as.OrderedWith.impl.GreaterOrEquivalent.type.2225a2.1) = import_ref Core//prelude/types/cpp/int, loc{{\d+_\d+}}, loaded [symbolic = @T.as_type.as.OrderedWith.impl.821.%T.as_type.as.OrderedWith.impl.GreaterOrEquivalent.2 (constants.%T.as_type.as.OrderedWith.impl.GreaterOrEquivalent.56ba82.1)]
// CHECK:STDOUT: %OrderedWith.impl_witness_table.969 = impl_witness_table (%Core.import_ref.0c1, %Core.import_ref.f03, %Core.import_ref.dc8, %Core.import_ref.fbeb), @T.as_type.as.OrderedWith.impl.821 [concrete]
// CHECK:STDOUT: %Core.GreaterOrEquivalent.e06: @T.as_type.as.OrderedWith.impl.821.%T.as_type.as.OrderedWith.impl.GreaterOrEquivalent.type.1 (%T.as_type.as.OrderedWith.impl.GreaterOrEquivalent.type.2225a2.2) = import_ref Core//prelude/types/cpp/int, GreaterOrEquivalent, loaded [symbolic = @T.as_type.as.OrderedWith.impl.821.%T.as_type.as.OrderedWith.impl.GreaterOrEquivalent.1 (constants.%T.as_type.as.OrderedWith.impl.GreaterOrEquivalent.56ba82.2)]
// CHECK:STDOUT: %Core.Greater.0b3: @T.as_type.as.OrderedWith.impl.821.%T.as_type.as.OrderedWith.impl.Greater.type.1 (%T.as_type.as.OrderedWith.impl.Greater.type.4af657.2) = import_ref Core//prelude/types/cpp/int, Greater, loaded [symbolic = @T.as_type.as.OrderedWith.impl.821.%T.as_type.as.OrderedWith.impl.Greater.1 (constants.%T.as_type.as.OrderedWith.impl.Greater.00ebff.2)]
// CHECK:STDOUT: %Core.LessOrEquivalent.27e: @T.as_type.as.OrderedWith.impl.821.%T.as_type.as.OrderedWith.impl.LessOrEquivalent.type.1 (%T.as_type.as.OrderedWith.impl.LessOrEquivalent.type.accc59.2) = import_ref Core//prelude/types/cpp/int, LessOrEquivalent, loaded [symbolic = @T.as_type.as.OrderedWith.impl.821.%T.as_type.as.OrderedWith.impl.LessOrEquivalent.1 (constants.%T.as_type.as.OrderedWith.impl.LessOrEquivalent.e8206a.2)]
// CHECK:STDOUT: %Core.Less.2f9: @T.as_type.as.OrderedWith.impl.821.%T.as_type.as.OrderedWith.impl.Less.type.1 (%T.as_type.as.OrderedWith.impl.Less.type.62945a.2) = import_ref Core//prelude/types/cpp/int, Less, loaded [symbolic = @T.as_type.as.OrderedWith.impl.821.%T.as_type.as.OrderedWith.impl.Less.1 (constants.%T.as_type.as.OrderedWith.impl.Less.2ef721.2)]
// CHECK:STDOUT: %Core.LessOrEquivalent.27e: @T.as_type.as.OrderedWith.impl.821.%T.as_type.as.OrderedWith.impl.LessOrEquivalent.type.1 (%T.as_type.as.OrderedWith.impl.LessOrEquivalent.type.accc59.2) = import_ref Core//prelude/types/cpp/int, LessOrEquivalent, loaded [symbolic = @T.as_type.as.OrderedWith.impl.821.%T.as_type.as.OrderedWith.impl.LessOrEquivalent.1 (constants.%T.as_type.as.OrderedWith.impl.LessOrEquivalent.e8206a.2)]
// CHECK:STDOUT: %Core.Greater.0b3: @T.as_type.as.OrderedWith.impl.821.%T.as_type.as.OrderedWith.impl.Greater.type.1 (%T.as_type.as.OrderedWith.impl.Greater.type.4af657.2) = import_ref Core//prelude/types/cpp/int, Greater, loaded [symbolic = @T.as_type.as.OrderedWith.impl.821.%T.as_type.as.OrderedWith.impl.Greater.1 (constants.%T.as_type.as.OrderedWith.impl.Greater.00ebff.2)]
// CHECK:STDOUT: %Core.GreaterOrEquivalent.e06: @T.as_type.as.OrderedWith.impl.821.%T.as_type.as.OrderedWith.impl.GreaterOrEquivalent.type.1 (%T.as_type.as.OrderedWith.impl.GreaterOrEquivalent.type.2225a2.2) = import_ref Core//prelude/types/cpp/int, GreaterOrEquivalent, loaded [symbolic = @T.as_type.as.OrderedWith.impl.821.%T.as_type.as.OrderedWith.impl.GreaterOrEquivalent.1 (constants.%T.as_type.as.OrderedWith.impl.GreaterOrEquivalent.56ba82.2)]
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @ComparisonsHeterogeneousLongRightSide() {
@@ -1530,10 +1530,10 @@ fn CopyUnsignedLongLong() {
// CHECK:STDOUT: %T.bf2: %ImplicitAs.type.0ec = symbolic_binding T, 0 [symbolic]
// CHECK:STDOUT: %Cpp.long_long.as.EqWith.impl.NotEqual.type.b639b1.1: type = fn_type @Cpp.long_long.as.EqWith.impl.NotEqual.1, @Cpp.long_long.as.EqWith.impl.600(%T.bf2) [symbolic]
// CHECK:STDOUT: %Cpp.long_long.as.EqWith.impl.NotEqual.4b5f60.1: %Cpp.long_long.as.EqWith.impl.NotEqual.type.b639b1.1 = struct_value () [symbolic]
// CHECK:STDOUT: %Cpp.long_long.as.EqWith.impl.NotEqual.type.b639b1.2: type = fn_type @Cpp.long_long.as.EqWith.impl.NotEqual.2, @Cpp.long_long.as.EqWith.impl.600(%T.bf2) [symbolic]
// CHECK:STDOUT: %Cpp.long_long.as.EqWith.impl.NotEqual.4b5f60.2: %Cpp.long_long.as.EqWith.impl.NotEqual.type.b639b1.2 = struct_value () [symbolic]
// CHECK:STDOUT: %Cpp.long_long.as.EqWith.impl.Equal.type.f2c091.1: type = fn_type @Cpp.long_long.as.EqWith.impl.Equal.1, @Cpp.long_long.as.EqWith.impl.600(%T.bf2) [symbolic]
// CHECK:STDOUT: %Cpp.long_long.as.EqWith.impl.Equal.ec6d64.1: %Cpp.long_long.as.EqWith.impl.Equal.type.f2c091.1 = struct_value () [symbolic]
// CHECK:STDOUT: %Cpp.long_long.as.EqWith.impl.NotEqual.type.b639b1.2: type = fn_type @Cpp.long_long.as.EqWith.impl.NotEqual.2, @Cpp.long_long.as.EqWith.impl.600(%T.bf2) [symbolic]
// CHECK:STDOUT: %Cpp.long_long.as.EqWith.impl.NotEqual.4b5f60.2: %Cpp.long_long.as.EqWith.impl.NotEqual.type.b639b1.2 = struct_value () [symbolic]
// CHECK:STDOUT: %Cpp.long_long.as.EqWith.impl.Equal.type.f2c091.2: type = fn_type @Cpp.long_long.as.EqWith.impl.Equal.2, @Cpp.long_long.as.EqWith.impl.600(%T.bf2) [symbolic]
// CHECK:STDOUT: %Cpp.long_long.as.EqWith.impl.Equal.ec6d64.2: %Cpp.long_long.as.EqWith.impl.Equal.type.f2c091.2 = struct_value () [symbolic]
// CHECK:STDOUT: %EqWith.type.aee: type = facet_type <@EqWith, @EqWith(Core.IntLiteral)> [concrete]
@@ -1564,18 +1564,18 @@ fn CopyUnsignedLongLong() {
// CHECK:STDOUT: %OrderedWith.type.af1: type = facet_type <@OrderedWith, @OrderedWith(%i64)> [concrete]
// CHECK:STDOUT: %Cpp.long_long.as.OrderedWith.impl.GreaterOrEquivalent.type.362d6d.1: type = fn_type @Cpp.long_long.as.OrderedWith.impl.GreaterOrEquivalent.1, @Cpp.long_long.as.OrderedWith.impl.deb(%T.bf2) [symbolic]
// CHECK:STDOUT: %Cpp.long_long.as.OrderedWith.impl.GreaterOrEquivalent.c812d5.1: %Cpp.long_long.as.OrderedWith.impl.GreaterOrEquivalent.type.362d6d.1 = struct_value () [symbolic]
// CHECK:STDOUT: %Cpp.long_long.as.OrderedWith.impl.GreaterOrEquivalent.type.362d6d.2: type = fn_type @Cpp.long_long.as.OrderedWith.impl.GreaterOrEquivalent.2, @Cpp.long_long.as.OrderedWith.impl.deb(%T.bf2) [symbolic]
// CHECK:STDOUT: %Cpp.long_long.as.OrderedWith.impl.GreaterOrEquivalent.c812d5.2: %Cpp.long_long.as.OrderedWith.impl.GreaterOrEquivalent.type.362d6d.2 = struct_value () [symbolic]
// CHECK:STDOUT: %Cpp.long_long.as.OrderedWith.impl.Greater.type.9c33c6.1: type = fn_type @Cpp.long_long.as.OrderedWith.impl.Greater.1, @Cpp.long_long.as.OrderedWith.impl.deb(%T.bf2) [symbolic]
// CHECK:STDOUT: %Cpp.long_long.as.OrderedWith.impl.Greater.692f01.1: %Cpp.long_long.as.OrderedWith.impl.Greater.type.9c33c6.1 = struct_value () [symbolic]
// CHECK:STDOUT: %Cpp.long_long.as.OrderedWith.impl.Greater.type.9c33c6.2: type = fn_type @Cpp.long_long.as.OrderedWith.impl.Greater.2, @Cpp.long_long.as.OrderedWith.impl.deb(%T.bf2) [symbolic]
// CHECK:STDOUT: %Cpp.long_long.as.OrderedWith.impl.Greater.692f01.2: %Cpp.long_long.as.OrderedWith.impl.Greater.type.9c33c6.2 = struct_value () [symbolic]
// CHECK:STDOUT: %Cpp.long_long.as.OrderedWith.impl.LessOrEquivalent.type.7ff5fb.1: type = fn_type @Cpp.long_long.as.OrderedWith.impl.LessOrEquivalent.1, @Cpp.long_long.as.OrderedWith.impl.deb(%T.bf2) [symbolic]
// CHECK:STDOUT: %Cpp.long_long.as.OrderedWith.impl.LessOrEquivalent.33bdbc.1: %Cpp.long_long.as.OrderedWith.impl.LessOrEquivalent.type.7ff5fb.1 = struct_value () [symbolic]
// CHECK:STDOUT: %Cpp.long_long.as.OrderedWith.impl.LessOrEquivalent.type.7ff5fb.2: type = fn_type @Cpp.long_long.as.OrderedWith.impl.LessOrEquivalent.2, @Cpp.long_long.as.OrderedWith.impl.deb(%T.bf2) [symbolic]
// CHECK:STDOUT: %Cpp.long_long.as.OrderedWith.impl.LessOrEquivalent.33bdbc.2: %Cpp.long_long.as.OrderedWith.impl.LessOrEquivalent.type.7ff5fb.2 = struct_value () [symbolic]
// CHECK:STDOUT: %Cpp.long_long.as.OrderedWith.impl.Less.type.a2518e.1: type = fn_type @Cpp.long_long.as.OrderedWith.impl.Less.1, @Cpp.long_long.as.OrderedWith.impl.deb(%T.bf2) [symbolic]
// CHECK:STDOUT: %Cpp.long_long.as.OrderedWith.impl.Less.0057df.1: %Cpp.long_long.as.OrderedWith.impl.Less.type.a2518e.1 = struct_value () [symbolic]
// CHECK:STDOUT: %Cpp.long_long.as.OrderedWith.impl.GreaterOrEquivalent.type.362d6d.2: type = fn_type @Cpp.long_long.as.OrderedWith.impl.GreaterOrEquivalent.2, @Cpp.long_long.as.OrderedWith.impl.deb(%T.bf2) [symbolic]
// CHECK:STDOUT: %Cpp.long_long.as.OrderedWith.impl.GreaterOrEquivalent.c812d5.2: %Cpp.long_long.as.OrderedWith.impl.GreaterOrEquivalent.type.362d6d.2 = struct_value () [symbolic]
// CHECK:STDOUT: %Cpp.long_long.as.OrderedWith.impl.Greater.type.9c33c6.2: type = fn_type @Cpp.long_long.as.OrderedWith.impl.Greater.2, @Cpp.long_long.as.OrderedWith.impl.deb(%T.bf2) [symbolic]
// CHECK:STDOUT: %Cpp.long_long.as.OrderedWith.impl.Greater.692f01.2: %Cpp.long_long.as.OrderedWith.impl.Greater.type.9c33c6.2 = struct_value () [symbolic]
// CHECK:STDOUT: %Cpp.long_long.as.OrderedWith.impl.LessOrEquivalent.type.7ff5fb.2: type = fn_type @Cpp.long_long.as.OrderedWith.impl.LessOrEquivalent.2, @Cpp.long_long.as.OrderedWith.impl.deb(%T.bf2) [symbolic]
// CHECK:STDOUT: %Cpp.long_long.as.OrderedWith.impl.LessOrEquivalent.33bdbc.2: %Cpp.long_long.as.OrderedWith.impl.LessOrEquivalent.type.7ff5fb.2 = struct_value () [symbolic]
// CHECK:STDOUT: %Cpp.long_long.as.OrderedWith.impl.Less.type.a2518e.2: type = fn_type @Cpp.long_long.as.OrderedWith.impl.Less.2, @Cpp.long_long.as.OrderedWith.impl.deb(%T.bf2) [symbolic]
// CHECK:STDOUT: %Cpp.long_long.as.OrderedWith.impl.Less.0057df.2: %Cpp.long_long.as.OrderedWith.impl.Less.type.a2518e.2 = struct_value () [symbolic]
// CHECK:STDOUT: %OrderedWith.type.975: type = facet_type <@OrderedWith, @OrderedWith(Core.IntLiteral)> [concrete]
@@ -1677,8 +1677,8 @@ fn CopyUnsignedLongLong() {
// CHECK:STDOUT: %Core.import_ref.7e1: @Cpp.long_long.as.EqWith.impl.600.%Cpp.long_long.as.EqWith.impl.Equal.type.2 (%Cpp.long_long.as.EqWith.impl.Equal.type.f2c091.1) = import_ref Core//prelude/types/cpp/int, loc{{\d+_\d+}}, loaded [symbolic = @Cpp.long_long.as.EqWith.impl.600.%Cpp.long_long.as.EqWith.impl.Equal.2 (constants.%Cpp.long_long.as.EqWith.impl.Equal.ec6d64.1)]
// CHECK:STDOUT: %Core.import_ref.ba2: @Cpp.long_long.as.EqWith.impl.600.%Cpp.long_long.as.EqWith.impl.NotEqual.type.2 (%Cpp.long_long.as.EqWith.impl.NotEqual.type.b639b1.1) = import_ref Core//prelude/types/cpp/int, loc{{\d+_\d+}}, loaded [symbolic = @Cpp.long_long.as.EqWith.impl.600.%Cpp.long_long.as.EqWith.impl.NotEqual.2 (constants.%Cpp.long_long.as.EqWith.impl.NotEqual.4b5f60.1)]
// CHECK:STDOUT: %EqWith.impl_witness_table.efb = impl_witness_table (%Core.import_ref.7e1, %Core.import_ref.ba2), @Cpp.long_long.as.EqWith.impl.600 [concrete]
// CHECK:STDOUT: %Core.NotEqual.422: @Cpp.long_long.as.EqWith.impl.600.%Cpp.long_long.as.EqWith.impl.NotEqual.type.1 (%Cpp.long_long.as.EqWith.impl.NotEqual.type.b639b1.2) = import_ref Core//prelude/types/cpp/int, NotEqual, loaded [symbolic = @Cpp.long_long.as.EqWith.impl.600.%Cpp.long_long.as.EqWith.impl.NotEqual.1 (constants.%Cpp.long_long.as.EqWith.impl.NotEqual.4b5f60.2)]
// CHECK:STDOUT: %Core.Equal.cce: @Cpp.long_long.as.EqWith.impl.600.%Cpp.long_long.as.EqWith.impl.Equal.type.1 (%Cpp.long_long.as.EqWith.impl.Equal.type.f2c091.2) = import_ref Core//prelude/types/cpp/int, Equal, loaded [symbolic = @Cpp.long_long.as.EqWith.impl.600.%Cpp.long_long.as.EqWith.impl.Equal.1 (constants.%Cpp.long_long.as.EqWith.impl.Equal.ec6d64.2)]
// CHECK:STDOUT: %Core.NotEqual.422: @Cpp.long_long.as.EqWith.impl.600.%Cpp.long_long.as.EqWith.impl.NotEqual.type.1 (%Cpp.long_long.as.EqWith.impl.NotEqual.type.b639b1.2) = import_ref Core//prelude/types/cpp/int, NotEqual, loaded [symbolic = @Cpp.long_long.as.EqWith.impl.600.%Cpp.long_long.as.EqWith.impl.NotEqual.1 (constants.%Cpp.long_long.as.EqWith.impl.NotEqual.4b5f60.2)]
// CHECK:STDOUT: %Core.import_ref.06c923.2: %i64.as.ImplicitAs.impl.Convert.type = import_ref Core//prelude/types/cpp/int, loc{{\d+_\d+}}, loaded [concrete = constants.%i64.as.ImplicitAs.impl.Convert]
// CHECK:STDOUT: %ImplicitAs.impl_witness_table.a87 = impl_witness_table (%Core.import_ref.06c923.2), @i64.as.ImplicitAs.impl [concrete]
// CHECK:STDOUT: %Core.import_ref.020: @Cpp.long_long.as.OrderedWith.impl.deb.%Cpp.long_long.as.OrderedWith.impl.Less.type.2 (%Cpp.long_long.as.OrderedWith.impl.Less.type.a2518e.1) = import_ref Core//prelude/types/cpp/int, loc{{\d+_\d+}}, loaded [symbolic = @Cpp.long_long.as.OrderedWith.impl.deb.%Cpp.long_long.as.OrderedWith.impl.Less.2 (constants.%Cpp.long_long.as.OrderedWith.impl.Less.0057df.1)]
@@ -1686,10 +1686,10 @@ fn CopyUnsignedLongLong() {
// CHECK:STDOUT: %Core.import_ref.ba3: @Cpp.long_long.as.OrderedWith.impl.deb.%Cpp.long_long.as.OrderedWith.impl.Greater.type.2 (%Cpp.long_long.as.OrderedWith.impl.Greater.type.9c33c6.1) = import_ref Core//prelude/types/cpp/int, loc{{\d+_\d+}}, loaded [symbolic = @Cpp.long_long.as.OrderedWith.impl.deb.%Cpp.long_long.as.OrderedWith.impl.Greater.2 (constants.%Cpp.long_long.as.OrderedWith.impl.Greater.692f01.1)]
// CHECK:STDOUT: %Core.import_ref.cea: @Cpp.long_long.as.OrderedWith.impl.deb.%Cpp.long_long.as.OrderedWith.impl.GreaterOrEquivalent.type.2 (%Cpp.long_long.as.OrderedWith.impl.GreaterOrEquivalent.type.362d6d.1) = import_ref Core//prelude/types/cpp/int, loc{{\d+_\d+}}, loaded [symbolic = @Cpp.long_long.as.OrderedWith.impl.deb.%Cpp.long_long.as.OrderedWith.impl.GreaterOrEquivalent.2 (constants.%Cpp.long_long.as.OrderedWith.impl.GreaterOrEquivalent.c812d5.1)]
// CHECK:STDOUT: %OrderedWith.impl_witness_table.cdc = impl_witness_table (%Core.import_ref.020, %Core.import_ref.152, %Core.import_ref.ba3, %Core.import_ref.cea), @Cpp.long_long.as.OrderedWith.impl.deb [concrete]
// CHECK:STDOUT: %Core.GreaterOrEquivalent.7ba: @Cpp.long_long.as.OrderedWith.impl.deb.%Cpp.long_long.as.OrderedWith.impl.GreaterOrEquivalent.type.1 (%Cpp.long_long.as.OrderedWith.impl.GreaterOrEquivalent.type.362d6d.2) = import_ref Core//prelude/types/cpp/int, GreaterOrEquivalent, loaded [symbolic = @Cpp.long_long.as.OrderedWith.impl.deb.%Cpp.long_long.as.OrderedWith.impl.GreaterOrEquivalent.1 (constants.%Cpp.long_long.as.OrderedWith.impl.GreaterOrEquivalent.c812d5.2)]
// CHECK:STDOUT: %Core.Greater.91c: @Cpp.long_long.as.OrderedWith.impl.deb.%Cpp.long_long.as.OrderedWith.impl.Greater.type.1 (%Cpp.long_long.as.OrderedWith.impl.Greater.type.9c33c6.2) = import_ref Core//prelude/types/cpp/int, Greater, loaded [symbolic = @Cpp.long_long.as.OrderedWith.impl.deb.%Cpp.long_long.as.OrderedWith.impl.Greater.1 (constants.%Cpp.long_long.as.OrderedWith.impl.Greater.692f01.2)]
// CHECK:STDOUT: %Core.LessOrEquivalent.211: @Cpp.long_long.as.OrderedWith.impl.deb.%Cpp.long_long.as.OrderedWith.impl.LessOrEquivalent.type.1 (%Cpp.long_long.as.OrderedWith.impl.LessOrEquivalent.type.7ff5fb.2) = import_ref Core//prelude/types/cpp/int, LessOrEquivalent, loaded [symbolic = @Cpp.long_long.as.OrderedWith.impl.deb.%Cpp.long_long.as.OrderedWith.impl.LessOrEquivalent.1 (constants.%Cpp.long_long.as.OrderedWith.impl.LessOrEquivalent.33bdbc.2)]
// CHECK:STDOUT: %Core.Less.868: @Cpp.long_long.as.OrderedWith.impl.deb.%Cpp.long_long.as.OrderedWith.impl.Less.type.1 (%Cpp.long_long.as.OrderedWith.impl.Less.type.a2518e.2) = import_ref Core//prelude/types/cpp/int, Less, loaded [symbolic = @Cpp.long_long.as.OrderedWith.impl.deb.%Cpp.long_long.as.OrderedWith.impl.Less.1 (constants.%Cpp.long_long.as.OrderedWith.impl.Less.0057df.2)]
// CHECK:STDOUT: %Core.LessOrEquivalent.211: @Cpp.long_long.as.OrderedWith.impl.deb.%Cpp.long_long.as.OrderedWith.impl.LessOrEquivalent.type.1 (%Cpp.long_long.as.OrderedWith.impl.LessOrEquivalent.type.7ff5fb.2) = import_ref Core//prelude/types/cpp/int, LessOrEquivalent, loaded [symbolic = @Cpp.long_long.as.OrderedWith.impl.deb.%Cpp.long_long.as.OrderedWith.impl.LessOrEquivalent.1 (constants.%Cpp.long_long.as.OrderedWith.impl.LessOrEquivalent.33bdbc.2)]
// CHECK:STDOUT: %Core.Greater.91c: @Cpp.long_long.as.OrderedWith.impl.deb.%Cpp.long_long.as.OrderedWith.impl.Greater.type.1 (%Cpp.long_long.as.OrderedWith.impl.Greater.type.9c33c6.2) = import_ref Core//prelude/types/cpp/int, Greater, loaded [symbolic = @Cpp.long_long.as.OrderedWith.impl.deb.%Cpp.long_long.as.OrderedWith.impl.Greater.1 (constants.%Cpp.long_long.as.OrderedWith.impl.Greater.692f01.2)]
// CHECK:STDOUT: %Core.GreaterOrEquivalent.7ba: @Cpp.long_long.as.OrderedWith.impl.deb.%Cpp.long_long.as.OrderedWith.impl.GreaterOrEquivalent.type.1 (%Cpp.long_long.as.OrderedWith.impl.GreaterOrEquivalent.type.362d6d.2) = import_ref Core//prelude/types/cpp/int, GreaterOrEquivalent, loaded [symbolic = @Cpp.long_long.as.OrderedWith.impl.deb.%Cpp.long_long.as.OrderedWith.impl.GreaterOrEquivalent.1 (constants.%Cpp.long_long.as.OrderedWith.impl.GreaterOrEquivalent.c812d5.2)]
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @ComparisonsHeterogeneousLongLongLeftSide() {
@@ -1986,10 +1986,10 @@ fn CopyUnsignedLongLong() {
// CHECK:STDOUT: %T.bf2: %ImplicitAs.type.0ec = symbolic_binding T, 0 [symbolic]
// CHECK:STDOUT: %T.as_type.as.EqWith.impl.NotEqual.type.925fdb.1: type = fn_type @T.as_type.as.EqWith.impl.NotEqual.3, @T.as_type.as.EqWith.impl.6d3(%T.bf2) [symbolic]
// CHECK:STDOUT: %T.as_type.as.EqWith.impl.NotEqual.b16a99.1: %T.as_type.as.EqWith.impl.NotEqual.type.925fdb.1 = struct_value () [symbolic]
// CHECK:STDOUT: %T.as_type.as.EqWith.impl.NotEqual.type.925fdb.2: type = fn_type @T.as_type.as.EqWith.impl.NotEqual.4, @T.as_type.as.EqWith.impl.6d3(%T.bf2) [symbolic]
// CHECK:STDOUT: %T.as_type.as.EqWith.impl.NotEqual.b16a99.2: %T.as_type.as.EqWith.impl.NotEqual.type.925fdb.2 = struct_value () [symbolic]
// CHECK:STDOUT: %T.as_type.as.EqWith.impl.Equal.type.3cb0e1.1: type = fn_type @T.as_type.as.EqWith.impl.Equal.3, @T.as_type.as.EqWith.impl.6d3(%T.bf2) [symbolic]
// CHECK:STDOUT: %T.as_type.as.EqWith.impl.Equal.a1333e.1: %T.as_type.as.EqWith.impl.Equal.type.3cb0e1.1 = struct_value () [symbolic]
// CHECK:STDOUT: %T.as_type.as.EqWith.impl.NotEqual.type.925fdb.2: type = fn_type @T.as_type.as.EqWith.impl.NotEqual.4, @T.as_type.as.EqWith.impl.6d3(%T.bf2) [symbolic]
// CHECK:STDOUT: %T.as_type.as.EqWith.impl.NotEqual.b16a99.2: %T.as_type.as.EqWith.impl.NotEqual.type.925fdb.2 = struct_value () [symbolic]
// CHECK:STDOUT: %T.as_type.as.EqWith.impl.Equal.type.3cb0e1.2: type = fn_type @T.as_type.as.EqWith.impl.Equal.4, @T.as_type.as.EqWith.impl.6d3(%T.bf2) [symbolic]
// CHECK:STDOUT: %T.as_type.as.EqWith.impl.Equal.a1333e.2: %T.as_type.as.EqWith.impl.Equal.type.3cb0e1.2 = struct_value () [symbolic]
// CHECK:STDOUT: %ImplicitAs.impl_witness.305: <witness> = impl_witness imports.%ImplicitAs.impl_witness_table.a87 [concrete]
@@ -2019,18 +2019,18 @@ fn CopyUnsignedLongLong() {
// CHECK:STDOUT: %OrderedWith.type.456: type = facet_type <@OrderedWith, @OrderedWith(%Cpp.long_long)> [concrete]
// CHECK:STDOUT: %T.as_type.as.OrderedWith.impl.GreaterOrEquivalent.type.d6724c.1: type = fn_type @T.as_type.as.OrderedWith.impl.GreaterOrEquivalent.3, @T.as_type.as.OrderedWith.impl.df2(%T.bf2) [symbolic]
// CHECK:STDOUT: %T.as_type.as.OrderedWith.impl.GreaterOrEquivalent.df5290.1: %T.as_type.as.OrderedWith.impl.GreaterOrEquivalent.type.d6724c.1 = struct_value () [symbolic]
// CHECK:STDOUT: %T.as_type.as.OrderedWith.impl.GreaterOrEquivalent.type.d6724c.2: type = fn_type @T.as_type.as.OrderedWith.impl.GreaterOrEquivalent.4, @T.as_type.as.OrderedWith.impl.df2(%T.bf2) [symbolic]
// CHECK:STDOUT: %T.as_type.as.OrderedWith.impl.GreaterOrEquivalent.df5290.2: %T.as_type.as.OrderedWith.impl.GreaterOrEquivalent.type.d6724c.2 = struct_value () [symbolic]
// CHECK:STDOUT: %T.as_type.as.OrderedWith.impl.Greater.type.4fb98a.1: type = fn_type @T.as_type.as.OrderedWith.impl.Greater.3, @T.as_type.as.OrderedWith.impl.df2(%T.bf2) [symbolic]
// CHECK:STDOUT: %T.as_type.as.OrderedWith.impl.Greater.878ae3.1: %T.as_type.as.OrderedWith.impl.Greater.type.4fb98a.1 = struct_value () [symbolic]
// CHECK:STDOUT: %T.as_type.as.OrderedWith.impl.Greater.type.4fb98a.2: type = fn_type @T.as_type.as.OrderedWith.impl.Greater.4, @T.as_type.as.OrderedWith.impl.df2(%T.bf2) [symbolic]
// CHECK:STDOUT: %T.as_type.as.OrderedWith.impl.Greater.878ae3.2: %T.as_type.as.OrderedWith.impl.Greater.type.4fb98a.2 = struct_value () [symbolic]
// CHECK:STDOUT: %T.as_type.as.OrderedWith.impl.LessOrEquivalent.type.3d985f.1: type = fn_type @T.as_type.as.OrderedWith.impl.LessOrEquivalent.3, @T.as_type.as.OrderedWith.impl.df2(%T.bf2) [symbolic]
// CHECK:STDOUT: %T.as_type.as.OrderedWith.impl.LessOrEquivalent.2cb445.1: %T.as_type.as.OrderedWith.impl.LessOrEquivalent.type.3d985f.1 = struct_value () [symbolic]
// CHECK:STDOUT: %T.as_type.as.OrderedWith.impl.LessOrEquivalent.type.3d985f.2: type = fn_type @T.as_type.as.OrderedWith.impl.LessOrEquivalent.4, @T.as_type.as.OrderedWith.impl.df2(%T.bf2) [symbolic]
// CHECK:STDOUT: %T.as_type.as.OrderedWith.impl.LessOrEquivalent.2cb445.2: %T.as_type.as.OrderedWith.impl.LessOrEquivalent.type.3d985f.2 = struct_value () [symbolic]
// CHECK:STDOUT: %T.as_type.as.OrderedWith.impl.Less.type.2daa9a.1: type = fn_type @T.as_type.as.OrderedWith.impl.Less.3, @T.as_type.as.OrderedWith.impl.df2(%T.bf2) [symbolic]
// CHECK:STDOUT: %T.as_type.as.OrderedWith.impl.Less.c37ef5.1: %T.as_type.as.OrderedWith.impl.Less.type.2daa9a.1 = struct_value () [symbolic]
// CHECK:STDOUT: %T.as_type.as.OrderedWith.impl.GreaterOrEquivalent.type.d6724c.2: type = fn_type @T.as_type.as.OrderedWith.impl.GreaterOrEquivalent.4, @T.as_type.as.OrderedWith.impl.df2(%T.bf2) [symbolic]
// CHECK:STDOUT: %T.as_type.as.OrderedWith.impl.GreaterOrEquivalent.df5290.2: %T.as_type.as.OrderedWith.impl.GreaterOrEquivalent.type.d6724c.2 = struct_value () [symbolic]
// CHECK:STDOUT: %T.as_type.as.OrderedWith.impl.Greater.type.4fb98a.2: type = fn_type @T.as_type.as.OrderedWith.impl.Greater.4, @T.as_type.as.OrderedWith.impl.df2(%T.bf2) [symbolic]
// CHECK:STDOUT: %T.as_type.as.OrderedWith.impl.Greater.878ae3.2: %T.as_type.as.OrderedWith.impl.Greater.type.4fb98a.2 = struct_value () [symbolic]
// CHECK:STDOUT: %T.as_type.as.OrderedWith.impl.LessOrEquivalent.type.3d985f.2: type = fn_type @T.as_type.as.OrderedWith.impl.LessOrEquivalent.4, @T.as_type.as.OrderedWith.impl.df2(%T.bf2) [symbolic]
// CHECK:STDOUT: %T.as_type.as.OrderedWith.impl.LessOrEquivalent.2cb445.2: %T.as_type.as.OrderedWith.impl.LessOrEquivalent.type.3d985f.2 = struct_value () [symbolic]
// CHECK:STDOUT: %T.as_type.as.OrderedWith.impl.Less.type.2daa9a.2: type = fn_type @T.as_type.as.OrderedWith.impl.Less.4, @T.as_type.as.OrderedWith.impl.df2(%T.bf2) [symbolic]
// CHECK:STDOUT: %T.as_type.as.OrderedWith.impl.Less.c37ef5.2: %T.as_type.as.OrderedWith.impl.Less.type.2daa9a.2 = struct_value () [symbolic]
// CHECK:STDOUT: %OrderedWith.impl_witness.7e3: <witness> = impl_witness imports.%OrderedWith.impl_witness_table.8b4, @T.as_type.as.OrderedWith.impl.df2(%ImplicitAs.facet.7a4) [concrete]
@@ -2155,8 +2155,8 @@ fn CopyUnsignedLongLong() {
// CHECK:STDOUT: %Core.import_ref.c48: @T.as_type.as.EqWith.impl.6d3.%T.as_type.as.EqWith.impl.Equal.type.2 (%T.as_type.as.EqWith.impl.Equal.type.3cb0e1.1) = import_ref Core//prelude/types/cpp/int, loc{{\d+_\d+}}, loaded [symbolic = @T.as_type.as.EqWith.impl.6d3.%T.as_type.as.EqWith.impl.Equal.2 (constants.%T.as_type.as.EqWith.impl.Equal.a1333e.1)]
// CHECK:STDOUT: %Core.import_ref.98d: @T.as_type.as.EqWith.impl.6d3.%T.as_type.as.EqWith.impl.NotEqual.type.2 (%T.as_type.as.EqWith.impl.NotEqual.type.925fdb.1) = import_ref Core//prelude/types/cpp/int, loc{{\d+_\d+}}, loaded [symbolic = @T.as_type.as.EqWith.impl.6d3.%T.as_type.as.EqWith.impl.NotEqual.2 (constants.%T.as_type.as.EqWith.impl.NotEqual.b16a99.1)]
// CHECK:STDOUT: %EqWith.impl_witness_table.db1 = impl_witness_table (%Core.import_ref.c48, %Core.import_ref.98d), @T.as_type.as.EqWith.impl.6d3 [concrete]
// CHECK:STDOUT: %Core.NotEqual.0b2: @T.as_type.as.EqWith.impl.6d3.%T.as_type.as.EqWith.impl.NotEqual.type.1 (%T.as_type.as.EqWith.impl.NotEqual.type.925fdb.2) = import_ref Core//prelude/types/cpp/int, NotEqual, loaded [symbolic = @T.as_type.as.EqWith.impl.6d3.%T.as_type.as.EqWith.impl.NotEqual.1 (constants.%T.as_type.as.EqWith.impl.NotEqual.b16a99.2)]
// CHECK:STDOUT: %Core.Equal.4f5: @T.as_type.as.EqWith.impl.6d3.%T.as_type.as.EqWith.impl.Equal.type.1 (%T.as_type.as.EqWith.impl.Equal.type.3cb0e1.2) = import_ref Core//prelude/types/cpp/int, Equal, loaded [symbolic = @T.as_type.as.EqWith.impl.6d3.%T.as_type.as.EqWith.impl.Equal.1 (constants.%T.as_type.as.EqWith.impl.Equal.a1333e.2)]
// CHECK:STDOUT: %Core.NotEqual.0b2: @T.as_type.as.EqWith.impl.6d3.%T.as_type.as.EqWith.impl.NotEqual.type.1 (%T.as_type.as.EqWith.impl.NotEqual.type.925fdb.2) = import_ref Core//prelude/types/cpp/int, NotEqual, loaded [symbolic = @T.as_type.as.EqWith.impl.6d3.%T.as_type.as.EqWith.impl.NotEqual.1 (constants.%T.as_type.as.EqWith.impl.NotEqual.b16a99.2)]
// CHECK:STDOUT: %Core.import_ref.06c923.2: %i64.as.ImplicitAs.impl.Convert.type = import_ref Core//prelude/types/cpp/int, loc{{\d+_\d+}}, loaded [concrete = constants.%i64.as.ImplicitAs.impl.Convert]
// CHECK:STDOUT: %ImplicitAs.impl_witness_table.a87 = impl_witness_table (%Core.import_ref.06c923.2), @i64.as.ImplicitAs.impl [concrete]
// CHECK:STDOUT: %Core.import_ref.97f: @T.as_type.as.OrderedWith.impl.df2.%T.as_type.as.OrderedWith.impl.Less.type.2 (%T.as_type.as.OrderedWith.impl.Less.type.2daa9a.1) = import_ref Core//prelude/types/cpp/int, loc{{\d+_\d+}}, loaded [symbolic = @T.as_type.as.OrderedWith.impl.df2.%T.as_type.as.OrderedWith.impl.Less.2 (constants.%T.as_type.as.OrderedWith.impl.Less.c37ef5.1)]
@@ -2164,10 +2164,10 @@ fn CopyUnsignedLongLong() {
// CHECK:STDOUT: %Core.import_ref.56a: @T.as_type.as.OrderedWith.impl.df2.%T.as_type.as.OrderedWith.impl.Greater.type.2 (%T.as_type.as.OrderedWith.impl.Greater.type.4fb98a.1) = import_ref Core//prelude/types/cpp/int, loc{{\d+_\d+}}, loaded [symbolic = @T.as_type.as.OrderedWith.impl.df2.%T.as_type.as.OrderedWith.impl.Greater.2 (constants.%T.as_type.as.OrderedWith.impl.Greater.878ae3.1)]
// CHECK:STDOUT: %Core.import_ref.b00d: @T.as_type.as.OrderedWith.impl.df2.%T.as_type.as.OrderedWith.impl.GreaterOrEquivalent.type.2 (%T.as_type.as.OrderedWith.impl.GreaterOrEquivalent.type.d6724c.1) = import_ref Core//prelude/types/cpp/int, loc{{\d+_\d+}}, loaded [symbolic = @T.as_type.as.OrderedWith.impl.df2.%T.as_type.as.OrderedWith.impl.GreaterOrEquivalent.2 (constants.%T.as_type.as.OrderedWith.impl.GreaterOrEquivalent.df5290.1)]
// CHECK:STDOUT: %OrderedWith.impl_witness_table.8b4 = impl_witness_table (%Core.import_ref.97f, %Core.import_ref.409, %Core.import_ref.56a, %Core.import_ref.b00d), @T.as_type.as.OrderedWith.impl.df2 [concrete]
// CHECK:STDOUT: %Core.GreaterOrEquivalent.8e2: @T.as_type.as.OrderedWith.impl.df2.%T.as_type.as.OrderedWith.impl.GreaterOrEquivalent.type.1 (%T.as_type.as.OrderedWith.impl.GreaterOrEquivalent.type.d6724c.2) = import_ref Core//prelude/types/cpp/int, GreaterOrEquivalent, loaded [symbolic = @T.as_type.as.OrderedWith.impl.df2.%T.as_type.as.OrderedWith.impl.GreaterOrEquivalent.1 (constants.%T.as_type.as.OrderedWith.impl.GreaterOrEquivalent.df5290.2)]
// CHECK:STDOUT: %Core.Greater.c24: @T.as_type.as.OrderedWith.impl.df2.%T.as_type.as.OrderedWith.impl.Greater.type.1 (%T.as_type.as.OrderedWith.impl.Greater.type.4fb98a.2) = import_ref Core//prelude/types/cpp/int, Greater, loaded [symbolic = @T.as_type.as.OrderedWith.impl.df2.%T.as_type.as.OrderedWith.impl.Greater.1 (constants.%T.as_type.as.OrderedWith.impl.Greater.878ae3.2)]
// CHECK:STDOUT: %Core.LessOrEquivalent.d90: @T.as_type.as.OrderedWith.impl.df2.%T.as_type.as.OrderedWith.impl.LessOrEquivalent.type.1 (%T.as_type.as.OrderedWith.impl.LessOrEquivalent.type.3d985f.2) = import_ref Core//prelude/types/cpp/int, LessOrEquivalent, loaded [symbolic = @T.as_type.as.OrderedWith.impl.df2.%T.as_type.as.OrderedWith.impl.LessOrEquivalent.1 (constants.%T.as_type.as.OrderedWith.impl.LessOrEquivalent.2cb445.2)]
// CHECK:STDOUT: %Core.Less.2d9: @T.as_type.as.OrderedWith.impl.df2.%T.as_type.as.OrderedWith.impl.Less.type.1 (%T.as_type.as.OrderedWith.impl.Less.type.2daa9a.2) = import_ref Core//prelude/types/cpp/int, Less, loaded [symbolic = @T.as_type.as.OrderedWith.impl.df2.%T.as_type.as.OrderedWith.impl.Less.1 (constants.%T.as_type.as.OrderedWith.impl.Less.c37ef5.2)]
// CHECK:STDOUT: %Core.LessOrEquivalent.d90: @T.as_type.as.OrderedWith.impl.df2.%T.as_type.as.OrderedWith.impl.LessOrEquivalent.type.1 (%T.as_type.as.OrderedWith.impl.LessOrEquivalent.type.3d985f.2) = import_ref Core//prelude/types/cpp/int, LessOrEquivalent, loaded [symbolic = @T.as_type.as.OrderedWith.impl.df2.%T.as_type.as.OrderedWith.impl.LessOrEquivalent.1 (constants.%T.as_type.as.OrderedWith.impl.LessOrEquivalent.2cb445.2)]
// CHECK:STDOUT: %Core.Greater.c24: @T.as_type.as.OrderedWith.impl.df2.%T.as_type.as.OrderedWith.impl.Greater.type.1 (%T.as_type.as.OrderedWith.impl.Greater.type.4fb98a.2) = import_ref Core//prelude/types/cpp/int, Greater, loaded [symbolic = @T.as_type.as.OrderedWith.impl.df2.%T.as_type.as.OrderedWith.impl.Greater.1 (constants.%T.as_type.as.OrderedWith.impl.Greater.878ae3.2)]
// CHECK:STDOUT: %Core.GreaterOrEquivalent.8e2: @T.as_type.as.OrderedWith.impl.df2.%T.as_type.as.OrderedWith.impl.GreaterOrEquivalent.type.1 (%T.as_type.as.OrderedWith.impl.GreaterOrEquivalent.type.d6724c.2) = import_ref Core//prelude/types/cpp/int, GreaterOrEquivalent, loaded [symbolic = @T.as_type.as.OrderedWith.impl.df2.%T.as_type.as.OrderedWith.impl.GreaterOrEquivalent.1 (constants.%T.as_type.as.OrderedWith.impl.GreaterOrEquivalent.df5290.2)]
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: fn @ComparisonsHeterogeneousLongLongRightSide() {
File diff suppressed because it is too large Load Diff