WATCOM C/C++ Version 11.0c - README
-----------------------------------

Welcome to WATCOM C/C++ version 11.0c. This README provides helpful
hints found during testing as well as updated information that was
not available at the time the documentation was produced.

This file includes:
-------------------
Important
Environment variables
11.0 C-level Notes
11.0 B-level Notes
Fixes in versions 11.0 C, B and A-level
Changes in 11.0 that may Require Recompilation
Major Differences from Version 10.6
Other General Notes about version 11.0

===========================================================
Important
===========================================================

Some Watcom tools currently do not function properly if installed in a
directory with spaces in the name e.g. "C:\Program Files\WATCOM".
Therefore choose a directory name like C:\WATCOM, D:\WATCOM etc. to install
the tools in.

===========================================================
Environment variables used by Watcom C/C++
===========================================================

For proper operation the Watcom compilers require few environment variables
to be set up correctly. These variables differ slightly depending on the
host platform (DOS, OS/2, Win32). The common variables are:

 - PATH     - points to directories containing Watcom executables
 - WATCOM   - points to the directory where Watcom 11.0c is installed and is
              used by various Watcom tools to locate files
 - EDPATH   - points to VI/VIW configuration files
 - INCLUDE  - points to directories containing header files is used by the
              compilers
 - LIB      - points to directories containing library files; note that Watcom
              linker is able to locate Watcom runtime libraries without this
              variable
 - WWINHELP - points to the directory on the CDROM drive where help files are
              located. This may minimize hard disk space

DOS specifics

 - PATH      - only needs to point to the binw directory
 - WWINHELP  - points to the directory on the CDROM drive where help files
               are located. This minimizes hard disk space. Note this is not
               needed if the help files are installed on the hard disk

Win16 specifics

 - PATH      - only needs to point to the binw directory
 - WWINHELP  - points to the directory on the CDROM drive where help files
               are located. This minimizes hard disk space. Note this is not
               needed if the help files are installed on the hard disk

Win32 specifics

 - PATH      - must point to binnt and binw directories, in that order
 - WWINHELP  - points to the directory on the CDROM drive where help files
               are located. This minimizes hard disk space. Note this is not
               needed if the help files are installed on the hard disk

OS/2 specifics

 - PATH      - must point to binp and binw directories, in that order
 - LIBPATH   - either the BEGINLIBPATH/ENDLIBPATH environment variable or the
               LIBPATH statement in CONFIG.SYS must point to the binp\dll
               subdirectory of Watcom 11.0c in order to let the OS find Watcom
               DLLs
 - HELP      - points to binp\help to let Watcom GUI tools locate online help
               files
 - BOOKSHELF - points to binp\help to allow the IPF viewer (VIEW.EXE) locate
               Watcom online manuals

These environment variables can be either set up in your starup files (which
is the most convenient method if Watcom 11.0c is the only compiler you use)
or you can use simple batch files to set these variables (useful if you
need to switch between compilers, including different versions of Watcom
compilers).

Below are several sample batch files for setting the environment variables on
various host platforms. The WATCOM variable must naturally be adjusted
according to where Watcom 11.0c was installed on your system. The LIB
environment variable isn't strictly necessary but you will probably need
to set it for any libraries you use not supplied with Watcom compilers.
Similarly you might need to adjust the INCLUDE variable for 3rd party
library include files.

DOS BAT file:
---------------------------------------------------------------------------
@ECHO OFF
SET WATCOM=C:\WATCOM
SET PATH=%WATCOM%\BINW;%PATH%
SET EDPATH=%WATCOM%\EDDAT
SET INCLUDE=%WATCOM%\H
REM SET LIB=
REM SET WWINHELP=D:\BINW
---------------------------------------------------------------------------

Win16 BAT file:
---------------------------------------------------------------------------
@ECHO OFF
SET WATCOM=C:\WATCOM
SET PATH=%WATCOM%\BINW;%PATH%
SET EDPATH=%WATCOM%\EDDAT
SET INCLUDE=%WATCOM%\H;%WATCOM%\H\WIN
REM SET LIB=
REM SET WWINHELP=D:\BINW
---------------------------------------------------------------------------

Win32 BAT file:
---------------------------------------------------------------------------
@ECHO OFF
SET WATCOM=C:\WATCOM
SET PATH=%WATCOM%\BINNT;%WATCOM%\BINW;%PATH%
SET EDPATH=%WATCOM%\EDDAT
SET INCLUDE=%WATCOM%\H;%WATCOM%\MFC\INCLUDE;%WATCOM%\H\NT
REM SET LIB=
REM SET WWINHELP=D:\BINW
---------------------------------------------------------------------------

OS/2 CMD file:
---------------------------------------------------------------------------
@ECHO OFF
SET WATCOM=C:\WATCOM
SET PATH=%WATCOM%\BINP;%WATCOM%\BINW;%PATH%
SET BEGINLIBPATH=%WATCOM%\BINP\DLL
SET EDPATH=%WATCOM%\EDDAT
SET INCLUDE=%WATCOM%\H;%WATCOM%\H\OS2
REM SET LIB=
SET HELP=%WATCOM%\BINP\HELP;%HELP%
SET BOOKSHELF=%WATCOM%\BINP\HELP;%BOOKSHELF%
---------------------------------------------------------------------------


===========================================================
11.0 C-level Notes
===========================================================

All files licensed by Microsoft, IBM, Novell, Tenberry,
Pharlap and Blue Sky Software have been removed in this version.

The Windows SDK components and Microsoft Foundation Classes are
not included in the 11.0c update. If you wish to do Windows
programming you are required to have a prior version of Watcom
C/C++ 11.0, especially for MFC support. Watcom C/C++ 10.6 may
work, but this has not been tested.

The DOS/4GW extender is also not included in the 11.0c update.
If you wish to develop programs using DOS/4GW, you are required
to have a prior copy of Watcom C/C++ and use the version of
DOS/4GW that came with your earlier product. Alternatively you can
switch to using the included CauseWay DOS extender which is a drop
in replacement for DOS/4GW (with a few minor differences).

Support for Watcom C/C++ 11.0c is at www.openwatcom.org

===========================================================
11.0 B-level Notes
===========================================================

The SOM toolkit for OS/2 is no longer supported, and has
been removed in this version.

===========================================================
Fixes in versions 11.0 C, B and A-level
===========================================================

The letter in the first column indicates which level the fix
was first introduced.

===========================================================

          ****************
          ** C Compiler **
          ****************

C   New warnings 1178-1181 were being counted in the warnings total
    yet confusingly were reported as errors in diagnostic messages.
    This has been fixed. These warnings are

    W1178: Type qualifier mismatch
    W1179: Parameter %N, type qualifier mismatch
    W1180: Sign specifier mismatch
    W1181: Parameter %N, sign specifier mismatch
===========================================================

C   The 16-bit compiler now chooses the right default C library
    when generating 16-bit OS/2 multithreaded DLLs. Now

    Selecting -bm -bd, generates a reference to CLIBDLL.LIB.
    Selecting -bd, generates a reference to CLIBDLL.LIB.
    Selecting -bm, generates a reference to CLIBMTL.LIB.
===========================================================

C   #pragma enum minimum now works as according to
    documentation.

    A workaround for 11.0, 11.0a & 11.0b is to use

    #pragma enum optimize
===========================================================

C   Compiler now accepts extended macros when command line
    switch -d+ is specified
===========================================================

C   Fixed compiler so that expression

        unsigned char uc;
        int i;

        i = !(unsigned char)uc;

    is correct
===========================================================

C   structs not getting proper alignment for bitfields at the end of
    structs inside structs
===========================================================

C   blowup if a syntax error happend in a switch expr
===========================================================

C   some warnings coming out with error on message
===========================================================

