Annotation of researchv10no/cmd/lcc/LOG, revision 1.1

1.1     ! root        1: 10/25/88:
        !             2: lcc is an ANSI C compiler available to friendly users on coma.
        !             3: 
        !             4: Bit fields are parsed but ignored.  Trigraph sequences and the extended
        !             5: character set are not supported.  The code for register variables needs
        !             6: improvement.  The only cases now known to yield incorrect code involve
        !             7: C++ output and programs that run out of registers, but there must be
        !             8: more.  -g seems to work with pi, but it's very green.
        !             9: 
        !            10: ANSI-style header files are in /usr/include/lcc, which lcc searches.
        !            11: A few prototypes may differ from what is actually in libc.a; the
        !            12: consequence is usually a type error.  A header file for some V9
        !            13: functions is on the way; more later on this.
        !            14: 
        !            15: For a man page, run "man lcc" or "troff -man /usr/cwf/book/man/lcc.1.v9".
        !            16: Mail bug reports to both cwf and princeton!drh (Dave Hanson).
        !            17: Please include a short program that exposes the bug.  Thanks.
        !            18: 
        !            19: 11/8/88:
        !            20: fixes several bugs with error handling, float and string constants,
        !            21: register structs, and programs that exhaust register variables.
        !            22: makes code for char and short int functions compatible with cc's code.
        !            23: 
        !            24: 11/17/88:
        !            25: fixes bugs in spills, in the declaration of longjump in lcc's
        !            26: <setjmp.h>, and in the type system ("char" had compared equal to
        !            27: "signed char", which ansi forbids).  improves error recovery.  plus
        !            28: internal changes that are theoretically invisible.
        !            29: 
        !            30: it also puts some formals and locals in registers; "man lcc" elaborates.
        !            31: the increased demand for registers may expose compiler bugs that have
        !            32: been in hiding.  if you have regression tests, try them.
        !            33: 
        !            34: 12/8/88:
        !            35: fixes sizeof("x"), overzealous reuse of common subexprs, and a loop in
        !            36: the spill emitter.  improves error reporting and code for many ++/--
        !            37: ops (but prefix versions on registers still need work).  folds the
        !            38: difference of two constant pointers.  defines standard "offsetof"
        !            39: macro.
        !            40: 
        !            41: 12/13/88:
        !            42: fixes compiler crashes on certain spills in nested conditional exprs.
        !            43: fixes bugs in hex char constants, in exprs with chains of unsigned
        !            44: mods and divisions, and in *x=*x when x is volatile.  uses gcc's
        !            45: preprocessor to offer more ANSI extensions.  adds bit fields, tho
        !            46: they're pretty green, the layout's unique (see the man page), and the
        !            47: code needs optimization.
        !            48: 
        !            49: 12/19/88:
        !            50: changes some diagnostics.  handles arbitrarily long lines.  emits
        !            51: slightly better code for switches and functions that return structs.
        !            52: fixes an infinite loop when undeclared identifiers appeared in
        !            53: initializers, an incorrectly formatted error message for illegal
        !            54: characters, and bad code for x:goto x and for *f()=g() when g returns
        !            55: a struct.  ignores -O, because /lib/c2 can trash lcc's code.  adds -n,
        !            56: which compiles code to detect certain zero-pointer errors; the man
        !            57: page elaborates.
        !            58: 
        !            59: 1/5/89:
        !            60: improves diagnostics.  deletes warnings about unused return values,
        !            61: except when they're structures.  fixes minor errors in the standard
        !            62: include files.  stops losing the token following asm("...").  emits
        !            63: slightly worse code for nested calls, in preparation for a mips
        !            64: target.  several internal changes that should have no effect.
        !            65: 
        !            66: 1/9/89:
        !            67: improves entry code for some functions.  gets clr/inc instructions even
        !            68: if the 0/1 is expressed oddly (eg, 0x1).  corrects bad code for
        !            69: (unsigned)c==0xff, for f(g().b) when b's offset >0, and for -u>0 for
        !            70: unsigned u.  returns to the old code for nested calls, so f(x?h():0),
        !            71: f(x&&h()), and f(x||h()) work again.  corrects minor flaws in string.h.
        !            72: 
        !            73: 2/1/89:
        !            74: 
        !            75: improves diagnostics.  improves handling of long parameter lists, long
        !            76: string constants, and integral constants between 2^31-1 and 2^32-1.
        !            77: responds to constant overflow in a machine-independent fashion.
        !            78: flattens nested calls (for the mips target).  corrects bad code for
        !            79: a[2*i]=f(a[2*i]), (double)(float)0.3, stab entries for initialized
        !            80: statics, and some nested conditionals.  assigns registers differently:
        !            81: r0-5 are now for temporaries, and r6-11 for variables.  fixes several
        !            82: crashes and assertion failures:  if you've had some, try them now;
        !            83: otherwise ignore.
        !            84: 
        !            85: 2/10/89:
        !            86: 
        !            87: -A now warns about calls to functions without prototypes.  diagnostics
        !            88: now include only the line number and omit the character position.
        !            89: empty declarations in parameter lists (eg, "f() struct s {int x;};")
        !            90: are now errors, and other empty declarations (eg, "int;") now draw
        !            91: warnings.  no longer forbids const struct members (eg, "struct {const
        !            92: int a,b;}").  several internal but theoretically invisible changes.
        !            93: 
        !            94: 2/11/89:
        !            95: 
        !            96: fixes an endless compiler loop and a bug in bit field initialization
        !            97: that showed up only on the mips.
        !            98: 
        !            99: 2/14/89:
        !           100: 
        !           101: improves constant folding (eg, 0&&x, -1&x).  fixes bugs:  applying
        !           102: sizeof to explicit array types sometimes made lcc loop or crash; some
        !           103: dissimilar floating point constants (eg, -111111.0 and
        !           104: -111111.00000000002) were treated as equivalent during constant
        !           105: folding; some conditional exprs involving constants gave a compiler
        !           106: error (eg, i = 5.6 && i ? 1 : 2;) or bad code (eg, *p = (int *)0 &&
        !           107: *(int *)0 ? 4 : 5;).  fixes a bug in the code that spills a temporary
        !           108: register when they're all gone; numerical programs were the most likely
        !           109: to have been effected.
        !           110: 
        !           111: 2/17/89:
        !           112: 
        !           113: fixes an assertion failure in the code that spills a register.
        !           114: 
        !           115: 2/24/89:
        !           116: 
        !           117: /usr/include/nlcc shipped.  it's a directory of mostly new .h files for
        !           118: lcc.  in 10 days or so, these files will replace those now in
        !           119: /usr/include/lcc, which lcc searches before /usr/include.
        !           120: 
        !           121: fio.h, libc.h, and u.h are non-ansi local contributions from various
        !           122: sources.  the rest are intended to match the standard, which can be
        !           123: irritating but is necessary for portability.  the standard errno.h is
        !           124: omitted because the local one suits ansi.
        !           125: 
        !           126: users interested more in convenience than in portability are welcome
        !           127: to edit fio.h, libc.h, and u.h and to add new .h files; do so on
        !           128: bowell or your changes will get lost.  don't edit the other headers --
        !           129: they're maintained mechanically from another source.  if you find a bug
        !           130: in one of these, post cwf and princeton!drh.  for portability, we want
        !           131: to keep non-standard stuff out of these files, but we do want to hear
        !           132: about bugs.
        !           133: 
        !           134: these are just headers.  lcc will continue to use cc's libraries
        !           135: indefinitely.
        !           136: 
        !           137: 3/1/89:
        !           138: 
        !           139: in the absence of -g, removes immediate tail recursion from
        !           140: non-variadic functions.  old-style, variadic, tail-recursive functions
        !           141: are optimized incorrectly, so give a prototype.
        !           142: 
        !           143: -s now controls which switches become branch tables; the man page
        !           144: elaborates.  also, the man page now warns of bad code for switches over
        !           145: 32kb; repairs soon.
        !           146: 
        !           147: fixes bug that put formals in scope too early, which caused bad code
        !           148: or core dumps for some programs like "int a;f(a)int a[sizeof a];{}".
        !           149: no longer treats 1/0 and similar expressions as constant expressions.
        !           150: corrects diagnostics and compiler crashes for certain erroneous
        !           151: inputs.
        !           152: 
        !           153: adds gauss to distribution list.
        !           154: 
        !           155: 3/10/89:
        !           156: 
        !           157: implements 2c's structure extensions, except for in-line structure
        !           158: exprs.  replaces -s with -d to avoid conflict with ld's -s.  adds -v,
        !           159: which prints commands as they are executed; see the man page.  uses the
        !           160: two-operand instructions like addl2 a little more often.  places
        !           161: initialized const data in a readonly segment.  bags casel
        !           162: instructions, so switches over 32kb now work.  no longer omits
        !           163: unreferenced, anonymous types from -g symbol tables.  improves
        !           164: diagnostics.
        !           165: 
        !           166: corrects a few bugs in /usr/include/nlcc, which replaces
        !           167: /usr/include/lcc on 3/14.  speak now or forever hold your peace.
        !           168: 
        !           169: 3/11/89:
        !           170: 
        !           171: corrects bad code for switches and for "y>(float)0.0?y:-(double)y".
        !           172: avoids an ld bug with external initialized consts.
        !           173: deletes -B's "using" message.
        !           174: 
        !           175: 3/16/89:
        !           176: 
        !           177: /usr/include/lcc shipped, a couple of days later than promised.  it's
        !           178: exactly what's been soaking in /usr/include/nlcc, in which fio.h,
        !           179: libc.h, and u.h were the latest local contributions (at least on
        !           180: coma), and the rest were conformed with the standard, except that the
        !           181: standard errno.h was omitted because the local one suits ansi.
        !           182: 
        !           183: the old headers are in /usr/include/olcc, so try -I/usr/include/olcc
        !           184: if you get in a jam.  /usr/include/nlcc unshipped.
        !           185: 
        !           186: users interested more in convenience than in portability are welcome
        !           187: to edit fio.h, libc.h, and u.h and to add new .h files; do so on
        !           188: bowell or your changes will get lost.  don't edit the other headers --
        !           189: they're maintained mechanically from another source.
        !           190: 
        !           191: these are just headers.  lcc continues to use cc's libraries.
        !           192: 
        !           193: 3/23/89:
        !           194: 
        !           195: fixes a register fragmentation bug by eschewing odd double registers;
        !           196: if you use a lot of doubles, retry any regression tests that you might
        !           197: have.  fixes bugs in a few diagnostics.  assert.h may now be included
        !           198: more than once without calamity.  -P prints function prototypes for all
        !           199: defined functions and globals in a form suitable for use in header
        !           200: files; see the man page.  plus several internal changes that should
        !           201: have no effect.
        !           202: 
        !           203: 3/29/89:
        !           204: 
        !           205: fixes several spill bugs; code with large double exprs is most
        !           206: likely to have been bogus.  accepts wide-character literals and treats
        !           207: them like ordinary character literals.  treats `long int' and `long
        !           208: double' as types distinct from int and double, but with the same sizes
        !           209: and alignments; they had been treated as identical types, which is
        !           210: wrong.  deletes bogus diagnostics for:
        !           211: 
        !           212:        int *const p = (int *const)0;
        !           213:        int *x = (f(), 0);
        !           214:        typedef int I;main(){I I(I);}
        !           215: 
        !           216: 3/29/89:
        !           217: 
        !           218: fixes two bugs new in this morning's (3/29) lcc:
        !           219: 
        !           220: calls to char and short functions gave a fatal compiler error.
        !           221: 
        !           222: type `unsigned long int' was missing; variables so declared were taken
        !           223: to be `long int', so, for example, right shift of an unsigned long
        !           224: erroneously extended the sign bit.  the repair causes non-trivial
        !           225: expressions involving long int, long unsigned, and long double to have
        !           226: types int, unsigned, and double, respectively.  this behavior should
        !           227: not affect the generated code because ints *are* long ints, etc., but
        !           228: it might mask type errors.
        !           229: 
        !           230: 4/16/89:
        !           231: 
        !           232: bug fixed:  casts to enum types weren't treated as ints.
        !           233: 
        !           234: new feature:  in asm("string") occurrences of `%name' are replaced by
        !           235: the address or register for the identifier `name' if `name' is
        !           236: visible.  the man page elaborates.
        !           237: 
        !           238: /usr/include/lcc now holds only the headers specified by the ANSI
        !           239: standard.  The local headers (fio.h, libc.h, u.h) and a local version
        !           240: of stdio.h are now in /usr/include/libc.  lcc now searches the latter
        !           241: before the former, so the default will find the local stdio.h.  -N
        !           242: tells lcc to discard its usual search list and use only directories
        !           243: named in explicit -I args.  So use "lcc -N -I/usr/include/lcc" to
        !           244: ensure conformance with the ANSI standard.  Report bugs in the standard
        !           245: headers to cwf.  Report bugs in the local headers to rob.  Don't edit
        !           246: either set directly -- they're maintained mechanically from central
        !           247: sources, so edits will get lost.
        !           248: 
        !           249: 4/19/89:
        !           250: 
        !           251: some function definitions inconsistent their prototypes went
        !           252: undetected (eg, extern int f(int); void f(x)int x;{}).
        !           253: 
        !           254: long ints were erroneously promoted to ints.  this bug showed up in
        !           255: prototype errors (eg, extern f(long); f(n) long n; {}).
        !           256: 
        !           257: implements 2c's in-line struct exprs ((struct foo) {...}).  the code's
        !           258: poor, and run-time alignment errors can occur for incomplete exprs.
        !           259: improvements soon.
        !           260: 
        !           261: structs have always been aligned to suit their strictest member.  to
        !           262: fix some alignment crashes on the mips, they are now additionally
        !           263: guaranteed int alignment (four bytes on all current targets).  so
        !           264: recompile all modules that use structures composed entirely of chars
        !           265: and shorts.  yacc and lex produce some.
        !           266: 
        !           267: 4/28/89:
        !           268: 
        !           269: "-(unsigned long)x" crashed the compiler.  bit fields and functions
        !           270: were erroneously permitted as arguments to sizeof.  pointers to enums
        !           271: were not treated as pointers to ints, which drew erroneous type errors
        !           272: (eg, in "enum {...} *ap; int *x = ap;").
        !           273: 
        !           274: local arrays are now guaranteed int alignment.  the old, weaker
        !           275: alignment sometimes made array initialization code crash on the mips.
        !           276: 
        !           277: "#pragma ref id" now simulates a reference to id; it may be used to
        !           278: suppress a warning about an otherwise unreferenced variable (eg, a
        !           279: sccs id).
        !           280: 
        !           281: -N now turns off the non-ansi local extensions in addition to restricting
        !           282: the search for header files to only those directories named by -I.
        !           283: 
        !           284: 5/1/89:
        !           285: 
        !           286: fixes bug in some subscript computations for multi-dimensioned char
        !           287: arrays of length 4 or less.  this bug occurred only in the presence of
        !           288: char arrays in which each element was initialized or initialized
        !           289: structs with bit fields.
        !           290: 
        !           291: 5/11/89:
        !           292: 
        !           293: improves code for arithmetic and boolean ops on chars and shorts.  if
        !           294: you use these a lot, run any regression tests that you have.
        !           295: 
        !           296: the algorithm used to induce register variables has been changed.
        !           297: registers are assigned to locals and parameters if their weighted
        !           298: reference count is at least 3.  each reference counts adds X, where X
        !           299: starts out at 1 and is multiplied by 10 in each loop, by 1/2 in each
        !           300: then/else, and by 1/10 in each switch.
        !           301: 
        !           302: 4/28's fix that made `pointer to enum' equivalent to `pointer to int'
        !           303: was too permissive.  warnings are now issued for assignments between
        !           304: `pointer to int' and `pointer to enum'.  all other combinations are
        !           305: errors.
        !           306: 
        !           307: structs are no longer guaranteed int alignment.  they are still aligned
        !           308: to suit their strictest member.  recompile modules that use structures
        !           309: composed entirely of chars and shorts.  yacc and lex produce some.
        !           310: 
        !           311: tail recursion is no longer removed.  errors occurred when locals were
        !           312: aliased.
        !           313: 
        !           314: some valid combinations of qualified pointers in result arms of ?:
        !           315: caused erroneous diagnostics, and incorrect uses of types pointer and
        !           316: int in result arms of ?: went undetected.
        !           317: 
        !           318: some subscript computations for multi-dimensioned char arrays of
        !           319: length 4 or less were incorrect because their types were mangled.
        !           320: this bug occurred only in the presence of char arrays in which each
        !           321: element was initialized or initialized structs with bit fields.
        !           322: 
        !           323: casts from integer types to long double were silently ignored.  real
        !           324: constants suffixed by "l" or "L" were erroneously type double; they're
        !           325: now type long double.
        !           326: 
        !           327: UINT_MAX was missing from <limits.h>.  time_t, wchar_t, size_t and
        !           328: clock_t are now protected from redefinition.  the compiler erroneously
        !           329: accepted and silently ignored preprocessor statements; except for
        !           330: #pragma, they now draw an error.
        !           331: 
        !           332: 5/19/89:
        !           333: 
        !           334: f(){int (*a)[];(*a)[5] = 0;} is now accepted.
        !           335: 
        !           336: variables referenced mainly in deeply nested control structure were
        !           337: erroneously reported as unreferenced.
        !           338: 
        !           339: no more arbitrary limit on the number of scope levels.
        !           340: 
        !           341: 5/27/89:
        !           342: 
        !           343: Type casts were erroneously accepted as l-values.  On the vax, bad code
        !           344: was silently generated for signed div and mod ops when the destination
        !           345: was a (signed or unsigned) char or short.
        !           346: 
        !           347: 6/2/89:
        !           348: 
        !           349: now accepts "int a = 3;extern int a;".  some constant expressions with
        !           350: casts were not accepted as constants (eg, ~((unsigned short) 0)).
        !           351: fixes bad code for struct args whose size is not divisible by four.
        !           352: 
        !           353: 6/8/89:
        !           354: 
        !           355: improves diagnostics.  some valid field references in extended
        !           356: structures were erroneously flagged as errors.  e&0 always returned 0
        !           357: and never evaluated e, even if e had side effects.  ignores
        !           358: unrecognized preprocessor control lines.
        !           359: 
        !           360: 8/3/89:
        !           361: 
        !           362: fixes compiler crashes caused by long string constants with lots of
        !           363: escaped characters.
        !           364: 
        !           365: the va_start macro in stdarg.h did not handle char or short arguments
        !           366: correctly.
        !           367: 
        !           368: on the vax, bad code was generated for some assignments to unsigned
        !           369: char (eg, "char a[10]; unsigned char b = a[i];").
        !           370: 
        !           371: signed divisions by a constant power of two are no longer performed by
        !           372: shifts; the results were inconsistent with the standard, which
        !           373: requires that (a/b)*b + a%b == a.
        !           374: 
        !           375: some illegal casts in constant expressions were erroneously accepted
        !           376: (eg, "int x, y=(int)&x;").
        !           377: 
        !           378: missing tags were erroneously permitted in some struct declarations
        !           379: (eg, "struct *p;").
        !           380: 
        !           381: now allows a terminal comma in enums, unless -N (strict ANSI) is
        !           382: specified.
        !           383: 
        !           384: warns about switch statements with no cases and about functions
        !           385: declared static but never defined or referenced.
        !           386: 
        !           387: with -A, warnings about missing prototypes are now issued only once
        !           388: instead of once per call.
        !           389: 
        !           390: doug has merged the man pages for cc and lcc.
        !           391: 
        !           392: 8/8/89:
        !           393: 
        !           394: fixes bad code for x=y<<1 when x is a short.
        !           395: 
        !           396: 8/29/89:
        !           397: 
        !           398: preprocessor generated lines of the form `# n "name"' and `# n' are
        !           399: accepted.
        !           400: 
        !           401: repeated initializations of an array type defined by a typedef
        !           402: (typedef char str[]; str a = "hi", b = "there";) elicited incorrect
        !           403: error messages.
        !           404: 
        !           405: on the mips, some initialized structures that began with a char or
        !           406: short were misaligned.
        !           407: 
        !           408: shamash and bartok added to the shipping list.
        !           409: 
        !           410: 9/16/89:
        !           411: 
        !           412: better code for comparing bit fields with 0 and for setting them to all
        !           413: 1s or 0s; manipulating 1-bit fields is as efficient as using flags with
        !           414: explicit | and & operators.
        !           415: 
        !           416: eliminates more dead code.
        !           417: 
        !           418: eliminates multiple copies of some constants.
        !           419: 
        !           420: fixes bad code for multiple assignment to bit fields in the same word
        !           421: (eg, struct { unsigned x:1,y:1; } *p; p->x = p->y = 1;).
        !           422: 
        !           423: fixes bad code for some logical operators with constant operands (eg,
        !           424: x||1).
        !           425: 
        !           426: fixes a compiler crash on the mips for some calls that pass a float and
        !           427: return a struct.
        !           428: 
        !           429: 9/29/89:
        !           430: 
        !           431: takes care to emit only non-empty .s files on the mips, whose assembler
        !           432: cares.  corrects bad mips code in some cases when one of the first four
        !           433: formals gets assigned to a register and is declared (old-style) to be a
        !           434: (single-precision) float.
        !           435: 
        !           436: 10/4/89:
        !           437: 
        !           438: in unions with bit fields, the offsets for subsequent fields were
        !           439: wrong.  unions comprised entirely of bit fields were thought to be of
        !           440: size 0, which drew a bad diagnostic.  math.h's HUGE_VAL is now less
        !           441: conservative.  several numbers in limits.h were wrong.
        !           442: 
        !           443: 10/21/89:
        !           444: 
        !           445: hex escapes now properly include the longest possible run of hex digits
        !           446: after the \x, even when the value is too big for a char.  lcc truncates
        !           447: and warns about octal and hex escapes with values that won't fit in 8
        !           448: bits.  it also warns about undefined escapes like \c.
        !           449: 
        !           450: local declarations of static functions that were previously defined
        !           451: drew erroneous mismatched declaration warnings.
        !           452: 
        !           453: better code for e1?e2:0.
        !           454: 
        !           455: fixes bad struct returns for functions that explicitly declare more
        !           456: register locals than lcc allows for the target.
        !           457: 
        !           458: different code for spills.
        !           459: 
        !           460: on the 68020, fixes bad code for "return i%j".
        !           461: 
        !           462: limits.m4 now casts INT_MIN to int and LONG_MIN to long.  without the
        !           463: casts, the 0x80000000 ended up unsigned.
        !           464: 
        !           465: 10/24/89:
        !           466: 
        !           467: for new-style functions, float actuals corresponding to int or long
        !           468: formals went unconverted.  eg, "f(int x) { float y; f(y); }" failed to
        !           469: convert y.
        !           470: 
        !           471: error messages for the redeclaration of enum ids misreported the
        !           472: location of the previous declaration.
        !           473: 
        !           474: on the vax, <unsigned constant> >> <anything> generated bad code.
        !           475: 
        !           476: on the vax, casts that narrowed and then widened an indexing expr
        !           477: generated bad code.
        !           478: 
        !           479: limits.h substitutes exprs for some hard constants to reduce machine
        !           480: dependencies.
        !           481: 
        !           482: 11/3/89:
        !           483: 
        !           484: a missing } at the end of file drew a garbled diagnostic.
        !           485: 
        !           486: lcc crashed when a conditional expr fed a binary op that fed a
        !           487: bit field assignment.
        !           488: 
        !           489: lcc crashed when the value of x?y:0 was not used.
        !           490: 
        !           491: new driver for lcc.  no -M.  preprocessor and compiler are now
        !           492: connected with a pipe.  flags must now precede file names and
        !           493: libraries.
        !           494: 
        !           495: 11/7/89:
        !           496: 
        !           497: on the vax, fixed bad code for *s&&*s++.
        !           498: 
        !           499: 11/17/89:
        !           500: 
        !           501: casts of constants to illegal types caused an assertion failure.  no
        !           502: longer warns about switches with only the default case.  now allows
        !           503: more generated labels.  the new driver hung on long programs with too
        !           504: many errors.
        !           505: 
        !           506: on v9 vaxes, now supplies -J to the assembler.
        !           507: 
        !           508: on tempel, RAND_MAX was too small.  on all mips machines, lcc exited
        !           509: with status 0 even with errors.  an omission from the mipsco docs led
        !           510: to an incompatibility with code from cc for new-style functions with
        !           511: single-precision floats as arguments 2, 3, or 4.
        !           512: 
        !           513: 12/26/89:
        !           514: 
        !           515: constants burn less time and space.  large initializations compile much
        !           516: faster.
        !           517: 
        !           518: vertical tabs and form feeds were previously treated as newlines;
        !           519: they're now treated as blanks.
        !           520: 
        !           521: ~~x and -(-x) have been replaced with just x.
        !           522: 
        !           523: specifying both -A and -n drew inappropriate missing prototype
        !           524: messages.
        !           525: 
        !           526: types defined in parameter lists were inaccessible within the
        !           527: function.
        !           528: 
        !           529: the compiler crashed when the value of "x,y" was used and y was a
        !           530: relational or conditional expr.
        !           531: 
        !           532: the compiler crashed when a void (eg, via a cast) was assigned to a bit
        !           533: field.
        !           534: 
        !           535: on the mips, an invalid instruction was generated for a register float
        !           536: used as argument 2, 3, or 4.  the assembler rejected it.
        !           537: 
        !           538: on the mips, literals have been moved to the text segment.
        !           539: 
        !           540: on the mips, -p now works.  as with cc on (only) these machines, it
        !           541: does not count calls.  for that, use "pixie", which works with lcc's
        !           542: a.outs.
        !           543: 
        !           544: on the 68020, -g generated incomplete symbol table information for
        !           545: structures that were used before being defined
        !           546: (eg "struct A; g(struct A *x) {} struct A { int a,b; };")
        !           547: 
        !           548: CLOCKS_PER_SECOND is now 1000000 everywhere.  that's now consistent
        !           549: with the clock function on the mips and 68020 machines, and it's
        !           550: irrelevant on the vaxes, because their libraries don't include the
        !           551: function.
        !           552: 
        !           553: numerous internal improvements, all theoretically invisible.
        !           554: 
        !           555: 2/2/90:
        !           556: 
        !           557: sizeof erroneously returned an int.  it now returns an unsigned as
        !           558: dictated by ANSI.  WARNING: the pre-ANSI sizeof returned an int, so lcc
        !           559: has been masking a potential problem with the conversion of pre-ANSI
        !           560: programs.
        !           561: 
        !           562: casts in integer constant exprs in array bounds, enum defs, and field
        !           563: widths sometimes gave bad values.
        !           564: 
        !           565: string constant arguments of asm directives were handled wrong, which
        !           566: made the compiler crash or emit bad diagnostics.
        !           567: 
        !           568: comparisons of ints and pointers like i==(int*)1 crashed the compiler.
        !           569: 
        !           570: arrays with unspecified bounds are now noted as an `incomplete array'
        !           571: in error messages.
        !           572: 
        !           573: reuses of common subexprs in conditional exprs sometimes generated bad
        !           574: code.
        !           575: 
        !           576: on the vax, bad code was generated for unsigned right shift by a
        !           577: non-constant when r0 was busy.
        !           578: 
        !           579: on the suns, the register save mask at function entry and exit for
        !           580: floating point registers was incorrect.
        !           581: 
        !           582: lcc -E foo.i (foo.s) erroneously compiled (assembled) the given file.
        !           583: 
        !           584: several theoretically transparent internal changes.
        !           585: 
        !           586: 2/20/90:
        !           587: 
        !           588: lcc no longer crashes when presented with local arrays of undefined
        !           589: structs or with calls to functions that return const structs.
        !           590: 
        !           591: u%2^n now generates the same code as u&(2^n-1) for unsigned u and
        !           592: constant 2^n.
        !           593: 
        !           594: on the suns, RAND_MAX is now 2^31-1, which contradicts the man page but
        !           595: is consistent with what rand() seems to do.
        !           596: 
        !           597: 2/21/90:
        !           598: 
        !           599: fixes bad code introduced yesterday on all targets for u%2^n for
        !           600: unsigned u and constant 2^n.
        !           601: 
        !           602: 2/28/90:
        !           603: 
        !           604: multiple assignments to bit fields in the first word of a struct (like
        !           605: struct {unsigned a:1,b:1;} x; x.a=x.b=1;) no longer generate bad code.
        !           606: 
        !           607: extra parentheses in declarations (like int *(x(int));) sometimes crashed
        !           608: the compiler.
        !           609: 
        !           610: the driver sometimes erroneously removed input .o files.
        !           611: 
        !           612: -Wp<arg> now passes <arg> to the preprocessor.  -Wa, -Wl, and -Wf do
        !           613: likewise for the assembler, linker, and compiler proper.  <arg> is
        !           614: passed untouched; if the recipient expects a leading dash, give it
        !           615: explicitly.
        !           616: 
        !           617: -T is gone.  use -Wp-T instead.
        !           618: 
        !           619: 3/2/90:
        !           620: 
        !           621: fixed incorrect optimization of i%1 on all machines.
        !           622: 
        !           623: on the vax, -Wf-k now avoids some of the instructions that may fail
        !           624: when used to access i/o space.  it does not protect against all
        !           625: dangers:  don't touch i/o space via the program counter, floating point
        !           626: instructions, struct copies (including struct args and return values),
        !           627: or calls (eg, don't index a table of function pointers with an i/o
        !           628: cell).  i can't thoroughly test this option myself, so beware.
        !           629: 
        !           630: 3/8/90:
        !           631: 
        !           632: relaxes an overzealous assert() in the register spiller.
        !           633: 
        !           634: many internal cleanups, all theoretically invisible outside.
        !           635: 
        !           636: 3/17/90:
        !           637: 
        !           638: the compiler was crashing on x+=(const int)1
        !           639: 
        !           640: on the mips, fixes bad code for functions that take a double or float
        !           641: as arg#1 and return a struct.
        !           642: 
        !           643: on the vax, slightly different tradeoffs between movl $_x and moval _x.
        !           644: 
        !           645: 3/26/90:
        !           646: 
        !           647: better assignment of variables to registers.  explicit register dcls
        !           648: are still obeyed first, but any remaining regs are now assigned to
        !           649: variables in order of estimated payoff.
        !           650: 
        !           651: bad floating constants like 1e and 1e+ were erroneously accepted.
        !           652: 
        !           653: diagnostics for illegal break and continue statements were garbled.
        !           654: 
        !           655: inline struct expressions now accept struct-valued fields, eg
        !           656: struct Point { int x, y; } p, q;
        !           657: struct Rectangle { struct Point min, max;} r = (struct Rectangle){p, q};
        !           658: 
        !           659: on v9 vaxes, lcc now emits some symbol table data even without -g.  the
        !           660: intent is to mimic cc, though lcc documents globals as well as locals
        !           661: and formals.
        !           662: 
        !           663: compiler flags are no longer required to precede filenames.  like cc,
        !           664: they may appear anywhere but are processed before any files.
        !           665: 
        !           666: lcc, like cc, now removes a .o file iff exactly one source file (.c,
        !           667: .s, .i) appears and no other file (source, object, library) or -l
        !           668: option appears.
        !           669: 
        !           670: 5/9/90:
        !           671: 
        !           672: warnings are no longer issued for calls to struct functions in which
        !           673: the returned struct is not used.
        !           674: 
        !           675: lines containing only white space and one # are now ignored.
        !           676: 
        !           677: -N now suppresses recognition of asm("...").
        !           678: 
        !           679: ansi multibyte characters like 'abc' are now accepted, and lcc warns
        !           680: about ignoring the excess characters.
        !           681: 
        !           682: -P now prints char* even if a typedef for char* has been defined.
        !           683: 
        !           684: sizeof(L'x') is now correctly the same as sizeof(wchar_t), which is 1.
        !           685: sizeof('x') is still the same as sizeof(int), as it must be.
        !           686: 
        !           687: for constant y, 0&&y (0||y) erroneously returned y instead of y!=0.
        !           688: 
        !           689: initializing char a[N] with a string of exactly N chars caused the
        !           690: trailing null byte to be omitted from other N-char strings appearing
        !           691: before the offending initialization.
        !           692: 
        !           693: the value of bit field assignments was erroneously taken to be the
        !           694: right operand instead of the value of the left operand.  eg, for
        !           695: an unsigned 3-bit field x, f(b.x=15) passed 15.  it now passes 7.
        !           696: 
        !           697: casts and structs returned by functions were erroneously permitted as
        !           698: l-values.
        !           699: 
        !           700: exprs like &(((struct foo)0)->x[0]) and array-sizeof(array) were not
        !           701: recognized as constant.  they were thus erroneously forbidden in
        !           702: initializers.
        !           703: 
        !           704: casts in the operands of ?: sometimes caused an assertion failure.
        !           705: 
        !           706: using the value from a postincrement or postdecrement of a bit field
        !           707: caused an assertion failure.
        !           708: 
        !           709: legal comparisons of qualified and unqualified compatible pointers were
        !           710: erroneously diagnosed as type errors.
        !           711: 
        !           712: for function f, &f was erroneously diagnosed as an error.
        !           713: 
        !           714: types `function returning T' and `array of T' were not uniformly converted
        !           715: to `pointer to function returning T' and `pointer to T', respectively.
        !           716: 
        !           717: char *a; void *b; a?b:c was erroneously diagnosed as a type error.
        !           718: 
        !           719: initialization of automatic structs with const fields was erroneously
        !           720: diagnosed as an assignment error.
        !           721: 
        !           722: types other than int, signed int, or unsigned int were erroneously
        !           723: permitted for bit fields and const and volatile qualifiers were
        !           724: erroneously forbidden.
        !           725: 
        !           726: repeated block-level declarations for functions were erroneously
        !           727: diagnosed as redeclaration errors.
        !           728: 
        !           729: valid assignment of pointers to qualified or unqualified versions of
        !           730: compatible types was erroneously diagnosed as a type error, e.g.,
        !           731: const char *a;const char *volatile *b=&a;
        !           732: 
        !           733: on the 68020, lcc gave bad code for x=f(x) where f returns a struct.
        !           734: 
        !           735: on the 68020, lcc erroneously converted floats and doubles to ints by
        !           736: rounding.  it now correctly truncates any fraction.
        !           737: 
        !           738: on the 68020 and mips, lcc gave bad code for calls in which the
        !           739: function was computed with another call, like (*g(f(1)))(2).
        !           740: 
        !           741: on the mips, -p caused prof to report incorrect file names.
        !           742: 
        !           743: on the mips, fixes bad code for f(x<op>y) when x is a floating point
        !           744: register and <op> is an augmented assignment.
        !           745: 
        !           746: on the vax, fixes bad code for signed comparisons of chars with
        !           747: constants not in [-0x80..0x7f] and of shorts with constants not in
        !           748: [-0x8000..0x7fff].  lcc treats plain chars as signed chars, so they
        !           749: were afflicted too.
        !           750: 
        !           751: on the vax, fixes bad code for u>0 and u<=0, for any unsigned expr u.
        !           752: 
        !           753: the dummy parameter names were removed from the ansi include files.
        !           754: eg, f(int x) is now f(int) instead.  
        !           755: 
        !           756: limits.h was rewritten to use simpler exprs and to avoid casts.
        !           757: #if misevaluated some of the old exprs, and it doesn't do casts.
        !           758: 
        !           759: don't use the unsigned constant suffix (eg, 0u) in #if commands.
        !           760: the preprocessor can't cope.
        !           761: 
        !           762: numerous theoretically invisible internal improvements.
        !           763: 
        !           764: 5/9/90:
        !           765: 
        !           766: The lcc compiler now passes the conformance section of Version 1.09 of
        !           767: the Plum Hall Validation Suite for ANSI C, subject to the restrictions
        !           768: below.
        !           769: 
        !           770: We do not have a conforming preprocessor or library.
        !           771: 
        !           772: The lcc command must use -N and enable trigraphs with -Wp-T.  It must
        !           773: use -I to search only the ANSI standard headers.  It may need to
        !           774: undefine some of the system-specific pre-defined symbols;  -v exposes
        !           775: these.
        !           776: 
        !           777: The only versions of lcc tested to date are the ones running on the SGI
        !           778: 4D/240S under IRIX System V Release 3.2.1, on the VAX 8550 under
        !           779: UNIX V10, and on the Sun-3 under SunOS Release 4.0.
        !           780: 
        !           781: 5/11/90:
        !           782: 
        !           783: for float constant x, -x was not recognized as constant.
        !           784: 
        !           785: for volatile x, x++ drew unwarranted warnings.
        !           786: 
        !           787: 7/6/90:
        !           788: 
        !           789: stores enums in unsigned/signed chars, unsigned/signed shorts, or ints
        !           790: depending on the range of the enum constants.  this change may alter
        !           791: struct layouts and the size of globals, so discard old object files
        !           792: that use enums.  it also causes diagnostics when new-style declarations
        !           793: are mixed with old-style definitions for functions with enum arguments,
        !           794: so enum foo {a,b,c}; int f(enum foo); ... f(x) enum foo x; {...}
        !           795: is equivalent to int f(char); ... f(x) char x; {...}
        !           796: which is an error because the prototype in the declaration doesn't
        !           797: match the prototype inferred from the definition (which is int f(int)).
        !           798: 
        !           799: permits up to 127 formals.
        !           800: 
        !           801: limits identifiers and numeric constants to 64 characters;
        !           802: string constants can have up to 4096 characters.
        !           803: 
        !           804: better diagnostics; some warnings are now errors.
        !           805: 
        !           806: eliminates more branch chains.
        !           807: 
        !           808: on the mips, lcc now truncates constant shift counts to 5 bits.  the
        !           809: assembler did this before, but it squawked first.
        !           810: 
        !           811: -t produces code to print trace messages at function entry & exit.
        !           812: 
        !           813: the driver now ignores duplicate `.o' files, eg, `lcc x.c x.o' is
        !           814: identical to `lcc x.c'.
        !           815: 
        !           816: provides errno.h, which simply includes /usr/include/errno.h.
        !           817: 
        !           818: numerous internal improvements, all theoretically invisible.
        !           819: 
        !           820: errors fixed:
        !           821: 
        !           822: erroneously permitted 0x as a hexadecimal constant.
        !           823: 
        !           824: failed to treat (double)<unsigned constant> as constant.
        !           825: 
        !           826: did not detect overflow in enumeration constants, eg, for B in
        !           827: enum {A=INT_MAX, B}.  it still fails to detect underflow/overflow in
        !           828: constant expressions, which it really ought to do.
        !           829: 
        !           830: erroneously permitted declarations and definitions for functions
        !           831: returning unknown structures.
        !           832: 
        !           833: erroneously permitted application of unary + to any scalar type.
        !           834: 
        !           835: erroneously permitted comma expressions in constant expressions.
        !           836: 
        !           837: erroneously permitted negative bit field widths.
        !           838: 
        !           839: did not recognize simple function types in casts, eg, int().
        !           840: 
        !           841: incorrectly used the type of x or y for c?x:y where c is a constant;
        !           842: the correct type is the composite type of x and y; eg, the type of
        !           843: 1?(char*)p:(const char*q) is const char* not char* .
        !           844: 
        !           845: `lcc -g foo.i' emitted incorrect line number information if foo.i
        !           846: didn't include `# n file' directives.
        !           847: 
        !           848: -g did not emit line number information for initialized locals.
        !           849: 
        !           850: 7/9/90:
        !           851: 
        !           852: on the vax, lcc generated code that wouldn't even assemble for
        !           853: char c;unsigned short *v;f(){c = v[c];}
        !           854: 
        !           855: 8/27/90:
        !           856: 
        !           857: -b produces code that writes an expression-level profile into
        !           858: prof.out.  bprint turns the data into an annotated listing, and lcc
        !           859: -Wf-a uses it to improve register assignments.  the man pages for lcc
        !           860: and bprint elaborate.
        !           861: 
        !           862: warns about implicit returns for functions that return other than int
        !           863: or void; -A includes int functions.
        !           864: 
        !           865: -E now preprocesses unsuffixed file arguments.
        !           866: 
        !           867: sign extends integer right shift in constant expressions on all targets.
        !           868: 
        !           869: many internal improvements, all theoretically invisible.
        !           870: 
        !           871: errors fixed:
        !           872: 
        !           873: -t caused an erroneous redeclaration message for printf.
        !           874: 
        !           875: failed to convert x from double to float in f(x) const/volatile float x; {...}
        !           876: 
        !           877: erroneously forbid const/volatile enum {...} x in switch (x) and in int y=x.
        !           878: 
        !           879: erroneously forbid enum bit fields for enum types that are compatible
        !           880: with int, signed int, or unsigned.
        !           881: 
        !           882: variadic functions with structure arguments did not work; 1 and 2-byte
        !           883: structs still fail on big endians (non-DEC MIPS, Motorola, SPARC), and
        !           884: 8-byte structs and those holding doubles fail on all MIPSes.
        !           885: 
        !           886: with -g on V10 VAXes, bad symbol table names for anonymous structs,
        !           887: unions, and enums.
        !           888: 
        !           889: with -g on the Sun (68020 & SPARC), bad symbol table entries for
        !           890: mutually referential structs.
        !           891: 
        !           892: with -g, misplaced or omitted symbol table entries for statics,
        !           893: externs, typedefs, and types defined in nested blocks.
        !           894: 
        !           895: assertion failure on illegal casts of constants, eg, (struct foo)0.
        !           896: 
        !           897: assertion failure on switch(x.y) {...} where y is an undefined field.
        !           898: 
        !           899: 8/28/90:
        !           900: 
        !           901: on the vax, an unsigned div/mod common subexpr that was also an
        !           902: argument caused lcc to loop.  on the sparc, it happened for all
        !           903: int/unsigned div/mod/mul operations.
        !           904: 
        !           905: 9/5/90:
        !           906: 
        !           907: now permits any number of parameters.
        !           908: 
        !           909: volatile locals and parameters are no longer assigned to registers.
        !           910: 
        !           911: with -g, parameters are no longer assigned to registers; some debuggers
        !           912: couldn't cope.
        !           913: 
        !           914: generated bad symbolic addresses in constant expressions involving
        !           915: externals declared inside blocks.
        !           916: 
        !           917: misdiagnosed as errors some multiple assignments of returned structs,
        !           918: eg, struct p {...} f(); struct r {struct p c;} x,y; x.c = y.c = f();
        !           919: 
        !           920: on sparcs, generated unaligned code after some initialized const data.
        !           921: 
        !           922: 9/13/90:
        !           923: 
        !           924: erroneously elided calls to struct functions in conditional expressions
        !           925: where the resulting value went unused, eg, i?y:f()
        !           926: 
        !           927: assertion failure on conditional expressions with calls to struct
        !           928: functions, eg, x=i?y:f()
        !           929: 
        !           930: improved diagnostics.
        !           931: 
        !           932: theoretically invisible internal improvements.
        !           933: 
        !           934: 9/14/90:
        !           935: 
        !           936: lcc crashed on f(){const struct { int a; } *fp;fp++;}
        !           937: 
        !           938: 9/21/90:
        !           939: 
        !           940: dropped backslashes that appeared at positions evenly divided by 4096.
        !           941: 
        !           942: on v10 vaxes, now emits stab entries for locals even without -g,
        !           943: for consistency with cc.
        !           944: 
        !           945: on sparcs, fixes bad code for some argument lists that perform
        !           946: a mul/div/mod after the third argument.
        !           947: 
        !           948: 10/22/90:
        !           949: 
        !           950: improvements/changes:
        !           951: warns about static declarations that specify incomplete types.
        !           952: 
        !           953: diagnoses declarations that specify objects with sizes >= 2^31.
        !           954: 
        !           955: detects overflow in constant expressions and treats such expressions
        !           956: as non-constant expressions; compiling old code may fail.
        !           957: 
        !           958: better register allocation for leaf functions.  on sparcs, better
        !           959: register allocation for all functions.
        !           960: 
        !           961: elides unreferenced locals.
        !           962: 
        !           963: warns about bit-field initializers that are too big.
        !           964: 
        !           965: with -N, duplicate global definitions in separately compiled
        !           966: files cause loader errors; compiling old code may fail.
        !           967: 
        !           968: improved diagnostics.
        !           969: 
        !           970: errors fixed:
        !           971: erroneously permitted static function declarations in blocks.
        !           972: 
        !           973: erroneously diagnosed valid multiple declarations within blocks.
        !           974: 
        !           975: computed incorrect composite types from multiple declarations.
        !           976: 
        !           977: with -g, the Sun assembler choked on long symbol table entries;
        !           978: continuations are now emitted.
        !           979: 
        !           980: with -t, assertion failure on `return f(x)' where f returns a struct.
        !           981: 
        !           982: bad values for (unsigned)d when 2147483647 < double d <= 4294967295.
        !           983: 
        !           984: erroneously forbid carriage returns in strings.
        !           985: 
        !           986: 10/23/90:
        !           987: 
        !           988: fixes floating overflow in constant multiplications in which one
        !           989: nonzero argument is between -1.0 and 1.0.
        !           990: 
        !           991: 11/28/90:
        !           992: 
        !           993: Now accepts #line.  It has for a month, but I forgot to say so before.
        !           994: 
        !           995: Now ignores multiple occurrences of just `.o' file arguments.
        !           996: Formerly, it ignored multiple occurrences of ALL file arguments.
        !           997: 
        !           998: With -A, now warns about declarations and casts with prototype-less
        !           999: function types.  Formerly, it warned only at calls.
        !          1000: 
        !          1001: Warns about casts from pointers to integral types that are too small.
        !          1002: 
        !          1003: Overflow in constant exprs has been demoted from an error to a warning.
        !          1004: 
        !          1005: Conversions between pointers to objects and pointers to functions are
        !          1006: now properly diagnosed.
        !          1007: 
        !          1008: Void and struct operands to bitwise and, or and xor operators no longer
        !          1009: cause an assertion failure.
        !          1010: 
        !          1011: With -t, an illegal void return value or argument no longer causes an
        !          1012: assertion failure.
        !          1013: 
        !          1014: On MIPSes, functions with 3 or more float arguments no longer cause an
        !          1015: assertion failure.
        !          1016: 
        !          1017: On Suns and V10 Vaxes, now detects overflow in float and double
        !          1018: constants.  It is supposed to do so on all targets, but some of them
        !          1019: have sub-standard strtod's.
        !          1020: 
        !          1021: On Suns, lcc now accepts the ld options -Bstatic and -Bdynamic.
        !          1022: 
        !          1023: On SPARCs, fixes bad code when passing structures followed by
        !          1024: floats/doubles.
        !          1025: 
        !          1026: On SPARCs, -p and -pg now work.
        !          1027: 
        !          1028: On V10 VAXes, formals may now get assigned to registers.  An error
        !          1029: introduced several months ago had been forcing them into the stack.
        !          1030: 
        !          1031: 12/6/90:
        !          1032: 
        !          1033: The compiler crashed after diagnosing some syntax errors involving
        !          1034: top-level functions (eg, "void *a();static b(int)c(){}").
        !          1035: 
        !          1036: With -b, the execution count for e2 in "for(e1;e2;e3)S" was wrong for
        !          1037: loops not guaranteed to execute at least once.
        !          1038: 
        !          1039: On the MIPS, the compiler crashed when frequently referenced locals
        !          1040: were used in deeply nested loops.  The reference count estimate
        !          1041: overflowed.
        !          1042: 
        !          1043: On the SPARC, fixes (again!) bad code when passing structures followed
        !          1044: by floats/doubles.
        !          1045: 
        !          1046: On the SPARC, adds missing prototype to infinity() in math.h.
        !          1047: 
        !          1048: 12/13/90:
        !          1049: 
        !          1050: Since 10/26/90, -N has arranged loader diagnostics for duplicate global
        !          1051: definitions in separately compiled modules.  The arrangement, however,
        !          1052: placed uninitialized globals in the data segment, which made some .o
        !          1053: files huge.  Such globals have now been shifted back to the bss
        !          1054: segment, saving space without losing the loader diagnostics.  On the
        !          1055: MIPS, discard old .o files created with -N;  they might be compatable
        !          1056: with new ones, but only an ld expert could guarantee it.
        !          1057: 
        !          1058: [Without -N, uninitialized globals are emitted as "common" blocks, so
        !          1059: loaders -- contrary to ANSI -- may silently merge duplicate
        !          1060: definitions.  -N is overloaded: it also forbids extensions and searches
        !          1061: for includes in only directories given by -I options.]
        !          1062: 
        !          1063: lcc crashed when unknown enum types were used in contexts that required
        !          1064: their sizes.
        !          1065: 
        !          1066: lcc crashed or died with an assertion failure when parameter names were
        !          1067: missing from new-style function definitions (eg, f(int){}).
        !          1068: 
        !          1069: bprint crashed when prof.out had data for functions with >200 execution
        !          1070: point counters.
        !          1071: 
        !          1072: 12/21/90:
        !          1073: 
        !          1074: lcc issued an erroneous ``lvalue required'' diagnostic for x[0]=f()
        !          1075: when f returns a struct.
        !          1076: 
        !          1077: 1/24/91:
        !          1078: 
        !          1079: now reports as errors identifiers longer than 64 characters when they
        !          1080: may cause parsing errors (because they span input buffers).
        !          1081: 
        !          1082: erroneously forbid initialized local const arrays:
        !          1083: f(){const char msg[]="hi";}
        !          1084: 
        !          1085: erroneously warned about missing return values for:
        !          1086: const void f(){}
        !          1087: volatile void f(){}
        !          1088: 
        !          1089: erroneously permitted function definitions with invalid uses of void
        !          1090: arguments, some of which caused the compiler to crash:
        !          1091: f(void,...){}
        !          1092: g(void, int){}
        !          1093: h(void, void){}
        !          1094: 
        !          1095: aborted with an assertion failure on casts of a return value to void:
        !          1096: void f(){return(void)23;}
        !          1097: 
        !          1098: crashed when printing warnings about unreferenced const volatile statics.
        !          1099: 
        !          1100: [I can't reach the Sun-3's or quetzal now.  I'll update these machines
        !          1101: later.]
        !          1102: 
        !          1103: 2/14/91:
        !          1104: 
        !          1105: Misidentified characters with ASCII codes greater than 127.
        !          1106: 
        !          1107: switch(x) where x is a struct or union caused an assertion failure.
        !          1108: 
        !          1109: On the vax, silently generated bad code for
        !          1110: *<expr with ++ or --> = <expr with unsigned div/mod>
        !          1111: (This was fixed last time, but I forgot to announce it.)
        !          1112: 
        !          1113: On the vax, does a better job of using two-operand instructions (eg,
        !          1114: addl2) and deleting gratuitous tst instructions.
        !          1115: 
        !          1116: The warnings have been regularized somewhat.  Use "-A -A" to flag
        !          1117: missing prototypes and as many undefined behaviors as possible; use
        !          1118: "-A" to flag little more than missing prototypes; use no -A options for
        !          1119: relative quiet.
        !          1120: 
        !          1121: with -A, warns about:
        !          1122:    missing prototypes in function types
        !          1123:    missing return value in a return from an int function
        !          1124:   *assignments between pointers to ints and pointers to enumerations
        !          1125:   *conversions from pointers to smaller integral types
        !          1126: 
        !          1127: a second -A also warns about:
        !          1128:    non-ANSI language extensions
        !          1129:    non-ANSI source characters in character and string literals
        !          1130:   *unrecognized control lines
        !          1131:   *unreferenced variables and static functions
        !          1132:   *more than 32kb in an array, struct, or union
        !          1133:    more than 509 characters in a string literal
        !          1134:    more than 127 case labels in a switch statement
        !          1135:    more than 31 formal parameters
        !          1136:    more than 15 levels of nested statements
        !          1137:    more than 127 identifiers declared in a block
        !          1138:    more than 511 external identifiers
        !          1139:    more than 127 fields in a struct or union
        !          1140:    more than 127 enumeration constants in an enumeration
        !          1141: 
        !          1142: * marks those warnings that were given *without* -A previously.
        !          1143: 
        !          1144: Formerly, -N cleared the #include search list, disabled language
        !          1145: extensions, and arranged for duplicate global definitions in separately
        !          1146: compiled files to cause loader errors.  It now fools only with
        !          1147: #includes;  -A -A handles the others.
        !          1148: 
        !          1149: [I can't reach the Sun-4's now.  I'll update them later.]
        !          1150: 
        !          1151: 5/4/91:
        !          1152: 
        !          1153: -A -A now warns about using function designators in conditionals
        !          1154: (eg, f(){int g();if(g);})
        !          1155: 
        !          1156: Null characters in string and character literals are now accepted.
        !          1157: 
        !          1158: Returning the address of a parameter or a local is now an error.
        !          1159: 
        !          1160: The compiler proper no longer ignores \<newline> in string and
        !          1161: character literals; `line splicing' must be done by preprocessors.
        !          1162: 
        !          1163: Erroneously complained about some valid uses of function types,
        !          1164: (eg, int f(int (int));)
        !          1165: 
        !          1166: Using -b to append data to a prof.out compressed by bprint -c corrupted
        !          1167: the execution counts.
        !          1168: 
        !          1169: Erroneously complained about a typedef name used as a label at the
        !          1170: first token in a compound statement (eg, typedef int T; f(){T:;})
        !          1171: 
        !          1172: Erroneously permitted array fields of structs returned by functions to
        !          1173: be passed as arguments (eg, struct foo {char s[63];} g(); f(g().s);)
        !          1174: 
        !          1175: Subsequent definition of unknown enums caused an assertion failure,
        !          1176: (eg, enum foo x; enum foo {a,b,c};)
        !          1177: 
        !          1178: Failed to diagnose empty extern/static declarations of enums or
        !          1179: structs (eg, extern enum foo {a};)
        !          1180: 
        !          1181: Failed to ignore leading white space that spanned input buffers.
        !          1182: 
        !          1183: Failed to promote case labels to the promoted type of the switch
        !          1184: expression (eg, case (char)16.2:).
        !          1185: 
        !          1186: In structs/unions without named bit fields, padding specified by
        !          1187: unnamed bit fields was erroneously omitted in initializations. (eg,
        !          1188: struct { char a; int:0; char b; } x = {'a','b'} misinitialized x.b.)
        !          1189: 
        !          1190: Erroneously complained about extern declarations of sizeless arrays
        !          1191: with block scope that referred to statics with file scope (eg, static
        !          1192: int a[3]; f() { extern int a[]; ...})
        !          1193: 
        !          1194: On the MIPS, better code for conversions from char/short to unsigned.
        !          1195: 
        !          1196: On the MIPS, failed to detect overflow in (1<<31)[*/](-1) and crashed.
        !          1197: 
        !          1198: On the SPARC, taking the address of an argument in leaf functions
        !          1199: caused junk to be stored in the actual argument, eg, f(x){int *p = &x;}
        !          1200: 
        !          1201: On the SPARC, stdlib.h erroneously defined toupper() and tolower() as
        !          1202: macros; they're library functions.
        !          1203: 
        !          1204: On the SPARC, RAND_MAX in stdlib.h was erroneously defined as 32767; it
        !          1205: should be 2^31-1.
        !          1206: 
        !          1207: On Suns, -target sun[34] is now recognized (and ignored).
        !          1208: 
        !          1209: 8/2/91:
        !          1210: 
        !          1211: Now permits -o to name the output file for -c and -S when
        !          1212: invoked with exactly one source file.
        !          1213: 
        !          1214: -t now prints char*'s as a address in hex and as a string.
        !          1215: 
        !          1216: Constants cast to const/volatile were not treated as constant operands
        !          1217: (eg, (const int)23 + 80 was not accepted as a constant expression).
        !          1218: 
        !          1219: Some generated labels were not of the form Ln, which clogged symbol
        !          1220: tables and confused profilers on some targets.
        !          1221: 
        !          1222: The declaration `struct S;' failed to introduce a new type when a
        !          1223: struct S was defined in an enclosing scope.
        !          1224: 
        !          1225: When built with a compiler where `char' is unsigned, lcc failed to
        !          1226: sign-extend `signed char' in constant expressions (eg, (signed char)-4
        !          1227: became 252 instead of -4.)
        !          1228: 
        !          1229: In structs/unions with bit fields, intra-word padding specified by
        !          1230: unnamed bit fields was erroneously omitted in initializations (eg,
        !          1231: struct {int :8;int a:3;}x={1} initialized x.a to 0 instead of 1).
        !          1232: 
        !          1233: Crashed when case labels were given outside of switches.
        !          1234: 
        !          1235: Sometimes computed incorrect values for relationals over two floating
        !          1236: point constants.
        !          1237: 
        !          1238: Erroneously permitted old-style parameter lists in function
        !          1239: delarators.  Some caused the compiler to crash, eg,
        !          1240: int(*f)(a);g(){(*f)(0);}
        !          1241: 
        !          1242: On the 68020, SPARC and VAX, -g emitted bad symbol table data for
        !          1243: typedefs of const/volatile types.
        !          1244: 
        !          1245: On the 68020, lcc suffered an assertion failure occasionally when it
        !          1246: ran out of floating point registers.
        !          1247: 
        !          1248: On the MIPS, now places constants in the read-only data segment instead
        !          1249: of the text segment.
        !          1250: 
        !          1251: On the SPARC, now recognizes as leaves functions that return floats or
        !          1252: doubles but use no other floating-point registers, eg, float f(float
        !          1253: x){return x;}
        !          1254: 
        !          1255: On the SPARC, emitted bad code for leaf functions that took the address
        !          1256: of a float/double argument.
        !          1257: 
        !          1258: 8/13/91:
        !          1259: 
        !          1260: Generated bad code for expressions with multiple references to fields
        !          1261: of structs returned by functions (eg, f().a + g().b).
        !          1262: 
        !          1263: Erroneously diagnosed as errors valid function definitions in which
        !          1264: old-style parameters appeared in a declarator nested in parens (eg, int
        !          1265: (*f(a,b))() int a,b; {}).
        !          1266: 
        !          1267: 9/30/91:
        !          1268: 
        !          1269: "struct S;" is now never an error, even if repeated.
        !          1270: 
        !          1271: Fixed assertion failure when a comparison was used as a value in an
        !          1272: expression that had a type error, like char*f(){int x;x=(x==1|f());}
        !          1273: 
        !          1274: -b profiled "while (e) S" wrong when e is constant and under -g.
        !          1275: 
        !          1276: -P failed to include "const" and "volatile" in its output declarations.
        !          1277: 
        !          1278: On the 68020, the driver now supplies -Dmc68000O in addition to
        !          1279: -Dmc68000.
        !          1280: 
        !          1281: On the MIPS, -Wf-Gn specifies the maximum size for data placed in the
        !          1282: "short data" segment ala cc(1); the default is 8, and 0 causes all data
        !          1283: to be placed in the "data" segment. -Wa-Gn and -Wl-Gn pass similar
        !          1284: flags to the assembler and linker, resp.
        !          1285: 
        !          1286: On the SPARC, structures are now passed using Sun's conventions.
        !          1287: Discard old .o files.
        !          1288: 
        !          1289: If bprint sees that it's about to print a count INSIDE a number or
        !          1290: identifier, it moves the count to just BEFORE the token.  This
        !          1291: heuristic applies only when macros or comments have confused bprint
        !          1292: about the source code.  (Thanks to Doug.)
        !          1293: 
        !          1294: 10/7/91:
        !          1295: 
        !          1296: On the SPARC, generated bad code for functions that are declared to
        !          1297: return a struct but then fail to, like struct node f(){}.
        !          1298: 
        !          1299: -P failed to include "const" and "volatile" in its output declarations.
        !          1300: 
        !          1301: 1/4/92:
        !          1302: 
        !          1303: lcc formerly stopped compiling after 20 errors; -Wf-e<n> now sets the
        !          1304: error limit to <n>.
        !          1305: 
        !          1306: The driver now checks for non-existent or unreadable .c or .i files and
        !          1307: does not try to compile them.
        !          1308: 
        !          1309: Crashed when an unknown typedef declared parameters in old-style
        !          1310: function definitions, like "f(x) T x; {...}".
        !          1311: 
        !          1312: Crashed when both -b and -n were specified.
        !          1313: 
        !          1314: Failed to fold case labels that exceeded the limits of the type of the
        !          1315: associated switch expression, like "int i; switch (i) {case0xeb010000:;}".
        !          1316: This yielded bad duplicate case label diagnostics or incorrect code.
        !          1317: 
        !          1318: Failed to recognize unsigned comparisons with zero as constant expressions.
        !          1319: For example, "int i=5U>=0;" is now accepted.
        !          1320: 
        !          1321: Failed to diagnose structure initializations with excess initializers,
        !          1322: like "struct { int a,b; } x = { 1,2,3 };".
        !          1323: 
        !          1324: Failed to count as references occurrences of identifiers in asm, so
        !          1325: locals with no other references were erroneously deleted.
        !          1326: 
        !          1327: Failed to make each parameter visible at the end of its declarator,
        !          1328: which led to erroneous diagnostics for valid prototypes.  For example,
        !          1329: "f(int a, int b[sizeof a])" is now accepted.
        !          1330: 
        !          1331: errno.h defined more error codes than are specified by the standard; it
        !          1332: now defines only EDOM and ERANGE.
        !          1333: 
        !          1334: assert.h, errno.h, locale.h, stdio.h, stdlib.h, string.h, and time.h
        !          1335: included other headers and thus defined symbols beyond those permitted
        !          1336: by the standard.  They now define only the specified symbols, except for
        !          1337: assert.h, which defines write, sprintf, and abort on some targets.
        !          1338: 
        !          1339: On the MIPS and SPARC, better code for structure assignment and
        !          1340: structure arguments.
        !          1341: 
        !          1342: On the SPARC with -g, gdb and dbx printed incorrect values for parameters
        !          1343: that were changed because of extraneous symbol table entries.
        !          1344: 
        !          1345: On the MIPS with -g, gdb and dbx mislocated some source files when
        !          1346: #include directions contained function and variable definitions.
        !          1347: 
        !          1348: 2/11/92:
        !          1349: 
        !          1350: Erroneously identified T* as the offending type when sizeof(T) is
        !          1351: unknown or 0 (eg, "void *a,*b;a-b;").  Now correctly fingers T
        !          1352: instead.
        !          1353: 
        !          1354: Erroneously allowed arithmetic on `void *const' pointers (eg,
        !          1355: "void *const p; int i; p+i;").
        !          1356: 
        !          1357: Crashed when comparing prototypes with an argument that is a pointer to
        !          1358: a function with a prototype, like
        !          1359: int (*g)(char *,...); void f(int (*)(char *,...)) {} ... f(g);
        !          1360: 
        !          1361: On Suns and BSD VAXes, ctype.h defined static functions _tolower and
        !          1362: _toupper, which prompted `unreferenced' warnings if they weren't used.
        !          1363: 
        !          1364: 4/13/92:
        !          1365: 
        !          1366: Crashed when comparing prototypes that differ in only top-level
        !          1367: qualifiers (eg, int f(int); int f(const int);)
        !          1368: 
        !          1369: The driver no longer ignores extra characters after flags.  As always,
        !          1370: unrecognized flags are sent to the linker; eg, -cg was formerly treated
        !          1371: like -c, but it's now sent to ld, which will complain.
        !          1372: 
        !          1373: Now recognizes the identity u/1U == u for unsigned u.
        !          1374: 
        !          1375: -A -A now correctly complains about switch statements with more than
        !          1376: 257 cases instead of 127.
        !          1377: 
        !          1378: On the SPARC, generated incorrect code for calls with a floating-point
        !          1379: argument followed anywhere by an argument involving an integer or
        !          1380: unsigned division, multiplication, or modulus (eg, int i,j; f() {
        !          1381: f(1.0,i/j); })
        !          1382: 
        !          1383: On the SPARC, generated invalid assembly code for assignments of
        !          1384: structures over 4095 bytes.
        !          1385: 
        !          1386: 12/16/92:
        !          1387: 
        !          1388: changes/improvements:
        !          1389: with -d0, warns about switch statements with huge jump tables, eg,
        !          1390: switch (i) { case INT_MAX: ...; case INT_MIN: ... }
        !          1391: 
        !          1392: now accepts identifiers up to 4096 characters long, although the ANSI
        !          1393: standard requires that only the first 31 be examined.
        !          1394: 
        !          1395: returning a pointer to a local variable now elicits a warning
        !          1396: instead of an error.
        !          1397: 
        !          1398: now warns about eliding references to incomplete types, eg,
        !          1399: void *x; *x;
        !          1400: 
        !          1401: with -A -A, now warns when declaring arrays incomplete types,
        !          1402: eg, extern struct s x[];
        !          1403: 
        !          1404: offsetof is less machine-specific but equivalent to the old one.
        !          1405: 
        !          1406: On the MIPS, uses fewer of the assembler's pseudo-ops.  The assembly
        !          1407: code looks longer, but it should generate about the same machine code.
        !          1408: 
        !          1409: On the MIPS, a few stack frames may be larger, to enforce stricter
        !          1410: alignment for the R4000.
        !          1411: 
        !          1412: errors fixed:
        !          1413: with -n, failed to recognize expressions that dereferenced constant
        !          1414: pointers as valid constant expressions, eg,
        !          1415: struct foo { int a, b; };
        !          1416: unsigned off = (char *)&((struct foo *)0)->b - (char *)0;
        !          1417: 
        !          1418: generated bad code for some inputs for which the compiler needed
        !          1419: numerous temporaries.
        !          1420: 
        !          1421: failed to accept function definitions with multiple top-level
        !          1422: prototypes, eg, int (*g(int c))(char) { c = 0; }
        !          1423: 
        !          1424: failed to warn about overflow in enumeration values, eg,
        !          1425: enum { X = ~0U };
        !          1426: 
        !          1427: ignored trailing characters of long file names in some "#" lines, which
        !          1428: caused erroneous diagnostics. now accepts names upto 512 characters, and
        !          1429: warns about longer ones.
        !          1430: 
        !          1431: erroneously made enumerations visible before their optional values, eg,
        !          1432: enum{A=2}; f() { enum {A=A} i = A; } assigned 0 to i instead of 2.
        !          1433: 
        !          1434: exited with a code of 0 instead of 1 when there was exactly one
        !          1435: "found X expecting Y" diagnostic.
        !          1436: 
        !          1437: failed to detect overflow in hex character constants, eg, '\x100000000'.
        !          1438: 
        !          1439: failed to accept assignment of 0U to pointers.
        !          1440: 
        !          1441: failed to associate tags defined in a parameter list with defining
        !          1442: declarations inside a function, eg,
        !          1443: f(struct S *s) { struct S { int a; }; s->a = 1; }
        !          1444: 
        !          1445: failed to reject function definitions with storage class typedef.
        !          1446: 
        !          1447: failed to accept a trailing `,' in initializers for scalars
        !          1448: and unions, eg, int x = {1,};
        !          1449: 
        !          1450: erroneously defined wchar_t as `char' instead of `unsigned char';
        !          1451: L'\xff' must have the integer value 0xff.
        !          1452: 
        !          1453: failed to reject type `array of void'.
        !          1454: 
        !          1455: failed to reject comparing a pointer to an object type
        !          1456: with a pointer to an incomplete type, eg,
        !          1457: extern int (*a)[],(*b)[10]; ...; if (a == b) ...
        !          1458: 
        !          1459: failed to warn about comparing a function pointer with a void*,
        !          1460: eg, int (*fp)(); ... if (fp == (void *)0) ...
        !          1461: 
        !          1462: failed to reject (..., 0) as a null pointer constant.
        !          1463: 
        !          1464: failed to accept redeclaration of functions with differently
        !          1465: qualified parameters, eg, f(int); f(const int);
        !          1466: 
        !          1467: on the SPARC, under -b, exit() failed to close all open files.
        !          1468: 
        !          1469: on the MIPS, generated bad code for calls to variadic functions
        !          1470: with a leading floating point arg (eg, f(double x,...)) when
        !          1471: the 2nd actual argument was a float or a double.
        !          1472: 
        !          1473: 12/17/92:
        !          1474: 
        !          1475: fix bug introduced yesterday into stddef.h's offsetof macro.
        !          1476: 
        !          1477: 12/18/92:
        !          1478: 
        !          1479: On the MIPS, fixes code generated since 12/16 that crashes most
        !          1480: procedures with >32kb of locals.
        !          1481: 
        !          1482: 2/18/93:
        !          1483: 
        !          1484: On the MIPS, silently generated incorrect code for some programs that
        !          1485: mix (single-precision) float register variables with int conditional
        !          1486: exprs or int register variables with float conditional exprs.
        !          1487: 
        !          1488: next:
        !          1489: 
        !          1490: all enums are now ints; old .o files that use enums are incompatible
        !          1491: with new ones.
        !          1492: 
        !          1493: asm("...") is gone.
        !          1494: 
        !          1495: Erroneously treated the constant -0.0 as 0.0, which IEEE forbids.
        !          1496: 
        !          1497: Erroneously diagnosed tentative unsized array definitions, eg,
        !          1498: a lone "int x[]" is treated as "int x[]={0}"

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.