## Compiler 4.3

### Fixed Bugs and Malfunctions

The semantics for boolean operators in guards have been changed to be more consistent.

All boolean operators will fail if given non-boolean arguments; 'true or garbage' used to succeed but will now fail. Also, failure in the evaluation of the operands will also cause the guard to fail; 'true or element(1, [])' used to succeed but will now fail.

Semicolon will behave as it used to. If a failure as described above occurs, evaluation will continue with the right operand of the semicolon.

*** POTENTIAL INCOMPATIBILITY ***

Own Id: OTP-4623

-compile(...) attributes inside an Erlang module can now contain compiler options that control warnings (such as warn_unused_vars). They used to be ignored.

Own Id: OTP-4911

When a record was updated, and the record given as an expression (such as function call), the record could be evaluated more than once.

Own Id: OTP-4933

Compilation of modules with long strings could be extremely slow.

Own Id: OTP-4960 Aux Id: seq8310

In bit syntax matching with clauses having guards, sometimes the following clauses would never match if a guard was evaluated (and failed).

Own Id: OTP-4961 Aux Id: seq8338, OTP-4891

Using multiple matching ('=') in the pattern for a generator in list comprehension would cause an internal compiler error.

Example:

`[3 || {3=4} <- []].`

Own Id: OTP-5076 Aux Id: OTP-5092

List and string literals, and integer and character literals were not equivalent in matching as they should be. For instance, f("a"=[$a]) would never match.

Own Id: OTP-5092 Aux Id: OTP-5076

### Improvements and New Features

The compiler used to warn for definition of functions having the same name as an auto-imported BIF (such as size/1). In the R10B release, such warnings will only be emitted if the function is NOT exported (because it will be impossible to call it). Instead, there will be a warning for any local call (call without module prefix) to any (exported) function in the same module that is also the name of an auto-imported BIF. To avoid the warning, insert a module prefix (either erlang to call the BIF, or the name of the module to call function in the module).

Own Id: OTP-4909

The unary '+' operator has been changed to throw an badarith exception if its argument is not numeric (or fail in a guard). It used its argument unchanged whatever the type. Given the new meaning, unary '+' can now be used to test whether a term is numeric.

*** POTENTIAL INCOMPATIBILITY ***

Own Id: OTP-4928

The compiler now warns for more types of suspect code, such as expressions that will fail at run-time (such as atom-42), guards that are always false, or patterns that cannot match.

Own Id: OTP-5098 Aux Id: seq8965, OTP-2456

The long-awaited try...catch construction is included in this release. See the reference manual for how to use it.

Own Id: OTP-5150

## Compiler 4.2.3

### Fixed Bugs and Malfunctions

The compiler could generate incorrect code for receive clauses did not use the message in any way, for instance if a guard would ignore message depending on some condition not based on the contents of the message (e.g. a state variable in the "loop data").

Own Id: OTP-5050

## Compiler 4.2.2

### Fixed Bugs and Malfunctions

Compilation of modules with long strings could be extremely slow.

Own Id: OTP-4960 Aux Id: seq8310

In bit syntax matching with clauses having guards, sometimes the following clauses would never match if a guard was evaluated (and failed).

Own Id: OTP-4961 Aux Id: seq8338, OTP-4891

In (Expr)#rec{a=A,b=B}, Expr would be evaluated more than once.

Own Id: OTP-4962 Aux Id: seq8292

## Compiler 4.2.1

### Improvements and New Features

In rare circumstances, the compiler could optimize away test that would verify that a tuple or record argument indeed was of the correct type (resulting in an emulator crash if the argument was not of the correct type/size). Wrong code could also be generated for floating point expressions.

Own Id: OTP-4790