The question title is pretty self-explanatory. I'm wondering if that ever happened. And if so, what were those features and which were the Solidity versions where they were released/rolled back?

  • 4
    I think there are not many things which have been really removed. Only two things come to my mind: now and years. Jun 12, 2021 at 15:09

1 Answer 1


Yes. It's not rare at all. Almost every breaking version removes something old and deprecated. You can easily find them in the changelog. Often the goal is to make the language stricter and introduce extra checks. Sometimes these removals are things that turned out not to be very useful.

Here's a selection that only includes stuff that could be reasonably be considered useful by someone. There were also unintentional "features" like e.g. the fact that you could include leading zeros in bytesXX types until 0.7.6 (e.g. bytes007 was valid) or have a useless variable of library type until 0.7.4. I also skipped removal of compiler options, parts of AST output, etc.

  • 0.8.0
  • General: Remove global functions log0, log1, log2, log3 and log4.
  • Scanner: Remove support for the \b, \f, and \v escape sequences.
  • Type System: Disallow enums with more than 256 members.
  • Type System: Disallow the byte type. It was an alias to bytes1.
  • Type System: Explicit conversions between two types are disallowed if it changes more than one of sign, width or kind at the same time.
  • 0.7.0
  • Parser: Remove the finney and szabo denominations.
  • Parser: Remove the identifier now (replaced by block.timestamp).
  • Type Checker: Disallow structs and arrays in memory or calldata if they contain nested mappings.
  • Inline Assembly: Disallow . in user-defined function and variable names.
  • Yul: Disallow consecutive and trailing dots in identifiers. Leading dots were already disallowed.
  • Yul: Disallow EVM instruction pc().
  • 0.6.2
  • LLL: The LLL compiler has been removed.
  • 0.5.10
  • Yul / Inline Assembly Parser: Disallow trailing commas in function call arguments.
  • 0.5.0
  • General: Disallow declaring empty structs.
  • General: Disallow raw callcode.
  • General: Disallow var keyword.
  • General: Disallow sha3 and suicide aliases.
  • General: Disallow the throw statement.
  • General: Disallow the years unit denomination.
  • General: Disallow combining hex numbers with unit denominations (e.g. 0x1e wei).
  • Parser: Disallow trailing dots that are not followed by a number.
  • Parser: Disallow uppercase X in hex number literals
  • Type Checker: Disallow assignments between tuples with different numbers of components.
  • Type Checker: Disallow arithmetic operations for boolean variables.
  • Type Checker: Disallow calling base constructors without parentheses.
  • Type Checker: Disallow conversions between bytesX and uintY of different size.
  • Type Checker: Disallow conversions between unrelated contract types.
  • Type Checker: Disallow empty return statements for functions with one or more return values.
  • Type Checker: Disallow empty tuple components.
  • Type Checker: Disallow multi-variable declarations with mismatching number of values.
  • Type Checker: Disallow calling constructor with wrong argument count.
  • Type Checker: Disallow uninitialized storage variables.
  • Type Checker: Only accept a single bytes type for .call() (and family), keccak256(), sha256() and ripemd160().
  • Type Checker: Address members are not included in contract types anymore. An explicit conversion is now required before invoking an address member from a contract.
  • Type Checker: Disallow "loose assembly" syntax entirely. This means that jump labels, jumps and non-functional instructions cannot be used anymore.
  • Type System: Disallow explicit and implicit conversions from decimal literals to bytesXX types.
  • Type System: Disallow explicit and implicit conversions from hex literals to bytesXX types of different size.
  • Syntax Checker: Named return values in function types are an error.
  • Syntax Checker: Disallow unary +.

If you're interested in what might be removed in the future, most of that stuff is labeled as a breaking change in the bug tracker:

The fact that there's an issue for it of course does not mean it will actually be removed, just that it's being considered.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.