overloaded.carbon 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  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: %is_positive = getelementptr inbounds { i1 }, ptr %self, i32 0, i32 0
  40. // CHECK:STDOUT: %1 = load i1, ptr %is_positive, align 1
  41. // CHECK:STDOUT: %2 = xor i1 %1, true
  42. // CHECK:STDOUT: %is_positive1 = getelementptr inbounds { i1 }, ptr %return, i32 0, i32 0
  43. // CHECK:STDOUT: store i1 %2, ptr %is_positive1, align 1
  44. // CHECK:STDOUT: ret void
  45. // CHECK:STDOUT: }
  46. // CHECK:STDOUT:
  47. // CHECK:STDOUT: define void @Op.1(ptr sret({ i1 }) %return, ptr %self, ptr %other) {
  48. // CHECK:STDOUT: %is_positive = getelementptr inbounds { i1 }, ptr %self, i32 0, i32 0
  49. // CHECK:STDOUT: %1 = load i1, ptr %is_positive, align 1
  50. // CHECK:STDOUT: br i1 %1, label %2, label %4
  51. // CHECK:STDOUT:
  52. // CHECK:STDOUT: 2: ; preds = %0
  53. // CHECK:STDOUT: %is_positive1 = getelementptr inbounds { i1 }, ptr %other, i32 0, i32 0
  54. // CHECK:STDOUT: %3 = load i1, ptr %is_positive1, align 1
  55. // CHECK:STDOUT: br label %4
  56. // CHECK:STDOUT:
  57. // CHECK:STDOUT: 4: ; preds = %2, %0
  58. // CHECK:STDOUT: %5 = phi i1 [ false, %0 ], [ %3, %2 ]
  59. // CHECK:STDOUT: %6 = xor i1 %5, true
  60. // CHECK:STDOUT: br i1 %6, label %7, label %15
  61. // CHECK:STDOUT:
  62. // CHECK:STDOUT: 7: ; preds = %4
  63. // CHECK:STDOUT: %is_positive2 = getelementptr inbounds { i1 }, ptr %self, i32 0, i32 0
  64. // CHECK:STDOUT: %8 = load i1, ptr %is_positive2, align 1
  65. // CHECK:STDOUT: %9 = xor i1 %8, true
  66. // CHECK:STDOUT: br i1 %9, label %10, label %13
  67. // CHECK:STDOUT:
  68. // CHECK:STDOUT: 10: ; preds = %7
  69. // CHECK:STDOUT: %is_positive3 = getelementptr inbounds { i1 }, ptr %other, i32 0, i32 0
  70. // CHECK:STDOUT: %11 = load i1, ptr %is_positive3, align 1
  71. // CHECK:STDOUT: %12 = xor i1 %11, true
  72. // CHECK:STDOUT: br label %13
  73. // CHECK:STDOUT:
  74. // CHECK:STDOUT: 13: ; preds = %10, %7
  75. // CHECK:STDOUT: %14 = phi i1 [ false, %7 ], [ %12, %10 ]
  76. // CHECK:STDOUT: br label %15
  77. // CHECK:STDOUT:
  78. // CHECK:STDOUT: 15: ; preds = %13, %4
  79. // CHECK:STDOUT: %16 = phi i1 [ true, %4 ], [ %14, %13 ]
  80. // CHECK:STDOUT: %is_positive4 = getelementptr inbounds { i1 }, ptr %return, i32 0, i32 0
  81. // CHECK:STDOUT: store i1 %16, ptr %is_positive4, align 1
  82. // CHECK:STDOUT: ret void
  83. // CHECK:STDOUT: }
  84. // CHECK:STDOUT:
  85. // CHECK:STDOUT: define void @Calculate(ptr sret({ i1 }) %return, ptr %a, ptr %b) {
  86. // CHECK:STDOUT: %temp = alloca { i1 }, align 8
  87. // CHECK:STDOUT: call void @Op(ptr %temp, ptr %a)
  88. // CHECK:STDOUT: call void @Op.1(ptr %return, ptr %temp, ptr %b)
  89. // CHECK:STDOUT: ret void
  90. // CHECK:STDOUT: }
  91. // CHECK:STDOUT:
  92. // CHECK:STDOUT: ; uselistorder directives
  93. // CHECK:STDOUT: uselistorder i1 true, { 2, 0, 1, 3, 4 }