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 submission date for FTP-turned-RFCs, and by review date for all later RFCs.

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
strict, flexible RFC-0033 Strict and flexible types
handle rights RFC-0028 Annotate required or excluded handle rights
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
anonymous layouts RFC-0050 Inline type definitions, named contextually or with @generated_name
@available RFC-0083 Version annotations
Method(table { ... }) RFC-0087 Tables and unions as top-level request/response types
open, closed, ajar RFC-0138 Open and closed interactions

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
In review Made public, review pending
Implemented Accepted, implemented, still accurate
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++ Rejected
RFC-0062 Method impossible Rejected
RFC-0053 Epitaphs Implemented
RFC-0066 Programmer advisory explicit defaults Implemented
RFC-0047 Tables Amended by RFC-0116, RFC-0132
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-0045 Zero-size empty structs Rejected
RFC-0025 Bit flags Implemented
RFC-0026 Envelopes everywhere Rejected
RFC-0027 You only pay for what you use Implemented
RFC-0030 FIDL is little endian Implemented
RFC-0031 Typed epitaphs Rejected
RFC-0032 Efficient envelopes Rejected; Superseded by RFC-0113
RFC-0033 Handling of unknown fields and strictness Amended by RFC-0137
RFC-0034 Null terminate strings Rejected
RFC-0029 Increasing method ordinals Superseded by RFC-0037
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-0028 Handle rights Implemented
RFC-0042 Non nullable types Rejected (April Fools)
RFC-0024 Mandatory source compatibility Implemented; see also source_compatibility
RFC-0040 Identifier uniqueness Implemented (rejected at first, later accepted)
RFC-0041 Support for unifying services and devices Partially implemented: only in C++, Rust
RFC-0044 Extensible method arguments Rejected; Superseded by RFC-0087
RFC-0043 Documentation comment format Implemented
Versioning Unpublished; Superseded by RFC-0083
Required table fields Unpublished
RFC-0048 Explicit union ordinals Implemented
RFC-0049 FIDL tuning process evolution Superseded by RFC-0017
Unified view of optionality Unpublished
Iterators Unpublished; see also measure-tape
RFC-0054 Parameter attributes Superseded by RFC-0050
RFC-0052 Type aliasing and new types Implementation in progress
Restrict non-numeric floating point values Unpublished
Constant expressions Unpublished
RFC-0057 Default no handles Implemented
RFC-0050 Syntax revamp Amended by RFC-0086, RFC-0087, [RFC-0088]
FIDL text format Unpublished
RFC-0059 Reserved bits in vector, string, and array count fields Implemented; reserved bits no longer used by LLCPP
RFC-0017 The FTP Process is dead, long live the RFC Process! Implemented
FIDL Large message support Withdrawn
RFC-0076 FIDL API summaries Implemented
RFC-0083 FIDL versioning Implementation in progress
RFC-0086 Updates to RFC-0050: FIDL attributes syntax Implemented
[RFC-0088] Updates to RFC-0050: FIDL bits, enum, and constraints syntax Rejected
RFC-0087 Updates to RFC-0050: FIDL method parameter syntax Implementation in progress
RFC-0097 FIDL Toolchain Implementation in progress
RFC-0113 Efficient envelopes Implemented
RFC-0114 Inlining small values in FIDL envelopes Implemented
RFC-0116 Wire format support for sparser FIDL tables Rejected
RFC-0120 Standalone use of the FIDL wire format Implementation in progress
RFC-0131 Design principles of the FIDL wire format Implemented
RFC-0132 FIDL table size limit Implemented
RFC-0137 Discard unknown data in FIDL Implementation in progress
RFC-0138 Handling unknown interactions Implementation in progress
RFC-0149 FIDL encode validation not mandatory Implemented
Remove support for FIDL struct defaults In review
Terminal events In review