C   #pragma disable_message was allowing errors to be muted  as well
    casuing trouble for code generation.
===========================================================

C   Fixed in-line assembly problem with 486/586 instructions when the
    /6 compiler option was specified.
===========================================================

C   Fixed WCL/WCL386 bug that shows up when you use "/fe=foo.exe /fm".
    The map file was named "FOO.EXE" which caused bizarre executables
    to be created.
===========================================================

C   Conditional move instructions for Pentium Pro were being assembled
    back to front
===========================================================

B   casting not getting flags like volatile correctly on pointers

    casting of unlike pointers not getting done

    __i64 numeric literals getting signed extended if number could
    fit in 32 bits

    -v option putting const/volatile on wrong side of a pointer
===========================================================

B   added a warning when trigraphs as used
===========================================================

B   _asm sometimes causing lookup problems if followed by an id on
    the next C statement
===========================================================

B   typedef function names not getting correct return type noticed
    when returning double
===========================================================

B   added warning for #if #endif pairs that come from different files
===========================================================

B   -zpw giving error instead of a warning
===========================================================

B   exceptions when getting a syntax error inside sizof operator
===========================================================

B   fixed looping bug in error recovery of declarations
===========================================================

B   constant folding of (int)((struct *)0+1) always returning 0
===========================================================

B   const ? struct : struct causes compiler error
===========================================================

B   fixed a bug where typedef double (fortran_tc)(void) wasn't working
    as it did in 10.6.
===========================================================

B   fixed a bug where using a typedef'ed function prototype no longer
    worked in 11.0 if the function prototype and its definition are
    in separate files
===========================================================

B   wcc/wcc386 would crashes on the line #if ! after reporting:
    Error! E1063: Missing operand and then crashes,
    while wcc/wcc386 -p also crashes but does not report the error.
===========================================================

B   A single-line _asm statement without braces that refers to a
    variable would generate an error message. wpp/wpp386 compilers
    handle this sample correctly
===========================================================

A   fixed folding bug with static intialization

    #line comming out after latline in include file at times

    allowing macro expansion of #define 1230e+A2 where A2 is a macro

    indirect functions call of non default call types ie. stdcall
    not working

    .obj files sometime being created if error occurred in compile

    incorrect calls somtimes being made with functions that have
    unspecified parm definitions
===========================================================

          ********************
          ** Code Generator **
          ********************

C   Fixed combining two move short constants into one move
    dword constant followed by two move byte constants that
    combined.  The codegen would incorrectly "forget" the
    first byte-byte combined move after the short-short
    combined move.

    Example:
    struct S {
        unsigned short a,b;
        unsigned char c,d,e,f;
    };
    void foo( S *p ) {
        p->a = 1;
        p->b = 2;
        p->c = 3;
        p->d = 4;
        p->e = 5;
        p->f = 6;
    }
===========================================================

C   Fixed a problem where 64-int constants were being
    aliased to 64-bit floating point constants in such
    a way that the values are incorrect.

    Example:
        struct S {
        double d;
        __int64 x;
    };
    void foo( S *p ) {
        p->d = 6.25;
        p->x = 0;   // changes to p->x = 6;
    }
===========================================================

B   When static member functions are supplied to the ?: operator, no
    code was being generated
===========================================================

B   added a compiler switch to disable the "common epilogue"
    optimization.
===========================================================

A   If optimizing for time, align procedures on 16-byte
    boundaries for anything above a 486.
===========================================================

