1 // PERMUTE_ARGS:
2 
3 extern(C) int printf(const char*, ...);
4 
5 interface foo
6 {
7     extern (C) int testc(int i);
8     extern (Windows) int testw(int i);
9     extern (D) int testd(int i);
10 }
11 
12 class bar : foo
13 {
14     int x = 47;
15 
16   extern (C)
17     int testc(int i)
18     {
19         printf("foo.testc(%p)\n", this);
20         assert(x == 47);
21         return i + x;
22     }
23 
24   extern (Windows)
25     int testw(int i)
26     {
27         printf("foo.testw(%p)\n", this);
28         assert(x == 47);
29         return i + x;
30     }
31 
32   extern (D)
33     int testd(int i)
34     {
35         printf("foo.testd(%p)\n", this);
36         assert(x == 47);
37         return i + x;
38     }
39 }
40 
41 int def(foo f)
42 {
43     printf("def(%p), %p\n", f, (cast(int*)f)[0]);
44     assert(f.testc(3) == 50);
45     assert(f.testd(7) == 54);
46     assert(f.testd(10) == 57);
47     return 0;
48 }
49 
50 void abc(bar b)
51 {
52     printf("abc(%p), %p\n", b, (cast(int*)b)[3]);
53     def(b);
54 }
55 
56 int main()
57 {
58     bar b = new bar();
59 
60     printf("b.size = x%x\n", b.classinfo.initializer.length);
61     printf("bar.size = x%x\n", bar.classinfo.initializer.length);
62     assert(b.classinfo.initializer.length == bar.classinfo.initializer.length);
63     abc(b);
64     return 0;
65 }
66