constrained_parameter.carbon 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  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. // CHECK:STDOUT: result: 0
  7. package ExplorerTest api;
  8. interface AddMul {
  9. fn Add[self: Self](o: Self) -> Self;
  10. fn Mul[self: Self](o: Self) -> Self;
  11. }
  12. external impl i32 as AddMul {
  13. fn Add[self: i32](o: i32) -> i32 {
  14. return self + o;
  15. }
  16. fn Mul[self: i32](o: i32) -> i32 {
  17. return self * o;
  18. }
  19. }
  20. class Holder(T:! AddMul) {
  21. var v: T;
  22. }
  23. interface Vector(Scalar:! AddMul) {
  24. fn Zero() -> Self;
  25. fn Add[self: Self](b: Self) -> Self;
  26. fn Scale[self: Self](v: Scalar) -> Self;
  27. fn Hold[self: Self](v: Scalar) -> Holder(Scalar);
  28. }
  29. class Point {
  30. var x: i32;
  31. var y: i32;
  32. impl Point as Vector(i32) {
  33. fn Zero() -> Point {
  34. return {.x = 0, .y = 0};
  35. }
  36. fn Add[self: Point](b: Point) -> Point {
  37. return {.x = self.x + b.x, .y = self.y + b.y};
  38. }
  39. fn Scale[self: Point](v: i32) -> Point {
  40. return {.x = self.x * v, .y = self.y * v};
  41. }
  42. fn Hold[self: Point](v: i32) -> Holder(i32) {
  43. return {.v = v};
  44. }
  45. }
  46. }
  47. fn AddAndScaleGeneric[T:! AddMul, U:! Vector(T)](a: U, s: T) -> U {
  48. return a.Add(U.Zero()).Scale(a.Hold(s).v);
  49. }
  50. fn Main() -> i32 {
  51. var a: Point = {.x = 2, .y = 1};
  52. var p: Point = AddAndScaleGeneric(a, 5);
  53. return p.x - 10;
  54. }