D Paste by Anonymous
Description: A nasty compiler bug or just a bad joke
|
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; } } |