overloaded.carbon 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. // Part of the Carbon Language project, under the Apache License v2.0 with LLVM
  2. // Exceptions. See /LICENSE for license information.
  3. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  4. //
  5. // AUTOUPDATE
  6. // --- prelude.carbon
  7. package Core api;
  8. interface Negate {
  9. fn Op[self: Self]() -> Self;
  10. }
  11. interface Mul {
  12. fn Op[self: Self](other: Self) -> Self;
  13. }
  14. // --- overloaded.carbon
  15. import Core;
  16. class Number {
  17. var is_positive: bool;
  18. }
  19. impl Number as Core.Negate {
  20. fn Op[self: Number]() -> Number {
  21. return {.is_positive = not self.is_positive};
  22. }
  23. }
  24. impl Number as Core.Mul {
  25. fn Op[self: Number](other: Number) -> Number {
  26. return {.is_positive = (self.is_positive and other.is_positive) or
  27. (not self.is_positive and not other.is_positive)};
  28. }
  29. }
  30. fn Calculate(a: Number, b: Number) -> Number {
  31. return -a * b;
  32. }
  33. // CHECK:STDOUT: ; ModuleID = 'prelude.carbon'
  34. // CHECK:STDOUT: source_filename = "prelude.carbon"
  35. // CHECK:STDOUT: ; ModuleID = 'overloaded.carbon'
  36. // CHECK:STDOUT: source_filename = "overloaded.carbon"
  37. // CHECK:STDOUT:
  38. // CHECK:STDOUT: define void @Op(ptr sret({ i1 }) %return, ptr %self) {
  39. // CHECK:STDOUT: entry:
  40. // CHECK:STDOUT: %.loc10_36.1.is_positive = getelementptr inbounds { i1 }, ptr %self, i32 0, i32 0
  41. // CHECK:STDOUT: %.loc10_36.2 = load i1, ptr %.loc10_36.1.is_positive, align 1
  42. // CHECK:STDOUT: %.loc10_28 = xor i1 %.loc10_36.2, true
  43. // CHECK:STDOUT: %.loc10_48.2.is_positive = getelementptr inbounds { i1 }, ptr %return, i32 0, i32 0
  44. // CHECK:STDOUT: store i1 %.loc10_28, ptr %.loc10_48.2.is_positive, align 1
  45. // CHECK:STDOUT: ret void
  46. // CHECK:STDOUT: }
  47. // CHECK:STDOUT:
  48. // CHECK:STDOUT: define void @Op.1(ptr sret({ i1 }) %return, ptr %self, ptr %other) {
  49. // CHECK:STDOUT: entry:
  50. // CHECK:STDOUT: %.loc15_33.1.is_positive = getelementptr inbounds { i1 }, ptr %self, i32 0, i32 0
  51. // CHECK:STDOUT: %.loc15_33.2 = load i1, ptr %.loc15_33.1.is_positive, align 1
  52. // CHECK:STDOUT: br i1 %.loc15_33.2, label %and.rhs.loc15, label %and.result.loc15
  53. // CHECK:STDOUT:
  54. // CHECK:STDOUT: and.rhs.loc15: ; preds = %entry
  55. // CHECK:STDOUT: %.loc15_55.1.is_positive = getelementptr inbounds { i1 }, ptr %other, i32 0, i32 0
  56. // CHECK:STDOUT: %.loc15_55.2 = load i1, ptr %.loc15_55.1.is_positive, align 1
  57. // CHECK:STDOUT: br label %and.result.loc15
  58. // CHECK:STDOUT:
  59. // CHECK:STDOUT: and.result.loc15: ; preds = %and.rhs.loc15, %entry
  60. // CHECK:STDOUT: %0 = phi i1 [ false, %entry ], [ %.loc15_55.2, %and.rhs.loc15 ]
  61. // CHECK:STDOUT: %.loc15_69.1 = xor i1 %0, true
  62. // CHECK:STDOUT: br i1 %.loc15_69.1, label %or.rhs, label %or.result
  63. // CHECK:STDOUT:
  64. // CHECK:STDOUT: or.rhs: ; preds = %and.result.loc15
  65. // CHECK:STDOUT: %.loc16_38.1.is_positive = getelementptr inbounds { i1 }, ptr %self, i32 0, i32 0
  66. // CHECK:STDOUT: %.loc16_38.2 = load i1, ptr %.loc16_38.1.is_positive, align 1
  67. // CHECK:STDOUT: %.loc16_30 = xor i1 %.loc16_38.2, true
  68. // CHECK:STDOUT: br i1 %.loc16_30, label %and.rhs.loc16, label %and.result.loc16
  69. // CHECK:STDOUT:
  70. // CHECK:STDOUT: and.rhs.loc16: ; preds = %or.rhs
  71. // CHECK:STDOUT: %.loc16_64.1.is_positive = getelementptr inbounds { i1 }, ptr %other, i32 0, i32 0
  72. // CHECK:STDOUT: %.loc16_64.2 = load i1, ptr %.loc16_64.1.is_positive, align 1
  73. // CHECK:STDOUT: %.loc16_55 = xor i1 %.loc16_64.2, true
  74. // CHECK:STDOUT: br label %and.result.loc16
  75. // CHECK:STDOUT:
  76. // CHECK:STDOUT: and.result.loc16: ; preds = %and.rhs.loc16, %or.rhs
  77. // CHECK:STDOUT: %1 = phi i1 [ false, %or.rhs ], [ %.loc16_55, %and.rhs.loc16 ]
  78. // CHECK:STDOUT: br label %or.result
  79. // CHECK:STDOUT:
  80. // CHECK:STDOUT: or.result: ; preds = %and.result.loc16, %and.result.loc15
  81. // CHECK:STDOUT: %2 = phi i1 [ true, %and.result.loc15 ], [ %1, %and.result.loc16 ]
  82. // CHECK:STDOUT: %.loc16_77.2.is_positive = getelementptr inbounds { i1 }, ptr %return, i32 0, i32 0
  83. // CHECK:STDOUT: store i1 %2, ptr %.loc16_77.2.is_positive, align 1
  84. // CHECK:STDOUT: ret void
  85. // CHECK:STDOUT: }
  86. // CHECK:STDOUT:
  87. // CHECK:STDOUT: define void @Calculate(ptr sret({ i1 }) %return, ptr %a, ptr %b) {
  88. // CHECK:STDOUT: entry:
  89. // CHECK:STDOUT: %.loc21_10.2.temp = alloca { i1 }, align 8
  90. // CHECK:STDOUT: call void @Op(ptr %.loc21_10.2.temp, ptr %a)
  91. // CHECK:STDOUT: call void @Op.1(ptr %return, ptr %.loc21_10.2.temp, ptr %b)
  92. // CHECK:STDOUT: ret void
  93. // CHECK:STDOUT: }
  94. // CHECK:STDOUT:
  95. // CHECK:STDOUT: ; uselistorder directives
  96. // CHECK:STDOUT: uselistorder i1 true, { 2, 0, 1, 3, 4 }