A   Fixed a problem with short-circuit operators in which
    a side effect would be discarded (ie ( (a=b) || 1 )
    would get reduced to (1) and the (a=b) discarded. Ditto
    for ( (a=b) && 0 ).
===========================================================

A   Fixed a problem with long filenames in object file
    generation.
===========================================================

A   Fixed a problem with loopopts and far pointers - if
    inductions optimizations introduced an add of an integer
    to a far pointer, it was possible that the add would be
    generated incorrectly, resulting in some highly suspicious
    references to odd locations such as -1[bp] or 7[bp].
===========================================================

A   Fixed a problem in which conversions between floats and
    ints (or floats and doubles) within a union might not
    be generated correctly.
===========================================================

          ***************
          ** C Library **
          ***************

C   Internal routines __FSU8, __FDU8, __FSI8, __FDI8, __I8FS,
    __U8FS, __I8FD, __U8FD, used to convert between float, double
    and signed __int64, unsigned __int64 for alternate maths
    libraries were

    - missing for 32-bit C libraries
    - converted incorrectly for 16-bit C libraries

    This is now fixed
===========================================================

C   Fixed sys_nerr so that it was the right value
===========================================================

C   Internal routine __GETDS has been added to the 32-bit OS/2 C
    libraries
===========================================================

C   Internal functions __U8FD7 and __U8FS7 have been made smaller
    and faster. These routines are used to convert unsigned __int64
    to double and single respectively.

    Internal function __I4D is now faster under some circumstances
===========================================================

C   Fixed scanf() family where the wrong count would be obtained
    for floating-point input. e.g:

    int charcnt;
    double data;

    sscanf( "123." , "%lg%n", &data, &charcnt );

    Fixed scanf() family so that the negative sign is handled
    when reading unsigned integers (a requirement of ANSI C)
===========================================================

C   Fixed _fullpath() where under certain circumstances the heap
    could be corrupted
===========================================================

C   Fixed memory leak in tmpfile() for Netware libraries
===========================================================

C   _searchenv() now works for quoted paths including 4NT-style
    paths
===========================================================

C   Fixed problem in memory allocator that could cause NULL
    to be returned without going to the system to get more
    memory.
===========================================================

C   Fixed bug in __brktime in gmtime.c. Jun 2, 2101 was returned as
    Jun 1, 2101. Affected ctime, localtime, gmtime.
===========================================================

C   Fixed bug in delay() for DOS/16, DOS/32, Win 3.1 and Win386.
    Previous version did not work at all for a number of reasons.
    New version is accurate to within  +/- 1/100 second.
===========================================================

C   Fixed bug in printf formatting. %#.6g would not display trailing
    zeros for a number like 1.0e6. Output was 1.e+006 when it should
    have been 1.00000e+006. Fix was made to _ldcvt().
===========================================================

C   Fixed eof(), filelength(), fsync(), _os_handle(), _get_osfhandle(),
    and setmode() in Netware library by removing a failing file handle
    check.
===========================================================

C   Fixed bug in mktime() that affected 16-bit libraries. Years >= 2079
    resulted in truncation due to 16-bit rather than 32-bit precision.
    Changed 365 to 365L to force 32-bit calculation.
===========================================================

C   Fixed bug in run-time exit code. Made sure that _WindowExitRtn is
    called early on in exit() rather than in _exit() (since run-time
    system is shut-down by the time _exit gets called).
    This bug impacted "Save as" in default windowing support.
===========================================================

C   Fixed bugs in _wputenv, _wsetenv, _wgetenv that caused a crash in
    clearenv at program exit.
===========================================================

C   Fixed opendir() for DBCS environments (where backslash, slash,
    asterisk and question mark might appear as the second character
    of a double-byte character in a path specification). We now use
    _mbsinc() and _mbsnextc() to scan a path string.
===========================================================

C   Added _mktemp() to other platforms including 16/32-bit DOS, 16-bit
    Windows, 32-bit extended Windows and 16/32-bit OS/2. Previously,
    only Win32 was supported.
===========================================================

C   Fixed a problem with multi-threaded applications where a thread
    was very short-lived.

    A multi-threaded application would crash when a thread was very
    short-lived. The problem seemed to appear with more frequency on the
    newer generation of fast processors. The crash occurred in
    _CBeginThread which is the C run-time implementation of
    _beginthread.

    A workaround was to delay the thread from exiting using some sort of
    gating technique like Sleep or a signal from the creating process
    that permitted the thread to exit.

    A more detailed description of the problem follows.

    When a thread is created, a thread handle is returned to the process
    doing the CreateThread. Our run-time library wants to pass this
    thread handle to the newly "executing" thread so that when the
    thread exits, the thread can free the handle itself.

    The "main" process passes the thread handle to the thread by storing
    it at a location provided by the thread. This location is "created"
    by the thread so the main process waits for an event that signals
    that the location is created. But here's what happens. The thread
    signals the event and keeps on executing. In fact, it executes right
    through to the termination code and exits before the main process is
    dispatched again. Eventually the main process is resumed (since the
    event that it waited on has occured) and then it stores the handle
    into memory. This memory however no longer exists because the thread
    has already come and gone. An access violation occurs.

    The problem was fixed by adding code to complete the handshaking
    process (the problem had been already half solved). The thread now
    waits for the creating process to provide the handle.
===========================================================

C   spawn... functions with P_NOWAIT under Win32 no longer allocate an
    extra process handle.
===========================================================

C   Simplefied Win32 version of _pipe. Pipes are inheritable if you use
    the SECURITY_ATTRIBUTES struct. Added support for O_NOINHERIT mode
    attribute.
===========================================================

C   Fixed the multi-byte character functions so that they work
    correctly for all double-byte character sets (not just Japanese). The
    revised functions are:
    _mbctolower
    _mbctoupper
    _ismbcalnum
    _ismbcalpha
    _ismbccntrl
    _ismbcdigit
    _ismbcgraph
    _ismbclegal
    _ismbclower
    _ismbcprint
    _ismbcpunct
    _ismbcspace
    _ismbcsymbol
    _ismbcupper
    _ismbcxdigit
    _mbslwr, _fmbslwr
    _mbsupr, _fmbsupr
===========================================================

C   Fixed Win32 version of _dos_findfirst/_dos_findnext so that
    _A_SUBDIR, _A_HIDDEN, and _A_SYSTEM work correctly.
===========================================================

C   Fixed Netware version of library so that code-gen support routines
    like __i8d are not exported. This removes the problem caused when
    2 or more NLMs ended up exporting the code-gen support routines.
===========================================================

C   Removed assert from low-level thread data pointer acquisition
    routine (since assert requires a thread data pointer in multi-
    threaded applications so it was no good to use assert to complain
    that a thread data pointer could not be acquired). Normally,
    this problem would not be seen.
===========================================================

C   Added some error checking to Win32 cprintf and putch (conio) routines.
===========================================================

C   _controlfp called _controlfp rather than _control87 resulting in a
    recursive, infinite loop. Changed _controlfp to call _control87.
===========================================================

C   Fixed a number of I/O routines to make them thread safe. Included are
    the Netware version of fopen, _fsopen, all versions of tmpnam, all
    versions of fclose.
===========================================================

C   Fixed tzset() for Windows NT/2000 in areas where there is no daylight
    savings time. As a result, gmtime() should now be correct for all
    areas of the world.
===========================================================

C   Fixed the Win32 version of _dos_xxx functions so that they return the
    OS error code like their DOS and OS/2 counterparts.

    Fixed _getdcwd(), _wgetdcwd() so that they set a proper errno value.
    Set errno if drive doesn't exist.

    Fixed putenv(), _wputenv(), setenv(), _wsetenv() so that they set a
    proper errno value.

    Fixed _wdos_findfirst(), _wdos_findnext(), _wdos_findclose() so that
    they set a proper errno value. Under Win32, they now return a proper
    OS error code.

    Fixed Win32 version of open(), _wopen(), sopen(), _wsopen(),
    _sopen() and __wsopen() so that it first checks to see if it can
    store the file handle returned by Win32 before attempting to open
    the file.  This fix corrects the "orphaned file" problem caused by
     opening, then closing a file when the file handle can't be stored.

    Fixed the OS/2 spawn routines so that a proper errno value is set
    when running out of memory.

    Fixed tmpfile() multi-threading problems including infinite loops
    when the "TEMP" environment variable (TMP, TEMP, TMPDIR, etc.)
    points to a non-existent path.

    Added _strerror() for MS compatibility. Also added wide char version
    _wcserror().

    Added _doserror() to return Win32 system error message for a
    _doserrno value.

    Improved mapping of Win32 error codes to errno values.
===========================================================

C   Fixed a memory leak in run-time code. Added call to free the
    "initial thread data storage" (the storage used by the main
    thread in a single-threaded or multi-threaded application).
    Affects Win32 and 32-bit OS/2 applications.
===========================================================

C   Fixed a problem with tmpnam() in the Netware library in version
    11.0c. New names were not being created.
===========================================================

C   Fixed bug in Win32 write(). The zeropad function was not necessary
    and didn't handle large files, in any case. Now you can seek to a
    position > MAX_INT and then write().
===========================================================

C   Fixed a problem where _beginthread example was crashing sometimes
===========================================================

C   Fixed _chain_intr() so that flags is passed to interrupt handler
===========================================================

C   Fixed 32-bit strcmp() so comparing unaligned strings does not fault
===========================================================

B   Fixed a bug where an app was doing a chmod() on a file in a
    directory and is supposed to remove the file and then delete
    the directory itself. Under Win95 the directory was getting
    removed, however under NT it was not.

    Use div in place of ldiv for 32-bit code, since they should be
    the same.

    Marked the Product Version as 11.0b for the RTL DLLs, such
    as CLBR110.DLL, CLBS110.DLL, MT7R110.DLL, MT7S110.DLL,
    MTHR110.DLL, MTHS110.DLL, PLBR110.DLL & PLBS110.DLL,
    so it is less difficult to distinguish them from older DLLs.
===========================================================

B   Fixed a bug where Win386 DLLs would GPF every second time they
    are unloaded.
    To reproduce this,
    modify the samples in samples\fortran\win\dll by adding the line
    "call FreeLibrary( hlib )" before the line "FWinMain = 0" in
    gen*.for. When you run the samples, they GPF the first, third,
    fifth, etc. times when FreeLibrary is called. If you compile/link
    these modified samples with 10.6a or earlier versions, then the
    problem doc not occur. Reproduce this behaviour under WFW 3.11
    and Win NT 4.0. Customer has reproed this under Win 95, and also
    reproed it when the DLLs are called from VB 4.0.
===========================================================

B   _wtof was missing from the 16-bit math libaries,
    and the 32-bit version was returning erroneous results.
===========================================================

B   Target: Win32: Using fmod() or modf() in code compiled with /br
    was giving undefined references.
===========================================================

B   Fixed a bug with itoa() in win16 apps, where you couldn't run
    multiple instances of the app.  If you tried to, you got
    "Cannot start more than one copy of the specified program" under
    NT and "Error: Cannot <something> multiple writeable data
    segments" under Win 3.x.
===========================================================

B   Win32 target only: feof() was not set when end-of-file occurs
    on an input pipe. ferror() was being set instead.
===========================================================

B   ftime() was not reporting correct timezone field in timeb struct
    when TZ is negative.
===========================================================

B   Overflow range error in pow was not reported unless /fpc used.
===========================================================

A   _findfirst() has been changed to take a const char * instead of
    just a char *.
===========================================================

A   __FSU87 was trashing ecx - this routine is called to convert an
    unsigned __int64 to a float.
===========================================================

A   Fixed memory leak, due to us not deallocating the _iomode array
    during fini rtns. Also added _UnloadCLib call to library to
    allow user to properly unload 16 bit OS/2 user loadable DLLs.
===========================================================

A   Fixed a bug where fortran default windowing apps would sometimes
    appear to print lines  twice, when printing at the bottom of the
    screen. Since they were being printed at the bottom of the window
    and then not erased when the window scrolled up, leaving a 2nd
    copy at the bottom
===========================================================

A   Input value range checking for strtod() has been improved for very
    small values.
===========================================================

A   The runtime dll support has been fixed to no longer leave a
    potentially dangerous reference from the C runtime DLL into
    whichever DLL has been most recently loaded into the process
    image. The reference from the C runtime DLL now points
    directly into the Math runtime DLL.
===========================================================

A   The _dos_getdiskfree() function for 32bit platforms now has an
    expanded data structure.
===========================================================

    The assert() function for WIN32 and OS/2 platforms will attempt
    to use stderr for output if it is available.
===========================================================

A   The __declspec(thread) support for WIN32 platforms has been
    improved.  In some, pathological cases, it could lead to a GPF
    on program startup.
===========================================================

A   The system() function for WIN32 platform no longer passes
    posix file handles for inheritance by child processes by default.
===========================================================

A   The delay() function for NEC98 machines used to hang on
    initialization.
===========================================================

A   The race condition in the _beginthread() function related
    to the saving of the child thread handle has been fixed.
===========================================================

A   The multibyte init code for the C runtime library would
    always crash on startup when running under the Pharlap
    Run386 or TNT DOS extenders.
===========================================================

A   The heapchk() function for 32bit platforms could, in some
    cases, enter an infinite loop.
===========================================================

A   The posix level open() function for WIN32 platforms did not
    properly truncate existing files on NT server machines when
    run from an NT workstation.
===========================================================

A   The WIN32 stat() function now ensures that directories
    cannot be marked as character mode devices.
===========================================================

A   The WIN32 and OS/2 runtime shutdown code now does a better
    job of releasing all resources on image shutdown.
===========================================================

          ******************
          ** C++ Compiler **
          ******************

C   The 16-bit compiler now chooses the right default C library
    when generating 16-bit multithreaded DLLs. Now

    Selecting -bm -bd, generates a reference to CLIBDLL.LIB.
    Selecting -bd, generates a reference to CLIBDLL.LIB.
    Selecting -bm, generates a reference to CLIBMTL.LIB.
===========================================================

C   The C++ compiler did not remember the "signedness" of constants
    in enums and would, under the proper conditions, sign extend
    an unsigned 64-bit constant.
===========================================================

C   Fixed processing of floating-point command line switches.
    /fp5, /fp6, floating point code generator switches would
    reset /fpi87 model back to defaults and vice versa.
    This meant poor floating-point code was generated.
===========================================================

C   Fixed packing of structs when -zp16 is used and the
    members are aligned to 8-byte boundaries to align
    the class to an 8-byte boundary rather than a 16-byte
    boundary.
===========================================================

C   Fixed diagnosis of pointer comparisons for unrelated
    classes.  This change also affects the ?: operator
    if there are two pointers in the ':' expressions.

    Example:

    struct A {};
    struct B {};
    bool fn( A *p, B *q ) {
    return p != q;
    }
===========================================================

C   Fixed compiler to not force static functions to be
    linkage "C++".

    Example:
        extern "C" {
        static int fn()
        {
        return 0;
        }
    };
===========================================================

C   Fixed a problem when a scope had more than approx. 25000
    unique symbols in it.  The symbol table code in the
    compiler could not handle not growing the symbol table
    to reduce the average search time.
===========================================================

C   Added level 4 warning for switch statements that have
    no case labels.
===========================================================

C   Handling of const and reference members in a class had
    problems when dealing with default op= member function.

    Example:

    struct NestedA {
    NestedA();
    ~NestedA();

    NestedA& operator=( const NestedA& s );

    char* & _ptr;
    };

    struct NestedB {
    NestedB();
    ~NestedB();

    NestedB( NestedB& a );
    void *pd_ptr;
    };

    struct NameValuePair {
    NestedA x;
    NestedB y;
    };

    int main( int argc, char** argv )
    {
    NameValuePair   a;
    NameValuePair   b;

    a = b;

    return 0;
    }
===========================================================

C   Fixed sizeof( L"1234" ) to return 10 instead of 20.
===========================================================

C   Fixed identical function checking to handle the
    following case:

    enum E { A,B,C };
    struct test {
    void foo( E );
    void bar( E & );
    };
    void test::foo( E & ) { // error
    }
    void test::bar( E ) {   // error
    }
===========================================================

C   Fixed a lexical lookup problem from within a member
    function in a local class finding a symbol in the
    host class.  The compiler incorrectly thought that
    'this' could be used to access the symbol.

    Example:

    struct ABC {
    ABC() {
        static struct B {
        void f() {
            meth2(); // error
        }
        } b;
    }
    void meth2() {
    }
    };
===========================================================

C   Conditional move instructions for Pentium Pro were being assembled
    back to front

===========================================================
B   fixed a bug where using /d2 /hd could cause the compiler to hang.
===========================================================


B   fixed a C++ Preprocessor problem: where #if ( x > y ) could
    produce incorrect results when x and y are expressions.
===========================================================

B   An error was missing in the following case:
        extern void f( int a, char *b );
        extern void f( int a );
        void *pf = f;

    Work around: none
===========================================================

B   Anonymous structs or classes within unions could not always
    be initialized properly.
        struct s
        {
            union
            {
                struct
                {
                    float a, b;
                };
                float c[2];
            };
        };
        s d = { 0.0, 0.1 };

    Work around: Set values in object manually.
===========================================================

B   Output a warning if a #endif isn't in the same source
    file as its companion #if.

    Example:

    --- foo1.h ---
    #ifndef FOO1
    #define FOO1
    #endif
    #endif  // warning
    --- foo2.h ---
    #ifndef FOO2
    #define FOO2
    #include "foo1.h"
    #endif
    --- foo.c ---
    #include "foo2.h"
===========================================================

B             A
              /
         D   B
          \ /
           C

    We no longer prefer the conversion from C->D over the conversion
    from C->A as the number of levels of conversion does not matter
    when D and A are not related.
===========================================================

B   Added level 3 warning for unary '-' of an unsigned
    operand (result type is still unsigned). Cast operand
    to signed type to remove warning.

    Example:

    void bar( int );
    void bar( unsigned );
    ...
    // selects bar( unsigned )
    foo( -2147483648 );
===========================================================

B   Improved PCH reading of error message levels so that
    header file changes are added to current message
    levels rather than performing a complete replace of
    the error message levels and ignoring any command
    line adjustments.
===========================================================

B   Fixed problem with -d2s that caused run-time error
    "undefined constructor or destructor called!" to occur.
===========================================================

B   Was not generating correct code for some default functions
    in classes with modifiers.

    Work around: write definitions for required constructors,
        destructors, and operator = functions
===========================================================

B   Was not generating correct code for the default operator =
    when the class contained an array of elements where an element
    could be byte-for-byte copied and also had virtual functions.
===========================================================

B   Destruction sometimes was omitted following a delete which
    followed a block closure which contained a destruction.

    Work around: introduce a destructable temporary before
    the delete.
===========================================================

B   Fixed scanning of large strings with escaped characters.

    Example:

    char *p = "\n\
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\
    \n";

    Work around: break string up into smaller strings and
    let compiler concatenate them
    "1234567890" --> "12345" "67890"
===========================================================

B   Added warning from scanner whenever a trigraph
    is processed.

    Example:

    // string expands to "(?]?~????"!
    char *e = "(???)???-????";
    // work around:
    char *f = "(" "???" ")" "???" "-" "????";
    char *g = "(\?\?\?)\?\?\?-\?\?\?\?";
===========================================================

B   Fixed analysis of shift operators with regard to
    result type.  Previously the result type was the
    same as other binary arithmetic operators.  Now
    the result type is the promoted type of the left
    hand operand.

    Example:

    int f( int x, unsigned s ) {
        // should do signed right shift
        return x >> s;
    }
===========================================================

B   Compiler incorrectly warned that new/delete operators
    were declared in a namespace when they were declared
    as friends of a class.

    Example:

    class N {
        friend void *operator new( unsigned );
        friend void operator delete( void * );
        friend void *operator new[]( unsigned );
        friend void operator delete[]( void * );
    };

    Work around: disable warning
===========================================================

B   Compiler incorrectly diagnosed an invalid constant
    when inside a preprocessing #if region that should
    have been excluded from such errors.

    Example:

    #if 0
    Version 35I63
    #endif

    Work around: put constant in a comment (if possible)
===========================================================

B   Compiler now correctly evaluated all preprocessor
    expressions involving binary operators of the same
    precedence.

    Example:

    #if (0 < 2 - 1 + 3)

    now correctly evaluates to TRUE.  It previously
    evaluated as if the expressions was

    ( 0 < 2 - ( 1 + 3) )

    Note: this bug only occurred in preprocessor expressions.
===========================================================

B   Compiler now initializes member pointers at link-time
    in more cases than before (notably array initialization).
===========================================================

B   Constant folding of 64-bit arithmetic would incorrectly
    warn about overflow if the expression involved two 32-bit
    quantities multiplied together to produce a 64-bit quantity.
===========================================================

B   wpp: -zff and -zgf now generate code that doesn't save
    fs/gs in the prologue/epilogue of the function (matches
    behaviour of C compiler and ds/es).  The pop of fs/gs
    would fault if the selector had been freed.
===========================================================

B   Fixed error recovery for the following code fragment:

    template <class T : public Base > struct S {};
===========================================================

B   wpp: optimized -3 code to use size override prefixes
    when dealing with push and mov immed instructions.
===========================================================

B   Under several combinations of options ?: did not generate
    proper code to select static member functions.

        typedef void (*void_func)();

    class A
    {
      public:
         static void f();
         static void g();
    };

    void_func func(bool b)
    {
        return b ? A::f : A::g;
    }

    Work around: Avoid use of ?:, for example,

    void_func func(bool b)
    {
        if( b )
            return A::f;
        else
            return A::g;
    }
===========================================================

B   Fixed a problem where the compiler went into an infinite
    loop generating Dwarf debug information with namespaces
    that contained typedefs referencing types in other
    namespaces.

    Work around: use -d3 instead of -d2

    Example:
    class A {
    public:
        virtual ~A() {}
    };

    class B {};

    namespace N {
        class C {};

        typedef B T;

        class D {
        public:
        virtual ~D() {}
        };

        class E : public D, public A {
        public:
        E() {}
        B* getB() {
            return 0;
        }
        C* getC() {
            return 0;
        }
        };
    }
===========================================================

B   Fixed a problem where function template instantiations
    were not being set to C++ linkage.

    Work around: don't use function templates in extern "C"
             blocks or functions

    Example:
    template <class T>
        void tf(T) {
        return;
        }

    struct A { } a;

    struct B { } b;

    extern "C" void bar() {
        tf(a);
        tf(b);
    }
===========================================================

B   Allow bool op= bool expressions

    Work around: break up expression A op= B into A = A op B

    Example:
    void foo( bool a, bool b ) {
        a |= b;
    }
===========================================================

B   Fixed compiler GPF in situations where an abstract class
    tries to create or return itself.  The GPF was caused by
    the compiler trying to output a good error message with
    all the unimplemented abstract methods.

    Example:
    class A {
        virtual ~A() { }
        virtual void *fn( char *name ) = 0;
        A Next() { return( _next ); }
    };
    void foo( A *it )
    {
        it->Next();
    }
===========================================================

A   Fixed a minor bug that caused spurious warnings to be
    generated for pre-compiled headers containing integer
    constants.
    The following example, if used in a pre-compiled header,
    would cause a warning about truncating integer constants:

        class Foo {
            public:
                int Bar(int, int=1);    // warning generated here
        };
===========================================================

A   Was mis-diagnosing conversions from types of the form
        Type cv1 * cv2 &
    to types of the form
        Type cv3 * cv4 &
    when cv3,cv4 are more qualified than cv1,cv2 respectively
    and cv4 does not contain "const" (it must for the
    conversion to be legal).

    Work around: none, the conversion is illegal.
===========================================================

A   Changed the alignment of doubles and long doubles to be
    on 8-byte boundaries when not optimizing for space. This
    will increase performance on many hardware configurations.
===========================================================

A   Incorrect code was being generated for "?:" sequences
    when the target is a class object and when the expression
    between the "?" and the ":" was converted to the type of
    the expression following the ":"

    work around: cast the expression between the "?" and the
                 ":" to the type of the expression following
                 the ":"

    example:

        struct Cls {
            Cls( int );
            Cls( Cls const & );
        };

        extern Cls target;

        void foo( bool test, int int_val, Cls const & class_val )
        {
            target = test ? int_val : class_val; // generated bad code
        }

     The work-around is to re-code foo as follows:

        void foo( bool test, int int_val, Cls const & class_val )
        {
            target = test ? Cls( int_val ) : class_val;
        }
===========================================================

A   When the -za switch is not specified (i.e., when
    extensions are enabled) the compiler was extended to
    accept as member pointer values, class-qualified and naked
    non-static member functions.  The proposed standard
    requires that & precede a class-qualified name.

        struct S {
            int foo( float );
        };

        int (S::*mp)( float );  // a member-pointer variable

        ...

            // the following are all accepted:

            mp = &S::foo;      // standard
            mp = S::foo;        // extension
            mp = foo;          // extension (must be in scope)
===========================================================

A   Fixed a bug that caused the compiler to crash under certain
    conditions when writing a pre-compiled header.
===========================================================

A   Fixed compiler so that floating point support is loaded
    if you call a routine with the address of a double.
    This is req'd if you need to skip floating point numbers
    but never use them.

    e.g.,
        scanf( "%d %f %d\n", &i1, &d1, &i2 );
===========================================================

A   Fixed compiler so that -dXXX="a-/ b" is allowed.
    Compiler was terminating -d macro definition at
    a -, /, or white space.
===========================================================

A   Fixed problem where a MI conversion was required before
    initializing a const reference temporary.

    Example:

    struct A { int a; };
    struct C { int c; };
    struct B : public C, public A { int b; };

    typedef A * T;

    T check;

    struct Array {
        void Append( const T & t ) { if( t != check ) _fail; }
        void Remove( const T & t ) { if( t != check ) _fail; }
    };

    void Foo( B * b )
    {
        Array      arr;
        A *      a = b;
        arr.Append( a );
        arr.Remove( b );
    }

    int main()
    {
        B   b;
        check = &b;
        Foo( &b );
        _PASS;
    }
===========================================================

A   Fixed problem where direct calls to __stdcall dtors
    were incorrectly routed through a calling convention
    thunk normally used for table-driven destruction.
===========================================================

A   When generating preprocessed output, the compiler now
    eliminates empty lines if you do not want #line
    directives.
===========================================================

A   Correctly handle multibyte characters with the second
    byte equal to 0x5c ('\\') when they terminate a C++
    //-style comment (i.e., do not treat them as a line
    splice).

    Example:

    // <0x81><0x5c>
