D Paste by Anonymous
Description: A nasty compiler bug or just a bad joke
Hide line numbers

Create new paste
Post a reply
View replies

Paste:
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
28  
29  
30  
31  
32  
33  
34  
35  
36  
37  
38  
39  
40  
41  
42  
43  
44  
45  
46  
47  
48  
49  
50  
51  
52  
53  
54  
55  
56  
57  
58  
59  
60  
61  
62  
63  
64  
65  
66  
67  
68  
69  
70  
71  
72  
73  
74  
75  
76  
77  
78  
79  
80  
81  
82  
83  
84  
85  
86  
87  
88  
89  
90  
91  
92  
93  
94  
95  
96  
97  
98  
99  
100  
101  
102  
103  
104  
105  
106  
107  
108  
109  
110  
111  
112  
113  
114  
115  
116  
117  
118  
119  
120  
121  
122  
123  
124  
125  
126  
127  
128  
129  
130  
131  
132  
133  
134  
135  
136  
module Test;

import tango.io.Stdout;

/*
-------
$ ./main
Foo.getSetting() called.
name: A
x is not null
-------
Now change the places of Setting and Settings.... O_O
-------
$ ./main
Foo.getSetting() called.
name: A
FooSettings.getWrapper
x is null
-------
*/

interface Wrapper(T)
{
    void dummy();
}

interface Setting : Settings
{
    public:
    char[] getName();
}



interface Settings
{
    public:

    Setting getSetting();
    
    Wrapper!(Setting) getWrapper();
}

class FooSetting : public Setting
{
    char[] name;
    
public:

    this(char[] name)
    {
        this.name = name;
    }
    
    char[] getName() { return name; }
    
    Setting getSetting()
    {
        Stdout("FooSetting.getSetting").newline;
        return null;
    }
    
    Wrapper!(Setting) getWrapper()
    {
        Stdout("FooSetting.getWrapper called.").newline;
        return null;
    }
}

class FooSettings : FooSetting
{
public:

    this(char[] name)
    {
        super(name);
    }
    
    Setting getSetting()
    {
        Stdout("FooSettings.getSetting").newline;
        return null;
    }
    
    Wrapper!(Setting) getWrapper()
    {
        Stdout("FooSettings.getWrapper").newline;
        return null;
    }
}

class Foo :  Settings
{
    FooSetting f;
public:

    this()
    {
        f = new FooSettings("A");
    }
    
    Setting getSetting()
    {
        Stdout("Foo.getSetting() called.").newline;
        return f;
    }
    
    Wrapper!(Setting) getWrapper()
    {
        Stdout("Foo.getWrapper called.").newline;
        return null;
    }
}

void main(char[][] args)
{
    
    Settings set = new Foo();
    
    auto set2 = set.getSetting();
    
    Stdout("name: ")(set2.getName).newline;

    Wrapper!(Setting) x = set2.getWrapper();
    //Wrapper!(Setting) iter = null;
    
    if(x !is null)
    {
        Stdout("x is not null").newline;
    }
    else
    {
        Stdout("x is null").newline;
    }
}

Replies:
No replies posted yet