GCC 3.3 Release Series
Changes, New Features, and Fixes
Caveats
- The preprocessor no longer accepts multi-line string literals.
They were deprecated in 3.0, 3.1, and 3.2.
- The preprocessor no longer supports the
-A-
switch when appearing alone. -A-
followed by an
assertion is still supported.
- Support for all the systems obsoleted in
GCC 3.1 has been removed from GCC 3.3. See below for a
list of systems which are obsoleted
in this release.
- Checking for null format arguments has been decoupled from
the rest of the format checking mechanism. Programs which
use the
format
attribute may regain this
functionality by using the new nonnull
function
attribute. Note that all functions for which GCC has a
built-in format
attribute, an appropriate
built-in nonnull
attribute is also applied.
- The DWARF (version 1) debugging format has been deprecated and
will be removed in a future version of GCC. Version 2 of the
DWARF debugging format will continue to be supported for the
foreseeable future.
- The C and Objective-C compilers no longer accept the "Naming
Types" extension (
typedef foo = bar
); it was
already unavailable in C++. Code which uses it will need to
be changed to use the "typeof" extension instead:
typedef typeof(bar) foo
. (We have removed this
extension without a period of deprecation because it has
caused the compiler to crash since version 3.0 and no one
noticed until very recently. Thus we conclude it is not in
widespread use.)
- The
-traditional
C compiler option has been
removed. It was deprecated in 3.1 and 3.2. (Traditional
preprocessing remains available.) The
<varargs.h>
header, used for writing
variadic functions in traditional C, still exists but will
produce an error message if used.
General Optimizer Improvements
- A new scheme for accurately describing processor pipelines,
the DFA scheduler, has been
added.
Pavel Nejedly, Charles University Prague, has contributed new file format
used by the edge coverage profiler (-fprofile-arcs
).
The new format is robust and diagnoses common mistakes where
profiles from different versions (or compilations) of the program are
combined resulting in nonsensical profiles and slow code to produced
with profile feedback. Additionally this format allows extra data to
be gathered. Currently, overall statistics are produced helping
optimizers to identify hot spots of a program globally replacing the
old intra-procedural scheme and resulting in better code. Note that the
gcov
tool from older GCC versions will not be able to
parse the profiles generated by GCC 3.3 and vice versa.
Jan Hubicka, SuSE Labs, has contributed a new superblock formation
pass enabled using -ftracer
. This pass simplifies the
control flow of functions allowing other optimizations to do better
job.
He also contributed the function reordering pass
(-freorder-functions
) to optimize function placement
using profile feedback.
New Languages and Language specific improvements
C/ObjC/C++
- The preprocessor now accepts directives within macro
arguments. It processes them just as if they had not been within
macro arguments.
- The separate ISO and traditional preprocessors have been
completely removed. The front-end handles either type of
preprocessed output if necessary.
- In C99 mode preprocessor arithmetic is done in the precision
of the target's
intmax_t
, as required by that
standard.
- The preprocessor can now copy comments inside macros to the
output file when the macro is expanded. This feature, enabled
using the
-CC
option, is intended for use by
applications which place metadata or directives inside comments,
such as lint
.
- The method of constructing the list of directories to be searched
for header files has been revised. If a directory named by a
-I
option is a standard system include directory,
the option is ignored to ensure that the default search order
for system directories and the special treatment of system header
files are not defeated.
- A few more ISO C99 features now
work correctly.
- A new function attribute,
nonnull
, has been added
which allows pointer arguments to functions to be specified as
requiring a non-null value. The compiler currently uses this
information to issue a warning when it detects a null value passed
in such an argument slot.
- A new type attribute,
may_alias
, has been added.
Accesses to objects with types with this attribute are not
subjected to type-based alias analysis, but are instead assumed to
be able to alias any other type of objects, just like the
char
type.
C++
- Type based alias analysis has been implemented for C++
aggregate types.
Objective-C
- Generate an error if Objective-C objects are passed by value
in function and method calls.
- When
-Wselector
is used, check the whole list of
selectors at the end of compilation, and emit a warning if a
@selector()
is not known.
- Define
__NEXT_RUNTIME__
when compiling for the
NeXT runtime.
- No longer need to include
objc/objc-class.h
to
compile self calls in class methods (NeXT runtime only).
- New
-Wundeclared-selector
option.
- Removed selector bloating which was causing object files to be
10% bigger on average (GNU runtime only).
- Using at run time
@protocol()
objects has been
fixed in certain situations (GNU runtime only).
- Type checking has been fixed and improved in many situations
involving protocols.
Java
- The
java.sql
and javax.sql
packages now
implement the JDBC 3.0 (JDK 1.4) API.
- The JDK 1.4
assert
facility has been
implemented.
- The bytecode interpreter is now direct threaded and thus
faster.
Fortran
Ada
- Ada tasking now works with glibc 2.3.x threading libraries.
New Targets and Target Specific Improvements
- The following changes have been made to the HP-PA port:
- The port now defaults to scheduling for the PA8000 series
of processors.
- Scheduling support for the PA7300 processor has been added.
- The 32-bit port now supports weak symbols under HP-UX 11.
- The handling of initializers and finalizers has been improved
under HP-UX 11. The 64-bit port no longer uses collect2.
- Dwarf2 EH support has been added to the 32-bit linux port.
- ABI fixes to correct the passing of small structures by value.
- The SPARC, HP-PA, SH4, and x86/pentium ports have been converted to
use the DFA processor pipeline description.
- The following NetBSD configurations for the SuperH processor family
have been added:
- SH3, big-endian,
sh-*-netbsdelf*
- SH3, little-endian,
shle-*-netbsdelf*
- SH5, SHmedia, big-endian, 32-bit default,
sh5-*-netbsd*
- SH5, SHmedia, little-endian, 32-bit default,
sh5le-*-netbsd*
- SH5, SHmedia, big-endian, 64-bit default,
sh64-*-netbsd*
- SH5, SHmedia, little-endian, 64-bit default,
sh64le-*-netbsd*
- The following changes have been made to the IA-32/x86-64 port:
- SSE2 and 3dNOW! intrinsics are now supported.
- Support for thread local storage has been added to the IA-32
and x86-64 ports.
- The x86-64 port has been significantly improved.
- The following changes have been made to the MIPS port:
- All configurations now accept the
-mabi
switch. Note that you will need appropriate multilibs
for this option to work properly.
- ELF configurations will always pass an ABI flag to
the assembler, except when the MIPS EABI is selected.
-mabi=64
no longer selects MIPS IV code.
- The
-mcpu
option, which was deprecated
in 3.1 and 3.2, has been removed from this release.
-march
now changes the core ISA level.
In previous releases, it would change the use of
processor-specific extensions, but would leave the core
ISA unchanged. For example, mips64-elf
-march=r8000
will now generate MIPS IV code.
- Under most configurations,
-mipsN
now acts as a
synonym for -march
.
- There are some new preprocessor macros to describe the
-march
and -mtune
settings.
See the documentation of those options for details.
- Support for the NEC VR-Series processors has been
added. This includes the 54xx, 5500, and 41xx series.
- Support for the Sandcraft sr71k processor has been
added.
- The following changes have been made to the S/390 port:
- Support to build the Java runtime libraries has been added.
Java is now enabled by default on
s390-*-linux*
and s390x-*-linux*
targets.
- Multilib support for the
s390x-*-linux*
target
has been added; this allows to build 31-bit binaries using
the -m31
option.
- Support for thread local storage has been added.
- Inline assembler code may now use the 'Q' constraint
to specify memory operands without index register.
- Various platform-specific performance improvements
have been implemented; in particular, the compiler now
uses the
BRANCH ON COUNT
family of instructions
and makes more frequent use of the TEST UNDER MASK
family of instructions.
- The following changes have been made to the PowerPC port:
- Support for IBM Power4 processor added.
- Support for Motorola e500 SPE added.
- Support for AIX 5.2 added.
- Function and Data sections now supported on AIX.
- Sibcall optimizations added.
- The support for H8 Tiny is added to the H8/300 port with
-mn
.
Support for a number of older systems has been declared obsolete in
GCC 3.3. Unless there is activity to revive them, the next release of
GCC will have their sources permanently removed.
All configurations of the following processor architectures have
been declared obsolete:
- Matsushita MN10200,
mn10200-*-*
- Motorola 88000,
m88k-*-*
- IBM ROMP,
romp-*-*
Also, some individual systems have been obsoleted:
- Alpha
- Interix,
alpha*-*-interix*
- Linux libc1,
alpha*-*-linux*libc1*
- Linux ECOFF,
alpha*-*-linux*ecoff*
- ARM
- Generic a.out,
arm*-*-aout*
- Conix,
arm*-*-conix*
- "Old ABI,"
arm*-*-oabi
- StrongARM/COFF,
strongarm-*-coff*
- HPPA (PA-RISC)
- Generic OSF,
hppa1.0-*-osf*
- Generic BSD,
hppa1.0-*-bsd*
- HP/UX versions 7, 8, and 9,
hppa1.[01]-*-hpux[789]*
- HiUX,
hppa*-*-hiux*
- Mach Lites,
hppa*-*-lites*
- Intel 386 family
- Windows NT 3.x,
i?86-*-win32
- MC68000 family
- HP systems,
m68000-hp-bsd*
and m68k-hp-bsd*
- Sun systems,
m68000-sun-sunos*
,
m68k-sun-sunos*
,
and m68k-sun-mach*
- AT&T systems,
m68000-att-sysv*
- Atari systems,
m68k-atari-sysv*
- Motorola systems,
m68k-motorola-sysv*
- NCR systems,
m68k-ncr-sysv*
- Plexus systems,
m68k-plexus-sysv*
- Commodore systems,
m68k-cbm-sysv*
- Citicorp TTI,
m68k-tti-*
- Unos,
m68k-crds-unos*
- Concurrent RTU,
m68k-ccur-rtu*
- Linux a.out,
m68k-*-linux*aout*
- Linux libc1,
m68k-*-linux*libc1*
- pSOS,
m68k-*-psos*
- MIPS
- Generic ECOFF,
mips*-*-ecoff*
- SINIX,
mips-sni-sysv4
- Orion RTEMS,
mips64orion-*-rtems*
- National Semiconductor 32000
- OpenBSD,
ns32k-*-openbsd*
- POWER (aka RS/6000) and PowerPC
- AIX versions 1, 2, and 3,
rs6000-ibm-aix[123]*
- Bull BOSX,
rs6000-bull-bosx
- Generic Mach,
rs6000-*-mach*
- Generic SysV,
powerpc*-*-sysv*
- Linux libc1,
powerpc*-*-linux*libc1*
- Sun SPARC
- Generic a.out,
sparc-*-aout*
,
sparclet-*-aout*
,
sparclite-*-aout*
,
and sparc86x-*-aout*
- NetBSD a.out,
sparc-*-netbsd*aout*
- Generic BSD,
sparc-*-bsd*
- ChorusOS,
sparc-*-chorusos*
- Linux a.out,
sparc-*-linux*aout*
- Linux libc1,
sparc-*-linux*libc1*
- LynxOS,
sparc-*-lynxos*
- Solaris on HAL hardware,
sparc-hal-solaris2*
- SunOS versions 3 and 4,
sparc-*-sunos[34]*
- NEC V850
- VAX
Documentation improvements
Other significant improvements
- Almost all front-end dependencies in the compiler have been
separated out into a set of language hooks. This should make
adding a new front end clearer and easier.
- One effect of removing the separate preprocessor is a small
increase in the robustness of the compiler in general, and the
maintainability of target descriptions. Previously
target-specific built-in macros and others, such as
__FAST_MATH__
, had to be handled with so-called specs
that were hard to maintain. Often they would fail to behave
properly when conflicting options were supplied on the command
line, and define macros in the user's namespace even when strict
ISO compliance was requested. Integrating the preprocessor has
cleanly solved these issues.
- The Makefile suite now supports redirection of
make install
by means of the variable
DESTDIR
.
GCC 3.3
Detailed release notes for the GCC 3.3 release follow.
Bug Fixes
bootstrap failures
Internal compiler errors (multi-platform)
- 3581 large string causes segmentation fault in cc1
- 4382
__builtin_{set,long}jmp
with -O3
can crash the compiler
- 6387
-fpic -gdwarf-2 -g1
combination gives ICE in dwarf2out
- 6412 (c++) ICE in
retrieve_specialization
- 6620 (c++) partial template specialization causes an ICE (segmentation fault)
- 6663 (c++) ICE with attribute
aligned
- 7068 ICE with incomplete types
- 7647 (c++) ICE when data member has the name of the enclosing class
- 7675 ICE in
fixup_var_refs_1
- 7718 'complex' template instantiation causes ICE
- 8116 (c++) ICE in member template function
- 8358 (ada) Ada compiler accesses freed memory, crashes
- 8511 (c++) ICE: (hopefully) reproducible cc1plus segmentation fault
- 8564 (c++) ICE in
find_function_data
, in function.c
- 8660 (c++) template overloading ICE in
tsubst_expr
, in cp/pt.c
- 8766 (c++) ICE after failed initialization of static template variable
- 8803 ICE in
instantiate_virtual_regs_1
, in function.c
- 8846 (c++) ICE after diagnostic if
fr_FR@euro
locale is set
- 8906 (c++) ICE (Segmentation fault) when parsing nested-class definition
- 9216 (c++) ICE on missing template parameter
- 9261 (c++) ICE in
arg_assoc
, in cp/decl2.c
- 9263 (fortran) ICE caused by invalid
PARAMETER
in implied DO
loop
- 9429 (c++) ICE in template instantiation with a pointered
new
operator
- 9516 Internal error when using a big array
- 9600 (c++) ICE with typedefs in template class
- 9629 (c++) virtual inheritance segfault
- 9672 (c++) ICE: Error reporting routines re-entered
- 9749 (c++) ICE in
write_expression
on invalid function prototype
- 9794 (fortran) ICE: floating point exception during constant folding
- 9829 (c++) Missing colon in nested namespace usage causes ICE
- 9916 (c++) ICE with
noreturn
function in ?:
statement
- 9936 ICE with local function and variable-length 2d array
- 10262 (c++) cc1plus crashes with large generated code
- 10278 (c++) ICE in parser for invalid code
- 10446 (c++) ICE on definition of nonexistent member function of nested class in a class template
- 10451 (c++) ICE in
grokdeclarator
on spurious mutable
declaration
- 10506 (c++) ICE in
build_new
at cp/init.c
with -fkeep-inline-functions
and multiple inheritance
- 10549 (c++) ICE in
store_bit_field
on bitfields that exceed the precision of the declared type
Optimization bugs
- 2001 Inordinately long compile times in reload CSE regs
- 2391 Exponential compilation time explosion in combine
- 2960 Duplicate loop conditions even with
-Os
- 4046 redundant conditional branch
- 6405 Loop-unrolling related performance regressions
- 6798 very long compile time with large case-statement
- 6871
const
objects shouldn't be moved to .bss
- 6909 problem w/
-Os
on modified loop-2c.c
test case
- 7189 gcc
-O2 -Wall
does not print ``control reaches end of non-void function'' warning
- 7642 optimization problem with
signbit()
- 8634 incorrect code for inlining of memcpy under
-O2
- 8750 Cygwin prolog generation erroneously emitting
__alloca
as regular function call
c front end
- 2161 long
if-else
cascade overflows parser stack
- 4319 short accepted on
typedef
'd char
- 8602 incorrect line numbers in warning messages when using inline functions
- 9177
-fdump-translation-unit
: C front end deletes function_decl
AST nodes and breaks debugging dumps
- 9853 miscompilation of non-constant structure initializer
c++ compiler and library
- 45 legal template specialization code is rejected (DUP: 3784)
- 764 lookup failure: friend operator and dereferencing a pointer and templates (DUP: 5116)
- 2862 gcc accepts invalid explicit instantiation syntax (DUP: 2863)
- 3663 G++ doesn't check access control during template instantiation
- 3797 gcc fails to emit explicit specialization of a template member
- 3948 Two destructors are called when no copy destructor is defined (ABI change)
- 4361 bogus ambiguity taking the address of a member template
- 4802 g++ accepts illegal template code (access to private member; DUP: 5837)
- 4803 inline function is used but never defined, and g++ does not object
- 5730 complex<double>::norm()
--
huge slowdown from egcs-2.91.66
- 6713 Regression wrt 3.0.4: g++
-O2
leads to seg fault at run time
- 7015 certain
__asm__
constructs rejected
- 7086 compile time regression (quadratic behavior in fixup_var_refs)
- 7099 G++ doesn't set the
noreturn
attribute on std::exit
and std::abort
- 7247 copy constructor missing when inlining enabled (invalid optimization?)
- 7441 string array initialization compilation time regression from seconds to minutes
- 7768
__PRETTY_FUNCTION__
for template destructor is wrong
- 7804 bad printing of floating point constant in warning message
- 8099 Friend classes and template specializations
- 8117 member function pointers and multiple inheritance
- 8205 using declaration and multiple inheritance
- 8645 unnecessary non-zero checks in
stl_tree.h
- 8724 explicit destructor call for incomplete class allowed
- 8805 compile time regression with many member variables
- 8691
-O3
and -fno-implicit-templates
are incompatible
- 8700 unhelpful error message for binding temp to reference
- 8724 explicit destructor call for incomplete class allowed
- 8949
numeric_limits<>::denorm_min()
and is_iec559
problems
- 9016 Failure to consistently constant fold "constant" C++ objects
- 9053 g++ confused about ambiguity of overloaded function templates
- 9152 undefined virtual thunks
- 9182
basic_filebuf<>
does not report errors in codecvt<>::out
- 9297 data corruption due to codegen bug (when copying.)
- 9318
i/ostream::operator>>/<<(streambuf*)
broken
- 9320 Incorrect usage of
traits_type::int_type
in stdio_filebuf
- 9400 bogus
-Wshadow
warning: shadowed declaration of this
in local classes
- 9424
i/ostream::operator>>/<<(streambuf*)
drops characters
- 9425
filebuf::pbackfail
broken (DUP: 9439)
- 9474 GCC freezes in compiling a weird code mixing
<iostream>
and <iostream.h>
- 9548 Incorrect results from
setf(ios::fixed)
and precision(-1)
[DR231]
- 9555
ostream
inserters fail to set badbit
on exception
- 9561
ostream
inserters rethrow exception of wrong type
- 9563
ostream::sentry
returns true after a failed preparation
- 9582 one-definition rule violation in
std::allocator
- 9622
__PRETTY_FUNCTION__
incorrect in template destructors
- 9683 bug in initialization chains for static
const
variables from template classes
- 9791
-Woverloaded-virtual
reports hiding of destructor
- 9817
collate::compare
doesn't handle nul characters
- 9825
filebuf::sputbackc
breaks sbumpc
- 9826
operator>>(basic_istream, basic_string)
fails to compile with custom traits
- 9924 Multiple
using
statements for builtin functions not allowed
- 9946 destructor is not called for temporary object
- 9964
filebuf::close()
sometimes fails to close file
- 9988
filebuf::overflow
writes EOF to file
- 10033 optimization breaks polymorphic references w/
typeid
operator
- 10097
filebuf::underflow
drops characters
- 10132
filebuf
destructor can throw exceptions
- 10180 gcc fails to warn about non-inlined function
- 10199 method parametrized by template does not work everywhere
- 10300 use of array-new (nothrow) in segfaults on NULL return
- 10427 Stack corruption with variable-length automatic arrays and virtual destructors
- 10503 Compilation never stops in
fixed_type_or_null
Objective-C
- 5956 selectors aren't matched properly when added to the selector table
Fortran compiler and library
- 1832 list directed i/o overflow hangs,
-fbounds-check
doesn't detect
- 3924 g77 generates code that is rejected by GAS if COFF debug info requested
- 5634 doc: explain that configure
--prefix=~/...
does not work
- 6367 multiple repeat counts confuse namelist read into array
- 6491 Logical operations error on logicals when using
-fugly-logint
- 6742 Generation of C++ Prototype for FORTRAN and
extern "C"
- 7113 Failure of
g77.f-torture/execute/f90-intrinsic-bit.f -Os
on irix6.5
- 7236
OPEN(...,RECL=nnn,...)
without ACCESS='DIRECT'
should assume a direct access file
- 7278 g77 "bug"; the executable misbehaves (with
-O2 -fno-automatic
)
- 7384
DATE_AND_TIME
milliseconds field inactive on Windows
- 7388 Incorrect output with 0-based array of characters
- 8587 Double complex zero ** double precision number
-> NaN
instead of zero
- 9038
-ffixed-line-length-none -x
f77-cpp-input gives: Warning: unknown register name line-length-none
- 10197 Direct access files not unformatted by default
Java compiler and library
- 6005 gcj fails to build rhug on alpha
- 6389
System.getProperty("")
should always throw an IllegalArgumentException
- 6576
java.util.ResourceBundle.getResource
ignores locale
- 6652
new java.io.File("").getCanonicalFile()
throws exception
- 7060
getMethod()
doesn't search super
interface
- 7073 bytecode interpreter gives wrong answer for interface
getSuperclass()
- 7180 possible bug in
javax.naming.spi.NamingManager.getPlusPath()
- 7416
java.security
startup refs "GNU libgcj.security"
- 7570
Runtime.exec
with null envp: child doesn't inherit parent env (DUP: 7578)
- 7611 Internal error while compiling libjava with
-O
- 7709
NullPointerException
in _Jv_ResolvePoolEntry
- 7766
ZipInputStream.available
returns 0 immediately after construction
- 7785
Calendar.getTimeInMillis/setTimeInMillis
should be public
- 7786
TimeZone.getDSTSavings()
from JDK1.4 not implemented
- 8142 '$' in class names vs.
dlopen
'dynamic string tokens'
- 8234
ZipInputStream
chokes when InputStream.read()
returns small chunks
- 8415 reflection bug: exception info for Method
- 8481
java.Random.nextInt(int)
may return negative
- 8593 Error reading GZIPped files with
BufferedReader
- 8759
java.beans.Introspector
has no flushCaches()
or flushFromCaches()
methods
- 8997
spin()
calls Thread.sleep
- 9253 on win32,
java.io.File.listFiles("C:\\")
returns pwd instead of the root content of C:
- 9254
java::lang::Object::wait(), threads-win32.cc
returns wrong return codes
- 9271 Severe bias in
java.security.SecureRandom
Ada compiler and library
- 6767
make gnatlib-shared
fails on -laddr2line
- 9911
gnatmake
fails to link when GCC configured with --with-sjlj-exceptions=yes
- 10020 Can't bootstrap gcc on AIX with Ada enabled
- 10546 Ada tasking not working on Red Hat 9
preprocessor
- 7029 preprocessor should ignore
#warning
with -M
ARM-specific
- 2903 [arm] Optimization bug with
long long
arithmetic
- 7873 arm-linux-gcc fails when assigning address to a bit field
FreeBSD-specific
- 7680 float functions undefined in
math.h/cmath
with #define _XOPEN_SOURCE
HP-UX or HP-PA-specific
- 8705 [HP-PA] ICE in
emit_move_insn_1
, in expr.c
- 9986 [HP-UX] Incorrect transformation of
fputs_unlocked
to fputc_unlocked
- 10056 [HP-PA] ICE at
-O2
when building c++ code from doxygen
m68hc11-specific
- 6744 Bad assembler code generated: reference to pseudo register z
- 7361 Internal compiler error in
reload_cse_simplify_operands
, in reload1.c
MIPS-specific
- 9496 [mips-linux] bug in optimizer?
PowerPC-specific
- 7067
-Os
with -mcpu
=powerpc optimizes for speed (?) instead of space
- 8480 reload ICEs for LAPACK code on powerpc64-linux
- 8784 [AIX] Internal compiler error in
simplify_gen_subreg
- 10315 [powerpc] ICE: in
extract_insn
, in recog.c
Sparc-specific
- 10267 (documentation) Wrong build instructions for
*-*-solaris2*
x86-specific (Intel/AMD)
- 7916 ICE in
instantiate_virtual_register_1
- 7926 (c++) i486 instructions in header files make c++ programs crash on i386
- 8555 ICE in
gen_split_1231
- 8994 ICE with
-O -march=pentium4
- 9426 ICE with
-fssa -funroll-loops -fprofile-arcs
- 9806 ICE in inline assembly with
-fPIC
flag
- 10077 gcc
-msse2
generates movd to move dwords between xmm regs
- 10233 64-bit comparison only comparing bottom 32-bits
- 10286 type-punning doesn't work with
__m64
and -O
- 10308 [x86] ICE with
-O -fgcse
or -O2
Please send FSF & GNU inquiries & questions to
gnu@gnu.org.
There are also other ways
to contact the FSF.
These pages are maintained by
The GCC team.
Please send comments on these web pages and GCC to our public
mailing list at gcc@gnu.org or
gcc@gcc.gnu.org,
send other questions to gnu@gnu.org.
Copyright (C) Free Software Foundation, Inc.,
59 Temple Place - Suite 330, Boston, MA 02111, USA.
Verbatim copying and distribution of this entire article is
permitted in any medium, provided this notice is preserved.
Last modified 2003-05-15
|
|