===========================================================

A   A function that calls setjmp will have its local
    variables marked as "stay in memory" but this
    attribute incorrectly affected function template
    generic type binding.

    Example:

        #include <setjmp.h>

        template <class T>
            void delete_object( T*& object ) {
                if( object ) {
                    delete object;
                    object = NULL;
                }
            }

        struct CValue {
            int i;
        };

        void foo() {
            CValue *v;
            jmp_buf b;

            setjmp(b);
            delete_object(v);
        }
===========================================================

A   Fixed problem with C++ empty base optimization that
    caused spurious errors to be diagnosed.

    Example:

        struct CClassBase {
        };

        struct CClass2 : public CClassBase {
            struct CClass1 {
                CClass1(int) {}
            };
            CClass1 m_c;
        protected:
            CClass2(void);
        };
        CClass2::CClass2(void)
            : m_c(1) {
        }
===========================================================

A   Fixed problem with macro expansion that triggered
    boundary conditions in the compiler which in turn
    caused incorrect macro expansion.

    Example:

        #define example( b ) b ## _X Y_ ## b ## _Z
        example( x123456789012345678901234567890 )
        example( x12345678901234567890123456789 )
        example( x1234567890123456789012345678 )
        example( x123456789012345678901234567 )
        example( x12345678901234567890123456 )
        #undef example
