! Paper number: P1426
! Topic: Pull the Plug on Contracts?
! Author: Nathan Myers
! Email: ncm@cantrip.org
! Audience: All of WG21

## Pull the Plug on Contracts?

Contract support necessarily has many moving parts, and affects
all programmers, acting in every capacity. To be usable at all,
it is essential that its design be simple and coherent. All users
of the language, even those less well equipped than our august
company, must be able to reason about contract annotations and
their implications, both for the meaning of code affected, and
for other programmers interacting with that code.

As originally proposed, this feature was carefully designed to
meet the needs of multiple disparate commmunities of users,
without particularly favoring any, and without ignoring any. 
This was a tricky task, because each detail affects all users.
Changes to details that seem to aid one group of users are
likely, without very careful consideration and adjustment, to
interfere with others' purposes.

Since the feature was voted into the Working Draft, it has been
subject to proposed revisions by people some of whom, variously,

 - Have not taken the time to understand its design, or
 - Focus on their own use to the exclusion of others', or even
 - Deny the legitimacy of others' uses, or
 - Have not written production code in many years, or
 - Do not love simplicity

-- or some combination of the above.

Some individuals have expressed an opinion that the feature was
designed principally for their own use, and that other intended
uses are secondary. Let me assure you that every such expression
is, at best, sadly mistaken. No one or two uses or commununities
were primary.  All users are affected by contracts, and all were,
at its inception, important.

Under the weight of proposed revisions, the coherence of the
design, and the possibility of all users understanding the
result, is under threat. There is a very real danger that
contracts could end up like the present object-initialization
semantics, which very few people, today, can honestly claim to
understand in detail. (It may be that everyone who does is here,
and implementing a compiler.)

A Contracts feature that makes the language harder to understand
might be worse than entire lack of the feature. This proposal
provides an escape hatch for this eventuality. I hope not to need
to bring it to a vote.

### Proposal

Remove support for Contracts in C++20. Plan to consider a
re-unified design for a later Standard.
