1 Potential Incompatibilities

This document contains a list of potential incompatibilities between Erlang 5.7/OTP R12A and Erl 5.6.5/OTP R12B-5, and is an extract from the release notes for the respective applications.

1.1  compiler

  • The undocumented, unsupported, and deprecated guard BIF is_constant/1 has been removed.

    *** INCOMPATIBILITY with R12B ***

    Own Id: OTP-7673

  • The short-circuit operators andalso and orelse no longer guarantees that their second argument is either true or false. As a consequence, andalso/orelse are now tail-recursive.

    *** POTENTIAL INCOMPATIBILITY ***

    Own Id: OTP-7748

  • The compiler will refuse to a compile file where the module name in the file differs from the output file name.

    When compiling using erlc, the current working directory will no be included in the code path (unless explicitly added using "-pa .").

    *** POTENTIAL INCOMPATIBILITY ***

    Own Id: OTP-7793

  • If a module contains an exported function with the same name as an auto-imported BIF (such as length/1), any calls to the BIF must have an explicit erlang: prefix, or there will be a compilation error (such calls would only generate a warning in previous releases).

    (The reason for the change is to avoid breaking code in a future major release, R14 or R15, in which we plan to make calls without a module prefix always call the local function in the same module even if there is an auto-imported BIF with the same name.)

    *** POTENTIAL INCOMPATIBILITY ***

    Own Id: OTP-7873