===========================================================

A   Fixed problem with error recovery in complex
    source code with __stdcall classes.
===========================================================

A   Return expressions with comma operators sometimes were compiled
    incorrectly.

    This resulted in a bad library for multi-threaded Netware when
    exceptions were used.

    Work around: assign the expression to a temporary and then
    return the temporary.

        example:

            int x;

            void foo( int y ) {
                return ( x = 1 , y + 1 );
            }

        replace by:

            int x;

            void foo( int y ) {
                int temp = ( x = 1 , y + 1 );
                return temp;
            }
===========================================================

A   If a source file doesn't end in a new-line, the C++
    compiler now compensates for this to allow new-line
    terminated preprocessing directives to work properly.

    Example:

        #define C 3 // file doesn't end in '\n'

===========================================================

A   Incorrect code was generated for an argument to an ellipsis
    function (one declared with '...' ) which was computed as an
    lvalue class value for a destructible class.

    Example:

        void foo( int, ... );

        class S {
            . . .
            ~S();
            . . .
        };

        S* p1;
        S* p2;
        bool b;

        . . .

            int i = foo( 1997, b ? *p1 : *p2 );

    Work around: use a cast to force underlying expressions
        to be rvalues:

            int i = foo( 1997, b ? (S)*p1 : (S)*p2 );

