Google is committed to advancing racial equity for Black communities. See how.

FIDL design history

This page provides a starting point for navigating RFCs in the "FIDL" area. It organizes them in various ways and gives an updated status on each, bringing the reader up to speed with FIDL's history and current direction.

Previously, these design documents were called FTPs or FIDL Tuning Proposals. The FTP process was later merged into the RFC process. Because of the way FTPs were renumbered as RFCs, RFC numbers do not imply chronology. However, each individual list on this page shows RFCs in chronological order.

By theme

This section organizes FIDL RFCs by theme. Each RFC is listed once, under its primary theme, even if it touches on multiple themes.

Governance

Evolvability

Expressivity

Syntax

Ergonomics

Performance

Safety & security

Tooling

Documentation

Simplify design space

By language feature

This section lists RFCs that introduced new feature that are easily visible in the FIDL language. It only includes current features, not obsolete ones.

Feature RFC Note
struct defaults RFC-0022 Default values for struct members
table RFC-0047 Forward and backward compatible data type
/// RFC-0055 Documentation comments
struct Empty {}; RFC-0056 Empty structs
error RFC-0060 Method error result syntax
union RFC-0061 Initially called xunion, replaced the old static unions
[Selector] RFC-0020 Override method hashing with an explicit selector
[Transitional] RFC-0021 Attribute for soft transitioning method addition/removal
compose RFC-0023 Renamed interface to protocol, added the compose feature
bits RFC-0025 Bit flags types
handle rights RFC-0028 Annotate required or excluded handle rights
strict, flexible RFC-0033 Strict and flexible types
service RFC-0041 Services are collection of protocols
alias, type RFC-0052 Replaced using aliases with alias and type
resource RFC-0057 Value and resource types

Current status

This section gives the current status of all FIDL RFCs.

Legend:

Status Meaning
Unpublished Never made public nor formally reviewed
Withdrawn Made public, but never formally reviewed
Implemented Accepted, implemented, still accurate
Unimplemented Accepted but never implemented, no plans to do so
Partially implemented Accepted and partially implemented, no plans to finish
Implementation in progress Accepted, implementation in progress
Amended Accepted, still mostly accurate, but amended by a later RFC
Superseded Accepted but no longer accurate, superseded by a later RFC
Rejected Formally rejected
Rejected; Superseded Formally rejected, then superseded by a later RFC
RFC Title Status
RFC-0018 FTP process: A modest proposal Superseded by RFC-0017
RFC-0019 Type aliases with using Superseded by RFC-0052
RFC-0022 Default values for struct members Partially implemented: only in HLCPP, Dart
RFC-0051 Safer structs for C++ Unimplemented: change was never merged
RFC-0062 Method impossible Rejected
RFC-0066 Programmer advisory explicit defaults Implemented
RFC-0047 Tables Implemented
RFC-0053 Epitaphs Implemented
RFC-0055 Documentation comments Amended by RFC-0043
RFC-0063 OrdinalRange Rejected; Superseded by RFC-0020
FIDL in FIDL Unpublished; Protobuf can do this
RFC-0056 Empty structs Implemented
RFC-0058 Introduce a deprecated attribute Superseded by RFC-0083
RFC-0060 Error handling Implemented
RFC-0061 Extensible unions Implemented
RFC-0065 No optional strings or vectors Rejected
RFC-0064 Box<Knox> Rejected; see also "FIDL large message support"
Sequences Unpublished; earlier version of "Streams"
Streams Unpublished; see also measure-tape
RFC-0020 Interface ordinal hashing Implemented
RFC-0021 Soft transitions for methods add and remove Implemented
RFC-0023 Compositional model for protocols Implemented
RFC-0024 Mandatory source compatibility Implemented; see also source_compatibility
RFC-0025 Bit flags Implemented
RFC-0026 Envelopes everywhere Rejected
RFC-0027 You only pay for what you use Implemented
RFC-0028 Handle rights Implementation in progress
RFC-0029 Increasing method ordinals Superseded by RFC-0037
RFC-0030 FIDL is little endian Implemented
RFC-0031 Typed epitaphs Rejected
RFC-0032 Efficient envelopes Rejected (accepted at first, later rejected)
RFC-0033 Handling of unknown fields and strictness Implemented
RFC-0034 Null terminate strings Rejected
RFC-0035 Automatic flow tracing Rejected
RFC-0036 Update to struct declarations Rejected
RFC-0037 Transactional message header v3 Implemented
RFC-0038 Separating layout from constraints Rejected; Superseded by RFC-0050
RFC-0039 Types come second Rejected; Superseded by RFC-0050
RFC-0040 Identifier uniqueness Implemented (rejected at first, later accepted)
RFC-0041 Support for unifying services and devices Implemented
RFC-0042 Non nullable types Rejected (April Fools)
RFC-0043 Documentation comment format Implemented
RFC-0044 Extensible method arguments Rejected; Superseded by RFC-0087
RFC-0045 Zero-size empty structs Rejected
Versioning Unpublished; Superseded by RFC-0083
Required table fields Unpublished
RFC-0048 Explicit union ordinals Implemented
RFC-0049 FIDL tuning process evolution Implemented
RFC-0050 Syntax revamp Implementation in progress
Unified view of optionality Unpublished
RFC-0052 Type aliasing and new types Implementation in progress
Iterators Unpublished; see also measure-tape
RFC-0054 Parameter attributes Implemented
Restrict non-numeric floating point values Unpublished
Constant expressions Unpublished
RFC-0057 Default no handles Implemented
FIDL text format Unpublished
RFC-0059 Reserved bits in vector, string, and array count fields Implemented; reserved bits no longer used by LLCPP
FIDL Large message support Withdrawn
RFC-0076 FIDL API summaries Implementation in progress
RFC-0083 FIDL versioning Implementation in progress
RFC-0086 Updates to RFC-0050: FIDL attributes syntax Implementation in progress
RFC-0087 Updates to RFC-0050: FIDL method parameter syntax Implementation in progress