8 Problem is that setter properties do not return a value, so we must
9 create a temporary on the situation above to store the value of "b"
10 and then pass that on to "a".
14 Handle if (!x) converting to remove the `!' and instead of using
15 a brfalse use a brtrue to jump to the end.
19 Maybe we should only call Resolve on RValues and LValueRsolve
20 on LValues so that DoREsolve can flag errors on properties
21 missing `get' and indexers without a get indexer.
25 Do we really need to instanciate this variable all the time?
27 It could be static for all we care, and just use it for making
28 sure that there are no recursive invocations on it.
32 Since AppDomain exists, maybe we can get rid of all the stuff
33 that is part of the `compiler instance' and just use globals
38 Move our utility FindMembers from TypeContainer to Decl, because interfaces
39 are also scanned with it.
43 Can a constant_expression invoke overloaded operators?
44 Explicit user-defined conversions?
48 I am not reporting errors on visibility yet.
52 Currently I am not resolving enumerations.
54 Either I track them with `RecordEnum' as I do with classes,
55 structs and interfaces or I rewrite the code to visit type
56 containers and `walk' the enums with this process.
62 They should should use:
64 OPEN_PARENS type CLOSE_PARENS
66 instead of the current production which is wrong, because it
67 only handles a few cases.
71 Array r = (string []) object
77 For indexers, the output of ix2.cs is different from our
78 compiler and theirs. They use a DefaultMemberAttribute, which
79 I have yet to figure out:
81 .class interface private abstract auto ansi INTERFACE
83 .custom instance void [mscorlib]System.Reflection.DefaultMemberAttribute::.ctor(string)
84 = ( 01 00 04 49 74 65 6D 00 00 ) // ...Item..
90 I have not figured out why the Microsoft version puts an
91 `instance' attribute, and I am not generating this `instance' attribute.
93 Explanation: The reason for the `instance' attribute on
94 indexers is that indexers only apply to instances
98 Currently it calls the parent constructor before initializing fields.
99 It should do it the other way around.
101 * Use of EmitBranchable
103 Currently I use brfalse/brtrue in the code for statements, instead of
104 using the EmitBranchable function that lives in Binary
106 * Create an UnimplementedExpcetion
108 And use that instead of plain Exceptions to flag compiler errors.
112 Currently ConvertImplicit will not catch things like:
114 - IntLiteral in a float context to generate a -FloatLiteral.
115 Instead it will perform an integer load followed by a conversion.
117 * In class.cs: Method.Define
119 Need to use FindMembers to lookup the member for reporting
120 whether a new is needed or not.
122 * virtual-method.cs breaks
124 It breaks on the call to: new B ();
126 Where B is a class defined in the source code, my guess is that
127 the look for ".ctor" fails
129 * Foreach on structure returns does not work
131 I am generating invalid code instead of calling ldarga for the
132 structure, I am calling ldarg:
135 public IEnumerator GetEnumerator ();
140 foreach (object a in x){
144 I need to get the address of that bad boy
148 Understand how methods are invoked on structs
152 Need to reset the aliases for each compilation unit, so an
153 alias defined in a file does not have any effect on another one:
160 class Z : X { <-- This X is `Blah'
165 class Y : X { <-- This X Is not `Blah'
169 I think we can implement Aliases by having an `Alias' context in all
170 the toplevel TypeContainers of a compilation unit. The children typecontainers
171 just chain to the parents to resolve the information.
173 The driver advances the Alias for each file compiled, so that each file
174 has its own alias set.
178 Write tests for the various reference conversions. We have
179 test for all the numeric conversions.