===========================================================

A   Compiler would crash when it could not generate RTTI
    info into a 64k segment (only applies to 16-bit targets).
    The error was reported properly but recovery resulted
    in a memory fault in the compiler.
===========================================================

A   Compiler would crash (infinite loop or page fault) when
    inlining functions that contained certain usages of
    anonymous unions.

    Example:

        inline int ii( int i ) {
            union {
                int x;
                unsigned char y;
            };
            x = 0;
            y = i;
            return x;
        }
        ...
        ii( q );

    Work around: #pragma inline_depth(0)
===========================================================

A   Tweaked scanning of pp-number tokens in non-ISO/ANSI mode
    so that old code continues to compile correctly.

    Example:
        #define A10  3
        #define A11  0x1e+A10
        int v = A11;    // 0x1e + 3
===========================================================

A   Added -mfi option to indicate to the compiler that interrupt
    functions can assume the flat memory model is preserved.
    If this option is not used, interrupt functions have to
    assume that a different stack segment is being used and
    so auto data must be manipulated as far data.
===========================================================

A   Fixed diagnostic of 'void' expression types in certain
    contexts.

    Example:

        void a();
        int __u( int i ) {
            return i == a() || a() == i;
        }
===========================================================

A   Added diagnostic to identify cases where the calling
    convention of a virtual function override has changed.

    Example:

       struct B {
            void __stdcall foo( int, int );
       };
       struct D : B {
            void foo( int, int );
       };
===========================================================

A   A function such as
        Composed* ctor( Composed const & src )
        {
            AnotherDtorable stuff_1;
            AnotherDtorable stuff_2;
            AnotherDtorable stuff_3;
            Composed* ptr = new( some_data ) Composed( src );
            return ptr;
        }
    where AnotherDtorable and Composed are destructable objects
    could cause the object located by ptr to also be destructed
    under some combinations of options.

    Work around: place the new statement in a separate function.
===========================================================

A   The following code generated a spurious warning, claiming that
    fn was unreferenced.
        extern void import( const void * );
        static void fn() {}
        void external()
        {
            const void * foo = fn;
            import( foo );
        }

    Work around: ignore that warning or disable it
===========================================================

A   Diagnose extra initialization arguments for parenthetical
    initialization of non-class types.

    Example:
    int h(1);

    int f(1,2,3);

    int g( int(1,2,3) );

    foo() {
        int q = 1, // <- notice comma
        f(1,2,3);
    }
===========================================================

A   Diagnose definition of member functions that are not
    declared but match the signature of another member
    function with default arguments.

    Example:

    struct A {
        void f1( int, bool = false );
    };

    void A::f1( int ) { // error
    }
===========================================================

A   Corrected problem where a inline template function
    was incorrectly diagnosed as undefined if it was
    inside a namespace.

    Example:

    namespace alpha {
        template <class T>
        inline T & f (T & a) {
            return a;
        }
        inline long b ( long a ) {
        return f ( a );
        }
    }

    void fn( void ) {
        long a = 100;
        long c;

        using namespace alpha;

        c = b ( a );
    }
===========================================================

A   Corrected problems where certain class hierarchies
    caused problems in generating construction/destruction
    code or exception handling state tables.  The problems
    manifested themselves as incorrect code/data or compiler
    faults.

    Example:

    #include <fstream.h>
    #include <stdlib.h>
    #include <iostream.h>

    class TextFile {
       public:
       ifstream solidTextFile;
    };
    class SolidTextFile : public TextFile {
    };


    void main() {
        SolidTextFile aFile;
    }
===========================================================

A   Corrected problem where, in copy initialization, a
    user-defined conversion function from source class to a
    non-const reference of the target class would not be
    preferred over another ambiguous conversion.

    In this example, the conversion A::operator String() going
    to String::String( String const & ) should be preferred over
    the ambiguous use of the String::String( char ) constructor
    from either A::operator int() or A::operator float().

    Example:

    struct String {
        String();
        String( char );
    };

    struct A
    {
        operator String() const;
        operator int() const;
        operator float() const;
    };

    struct B
    {
        const A& GetitsA();
    };

    void foo(B b)
    {
        String s;
        s = b.GetitsA();
    }
===========================================================

A   Fixed reading and writing of the precompiled header
    file when it contained C++ EH information for classes.
===========================================================

          *****************
          ** C++ Library **
          *****************

C   eofbit for ifstream's is now set on a read() when at EOF
===========================================================

C   Fixed buffer overrun when specifying a precision (SetPrecision)
    greater than LDBL_DIG. This used to cause an application to
    crash Windows 95.
===========================================================

C   Added conditional semaphore unlock to the destructor of a "lock"
    object.
===========================================================

          ******************
          ** Disassembler **
          ******************

C   Fixed WDIS so that it correctly disassembles 32-bit code
    assembled with MASM/TASM as 32-bit and no longer as 16-bit
===========================================================

C   Fixed ORL library so that additional OMF THEADR records in
    object files are not diagnosed in error. Additional THEADR
    records occur when #include'ing source code and requesting
    Codeview debug info.
===========================================================

B   wdis couldn't  recognize "SHLD EDX,EAX,CL", "SHRD EDX,EAX,CL"
    and a few other instructions.
===========================================================

B   Wdis did not give the correct code when disassembling memchr().
    It placed the label in the wrong position.
    This is because the code makes a jump into the
    middle of an opcode sequence depending on the result of memchr().
    WDISASM with 10.6 "knew" about this and issued DB instructions.
===========================================================

A   fixed problem with disassembly of 3-operand imul instructions
    (only 2 operands were displayed)
===========================================================

          *******************
          ** Documentation **
          *******************

C   Fortran subroutine library functions FNEXTRECL() and FTRACEBACK()
    are now documented
===========================================================

