| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- // 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
- //
- // NOAUTOUPDATE
- package ExplorerTest api;
- interface Maker(T:! type) {
- fn Make[self: Self]() -> T;
- }
- constraint IndirectMaker(T:! type) {
- extend Maker(T*);
- }
- constraint MoreIndirectMaker {
- extend IndirectMaker(i32);
- }
- class PointerFactory {
- var p: i32*;
- impl as Maker(i32*) {
- fn Make[self: Self]() -> i32* { return self.p; }
- }
- }
- fn CallIndirect[T:! IndirectMaker(i32)](x: T) -> i32 {
- return *x.Make();
- }
- fn CallMoreIndirect[T:! MoreIndirectMaker](x: T) -> i32 {
- return *x.Make();
- }
- fn Main() -> i32 {
- var n: i32 = 5;
- var f: PointerFactory = {.p = &n};
- Print("{0}", *f.(Maker(i32*).Make)());
- Print("{0}", *f.(IndirectMaker(i32).Make)());
- Print("{0}", *f.(MoreIndirectMaker.Make)());
- Print("{0}", CallIndirect(f));
- Print("{0}", CallMoreIndirect(f));
- return 0;
- }
- // CHECK:STDOUT: 5
- // CHECK:STDOUT: 5
- // CHECK:STDOUT: 5
- // CHECK:STDOUT: 5
- // CHECK:STDOUT: 5
- // CHECK:STDOUT: result: 0
|