[AutoDiff upstream] Add flag-gated AdditiveArithmetic derivation. (#30628)

Add `AdditiveArithmetic` derived conformances for structs, gated by the
`-enable-experimential-additive-arithmetic-derivation` flag.

Structs whose stored properties all conform to `AdditiveArithmetic` can derive
`AdditiveArithmetic`:
- `static var zero: Self`
- `static func +(lhs: Self, rhs: Self) -> Self`
- `static func -(lhs: Self, rhs: Self) -> Self`
- An "effective memberwise initializer":
  - Either a synthesized memberwise initializer or a user-defined initializer
    with the same type.

Effective memberwise initializers are used only by derived conformances for
`Self`-returning protocol requirements like `AdditiveArithmetic.+`, which
require memberwise initialization.

Resolves TF-844.
Unblocks TF-845: upstream `Differentiable` derived conformances.
This commit is contained in:
Dan Zheng
2020-03-25 10:31:50 -07:00
committed by GitHub
parent 07596cbc9b
commit e5cb871428
20 changed files with 681 additions and 7 deletions

View File

@@ -442,8 +442,15 @@ static bool ParseLangArgs(LangOptions &Opts, ArgList &Args,
if (Args.hasArg(OPT_fine_grained_dependency_include_intrafile))
Opts.FineGrainedDependenciesIncludeIntrafileOnes = true;
if (Args.hasArg(OPT_enable_experimental_differentiable_programming))
if (Args.hasArg(OPT_enable_experimental_additive_arithmetic_derivation))
Opts.EnableExperimentalAdditiveArithmeticDerivedConformances = true;
if (Args.hasArg(OPT_enable_experimental_differentiable_programming)) {
Opts.EnableExperimentalDifferentiableProgramming = true;
// Differentiable programming implies `AdditiveArithmetic` derived
// conformances.
Opts.EnableExperimentalAdditiveArithmeticDerivedConformances = true;
}
Opts.DebuggerSupport |= Args.hasArg(OPT_debugger_support);
if (Opts.DebuggerSupport)