C   Predefined C++ macros _CPPUNWIND & _CPPRTTI are now documented
===========================================================

C   #pragma read_only_file which appears in nearly all Watcom header
    files is now documented.

    The default depth for #pragma inline_recursion has been corrected.
    The default depth is 3.
===========================================================

C   Functions

    _dieeetomsbin(),
    _dmsbintoieee(),
    _fieeetomsbin(),
    _fmsbintoieee(),
    _findfirsti64(),
    _findnexti64(),
    _wfindfirsti64(),
    _wfindnexti64(),
    _filelengthi64(),
    _lseeki64(),
    _telli64(),
    _fstati64(),
    _wfstati64(),
    _stati64(),
    _wstati64()

    are now documented in the C library.
===========================================================

B   Fixed the C library matherr example, so it works with the C++
    compiler.
===========================================================

B   Watcom 10.6 aligns structure members on a byte boundary by
    default.

    Watcom 11.0 aligns structure members on an 8 byte boundary
    by default.

    Fixed some places where the documentation hadn't been updated
    from 10.6.
===========================================================

B   Added - wlink's OPTION SHOWDEAD, which was not documented.
    This option is very useful as it shows in the map file which
    functions the linker stripped out.
===========================================================

B   Added documentation for wcc/wcc386/wpp/wpp386 options /of & /of+.
===========================================================

B   Corrected the Programmer's Guide sample on 32-bit OS/2 DLLs.
    The dllsamp.c file was missing a: define EXTERNC.
===========================================================

B   Upated Linker docs indicate that incremental linking is not
    supported for 16-bit DOS and NetWare targets.
===========================================================

          **********************
          ** Graphics Library **
          **********************

C   Fixed a bug where vector fonts were being drawn incorrectly
===========================================================

C   Now cache the SVGA Page for better performance
===========================================================

C   Fixed a bug in NEC version of graphics library "SetPixel" function.
===========================================================

C   Fixed a bug in _EGAScanRight. The ODD/EVEN mode bit should not have
    been turned on. On most adapters, this didn't cause a problem.
    On a Number Nine video card, this showed up as a problem in flood
    filling an area.
===========================================================

          ********************
          ** C Header Files **
          ********************

C   Fixed headers <typeinfo.h>, <exceptio.h> so that they include
    other Watcom C++ headers with the .h extension correctly. This was
    causing STLPort's headers to be used in preference to Watcom's.
===========================================================

C   Fixed getc macro in stdio.h. The '\0x' changed to '\x' in two
    places. Old version resulted in a loss of an attempted
    optimization. The correction will result in better performance
    for getc().
===========================================================

C   Added Microsoft's FLT_NORMALIZE constant.
    Added Microsoft's _DBL_RADIX constant.
    Added Microsoft's _DBL_ROUNDS constant.
    Added Microsoft's _LDBL_RADIX constant.
    Added Microsoft's _LDBL_ROUNDS constant.
    Added Microsoft's DBL_RADIX constant.
    Added Microsoft's DBL_ROUNDS constant.
    Added Microsoft's LDBL_RADIX constant.
    Added Microsoft's LDBL_ROUNDS constant.
    Changed FLT_MIN_EXP from (-127) to (-125).
    Changed DBL_MIN_EXP from (-1023) to (-1021).
    Changed LDBL_MIN_EXP from (-1023) to (-1021).
    Changed FLT_MIN_10_EXP from (-38) to (-37).
    Changed FLT_MAX_EXP from 127 to 128.
    Changed DBL_MAX_EXP from 1023 to 1024.
    Changed LDBL_MAX_EXP from 1023 to 1024.
    Added accurate representations for DBL_MAX, DBL_EPSILON and
    DBL_MIN named _DBL_MAX, _DBL_EPSILON and _DBL_MIN.
===========================================================

C   Improved code generated from isxxx() functions.
    Changed description of messages associated with some errno values.
    Added definition of NULL to float.h.
    Added prototypes for _strerror(), _wcserror(), _doserror(),
    _wdoserror() to string.h.
===========================================================

A   const qualifiers have been added to the char* parameters
    to the findfirst and variant functions in io.h
===========================================================

A   The register mode calling convention prototype for longjmp()
    is no longer marked as "#pragma aborts" to facilitate
    profiling support.
===========================================================

          **********************************************
          ** Integrated Development Environment (IDE) **
          **********************************************

C   Fixed incorrect access of C error/warning help file
    WCCERRS.HLP (messages were one out)
===========================================================

A   Added pentium pro (p6) switches to the options pages
    ( compiler, linker, assembler, etc. )
===========================================================

A   added a switch for Watcom debugging info to the linker
    options page - watcom was previously the default if you
    selected debug all, now Dwarf is the default
===========================================================

A   fixed a resource problem that was causing some of the
    buttons and menu items to appear with no text
===========================================================

A   Don't use incremental linking for DOS or Netware
    applications - it is not supported
===========================================================

A   Changed the compiler options for Netware targets to use
    -5s, -ms -- stack based, small model
===========================================================

A   changed the linker options for 32-bit OS/2 DLL's
    now uses op manyautodata, initinstance, terminstance
===========================================================

          ***************
          ** Librarian **
          ***************

C   Updated command line help for WLIB /?
    Help added for switches -p, -s, -v
===========================================================

C   Wlib overwrote an existing object file with no truncation (in the
    "*" extract operation). This resulted in a corrupt object file
    when the new one was shorter than the old one.
===========================================================

C   Fixed some problems related to creating AR format libraries
    using the -fa switch.
===========================================================

B   Wlib wasn't giving a warning message if you tried to extract
    a nonexistent object file.
===========================================================

          ************
          ** Linker **
          ************

C   Fixed problem where WLINK was inserting random text
    (often parts of WLSYSTEM.LNK) in the final executable
===========================================================

C   Fixed WLINK so that it now works interactively again
===========================================================

C   Added support for case-insensitive searching of COFF (AR-format)
    libraries. For example, the linker now matches _SLEEP@4 with
    _Sleep@4 in KERNEL32.LIB.
===========================================================

B   Fixed output of QNX executables for a rare case of
    internal buffer filling.
===========================================================

B   OP INC IS NOT SUPPORTED FOR 16-BIT DOS OR NetWare,
    in 11.0 you didn't get an error to indicate this
===========================================================

B   fixed a bug where

    "wlink debug watcom types" or
    "wlink debug watcom locals" or
    "wlink debug watcom lines"

    would all cause the linker to crash

    "wlink debug watcom all" was fine
===========================================================

B   NT linker was crashing if you ran it with no arguments, and
    typed something at the WLINK> prompt
===========================================================

B   fixed a bug where WLINK was crashing while trying to link an app
    with codeview debuggin info
===========================================================

          **********
          ** Make **
          **********

A   In non-Microsoft mode, WMAKE will find and process
    a file named "MAKEFINI" after all makefiles have been
    processed.

===========================================================

          ***********************
          ** Resource Compiler **
          ***********************

C   Added support for CodePage 1250 to UNICODE translation (1250.UNI).
===========================================================

          **************
          ** Debugger **
          **************

B   dwarf dip now exits gracefully if it failes to load debug info
===========================================================

B   Fixed a bug on DOS or Win95 Host:
    binw\wd was crashing on loading DOS/4GW EXE.
    The debugger was running out of memory trying to read in a large app
    or large app + symbolic debugging info (.SYM) file.
    Problem did not occur with the binnt debuggers under NT.
===========================================================

B   binw\wd was crashing when inspecting ofstream structure with
    Watcom or Codeview debugging information.
===========================================================

B   Debugger was crashing when double-clicking on an entry in calls window.
===========================================================

