На форуме относительно недавно упоминали новый компилятор от Huawei. Результаты его статического анализа позволяют выдвинуть претензии к особенностям языка, способствующим появлению ошибок. Напр.:
https://habr.com/ru/company/pvs-studio/blog/478284/
## Код:
```
enum Opcode : uint8 {
  kOpUndef,
  ....
  OP_intrinsiccall,
  OP_intrinsiccallassigned,
  ....
  kOpLast,
};

bool MIRParser::ParseStmtIntrinsiccall(StmtNodePtr &stmt, bool isAssigned) {
  ....
  if (o == !isAssigned ? OP_intrinsiccall : OP_intrinsiccallassigned) {
    intrnCallNode->SetIntrinsic(GetIntrinsicID(lexer.GetTokenKind()));
  } else {
    intrnCallNode->SetIntrinsic(static_cast<MIRIntrinsicID>(....));
  }
  ....
}

Оператор '==' имеет более высокий приоритет, чем тернарный оператор (?:). Следовательно, условное выражение выше:

if (o == !isAssigned ? OP_intrinsiccall : OP_intrinsiccallassigned) {
  ....
}

эквивалентно следующему:

if ((o == !isAssigned) ? OP_intrinsiccall : OP_intrinsiccallassigned) {
  ....
}
```

Перечисления OP_intrinsiccall и OP_intrinsiccallassigned имеют ненулевые значения, в итоге условие всегда детерминировано как положительное, else-часть содержит недостижимый код.


С другой стороны, отсутствие в Паскаль/Оберон "если как выражение" это не только "защита", но и игнорирование удобств для пользователя (конечно же, не на каждый чих нужен immediate if). В Ada, например, "встроенный if" (и "встроенный for") аля:
## Код:
```
G : constant Matrix :=
    (for I in 1 .. 4 =>
       (for J in 1 .. 4 =>
          (if I = J then 1.0 else 0.0)));
```
