compiler limitations
--------------------

These are not implemented:

a. bit fields
   kludgily implemented (everything padded to char, int or long; can store
   values wider than the specified field width)
 
g. signed char type, other ANSI extensions

compiler bugs
-------------

6. weird but doable casts are not always done for initializers

15. calls to a (casted) absolute address produce an immediate prefix. as386
    doesn't mind this but complains about the absolute address. as09 complains
    about the prefix but can handle the absolute address

23. char *f(); &f() is accepted as f() but produces botched nodetype
    (calc char **).

31. null byte in string initialiser should be ignored if it doesn't fit
    Non-null bytes which don't fit should be ignored with a warning

32. static char c = "xyz"; is allowed, and bad FCB is generated

37. init of union will store multiple comma-separated entries

38. arrays sizes larger than the amount of memory are accepted

40. structure and union definitions are confused with each other. So
    struct foo may be used in a declaration like "union foo bar;"

42. pointer arithmetic is performed on pointers to undefined structures
    (of unknown size). Size is taken as 0 although alignmask is set early

59. preprocessor stuff (# lines or macro names) between the identifier for
    a label and the colon for the label messes up the label

60. some things involving switches are now broken for 6809 due to lack of
    frame pointer

61. assembler may get lost on lines of length exactly (?) 256

65. expressions in emum lists or not properly checked for overflow. They
    should fit in ints. The ordinal number is allowed to overflow

66. sizeof has type int instead of size_t

68. "return expr;" in a function returning a void is reported as a compiler
    bug not as a semantic error

69. an argument declared as float is (correctly) promoted to double, but
    not demoted to float when it is used

71. identifiers longer than 64 are botched (scanning of the identifier is
    stopped but the remaining characters in the identifier are left to
    mess up the input stream

72. check for too many macro parameters is not working

74. union { char a, b; } foo; gives the wrong offset for b. Unions work OK
    if the declaration lists have length 1

75. stack gets cleaned up too early in bee = foo ? bar : baz() where baz()
    returns a struct although there is kludge to make plain bee = baz() work

76. have reintroduced reduced-type bugs, so sizeof(1 ? 1 : 2) is 1

78. fix to require comma in arg list may be half-baked

79. compiler starts trying to load the void expression (i ? (void)0 : (void)0)

80. (unsigned char *) - (char *) causes error and message is obscure

81. 'defined' is a reserved word

82. conditionals with voids don't work

83. float = 1e100 gets overflow exception

84. #endif seems to be seen in
#if 1
foo #endif bar

85. line numbers from cpp are not quite right.

bugs that may be fixed
----------------------

41. typedef's are not scoped properly

nonstandard things that are not done quite right
------------------------------------------------

3. arguments declared as register are not being dumped by #asm, register
   vars anyway not being passed to #asm

26. should clear label ptrs when starting #asm

things that have to be be done better
-------------------------------------

11. push order reversed in genloads.c (temp) - might try to get DP order right

12. need to clean up handling of sc specs (maybe rename flags to sc)
    And local statics and externs

24. gvarsc is not returned properly for struct/union since the members
    affect gvarsc (incorrectly). There should be a flag set when
    inside a struct/union definition to disable sc specs. This could
    replace the tests in abdeclarator and declselt
    Best may be to carry the sc along with the type a bit more (in a
    global symbol structure). Also, the symbol should record sc in a better
    way than now

25. need to check stack sometimes. Xenix cc does it when allocating >= 100
    bytes locals and this is essential in Xenix as the stack is grown
    dynamically

68. overflow checking for constants

things that could be done better
--------------------------------

4. install new 6809 code for branch patching (after redundancy checks)

5. can improve code for compare with global adr in non-posindependent case

6. char *s; long *pl;
	code for *s += *pl is poor, for *s += (int) *pl is good

7. most mov's from to ax would be faster and smaller done by xchg's

7a. check ptr add/sub operations earlier

8. tests for against 1 and -1 can sometimes be done with dec's and inc's

9. __opreg is used unnec when the ptr is already in it

9a. double indirect ptrs should maybe be made direct rather than singly
    indirect by makelessindirect

10. in cmpsmallconst(), the comparison constant should be incorporated in
    the offset if the indcount is 0 and lea() called. It is harmless to
    use the lea() trick for non-small constants

20. when saved registers are popped in assign() they may overwrite the
    expression value, anywhere else? May be fixed now

27. better if loadexpression returned the register used

28. better if source.c did not #include storage.h - it only references
    DEFINITION, in some blank-skipping code which could be moved to
    scan.c or preproc.c. preproc.c, scan.c and type.c also #include
    storage.h, just to get at the DEFINITION and KEYWORD definitions

29. need nodetype() to know about all optimisations in advance, including
    int % small power of 2 (including 0, 1). Need to delete all type
    assignments in final code gen, specially the one that convert short
    to int

30. overflow checking at runtime

31. Use more than the first char from multiple character constants

56. --i++ is not detected as an error in the parser