B   If winserv terminated abnormally for any reason, you could not
    restart it unless you gave the server a different name. This is a
    bigger problem than appears at first, because the IDE uses an
    unnamed debug server.  As such, if you were debugging DOS/4GW
    under Windows 95 and the application crashed the server, then you
    had to reboot before you can debug in the IDE to start the debugger
    again. Winserv will now free the name and try again if it tries
    to connect to a server and is unable to connect.
===========================================================

A   Rolled back DOS4G extender to 1.96 to fix pharlap application
    debugging crashes.
===========================================================

A   fixed a bug where you couldn't debug "Large" DOS/4GW apps
===========================================================

          ***************
          ** Assembler **
          ***************

C   Conditional move instructions for Pentium Pro were being assembled
    back to front
===========================================================
 
C   Fixed message numbers so that they increase sequentially from 1
    and from 500 in each of the two groups of messages. Previously,
    message numbers had large gaps in them.
===========================================================

B   Fixed a bug where wasm wouldn't assemble:
    "psrlq m1, dummy"
    where dummy is a quadword
    It gave an error: "Second operand too big".
===========================================================

          *********************
          ** Watcom Profiler **
          *********************

C   Fixed "Out of Memory" error when sample file has no samples.
    Fixed disassembly error in display of location counter (eip/ip).
===========================================================

          *********************
          **** Clone Tools ****
          *********************

C   Fixed CL & CL386 so that switches -MD or -MDd are translated as
    the equivalent Watcom switch -br. Previously no translation
    was occuring. For the real Microsoft tools, the switches means
    using the Run-Time Libraries in DLL form. Correcting this means
    the equivalent Watcom Run-Time Libraries in DLL form will be used.
===========================================================

Changes in 11.0 that may Require Recompilation:
-----------------------------------------------
clock()
The clock function accuracy has changed from 100 ticks per second to
1000 ticks per second (i.e., CLOCKS_PER_SEC has changed). Source code
that uses the clock function and CLOCKS_PER_SEC in its calculations
must be recompiled before linking the application with new libraries.


Major Differences from Version 10.6:
------------------------------------
The following sections summarize the major differences from the
previous release of Watcom C/C++.

In general, we have improved Microsoft compatibility in our compilers
(more warnings instead of errors, support for MS extensions, etc.)
and tools. Some of the Win32 and 32-bit OS/2 versions of our tools
are now available in DLL form.

     EXE      DLL       Description
     ------   -------   -----------------------
     wcc      wccd      16-bit x86 C compiler
     wcc386   wccd386   32-bit x86 C compiler
     wpp      wppdi86   16-bit x86 C++ compiler
     wpp386   wppd386   32-bit x86 C++ compiler
     wlink    wlink     Watcom Linker
     wlib     wlibd     Watcom Library Manager

This provides better performance when using the Integrated Development
Environment or Watcom Make. See the description of the !loaddll
preprocessing directive in Watcom Make for more information.

Changes to the C++ Compiler for 11.0
------------------------------------
We have added support for namespaces and RTTI (Run-Time Type
Identification).
We have improved (faster) pre-compiled header support.
We have added "long long" (64-bit integer) support in the form of
a new __int64 type.

Changes to the C Compiler for 11.0
----------------------------------
We have improved (faster) pre-compiled header support.
We have added "long long" (64-bit integer) support in the form of
a new __int64 type.

Changes to the Code Generator for 11.0
--------------------------------------
A new optimization, "branch prediction", has been added. This
optimization is enabled by the "ob" or "ox" compiler options.
The code generator tries to increase the density of cache use by
predicting branches based upon heuristics (this optimization is
especially important for Intel's Pentium Pro). We have added
Multi-media Extensions (MMX) support to the in-line assemblers.
We have added "long long" (64-bit integer) support in the form of
a new __int64 type.

Changes to the Compiler Tools for 11.0
--------------------------------------
The Watcom Linker supports incremental linking.
The Watcom Library Manager (WLIB) can now understand COFF and ELF
format object files, as well as OMF et al. The Watcom Library
Manager can now read/write AR-format (Microsoft compatible),
Multilib (used by IBM for PowerPC version of OS/2), or old-style
OMF libraries. The default output format is AR-format and this can
be changed by switches. The Watcom Library Manager can output various
format import libraries.

We have added Multi-media Extensions (MMX) support to the Watcom
Assembler (WASM). A new version of the Watcom Disassembler (WDIS)
is included. It can process ELF, COFF or OMF object files and ELF,
COFF or PE format (Win32) executables.

The old disassembler (WDISASM) has been retired and is not included
in the package.

We have added new tool front-ends that emulate Microsoft tools.
These are:

    nmake
    cl
    link
    lib
    rc
    cvtres
    mapsym

These programs take the usual Microsoft arguments and translate them,
where possible, into equivalent Watcom arguments and spawn the
equivalent Watcom tools.

Watcom Make now processes Microsoft format makefiles when the "ms"
option is used.

Changes to the C/C++ Libraries for 11.0
---------------------------------------
We have added multi-byte and wide character (including UNICODE)
support to the libraries.
We include run-time DLLs for the C, Math and C++ Libraries.
We have added Multi-media Extensions (MMX) support to the libraries.
The following new functions were added to the library...

mb functions

The clock function accuracy has changed from 100 ticks per second
to 1000 ticks per second (i.e., CLOCKS_PER_SEC has changed).

Changes to the DOS Graphics Library for 11.0
--------------------------------------------
The graphics library now performs the VESA test before testing for
vendor specific graphics cards. This fix is intended to broaden
the number of graphics cards that are supported.

For details on what was new in versions 10.6 and earlier, see the
GETTING STARTED helpfile.

Other notes:

Note: %DstDir% represents the directory in which WATCOM C/C++ was installed.
      %WinSysDir% represents your Windows 3.x system directory.

1.  When debugging a 32-bit Phar Lap, TNT or DOS/4GW application, make sure
    that "run386.exe", "tnt.exe", or "dos4gw.exe" respectively, are in your
    path.  Failure to do so, may cause your computer to hang.

2. When using the GUI debugger to debug Windows 3.x applications, certain
   Windows applications may cause the debugger to behave in an unpredictable
   way.  Typically, this occurs when debugging certain messages in window
   callback functions.  For example, hitting a breakpoint in a window
   function that is processing a WM_INITDIALOG message will crash the system.
   If this happens, the character-mode version of the debugger should be
   used.

3. In order to use CodeWright with our IDE, you will need to change the
   "cwright.ini" file.  This file contains the following line.

    ;LibPreload=cwdde.dll

   Uncomment this line by removing the ';' character.  This is required to
   enable communication between the IDE and CodeWright when "weditcw.dll"
   is selected as the editor interface DLL from the IDE.

4. If you choose to not install help files onto your hard disk, you will not
   be able to get help on the C library or MFC library from the editor.

5. Parallel remote debug servers now work in an OS/2 session.

6. When configuring the browser to use the CodeWright editor interface, you
   must specify "weditcw.dll" as the editor DLL, save the new options, exit
   the browser, and restart the browser.  Failure to do this will cause an
   exception to occur in the CodeWright interface DLL.

7. Under OS/2, if you are debugging a DOS application from the IDE, you
   must ensure that %DstDir%\binw is in your DOS path so that when the IDE
   starts a DOS session to debug your application, the remote server can find
   its support files.

8. Under OS/2, you must ensure that the "Comet cursor" desktop setting is
   disabled if you want to debug PM applications.  By default, this setting
   is disabled.

10. The OS/2 Resource Comiler ( RC.EXE ) does not work correctly if the
    directory which contains RC.EXE occurs too late in your PATH environment
    variable ( > 250 characters ). If you experience problems with RC.EXE,
    you should change the PATH environment variable in your CONFIG.SYS file,
    by moving %WATCOM%\BINP and %WATCOM%\BINW earlier in the path.