1.2  Erts

  • Support for Unicode is implemented as described in EEP10. Formatting and reading of unicode data both from terminals and files is supported by the io and io_lib modules. Files can be opened in modes with automatic translation to and from different unicode formats. The module 'unicode' contains functions for conversion between external and internal unicode formats and the re module has support for unicode data. There is also language syntax for specifying string and character data beyond the ISO-latin-1 range.

    The interactive shell will support input and output of unicode characters when the terminal and operating system supports it.

    Please see the EEP and the io/io_lib manual pages as well as the stdlib users guide for details.

    I/O-protocol incompatibilities:

    The io_protocol between io_Server and client is updated to handle protocol data in unicode formats. The updated protocol is now documented. The specification resides in the stdlib users manual, which is a new part of the manual.

    io module incompatibilities:

    The io:put_chars, io:get_chars and io:get_line all handle and return unicode data. In the case where binaries can be provided (as to io:put_chars), they shall be encoded in UTF-8. When binaries are returned (as by io:get_line/get_chars when the io_server is set in binary mode) the returned data is also always encoded as UTF-8. The file module however still returns byte-oriented data, why file:read can be used instead of io:get_chars to read binary data in ISO-latin-1.

    io_lib module incompatibilities:

    io_lib:format can, given new format directives (i.e "~ts" and "~tc"), return lists containing integers larger than 255.

    *** POTENTIAL INCOMPATIBILITY ***

    Own Id: OTP-7648 Aux Id: OTP-7580 OTP-7514 OTP-7494 OTP-7443 OTP-7181 EEP10 EEP11

  • The undocumented, unsupported, and deprecated guard BIF is_constant/1 has been removed.

    *** INCOMPATIBILITY with R12B ***

    Own Id: OTP-7673

  • The short-circuit operators andalso and orelse no longer guarantees that their second argument is either true or false. As a consequence, andalso/orelse are now tail-recursive.

    *** POTENTIAL INCOMPATIBILITY ***

    Own Id: OTP-7748

  • The compiler will refuse to a compile file where the module name in the file differs from the output file name.

    When compiling using erlc, the current working directory will no be included in the code path (unless explicitly added using "-pa .").

    *** POTENTIAL INCOMPATIBILITY ***

    Own Id: OTP-7793

  • The deprecated functions erlang:fault/1, erlang:fault/2, and file:rawopen/2 have been removed.

    *** POTENTIAL INCOMPATIBILITY ***

    Own Id: OTP-7812

  • The escape sequences \x and \{ have been assigned new interpretations (they used to return the ASCII code for x and { respectively). One or more octal characters inside curly brackets after a leading backslash is from now on an alternative to the existing syntax \NNN, but can also be used for codes greater than 255. In a similar fashion, one or more hexadecimal characters can be put inside curly brackets after a leading \x. Furthermore, the escape sequences \xH and \xHH, where N is a hexadecimal character, can be used for codes less than 256.

    NOTE: These new escape sequences are still considered experimental and may be changed in the R13B release.

    *** POTENTIAL INCOMPATIBILITY ***

    Own Id: OTP-7855

1.3  Inets

  • [httpc] - The inets http client will now use persistent connections without pipelining as default and if a pipeline timeout is set it will pipeline the requests on the persistent connections.

    *** POTENTIAL INCOMPATIBILITY ***

    Own Id: OTP-7463

1.4  Jinterface

  • A number of fixes and improvements from the ErlIDE group; Vlad Dumitrescu and Jakob Cederlund: JDK 1.5 is now a minimal requirement for building Jinterface. New method: OtpEpmd.lookupNames. OtpErlangList is now iterable. Non-proper lists are now allowed - you have to test if a list is proper or not. Non-proper lists can also be created. New methods: isProper, getHead, getTail and getNthTail. The get tail methods creates a sublist object that re-uses the original list. OtpErlangPid is now Comparable. Empty atoms can now be constructed, a missing feature pointed out by Sebastien Boisgerault on erlang-questions.

    *** POTENTIAL INCOMPATIBILITY ***

    Own Id: OTP-7832

1.5  Kernel

  • The deprecated functions erlang:fault/1, erlang:fault/2, and file:rawopen/2 have been removed.

    *** POTENTIAL INCOMPATIBILITY ***

    Own Id: OTP-7812

1.6  SSH

  • Ssh timeouts will now behave as expected i.e. defaults to infinity. Only the user of the ssh application can know of a reasonable timeout value for their application.

    *** POTENTIAL INCOMPATIBILITY ***

    Own Id: OTP-7807

  • Added the message {ssh_channel_up, ChannelId, ConnectionManager} that shall be handled by the channel callback handle_msg/2. This makes the function handle_msg/2 a mandatory function for ssh channels implementations which it was not in ssh-1.1.

    *** POTENTIAL INCOMPATIBILITY ***

    Own Id: OTP-7828

1.7  STDLIB

  • The functions lists:seq/1,2 return the empty list in a few cases when they used to generate an exception, for example lists:seq(1, 0). See lists(3) for details. (Thanks to Richard O'Keefe.)

    *** POTENTIAL INCOMPATIBILITY ***

    Own Id: OTP-7230

  • Support for Unicode is implemented as described in EEP10. Formatting and reading of unicode data both from terminals and files is supported by the io and io_lib modules. Files can be opened in modes with automatic translation to and from different unicode formats. The module 'unicode' contains functions for conversion between external and internal unicode formats and the re module has support for unicode data. There is also language syntax for specifying string and character data beyond the ISO-latin-1 range.

    The interactive shell will support input and output of unicode characters when the terminal and operating system supports it.

    Please see the EEP and the io/io_lib manual pages as well as the stdlib users guide for details.

    I/O-protocol incompatibilities:

    The io_protocol between io_Server and client is updated to handle protocol data in unicode formats. The updated protocol is now documented. The specification resides in the stdlib users manual, which is a new part of the manual.

    io module incompatibilities:

    The io:put_chars, io:get_chars and io:get_line all handle and return unicode data. In the case where binaries can be provided (as to io:put_chars), they shall be encoded in UTF-8. When binaries are returned (as by io:get_line/get_chars when the io_server is set in binary mode) the returned data is also always encoded as UTF-8. The file module however still returns byte-oriented data, why file:read can be used instead of io:get_chars to read binary data in ISO-latin-1.

    io_lib module incompatibilities:

    io_lib:format can, given new format directives (i.e "~ts" and "~tc"), return lists containing integers larger than 255.

    *** POTENTIAL INCOMPATIBILITY ***

    Own Id: OTP-7648 Aux Id: OTP-7580 OTP-7514 OTP-7494 OTP-7443 OTP-7181 EEP10 EEP11

  • filelib:fold_files/5 now uses the re module instead of the regexp module for regular expression matching. In practice, this change will not be a problem for most regular expressions used for filelib:fold_files/5. (The major difference in regular expression is that parenthesis and curly brackets is treated as literal characters by regexp but as special characters by re; fortunately, those characters are rarely used in filenames.)

    *** POTENTIAL INCOMPATIBILITY ***

    Own Id: OTP-7819

  • digraph:new(Type) will now cause a badarg exception if Type is not a valid type. Similarly, digraph_utils:subgraph/2,3 will now cause a badarg if the arguments are invalid. (Those functions used to return error tuples if something was wrong.)

    *** POTENTIAL INCOMPATIBILITY ***

    Own Id: OTP-7824

  • The argument passed to random:uniform/1 must now be an integer (as stated in the documentation). In previous releases, a floating point number was also allowed.

    *** POTENTIAL INCOMPATIBILITY ***

    Own Id: OTP-7827