mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-05 22:02:55 +01:00
Import support for generics and specifics (#4179)
Import generics and specifics when they are referenced by imported entities. When importing a generic, we import the symbolic constants required by its eval block, and then rebuild the eval block itself given the list of constants it needs to compute. This is likely a bit less efficient than directly importing the contents of the eval block, but avoids needing to either extend the importer code to be able to import the instructions that can appear in the eval block or extend the evaluator to cope with instructions from a different `SemIR::File`. Importing a symbolic constant is unaffected, and does not yet preserve the associated generic and index within that generic, so uses of a generic from an imported IR still don't pick up values from the specific, but the improved functionality can be seen in the changes to the SemIR in the testcases.
This commit is contained in:
@@ -90,5 +90,9 @@ fn Main() -> i32 {
|
||||
// CHECK:STDOUT: return <error>
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Op[%self: %Self](%other: %Self) -> %Self;
|
||||
// CHECK:STDOUT: generic fn @Op(constants.%Self: %.4) {
|
||||
// CHECK:STDOUT: %Self: %.4 = bind_symbolic_name Self 0 [symbolic = %Self (constants.%Self)]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn[%self: %Self](%other: %Self) -> %Self;
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
|
||||
@@ -83,5 +83,9 @@ fn Main() -> i32 {
|
||||
// CHECK:STDOUT: return <error>
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Op[%self: %Self](%other: %Self) -> %Self;
|
||||
// CHECK:STDOUT: generic fn @Op(constants.%Self: %.4) {
|
||||
// CHECK:STDOUT: %Self: %.4 = bind_symbolic_name Self 0 [symbolic = %Self (constants.%Self)]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn[%self: %Self](%other: %Self) -> %Self;
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
|
||||
+11
-2
@@ -192,14 +192,23 @@ fn TestAssign(a: C*, b: C) {
|
||||
// CHECK:STDOUT: return %.loc19_14 to @impl.1.%return.var
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Op.2[%self: %Self.1](%other: %Self.1) -> %Self.1;
|
||||
// CHECK:STDOUT: generic fn @Op.2(constants.%Self.1: %.2) {
|
||||
// CHECK:STDOUT: %Self: %.2 = bind_symbolic_name Self 0 [symbolic = %Self (constants.%Self.1)]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn[%self: %Self.1](%other: %Self.1) -> %Self.1;
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Op.3[addr @impl.2.%self.loc23_14.3: %.7](@impl.2.%other.loc23_24.2: %C) {
|
||||
// CHECK:STDOUT: !entry:
|
||||
// CHECK:STDOUT: return
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Op.4[addr %self: %.8](%other: %Self.2);
|
||||
// CHECK:STDOUT: generic fn @Op.4(constants.%Self.2: %.6) {
|
||||
// CHECK:STDOUT: %Self: %.6 = bind_symbolic_name Self 0 [symbolic = %Self (constants.%Self.2)]
|
||||
// CHECK:STDOUT: %.2: type = ptr_type @Op.4.%Self (%Self.2) [symbolic = %.2 (constants.%.8)]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn[addr %self: %.8](%other: %Self.2);
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @TestOp(%a: %C, %b: %C) -> %return: %C {
|
||||
// CHECK:STDOUT: !entry:
|
||||
|
||||
@@ -192,14 +192,23 @@ fn TestAssign(a: C*, b: C) {
|
||||
// CHECK:STDOUT: return %.loc19_14 to @impl.1.%return.var
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Op.2[%self: %Self.1](%other: %Self.1) -> %Self.1;
|
||||
// CHECK:STDOUT: generic fn @Op.2(constants.%Self.1: %.2) {
|
||||
// CHECK:STDOUT: %Self: %.2 = bind_symbolic_name Self 0 [symbolic = %Self (constants.%Self.1)]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn[%self: %Self.1](%other: %Self.1) -> %Self.1;
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Op.3[addr @impl.2.%self.loc23_14.3: %.7](@impl.2.%other.loc23_24.2: %C) {
|
||||
// CHECK:STDOUT: !entry:
|
||||
// CHECK:STDOUT: return
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Op.4[addr %self: %.8](%other: %Self.2);
|
||||
// CHECK:STDOUT: generic fn @Op.4(constants.%Self.2: %.6) {
|
||||
// CHECK:STDOUT: %Self: %.6 = bind_symbolic_name Self 0 [symbolic = %Self (constants.%Self.2)]
|
||||
// CHECK:STDOUT: %.2: type = ptr_type @Op.4.%Self (%Self.2) [symbolic = %.2 (constants.%.8)]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn[addr %self: %.8](%other: %Self.2);
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @TestOp(%a: %C, %b: %C) -> %return: %C {
|
||||
// CHECK:STDOUT: !entry:
|
||||
|
||||
@@ -120,7 +120,11 @@ fn TestOp(a: C) -> C {
|
||||
// CHECK:STDOUT: return %.loc19_14 to @impl.%return.var
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Op.2[%self: %Self]() -> %Self;
|
||||
// CHECK:STDOUT: generic fn @Op.2(constants.%Self: %.2) {
|
||||
// CHECK:STDOUT: %Self: %.2 = bind_symbolic_name Self 0 [symbolic = %Self (constants.%Self)]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn[%self: %Self]() -> %Self;
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @TestOp(%a: %C) -> %return: %C {
|
||||
// CHECK:STDOUT: !entry:
|
||||
|
||||
+11
-2
@@ -192,14 +192,23 @@ fn TestAssign(a: C*, b: C) {
|
||||
// CHECK:STDOUT: return %.loc19_14 to @impl.1.%return.var
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Op.2[%self: %Self.1](%other: %Self.1) -> %Self.1;
|
||||
// CHECK:STDOUT: generic fn @Op.2(constants.%Self.1: %.2) {
|
||||
// CHECK:STDOUT: %Self: %.2 = bind_symbolic_name Self 0 [symbolic = %Self (constants.%Self.1)]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn[%self: %Self.1](%other: %Self.1) -> %Self.1;
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Op.3[addr @impl.2.%self.loc23_14.3: %.7](@impl.2.%other.loc23_24.2: %C) {
|
||||
// CHECK:STDOUT: !entry:
|
||||
// CHECK:STDOUT: return
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Op.4[addr %self: %.8](%other: %Self.2);
|
||||
// CHECK:STDOUT: generic fn @Op.4(constants.%Self.2: %.6) {
|
||||
// CHECK:STDOUT: %Self: %.6 = bind_symbolic_name Self 0 [symbolic = %Self (constants.%Self.2)]
|
||||
// CHECK:STDOUT: %.2: type = ptr_type @Op.4.%Self (%Self.2) [symbolic = %.2 (constants.%.8)]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn[addr %self: %.8](%other: %Self.2);
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @TestOp(%a: %C, %b: %C) -> %return: %C {
|
||||
// CHECK:STDOUT: !entry:
|
||||
|
||||
@@ -192,14 +192,23 @@ fn TestAssign(a: C*, b: C) {
|
||||
// CHECK:STDOUT: return %.loc19_14 to @impl.1.%return.var
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Op.2[%self: %Self.1](%other: %Self.1) -> %Self.1;
|
||||
// CHECK:STDOUT: generic fn @Op.2(constants.%Self.1: %.2) {
|
||||
// CHECK:STDOUT: %Self: %.2 = bind_symbolic_name Self 0 [symbolic = %Self (constants.%Self.1)]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn[%self: %Self.1](%other: %Self.1) -> %Self.1;
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Op.3[addr @impl.2.%self.loc23_14.3: %.7](@impl.2.%other.loc23_24.2: %C) {
|
||||
// CHECK:STDOUT: !entry:
|
||||
// CHECK:STDOUT: return
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Op.4[addr %self: %.8](%other: %Self.2);
|
||||
// CHECK:STDOUT: generic fn @Op.4(constants.%Self.2: %.6) {
|
||||
// CHECK:STDOUT: %Self: %.6 = bind_symbolic_name Self 0 [symbolic = %Self (constants.%Self.2)]
|
||||
// CHECK:STDOUT: %.2: type = ptr_type @Op.4.%Self (%Self.2) [symbolic = %.2 (constants.%.8)]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn[addr %self: %.8](%other: %Self.2);
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @TestOp(%a: %C, %b: %C) -> %return: %C {
|
||||
// CHECK:STDOUT: !entry:
|
||||
|
||||
@@ -109,7 +109,12 @@ fn TestOp() {
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Op.1[addr @impl.%self.loc18_14.3: %.3]();
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Op.2[addr %self: %.5]();
|
||||
// CHECK:STDOUT: generic fn @Op.2(constants.%Self: %.2) {
|
||||
// CHECK:STDOUT: %Self: %.2 = bind_symbolic_name Self 0 [symbolic = %Self (constants.%Self)]
|
||||
// CHECK:STDOUT: %.2: type = ptr_type @Op.2.%Self (%Self) [symbolic = %.2 (constants.%.5)]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn[addr %self: %.5]();
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @TestOp() {
|
||||
// CHECK:STDOUT: !entry:
|
||||
|
||||
+11
-2
@@ -192,14 +192,23 @@ fn TestAssign(a: C*, b: C) {
|
||||
// CHECK:STDOUT: return %.loc19_14 to @impl.1.%return.var
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Op.2[%self: %Self.1](%other: %Self.1) -> %Self.1;
|
||||
// CHECK:STDOUT: generic fn @Op.2(constants.%Self.1: %.2) {
|
||||
// CHECK:STDOUT: %Self: %.2 = bind_symbolic_name Self 0 [symbolic = %Self (constants.%Self.1)]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn[%self: %Self.1](%other: %Self.1) -> %Self.1;
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Op.3[addr @impl.2.%self.loc23_14.3: %.7](@impl.2.%other.loc23_24.2: %C) {
|
||||
// CHECK:STDOUT: !entry:
|
||||
// CHECK:STDOUT: return
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Op.4[addr %self: %.8](%other: %Self.2);
|
||||
// CHECK:STDOUT: generic fn @Op.4(constants.%Self.2: %.6) {
|
||||
// CHECK:STDOUT: %Self: %.6 = bind_symbolic_name Self 0 [symbolic = %Self (constants.%Self.2)]
|
||||
// CHECK:STDOUT: %.2: type = ptr_type @Op.4.%Self (%Self.2) [symbolic = %.2 (constants.%.8)]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn[addr %self: %.8](%other: %Self.2);
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @TestOp(%a: %C, %b: %C) -> %return: %C {
|
||||
// CHECK:STDOUT: !entry:
|
||||
|
||||
+30
-6
@@ -224,9 +224,17 @@ fn TestLhsBad(a: D, b: C) -> bool {
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @NotEqual.1[@impl.%self.loc8_15.2: %C](@impl.%other.loc8_24.2: %C) -> bool;
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Equal.2[%self: %Self](%other: %Self) -> bool;
|
||||
// CHECK:STDOUT: generic fn @Equal.2(constants.%Self: %.2) {
|
||||
// CHECK:STDOUT: %Self: %.2 = bind_symbolic_name Self 0 [symbolic = %Self (constants.%Self)]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @NotEqual.2[%self: %Self](%other: %Self) -> bool;
|
||||
// CHECK:STDOUT: fn[%self: %Self](%other: %Self) -> bool;
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: generic fn @NotEqual.2(constants.%Self: %.2) {
|
||||
// CHECK:STDOUT: %Self: %.2 = bind_symbolic_name Self 0 [symbolic = %Self (constants.%Self)]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn[%self: %Self](%other: %Self) -> bool;
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @TestEqual(%a: %C, %b: %C) -> bool {
|
||||
// CHECK:STDOUT: !entry:
|
||||
@@ -357,7 +365,11 @@ fn TestLhsBad(a: D, b: C) -> bool {
|
||||
// CHECK:STDOUT: return <error>
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Equal[%self: %Self](%other: %Self) -> bool;
|
||||
// CHECK:STDOUT: generic fn @Equal(constants.%Self: %.4) {
|
||||
// CHECK:STDOUT: %Self: %.4 = bind_symbolic_name Self 0 [symbolic = %Self (constants.%Self)]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn[%self: %Self](%other: %Self) -> bool;
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @TestNotEqual(%a: %D, %b: %D) -> bool {
|
||||
// CHECK:STDOUT: !entry:
|
||||
@@ -366,7 +378,11 @@ fn TestLhsBad(a: D, b: C) -> bool {
|
||||
// CHECK:STDOUT: return <error>
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @NotEqual[%self: %Self](%other: %Self) -> bool;
|
||||
// CHECK:STDOUT: generic fn @NotEqual(constants.%Self: %.4) {
|
||||
// CHECK:STDOUT: %Self: %.4 = bind_symbolic_name Self 0 [symbolic = %Self (constants.%Self)]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn[%self: %Self](%other: %Self) -> bool;
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: --- fail_no_impl_for_args.carbon
|
||||
// CHECK:STDOUT:
|
||||
@@ -521,9 +537,17 @@ fn TestLhsBad(a: D, b: C) -> bool {
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @NotEqual.1[@impl.%self.loc9_15.2: %C](@impl.%other.loc9_24.2: %C) -> bool;
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Equal.2[%self: %Self](%other: %Self) -> bool;
|
||||
// CHECK:STDOUT: generic fn @Equal.2(constants.%Self: %.2) {
|
||||
// CHECK:STDOUT: %Self: %.2 = bind_symbolic_name Self 0 [symbolic = %Self (constants.%Self)]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @NotEqual.2[%self: %Self](%other: %Self) -> bool;
|
||||
// CHECK:STDOUT: fn[%self: %Self](%other: %Self) -> bool;
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: generic fn @NotEqual.2(constants.%Self: %.2) {
|
||||
// CHECK:STDOUT: %Self: %.2 = bind_symbolic_name Self 0 [symbolic = %Self (constants.%Self)]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn[%self: %Self](%other: %Self) -> bool;
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @TestRhsBad(%a: %C, %b: %D) -> bool {
|
||||
// CHECK:STDOUT: !entry:
|
||||
|
||||
@@ -186,11 +186,21 @@ fn TestAddAssignNonRef(a: C, b: C) {
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Op.1[addr @impl.1.%self.loc16_14.3: %.3]();
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Op.2[addr %self: %.5]();
|
||||
// CHECK:STDOUT: generic fn @Op.2(constants.%Self.1: %.2) {
|
||||
// CHECK:STDOUT: %Self: %.2 = bind_symbolic_name Self 0 [symbolic = %Self (constants.%Self.1)]
|
||||
// CHECK:STDOUT: %.2: type = ptr_type @Op.2.%Self (%Self.1) [symbolic = %.2 (constants.%.5)]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn[addr %self: %.5]();
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Op.3[addr @impl.2.%self.loc19_14.3: %.3](@impl.2.%other.loc19_24.2: %C);
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Op.4[addr %self: %.8](%other: %Self.2);
|
||||
// CHECK:STDOUT: generic fn @Op.4(constants.%Self.2: %.7) {
|
||||
// CHECK:STDOUT: %Self: %.7 = bind_symbolic_name Self 0 [symbolic = %Self (constants.%Self.2)]
|
||||
// CHECK:STDOUT: %.2: type = ptr_type @Op.4.%Self (%Self.2) [symbolic = %.2 (constants.%.8)]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn[addr %self: %.8](%other: %Self.2);
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @TestIncNonRef(%a: %C) {
|
||||
// CHECK:STDOUT: !entry:
|
||||
|
||||
@@ -192,7 +192,11 @@ fn TestRef(b: C) {
|
||||
// CHECK:STDOUT: return <error> to %return
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Op.1[%self: %Self.1]() -> %Self.1;
|
||||
// CHECK:STDOUT: generic fn @Op.1(constants.%Self.1: %.4) {
|
||||
// CHECK:STDOUT: %Self: %.4 = bind_symbolic_name Self 0 [symbolic = %Self (constants.%Self.1)]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn[%self: %Self.1]() -> %Self.1;
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @TestBinary(%a: %C, %b: %C) -> %return: %C {
|
||||
// CHECK:STDOUT: !entry:
|
||||
@@ -201,7 +205,11 @@ fn TestRef(b: C) {
|
||||
// CHECK:STDOUT: return <error> to %return
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Op.2[%self: %Self.2](%other: %Self.2) -> %Self.2;
|
||||
// CHECK:STDOUT: generic fn @Op.2(constants.%Self.2: %.7) {
|
||||
// CHECK:STDOUT: %Self: %.7 = bind_symbolic_name Self 0 [symbolic = %Self (constants.%Self.2)]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn[%self: %Self.2](%other: %Self.2) -> %Self.2;
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @TestRef(%b: %C) {
|
||||
// CHECK:STDOUT: !entry:
|
||||
@@ -218,7 +226,17 @@ fn TestRef(b: C) {
|
||||
// CHECK:STDOUT: return
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Op.3[addr %self: %.11](%other: %Self.3);
|
||||
// CHECK:STDOUT: generic fn @Op.3(constants.%Self.3: %.10) {
|
||||
// CHECK:STDOUT: %Self: %.10 = bind_symbolic_name Self 0 [symbolic = %Self (constants.%Self.3)]
|
||||
// CHECK:STDOUT: %.2: type = ptr_type @Op.3.%Self (%Self.3) [symbolic = %.2 (constants.%.11)]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Op.4[addr %self: %.15]();
|
||||
// CHECK:STDOUT: fn[addr %self: %.11](%other: %Self.3);
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: generic fn @Op.4(constants.%Self.4: %.14) {
|
||||
// CHECK:STDOUT: %Self: %.14 = bind_symbolic_name Self 0 [symbolic = %Self (constants.%Self.4)]
|
||||
// CHECK:STDOUT: %.2: type = ptr_type @Op.4.%Self (%Self.4) [symbolic = %.2 (constants.%.15)]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn[addr %self: %.15]();
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
|
||||
@@ -201,11 +201,20 @@ fn TestAssign(b: D) {
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Op.1[@impl.1.%self.loc17_9.2: %C](@impl.1.%other.loc17_18.2: %C) -> %C;
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Op.2[%self: %Self.1](%other: %Self.1) -> %Self.1;
|
||||
// CHECK:STDOUT: generic fn @Op.2(constants.%Self.1: %.2) {
|
||||
// CHECK:STDOUT: %Self: %.2 = bind_symbolic_name Self 0 [symbolic = %Self (constants.%Self.1)]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn[%self: %Self.1](%other: %Self.1) -> %Self.1;
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Op.3[addr @impl.2.%self.loc20_14.3: %.6](@impl.2.%other.loc20_24.2: %C);
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Op.4[addr %self: %.7](%other: %Self.2);
|
||||
// CHECK:STDOUT: generic fn @Op.4(constants.%Self.2: %.5) {
|
||||
// CHECK:STDOUT: %Self: %.5 = bind_symbolic_name Self 0 [symbolic = %Self (constants.%Self.2)]
|
||||
// CHECK:STDOUT: %.2: type = ptr_type @Op.4.%Self (%Self.2) [symbolic = %.2 (constants.%.7)]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn[addr %self: %.7](%other: %Self.2);
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Test(%a: %C, %b: %D) -> %return: %C {
|
||||
// CHECK:STDOUT: !entry:
|
||||
|
||||
@@ -109,7 +109,12 @@ fn TestOp() {
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Op.1[addr @impl.%self.loc18_14.3: %.3]();
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Op.2[addr %self: %.5]();
|
||||
// CHECK:STDOUT: generic fn @Op.2(constants.%Self: %.2) {
|
||||
// CHECK:STDOUT: %Self: %.2 = bind_symbolic_name Self 0 [symbolic = %Self (constants.%Self)]
|
||||
// CHECK:STDOUT: %.2: type = ptr_type @Op.2.%Self (%Self) [symbolic = %.2 (constants.%.5)]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn[addr %self: %.5]();
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @TestOp() {
|
||||
// CHECK:STDOUT: !entry:
|
||||
|
||||
@@ -192,14 +192,23 @@ fn TestAssign(a: C*, b: C) {
|
||||
// CHECK:STDOUT: return %.loc19_14 to @impl.1.%return.var
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Op.2[%self: %Self.1](%other: %Self.1) -> %Self.1;
|
||||
// CHECK:STDOUT: generic fn @Op.2(constants.%Self.1: %.2) {
|
||||
// CHECK:STDOUT: %Self: %.2 = bind_symbolic_name Self 0 [symbolic = %Self (constants.%Self.1)]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn[%self: %Self.1](%other: %Self.1) -> %Self.1;
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Op.3[addr @impl.2.%self.loc23_14.3: %.7](@impl.2.%other.loc23_24.2: %C) {
|
||||
// CHECK:STDOUT: !entry:
|
||||
// CHECK:STDOUT: return
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Op.4[addr %self: %.8](%other: %Self.2);
|
||||
// CHECK:STDOUT: generic fn @Op.4(constants.%Self.2: %.6) {
|
||||
// CHECK:STDOUT: %Self: %.6 = bind_symbolic_name Self 0 [symbolic = %Self (constants.%Self.2)]
|
||||
// CHECK:STDOUT: %.2: type = ptr_type @Op.4.%Self (%Self.2) [symbolic = %.2 (constants.%.8)]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn[addr %self: %.8](%other: %Self.2);
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @TestOp(%a: %C, %b: %C) -> %return: %C {
|
||||
// CHECK:STDOUT: !entry:
|
||||
|
||||
+11
-2
@@ -192,14 +192,23 @@ fn TestAssign(a: C*, b: C) {
|
||||
// CHECK:STDOUT: return %.loc19_14 to @impl.1.%return.var
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Op.2[%self: %Self.1](%other: %Self.1) -> %Self.1;
|
||||
// CHECK:STDOUT: generic fn @Op.2(constants.%Self.1: %.2) {
|
||||
// CHECK:STDOUT: %Self: %.2 = bind_symbolic_name Self 0 [symbolic = %Self (constants.%Self.1)]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn[%self: %Self.1](%other: %Self.1) -> %Self.1;
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Op.3[addr @impl.2.%self.loc23_14.3: %.7](@impl.2.%other.loc23_24.2: %C) {
|
||||
// CHECK:STDOUT: !entry:
|
||||
// CHECK:STDOUT: return
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Op.4[addr %self: %.8](%other: %Self.2);
|
||||
// CHECK:STDOUT: generic fn @Op.4(constants.%Self.2: %.6) {
|
||||
// CHECK:STDOUT: %Self: %.6 = bind_symbolic_name Self 0 [symbolic = %Self (constants.%Self.2)]
|
||||
// CHECK:STDOUT: %.2: type = ptr_type @Op.4.%Self (%Self.2) [symbolic = %.2 (constants.%.8)]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn[addr %self: %.8](%other: %Self.2);
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @TestOp(%a: %C, %b: %C) -> %return: %C {
|
||||
// CHECK:STDOUT: !entry:
|
||||
|
||||
+11
-2
@@ -192,14 +192,23 @@ fn TestAssign(a: C*, b: C) {
|
||||
// CHECK:STDOUT: return %.loc19_14 to @impl.1.%return.var
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Op.2[%self: %Self.1](%other: %Self.1) -> %Self.1;
|
||||
// CHECK:STDOUT: generic fn @Op.2(constants.%Self.1: %.2) {
|
||||
// CHECK:STDOUT: %Self: %.2 = bind_symbolic_name Self 0 [symbolic = %Self (constants.%Self.1)]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn[%self: %Self.1](%other: %Self.1) -> %Self.1;
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Op.3[addr @impl.2.%self.loc23_14.3: %.7](@impl.2.%other.loc23_24.2: %C) {
|
||||
// CHECK:STDOUT: !entry:
|
||||
// CHECK:STDOUT: return
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Op.4[addr %self: %.8](%other: %Self.2);
|
||||
// CHECK:STDOUT: generic fn @Op.4(constants.%Self.2: %.6) {
|
||||
// CHECK:STDOUT: %Self: %.6 = bind_symbolic_name Self 0 [symbolic = %Self (constants.%Self.2)]
|
||||
// CHECK:STDOUT: %.2: type = ptr_type @Op.4.%Self (%Self.2) [symbolic = %.2 (constants.%.8)]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn[addr %self: %.8](%other: %Self.2);
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @TestOp(%a: %C, %b: %C) -> %return: %C {
|
||||
// CHECK:STDOUT: !entry:
|
||||
|
||||
@@ -120,7 +120,11 @@ fn TestOp(a: C) -> C {
|
||||
// CHECK:STDOUT: return %.loc19_14 to @impl.%return.var
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Op.2[%self: %Self]() -> %Self;
|
||||
// CHECK:STDOUT: generic fn @Op.2(constants.%Self: %.2) {
|
||||
// CHECK:STDOUT: %Self: %.2 = bind_symbolic_name Self 0 [symbolic = %Self (constants.%Self)]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn[%self: %Self]() -> %Self;
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @TestOp(%a: %C) -> %return: %C {
|
||||
// CHECK:STDOUT: !entry:
|
||||
|
||||
@@ -299,13 +299,29 @@ fn TestGreaterEqual(a: D, b: D) -> bool {
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @GreaterOrEquivalent.1[@impl.%self.loc10_26.2: %C](@impl.%other.loc10_35.2: %C) -> bool;
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Less.2[%self: %Self](%other: %Self) -> bool;
|
||||
// CHECK:STDOUT: generic fn @Less.2(constants.%Self: %.2) {
|
||||
// CHECK:STDOUT: %Self: %.2 = bind_symbolic_name Self 0 [symbolic = %Self (constants.%Self)]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @LessOrEquivalent.2[%self: %Self](%other: %Self) -> bool;
|
||||
// CHECK:STDOUT: fn[%self: %Self](%other: %Self) -> bool;
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Greater.2[%self: %Self](%other: %Self) -> bool;
|
||||
// CHECK:STDOUT: generic fn @LessOrEquivalent.2(constants.%Self: %.2) {
|
||||
// CHECK:STDOUT: %Self: %.2 = bind_symbolic_name Self 0 [symbolic = %Self (constants.%Self)]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @GreaterOrEquivalent.2[%self: %Self](%other: %Self) -> bool;
|
||||
// CHECK:STDOUT: fn[%self: %Self](%other: %Self) -> bool;
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: generic fn @Greater.2(constants.%Self: %.2) {
|
||||
// CHECK:STDOUT: %Self: %.2 = bind_symbolic_name Self 0 [symbolic = %Self (constants.%Self)]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn[%self: %Self](%other: %Self) -> bool;
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: generic fn @GreaterOrEquivalent.2(constants.%Self: %.2) {
|
||||
// CHECK:STDOUT: %Self: %.2 = bind_symbolic_name Self 0 [symbolic = %Self (constants.%Self)]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn[%self: %Self](%other: %Self) -> bool;
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @TestLess(%a: %C, %b: %C) -> bool {
|
||||
// CHECK:STDOUT: !entry:
|
||||
@@ -506,7 +522,11 @@ fn TestGreaterEqual(a: D, b: D) -> bool {
|
||||
// CHECK:STDOUT: return <error>
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Less[%self: %Self](%other: %Self) -> bool;
|
||||
// CHECK:STDOUT: generic fn @Less(constants.%Self: %.4) {
|
||||
// CHECK:STDOUT: %Self: %.4 = bind_symbolic_name Self 0 [symbolic = %Self (constants.%Self)]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn[%self: %Self](%other: %Self) -> bool;
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @TestLessEqual(%a: %D, %b: %D) -> bool {
|
||||
// CHECK:STDOUT: !entry:
|
||||
@@ -515,7 +535,11 @@ fn TestGreaterEqual(a: D, b: D) -> bool {
|
||||
// CHECK:STDOUT: return <error>
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @LessOrEquivalent[%self: %Self](%other: %Self) -> bool;
|
||||
// CHECK:STDOUT: generic fn @LessOrEquivalent(constants.%Self: %.4) {
|
||||
// CHECK:STDOUT: %Self: %.4 = bind_symbolic_name Self 0 [symbolic = %Self (constants.%Self)]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn[%self: %Self](%other: %Self) -> bool;
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @TestGreater(%a: %D, %b: %D) -> bool {
|
||||
// CHECK:STDOUT: !entry:
|
||||
@@ -524,7 +548,11 @@ fn TestGreaterEqual(a: D, b: D) -> bool {
|
||||
// CHECK:STDOUT: return <error>
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Greater[%self: %Self](%other: %Self) -> bool;
|
||||
// CHECK:STDOUT: generic fn @Greater(constants.%Self: %.4) {
|
||||
// CHECK:STDOUT: %Self: %.4 = bind_symbolic_name Self 0 [symbolic = %Self (constants.%Self)]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn[%self: %Self](%other: %Self) -> bool;
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @TestGreaterEqual(%a: %D, %b: %D) -> bool {
|
||||
// CHECK:STDOUT: !entry:
|
||||
@@ -533,5 +561,9 @@ fn TestGreaterEqual(a: D, b: D) -> bool {
|
||||
// CHECK:STDOUT: return <error>
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @GreaterOrEquivalent[%self: %Self](%other: %Self) -> bool;
|
||||
// CHECK:STDOUT: generic fn @GreaterOrEquivalent(constants.%Self: %.4) {
|
||||
// CHECK:STDOUT: %Self: %.4 = bind_symbolic_name Self 0 [symbolic = %Self (constants.%Self)]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn[%self: %Self](%other: %Self) -> bool;
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
|
||||
@@ -192,14 +192,23 @@ fn TestAssign(a: C*, b: C) {
|
||||
// CHECK:STDOUT: return %.loc19_14 to @impl.1.%return.var
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Op.2[%self: %Self.1](%other: %Self.1) -> %Self.1;
|
||||
// CHECK:STDOUT: generic fn @Op.2(constants.%Self.1: %.2) {
|
||||
// CHECK:STDOUT: %Self: %.2 = bind_symbolic_name Self 0 [symbolic = %Self (constants.%Self.1)]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn[%self: %Self.1](%other: %Self.1) -> %Self.1;
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Op.3[addr @impl.2.%self.loc23_14.3: %.7](@impl.2.%other.loc23_24.2: %C) {
|
||||
// CHECK:STDOUT: !entry:
|
||||
// CHECK:STDOUT: return
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Op.4[addr %self: %.8](%other: %Self.2);
|
||||
// CHECK:STDOUT: generic fn @Op.4(constants.%Self.2: %.6) {
|
||||
// CHECK:STDOUT: %Self: %.6 = bind_symbolic_name Self 0 [symbolic = %Self (constants.%Self.2)]
|
||||
// CHECK:STDOUT: %.2: type = ptr_type @Op.4.%Self (%Self.2) [symbolic = %.2 (constants.%.8)]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn[addr %self: %.8](%other: %Self.2);
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @TestOp(%a: %C, %b: %C) -> %return: %C {
|
||||
// CHECK:STDOUT: !entry:
|
||||
|
||||
+11
-2
@@ -192,14 +192,23 @@ fn TestAssign(a: C*, b: C) {
|
||||
// CHECK:STDOUT: return %.loc19_14 to @impl.1.%return.var
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Op.2[%self: %Self.1](%other: %Self.1) -> %Self.1;
|
||||
// CHECK:STDOUT: generic fn @Op.2(constants.%Self.1: %.2) {
|
||||
// CHECK:STDOUT: %Self: %.2 = bind_symbolic_name Self 0 [symbolic = %Self (constants.%Self.1)]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn[%self: %Self.1](%other: %Self.1) -> %Self.1;
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Op.3[addr @impl.2.%self.loc23_14.3: %.7](@impl.2.%other.loc23_24.2: %C) {
|
||||
// CHECK:STDOUT: !entry:
|
||||
// CHECK:STDOUT: return
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @Op.4[addr %self: %.8](%other: %Self.2);
|
||||
// CHECK:STDOUT: generic fn @Op.4(constants.%Self.2: %.6) {
|
||||
// CHECK:STDOUT: %Self: %.6 = bind_symbolic_name Self 0 [symbolic = %Self (constants.%Self.2)]
|
||||
// CHECK:STDOUT: %.2: type = ptr_type @Op.4.%Self (%Self.2) [symbolic = %.2 (constants.%.8)]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn[addr %self: %.8](%other: %Self.2);
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @TestOp(%a: %C, %b: %C) -> %return: %C {
|
||||
// CHECK:STDOUT: !entry:
|
||||
|
||||
Reference in New Issue
Block a user