| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- // Part of the Carbon Language project, under the Apache License v2.0 with LLVM
- // Exceptions. See /LICENSE for license information.
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- package Core library "prelude/default";
- import library "prelude/types/bool";
- import library "prelude/types/int_literal";
- // Provides the default value of an object. If implemented for a type `T`, this
- // is used to initialize declarations without an explicit initializer, such as
- // `var x: T;`, and leaves them in a fully-formed state.
- interface Default { fn Op() -> Self; }
- // Indicates that a type permits unformed initialization, which leaves the
- // object in a state where calling the destructor is valid but optional, and no
- // other operations on the object except for reinitialization are permitted.
- interface UnformedInit {
- // TODO: This should probably be:
- // let StructT:! type;
- // fn Op() -> StructT;
- // and should be able to initialize a subset of the fields. For now we always
- // leave the object uninitialized when it is in an unformed state.
- // See https://github.com/carbon-language/carbon-lang/pull/5913
- }
- // Implementations for some builtin types. These need to be here to satisfy the
- // orphan rule because these builtin types have no associated library of their
- // own.
- impl bool as UnformedInit {}
- impl forall [T:! type] T* as UnformedInit {}
- impl forall [T:! UnformedInit, N:! IntLiteral()] array(T, N) as UnformedInit {}
- // TODO: Generalize these to apply to tuples and structs containing only
- // `UnformedInit` types.
- impl () as UnformedInit {}
- impl {} as UnformedInit {}
- // Provides a default, possibly unformed, value of an object. This should not be
- // implemented directly. Instead, implement `Default` to provide a fully-formed
- // state or (eventually) `UnformedInit` to provide an unformed state.
- interface DefaultOrUnformed {
- // TODO: This should return `MaybeUnformed(Self)` once that is supported.
- fn Op() -> Self;
- }
- final impl forall [T:! Default] T as DefaultOrUnformed {
- fn Op() -> Self {
- return T.Op();
- }
- }
- impl forall [T:! UnformedInit] T as DefaultOrUnformed {
- fn Op() -> Self = "make_uninitialized";
- }
|