The focus for the Delphi compiler R&D for the 10.2 Tokyo release was clearly the development of a new compiler for Linux. However, there were many bug fixes and several minor changes to the compilers for all platforms worth covering.

Command Line Compilers are Large Address-Aware

You can use the 4GB memory space for common line compilation, like it happens from the IDE since 10.1 Berlin. Notice that given the command line compiler has much less memory overhead (the IDE loads design time packages and libraries in its memory space), this gives the compilers even more room in memory.

New Warnings

There are new warnings in the compiler, mostly focused on helping find potential breakage when building applications for multiple platforms and different CPU types:

IMPLICIT_INTEGER_CAST_LOSS
W1071 Implicit integer cast with potential data loss from '' to ''


IMPLICIT_CONVERSION_LOSS
W1072 Implicit conversion may lose significant digits from '' to ''"


COMBINING_SIGNED_UNSIGNED64
W1073 Combining signed type and unsigned 64-bit type - treated as an unsigned type"

Only the last of these 3 is on by default. You can disable it with a directive like {$WARN COMBINING_SIGNED_UNSIGNED64 OFF}.

You can also turn each of the warnings in an error. For more information about this issue and a complete list of the warnings (and their ID, used for configuration) is available at http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Warning_messages_(Delphi)

Dynamic Arrays and Pointers

Assigning a dynamic array to a pointer is now considered an error, given this breaks reference counting on ARC platforms -- but can cause problems also on others. You can still do it (if you know what you are doing!) by using a hard cast.

Changes to Namespace Resolutions Rules

References do dotted unit names from uses statements have become a little more flexible. In the past, it had to be a direct match or reply on unit aliases declared in the project. Now the rule is a little more flexible. The compiler searches the non-prefixed name first, then iterate optionally specified namespaces. So, for example, "uses Classes" will first look for a unit called "Classes.pas", than go for "System.Classes.pas" and finally search in the FMX and VCL namespaces.

These new rules should be largely compatible with the old ones, as they should resolve more scenarios automatically, but specific projects with duplicated names and an odd use of aliases might end up behaving differently.

Allow Undefined to LLVM Linker

By default, the compiler asks the LLVM-based linker to resolved all external symbols (for DLLs and shared object files) passing the "--no-undefined" option to it. However you can use the "--allow-undefined" option to disable the standard behavior (and avoid indicating that linker option). This allows you linking when the symbols are not available at compile time. Occasionally this feature is handy on the Linux platform.